@prismiq/react 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +88 -0
  2. package/dist/CustomSQLEditor-BXB4rf1q.d.cts +1297 -0
  3. package/dist/CustomSQLEditor-DYeId0Gp.d.ts +1297 -0
  4. package/dist/DashboardDialog-B3vYC5Gs.d.ts +1106 -0
  5. package/dist/DashboardDialog-LHmrtNQU.d.cts +1106 -0
  6. package/dist/accessibility-2yy5yqRR.d.cts +145 -0
  7. package/dist/accessibility-2yy5yqRR.d.ts +145 -0
  8. package/dist/charts/index.cjs +110 -0
  9. package/dist/charts/index.cjs.map +1 -0
  10. package/dist/charts/index.d.cts +2 -0
  11. package/dist/charts/index.d.ts +2 -0
  12. package/dist/charts/index.js +5 -0
  13. package/dist/charts/index.js.map +1 -0
  14. package/dist/chunk-2H5WTH4K.js +2409 -0
  15. package/dist/chunk-2H5WTH4K.js.map +1 -0
  16. package/dist/chunk-4AVL6GQK.cjs +470 -0
  17. package/dist/chunk-4AVL6GQK.cjs.map +1 -0
  18. package/dist/chunk-EX74SI67.js +455 -0
  19. package/dist/chunk-EX74SI67.js.map +1 -0
  20. package/dist/chunk-FEABEF3J.cjs +7543 -0
  21. package/dist/chunk-FEABEF3J.cjs.map +1 -0
  22. package/dist/chunk-JTCBZDHY.js +126 -0
  23. package/dist/chunk-JTCBZDHY.js.map +1 -0
  24. package/dist/chunk-LMTG3LRC.cjs +326 -0
  25. package/dist/chunk-LMTG3LRC.cjs.map +1 -0
  26. package/dist/chunk-MDXGGZSW.cjs +273 -0
  27. package/dist/chunk-MDXGGZSW.cjs.map +1 -0
  28. package/dist/chunk-MOAEEF5P.js +7510 -0
  29. package/dist/chunk-MOAEEF5P.js.map +1 -0
  30. package/dist/chunk-NK7HKX2J.cjs +2459 -0
  31. package/dist/chunk-NK7HKX2J.cjs.map +1 -0
  32. package/dist/chunk-NY6TZLST.cjs +8781 -0
  33. package/dist/chunk-NY6TZLST.cjs.map +1 -0
  34. package/dist/chunk-T6STUE7E.js +321 -0
  35. package/dist/chunk-T6STUE7E.js.map +1 -0
  36. package/dist/chunk-TRW7DKLP.cjs +141 -0
  37. package/dist/chunk-TRW7DKLP.cjs.map +1 -0
  38. package/dist/chunk-UPYINBZU.js +8706 -0
  39. package/dist/chunk-UPYINBZU.js.map +1 -0
  40. package/dist/chunk-WWTT2OJ5.js +246 -0
  41. package/dist/chunk-WWTT2OJ5.js.map +1 -0
  42. package/dist/components/index.cjs +222 -0
  43. package/dist/components/index.cjs.map +1 -0
  44. package/dist/components/index.d.cts +207 -0
  45. package/dist/components/index.d.ts +207 -0
  46. package/dist/components/index.js +5 -0
  47. package/dist/components/index.js.map +1 -0
  48. package/dist/dashboard/index.cjs +140 -0
  49. package/dist/dashboard/index.cjs.map +1 -0
  50. package/dist/dashboard/index.d.cts +302 -0
  51. package/dist/dashboard/index.d.ts +302 -0
  52. package/dist/dashboard/index.js +7 -0
  53. package/dist/dashboard/index.js.map +1 -0
  54. package/dist/export/index.cjs +32 -0
  55. package/dist/export/index.cjs.map +1 -0
  56. package/dist/export/index.d.cts +197 -0
  57. package/dist/export/index.d.ts +197 -0
  58. package/dist/export/index.js +3 -0
  59. package/dist/export/index.js.map +1 -0
  60. package/dist/index-C-Qcuu4Y.d.cts +821 -0
  61. package/dist/index-rPc7ijt8.d.ts +821 -0
  62. package/dist/index.cjs +1486 -0
  63. package/dist/index.cjs.map +1 -0
  64. package/dist/index.d.cts +1435 -0
  65. package/dist/index.d.ts +1435 -0
  66. package/dist/index.js +926 -0
  67. package/dist/index.js.map +1 -0
  68. package/dist/ssr/index.cjs +64 -0
  69. package/dist/ssr/index.cjs.map +1 -0
  70. package/dist/ssr/index.d.cts +213 -0
  71. package/dist/ssr/index.d.ts +213 -0
  72. package/dist/ssr/index.js +3 -0
  73. package/dist/ssr/index.js.map +1 -0
  74. package/dist/types-WrCbOeAV.d.cts +569 -0
  75. package/dist/types-WrCbOeAV.d.ts +569 -0
  76. package/dist/utils/index.cjs +64 -0
  77. package/dist/utils/index.cjs.map +1 -0
  78. package/dist/utils/index.d.cts +112 -0
  79. package/dist/utils/index.d.ts +112 -0
  80. package/dist/utils/index.js +3 -0
  81. package/dist/utils/index.js.map +1 -0
  82. package/package.json +110 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/charts/utils.ts","../src/charts/EChartWrapper.tsx","../src/charts/MetricCard/TrendIndicator.tsx","../src/charts/MetricCard/Sparkline.tsx","../src/charts/MetricCard/MetricCard.tsx","../src/charts/BarChart/BarChart.tsx","../src/charts/LineChart/LineChart.tsx","../src/charts/AreaChart/AreaChart.tsx","../src/charts/PieChart/PieChart.tsx","../src/charts/ScatterChart/ScatterChart.tsx","../src/charts/autoSuggest.ts"],"names":["categories","series","echarts","BarChart","LineChart","PieChart","ScatterChart","TitleComponent","TooltipComponent","GridComponent","LegendComponent","MarkLineComponent","MarkPointComponent","DataZoomComponent","CanvasRenderer","useTheme","useRef","useCallback","jsxs","jsx","ReactEChartsCore","echarts2","useState","useEffect","Fragment","useMemo","createDateFormatter"],"mappings":"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","file":"chunk-NK7HKX2J.cjs","sourcesContent":["/**\n * Chart utility functions for Prismiq.\n */\n\nimport type { PrismiqTheme } from '../theme/types';\nimport type { QueryResult } from '../types';\nimport type { AxisFormat, ChartDataPoint, ChartSeries } from './types';\n\n// ============================================================================\n// Data Transformation\n// ============================================================================\n\n/**\n * Converts a QueryResult to chart-ready data format.\n *\n * @param result - The query result to transform\n * @param xColumn - Column name for X axis / categories\n * @param yColumns - Column names for Y axis values (creates multiple series)\n * @returns Object with categories and series arrays\n */\nexport function queryResultToChartData(\n result: QueryResult,\n xColumn: string,\n yColumns: string[],\n seriesColumn?: string\n): { categories: string[]; series: ChartSeries[] } {\n const xIndex = result.columns.indexOf(xColumn);\n if (xIndex === -1) {\n return { categories: [], series: [] };\n }\n\n // If seriesColumn is provided, pivot the data to create multiple series\n if (seriesColumn) {\n const seriesIndex = result.columns.indexOf(seriesColumn);\n if (seriesIndex === -1) {\n return { categories: [], series: [] };\n }\n\n // Get unique x-axis values (categories)\n const xValuesSet = new Set<string>();\n result.rows.forEach((row) => {\n const xValue = row[xIndex];\n xValuesSet.add(xValue === null ? '' : String(xValue));\n });\n const categories = Array.from(xValuesSet).sort();\n\n // Get unique series values\n const seriesNamesSet = new Set<string>();\n result.rows.forEach((row) => {\n const seriesValue = row[seriesIndex];\n seriesNamesSet.add(seriesValue === null ? '' : String(seriesValue));\n });\n const seriesNames = Array.from(seriesNamesSet).sort();\n\n // Create a series for each unique value in the series column\n const series: ChartSeries[] = yColumns.flatMap((yColName) => {\n const yIndex = result.columns.indexOf(yColName);\n if (yIndex === -1) {\n return [];\n }\n\n return seriesNames.map((seriesName) => {\n // For this series, extract data for each category\n const data = categories.map((category) => {\n // Find the row that matches this series name and category\n const row = result.rows.find((r) => {\n const rowSeriesValue = r[seriesIndex];\n const rowXValue = r[xIndex];\n return (\n String(rowSeriesValue) === seriesName &&\n String(rowXValue) === category\n );\n });\n\n if (!row) {\n return null;\n }\n\n const value = row[yIndex];\n if (value === null || value === undefined) {\n return null;\n }\n return typeof value === 'number' ? value : Number(value);\n });\n\n return {\n name: seriesName,\n data,\n };\n });\n });\n\n return { categories, series };\n }\n\n // Original behavior: no series column, extract categories from X column\n const categories: string[] = result.rows.map((row) => {\n const value = row[xIndex];\n return value === null ? '' : String(value);\n });\n\n // Create a series for each Y column\n const series: ChartSeries[] = yColumns\n .map((colName) => {\n const yIndex = result.columns.indexOf(colName);\n if (yIndex === -1) {\n return null;\n }\n\n const data = result.rows.map((row) => {\n const value = row[yIndex];\n if (value === null || value === undefined) {\n return null;\n }\n return typeof value === 'number' ? value : Number(value);\n });\n\n return {\n name: colName,\n data,\n };\n })\n .filter((s): s is ChartSeries => s !== null);\n\n return { categories, series };\n}\n\n/**\n * Converts an array of data points to chart-ready format.\n *\n * @param data - Array of data points\n * @param xColumn - Property name for X axis\n * @param yColumns - Property names for Y axis values\n * @param seriesColumn - Optional column that defines series (for long-format data)\n * @returns Object with categories and series arrays\n */\nexport function dataPointsToChartData(\n data: ChartDataPoint[],\n xColumn: string,\n yColumns: string[],\n seriesColumn?: string\n): { categories: string[]; series: ChartSeries[] } {\n // If seriesColumn is provided, pivot the data to create multiple series\n if (seriesColumn) {\n // Get unique x-axis values (categories)\n const xValuesSet = new Set<string>();\n data.forEach((point) => {\n const xValue = point[xColumn];\n xValuesSet.add(xValue === null ? '' : String(xValue));\n });\n const categories = Array.from(xValuesSet).sort();\n\n // Get unique series values\n const seriesNamesSet = new Set<string>();\n data.forEach((point) => {\n const seriesValue = point[seriesColumn];\n seriesNamesSet.add(seriesValue === null ? '' : String(seriesValue));\n });\n const seriesNames = Array.from(seriesNamesSet).sort();\n\n // Create a series for each unique value in the series column\n const series: ChartSeries[] = yColumns.flatMap((yColName) => {\n return seriesNames.map((seriesName) => {\n // For this series, extract data for each category\n const seriesData = categories.map((category) => {\n // Find the data point that matches this series name and category\n const point = data.find((p) => {\n const pSeriesValue = p[seriesColumn];\n const pXValue = p[xColumn];\n return (\n String(pSeriesValue) === seriesName && String(pXValue) === category\n );\n });\n\n if (!point) {\n return null;\n }\n\n const value = point[yColName];\n if (value === null || value === undefined) {\n return null;\n }\n return typeof value === 'number' ? value : Number(value);\n });\n\n return {\n name: seriesName,\n data: seriesData,\n };\n });\n });\n\n return { categories, series };\n }\n\n // Original behavior: no series column\n const categories: string[] = data.map((point) => {\n const value = point[xColumn];\n return value === null ? '' : String(value);\n });\n\n const series: ChartSeries[] = yColumns.map((colName) => ({\n name: colName,\n data: data.map((point) => {\n const value = point[colName];\n if (value === null || value === undefined) {\n return null;\n }\n return typeof value === 'number' ? value : Number(value);\n }),\n }));\n\n return { categories, series };\n}\n\n/**\n * Determines if data is a QueryResult.\n */\nexport function isQueryResult(\n data: QueryResult | ChartDataPoint[]\n): data is QueryResult {\n return (\n data !== null &&\n typeof data === 'object' &&\n 'columns' in data &&\n 'rows' in data &&\n Array.isArray((data as QueryResult).columns) &&\n Array.isArray((data as QueryResult).rows)\n );\n}\n\n/**\n * Converts chart data (QueryResult or ChartDataPoint[]) to chart-ready format.\n */\nexport function toChartData(\n data: QueryResult | ChartDataPoint[],\n xColumn: string,\n yColumns: string[],\n seriesColumn?: string\n): { categories: string[]; series: ChartSeries[] } {\n if (isQueryResult(data)) {\n return queryResultToChartData(data, xColumn, yColumns, seriesColumn);\n }\n return dataPointsToChartData(data, xColumn, yColumns, seriesColumn);\n}\n\n// ============================================================================\n// Theme Integration\n// ============================================================================\n\n/**\n * Creates an ECharts theme object from a Prismiq theme.\n *\n * @param theme - Prismiq theme\n * @returns ECharts theme configuration object\n */\nexport function createChartTheme(theme: PrismiqTheme): Record<string, unknown> {\n return {\n color: theme.chart.colors,\n backgroundColor: 'transparent',\n textStyle: {\n fontFamily: theme.fonts.sans,\n color: theme.colors.text,\n },\n title: {\n textStyle: {\n color: theme.colors.text,\n fontSize: 16,\n fontWeight: 600,\n },\n },\n legend: {\n textStyle: {\n color: theme.colors.textMuted,\n fontSize: 12,\n },\n },\n xAxis: {\n axisLine: {\n show: true,\n lineStyle: { color: theme.chart.axisColor },\n },\n axisTick: {\n show: true,\n lineStyle: { color: theme.chart.axisColor },\n },\n axisLabel: {\n color: theme.colors.textMuted,\n fontSize: 11,\n },\n splitLine: {\n show: false,\n lineStyle: { color: theme.chart.gridColor },\n },\n },\n yAxis: {\n axisLine: {\n show: false,\n lineStyle: { color: theme.chart.axisColor },\n },\n axisTick: {\n show: false,\n lineStyle: { color: theme.chart.axisColor },\n },\n axisLabel: {\n color: theme.colors.textMuted,\n fontSize: 11,\n },\n splitLine: {\n show: true,\n lineStyle: { color: theme.chart.gridColor, type: 'dashed' },\n },\n },\n tooltip: {\n backgroundColor: theme.chart.tooltipBackground,\n borderColor: theme.colors.border,\n borderWidth: 1,\n textStyle: {\n color: theme.name === 'dark' ? '#f9fafb' : '#ffffff',\n fontSize: 12,\n },\n padding: [8, 12],\n },\n grid: {\n left: 60,\n right: 20,\n top: 40,\n bottom: 40,\n containLabel: false,\n },\n };\n}\n\n/**\n * Applies theme styling to an existing ECharts option.\n *\n * @param option - ECharts option object\n * @param theme - Prismiq theme\n * @returns Modified option with theme applied\n */\nexport function applyThemeToOption(\n option: Record<string, unknown>,\n theme: PrismiqTheme\n): Record<string, unknown> {\n const chartTheme = createChartTheme(theme);\n\n return {\n ...option,\n // Disable animations to prevent sizing issues with notMerge=false\n // Charts will still look good but won't animate on data changes\n animation: false,\n color: option.color || chartTheme.color,\n backgroundColor: chartTheme.backgroundColor,\n textStyle: {\n ...(chartTheme.textStyle as Record<string, unknown>),\n ...(typeof option.textStyle === 'object' ? option.textStyle : {}),\n },\n tooltip: {\n ...(chartTheme.tooltip as Record<string, unknown>),\n ...(typeof option.tooltip === 'object' ? option.tooltip : {}),\n },\n xAxis: mergeAxisConfig(option.xAxis, chartTheme.xAxis as Record<string, unknown>),\n yAxis: mergeAxisConfig(option.yAxis, chartTheme.yAxis as Record<string, unknown>),\n grid: {\n ...(chartTheme.grid as Record<string, unknown>),\n ...(typeof option.grid === 'object' ? option.grid : {}),\n },\n };\n}\n\n/**\n * Merges axis configuration with theme defaults.\n */\nfunction mergeAxisConfig(\n axisOption: unknown,\n themeAxis: Record<string, unknown>\n): unknown {\n if (Array.isArray(axisOption)) {\n return axisOption.map((axis) =>\n mergeAxisConfig(axis, themeAxis)\n );\n }\n if (typeof axisOption === 'object' && axisOption !== null) {\n return {\n ...themeAxis,\n ...(axisOption as Record<string, unknown>),\n axisLine: {\n ...(themeAxis.axisLine as Record<string, unknown>),\n ...((axisOption as Record<string, unknown>).axisLine as Record<string, unknown> || {}),\n },\n axisLabel: {\n ...(themeAxis.axisLabel as Record<string, unknown>),\n ...((axisOption as Record<string, unknown>).axisLabel as Record<string, unknown> || {}),\n },\n splitLine: {\n ...(themeAxis.splitLine as Record<string, unknown>),\n ...((axisOption as Record<string, unknown>).splitLine as Record<string, unknown> || {}),\n },\n };\n }\n return themeAxis;\n}\n\n// ============================================================================\n// Axis Formatting\n// ============================================================================\n\n/**\n * Formats a number value for display on an axis.\n *\n * @param value - The number to format\n * @param format - The format type\n * @param options - Additional formatting options\n * @returns Formatted string\n */\nexport function formatAxisLabel(\n value: number,\n format: AxisFormat,\n options?: {\n currencySymbol?: string;\n decimals?: number;\n compactNotation?: 'K' | 'M' | 'B' | 'T' | null;\n }\n): string {\n const { currencySymbol = '$', decimals = 2, compactNotation } = options || {};\n\n switch (format) {\n case 'currency':\n // Only use compact notation if explicitly specified\n if (compactNotation) {\n return `${currencySymbol}${formatCompactAtThreshold(value, compactNotation, decimals)}`;\n }\n // Otherwise show full number with proper formatting\n return `${currencySymbol}${value.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })}`;\n\n case 'percent':\n return `${(value * 100).toFixed(decimals)}%`;\n\n case 'compact':\n return formatCompact(value, decimals);\n\n case 'number':\n default:\n return value.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n }\n}\n\n/**\n * Formats a number in compact notation (K, M, B).\n */\nexport function formatCompact(value: number, decimals: number = 1): string {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n if (absValue >= 1_000_000_000) {\n return `${sign}${(absValue / 1_000_000_000).toFixed(decimals)}B`;\n }\n if (absValue >= 1_000_000) {\n return `${sign}${(absValue / 1_000_000).toFixed(decimals)}M`;\n }\n if (absValue >= 1_000) {\n return `${sign}${(absValue / 1_000).toFixed(decimals)}K`;\n }\n return `${sign}${absValue.toFixed(decimals)}`;\n}\n\n/**\n * Formats a number with compact notation at a specific threshold.\n * Only applies notation if value meets the threshold.\n *\n * @param value - The number to format\n * @param notation - The notation threshold (K, M, B, T)\n * @param decimals - Number of decimal places\n * @returns Formatted string\n *\n * @example\n * formatCompactAtThreshold(8693, 'K', 3) => \"8.693K\"\n * formatCompactAtThreshold(8693, 'M', 3) => \"8,693\" (below threshold)\n * formatCompactAtThreshold(8693000, 'M', 3) => \"8.693M\"\n */\nexport function formatCompactAtThreshold(\n value: number,\n notation: 'K' | 'M' | 'B' | 'T',\n decimals: number = 0\n): string {\n const absValue = Math.abs(value);\n const sign = value < 0 ? '-' : '';\n\n // Define thresholds and divisors\n const thresholds: Record<'K' | 'M' | 'B' | 'T', { threshold: number; divisor: number }> = {\n K: { threshold: 1_000, divisor: 1_000 },\n M: { threshold: 1_000_000, divisor: 1_000_000 },\n B: { threshold: 1_000_000_000, divisor: 1_000_000_000 },\n T: { threshold: 1_000_000_000_000, divisor: 1_000_000_000_000 },\n };\n\n const config = thresholds[notation];\n\n // Only apply notation if value meets the threshold\n if (absValue >= config.threshold) {\n const formatted = (absValue / config.divisor).toFixed(decimals);\n return `${sign}${formatted}${notation}`;\n }\n\n // Below threshold: show full number with locale formatting\n return `${sign}${absValue.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })}`;\n}\n\n/**\n * Formats a metric value for display in a MetricCard.\n *\n * @param value - The numeric value to format\n * @param format - Format type: 'number', 'currency', 'percent', or 'compact'\n * @param options - Formatting options\n * @param options.currencySymbol - Currency symbol (default: '$')\n * @param options.decimals - Number of decimal places (default: 0)\n * @param options.compactNotation - Compact notation: 'K', 'M', 'B', or 'T' (applies to currency too)\n */\nexport function formatMetricValue(\n value: number | string,\n format: 'number' | 'currency' | 'percent' | 'compact' = 'number',\n options?: { currencySymbol?: string; decimals?: number; compactNotation?: 'K' | 'M' | 'B' | 'T' | null }\n): string {\n if (typeof value === 'string') {\n return value;\n }\n\n const { currencySymbol = '$', decimals = 0, compactNotation } = options || {};\n\n switch (format) {\n case 'currency':\n // If compact notation is specified, use it with the currency symbol\n if (compactNotation) {\n const compactValue = formatCompactAtThreshold(value, compactNotation, decimals);\n return `${currencySymbol}${compactValue}`;\n }\n return `${currencySymbol}${value.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n })}`;\n\n case 'percent':\n return `${(value * 100).toFixed(decimals)}%`;\n\n case 'compact':\n return formatCompact(value, decimals);\n\n case 'number':\n default:\n // Support compact notation for plain numbers too\n if (compactNotation) {\n return formatCompactAtThreshold(value, compactNotation, decimals);\n }\n return value.toLocaleString(undefined, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n });\n }\n}\n\n// ============================================================================\n// Color Utilities\n// ============================================================================\n\n/**\n * Default fallback color.\n */\nconst DEFAULT_COLOR = '#3b82f6';\n\n/**\n * Gets an array of colors from the theme, cycling if needed.\n *\n * @param theme - Prismiq theme\n * @param count - Number of colors needed\n * @returns Array of color strings\n */\nexport function getChartColors(theme: PrismiqTheme, count: number): string[] {\n const themeColors = theme.chart.colors;\n if (themeColors.length === 0) {\n return Array(count).fill(DEFAULT_COLOR);\n }\n\n const result: string[] = [];\n for (let i = 0; i < count; i++) {\n const color = themeColors[i % themeColors.length];\n result.push(color ?? DEFAULT_COLOR);\n }\n\n return result;\n}\n\n/**\n * Generates a gradient color specification for ECharts.\n */\nexport function createGradientColor(\n color: string,\n opacity: number = 0.2\n): Record<string, unknown> {\n return {\n type: 'linear',\n x: 0,\n y: 0,\n x2: 0,\n y2: 1,\n colorStops: [\n { offset: 0, color: adjustColorOpacity(color, opacity) },\n { offset: 1, color: adjustColorOpacity(color, 0.02) },\n ],\n };\n}\n\n/**\n * Adjusts the opacity of a hex color.\n */\nexport function adjustColorOpacity(hexColor: string, opacity: number): string {\n // Remove # if present\n const hex = hexColor.replace('#', '');\n\n // Parse RGB values\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n}\n\n// ============================================================================\n// Reference Line Helpers\n// ============================================================================\n\n/**\n * Creates ECharts markLine configuration from reference line configs.\n */\nexport function createMarkLines(\n lines: { value: number; label?: string; color?: string; lineStyle?: 'solid' | 'dashed' | 'dotted' }[],\n theme: PrismiqTheme\n): Record<string, unknown> {\n return {\n silent: true,\n symbol: 'none',\n data: lines.map((line) => ({\n yAxis: line.value,\n label: {\n show: !!line.label,\n formatter: line.label || '',\n position: 'end',\n color: line.color || theme.colors.textMuted,\n fontSize: 11,\n },\n lineStyle: {\n color: line.color || theme.colors.textMuted,\n type: line.lineStyle || 'dashed',\n width: 1,\n },\n })),\n };\n}\n\n// ============================================================================\n// Empty State Helpers\n// ============================================================================\n\n/**\n * Checks if chart data is empty.\n */\nexport function isChartDataEmpty(\n data: QueryResult | ChartDataPoint[]\n): boolean {\n if (isQueryResult(data)) {\n return data.rows.length === 0;\n }\n return data.length === 0;\n}\n\n/**\n * Creates an ECharts graphic config for empty state.\n */\nexport function createEmptyStateGraphic(\n message: string = 'No data available'\n): Record<string, unknown> {\n return {\n type: 'text',\n left: 'center',\n top: 'middle',\n style: {\n text: message,\n fontSize: 14,\n fill: '#9ca3af',\n },\n };\n}\n","/**\n * Base wrapper component for ECharts integration.\n */\n\nimport React, { useCallback, useRef } from 'react';\nimport ReactEChartsCore from 'echarts-for-react/esm/core';\nimport * as echarts from 'echarts/core';\nimport {\n BarChart,\n LineChart,\n PieChart,\n ScatterChart,\n} from 'echarts/charts';\nimport {\n TitleComponent,\n TooltipComponent,\n GridComponent,\n LegendComponent,\n MarkLineComponent,\n MarkPointComponent,\n DataZoomComponent,\n} from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { useTheme } from '../theme';\nimport { applyThemeToOption } from './utils';\nimport type { EChartWrapperProps } from './types';\n\n// Register required ECharts components\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n ScatterChart,\n TitleComponent,\n TooltipComponent,\n GridComponent,\n LegendComponent,\n MarkLineComponent,\n MarkPointComponent,\n DataZoomComponent,\n CanvasRenderer,\n]);\n\n/**\n * Base chart wrapper that handles theme integration, loading states,\n * and event handling for all Prismiq charts.\n */\nexport function EChartWrapper({\n option,\n loading = false,\n height = 300,\n width = '100%',\n theme: themeOverride,\n onEvents,\n className,\n}: EChartWrapperProps): JSX.Element {\n const { theme, resolvedMode } = useTheme();\n const chartRef = useRef<ReactEChartsCore>(null);\n const prevOptionRef = useRef<string>('');\n\n // Apply Prismiq theme to the chart option\n const themedOption = applyThemeToOption(option, theme);\n\n // Only update chart when option actually changes\n // This prevents tooltip flickering caused by React re-renders with same data\n const shouldSetOption = useCallback(\n (_prevProps: { option: Record<string, unknown> }, props: { option: Record<string, unknown> }) => {\n const newOptionString = JSON.stringify(props.option);\n if (prevOptionRef.current === newOptionString) {\n return false; // Don't update - option hasn't changed\n }\n prevOptionRef.current = newOptionString;\n return true; // Update - option has changed\n },\n []\n );\n\n // Determine which theme to use\n const effectiveTheme = themeOverride || resolvedMode;\n\n // Handle resize\n const handleResize = useCallback(() => {\n if (chartRef.current) {\n const chartInstance = chartRef.current.getEchartsInstance();\n chartInstance?.resize();\n }\n }, []);\n\n // Container styles\n const containerStyle: React.CSSProperties = {\n width: typeof width === 'number' ? `${width}px` : width,\n height: typeof height === 'number' ? `${height}px` : height,\n position: 'relative',\n };\n\n // Loading overlay styles\n const loadingStyle: React.CSSProperties = {\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.surface,\n opacity: 0.9,\n zIndex: 10,\n };\n\n const spinnerStyle: React.CSSProperties = {\n width: '32px',\n height: '32px',\n border: `3px solid ${theme.colors.border}`,\n borderTopColor: theme.colors.primary,\n borderRadius: '50%',\n animation: 'prismiq-spin 0.8s linear infinite',\n };\n\n return (\n <div style={containerStyle} className={className}>\n {/* Spinner keyframes */}\n <style>{`\n @keyframes prismiq-spin {\n to { transform: rotate(360deg); }\n }\n `}</style>\n\n {/* Loading overlay */}\n {loading && (\n <div style={loadingStyle}>\n <div style={spinnerStyle} />\n </div>\n )}\n\n {/* ECharts instance */}\n <ReactEChartsCore\n ref={chartRef}\n echarts={echarts}\n option={themedOption}\n notMerge={false}\n lazyUpdate={true}\n shouldSetOption={shouldSetOption}\n theme={effectiveTheme === 'dark' ? 'dark' : undefined}\n onEvents={onEvents}\n style={{ width: '100%', height: '100%' }}\n opts={{ renderer: 'canvas' }}\n onChartReady={handleResize}\n />\n </div>\n );\n}\n\nexport default EChartWrapper;\n","/**\n * Trend indicator component for MetricCard.\n */\n\nimport React from 'react';\nimport { useTheme } from '../../theme';\nimport type { TrendConfig } from '../types';\n\nexport interface TrendIndicatorProps {\n /** Trend configuration. */\n trend: TrendConfig;\n /** Which direction is considered positive (green). */\n trendPositive?: 'up' | 'down';\n /** Size variant. */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * Displays a trend arrow with percentage change.\n */\nexport function TrendIndicator({\n trend,\n trendPositive = 'up',\n size = 'md',\n}: TrendIndicatorProps): JSX.Element {\n const { theme } = useTheme();\n\n // Determine if this trend is positive or negative\n const isPositive =\n (trend.direction === 'up' && trendPositive === 'up') ||\n (trend.direction === 'down' && trendPositive === 'down');\n\n const isNegative =\n (trend.direction === 'up' && trendPositive === 'down') ||\n (trend.direction === 'down' && trendPositive === 'up');\n\n // Get color based on trend\n const getColor = (): string => {\n if (trend.direction === 'flat') {\n return theme.colors.textMuted;\n }\n if (isPositive) {\n return theme.colors.success;\n }\n if (isNegative) {\n return theme.colors.error;\n }\n return theme.colors.textMuted;\n };\n\n // Get arrow based on direction\n const getArrow = (): string => {\n switch (trend.direction) {\n case 'up':\n return '\\u2191'; // up arrow\n case 'down':\n return '\\u2193'; // down arrow\n case 'flat':\n default:\n return '\\u2192'; // right arrow\n }\n };\n\n // Size-based styles\n const sizeStyles: Record<string, React.CSSProperties> = {\n sm: { fontSize: theme.fontSizes.xs },\n md: { fontSize: theme.fontSizes.sm },\n lg: { fontSize: theme.fontSizes.base },\n };\n\n const containerStyle: React.CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '4px',\n color: getColor(),\n ...sizeStyles[size],\n };\n\n const arrowStyle: React.CSSProperties = {\n fontWeight: 600,\n };\n\n const valueStyle: React.CSSProperties = {\n fontWeight: 500,\n };\n\n const labelStyle: React.CSSProperties = {\n color: theme.colors.textMuted,\n marginLeft: '4px',\n };\n\n return (\n <span style={containerStyle}>\n <span style={arrowStyle}>{getArrow()}</span>\n <span style={valueStyle}>{Math.abs(trend.value).toFixed(1)}%</span>\n {trend.label && <span style={labelStyle}>{trend.label}</span>}\n </span>\n );\n}\n\nexport default TrendIndicator;\n","/**\n * Sparkline component for MetricCard.\n */\n\nimport ReactEChartsCore from 'echarts-for-react/lib/core';\nimport * as echarts from 'echarts/core';\nimport { LineChart } from 'echarts/charts';\nimport { GridComponent } from 'echarts/components';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { useTheme } from '../../theme';\nimport { createGradientColor } from '../utils';\n\n// Register required ECharts components\necharts.use([LineChart, GridComponent, CanvasRenderer]);\n\nexport interface SparklineProps {\n /** Data points for the sparkline. */\n data: number[];\n /** Line/area color override. */\n color?: string;\n /** Height of the sparkline. */\n height?: number;\n /** Width of the sparkline. */\n width?: number | string;\n}\n\n/**\n * A minimal line chart for showing trends in a small space.\n */\nexport function Sparkline({\n data,\n color,\n height = 40,\n width = '100%',\n}: SparklineProps): JSX.Element | null {\n const { theme } = useTheme();\n\n // Use first theme color if none provided\n const lineColor = color || theme.chart.colors[0] || theme.colors.primary;\n\n // Don't render if no data\n if (!data || data.length === 0) {\n return null;\n }\n\n const option: Record<string, unknown> = {\n animation: false,\n grid: {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0,\n },\n xAxis: {\n type: 'category',\n show: false,\n data: data.map((_, i) => i),\n },\n yAxis: {\n type: 'value',\n show: false,\n min: 'dataMin',\n max: 'dataMax',\n },\n series: [\n {\n type: 'line',\n data,\n smooth: true,\n symbol: 'none',\n lineStyle: {\n color: lineColor,\n width: 2,\n },\n areaStyle: {\n color: createGradientColor(lineColor, 0.3),\n },\n },\n ],\n };\n\n return (\n <ReactEChartsCore\n echarts={echarts}\n option={option}\n style={{ width, height }}\n opts={{ renderer: 'canvas' }}\n notMerge={true}\n lazyUpdate={true}\n />\n );\n}\n\nexport default Sparkline;\n","/**\n * MetricCard component for displaying KPIs.\n */\n\nimport React, { useRef, useState, useEffect } from 'react';\nimport { useTheme } from '../../theme';\nimport { formatMetricValue } from '../utils';\nimport type { MetricCardProps } from '../types';\nimport { TrendIndicator } from './TrendIndicator';\nimport { Sparkline } from './Sparkline';\n\n/**\n * A card component for displaying key metrics with optional trend and sparkline.\n *\n * @example\n * ```tsx\n * <MetricCard\n * title=\"Revenue\"\n * value={1234567}\n * format=\"currency\"\n * trend={{ value: 12.5, direction: 'up', label: 'vs last month' }}\n * sparklineData={[100, 120, 115, 130, 145, 160]}\n * />\n * ```\n */\nexport function MetricCard({\n title,\n value,\n format = 'number',\n currencySymbol = '$',\n decimals = 0,\n compactNotation,\n trend,\n trendPositive = 'up',\n sparklineData,\n sparklineColor,\n size = 'md',\n loading = false,\n centered = false,\n className,\n onClick,\n}: MetricCardProps): JSX.Element {\n const { theme } = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n const [containerSize, setContainerSize] = useState({ width: 300, height: 200 });\n\n // Measure container size on mount and resize\n useEffect(() => {\n const measureSize = () => {\n if (containerRef.current) {\n setContainerSize({\n width: containerRef.current.offsetWidth,\n height: containerRef.current.offsetHeight,\n });\n }\n };\n\n measureSize();\n window.addEventListener('resize', measureSize);\n // Also use ResizeObserver for more accurate measurements\n const resizeObserver = new ResizeObserver(measureSize);\n if (containerRef.current) {\n resizeObserver.observe(containerRef.current);\n }\n\n return () => {\n window.removeEventListener('resize', measureSize);\n resizeObserver.disconnect();\n };\n }, []);\n\n // Format the value early so we can use its length for font sizing\n const formattedValueForSizing = formatMetricValue(value, format, {\n currencySymbol,\n decimals,\n compactNotation,\n });\n\n // Calculate responsive font size for centered metrics\n // Scale font size based on container dimensions and value length\n const calculateResponsiveFontSize = () => {\n if (!centered) {\n // Use default sizes for non-centered metrics\n const sizeMap = {\n sm: theme.fontSizes.xl,\n md: theme.fontSizes['2xl'],\n lg: '28px',\n };\n return sizeMap[size];\n }\n\n // For centered metrics, scale based on container width and value length\n const { width: containerWidth, height: containerHeight } = containerSize;\n\n // Estimate character width as ~0.6 of font size for proportional fonts\n // Calculate max font size that fits the value within container width (with padding)\n const availableWidth = containerWidth - 32; // 16px padding on each side\n const charCount = formattedValueForSizing.length || 1;\n\n // Max font size based on width: availableWidth = charCount * fontSize * 0.6\n const maxFontByWidth = availableWidth / (charCount * 0.6);\n\n // Also consider height (scale to ~25% of container height)\n const maxFontByHeight = containerHeight * 0.25;\n\n // Use the smaller of the two constraints, clamped between 24px and 96px\n const scaledSize = Math.max(24, Math.min(96, Math.min(maxFontByWidth, maxFontByHeight)));\n return `${scaledSize}px`;\n };\n\n // Size-based styles\n const sizeConfig = {\n sm: {\n padding: theme.spacing.md,\n titleSize: theme.fontSizes.xs,\n valueSize: theme.fontSizes.xl,\n sparklineHeight: 32,\n },\n md: {\n padding: theme.spacing.lg,\n titleSize: theme.fontSizes.sm,\n valueSize: theme.fontSizes['2xl'],\n sparklineHeight: 40,\n },\n lg: {\n padding: theme.spacing.xl,\n titleSize: theme.fontSizes.base,\n valueSize: '28px',\n sparklineHeight: 50,\n },\n };\n\n const config = sizeConfig[size];\n const responsiveValueSize = calculateResponsiveFontSize();\n\n // Container styles\n const containerStyle: React.CSSProperties = {\n backgroundColor: theme.colors.surface,\n border: `1px solid ${theme.colors.border}`,\n borderRadius: theme.radius.lg,\n padding: centered ? theme.spacing.md : config.padding,\n cursor: onClick ? 'pointer' : 'default',\n transition: 'box-shadow 0.2s ease, border-color 0.2s ease',\n position: 'relative',\n overflow: 'hidden',\n ...(centered && {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: '100%',\n }),\n };\n\n // Header row styles\n const headerStyle: React.CSSProperties = {\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'flex-start',\n marginBottom: theme.spacing.sm,\n };\n\n // Title styles\n const titleStyle: React.CSSProperties = {\n fontSize: config.titleSize,\n fontWeight: 500,\n color: theme.colors.textMuted,\n margin: 0,\n };\n\n // Value styles\n const valueStyle: React.CSSProperties = {\n fontSize: responsiveValueSize,\n fontWeight: 600,\n color: theme.colors.text,\n margin: 0,\n lineHeight: 1.2,\n ...(centered && {\n textAlign: 'center',\n }),\n };\n\n // Sparkline container\n const sparklineContainerStyle: React.CSSProperties = {\n marginTop: theme.spacing.md,\n };\n\n // Loading skeleton styles\n const skeletonStyle: React.CSSProperties = {\n backgroundColor: theme.colors.border,\n borderRadius: theme.radius.sm,\n animation: 'prismiq-pulse 1.5s ease-in-out infinite',\n };\n\n // Use the pre-computed formatted value\n const formattedValue = formattedValueForSizing;\n\n return (\n <div\n ref={containerRef}\n style={containerStyle}\n className={className}\n onClick={onClick}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onKeyDown={\n onClick\n ? (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onClick();\n }\n }\n : undefined\n }\n >\n {/* Pulse animation for loading */}\n <style>{`\n @keyframes prismiq-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n `}</style>\n\n {/* Centered layout - just show the value */}\n {centered ? (\n loading ? (\n <div\n style={{\n ...skeletonStyle,\n width: '120px',\n height: '32px',\n }}\n />\n ) : (\n <p style={valueStyle}>{formattedValue}</p>\n )\n ) : (\n <>\n {/* Header with title and trend */}\n <div style={headerStyle}>\n {loading ? (\n <div style={{ ...skeletonStyle, width: '80px', height: '14px' }} />\n ) : (\n <h3 style={titleStyle}>{title}</h3>\n )}\n\n {trend && !loading && (\n <TrendIndicator\n trend={trend}\n trendPositive={trendPositive}\n size={size}\n />\n )}\n </div>\n\n {/* Value */}\n {loading ? (\n <div\n style={{\n ...skeletonStyle,\n width: '120px',\n height: size === 'sm' ? '20px' : size === 'lg' ? '32px' : '24px',\n marginTop: theme.spacing.xs,\n }}\n />\n ) : (\n <p style={valueStyle}>{formattedValue}</p>\n )}\n\n {/* Sparkline */}\n {sparklineData && sparklineData.length > 0 && !loading && (\n <div style={sparklineContainerStyle}>\n <Sparkline\n data={sparklineData}\n color={sparklineColor}\n height={config.sparklineHeight}\n />\n </div>\n )}\n\n {/* Loading sparkline skeleton */}\n {sparklineData && loading && (\n <div\n style={{\n ...skeletonStyle,\n width: '100%',\n height: `${config.sparklineHeight}px`,\n marginTop: theme.spacing.md,\n }}\n />\n )}\n </>\n )}\n </div>\n );\n}\n\nexport default MetricCard;\n","/**\n * BarChart component for Prismiq.\n */\n\nimport { useMemo, useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport { EChartWrapper } from '../EChartWrapper';\nimport {\n toChartData,\n isChartDataEmpty,\n createEmptyStateGraphic,\n formatAxisLabel,\n getChartColors,\n createMarkLines,\n} from '../utils';\nimport { createDateFormatter } from '../../utils';\nimport type { BarChartProps, ChartClickParams } from '../types';\n\n/**\n * A bar chart component with support for vertical/horizontal orientation,\n * stacking, multi-series, and reference lines.\n *\n * @example\n * ```tsx\n * <BarChart\n * data={queryResult}\n * xAxis=\"month\"\n * yAxis={[\"revenue\", \"cost\"]}\n * orientation=\"vertical\"\n * stacked={false}\n * showDataLabels={true}\n * referenceLines={[{ value: 100000, label: \"Target\" }]}\n * />\n * ```\n */\nexport function BarChart({\n data,\n xAxis,\n yAxis,\n orientation = 'vertical',\n stacked = false,\n showDataLabels = false,\n showLegend = true,\n legendPosition = 'top',\n referenceLines,\n colors,\n xAxisLabel,\n yAxisLabel,\n xAxisFormat,\n yAxisFormat = 'number',\n currencySymbol = '$',\n compactNotation,\n decimalDigits = 0,\n loading = false,\n error,\n height = 300,\n width = '100%',\n className,\n onDataPointClick,\n crossFilter,\n selectedValue,\n}: BarChartProps): JSX.Element {\n const { theme } = useTheme();\n\n // Convert yAxis to array if string\n const yColumns = useMemo(\n () => (Array.isArray(yAxis) ? yAxis : [yAxis]),\n [yAxis]\n );\n\n // Transform data\n const chartData = useMemo(\n () => toChartData(data, xAxis, yColumns),\n [data, xAxis, yColumns]\n );\n\n // Create date formatter if xAxisFormat is provided\n const dateFormatter = useMemo(\n () => (xAxisFormat ? createDateFormatter(xAxisFormat) : null),\n [xAxisFormat]\n );\n\n // Format categories if date formatter is available\n const formattedCategories = useMemo(() => {\n if (!dateFormatter) return chartData.categories;\n return chartData.categories.map((cat) => dateFormatter(cat));\n }, [chartData.categories, dateFormatter]);\n\n // Get colors\n const seriesColors = useMemo(\n () => colors || getChartColors(theme, yColumns.length),\n [colors, theme, yColumns.length]\n );\n\n // Check for empty data\n const isEmpty = isChartDataEmpty(data);\n\n // Build ECharts option\n const option = useMemo(() => {\n if (isEmpty) {\n return {\n graphic: createEmptyStateGraphic(),\n };\n }\n\n const isHorizontal = orientation === 'horizontal';\n\n // Category axis config\n const categoryAxis = {\n type: 'category',\n data: formattedCategories,\n name: isHorizontal ? yAxisLabel : xAxisLabel,\n nameLocation: 'middle',\n nameGap: 35,\n axisLabel: {\n rotate: isHorizontal ? 0 : formattedCategories.length > 10 ? 45 : 0,\n interval: 0,\n hideOverlap: true,\n },\n };\n\n // Value axis config\n const valueAxis = {\n type: 'value',\n name: isHorizontal ? xAxisLabel : yAxisLabel,\n nameLocation: 'middle',\n nameGap: 50,\n axisLabel: {\n formatter: (value: number) =>\n formatAxisLabel(value, yAxisFormat, {\n currencySymbol,\n decimals: decimalDigits,\n compactNotation,\n }),\n },\n };\n\n // Build series with cross-filter highlight support\n const series = chartData.series.map((s, index) => {\n const baseColor = seriesColors[index] ?? theme.colors.primary;\n\n return {\n type: 'bar',\n name: s.name,\n data: s.data.map((value, dataIndex) => {\n const categoryValue = chartData.categories[dataIndex];\n const isSelected = selectedValue != null && categoryValue === selectedValue;\n const isOther = selectedValue != null && categoryValue !== selectedValue;\n\n return {\n value,\n itemStyle: {\n color: baseColor,\n opacity: isOther ? 0.3 : 1,\n borderRadius: stacked ? 0 : [4, 4, 0, 0],\n // Highlight selected bar\n ...(isSelected && {\n borderColor: theme.colors.primary,\n borderWidth: 2,\n }),\n },\n };\n }),\n stack: stacked ? 'stack' : undefined,\n label: showDataLabels\n ? {\n show: true,\n position: isHorizontal ? 'right' : 'top',\n formatter: (params: { value: number | null | { value?: number } }) => {\n // Extract value (ECharts may wrap it in an object)\n const rawValue = typeof params.value === 'object' && params.value !== null\n ? (params.value as { value?: number }).value\n : params.value;\n\n return rawValue !== null && rawValue !== undefined\n ? formatAxisLabel(rawValue, yAxisFormat, {\n currencySymbol,\n decimals: decimalDigits,\n compactNotation,\n })\n : '';\n },\n fontSize: 10,\n color: theme.colors.textMuted,\n }\n : undefined,\n emphasis: {\n focus: 'series',\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.2)',\n },\n },\n markLine:\n index === 0 && referenceLines\n ? createMarkLines(referenceLines, theme)\n : undefined,\n };\n });\n\n // Legend config\n const legend = showLegend\n ? {\n show: yColumns.length > 1,\n data: chartData.series.map((s) => s.name),\n selectedMode: 'multiple' as const,\n [legendPosition === 'left' || legendPosition === 'right'\n ? 'orient'\n : 'orient']: legendPosition === 'left' || legendPosition === 'right' ? 'vertical' : 'horizontal',\n [legendPosition]: legendPosition === 'left' || legendPosition === 'right' ? 10 : legendPosition === 'top' ? 10 : undefined,\n bottom: legendPosition === 'bottom' ? 10 : undefined,\n }\n : undefined;\n\n // Grid adjustments for legend position\n const grid = {\n left: legendPosition === 'left' ? 100 : 60,\n right: legendPosition === 'right' ? 100 : 20,\n top: legendPosition === 'top' ? 50 : 40,\n bottom: legendPosition === 'bottom' ? 50 : 40,\n containLabel: false,\n };\n\n return {\n tooltip: {\n trigger: 'axis',\n axisPointer: {\n type: 'shadow',\n },\n formatter: (params: Array<{ seriesName: string; value: number | null | { value?: number }; marker: string; name: string }>) => {\n if (!Array.isArray(params) || params.length === 0) return '';\n const firstParam = params[0];\n if (!firstParam) return '';\n const header = `<div style=\"font-weight: 600; margin-bottom: 4px;\">${firstParam.name}</div>`;\n const items = params\n .map(\n (p) => {\n // Extract value (ECharts may wrap it in an object)\n const rawValue = typeof p.value === 'object' && p.value !== null\n ? (p.value as { value?: number }).value\n : p.value;\n\n return `<div>${p.marker} ${p.seriesName}: ${\n rawValue !== null && rawValue !== undefined\n ? formatAxisLabel(rawValue, yAxisFormat, {\n currencySymbol,\n decimals: decimalDigits,\n compactNotation,\n })\n : '-'\n }</div>`;\n }\n )\n .join('');\n return header + items;\n },\n },\n legend,\n grid,\n xAxis: isHorizontal ? valueAxis : categoryAxis,\n yAxis: isHorizontal ? categoryAxis : valueAxis,\n series,\n };\n }, [\n isEmpty,\n orientation,\n chartData,\n formattedCategories,\n xAxisLabel,\n yAxisLabel,\n yAxisFormat,\n stacked,\n seriesColors,\n showDataLabels,\n showLegend,\n legendPosition,\n referenceLines,\n theme,\n yColumns.length,\n selectedValue,\n crossFilter?.enabled,\n ]);\n\n // Handle click events (both cross-filter and custom handler)\n const handleClick = useCallback(\n (params: unknown) => {\n const p = params as {\n seriesName?: string;\n dataIndex?: number;\n value?: number | { value?: number };\n name?: string;\n };\n\n // Extract value (ECharts may wrap it in an object)\n const rawValue = typeof p.value === 'object' ? p.value?.value : p.value;\n\n const clickParams: ChartClickParams = {\n seriesName: p.seriesName ?? '',\n dataIndex: p.dataIndex ?? 0,\n value: rawValue ?? 0,\n name: p.name ?? '',\n };\n\n // Call custom handler if provided\n onDataPointClick?.(clickParams);\n },\n [onDataPointClick]\n );\n\n // Build events object\n const handleEvents = useMemo(() => {\n if (!onDataPointClick && !crossFilter?.enabled) return undefined;\n\n return {\n click: handleClick,\n };\n }, [onDataPointClick, crossFilter?.enabled, handleClick]);\n\n // Handle error state\n if (error) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: typeof height === 'number' ? `${height}px` : height,\n width: typeof width === 'number' ? `${width}px` : width,\n color: theme.colors.error,\n fontSize: theme.fontSizes.sm,\n }}\n className={className}\n >\n Error loading chart: {error.message}\n </div>\n );\n }\n\n return (\n <EChartWrapper\n option={option}\n loading={loading}\n height={height}\n width={width}\n className={className}\n onEvents={handleEvents}\n />\n );\n}\n\nexport default BarChart;\n","/**\n * LineChart component for Prismiq.\n */\n\nimport { useMemo, useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport { EChartWrapper } from '../EChartWrapper';\nimport {\n toChartData,\n isChartDataEmpty,\n createEmptyStateGraphic,\n formatAxisLabel,\n getChartColors,\n createMarkLines,\n createGradientColor,\n} from '../utils';\nimport { createDateFormatter } from '../../utils';\nimport type { LineChartProps, ChartClickParams } from '../types';\n\n/**\n * A line chart component with support for smooth curves, area fill,\n * multi-series, and reference lines.\n *\n * @example\n * ```tsx\n * <LineChart\n * data={queryResult}\n * xAxis=\"date\"\n * yAxis={[\"revenue\", \"cost\"]}\n * smooth={true}\n * showArea={true}\n * showPoints={true}\n * />\n * ```\n */\nexport function LineChart({\n data,\n xAxis,\n yAxis,\n seriesColumn,\n maxSeries,\n smooth = false,\n showArea = false,\n showPoints = false,\n showDataLabels = false,\n showLegend = true,\n referenceLines,\n colors,\n xAxisLabel,\n yAxisLabel,\n xAxisFormat,\n yAxisFormat = 'number',\n loading = false,\n error,\n height = 300,\n width = '100%',\n className,\n onDataPointClick,\n crossFilter,\n selectedValue,\n}: LineChartProps): JSX.Element {\n const { theme } = useTheme();\n\n // Convert yAxis to array if string\n const yColumns = useMemo(\n () => (Array.isArray(yAxis) ? yAxis : [yAxis]),\n [yAxis]\n );\n\n // Transform data\n const rawChartData = useMemo(\n () => toChartData(data, xAxis, yColumns, seriesColumn),\n [data, xAxis, yColumns, seriesColumn]\n );\n\n // Limit series to top N by total value if maxSeries is specified\n const chartData = useMemo(() => {\n if (!maxSeries || rawChartData.series.length <= maxSeries) {\n return rawChartData;\n }\n\n // Calculate total value for each series\n const seriesWithTotals = rawChartData.series.map((s) => ({\n ...s,\n total: s.data.reduce<number>((sum, val) => sum + (val ?? 0), 0),\n }));\n\n // Sort by total descending and take top N\n const topSeries = seriesWithTotals\n .sort((a, b) => (b.total ?? 0) - (a.total ?? 0))\n .slice(0, maxSeries)\n .map(({ total: _total, ...rest }) => rest);\n\n return {\n categories: rawChartData.categories,\n series: topSeries,\n };\n }, [rawChartData, maxSeries]);\n\n // Create date formatter if xAxisFormat is provided\n const dateFormatter = useMemo(\n () => (xAxisFormat ? createDateFormatter(xAxisFormat) : null),\n [xAxisFormat]\n );\n\n // Format categories if date formatter is available\n const formattedCategories = useMemo(() => {\n if (!dateFormatter) {\n return chartData.categories;\n }\n return chartData.categories.map((cat) => dateFormatter(cat));\n }, [chartData.categories, dateFormatter]);\n\n // Get colors - use actual series count (may be more than yColumns if seriesColumn is used)\n const seriesColors = useMemo(\n () => colors || getChartColors(theme, chartData.series.length),\n [colors, theme, chartData.series.length]\n );\n\n // Check for empty data\n const isEmpty = isChartDataEmpty(data);\n\n // Build ECharts option\n const option = useMemo(() => {\n if (isEmpty) {\n return {\n graphic: createEmptyStateGraphic(),\n };\n }\n\n // Build series with cross-filter support\n const series = chartData.series.map((s, index) => {\n const color = seriesColors[index] ?? theme.colors.primary;\n\n // Build data with cross-filter highlighting for points\n const seriesData = s.data.map((value, dataIndex) => {\n const categoryValue = chartData.categories[dataIndex];\n const isSelected = selectedValue != null && categoryValue === selectedValue;\n const isOther = selectedValue != null && categoryValue !== selectedValue;\n\n return {\n value,\n itemStyle: {\n color,\n opacity: isOther ? 0.3 : 1,\n // Highlight selected point\n ...(isSelected && {\n borderColor: theme.colors.primary,\n borderWidth: 3,\n }),\n },\n symbolSize: isSelected ? 10 : showPoints ? 6 : 0,\n };\n });\n\n return {\n type: 'line',\n name: s.name,\n data: seriesData,\n smooth: smooth ? 0.3 : false,\n symbol: showPoints || selectedValue != null ? 'circle' : 'none',\n symbolSize: showPoints ? 6 : 0,\n itemStyle: {\n color,\n },\n lineStyle: {\n color,\n width: 2,\n opacity: selectedValue != null ? 0.5 : 1,\n },\n areaStyle: showArea\n ? {\n color: createGradientColor(color, selectedValue != null ? 0.15 : 0.3),\n }\n : undefined,\n label: showDataLabels\n ? {\n show: true,\n position: 'top',\n formatter: (params: { value: number | null }) =>\n params.value !== null\n ? formatAxisLabel(params.value, yAxisFormat)\n : '',\n fontSize: 10,\n color: theme.colors.textMuted,\n }\n : undefined,\n emphasis: {\n focus: 'series',\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.2)',\n },\n },\n markLine:\n index === 0 && referenceLines\n ? createMarkLines(referenceLines, theme)\n : undefined,\n // Enable cursor pointer when cross-filter is enabled\n cursor: crossFilter?.enabled ? 'pointer' : 'default',\n };\n });\n\n // Legend config - show when multiple series exist (from yColumns or seriesColumn)\n const legend = showLegend\n ? {\n show: chartData.series.length > 1,\n data: chartData.series.map((s) => s.name),\n selectedMode: 'multiple' as const,\n top: 10,\n }\n : undefined;\n\n return {\n tooltip: {\n trigger: 'axis',\n axisPointer: {\n type: 'cross',\n label: {\n backgroundColor: theme.chart.tooltipBackground,\n },\n },\n formatter: (params: Array<{ seriesName: string; value: number | null; marker: string; name: string }>) => {\n if (!Array.isArray(params) || params.length === 0) return '';\n const firstParam = params[0];\n if (!firstParam) return '';\n const header = `<div style=\"font-weight: 600; margin-bottom: 4px;\">${firstParam.name}</div>`;\n const items = params\n .map(\n (p) =>\n `<div>${p.marker} ${p.seriesName}: ${p.value !== null ? formatAxisLabel(p.value, yAxisFormat) : '-'}</div>`\n )\n .join('');\n return header + items;\n },\n },\n legend,\n grid: {\n left: 60,\n right: 20,\n top: legend ? 50 : 40,\n bottom: 40,\n },\n xAxis: {\n type: 'category',\n data: formattedCategories,\n name: xAxisLabel,\n nameLocation: 'middle',\n nameGap: 35,\n axisLabel: {\n rotate: formattedCategories.length > 10 ? 45 : 0,\n interval: 0,\n hideOverlap: true,\n },\n boundaryGap: false,\n },\n yAxis: {\n type: 'value',\n name: yAxisLabel,\n nameLocation: 'middle',\n nameGap: 50,\n axisLabel: {\n formatter: (value: number) => formatAxisLabel(value, yAxisFormat),\n },\n },\n series,\n };\n }, [\n isEmpty,\n chartData,\n formattedCategories,\n smooth,\n showPoints,\n showArea,\n showDataLabels,\n showLegend,\n referenceLines,\n seriesColors,\n xAxisLabel,\n yAxisLabel,\n yAxisFormat,\n theme,\n selectedValue,\n crossFilter?.enabled,\n ]);\n\n // Handle click events (both cross-filter and custom handler)\n const handleClick = useCallback(\n (params: unknown) => {\n const p = params as {\n seriesName?: string;\n dataIndex?: number;\n value?: number | { value?: number };\n name?: string;\n };\n\n // Extract value (ECharts may wrap it in an object)\n const rawValue = typeof p.value === 'object' ? p.value?.value : p.value;\n\n const clickParams: ChartClickParams = {\n seriesName: p.seriesName ?? '',\n dataIndex: p.dataIndex ?? 0,\n value: rawValue ?? 0,\n name: p.name ?? '',\n };\n\n // Call custom handler if provided\n onDataPointClick?.(clickParams);\n },\n [onDataPointClick]\n );\n\n // Build events object\n const handleEvents = useMemo(() => {\n if (!onDataPointClick && !crossFilter?.enabled) return undefined;\n\n return {\n click: handleClick,\n };\n }, [onDataPointClick, crossFilter?.enabled, handleClick]);\n\n // Handle error state\n if (error) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: typeof height === 'number' ? `${height}px` : height,\n width: typeof width === 'number' ? `${width}px` : width,\n color: theme.colors.error,\n fontSize: theme.fontSizes.sm,\n }}\n className={className}\n >\n Error loading chart: {error.message}\n </div>\n );\n }\n\n return (\n <EChartWrapper\n option={option}\n loading={loading}\n height={height}\n width={width}\n className={className}\n onEvents={handleEvents}\n />\n );\n}\n\nexport default LineChart;\n","/**\n * AreaChart component for Prismiq.\n */\n\nimport { useMemo, useCallback } from 'react';\nimport { useTheme } from '../../theme';\nimport { EChartWrapper } from '../EChartWrapper';\nimport {\n toChartData,\n isChartDataEmpty,\n createEmptyStateGraphic,\n formatAxisLabel,\n getChartColors,\n createGradientColor,\n adjustColorOpacity,\n} from '../utils';\nimport { createDateFormatter } from '../../utils';\nimport type { AreaChartProps, ChartClickParams } from '../types';\n\n/**\n * An area chart component with support for stacking and 100% stacking.\n *\n * @example\n * ```tsx\n * <AreaChart\n * data={queryResult}\n * xAxis=\"date\"\n * yAxis={[\"category_a\", \"category_b\", \"category_c\"]}\n * stacked={true}\n * stackType=\"percent\"\n * smooth={true}\n * />\n * ```\n */\nexport function AreaChart({\n data,\n xAxis,\n yAxis,\n stacked = true,\n stackType = 'normal',\n smooth = false,\n showLegend = true,\n opacity = 0.7,\n colors,\n xAxisLabel,\n yAxisLabel,\n xAxisFormat,\n loading = false,\n error,\n height = 300,\n width = '100%',\n className,\n onDataPointClick,\n crossFilter,\n selectedValue,\n}: AreaChartProps): JSX.Element {\n const { theme } = useTheme();\n\n // Convert yAxis to array if string\n const yColumns = useMemo(\n () => (Array.isArray(yAxis) ? yAxis : [yAxis]),\n [yAxis]\n );\n\n // Transform data\n const chartData = useMemo(\n () => toChartData(data, xAxis, yColumns),\n [data, xAxis, yColumns]\n );\n\n // Create date formatter if xAxisFormat is provided\n const dateFormatter = useMemo(\n () => (xAxisFormat ? createDateFormatter(xAxisFormat) : null),\n [xAxisFormat]\n );\n\n // Format categories if date formatter is available\n const formattedCategories = useMemo(() => {\n if (!dateFormatter) return chartData.categories;\n return chartData.categories.map((cat) => dateFormatter(cat));\n }, [chartData.categories, dateFormatter]);\n\n // Get colors\n const seriesColors = useMemo(\n () => colors || getChartColors(theme, yColumns.length),\n [colors, theme, yColumns.length]\n );\n\n // Check for empty data\n const isEmpty = isChartDataEmpty(data);\n\n // Build ECharts option\n const option = useMemo(() => {\n if (isEmpty) {\n return {\n graphic: createEmptyStateGraphic(),\n };\n }\n\n // Compute percentages if needed\n let processedData = chartData;\n if (stacked && stackType === 'percent') {\n // Calculate totals for each category\n const totals = chartData.categories.map((_, catIndex) => {\n let total = 0;\n chartData.series.forEach((s) => {\n const val = s.data[catIndex];\n if (val !== null && val !== undefined) {\n total += val;\n }\n });\n return total;\n });\n\n // Convert to percentages\n processedData = {\n categories: chartData.categories,\n series: chartData.series.map((s) => ({\n ...s,\n data: s.data.map((val, catIndex) => {\n if (val === null) return null;\n const total = totals[catIndex] ?? 1;\n return total > 0 ? (val / total) * 100 : 0;\n }),\n })),\n };\n }\n\n // Build series with cross-filter support\n const series = processedData.series.map((s, index) => {\n const color = seriesColors[index] ?? theme.colors.primary;\n\n // Build data with cross-filter highlighting\n const seriesData = s.data.map((value, dataIndex) => {\n const categoryValue = processedData.categories[dataIndex];\n const isSelected = selectedValue != null && categoryValue === selectedValue;\n const isOther = selectedValue != null && categoryValue !== selectedValue;\n\n return {\n value,\n itemStyle: {\n opacity: isOther ? 0.3 : 1,\n },\n // Show marker on selected point\n symbol: isSelected ? 'circle' : 'none',\n symbolSize: isSelected ? 8 : 0,\n };\n });\n\n // Calculate base opacity - dim when filtering\n const baseOpacity = selectedValue != null ? opacity * 0.5 : opacity;\n\n return {\n type: 'line',\n name: s.name,\n data: seriesData,\n stack: stacked ? 'stack' : undefined,\n smooth: smooth ? 0.3 : false,\n symbol: selectedValue != null ? 'circle' : 'none',\n symbolSize: 6,\n itemStyle: {\n color,\n },\n lineStyle: {\n color,\n width: 1,\n },\n areaStyle: {\n color: stacked\n ? adjustColorOpacity(color, baseOpacity)\n : createGradientColor(color, baseOpacity),\n },\n emphasis: {\n focus: 'series',\n },\n // Enable cursor pointer when cross-filter is enabled\n cursor: crossFilter?.enabled ? 'pointer' : 'default',\n };\n });\n\n // Legend config\n const legend = showLegend\n ? {\n show: yColumns.length > 1,\n data: processedData.series.map((s) => s.name),\n selectedMode: 'multiple' as const,\n top: 10,\n }\n : undefined;\n\n // Y axis format\n const yAxisFormat = stacked && stackType === 'percent' ? 'percent' : 'number';\n\n return {\n tooltip: {\n trigger: 'axis',\n axisPointer: {\n type: 'cross',\n label: {\n backgroundColor: theme.chart.tooltipBackground,\n },\n },\n formatter: (params: Array<{ seriesName: string; value: number | null; marker: string; name: string }>) => {\n if (!Array.isArray(params) || params.length === 0) return '';\n const firstParam = params[0];\n if (!firstParam) return '';\n const header = `<div style=\"font-weight: 600; margin-bottom: 4px;\">${firstParam.name}</div>`;\n const items = params\n .map((p) => {\n if (p.value === null) {\n return `<div>${p.marker} ${p.seriesName}: -</div>`;\n }\n const formatted =\n stackType === 'percent'\n ? `${p.value.toFixed(1)}%`\n : formatAxisLabel(p.value, 'compact');\n return `<div>${p.marker} ${p.seriesName}: ${formatted}</div>`;\n })\n .join('');\n return header + items;\n },\n },\n legend,\n grid: {\n left: 60,\n right: 20,\n top: legend ? 50 : 40,\n bottom: 40,\n },\n xAxis: {\n type: 'category',\n data: formattedCategories,\n name: xAxisLabel,\n nameLocation: 'middle',\n nameGap: 35,\n axisLabel: {\n rotate: formattedCategories.length > 10 ? 45 : 0,\n interval: 0,\n hideOverlap: true,\n },\n boundaryGap: false,\n },\n yAxis: {\n type: 'value',\n name: yAxisLabel,\n nameLocation: 'middle',\n nameGap: 50,\n max: stackType === 'percent' ? 100 : undefined,\n axisLabel: {\n formatter: (value: number) => {\n if (stackType === 'percent') {\n return `${value.toFixed(0)}%`;\n }\n return formatAxisLabel(value, yAxisFormat);\n },\n },\n },\n series,\n };\n }, [\n isEmpty,\n chartData,\n formattedCategories,\n stacked,\n stackType,\n smooth,\n showLegend,\n opacity,\n seriesColors,\n xAxisLabel,\n yAxisLabel,\n theme,\n yColumns.length,\n selectedValue,\n crossFilter?.enabled,\n ]);\n\n // Handle click events (both cross-filter and custom handler)\n const handleClick = useCallback(\n (params: unknown) => {\n const p = params as {\n seriesName?: string;\n dataIndex?: number;\n value?: number | { value?: number };\n name?: string;\n };\n\n // Extract value (ECharts may wrap it in an object)\n const rawValue = typeof p.value === 'object' ? p.value?.value : p.value;\n\n const clickParams: ChartClickParams = {\n seriesName: p.seriesName ?? '',\n dataIndex: p.dataIndex ?? 0,\n value: rawValue ?? 0,\n name: p.name ?? '',\n };\n\n // Call custom handler if provided\n onDataPointClick?.(clickParams);\n },\n [onDataPointClick]\n );\n\n // Build events object\n const handleEvents = useMemo(() => {\n if (!onDataPointClick && !crossFilter?.enabled) return undefined;\n\n return {\n click: handleClick,\n };\n }, [onDataPointClick, crossFilter?.enabled, handleClick]);\n\n // Handle error state\n if (error) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: typeof height === 'number' ? `${height}px` : height,\n width: typeof width === 'number' ? `${width}px` : width,\n color: theme.colors.error,\n fontSize: theme.fontSizes.sm,\n }}\n className={className}\n >\n Error loading chart: {error.message}\n </div>\n );\n }\n\n return (\n <EChartWrapper\n option={option}\n loading={loading}\n height={height}\n width={width}\n className={className}\n onEvents={handleEvents}\n />\n );\n}\n\nexport default AreaChart;\n","/**\n * PieChart component for Prismiq.\n */\n\nimport { useMemo, useCallback, useRef, useState, useEffect } from 'react';\nimport { useTheme } from '../../theme';\nimport { EChartWrapper } from '../EChartWrapper';\nimport {\n toChartData,\n isChartDataEmpty,\n createEmptyStateGraphic,\n formatAxisLabel,\n getChartColors,\n} from '../utils';\nimport { createDateFormatter } from '../../utils';\nimport type { PieChartProps, ChartClickParams } from '../types';\n\n/**\n * A pie/donut chart component.\n *\n * @example\n * ```tsx\n * <PieChart\n * data={queryResult}\n * labelColumn=\"category\"\n * valueColumn=\"amount\"\n * variant=\"donut\"\n * showPercentage={true}\n * showLabels={true}\n * />\n * ```\n */\nexport function PieChart({\n data,\n labelColumn,\n valueColumn,\n variant = 'pie',\n donutRatio = 0.5,\n showLabels = true,\n labelPosition = 'outside',\n showPercentage = false,\n showLegend = true,\n colors,\n startAngle = 90,\n sortSlices = 'none',\n loading = false,\n error,\n height = 300,\n width = '100%',\n className,\n onDataPointClick,\n crossFilter,\n selectedValue,\n labelFormat,\n}: PieChartProps): JSX.Element {\n const { theme } = useTheme();\n const containerRef = useRef<HTMLDivElement>(null);\n // Start with 0 to indicate \"not measured yet\"\n const [containerWidth, setContainerWidth] = useState<number>(0);\n\n // Measure container width on mount and resize\n useEffect(() => {\n const measureWidth = () => {\n if (containerRef.current) {\n setContainerWidth(containerRef.current.offsetWidth);\n }\n };\n\n measureWidth();\n window.addEventListener('resize', measureWidth);\n return () => window.removeEventListener('resize', measureWidth);\n }, []);\n\n // Determine layout based on container width\n // < 300px: narrow - legend at bottom\n // >= 300px: wide - legend on right\n const isNarrow = containerWidth < 300;\n\n // Responsive legend configuration\n const legendOrient = isNarrow ? 'horizontal' : 'vertical';\n const legendPosition = isNarrow\n ? { bottom: 0, left: 'center' }\n : { left: '55%', top: 'middle' };\n\n // Transform data\n const chartData = useMemo(\n () => toChartData(data, labelColumn, [valueColumn]),\n [data, labelColumn, valueColumn]\n );\n\n // Create date formatter if labelFormat is provided\n const dateFormatter = useMemo(\n () => (labelFormat ? createDateFormatter(labelFormat) : null),\n [labelFormat]\n );\n\n // Format categories if date formatter is available\n const formattedCategories = useMemo(() => {\n if (!dateFormatter) return chartData.categories;\n return chartData.categories.map((cat) => dateFormatter(cat));\n }, [chartData.categories, dateFormatter]);\n\n // Get pie data from transformed data\n const pieData = useMemo(() => {\n if (chartData.series.length === 0) {\n return [];\n }\n\n const series = chartData.series[0];\n if (!series) {\n return [];\n }\n\n const items = formattedCategories.map((name, index) => ({\n name,\n value: series.data[index] ?? 0,\n }));\n\n // Sort if requested\n if (sortSlices === 'asc') {\n items.sort((a, b) => (a.value || 0) - (b.value || 0));\n } else if (sortSlices === 'desc') {\n items.sort((a, b) => (b.value || 0) - (a.value || 0));\n }\n\n return items;\n }, [formattedCategories, chartData.series, sortSlices]);\n\n // Get colors\n const seriesColors = useMemo(\n () => colors || getChartColors(theme, pieData.length),\n [colors, theme, pieData.length]\n );\n\n // Check for empty data\n const isEmpty = isChartDataEmpty(data);\n\n // Build ECharts option\n const option = useMemo(() => {\n if (isEmpty) {\n return {\n graphic: createEmptyStateGraphic(),\n };\n }\n\n // Calculate total for percentages\n const total = pieData.reduce((sum, item) => sum + (item.value || 0), 0);\n\n // Radius and center configuration based on legend and widget size\n const innerRadius = variant === 'donut' ? `${donutRatio * 50}%` : '0%';\n\n let outerRadius: string;\n let center: [string, string];\n\n if (showLegend) {\n if (isNarrow) {\n // Narrow widget with legend at bottom\n outerRadius = '55%';\n center = ['50%', '35%']; // Move pie up to make room for legend below\n } else {\n // Wide widget with legend on right - leave more space for legend text\n outerRadius = '50%';\n center = ['25%', '50%']; // Center pie in left portion, leave right half for legend\n }\n } else {\n // No legend - use full space\n outerRadius = labelPosition === 'outside' ? '60%' : '75%';\n center = ['50%', '50%'];\n }\n\n // When legend is shown, disable outside labels to prevent clutter\n // The legend already shows names and percentages\n const effectiveLabelPosition = showLegend && labelPosition === 'outside' ? 'inside' : labelPosition;\n const effectiveShowLabels = showLegend && labelPosition === 'outside' ? false : showLabels;\n\n // Label configuration\n const label = effectiveShowLabels\n ? {\n show: true,\n position: effectiveLabelPosition,\n formatter: (params: { name: string; value: number; percent: number }) => {\n if (showPercentage) {\n return effectiveLabelPosition === 'inside'\n ? `${params.percent.toFixed(0)}%`\n : `${params.name}: ${params.percent.toFixed(1)}%`;\n }\n return effectiveLabelPosition === 'inside'\n ? formatAxisLabel(params.value, 'compact')\n : `${params.name}: ${formatAxisLabel(params.value, 'compact')}`;\n },\n color: effectiveLabelPosition === 'inside' ? '#ffffff' : theme.colors.text,\n fontSize: effectiveLabelPosition === 'inside' ? 11 : 12,\n }\n : { show: false };\n\n // Label line for outside labels\n const labelLine = effectiveShowLabels && effectiveLabelPosition === 'outside'\n ? {\n show: true,\n length: 10,\n length2: 10,\n lineStyle: {\n color: theme.colors.border,\n },\n }\n : { show: false };\n\n // Legend config - responsive orientation and position\n const legend = showLegend\n ? {\n show: true,\n orient: legendOrient,\n ...legendPosition,\n selectedMode: 'multiple' as const,\n data: pieData.map((item) => item.name),\n formatter: (name: string) => {\n const item = pieData.find((d) => d.name === name);\n if (!item || total === 0) return name;\n const percent = ((item.value || 0) / total) * 100;\n return `${name} (${percent.toFixed(1)}%)`;\n },\n textStyle: {\n fontSize: isNarrow ? 11 : 12,\n },\n itemGap: isNarrow ? 6 : 8,\n itemWidth: isNarrow ? 12 : 14,\n itemHeight: isNarrow ? 12 : 14,\n }\n : undefined;\n\n return {\n tooltip: {\n trigger: 'item',\n formatter: (params: { name: string; value: number; percent: number; marker: string }) => {\n const formatted = formatAxisLabel(params.value, 'number');\n return `${params.marker} ${params.name}<br/>Value: ${formatted}<br/>Percent: ${params.percent.toFixed(1)}%`;\n },\n },\n legend,\n series: [\n {\n type: 'pie',\n radius: [innerRadius, outerRadius],\n center,\n startAngle,\n data: pieData.map((item, index) => {\n const baseColor = seriesColors[index] ?? theme.colors.primary;\n const isSelected = selectedValue != null && item.name === selectedValue;\n const isOther = selectedValue != null && item.name !== selectedValue;\n\n return {\n ...item,\n itemStyle: {\n color: baseColor,\n opacity: isOther ? 0.3 : 1,\n // Highlight selected slice\n ...(isSelected && {\n borderColor: theme.colors.primary,\n borderWidth: 3,\n shadowBlur: 15,\n shadowColor: 'rgba(0, 0, 0, 0.3)',\n }),\n },\n };\n }),\n label,\n labelLine,\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.2)',\n },\n // Disable emphasis label to avoid conflict with legend and tooltip\n label: {\n show: false,\n },\n },\n // Enable cursor pointer when cross-filter is enabled\n cursor: crossFilter?.enabled ? 'pointer' : 'default',\n animationType: 'scale',\n animationEasing: 'elasticOut',\n },\n ],\n };\n }, [\n isEmpty,\n pieData,\n variant,\n donutRatio,\n showLabels,\n labelPosition,\n showPercentage,\n showLegend,\n startAngle,\n seriesColors,\n theme,\n selectedValue,\n crossFilter?.enabled,\n isNarrow,\n legendOrient,\n legendPosition,\n ]);\n\n // Handle click events (both cross-filter and custom handler)\n const handleClick = useCallback(\n (params: unknown) => {\n const p = params as {\n seriesName?: string;\n dataIndex?: number;\n value?: number;\n name?: string;\n };\n\n const clickParams: ChartClickParams = {\n seriesName: p.seriesName ?? valueColumn,\n dataIndex: p.dataIndex ?? 0,\n value: p.value ?? 0,\n name: p.name ?? '',\n };\n\n // Call custom handler if provided\n onDataPointClick?.(clickParams);\n },\n [onDataPointClick, valueColumn]\n );\n\n // Build events object\n const handleEvents = useMemo(() => {\n if (!onDataPointClick && !crossFilter?.enabled) return undefined;\n\n return {\n click: handleClick,\n };\n }, [onDataPointClick, crossFilter?.enabled, handleClick]);\n\n // Handle error state\n if (error) {\n return (\n <div\n ref={containerRef}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: typeof height === 'number' ? `${height}px` : height,\n width: typeof width === 'number' ? `${width}px` : width,\n color: theme.colors.error,\n fontSize: theme.fontSizes.sm,\n }}\n className={className}\n >\n Error loading chart: {error.message}\n </div>\n );\n }\n\n // Don't render chart until we have measured the container width\n // This prevents the chart from rendering with wrong dimensions and then animating to correct size\n if (containerWidth === 0) {\n return (\n <div ref={containerRef} style={{ height, width }} className={className} />\n );\n }\n\n return (\n <div ref={containerRef} style={{ height, width }}>\n <EChartWrapper\n option={option}\n loading={loading}\n height={height}\n width={width}\n className={className}\n onEvents={handleEvents}\n />\n </div>\n );\n}\n\nexport default PieChart;\n","/**\n * ScatterChart component for Prismiq.\n */\n\nimport { useMemo } from 'react';\nimport { useTheme } from '../../theme';\nimport { EChartWrapper } from '../EChartWrapper';\nimport {\n isQueryResult,\n isChartDataEmpty,\n createEmptyStateGraphic,\n formatAxisLabel,\n getChartColors,\n} from '../utils';\nimport type { ScatterChartProps, ChartClickParams, ChartDataPoint } from '../types';\nimport type { QueryResult } from '../../types';\n\n/**\n * Extracts scatter data from QueryResult or ChartDataPoint array.\n */\nfunction extractScatterData(\n data: QueryResult | ChartDataPoint[],\n xColumn: string,\n yColumn: string,\n sizeColumn?: string,\n colorColumn?: string,\n labelColumn?: string\n): {\n points: Array<{\n x: number;\n y: number;\n size?: number;\n color?: string;\n label?: string;\n index: number;\n }>;\n colorCategories: string[];\n} {\n const points: Array<{\n x: number;\n y: number;\n size?: number;\n color?: string;\n label?: string;\n index: number;\n }> = [];\n const colorSet = new Set<string>();\n\n if (isQueryResult(data)) {\n const xIndex = data.columns.indexOf(xColumn);\n const yIndex = data.columns.indexOf(yColumn);\n const sizeIndex = sizeColumn ? data.columns.indexOf(sizeColumn) : -1;\n const colorIndex = colorColumn ? data.columns.indexOf(colorColumn) : -1;\n const labelIndex = labelColumn ? data.columns.indexOf(labelColumn) : -1;\n\n if (xIndex === -1 || yIndex === -1) {\n return { points: [], colorCategories: [] };\n }\n\n data.rows.forEach((row, index) => {\n const x = row[xIndex];\n const y = row[yIndex];\n\n if (x !== null && y !== null) {\n const size = sizeIndex >= 0 ? row[sizeIndex] : undefined;\n const color = colorIndex >= 0 ? String(row[colorIndex]) : undefined;\n const label = labelIndex >= 0 ? String(row[labelIndex]) : undefined;\n\n if (color) colorSet.add(color);\n\n points.push({\n x: typeof x === 'number' ? x : Number(x),\n y: typeof y === 'number' ? y : Number(y),\n size: size !== null && size !== undefined ? Number(size) : undefined,\n color,\n label,\n index,\n });\n }\n });\n } else {\n data.forEach((point, index) => {\n const x = point[xColumn];\n const y = point[yColumn];\n\n if (x !== null && x !== undefined && y !== null && y !== undefined) {\n const size = sizeColumn ? point[sizeColumn] : undefined;\n const color = colorColumn ? String(point[colorColumn]) : undefined;\n const label = labelColumn ? String(point[labelColumn]) : undefined;\n\n if (color) colorSet.add(color);\n\n points.push({\n x: typeof x === 'number' ? x : Number(x),\n y: typeof y === 'number' ? y : Number(y),\n size: size !== null && size !== undefined ? Number(size) : undefined,\n color,\n label,\n index,\n });\n }\n });\n }\n\n return { points, colorCategories: Array.from(colorSet) };\n}\n\n/**\n * Calculates linear regression for trendline.\n */\nfunction calculateTrendline(\n points: Array<{ x: number; y: number }>\n): { slope: number; intercept: number; minX: number; maxX: number } | null {\n if (points.length < 2) return null;\n\n const n = points.length;\n let sumX = 0;\n let sumY = 0;\n let sumXY = 0;\n let sumX2 = 0;\n let minX = Infinity;\n let maxX = -Infinity;\n\n points.forEach((p) => {\n sumX += p.x;\n sumY += p.y;\n sumXY += p.x * p.y;\n sumX2 += p.x * p.x;\n minX = Math.min(minX, p.x);\n maxX = Math.max(maxX, p.x);\n });\n\n const denominator = n * sumX2 - sumX * sumX;\n if (denominator === 0) return null;\n\n const slope = (n * sumXY - sumX * sumY) / denominator;\n const intercept = (sumY - slope * sumX) / n;\n\n return { slope, intercept, minX, maxX };\n}\n\n/**\n * A scatter/bubble chart component.\n *\n * @example\n * ```tsx\n * <ScatterChart\n * data={queryResult}\n * xAxis=\"revenue\"\n * yAxis=\"profit\"\n * sizeColumn=\"market_cap\"\n * colorColumn=\"sector\"\n * showTrendline={true}\n * />\n * ```\n */\nexport function ScatterChart({\n data,\n xAxis,\n yAxis,\n sizeColumn,\n colorColumn,\n minSize = 10,\n maxSize = 50,\n showLabels = false,\n labelColumn,\n showTrendline = false,\n xAxisLabel,\n yAxisLabel,\n loading = false,\n error,\n height = 300,\n width = '100%',\n className,\n onDataPointClick,\n}: ScatterChartProps): JSX.Element {\n const { theme } = useTheme();\n\n // Extract scatter data\n const { points, colorCategories } = useMemo(\n () => extractScatterData(data, xAxis, yAxis, sizeColumn, colorColumn, labelColumn),\n [data, xAxis, yAxis, sizeColumn, colorColumn, labelColumn]\n );\n\n // Get colors for categories\n const categoryColors = useMemo(\n () => getChartColors(theme, Math.max(colorCategories.length, 1)),\n [theme, colorCategories.length]\n );\n\n // Check for empty data\n const isEmpty = isChartDataEmpty(data) || points.length === 0;\n\n // Build ECharts option\n const option = useMemo(() => {\n if (isEmpty) {\n return {\n graphic: createEmptyStateGraphic(),\n };\n }\n\n // Compute size scale if bubble chart\n let sizeScale: (val: number) => number = () => minSize;\n if (sizeColumn) {\n const sizes = points\n .map((p) => p.size)\n .filter((s): s is number => s !== undefined);\n if (sizes.length > 0) {\n const minSizeVal = Math.min(...sizes);\n const maxSizeVal = Math.max(...sizes);\n const sizeRange = maxSizeVal - minSizeVal || 1;\n\n sizeScale = (val: number) => {\n const normalized = (val - minSizeVal) / sizeRange;\n return minSize + normalized * (maxSize - minSize);\n };\n }\n }\n\n // Group points by color category\n const seriesMap = new Map<string, Array<[number, number, number, string?, string?]>>();\n\n if (colorColumn && colorCategories.length > 0) {\n colorCategories.forEach((cat) => {\n seriesMap.set(cat, []);\n });\n\n points.forEach((p) => {\n const cat = p.color || 'default';\n const arr = seriesMap.get(cat);\n if (arr) {\n arr.push([\n p.x,\n p.y,\n p.size !== undefined ? sizeScale(p.size) : minSize,\n p.label,\n String(p.index),\n ]);\n }\n });\n } else {\n // Single series\n seriesMap.set('data', points.map((p) => [\n p.x,\n p.y,\n p.size !== undefined ? sizeScale(p.size) : minSize,\n p.label,\n String(p.index),\n ]));\n }\n\n // Build series\n const series: Array<Record<string, unknown>> = Array.from(seriesMap.entries()).map(\n ([name, seriesData], index) => ({\n type: 'scatter',\n name,\n data: seriesData,\n symbolSize: (dataItem: [number, number, number]) => dataItem[2],\n itemStyle: {\n color: categoryColors[index] ?? theme.colors.primary,\n },\n label: showLabels\n ? {\n show: true,\n position: 'top',\n formatter: (params: { data: [number, number, number, string?] }) =>\n params.data[3] || '',\n fontSize: 10,\n color: theme.colors.textMuted,\n }\n : undefined,\n emphasis: {\n focus: 'series',\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.2)',\n },\n },\n })\n );\n\n // Add trendline if requested\n if (showTrendline) {\n const trend = calculateTrendline(points);\n if (trend) {\n const y1 = trend.slope * trend.minX + trend.intercept;\n const y2 = trend.slope * trend.maxX + trend.intercept;\n\n series.push({\n type: 'line',\n name: 'Trendline',\n data: [\n [trend.minX, y1],\n [trend.maxX, y2],\n ],\n symbol: 'none',\n lineStyle: {\n color: theme.colors.textMuted,\n type: 'dashed',\n width: 2,\n },\n silent: true,\n });\n }\n }\n\n // Legend config\n const legend = colorColumn && colorCategories.length > 1\n ? {\n show: true,\n data: colorCategories,\n top: 10,\n }\n : undefined;\n\n return {\n tooltip: {\n trigger: 'item',\n formatter: (params: {\n seriesName: string;\n data: [number, number, number, string?, string?];\n marker: string;\n }) => {\n if (!params.data) return '';\n const [x, y, , label] = params.data;\n let html = `${params.marker}`;\n if (colorColumn) {\n html += ` ${params.seriesName}<br/>`;\n }\n if (label) {\n html += `${label}<br/>`;\n }\n html += `${xAxis}: ${formatAxisLabel(x, 'number')}<br/>`;\n html += `${yAxis}: ${formatAxisLabel(y, 'number')}`;\n return html;\n },\n },\n legend,\n grid: {\n left: 60,\n right: 20,\n top: legend ? 50 : 40,\n bottom: 40,\n },\n xAxis: {\n type: 'value',\n name: xAxisLabel || xAxis,\n nameLocation: 'middle',\n nameGap: 35,\n axisLabel: {\n formatter: (value: number) => formatAxisLabel(value, 'compact'),\n },\n splitLine: {\n show: true,\n lineStyle: {\n type: 'dashed',\n },\n },\n },\n yAxis: {\n type: 'value',\n name: yAxisLabel || yAxis,\n nameLocation: 'middle',\n nameGap: 50,\n axisLabel: {\n formatter: (value: number) => formatAxisLabel(value, 'compact'),\n },\n splitLine: {\n show: true,\n lineStyle: {\n type: 'dashed',\n },\n },\n },\n series,\n };\n }, [\n isEmpty,\n points,\n colorColumn,\n colorCategories,\n categoryColors,\n sizeColumn,\n minSize,\n maxSize,\n showLabels,\n showTrendline,\n xAxis,\n yAxis,\n xAxisLabel,\n yAxisLabel,\n theme,\n ]);\n\n // Handle click events\n const handleEvents = useMemo(() => {\n if (!onDataPointClick) return undefined;\n\n return {\n click: (params: unknown) => {\n const p = params as { seriesName?: string; dataIndex?: number; data?: [number, number, number, string?, string?] };\n if (!p.data) return;\n const [x, y, , , indexStr] = p.data;\n const clickParams: ChartClickParams = {\n seriesName: p.seriesName ?? '',\n dataIndex: indexStr ? parseInt(indexStr, 10) : (p.dataIndex ?? 0),\n value: y,\n name: String(x),\n };\n onDataPointClick(clickParams);\n },\n };\n }, [onDataPointClick]);\n\n // Handle error state\n if (error) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: typeof height === 'number' ? `${height}px` : height,\n width: typeof width === 'number' ? `${width}px` : width,\n color: theme.colors.error,\n fontSize: theme.fontSizes.sm,\n }}\n className={className}\n >\n Error loading chart: {error.message}\n </div>\n );\n }\n\n return (\n <EChartWrapper\n option={option}\n loading={loading}\n height={height}\n width={width}\n className={className}\n onEvents={handleEvents}\n />\n );\n}\n\nexport default ScatterChart;\n","/**\n * Auto-suggest utility for recommending chart types based on data.\n */\n\nimport type { QueryResult, ColumnSelection } from '../types';\nimport type { ChartSuggestion } from './types';\n\n/**\n * Column type categories for chart suggestion.\n */\ntype ColumnCategory = 'date' | 'numeric' | 'categorical' | 'unknown';\n\n/**\n * Determines the category of a column based on its data type.\n */\nfunction categorizeColumn(dataType: string): ColumnCategory {\n const normalizedType = dataType.toLowerCase();\n\n // Date types\n if (\n normalizedType.includes('date') ||\n normalizedType.includes('time') ||\n normalizedType.includes('timestamp')\n ) {\n return 'date';\n }\n\n // Numeric types\n if (\n normalizedType.includes('int') ||\n normalizedType.includes('numeric') ||\n normalizedType.includes('decimal') ||\n normalizedType.includes('float') ||\n normalizedType.includes('double') ||\n normalizedType.includes('real') ||\n normalizedType.includes('money')\n ) {\n return 'numeric';\n }\n\n // Categorical types (strings, booleans)\n if (\n normalizedType.includes('char') ||\n normalizedType.includes('text') ||\n normalizedType.includes('varchar') ||\n normalizedType.includes('bool') ||\n normalizedType.includes('uuid')\n ) {\n return 'categorical';\n }\n\n return 'unknown';\n}\n\n/**\n * Counts unique values in a column.\n */\nfunction countUniqueValues(result: QueryResult, columnIndex: number): number {\n const uniqueValues = new Set<unknown>();\n result.rows.forEach((row) => {\n uniqueValues.add(row[columnIndex]);\n });\n return uniqueValues.size;\n}\n\n/**\n * Analyzes columns to determine their types and characteristics.\n */\nfunction analyzeColumns(\n result: QueryResult,\n selections: ColumnSelection[]\n): Array<{\n name: string;\n category: ColumnCategory;\n uniqueCount: number;\n hasAggregation: boolean;\n}> {\n return selections.map((sel) => {\n const columnIndex = result.columns.indexOf(sel.alias || sel.column);\n const typeIndex = columnIndex !== -1 ? columnIndex : 0;\n const dataType = result.column_types[typeIndex] || 'unknown';\n\n return {\n name: sel.alias || sel.column,\n category: categorizeColumn(dataType),\n uniqueCount: columnIndex !== -1 ? countUniqueValues(result, columnIndex) : 0,\n hasAggregation: sel.aggregation !== 'none',\n };\n });\n}\n\n/**\n * Suggests the best chart types for a given query result and column selections.\n *\n * Rules:\n * - Single numeric value -> MetricCard\n * - Date + numeric -> Line/Area chart\n * - Category + numeric -> Bar chart\n * - Category + numeric (few categories <= 7) -> Pie chart\n * - Two numerics -> Scatter chart\n * - Multiple numerics, no date -> Grouped bar chart\n *\n * @param result - The query result to analyze\n * @param columns - The selected columns\n * @returns Array of chart suggestions sorted by confidence\n *\n * @example\n * ```tsx\n * const suggestions = suggestChartType(queryResult, [\n * { table_id: 't1', column: 'month', aggregation: 'none' },\n * { table_id: 't1', column: 'revenue', aggregation: 'sum' },\n * ]);\n * // Returns [{ type: 'bar', confidence: 0.9, reason: '...', config: {...} }]\n * ```\n */\nexport function suggestChartType(\n result: QueryResult,\n columns: ColumnSelection[]\n): ChartSuggestion[] {\n const suggestions: ChartSuggestion[] = [];\n\n // Handle empty result\n if (!result || result.rows.length === 0 || columns.length === 0) {\n return [];\n }\n\n // Analyze the selected columns\n const analyzedColumns = analyzeColumns(result, columns);\n\n // Separate by category\n const dateColumns = analyzedColumns.filter((c) => c.category === 'date');\n const numericColumns = analyzedColumns.filter((c) => c.category === 'numeric');\n const categoricalColumns = analyzedColumns.filter((c) => c.category === 'categorical');\n const aggregatedColumns = analyzedColumns.filter((c) => c.hasAggregation);\n\n // Rule 1: Single value -> MetricCard\n if (result.rows.length === 1 && numericColumns.length === 1) {\n const numericCol = numericColumns[0];\n if (numericCol) {\n const colIndex = result.columns.indexOf(numericCol.name);\n const value = colIndex !== -1 ? result.rows[0]?.[colIndex] : 0;\n suggestions.push({\n type: 'metric',\n confidence: 0.95,\n reason: 'Single numeric value is best displayed as a metric card',\n config: {\n title: numericCol.name,\n value: typeof value === 'number' ? value : 0,\n format: 'number',\n },\n });\n }\n }\n\n // Rule 2: Date + numeric -> Line/Area chart\n if (dateColumns.length >= 1 && numericColumns.length >= 1) {\n const dateCol = dateColumns[0];\n if (dateCol) {\n const xAxis = dateCol.name;\n const yAxis = numericColumns.map((c) => c.name);\n\n suggestions.push({\n type: 'line',\n confidence: 0.9,\n reason: 'Time series data is best visualized as a line chart',\n config: {\n xAxis,\n yAxis: yAxis.length === 1 ? yAxis[0] : yAxis,\n smooth: true,\n showPoints: result.rows.length <= 20,\n },\n });\n\n // Also suggest area chart for time series with stacking potential\n if (numericColumns.length > 1) {\n suggestions.push({\n type: 'area',\n confidence: 0.75,\n reason: 'Multiple time series can be compared with stacked area chart',\n config: {\n xAxis,\n yAxis,\n stacked: true,\n smooth: true,\n },\n });\n }\n }\n }\n\n // Rule 3: Category + numeric -> Bar chart\n if (categoricalColumns.length >= 1 && numericColumns.length >= 1) {\n const categoryCol = categoricalColumns[0];\n if (categoryCol) {\n const xAxis = categoryCol.name;\n const yAxis = numericColumns.map((c) => c.name);\n const uniqueCount = categoryCol.uniqueCount;\n\n // Bar chart is good for up to ~20 categories\n if (uniqueCount <= 20) {\n suggestions.push({\n type: 'bar',\n confidence: 0.85,\n reason: 'Categorical data with numeric values is best shown as a bar chart',\n config: {\n xAxis,\n yAxis: yAxis.length === 1 ? yAxis[0] : yAxis,\n orientation: uniqueCount > 10 ? 'horizontal' : 'vertical',\n stacked: numericColumns.length > 1,\n },\n });\n }\n\n // Rule 4: Few categories (<= 7) -> Pie chart\n if (uniqueCount <= 7 && numericColumns.length === 1) {\n const numericCol = numericColumns[0];\n if (numericCol) {\n suggestions.push({\n type: 'pie',\n confidence: 0.8,\n reason: 'Small number of categories is well suited for a pie chart',\n config: {\n labelColumn: xAxis,\n valueColumn: numericCol.name,\n variant: uniqueCount <= 5 ? 'donut' : 'pie',\n showPercentage: true,\n },\n });\n }\n }\n }\n }\n\n // Rule 5: Two numerics (no date/category dominant) -> Scatter chart\n if (numericColumns.length >= 2 && dateColumns.length === 0) {\n const hasEnoughPoints = result.rows.length >= 5;\n const numericCol0 = numericColumns[0];\n const numericCol1 = numericColumns[1];\n const numericCol2 = numericColumns[2];\n\n if (hasEnoughPoints && numericCol0 && numericCol1) {\n suggestions.push({\n type: 'scatter',\n confidence: 0.7,\n reason: 'Two numeric columns can show correlation in a scatter plot',\n config: {\n xAxis: numericCol0.name,\n yAxis: numericCol1.name,\n sizeColumn: numericCol2?.name,\n showTrendline: true,\n },\n });\n }\n }\n\n // Rule 6: Multiple numerics without date -> Grouped bar\n if (\n numericColumns.length > 1 &&\n categoricalColumns.length >= 1 &&\n dateColumns.length === 0 &&\n aggregatedColumns.length > 0\n ) {\n const categoryCol = categoricalColumns[0];\n if (categoryCol) {\n const xAxis = categoryCol.name;\n const yAxis = numericColumns.map((c) => c.name);\n\n // Only if we haven't already suggested a bar chart with high confidence\n const hasBarSuggestion = suggestions.some(\n (s) => s.type === 'bar' && s.confidence >= 0.85\n );\n\n if (!hasBarSuggestion) {\n suggestions.push({\n type: 'bar',\n confidence: 0.65,\n reason: 'Multiple numeric metrics can be compared with grouped bars',\n config: {\n xAxis,\n yAxis,\n orientation: 'vertical',\n stacked: false,\n showLegend: true,\n },\n });\n }\n }\n }\n\n // Fallback: If no good suggestions, provide a basic bar chart\n if (suggestions.length === 0 && analyzedColumns.length >= 2) {\n const firstCol = analyzedColumns[0];\n const secondCol = analyzedColumns[1];\n\n if (firstCol && secondCol) {\n suggestions.push({\n type: 'bar',\n confidence: 0.5,\n reason: 'Default visualization for the selected data',\n config: {\n xAxis: firstCol.name,\n yAxis: secondCol.name,\n },\n });\n }\n }\n\n // Sort by confidence descending\n suggestions.sort((a, b) => b.confidence - a.confidence);\n\n return suggestions;\n}\n\nexport default suggestChartType;\n"]}