@salesmind-ai/design-system 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/{SectionShell-BfBw5q0Y.d.cts → SectionShell-GlglHCzz.d.cts} +1 -0
  2. package/dist/{SectionShell-BfBw5q0Y.d.ts → SectionShell-GlglHCzz.d.ts} +1 -0
  3. package/dist/StatsSection-B8iD9L-o.d.ts +68 -0
  4. package/dist/StatsSection-wgd8Vge1.d.cts +68 -0
  5. package/dist/blog/index.cjs +13 -13
  6. package/dist/blog/index.d.cts +1 -1
  7. package/dist/blog/index.d.ts +1 -1
  8. package/dist/blog/index.js +2 -2
  9. package/dist/charts/index.cjs +11 -11
  10. package/dist/charts/index.js +1 -1
  11. package/dist/{chunk-F6YYWMME.js → chunk-2KQVZ5FB.js} +2 -2
  12. package/dist/{chunk-LMJPWXTZ.cjs → chunk-2ZNR2F2V.cjs} +8 -8
  13. package/dist/{chunk-TEC62D4A.cjs → chunk-6HKQ5ILL.cjs} +30 -30
  14. package/dist/chunk-6HKQ5ILL.cjs.map +1 -0
  15. package/dist/{chunk-IYPXJ6YC.cjs → chunk-EM7JHRYW.cjs} +1 -1
  16. package/dist/{chunk-IYPXJ6YC.cjs.map → chunk-EM7JHRYW.cjs.map} +1 -1
  17. package/dist/{chunk-REQ5Q6ZI.js → chunk-JNASH4OQ.js} +4 -4
  18. package/dist/chunk-JNASH4OQ.js.map +1 -0
  19. package/dist/{chunk-ZDLOA2UT.cjs → chunk-KDLH35OI.cjs} +4 -4
  20. package/dist/chunk-KDLH35OI.cjs.map +1 -0
  21. package/dist/{chunk-XQZVY7JJ.cjs → chunk-KK5UO2P4.cjs} +7 -7
  22. package/dist/{chunk-OLV7OD3X.cjs → chunk-LGNMFBLF.cjs} +4 -4
  23. package/dist/{chunk-ZWUKRCOJ.cjs → chunk-OGKGIXFC.cjs} +29 -29
  24. package/dist/{chunk-MTI27RDV.js → chunk-PE2KJVRN.js} +2 -2
  25. package/dist/{chunk-GUZIMHWS.js → chunk-RQUFZAZ7.js} +30 -30
  26. package/dist/chunk-RQUFZAZ7.js.map +1 -0
  27. package/dist/{chunk-LOWEAQST.js → chunk-T5H5PNLN.js} +2 -2
  28. package/dist/{chunk-TW5JB35D.js → chunk-U3LK2GID.js} +2 -2
  29. package/dist/{chunk-KBA2LFBG.js → chunk-UFAJY2DM.js} +1 -1
  30. package/dist/{chunk-KBA2LFBG.js.map → chunk-UFAJY2DM.js.map} +1 -1
  31. package/dist/index.cjs +93 -93
  32. package/dist/index.css +24 -13
  33. package/dist/index.css.map +1 -1
  34. package/dist/index.d.cts +2 -2
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.js +7 -7
  37. package/dist/marketing/index.cjs +36 -36
  38. package/dist/marketing/index.d.cts +1 -1
  39. package/dist/marketing/index.d.ts +1 -1
  40. package/dist/marketing/index.js +2 -2
  41. package/dist/nav/index.cjs +16 -16
  42. package/dist/nav/index.css +24 -13
  43. package/dist/nav/index.css.map +1 -1
  44. package/dist/nav/index.js +1 -1
  45. package/dist/sections/index.cjs +14 -15
  46. package/dist/sections/index.cjs.map +1 -1
  47. package/dist/sections/index.d.cts +15 -69
  48. package/dist/sections/index.d.ts +15 -69
  49. package/dist/sections/index.js +11 -2
  50. package/dist/sections/index.js.map +1 -1
  51. package/dist/social-proof/index.cjs +12 -12
  52. package/dist/social-proof/index.d.cts +1 -1
  53. package/dist/social-proof/index.d.ts +1 -1
  54. package/dist/social-proof/index.js +2 -2
  55. package/package.json +1 -1
  56. package/dist/chunk-GUZIMHWS.js.map +0 -1
  57. package/dist/chunk-REQ5Q6ZI.js.map +0 -1
  58. package/dist/chunk-TEC62D4A.cjs.map +0 -1
  59. package/dist/chunk-ZDLOA2UT.cjs.map +0 -1
  60. /package/dist/{chunk-F6YYWMME.js.map → chunk-2KQVZ5FB.js.map} +0 -0
  61. /package/dist/{chunk-LMJPWXTZ.cjs.map → chunk-2ZNR2F2V.cjs.map} +0 -0
  62. /package/dist/{chunk-LOWEAQST.js.map → chunk-KK5UO2P4.cjs.map} +0 -0
  63. /package/dist/{chunk-OLV7OD3X.cjs.map → chunk-LGNMFBLF.cjs.map} +0 -0
  64. /package/dist/{chunk-TW5JB35D.js.map → chunk-OGKGIXFC.cjs.map} +0 -0
  65. /package/dist/{chunk-MTI27RDV.js.map → chunk-PE2KJVRN.js.map} +0 -0
  66. /package/dist/{chunk-XQZVY7JJ.cjs.map → chunk-T5H5PNLN.js.map} +0 -0
  67. /package/dist/{chunk-ZWUKRCOJ.cjs.map → chunk-U3LK2GID.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ChartContainer/ChartContainer.tsx","../src/components/LineChart/LineChart.tsx","../src/components/BarChart/BarChart.tsx","../src/components/PieChart/PieChart.tsx","../src/components/FunnelChart/FunnelChart.tsx","../src/components/HeatmapChart/HeatmapChart.tsx","../src/components/Chart/ChartSwitchControl.tsx","../src/components/Chart/Chart.tsx","../src/components/MBTIRadar/MBTIRadar.tsx","../src/components/MBTITypeGrid/MBTITypeGrid.tsx"],"names":["Tooltip","jsx","jsxs","XAxis","YAxis","CartesianGrid","Legend","DEFAULT_COLORS","useMemo","Cell","clsx","Line","Bar","Pie","ResponsiveContainer","Fragment"],"mappings":"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","sourcesContent":["import React from 'react';\nimport clsx from 'clsx';\nimport { ResponsiveContainer } from 'recharts';\nimport { useReportMode, useChartData } from '../../report-engine';\nimport { DataStateIndicator } from '../DataStateIndicator';\nimport { DataCoverageBadge } from '../DataCoverageBadge';\nimport './ChartContainer.css';\n\nexport interface ChartContainerProps<T = Record<string, unknown>> {\n /** Chart title */\n title?: string;\n /** Chart subtitle/description */\n subtitle?: string;\n /** Chart height */\n height?: number;\n /** Chart data for validation */\n data?: T[];\n /** Required fields for data validation */\n requiredFields?: string[];\n /** Minimum sample size */\n minSampleSize?: number;\n /** Show data coverage badge */\n showCoverage?: boolean;\n /** Date range for coverage badge */\n dateRange?: { start: string; end: string };\n /** Loading state */\n loading?: boolean;\n /** Empty state message */\n emptyMessage?: string;\n /** Chart children (Recharts components) */\n children: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ChartContainer wraps charts with responsive sizing, theming, and data state handling.\n * It enforces data contracts and shows appropriate states when data is invalid.\n */\nexport function ChartContainer<T extends Record<string, unknown>>({\n title,\n subtitle,\n height = 300,\n data = [],\n requiredFields = [],\n minSampleSize = 30,\n showCoverage = true,\n dateRange,\n loading,\n emptyMessage = 'No data available',\n children,\n className,\n ...props\n}: ChartContainerProps<T>) {\n const { features } = useReportMode();\n\n const { state, isRenderable, message } = useChartData({\n data,\n requiredFields,\n minSampleSize,\n });\n\n const renderContent = () => {\n if (loading) {\n return (\n <div className=\"ds-chart-container__loading\">\n <div className=\"ds-chart-container__spinner\" />\n <span>Loading chart...</span>\n </div>\n );\n }\n\n if (!isRenderable && state !== 'VALID') {\n return (\n <div className=\"ds-chart-container__empty\">\n <DataStateIndicator\n state={state}\n variant=\"full\"\n details={{ message, sampleSize: data.length, requiredSize: minSampleSize }}\n />\n {state === 'INSUFFICIENT_SAMPLE' && data.length === 0 && (\n <p className=\"ds-chart-container__empty-message\">{emptyMessage}</p>\n )}\n </div>\n );\n }\n\n return (\n <ResponsiveContainer width=\"100%\" height={height}>\n {children as React.ReactElement}\n </ResponsiveContainer>\n );\n };\n\n return (\n <div\n className={clsx(\n 'ds-chart-container',\n loading && 'ds-chart-container--loading',\n !isRenderable && 'ds-chart-container--invalid',\n className,\n )}\n {...props}\n >\n {(title || subtitle || (showCoverage && features.showMethodology)) && (\n <header className=\"ds-chart-container__header\">\n <div className=\"ds-chart-container__header-content\">\n {title && <h4 className=\"ds-chart-container__title\">{title}</h4>}\n {subtitle && <p className=\"ds-chart-container__subtitle\">{subtitle}</p>}\n </div>\n {showCoverage && features.showMethodology && data.length > 0 && (\n <DataCoverageBadge\n sampleSize={data.length}\n requiredSize={minSampleSize}\n dateRange={dateRange}\n size=\"sm\"\n />\n )}\n </header>\n )}\n\n <div\n className=\"ds-chart-container__chart\"\n style={{ height: typeof height === 'number' ? height : undefined }}\n >\n {renderContent()}\n </div>\n\n {isRenderable && state !== 'VALID' && (\n <footer className=\"ds-chart-container__footer\">\n <DataStateIndicator state={state} variant=\"compact\" />\n </footer>\n )}\n </div>\n );\n}\n\nChartContainer.displayName = 'ChartContainer';\n","import React from 'react';\nimport {\n LineChart as RechartsLineChart,\n Line,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n} from 'recharts';\nimport { ChartContainer } from '../ChartContainer';\n\nexport interface LineConfig {\n /** Data key for the line */\n key: string;\n /** Display name */\n name?: string;\n /** Line color (CSS variable or hex) */\n color?: string;\n /** Dashed line */\n dashed?: boolean;\n /** Show dots on data points */\n dot?: boolean;\n}\n\nexport interface LineChartProps<T = Record<string, unknown>> {\n /** Chart data */\n data: T[];\n /** X-axis data key */\n xKey: string;\n /** Line configurations */\n lines: LineConfig[];\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Chart height */\n height?: number;\n /** Show grid lines */\n grid?: boolean;\n /** Show legend */\n legend?: boolean;\n /** Curve type */\n curve?: 'linear' | 'monotone' | 'step';\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number, name: string) => string;\n /** Minimum sample size */\n minSampleSize?: number;\n /** Date range */\n dateRange?: { start: string; end: string };\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_COLORS = [\n 'var(--brand-pink)',\n 'var(--brand-yellow)',\n 'var(--status-info)',\n 'var(--status-success)',\n 'var(--status-warning)',\n];\n\n/**\n * LineChart displays time-series or trend data.\n * Requires minimum 7 data points for meaningful visualization.\n */\nexport function LineChart<T extends Record<string, unknown>>({\n data,\n xKey,\n lines,\n title,\n subtitle,\n height = 300,\n grid = true,\n legend: showLegend = true,\n curve = 'monotone',\n minSampleSize = 7,\n dateRange,\n className,\n}: LineChartProps<T>) {\n const requiredFields = [xKey, ...lines.map((l) => l.key)];\n const chartData = React.useMemo(() => data.map((item) => ({ ...item })), [data]);\n\n return (\n <ChartContainer\n title={title}\n subtitle={subtitle}\n height={height}\n data={data}\n requiredFields={requiredFields}\n minSampleSize={minSampleSize}\n dateRange={dateRange}\n className={className}\n >\n <RechartsLineChart data={chartData} margin={{ top: 5, right: 20, left: 0, bottom: 5 }}>\n {grid && <CartesianGrid strokeDasharray=\"3 3\" vertical={false} />}\n <XAxis\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={{ strokeWidth: 1 }}\n />\n <YAxis tick={{ fontSize: 12 }} tickLine={false} axisLine={false} width={40} />\n <Tooltip />\n {showLegend && <Legend />}\n {lines.map((line, index) => (\n <Line\n key={line.key}\n type={curve}\n dataKey={line.key}\n name={line.name || line.key}\n stroke={line.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n strokeWidth={2}\n strokeDasharray={line.dashed ? '5 5' : undefined}\n dot={line.dot !== false}\n activeDot={{ r: 6 }}\n />\n ))}\n </RechartsLineChart>\n </ChartContainer>\n );\n}\n\nLineChart.displayName = 'LineChart';\n","import { useMemo } from 'react';\nimport {\n BarChart as RechartsBarChart,\n Bar,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n Cell,\n} from 'recharts';\nimport { ChartContainer } from '../ChartContainer';\n\nexport interface BarConfig {\n /** Data key for the bar */\n key: string;\n /** Display name */\n name?: string;\n /** Bar color (CSS variable or hex) */\n color?: string;\n /** Stack ID for stacked bars */\n stackId?: string;\n}\n\nexport interface BarChartProps<T = Record<string, unknown>> {\n /** Chart data */\n data: T[];\n /** X-axis data key (category key) */\n xKey: string;\n /** Bar configurations */\n bars: BarConfig[];\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Chart height */\n height?: number;\n /** Layout direction */\n layout?: 'horizontal' | 'vertical';\n /** Show grid lines */\n grid?: boolean;\n /** Show legend */\n legend?: boolean;\n /** Bar corner radius */\n radius?: number;\n /** Show value labels on bars */\n showLabels?: boolean;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number, name: string) => string;\n /** Minimum sample size */\n minSampleSize?: number;\n /** Use category colors (different color per bar in single series) */\n categoryColors?: string[];\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_COLORS = [\n 'var(--brand-pink)',\n 'var(--brand-yellow)',\n 'var(--status-info)',\n 'var(--status-success)',\n 'var(--status-warning)',\n];\n\n/**\n * BarChart displays comparisons and distributions.\n * Requires minimum 5 categories for meaningful visualization.\n */\nexport function BarChart<T extends Record<string, unknown>>({\n data,\n xKey,\n bars,\n title,\n subtitle,\n height = 300,\n layout = 'horizontal',\n grid = true,\n legend: showLegend = true,\n radius = 4,\n showLabels = false,\n minSampleSize = 5,\n categoryColors,\n className,\n}: BarChartProps<T>) {\n const requiredFields = [xKey, ...bars.map((b) => b.key)];\n const isVertical = layout === 'vertical';\n const chartData = useMemo(() => data.map((item) => ({ ...item })), [data]);\n\n return (\n <ChartContainer\n title={title}\n subtitle={subtitle}\n height={height}\n data={chartData}\n requiredFields={requiredFields}\n minSampleSize={minSampleSize}\n className={className}\n >\n <RechartsBarChart\n data={chartData}\n layout={isVertical ? 'vertical' : 'horizontal'}\n margin={{ top: 5, right: 20, left: isVertical ? 80 : 0, bottom: 5 }}\n >\n {grid && (\n <CartesianGrid strokeDasharray=\"3 3\" horizontal={!isVertical} vertical={isVertical} />\n )}\n {isVertical ? (\n <>\n <XAxis type=\"number\" tick={{ fontSize: 12 }} tickLine={false} axisLine={false} />\n <YAxis\n type=\"category\"\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={false}\n width={80}\n />\n </>\n ) : (\n <>\n <XAxis\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={{ strokeWidth: 1 }}\n />\n <YAxis tick={{ fontSize: 12 }} tickLine={false} axisLine={false} width={40} />\n </>\n )}\n <Tooltip />\n {showLegend && bars.length > 1 && <Legend />}\n {bars.map((bar, barIndex) => (\n <Bar\n key={bar.key}\n dataKey={bar.key}\n name={bar.name || bar.key}\n fill={bar.color || DEFAULT_COLORS[barIndex % DEFAULT_COLORS.length]}\n stackId={bar.stackId}\n radius={[radius, radius, 0, 0]}\n label={showLabels ? { position: 'top', fontSize: 10 } : false}\n >\n {categoryColors &&\n chartData.map((_, index) => (\n <Cell key={`cell-${index}`} fill={categoryColors[index % categoryColors.length]} />\n ))}\n </Bar>\n ))}\n </RechartsBarChart>\n </ChartContainer>\n );\n}\n\nBarChart.displayName = 'BarChart';\n","import { useMemo } from 'react';\nimport { PieChart as RechartsPieChart, Pie, Cell, Tooltip, Legend } from 'recharts';\nimport { ChartContainer } from '../ChartContainer';\n\nexport interface PieChartDataItem {\n name: string;\n value: number;\n color?: string;\n}\n\nexport interface PieChartProps {\n /** Chart data */\n data: PieChartDataItem[];\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Chart height */\n height?: number;\n /** Inner radius for donut effect (0 = pie, >0 = donut) */\n innerRadius?: number;\n /** Outer radius */\n outerRadius?: number;\n /** Show labels */\n showLabels?: boolean;\n /** Label type */\n labelType?: 'percent' | 'value' | 'name';\n /** Show legend */\n legend?: boolean;\n /** Custom tooltip formatter */\n tooltipFormatter?: (value: number, name: string) => string;\n /** Minimum sample size (total of all values) */\n minSampleSize?: number;\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_COLORS = [\n 'var(--brand-pink)',\n 'var(--brand-yellow)',\n 'var(--status-info)',\n 'var(--status-success)',\n 'var(--status-warning)',\n 'var(--status-error)',\n '#8884d8',\n '#82ca9d',\n];\n\n/**\n * PieChart displays proportions and compositions.\n * Requires minimum 3 segments and n > 30 for meaningful visualization.\n */\nexport function PieChart({\n data,\n title,\n subtitle,\n height = 300,\n innerRadius = 0,\n outerRadius = 80,\n showLabels = true,\n labelType = 'percent',\n legend: showLegend = true,\n minSampleSize = 30,\n className,\n}: PieChartProps) {\n const safeData = useMemo(() => data.map((item) => ({ ...item })), [data]);\n const renderLabel = (props: { name?: string; value?: number; percent?: number }) => {\n const { name, value, percent } = props;\n switch (labelType) {\n case 'percent':\n return `${((percent ?? 0) * 100).toFixed(0)}%`;\n case 'value':\n return (value ?? 0).toLocaleString();\n case 'name':\n return name ?? '';\n default:\n return '';\n }\n };\n\n return (\n <ChartContainer\n title={title}\n subtitle={subtitle}\n height={height}\n data={safeData}\n requiredFields={['name', 'value']}\n minSampleSize={minSampleSize}\n className={className}\n >\n <RechartsPieChart>\n <Pie\n data={safeData}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={innerRadius}\n outerRadius={outerRadius}\n paddingAngle={2}\n dataKey=\"value\"\n label={showLabels ? renderLabel : undefined}\n labelLine={showLabels}\n >\n {safeData.map((entry, index) => (\n <Cell\n key={`cell-${index}`}\n fill={entry.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length]}\n />\n ))}\n </Pie>\n <Tooltip />\n {showLegend && <Legend />}\n </RechartsPieChart>\n </ChartContainer>\n );\n}\n\nPieChart.displayName = 'PieChart';\n","import { useMemo } from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport { DataCoverageBadge } from '../DataCoverageBadge';\nimport { DataStateIndicator } from '../DataStateIndicator';\nimport './FunnelChart.css';\n\nexport interface FunnelStage {\n /** Stage name */\n name: string;\n /** Value/count at this stage */\n value: number;\n /** Optional color override */\n color?: string;\n}\n\nexport interface FunnelChartProps {\n /** Funnel stages (min 3 required) */\n stages: FunnelStage[];\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Show conversion rates between stages */\n showConversionRates?: boolean;\n /** Show drop-off percentages */\n showDropOff?: boolean;\n /** Show value labels */\n showValues?: boolean;\n /** Height in pixels */\n height?: number;\n /** Additional CSS class */\n className?: string;\n}\n\nconst DEFAULT_COLORS = [\n 'var(--brand-pink)',\n 'var(--brand-yellow)',\n 'var(--status-info)',\n 'var(--status-success)',\n 'var(--status-warning)',\n];\n\n/**\n * FunnelChart visualizes conversion funnels and drop-off rates.\n * Requires minimum 3 stages for meaningful visualization.\n */\nexport function FunnelChart({\n stages,\n title,\n subtitle,\n showConversionRates = true,\n showDropOff = true,\n showValues = true,\n height = 300,\n className,\n}: FunnelChartProps) {\n const { features } = useReportMode();\n\n const isValid = stages.length >= 3;\n const maxValue = stages.length > 0 ? Math.max(...stages.map((s) => s.value)) : 0;\n\n const stagesWithMetrics = useMemo(() => {\n return stages.map((stage, index) => {\n const prevStage = index > 0 ? stages[index - 1] : null;\n const conversionRate = prevStage ? (stage.value / prevStage.value) * 100 : 100;\n const dropOff = prevStage ? ((prevStage.value - stage.value) / prevStage.value) * 100 : 0;\n const widthPercent = maxValue > 0 ? (stage.value / maxValue) * 100 : 0;\n\n return {\n ...stage,\n conversionRate,\n dropOff,\n widthPercent,\n color: stage.color || DEFAULT_COLORS[index % DEFAULT_COLORS.length],\n };\n });\n }, [stages, maxValue]);\n\n if (!isValid) {\n return (\n <div className={clsx('ds-funnel-chart', 'ds-funnel-chart--invalid', className)}>\n {title && <h4 className=\"ds-funnel-chart__title\">{title}</h4>}\n <div className=\"ds-funnel-chart__empty\">\n <DataStateIndicator\n state=\"INSUFFICIENT_SAMPLE\"\n variant=\"full\"\n details={{\n message: 'Funnel requires at least 3 stages',\n sampleSize: stages.length,\n requiredSize: 3,\n }}\n />\n </div>\n </div>\n );\n }\n\n const totalConversion =\n stages.length > 1\n ? ((stages[stages.length - 1].value / stages[0].value) * 100).toFixed(1)\n : '100';\n\n return (\n <div className={clsx('ds-funnel-chart', className)} style={{ minHeight: height }}>\n {(title || subtitle) && (\n <header className=\"ds-funnel-chart__header\">\n <div>\n {title && <h4 className=\"ds-funnel-chart__title\">{title}</h4>}\n {subtitle && <p className=\"ds-funnel-chart__subtitle\">{subtitle}</p>}\n </div>\n {features.showMethodology && <DataCoverageBadge sampleSize={stages[0].value} size=\"sm\" />}\n </header>\n )}\n\n <div className=\"ds-funnel-chart__stages\">\n {stagesWithMetrics.map((stage, index) => (\n <div key={stage.name} className=\"ds-funnel-chart__stage\">\n <div className=\"ds-funnel-chart__bar-container\">\n <div\n className=\"ds-funnel-chart__bar\"\n style={{\n width: `${stage.widthPercent}%`,\n backgroundColor: stage.color,\n }}\n >\n {showValues && (\n <span className=\"ds-funnel-chart__value\">{stage.value.toLocaleString()}</span>\n )}\n </div>\n </div>\n\n <div className=\"ds-funnel-chart__label\">\n <span className=\"ds-funnel-chart__stage-name\">{stage.name}</span>\n {showConversionRates && index > 0 && (\n <span className=\"ds-funnel-chart__conversion\">\n {stage.conversionRate.toFixed(1)}% converted\n </span>\n )}\n </div>\n\n {showDropOff && index > 0 && stage.dropOff > 0 && (\n <div className=\"ds-funnel-chart__dropoff\">\n <span className=\"ds-funnel-chart__dropoff-arrow\">↓</span>\n <span className=\"ds-funnel-chart__dropoff-value\">-{stage.dropOff.toFixed(1)}%</span>\n </div>\n )}\n </div>\n ))}\n </div>\n\n <footer className=\"ds-funnel-chart__footer\">\n <span className=\"ds-funnel-chart__total\">\n Overall Conversion: <strong>{totalConversion}%</strong>\n </span>\n </footer>\n </div>\n );\n}\n\nFunnelChart.displayName = 'FunnelChart';\n","import { useMemo } from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport { DataCoverageBadge } from '../DataCoverageBadge';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport './HeatmapChart.css';\n\nexport interface HeatmapCell {\n /** X-axis value (column) */\n x: string;\n /** Y-axis value (row) */\n y: string;\n /** Cell value */\n value: number;\n}\n\nexport interface HeatmapChartProps {\n /** Heatmap data */\n data: HeatmapCell[];\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** X-axis label */\n xLabel?: string;\n /** Y-axis label */\n yLabel?: string;\n /** Color scale (low to high) */\n colorScale?: [string, string];\n /** Show cell values */\n showValues?: boolean;\n /** Value formatter */\n valueFormatter?: (value: number) => string;\n /** Minimum cells required */\n minCells?: number;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * HeatmapChart visualizes density and correlation data.\n * Requires minimum 25 cells for meaningful visualization.\n */\nexport function HeatmapChart({\n data,\n title,\n subtitle,\n xLabel,\n yLabel,\n colorScale = ['var(--glass-elevated)', 'var(--brand-pink)'],\n showValues = true,\n valueFormatter = (v) => v.toFixed(0),\n minCells = 25,\n className,\n}: HeatmapChartProps) {\n const { features } = useReportMode();\n\n // Extract unique x and y values\n const { xValues, yValues, cellMap, minValue, maxValue } = useMemo(() => {\n const xSet = new Set<string>();\n const ySet = new Set<string>();\n const map = new Map<string, number>();\n let min = Infinity;\n let max = -Infinity;\n\n for (const cell of data) {\n xSet.add(cell.x);\n ySet.add(cell.y);\n map.set(`${cell.x}-${cell.y}`, cell.value);\n min = Math.min(min, cell.value);\n max = Math.max(max, cell.value);\n }\n\n return {\n xValues: Array.from(xSet),\n yValues: Array.from(ySet),\n cellMap: map,\n minValue: min === Infinity ? 0 : min,\n maxValue: max === -Infinity ? 0 : max,\n };\n }, [data]);\n\n const isValid = data.length >= minCells;\n\n const getCellColor = (value: number) => {\n if (maxValue === minValue) return colorScale[0];\n const ratio = (value - minValue) / (maxValue - minValue);\n return `color-mix(in srgb, ${colorScale[1]} ${ratio * 100}%, ${colorScale[0]})`;\n };\n\n const getTextColor = (value: number) => {\n const ratio = (value - minValue) / (maxValue - minValue);\n return ratio > 0.5 ? 'white' : 'var(--text-primary)';\n };\n\n if (!isValid) {\n return (\n <div className={clsx('ds-heatmap-chart', 'ds-heatmap-chart--invalid', className)}>\n {title && <h4 className=\"ds-heatmap-chart__title\">{title}</h4>}\n <div className=\"ds-heatmap-chart__empty\">\n <p>Insufficient data for heatmap visualization</p>\n <p className=\"ds-heatmap-chart__empty-detail\">\n {data.length} cells provided, {minCells} required\n </p>\n </div>\n </div>\n );\n }\n\n return (\n <div className={clsx('ds-heatmap-chart', className)}>\n {(title || subtitle) && (\n <header className=\"ds-heatmap-chart__header\">\n <div>\n {title && <h4 className=\"ds-heatmap-chart__title\">{title}</h4>}\n {subtitle && <p className=\"ds-heatmap-chart__subtitle\">{subtitle}</p>}\n </div>\n {features.showMethodology && (\n <DataCoverageBadge sampleSize={data.length} requiredSize={minCells} size=\"sm\" />\n )}\n </header>\n )}\n\n <div className=\"ds-heatmap-chart__container\">\n {yLabel && (\n <div className=\"ds-heatmap-chart__y-label\">\n <span>{yLabel}</span>\n </div>\n )}\n\n <div className=\"ds-heatmap-chart__grid-wrapper\">\n <div\n className=\"ds-heatmap-chart__grid\"\n style={{\n gridTemplateColumns: `repeat(${xValues.length}, 1fr)`,\n gridTemplateRows: `repeat(${yValues.length}, 1fr)`,\n }}\n >\n {yValues.map((y) =>\n xValues.map((x) => {\n const value = cellMap.get(`${x}-${y}`) ?? 0;\n const cellContent = (\n <div\n key={`${x}-${y}`}\n className=\"ds-heatmap-chart__cell\"\n style={{\n backgroundColor: getCellColor(value),\n color: getTextColor(value),\n }}\n >\n {showValues && (\n <span className=\"ds-heatmap-chart__cell-value\">{valueFormatter(value)}</span>\n )}\n </div>\n );\n\n return (\n <Tooltip key={`${x}-${y}`} content={`${x}, ${y}: ${valueFormatter(value)}`}>\n {cellContent}\n </Tooltip>\n );\n }),\n )}\n </div>\n\n {/* X-axis labels */}\n <div\n className=\"ds-heatmap-chart__x-labels\"\n style={{ gridTemplateColumns: `repeat(${xValues.length}, 1fr)` }}\n >\n {xValues.map((x) => (\n <span key={x} className=\"ds-heatmap-chart__x-label\">\n {x}\n </span>\n ))}\n </div>\n </div>\n\n {/* Y-axis labels */}\n <div\n className=\"ds-heatmap-chart__y-labels\"\n style={{ gridTemplateRows: `repeat(${yValues.length}, 1fr)` }}\n >\n {yValues.map((y) => (\n <span key={y} className=\"ds-heatmap-chart__y-label-item\">\n {y}\n </span>\n ))}\n </div>\n </div>\n\n {xLabel && (\n <div className=\"ds-heatmap-chart__x-axis-label\">\n <span>{xLabel}</span>\n </div>\n )}\n\n {/* Legend */}\n <div className=\"ds-heatmap-chart__legend\">\n <span className=\"ds-heatmap-chart__legend-label\">Low</span>\n <div\n className=\"ds-heatmap-chart__legend-bar\"\n style={{\n background: `linear-gradient(to right, ${colorScale[0]}, ${colorScale[1]})`,\n }}\n />\n <span className=\"ds-heatmap-chart__legend-label\">High</span>\n </div>\n </div>\n );\n}\n\nHeatmapChart.displayName = 'HeatmapChart';\n","import clsx from 'clsx';\nimport type { ChartTypeId } from '../../report-engine/chart-types';\nimport { CHART_REGISTRY } from '../../report-engine/chart-types';\nimport './ChartSwitchControl.css';\n\nexport interface ChartSwitchControlProps {\n /** Currently selected chart type */\n currentType: ChartTypeId;\n /** Allowed chart types for switching */\n allowedTypes: ChartTypeId[];\n /** Callback when type changes */\n onTypeChange: (type: ChartTypeId) => void;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ChartSwitchControl allows users to switch between allowed chart types\n * within the same semantic family.\n */\nexport function ChartSwitchControl({\n currentType,\n allowedTypes,\n onTypeChange,\n size = 'sm',\n className,\n}: ChartSwitchControlProps) {\n if (allowedTypes.length <= 1) {\n return null;\n }\n\n return (\n <div className={clsx('ds-chart-switch', `ds-chart-switch--${size}`, className)}>\n {allowedTypes.map((type) => {\n const meta = CHART_REGISTRY[type];\n if (!meta) return null;\n\n const isActive = type === currentType;\n const Icon = getChartIcon(type);\n\n return (\n <button\n key={type}\n type=\"button\"\n className={clsx(\n 'ds-chart-switch__option',\n isActive && 'ds-chart-switch__option--active',\n )}\n onClick={() => onTypeChange(type)}\n title={meta.name}\n aria-pressed={isActive}\n >\n <Icon />\n <span className=\"ds-chart-switch__label\">{getShortLabel(type)}</span>\n </button>\n );\n })}\n </div>\n );\n}\n\nChartSwitchControl.displayName = 'ChartSwitchControl';\n\n/* ============================================================================\n CHART ICONS\n ============================================================================ */\n\nfunction getChartIcon(type: ChartTypeId): React.FC {\n const icons: Partial<Record<ChartTypeId, React.FC>> = {\n line: LineIcon,\n smooth_line: SmoothLineIcon,\n area: AreaIcon,\n stacked_area: StackedAreaIcon,\n area_100pct: StackedAreaIcon,\n bar: BarIcon,\n column: ColumnIcon,\n stacked_bar: StackedBarIcon,\n stacked_column: StackedColumnIcon,\n column_100pct: StackedColumnIcon,\n pie: PieIcon,\n donut: DonutIcon,\n histogram: HistogramIcon,\n funnel: FunnelIcon,\n heatmap: HeatmapIcon,\n };\n\n return icons[type] || DefaultChartIcon;\n}\n\nfunction getShortLabel(type: ChartTypeId): string {\n const labels: Partial<Record<ChartTypeId, string>> = {\n line: 'Line',\n smooth_line: 'Smooth',\n area: 'Area',\n stacked_area: 'Stacked',\n area_100pct: '100%',\n bar: 'Bar',\n column: 'Column',\n stacked_bar: 'Stacked',\n stacked_column: 'Stacked',\n column_100pct: '100%',\n pie: 'Pie',\n donut: 'Donut',\n histogram: 'Histogram',\n funnel: 'Funnel',\n heatmap: 'Heatmap',\n };\n\n return labels[type] || type;\n}\n\n/* ============================================================================\n ICON COMPONENTS\n ============================================================================ */\n\nfunction LineIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <polyline points=\"22 12 18 8 13 13 9 9 2 16\" />\n </svg>\n );\n}\n\nfunction SmoothLineIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 16 C6 16, 8 8, 12 12 S18 6, 22 10\" />\n </svg>\n );\n}\n\nfunction AreaIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 20 L2 16 L8 10 L14 14 L22 6 L22 20 Z\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <polyline points=\"2 16 8 10 14 14 22 6\" />\n </svg>\n );\n}\n\nfunction StackedAreaIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 20 L2 14 L8 10 L14 12 L22 8 L22 20 Z\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <path d=\"M2 20 L2 16 L8 14 L14 15 L22 12 L22 20 Z\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction BarIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"4\" width=\"14\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"2\" y=\"10\" width=\"18\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"2\" y=\"16\" width=\"10\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction ColumnIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"4\" y=\"8\" width=\"4\" height=\"14\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"10\" y=\"4\" width=\"4\" height=\"18\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"16\" y=\"12\" width=\"4\" height=\"10\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction StackedBarIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"4\" width=\"8\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"10\" y=\"4\" width=\"6\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.15\" />\n <rect x=\"2\" y=\"10\" width=\"12\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"14\" y=\"10\" width=\"6\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.15\" />\n <rect x=\"2\" y=\"16\" width=\"6\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"8\" y=\"16\" width=\"4\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.15\" />\n </svg>\n );\n}\n\nfunction StackedColumnIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"4\" y=\"14\" width=\"4\" height=\"8\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"4\" y=\"8\" width=\"4\" height=\"6\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.15\" />\n <rect x=\"10\" y=\"10\" width=\"4\" height=\"12\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"10\" y=\"4\" width=\"4\" height=\"6\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.15\" />\n <rect x=\"16\" y=\"16\" width=\"4\" height=\"6\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"16\" y=\"12\" width=\"4\" height=\"4\" rx=\"1\" fill=\"currentColor\" fillOpacity=\"0.15\" />\n </svg>\n );\n}\n\nfunction PieIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <path d=\"M12 2 A10 10 0 0 1 22 12 L12 12 Z\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n </svg>\n );\n}\n\nfunction DonutIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <circle cx=\"12\" cy=\"12\" r=\"5\" fill=\"var(--glass-elevated)\" stroke=\"none\" />\n <path\n d=\"M12 2 A10 10 0 0 1 22 12 L17 12 A5 5 0 0 0 12 7 Z\"\n fill=\"currentColor\"\n fillOpacity=\"0.3\"\n />\n </svg>\n );\n}\n\nfunction HistogramIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"2\" y=\"14\" width=\"4\" height=\"8\" rx=\"0\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"6\" y=\"10\" width=\"4\" height=\"12\" rx=\"0\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"10\" y=\"4\" width=\"4\" height=\"18\" rx=\"0\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"14\" y=\"8\" width=\"4\" height=\"14\" rx=\"0\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"18\" y=\"12\" width=\"4\" height=\"10\" rx=\"0\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction FunnelIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M2 4 H22 L18 10 H6 Z\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <path d=\"M6 10 H18 L15 16 H9 Z\" fill=\"currentColor\" fillOpacity=\"0.25\" />\n <path d=\"M9 16 H15 L13 22 H11 Z\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n </svg>\n );\n}\n\nfunction HeatmapIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1\"\n >\n <rect x=\"2\" y=\"2\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.1\" />\n <rect x=\"9\" y=\"2\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"16\" y=\"2\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"2\" y=\"9\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.4\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.6\" />\n <rect x=\"16\" y=\"9\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.3\" />\n <rect x=\"2\" y=\"16\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.2\" />\n <rect x=\"9\" y=\"16\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.5\" />\n <rect x=\"16\" y=\"16\" width=\"6\" height=\"6\" fill=\"currentColor\" fillOpacity=\"0.4\" />\n </svg>\n );\n}\n\nfunction DefaultChartIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 15 L9 9 L13 13 L21 5\" />\n </svg>\n );\n}\n","import { useMemo, useState } from 'react';\nimport clsx from 'clsx';\nimport {\n LineChart as RechartsLine,\n AreaChart as RechartsArea,\n BarChart as RechartsBar,\n PieChart as RechartsPie,\n Line,\n Area,\n Bar,\n Pie,\n Cell,\n XAxis,\n YAxis,\n CartesianGrid,\n Tooltip,\n Legend,\n ResponsiveContainer,\n} from 'recharts';\nimport type {\n ChartIntent,\n ChartTypeId,\n ChartValidationResult,\n} from '../../report-engine/chart-types';\nimport {\n CHART_REGISTRY,\n validateChartData,\n getAllowedSwitchTargets,\n getDefaultChartForIntent,\n} from '../../report-engine/chart-types';\nimport { useReportMode } from '../../report-engine';\nimport { DataStateIndicator } from '../DataStateIndicator';\nimport { DataCoverageBadge } from '../DataCoverageBadge';\nimport { ChartSwitchControl } from './ChartSwitchControl';\nimport './Chart.css';\n\n/* ============================================================================\n CHART PROPS\n ============================================================================ */\n\nexport interface ChartDimension {\n /** Field key in data */\n key: string;\n /** Display label */\n label?: string;\n /** Is this a time dimension */\n isTime?: boolean;\n}\n\nexport interface ChartMeasure {\n /** Field key in data */\n key: string;\n /** Display label */\n label?: string;\n /** Color (CSS variable or hex) */\n color?: string;\n /** Stack group ID */\n stackId?: string;\n}\n\nexport interface ChartProps<T = Record<string, unknown>> {\n /** Semantic intent of the visualization */\n intent: ChartIntent;\n /** Chart data */\n data: T[];\n /** Dimension fields (categories, time axis) */\n dimensions: ChartDimension[];\n /** Measure fields (values to visualize) */\n measures: ChartMeasure[];\n /** Default chart type */\n defaultType?: ChartTypeId;\n /** Allowed chart types for switching (defaults to all MVP types in family) */\n allowedTypes?: ChartTypeId[];\n /** Controlled chart type */\n chartType?: ChartTypeId;\n /** Callback when chart type changes */\n onChartTypeChange?: (type: ChartTypeId) => void;\n /** Allow user to switch chart types */\n allowSwitching?: boolean;\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Chart height */\n height?: number;\n /** Show legend */\n legend?: boolean;\n /** Show grid */\n grid?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/* ============================================================================\n DEFAULT COLORS\n ============================================================================ */\n\nconst CHART_COLORS = [\n 'var(--brand-pink)',\n 'var(--brand-yellow)',\n 'var(--status-info)',\n 'var(--status-success)',\n 'var(--status-warning)',\n 'var(--status-error)',\n];\n\nfunction getColor(index: number, customColor?: string): string {\n return customColor || CHART_COLORS[index % CHART_COLORS.length];\n}\n\n/* ============================================================================\n CHART COMPONENT\n ============================================================================ */\n\n/**\n * Chart is the unified abstraction layer for all visualizations.\n *\n * It provides:\n * - Intent-based chart selection\n * - Data contract validation\n * - Governed chart switching within semantic families\n * - Consistent theming and accessibility\n *\n * @example\n * ```tsx\n * <Chart\n * intent=\"trend\"\n * data={timeSeriesData}\n * dimensions={[{ key: 'date', isTime: true }]}\n * measures={[{ key: 'revenue', label: 'Revenue' }]}\n * defaultType=\"line\"\n * allowSwitching\n * />\n * ```\n */\nexport function Chart<T extends Record<string, unknown>>({\n intent,\n data,\n dimensions,\n measures,\n defaultType,\n allowedTypes,\n chartType: controlledType,\n onChartTypeChange,\n allowSwitching = false,\n title,\n subtitle,\n height = 300,\n legend: showLegend = true,\n grid = true,\n className,\n}: ChartProps<T>) {\n const { features } = useReportMode();\n\n // Determine chart type\n const resolvedDefault = defaultType || getDefaultChartForIntent(intent);\n const [internalType, setInternalType] = useState<ChartTypeId>(resolvedDefault);\n const activeType = controlledType ?? internalType;\n\n // Determine allowed types for switching\n const resolvedAllowedTypes = useMemo(() => {\n if (allowedTypes) return allowedTypes;\n return getAllowedSwitchTargets(activeType);\n }, [allowedTypes, activeType]);\n\n // Validate data against contract\n const validation = useMemo<ChartValidationResult>(() => {\n return validateChartData(\n activeType,\n data,\n dimensions.map((d) => d.key),\n measures.map((m) => m.key),\n );\n }, [activeType, data, dimensions, measures]);\n\n // Handle type change\n const handleTypeChange = (newType: ChartTypeId) => {\n if (onChartTypeChange) {\n onChartTypeChange(newType);\n } else {\n setInternalType(newType);\n }\n };\n\n // Get chart metadata\n const chartMeta = CHART_REGISTRY[activeType];\n\n // Render appropriate chart\n const renderChart = () => {\n if (!validation.isValid) {\n return (\n <div className=\"ds-chart__invalid\">\n <DataStateIndicator\n state=\"INSUFFICIENT_SAMPLE\"\n variant=\"full\"\n details={{\n message: validation.errors[0],\n sampleSize: data.length,\n requiredSize: chartMeta?.contract.minDataPoints || 0,\n }}\n />\n </div>\n );\n }\n\n const xKey = dimensions[0]?.key || 'x';\n\n switch (activeType) {\n case 'line':\n case 'smooth_line':\n return renderLineChart(xKey, activeType === 'smooth_line');\n\n case 'area':\n case 'stacked_area':\n case 'area_100pct':\n return renderAreaChart(xKey, activeType);\n\n case 'bar':\n case 'stacked_bar':\n return renderBarChart(xKey, activeType, 'horizontal');\n\n case 'column':\n case 'stacked_column':\n case 'column_100pct':\n return renderBarChart(xKey, activeType, 'vertical');\n\n case 'pie':\n case 'donut':\n return renderPieChart(xKey, activeType === 'donut');\n\n case 'histogram':\n return renderHistogram();\n\n default:\n return (\n <div className=\"ds-chart__unsupported\">\n Chart type \"{activeType}\" is not yet implemented\n </div>\n );\n }\n };\n\n // Line Chart Renderer\n const renderLineChart = (xKey: string, smooth: boolean) => (\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsLine data={data} margin={{ top: 5, right: 20, left: 0, bottom: 5 }}>\n {grid && <CartesianGrid strokeDasharray=\"3 3\" vertical={false} />}\n <XAxis\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={{ strokeWidth: 1 }}\n />\n <YAxis tick={{ fontSize: 12 }} tickLine={false} axisLine={false} width={40} />\n <Tooltip\n contentStyle={{\n background: 'var(--glass-elevated)',\n border: '1px solid var(--glass-border)',\n }}\n />\n {showLegend && measures.length > 1 && <Legend />}\n {measures.map((measure, idx) => (\n <Line\n key={measure.key}\n type={smooth ? 'monotone' : 'linear'}\n dataKey={measure.key}\n name={measure.label || measure.key}\n stroke={getColor(idx, measure.color)}\n strokeWidth={2}\n dot={true}\n activeDot={{ r: 6 }}\n />\n ))}\n </RechartsLine>\n </ResponsiveContainer>\n );\n\n // Area Chart Renderer\n const renderAreaChart = (xKey: string, type: ChartTypeId) => {\n const isStacked = type === 'stacked_area' || type === 'area_100pct';\n const is100Pct = type === 'area_100pct';\n\n // For 100% stacked, normalize data\n const chartData = is100Pct ? normalizeData(data, measures) : data;\n\n return (\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsArea data={chartData} margin={{ top: 5, right: 20, left: 0, bottom: 5 }}>\n {grid && <CartesianGrid strokeDasharray=\"3 3\" vertical={false} />}\n <XAxis\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={{ strokeWidth: 1 }}\n />\n <YAxis\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={false}\n width={40}\n domain={is100Pct ? [0, 100] : undefined}\n tickFormatter={is100Pct ? (v) => `${v}%` : undefined}\n />\n <Tooltip\n contentStyle={{\n background: 'var(--glass-elevated)',\n border: '1px solid var(--glass-border)',\n }}\n />\n {showLegend && <Legend />}\n {measures.map((measure, idx) => (\n <Area\n key={measure.key}\n type=\"monotone\"\n dataKey={measure.key}\n name={measure.label || measure.key}\n stroke={getColor(idx, measure.color)}\n fill={getColor(idx, measure.color)}\n fillOpacity={0.3}\n stackId={isStacked ? 'stack' : undefined}\n />\n ))}\n </RechartsArea>\n </ResponsiveContainer>\n );\n };\n\n // Bar/Column Chart Renderer\n const renderBarChart = (xKey: string, type: ChartTypeId, layout: 'horizontal' | 'vertical') => {\n const isStacked = type.includes('stacked') || type.includes('100pct');\n const is100Pct = type.includes('100pct');\n const isHorizontal = layout === 'horizontal';\n\n const chartData = is100Pct ? normalizeData(data, measures) : data;\n\n return (\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsBar\n data={chartData}\n layout={isHorizontal ? 'vertical' : 'horizontal'}\n margin={{ top: 5, right: 20, left: isHorizontal ? 80 : 0, bottom: 5 }}\n >\n {grid && (\n <CartesianGrid\n strokeDasharray=\"3 3\"\n horizontal={!isHorizontal}\n vertical={isHorizontal}\n />\n )}\n {isHorizontal ? (\n <>\n <XAxis\n type=\"number\"\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={false}\n domain={is100Pct ? [0, 100] : undefined}\n tickFormatter={is100Pct ? (v) => `${v}%` : undefined}\n />\n <YAxis\n type=\"category\"\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={false}\n width={80}\n />\n </>\n ) : (\n <>\n <XAxis\n dataKey={xKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={{ strokeWidth: 1 }}\n />\n <YAxis\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={false}\n width={40}\n domain={is100Pct ? [0, 100] : undefined}\n tickFormatter={is100Pct ? (v) => `${v}%` : undefined}\n />\n </>\n )}\n <Tooltip\n contentStyle={{\n background: 'var(--glass-elevated)',\n border: '1px solid var(--glass-border)',\n }}\n />\n {showLegend && measures.length > 1 && <Legend />}\n {measures.map((measure, idx) => (\n <Bar\n key={measure.key}\n dataKey={measure.key}\n name={measure.label || measure.key}\n fill={getColor(idx, measure.color)}\n stackId={isStacked ? 'stack' : undefined}\n radius={isStacked ? undefined : [4, 4, 0, 0]}\n />\n ))}\n </RechartsBar>\n </ResponsiveContainer>\n );\n };\n\n // Pie/Donut Chart Renderer\n const renderPieChart = (nameKey: string, isDonut: boolean) => {\n const valueKey = measures[0]?.key || 'value';\n\n return (\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsPie>\n <Pie\n data={data}\n dataKey={valueKey}\n nameKey={nameKey}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={isDonut ? '50%' : 0}\n outerRadius=\"80%\"\n label={({ name, percent }) => `${name}: ${((percent ?? 0) * 100).toFixed(0)}%`}\n labelLine={false}\n >\n {data.map((_, idx) => (\n <Cell key={`cell-${idx}`} fill={getColor(idx)} />\n ))}\n </Pie>\n <Tooltip\n contentStyle={{\n background: 'var(--glass-elevated)',\n border: '1px solid var(--glass-border)',\n }}\n />\n {showLegend && <Legend />}\n </RechartsPie>\n </ResponsiveContainer>\n );\n };\n\n // Histogram Renderer\n const renderHistogram = () => {\n const valueKey = measures[0]?.key || 'value';\n const binKey = dimensions[0]?.key || 'bin';\n\n return (\n <ResponsiveContainer width=\"100%\" height={height}>\n <RechartsBar data={data} margin={{ top: 5, right: 20, left: 0, bottom: 5 }}>\n {grid && <CartesianGrid strokeDasharray=\"3 3\" vertical={false} />}\n <XAxis\n dataKey={binKey}\n tick={{ fontSize: 12 }}\n tickLine={false}\n axisLine={{ strokeWidth: 1 }}\n />\n <YAxis tick={{ fontSize: 12 }} tickLine={false} axisLine={false} width={40} />\n <Tooltip\n contentStyle={{\n background: 'var(--glass-elevated)',\n border: '1px solid var(--glass-border)',\n }}\n />\n <Bar dataKey={valueKey} fill={getColor(0)} radius={[4, 4, 0, 0]} />\n </RechartsBar>\n </ResponsiveContainer>\n );\n };\n\n // Normalize data for 100% stacked charts\n const normalizeData = (sourceData: T[], sourceMeasures: ChartMeasure[]): T[] => {\n return sourceData.map((row) => {\n const total = sourceMeasures.reduce((sum, m) => {\n const val = row[m.key];\n return sum + (typeof val === 'number' ? val : 0);\n }, 0);\n\n if (total === 0) return row;\n\n const normalized = { ...row } as T;\n sourceMeasures.forEach((m) => {\n const val = row[m.key];\n if (typeof val === 'number') {\n (normalized as Record<string, unknown>)[m.key] = (val / total) * 100;\n }\n });\n return normalized;\n });\n };\n\n return (\n <div className={clsx('ds-chart', className)}>\n {/* Header */}\n {(title || subtitle || allowSwitching) && (\n <header className=\"ds-chart__header\">\n <div className=\"ds-chart__header-text\">\n {title && <h4 className=\"ds-chart__title\">{title}</h4>}\n {subtitle && <p className=\"ds-chart__subtitle\">{subtitle}</p>}\n </div>\n <div className=\"ds-chart__header-actions\">\n {features.showMethodology && data.length > 0 && (\n <DataCoverageBadge\n sampleSize={data.length}\n requiredSize={chartMeta?.contract.minDataPoints || 0}\n size=\"sm\"\n />\n )}\n {allowSwitching && resolvedAllowedTypes.length > 0 && (\n <ChartSwitchControl\n currentType={activeType}\n allowedTypes={[activeType, ...resolvedAllowedTypes]}\n onTypeChange={handleTypeChange}\n />\n )}\n </div>\n </header>\n )}\n\n {/* Warnings */}\n {validation.warnings.length > 0 && (\n <div className=\"ds-chart__warnings\">\n {validation.warnings.map((warning, idx) => (\n <div key={idx} className=\"ds-chart__warning\">\n {warning}\n </div>\n ))}\n </div>\n )}\n\n {/* Chart */}\n <div className=\"ds-chart__body\" style={{ height }}>\n {renderChart()}\n </div>\n </div>\n );\n}\n\nChart.displayName = 'Chart';\n","import { useMemo } from 'react';\nimport {\n RadarChart,\n PolarGrid,\n PolarAngleAxis,\n PolarRadiusAxis,\n Radar,\n Legend,\n Tooltip,\n} from 'recharts';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport { DataCoverageBadge } from '../DataCoverageBadge';\nimport { DataStateIndicator } from '../DataStateIndicator';\nimport { ConfidenceIndicator } from '../ConfidenceIndicator';\nimport './MBTIRadar.css';\n\n/**\n * MBTI dimension scores representing preference strengths.\n * Values should be 0-100 where 50 is neutral.\n */\nexport interface MBTIDimensions {\n /** Extraversion (0) vs Introversion (100) */\n EI: number;\n /** Sensing (0) vs Intuition (100) */\n SN: number;\n /** Thinking (0) vs Feeling (100) */\n TF: number;\n /** Judging (0) vs Perceiving (100) */\n JP: number;\n}\n\nexport interface MBTIRadarProps {\n /** MBTI dimension scores */\n dimensions: MBTIDimensions;\n /** Sample size for confidence calculation */\n sampleSize: number;\n /** Optional comparison dimensions (e.g., benchmark) */\n comparison?: MBTIDimensions;\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Chart size */\n size?: number;\n /** Show dimension labels */\n showLabels?: boolean;\n /** Show values on hover */\n showValues?: boolean;\n /** Minimum sample size (default: 20) */\n minSampleSize?: number;\n /** Confidence score (0-100) */\n confidence?: number;\n /** Additional CSS class */\n className?: string;\n}\n\ninterface RadarDataPoint {\n dimension: string;\n fullName: string;\n value: number;\n comparison?: number;\n leftLabel: string;\n rightLabel: string;\n}\n\nconst DIMENSION_LABELS = {\n EI: { left: 'Extraversion', right: 'Introversion', full: 'E/I' },\n SN: { left: 'Sensing', right: 'Intuition', full: 'S/N' },\n TF: { left: 'Thinking', right: 'Feeling', full: 'T/F' },\n JP: { left: 'Judging', right: 'Perceiving', full: 'J/P' },\n} as const;\n\nconst CustomTooltip = ({ active, payload }: { active?: boolean; payload?: unknown[] }) => {\n if (!active || !payload?.length) return null;\n const data = (payload[0] as { payload: RadarDataPoint }).payload;\n return (\n <div className=\"ds-mbti-radar__tooltip\">\n <p className=\"ds-mbti-radar__tooltip-title\">{data.fullName}</p>\n <p className=\"ds-mbti-radar__tooltip-value\">\n {data.leftLabel}: {100 - data.value}%\n </p>\n <p className=\"ds-mbti-radar__tooltip-value\">\n {data.rightLabel}: {data.value}%\n </p>\n {data.comparison !== undefined && (\n <p className=\"ds-mbti-radar__tooltip-comparison\">Benchmark: {data.comparison}%</p>\n )}\n </div>\n );\n};\n\n/**\n * MBTIRadar visualizes personality dimension scores as a radar chart.\n * Requires minimum 20 samples for meaningful visualization.\n *\n * Each dimension is scored 0-100:\n * - EI: 0 = Extraversion, 100 = Introversion\n * - SN: 0 = Sensing, 100 = Intuition\n * - TF: 0 = Thinking, 100 = Feeling\n * - JP: 0 = Judging, 100 = Perceiving\n */\nexport function MBTIRadar({\n dimensions,\n sampleSize,\n comparison,\n title,\n subtitle,\n size = 300,\n showLabels = true,\n showValues = true,\n minSampleSize = 20,\n confidence,\n className,\n}: MBTIRadarProps) {\n const { features } = useReportMode();\n const isValid = sampleSize >= minSampleSize;\n\n const radarData = useMemo<RadarDataPoint[]>(() => {\n return (Object.keys(dimensions) as Array<keyof MBTIDimensions>).map((key) => ({\n dimension: DIMENSION_LABELS[key].full,\n fullName: `${DIMENSION_LABELS[key].left} vs ${DIMENSION_LABELS[key].right}`,\n value: dimensions[key],\n comparison: comparison?.[key],\n leftLabel: DIMENSION_LABELS[key].left,\n rightLabel: DIMENSION_LABELS[key].right,\n }));\n }, [dimensions, comparison]);\n\n // Calculate derived MBTI type from dimensions\n const derivedType = useMemo(() => {\n const e = dimensions.EI < 50 ? 'E' : 'I';\n const s = dimensions.SN < 50 ? 'S' : 'N';\n const t = dimensions.TF < 50 ? 'T' : 'F';\n const j = dimensions.JP < 50 ? 'J' : 'P';\n return `${e}${s}${t}${j}`;\n }, [dimensions]);\n\n if (!isValid) {\n return (\n <div className={clsx('ds-mbti-radar', 'ds-mbti-radar--invalid', className)}>\n {title && <h4 className=\"ds-mbti-radar__title\">{title}</h4>}\n <div className=\"ds-mbti-radar__empty\">\n <DataStateIndicator\n state=\"INSUFFICIENT_SAMPLE\"\n variant=\"full\"\n details={{\n message: 'MBTI analysis requires sufficient sample size',\n sampleSize,\n requiredSize: minSampleSize,\n }}\n />\n </div>\n </div>\n );\n }\n\n // Add this to disable recharts animations in test environments\n // to prevent infinite render loops in storybook-a11y runner\n const isTesting =\n typeof process !== 'undefined' &&\n (process.env.NODE_ENV === 'test' || process.env.STORYBOOK_A11Y === 'true');\n\n return (\n <div className={clsx('ds-mbti-radar', className)}>\n {(title || subtitle) && (\n <header className=\"ds-mbti-radar__header\">\n <div className=\"ds-mbti-radar__header-text\">\n {title && <h4 className=\"ds-mbti-radar__title\">{title}</h4>}\n {subtitle && <p className=\"ds-mbti-radar__subtitle\">{subtitle}</p>}\n </div>\n <div className=\"ds-mbti-radar__header-badges\">\n {features.showConfidenceScores && confidence !== undefined && (\n <ConfidenceIndicator score={confidence} size=\"sm\" />\n )}\n {features.showMethodology && (\n <DataCoverageBadge sampleSize={sampleSize} requiredSize={minSampleSize} size=\"sm\" />\n )}\n </div>\n </header>\n )}\n\n <div className=\"ds-mbti-radar__type-badge\">\n <span className=\"ds-mbti-radar__type-label\">Derived Type</span>\n <span className=\"ds-mbti-radar__type-value\">{derivedType}</span>\n </div>\n\n <div className=\"ds-mbti-radar__chart\" style={{ width: size, height: size }}>\n <RadarChart cx=\"50%\" cy=\"50%\" outerRadius=\"70%\" width={size} height={size} data={radarData}>\n <PolarGrid stroke=\"var(--glass-border)\" />\n <PolarAngleAxis\n dataKey=\"dimension\"\n tick={{ fill: 'var(--text-secondary)', fontSize: 12 }}\n />\n <PolarRadiusAxis\n angle={45}\n domain={[0, 100]}\n tick={{ fill: 'var(--text-tertiary)', fontSize: 10 }}\n tickCount={5}\n />\n <Radar\n name=\"Profile\"\n dataKey=\"value\"\n stroke=\"var(--brand-pink)\"\n fill=\"var(--brand-pink)\"\n fillOpacity={0.3}\n strokeWidth={2}\n isAnimationActive={!isTesting}\n />\n {comparison && (\n <Radar\n name=\"Benchmark\"\n dataKey=\"comparison\"\n stroke=\"var(--brand-yellow)\"\n fill=\"var(--brand-yellow)\"\n fillOpacity={0.1}\n strokeWidth={2}\n strokeDasharray=\"5 5\"\n isAnimationActive={!isTesting}\n />\n )}\n {showValues && <Tooltip content={<CustomTooltip />} />}\n {comparison && <Legend />}\n </RadarChart>\n </div>\n\n {showLabels && (\n <div className=\"ds-mbti-radar__dimensions\">\n {radarData.map((d) => (\n <div key={d.dimension} className=\"ds-mbti-radar__dimension\">\n <span className=\"ds-mbti-radar__dimension-left\">{d.leftLabel}</span>\n <div className=\"ds-mbti-radar__dimension-bar\">\n <div className=\"ds-mbti-radar__dimension-fill\" style={{ width: `${d.value}%` }} />\n <div className=\"ds-mbti-radar__dimension-marker\" style={{ left: `${d.value}%` }} />\n </div>\n <span className=\"ds-mbti-radar__dimension-right\">{d.rightLabel}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\nMBTIRadar.displayName = 'MBTIRadar';\n","import { useMemo } from 'react';\nimport clsx from 'clsx';\nimport type { MBTIType } from '../../report-engine/types';\nimport { useReportMode } from '../../report-engine';\nimport { DataCoverageBadge } from '../DataCoverageBadge';\nimport { DataStateIndicator } from '../DataStateIndicator';\nimport { ConfidenceIndicator } from '../ConfidenceIndicator';\nimport { Tooltip } from '../Tooltip/Tooltip';\nimport './MBTITypeGrid.css';\n\nexport interface MBTITypeCount {\n /** MBTI type */\n type: MBTIType;\n /** Count of individuals with this type */\n count: number;\n /** Optional response rate for this type */\n responseRate?: number;\n}\n\nexport interface MBTITypeGridProps {\n /** Distribution of MBTI types */\n data: MBTITypeCount[];\n /** Total sample size (sum of all counts) */\n sampleSize?: number;\n /** Chart title */\n title?: string;\n /** Chart subtitle */\n subtitle?: string;\n /** Show percentage labels */\n showPercentages?: boolean;\n /** Show count labels */\n showCounts?: boolean;\n /** Highlight types above this threshold (percentage) */\n highlightThreshold?: number;\n /** Minimum sample size (default: 50) */\n minSampleSize?: number;\n /** Confidence score (0-100) */\n confidence?: number;\n /** Click handler for type selection */\n onTypeClick?: (type: MBTIType) => void;\n /** Currently selected type */\n selectedType?: MBTIType;\n /** Additional CSS class */\n className?: string;\n}\n\n// MBTI type organized in the standard 4x4 grid\nconst MBTI_GRID: MBTIType[][] = [\n ['ISTJ', 'ISFJ', 'INFJ', 'INTJ'],\n ['ISTP', 'ISFP', 'INFP', 'INTP'],\n ['ESTP', 'ESFP', 'ENFP', 'ENTP'],\n ['ESTJ', 'ESFJ', 'ENFJ', 'ENTJ'],\n];\n\n// Type descriptions for tooltips\nconst TYPE_DESCRIPTIONS: Record<MBTIType, string> = {\n ISTJ: 'The Inspector - Practical, reliable, systematic',\n ISFJ: 'The Protector - Caring, supportive, traditional',\n INFJ: 'The Advocate - Insightful, principled, compassionate',\n INTJ: 'The Architect - Strategic, independent, determined',\n ISTP: 'The Virtuoso - Observant, practical, analytical',\n ISFP: 'The Adventurer - Artistic, sensitive, exploratory',\n INFP: 'The Mediator - Idealistic, empathetic, creative',\n INTP: 'The Logician - Inventive, logical, objective',\n ESTP: 'The Entrepreneur - Energetic, pragmatic, observant',\n ESFP: 'The Entertainer - Spontaneous, energetic, friendly',\n ENFP: 'The Campaigner - Enthusiastic, creative, sociable',\n ENTP: 'The Debater - Clever, curious, innovative',\n ESTJ: 'The Executive - Organized, logical, assertive',\n ESFJ: 'The Consul - Caring, sociable, traditional',\n ENFJ: 'The Protagonist - Charismatic, empathetic, organized',\n ENTJ: 'The Commander - Strategic, efficient, energetic',\n};\n\n// Column header labels\nconst COLUMN_LABELS = ['ST', 'SF', 'NF', 'NT'];\nconst ROW_LABELS = ['I-J', 'I-P', 'E-P', 'E-J'];\n\n/**\n * MBTITypeGrid displays the distribution of all 16 MBTI types in a 4x4 grid.\n * Requires minimum 50 samples for meaningful visualization.\n */\nexport function MBTITypeGrid({\n data,\n sampleSize: propSampleSize,\n title,\n subtitle,\n showPercentages = true,\n showCounts = true,\n highlightThreshold,\n minSampleSize = 50,\n confidence,\n onTypeClick,\n selectedType,\n className,\n}: MBTITypeGridProps) {\n const { features } = useReportMode();\n\n // Create a map of type to data\n const typeMap = useMemo(() => {\n const map = new Map<MBTIType, MBTITypeCount>();\n for (const item of data) {\n map.set(item.type, item);\n }\n return map;\n }, [data]);\n\n // Calculate total sample size\n const totalSampleSize = propSampleSize ?? data.reduce((sum, d) => sum + d.count, 0);\n const isValid = totalSampleSize >= minSampleSize;\n\n // Find max count for scaling\n const maxCount = useMemo(() => Math.max(...data.map((d) => d.count), 1), [data]);\n\n // Calculate percentages\n const getPercentage = (count: number) => {\n return totalSampleSize > 0 ? ((count / totalSampleSize) * 100).toFixed(1) : '0.0';\n };\n\n // Get cell intensity for heatmap effect\n const getIntensity = (count: number) => {\n if (maxCount === 0) return 0;\n return (count / maxCount) * 100;\n };\n\n // Check if type should be highlighted\n const isHighlighted = (type: MBTIType) => {\n if (!highlightThreshold) return false;\n const item = typeMap.get(type);\n if (!item) return false;\n const percentage = (item.count / totalSampleSize) * 100;\n return percentage >= highlightThreshold;\n };\n\n if (!isValid) {\n return (\n <div className={clsx('ds-mbti-type-grid', 'ds-mbti-type-grid--invalid', className)}>\n {title && <h4 className=\"ds-mbti-type-grid__title\">{title}</h4>}\n <div className=\"ds-mbti-type-grid__empty\">\n <DataStateIndicator\n state=\"INSUFFICIENT_SAMPLE\"\n variant=\"full\"\n details={{\n message: 'MBTI distribution analysis requires sufficient sample size',\n sampleSize: totalSampleSize,\n requiredSize: minSampleSize,\n }}\n />\n </div>\n </div>\n );\n }\n\n return (\n <div className={clsx('ds-mbti-type-grid', className)}>\n {(title || subtitle) && (\n <header className=\"ds-mbti-type-grid__header\">\n <div className=\"ds-mbti-type-grid__header-text\">\n {title && <h4 className=\"ds-mbti-type-grid__title\">{title}</h4>}\n {subtitle && <p className=\"ds-mbti-type-grid__subtitle\">{subtitle}</p>}\n </div>\n <div className=\"ds-mbti-type-grid__header-badges\">\n {features.showConfidenceScores && confidence !== undefined && (\n <ConfidenceIndicator score={confidence} size=\"sm\" />\n )}\n {features.showMethodology && (\n <DataCoverageBadge\n sampleSize={totalSampleSize}\n requiredSize={minSampleSize}\n size=\"sm\"\n />\n )}\n </div>\n </header>\n )}\n\n <div className=\"ds-mbti-type-grid__container\">\n {/* Column Headers */}\n <div className=\"ds-mbti-type-grid__column-headers\">\n <div className=\"ds-mbti-type-grid__corner\" />\n {COLUMN_LABELS.map((label) => (\n <div key={label} className=\"ds-mbti-type-grid__column-header\">\n {label}\n </div>\n ))}\n </div>\n\n {/* Grid Rows */}\n {MBTI_GRID.map((row, rowIndex) => (\n <div key={rowIndex} className=\"ds-mbti-type-grid__row\">\n <div className=\"ds-mbti-type-grid__row-header\">{ROW_LABELS[rowIndex]}</div>\n {row.map((type) => {\n const typeData = typeMap.get(type);\n const count = typeData?.count ?? 0;\n const percentage = getPercentage(count);\n const intensity = getIntensity(count);\n const highlighted = isHighlighted(type);\n const selected = selectedType === type;\n\n return (\n <Tooltip\n key={type}\n content={\n <div className=\"ds-mbti-type-grid__tooltip-content\">\n <strong>{type}</strong>\n <p>{TYPE_DESCRIPTIONS[type]}</p>\n <p>Count: {count.toLocaleString()}</p>\n <p>Percentage: {percentage}%</p>\n {typeData?.responseRate !== undefined && (\n <p>Response Rate: {typeData.responseRate.toFixed(1)}%</p>\n )}\n </div>\n }\n >\n <button\n type=\"button\"\n className={clsx(\n 'ds-mbti-type-grid__cell',\n highlighted && 'ds-mbti-type-grid__cell--highlighted',\n selected && 'ds-mbti-type-grid__cell--selected',\n onTypeClick && 'ds-mbti-type-grid__cell--clickable',\n )}\n onClick={() => onTypeClick?.(type)}\n disabled={!onTypeClick}\n style={\n {\n '--cell-intensity': `${intensity}%`,\n } as React.CSSProperties\n }\n >\n <span className=\"ds-mbti-type-grid__cell-type\">{type}</span>\n {showCounts && (\n <span className=\"ds-mbti-type-grid__cell-count\">\n {count.toLocaleString()}\n </span>\n )}\n {showPercentages && (\n <span className=\"ds-mbti-type-grid__cell-percentage\">{percentage}%</span>\n )}\n </button>\n </Tooltip>\n );\n })}\n </div>\n ))}\n </div>\n\n {/* Legend */}\n <div className=\"ds-mbti-type-grid__legend\">\n <div className=\"ds-mbti-type-grid__legend-item\">\n <span className=\"ds-mbti-type-grid__legend-bar ds-mbti-type-grid__legend-bar--gradient\" />\n <span className=\"ds-mbti-type-grid__legend-label\">Distribution density</span>\n </div>\n {highlightThreshold && (\n <div className=\"ds-mbti-type-grid__legend-item\">\n <span className=\"ds-mbti-type-grid__legend-bar ds-mbti-type-grid__legend-bar--highlight\" />\n <span className=\"ds-mbti-type-grid__legend-label\">\n {'>='}\n {highlightThreshold}% of sample\n </span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nMBTITypeGrid.displayName = 'MBTITypeGrid';\n"]}
@@ -66,4 +66,4 @@ SectionShell.displayName = "SectionShell";
66
66
  exports.SectionHeader = SectionHeader;
67
67
  exports.SectionShell = SectionShell;
68
68
  //# sourceMappingURL=out.js.map
69
- //# sourceMappingURL=chunk-IYPXJ6YC.cjs.map
69
+ //# sourceMappingURL=chunk-EM7JHRYW.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SectionShell/SectionShell.tsx"],"names":[],"mappings":";;;;;AAAA,SAAgB,kBAAkC;AAClD,OAAO,UAAU;AAoBX,SAKc,KALd;AALC,IAAM,gBAAgB;AAAA,EAC3B,CAAC,EAAE,OAAO,UAAU,SAAS,QAAQ,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC5E,QAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAS,QAAO;AAE5C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,KAAK,qBAAqB,sBAAsB,KAAK,IAAI,SAAS;AAAA,QAC5E,GAAG;AAAA,QAEH;AAAA,qBAAW,oBAAC,UAAK,WAAU,8BAA8B,mBAAQ;AAAA,UACjE,SAAS,oBAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,UACzD,YAAY,oBAAC,OAAE,WAAU,+BAA+B,oBAAS;AAAA;AAAA;AAAA,IACpE;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAarB,IAAM,eAAe;AAAA,EAC1B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,kBAAkB,UAAU;AAAA,UAC5B,uBAAuB,OAAO;AAAA,UAC9B;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,kBAAkB,UAAU,SAAU;AAAA,YAC5C,OAAO,kBAAkB,kBAAkB;AAAA,YAE1C;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,aAAa,cAAc","sourcesContent":["import React, { forwardRef, HTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './SectionShell.css';\n\n/* ============================================================================\n Section Header Component\n ============================================================================ */\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n eyebrow?: React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n ({ title, subtitle, eyebrow, align = 'center', className, ...props }, ref) => {\n if (!title && !subtitle && !eyebrow) return null;\n\n return (\n <header\n ref={ref}\n className={clsx('ds-section-header', `ds-section-header--${align}`, className)}\n {...props}\n >\n {eyebrow && <span className=\"ds-section-header__eyebrow\">{eyebrow}</span>}\n {title && <h2 className=\"ds-section-header__title\">{title}</h2>}\n {subtitle && <p className=\"ds-section-header__subtitle\">{subtitle}</p>}\n </header>\n );\n },\n);\nSectionHeader.displayName = 'SectionHeader';\n\n/* ============================================================================\n Section Shell Component\n ============================================================================ */\n\nexport interface SectionShellProps extends HTMLAttributes<HTMLDivElement> {\n background?: 'default' | 'muted' | 'brand' | 'transparent';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n containerSize?: 'sm' | 'md' | 'lg' | 'xl' | 'fluid'; // Maps to Container max-width\n containerFluid?: boolean;\n}\n\nexport const SectionShell = forwardRef<HTMLDivElement, SectionShellProps>(\n (\n {\n className,\n children,\n background = 'default',\n padding = 'md',\n containerSize,\n containerFluid = false,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={clsx(\n 'ds-section',\n `ds-section--bg-${background}`,\n `ds-section--padding-${padding}`,\n className,\n )}\n {...props}\n >\n <Container\n size={containerSize === 'fluid' ? 'full' : (containerSize as 'sm' | 'md' | 'lg' | 'xl' | undefined)}\n fluid={containerFluid || containerSize === 'fluid'}\n >\n {children}\n </Container>\n </section>\n );\n },\n);\nSectionShell.displayName = 'SectionShell';\n"]}
1
+ {"version":3,"sources":["../src/components/SectionShell/SectionShell.tsx"],"names":[],"mappings":";;;;;AAAA,SAAgB,kBAAkC;AAClD,OAAO,UAAU;AAoBX,SAKc,KALd;AALC,IAAM,gBAAgB;AAAA,EAC3B,CAAC,EAAE,OAAO,UAAU,SAAS,QAAQ,UAAU,WAAW,GAAG,MAAM,GAAG,QAAQ;AAC5E,QAAI,CAAC,SAAS,CAAC,YAAY,CAAC,QAAS,QAAO;AAE5C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW,KAAK,qBAAqB,sBAAsB,KAAK,IAAI,SAAS;AAAA,QAC5E,GAAG;AAAA,QAEH;AAAA,qBAAW,oBAAC,UAAK,WAAU,8BAA8B,mBAAQ;AAAA,UACjE,SAAS,oBAAC,QAAG,WAAU,4BAA4B,iBAAM;AAAA,UACzD,YAAY,oBAAC,OAAE,WAAU,+BAA+B,oBAAS;AAAA;AAAA;AAAA,IACpE;AAAA,EAEJ;AACF;AACA,cAAc,cAAc;AAcrB,IAAM,eAAe;AAAA,EAC1B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,IACV;AAAA,IACA,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACL,GACA,QACG;AACH,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,UACT;AAAA,UACA,kBAAkB,UAAU;AAAA,UAC5B,uBAAuB,OAAO;AAAA,UAC9B;AAAA,QACF;AAAA,QACC,GAAG;AAAA,QAEJ;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,kBAAkB,UAAU,SAAU;AAAA,YAC5C,OAAO,kBAAkB,kBAAkB;AAAA,YAE1C;AAAA;AAAA,QACH;AAAA;AAAA,IACF;AAAA,EAEJ;AACF;AACA,aAAa,cAAc","sourcesContent":["import React, { forwardRef, HTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './SectionShell.css';\n\n/* ============================================================================\n Section Header Component\n ============================================================================ */\n\nexport interface SectionHeaderProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {\n title?: React.ReactNode;\n subtitle?: React.ReactNode;\n eyebrow?: React.ReactNode;\n align?: 'left' | 'center' | 'right';\n}\n\nexport const SectionHeader = forwardRef<HTMLDivElement, SectionHeaderProps>(\n ({ title, subtitle, eyebrow, align = 'center', className, ...props }, ref) => {\n if (!title && !subtitle && !eyebrow) return null;\n\n return (\n <header\n ref={ref}\n className={clsx('ds-section-header', `ds-section-header--${align}`, className)}\n {...props}\n >\n {eyebrow && <span className=\"ds-section-header__eyebrow\">{eyebrow}</span>}\n {title && <h2 className=\"ds-section-header__title\">{title}</h2>}\n {subtitle && <p className=\"ds-section-header__subtitle\">{subtitle}</p>}\n </header>\n );\n },\n);\nSectionHeader.displayName = 'SectionHeader';\n\n/* ============================================================================\n Section Shell Component\n ============================================================================ */\n\nexport interface SectionShellProps extends HTMLAttributes<HTMLDivElement> {\n children?: React.ReactNode;\n background?: 'default' | 'muted' | 'brand' | 'transparent';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n containerSize?: 'sm' | 'md' | 'lg' | 'xl' | 'fluid'; // Maps to Container max-width\n containerFluid?: boolean;\n}\n\nexport const SectionShell = forwardRef<HTMLDivElement, SectionShellProps>(\n (\n {\n className,\n children,\n background = 'default',\n padding = 'md',\n containerSize,\n containerFluid = false,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={clsx(\n 'ds-section',\n `ds-section--bg-${background}`,\n `ds-section--padding-${padding}`,\n className,\n )}\n {...props}\n >\n <Container\n size={containerSize === 'fluid' ? 'full' : (containerSize as 'sm' | 'md' | 'lg' | 'xl' | undefined)}\n fluid={containerFluid || containerSize === 'fluid'}\n >\n {children}\n </Container>\n </section>\n );\n },\n);\nSectionShell.displayName = 'SectionShell';\n"]}
@@ -576,18 +576,18 @@ var NavbarV2TabMenu = forwardRef(
576
576
  ]
577
577
  }
578
578
  ),
579
- /* @__PURE__ */ jsx(
579
+ isOpen ? /* @__PURE__ */ jsx(
580
580
  "div",
581
581
  {
582
582
  ref: panelRefCallback,
583
583
  id: panelId,
584
584
  className: "ds-navbar-v2__mega-panel",
585
- "data-state": isOpen ? "open" : "closed",
585
+ "data-state": "open",
586
586
  role: "region",
587
587
  "aria-label": `${label} menu`,
588
588
  children
589
589
  }
590
- )
590
+ ) : null
591
591
  ]
592
592
  }
593
593
  );
@@ -1019,4 +1019,4 @@ var MDXOutboundLink = ({
1019
1019
 
1020
1020
  export { LocaleDropdown, MDXOutboundLink, NavbarMegaMenu, NavbarMegaMenuItem, NavbarMegaMenuSection, NavbarMobileActions, NavbarMobileNavItem, NavbarMobileSeparator, NavbarV2, NavbarV2Actions, NavbarV2Brand, NavbarV2Tab, NavbarV2TabMenu, NavbarV2Tabs, SiteFooter };
1021
1021
  //# sourceMappingURL=out.js.map
1022
- //# sourceMappingURL=chunk-REQ5Q6ZI.js.map
1022
+ //# sourceMappingURL=chunk-JNASH4OQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Navbar/NavbarMobileHelpers.tsx","../src/components/Navbar/NavbarMegaMenu.tsx","../src/components/NavbarV2/NavbarV2.tsx","../src/components/SiteFooter/SiteFooter.tsx","../src/components/LocaleDropdown/LocaleDropdown.tsx","../src/components/OutboundLink/MDXOutboundLink.tsx"],"names":["forwardRef","clsx","jsx","useState","useRef","useEffect","useCallback","jsxs","ChevronDown","focusable","useId"],"mappings":"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","sourcesContent":["import React, { forwardRef, HTMLAttributes } from 'react';\nimport clsx from 'clsx';\nimport './Navbar.css';\n\n/* ============================================================================\n Mobile Menu Helpers — shared by NavbarV2 consumers\n ============================================================================\n These lightweight presentational components are used inside mobile menu\n overlays. They were originally part of Navbar V1 but are framework-agnostic\n and continue to be consumed by NavbarV2-based layouts.\n ============================================================================ */\n\nexport interface NavbarMobileNavItemProps extends HTMLAttributes<HTMLElement> {\n as?: React.ElementType;\n active?: boolean;\n href?: string;\n}\n\n/** Full-width touch-friendly nav item for the mobile menu. */\nexport const NavbarMobileNavItem = forwardRef<HTMLElement, NavbarMobileNavItemProps>(\n ({ as: Component = 'a', className, active, children, ...props }, ref) => (\n <Component\n ref={ref}\n className={clsx(\n 'ds-navbar__mobile-nav-item',\n active && 'ds-navbar__mobile-nav-item--active',\n className,\n )}\n aria-current={active ? 'page' : undefined}\n {...props}\n >\n {children}\n </Component>\n ),\n);\nNavbarMobileNavItem.displayName = 'NavbarMobileNavItem';\n\n/** Visual separator line inside the mobile menu. */\nexport function NavbarMobileSeparator({ className }: { className?: string }) {\n return <div className={clsx('ds-navbar__mobile-separator', className)} role=\"separator\" />;\n}\nNavbarMobileSeparator.displayName = 'NavbarMobileSeparator';\n\n/** Actions group at the bottom of the mobile menu (CTAs, auth). */\nexport const NavbarMobileActions = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={clsx('ds-navbar__mobile-actions', className)} {...props}>\n {children}\n </div>\n ),\n);\nNavbarMobileActions.displayName = 'NavbarMobileActions';\n","import React, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './NavbarMegaMenu.css';\n\n/* ============================================================================\n Icons\n ============================================================================ */\n\nconst ChevronDown = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ============================================================================\n NavbarMegaMenu\n ============================================================================ */\n\nexport interface NavbarMegaMenuProps {\n /** The text or element that toggles the menu */\n trigger: React.ReactNode;\n /** The content to display inside the mega menu */\n children: React.ReactNode;\n /** Optional class name */\n className?: string;\n /** Whether the menu is controlled */\n isOpen?: boolean;\n /** Change handler for controlled state */\n onOpenChange?: (isOpen: boolean) => void;\n /** Presentation style of the menu */\n variant?: 'fullWidth' | 'floating';\n}\n\nexport const NavbarMegaMenu = forwardRef<HTMLDivElement, NavbarMegaMenuProps>(\n (\n { trigger, children, className, isOpen: controlledOpen, onOpenChange, variant = 'fullWidth' },\n ref,\n ) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : internalOpen;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const timeoutRef = useRef<number | null>(null);\n\n const handleOpen = useCallback(() => {\n const newState = true;\n if (isOpen !== newState) {\n if (!isControlled) setInternalOpen(newState);\n onOpenChange?.(newState);\n }\n }, [isOpen, isControlled, onOpenChange]);\n\n const handleClose = useCallback(() => {\n const newState = false;\n if (isOpen !== newState) {\n if (!isControlled) setInternalOpen(newState);\n onOpenChange?.(newState);\n }\n }, [isOpen, isControlled, onOpenChange]);\n\n const handleToggle = useCallback(() => {\n if (isOpen) {\n handleClose();\n } else {\n handleOpen();\n }\n }, [isOpen, handleClose, handleOpen]);\n\n const handleMouseEnter = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n handleOpen();\n }, [handleOpen]);\n\n const handleMouseLeave = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n }\n timeoutRef.current = window.setTimeout(() => {\n handleClose();\n }, 150);\n }, [handleClose]);\n\n useEffect(() => {\n return () => {\n if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n };\n }, []);\n\n // Close on click outside\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, handleClose]);\n\n // Close on Escape key\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') handleClose();\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, handleClose]);\n\n return (\n <div\n className={clsx('ds-navbar-mega-menu', `ds-navbar-mega-menu--${variant}`, className)}\n ref={ref}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <button\n ref={triggerRef}\n className=\"ds-navbar-mega-menu__trigger\"\n onClick={handleToggle}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n >\n {trigger}\n <span\n className=\"ds-navbar-mega-menu__chevron\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n <ChevronDown />\n </span>\n </button>\n\n {/* Content panel — always mounted, CSS transitions handle show/hide */}\n <div ref={containerRef}>\n <div\n className={clsx(\n 'ds-navbar-mega-menu__content',\n `ds-navbar-mega-menu__content--${variant}`,\n )}\n data-state={isOpen ? 'open' : 'closed'}\n >\n {variant === 'fullWidth' ? <Container>{children}</Container> : children}\n </div>\n </div>\n </div>\n );\n },\n);\n\nNavbarMegaMenu.displayName = 'NavbarMegaMenu';\n\n/* ============================================================================\n NavbarMegaMenuSection — Column with heading\n ============================================================================ */\n\nexport interface NavbarMegaMenuSectionProps {\n /** Section heading */\n heading?: string;\n /** Section children (NavbarMegaMenuItems) */\n children: React.ReactNode;\n /** Optional class name */\n className?: string;\n}\n\nexport function NavbarMegaMenuSection({ heading, children, className }: NavbarMegaMenuSectionProps) {\n return (\n <div className={clsx('ds-navbar-mega-menu__section', className)}>\n {heading && <p className=\"ds-navbar-mega-menu__section-heading\">{heading}</p>}\n <div className=\"ds-navbar-mega-menu__section-items\">{children}</div>\n </div>\n );\n}\n\nNavbarMegaMenuSection.displayName = 'NavbarMegaMenuSection';\n\n/* ============================================================================\n NavbarMegaMenuItem — Link with icon, label, description\n ============================================================================ */\n\nexport interface NavbarMegaMenuItemProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n /** Icon element (e.g. lucide-react icon) */\n icon?: React.ReactNode;\n /** Item label */\n label: string;\n /** Optional description */\n description?: string;\n /** Render as custom element (for Next.js Link) */\n as?: React.ElementType;\n}\n\nexport const NavbarMegaMenuItem = forwardRef<HTMLAnchorElement, NavbarMegaMenuItemProps>(\n ({ icon, label, description, className, as: Comp = 'a', ...rest }, ref) => {\n return (\n <div className=\"ds-navbar-mega-menu__item-wrapper\">\n <Comp\n ref={ref}\n className={clsx('ds-navbar-mega-menu__item', className)}\n {...rest}\n >\n {icon && <span className=\"ds-navbar-mega-menu__item-icon\">{icon}</span>}\n <span className=\"ds-navbar-mega-menu__item-text\">\n <span className=\"ds-navbar-mega-menu__item-label\">{label}</span>\n {description && (\n <span className=\"ds-navbar-mega-menu__item-description\">{description}</span>\n )}\n </span>\n </Comp>\n </div>\n );\n },\n);\n\nNavbarMegaMenuItem.displayName = 'NavbarMegaMenuItem';\n","import React, {\n forwardRef,\n useState,\n useRef,\n useEffect,\n useCallback,\n useContext,\n createContext,\n useMemo,\n useId,\n} from 'react';\nimport clsx from 'clsx';\nimport './NavbarV2.css';\n\n/* ============================================================================\n Icons\n ============================================================================ */\n\nconst ChevronDown = () => (\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 16 16\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M4 6L8 10L12 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/* ============================================================================\n Scroll State Context — lets children (e.g. NavbarV2Tabs) know when\n the outer container has activated its glass surface, so they can\n demote their own glass to avoid glass-on-glass visual noise.\n ============================================================================ */\n\ninterface ScrollContextValue {\n /** Whether the navbar container is in the scrolled (glass) state. */\n scrolled: boolean;\n}\n\nconst ScrollContext = createContext<ScrollContextValue>({ scrolled: false });\n\n/* ============================================================================\n Mutual Exclusion Context — only one mega menu open at a time\n ============================================================================ */\n\ninterface TabsContextValue {\n /** ID of the currently open menu (null = all closed). */\n activeMenuId: string | null;\n /** Request to open a menu. Closes any other open menu. */\n openMenu: (id: string) => void;\n /** Request to close a specific menu. */\n closeMenu: (id: string) => void;\n}\n\nconst TabsContext = createContext<TabsContextValue>({\n activeMenuId: null,\n openMenu: () => {},\n closeMenu: () => {},\n});\n\n/* ============================================================================\n Focus Trap Hook — traps Tab/Shift+Tab inside a container\n ============================================================================ */\n\nfunction useFocusTrap(containerRef: React.RefObject<HTMLElement | null>, active: boolean) {\n useEffect(() => {\n if (!active || !containerRef.current) return;\n\n const container = containerRef.current;\n const FOCUSABLE =\n 'a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Tab') return;\n\n const focusable = Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE));\n if (focusable.length === 0) {\n e.preventDefault();\n return;\n }\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first) {\n e.preventDefault();\n last.focus();\n }\n } else {\n if (document.activeElement === last) {\n e.preventDefault();\n first.focus();\n }\n }\n };\n\n // Focus first element on trap activation\n const focusable = container.querySelectorAll<HTMLElement>(FOCUSABLE);\n if (focusable.length > 0) {\n focusable[0].focus();\n }\n\n container.addEventListener('keydown', handleKeyDown);\n return () => container.removeEventListener('keydown', handleKeyDown);\n }, [active, containerRef]);\n}\n\n/* ============================================================================\n NavbarV2 — Floating Glass Pill Tab Navigation\n ============================================================================\n A centered floating glass pill with vertical icon+label tabs,\n flanked by brand (left) and actions (right).\n\n On scroll, an outer container activates a subtle glass surface with\n border, wrapping all content (brand + tabs + actions). The inner\n tabs pill demotes its own glass to avoid double-glass visual noise.\n\n Composition:\n <NavbarV2>\n <NavbarV2Brand />\n <NavbarV2Tabs>\n <NavbarV2Tab /> // simple link/button\n <NavbarV2TabMenu /> // tab with mega menu dropdown\n </NavbarV2Tabs>\n <NavbarV2Actions />\n </NavbarV2>\n ============================================================================ */\n\nexport interface NavbarV2Props extends React.HTMLAttributes<HTMLElement> {\n /** Content rendered inside the mobile menu overlay when open. */\n mobileContent?: React.ReactNode;\n /** Accessible labels for mobile toggle. Override for i18n. */\n mobileToggleLabels?: { open: string; close: string };\n /** Controlled mobile menu open state. */\n isMenuOpen?: boolean;\n /** Callback when mobile menu open state changes. */\n onMenuOpenChange?: (isOpen: boolean) => void;\n /** Enable scroll-aware glass container with border. @default true */\n scrollBorder?: boolean;\n /** Scroll distance (px) before glass activates. @default 32 */\n scrollThreshold?: number;\n}\n\n/** Hysteresis lower-bound ratio — glass disappears when scroll drops below threshold × this */\nconst HYSTERESIS_RATIO = 0.25;\n\nexport const NavbarV2 = forwardRef<HTMLElement, NavbarV2Props>(\n (\n {\n className,\n mobileContent,\n mobileToggleLabels,\n isMenuOpen,\n onMenuOpenChange,\n scrollBorder = true,\n scrollThreshold = 32,\n children,\n ...props\n },\n ref,\n ) => {\n const [internalMenuOpen, setInternalMenuOpen] = useState(false);\n const isMobileMenuOpen = isMenuOpen !== undefined ? isMenuOpen : internalMenuOpen;\n\n const navRef = useRef<HTMLElement>(null);\n const overlayRef = useRef<HTMLDivElement>(null);\n const [navHeight, setNavHeight] = useState(64);\n\n const openLabel = mobileToggleLabels?.open ?? 'Open menu';\n const closeLabel = mobileToggleLabels?.close ?? 'Close menu';\n\n /* ── Scroll detection with hysteresis ──────────────────────────────\n Glass appears at scrollThreshold (32px default).\n Glass disappears only when scrolling back above threshold × 0.25 (8px).\n This prevents flicker when hovering near the threshold.\n SSR flash guard: initial state is set synchronously from scrollY. */\n\n const [scrolled, setScrolled] = useState(() => {\n if (typeof window !== 'undefined') {\n return window.scrollY > scrollThreshold;\n }\n return false;\n });\n\n useEffect(() => {\n if (!scrollBorder) return;\n\n const lowerBound = scrollThreshold * HYSTERESIS_RATIO;\n\n const handleScroll = () => {\n const y = window.scrollY;\n setScrolled((prev) => {\n if (!prev && y > scrollThreshold) return true;\n if (prev && y < lowerBound) return false;\n return prev;\n });\n };\n\n // SSR flash guard — set correct state on mount\n handleScroll();\n\n window.addEventListener('scroll', handleScroll, { passive: true });\n return () => window.removeEventListener('scroll', handleScroll);\n }, [scrollBorder, scrollThreshold]);\n\n const isScrolled = scrollBorder && scrolled;\n\n const scrollCtx = useMemo<ScrollContextValue>(\n () => ({ scrolled: isScrolled }),\n [isScrolled],\n );\n\n const handleToggle = () => {\n const newState = !isMobileMenuOpen;\n setInternalMenuOpen(newState);\n onMenuOpenChange?.(newState);\n };\n\n /* Measure navbar height for mobile overlay positioning + CSS overlap var */\n useEffect(() => {\n const el = navRef.current;\n if (!el) return;\n const observer = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const h = entry.contentRect.height;\n setNavHeight(h);\n /* Expose height as CSS custom property for layout overlap tricks */\n el.style.setProperty('--navbar-overlap', `${h}px`);\n }\n });\n observer.observe(el);\n return () => observer.disconnect();\n }, []);\n\n /* Lock body scroll when mobile menu is open */\n useEffect(() => {\n if (isMobileMenuOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isMobileMenuOpen]);\n\n /* Close on Escape */\n useEffect(() => {\n if (!isMobileMenuOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setInternalMenuOpen(false);\n onMenuOpenChange?.(false);\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isMobileMenuOpen, onMenuOpenChange]);\n\n /* Focus trap for mobile overlay */\n useFocusTrap(overlayRef, isMobileMenuOpen);\n\n /* Merge refs: forwardRef + internal navRef */\n const mergedRef = useMergedRef(ref, navRef);\n\n return (\n <ScrollContext.Provider value={scrollCtx}>\n <nav\n ref={mergedRef}\n className={clsx(\n 'ds-navbar-v2',\n isScrolled && 'ds-navbar-v2--scrolled',\n className,\n )}\n {...props}\n >\n {/* Inner container — receives glass treatment on scroll */}\n <div className=\"ds-navbar-v2__container\">\n {children}\n\n {/* Mobile Toggle */}\n <button\n className=\"ds-navbar-v2__toggle\"\n onClick={handleToggle}\n aria-label={isMobileMenuOpen ? closeLabel : openLabel}\n aria-expanded={isMobileMenuOpen}\n >\n {isMobileMenuOpen ? (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n )}\n </button>\n </div>\n\n {/* Mobile Menu Overlay — always mounted, CSS transitions handle show/hide */}\n <div\n ref={overlayRef}\n className=\"ds-navbar-v2__mobile-overlay\"\n style={{ top: navHeight }}\n data-state={isMobileMenuOpen ? 'open' : 'closed'}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={closeLabel}\n >\n <div className=\"ds-navbar-v2__mobile-content\">\n {mobileContent}\n </div>\n </div>\n </nav>\n </ScrollContext.Provider>\n );\n },\n);\n\nNavbarV2.displayName = 'NavbarV2';\n\n/* ============================================================================\n NavbarV2Brand — Logo area (left of pill)\n ============================================================================ */\n\nexport interface NavbarV2BrandProps extends React.HTMLAttributes<HTMLElement> {\n /** Render as custom element (e.g. Next.js Link). @default 'a' */\n as?: React.ElementType;\n href?: string;\n}\n\nexport const NavbarV2Brand = forwardRef<HTMLElement, NavbarV2BrandProps>(\n ({ as: Component = 'a', className, children, ...props }, ref) => (\n <Component ref={ref} className={clsx('ds-navbar-v2__brand', className)} {...props}>\n {children}\n </Component>\n ),\n);\n\nNavbarV2Brand.displayName = 'NavbarV2Brand';\n\n/* ============================================================================\n NavbarV2Tabs — The floating glass pill containing tab items\n Provides mutual-exclusion context so only one mega menu is open at a time.\n Reads ScrollContext to demote glass when outer container is active.\n ============================================================================ */\n\nexport const NavbarV2Tabs = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => {\n const [activeMenuId, setActiveMenuId] = useState<string | null>(null);\n const { scrolled } = useContext(ScrollContext);\n\n const ctxValue = useMemo<TabsContextValue>(\n () => ({\n activeMenuId,\n openMenu: (id: string) => setActiveMenuId(id),\n closeMenu: (id: string) =>\n setActiveMenuId((prev) => (prev === id ? null : prev)),\n }),\n [activeMenuId],\n );\n\n return (\n <TabsContext.Provider value={ctxValue}>\n {/* No role — parent <nav> already declares navigation landmark */}\n <div\n ref={ref}\n className={clsx(\n 'ds-navbar-v2__tabs',\n scrolled && 'ds-navbar-v2__tabs--demoted',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n );\n },\n);\n\nNavbarV2Tabs.displayName = 'NavbarV2Tabs';\n\n/* ============================================================================\n NavbarV2Tab — Vertical icon + label tab (simple link or button)\n ============================================================================ */\n\nexport interface NavbarV2TabProps extends React.HTMLAttributes<HTMLElement> {\n /** Render as custom element (e.g. Next.js Link). @default 'button' */\n as?: React.ElementType;\n /** Whether this tab is the current page. */\n active?: boolean;\n /** Icon element (rendered above label). */\n icon?: React.ReactNode;\n /** Tab label text (rendered below icon). */\n label?: string;\n href?: string;\n}\n\nexport const NavbarV2Tab = forwardRef<HTMLElement, NavbarV2TabProps>(\n ({ as: Component = 'button', active, icon, label, className, children, ...props }, ref) => (\n <Component\n ref={ref}\n className={clsx('ds-navbar-v2__tab', active && 'ds-navbar-v2__tab--active', className)}\n aria-current={active ? 'page' : undefined}\n {...(Component === 'button' ? { type: 'button' } : {})}\n {...props}\n >\n {icon && <span className=\"ds-navbar-v2__tab-icon\">{icon}</span>}\n {label && <span className=\"ds-navbar-v2__tab-label\">{label}</span>}\n {children}\n </Component>\n ),\n);\n\nNavbarV2Tab.displayName = 'NavbarV2Tab';\n\n/* ============================================================================\n NavbarV2TabMenu — Vertical tab that triggers a mega menu dropdown\n ============================================================================ */\n\nexport interface NavbarV2TabMenuProps {\n /** Icon for the tab trigger (rendered above label). */\n icon?: React.ReactNode;\n /** Label for the tab trigger (rendered below icon). */\n label: string;\n /** Whether this tab represents the current section. */\n active?: boolean;\n /** Mega menu panel content. */\n children: React.ReactNode;\n /** Optional class name. */\n className?: string;\n /** Controlled open state. */\n isOpen?: boolean;\n /** Controlled open change handler. */\n onOpenChange?: (isOpen: boolean) => void;\n}\n\nexport const NavbarV2TabMenu = forwardRef<HTMLDivElement, NavbarV2TabMenuProps>(\n (\n {\n icon,\n label,\n active,\n children,\n className,\n isOpen: controlledOpen,\n onOpenChange,\n },\n ref,\n ) => {\n /* Stable ID for mutual exclusion + aria-controls */\n const instanceId = useId();\n const panelId = `navbar-v2-panel-${instanceId}`;\n\n /* Mutual exclusion via context */\n const { activeMenuId, openMenu, closeMenu } = useContext(TabsContext);\n\n /* Support both controlled (isOpen prop) and context-driven state */\n const isControlled = controlledOpen !== undefined;\n const isOpen = isControlled ? controlledOpen : activeMenuId === instanceId;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef<number | null>(null);\n\n const handleOpen = useCallback(() => {\n if (!isOpen) {\n if (!isControlled) openMenu(instanceId);\n onOpenChange?.(true);\n }\n }, [isOpen, isControlled, openMenu, instanceId, onOpenChange]);\n\n const handleClose = useCallback(() => {\n if (isOpen) {\n if (!isControlled) closeMenu(instanceId);\n onOpenChange?.(false);\n }\n }, [isOpen, isControlled, closeMenu, instanceId, onOpenChange]);\n\n const handleToggle = useCallback(() => {\n if (isOpen) handleClose();\n else handleOpen();\n }, [isOpen, handleClose, handleOpen]);\n\n const handleMouseEnter = useCallback(() => {\n if (timeoutRef.current) {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = null;\n }\n handleOpen();\n }, [handleOpen]);\n\n const handleMouseLeave = useCallback(() => {\n if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n timeoutRef.current = window.setTimeout(handleClose, 150);\n }, [handleClose]);\n\n /* Cleanup timeout on unmount */\n useEffect(() => {\n return () => {\n if (timeoutRef.current) window.clearTimeout(timeoutRef.current);\n };\n }, []);\n\n /* Click outside → close */\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (event: MouseEvent) => {\n if (\n containerRef.current &&\n !containerRef.current.contains(event.target as Node) &&\n triggerRef.current &&\n !triggerRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, handleClose]);\n\n /* Escape → close */\n useEffect(() => {\n if (!isOpen) return;\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n handleClose();\n triggerRef.current?.focus();\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [isOpen, handleClose]);\n\n /* Viewport edge clamping — nudge panel so it doesn't overflow */\n useEffect(() => {\n if (!isOpen || !panelRef.current) return;\n\n const clampToViewport = () => {\n const panel = panelRef.current;\n if (!panel) return;\n\n // Reset any previous nudge\n panel.style.setProperty('--panel-nudge', '0px');\n\n const rect = panel.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const EDGE_PADDING = 16;\n\n if (rect.right > viewportWidth - EDGE_PADDING) {\n const overflow = rect.right - (viewportWidth - EDGE_PADDING);\n panel.style.setProperty('--panel-nudge', `${-overflow}px`);\n } else if (rect.left < EDGE_PADDING) {\n const overflow = EDGE_PADDING - rect.left;\n panel.style.setProperty('--panel-nudge', `${overflow}px`);\n }\n };\n\n // Clamp after render + animation start\n requestAnimationFrame(clampToViewport);\n window.addEventListener('resize', clampToViewport);\n return () => window.removeEventListener('resize', clampToViewport);\n }, [isOpen]);\n\n /* Merge refs for panel: containerRef (click-outside) + panelRef (clamping) */\n const panelRefCallback = useCallback((node: HTMLDivElement | null) => {\n (containerRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n (panelRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }, []);\n\n return (\n <div\n ref={ref}\n className={clsx('ds-navbar-v2__tab-menu', className)}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n >\n <button\n ref={triggerRef}\n className={clsx(\n 'ds-navbar-v2__tab',\n (active || isOpen) && 'ds-navbar-v2__tab--active',\n )}\n onClick={handleToggle}\n aria-expanded={isOpen}\n aria-haspopup=\"true\"\n aria-controls={isOpen ? panelId : undefined}\n type=\"button\"\n >\n {icon && <span className=\"ds-navbar-v2__tab-icon\">{icon}</span>}\n <span className=\"ds-navbar-v2__tab-label-row\">\n <span className=\"ds-navbar-v2__tab-label\">{label}</span>\n <span\n className=\"ds-navbar-v2__tab-chevron\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n <ChevronDown />\n </span>\n </span>\n </button>\n\n {/* Mega panel — mount only when open to keep the global DOM budget low. */}\n {isOpen ? (\n <div\n ref={panelRefCallback}\n id={panelId}\n className=\"ds-navbar-v2__mega-panel\"\n data-state=\"open\"\n role=\"region\"\n aria-label={`${label} menu`}\n >\n {children}\n </div>\n ) : null}\n </div>\n );\n },\n);\n\nNavbarV2TabMenu.displayName = 'NavbarV2TabMenu';\n\n/* ============================================================================\n NavbarV2Actions — Right-side actions (right of pill)\n ============================================================================ */\n\nexport const NavbarV2Actions = forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, children, ...props }, ref) => (\n <div ref={ref} className={clsx('ds-navbar-v2__actions', className)} {...props}>\n {children}\n </div>\n ),\n);\n\nNavbarV2Actions.displayName = 'NavbarV2Actions';\n\n/* ============================================================================\n Utility — merge multiple refs (forwardRef + internal ref)\n ============================================================================ */\n\nfunction useMergedRef<T>(\n ...refs: (React.Ref<T> | React.MutableRefObject<T | null> | null | undefined)[]\n): React.RefCallback<T> {\n return useCallback(\n (value: T | null) => {\n for (const ref of refs) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref && typeof ref === 'object') {\n (ref as React.MutableRefObject<T | null>).current = value;\n }\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n refs,\n );\n}\n","import React, { forwardRef, HTMLAttributes, useState } from 'react';\nimport clsx from 'clsx';\nimport { Container } from '../LayoutPrimitives';\nimport './SiteFooter.css';\n\n/* ============================================================================\n Types\n ============================================================================ */\n\nexport interface FooterLink {\n label: string;\n href: string;\n /** Visual \"NEW\" indicator badge. */\n isNew?: boolean;\n}\n\nexport interface FooterSection {\n title: string;\n links: FooterLink[];\n}\n\nexport interface FooterCTA {\n /** Primary headline (e.g., \"Install Your Sales Operating System.\") */\n headline: string;\n /** Supporting subtext below the headline. */\n subtext?: string;\n /** Primary CTA slot (e.g., a <Button> component). */\n primaryCta?: React.ReactNode;\n /** Secondary CTA slot (e.g., a ghost <Button>). */\n secondaryCta?: React.ReactNode;\n /** Micro trust line below the CTA actions. */\n trustLine?: string;\n}\n\nexport interface FooterTrustBadge {\n /** Badge label (e.g., \"GDPR-ready\"). */\n label: string;\n}\n\nexport interface SiteFooterProps extends HTMLAttributes<HTMLElement> {\n /* ── Zone 1: Strategic CTA ─────────────────────────────────────────── */\n\n /** Strategic CTA rendered at the top of the footer. */\n cta?: FooterCTA;\n\n /* ── Zone 2: Structured Navigation Grid ────────────────────────────── */\n\n /** Navigation sections rendered as a 5-column grid on desktop. */\n sections?: FooterSection[];\n /** Quick orientation line above the navigation grid. */\n orientationLine?: React.ReactNode;\n /**\n * Custom element to render for each link (e.g., Next.js locale-aware Link).\n * Must accept `href`, `className`, and `children` props.\n * @default 'a'\n */\n linkAs?: React.ElementType;\n\n /* ── Zone 3: Authority Layer ───────────────────────────────────────── */\n\n /** Brand logo or name slot. */\n brand?: React.ReactNode;\n /** Tagline below the brand. */\n tagline?: React.ReactNode;\n /** Social icons slot. */\n socials?: React.ReactNode;\n /** Trust amplifier badges (e.g., \"Built for B2B Teams\", \"GDPR-ready\"). */\n trustBadges?: FooterTrustBadge[];\n\n /* ── Zone 4: System Controls ───────────────────────────────────────── */\n\n /** System controls slot (language switcher, theme toggle, etc.). */\n controls?: React.ReactNode;\n\n /* ── Zone 5: Legal + Ownership ─────────────────────────────────────── */\n\n /** Legal links rendered in the bottom bar. */\n legalLinks?: FooterLink[];\n /** Copyright text. Falls back to a default with the current year. */\n copyright?: React.ReactNode;\n /** Company registration or legal entity info line. */\n companyInfo?: string;\n /** Extra content rendered below the legal bar (e.g., AI summary links). */\n bottomExtra?: React.ReactNode;\n\n /* ── Deprecated ────────────────────────────────────────────────────── */\n\n /** @deprecated Use `controls` instead. Slot rendered in the bottom bar. */\n bottomActions?: React.ReactNode;\n}\n\n/* ============================================================================\n Internal: Mobile Accordion Item\n ============================================================================ */\n\ninterface FooterAccordionItemProps {\n section: FooterSection;\n LinkComponent: React.ElementType;\n}\n\nfunction FooterAccordionItem({ section, LinkComponent }: FooterAccordionItemProps) {\n const [isOpen, setIsOpen] = useState(false);\n\n return (\n <div\n className={clsx(\n 'ds-footer__accordion-item',\n isOpen && 'ds-footer__accordion-item--open',\n )}\n >\n <button\n type=\"button\"\n className=\"ds-footer__accordion-trigger\"\n aria-expanded={isOpen}\n onClick={() => setIsOpen((prev) => !prev)}\n >\n <span>{section.title}</span>\n <svg\n className=\"ds-footer__accordion-chevron\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n <div className=\"ds-footer__accordion-panel\" hidden={!isOpen}>\n <ul className=\"ds-footer__links\">\n {section.links.map((link, idx) => (\n <li key={idx}>\n <LinkComponent href={link.href} className=\"ds-footer__link\">\n {link.label}\n {link.isNew && <span className=\"ds-footer__badge\">NEW</span>}\n </LinkComponent>\n </li>\n ))}\n </ul>\n </div>\n </div>\n );\n}\n\n/* ============================================================================\n Component\n ============================================================================ */\n\nexport const SiteFooter = forwardRef<HTMLElement, SiteFooterProps>(\n (\n {\n cta,\n sections = [],\n orientationLine,\n linkAs,\n brand,\n tagline,\n socials,\n trustBadges,\n controls,\n legalLinks = [],\n copyright,\n companyInfo,\n bottomExtra,\n bottomActions,\n className,\n ...props\n },\n ref,\n ) => {\n const currentYear = new Date().getFullYear();\n const defaultCopyright = copyright || `© ${currentYear}. All rights reserved.`;\n const resolvedControls = controls || bottomActions;\n const LinkComponent = linkAs || 'a';\n\n return (\n <footer ref={ref} className={clsx('ds-footer', className)} {...props}>\n {/* ── Zone 1: Strategic CTA ──────────────────────────────────── */}\n {cta && (\n <div className=\"ds-footer__cta\" data-footer-zone=\"cta\">\n <Container>\n <div className=\"ds-footer__cta-content\">\n <h2 className=\"ds-footer__cta-headline\">{cta.headline}</h2>\n {cta.subtext && (\n <p className=\"ds-footer__cta-subtext\">{cta.subtext}</p>\n )}\n {(cta.primaryCta || cta.secondaryCta) && (\n <div className=\"ds-footer__cta-actions\">\n {cta.primaryCta}\n {cta.secondaryCta}\n </div>\n )}\n {cta.trustLine && (\n <p className=\"ds-footer__cta-trust\">{cta.trustLine}</p>\n )}\n </div>\n </Container>\n </div>\n )}\n\n {/* ── Zone 2: Navigation Grid ────────────────────────────────── */}\n {sections.length > 0 && (\n <div className=\"ds-footer__nav\" data-footer-zone=\"navigation\">\n <Container>\n {orientationLine && (\n <div className=\"ds-footer__orientation\">\n {orientationLine}\n </div>\n )}\n\n {/* Desktop: Grid layout */}\n <nav\n className=\"ds-footer__grid\"\n aria-label=\"Footer navigation\"\n >\n {sections.map((section, idx) => (\n <div\n key={idx}\n className=\"ds-footer__column\"\n data-footer-section={section.title\n .toLowerCase()\n .replace(/\\s+/g, '-')}\n >\n <p className=\"ds-footer__heading\">{section.title}</p>\n <ul className=\"ds-footer__links\">\n {section.links.map((link, linkIdx) => (\n <li key={linkIdx}>\n <LinkComponent\n href={link.href}\n className=\"ds-footer__link\"\n >\n {link.label}\n {link.isNew && (\n <span className=\"ds-footer__badge\">NEW</span>\n )}\n </LinkComponent>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </nav>\n\n {/* Mobile: Accordion layout */}\n <nav\n className=\"ds-footer__mobile-nav\"\n aria-label=\"Footer navigation\"\n >\n {sections.map((section, idx) => (\n <FooterAccordionItem\n key={idx}\n section={section}\n LinkComponent={LinkComponent}\n />\n ))}\n </nav>\n </Container>\n </div>\n )}\n\n {/* ── Zone 3: Authority Layer ────────────────────────────────── */}\n {(brand || socials || trustBadges) && (\n <div className=\"ds-footer__authority\" data-footer-zone=\"authority\">\n <Container>\n <div className=\"ds-footer__authority-content\">\n <div className=\"ds-footer__brand\">\n {brand && <div className=\"ds-footer__logo\">{brand}</div>}\n {tagline && (\n <p className=\"ds-footer__tagline\">{tagline}</p>\n )}\n {socials && (\n <div className=\"ds-footer__socials\">{socials}</div>\n )}\n </div>\n {trustBadges && trustBadges.length > 0 && (\n <div className=\"ds-footer__trust-badges\">\n {trustBadges.map((badge, idx) => (\n <span key={idx} className=\"ds-footer__trust-badge\">\n {badge.label}\n </span>\n ))}\n </div>\n )}\n </div>\n </Container>\n </div>\n )}\n\n {/* ── Zone 4 + 5: Controls + Legal ───────────────────────────── */}\n <div className=\"ds-footer__bottom\" data-footer-zone=\"legal\">\n <Container>\n <div className=\"ds-footer__bottom-content\">\n <div className=\"ds-footer__copyright\">\n {copyright || defaultCopyright}\n </div>\n {resolvedControls && (\n <div className=\"ds-footer__controls\">\n {resolvedControls}\n </div>\n )}\n {legalLinks.length > 0 && (\n <div className=\"ds-footer__legal\">\n {legalLinks.map((link, idx) => (\n <LinkComponent\n key={idx}\n href={link.href}\n className=\"ds-footer__legal-link\"\n >\n {link.label}\n </LinkComponent>\n ))}\n </div>\n )}\n </div>\n {bottomExtra && (\n <div className=\"ds-footer__bottom-extra\">{bottomExtra}</div>\n )}\n {companyInfo && (\n <p className=\"ds-footer__company-info\">{companyInfo}</p>\n )}\n </Container>\n </div>\n </footer>\n );\n },\n);\nSiteFooter.displayName = 'SiteFooter';\n","import React, {\n forwardRef,\n useState,\n useRef,\n useEffect,\n useCallback,\n useId,\n} from 'react';\nimport clsx from 'clsx';\nimport './LocaleDropdown.css';\n\n/* ============================================================================\n Icons\n ============================================================================ */\n\nconst GlobeIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <path d=\"M2 12h20\" />\n <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\" />\n </svg>\n);\n\nconst ChevronDownIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M4 6L8 10L12 6\" />\n </svg>\n);\n\nconst CheckIcon = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\n/* ============================================================================\n Types\n ============================================================================ */\n\nexport interface LocaleOption {\n /** ISO code, e.g. 'en', 'fr', 'es'. */\n code: string;\n /** Full display name, e.g. 'English', 'Français'. */\n label: string;\n /** Emoji flag or SVG component. Optional. */\n flag?: React.ReactNode;\n /** Short display code, e.g. 'EN', 'FR'. Used in the trigger. */\n shortLabel?: string;\n}\n\nexport interface LocaleDropdownProps {\n /** Available locales. */\n locales: LocaleOption[];\n /** Currently active locale code. */\n activeLocale: string;\n /** Called when user selects a locale. */\n onLocaleChange?: (code: string) => void;\n /**\n * Custom element for dropdown options (e.g. Next.js Link).\n * Receives `href` from `getHref`. @default 'button'\n */\n optionAs?: React.ElementType;\n /** Generate href for each locale option. Used with `optionAs`. */\n getHref?: (code: string) => string;\n /** Additional class name. */\n className?: string;\n /** Direction the dropdown should open. Defaults to 'down'. */\n direction?: 'up' | 'down';\n /** Alignment of the dropdown panel relative to the trigger. Defaults to 'right'. */\n align?: 'left' | 'right' | 'center';\n}\n\n/* ============================================================================\n LocaleDropdown — Globe + flag trigger with dropdown panel\n ============================================================================\n A compact locale selector showing the current locale with a globe icon\n and emoji flag. Clicking opens a dropdown with all available locales.\n\n Features:\n - Click outside / Escape to close\n - Keyboard navigation (ArrowUp/Down, Enter, Escape)\n - Active locale highlighted with checkmark\n - Animated chevron rotation via CSS\n - Supports polymorphic option elements (buttons or links)\n - Full ARIA: aria-haspopup, aria-expanded, aria-activedescendant\n - prefers-reduced-motion respected via CSS\n - Uses DS tokens only (no hardcoded colors)\n ============================================================================ */\n\nexport const LocaleDropdown = forwardRef<HTMLDivElement, LocaleDropdownProps>(\n (\n {\n locales,\n activeLocale,\n onLocaleChange,\n optionAs: OptionComponent = 'button',\n getHref,\n className,\n direction = 'down',\n align = 'right',\n },\n ref,\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [focusIndex, setFocusIndex] = useState(-1);\n const containerRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const instanceId = useId();\n const listboxId = `locale-dropdown-${instanceId}`;\n\n const currentLocale = locales.find((l) => l.code === activeLocale) ?? locales[0];\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => {\n if (!prev) setFocusIndex(-1);\n return !prev;\n });\n }, []);\n\n const handleClose = useCallback(() => {\n setIsOpen(false);\n setFocusIndex(-1);\n triggerRef.current?.focus();\n }, []);\n\n const handleSelect = useCallback(\n (code: string) => {\n onLocaleChange?.(code);\n handleClose();\n },\n [onLocaleChange, handleClose],\n );\n\n /* Click outside → close */\n useEffect(() => {\n if (!isOpen) return;\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n handleClose();\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isOpen, handleClose]);\n\n /* Keyboard navigation */\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n if (!isOpen) {\n if (e.key === 'ArrowDown' || e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n setIsOpen(true);\n setFocusIndex(0);\n }\n return;\n }\n\n switch (e.key) {\n case 'Escape':\n e.preventDefault();\n handleClose();\n break;\n case 'ArrowDown':\n e.preventDefault();\n setFocusIndex((prev) => (prev + 1) % locales.length);\n break;\n case 'ArrowUp':\n e.preventDefault();\n setFocusIndex((prev) => (prev - 1 + locales.length) % locales.length);\n break;\n case 'Enter':\n case ' ':\n e.preventDefault();\n if (focusIndex >= 0 && focusIndex < locales.length) {\n handleSelect(locales[focusIndex].code);\n }\n break;\n case 'Home':\n e.preventDefault();\n setFocusIndex(0);\n break;\n case 'End':\n e.preventDefault();\n setFocusIndex(locales.length - 1);\n break;\n case 'Tab':\n handleClose();\n break;\n }\n },\n [isOpen, focusIndex, locales, handleClose, handleSelect],\n );\n\n /* Scroll focused item into view */\n useEffect(() => {\n if (!isOpen || focusIndex < 0 || !listRef.current) return;\n const items = listRef.current.querySelectorAll('[role=\"option\"]');\n items[focusIndex]?.scrollIntoView({ block: 'nearest' });\n }, [isOpen, focusIndex]);\n\n const activeDescendantId =\n isOpen && focusIndex >= 0 ? `${listboxId}-option-${focusIndex}` : undefined;\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-locale-dropdown',\n direction === 'up' && 'ds-locale-dropdown--up',\n align === 'left' && 'ds-locale-dropdown--align-left',\n align === 'center' && 'ds-locale-dropdown--align-center',\n className\n )}\n >\n <div ref={containerRef} className=\"ds-locale-dropdown__wrapper\">\n {/* Trigger */}\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"ds-locale-dropdown__trigger\"\n onClick={handleToggle}\n onKeyDown={handleKeyDown}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={isOpen ? listboxId : undefined}\n aria-activedescendant={activeDescendantId}\n aria-label={`Language: ${currentLocale.label}. Change language.`}\n >\n <span className=\"ds-locale-dropdown__trigger-icon\">\n <GlobeIcon />\n </span>\n {currentLocale.flag && (\n <span className=\"ds-locale-dropdown__trigger-flag\" aria-hidden=\"true\">\n {currentLocale.flag}\n </span>\n )}\n <span\n className=\"ds-locale-dropdown__trigger-chevron\"\n data-state={isOpen ? 'open' : 'closed'}\n >\n <ChevronDownIcon />\n </span>\n </button>\n\n {/* Dropdown Panel — always mounted, CSS transitions handle show/hide */}\n <div\n ref={listRef}\n id={listboxId}\n className=\"ds-locale-dropdown__panel\"\n role=\"listbox\"\n aria-label=\"Select language\"\n data-state={isOpen ? 'open' : 'closed'}\n onKeyDown={handleKeyDown}\n >\n {locales.map((locale, index) => {\n const isActive = locale.code === activeLocale;\n const isFocused = index === focusIndex;\n const optionId = `${listboxId}-option-${index}`;\n\n const optionProps = {\n id: optionId,\n role: 'option' as const,\n 'aria-selected': isActive,\n className: clsx(\n 'ds-locale-dropdown__option',\n isActive && 'ds-locale-dropdown__option--active',\n isFocused && 'ds-locale-dropdown__option--focused',\n ),\n onClick: () => handleSelect(locale.code),\n ...(OptionComponent !== 'button' && getHref\n ? { href: getHref(locale.code) }\n : { type: 'button' as const }),\n };\n\n return (\n <OptionComponent key={locale.code} {...optionProps}>\n <span className=\"ds-locale-dropdown__option-content\">\n {locale.flag && (\n <span className=\"ds-locale-dropdown__option-flag\" aria-hidden=\"true\">\n {locale.flag}\n </span>\n )}\n <span className=\"ds-locale-dropdown__option-label\">\n {locale.label}\n </span>\n </span>\n {isActive && (\n <span className=\"ds-locale-dropdown__option-check\">\n <CheckIcon />\n </span>\n )}\n </OptionComponent>\n );\n })}\n </div>\n </div>\n </div>\n );\n },\n);\n\nLocaleDropdown.displayName = 'LocaleDropdown';\n","import React from 'react';\nimport { OutboundLink } from './OutboundLink';\n\n/**\n * A wrapper specifically designed to be passed into MDX component mappings.\n * It provides defaults suitable for markdown content.\n * \n * Usage:\n * <MDXRemote components={{ a: MDXOutboundLink }} />\n */\nexport const MDXOutboundLink = ({ \n href, \n children, \n ...props \n}: React.AnchorHTMLAttributes<HTMLAnchorElement> & { href?: string }) => {\n if (!href) {\n // eslint-disable-next-line no-restricted-syntax\n return <a {...props}>{children}</a>;\n }\n\n return (\n <OutboundLink \n href={href} \n context=\"cms_markdown\" \n preserveExistingUTM={true}\n openInNewTab={true}\n {...props}\n >\n {children}\n </OutboundLink>\n );\n};\n\nexport default MDXOutboundLink;"]}
@@ -582,18 +582,18 @@ var NavbarV2TabMenu = react.forwardRef(
582
582
  ]
583
583
  }
584
584
  ),
585
- /* @__PURE__ */ jsxRuntime.jsx(
585
+ isOpen ? /* @__PURE__ */ jsxRuntime.jsx(
586
586
  "div",
587
587
  {
588
588
  ref: panelRefCallback,
589
589
  id: panelId,
590
590
  className: "ds-navbar-v2__mega-panel",
591
- "data-state": isOpen ? "open" : "closed",
591
+ "data-state": "open",
592
592
  role: "region",
593
593
  "aria-label": `${label} menu`,
594
594
  children
595
595
  }
596
- )
596
+ ) : null
597
597
  ]
598
598
  }
599
599
  );
@@ -1039,4 +1039,4 @@ exports.NavbarV2TabMenu = NavbarV2TabMenu;
1039
1039
  exports.NavbarV2Tabs = NavbarV2Tabs;
1040
1040
  exports.SiteFooter = SiteFooter;
1041
1041
  //# sourceMappingURL=out.js.map
1042
- //# sourceMappingURL=chunk-ZDLOA2UT.cjs.map
1042
+ //# sourceMappingURL=chunk-KDLH35OI.cjs.map