@salesmind-ai/design-system 0.5.0 → 0.7.0
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.
- package/README.md +2 -0
- package/dist/Anton-Regular-MLEXVTB2.woff2 +0 -0
- package/dist/admin/index.cjs +5 -61
- package/dist/admin/index.css +0 -3918
- package/dist/admin/index.css.map +1 -1
- package/dist/admin/index.d.cts +1 -422
- package/dist/admin/index.d.ts +1 -422
- package/dist/admin/index.js +1 -5
- package/dist/blog/index.cjs +13 -34
- package/dist/blog/index.css +0 -579
- package/dist/blog/index.css.map +1 -1
- package/dist/blog/index.d.cts +1 -54
- package/dist/blog/index.d.ts +1 -54
- package/dist/blog/index.js +5 -6
- package/dist/charts/index.cjs +0 -46
- package/dist/charts/index.d.cts +1 -452
- package/dist/charts/index.d.ts +1 -452
- package/dist/charts/index.js +1 -3
- package/dist/{chunk-HDVAMYSG.js → chunk-27Y5ESMM.js} +7 -2
- package/dist/chunk-27Y5ESMM.js.map +1 -0
- package/dist/{chunk-YTYDQBVY.cjs → chunk-2VVRZBUR.cjs} +4 -4
- package/dist/{chunk-GQELL2MF.cjs → chunk-3NS6X2R4.cjs} +20 -203
- package/dist/chunk-3NS6X2R4.cjs.map +1 -0
- package/dist/{chunk-XEX2AEZK.cjs → chunk-65DTHLVX.cjs} +66 -186
- package/dist/chunk-65DTHLVX.cjs.map +1 -0
- package/dist/{chunk-QALDZ7WQ.js → chunk-6BUS7RMS.js} +21 -198
- package/dist/chunk-6BUS7RMS.js.map +1 -0
- package/dist/{chunk-BJZ2DKS5.cjs → chunk-6QIQCUYC.cjs} +11 -10
- package/dist/chunk-6QIQCUYC.cjs.map +1 -0
- package/dist/{chunk-H2Y6BSTL.cjs → chunk-7EUR3AKV.cjs} +1 -1
- package/dist/chunk-7EUR3AKV.cjs.map +1 -0
- package/dist/{chunk-VFJZQQZU.js → chunk-AMNY5TS3.js} +11 -10
- package/dist/chunk-AMNY5TS3.js.map +1 -0
- package/dist/{chunk-YJ6C3EKW.js → chunk-CLXLQCNQ.js} +52 -168
- package/dist/chunk-CLXLQCNQ.js.map +1 -0
- package/dist/{chunk-H2KQ3WSH.cjs → chunk-CVLD5RQK.cjs} +12 -14
- package/dist/chunk-CVLD5RQK.cjs.map +1 -0
- package/dist/chunk-EPD4ZEPY.cjs +344 -0
- package/dist/chunk-EPD4ZEPY.cjs.map +1 -0
- package/dist/chunk-FXYOSA4E.cjs +118 -0
- package/dist/chunk-FXYOSA4E.cjs.map +1 -0
- package/dist/{chunk-ECXBTUH6.cjs → chunk-GPHQGLR5.cjs} +27 -204
- package/dist/chunk-GPHQGLR5.cjs.map +1 -0
- package/dist/{chunk-Y26OHHMX.js → chunk-HHQ6J7B6.js} +513 -888
- package/dist/chunk-HHQ6J7B6.js.map +1 -0
- package/dist/chunk-JPUJWI7F.cjs +73 -0
- package/dist/chunk-JPUJWI7F.cjs.map +1 -0
- package/dist/{chunk-6UNG76Y2.js → chunk-K526GN7P.js} +2 -2
- package/dist/{chunk-SICKWUWB.js → chunk-KJHPOB3J.js} +1 -1
- package/dist/chunk-KJHPOB3J.js.map +1 -0
- package/dist/chunk-KXVFFEGD.js +60 -0
- package/dist/chunk-KXVFFEGD.js.map +1 -0
- package/dist/chunk-LQB7QLD3.js +288 -0
- package/dist/chunk-LQB7QLD3.js.map +1 -0
- package/dist/chunk-LUD52ZJF.cjs +726 -0
- package/dist/chunk-LUD52ZJF.cjs.map +1 -0
- package/dist/{chunk-7UZ5DETZ.js → chunk-MBAG654R.js} +4 -216
- package/dist/chunk-MBAG654R.js.map +1 -0
- package/dist/chunk-OMP6FAZ6.cjs +183 -0
- package/dist/chunk-OMP6FAZ6.cjs.map +1 -0
- package/dist/{chunk-WYH4TKS5.js → chunk-PBYRTNQ5.js} +6 -8
- package/dist/chunk-PBYRTNQ5.js.map +1 -0
- package/dist/chunk-PYREXCZK.js +679 -0
- package/dist/chunk-PYREXCZK.js.map +1 -0
- package/dist/{chunk-6D22TFLA.cjs → chunk-R3ZECV5P.cjs} +9 -4
- package/dist/chunk-R3ZECV5P.cjs.map +1 -0
- package/dist/{chunk-P5BOFE5A.js → chunk-RSLA2FJN.js} +28 -183
- package/dist/chunk-RSLA2FJN.js.map +1 -0
- package/dist/chunk-S46SKHMD.js +173 -0
- package/dist/chunk-S46SKHMD.js.map +1 -0
- package/dist/chunk-SFXTB7JL.js +190 -0
- package/dist/chunk-SFXTB7JL.js.map +1 -0
- package/dist/chunk-SGYXYMKZ.cjs +214 -0
- package/dist/chunk-SGYXYMKZ.cjs.map +1 -0
- package/dist/chunk-UGKYP6F3.cjs +296 -0
- package/dist/chunk-UGKYP6F3.cjs.map +1 -0
- package/dist/chunk-WB6XDNU7.js +115 -0
- package/dist/chunk-WB6XDNU7.js.map +1 -0
- package/dist/{chunk-LTPTW2US.cjs → chunk-WE4QIIVN.cjs} +592 -974
- package/dist/chunk-WE4QIIVN.cjs.map +1 -0
- package/dist/core/index.cjs +144 -626
- package/dist/core/index.css +178 -3567
- package/dist/core/index.css.map +1 -1
- package/dist/core/index.d.cts +940 -902
- package/dist/core/index.d.ts +940 -902
- package/dist/core/index.js +6 -12
- package/dist/i18n/index.cjs +54 -49
- package/dist/i18n/index.d.cts +46 -11
- package/dist/i18n/index.d.ts +46 -11
- package/dist/i18n/index.js +2 -1
- package/dist/index-BJ8rBqrO.d.cts +1100 -0
- package/dist/index-BxMqCbqE.d.ts +1100 -0
- package/dist/index.cjs +507 -1001
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +6057 -16713
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +306 -21
- package/dist/index.d.ts +306 -21
- package/dist/index.js +274 -39
- package/dist/index.js.map +1 -1
- package/dist/marketing/index.cjs +33 -76
- package/dist/marketing/index.css +1896 -3234
- package/dist/marketing/index.css.map +1 -1
- package/dist/marketing/index.d.cts +3 -1351
- package/dist/marketing/index.d.ts +3 -1351
- package/dist/marketing/index.js +5 -8
- package/dist/motion/index.cjs +3 -20
- package/dist/motion/index.css +0 -580
- package/dist/motion/index.css.map +1 -1
- package/dist/motion/index.d.cts +1 -37
- package/dist/motion/index.d.ts +1 -37
- package/dist/motion/index.js +1 -2
- package/dist/nav/index.cjs +10 -35
- package/dist/nav/index.css +28 -580
- package/dist/nav/index.css.map +1 -1
- package/dist/nav/index.d.cts +2 -60
- package/dist/nav/index.d.ts +2 -60
- package/dist/nav/index.js +1 -2
- package/dist/report/index.cjs +1166 -175
- package/dist/report/index.cjs.map +1 -1
- package/dist/report/index.d.cts +208 -5
- package/dist/report/index.d.ts +208 -5
- package/dist/report/index.js +1141 -3
- package/dist/report/index.js.map +1 -1
- package/dist/sections/index.cjs +8 -10
- package/dist/sections/index.cjs.map +1 -1
- package/dist/sections/index.css +0 -206
- package/dist/sections/index.css.map +1 -1
- package/dist/sections/index.js +2 -4
- package/dist/sections/index.js.map +1 -1
- package/dist/social-media/index.cjs +4 -0
- package/dist/social-media/index.cjs.map +1 -0
- package/dist/social-media/index.d.cts +2 -0
- package/dist/social-media/index.d.ts +2 -0
- package/dist/social-media/index.js +3 -0
- package/dist/social-media/index.js.map +1 -0
- package/dist/social-proof/index.cjs +4 -36
- package/dist/social-proof/index.css +3 -1106
- package/dist/social-proof/index.css.map +1 -1
- package/dist/social-proof/index.d.cts +26 -171
- package/dist/social-proof/index.d.ts +26 -171
- package/dist/social-proof/index.js +1 -5
- package/dist/styles/styles.css +657 -2990
- package/dist/theme/index.cjs +12 -16
- package/dist/theme/index.css +1 -245
- package/dist/theme/index.css.map +1 -1
- package/dist/theme/index.d.cts +4 -1
- package/dist/theme/index.d.ts +4 -1
- package/dist/theme/index.js +2 -2
- package/dist/web/client/index.cjs +10 -10
- package/dist/web/client/index.css +118 -0
- package/dist/web/client/index.css.map +1 -1
- package/dist/web/client/index.js +2 -2
- package/dist/web/index.cjs +10 -10
- package/dist/web/index.css +118 -0
- package/dist/web/index.css.map +1 -1
- package/dist/web/index.js +2 -2
- package/package.json +10 -4
- package/dist/AppearancePanel-UT57J69V.d.cts +0 -51
- package/dist/AppearancePanel-UT57J69V.d.ts +0 -51
- package/dist/ExportMenu-A2TLFiVv.d.cts +0 -311
- package/dist/ExportMenu-C8qck5AT.d.ts +0 -311
- package/dist/Select-BdZmK0Lt.d.cts +0 -66
- package/dist/Select-BdZmK0Lt.d.ts +0 -66
- package/dist/chart-types-BGVVO-zl.d.cts +0 -208
- package/dist/chart-types-BGVVO-zl.d.ts +0 -208
- package/dist/charts/index.css +0 -1167
- package/dist/charts/index.css.map +0 -1
- package/dist/chunk-3BAQDW3V.cjs +0 -1207
- package/dist/chunk-3BAQDW3V.cjs.map +0 -1
- package/dist/chunk-3NKRFUAR.js +0 -37
- package/dist/chunk-3NKRFUAR.js.map +0 -1
- package/dist/chunk-3TGSIILM.cjs +0 -201
- package/dist/chunk-3TGSIILM.cjs.map +0 -1
- package/dist/chunk-4GM5BGBN.cjs +0 -801
- package/dist/chunk-4GM5BGBN.cjs.map +0 -1
- package/dist/chunk-5LA3T22E.cjs +0 -562
- package/dist/chunk-5LA3T22E.cjs.map +0 -1
- package/dist/chunk-5SN66B2X.js +0 -2542
- package/dist/chunk-5SN66B2X.js.map +0 -1
- package/dist/chunk-6D22TFLA.cjs.map +0 -1
- package/dist/chunk-6H4DSTXR.js +0 -786
- package/dist/chunk-6H4DSTXR.js.map +0 -1
- package/dist/chunk-6HKQ5ILL.cjs +0 -1624
- package/dist/chunk-6HKQ5ILL.cjs.map +0 -1
- package/dist/chunk-7PX2AZ6Y.js +0 -39
- package/dist/chunk-7PX2AZ6Y.js.map +0 -1
- package/dist/chunk-7UZ5DETZ.js.map +0 -1
- package/dist/chunk-B6AVAX4F.js +0 -1415
- package/dist/chunk-B6AVAX4F.js.map +0 -1
- package/dist/chunk-BJZ2DKS5.cjs.map +0 -1
- package/dist/chunk-BUTQSDQH.js +0 -200
- package/dist/chunk-BUTQSDQH.js.map +0 -1
- package/dist/chunk-C2BCDNAV.js +0 -24
- package/dist/chunk-C2BCDNAV.js.map +0 -1
- package/dist/chunk-CJ2MKVAF.cjs +0 -46
- package/dist/chunk-CJ2MKVAF.cjs.map +0 -1
- package/dist/chunk-E7D6EKJ4.cjs +0 -44
- package/dist/chunk-E7D6EKJ4.cjs.map +0 -1
- package/dist/chunk-ECXBTUH6.cjs.map +0 -1
- package/dist/chunk-FAFAP4L5.js +0 -183
- package/dist/chunk-FAFAP4L5.js.map +0 -1
- package/dist/chunk-G2XGBO5V.cjs +0 -2565
- package/dist/chunk-G2XGBO5V.cjs.map +0 -1
- package/dist/chunk-GQELL2MF.cjs.map +0 -1
- package/dist/chunk-H2KQ3WSH.cjs.map +0 -1
- package/dist/chunk-H2Y6BSTL.cjs.map +0 -1
- package/dist/chunk-HCZW5AJN.cjs +0 -234
- package/dist/chunk-HCZW5AJN.cjs.map +0 -1
- package/dist/chunk-HDVAMYSG.js.map +0 -1
- package/dist/chunk-HN4PHABT.js +0 -126
- package/dist/chunk-HN4PHABT.js.map +0 -1
- package/dist/chunk-LTPTW2US.cjs.map +0 -1
- package/dist/chunk-MDB2WCRQ.cjs +0 -137
- package/dist/chunk-MDB2WCRQ.cjs.map +0 -1
- package/dist/chunk-MQRB634A.cjs +0 -34
- package/dist/chunk-MQRB634A.cjs.map +0 -1
- package/dist/chunk-NN3TUHIH.js +0 -28
- package/dist/chunk-NN3TUHIH.js.map +0 -1
- package/dist/chunk-OWS2KAXZ.js +0 -701
- package/dist/chunk-OWS2KAXZ.js.map +0 -1
- package/dist/chunk-P5BOFE5A.js.map +0 -1
- package/dist/chunk-PUPSK3DI.cjs +0 -216
- package/dist/chunk-PUPSK3DI.cjs.map +0 -1
- package/dist/chunk-Q2MFGYTE.cjs +0 -1449
- package/dist/chunk-Q2MFGYTE.cjs.map +0 -1
- package/dist/chunk-Q75DBVDY.cjs +0 -68
- package/dist/chunk-Q75DBVDY.cjs.map +0 -1
- package/dist/chunk-QALDZ7WQ.js.map +0 -1
- package/dist/chunk-QWE2RNCS.js +0 -1195
- package/dist/chunk-QWE2RNCS.js.map +0 -1
- package/dist/chunk-RQUFZAZ7.js +0 -1608
- package/dist/chunk-RQUFZAZ7.js.map +0 -1
- package/dist/chunk-SICKWUWB.js.map +0 -1
- package/dist/chunk-TCFC7XTB.js +0 -212
- package/dist/chunk-TCFC7XTB.js.map +0 -1
- package/dist/chunk-UTVXGAQP.cjs +0 -2437
- package/dist/chunk-UTVXGAQP.cjs.map +0 -1
- package/dist/chunk-UVEMY3FQ.cjs +0 -717
- package/dist/chunk-UVEMY3FQ.cjs.map +0 -1
- package/dist/chunk-VFJZQQZU.js.map +0 -1
- package/dist/chunk-WH7PYHZY.cjs +0 -35
- package/dist/chunk-WH7PYHZY.cjs.map +0 -1
- package/dist/chunk-WYH4TKS5.js.map +0 -1
- package/dist/chunk-XEX2AEZK.cjs.map +0 -1
- package/dist/chunk-XPTVHPCN.js +0 -2320
- package/dist/chunk-XPTVHPCN.js.map +0 -1
- package/dist/chunk-XWPDRMZG.js +0 -62
- package/dist/chunk-XWPDRMZG.js.map +0 -1
- package/dist/chunk-Y26OHHMX.js.map +0 -1
- package/dist/chunk-YJ6C3EKW.js.map +0 -1
- package/dist/motion-C651Ry6d.d.cts +0 -832
- package/dist/motion-C651Ry6d.d.ts +0 -832
- package/dist/report/index.css +0 -1239
- package/dist/report/index.css.map +0 -1
- /package/dist/{chunk-6UNG76Y2.js.map → chunk-2VVRZBUR.cjs.map} +0 -0
- /package/dist/{chunk-YTYDQBVY.cjs.map → chunk-K526GN7P.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
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"]}
|
package/dist/chunk-7PX2AZ6Y.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Checkbox as Checkbox$1 } from '@base-ui/react/checkbox';
|
|
3
|
-
import clsx from 'clsx';
|
|
4
|
-
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
|
-
|
|
6
|
-
// src/components/Checkbox/Checkbox.tsx
|
|
7
|
-
var Checkbox = React.forwardRef(
|
|
8
|
-
({ className, label, id, ...props }, ref) => {
|
|
9
|
-
const generatedId = React.useId();
|
|
10
|
-
const checkboxId = id || generatedId;
|
|
11
|
-
return /* @__PURE__ */ jsxs("div", { className: clsx("ds-checkbox-wrapper", className), children: [
|
|
12
|
-
/* @__PURE__ */ jsx(Checkbox$1.Root, { id: checkboxId, ref, className: "ds-checkbox", ...props, children: /* @__PURE__ */ jsx(Checkbox$1.Indicator, { className: "ds-checkbox__indicator", children: /* @__PURE__ */ jsx(
|
|
13
|
-
"svg",
|
|
14
|
-
{
|
|
15
|
-
viewBox: "0 0 14 14",
|
|
16
|
-
fill: "none",
|
|
17
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
18
|
-
className: "ds-checkbox__icon",
|
|
19
|
-
children: /* @__PURE__ */ jsx(
|
|
20
|
-
"path",
|
|
21
|
-
{
|
|
22
|
-
d: "M11.6666 3.5L5.24992 9.91667L2.33325 7",
|
|
23
|
-
stroke: "currentColor",
|
|
24
|
-
strokeWidth: "2",
|
|
25
|
-
strokeLinecap: "round",
|
|
26
|
-
strokeLinejoin: "round"
|
|
27
|
-
}
|
|
28
|
-
)
|
|
29
|
-
}
|
|
30
|
-
) }) }),
|
|
31
|
-
label && /* @__PURE__ */ jsx("label", { htmlFor: checkboxId, className: "ds-checkbox__label", children: label })
|
|
32
|
-
] });
|
|
33
|
-
}
|
|
34
|
-
);
|
|
35
|
-
Checkbox.displayName = "Checkbox";
|
|
36
|
-
|
|
37
|
-
export { Checkbox };
|
|
38
|
-
//# sourceMappingURL=out.js.map
|
|
39
|
-
//# sourceMappingURL=chunk-7PX2AZ6Y.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Checkbox/Checkbox.tsx"],"names":[],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,YAAY,oBAAoB;AACzC,OAAO,UAAU;AAuBX,SASQ,KATR;AANC,IAAM,WAAW,MAAM;AAAA,EAC5B,CAAC,EAAE,WAAW,OAAO,IAAI,GAAG,MAAM,GAAG,QAAQ;AAC3C,UAAM,cAAc,MAAM,MAAM;AAChC,UAAM,aAAa,MAAM;AAEzB,WACE,qBAAC,SAAI,WAAW,KAAK,uBAAuB,SAAS,GACnD;AAAA,0BAAC,aAAa,MAAb,EAAkB,IAAI,YAAY,KAAU,WAAU,eAAe,GAAG,OACvE,8BAAC,aAAa,WAAb,EAAuB,WAAU,0BAChC;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,OAAM;AAAA,UACN,WAAU;AAAA,UAEV;AAAA,YAAC;AAAA;AAAA,cACC,GAAE;AAAA,cACF,QAAO;AAAA,cACP,aAAY;AAAA,cACZ,eAAc;AAAA,cACd,gBAAe;AAAA;AAAA,UACjB;AAAA;AAAA,MACF,GACF,GACF;AAAA,MACC,SACC,oBAAC,WAAM,SAAS,YAAY,WAAU,sBACnC,iBACH;AAAA,OAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc","sourcesContent":["import React from 'react';\nimport { Checkbox as BaseCheckbox } from '@base-ui/react/checkbox';\nimport clsx from 'clsx';\nimport './Checkbox.css';\n\nexport interface CheckboxProps {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n disabled?: boolean;\n required?: boolean;\n readOnly?: boolean;\n name?: string;\n value?: string;\n id?: string;\n label?: string;\n className?: string;\n}\n\nexport const Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n ({ className, label, id, ...props }, ref) => {\n const generatedId = React.useId();\n const checkboxId = id || generatedId;\n\n return (\n <div className={clsx('ds-checkbox-wrapper', className)}>\n <BaseCheckbox.Root id={checkboxId} ref={ref} className=\"ds-checkbox\" {...props}>\n <BaseCheckbox.Indicator className=\"ds-checkbox__indicator\">\n <svg\n viewBox=\"0 0 14 14\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"ds-checkbox__icon\"\n >\n <path\n d=\"M11.6666 3.5L5.24992 9.91667L2.33325 7\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </BaseCheckbox.Indicator>\n </BaseCheckbox.Root>\n {label && (\n <label htmlFor={checkboxId} className=\"ds-checkbox__label\">\n {label}\n </label>\n )}\n </div>\n );\n },\n);\n\nCheckbox.displayName = 'Checkbox';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/theme/AppearanceProvider.tsx","../src/theme/ensure-readable-contrast.ts","../src/components/AppearancePanel/AppearancePanel.tsx"],"names":["p","q","relativeLuminance","React","jsx"],"mappings":"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","sourcesContent":["import React, { createContext, useContext, useEffect, useState, useCallback } from 'react';\nimport { ensureReadableContrast } from './ensure-readable-contrast';\n\n/* ============================================================================\n APPEARANCE TYPES\n ============================================================================ */\n\nexport type Theme = 'light' | 'light-contrast' | 'dark' | 'dark-contrast';\nexport type Brand = 'default' | 'salesmind' | 'custom';\nexport type NavPlacement = 'left' | 'right' | 'bottom';\nexport type Density = 'comfortable' | 'compact';\nexport type Radius = 'playful' | 'sharp';\n\nexport interface AppearanceSettings {\n theme: Theme;\n brand: Brand;\n navPlacement: NavPlacement;\n density: Density;\n radius: Radius;\n /** Hex color for custom brand (e.g., \"#ff2d8a\") */\n customColor: string;\n}\n\nexport interface AppearanceContextValue extends AppearanceSettings {\n setTheme: (theme: Theme) => void;\n setBrand: (brand: Brand) => void;\n setNavPlacement: (nav: NavPlacement) => void;\n setDensity: (density: Density) => void;\n setRadius: (radius: Radius) => void;\n setCustomColor: (color: string) => void;\n setAppearance: (settings: Partial<AppearanceSettings>) => void;\n resetToDefaults: () => void;\n}\n\n/* ============================================================================\n CONSTANTS\n ============================================================================ */\n\nconst STORAGE_KEY = 'void-appearance-settings';\n\nconst BRAND_PINK_HEX: Record<string, string> = {\n default: '#f97316',\n salesmind: '#ff005a',\n};\n\nconst DARK_SURFACE_HEX = '#08040a';\n\nconst DEFAULT_SETTINGS: AppearanceSettings = {\n theme: 'dark',\n brand: 'default',\n navPlacement: 'left',\n density: 'comfortable',\n radius: 'playful',\n customColor: '#f97316', // Default orange as fallback\n};\n\n/* ============================================================================\n UTILITIES\n ============================================================================ */\n\n/** Detect system color scheme preference */\n\n\n/** Convert hex color to RGB triplet string (e.g., \"255, 45, 138\") */\nfunction hexToRgb(hex: string): string {\n // Remove # if present\n const cleanHex = hex.replace(/^#/, '');\n\n // Parse hex values\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n // Validate parsed values\n if (isNaN(r) || isNaN(g) || isNaN(b)) {\n // Fallback to default orange if parsing fails\n return '249, 115, 22';\n }\n\n return `${r}, ${g}, ${b}`;\n}\n\n/**\n * Compute relative luminance of an RGB triplet using the WCAG 2.1 formula.\n * Returns a value between 0 (black) and 1 (white).\n * @see https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n */\nfunction relativeLuminance(r: number, g: number, b: number): number {\n const [rs, gs, bs] = [r / 255, g / 255, b / 255].map((c) =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4),\n );\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\n/**\n * Determine whether text on an accent-colored background should be black or white.\n * Returns \"0, 0, 0\" for light accents and \"255, 255, 255\" for dark accents.\n * Uses WCAG 2.1 relative luminance with a 0.179 threshold (equivalent to ~4.5:1\n * contrast ratio against white).\n */\nfunction accentForegroundRgb(hex: string): string {\n const cleanHex = hex.replace(/^#/, '');\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) {\n return '255, 255, 255'; // Fallback: white text\n }\n\n return relativeLuminance(r, g, b) > 0.179 ? '0, 0, 0' : '255, 255, 255';\n}\n\n/** Generate a complementary/secondary color from primary */\nfunction generateSecondaryColor(hex: string): string {\n const cleanHex = hex.replace(/^#/, '');\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) {\n return '255, 208, 0'; // Default yellow\n }\n\n // Shift hue by ~60 degrees for a harmonious secondary\n // Simple approach: rotate RGB channels and boost brightness\n const secondary = {\n r: Math.min(255, g + 50),\n g: Math.min(255, b + 100),\n b: Math.min(255, r),\n };\n\n return `${secondary.r}, ${secondary.g}, ${secondary.b}`;\n}\n\n/** Load settings from localStorage */\nfunction loadSettings(): AppearanceSettings {\n if (typeof window === 'undefined') return DEFAULT_SETTINGS;\n\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored) as Partial<AppearanceSettings>;\n return {\n theme: parsed.theme || DEFAULT_SETTINGS.theme,\n brand: parsed.brand || DEFAULT_SETTINGS.brand,\n navPlacement: parsed.navPlacement || DEFAULT_SETTINGS.navPlacement,\n density: parsed.density || DEFAULT_SETTINGS.density,\n radius: parsed.radius || DEFAULT_SETTINGS.radius,\n customColor: parsed.customColor || DEFAULT_SETTINGS.customColor,\n };\n }\n } catch {\n // Ignore parse errors\n }\n\n // Use default dark preference for initial theme if no stored value\n return {\n ...DEFAULT_SETTINGS,\n theme: 'dark',\n };\n}\n\n/** Save settings to localStorage */\nfunction saveSettings(settings: AppearanceSettings): void {\n if (typeof window === 'undefined') return;\n\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(settings));\n } catch {\n // Ignore storage errors (e.g., private browsing)\n }\n}\n\n/** Apply settings to document.documentElement */\nfunction applySettings(settings: AppearanceSettings): void {\n if (typeof document === 'undefined') return;\n\n const root = document.documentElement;\n\n // Apply data attributes\n root.setAttribute('data-theme', settings.theme);\n root.setAttribute('data-brand', settings.brand);\n root.setAttribute('data-nav', settings.navPlacement);\n root.setAttribute('data-density', settings.density);\n root.setAttribute('data-radius', settings.radius);\n\n // Handle custom brand RGB injection\n if (settings.brand === 'custom') {\n const primaryRgb = hexToRgb(settings.customColor);\n const secondaryRgb = generateSecondaryColor(settings.customColor);\n const foregroundRgb = accentForegroundRgb(settings.customColor);\n\n root.style.setProperty('--custom-accent-rgb', primaryRgb);\n root.style.setProperty('--custom-accent2-rgb', secondaryRgb);\n root.style.setProperty('--custom-accent-fg-rgb', foregroundRgb);\n } else {\n root.style.removeProperty('--custom-accent-rgb');\n root.style.removeProperty('--custom-accent2-rgb');\n root.style.removeProperty('--custom-accent-fg-rgb');\n }\n\n const brandPinkHex =\n settings.brand === 'custom'\n ? settings.customColor\n : BRAND_PINK_HEX[settings.brand] ?? BRAND_PINK_HEX.default;\n\n root.style.setProperty(\n '--brand-pink-readable',\n ensureReadableContrast(brandPinkHex, DARK_SURFACE_HEX),\n );\n}\n\n/** Check if user prefers reduced motion */\nfunction prefersReducedMotion(): boolean {\n if (typeof window === 'undefined') return false;\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n}\n\n/* ============================================================================\n CONTEXT\n ============================================================================ */\n\nconst AppearanceContext = createContext<AppearanceContextValue | null>(null);\n\n/* ============================================================================\n PROVIDER COMPONENT\n ============================================================================ */\n\nexport interface AppearanceProviderProps {\n /** Initial settings (overrides localStorage) */\n initialSettings?: Partial<AppearanceSettings>;\n /** Disable localStorage persistence */\n disablePersistence?: boolean;\n /** Children */\n children: React.ReactNode;\n}\n\nexport function AppearanceProvider({\n initialSettings,\n disablePersistence = false,\n children,\n}: AppearanceProviderProps) {\n // Start with deterministic defaults to avoid SSR/client hydration mismatch.\n // localStorage is read after mount in the effect below.\n const [settings, setSettings] = useState<AppearanceSettings>(() => ({\n ...DEFAULT_SETTINGS,\n ...initialSettings,\n }));\n\n // After hydration, sync with localStorage (runs once on mount)\n const [hydrated, setHydrated] = useState(false);\n useEffect(() => {\n if (!disablePersistence) {\n const loaded = loadSettings();\n setSettings({\n ...loaded,\n // initialSettings still take priority over localStorage\n ...initialSettings,\n });\n }\n setHydrated(true);\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Apply settings to DOM whenever they change\n useEffect(() => {\n applySettings(settings);\n if (!disablePersistence && hydrated) {\n saveSettings(settings);\n }\n }, [settings, disablePersistence, hydrated]);\n\n // Listen for system theme changes\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: light)');\n\n const handleChange = (e: MediaQueryListEvent) => {\n // Only auto-switch if user hasn't explicitly set a contrast variant\n setSettings((prev) => {\n if (prev.theme === 'light-contrast' || prev.theme === 'dark-contrast') {\n return prev; // Don't override contrast preferences\n }\n return {\n ...prev,\n theme: e.matches ? 'light' : 'dark',\n };\n });\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, []);\n\n // Listen for reduced motion preference changes\n useEffect(() => {\n if (typeof window === 'undefined') return;\n\n const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n // Initial check is handled by CSS media queries in tokens.css\n // This effect ensures we respect the preference dynamically\n const handleChange = () => {\n // Re-apply settings to ensure any motion-dependent values are updated\n applySettings(settings);\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [settings]);\n\n const setTheme = useCallback((theme: Theme) => {\n setSettings((prev) => ({ ...prev, theme }));\n }, []);\n\n const setBrand = useCallback((brand: Brand) => {\n setSettings((prev) => ({ ...prev, brand }));\n }, []);\n\n const setNavPlacement = useCallback((navPlacement: NavPlacement) => {\n setSettings((prev) => ({ ...prev, navPlacement }));\n }, []);\n\n const setDensity = useCallback((density: Density) => {\n setSettings((prev) => ({ ...prev, density }));\n }, []);\n\n const setRadius = useCallback((radius: Radius) => {\n setSettings((prev) => ({ ...prev, radius }));\n }, []);\n\n const setCustomColor = useCallback((customColor: string) => {\n setSettings((prev) => ({ ...prev, customColor, brand: 'custom' }));\n }, []);\n\n const setAppearance = useCallback((partial: Partial<AppearanceSettings>) => {\n setSettings((prev) => ({ ...prev, ...partial }));\n }, []);\n\n const resetToDefaults = useCallback(() => {\n setSettings(DEFAULT_SETTINGS);\n }, []);\n\n const contextValue: AppearanceContextValue = {\n ...settings,\n setTheme,\n setBrand,\n setNavPlacement,\n setDensity,\n setRadius,\n setCustomColor,\n setAppearance,\n resetToDefaults,\n };\n\n return <AppearanceContext.Provider value={contextValue}>{children}</AppearanceContext.Provider>;\n}\n\n/* ============================================================================\n HOOK\n ============================================================================ */\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function useAppearance(): AppearanceContextValue {\n const context = useContext(AppearanceContext);\n\n if (!context) {\n throw new Error('useAppearance must be used within an AppearanceProvider');\n }\n\n return context;\n}\n\n/* ============================================================================\n STANDALONE UTILITY (for use outside React, e.g., SSR or initial load)\n ============================================================================ */\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport function initializeAppearance(settings?: Partial<AppearanceSettings>): void {\n const loaded = loadSettings();\n const merged = { ...loaded, ...settings };\n applySettings(merged);\n}\n\n/* ============================================================================\n UTILITY EXPORTS\n ============================================================================ */\n\n// eslint-disable-next-line react-refresh/only-export-components\nexport { hexToRgb, relativeLuminance, accentForegroundRgb, prefersReducedMotion };\n","/**\n * Derive a readable accent text color that meets WCAG AA contrast requirements.\n *\n * Given an accent color intended for small text (e.g., section eyebrow labels),\n * this module computes a lightness-adjusted variant that satisfies a minimum\n * contrast ratio against a given surface color. Hue and saturation are preserved\n * so the result stays recognisably \"on brand\".\n *\n * The WCAG math here intentionally matches `relativeLuminance` in\n * `AppearanceProvider.tsx` (same constants, same 0.03928 threshold) so that\n * contrast decisions are consistent across the design system.\n */\n\n/* ============================================================================\n COLOR PARSING\n ============================================================================ */\n\n/** Parse a 3- or 6-character hex string into an RGB triplet, or null on failure. */\nexport function parseHex(hex: string): [number, number, number] | null {\n const clean = hex.replace(/^#/, '');\n\n let r: number, g: number, b: number;\n\n if (clean.length === 3) {\n r = parseInt(clean[0] + clean[0], 16);\n g = parseInt(clean[1] + clean[1], 16);\n b = parseInt(clean[2] + clean[2], 16);\n } else if (clean.length === 6) {\n r = parseInt(clean.substring(0, 2), 16);\n g = parseInt(clean.substring(2, 4), 16);\n b = parseInt(clean.substring(4, 6), 16);\n } else {\n return null;\n }\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n\n return [r, g, b];\n}\n\n/** Format an RGB triplet as a 6-character hex string with `#` prefix. */\nexport function toHex(r: number, g: number, b: number): string {\n const clamp = (n: number) => Math.max(0, Math.min(255, Math.round(n)));\n return (\n '#' +\n [clamp(r), clamp(g), clamp(b)]\n .map((c) => c.toString(16).padStart(2, '0'))\n .join('')\n );\n}\n\n/* ============================================================================\n HSL CONVERSION\n ============================================================================ */\n\n/** Convert an RGB triplet (0–255 each) to HSL (h: 0–360, s/l: 0–1). */\nexport function rgbToHsl(\n r: number,\n g: number,\n b: number,\n): [number, number, number] {\n const rn = r / 255;\n const gn = g / 255;\n const bn = b / 255;\n const max = Math.max(rn, gn, bn);\n const min = Math.min(rn, gn, bn);\n const l = (max + min) / 2;\n\n if (max === min) return [0, 0, l]; // achromatic\n\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\n let h: number;\n if (max === rn) h = ((gn - bn) / d + (gn < bn ? 6 : 0)) / 6;\n else if (max === gn) h = ((bn - rn) / d + 2) / 6;\n else h = ((rn - gn) / d + 4) / 6;\n\n return [h * 360, s, l];\n}\n\n/** Convert HSL (h: 0–360, s/l: 0–1) back to an RGB triplet (0–255 each). */\nexport function hslToRgb(\n h: number,\n s: number,\n l: number,\n): [number, number, number] {\n const hNorm = ((h % 360) + 360) % 360; // normalise negative hues\n\n if (s === 0) {\n const v = Math.round(l * 255);\n return [v, v, v]; // achromatic\n }\n\n const hue2rgb = (p: number, q: number, t: number) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hFrac = hNorm / 360;\n\n return [\n Math.round(hue2rgb(p, q, hFrac + 1 / 3) * 255),\n Math.round(hue2rgb(p, q, hFrac) * 255),\n Math.round(hue2rgb(p, q, hFrac - 1 / 3) * 255),\n ];\n}\n\n/* ============================================================================\n WCAG CONTRAST\n ============================================================================ */\n\n/**\n * Compute relative luminance using the WCAG 2.1 formula.\n *\n * Intentionally identical to the implementation in AppearanceProvider.tsx\n * so that all contrast decisions in the DS stay consistent.\n *\n * @see https://www.w3.org/TR/WCAG21/#dfn-relative-luminance\n */\nexport function relativeLuminance(r: number, g: number, b: number): number {\n const [rs, gs, bs] = [r / 255, g / 255, b / 255].map((c) =>\n c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4),\n );\n return 0.2126 * rs + 0.7152 * gs + 0.0722 * bs;\n}\n\n/**\n * WCAG 2.1 contrast ratio between two RGB triplets.\n * Result ranges from 1 (identical) to 21 (black vs white).\n */\nexport function contrastRatio(\n fg: [number, number, number],\n bg: [number, number, number],\n): number {\n const l1 = relativeLuminance(...fg);\n const l2 = relativeLuminance(...bg);\n const lighter = Math.max(l1, l2);\n const darker = Math.min(l1, l2);\n return (lighter + 0.05) / (darker + 0.05);\n}\n\n/* ============================================================================\n MAIN: DERIVE READABLE ACCENT COLOR\n ============================================================================ */\n\n/** Default minimum contrast ratio — WCAG AA for small text. */\nconst DEFAULT_MIN_RATIO = 4.5;\n\n/** Maximum binary-search iterations (convergence is fast; 25 is generous). */\nconst MAX_ITERATIONS = 25;\n\n/**\n * Return an accent color adjusted to meet a minimum contrast ratio against\n * the given surface color. The hue and saturation of the original color are\n * preserved; only lightness is increased (for dark surfaces) or decreased\n * (for light surfaces) until the target ratio is reached.\n *\n * If the original color already satisfies the ratio, it is returned as-is.\n * If the input is malformed, `fallbackHex` (default: the original input) is\n * returned so consumers degrade gracefully.\n *\n * @param accentHex Foreground accent color as a 3- or 6-char hex string\n * @param surfaceHex Background surface color to contrast against\n * @param minRatio Minimum WCAG contrast ratio (default 4.5 for AA small text)\n * @returns Adjusted hex color string\n */\nexport function ensureReadableContrast(\n accentHex: string,\n surfaceHex: string,\n minRatio = DEFAULT_MIN_RATIO,\n): string {\n const fg = parseHex(accentHex);\n const bg = parseHex(surfaceHex);\n\n // Guard: if either input is unparseable, return the original accent unchanged.\n if (!fg || !bg) return accentHex;\n\n // Fast path: already meets contrast — no adjustment needed.\n if (contrastRatio(fg, bg) >= minRatio) return accentHex;\n\n const [h, s] = rgbToHsl(...fg);\n const bgLuminance = relativeLuminance(...bg);\n\n // Determine adjustment direction:\n // On a dark surface (low luminance) we lighten; on a light surface we darken.\n const shouldLighten = bgLuminance < 0.5;\n\n const currentLightness = rgbToHsl(...fg)[2];\n let lo: number, hi: number;\n if (shouldLighten) {\n lo = currentLightness;\n hi = 1.0;\n } else {\n lo = 0;\n hi = currentLightness;\n }\n\n let bestHex = accentHex;\n\n for (let i = 0; i < MAX_ITERATIONS; i++) {\n const mid = (lo + hi) / 2;\n const [rr, gg, bb] = hslToRgb(h, s, mid);\n const ratio = contrastRatio([rr, gg, bb], bg);\n\n if (ratio >= minRatio) {\n bestHex = toHex(rr, gg, bb);\n if (shouldLighten) hi = mid;\n else lo = mid;\n } else {\n if (shouldLighten) lo = mid;\n else hi = mid;\n }\n }\n\n return bestHex;\n}\n","import React, { useId } from 'react';\nimport clsx from 'clsx';\nimport {\n useAppearance,\n Theme,\n Brand,\n NavPlacement,\n Density,\n Radius,\n} from '../../theme/AppearanceProvider';\nimport './AppearancePanel.css';\n\n/* ============================================================================\n APPEARANCE PANEL — Internal Settings UI\n ============================================================================ */\n\n/** All translatable labels for the AppearancePanel. */\nexport interface AppearancePanelLabels {\n /** Panel heading. @default \"Appearance Settings\" */\n title?: string;\n /** Theme section heading. @default \"Theme\" */\n themeHeading?: string;\n /** Brand section heading. @default \"Brand\" */\n brandHeading?: string;\n /** Density section heading. @default \"Density\" */\n densityHeading?: string;\n /** Geometry section heading. @default \"Geometry\" */\n geometryHeading?: string;\n /** Navigation section heading. @default \"Navigation Layout\" */\n navHeading?: string;\n /** Accent color label (shown for Custom brand). @default \"Accent Color\" */\n accentColorLabel?: string;\n /** Reset button text. @default \"Reset to Defaults\" */\n resetLabel?: string;\n\n /* Theme options */\n themeLight?: string;\n themeLightContrast?: string;\n themeDark?: string;\n themeDarkContrast?: string;\n\n /* Brand options */\n brandDefault?: string;\n brandDefaultDescription?: string;\n brandSalesmind?: string;\n brandSalesmindDescription?: string;\n brandCustom?: string;\n brandCustomDescription?: string;\n\n /* Density options */\n densityComfortable?: string;\n densityComfortableDescription?: string;\n densityCompact?: string;\n densityCompactDescription?: string;\n\n /* Radius / geometry options */\n radiusPlayful?: string;\n radiusPlayfulDescription?: string;\n radiusSharp?: string;\n radiusSharpDescription?: string;\n\n /* Navigation options */\n navLeft?: string;\n navRight?: string;\n navBottom?: string;\n}\n\nexport interface AppearancePanelProps {\n /** Custom class name */\n className?: string;\n /** Override default English labels for i18n. */\n labels?: AppearancePanelLabels;\n}\n\nexport const AppearancePanel = React.forwardRef<HTMLDivElement, AppearancePanelProps>(\n ({ className, labels: l }, ref) => {\n const {\n theme,\n brand,\n navPlacement,\n density,\n radius,\n customColor,\n setTheme,\n setBrand,\n setNavPlacement,\n setDensity,\n setRadius,\n setCustomColor,\n resetToDefaults,\n } = useAppearance();\n\n // Generate unique IDs for accessibility\n const colorPickerId = useId();\n\n // Build option arrays from labels (fallback to English defaults)\n const themeOptions: { value: Theme; label: string }[] = [\n { value: 'light', label: l?.themeLight ?? 'Light' },\n { value: 'light-contrast', label: l?.themeLightContrast ?? 'Light (High Contrast)' },\n { value: 'dark', label: l?.themeDark ?? 'Dark' },\n { value: 'dark-contrast', label: l?.themeDarkContrast ?? 'Dark (High Contrast)' },\n ];\n\n const brandOptions: { value: Brand; label: string; description: string }[] = [\n { value: 'default', label: l?.brandDefault ?? 'Default', description: l?.brandDefaultDescription ?? 'Warm Intelligence' },\n { value: 'salesmind', label: l?.brandSalesmind ?? 'SalesMind', description: l?.brandSalesmindDescription ?? 'Pink-red + Gold' },\n { value: 'custom', label: l?.brandCustom ?? 'Custom', description: l?.brandCustomDescription ?? 'Your color' },\n ];\n\n const navOptions: { value: NavPlacement; label: string }[] = [\n { value: 'left', label: l?.navLeft ?? 'Left Sidebar' },\n { value: 'right', label: l?.navRight ?? 'Right Sidebar' },\n { value: 'bottom', label: l?.navBottom ?? 'Bottom Tabs' },\n ];\n\n const densityOptions: { value: Density; label: string; description: string }[] = [\n { value: 'comfortable', label: l?.densityComfortable ?? 'Comfortable', description: l?.densityComfortableDescription ?? 'Generous spacing' },\n { value: 'compact', label: l?.densityCompact ?? 'Compact', description: l?.densityCompactDescription ?? 'Higher density' },\n ];\n\n const radiusOptions: { value: Radius; label: string; description: string }[] = [\n { value: 'playful', label: l?.radiusPlayful ?? 'Playful', description: l?.radiusPlayfulDescription ?? 'Rounded corners' },\n { value: 'sharp', label: l?.radiusSharp ?? 'Sharp', description: l?.radiusSharpDescription ?? 'Technical feel' },\n ];\n\n return (\n <div ref={ref} className={clsx('ds-appearance-panel', className)}>\n <h3 className=\"ds-appearance-panel__title\">{l?.title ?? 'Appearance Settings'}</h3>\n\n {/* Theme Section */}\n <fieldset className=\"ds-appearance-panel__section\">\n <legend className=\"ds-appearance-panel__legend\">{l?.themeHeading ?? 'Theme'}</legend>\n <div className=\"ds-appearance-panel__options\">\n {themeOptions.map((option) => (\n <label\n key={option.value}\n className={clsx(\n 'ds-appearance-panel__option',\n theme === option.value && 'ds-appearance-panel__option--active',\n )}\n >\n <input\n type=\"radio\"\n name=\"theme\"\n value={option.value}\n checked={theme === option.value}\n onChange={() => setTheme(option.value)}\n className=\"ds-appearance-panel__radio\"\n />\n <span className=\"ds-appearance-panel__option-label\">{option.label}</span>\n </label>\n ))}\n </div>\n </fieldset>\n\n {/* Brand Section */}\n <fieldset className=\"ds-appearance-panel__section\">\n <legend className=\"ds-appearance-panel__legend\">{l?.brandHeading ?? 'Brand'}</legend>\n <div className=\"ds-appearance-panel__options\">\n {brandOptions.map((option) => (\n <label\n key={option.value}\n className={clsx(\n 'ds-appearance-panel__option',\n brand === option.value && 'ds-appearance-panel__option--active',\n )}\n >\n <input\n type=\"radio\"\n name=\"brand\"\n value={option.value}\n checked={brand === option.value}\n onChange={() => setBrand(option.value)}\n className=\"ds-appearance-panel__radio\"\n />\n <span className=\"ds-appearance-panel__option-content\">\n <span className=\"ds-appearance-panel__option-label\">{option.label}</span>\n <span className=\"ds-appearance-panel__option-description\">\n {option.description}\n </span>\n </span>\n </label>\n ))}\n </div>\n\n {/* Color Picker (shown only for Custom brand) */}\n {brand === 'custom' && (\n <div className=\"ds-appearance-panel__color-picker\">\n <label htmlFor={colorPickerId} className=\"ds-appearance-panel__color-label\">\n {l?.accentColorLabel ?? 'Accent Color'}\n </label>\n <div className=\"ds-appearance-panel__color-input-wrapper\">\n <input\n type=\"color\"\n id={colorPickerId}\n value={customColor}\n onChange={(e) => setCustomColor(e.target.value)}\n className=\"ds-appearance-panel__color-input\"\n />\n <span className=\"ds-appearance-panel__color-value\">\n {customColor.toUpperCase()}\n </span>\n </div>\n </div>\n )}\n </fieldset>\n\n {/* Density Section */}\n <fieldset className=\"ds-appearance-panel__section\">\n <legend className=\"ds-appearance-panel__legend\">{l?.densityHeading ?? 'Density'}</legend>\n <div className=\"ds-appearance-panel__options ds-appearance-panel__options--row\">\n {densityOptions.map((option) => (\n <label\n key={option.value}\n className={clsx(\n 'ds-appearance-panel__option',\n 'ds-appearance-panel__option--toggle',\n density === option.value && 'ds-appearance-panel__option--active',\n )}\n >\n <input\n type=\"radio\"\n name=\"density\"\n value={option.value}\n checked={density === option.value}\n onChange={() => setDensity(option.value)}\n className=\"ds-appearance-panel__radio\"\n />\n <span className=\"ds-appearance-panel__option-content\">\n <span className=\"ds-appearance-panel__option-label\">{option.label}</span>\n <span className=\"ds-appearance-panel__option-description\">\n {option.description}\n </span>\n </span>\n </label>\n ))}\n </div>\n </fieldset>\n\n {/* Geometry Section */}\n <fieldset className=\"ds-appearance-panel__section\">\n <legend className=\"ds-appearance-panel__legend\">{l?.geometryHeading ?? 'Geometry'}</legend>\n <div className=\"ds-appearance-panel__options ds-appearance-panel__options--row\">\n {radiusOptions.map((option) => (\n <label\n key={option.value}\n className={clsx(\n 'ds-appearance-panel__option',\n 'ds-appearance-panel__option--toggle',\n radius === option.value && 'ds-appearance-panel__option--active',\n )}\n >\n <input\n type=\"radio\"\n name=\"radius\"\n value={option.value}\n checked={radius === option.value}\n onChange={() => setRadius(option.value)}\n className=\"ds-appearance-panel__radio\"\n />\n <span className=\"ds-appearance-panel__option-content\">\n <span className=\"ds-appearance-panel__option-label\">{option.label}</span>\n <span className=\"ds-appearance-panel__option-description\">\n {option.description}\n </span>\n </span>\n </label>\n ))}\n </div>\n </fieldset>\n\n {/* Navigation Section */}\n <fieldset className=\"ds-appearance-panel__section\">\n <legend className=\"ds-appearance-panel__legend\">{l?.navHeading ?? 'Navigation Layout'}</legend>\n <div className=\"ds-appearance-panel__options\">\n {navOptions.map((option) => (\n <label\n key={option.value}\n className={clsx(\n 'ds-appearance-panel__option',\n navPlacement === option.value && 'ds-appearance-panel__option--active',\n )}\n >\n <input\n type=\"radio\"\n name=\"nav\"\n value={option.value}\n checked={navPlacement === option.value}\n onChange={() => setNavPlacement(option.value)}\n className=\"ds-appearance-panel__radio\"\n />\n <span className=\"ds-appearance-panel__option-label\">{option.label}</span>\n </label>\n ))}\n </div>\n </fieldset>\n\n {/* Reset Button */}\n <button type=\"button\" onClick={resetToDefaults} className=\"ds-appearance-panel__reset\">\n {l?.resetLabel ?? 'Reset to Defaults'}\n </button>\n </div>\n );\n },\n);\n\nAppearancePanel.displayName = 'AppearancePanel';\n"]}
|