/* global React */ const { useState, useEffect, useMemo, useRef, useCallback } = React; const PRODUCTS = [ { id: "horizon-kpi", name: "Horizon KPI", tagline: "Multi-metric KPI card with trend, target and variance baked in.", category: "KPI", price: 49, version: "2.4.1", updated: "2026-03-18", downloads: 12400, rating: 4.8, tags: ["KPI", "Finance", "Executive"], summary: "A dense but legible KPI card for executive dashboards. Display current, prior-period, target, variance and a compact sparkline inside a single tile, with conditional formatting across all elements.", features: [ "Up to 6 metrics per card, each with independent formatting", "Target lines, variance pills and trend micro-charts", "High-contrast mode and accessibility-tested color scales", "Tooltip drill-through with custom payloads" ] }, { id: "strata-waterfall", name: "Strata Waterfall", tagline: "Publication-grade waterfall with subtotals, bridges and annotations.", category: "Comparison", price: 59, version: "1.9.0", updated: "2026-02-11", downloads: 8720, rating: 4.9, tags: ["Finance", "P&L", "Variance"], summary: "Build variance bridges that a CFO would sign off on. Automatic subtotals, stacked categories, and inline annotations with callouts — no post-processing in a slide tool required.", features: [ "Stacked and signed waterfall variants", "Subtotal and bridge segments with custom labels", "Currency and unit scaling with smart rounding", "Export to vector for presentation decks" ] }, { id: "atlas-small-multiples", name: "Atlas Small Multiples", tagline: "Dense grids of synchronised charts for cohort and segment comparison.", category: "Comparison", price: 79, version: "3.0.2", updated: "2026-04-02", downloads: 6140, rating: 4.7, tags: ["Cohort", "Segment", "Time series"], summary: "Render up to 64 synchronised panels with shared axes, linked brushing and per-panel annotations. Ideal for cohort analysis, territory reviews and product-line comparisons.", features: [ "Linked brushing across panels", "Shared or independent axis scaling", "Per-panel conditional highlighting", "Automatic pagination for large sets" ] }, { id: "meridian-map", name: "Meridian Choropleth", tagline: "Administrative-boundary maps with choropleth, bubbles and flows.", category: "Geospatial", price: 89, version: "4.1.0", updated: "2026-03-30", downloads: 9320, rating: 4.6, tags: ["Map", "Geo", "Territory"], summary: "Ship geo dashboards without a custom tile server. Bundled admin boundaries for 90+ countries, bubble overlays, and support for custom TopoJSON shapes.", features: [ "90+ country admin boundaries bundled", "Bubble, flow and choropleth layers", "Custom TopoJSON upload", "Drill-down from country → region → city" ] }, { id: "cascade-funnel", name: "Cascade Funnel", tagline: "Conversion funnels with stage dropoff, timing and cohort splits.", category: "Analytics", price: 49, version: "2.2.0", updated: "2026-01-24", downloads: 7810, rating: 4.7, tags: ["Funnel", "Conversion", "SaaS"], summary: "A funnel visual that respects the underlying data model. Stage time, drop-off reasons, and cohort splits are all first-class — not crammed into tooltips.", features: [ "Stage duration and drop-off", "Cohort-colored stage bands", "Lateral comparison of 2+ funnels", "Drill-through to stage exits" ] }, { id: "lattice-heatmap", name: "Lattice Heatmap", tagline: "Calendar, matrix and clustered heatmaps with principled color scales.", category: "Matrix", price: 39, version: "1.7.3", updated: "2026-02-28", downloads: 10120, rating: 4.8, tags: ["Heatmap", "Calendar", "Density"], summary: "Diverging, sequential and cyclic color scales engineered for perceptual uniformity. Calendar, matrix and clustered variants in a single visual.", features: [ "Perceptually uniform color scales", "Calendar, matrix and clustered modes", "Cell-level drill-through", "Color-blind safe defaults" ] }, { id: "beacon-gauge", name: "Beacon Gauge", tagline: "Bullet, radial and linear gauges with target bands and thresholds.", category: "KPI", price: 29, version: "1.4.0", updated: "2025-12-15", downloads: 5430, rating: 4.5, tags: ["Gauge", "Target", "Threshold"], summary: "Gauges that communicate progress without gimmicks. Bullet charts for compact dashboards, radial for landing tiles, linear for operations screens.", features: [ "Bullet, radial and linear forms", "Multiple target and threshold bands", "Dynamic thresholds from measures", "Screen-reader friendly summaries" ] }, { id: "prism-decomp", name: "Prism Decomposition", tagline: "Decomposition tree with quantitative drivers and leaf sparklines.", category: "Analytics", price: 99, version: "1.2.0", updated: "2026-03-05", downloads: 3290, rating: 4.6, tags: ["Tree", "Driver", "Root cause"], summary: "Walk from a top-line number down to its drivers, with variance contributions and inline sparklines at every leaf. Built for root-cause analysis sessions.", features: [ "Quantitative variance contributions", "Inline sparklines per leaf", "Automatic top-N branching", "Exportable driver paths" ] }, { id: "orbit-network", name: "Orbit Network", tagline: "Force-directed network graph with community detection.", category: "Graph", price: 119, version: "0.9.2", updated: "2026-04-12", downloads: 1420, rating: 4.4, tags: ["Network", "Graph", "Community"], summary: "Visualise relationships at scale. Force-directed layout with WebGL rendering, community detection, and path highlighting for up to 20,000 nodes.", features: [ "WebGL rendering up to 20k nodes", "Louvain community detection", "Path & neighbour highlighting", "Exportable clustered layouts" ] }, { id: "ledger-table", name: "Ledger Table", tagline: "Dense, spreadsheet-class table with inline sparklines and totals.", category: "Table", price: 59, version: "2.8.1", updated: "2026-04-01", downloads: 14200, rating: 4.9, tags: ["Table", "Ledger", "Finance"], summary: "A table visual designed for people who still live in spreadsheets. Grouped totals, inline sparklines, frozen columns, and conditional formatting that actually works.", features: [ "Grouped subtotals with roll-ups", "Inline sparklines and data bars", "Frozen rows and columns", "Cell-level conditional formatting" ] } ]; window.PRODUCTS = PRODUCTS; window.ReactHooks = { useState, useEffect, useMemo, useRef, useCallback };