@salesmind-ai/design-system 0.2.1 → 0.3.1
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 +32 -2
- package/dist/AppearancePanel-UT57J69V.d.cts +51 -0
- package/dist/AppearancePanel-UT57J69V.d.ts +51 -0
- package/dist/AppearanceProvider-C36a8-eb.d.cts +45 -0
- package/dist/AppearanceProvider-C36a8-eb.d.ts +45 -0
- package/dist/Breadcrumb-RX-B_gDV.d.cts +44 -0
- package/dist/Breadcrumb-RX-B_gDV.d.ts +44 -0
- package/dist/ExportMenu-A2TLFiVv.d.cts +311 -0
- package/dist/ExportMenu-C8qck5AT.d.ts +311 -0
- package/dist/SectionShell-BfBw5q0Y.d.cts +18 -0
- package/dist/SectionShell-BfBw5q0Y.d.ts +18 -0
- package/dist/Select-BdZmK0Lt.d.cts +66 -0
- package/dist/Select-BdZmK0Lt.d.ts +66 -0
- package/dist/admin/index.cjs +2941 -0
- package/dist/admin/index.cjs.map +1 -0
- package/dist/admin/index.css +4145 -0
- package/dist/admin/index.css.map +1 -0
- package/dist/admin/index.d.cts +491 -0
- package/dist/admin/index.d.ts +491 -0
- package/dist/admin/index.js +2918 -0
- package/dist/admin/index.js.map +1 -0
- package/dist/{audit-CiyPkxk1.d.cts → audit-BS2fn7M4.d.ts} +2 -51
- package/dist/{audit-CiyPkxk1.d.ts → audit-DwCmg32J.d.cts} +2 -51
- package/dist/blog/index.cjs +1074 -0
- package/dist/blog/index.cjs.map +1 -0
- package/dist/blog/index.css +1422 -0
- package/dist/blog/index.css.map +1 -0
- package/dist/blog/index.d.cts +233 -0
- package/dist/blog/index.d.ts +233 -0
- package/dist/blog/index.js +1056 -0
- package/dist/blog/index.js.map +1 -0
- package/dist/chart-types-BGVVO-zl.d.cts +208 -0
- package/dist/chart-types-BGVVO-zl.d.ts +208 -0
- package/dist/charts/index.cjs +2698 -0
- package/dist/charts/index.cjs.map +1 -0
- package/dist/charts/index.css +1167 -0
- package/dist/charts/index.css.map +1 -0
- package/dist/charts/index.d.cts +453 -0
- package/dist/charts/index.d.ts +453 -0
- package/dist/charts/index.js +2682 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/core/index.cjs +526 -395
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.css +294 -0
- package/dist/core/index.css.map +1 -1
- package/dist/core/index.d.cts +7 -982
- package/dist/core/index.d.ts +7 -982
- package/dist/core/index.js +476 -351
- package/dist/core/index.js.map +1 -1
- package/dist/i18n/index.cjs +585 -0
- package/dist/i18n/index.cjs.map +1 -0
- package/dist/i18n/index.d.cts +855 -0
- package/dist/i18n/index.d.ts +855 -0
- package/dist/i18n/index.js +547 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/index.cjs +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +11 -7
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +22 -1290
- package/dist/index.d.ts +22 -1290
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/marketing/index.cjs +2144 -3023
- package/dist/marketing/index.cjs.map +1 -1
- package/dist/marketing/index.css +3729 -4824
- package/dist/marketing/index.css.map +1 -1
- package/dist/marketing/index.d.cts +1351 -4
- package/dist/marketing/index.d.ts +1351 -4
- package/dist/marketing/index.js +2190 -3054
- package/dist/marketing/index.js.map +1 -1
- package/dist/motion/index.cjs +1230 -0
- package/dist/motion/index.cjs.map +1 -0
- package/dist/motion/index.css +699 -0
- package/dist/motion/index.css.map +1 -0
- package/dist/motion/index.d.cts +68 -0
- package/dist/motion/index.d.ts +68 -0
- package/dist/motion/index.js +1218 -0
- package/dist/motion/index.js.map +1 -0
- package/dist/nav/index.cjs +1533 -0
- package/dist/nav/index.cjs.map +1 -0
- package/dist/nav/index.css +1984 -0
- package/dist/nav/index.css.map +1 -0
- package/dist/nav/index.d.cts +279 -0
- package/dist/nav/index.d.ts +279 -0
- package/dist/nav/index.js +1501 -0
- package/dist/nav/index.js.map +1 -0
- package/dist/report/index.cjs +26 -1649
- package/dist/report/index.cjs.map +1 -1
- package/dist/report/index.css +0 -963
- package/dist/report/index.css.map +1 -1
- package/dist/report/index.d.cts +4 -2
- package/dist/report/index.d.ts +4 -2
- package/dist/report/index.js +27 -1640
- package/dist/report/index.js.map +1 -1
- package/dist/sections/index.cjs +385 -0
- package/dist/sections/index.cjs.map +1 -0
- package/dist/sections/index.css +815 -0
- package/dist/sections/index.css.map +1 -0
- package/dist/sections/index.d.cts +69 -0
- package/dist/sections/index.d.ts +69 -0
- package/dist/sections/index.js +374 -0
- package/dist/sections/index.js.map +1 -0
- package/dist/social-proof/index.cjs +1255 -0
- package/dist/social-proof/index.cjs.map +1 -0
- package/dist/social-proof/index.css +1423 -0
- package/dist/social-proof/index.css.map +1 -0
- package/dist/social-proof/index.d.cts +258 -0
- package/dist/social-proof/index.d.ts +258 -0
- package/dist/social-proof/index.js +1238 -0
- package/dist/social-proof/index.js.map +1 -0
- package/dist/theme/index.cjs +573 -0
- package/dist/theme/index.cjs.map +1 -0
- package/dist/theme/index.css +464 -0
- package/dist/theme/index.css.map +1 -0
- package/dist/theme/index.d.cts +48 -0
- package/dist/theme/index.d.ts +48 -0
- package/dist/theme/index.js +558 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/types-DAlgDGzw.d.cts +52 -0
- package/dist/types-DAlgDGzw.d.ts +52 -0
- package/dist/web/client/index.cjs +501 -0
- package/dist/web/client/index.cjs.map +1 -0
- package/dist/web/client/index.css +456 -0
- package/dist/web/client/index.css.map +1 -0
- package/dist/web/client/index.d.cts +172 -0
- package/dist/web/client/index.d.ts +172 -0
- package/dist/web/client/index.js +486 -0
- package/dist/web/client/index.js.map +1 -0
- package/dist/web/index.d.cts +6 -893
- package/dist/web/index.d.ts +6 -893
- package/dist/web/server/index.cjs +569 -0
- package/dist/web/server/index.cjs.map +1 -0
- package/dist/web/server/index.d.cts +725 -0
- package/dist/web/server/index.d.ts +725 -0
- package/dist/web/server/index.js +562 -0
- package/dist/web/server/index.js.map +1 -0
- package/package.json +81 -9
- package/dist/ExportMenu-hEe5MhLq.d.cts +0 -1027
- package/dist/ExportMenu-hEe5MhLq.d.ts +0 -1027
- package/dist/index-B64suAAc.d.cts +0 -1498
- package/dist/index-B64suAAc.d.ts +0 -1498
package/dist/report/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/report-engine/constants.ts","../../src/report-engine/confidence.ts","../../src/report-engine/context.tsx","../../src/report-engine/chart-types.ts","../../src/report-engine/validation.ts","../../src/components/ReportShell/ReportShell.tsx","../../src/components/ExecutiveThesis/ExecutiveThesis.tsx","../../src/components/InsightBlock/InsightBlock.tsx","../../src/components/EvidenceGroup/EvidenceGroup.tsx","../../src/components/ConfidenceIndicator/ConfidenceIndicator.tsx","../../src/components/DataCoverageBadge/DataCoverageBadge.tsx","../../src/components/DataStateIndicator/DataStateIndicator.tsx","../../src/components/MethodologyNote/MethodologyNote.tsx","../../src/components/CaveatBlock/CaveatBlock.tsx","../../src/components/KeyMetric/KeyMetric.tsx","../../src/components/TrendIndicator/TrendIndicator.tsx","../../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/Tooltip/Tooltip.tsx","../../src/components/Chart/Chart.tsx","../../src/components/Chart/ChartSwitchControl.tsx","../../src/components/MBTIRadar/MBTIRadar.tsx","../../src/components/MBTITypeGrid/MBTITypeGrid.tsx","../../src/components/Select/Select.tsx","../../src/components/ExportMenu/ExportMenu.tsx","../../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["React","getComponentName","isChart","jsx","clsx","jsxs","Fragment","useMemo","XAxis","YAxis","CartesianGrid","Tooltip","Legend","DEFAULT_COLORS","Cell","Line","Bar","Pie","ResponsiveContainer"],"mappings":"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","sourcesContent":["/* ============================================================================\n REPORT ENGINE — CONSTANTS & CONFIGURATION\n ============================================================================ */\n\nimport type {\n ReportModeConfig,\n ConfidenceThreshold,\n InsightTypeContract,\n InsightType,\n} from './types';\n\n/**\n * Executive mode configuration - minimal detail, boardroom-ready.\n */\nexport const EXECUTIVE_MODE: ReportModeConfig = {\n mode: 'executive',\n features: {\n showMethodology: false,\n showConfidenceScores: false,\n showRawData: false,\n showStatisticalTests: false,\n chartDetailLevel: 'summary',\n maxInsightsShown: 5,\n allowDrilldown: false,\n },\n};\n\n/**\n * Analyst mode configuration - full detail, internal use.\n */\nexport const ANALYST_MODE: ReportModeConfig = {\n mode: 'analyst',\n features: {\n showMethodology: true,\n showConfidenceScores: true,\n showRawData: true,\n showStatisticalTests: true,\n chartDetailLevel: 'detailed',\n maxInsightsShown: 20,\n allowDrilldown: true,\n },\n};\n\n/**\n * Confidence level thresholds.\n */\nexport const CONFIDENCE_THRESHOLDS: ConfidenceThreshold[] = [\n { level: 'high', min: 90, max: 100, label: 'High Confidence', color: 'var(--status-success)' },\n {\n level: 'moderate',\n min: 70,\n max: 89,\n label: 'Moderate Confidence',\n color: 'var(--status-info)',\n },\n { level: 'low', min: 50, max: 69, label: 'Low Confidence', color: 'var(--status-warning)' },\n {\n level: 'insufficient',\n min: 0,\n max: 49,\n label: 'Insufficient Data',\n color: 'var(--status-error)',\n },\n];\n\n/**\n * Minimum sample sizes for different analysis types.\n */\nexport const MINIMUM_SAMPLE_SIZES = {\n overall: 30,\n segment: 30,\n mbtiType: 50,\n correlation: 100,\n timeSeries: 7,\n} as const;\n\n/**\n * Insight type contracts defining allowed charts and requirements.\n */\nexport const INSIGHT_TYPE_CONTRACTS: Record<InsightType, InsightTypeContract> = {\n 'performance-delta': {\n type: 'performance-delta',\n allowedCharts: ['BarChart', 'LineChart', 'KeyMetric'],\n requiredFields: ['metric_name', 'current_value', 'previous_value', 'time_period'],\n minSampleSize: 30,\n headlinePattern: '{metric} {direction} by {delta}% {timeframe}',\n recommendationFormats: ['maintain-strategy', 'investigate-decline', 'scale-success'],\n },\n 'behavioral-correlation': {\n type: 'behavioral-correlation',\n allowedCharts: ['HeatmapChart', 'BarChart'],\n requiredFields: ['variable_a', 'variable_b', 'correlation_coefficient'],\n minSampleSize: 100,\n headlinePattern: '{variable_a} correlates with {variable_b}',\n recommendationFormats: ['leverage-correlation', 'investigate-causation'],\n },\n 'funnel-leakage': {\n type: 'funnel-leakage',\n allowedCharts: ['FunnelChart', 'BarChart'],\n requiredFields: ['stages', 'stage_counts', 'drop_rates'],\n minSampleSize: 50,\n headlinePattern: '{drop_rate}% drop-off at {stage}',\n recommendationFormats: ['optimize-stage', 'remove-friction'],\n },\n 'audience-mismatch': {\n type: 'audience-mismatch',\n allowedCharts: ['BarChart', 'PieChart'],\n requiredFields: ['target_audience', 'actual_audience', 'overlap_percentage'],\n minSampleSize: 50,\n headlinePattern: 'Target audience differs by {mismatch}%',\n recommendationFormats: ['refine-targeting', 'expand-audience'],\n },\n 'message-fatigue': {\n type: 'message-fatigue',\n allowedCharts: ['LineChart', 'BarChart'],\n requiredFields: ['message_sequence', 'engagement_rates', 'fatigue_point'],\n minSampleSize: 100,\n headlinePattern: 'Engagement drops {drop}% after message {n}',\n recommendationFormats: ['reduce-frequency', 'vary-content'],\n },\n 'psychological-resonance': {\n type: 'psychological-resonance',\n allowedCharts: ['MBTIRadar', 'MBTITypeGrid', 'BarChart'],\n requiredFields: ['mbti_types', 'response_rates', 'message_type'],\n minSampleSize: 50,\n headlinePattern: '{mbti_type} responds {rate}% better to {message_type}',\n recommendationFormats: ['personalize-messaging', 'segment-by-type'],\n },\n 'timing-pattern': {\n type: 'timing-pattern',\n allowedCharts: ['HeatmapChart', 'LineChart'],\n requiredFields: ['time_slots', 'engagement_rates'],\n minSampleSize: 100,\n headlinePattern: 'Best engagement on {day} at {time}',\n recommendationFormats: ['optimize-timing', 'schedule-sends'],\n },\n 'segment-outperformance': {\n type: 'segment-outperformance',\n allowedCharts: ['BarChart', 'KeyMetric'],\n requiredFields: ['segments', 'performance_metrics', 'baseline'],\n minSampleSize: 30,\n headlinePattern: '{segment} outperforms by {delta}%',\n recommendationFormats: ['double-down', 'investigate-success'],\n },\n 'anomaly-detection': {\n type: 'anomaly-detection',\n allowedCharts: ['LineChart', 'BarChart'],\n requiredFields: ['metric', 'expected_value', 'actual_value', 'deviation'],\n minSampleSize: 30,\n headlinePattern: 'Unusual {direction} in {metric}',\n recommendationFormats: ['investigate', 'monitor'],\n },\n 'competitive-benchmark': {\n type: 'competitive-benchmark',\n allowedCharts: ['BarChart', 'KeyMetric'],\n requiredFields: ['metric', 'our_value', 'benchmark_value'],\n minSampleSize: 30,\n headlinePattern: '{position} industry benchmark by {delta}%',\n recommendationFormats: ['maintain-lead', 'close-gap'],\n },\n};\n\n/**\n * Analytical state metadata for UI rendering.\n */\nexport const ANALYTICAL_STATE_CONFIG = {\n VALID: {\n label: 'Valid',\n icon: 'check',\n color: 'var(--status-success)',\n action: null,\n },\n INSUFFICIENT_SAMPLE: {\n label: 'Insufficient Sample',\n icon: 'alert-triangle',\n color: 'var(--status-warning)',\n action: 'Add more data',\n },\n LOW_CONFIDENCE: {\n label: 'Low Confidence',\n icon: 'alert-circle',\n color: 'var(--status-warning)',\n action: 'Interpret with caution',\n },\n PARTIAL_TIME_WINDOW: {\n label: 'Partial Data',\n icon: 'clock',\n color: 'var(--status-info)',\n action: 'Expand date range',\n },\n DATA_SKEW_DETECTED: {\n label: 'Data Skew',\n icon: 'bar-chart-2',\n color: 'var(--status-warning)',\n action: 'Review methodology',\n },\n CONFLICTING_SIGNALS: {\n label: 'Conflicting Signals',\n icon: 'git-merge',\n color: 'var(--status-error)',\n action: 'Manual review needed',\n },\n INFERRED_NOT_OBSERVED: {\n label: 'AI Generated',\n icon: 'cpu',\n color: 'var(--status-info)',\n action: 'Verify with data',\n },\n STALE_DATA: {\n label: 'Stale Data',\n icon: 'clock',\n color: 'var(--status-warning)',\n action: 'Refresh data',\n },\n FIELD_MISSING: {\n label: 'Missing Field',\n icon: 'file-x',\n color: 'var(--status-error)',\n action: 'Upload complete data',\n },\n CALCULATION_ERROR: {\n label: 'Calculation Error',\n icon: 'x-circle',\n color: 'var(--status-error)',\n action: 'Contact support',\n },\n} as const;\n","/* ============================================================================\n REPORT ENGINE — CONFIDENCE SCORING\n ============================================================================ */\n\nimport type { ConfidenceLevel } from './types';\nimport { CONFIDENCE_THRESHOLDS } from './constants';\n\nexport interface ConfidenceParams {\n sampleSize: number;\n requiredSize: number;\n completeness: number; // 0-1: percentage of non-null fields\n recency: number; // 0-1: how recent the data is\n variance: number; // 0-1: normalized variance (higher = worse)\n aiInference: boolean; // Whether AI generated the insight\n}\n\n/**\n * Calculate confidence score based on data quality factors.\n * Returns a score from 0-100.\n */\nexport function calculateConfidence(params: ConfidenceParams): number {\n const { sampleSize, requiredSize, completeness, recency, variance, aiInference } = params;\n\n // Base score from sample size (0-40 points)\n const sampleScore = Math.min(40, (sampleSize / requiredSize) * 40);\n\n // Completeness bonus (0-20 points)\n const completenessScore = completeness * 20;\n\n // Recency bonus (0-20 points)\n const recencyScore = recency * 20;\n\n // Variance penalty (0-10 points deducted for high variance)\n const variancePenalty = variance * 10;\n\n // AI inference penalty (10 points if AI-generated)\n const aiPenalty = aiInference ? 10 : 0;\n\n const rawScore = sampleScore + completenessScore + recencyScore - variancePenalty - aiPenalty;\n\n return Math.max(0, Math.min(100, Math.round(rawScore)));\n}\n\n/**\n * Get confidence level from score.\n */\nexport function getConfidenceLevel(score: number): ConfidenceLevel {\n const threshold = CONFIDENCE_THRESHOLDS.find((t) => score >= t.min && score <= t.max);\n return threshold?.level ?? 'insufficient';\n}\n\n/**\n * Get confidence threshold config from score.\n */\nexport function getConfidenceThreshold(score: number) {\n return (\n CONFIDENCE_THRESHOLDS.find((t) => score >= t.min && score <= t.max) ??\n CONFIDENCE_THRESHOLDS[CONFIDENCE_THRESHOLDS.length - 1]\n );\n}\n\n/**\n * Calculate recency score based on data age.\n * @param dataDate - The date of the most recent data point\n * @param maxAgeDays - Maximum acceptable age in days (default 30)\n */\nexport function calculateRecency(dataDate: Date, maxAgeDays = 30): number {\n const now = new Date();\n const ageInDays = (now.getTime() - dataDate.getTime()) / (1000 * 60 * 60 * 24);\n\n if (ageInDays <= 0) return 1;\n if (ageInDays >= maxAgeDays) return 0;\n\n return 1 - ageInDays / maxAgeDays;\n}\n\n/**\n * Calculate data completeness from an array of records.\n * @param data - Array of data objects\n * @param requiredFields - Fields to check for completeness\n */\nexport function calculateCompleteness(\n data: Record<string, unknown>[],\n requiredFields: string[],\n): number {\n if (data.length === 0 || requiredFields.length === 0) return 0;\n\n let totalFields = 0;\n let filledFields = 0;\n\n for (const record of data) {\n for (const field of requiredFields) {\n totalFields++;\n const value = record[field];\n if (value !== null && value !== undefined && value !== '') {\n filledFields++;\n }\n }\n }\n\n return totalFields > 0 ? filledFields / totalFields : 0;\n}\n\n/**\n * Calculate normalized variance for a numeric dataset.\n * Returns 0-1 where 0 is low variance and 1 is high variance.\n */\nexport function calculateNormalizedVariance(values: number[]): number {\n if (values.length < 2) return 0;\n\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));\n const variance = squaredDiffs.reduce((a, b) => a + b, 0) / values.length;\n const stdDev = Math.sqrt(variance);\n\n // Coefficient of variation (CV) normalized to 0-1\n // CV > 1 is considered high variance\n const cv = mean !== 0 ? stdDev / Math.abs(mean) : 0;\n\n return Math.min(1, cv);\n}\n","/* ============================================================================\n REPORT ENGINE — CONTEXT & HOOKS\n ============================================================================ */\n\n/* eslint-disable react-refresh/only-export-components */\n// This is a library file exporting hooks alongside providers - fast refresh doesn't apply\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { ReportMode, ReportModeConfig, AnalyticalState, DataStateDetails } from './types';\nimport { EXECUTIVE_MODE, ANALYST_MODE, MINIMUM_SAMPLE_SIZES } from './constants';\nimport { calculateConfidence, getConfidenceLevel, type ConfidenceParams } from './confidence';\n\n/* --------------------------------------------------------------------------\n Report Mode Context\n -------------------------------------------------------------------------- */\n\ninterface ReportModeContextValue extends ReportModeConfig {\n setMode?: (mode: ReportMode) => void;\n}\n\nconst ReportModeContext = createContext<ReportModeContextValue | null>(null);\n\nexport interface ReportModeProviderProps {\n mode?: ReportMode;\n children: React.ReactNode;\n onModeChange?: (mode: ReportMode) => void;\n}\n\n/**\n * Provider for report mode context.\n * Wrap your report with this to control executive vs analyst mode.\n */\nexport function ReportModeProvider({\n mode = 'executive',\n children,\n onModeChange,\n}: ReportModeProviderProps) {\n const config = mode === 'executive' ? EXECUTIVE_MODE : ANALYST_MODE;\n\n const value = useMemo(\n () => ({\n ...config,\n setMode: onModeChange,\n }),\n [config, onModeChange],\n );\n\n return <ReportModeContext.Provider value={value}>{children}</ReportModeContext.Provider>;\n}\n\n/**\n * Hook to access report mode configuration.\n */\nexport function useReportMode(): ReportModeContextValue {\n const context = useContext(ReportModeContext);\n\n if (!context) {\n // Return default executive mode if used outside provider\n return EXECUTIVE_MODE;\n }\n\n return context;\n}\n\n/* --------------------------------------------------------------------------\n Data State Hook\n -------------------------------------------------------------------------- */\n\nexport interface UseDataStateParams {\n sampleSize: number;\n requiredSize?: number;\n completeness?: number;\n recency?: number;\n variance?: number;\n aiInferred?: boolean;\n missingFields?: string[];\n staleDays?: number;\n}\n\nexport interface UseDataStateResult {\n state: AnalyticalState;\n confidence: number;\n confidenceLevel: ReturnType<typeof getConfidenceLevel>;\n details: DataStateDetails;\n isValid: boolean;\n}\n\n/**\n * Hook to compute analytical state from data parameters.\n */\nexport function useDataState(params: UseDataStateParams): UseDataStateResult {\n const {\n sampleSize,\n requiredSize = MINIMUM_SAMPLE_SIZES.overall,\n completeness = 1,\n recency = 1,\n variance = 0,\n aiInferred = false,\n missingFields = [],\n staleDays,\n } = params;\n\n return useMemo(() => {\n // Calculate confidence\n const confidenceParams: ConfidenceParams = {\n sampleSize,\n requiredSize,\n completeness,\n recency,\n variance,\n aiInference: aiInferred,\n };\n\n const confidence = calculateConfidence(confidenceParams);\n const confidenceLevel = getConfidenceLevel(confidence);\n\n // Determine analytical state\n let state: AnalyticalState = 'VALID';\n\n if (missingFields.length > 0) {\n state = 'FIELD_MISSING';\n } else if (sampleSize < requiredSize) {\n state = 'INSUFFICIENT_SAMPLE';\n } else if (staleDays && staleDays > 30) {\n state = 'STALE_DATA';\n } else if (aiInferred) {\n state = 'INFERRED_NOT_OBSERVED';\n } else if (confidence < 50) {\n state = 'LOW_CONFIDENCE';\n } else if (variance > 0.7) {\n state = 'DATA_SKEW_DETECTED';\n } else if (recency < 0.3) {\n state = 'PARTIAL_TIME_WINDOW';\n }\n\n const details: DataStateDetails = {\n sampleSize,\n requiredSize,\n confidence,\n missingFields: missingFields.length > 0 ? missingFields : undefined,\n staleDays,\n };\n\n return {\n state,\n confidence,\n confidenceLevel,\n details,\n isValid: state === 'VALID',\n };\n }, [\n sampleSize,\n requiredSize,\n completeness,\n recency,\n variance,\n aiInferred,\n missingFields,\n staleDays,\n ]);\n}\n\n/* --------------------------------------------------------------------------\n Chart Data Validation Hook\n -------------------------------------------------------------------------- */\n\nexport interface UseChartDataParams<T> {\n data: T[];\n requiredFields: string[];\n minSampleSize?: number;\n insightType?: string;\n}\n\nexport interface UseChartDataResult<T> {\n data: T[];\n state: AnalyticalState;\n confidence: number;\n isRenderable: boolean;\n message?: string;\n}\n\n/**\n * Hook to validate chart data against data contracts.\n */\nexport function useChartData<T extends Record<string, unknown>>({\n data,\n requiredFields,\n minSampleSize = MINIMUM_SAMPLE_SIZES.overall,\n}: UseChartDataParams<T>): UseChartDataResult<T> {\n return useMemo(() => {\n // Check for missing required fields\n const missingFields: string[] = [];\n if (data.length > 0) {\n const firstRecord = data[0];\n for (const field of requiredFields) {\n if (!(field in firstRecord)) {\n missingFields.push(field);\n }\n }\n }\n\n // Calculate completeness\n let completeness = 1;\n if (data.length > 0 && requiredFields.length > 0) {\n let filled = 0;\n let total = 0;\n for (const record of data) {\n for (const field of requiredFields) {\n total++;\n const value = record[field];\n if (value !== null && value !== undefined && value !== '') {\n filled++;\n }\n }\n }\n completeness = total > 0 ? filled / total : 0;\n }\n\n // Determine state\n let state: AnalyticalState = 'VALID';\n let message: string | undefined;\n\n if (missingFields.length > 0) {\n state = 'FIELD_MISSING';\n message = `Missing fields: ${missingFields.join(', ')}`;\n } else if (data.length === 0) {\n state = 'INSUFFICIENT_SAMPLE';\n message = 'No data available';\n } else if (data.length < minSampleSize) {\n state = 'INSUFFICIENT_SAMPLE';\n message = `Sample size ${data.length} is below minimum ${minSampleSize}`;\n } else if (completeness < 0.7) {\n state = 'LOW_CONFIDENCE';\n message = `Data completeness is ${Math.round(completeness * 100)}%`;\n }\n\n // Calculate confidence\n const confidence = calculateConfidence({\n sampleSize: data.length,\n requiredSize: minSampleSize,\n completeness,\n recency: 1, // Assume fresh data if not specified\n variance: 0,\n aiInference: false,\n });\n\n const isRenderable = state === 'VALID' || state === 'LOW_CONFIDENCE';\n\n return {\n data,\n state,\n confidence,\n isRenderable,\n message,\n };\n }, [data, requiredFields, minSampleSize]);\n}\n","/* ============================================================================\n CHART ABSTRACTION LAYER — TYPE DEFINITIONS & CONTRACTS\n \n This module defines the governed chart system with:\n - Chart taxonomy (semantic families)\n - Data contracts per chart type\n - Switching rules\n - Guardrails and fallback behaviors\n ============================================================================ */\n\n/* ============================================================================\n CHART INTENT (Semantic Families)\n ============================================================================ */\n\n/**\n * Chart intent defines the semantic purpose of visualization.\n * This is the primary classifier that governs switching rules.\n */\nexport type ChartIntent =\n | 'trend' // Time-based evolution, deltas, momentum\n | 'comparison' // Comparing discrete categories\n | 'composition' // Proportions and distributions\n | 'distribution' // Statistical spread and density\n | 'relationship' // Correlation and clustering\n | 'geo'; // Geographic data\n\n/* ============================================================================\n CHART TYPE TAXONOMY\n ============================================================================ */\n\n/**\n * All supported chart types organized by intent.\n */\n\n// Trend charts (time-based)\nexport type TrendChartType = 'line' | 'smooth_line' | 'area' | 'stacked_area' | 'area_100pct';\n\n// Comparison charts (categorical)\nexport type ComparisonChartType =\n | 'bar'\n | 'column'\n | 'stacked_bar'\n | 'stacked_column'\n | 'column_100pct'\n | 'combo'; // Phase 2\n\n// Composition charts\nexport type CompositionChartType = 'pie' | 'donut' | 'treemap'; // Phase 2\n\n// Distribution charts\nexport type DistributionChartType = 'histogram' | 'radar'; // Phase 2\n\n// Relationship charts\nexport type RelationshipChartType =\n | 'scatter' // Phase 2\n | 'bubble' // Phase 2\n | 'heatmap';\n\n// Geographic charts\nexport type GeoChartType =\n | 'geo' // Phase 2\n | 'choropleth'; // Phase 2\n\n/**\n * Union of all chart types\n */\nexport type ChartTypeId =\n | TrendChartType\n | ComparisonChartType\n | CompositionChartType\n | DistributionChartType\n | RelationshipChartType\n | GeoChartType\n | 'funnel' // Special: conversion flows\n | 'waterfall' // Phase 2: sequential changes\n | 'timeline'; // Phase 2: event sequences\n\n/**\n * Chart phase classification\n */\nexport type ChartPhase = 'mvp' | 'phase2' | 'phase3';\n\n/* ============================================================================\n CHART METADATA & REGISTRY\n ============================================================================ */\n\nexport interface ChartTypeMetadata {\n id: ChartTypeId;\n name: string;\n description: string;\n intent: ChartIntent;\n phase: ChartPhase;\n\n // Data requirements\n contract: ChartDataContract;\n\n // Allowed switches within same intent\n switchableTo: ChartTypeId[];\n\n // Visual configuration\n supportsStacking: boolean;\n supportsMultipleSeries: boolean;\n requiresTimeAxis: boolean;\n maxCategories?: number;\n maxSlices?: number;\n}\n\nexport interface ChartDataContract {\n // Required data shape\n requiredDimensions: number; // e.g., 1 for pie, 2 for scatter\n requiredMeasures: number; // Number of numeric fields required\n\n // Sample size requirements\n minDataPoints: number;\n idealDataPoints: number;\n maxDataPoints?: number;\n\n // Value constraints\n allowNegativeValues: boolean;\n requireNonZeroTotal: boolean;\n\n // Warnings\n warningThresholds: {\n tooManyCategories?: number;\n imbalancedRatio?: number;\n sparseData?: number;\n };\n\n // Fallback behavior\n fallback: ChartFallbackBehavior;\n}\n\nexport type ChartFallbackBehavior =\n | { type: 'hide' }\n | { type: 'show_kpi'; message: string }\n | { type: 'aggregate'; strategy: 'other_bucket' | 'top_n' }\n | { type: 'warn'; message: string };\n\n/* ============================================================================\n CHART REGISTRY (Canonical List)\n ============================================================================ */\n\nexport const CHART_REGISTRY: Record<ChartTypeId, ChartTypeMetadata> = {\n // ══════════════════════════════════════════════════════════════════════════\n // TREND CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n line: {\n id: 'line',\n name: 'Line Chart',\n description: 'Shows trends over time with connected data points',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for trend visualization' },\n },\n switchableTo: ['smooth_line', 'area', 'stacked_area'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n smooth_line: {\n id: 'smooth_line',\n name: 'Smooth Line Chart',\n description: 'Curved line chart for smoother trend visualization',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for trend visualization' },\n },\n switchableTo: ['line', 'area', 'stacked_area'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n area: {\n id: 'area',\n name: 'Area Chart',\n description: 'Filled area under line, emphasizes volume over time',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for area visualization' },\n },\n switchableTo: ['line', 'smooth_line', 'stacked_area', 'area_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n stacked_area: {\n id: 'stacked_area',\n name: 'Stacked Area Chart',\n description: 'Multiple series stacked to show cumulative trends',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'warn', message: 'Stacked area requires non-negative values' },\n },\n switchableTo: ['line', 'area', 'area_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n area_100pct: {\n id: 'area_100pct',\n name: '100% Stacked Area',\n description: 'Shows proportional contribution over time',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'warn', message: '100% stacked requires positive totals' },\n },\n switchableTo: ['stacked_area', 'area'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // COMPARISON CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n bar: {\n id: 'bar',\n name: 'Horizontal Bar Chart',\n description: 'Horizontal bars for comparing categories',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 15,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 12 },\n fallback: { type: 'aggregate', strategy: 'top_n' },\n },\n switchableTo: ['column', 'stacked_bar', 'stacked_column'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n column: {\n id: 'column',\n name: 'Vertical Column Chart',\n description: 'Vertical bars for comparing categories',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 12,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 10 },\n fallback: { type: 'aggregate', strategy: 'top_n' },\n },\n switchableTo: ['bar', 'stacked_column', 'stacked_bar'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n stacked_bar: {\n id: 'stacked_bar',\n name: 'Stacked Horizontal Bar',\n description: 'Horizontal stacked bars showing composition per category',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 8, imbalancedRatio: 0.9 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['bar', 'stacked_column', 'column_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n stacked_column: {\n id: 'stacked_column',\n name: 'Stacked Vertical Column',\n description: 'Vertical stacked columns showing composition per category',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 8, imbalancedRatio: 0.9 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['column', 'stacked_bar', 'column_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n column_100pct: {\n id: 'column_100pct',\n name: '100% Stacked Column',\n description: 'Shows proportional composition per category',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 8 },\n fallback: { type: 'warn', message: '100% stacked requires positive totals' },\n },\n switchableTo: ['stacked_column', 'stacked_bar'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n combo: {\n id: 'combo',\n name: 'Combo Chart',\n description: 'Combines bars with line overlay (Phase 2)',\n intent: 'comparison',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 3,\n idealDataPoints: 6,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 10 },\n fallback: { type: 'warn', message: 'Combo chart requires dual measures' },\n },\n switchableTo: ['column', 'line'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // COMPOSITION CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n pie: {\n id: 'pie',\n name: 'Pie Chart',\n description: 'Shows proportional composition of a whole',\n intent: 'composition',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 4,\n maxDataPoints: 6,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 6, imbalancedRatio: 0.95 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['donut', 'column_100pct'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n maxSlices: 6,\n },\n\n donut: {\n id: 'donut',\n name: 'Donut Chart',\n description: 'Pie chart with center cutout, can display total',\n intent: 'composition',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 4,\n maxDataPoints: 6,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 6, imbalancedRatio: 0.95 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['pie', 'column_100pct'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n maxSlices: 6,\n },\n\n treemap: {\n id: 'treemap',\n name: 'Treemap',\n description: 'Nested rectangles showing hierarchical composition (Phase 2)',\n intent: 'composition',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 10,\n maxDataPoints: 50,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 30 },\n fallback: { type: 'aggregate', strategy: 'top_n' },\n },\n switchableTo: ['pie', 'donut'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // DISTRIBUTION CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n histogram: {\n id: 'histogram',\n name: 'Histogram',\n description: 'Shows distribution of values across bins',\n intent: 'distribution',\n phase: 'mvp',\n contract: {\n requiredDimensions: 0,\n requiredMeasures: 1,\n minDataPoints: 10,\n idealDataPoints: 50,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 10 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for distribution' },\n },\n switchableTo: ['radar'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n radar: {\n id: 'radar',\n name: 'Radar Chart',\n description: 'Multi-dimensional comparison in radial layout (Phase 2)',\n intent: 'distribution',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 3,\n minDataPoints: 3,\n idealDataPoints: 6,\n maxDataPoints: 8,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 8 },\n fallback: { type: 'warn', message: 'Radar works best with 3-8 dimensions' },\n },\n switchableTo: ['histogram'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // RELATIONSHIP CHARTS\n // ══════════════════════════════════════════════════════════════════════════\n heatmap: {\n id: 'heatmap',\n name: 'Heatmap',\n description: 'Color-coded matrix showing intensity',\n intent: 'relationship',\n phase: 'mvp',\n contract: {\n requiredDimensions: 2,\n requiredMeasures: 1,\n minDataPoints: 9,\n idealDataPoints: 25,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 9 },\n fallback: { type: 'warn', message: 'Heatmap requires grid data' },\n },\n switchableTo: ['scatter'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n scatter: {\n id: 'scatter',\n name: 'Scatter Plot',\n description: 'Shows correlation between two variables (Phase 2)',\n intent: 'relationship',\n phase: 'phase2',\n contract: {\n requiredDimensions: 0,\n requiredMeasures: 2,\n minDataPoints: 20,\n idealDataPoints: 100,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 20 },\n fallback: { type: 'show_kpi', message: 'Scatter requires 20+ points' },\n },\n switchableTo: ['bubble', 'heatmap'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n bubble: {\n id: 'bubble',\n name: 'Bubble Chart',\n description: 'Scatter with sized points for third dimension (Phase 2)',\n intent: 'relationship',\n phase: 'phase2',\n contract: {\n requiredDimensions: 0,\n requiredMeasures: 3,\n minDataPoints: 10,\n idealDataPoints: 50,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 10 },\n fallback: { type: 'show_kpi', message: 'Bubble requires 3 measures' },\n },\n switchableTo: ['scatter'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // GEOGRAPHIC CHARTS (Phase 2)\n // ══════════════════════════════════════════════════════════════════════════\n geo: {\n id: 'geo',\n name: 'Geographic Map',\n description: 'Map with regional data markers (Phase 2)',\n intent: 'geo',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1, // geo dimension (country/region)\n requiredMeasures: 1,\n minDataPoints: 1,\n idealDataPoints: 10,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: {},\n fallback: { type: 'hide' },\n },\n switchableTo: ['choropleth'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n choropleth: {\n id: 'choropleth',\n name: 'Choropleth Map',\n description: 'Color-shaded regions by value (Phase 2)',\n intent: 'geo',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 20,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: {},\n fallback: { type: 'hide' },\n },\n switchableTo: ['geo'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // SPECIAL CHARTS\n // ══════════════════════════════════════════════════════════════════════════\n funnel: {\n id: 'funnel',\n name: 'Funnel Chart',\n description: 'Shows conversion through sequential stages',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 5,\n maxDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 7 },\n fallback: { type: 'warn', message: 'Funnel requires sequential stages' },\n },\n switchableTo: ['bar'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n waterfall: {\n id: 'waterfall',\n name: 'Waterfall Chart',\n description: 'Shows cumulative effect of sequential changes (Phase 2)',\n intent: 'comparison',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 6,\n maxDataPoints: 12,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 10 },\n fallback: { type: 'warn', message: 'Waterfall requires sequential data' },\n },\n switchableTo: ['bar', 'column'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n timeline: {\n id: 'timeline',\n name: 'Timeline',\n description: 'Shows events along time axis (Phase 2)',\n intent: 'trend',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 0,\n minDataPoints: 2,\n idealDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: {},\n fallback: { type: 'hide' },\n },\n switchableTo: ['line'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: true,\n },\n};\n\n/* ============================================================================\n CHART FAMILY SWITCHING RULES\n ============================================================================ */\n\n/**\n * Maps intent to allowed chart types for switching.\n * Users can ONLY switch within the same intent family.\n */\nexport const INTENT_CHART_FAMILIES: Record<ChartIntent, ChartTypeId[]> = {\n trend: ['line', 'smooth_line', 'area', 'stacked_area', 'area_100pct'],\n comparison: ['bar', 'column', 'stacked_bar', 'stacked_column', 'column_100pct', 'funnel'],\n composition: ['pie', 'donut'],\n distribution: ['histogram'],\n relationship: ['heatmap'],\n geo: [],\n};\n\n/**\n * Get allowed chart types for switching from a given type.\n */\nexport function getAllowedSwitchTargets(currentType: ChartTypeId): ChartTypeId[] {\n const metadata = CHART_REGISTRY[currentType];\n if (!metadata) return [];\n\n // Only return MVP charts that are in the same family\n return metadata.switchableTo.filter((type) => {\n const targetMeta = CHART_REGISTRY[type];\n return targetMeta && targetMeta.phase === 'mvp';\n });\n}\n\n/**\n * Check if switching from one chart type to another is allowed.\n */\nexport function canSwitchChart(from: ChartTypeId, to: ChartTypeId): boolean {\n const fromMeta = CHART_REGISTRY[from];\n const toMeta = CHART_REGISTRY[to];\n\n if (!fromMeta || !toMeta) return false;\n\n // Must be same intent\n if (fromMeta.intent !== toMeta.intent) return false;\n\n // Must be in allowed list\n return fromMeta.switchableTo.includes(to);\n}\n\n/* ============================================================================\n DATA VALIDATION\n ============================================================================ */\n\nexport interface ChartValidationResult {\n isValid: boolean;\n warnings: string[];\n errors: string[];\n suggestedType?: ChartTypeId;\n fallbackAction?: ChartFallbackBehavior;\n}\n\n/**\n * Validate data against a chart's contract.\n */\nexport function validateChartData(\n chartType: ChartTypeId,\n data: unknown[],\n dimensions: string[],\n measures: string[],\n): ChartValidationResult {\n const metadata = CHART_REGISTRY[chartType];\n if (!metadata) {\n return {\n isValid: false,\n warnings: [],\n errors: [`Unknown chart type: ${chartType}`],\n };\n }\n\n const contract = metadata.contract;\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Check data points\n if (data.length < contract.minDataPoints) {\n errors.push(`Requires at least ${contract.minDataPoints} data points, got ${data.length}`);\n }\n\n if (contract.maxDataPoints && data.length > contract.maxDataPoints) {\n warnings.push(`Chart works best with ≤${contract.maxDataPoints} items. Consider aggregating.`);\n }\n\n // Check dimensions\n if (dimensions.length < contract.requiredDimensions) {\n errors.push(`Requires ${contract.requiredDimensions} dimension(s), got ${dimensions.length}`);\n }\n\n // Check measures\n if (measures.length < contract.requiredMeasures) {\n errors.push(`Requires ${contract.requiredMeasures} measure(s), got ${measures.length}`);\n }\n\n // Check for negative values if not allowed\n if (!contract.allowNegativeValues && data.length > 0) {\n const hasNegative = data.some((row: unknown) => {\n if (typeof row !== 'object' || row === null) return false;\n return measures.some((m) => {\n const val = (row as Record<string, unknown>)[m];\n return typeof val === 'number' && val < 0;\n });\n });\n if (hasNegative) {\n errors.push('This chart type does not support negative values');\n }\n }\n\n // Check warnings\n if (\n contract.warningThresholds.tooManyCategories &&\n data.length > contract.warningThresholds.tooManyCategories\n ) {\n warnings.push(`Too many categories (${data.length}). Consider grouping smaller values.`);\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n fallbackAction: errors.length > 0 ? contract.fallback : undefined,\n };\n}\n\n/* ============================================================================\n CHART SELECTION HELPERS\n ============================================================================ */\n\n/**\n * Get MVP charts for a given intent.\n */\nexport function getMVPChartsForIntent(intent: ChartIntent): ChartTypeMetadata[] {\n return Object.values(CHART_REGISTRY).filter(\n (meta) => meta.intent === intent && meta.phase === 'mvp',\n );\n}\n\n/**\n * Get the default chart type for an intent.\n */\nexport function getDefaultChartForIntent(intent: ChartIntent): ChartTypeId {\n const defaults: Record<ChartIntent, ChartTypeId> = {\n trend: 'line',\n comparison: 'column',\n composition: 'donut',\n distribution: 'histogram',\n relationship: 'heatmap',\n geo: 'geo',\n };\n return defaults[intent];\n}\n\n/**\n * Suggest the best chart type for given data characteristics.\n */\nexport function suggestChartType(params: {\n hasTimeAxis: boolean;\n dimensionCount: number;\n measureCount: number;\n dataPointCount: number;\n hasNegativeValues: boolean;\n isSequential: boolean;\n}): ChartTypeId {\n const {\n hasTimeAxis,\n dimensionCount,\n measureCount,\n dataPointCount,\n hasNegativeValues,\n isSequential,\n } = params;\n\n // Time-based → trend charts\n if (hasTimeAxis && measureCount >= 1) {\n if (measureCount > 1 && !hasNegativeValues) return 'stacked_area';\n return 'line';\n }\n\n // Sequential stages → funnel\n if (isSequential && !hasNegativeValues && dataPointCount <= 7) {\n return 'funnel';\n }\n\n // Single measure, few categories → composition\n if (measureCount === 1 && dataPointCount <= 6 && !hasNegativeValues) {\n return 'donut';\n }\n\n // Two dimensions → heatmap\n if (dimensionCount === 2 && measureCount === 1) {\n return 'heatmap';\n }\n\n // Default to column chart\n return 'column';\n}\n","/* ============================================================================\n REPORT ENGINE — COMPOSITION VALIDATION\n ============================================================================ */\n\nimport React from 'react';\n\nexport interface ValidationIssue {\n ruleId: string;\n severity: 'error' | 'warning';\n message: string;\n component?: string;\n}\n\nexport interface ReportValidationResult {\n isValid: boolean;\n issues: ValidationIssue[];\n}\n\n/**\n * Validates the structure of a report against narrative rules.\n *\n * Rules:\n * - R1: ExecutiveThesis MUST appear exactly once, at the top (or very near top)\n * - R2: InsightBlock MUST precede any chart it references (Charts must be inside or after insights)\n * - R3: Charts CANNOT appear without a parent InsightBlock (Orphan charts)\n * - R6: Max 3 charts per InsightBlock\n */\nexport function validateReportStructure(children: React.ReactNode): ReportValidationResult {\n const issues: ValidationIssue[] = [];\n const childArray = React.Children.toArray(children);\n\n let hasThesis = false;\n let thesisIndex = -1;\n\n // Helper to get component name safely\n const getComponentName = (child: React.ReactNode): string | undefined => {\n if (!React.isValidElement(child)) return undefined;\n\n const type = child.type as { displayName?: string; name?: string };\n return type.displayName || type.name;\n };\n\n const isChart = (name?: string) => {\n return (\n name &&\n (name.endsWith('Chart') ||\n name === 'MBTIRadar' ||\n name === 'MBTITypeGrid' ||\n name === 'KeyMetric') // Metric is evidence too\n );\n };\n\n // First pass: Top-level analysis\n childArray.forEach((child, index) => {\n const name = getComponentName(child);\n\n if (name === 'ExecutiveThesis') {\n if (hasThesis) {\n issues.push({\n ruleId: 'R1',\n severity: 'error',\n message: 'Only one ExecutiveThesis is allowed per report.',\n component: 'ExecutiveThesis',\n });\n }\n hasThesis = true;\n thesisIndex = index;\n }\n\n // Check for orphan charts at root level\n if (isChart(name)) {\n issues.push({\n ruleId: 'R3',\n severity: 'error',\n message: `Orphan chart detected: <${name} />. Charts must be placed inside an InsightBlock or EvidenceGroup.`,\n component: name,\n });\n }\n\n // Check InsightBlock constraints\n if (name === 'InsightBlock' && React.isValidElement(child)) {\n validateInsightBlock(child, issues);\n }\n });\n\n // R1: Check Thesis existence and position\n if (!hasThesis) {\n issues.push({\n ruleId: 'R1',\n severity: 'error',\n message: 'Report must contain an ExecutiveThesis.',\n });\n } else if (thesisIndex > 2) {\n // Allow some spacers/headers before it\n issues.push({\n ruleId: 'R1',\n severity: 'warning',\n message: 'ExecutiveThesis should be the first major component in the report.',\n });\n }\n\n return {\n isValid: issues.filter((i) => i.severity === 'error').length === 0,\n issues,\n };\n}\n\nfunction validateInsightBlock(node: React.ReactElement, issues: ValidationIssue[]) {\n const children = node.props.children;\n const childArray = React.Children.toArray(children);\n\n // Count charts inside this block (recursive check not strictly needed if structure is flat)\n let chartsInBlock = 0;\n\n const countCharts = (nodes: React.ReactNode[]) => {\n nodes.forEach((n) => {\n const name = getComponentName(n);\n if (isChart(name)) {\n chartsInBlock++;\n }\n // Check inside EvidenceGroup\n if (name === 'EvidenceGroup' && React.isValidElement(n)) {\n countCharts(React.Children.toArray(n.props.children));\n }\n });\n };\n\n countCharts(childArray);\n\n // R6: Max 3 charts\n if (chartsInBlock > 3) {\n issues.push({\n ruleId: 'R6',\n severity: 'warning',\n message: `InsightBlock contains ${chartsInBlock} charts. Recommended maximum is 3 to prevent data dumping.`,\n component: 'InsightBlock',\n });\n }\n}\n\n// Duplicate helper for local scope\nconst getComponentName = (child: React.ReactNode): string | undefined => {\n if (!React.isValidElement(child)) return undefined;\n const type = child.type as { displayName?: string; name?: string };\n return type.displayName || type.name;\n};\n\nconst isChart = (name?: string) => {\n return (\n name &&\n (name.endsWith('Chart') ||\n name === 'MBTIRadar' ||\n name === 'MBTITypeGrid' ||\n name === 'KeyMetric')\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport { ReportModeProvider } from '../../report-engine';\nimport type { ReportMode } from '../../report-engine';\nimport './ReportShell.css';\n\nexport interface ReportShellProps {\n /** Report title */\n title?: string;\n /** Report subtitle or date range */\n subtitle?: string;\n /** Report mode (executive = minimal detail, analyst = full detail) */\n mode?: ReportMode;\n /** Brand variant for theming */\n brand?: string;\n /** Callback when mode changes */\n onModeChange?: (mode: ReportMode) => void;\n /** Report content */\n children: React.ReactNode;\n /** Header actions (export, share, etc.) */\n actions?: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ReportShell is the root container for all reports.\n * It provides mode context and establishes the report structure.\n */\nexport const ReportShell = React.forwardRef<HTMLDivElement, ReportShellProps>(\n (\n {\n title,\n subtitle,\n mode = 'executive',\n brand,\n onModeChange,\n children,\n actions,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <ReportModeProvider mode={mode} onModeChange={onModeChange}>\n <div\n ref={ref}\n className={clsx('ds-report-shell', className)}\n data-mode={mode}\n data-brand={brand}\n {...props}\n >\n {(title || subtitle || actions) && (\n <header className=\"ds-report-shell__header\">\n <div className=\"ds-report-shell__header-content\">\n {title && <h1 className=\"ds-report-shell__title\">{title}</h1>}\n {subtitle && <p className=\"ds-report-shell__subtitle\">{subtitle}</p>}\n </div>\n {actions && <div className=\"ds-report-shell__actions\">{actions}</div>}\n </header>\n )}\n <main className=\"ds-report-shell__content\">{children}</main>\n </div>\n </ReportModeProvider>\n );\n },\n);\n\nReportShell.displayName = 'ReportShell';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport './ExecutiveThesis.css';\n\nexport interface ExecutiveThesisProps {\n /** The main thesis statement - the single most important finding */\n thesis: string;\n /** Supporting context for the thesis */\n context?: string;\n /** Key metric supporting the thesis */\n metric?: {\n label: string;\n value: string | number;\n trend?: 'up' | 'down' | 'neutral';\n };\n /** AI-generated indicator */\n aiGenerated?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ExecutiveThesis displays the single most important finding of a report.\n * There should be exactly ONE of these per report, at the top.\n *\n * Composition Rule: R1 - ExecutiveThesis MUST appear exactly once, at the top.\n */\nexport const ExecutiveThesis = React.forwardRef<HTMLElement, ExecutiveThesisProps>(\n ({ thesis, context, metric, aiGenerated, className, ...props }, ref) => {\n const { features } = useReportMode();\n\n return (\n <section\n ref={ref}\n className={clsx('ds-executive-thesis', className)}\n aria-labelledby=\"executive-thesis-title\"\n {...props}\n >\n <div className=\"ds-executive-thesis__content\">\n <h2 id=\"executive-thesis-title\" className=\"ds-executive-thesis__title\">\n Key Finding\n {aiGenerated && features.showConfidenceScores && (\n <span className=\"ds-executive-thesis__ai-badge\">AI Generated</span>\n )}\n </h2>\n <p className=\"ds-executive-thesis__thesis\">{thesis}</p>\n {context && <p className=\"ds-executive-thesis__context\">{context}</p>}\n </div>\n\n {metric && (\n <div className=\"ds-executive-thesis__metric\">\n <span className=\"ds-executive-thesis__metric-label\">{metric.label}</span>\n <span\n className={clsx(\n 'ds-executive-thesis__metric-value',\n metric.trend && `ds-executive-thesis__metric-value--${metric.trend}`,\n )}\n >\n {metric.trend === 'up' && '↑ '}\n {metric.trend === 'down' && '↓ '}\n {metric.value}\n </span>\n </div>\n )}\n </section>\n );\n },\n);\n\nExecutiveThesis.displayName = 'ExecutiveThesis';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode, type InsightType, INSIGHT_TYPE_CONTRACTS } from '../../report-engine';\nimport './InsightBlock.css';\n\nexport interface InsightBlockProps {\n /** The type of insight - constrains allowed child charts */\n type: InsightType;\n /** The insight headline */\n headline: string;\n /** Supporting description */\n description?: string;\n /** Confidence score (0-100) */\n confidence?: number;\n /** Methodology notes (shown in analyst mode) */\n methodology?: string;\n /** Evidence charts (max 3 per composition rules) */\n children: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * InsightBlock groups an insight with its supporting evidence.\n *\n * Composition Rules:\n * - R2: InsightBlock MUST precede any chart it references\n * - R3: Charts CANNOT appear without a parent InsightBlock\n * - R6: Max 3 charts per InsightBlock\n */\nexport const InsightBlock = React.forwardRef<HTMLElement, InsightBlockProps>(\n (\n { type, headline, description, confidence, methodology, children, className, ...props },\n ref,\n ) => {\n const { features } = useReportMode();\n const contract = INSIGHT_TYPE_CONTRACTS[type];\n\n // Determine confidence level\n const getConfidenceClass = () => {\n if (confidence === undefined) return '';\n if (confidence >= 90) return 'ds-insight-block--confidence-high';\n if (confidence >= 70) return 'ds-insight-block--confidence-moderate';\n if (confidence >= 50) return 'ds-insight-block--confidence-low';\n return 'ds-insight-block--confidence-insufficient';\n };\n\n return (\n <section\n ref={ref}\n className={clsx('ds-insight-block', getConfidenceClass(), className)}\n data-insight-type={type}\n aria-labelledby={`insight-${type}-title`}\n {...props}\n >\n <header className=\"ds-insight-block__header\">\n <div className=\"ds-insight-block__meta\">\n <span className=\"ds-insight-block__type\">{type.replace(/-/g, ' ')}</span>\n {features.showConfidenceScores && confidence !== undefined && (\n <span className=\"ds-insight-block__confidence\">{confidence}% confidence</span>\n )}\n </div>\n <h3 id={`insight-${type}-title`} className=\"ds-insight-block__headline\">\n {headline}\n </h3>\n {description && <p className=\"ds-insight-block__description\">{description}</p>}\n </header>\n\n <div className=\"ds-insight-block__evidence\">{children}</div>\n\n {features.showMethodology && methodology && (\n <footer className=\"ds-insight-block__methodology\">\n <h4 className=\"ds-insight-block__methodology-title\">Methodology</h4>\n <p className=\"ds-insight-block__methodology-text\">{methodology}</p>\n {contract && (\n <p className=\"ds-insight-block__methodology-contract\">\n Min sample: {contract.minSampleSize} | Allowed charts:{' '}\n {contract.allowedCharts.join(', ')}\n </p>\n )}\n </footer>\n )}\n </section>\n );\n },\n);\n\nInsightBlock.displayName = 'InsightBlock';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './EvidenceGroup.css';\n\nexport interface EvidenceGroupProps {\n /** Group title */\n title?: string;\n /** Layout direction */\n layout?: 'row' | 'column' | 'grid';\n /** Number of columns for grid layout */\n columns?: 1 | 2 | 3;\n /** Evidence charts (max 3 per composition rules) */\n children: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * EvidenceGroup contains related charts under an InsightBlock.\n *\n * Composition Rule: R6 - Max 3 charts per InsightBlock (enforced via EvidenceGroup)\n */\nexport const EvidenceGroup = React.forwardRef<HTMLDivElement, EvidenceGroupProps>(\n ({ title, layout = 'row', columns = 2, children, className, ...props }, ref) => {\n // Count children to enforce composition rule\n const childCount = React.Children.count(children);\n\n if (childCount > 3) {\n console.warn(\n `EvidenceGroup: Maximum 3 charts allowed per insight block (received ${childCount}). ` +\n 'This violates composition rule R6.',\n );\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-evidence-group',\n `ds-evidence-group--${layout}`,\n layout === 'grid' && `ds-evidence-group--cols-${columns}`,\n className,\n )}\n role=\"group\"\n aria-label={title || 'Evidence charts'}\n {...props}\n >\n {title && <h4 className=\"ds-evidence-group__title\">{title}</h4>}\n <div className=\"ds-evidence-group__content\">{children}</div>\n </div>\n );\n },\n);\n\nEvidenceGroup.displayName = 'EvidenceGroup';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { getConfidenceThreshold } from '../../report-engine';\nimport './ConfidenceIndicator.css';\n\nexport interface ConfidenceIndicatorProps {\n /** Confidence score (0-100) */\n score: number;\n /** Show the numeric score */\n showScore?: boolean;\n /** Show the label */\n showLabel?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ConfidenceIndicator displays the reliability score of an insight or data point.\n * This is a guardrail component that helps users understand data quality.\n */\nexport const ConfidenceIndicator = React.forwardRef<HTMLDivElement, ConfidenceIndicatorProps>(\n ({ score, showScore = true, showLabel = true, size = 'md', className, ...props }, ref) => {\n const threshold = getConfidenceThreshold(score);\n const normalizedScore = Math.max(0, Math.min(100, score));\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-confidence-indicator',\n `ds-confidence-indicator--${size}`,\n `ds-confidence-indicator--${threshold.level}`,\n className,\n )}\n role=\"meter\"\n aria-valuenow={normalizedScore}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Confidence: ${threshold.label} (${normalizedScore}%)`}\n {...props}\n >\n <div className=\"ds-confidence-indicator__bar\">\n <div className=\"ds-confidence-indicator__fill\" style={{ width: `${normalizedScore}%` }} />\n </div>\n <div className=\"ds-confidence-indicator__text\">\n {showScore && <span className=\"ds-confidence-indicator__score\">{normalizedScore}%</span>}\n {showLabel && <span className=\"ds-confidence-indicator__label\">{threshold.label}</span>}\n </div>\n </div>\n );\n },\n);\n\nConfidenceIndicator.displayName = 'ConfidenceIndicator';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './DataCoverageBadge.css';\n\nexport interface DataCoverageBadgeProps {\n /** Current sample size */\n sampleSize: number;\n /** Required minimum sample size */\n requiredSize?: number;\n /** Date range covered */\n dateRange?: {\n start: string;\n end: string;\n };\n /** Show date range */\n showDateRange?: boolean;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * DataCoverageBadge shows the sample size and optionally the date range of the data.\n * This is a guardrail component that helps users understand data coverage.\n */\nexport const DataCoverageBadge = React.forwardRef<HTMLDivElement, DataCoverageBadgeProps>(\n (\n { sampleSize, requiredSize, dateRange, showDateRange = true, size = 'md', className, ...props },\n ref,\n ) => {\n const isSufficient = !requiredSize || sampleSize >= requiredSize;\n const percentage = requiredSize\n ? Math.min(100, Math.round((sampleSize / requiredSize) * 100))\n : 100;\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-data-coverage-badge',\n `ds-data-coverage-badge--${size}`,\n !isSufficient && 'ds-data-coverage-badge--insufficient',\n className,\n )}\n {...props}\n >\n <div className=\"ds-data-coverage-badge__sample\">\n <span className=\"ds-data-coverage-badge__icon\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n </span>\n <span className=\"ds-data-coverage-badge__count\">n={sampleSize.toLocaleString()}</span>\n {requiredSize && (\n <span className=\"ds-data-coverage-badge__required\">\n ({percentage}% of min {requiredSize})\n </span>\n )}\n </div>\n\n {showDateRange && dateRange && (\n <div className=\"ds-data-coverage-badge__date\">\n <span className=\"ds-data-coverage-badge__icon\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </span>\n <span>\n {dateRange.start} – {dateRange.end}\n </span>\n </div>\n )}\n </div>\n );\n },\n);\n\nDataCoverageBadge.displayName = 'DataCoverageBadge';\n","import React from 'react';\nimport clsx from 'clsx';\nimport type { AnalyticalState, DataStateDetails } from '../../report-engine';\nimport { ANALYTICAL_STATE_CONFIG } from '../../report-engine';\nimport './DataStateIndicator.css';\n\nexport interface DataStateIndicatorProps {\n /** Current analytical state */\n state: AnalyticalState;\n /** Additional details about the state */\n details?: DataStateDetails;\n /** Show full details or compact */\n variant?: 'compact' | 'full';\n /** Action button handler */\n onAction?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * DataStateIndicator shows the analytical state of data (valid, insufficient, etc.).\n * This is a guardrail component that prevents misleading outputs.\n */\nexport const DataStateIndicator = React.forwardRef<HTMLDivElement, DataStateIndicatorProps>(\n ({ state, details, variant = 'compact', onAction, className, ...props }, ref) => {\n const config = ANALYTICAL_STATE_CONFIG[state];\n\n // Don't render if valid and compact\n if (state === 'VALID' && variant === 'compact') {\n return null;\n }\n\n const renderIcon = () => {\n switch (config.icon) {\n case 'check':\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=\"20,6 9,17 4,12\" />\n </svg>\n );\n case 'alert-triangle':\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=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n case 'alert-circle':\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\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n case 'x-circle':\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\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n case 'cpu':\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=\"4\" width=\"16\" height=\"16\" rx=\"2\" ry=\"2\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n <line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"4\" />\n <line x1=\"15\" y1=\"1\" x2=\"15\" y2=\"4\" />\n <line x1=\"9\" y1=\"20\" x2=\"9\" y2=\"23\" />\n <line x1=\"15\" y1=\"20\" x2=\"15\" y2=\"23\" />\n <line x1=\"20\" y1=\"9\" x2=\"23\" y2=\"9\" />\n <line x1=\"20\" y1=\"14\" x2=\"23\" y2=\"14\" />\n <line x1=\"1\" y1=\"9\" x2=\"4\" y2=\"9\" />\n <line x1=\"1\" y1=\"14\" x2=\"4\" y2=\"14\" />\n </svg>\n );\n default:\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\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n }\n };\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-data-state-indicator',\n `ds-data-state-indicator--${variant}`,\n `ds-data-state-indicator--${state.toLowerCase().replace(/_/g, '-')}`,\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n <span className=\"ds-data-state-indicator__icon\" style={{ color: config.color }}>\n {renderIcon()}\n </span>\n\n <div className=\"ds-data-state-indicator__content\">\n <span className=\"ds-data-state-indicator__label\">{config.label}</span>\n\n {variant === 'full' && details && (\n <span className=\"ds-data-state-indicator__details\">\n {details.message}\n {details.sampleSize !== undefined && details.requiredSize !== undefined && (\n <>\n {' '}\n (n={details.sampleSize}/{details.requiredSize})\n </>\n )}\n {details.confidence !== undefined && <> • {details.confidence}% confidence</>}\n {details.missingFields && details.missingFields.length > 0 && (\n <> • Missing: {details.missingFields.join(', ')}</>\n )}\n </span>\n )}\n </div>\n\n {config.action && onAction && (\n <button type=\"button\" className=\"ds-data-state-indicator__action\" onClick={onAction}>\n {config.action}\n </button>\n )}\n </div>\n );\n },\n);\n\nDataStateIndicator.displayName = 'DataStateIndicator';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport './MethodologyNote.css';\n\n/** Translatable labels for the MethodologyNote component. */\nexport interface MethodologyNoteLabels {\n /** Title text and aria-label. @default \"Methodology\" */\n title?: string;\n /** Label for the sample size row. @default \"Sample Size\" */\n sampleSize?: string;\n /** Label for the data sources row. @default \"Data Sources\" */\n dataSources?: string;\n /** Label for the calculation row. @default \"Calculation\" */\n calculation?: string;\n}\n\nexport interface MethodologyNoteProps {\n /** Methodology description */\n children: React.ReactNode;\n /** Sample size (triggers automatic display if < 100) */\n sampleSize?: number;\n /** Data sources used */\n sources?: string[];\n /** Calculation method */\n calculation?: string;\n /** Always show regardless of mode */\n forceShow?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Override default English labels for i18n. */\n labels?: MethodologyNoteLabels;\n}\n\n/**\n * MethodologyNote documents how data was collected and calculated.\n *\n * Composition Rule: R4 - MethodologyNote MUST appear if sample size < 100\n */\nexport const MethodologyNote = React.forwardRef<HTMLElement, MethodologyNoteProps>(\n ({ children, sampleSize, sources, calculation, forceShow = false, className, labels, ...props }, ref) => {\n const titleText = labels?.title ?? 'Methodology';\n const sampleSizeLabel = labels?.sampleSize ?? 'Sample Size';\n const dataSourcesLabel = labels?.dataSources ?? 'Data Sources';\n const calculationLabel = labels?.calculation ?? 'Calculation';\n const { features } = useReportMode();\n\n // In executive mode, only show if forced or sample size < 100\n const shouldShow =\n forceShow || features.showMethodology || (sampleSize !== undefined && sampleSize < 100);\n\n if (!shouldShow) {\n return null;\n }\n\n return (\n <aside\n ref={ref}\n className={clsx('ds-methodology-note', className)}\n aria-label={titleText}\n {...props}\n >\n <div className=\"ds-methodology-note__header\">\n <svg\n className=\"ds-methodology-note__icon\"\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\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <span className=\"ds-methodology-note__title\">{titleText}</span>\n </div>\n\n <div className=\"ds-methodology-note__content\">{children}</div>\n\n {(sources || calculation || sampleSize !== undefined) && (\n <dl className=\"ds-methodology-note__details\">\n {sampleSize !== undefined && (\n <>\n <dt>{sampleSizeLabel}</dt>\n <dd>n={sampleSize.toLocaleString()}</dd>\n </>\n )}\n {sources && sources.length > 0 && (\n <>\n <dt>{dataSourcesLabel}</dt>\n <dd>{sources.join(', ')}</dd>\n </>\n )}\n {calculation && (\n <>\n <dt>{calculationLabel}</dt>\n <dd>{calculation}</dd>\n </>\n )}\n </dl>\n )}\n </aside>\n );\n },\n);\n\nMethodologyNote.displayName = 'MethodologyNote';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport './CaveatBlock.css';\n\nexport interface CaveatBlockProps {\n /** Caveat title/summary */\n title?: string;\n /** Caveat details */\n children: React.ReactNode;\n /** Severity level */\n severity?: 'info' | 'warning' | 'critical';\n /** Confidence score that triggered this caveat */\n confidence?: number;\n /** Always show regardless of mode */\n forceShow?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * CaveatBlock displays limitations and warnings about the data or analysis.\n *\n * Composition Rule: Required if confidence < 70%\n */\nexport const CaveatBlock = React.forwardRef<HTMLElement, CaveatBlockProps>(\n (\n {\n title = 'Important Caveat',\n children,\n severity = 'warning',\n confidence,\n forceShow = false,\n className,\n ...props\n },\n ref,\n ) => {\n const { features } = useReportMode();\n\n // In executive mode, only show if forced or confidence < 70%\n const shouldShow =\n forceShow || features.showMethodology || (confidence !== undefined && confidence < 70);\n\n if (!shouldShow) {\n return null;\n }\n\n const renderIcon = () => {\n if (severity === 'critical') {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n }\n if (severity === 'info') {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n }\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n };\n\n return (\n <aside\n ref={ref}\n className={clsx('ds-caveat-block', `ds-caveat-block--${severity}`, className)}\n role=\"note\"\n aria-label={title}\n {...props}\n >\n <div className=\"ds-caveat-block__header\">\n <span className=\"ds-caveat-block__icon\">{renderIcon()}</span>\n <span className=\"ds-caveat-block__title\">{title}</span>\n {confidence !== undefined && (\n <span className=\"ds-caveat-block__confidence\">{confidence}% confidence</span>\n )}\n </div>\n <div className=\"ds-caveat-block__content\">{children}</div>\n </aside>\n );\n },\n);\n\nCaveatBlock.displayName = 'CaveatBlock';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode, useDataState, type TrendDirection } from '../../report-engine';\nimport './KeyMetric.css';\n\nexport interface KeyMetricProps {\n /** Metric title/label */\n title: string;\n /** Primary value */\n value: string | number;\n /** Value prefix (e.g., '$', '#') */\n prefix?: string;\n /** Value suffix (e.g., '%', 'users') */\n suffix?: string;\n /** Trend indicator */\n trend?: {\n value: number;\n direction: TrendDirection;\n label?: string;\n };\n /** Secondary metric */\n secondary?: {\n label: string;\n value: string | number;\n };\n /** Sample size for data state */\n sampleSize?: number;\n /** Confidence score */\n confidence?: number;\n /** Click handler for drill-down */\n onClick?: () => void;\n /** Loading state */\n loading?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * KeyMetric displays a single KPI with trend indicator and optional drill-down.\n * This is an analytical component with built-in data state awareness.\n */\nexport const KeyMetric = React.forwardRef<HTMLDivElement, KeyMetricProps>(\n (\n {\n title,\n value,\n prefix,\n suffix,\n trend,\n secondary,\n sampleSize,\n confidence,\n onClick,\n loading,\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n const { features } = useReportMode();\n const { isValid } = useDataState({\n sampleSize: sampleSize ?? 100,\n requiredSize: 30,\n });\n\n const isClickable = onClick && !loading;\n\n const formatValue = (val: string | number) => {\n if (typeof val === 'number') {\n return val.toLocaleString();\n }\n return val;\n };\n\n const getTrendIcon = (direction: TrendDirection) => {\n switch (direction) {\n case 'up':\n return '↑';\n case 'down':\n return '↓';\n default:\n return '→';\n }\n };\n\n const Component = isClickable ? 'button' : 'div';\n\n return (\n <Component\n ref={ref as React.Ref<HTMLButtonElement & HTMLDivElement>}\n className={clsx(\n 'ds-key-metric',\n `ds-key-metric--${size}`,\n loading && 'ds-key-metric--loading',\n isClickable && 'ds-key-metric--clickable',\n !isValid && 'ds-key-metric--invalid',\n className,\n )}\n onClick={isClickable ? onClick : undefined}\n type={isClickable ? 'button' : undefined}\n {...props}\n >\n <div className=\"ds-key-metric__header\">\n <span className=\"ds-key-metric__title\">{title}</span>\n {features.showConfidenceScores && confidence !== undefined && (\n <span className=\"ds-key-metric__confidence\">{confidence}%</span>\n )}\n </div>\n\n <div className=\"ds-key-metric__value-row\">\n <span className=\"ds-key-metric__value\">\n {prefix && <span className=\"ds-key-metric__prefix\">{prefix}</span>}\n {loading ? '—' : formatValue(value)}\n {suffix && <span className=\"ds-key-metric__suffix\">{suffix}</span>}\n </span>\n\n {trend && (\n <span\n className={clsx('ds-key-metric__trend', `ds-key-metric__trend--${trend.direction}`)}\n >\n <span className=\"ds-key-metric__trend-icon\">{getTrendIcon(trend.direction)}</span>\n <span className=\"ds-key-metric__trend-value\">{Math.abs(trend.value)}%</span>\n {trend.label && <span className=\"ds-key-metric__trend-label\">{trend.label}</span>}\n </span>\n )}\n </div>\n\n {secondary && (\n <div className=\"ds-key-metric__secondary\">\n <span className=\"ds-key-metric__secondary-label\">{secondary.label}:</span>\n <span className=\"ds-key-metric__secondary-value\">{formatValue(secondary.value)}</span>\n </div>\n )}\n\n {features.showMethodology && sampleSize !== undefined && (\n <div className=\"ds-key-metric__sample\">n={sampleSize.toLocaleString()}</div>\n )}\n </Component>\n );\n },\n);\n\nKeyMetric.displayName = 'KeyMetric';\n","import React from 'react';\nimport clsx from 'clsx';\nimport type { TrendDirection } from '../../report-engine';\nimport './TrendIndicator.css';\n\nexport interface TrendIndicatorProps {\n /** Percentage change */\n value: number;\n /** Override direction (auto-detected from value) */\n direction?: TrendDirection;\n /** Positive is good (green) or bad (red) */\n positiveIsGood?: boolean;\n /** Show arrow icon */\n showIcon?: boolean;\n /** Show the percentage sign */\n showPercent?: boolean;\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * TrendIndicator shows directional change with color coding.\n * Requires at least 2 data points to be meaningful.\n */\nexport const TrendIndicator = React.forwardRef<HTMLSpanElement, TrendIndicatorProps>(\n (\n {\n value,\n direction: directionOverride,\n positiveIsGood = true,\n showIcon = true,\n showPercent = true,\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n // Determine direction from value or override\n const direction: TrendDirection =\n directionOverride ?? (value > 0 ? 'up' : value < 0 ? 'down' : 'neutral');\n\n // Determine if this is a \"good\" or \"bad\" trend\n const isGood = positiveIsGood ? direction === 'up' : direction === 'down';\n\n const isBad = positiveIsGood ? direction === 'down' : direction === 'up';\n\n const getIcon = () => {\n switch (direction) {\n case 'up':\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <polyline points=\"18,15 12,9 6,15\" />\n </svg>\n );\n case 'down':\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n );\n default:\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n }\n };\n\n return (\n <span\n ref={ref}\n className={clsx(\n 'ds-trend-indicator',\n `ds-trend-indicator--${size}`,\n `ds-trend-indicator--${direction}`,\n isGood && 'ds-trend-indicator--good',\n isBad && 'ds-trend-indicator--bad',\n className,\n )}\n aria-label={`${direction === 'up' ? 'Increased' : direction === 'down' ? 'Decreased' : 'No change'} by ${Math.abs(value)}%`}\n {...props}\n >\n {showIcon && <span className=\"ds-trend-indicator__icon\">{getIcon()}</span>}\n <span className=\"ds-trend-indicator__value\">\n {value > 0 && '+'}\n {value.toFixed(1)}\n {showPercent && '%'}\n </span>\n </span>\n );\n },\n);\n\nTrendIndicator.displayName = 'TrendIndicator';\n","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 React from 'react';\nimport { Tooltip as BaseTooltip } from '@base-ui/react/tooltip';\nimport clsx from 'clsx';\nimport './Tooltip.css';\n\nexport const TooltipProvider = BaseTooltip.Provider;\nexport const TooltipRoot = BaseTooltip.Root;\nexport const TooltipTrigger = BaseTooltip.Trigger;\n\nexport const TooltipContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, children, ...props }, ref) => (\n <BaseTooltip.Portal>\n <BaseTooltip.Positioner sideOffset={5}>\n <BaseTooltip.Popup ref={ref} className={clsx('ds-tooltip__content', className)} {...props}>\n {children}\n <BaseTooltip.Arrow className=\"ds-tooltip__arrow\" />\n </BaseTooltip.Popup>\n </BaseTooltip.Positioner>\n </BaseTooltip.Portal>\n));\nTooltipContent.displayName = 'TooltipContent';\n\nexport interface TooltipProps {\n content: React.ReactNode;\n children: React.ReactNode;\n delay?: number;\n}\n\nexport const Tooltip = ({ content, children, delay = 200 }: TooltipProps) => {\n return (\n <BaseTooltip.Provider delay={delay}>\n <BaseTooltip.Root>\n <BaseTooltip.Trigger render={children as React.ReactElement} />\n <TooltipContent>{content}</TooltipContent>\n </BaseTooltip.Root>\n </BaseTooltip.Provider>\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 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 } 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\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 const CustomTooltip = ({\n active,\n payload,\n }: {\n active?: boolean;\n payload?: Array<{ payload: RadarDataPoint; value: number; name: string }>;\n }) => {\n if (!active || !payload?.length) return null;\n const data = payload[0].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 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 />\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 />\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","import React from 'react';\nimport { Select as BaseSelect } from '@base-ui/react/select';\nimport clsx from 'clsx';\nimport './Select.css';\n\n/* ============================================================================\n SELECT ROOT\n ============================================================================ */\n\nexport interface SelectProps {\n /** Current selected value */\n value?: string;\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n /** Callback when value changes */\n onValueChange?: (value: string | null) => void;\n /** Whether the select is disabled */\n disabled?: boolean;\n /** Whether the select is required */\n required?: boolean;\n /** Name for form submission */\n name?: string;\n /**\n * Item label map for Value display resolution.\n * When provided, Select.Value renders the label instead of the raw value.\n * Accepts a record (e.g. `{ en: \"English\", fr: \"French\" }`) or an array\n * of `{ value, label }` objects.\n */\n items?: Record<string, React.ReactNode> | ReadonlyArray<{ label: React.ReactNode; value: string }>;\n /** Children (SelectTrigger, SelectContent, etc.) */\n children: React.ReactNode;\n}\n\nexport function Select({\n value,\n defaultValue,\n onValueChange,\n disabled,\n required,\n name,\n items,\n children,\n}: SelectProps) {\n return (\n <BaseSelect.Root\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange ? (val) => onValueChange(val) : undefined}\n disabled={disabled}\n required={required}\n name={name}\n items={items}\n >\n {children}\n </BaseSelect.Root>\n );\n}\n\nSelect.displayName = 'Select';\n\n/* ============================================================================\n SELECT TRIGGER\n ============================================================================ */\n\nexport interface SelectTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Placeholder text when no value selected */\n placeholder?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n ({ className, placeholder = 'Select...', size = 'md', ...props }, ref) => {\n return (\n <div className=\"ds-select__trigger-wrapper\">\n <BaseSelect.Trigger\n ref={ref}\n className={clsx('ds-select__trigger', `ds-select__trigger--${size}`, className)}\n aria-label={props['aria-label'] || (typeof placeholder === 'string' ? placeholder : 'Select')}\n {...props}\n >\n <BaseSelect.Value className=\"ds-select__value\" placeholder={placeholder} />\n <BaseSelect.Icon className=\"ds-select__icon\" aria-hidden>\n <ChevronDownIcon />\n </BaseSelect.Icon>\n </BaseSelect.Trigger>\n </div>\n );\n },\n);\n\nSelectTrigger.displayName = 'SelectTrigger';\n\n/* ============================================================================\n SELECT CONTENT\n ============================================================================ */\n\nexport interface SelectContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Positioning side */\n side?: 'top' | 'bottom';\n /** Side offset in pixels */\n sideOffset?: number;\n /** Alignment */\n align?: 'start' | 'center' | 'end';\n}\n\nexport const SelectContent = React.forwardRef<HTMLDivElement, SelectContentProps>(\n ({ className, side = 'bottom', sideOffset = 4, align = 'start', children, ...props }, ref) => {\n return (\n <BaseSelect.Portal>\n <BaseSelect.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignItemWithTrigger={false}\n >\n <BaseSelect.Popup ref={ref} className={clsx('ds-select__content', className)} {...props}>\n <BaseSelect.List className=\"ds-select__list\">\n {children}\n </BaseSelect.List>\n </BaseSelect.Popup>\n </BaseSelect.Positioner>\n </BaseSelect.Portal>\n );\n },\n);\n\nSelectContent.displayName = 'SelectContent';\n\n/* ============================================================================\n SELECT ITEM\n ============================================================================ */\n\nexport interface SelectItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Value for this option */\n value: string;\n /** Display text */\n children: React.ReactNode;\n /** Whether the item is disabled */\n disabled?: boolean;\n}\n\nexport const SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(\n ({ className, value, children, disabled, ...props }, ref) => {\n return (\n <BaseSelect.Item\n ref={ref}\n value={value}\n disabled={disabled}\n className={clsx('ds-select__item', className)}\n {...props}\n >\n <BaseSelect.ItemIndicator className=\"ds-select__item-indicator\">\n <CheckIcon />\n </BaseSelect.ItemIndicator>\n <BaseSelect.ItemText>{children}</BaseSelect.ItemText>\n </BaseSelect.Item>\n );\n },\n);\n\nSelectItem.displayName = 'SelectItem';\n\n/* ============================================================================\n SELECT GROUP\n ============================================================================ */\n\nexport interface SelectGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Group label */\n label?: string;\n}\n\nexport const SelectGroup = React.forwardRef<HTMLDivElement, SelectGroupProps>(\n ({ className, label, children, ...props }, ref) => {\n return (\n <BaseSelect.Group ref={ref} className={clsx('ds-select__group', className)} {...props}>\n {label && (\n <BaseSelect.GroupLabel className=\"ds-select__group-label\">{label}</BaseSelect.GroupLabel>\n )}\n {children}\n </BaseSelect.Group>\n );\n },\n);\n\nSelectGroup.displayName = 'SelectGroup';\n\n/* ============================================================================\n SELECT SEPARATOR\n ============================================================================ */\n\nexport const SelectSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return <div ref={ref} className={clsx('ds-select__separator', className)} {...props} />;\n});\n\nSelectSeparator.displayName = 'SelectSeparator';\n\n/* ============================================================================\n ICONS\n ============================================================================ */\n\nfunction ChevronDownIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n} from '../DropdownMenu';\nimport './ExportMenu.css';\n\nexport type ExportFormat = 'pdf' | 'csv' | 'xlsx' | 'pptx' | 'png' | 'json';\n\nexport interface ExportOption {\n /** Export format */\n format: ExportFormat;\n /** Display label */\n label: string;\n /** Optional description */\n description?: string;\n /** Whether this option is disabled */\n disabled?: boolean;\n}\n\nexport interface ExportMenuProps {\n /** Available export options */\n options?: ExportOption[];\n /** Callback when an export option is selected */\n onExport: (format: ExportFormat) => void;\n /** Whether export is currently in progress */\n isExporting?: boolean;\n /** Button label */\n label?: string;\n /** Button size */\n size?: 'sm' | 'md' | 'lg';\n /** Button variant */\n variant?: 'primary' | 'secondary' | 'outline';\n /** Additional CSS class */\n className?: string;\n /** Disabled state */\n disabled?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ExportOption[] = [\n { format: 'pdf', label: 'PDF Document', description: 'Best for sharing reports' },\n { format: 'pptx', label: 'PowerPoint', description: 'Editable presentation' },\n { format: 'xlsx', label: 'Excel Spreadsheet', description: 'Data with charts' },\n { format: 'csv', label: 'CSV Data', description: 'Raw data only' },\n { format: 'png', label: 'PNG Image', description: 'Chart screenshot' },\n { format: 'json', label: 'JSON', description: 'Developer format' },\n];\n\nconst FORMAT_ICONS: Record<ExportFormat, React.ReactNode> = {\n pdf: <PdfIcon />,\n csv: <CsvIcon />,\n xlsx: <ExcelIcon />,\n pptx: <PptIcon />,\n png: <ImageIcon />,\n json: <JsonIcon />,\n};\n\n/**\n * ExportMenu provides a dropdown for exporting reports in various formats.\n * This is an interface-only component - actual export logic is implemented at the app layer.\n */\nexport function ExportMenu({\n options = DEFAULT_OPTIONS,\n onExport,\n isExporting = false,\n label = 'Export',\n size = 'md',\n variant = 'secondary',\n className,\n disabled,\n}: ExportMenuProps) {\n const documentOptions = options.filter((o) => ['pdf', 'pptx'].includes(o.format));\n const dataOptions = options.filter((o) => ['xlsx', 'csv', 'json'].includes(o.format));\n const imageOptions = options.filter((o) => ['png'].includes(o.format));\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={clsx(\n 'ds-export-menu__trigger',\n 'ds-button',\n `ds-button--${variant}`,\n `ds-button--${size}`,\n className,\n )}\n disabled={disabled || isExporting}\n >\n {isExporting ? (\n <>\n <LoadingIcon />\n Exporting...\n </>\n ) : (\n <>\n <ExportIcon />\n {label}\n </>\n )}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent side=\"bottom\" align=\"end\" sideOffset={4}>\n {documentOptions.length > 0 && (\n <>\n <DropdownMenuLabel>Documents</DropdownMenuLabel>\n {documentOptions.map((option) => (\n <DropdownMenuItem\n key={option.format}\n disabled={option.disabled}\n onClick={() => onExport(option.format)}\n >\n <span className=\"ds-export-menu__item-icon\">{FORMAT_ICONS[option.format]}</span>\n <span className=\"ds-export-menu__item-content\">\n <span className=\"ds-export-menu__item-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-export-menu__item-description\">{option.description}</span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </>\n )}\n\n {documentOptions.length > 0 && dataOptions.length > 0 && <DropdownMenuSeparator />}\n\n {dataOptions.length > 0 && (\n <>\n <DropdownMenuLabel>Data</DropdownMenuLabel>\n {dataOptions.map((option) => (\n <DropdownMenuItem\n key={option.format}\n disabled={option.disabled}\n onClick={() => onExport(option.format)}\n >\n <span className=\"ds-export-menu__item-icon\">{FORMAT_ICONS[option.format]}</span>\n <span className=\"ds-export-menu__item-content\">\n <span className=\"ds-export-menu__item-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-export-menu__item-description\">{option.description}</span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </>\n )}\n\n {imageOptions.length > 0 && (dataOptions.length > 0 || documentOptions.length > 0) && (\n <DropdownMenuSeparator />\n )}\n\n {imageOptions.length > 0 && (\n <>\n <DropdownMenuLabel>Image</DropdownMenuLabel>\n {imageOptions.map((option) => (\n <DropdownMenuItem\n key={option.format}\n disabled={option.disabled}\n onClick={() => onExport(option.format)}\n >\n <span className=\"ds-export-menu__item-icon\">{FORMAT_ICONS[option.format]}</span>\n <span className=\"ds-export-menu__item-content\">\n <span className=\"ds-export-menu__item-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-export-menu__item-description\">{option.description}</span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nExportMenu.displayName = 'ExportMenu';\n\n/* ============================================================================\n ICONS\n ============================================================================ */\n\nfunction ExportIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n );\n}\n\nfunction LoadingIcon() {\n return (\n <svg\n className=\"ds-export-menu__loading-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nfunction PdfIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n );\n}\n\nfunction CsvIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"16\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction ExcelIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n}\n\nfunction PptIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n );\n}\n\nfunction ImageIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <path d=\"m21 15-5-5L5 21\" />\n </svg>\n );\n}\n\nfunction JsonIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5a2 2 0 0 0 2 2h1\" />\n <path d=\"M16 21h1a2 2 0 0 0 2-2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\" />\n </svg>\n );\n}\n","import React from 'react';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\nimport clsx from 'clsx';\nimport './DropdownMenu.css';\n\n/* ============================================================================\n DROPDOWN MENU ROOT\n ============================================================================ */\n\nexport const DropdownMenu = BaseMenu.Root;\n\n/* ============================================================================\n DROPDOWN MENU TRIGGER\n ============================================================================ */\n\nexport const DropdownMenuTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { className?: string }\n>(({ className, ...props }, ref) => {\n return (\n <BaseMenu.Trigger\n ref={ref}\n className={clsx('ds-dropdown-menu__trigger', className)}\n {...props}\n />\n );\n});\n\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n\n/* ============================================================================\n DROPDOWN MENU CONTENT\n ============================================================================ */\n\nexport interface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: 'top' | 'right' | 'bottom' | 'left';\n align?: 'start' | 'center' | 'end';\n sideOffset?: number;\n alignOffset?: number;\n}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n (\n { className, side = 'bottom', align = 'start', sideOffset = 4, alignOffset = 0, ...props },\n ref,\n ) => {\n return (\n <BaseMenu.Portal>\n <BaseMenu.Positioner\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n >\n <BaseMenu.Popup\n ref={ref}\n className={clsx('ds-dropdown-menu__content', className)}\n {...props}\n />\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n );\n },\n);\n\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\n/* ============================================================================\n DROPDOWN MENU ITEM\n ============================================================================ */\n\nexport interface DropdownMenuItemProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n ({ className, ...props }, ref) => {\n return (\n <BaseMenu.Item ref={ref} className={clsx('ds-dropdown-menu__item', className)} {...props} />\n );\n },\n);\n\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n\n/* ============================================================================\n DROPDOWN MENU SEPARATOR\n ============================================================================ */\n\nexport const DropdownMenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return <div ref={ref} className={clsx('ds-dropdown-menu__separator', className)} {...props} />;\n});\n\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n\n/* ============================================================================\n DROPDOWN MENU LABEL\n ============================================================================ */\n\nexport const DropdownMenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return <div ref={ref} className={clsx('ds-dropdown-menu__label', className)} {...props} />;\n});\n\nDropdownMenuLabel.displayName = 'DropdownMenuLabel';\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/report-engine/constants.ts","../../src/report-engine/confidence.ts","../../src/report-engine/context.tsx","../../src/report-engine/chart-types.ts","../../src/report-engine/validation.ts","../../src/components/ReportShell/ReportShell.tsx","../../src/components/ExecutiveThesis/ExecutiveThesis.tsx","../../src/components/InsightBlock/InsightBlock.tsx","../../src/components/EvidenceGroup/EvidenceGroup.tsx","../../src/components/ConfidenceIndicator/ConfidenceIndicator.tsx","../../src/components/DataCoverageBadge/DataCoverageBadge.tsx","../../src/components/DataStateIndicator/DataStateIndicator.tsx","../../src/components/MethodologyNote/MethodologyNote.tsx","../../src/components/CaveatBlock/CaveatBlock.tsx","../../src/components/KeyMetric/KeyMetric.tsx","../../src/components/TrendIndicator/TrendIndicator.tsx","../../src/components/Select/Select.tsx","../../src/components/ExportMenu/ExportMenu.tsx","../../src/components/DropdownMenu/DropdownMenu.tsx"],"names":["React","getComponentName","isChart","jsx","clsx","jsxs","Fragment"],"mappings":"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","sourcesContent":["/* ============================================================================\n REPORT ENGINE — CONSTANTS & CONFIGURATION\n ============================================================================ */\n\nimport type {\n ReportModeConfig,\n ConfidenceThreshold,\n InsightTypeContract,\n InsightType,\n} from './types';\n\n/**\n * Executive mode configuration - minimal detail, boardroom-ready.\n */\nexport const EXECUTIVE_MODE: ReportModeConfig = {\n mode: 'executive',\n features: {\n showMethodology: false,\n showConfidenceScores: false,\n showRawData: false,\n showStatisticalTests: false,\n chartDetailLevel: 'summary',\n maxInsightsShown: 5,\n allowDrilldown: false,\n },\n};\n\n/**\n * Analyst mode configuration - full detail, internal use.\n */\nexport const ANALYST_MODE: ReportModeConfig = {\n mode: 'analyst',\n features: {\n showMethodology: true,\n showConfidenceScores: true,\n showRawData: true,\n showStatisticalTests: true,\n chartDetailLevel: 'detailed',\n maxInsightsShown: 20,\n allowDrilldown: true,\n },\n};\n\n/**\n * Confidence level thresholds.\n */\nexport const CONFIDENCE_THRESHOLDS: ConfidenceThreshold[] = [\n { level: 'high', min: 90, max: 100, label: 'High Confidence', color: 'var(--status-success)' },\n {\n level: 'moderate',\n min: 70,\n max: 89,\n label: 'Moderate Confidence',\n color: 'var(--status-info)',\n },\n { level: 'low', min: 50, max: 69, label: 'Low Confidence', color: 'var(--status-warning)' },\n {\n level: 'insufficient',\n min: 0,\n max: 49,\n label: 'Insufficient Data',\n color: 'var(--status-error)',\n },\n];\n\n/**\n * Minimum sample sizes for different analysis types.\n */\nexport const MINIMUM_SAMPLE_SIZES = {\n overall: 30,\n segment: 30,\n mbtiType: 50,\n correlation: 100,\n timeSeries: 7,\n} as const;\n\n/**\n * Insight type contracts defining allowed charts and requirements.\n */\nexport const INSIGHT_TYPE_CONTRACTS: Record<InsightType, InsightTypeContract> = {\n 'performance-delta': {\n type: 'performance-delta',\n allowedCharts: ['BarChart', 'LineChart', 'KeyMetric'],\n requiredFields: ['metric_name', 'current_value', 'previous_value', 'time_period'],\n minSampleSize: 30,\n headlinePattern: '{metric} {direction} by {delta}% {timeframe}',\n recommendationFormats: ['maintain-strategy', 'investigate-decline', 'scale-success'],\n },\n 'behavioral-correlation': {\n type: 'behavioral-correlation',\n allowedCharts: ['HeatmapChart', 'BarChart'],\n requiredFields: ['variable_a', 'variable_b', 'correlation_coefficient'],\n minSampleSize: 100,\n headlinePattern: '{variable_a} correlates with {variable_b}',\n recommendationFormats: ['leverage-correlation', 'investigate-causation'],\n },\n 'funnel-leakage': {\n type: 'funnel-leakage',\n allowedCharts: ['FunnelChart', 'BarChart'],\n requiredFields: ['stages', 'stage_counts', 'drop_rates'],\n minSampleSize: 50,\n headlinePattern: '{drop_rate}% drop-off at {stage}',\n recommendationFormats: ['optimize-stage', 'remove-friction'],\n },\n 'audience-mismatch': {\n type: 'audience-mismatch',\n allowedCharts: ['BarChart', 'PieChart'],\n requiredFields: ['target_audience', 'actual_audience', 'overlap_percentage'],\n minSampleSize: 50,\n headlinePattern: 'Target audience differs by {mismatch}%',\n recommendationFormats: ['refine-targeting', 'expand-audience'],\n },\n 'message-fatigue': {\n type: 'message-fatigue',\n allowedCharts: ['LineChart', 'BarChart'],\n requiredFields: ['message_sequence', 'engagement_rates', 'fatigue_point'],\n minSampleSize: 100,\n headlinePattern: 'Engagement drops {drop}% after message {n}',\n recommendationFormats: ['reduce-frequency', 'vary-content'],\n },\n 'psychological-resonance': {\n type: 'psychological-resonance',\n allowedCharts: ['MBTIRadar', 'MBTITypeGrid', 'BarChart'],\n requiredFields: ['mbti_types', 'response_rates', 'message_type'],\n minSampleSize: 50,\n headlinePattern: '{mbti_type} responds {rate}% better to {message_type}',\n recommendationFormats: ['personalize-messaging', 'segment-by-type'],\n },\n 'timing-pattern': {\n type: 'timing-pattern',\n allowedCharts: ['HeatmapChart', 'LineChart'],\n requiredFields: ['time_slots', 'engagement_rates'],\n minSampleSize: 100,\n headlinePattern: 'Best engagement on {day} at {time}',\n recommendationFormats: ['optimize-timing', 'schedule-sends'],\n },\n 'segment-outperformance': {\n type: 'segment-outperformance',\n allowedCharts: ['BarChart', 'KeyMetric'],\n requiredFields: ['segments', 'performance_metrics', 'baseline'],\n minSampleSize: 30,\n headlinePattern: '{segment} outperforms by {delta}%',\n recommendationFormats: ['double-down', 'investigate-success'],\n },\n 'anomaly-detection': {\n type: 'anomaly-detection',\n allowedCharts: ['LineChart', 'BarChart'],\n requiredFields: ['metric', 'expected_value', 'actual_value', 'deviation'],\n minSampleSize: 30,\n headlinePattern: 'Unusual {direction} in {metric}',\n recommendationFormats: ['investigate', 'monitor'],\n },\n 'competitive-benchmark': {\n type: 'competitive-benchmark',\n allowedCharts: ['BarChart', 'KeyMetric'],\n requiredFields: ['metric', 'our_value', 'benchmark_value'],\n minSampleSize: 30,\n headlinePattern: '{position} industry benchmark by {delta}%',\n recommendationFormats: ['maintain-lead', 'close-gap'],\n },\n};\n\n/**\n * Analytical state metadata for UI rendering.\n */\nexport const ANALYTICAL_STATE_CONFIG = {\n VALID: {\n label: 'Valid',\n icon: 'check',\n color: 'var(--status-success)',\n action: null,\n },\n INSUFFICIENT_SAMPLE: {\n label: 'Insufficient Sample',\n icon: 'alert-triangle',\n color: 'var(--status-warning)',\n action: 'Add more data',\n },\n LOW_CONFIDENCE: {\n label: 'Low Confidence',\n icon: 'alert-circle',\n color: 'var(--status-warning)',\n action: 'Interpret with caution',\n },\n PARTIAL_TIME_WINDOW: {\n label: 'Partial Data',\n icon: 'clock',\n color: 'var(--status-info)',\n action: 'Expand date range',\n },\n DATA_SKEW_DETECTED: {\n label: 'Data Skew',\n icon: 'bar-chart-2',\n color: 'var(--status-warning)',\n action: 'Review methodology',\n },\n CONFLICTING_SIGNALS: {\n label: 'Conflicting Signals',\n icon: 'git-merge',\n color: 'var(--status-error)',\n action: 'Manual review needed',\n },\n INFERRED_NOT_OBSERVED: {\n label: 'AI Generated',\n icon: 'cpu',\n color: 'var(--status-info)',\n action: 'Verify with data',\n },\n STALE_DATA: {\n label: 'Stale Data',\n icon: 'clock',\n color: 'var(--status-warning)',\n action: 'Refresh data',\n },\n FIELD_MISSING: {\n label: 'Missing Field',\n icon: 'file-x',\n color: 'var(--status-error)',\n action: 'Upload complete data',\n },\n CALCULATION_ERROR: {\n label: 'Calculation Error',\n icon: 'x-circle',\n color: 'var(--status-error)',\n action: 'Contact support',\n },\n} as const;\n","/* ============================================================================\n REPORT ENGINE — CONFIDENCE SCORING\n ============================================================================ */\n\nimport type { ConfidenceLevel } from './types';\nimport { CONFIDENCE_THRESHOLDS } from './constants';\n\nexport interface ConfidenceParams {\n sampleSize: number;\n requiredSize: number;\n completeness: number; // 0-1: percentage of non-null fields\n recency: number; // 0-1: how recent the data is\n variance: number; // 0-1: normalized variance (higher = worse)\n aiInference: boolean; // Whether AI generated the insight\n}\n\n/**\n * Calculate confidence score based on data quality factors.\n * Returns a score from 0-100.\n */\nexport function calculateConfidence(params: ConfidenceParams): number {\n const { sampleSize, requiredSize, completeness, recency, variance, aiInference } = params;\n\n // Base score from sample size (0-40 points)\n const sampleScore = Math.min(40, (sampleSize / requiredSize) * 40);\n\n // Completeness bonus (0-20 points)\n const completenessScore = completeness * 20;\n\n // Recency bonus (0-20 points)\n const recencyScore = recency * 20;\n\n // Variance penalty (0-10 points deducted for high variance)\n const variancePenalty = variance * 10;\n\n // AI inference penalty (10 points if AI-generated)\n const aiPenalty = aiInference ? 10 : 0;\n\n const rawScore = sampleScore + completenessScore + recencyScore - variancePenalty - aiPenalty;\n\n return Math.max(0, Math.min(100, Math.round(rawScore)));\n}\n\n/**\n * Get confidence level from score.\n */\nexport function getConfidenceLevel(score: number): ConfidenceLevel {\n const threshold = CONFIDENCE_THRESHOLDS.find((t) => score >= t.min && score <= t.max);\n return threshold?.level ?? 'insufficient';\n}\n\n/**\n * Get confidence threshold config from score.\n */\nexport function getConfidenceThreshold(score: number) {\n return (\n CONFIDENCE_THRESHOLDS.find((t) => score >= t.min && score <= t.max) ??\n CONFIDENCE_THRESHOLDS[CONFIDENCE_THRESHOLDS.length - 1]\n );\n}\n\n/**\n * Calculate recency score based on data age.\n * @param dataDate - The date of the most recent data point\n * @param maxAgeDays - Maximum acceptable age in days (default 30)\n */\nexport function calculateRecency(dataDate: Date, maxAgeDays = 30): number {\n const now = new Date();\n const ageInDays = (now.getTime() - dataDate.getTime()) / (1000 * 60 * 60 * 24);\n\n if (ageInDays <= 0) return 1;\n if (ageInDays >= maxAgeDays) return 0;\n\n return 1 - ageInDays / maxAgeDays;\n}\n\n/**\n * Calculate data completeness from an array of records.\n * @param data - Array of data objects\n * @param requiredFields - Fields to check for completeness\n */\nexport function calculateCompleteness(\n data: Record<string, unknown>[],\n requiredFields: string[],\n): number {\n if (data.length === 0 || requiredFields.length === 0) return 0;\n\n let totalFields = 0;\n let filledFields = 0;\n\n for (const record of data) {\n for (const field of requiredFields) {\n totalFields++;\n const value = record[field];\n if (value !== null && value !== undefined && value !== '') {\n filledFields++;\n }\n }\n }\n\n return totalFields > 0 ? filledFields / totalFields : 0;\n}\n\n/**\n * Calculate normalized variance for a numeric dataset.\n * Returns 0-1 where 0 is low variance and 1 is high variance.\n */\nexport function calculateNormalizedVariance(values: number[]): number {\n if (values.length < 2) return 0;\n\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const squaredDiffs = values.map((v) => Math.pow(v - mean, 2));\n const variance = squaredDiffs.reduce((a, b) => a + b, 0) / values.length;\n const stdDev = Math.sqrt(variance);\n\n // Coefficient of variation (CV) normalized to 0-1\n // CV > 1 is considered high variance\n const cv = mean !== 0 ? stdDev / Math.abs(mean) : 0;\n\n return Math.min(1, cv);\n}\n","/* ============================================================================\n REPORT ENGINE — CONTEXT & HOOKS\n ============================================================================ */\n\n/* eslint-disable react-refresh/only-export-components */\n// This is a library file exporting hooks alongside providers - fast refresh doesn't apply\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { ReportMode, ReportModeConfig, AnalyticalState, DataStateDetails } from './types';\nimport { EXECUTIVE_MODE, ANALYST_MODE, MINIMUM_SAMPLE_SIZES } from './constants';\nimport { calculateConfidence, getConfidenceLevel, type ConfidenceParams } from './confidence';\n\n/* --------------------------------------------------------------------------\n Report Mode Context\n -------------------------------------------------------------------------- */\n\ninterface ReportModeContextValue extends ReportModeConfig {\n setMode?: (mode: ReportMode) => void;\n}\n\nconst ReportModeContext = createContext<ReportModeContextValue | null>(null);\n\nexport interface ReportModeProviderProps {\n mode?: ReportMode;\n children: React.ReactNode;\n onModeChange?: (mode: ReportMode) => void;\n}\n\n/**\n * Provider for report mode context.\n * Wrap your report with this to control executive vs analyst mode.\n */\nexport function ReportModeProvider({\n mode = 'executive',\n children,\n onModeChange,\n}: ReportModeProviderProps) {\n const config = mode === 'executive' ? EXECUTIVE_MODE : ANALYST_MODE;\n\n const value = useMemo(\n () => ({\n ...config,\n setMode: onModeChange,\n }),\n [config, onModeChange],\n );\n\n return <ReportModeContext.Provider value={value}>{children}</ReportModeContext.Provider>;\n}\n\n/**\n * Hook to access report mode configuration.\n */\nexport function useReportMode(): ReportModeContextValue {\n const context = useContext(ReportModeContext);\n\n if (!context) {\n // Return default executive mode if used outside provider\n return EXECUTIVE_MODE;\n }\n\n return context;\n}\n\n/* --------------------------------------------------------------------------\n Data State Hook\n -------------------------------------------------------------------------- */\n\nexport interface UseDataStateParams {\n sampleSize: number;\n requiredSize?: number;\n completeness?: number;\n recency?: number;\n variance?: number;\n aiInferred?: boolean;\n missingFields?: string[];\n staleDays?: number;\n}\n\nexport interface UseDataStateResult {\n state: AnalyticalState;\n confidence: number;\n confidenceLevel: ReturnType<typeof getConfidenceLevel>;\n details: DataStateDetails;\n isValid: boolean;\n}\n\n/**\n * Hook to compute analytical state from data parameters.\n */\nexport function useDataState(params: UseDataStateParams): UseDataStateResult {\n const {\n sampleSize,\n requiredSize = MINIMUM_SAMPLE_SIZES.overall,\n completeness = 1,\n recency = 1,\n variance = 0,\n aiInferred = false,\n missingFields = [],\n staleDays,\n } = params;\n\n return useMemo(() => {\n // Calculate confidence\n const confidenceParams: ConfidenceParams = {\n sampleSize,\n requiredSize,\n completeness,\n recency,\n variance,\n aiInference: aiInferred,\n };\n\n const confidence = calculateConfidence(confidenceParams);\n const confidenceLevel = getConfidenceLevel(confidence);\n\n // Determine analytical state\n let state: AnalyticalState = 'VALID';\n\n if (missingFields.length > 0) {\n state = 'FIELD_MISSING';\n } else if (sampleSize < requiredSize) {\n state = 'INSUFFICIENT_SAMPLE';\n } else if (staleDays && staleDays > 30) {\n state = 'STALE_DATA';\n } else if (aiInferred) {\n state = 'INFERRED_NOT_OBSERVED';\n } else if (confidence < 50) {\n state = 'LOW_CONFIDENCE';\n } else if (variance > 0.7) {\n state = 'DATA_SKEW_DETECTED';\n } else if (recency < 0.3) {\n state = 'PARTIAL_TIME_WINDOW';\n }\n\n const details: DataStateDetails = {\n sampleSize,\n requiredSize,\n confidence,\n missingFields: missingFields.length > 0 ? missingFields : undefined,\n staleDays,\n };\n\n return {\n state,\n confidence,\n confidenceLevel,\n details,\n isValid: state === 'VALID',\n };\n }, [\n sampleSize,\n requiredSize,\n completeness,\n recency,\n variance,\n aiInferred,\n missingFields,\n staleDays,\n ]);\n}\n\n/* --------------------------------------------------------------------------\n Chart Data Validation Hook\n -------------------------------------------------------------------------- */\n\nexport interface UseChartDataParams<T> {\n data: T[];\n requiredFields: string[];\n minSampleSize?: number;\n insightType?: string;\n}\n\nexport interface UseChartDataResult<T> {\n data: T[];\n state: AnalyticalState;\n confidence: number;\n isRenderable: boolean;\n message?: string;\n}\n\n/**\n * Hook to validate chart data against data contracts.\n */\nexport function useChartData<T extends Record<string, unknown>>({\n data,\n requiredFields,\n minSampleSize = MINIMUM_SAMPLE_SIZES.overall,\n}: UseChartDataParams<T>): UseChartDataResult<T> {\n return useMemo(() => {\n // Check for missing required fields\n const missingFields: string[] = [];\n if (data.length > 0) {\n const firstRecord = data[0];\n for (const field of requiredFields) {\n if (!(field in firstRecord)) {\n missingFields.push(field);\n }\n }\n }\n\n // Calculate completeness\n let completeness = 1;\n if (data.length > 0 && requiredFields.length > 0) {\n let filled = 0;\n let total = 0;\n for (const record of data) {\n for (const field of requiredFields) {\n total++;\n const value = record[field];\n if (value !== null && value !== undefined && value !== '') {\n filled++;\n }\n }\n }\n completeness = total > 0 ? filled / total : 0;\n }\n\n // Determine state\n let state: AnalyticalState = 'VALID';\n let message: string | undefined;\n\n if (missingFields.length > 0) {\n state = 'FIELD_MISSING';\n message = `Missing fields: ${missingFields.join(', ')}`;\n } else if (data.length === 0) {\n state = 'INSUFFICIENT_SAMPLE';\n message = 'No data available';\n } else if (data.length < minSampleSize) {\n state = 'INSUFFICIENT_SAMPLE';\n message = `Sample size ${data.length} is below minimum ${minSampleSize}`;\n } else if (completeness < 0.7) {\n state = 'LOW_CONFIDENCE';\n message = `Data completeness is ${Math.round(completeness * 100)}%`;\n }\n\n // Calculate confidence\n const confidence = calculateConfidence({\n sampleSize: data.length,\n requiredSize: minSampleSize,\n completeness,\n recency: 1, // Assume fresh data if not specified\n variance: 0,\n aiInference: false,\n });\n\n const isRenderable = state === 'VALID' || state === 'LOW_CONFIDENCE';\n\n return {\n data,\n state,\n confidence,\n isRenderable,\n message,\n };\n }, [data, requiredFields, minSampleSize]);\n}\n","/* ============================================================================\n CHART ABSTRACTION LAYER — TYPE DEFINITIONS & CONTRACTS\n \n This module defines the governed chart system with:\n - Chart taxonomy (semantic families)\n - Data contracts per chart type\n - Switching rules\n - Guardrails and fallback behaviors\n ============================================================================ */\n\n/* ============================================================================\n CHART INTENT (Semantic Families)\n ============================================================================ */\n\n/**\n * Chart intent defines the semantic purpose of visualization.\n * This is the primary classifier that governs switching rules.\n */\nexport type ChartIntent =\n | 'trend' // Time-based evolution, deltas, momentum\n | 'comparison' // Comparing discrete categories\n | 'composition' // Proportions and distributions\n | 'distribution' // Statistical spread and density\n | 'relationship' // Correlation and clustering\n | 'geo'; // Geographic data\n\n/* ============================================================================\n CHART TYPE TAXONOMY\n ============================================================================ */\n\n/**\n * All supported chart types organized by intent.\n */\n\n// Trend charts (time-based)\nexport type TrendChartType = 'line' | 'smooth_line' | 'area' | 'stacked_area' | 'area_100pct';\n\n// Comparison charts (categorical)\nexport type ComparisonChartType =\n | 'bar'\n | 'column'\n | 'stacked_bar'\n | 'stacked_column'\n | 'column_100pct'\n | 'combo'; // Phase 2\n\n// Composition charts\nexport type CompositionChartType = 'pie' | 'donut' | 'treemap'; // Phase 2\n\n// Distribution charts\nexport type DistributionChartType = 'histogram' | 'radar'; // Phase 2\n\n// Relationship charts\nexport type RelationshipChartType =\n | 'scatter' // Phase 2\n | 'bubble' // Phase 2\n | 'heatmap';\n\n// Geographic charts\nexport type GeoChartType =\n | 'geo' // Phase 2\n | 'choropleth'; // Phase 2\n\n/**\n * Union of all chart types\n */\nexport type ChartTypeId =\n | TrendChartType\n | ComparisonChartType\n | CompositionChartType\n | DistributionChartType\n | RelationshipChartType\n | GeoChartType\n | 'funnel' // Special: conversion flows\n | 'waterfall' // Phase 2: sequential changes\n | 'timeline'; // Phase 2: event sequences\n\n/**\n * Chart phase classification\n */\nexport type ChartPhase = 'mvp' | 'phase2' | 'phase3';\n\n/* ============================================================================\n CHART METADATA & REGISTRY\n ============================================================================ */\n\nexport interface ChartTypeMetadata {\n id: ChartTypeId;\n name: string;\n description: string;\n intent: ChartIntent;\n phase: ChartPhase;\n\n // Data requirements\n contract: ChartDataContract;\n\n // Allowed switches within same intent\n switchableTo: ChartTypeId[];\n\n // Visual configuration\n supportsStacking: boolean;\n supportsMultipleSeries: boolean;\n requiresTimeAxis: boolean;\n maxCategories?: number;\n maxSlices?: number;\n}\n\nexport interface ChartDataContract {\n // Required data shape\n requiredDimensions: number; // e.g., 1 for pie, 2 for scatter\n requiredMeasures: number; // Number of numeric fields required\n\n // Sample size requirements\n minDataPoints: number;\n idealDataPoints: number;\n maxDataPoints?: number;\n\n // Value constraints\n allowNegativeValues: boolean;\n requireNonZeroTotal: boolean;\n\n // Warnings\n warningThresholds: {\n tooManyCategories?: number;\n imbalancedRatio?: number;\n sparseData?: number;\n };\n\n // Fallback behavior\n fallback: ChartFallbackBehavior;\n}\n\nexport type ChartFallbackBehavior =\n | { type: 'hide' }\n | { type: 'show_kpi'; message: string }\n | { type: 'aggregate'; strategy: 'other_bucket' | 'top_n' }\n | { type: 'warn'; message: string };\n\n/* ============================================================================\n CHART REGISTRY (Canonical List)\n ============================================================================ */\n\nexport const CHART_REGISTRY: Record<ChartTypeId, ChartTypeMetadata> = {\n // ══════════════════════════════════════════════════════════════════════════\n // TREND CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n line: {\n id: 'line',\n name: 'Line Chart',\n description: 'Shows trends over time with connected data points',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for trend visualization' },\n },\n switchableTo: ['smooth_line', 'area', 'stacked_area'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n smooth_line: {\n id: 'smooth_line',\n name: 'Smooth Line Chart',\n description: 'Curved line chart for smoother trend visualization',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for trend visualization' },\n },\n switchableTo: ['line', 'area', 'stacked_area'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n area: {\n id: 'area',\n name: 'Area Chart',\n description: 'Filled area under line, emphasizes volume over time',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for area visualization' },\n },\n switchableTo: ['line', 'smooth_line', 'stacked_area', 'area_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n stacked_area: {\n id: 'stacked_area',\n name: 'Stacked Area Chart',\n description: 'Multiple series stacked to show cumulative trends',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'warn', message: 'Stacked area requires non-negative values' },\n },\n switchableTo: ['line', 'area', 'area_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n area_100pct: {\n id: 'area_100pct',\n name: '100% Stacked Area',\n description: 'Shows proportional contribution over time',\n intent: 'trend',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 3,\n idealDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { sparseData: 3 },\n fallback: { type: 'warn', message: '100% stacked requires positive totals' },\n },\n switchableTo: ['stacked_area', 'area'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: true,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // COMPARISON CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n bar: {\n id: 'bar',\n name: 'Horizontal Bar Chart',\n description: 'Horizontal bars for comparing categories',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 15,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 12 },\n fallback: { type: 'aggregate', strategy: 'top_n' },\n },\n switchableTo: ['column', 'stacked_bar', 'stacked_column'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n column: {\n id: 'column',\n name: 'Vertical Column Chart',\n description: 'Vertical bars for comparing categories',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 12,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 10 },\n fallback: { type: 'aggregate', strategy: 'top_n' },\n },\n switchableTo: ['bar', 'stacked_column', 'stacked_bar'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n stacked_bar: {\n id: 'stacked_bar',\n name: 'Stacked Horizontal Bar',\n description: 'Horizontal stacked bars showing composition per category',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 8, imbalancedRatio: 0.9 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['bar', 'stacked_column', 'column_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n stacked_column: {\n id: 'stacked_column',\n name: 'Stacked Vertical Column',\n description: 'Vertical stacked columns showing composition per category',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 8, imbalancedRatio: 0.9 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['column', 'stacked_bar', 'column_100pct'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n column_100pct: {\n id: 'column_100pct',\n name: '100% Stacked Column',\n description: 'Shows proportional composition per category',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 2,\n idealDataPoints: 5,\n maxDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 8 },\n fallback: { type: 'warn', message: '100% stacked requires positive totals' },\n },\n switchableTo: ['stacked_column', 'stacked_bar'],\n supportsStacking: true,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n combo: {\n id: 'combo',\n name: 'Combo Chart',\n description: 'Combines bars with line overlay (Phase 2)',\n intent: 'comparison',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 2,\n minDataPoints: 3,\n idealDataPoints: 6,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 10 },\n fallback: { type: 'warn', message: 'Combo chart requires dual measures' },\n },\n switchableTo: ['column', 'line'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // COMPOSITION CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n pie: {\n id: 'pie',\n name: 'Pie Chart',\n description: 'Shows proportional composition of a whole',\n intent: 'composition',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 4,\n maxDataPoints: 6,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 6, imbalancedRatio: 0.95 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['donut', 'column_100pct'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n maxSlices: 6,\n },\n\n donut: {\n id: 'donut',\n name: 'Donut Chart',\n description: 'Pie chart with center cutout, can display total',\n intent: 'composition',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 2,\n idealDataPoints: 4,\n maxDataPoints: 6,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 6, imbalancedRatio: 0.95 },\n fallback: { type: 'aggregate', strategy: 'other_bucket' },\n },\n switchableTo: ['pie', 'column_100pct'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n maxSlices: 6,\n },\n\n treemap: {\n id: 'treemap',\n name: 'Treemap',\n description: 'Nested rectangles showing hierarchical composition (Phase 2)',\n intent: 'composition',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 10,\n maxDataPoints: 50,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 30 },\n fallback: { type: 'aggregate', strategy: 'top_n' },\n },\n switchableTo: ['pie', 'donut'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // DISTRIBUTION CHARTS (MVP)\n // ══════════════════════════════════════════════════════════════════════════\n histogram: {\n id: 'histogram',\n name: 'Histogram',\n description: 'Shows distribution of values across bins',\n intent: 'distribution',\n phase: 'mvp',\n contract: {\n requiredDimensions: 0,\n requiredMeasures: 1,\n minDataPoints: 10,\n idealDataPoints: 50,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 10 },\n fallback: { type: 'show_kpi', message: 'Insufficient data for distribution' },\n },\n switchableTo: ['radar'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n radar: {\n id: 'radar',\n name: 'Radar Chart',\n description: 'Multi-dimensional comparison in radial layout (Phase 2)',\n intent: 'distribution',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 3,\n minDataPoints: 3,\n idealDataPoints: 6,\n maxDataPoints: 8,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 8 },\n fallback: { type: 'warn', message: 'Radar works best with 3-8 dimensions' },\n },\n switchableTo: ['histogram'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // RELATIONSHIP CHARTS\n // ══════════════════════════════════════════════════════════════════════════\n heatmap: {\n id: 'heatmap',\n name: 'Heatmap',\n description: 'Color-coded matrix showing intensity',\n intent: 'relationship',\n phase: 'mvp',\n contract: {\n requiredDimensions: 2,\n requiredMeasures: 1,\n minDataPoints: 9,\n idealDataPoints: 25,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 9 },\n fallback: { type: 'warn', message: 'Heatmap requires grid data' },\n },\n switchableTo: ['scatter'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n scatter: {\n id: 'scatter',\n name: 'Scatter Plot',\n description: 'Shows correlation between two variables (Phase 2)',\n intent: 'relationship',\n phase: 'phase2',\n contract: {\n requiredDimensions: 0,\n requiredMeasures: 2,\n minDataPoints: 20,\n idealDataPoints: 100,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 20 },\n fallback: { type: 'show_kpi', message: 'Scatter requires 20+ points' },\n },\n switchableTo: ['bubble', 'heatmap'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n bubble: {\n id: 'bubble',\n name: 'Bubble Chart',\n description: 'Scatter with sized points for third dimension (Phase 2)',\n intent: 'relationship',\n phase: 'phase2',\n contract: {\n requiredDimensions: 0,\n requiredMeasures: 3,\n minDataPoints: 10,\n idealDataPoints: 50,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { sparseData: 10 },\n fallback: { type: 'show_kpi', message: 'Bubble requires 3 measures' },\n },\n switchableTo: ['scatter'],\n supportsStacking: false,\n supportsMultipleSeries: true,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // GEOGRAPHIC CHARTS (Phase 2)\n // ══════════════════════════════════════════════════════════════════════════\n geo: {\n id: 'geo',\n name: 'Geographic Map',\n description: 'Map with regional data markers (Phase 2)',\n intent: 'geo',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1, // geo dimension (country/region)\n requiredMeasures: 1,\n minDataPoints: 1,\n idealDataPoints: 10,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: {},\n fallback: { type: 'hide' },\n },\n switchableTo: ['choropleth'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n choropleth: {\n id: 'choropleth',\n name: 'Choropleth Map',\n description: 'Color-shaded regions by value (Phase 2)',\n intent: 'geo',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 20,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: {},\n fallback: { type: 'hide' },\n },\n switchableTo: ['geo'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n // ══════════════════════════════════════════════════════════════════════════\n // SPECIAL CHARTS\n // ══════════════════════════════════════════════════════════════════════════\n funnel: {\n id: 'funnel',\n name: 'Funnel Chart',\n description: 'Shows conversion through sequential stages',\n intent: 'comparison',\n phase: 'mvp',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 5,\n maxDataPoints: 7,\n allowNegativeValues: false,\n requireNonZeroTotal: true,\n warningThresholds: { tooManyCategories: 7 },\n fallback: { type: 'warn', message: 'Funnel requires sequential stages' },\n },\n switchableTo: ['bar'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n waterfall: {\n id: 'waterfall',\n name: 'Waterfall Chart',\n description: 'Shows cumulative effect of sequential changes (Phase 2)',\n intent: 'comparison',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 1,\n minDataPoints: 3,\n idealDataPoints: 6,\n maxDataPoints: 12,\n allowNegativeValues: true,\n requireNonZeroTotal: false,\n warningThresholds: { tooManyCategories: 10 },\n fallback: { type: 'warn', message: 'Waterfall requires sequential data' },\n },\n switchableTo: ['bar', 'column'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: false,\n },\n\n timeline: {\n id: 'timeline',\n name: 'Timeline',\n description: 'Shows events along time axis (Phase 2)',\n intent: 'trend',\n phase: 'phase2',\n contract: {\n requiredDimensions: 1,\n requiredMeasures: 0,\n minDataPoints: 2,\n idealDataPoints: 10,\n allowNegativeValues: false,\n requireNonZeroTotal: false,\n warningThresholds: {},\n fallback: { type: 'hide' },\n },\n switchableTo: ['line'],\n supportsStacking: false,\n supportsMultipleSeries: false,\n requiresTimeAxis: true,\n },\n};\n\n/* ============================================================================\n CHART FAMILY SWITCHING RULES\n ============================================================================ */\n\n/**\n * Maps intent to allowed chart types for switching.\n * Users can ONLY switch within the same intent family.\n */\nexport const INTENT_CHART_FAMILIES: Record<ChartIntent, ChartTypeId[]> = {\n trend: ['line', 'smooth_line', 'area', 'stacked_area', 'area_100pct'],\n comparison: ['bar', 'column', 'stacked_bar', 'stacked_column', 'column_100pct', 'funnel'],\n composition: ['pie', 'donut'],\n distribution: ['histogram'],\n relationship: ['heatmap'],\n geo: [],\n};\n\n/**\n * Get allowed chart types for switching from a given type.\n */\nexport function getAllowedSwitchTargets(currentType: ChartTypeId): ChartTypeId[] {\n const metadata = CHART_REGISTRY[currentType];\n if (!metadata) return [];\n\n // Only return MVP charts that are in the same family\n return metadata.switchableTo.filter((type) => {\n const targetMeta = CHART_REGISTRY[type];\n return targetMeta && targetMeta.phase === 'mvp';\n });\n}\n\n/**\n * Check if switching from one chart type to another is allowed.\n */\nexport function canSwitchChart(from: ChartTypeId, to: ChartTypeId): boolean {\n const fromMeta = CHART_REGISTRY[from];\n const toMeta = CHART_REGISTRY[to];\n\n if (!fromMeta || !toMeta) return false;\n\n // Must be same intent\n if (fromMeta.intent !== toMeta.intent) return false;\n\n // Must be in allowed list\n return fromMeta.switchableTo.includes(to);\n}\n\n/* ============================================================================\n DATA VALIDATION\n ============================================================================ */\n\nexport interface ChartValidationResult {\n isValid: boolean;\n warnings: string[];\n errors: string[];\n suggestedType?: ChartTypeId;\n fallbackAction?: ChartFallbackBehavior;\n}\n\n/**\n * Validate data against a chart's contract.\n */\nexport function validateChartData(\n chartType: ChartTypeId,\n data: unknown[],\n dimensions: string[],\n measures: string[],\n): ChartValidationResult {\n const metadata = CHART_REGISTRY[chartType];\n if (!metadata) {\n return {\n isValid: false,\n warnings: [],\n errors: [`Unknown chart type: ${chartType}`],\n };\n }\n\n const contract = metadata.contract;\n const warnings: string[] = [];\n const errors: string[] = [];\n\n // Check data points\n if (data.length < contract.minDataPoints) {\n errors.push(`Requires at least ${contract.minDataPoints} data points, got ${data.length}`);\n }\n\n if (contract.maxDataPoints && data.length > contract.maxDataPoints) {\n warnings.push(`Chart works best with ≤${contract.maxDataPoints} items. Consider aggregating.`);\n }\n\n // Check dimensions\n if (dimensions.length < contract.requiredDimensions) {\n errors.push(`Requires ${contract.requiredDimensions} dimension(s), got ${dimensions.length}`);\n }\n\n // Check measures\n if (measures.length < contract.requiredMeasures) {\n errors.push(`Requires ${contract.requiredMeasures} measure(s), got ${measures.length}`);\n }\n\n // Check for negative values if not allowed\n if (!contract.allowNegativeValues && data.length > 0) {\n const hasNegative = data.some((row: unknown) => {\n if (typeof row !== 'object' || row === null) return false;\n return measures.some((m) => {\n const val = (row as Record<string, unknown>)[m];\n return typeof val === 'number' && val < 0;\n });\n });\n if (hasNegative) {\n errors.push('This chart type does not support negative values');\n }\n }\n\n // Check warnings\n if (\n contract.warningThresholds.tooManyCategories &&\n data.length > contract.warningThresholds.tooManyCategories\n ) {\n warnings.push(`Too many categories (${data.length}). Consider grouping smaller values.`);\n }\n\n return {\n isValid: errors.length === 0,\n warnings,\n errors,\n fallbackAction: errors.length > 0 ? contract.fallback : undefined,\n };\n}\n\n/* ============================================================================\n CHART SELECTION HELPERS\n ============================================================================ */\n\n/**\n * Get MVP charts for a given intent.\n */\nexport function getMVPChartsForIntent(intent: ChartIntent): ChartTypeMetadata[] {\n return Object.values(CHART_REGISTRY).filter(\n (meta) => meta.intent === intent && meta.phase === 'mvp',\n );\n}\n\n/**\n * Get the default chart type for an intent.\n */\nexport function getDefaultChartForIntent(intent: ChartIntent): ChartTypeId {\n const defaults: Record<ChartIntent, ChartTypeId> = {\n trend: 'line',\n comparison: 'column',\n composition: 'donut',\n distribution: 'histogram',\n relationship: 'heatmap',\n geo: 'geo',\n };\n return defaults[intent];\n}\n\n/**\n * Suggest the best chart type for given data characteristics.\n */\nexport function suggestChartType(params: {\n hasTimeAxis: boolean;\n dimensionCount: number;\n measureCount: number;\n dataPointCount: number;\n hasNegativeValues: boolean;\n isSequential: boolean;\n}): ChartTypeId {\n const {\n hasTimeAxis,\n dimensionCount,\n measureCount,\n dataPointCount,\n hasNegativeValues,\n isSequential,\n } = params;\n\n // Time-based → trend charts\n if (hasTimeAxis && measureCount >= 1) {\n if (measureCount > 1 && !hasNegativeValues) return 'stacked_area';\n return 'line';\n }\n\n // Sequential stages → funnel\n if (isSequential && !hasNegativeValues && dataPointCount <= 7) {\n return 'funnel';\n }\n\n // Single measure, few categories → composition\n if (measureCount === 1 && dataPointCount <= 6 && !hasNegativeValues) {\n return 'donut';\n }\n\n // Two dimensions → heatmap\n if (dimensionCount === 2 && measureCount === 1) {\n return 'heatmap';\n }\n\n // Default to column chart\n return 'column';\n}\n","/* ============================================================================\n REPORT ENGINE — COMPOSITION VALIDATION\n ============================================================================ */\n\nimport React from 'react';\n\nexport interface ValidationIssue {\n ruleId: string;\n severity: 'error' | 'warning';\n message: string;\n component?: string;\n}\n\nexport interface ReportValidationResult {\n isValid: boolean;\n issues: ValidationIssue[];\n}\n\n/**\n * Validates the structure of a report against narrative rules.\n *\n * Rules:\n * - R1: ExecutiveThesis MUST appear exactly once, at the top (or very near top)\n * - R2: InsightBlock MUST precede any chart it references (Charts must be inside or after insights)\n * - R3: Charts CANNOT appear without a parent InsightBlock (Orphan charts)\n * - R6: Max 3 charts per InsightBlock\n */\nexport function validateReportStructure(children: React.ReactNode): ReportValidationResult {\n const issues: ValidationIssue[] = [];\n const childArray = React.Children.toArray(children);\n\n let hasThesis = false;\n let thesisIndex = -1;\n\n // Helper to get component name safely\n const getComponentName = (child: React.ReactNode): string | undefined => {\n if (!React.isValidElement(child)) return undefined;\n\n const type = child.type as { displayName?: string; name?: string };\n return type.displayName || type.name;\n };\n\n const isChart = (name?: string) => {\n return (\n name &&\n (name.endsWith('Chart') ||\n name === 'MBTIRadar' ||\n name === 'MBTITypeGrid' ||\n name === 'KeyMetric') // Metric is evidence too\n );\n };\n\n // First pass: Top-level analysis\n childArray.forEach((child, index) => {\n const name = getComponentName(child);\n\n if (name === 'ExecutiveThesis') {\n if (hasThesis) {\n issues.push({\n ruleId: 'R1',\n severity: 'error',\n message: 'Only one ExecutiveThesis is allowed per report.',\n component: 'ExecutiveThesis',\n });\n }\n hasThesis = true;\n thesisIndex = index;\n }\n\n // Check for orphan charts at root level\n if (isChart(name)) {\n issues.push({\n ruleId: 'R3',\n severity: 'error',\n message: `Orphan chart detected: <${name} />. Charts must be placed inside an InsightBlock or EvidenceGroup.`,\n component: name,\n });\n }\n\n // Check InsightBlock constraints\n if (name === 'InsightBlock' && React.isValidElement(child)) {\n validateInsightBlock(child, issues);\n }\n });\n\n // R1: Check Thesis existence and position\n if (!hasThesis) {\n issues.push({\n ruleId: 'R1',\n severity: 'error',\n message: 'Report must contain an ExecutiveThesis.',\n });\n } else if (thesisIndex > 2) {\n // Allow some spacers/headers before it\n issues.push({\n ruleId: 'R1',\n severity: 'warning',\n message: 'ExecutiveThesis should be the first major component in the report.',\n });\n }\n\n return {\n isValid: issues.filter((i) => i.severity === 'error').length === 0,\n issues,\n };\n}\n\nfunction validateInsightBlock(node: React.ReactElement, issues: ValidationIssue[]) {\n const children = node.props.children;\n const childArray = React.Children.toArray(children);\n\n // Count charts inside this block (recursive check not strictly needed if structure is flat)\n let chartsInBlock = 0;\n\n const countCharts = (nodes: React.ReactNode[]) => {\n nodes.forEach((n) => {\n const name = getComponentName(n);\n if (isChart(name)) {\n chartsInBlock++;\n }\n // Check inside EvidenceGroup\n if (name === 'EvidenceGroup' && React.isValidElement(n)) {\n countCharts(React.Children.toArray(n.props.children));\n }\n });\n };\n\n countCharts(childArray);\n\n // R6: Max 3 charts\n if (chartsInBlock > 3) {\n issues.push({\n ruleId: 'R6',\n severity: 'warning',\n message: `InsightBlock contains ${chartsInBlock} charts. Recommended maximum is 3 to prevent data dumping.`,\n component: 'InsightBlock',\n });\n }\n}\n\n// Duplicate helper for local scope\nconst getComponentName = (child: React.ReactNode): string | undefined => {\n if (!React.isValidElement(child)) return undefined;\n const type = child.type as { displayName?: string; name?: string };\n return type.displayName || type.name;\n};\n\nconst isChart = (name?: string) => {\n return (\n name &&\n (name.endsWith('Chart') ||\n name === 'MBTIRadar' ||\n name === 'MBTITypeGrid' ||\n name === 'KeyMetric')\n );\n};\n","import React from 'react';\nimport clsx from 'clsx';\nimport { ReportModeProvider } from '../../report-engine';\nimport type { ReportMode } from '../../report-engine';\nimport './ReportShell.css';\n\nexport interface ReportShellProps {\n /** Report title */\n title?: string;\n /** Report subtitle or date range */\n subtitle?: string;\n /** Report mode (executive = minimal detail, analyst = full detail) */\n mode?: ReportMode;\n /** Brand variant for theming */\n brand?: string;\n /** Callback when mode changes */\n onModeChange?: (mode: ReportMode) => void;\n /** Report content */\n children: React.ReactNode;\n /** Header actions (export, share, etc.) */\n actions?: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ReportShell is the root container for all reports.\n * It provides mode context and establishes the report structure.\n */\nexport const ReportShell = React.forwardRef<HTMLDivElement, ReportShellProps>(\n (\n {\n title,\n subtitle,\n mode = 'executive',\n brand,\n onModeChange,\n children,\n actions,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <ReportModeProvider mode={mode} onModeChange={onModeChange}>\n <div\n ref={ref}\n className={clsx('ds-report-shell', className)}\n data-mode={mode}\n data-brand={brand}\n {...props}\n >\n {(title || subtitle || actions) && (\n <header className=\"ds-report-shell__header\">\n <div className=\"ds-report-shell__header-content\">\n {title && <h1 className=\"ds-report-shell__title\">{title}</h1>}\n {subtitle && <p className=\"ds-report-shell__subtitle\">{subtitle}</p>}\n </div>\n {actions && <div className=\"ds-report-shell__actions\">{actions}</div>}\n </header>\n )}\n <main className=\"ds-report-shell__content\">{children}</main>\n </div>\n </ReportModeProvider>\n );\n },\n);\n\nReportShell.displayName = 'ReportShell';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport './ExecutiveThesis.css';\n\nexport interface ExecutiveThesisProps {\n /** The main thesis statement - the single most important finding */\n thesis: string;\n /** Supporting context for the thesis */\n context?: string;\n /** Key metric supporting the thesis */\n metric?: {\n label: string;\n value: string | number;\n trend?: 'up' | 'down' | 'neutral';\n };\n /** AI-generated indicator */\n aiGenerated?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ExecutiveThesis displays the single most important finding of a report.\n * There should be exactly ONE of these per report, at the top.\n *\n * Composition Rule: R1 - ExecutiveThesis MUST appear exactly once, at the top.\n */\nexport const ExecutiveThesis = React.forwardRef<HTMLElement, ExecutiveThesisProps>(\n ({ thesis, context, metric, aiGenerated, className, ...props }, ref) => {\n const { features } = useReportMode();\n\n return (\n <section\n ref={ref}\n className={clsx('ds-executive-thesis', className)}\n aria-labelledby=\"executive-thesis-title\"\n {...props}\n >\n <div className=\"ds-executive-thesis__content\">\n <h2 id=\"executive-thesis-title\" className=\"ds-executive-thesis__title\">\n Key Finding\n {aiGenerated && features.showConfidenceScores && (\n <span className=\"ds-executive-thesis__ai-badge\">AI Generated</span>\n )}\n </h2>\n <p className=\"ds-executive-thesis__thesis\">{thesis}</p>\n {context && <p className=\"ds-executive-thesis__context\">{context}</p>}\n </div>\n\n {metric && (\n <div className=\"ds-executive-thesis__metric\">\n <span className=\"ds-executive-thesis__metric-label\">{metric.label}</span>\n <span\n className={clsx(\n 'ds-executive-thesis__metric-value',\n metric.trend && `ds-executive-thesis__metric-value--${metric.trend}`,\n )}\n >\n {metric.trend === 'up' && '↑ '}\n {metric.trend === 'down' && '↓ '}\n {metric.value}\n </span>\n </div>\n )}\n </section>\n );\n },\n);\n\nExecutiveThesis.displayName = 'ExecutiveThesis';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode, type InsightType, INSIGHT_TYPE_CONTRACTS } from '../../report-engine';\nimport './InsightBlock.css';\n\nexport interface InsightBlockProps {\n /** The type of insight - constrains allowed child charts */\n type: InsightType;\n /** The insight headline */\n headline: string;\n /** Supporting description */\n description?: string;\n /** Confidence score (0-100) */\n confidence?: number;\n /** Methodology notes (shown in analyst mode) */\n methodology?: string;\n /** Evidence charts (max 3 per composition rules) */\n children: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * InsightBlock groups an insight with its supporting evidence.\n *\n * Composition Rules:\n * - R2: InsightBlock MUST precede any chart it references\n * - R3: Charts CANNOT appear without a parent InsightBlock\n * - R6: Max 3 charts per InsightBlock\n */\nexport const InsightBlock = React.forwardRef<HTMLElement, InsightBlockProps>(\n (\n { type, headline, description, confidence, methodology, children, className, ...props },\n ref,\n ) => {\n const { features } = useReportMode();\n const contract = INSIGHT_TYPE_CONTRACTS[type];\n\n // Determine confidence level\n const getConfidenceClass = () => {\n if (confidence === undefined) return '';\n if (confidence >= 90) return 'ds-insight-block--confidence-high';\n if (confidence >= 70) return 'ds-insight-block--confidence-moderate';\n if (confidence >= 50) return 'ds-insight-block--confidence-low';\n return 'ds-insight-block--confidence-insufficient';\n };\n\n return (\n <section\n ref={ref}\n className={clsx('ds-insight-block', getConfidenceClass(), className)}\n data-insight-type={type}\n aria-labelledby={`insight-${type}-title`}\n {...props}\n >\n <header className=\"ds-insight-block__header\">\n <div className=\"ds-insight-block__meta\">\n <span className=\"ds-insight-block__type\">{type.replace(/-/g, ' ')}</span>\n {features.showConfidenceScores && confidence !== undefined && (\n <span className=\"ds-insight-block__confidence\">{confidence}% confidence</span>\n )}\n </div>\n <h3 id={`insight-${type}-title`} className=\"ds-insight-block__headline\">\n {headline}\n </h3>\n {description && <p className=\"ds-insight-block__description\">{description}</p>}\n </header>\n\n <div className=\"ds-insight-block__evidence\">{children}</div>\n\n {features.showMethodology && methodology && (\n <footer className=\"ds-insight-block__methodology\">\n <h4 className=\"ds-insight-block__methodology-title\">Methodology</h4>\n <p className=\"ds-insight-block__methodology-text\">{methodology}</p>\n {contract && (\n <p className=\"ds-insight-block__methodology-contract\">\n Min sample: {contract.minSampleSize} | Allowed charts:{' '}\n {contract.allowedCharts.join(', ')}\n </p>\n )}\n </footer>\n )}\n </section>\n );\n },\n);\n\nInsightBlock.displayName = 'InsightBlock';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './EvidenceGroup.css';\n\nexport interface EvidenceGroupProps {\n /** Group title */\n title?: string;\n /** Layout direction */\n layout?: 'row' | 'column' | 'grid';\n /** Number of columns for grid layout */\n columns?: 1 | 2 | 3;\n /** Evidence charts (max 3 per composition rules) */\n children: React.ReactNode;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * EvidenceGroup contains related charts under an InsightBlock.\n *\n * Composition Rule: R6 - Max 3 charts per InsightBlock (enforced via EvidenceGroup)\n */\nexport const EvidenceGroup = React.forwardRef<HTMLDivElement, EvidenceGroupProps>(\n ({ title, layout = 'row', columns = 2, children, className, ...props }, ref) => {\n // Count children to enforce composition rule\n const childCount = React.Children.count(children);\n\n if (childCount > 3) {\n console.warn(\n `EvidenceGroup: Maximum 3 charts allowed per insight block (received ${childCount}). ` +\n 'This violates composition rule R6.',\n );\n }\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-evidence-group',\n `ds-evidence-group--${layout}`,\n layout === 'grid' && `ds-evidence-group--cols-${columns}`,\n className,\n )}\n role=\"group\"\n aria-label={title || 'Evidence charts'}\n {...props}\n >\n {title && <h4 className=\"ds-evidence-group__title\">{title}</h4>}\n <div className=\"ds-evidence-group__content\">{children}</div>\n </div>\n );\n },\n);\n\nEvidenceGroup.displayName = 'EvidenceGroup';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { getConfidenceThreshold } from '../../report-engine';\nimport './ConfidenceIndicator.css';\n\nexport interface ConfidenceIndicatorProps {\n /** Confidence score (0-100) */\n score: number;\n /** Show the numeric score */\n showScore?: boolean;\n /** Show the label */\n showLabel?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * ConfidenceIndicator displays the reliability score of an insight or data point.\n * This is a guardrail component that helps users understand data quality.\n */\nexport const ConfidenceIndicator = React.forwardRef<HTMLDivElement, ConfidenceIndicatorProps>(\n ({ score, showScore = true, showLabel = true, size = 'md', className, ...props }, ref) => {\n const threshold = getConfidenceThreshold(score);\n const normalizedScore = Math.max(0, Math.min(100, score));\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-confidence-indicator',\n `ds-confidence-indicator--${size}`,\n `ds-confidence-indicator--${threshold.level}`,\n className,\n )}\n role=\"meter\"\n aria-valuenow={normalizedScore}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-label={`Confidence: ${threshold.label} (${normalizedScore}%)`}\n {...props}\n >\n <div className=\"ds-confidence-indicator__bar\">\n <div className=\"ds-confidence-indicator__fill\" style={{ width: `${normalizedScore}%` }} />\n </div>\n <div className=\"ds-confidence-indicator__text\">\n {showScore && <span className=\"ds-confidence-indicator__score\">{normalizedScore}%</span>}\n {showLabel && <span className=\"ds-confidence-indicator__label\">{threshold.label}</span>}\n </div>\n </div>\n );\n },\n);\n\nConfidenceIndicator.displayName = 'ConfidenceIndicator';\n","import React from 'react';\nimport clsx from 'clsx';\nimport './DataCoverageBadge.css';\n\nexport interface DataCoverageBadgeProps {\n /** Current sample size */\n sampleSize: number;\n /** Required minimum sample size */\n requiredSize?: number;\n /** Date range covered */\n dateRange?: {\n start: string;\n end: string;\n };\n /** Show date range */\n showDateRange?: boolean;\n /** Size variant */\n size?: 'sm' | 'md';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * DataCoverageBadge shows the sample size and optionally the date range of the data.\n * This is a guardrail component that helps users understand data coverage.\n */\nexport const DataCoverageBadge = React.forwardRef<HTMLDivElement, DataCoverageBadgeProps>(\n (\n { sampleSize, requiredSize, dateRange, showDateRange = true, size = 'md', className, ...props },\n ref,\n ) => {\n const isSufficient = !requiredSize || sampleSize >= requiredSize;\n const percentage = requiredSize\n ? Math.min(100, Math.round((sampleSize / requiredSize) * 100))\n : 100;\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-data-coverage-badge',\n `ds-data-coverage-badge--${size}`,\n !isSufficient && 'ds-data-coverage-badge--insufficient',\n className,\n )}\n {...props}\n >\n <div className=\"ds-data-coverage-badge__sample\">\n <span className=\"ds-data-coverage-badge__icon\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"9\" cy=\"7\" r=\"4\" />\n <path d=\"M23 21v-2a4 4 0 0 0-3-3.87\" />\n <path d=\"M16 3.13a4 4 0 0 1 0 7.75\" />\n </svg>\n </span>\n <span className=\"ds-data-coverage-badge__count\">n={sampleSize.toLocaleString()}</span>\n {requiredSize && (\n <span className=\"ds-data-coverage-badge__required\">\n ({percentage}% of min {requiredSize})\n </span>\n )}\n </div>\n\n {showDateRange && dateRange && (\n <div className=\"ds-data-coverage-badge__date\">\n <span className=\"ds-data-coverage-badge__icon\">\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n </svg>\n </span>\n <span>\n {dateRange.start} – {dateRange.end}\n </span>\n </div>\n )}\n </div>\n );\n },\n);\n\nDataCoverageBadge.displayName = 'DataCoverageBadge';\n","import React from 'react';\nimport clsx from 'clsx';\nimport type { AnalyticalState, DataStateDetails } from '../../report-engine';\nimport { ANALYTICAL_STATE_CONFIG } from '../../report-engine';\nimport './DataStateIndicator.css';\n\nexport interface DataStateIndicatorProps {\n /** Current analytical state */\n state: AnalyticalState;\n /** Additional details about the state */\n details?: DataStateDetails;\n /** Show full details or compact */\n variant?: 'compact' | 'full';\n /** Action button handler */\n onAction?: () => void;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * DataStateIndicator shows the analytical state of data (valid, insufficient, etc.).\n * This is a guardrail component that prevents misleading outputs.\n */\nexport const DataStateIndicator = React.forwardRef<HTMLDivElement, DataStateIndicatorProps>(\n ({ state, details, variant = 'compact', onAction, className, ...props }, ref) => {\n const config = ANALYTICAL_STATE_CONFIG[state];\n\n // Don't render if valid and compact\n if (state === 'VALID' && variant === 'compact') {\n return null;\n }\n\n const renderIcon = () => {\n switch (config.icon) {\n case 'check':\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=\"20,6 9,17 4,12\" />\n </svg>\n );\n case 'alert-triangle':\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=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n case 'alert-circle':\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\" />\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\" />\n </svg>\n );\n case 'x-circle':\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\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n case 'cpu':\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=\"4\" width=\"16\" height=\"16\" rx=\"2\" ry=\"2\" />\n <rect x=\"9\" y=\"9\" width=\"6\" height=\"6\" />\n <line x1=\"9\" y1=\"1\" x2=\"9\" y2=\"4\" />\n <line x1=\"15\" y1=\"1\" x2=\"15\" y2=\"4\" />\n <line x1=\"9\" y1=\"20\" x2=\"9\" y2=\"23\" />\n <line x1=\"15\" y1=\"20\" x2=\"15\" y2=\"23\" />\n <line x1=\"20\" y1=\"9\" x2=\"23\" y2=\"9\" />\n <line x1=\"20\" y1=\"14\" x2=\"23\" y2=\"14\" />\n <line x1=\"1\" y1=\"9\" x2=\"4\" y2=\"9\" />\n <line x1=\"1\" y1=\"14\" x2=\"4\" y2=\"14\" />\n </svg>\n );\n default:\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\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n }\n };\n\n return (\n <div\n ref={ref}\n className={clsx(\n 'ds-data-state-indicator',\n `ds-data-state-indicator--${variant}`,\n `ds-data-state-indicator--${state.toLowerCase().replace(/_/g, '-')}`,\n className,\n )}\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n <span className=\"ds-data-state-indicator__icon\" style={{ color: config.color }}>\n {renderIcon()}\n </span>\n\n <div className=\"ds-data-state-indicator__content\">\n <span className=\"ds-data-state-indicator__label\">{config.label}</span>\n\n {variant === 'full' && details && (\n <span className=\"ds-data-state-indicator__details\">\n {details.message}\n {details.sampleSize !== undefined && details.requiredSize !== undefined && (\n <>\n {' '}\n (n={details.sampleSize}/{details.requiredSize})\n </>\n )}\n {details.confidence !== undefined && <> • {details.confidence}% confidence</>}\n {details.missingFields && details.missingFields.length > 0 && (\n <> • Missing: {details.missingFields.join(', ')}</>\n )}\n </span>\n )}\n </div>\n\n {config.action && onAction && (\n <button type=\"button\" className=\"ds-data-state-indicator__action\" onClick={onAction}>\n {config.action}\n </button>\n )}\n </div>\n );\n },\n);\n\nDataStateIndicator.displayName = 'DataStateIndicator';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport './MethodologyNote.css';\n\n/** Translatable labels for the MethodologyNote component. */\nexport interface MethodologyNoteLabels {\n /** Title text and aria-label. @default \"Methodology\" */\n title?: string;\n /** Label for the sample size row. @default \"Sample Size\" */\n sampleSize?: string;\n /** Label for the data sources row. @default \"Data Sources\" */\n dataSources?: string;\n /** Label for the calculation row. @default \"Calculation\" */\n calculation?: string;\n}\n\nexport interface MethodologyNoteProps {\n /** Methodology description */\n children: React.ReactNode;\n /** Sample size (triggers automatic display if < 100) */\n sampleSize?: number;\n /** Data sources used */\n sources?: string[];\n /** Calculation method */\n calculation?: string;\n /** Always show regardless of mode */\n forceShow?: boolean;\n /** Additional CSS class */\n className?: string;\n /** Override default English labels for i18n. */\n labels?: MethodologyNoteLabels;\n}\n\n/**\n * MethodologyNote documents how data was collected and calculated.\n *\n * Composition Rule: R4 - MethodologyNote MUST appear if sample size < 100\n */\nexport const MethodologyNote = React.forwardRef<HTMLElement, MethodologyNoteProps>(\n ({ children, sampleSize, sources, calculation, forceShow = false, className, labels, ...props }, ref) => {\n const titleText = labels?.title ?? 'Methodology';\n const sampleSizeLabel = labels?.sampleSize ?? 'Sample Size';\n const dataSourcesLabel = labels?.dataSources ?? 'Data Sources';\n const calculationLabel = labels?.calculation ?? 'Calculation';\n const { features } = useReportMode();\n\n // In executive mode, only show if forced or sample size < 100\n const shouldShow =\n forceShow || features.showMethodology || (sampleSize !== undefined && sampleSize < 100);\n\n if (!shouldShow) {\n return null;\n }\n\n return (\n <aside\n ref={ref}\n className={clsx('ds-methodology-note', className)}\n aria-label={titleText}\n {...props}\n >\n <div className=\"ds-methodology-note__header\">\n <svg\n className=\"ds-methodology-note__icon\"\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\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n <span className=\"ds-methodology-note__title\">{titleText}</span>\n </div>\n\n <div className=\"ds-methodology-note__content\">{children}</div>\n\n {(sources || calculation || sampleSize !== undefined) && (\n <dl className=\"ds-methodology-note__details\">\n {sampleSize !== undefined && (\n <>\n <dt>{sampleSizeLabel}</dt>\n <dd>n={sampleSize.toLocaleString()}</dd>\n </>\n )}\n {sources && sources.length > 0 && (\n <>\n <dt>{dataSourcesLabel}</dt>\n <dd>{sources.join(', ')}</dd>\n </>\n )}\n {calculation && (\n <>\n <dt>{calculationLabel}</dt>\n <dd>{calculation}</dd>\n </>\n )}\n </dl>\n )}\n </aside>\n );\n },\n);\n\nMethodologyNote.displayName = 'MethodologyNote';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode } from '../../report-engine';\nimport './CaveatBlock.css';\n\nexport interface CaveatBlockProps {\n /** Caveat title/summary */\n title?: string;\n /** Caveat details */\n children: React.ReactNode;\n /** Severity level */\n severity?: 'info' | 'warning' | 'critical';\n /** Confidence score that triggered this caveat */\n confidence?: number;\n /** Always show regardless of mode */\n forceShow?: boolean;\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * CaveatBlock displays limitations and warnings about the data or analysis.\n *\n * Composition Rule: Required if confidence < 70%\n */\nexport const CaveatBlock = React.forwardRef<HTMLElement, CaveatBlockProps>(\n (\n {\n title = 'Important Caveat',\n children,\n severity = 'warning',\n confidence,\n forceShow = false,\n className,\n ...props\n },\n ref,\n ) => {\n const { features } = useReportMode();\n\n // In executive mode, only show if forced or confidence < 70%\n const shouldShow =\n forceShow || features.showMethodology || (confidence !== undefined && confidence < 70);\n\n if (!shouldShow) {\n return null;\n }\n\n const renderIcon = () => {\n if (severity === 'critical') {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\" />\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\" />\n </svg>\n );\n }\n if (severity === 'info') {\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\" />\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\" />\n </svg>\n );\n }\n return (\n <svg\n width=\"18\"\n height=\"18\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\" />\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\" />\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\" />\n </svg>\n );\n };\n\n return (\n <aside\n ref={ref}\n className={clsx('ds-caveat-block', `ds-caveat-block--${severity}`, className)}\n role=\"note\"\n aria-label={title}\n {...props}\n >\n <div className=\"ds-caveat-block__header\">\n <span className=\"ds-caveat-block__icon\">{renderIcon()}</span>\n <span className=\"ds-caveat-block__title\">{title}</span>\n {confidence !== undefined && (\n <span className=\"ds-caveat-block__confidence\">{confidence}% confidence</span>\n )}\n </div>\n <div className=\"ds-caveat-block__content\">{children}</div>\n </aside>\n );\n },\n);\n\nCaveatBlock.displayName = 'CaveatBlock';\n","import React from 'react';\nimport clsx from 'clsx';\nimport { useReportMode, useDataState, type TrendDirection } from '../../report-engine';\nimport './KeyMetric.css';\n\nexport interface KeyMetricProps {\n /** Metric title/label */\n title: string;\n /** Primary value */\n value: string | number;\n /** Value prefix (e.g., '$', '#') */\n prefix?: string;\n /** Value suffix (e.g., '%', 'users') */\n suffix?: string;\n /** Trend indicator */\n trend?: {\n value: number;\n direction: TrendDirection;\n label?: string;\n };\n /** Secondary metric */\n secondary?: {\n label: string;\n value: string | number;\n };\n /** Sample size for data state */\n sampleSize?: number;\n /** Confidence score */\n confidence?: number;\n /** Click handler for drill-down */\n onClick?: () => void;\n /** Loading state */\n loading?: boolean;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * KeyMetric displays a single KPI with trend indicator and optional drill-down.\n * This is an analytical component with built-in data state awareness.\n */\nexport const KeyMetric = React.forwardRef<HTMLDivElement, KeyMetricProps>(\n (\n {\n title,\n value,\n prefix,\n suffix,\n trend,\n secondary,\n sampleSize,\n confidence,\n onClick,\n loading,\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n const { features } = useReportMode();\n const { isValid } = useDataState({\n sampleSize: sampleSize ?? 100,\n requiredSize: 30,\n });\n\n const isClickable = onClick && !loading;\n\n const formatValue = (val: string | number) => {\n if (typeof val === 'number') {\n return val.toLocaleString();\n }\n return val;\n };\n\n const getTrendIcon = (direction: TrendDirection) => {\n switch (direction) {\n case 'up':\n return '↑';\n case 'down':\n return '↓';\n default:\n return '→';\n }\n };\n\n const Component = isClickable ? 'button' : 'div';\n\n return (\n <Component\n ref={ref as React.Ref<HTMLButtonElement & HTMLDivElement>}\n className={clsx(\n 'ds-key-metric',\n `ds-key-metric--${size}`,\n loading && 'ds-key-metric--loading',\n isClickable && 'ds-key-metric--clickable',\n !isValid && 'ds-key-metric--invalid',\n className,\n )}\n onClick={isClickable ? onClick : undefined}\n type={isClickable ? 'button' : undefined}\n {...props}\n >\n <div className=\"ds-key-metric__header\">\n <span className=\"ds-key-metric__title\">{title}</span>\n {features.showConfidenceScores && confidence !== undefined && (\n <span className=\"ds-key-metric__confidence\">{confidence}%</span>\n )}\n </div>\n\n <div className=\"ds-key-metric__value-row\">\n <span className=\"ds-key-metric__value\">\n {prefix && <span className=\"ds-key-metric__prefix\">{prefix}</span>}\n {loading ? '—' : formatValue(value)}\n {suffix && <span className=\"ds-key-metric__suffix\">{suffix}</span>}\n </span>\n\n {trend && (\n <span\n className={clsx('ds-key-metric__trend', `ds-key-metric__trend--${trend.direction}`)}\n >\n <span className=\"ds-key-metric__trend-icon\">{getTrendIcon(trend.direction)}</span>\n <span className=\"ds-key-metric__trend-value\">{Math.abs(trend.value)}%</span>\n {trend.label && <span className=\"ds-key-metric__trend-label\">{trend.label}</span>}\n </span>\n )}\n </div>\n\n {secondary && (\n <div className=\"ds-key-metric__secondary\">\n <span className=\"ds-key-metric__secondary-label\">{secondary.label}:</span>\n <span className=\"ds-key-metric__secondary-value\">{formatValue(secondary.value)}</span>\n </div>\n )}\n\n {features.showMethodology && sampleSize !== undefined && (\n <div className=\"ds-key-metric__sample\">n={sampleSize.toLocaleString()}</div>\n )}\n </Component>\n );\n },\n);\n\nKeyMetric.displayName = 'KeyMetric';\n","import React from 'react';\nimport clsx from 'clsx';\nimport type { TrendDirection } from '../../report-engine';\nimport './TrendIndicator.css';\n\nexport interface TrendIndicatorProps {\n /** Percentage change */\n value: number;\n /** Override direction (auto-detected from value) */\n direction?: TrendDirection;\n /** Positive is good (green) or bad (red) */\n positiveIsGood?: boolean;\n /** Show arrow icon */\n showIcon?: boolean;\n /** Show the percentage sign */\n showPercent?: boolean;\n /** Size */\n size?: 'sm' | 'md' | 'lg';\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * TrendIndicator shows directional change with color coding.\n * Requires at least 2 data points to be meaningful.\n */\nexport const TrendIndicator = React.forwardRef<HTMLSpanElement, TrendIndicatorProps>(\n (\n {\n value,\n direction: directionOverride,\n positiveIsGood = true,\n showIcon = true,\n showPercent = true,\n size = 'md',\n className,\n ...props\n },\n ref,\n ) => {\n // Determine direction from value or override\n const direction: TrendDirection =\n directionOverride ?? (value > 0 ? 'up' : value < 0 ? 'down' : 'neutral');\n\n // Determine if this is a \"good\" or \"bad\" trend\n const isGood = positiveIsGood ? direction === 'up' : direction === 'down';\n\n const isBad = positiveIsGood ? direction === 'down' : direction === 'up';\n\n const getIcon = () => {\n switch (direction) {\n case 'up':\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <polyline points=\"18,15 12,9 6,15\" />\n </svg>\n );\n case 'down':\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <polyline points=\"6,9 12,15 18,9\" />\n </svg>\n );\n default:\n return (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n );\n }\n };\n\n return (\n <span\n ref={ref}\n className={clsx(\n 'ds-trend-indicator',\n `ds-trend-indicator--${size}`,\n `ds-trend-indicator--${direction}`,\n isGood && 'ds-trend-indicator--good',\n isBad && 'ds-trend-indicator--bad',\n className,\n )}\n aria-label={`${direction === 'up' ? 'Increased' : direction === 'down' ? 'Decreased' : 'No change'} by ${Math.abs(value)}%`}\n {...props}\n >\n {showIcon && <span className=\"ds-trend-indicator__icon\">{getIcon()}</span>}\n <span className=\"ds-trend-indicator__value\">\n {value > 0 && '+'}\n {value.toFixed(1)}\n {showPercent && '%'}\n </span>\n </span>\n );\n },\n);\n\nTrendIndicator.displayName = 'TrendIndicator';\n","import React from 'react';\nimport { Select as BaseSelect } from '@base-ui/react/select';\nimport clsx from 'clsx';\nimport './Select.css';\n\n/* ============================================================================\n SELECT ROOT\n ============================================================================ */\n\nexport interface SelectProps {\n /** Current selected value */\n value?: string;\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n /** Callback when value changes */\n onValueChange?: (value: string | null) => void;\n /** Whether the select is disabled */\n disabled?: boolean;\n /** Whether the select is required */\n required?: boolean;\n /** Name for form submission */\n name?: string;\n /**\n * Item label map for Value display resolution.\n * When provided, Select.Value renders the label instead of the raw value.\n * Accepts a record (e.g. `{ en: \"English\", fr: \"French\" }`) or an array\n * of `{ value, label }` objects.\n */\n items?: Record<string, React.ReactNode> | ReadonlyArray<{ label: React.ReactNode; value: string }>;\n /** Children (SelectTrigger, SelectContent, etc.) */\n children: React.ReactNode;\n}\n\nexport function Select({\n value,\n defaultValue,\n onValueChange,\n disabled,\n required,\n name,\n items,\n children,\n}: SelectProps) {\n return (\n <BaseSelect.Root\n value={value}\n defaultValue={defaultValue}\n onValueChange={onValueChange ? (val) => onValueChange(val) : undefined}\n disabled={disabled}\n required={required}\n name={name}\n items={items}\n >\n {children}\n </BaseSelect.Root>\n );\n}\n\nSelect.displayName = 'Select';\n\n/* ============================================================================\n SELECT TRIGGER\n ============================================================================ */\n\nexport interface SelectTriggerProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Placeholder text when no value selected */\n placeholder?: string;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg';\n}\n\nexport const SelectTrigger = React.forwardRef<HTMLButtonElement, SelectTriggerProps>(\n ({ className, placeholder = 'Select...', size = 'md', ...props }, ref) => {\n return (\n <div className=\"ds-select__trigger-wrapper\">\n <BaseSelect.Trigger\n ref={ref}\n className={clsx('ds-select__trigger', `ds-select__trigger--${size}`, className)}\n aria-label={props['aria-label'] || (typeof placeholder === 'string' ? placeholder : 'Select')}\n {...props}\n >\n <BaseSelect.Value className=\"ds-select__value\" placeholder={placeholder} />\n <BaseSelect.Icon className=\"ds-select__icon\" aria-hidden>\n <ChevronDownIcon />\n </BaseSelect.Icon>\n </BaseSelect.Trigger>\n </div>\n );\n },\n);\n\nSelectTrigger.displayName = 'SelectTrigger';\n\n/* ============================================================================\n SELECT CONTENT\n ============================================================================ */\n\nexport interface SelectContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Positioning side */\n side?: 'top' | 'bottom';\n /** Side offset in pixels */\n sideOffset?: number;\n /** Alignment */\n align?: 'start' | 'center' | 'end';\n}\n\nexport const SelectContent = React.forwardRef<HTMLDivElement, SelectContentProps>(\n ({ className, side = 'bottom', sideOffset = 4, align = 'start', children, ...props }, ref) => {\n return (\n <BaseSelect.Portal>\n <BaseSelect.Positioner\n side={side}\n sideOffset={sideOffset}\n align={align}\n alignItemWithTrigger={false}\n >\n <BaseSelect.Popup ref={ref} className={clsx('ds-select__content', className)} {...props}>\n <BaseSelect.List className=\"ds-select__list\">\n {children}\n </BaseSelect.List>\n </BaseSelect.Popup>\n </BaseSelect.Positioner>\n </BaseSelect.Portal>\n );\n },\n);\n\nSelectContent.displayName = 'SelectContent';\n\n/* ============================================================================\n SELECT ITEM\n ============================================================================ */\n\nexport interface SelectItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, 'children'> {\n /** Value for this option */\n value: string;\n /** Display text */\n children: React.ReactNode;\n /** Whether the item is disabled */\n disabled?: boolean;\n}\n\nexport const SelectItem = React.forwardRef<HTMLDivElement, SelectItemProps>(\n ({ className, value, children, disabled, ...props }, ref) => {\n return (\n <BaseSelect.Item\n ref={ref}\n value={value}\n disabled={disabled}\n className={clsx('ds-select__item', className)}\n {...props}\n >\n <BaseSelect.ItemIndicator className=\"ds-select__item-indicator\">\n <CheckIcon />\n </BaseSelect.ItemIndicator>\n <BaseSelect.ItemText>{children}</BaseSelect.ItemText>\n </BaseSelect.Item>\n );\n },\n);\n\nSelectItem.displayName = 'SelectItem';\n\n/* ============================================================================\n SELECT GROUP\n ============================================================================ */\n\nexport interface SelectGroupProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Group label */\n label?: string;\n}\n\nexport const SelectGroup = React.forwardRef<HTMLDivElement, SelectGroupProps>(\n ({ className, label, children, ...props }, ref) => {\n return (\n <BaseSelect.Group ref={ref} className={clsx('ds-select__group', className)} {...props}>\n {label && (\n <BaseSelect.GroupLabel className=\"ds-select__group-label\">{label}</BaseSelect.GroupLabel>\n )}\n {children}\n </BaseSelect.Group>\n );\n },\n);\n\nSelectGroup.displayName = 'SelectGroup';\n\n/* ============================================================================\n SELECT SEPARATOR\n ============================================================================ */\n\nexport const SelectSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return <div ref={ref} className={clsx('ds-select__separator', className)} {...props} />;\n});\n\nSelectSeparator.displayName = 'SelectSeparator';\n\n/* ============================================================================\n ICONS\n ============================================================================ */\n\nfunction ChevronDownIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n );\n}\n","import React from 'react';\nimport clsx from 'clsx';\nimport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuLabel,\n} from '../DropdownMenu';\nimport './ExportMenu.css';\n\nexport type ExportFormat = 'pdf' | 'csv' | 'xlsx' | 'pptx' | 'png' | 'json';\n\nexport interface ExportOption {\n /** Export format */\n format: ExportFormat;\n /** Display label */\n label: string;\n /** Optional description */\n description?: string;\n /** Whether this option is disabled */\n disabled?: boolean;\n}\n\nexport interface ExportMenuProps {\n /** Available export options */\n options?: ExportOption[];\n /** Callback when an export option is selected */\n onExport: (format: ExportFormat) => void;\n /** Whether export is currently in progress */\n isExporting?: boolean;\n /** Button label */\n label?: string;\n /** Button size */\n size?: 'sm' | 'md' | 'lg';\n /** Button variant */\n variant?: 'primary' | 'secondary' | 'outline';\n /** Additional CSS class */\n className?: string;\n /** Disabled state */\n disabled?: boolean;\n}\n\nconst DEFAULT_OPTIONS: ExportOption[] = [\n { format: 'pdf', label: 'PDF Document', description: 'Best for sharing reports' },\n { format: 'pptx', label: 'PowerPoint', description: 'Editable presentation' },\n { format: 'xlsx', label: 'Excel Spreadsheet', description: 'Data with charts' },\n { format: 'csv', label: 'CSV Data', description: 'Raw data only' },\n { format: 'png', label: 'PNG Image', description: 'Chart screenshot' },\n { format: 'json', label: 'JSON', description: 'Developer format' },\n];\n\nconst FORMAT_ICONS: Record<ExportFormat, React.ReactNode> = {\n pdf: <PdfIcon />,\n csv: <CsvIcon />,\n xlsx: <ExcelIcon />,\n pptx: <PptIcon />,\n png: <ImageIcon />,\n json: <JsonIcon />,\n};\n\n/**\n * ExportMenu provides a dropdown for exporting reports in various formats.\n * This is an interface-only component - actual export logic is implemented at the app layer.\n */\nexport function ExportMenu({\n options = DEFAULT_OPTIONS,\n onExport,\n isExporting = false,\n label = 'Export',\n size = 'md',\n variant = 'secondary',\n className,\n disabled,\n}: ExportMenuProps) {\n const documentOptions = options.filter((o) => ['pdf', 'pptx'].includes(o.format));\n const dataOptions = options.filter((o) => ['xlsx', 'csv', 'json'].includes(o.format));\n const imageOptions = options.filter((o) => ['png'].includes(o.format));\n\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n className={clsx(\n 'ds-export-menu__trigger',\n 'ds-button',\n `ds-button--${variant}`,\n `ds-button--${size}`,\n className,\n )}\n disabled={disabled || isExporting}\n >\n {isExporting ? (\n <>\n <LoadingIcon />\n Exporting...\n </>\n ) : (\n <>\n <ExportIcon />\n {label}\n </>\n )}\n </DropdownMenuTrigger>\n\n <DropdownMenuContent side=\"bottom\" align=\"end\" sideOffset={4}>\n {documentOptions.length > 0 && (\n <>\n <DropdownMenuLabel>Documents</DropdownMenuLabel>\n {documentOptions.map((option) => (\n <DropdownMenuItem\n key={option.format}\n disabled={option.disabled}\n onClick={() => onExport(option.format)}\n >\n <span className=\"ds-export-menu__item-icon\">{FORMAT_ICONS[option.format]}</span>\n <span className=\"ds-export-menu__item-content\">\n <span className=\"ds-export-menu__item-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-export-menu__item-description\">{option.description}</span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </>\n )}\n\n {documentOptions.length > 0 && dataOptions.length > 0 && <DropdownMenuSeparator />}\n\n {dataOptions.length > 0 && (\n <>\n <DropdownMenuLabel>Data</DropdownMenuLabel>\n {dataOptions.map((option) => (\n <DropdownMenuItem\n key={option.format}\n disabled={option.disabled}\n onClick={() => onExport(option.format)}\n >\n <span className=\"ds-export-menu__item-icon\">{FORMAT_ICONS[option.format]}</span>\n <span className=\"ds-export-menu__item-content\">\n <span className=\"ds-export-menu__item-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-export-menu__item-description\">{option.description}</span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </>\n )}\n\n {imageOptions.length > 0 && (dataOptions.length > 0 || documentOptions.length > 0) && (\n <DropdownMenuSeparator />\n )}\n\n {imageOptions.length > 0 && (\n <>\n <DropdownMenuLabel>Image</DropdownMenuLabel>\n {imageOptions.map((option) => (\n <DropdownMenuItem\n key={option.format}\n disabled={option.disabled}\n onClick={() => onExport(option.format)}\n >\n <span className=\"ds-export-menu__item-icon\">{FORMAT_ICONS[option.format]}</span>\n <span className=\"ds-export-menu__item-content\">\n <span className=\"ds-export-menu__item-label\">{option.label}</span>\n {option.description && (\n <span className=\"ds-export-menu__item-description\">{option.description}</span>\n )}\n </span>\n </DropdownMenuItem>\n ))}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nExportMenu.displayName = 'ExportMenu';\n\n/* ============================================================================\n ICONS\n ============================================================================ */\n\nfunction ExportIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n );\n}\n\nfunction LoadingIcon() {\n return (\n <svg\n className=\"ds-export-menu__loading-icon\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\nfunction PdfIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"16\" y1=\"13\" x2=\"8\" y2=\"13\" />\n <line x1=\"16\" y1=\"17\" x2=\"8\" y2=\"17\" />\n <polyline points=\"10 9 9 9 8 9\" />\n </svg>\n );\n}\n\nfunction CsvIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"16\" y2=\"17\" />\n </svg>\n );\n}\n\nfunction ExcelIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n}\n\nfunction PptIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" />\n <line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\" />\n <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\" />\n </svg>\n );\n}\n\nfunction ImageIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <path d=\"m21 15-5-5L5 21\" />\n </svg>\n );\n}\n\nfunction JsonIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M8 3H7a2 2 0 0 0-2 2v5a2 2 0 0 1-2 2 2 2 0 0 1 2 2v5a2 2 0 0 0 2 2h1\" />\n <path d=\"M16 21h1a2 2 0 0 0 2-2v-5a2 2 0 0 1 2-2 2 2 0 0 1-2-2V5a2 2 0 0 0-2-2h-1\" />\n </svg>\n );\n}\n","import React from 'react';\nimport { Menu as BaseMenu } from '@base-ui/react/menu';\nimport clsx from 'clsx';\nimport './DropdownMenu.css';\n\n/* ============================================================================\n DROPDOWN MENU ROOT\n ============================================================================ */\n\nexport const DropdownMenu = BaseMenu.Root;\n\n/* ============================================================================\n DROPDOWN MENU TRIGGER\n ============================================================================ */\n\nexport const DropdownMenuTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ButtonHTMLAttributes<HTMLButtonElement> & { className?: string }\n>(({ className, ...props }, ref) => {\n return (\n <BaseMenu.Trigger\n ref={ref}\n className={clsx('ds-dropdown-menu__trigger', className)}\n {...props}\n />\n );\n});\n\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n\n/* ============================================================================\n DROPDOWN MENU CONTENT\n ============================================================================ */\n\nexport interface DropdownMenuContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: 'top' | 'right' | 'bottom' | 'left';\n align?: 'start' | 'center' | 'end';\n sideOffset?: number;\n alignOffset?: number;\n}\n\nexport const DropdownMenuContent = React.forwardRef<HTMLDivElement, DropdownMenuContentProps>(\n (\n { className, side = 'bottom', align = 'start', sideOffset = 4, alignOffset = 0, ...props },\n ref,\n ) => {\n return (\n <BaseMenu.Portal>\n <BaseMenu.Positioner\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n >\n <BaseMenu.Popup\n ref={ref}\n className={clsx('ds-dropdown-menu__content', className)}\n {...props}\n />\n </BaseMenu.Positioner>\n </BaseMenu.Portal>\n );\n },\n);\n\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n\n/* ============================================================================\n DROPDOWN MENU ITEM\n ============================================================================ */\n\nexport interface DropdownMenuItemProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n}\n\nexport const DropdownMenuItem = React.forwardRef<HTMLDivElement, DropdownMenuItemProps>(\n ({ className, ...props }, ref) => {\n return (\n <BaseMenu.Item ref={ref} className={clsx('ds-dropdown-menu__item', className)} {...props} />\n );\n },\n);\n\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n\n/* ============================================================================\n DROPDOWN MENU SEPARATOR\n ============================================================================ */\n\nexport const DropdownMenuSeparator = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return <div ref={ref} className={clsx('ds-dropdown-menu__separator', className)} {...props} />;\n});\n\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n\n/* ============================================================================\n DROPDOWN MENU LABEL\n ============================================================================ */\n\nexport const DropdownMenuLabel = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n return <div ref={ref} className={clsx('ds-dropdown-menu__label', className)} {...props} />;\n});\n\nDropdownMenuLabel.displayName = 'DropdownMenuLabel';\n"]}
|