Data Visualization Suite
Run ID: 69ccf4f63e7fb09ff16a69a42026-04-01Analytics
PantheraHive BOS
BOS Dashboard

Data Visualization Suite: Design Requirements & Specifications

Project Step 1 of 3: Research & Design Requirements

Date: October 26, 2023

Prepared For: PantheraHive Client

Prepared By: Gemini AI Assistant


1. Executive Summary

This document outlines the foundational design requirements, conceptual wireframe descriptions, proposed color palettes, and critical User Experience (UX) recommendations for the "Data Visualization Suite." The goal is to establish a clear, shared understanding of the suite's vision, functionality, and aesthetic, ensuring a powerful, intuitive, and visually appealing experience for end-users. This deliverable serves as the blueprint for subsequent development phases, focusing on creating a robust platform for data exploration and insight generation.

2. Vision & Core Objectives

Vision: To empower users with an intuitive, powerful, and visually engaging platform that transforms complex data into actionable insights, fostering data-driven decision-making across all levels of an organization.

Core Objectives:

  • Intuitive Usability: Design a user interface that is easy to learn for beginners and efficient for expert users, minimizing cognitive load.
  • Comprehensive Visualization: Offer a rich library of interactive chart types and dashboard capabilities to represent diverse data sets effectively.
  • Actionable Insights: Facilitate quick identification of trends, anomalies, and correlations through dynamic filtering, drill-down, and comparison features.
  • Scalability & Performance: Ensure the suite can handle large volumes of data and a growing number of users without compromising speed or responsiveness.
  • Customization & Personalization: Provide tools for users to tailor dashboards and visualizations to their specific needs and preferences.
  • Data Integrity & Security: Implement robust measures for data connection, transformation, and access control.
  • Accessibility: Design with accessibility principles in mind to ensure usability for a broad audience.

3. Detailed Design Specifications

3.1. Core Functionality

  • Interactive Dashboards:

* Drag-and-drop interface for dashboard creation and layout management.

* Support for multiple tabs/pages within a single dashboard.

* Global and local filtering capabilities that apply across selected visualizations.

* Cross-filtering: Clicking on an element in one chart filters other related charts.

* Seamless drill-down functionality from summary to detailed data.

  • Rich Visualization Library:

* Standard Charts: Bar charts (stacked, grouped), Line charts, Area charts, Pie/Donut charts, Scatter plots, Bubble charts.

* Advanced Charts: Heatmaps, Treemaps, Sunburst charts, Gauge charts, Funnel charts.

* Geospatial: Choropleth maps, Point maps (with zoom and pan).

* Tabular Data: Highly customizable data tables with sorting, pagination, and conditional formatting.

* Text & Indicators: KPI cards, rich text widgets for annotations and descriptions.

  • Data Filtering & Manipulation:

* Date range selectors (predefined and custom).

* Multi-select and single-select filters for categorical data.

* Search bars for filtering large lists.

* Parameter controls for dynamic calculations or threshold settings.

  • Customization & Personalization:

* Ability to save custom dashboards and visualizations.

* User-defined color palettes for charts.

* Option to set default views and preferred layouts.

  • Data Import & Export:

* Export dashboards as PDF, PNG, or SVG.

* Export raw or filtered data from visualizations to CSV, XLSX.

* Scheduled report generation and delivery.

  • Collaboration & Sharing:

* Secure sharing of dashboards and reports with specific users or groups.

* Embedding capabilities for external applications (secure iframe/API).

* Comment sections or annotation tools on dashboards (future consideration).

3.2. Data Integration & Management

  • Supported Data Sources:

* Relational Databases (e.g., PostgreSQL, MySQL, SQL Server, Oracle).

* NoSQL Databases (e.g., MongoDB, Cassandra - via connectors).

* Cloud Data Warehouses (e.g., Snowflake, BigQuery, Amazon Redshift).

* Flat Files (CSV, XLSX, JSON).

* REST APIs (with configurable authentication).

  • Data Transformation (Basic ETL):

* Field renaming, data type conversion.

* Basic aggregations (sum, count, average, min, max).

* Simple calculated fields (e.g., profit margin).

* Data blending from multiple sources (future consideration).

  • Real-time vs. Batch Processing:

* Support for both live query connections and scheduled data refreshes.

* Configurable refresh intervals for dashboards.

3.3. Performance & Scalability

  • Optimized Rendering: Utilize efficient charting libraries (e.g., D3.js, ECharts, Plotly.js) for smooth rendering of complex visualizations.
  • Backend Optimization: Implement caching mechanisms, optimized database queries, and efficient data retrieval strategies.
  • Asynchronous Loading: Load data for visualizations asynchronously to improve perceived performance.
  • Lazy Loading: Load off-screen components and data only when visible or needed.

3.4. Security & Access Control

  • Role-Based Access Control (RBAC): Define roles (e.g., Admin, Editor, Viewer) with distinct permissions for data sources, dashboards, and features.
  • Data-Level Security: Implement row-level and column-level security based on user roles and attributes.
  • Authentication: Support for standard authentication methods (e.g., OAuth2, SAML, LDAP integration).
  • Audit Trails: Log significant user actions (e.g., dashboard creation, data source modification).

4. Wireframe Descriptions (High-Level)

These descriptions outline the key components and their arrangement within the primary views of the Data Visualization Suite.

4.1. Dashboard View

  • Header (Top Bar):

* Left: Suite Logo & Name.

* Center: Current Dashboard Title (editable).

* Right: Search bar, Notifications icon, User Profile/Settings menu, "Share" button, "Edit Dashboard" button.

  • Sidebar (Left Navigation):

* Collapsible/Expandable.

* Sections: "Dashboards" (list of saved dashboards, folders), "Data Sources," "Create New" (Dashboard, Visualization, Data Source), "Settings," "Help."

* Active navigation item clearly highlighted.

  • Main Content Area (Dashboard Canvas):

* Grid-based layout system for arranging visualizations and widgets.

* Visualizations resize and reflow dynamically based on grid adjustments.

* Each visualization block includes: Title, Subtitle, "More Options" menu (e.g., Export, View Data, Edit Visualization), and interactive elements.

  • Filter Panel (Optional, Left/Right Slide-out or Top Bar):

* Contains global filters applicable to the entire dashboard or selected visualizations.

* Filter types: Dropdowns, Sliders, Date Pickers, Checkboxes.

* "Apply Filters" / "Reset Filters" buttons.

4.2. Visualization Editor View

  • Header: Similar to Dashboard View, but with "Visualization Title" and "Save" / "Cancel" buttons.
  • Left Panel (Data & Fields):

* Data Source Selector: Dropdown to choose the active data source.

* Field List: Hierarchical list of available dimensions and measures from the selected data source. Search functionality.

* Drag-and-drop functionality for fields onto axis/encoding panels.

  • Center Panel (Canvas / Preview):

* Real-time preview of the visualization as it's being configured.

* Interactive elements (e.g., axis labels, tooltips) visible in preview.

  • Right Panel (Properties & Settings):

* Chart Type Selector: Grid/list of available visualization types (bar, line, pie, etc.).

* Encoding/Axis Mappings: Drag-and-drop zones for X-axis, Y-axis, Color, Size, Tooltip, Filter, Legend.

* Formatting Options:

* General: Title, Subtitle, Legend position, Tooltip settings.

* Axes: Labels, Scale (linear, log), Min/Max values.

* Colors: Palette selection, conditional coloring rules.

* Data Labels: On/off, position, format.

* Interactivity: Drill-down paths, cross-filtering options.

4.3. Data Source Management View

  • Header: "Data Sources" title, "Add New Data Source" button.
  • Main Content Area:

* Data Source List: Table or card view displaying connected data sources.

* Columns: Name, Type, Connection Status, Last Refreshed, Actions (Edit, Delete, Refresh Schema, View Details).

* Add/Edit Data Source Form (Modal/Slide-out):

* Connection Type: Dropdown (SQL, CSV, API, etc.).

* Connection Details: Host, Port, Database Name, Username, Password (secure input), API Endpoint, Authentication tokens.

* Test Connection Button.

* Schema Preview/Selection: Display tables/collections and allow selection for import/use.

* Scheduling Options: For batch-processed sources (refresh frequency).

5. Color Palettes & Theming

A consistent and accessible color palette is crucial for both brand identity and effective data representation.

5.1. Brand Identity & Base Palette

  • Primary Colors:

* #004C99 (Deep Ocean Blue): Main brand color, for headers, primary buttons, active states.

* #E6F0F8 (Light Sky Blue): Backgrounds for secondary panels, subtle highlights.

  • Secondary Colors:

* #333333 (Dark Charcoal): Primary text, strong emphasis.

* #666666 (Medium Gray): Secondary text, disabled states, borders.

* #F8F8F8 (Off-White): Main background color for canvas areas.

  • Accent Colors:

* #00B894 (Emerald Green): Success messages, positive indicators, "Create" buttons.

* #FF7675 (Coral Red): Error messages, warnings, negative indicators.

* #FFE066 (Vibrant Yellow): Alerts, neutral warnings.

5.2. Data Visualization Palettes

Colors must be distinct, harmonious, and convey meaning without overwhelming the data.

  • Categorical Palette (for distinct categories):

* #4C78A8 (Blue)

* #F58518 (Orange)

* #E45756 (Red)

* #72B7B2 (Teal)

* #54A24B (Green)

* #EECA3B (Yellow)

* #B279A2 (Purple)

* #FF9DA7 (Pink)

* #9D755D (Brown)

* #BAB0AC (Gray)

Recommendation:* Ensure sufficient contrast between adjacent colors, especially for color-blind users. Offer a palette generator or predefined sets for more than 10 categories.

  • Sequential Palette (for continuous data, e.g., low to high values):

* Blue Gradient: #E6F0F8 (light) → #A0CBE2#4C78A8#004C99 (dark)

* Green Gradient: #F0F8E6 (light) → #CBE2A0#72B7B2#54A24B (dark)

  • Diverging Palette (for data with a meaningful midpoint, e.g., positive/negative, above/below average):

* #FF7675 (Red, negative) → #F8F8F8 (Neutral/Midpoint) → #00B894 (Green, positive)

Recommendation:* Use a

gemini Output

Data Visualization Suite: Design Specifications & UX Recommendations

This document outlines the detailed design specifications, wireframe descriptions, color palettes, and user experience (UX) recommendations for the "Data Visualization Suite." The goal is to create a professional, intuitive, and powerful platform that empowers users to transform complex data into actionable insights.


1. Detailed Design Specifications

The Data Visualization Suite will be a web-based application designed for optimal performance across various devices. It will prioritize clarity, interactivity, and customizability to cater to a diverse user base, from data analysts to executive stakeholders.

1.1 Core Features & Functionality

  • Interactive Dashboards:

* Dynamic Filtering: Apply filters globally or to specific widgets (e.g., date ranges, categories, regions).

* Drill-Down Capabilities: Explore underlying data by clicking on chart segments or data points.

* Cross-Filtering: Selecting a data point in one chart automatically filters related data in other charts on the same dashboard.

* Customizable Layouts: Users can drag, drop, resize, and arrange widgets to create personalized dashboard views.

* Save & Share: Ability to save custom dashboard layouts, generate shareable links, and export to various formats (PDF, PNG, CSV).

  • Comprehensive Charting Library:

* Standard Charts: Bar charts (stacked, grouped), Line charts, Area charts, Pie/Donut charts, Scatter plots, Bubble charts.

* Advanced Charts: Heatmaps, Treemaps, Sunburst charts, Gauge charts, Funnel charts, Chord diagrams, Network graphs.

* Geospatial Visualizations: Choropleth maps, Point maps.

* Tabular Data: Highly configurable data tables with sorting, pagination, and search.

  • Data Source Connectivity:

* Direct Database Connections: SQL (PostgreSQL, MySQL, SQL Server, Oracle), NoSQL (MongoDB).

* Cloud Data Warehouses: Snowflake, Google BigQuery, Amazon Redshift.

* APIs: RESTful API integration for custom data feeds.

* File Uploads: CSV, Excel, JSON.

* Data Blending: Ability to combine data from multiple sources within a single dashboard/report.

  • Report Builder & Editor:

* Intuitive Drag-and-Drop Interface: For creating and modifying dashboards and individual widgets.

* Dimension & Measure Selection: Easy selection of data fields for visualization.

* Calculated Fields: Support for creating custom metrics and dimensions using a formula editor.

* Visualization Configuration: Granular control over chart properties (axes, labels, legends, colors, tooltips).

* Preview Mode: Real-time preview of changes before saving.

  • User & Role Management (RBAC):

* Granular Permissions: Control access to specific dashboards, data sources, and functionalities (e.g., view, edit, create, manage users).

* User Groups: Assign permissions to groups for easier management.

* Data-Level Security: Implement row-level or column-level security based on user roles or attributes.

  • Collaboration & Annotation:

* Dashboard Comments: Allow users to add comments or notes directly on dashboards for contextual discussions.

* Snapshot Sharing: Share static images or interactive snapshots of dashboards with annotations.

  • Alerting & Notifications:

* Threshold-Based Alerts: Configure alerts to trigger when data points cross predefined thresholds.

* Notification Channels: Email, in-app notifications, integration with messaging platforms (e.g., Slack).

  • Performance & Scalability:

* Optimized for handling large datasets with efficient data fetching and rendering.

* Caching mechanisms to improve load times for frequently accessed data.

* Scalable architecture to support a growing number of users and data volumes.

1.2 Non-Functional Requirements (Design Impact)

  • Responsiveness: Fully adaptive UI/UX for desktops, tablets, and mobile devices.
  • Security: Robust authentication (SSO support), authorization, and data encryption.
  • Accessibility: Adherence to WCAG 2.1 AA standards for color contrast, keyboard navigation, and screen reader compatibility.
  • Performance: Dashboards and reports should load within 3-5 seconds for typical datasets.
  • Browser Compatibility: Support for modern web browsers (Chrome, Firefox, Edge, Safari).

2. Wireframe Descriptions

The following wireframe descriptions outline the core screens and their primary components, focusing on layout and user interaction.

2.1 Dashboard Overview Screen

  • Layout:

* Top Navigation Bar: Logo, Search bar, User profile/settings, Notifications icon.

* Left Sidebar Navigation: "Home" (Dashboard Overview), "My Dashboards," "Shared Dashboards," "Data Sources," "Report Builder," "Admin" (if applicable).

* Main Content Area: Grid-based layout displaying "cards" for recently viewed, favorite, and recommended dashboards.

  • Key Components:

* Dashboard Cards: Each card displays a thumbnail preview, title, last updated date, and quick actions (e.g., "Open," "Share," "Favorite").

* "Create New Dashboard" Button: Prominently displayed for quick access.

* Search & Filter: Options to search for dashboards by name, tag, or owner.

  • Interactivity: Clicking a dashboard card navigates to the detailed dashboard view. Quick actions provide immediate functionality.

2.2 Individual Dashboard View

  • Layout:

* Top Header: Dashboard Title, "Edit" button (if permitted), "Share" button, "Export" button, "Refresh" button, "Comments" icon.

* Filter Panel (Optional Left/Top): Collapsible panel or fixed area containing global dashboard filters (e.g., date picker, dropdowns for categories).

* Main Canvas: Dynamic grid layout filled with various visualization widgets.

  • Key Components:

* Visualization Widgets: Each widget (chart, table, gauge) occupies a defined area, with its own title, legend, and context menu for specific actions (e.g., "Drill Down," "View Data," "Export Widget").

* Tooltips: On-hover tooltips for detailed data points.

* Loading Indicators: Clear visual feedback when data is being fetched or refreshed.

  • Interactivity:

* Widget Interaction: Click-to-filter, drill-down, zoom/pan on charts.

* Filter Application: Changes in the filter panel instantly update all relevant widgets.

* Edit Mode: Toggles to allow users to drag, drop, resize widgets, and configure their settings.

2.3 Report Builder / Editor Screen

  • Layout:

* Top Header: Dashboard Title (editable), "Save" button, "Preview" button, "Cancel" button.

* Left Panel (Data & Fields): Collapsible panel displaying connected data sources, available dimensions, and measures. Search functionality within fields.

* Central Canvas: Drag-and-drop area for arranging widgets. Each widget area shows a placeholder until a visualization is configured.

* Right Panel (Widget Configuration): Contextual panel that appears when a widget is selected. Contains options for chart type, axes, colors, filters, sorting, calculated fields, etc.

  • Key Components:

* Data Source Selector: Dropdown to choose the primary data source.

* Field List: Hierarchical list of fields from the selected data source.

* Widget Palette/Selector: Icons or list of available chart types to drag onto the canvas.

* Formula Editor: For creating calculated fields.

* Property Editor: Tabs or sections for "Data," "Appearance," "Interactivity" within the selected widget's configuration.

  • Interactivity:

* Drag-and-Drop: Fields onto widget areas, widget types onto the canvas.

* Real-time Preview: Changes in the configuration panel are reflected instantly on the canvas.

* Undo/Redo: Standard editing functionality.

2.4 Data Source Management Screen

  • Layout:

* Top Header: "Data Sources" title, "Add New Data Source" button.

* Main Content Area: Table or list view of all configured data sources.

  • Key Components:

* Data Source List: Displays Name, Type, Status (Connected/Disconnected), Last Updated, and Actions (Edit, Test Connection, Delete).

* Pagination & Search: For managing a large number of data sources.

* "Add New Data Source" Form: A multi-step wizard for selecting data source type, entering connection details (host, port, credentials), and testing the connection.

  • Interactivity: Clicking "Edit" opens a modal or new screen for modifying connection details. "Test Connection" provides immediate feedback.

3. Color Palettes

The chosen color palette aims for professionalism, clarity, and accessibility, ensuring data visualizations are impactful and easy to interpret.

3.1 Primary & Brand Colors

These colors define the overall look and feel of the application's UI elements, navigation, and branding.

  • Primary Blue: #0056B3 (A professional, trustworthy blue for headers, primary buttons, active states)
  • Secondary Gray: #F0F2F5 (A light, clean gray for backgrounds, subtle dividers)
  • Text Dark: #343A40 (For main body text, ensuring high contrast)
  • Text Light: #6C757D (For secondary text, labels, subtle hints)

3.2 Accent Colors

Used for call-to-action buttons, highlights, interactive elements, and alerts.

  • Accent Green (Success): #28A745 (For successful actions, positive indicators)
  • Accent Red (Danger/Error): #DC3545 (For critical alerts, error messages, negative trends)
  • Accent Orange (Warning): #FFC107 (For warnings, pending actions)
  • Accent Purple (Highlight): #6F42C1 (For specific interactive highlights, selected items)

3.3 Data Visualization Palettes

These palettes are designed for optimal distinction and interpretation of data series, with consideration for colorblindness.

  • Categorical Data Palette (Distinct & Accessible):

* #1F77B4 (Blue)

* #FF7F0E (Orange)

* #2CA02C (Green)

* #D62728 (Red)

* #9467BD (Purple)

* #8C564B (Brown)

* #E377C2 (Pink)

* #7F7F7F (Gray)

* #BCBD22 (Olive)

* #17BECF (Cyan)

Rationale:* This palette is a modification of a well-regarded colorblind-friendly set, ensuring high contrast and distinctiveness for up to 10 categories.

  • Sequential Data Palette (for Gradients/Heatmaps - e.g., low to high values):

* Starts with a light shade, progresses to a deep shade of a single hue.

* Example Blue Gradient: #E6F2FF -> #B3D9FF -> #80BFFF -> #4DA6FF -> #1A75FF -> #0056B3

Rationale:* Provides a clear visual progression for quantitative data, easily indicating magnitude.

  • Diverging Data Palette (for Gradients/Heatmaps - e.g., negative to positive values):

* Centered around a neutral color, diverging to contrasting hues.

* Example Red-Gray-Green: #DC3545 (Strong Negative) -> #F0F2F5 (Neutral) -> #28A745 (Strong Positive)

Rationale:* Effectively highlights deviations from a central point, ideal for showing performance against a target or baseline.


4. UX Recommendations

User experience is paramount for a data visualization suite. The following recommendations aim to make the platform intuitive, efficient, and enjoyable to use.

4.1 Clarity & Simplicity

  • Information Hierarchy: Use size, color, and position to guide the user's eye to the most important information first.
  • Minimize Clutter: Avoid unnecessary elements. Every component should serve a clear purpose.
  • Clear Labeling: All charts, axes, legends, and interactive elements must have concise and unambiguous labels.
  • Consistent Terminology: Use the same terms for the same concepts throughout the application.

4.2 Consistency

  • UI Elements: Maintain a consistent visual style for buttons, input fields, icons, and typography across all screens.
  • Navigation: Predictable and consistent navigation patterns (e.g., sidebar, breadcrumbs) ensure users always know where they are and how to get elsewhere.
  • Interaction Patterns: Similar actions should always produce similar results. For example, clicking on a data point should consistently trigger a filter or drill-down.

4.3 Interactivity & Feedback

  • Intuitive Filters: Make filters easy to find, apply, and clear. Provide visual feedback on which filters are active.
  • **Hover
gemini Output

Data Visualization Suite: Finalized Design Assets & Specifications

This document outlines the finalized design assets and specifications for the Data Visualization Suite, providing a comprehensive guide for implementation. Our focus is on creating a professional, intuitive, and highly functional experience that empowers users to derive meaningful insights from their data.


1. Detailed Design Specifications

The design language prioritizes clarity, efficiency, and aesthetic appeal, ensuring data is presented in an understandable and engaging manner.

1.1 Overall Theme & Aesthetics

  • Style: Modern, clean, and professional with a slight emphasis on minimalism to keep the focus on data.
  • Visual Hierarchy: Strong use of typography, spacing, and subtle shadows to establish clear visual hierarchy and guide user attention.
  • Responsiveness: Fully responsive design across all major breakpoints (desktop, tablet, mobile) ensuring optimal viewing and interaction on any device.
  • Accessibility: Adherence to WCAG 2.1 AA standards for contrast, keyboard navigation, and ARIA attributes to ensure inclusivity.

1.2 Layout & Grid System

  • Grid: 12-column flexible grid system for consistent alignment and spacing.
  • Spacing: Consistent use of a base 8px increment for margins, padding, and component spacing (e.g., 8px, 16px, 24px, 32px).
  • Containers: Use of card-based layouts for individual visualizations and data summaries, providing clear separation and modularity.
  • Sidebar Navigation: Collapsible left-hand navigation for primary sections, optimizing screen real estate.
  • Header: Fixed header for global actions, search, and user profile access.

1.3 Typography

  • Primary Font Family: Inter (or similar sans-serif like Open Sans, Roboto) for its readability and modern aesthetic.

* Headings (H1-H6): Inter Bold/Semi-Bold, varying sizes for clear hierarchy (e.g., H1: 36px, H2: 28px, H3: 22px, H4: 18px).

* Body Text: Inter Regular, 14-16px for optimal readability.

* Labels & Captions: Inter Regular/Medium, 12-14px.

* Data Labels: Inter Medium, 10-12px, ensuring legibility within charts.

  • Monospace Font (for code/data snippets): Fira Code or Source Code Pro for specific data display needs.

1.4 Iconography

  • Style: Line-art/Outline style with a consistent stroke weight (e.g., 1.5px-2px). Filled icons may be used sparingly for active states or critical actions.
  • Set: Use a readily available and comprehensive icon library (e.g., Feather Icons, Material Icons Outlined, Font Awesome Pro).
  • Usage: For navigation, actions (edit, delete, download), status indicators, and feature representation.

1.5 Component Library

  • Buttons:

* Primary: Solid background, high contrast text, slight rounded corners (4px).

* Secondary: Outline style with primary brand color border.

* Tertiary/Ghost: Text-only, for less prominent actions.

* States: Clear hover, active, focus, and disabled states.

  • Input Fields:

* Clean, subtle border (light grey), slight rounded corners.

* Clear focus state (e.g., primary brand color border).

* Placeholder text, validation feedback (error/success states).

  • Dropdowns/Selects:

* Consistent styling with input fields.

* Clear chevron indicator for expand/collapse.

* Scrollable options list, search functionality for long lists.

  • Cards:

* White or light grey background, subtle shadow for depth.

* Consistent padding, border radius (8px).

* Used for individual charts, metrics, and content blocks.

  • Modals/Dialogs:

* Centered, overlay background blur or darkening.

* Clear header, body, and action buttons.

* Close icon (X) in the top right.

  • Tooltips & Popovers:

* Light background, dark text, subtle arrow pointing to the trigger element.

* Used for contextual information and explanations.

  • Loading Indicators:

* Spinners for component-level loading.

* Progress bars for page-level or data-heavy operations.

* Skeleton loaders for content areas awaiting data.

1.6 Data Visualization Elements

  • Chart Types: Support for common chart types: Bar Charts (vertical/horizontal), Line Charts, Area Charts, Pie/Donut Charts, Scatter Plots, Heatmaps, Treemaps, Gauge Charts.
  • Colors: Utilizes the defined Data Visualization Palettes (see section 3.3).
  • Legends: Clear, concise, interactive (toggle series visibility). Positioned contextually (top, bottom, right).
  • Tooltips: On-hover display of specific data points, showing detailed values, categories, and series information.
  • Axes: Clearly labeled axes with appropriate tick marks and value formatting. Dynamic scaling based on data range.
  • Grid Lines: Subtle, light grey grid lines for readability without distraction.
  • Annotations: Ability to add text, lines, or shapes to highlight specific data points or trends.
  • Interactivity: Zoom, pan, drill-down, and filtering capabilities directly within charts.

2. Wireframe Descriptions

These descriptions outline the core layouts and functionalities for key sections of the Data Visualization Suite.

2.1 Dashboard Overview

  • Purpose: Provide users with a high-level summary of key performance indicators (KPIs) and critical insights across their selected datasets.
  • Layout:

* Header: Global search, notifications, user profile.

* Sidebar: Main navigation (Dashboard, Reports, Data Sources, Settings).

* Main Content Area:

* Filter Bar (Top): Global date range selector, dataset selector, and primary filters (e.g., region, product category).

* KPI Cards (Top Row): 3-5 prominent cards displaying key metrics (e.g., Total Revenue, Avg. Order Value, Conversion Rate) with trend indicators (up/down arrow, percentage change).

* Primary Charts (Middle Section): 2-3 large, interactive charts displaying core trends (e.g., Revenue over Time - Line Chart, Sales by Product Category - Bar Chart).

* Secondary Insights (Bottom Section): 2-4 smaller cards or mini-charts providing supporting details or complementary views (e.g., Top 5 Customers - Table, Geographic Sales Distribution - Heatmap).

  • Interactions: Clicking on a KPI card or chart element should offer drill-down options or navigate to a detailed report. Global filters apply instantly.

2.2 Individual Report/Chart View

  • Purpose: Allow users to explore a single visualization or report in detail, with advanced filtering, data table access, and export options.
  • Layout:

* Header: Report title, "Back to Dashboard" link, "Save/Share" button, "Export" button.

* Sidebar (Optional/Collapsible): Detailed filter panel specific to the report (e.g., multiple dimensions, specific values, custom ranges).

* Main Content Area:

* Chart Area: Large, primary display of the selected visualization. Full interactivity (zoom, pan, hover tooltips).

* Data Table (Toggleable): Below the chart, a detailed tabular view of the data points used in the visualization, with sorting and pagination.

* Chart Settings Panel (Toggleable): Options to change chart type, customize axes, add annotations, or modify data series.

  • Interactions: Filters update the chart and data table dynamically. Export options include CSV, PDF, PNG, SVG. Users can save customized report views.

2.3 Data Source Management

  • Purpose: Enable users to connect, manage, and transform their data sources.
  • Layout:

* Header: "Add New Data Source" button.

* Sidebar: Navigation for different data source types (Databases, APIs, File Uploads).

* Main Content Area:

* Data Source List: Table displaying connected data sources with columns for Name, Type, Status, Last Updated, and Actions (Edit, Refresh, Delete).

* "Add New Data Source" Flow:

* Step 1: Select Type: Choose from a list of connectors (e.g., SQL, PostgreSQL, Google Analytics, CSV Upload).

* Step 2: Connection Details: Input credentials, host, API keys, file upload interface.

* Step 3: Data Preview & Transformation: Display a preview of the data. Tools for column selection, renaming, data type conversion, basic joins, and calculated fields.

* Step 4: Schedule Refresh: Set frequency for automatic data updates.

  • Interactions: Clear validation for connection details. Real-time data preview. Drag-and-drop for column reordering in transformation.

3. Color Palettes

A consistent and thoughtfully chosen color palette is crucial for brand identity, data differentiation, and overall user experience.

3.1 Primary Brand Colors

These colors represent the core identity of the Data Visualization Suite and are used for primary actions, branding elements, and key highlights.

  • Primary Blue (PantheraHive Brand Blue): #007BFF (RGB: 0, 123, 255)

Usage:* Main call-to-action buttons, active navigation states, primary headers, brand logos.

  • Accent Teal: #17A2B8 (RGB: 23, 162, 184)

Usage:* Secondary buttons, progress bars, subtle highlights, interactive elements.

3.2 Secondary & Neutral Colors

These colors provide depth, contrast, and support for various UI elements, backgrounds, and text.

  • Dark Grey (Text/Headings): #343A40 (RGB: 52, 58, 64)

Usage:* Primary body text, headings, strong contrast elements.

  • Medium Grey (Secondary Text/Icons): #6C757D (RGB: 108, 117, 125)

Usage:* Secondary text, placeholder text, inactive icons, subtle borders.

  • Light Grey (Borders/Dividers): #DEE2E6 (RGB: 222, 226, 230)

Usage:* Input field borders, table dividers, card outlines.

  • Extra Light Grey (Backgrounds): #F8F9FA (RGB: 248, 249, 250)

Usage:* Page backgrounds, subtle card backgrounds, hover states.

  • White: #FFFFFF (RGB: 255, 255, 255)

Usage:* Primary card backgrounds, modal backgrounds, main content areas.

3.3 Data Visualization Palettes

These palettes are designed for clear differentiation and intuitive understanding of data.

  • Categorical Palette (for distinct categories):

* #007BFF (Blue)

* #28A745 (Green)

* #FFC107 (Yellow/Amber)

* #DC3545 (Red)

* #17A2B8 (Teal)

* #6610F2 (Indigo)

* #FD7E14 (Orange)

* #E83E8C (Pink)

Usage:* Bar charts (different categories), Pie/Donut charts, distinct series in line charts.

Recommendation:* If more than 8-10 categories, consider grouping or allowing users to select key categories.

  • Sequential Palette (for ordered/gradient data):

Light to Dark Blue Gradient:* #E6F2FF#B3D9FF#80BFFF#4DA6FF#007BFF#0056B3

Usage:* Heatmaps, choropleth maps, intensity plots, data trends over a continuous range.

  • Diverging Palette (for data around a midpoint/zero):

Red to Blue Diverging:* #DC3545 (Negative) → #F8F9FA (Midpoint) → #007BFF (Positive)

Usage:* Showing deviations from an average, profit/loss, positive/negative sentiment.

3.4 Status Colors

Standard colors for conveying immediate feedback and system status.

  • Success: #28A745 (Green) - for successful operations, positive feedback.
  • Warning: #FFC107 (Yellow/Amber) - for caution, non-critical issues.
  • Error: #DC3545 (Red) - for critical errors, failed operations, destructive actions.
  • Info: #17A2B8 (Teal) - for informational messages, neutral tips.

4. UX Recommendations

These recommendations focus on enhancing the user experience, ensuring the Data Visualization Suite is intuitive, efficient, and enjoyable to use.

4.1 Information Architecture & Navigation

  • Intuitive Hierarchy: Organize content logically with clear primary (sidebar) and secondary (tabbed, contextual) navigation.
  • Consistent Structure: Maintain a consistent layout across different sections to reduce cognitive load.
  • Search & Filtering: Implement powerful global search and contextual filtering options to help users quickly find relevant data and reports.
  • Breadcrumbs: Use breadcrumbs for multi-level navigation to provide users with a clear path of where they are in the application.

4.2 Usability & Efficiency

  • Direct Manipulation: Allow users to interact directly with charts (e.g., click on a bar to filter, drag to zoom) rather than relying solely on separate controls.
  • Keyboard Navigation: Ensure all interactive elements are reachable and operable via keyboard for users who prefer or require it.
  • Efficiency for Power Users: Provide shortcuts, customizable dashboards, and "save view" options for frequently accessed reports.
  • Sensible Defaults: Pre-select common date ranges or filters to provide an immediate useful view upon loading.

4.3 Feedback & Guidance

  • Clear Error Messages: Provide specific, actionable error messages that guide users on
data_visualization_suite.md
Download as Markdown
Copy all content
Full output as text
Download ZIP
IDE-ready project ZIP
Copy share link
Permanent URL for this run
Get Embed Code
Embed this result on any website
Print / Save PDF
Use browser print dialog
"); var hasSrcMain=Object.keys(extracted).some(function(k){return k.indexOf("src/main")>=0;}); if(!hasSrcMain) zip.file(folder+"src/main."+ext,"import React from 'react' import ReactDOM from 'react-dom/client' import App from './App' import './index.css' ReactDOM.createRoot(document.getElementById('root')!).render( ) "); var hasSrcApp=Object.keys(extracted).some(function(k){return k==="src/App."+ext||k==="App."+ext;}); if(!hasSrcApp) zip.file(folder+"src/App."+ext,"import React from 'react' import './App.css' function App(){ return(

"+slugTitle(pn)+"

Built with PantheraHive BOS

) } export default App "); zip.file(folder+"src/index.css","*{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#f0f2f5;color:#1a1a2e} .app{min-height:100vh;display:flex;flex-direction:column} .app-header{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:40px} h1{font-size:2.5rem;font-weight:700} "); zip.file(folder+"src/App.css",""); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/pages/.gitkeep",""); zip.file(folder+"src/hooks/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` ## Open in IDE Open the project folder in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Vue (Vite + Composition API + TypeScript) --- */ function buildVue(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "type": "module", "scripts": { "dev": "vite", "build": "vue-tsc -b && vite build", "preview": "vite preview" }, "dependencies": { "vue": "^3.5.13", "vue-router": "^4.4.5", "pinia": "^2.3.0", "axios": "^1.7.9" }, "devDependencies": { "@vitejs/plugin-vue": "^5.2.1", "typescript": "~5.7.3", "vite": "^6.0.5", "vue-tsc": "^2.2.0" } } '); zip.file(folder+"vite.config.ts","import { defineConfig } from 'vite' import vue from '@vitejs/plugin-vue' import { resolve } from 'path' export default defineConfig({ plugins: [vue()], resolve: { alias: { '@': resolve(__dirname,'src') } } }) "); zip.file(folder+"tsconfig.json",'{"files":[],"references":[{"path":"./tsconfig.app.json"},{"path":"./tsconfig.node.json"}]} '); zip.file(folder+"tsconfig.app.json",'{ "compilerOptions":{ "target":"ES2020","useDefineForClassFields":true,"module":"ESNext","lib":["ES2020","DOM","DOM.Iterable"], "skipLibCheck":true,"moduleResolution":"bundler","allowImportingTsExtensions":true, "isolatedModules":true,"moduleDetection":"force","noEmit":true,"jsxImportSource":"vue", "strict":true,"paths":{"@/*":["./src/*"]} }, "include":["src/**/*.ts","src/**/*.d.ts","src/**/*.tsx","src/**/*.vue"] } '); zip.file(folder+"env.d.ts","/// "); zip.file(folder+"index.html"," "+slugTitle(pn)+"
"); var hasMain=Object.keys(extracted).some(function(k){return k==="src/main.ts"||k==="main.ts";}); if(!hasMain) zip.file(folder+"src/main.ts","import { createApp } from 'vue' import { createPinia } from 'pinia' import App from './App.vue' import './assets/main.css' const app = createApp(App) app.use(createPinia()) app.mount('#app') "); var hasApp=Object.keys(extracted).some(function(k){return k.indexOf("App.vue")>=0;}); if(!hasApp) zip.file(folder+"src/App.vue"," "); zip.file(folder+"src/assets/main.css","*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,sans-serif;background:#fff;color:#213547} "); zip.file(folder+"src/components/.gitkeep",""); zip.file(folder+"src/views/.gitkeep",""); zip.file(folder+"src/stores/.gitkeep",""); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install npm run dev ``` ## Build ```bash npm run build ``` Open in VS Code or WebStorm. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local "); } /* --- Angular (v19 standalone) --- */ function buildAngular(zip,folder,app,code,panelTxt){ var pn=pkgName(app); var C=cc(pn); var sel=pn.replace(/_/g,"-"); var extracted=extractCode(panelTxt); zip.file(folder+"package.json",'{ "name": "'+pn+'", "version": "0.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", "test": "ng test" }, "dependencies": { "@angular/animations": "^19.0.0", "@angular/common": "^19.0.0", "@angular/compiler": "^19.0.0", "@angular/core": "^19.0.0", "@angular/forms": "^19.0.0", "@angular/platform-browser": "^19.0.0", "@angular/platform-browser-dynamic": "^19.0.0", "@angular/router": "^19.0.0", "rxjs": "~7.8.0", "tslib": "^2.3.0", "zone.js": "~0.15.0" }, "devDependencies": { "@angular-devkit/build-angular": "^19.0.0", "@angular/cli": "^19.0.0", "@angular/compiler-cli": "^19.0.0", "typescript": "~5.6.0" } } '); zip.file(folder+"angular.json",'{ "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "newProjectRoot": "projects", "projects": { "'+pn+'": { "projectType": "application", "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { "builder": "@angular-devkit/build-angular:application", "options": { "outputPath": "dist/'+pn+'", "index": "src/index.html", "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", "styles": ["src/styles.css"], "scripts": [] } }, "serve": {"builder":"@angular-devkit/build-angular:dev-server","configurations":{"production":{"buildTarget":"'+pn+':build:production"},"development":{"buildTarget":"'+pn+':build:development"}},"defaultConfiguration":"development"} } } } } '); zip.file(folder+"tsconfig.json",'{ "compileOnSave": false, "compilerOptions": {"baseUrl":"./","outDir":"./dist/out-tsc","forceConsistentCasingInFileNames":true,"strict":true,"noImplicitOverride":true,"noPropertyAccessFromIndexSignature":true,"noImplicitReturns":true,"noFallthroughCasesInSwitch":true,"paths":{"@/*":["src/*"]},"skipLibCheck":true,"esModuleInterop":true,"sourceMap":true,"declaration":false,"experimentalDecorators":true,"moduleResolution":"bundler","importHelpers":true,"target":"ES2022","module":"ES2022","useDefineForClassFields":false,"lib":["ES2022","dom"]}, "references":[{"path":"./tsconfig.app.json"}] } '); zip.file(folder+"tsconfig.app.json",'{ "extends":"./tsconfig.json", "compilerOptions":{"outDir":"./dist/out-tsc","types":[]}, "files":["src/main.ts"], "include":["src/**/*.d.ts"] } '); zip.file(folder+"src/index.html"," "+slugTitle(pn)+" "); zip.file(folder+"src/main.ts","import { bootstrapApplication } from '@angular/platform-browser'; import { appConfig } from './app/app.config'; import { AppComponent } from './app/app.component'; bootstrapApplication(AppComponent, appConfig) .catch(err => console.error(err)); "); zip.file(folder+"src/styles.css","* { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: system-ui, -apple-system, sans-serif; background: #f9fafb; color: #111827; } "); var hasComp=Object.keys(extracted).some(function(k){return k.indexOf("app.component")>=0;}); if(!hasComp){ zip.file(folder+"src/app/app.component.ts","import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-root', standalone: true, imports: [RouterOutlet], templateUrl: './app.component.html', styleUrl: './app.component.css' }) export class AppComponent { title = '"+pn+"'; } "); zip.file(folder+"src/app/app.component.html","

"+slugTitle(pn)+"

Built with PantheraHive BOS

"); zip.file(folder+"src/app/app.component.css",".app-header{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;gap:16px}h1{font-size:2.5rem;font-weight:700;color:#6366f1} "); } zip.file(folder+"src/app/app.config.ts","import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; export const appConfig: ApplicationConfig = { providers: [ provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes) ] }; "); zip.file(folder+"src/app/app.routes.ts","import { Routes } from '@angular/router'; export const routes: Routes = []; "); Object.keys(extracted).forEach(function(p){ var fp=p.startsWith("src/")?p:"src/"+p; zip.file(folder+fp,extracted[p]); }); zip.file(folder+"README.md","# "+slugTitle(pn)+" Generated by PantheraHive BOS. ## Setup ```bash npm install ng serve # or: npm start ``` ## Build ```bash ng build ``` Open in VS Code with Angular Language Service extension. "); zip.file(folder+".gitignore","node_modules/ dist/ .env .DS_Store *.local .angular/ "); } /* --- Python --- */ function buildPython(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var reqMap={"numpy":"numpy","pandas":"pandas","sklearn":"scikit-learn","tensorflow":"tensorflow","torch":"torch","flask":"flask","fastapi":"fastapi","uvicorn":"uvicorn","requests":"requests","sqlalchemy":"sqlalchemy","pydantic":"pydantic","dotenv":"python-dotenv","PIL":"Pillow","cv2":"opencv-python","matplotlib":"matplotlib","seaborn":"seaborn","scipy":"scipy"}; var reqs=[]; Object.keys(reqMap).forEach(function(k){if(src.indexOf("import "+k)>=0||src.indexOf("from "+k)>=0)reqs.push(reqMap[k]);}); var reqsTxt=reqs.length?reqs.join(" "):"# add dependencies here "; zip.file(folder+"main.py",src||"# "+title+" # Generated by PantheraHive BOS print(title+" loaded") "); zip.file(folder+"requirements.txt",reqsTxt); zip.file(folder+".env.example","# Environment variables "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt ``` ## Run ```bash python main.py ``` "); zip.file(folder+".gitignore",".venv/ __pycache__/ *.pyc .env .DS_Store "); } /* --- Node.js --- */ function buildNode(zip,folder,app,code){ var title=slugTitle(app); var pn=pkgName(app); var src=code.replace(/^```[w]* ?/m,"").replace(/ ?```$/m,"").trim(); var depMap={"mongoose":"^8.0.0","dotenv":"^16.4.5","axios":"^1.7.9","cors":"^2.8.5","bcryptjs":"^2.4.3","jsonwebtoken":"^9.0.2","socket.io":"^4.7.4","uuid":"^9.0.1","zod":"^3.22.4","express":"^4.18.2"}; var deps={}; Object.keys(depMap).forEach(function(k){if(src.indexOf(k)>=0)deps[k]=depMap[k];}); if(!deps["express"])deps["express"]="^4.18.2"; var pkgJson=JSON.stringify({"name":pn,"version":"1.0.0","main":"src/index.js","scripts":{"start":"node src/index.js","dev":"nodemon src/index.js"},"dependencies":deps,"devDependencies":{"nodemon":"^3.0.3"}},null,2)+" "; zip.file(folder+"package.json",pkgJson); var fallback="const express=require("express"); const app=express(); app.use(express.json()); app.get("/",(req,res)=>{ res.json({message:""+title+" API"}); }); const PORT=process.env.PORT||3000; app.listen(PORT,()=>console.log("Server on port "+PORT)); "; zip.file(folder+"src/index.js",src||fallback); zip.file(folder+".env.example","PORT=3000 "); zip.file(folder+".gitignore","node_modules/ .env .DS_Store "); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Setup ```bash npm install ``` ## Run ```bash npm run dev ``` "); } /* --- Vanilla HTML --- */ function buildVanillaHtml(zip,folder,app,code){ var title=slugTitle(app); var isFullDoc=code.trim().toLowerCase().indexOf("=0||code.trim().toLowerCase().indexOf("=0; var indexHtml=isFullDoc?code:" "+title+" "+code+" "; zip.file(folder+"index.html",indexHtml); zip.file(folder+"style.css","/* "+title+" — styles */ *{margin:0;padding:0;box-sizing:border-box} body{font-family:system-ui,-apple-system,sans-serif;background:#fff;color:#1a1a2e} "); zip.file(folder+"script.js","/* "+title+" — scripts */ "); zip.file(folder+"assets/.gitkeep",""); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. ## Open Double-click `index.html` in your browser. Or serve locally: ```bash npx serve . # or python3 -m http.server 3000 ``` "); zip.file(folder+".gitignore",".DS_Store node_modules/ .env "); } /* ===== MAIN ===== */ var sc=document.createElement("script"); sc.src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"; sc.onerror=function(){ if(lbl)lbl.textContent="Download ZIP"; alert("JSZip load failed — check connection."); }; sc.onload=function(){ var zip=new JSZip(); var base=(_phFname||"output").replace(/.[^.]+$/,""); var app=base.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,"")||"my_app"; var folder=app+"/"; var vc=document.getElementById("panel-content"); var panelTxt=vc?(vc.innerText||vc.textContent||""):""; var lang=detectLang(_phCode,panelTxt); if(_phIsHtml){ buildVanillaHtml(zip,folder,app,_phCode); } else if(lang==="flutter"){ buildFlutter(zip,folder,app,_phCode,panelTxt); } else if(lang==="react-native"){ buildReactNative(zip,folder,app,_phCode,panelTxt); } else if(lang==="swift"){ buildSwift(zip,folder,app,_phCode,panelTxt); } else if(lang==="kotlin"){ buildKotlin(zip,folder,app,_phCode,panelTxt); } else if(lang==="react"){ buildReact(zip,folder,app,_phCode,panelTxt); } else if(lang==="vue"){ buildVue(zip,folder,app,_phCode,panelTxt); } else if(lang==="angular"){ buildAngular(zip,folder,app,_phCode,panelTxt); } else if(lang==="python"){ buildPython(zip,folder,app,_phCode); } else if(lang==="node"){ buildNode(zip,folder,app,_phCode); } else { /* Document/content workflow */ var title=app.replace(/_/g," "); var md=_phAll||_phCode||panelTxt||"No content"; zip.file(folder+app+".md",md); var h=""+title+""; h+="

"+title+"

"; var hc=md.replace(/&/g,"&").replace(//g,">"); hc=hc.replace(/^### (.+)$/gm,"

$1

"); hc=hc.replace(/^## (.+)$/gm,"

$1

"); hc=hc.replace(/^# (.+)$/gm,"

$1

"); hc=hc.replace(/**(.+?)**/g,"$1"); hc=hc.replace(/ {2,}/g,"

"); h+="

"+hc+"

Generated by PantheraHive BOS
"; zip.file(folder+app+".html",h); zip.file(folder+"README.md","# "+title+" Generated by PantheraHive BOS. Files: - "+app+".md (Markdown) - "+app+".html (styled HTML) "); } zip.generateAsync({type:"blob"}).then(function(blob){ var a=document.createElement("a"); a.href=URL.createObjectURL(blob); a.download=app+".zip"; a.click(); URL.revokeObjectURL(a.href); if(lbl)lbl.textContent="Download ZIP"; }); }; document.head.appendChild(sc); }function phShare(){navigator.clipboard.writeText(window.location.href).then(function(){var el=document.getElementById("ph-share-lbl");if(el){el.textContent="Link copied!";setTimeout(function(){el.textContent="Copy share link";},2500);}});}function phEmbed(){var runId=window.location.pathname.split("/").pop().replace(".html","");var embedUrl="https://pantherahive.com/embed/"+runId;var code='';navigator.clipboard.writeText(code).then(function(){var el=document.getElementById("ph-embed-lbl");if(el){el.textContent="Embed code copied!";setTimeout(function(){el.textContent="Get Embed Code";},2500);}});}