@quantumwake/terminal-ux-dashboard-components 0.1.19 → 0.1.21
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/dist/index.cjs +141 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +43 -3
- package/dist/index.d.ts +43 -3
- package/dist/index.js +137 -28
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context/DashboardContext.tsx","../src/sqlgen.ts","../src/chartStyle.ts","../src/dataShape.ts","../src/heatmapColor.ts","../src/components/views/MetricView.tsx","../src/components/views/InsightView.tsx","../src/components/axis.tsx","../src/components/views/BarView.tsx","../src/components/views/PieView.tsx","../src/components/views/LineView.tsx","../src/components/views/ScatterView.tsx","../src/components/views/HeatmapView.tsx","../src/components/views/HeatmapPlusView.tsx","../src/components/views/PivotView.tsx","../src/components/ChartStyleControls.tsx","../src/duckdbSql.ts","../src/components/SqlConsole.tsx","../src/components/ChartBuilder.tsx","../src/components/DashboardRenderer.tsx","../src/components/DataExplorer.tsx"],"names":["createContext","jsx","useContext","opts","interpolateRdYlGn","useMemo","jsxs","ResponsiveBar","ResponsivePie","ResponsiveLine","ResponsiveScatterPlot","ResponsiveHeatMap","MAX_AXIS","fmtNum","orderIds","byCol","t","nivoData","useState","PivotTableUI","TerminalToggle","TerminalSlider","TerminalInput","TerminalSelect","snippetCompletion","completeFromList","useEffect","useRef","PostgreSQL","sqlLang","autocompletion","schemaCompletionSource","keywordCompletionSource","EditorView","Prec","keymap","acceptCompletion","Loader2","Play","CodeMirror","ChevronDown","AlertCircle","Rows3","BarChart3","PieChart","TrendingUp","ScatterChart","LayoutGrid","Grid3x3","GripVertical","X","Plus","Filter","Suspense","Fragment","Code","useCallback","RefreshCw","WidthProvider","GridLayout","Sparkles","Database","Send","Terminal","Minimize2","Maximize2","Save","FolderOpen","Trash2"],"mappings":"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","file":"index.cjs","sourcesContent":["// DashboardContext — the capability-injection contract for the dashboard\n// components. The components themselves are host-agnostic: they never import a\n// store or an API client. Instead the HOST wires concrete functions here, and\n// the components call them via useDashboard().\n//\n// Any number of hosts, one component tree:\n// - full-capability host (studio, source of truth): provides everything —\n// runQuery against a SQL service /query, plus the logged-in verbs (save/load/\n// search/delete/analyze/refine/edit).\n// - read-only host (published viewer, immutable): provides ONLY theme + runQuery\n// (e.g. DuckDB-WASM). The logged-in-only verbs are omitted, so the chart\n// builder, dashboard and SQL runner render read-only — no save/edit/load.\n//\n// Rule of thumb: a capability that is absent ⇒ its affordance is hidden. So a\n// read-only host drops nothing functionally except persistence/editing.\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\n// DashboardTheme mirrors the host's terminal theme: a flat map of Tailwind class\n// strings (text/border/bg/accent/...). Kept loose so the package doesn't depend\n// on a specific theme implementation.\nexport type DashboardTheme = Record<string, string>;\n\n// QueryResult is the shape every runQuery implementation returns.\nexport interface QueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n}\n\n// SavedDashboard is an opaque persisted dashboard descriptor (the host owns its\n// schema; the components only need id + name for listing/loading).\nexport interface SavedDashboard {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n// PanelInput is a chart panel handed to addPanel (the host assigns the id and\n// appends it to the active dashboard, creating one if none exists).\nexport interface PanelInput {\n title: string;\n type: string;\n config: Record<string, unknown>;\n width: number;\n height: number;\n}\n\n// DashboardCapabilities are the functions a host wires in. runQuery is REQUIRED;\n// the rest are OPTIONAL and gate their UI (absent ⇒ hidden).\nexport interface DashboardCapabilities {\n // REQUIRED. Run a chart/console SQL string against a state's dataset (exposed\n // as the view `data`) and return rows. Full host → a SQL service /query;\n // read-only host → DuckDB-WASM. stateId selects the dataset when the host is\n // multi-state.\n runQuery: (sql: string, stateId?: string) => Promise<QueryResult>;\n\n // OPTIONAL — studio-only (logged-in user) verbs. Omitted by the viewer.\n saveDashboard?: (name?: string) => Promise<void> | void;\n listDashboards?: () => Promise<SavedDashboard[]> | SavedDashboard[];\n searchDashboards?: (query: string) => Promise<SavedDashboard[]> | SavedDashboard[];\n loadDashboard?: (id: string) => Promise<void> | void;\n deleteDashboard?: (id: string) => Promise<void> | void;\n\n // OPTIONAL — AI assist (studio-only).\n analyzeDataset?: () => Promise<void> | void;\n refineDashboard?: (prompt: string) => Promise<void> | void;\n\n // OPTIONAL — start a fresh, empty dashboard (studio-only). Absent ⇒ no explicit\n // \"New Dashboard\" affordance (a dashboard is otherwise created implicitly by\n // the first addPanel). The host sets a blank active dashboard + clears the\n // persisted id so the next Save creates a new record.\n newDashboard?: () => void;\n\n // OPTIONAL — add a chart panel to the active dashboard (studio-only). Absent ⇒\n // the chart builder's \"Add to Dashboard\" affordance is hidden. The host\n // appends the panel (and creates the dashboard if none exists).\n addPanel?: (panel: PanelInput) => void;\n\n // OPTIONAL — editing (studio-only). Absent ⇒ panels are read-only.\n removePanel?: (panelId: string) => void;\n\n // OPTIONAL — persist a panel's PRECOMPUTED result (studio-only). When wired,\n // SQL-backed panels show a Refresh button: refresh runs runQuery and hands the\n // result rows back here so the host stores them on the panel (config.data) and\n // saves. Published dashboards are then rendered from that stored result — no\n // live query, no dataset download. Absent ⇒ no Refresh; panels are pure\n // precomputed-or-unavailable (the published viewer).\n persistPanelData?: (panelId: string, rows: QueryResult['rows'], refreshedAt: string) => void;\n\n // OPTIONAL — persist the dashboard grid layout (studio-only). When wired,\n // panels become draggable + resizable; on drop/resize the new geometry\n // (per-panel x/y/w/h, in 12-col grid units) is handed back here so the host\n // stores it on the panels and saves. Absent ⇒ a static (read-only) grid — the\n // published viewer renders panels exactly where the studio left them.\n persistLayout?: (items: PanelLayout[]) => void;\n\n // OPTIONAL — host-injected extra content on each panel's title row (rendered\n // before the remove button). The published viewer uses it for a per-chart\n // copy-embed-link icon. Absent ⇒ nothing extra renders.\n panelHeaderExtra?: (panel: PanelRef) => ReactNode;\n}\n\n// PanelRef is the minimal panel identity handed to panelHeaderExtra (the full\n// DashboardPanel type lives in DashboardRenderer; this avoids a circular import).\nexport interface PanelRef {\n id: string;\n type: string;\n title?: string;\n}\n\n// PanelLayout is one panel's position + size in the 12-column grid (grid units,\n// not pixels). x/y are the top-left cell; w/h the span.\nexport interface PanelLayout {\n id: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface DashboardContextValue extends DashboardCapabilities {\n theme: DashboardTheme;\n}\n\nconst DashboardContext = createContext<DashboardContextValue | null>(null);\n\nexport interface DashboardProviderProps extends DashboardCapabilities {\n theme: DashboardTheme;\n children: ReactNode;\n}\n\n// DashboardProvider wires the host's theme + capabilities into the component tree.\nexport function DashboardProvider({ children, ...value }: DashboardProviderProps) {\n return <DashboardContext.Provider value={value}>{children}</DashboardContext.Provider>;\n}\n\n// useDashboard returns the wired theme + capabilities. Throws if used outside a\n// provider (a programming error — the host must wrap the dashboard UI).\nexport function useDashboard(): DashboardContextValue {\n const ctx = useContext(DashboardContext);\n if (!ctx) {\n throw new Error('useDashboard must be used within a <DashboardProvider>');\n }\n return ctx;\n}\n\n// useCapabilities is a convenience derived from which functions the host wired —\n// components use it to show/hide affordances (e.g. `canSave && <SaveButton/>`).\nexport function useCapabilities() {\n const c = useDashboard();\n return {\n canRun: true,\n canSave: !!c.saveDashboard,\n canList: !!c.listDashboards,\n canSearch: !!c.searchDashboards,\n canLoad: !!c.loadDashboard,\n canDelete: !!c.deleteDashboard,\n canAnalyze: !!c.analyzeDataset,\n canRefine: !!c.refineDashboard,\n canNew: !!c.newDashboard,\n canAddPanel: !!c.addPanel,\n canEditPanels: !!c.removePanel,\n // Studio can recompute + persist a panel's precomputed result.\n canRefresh: !!c.persistPanelData,\n // Studio can drag/resize panels and persist the grid layout.\n canEditLayout: !!c.persistLayout,\n };\n}\n","// sqlgen — generate DuckDB SQL from a visual chart config, and shape the\n// resulting rows into the data shape each Nivo view expects.\n//\n// The query runner exposes a state's full dataset as a view named `data`. The\n// chart builder generates SQL against `data` (exact over the whole dataset)\n// instead of aggregating a client-side sample. The SAME SQL runs server-side in\n// a full host (e.g. a SQL service /query) or client-side in a read-only host\n// (e.g. DuckDB-WASM).\n//\n// Generated queries alias their output columns to stable names (g, v, m0…, x,\n// y, r, c) so the shaping functions don't depend on user column names.\n\nexport type ChartType = 'bar' | 'grouped-bar' | 'pie' | 'line' | 'scatter' | 'heatmap' | 'heatmap-plus';\n\nexport interface ChartField {\n name: string;\n agg?: string;\n}\n\nexport interface ChartFilter {\n column: string;\n op: string;\n value?: string | null;\n}\n\nexport interface ChartConfig {\n chartType: ChartType;\n xFields?: ChartField[];\n yFields?: ChartField[];\n valueField?: ChartField | null;\n filters?: ChartFilter[];\n // heatmap-plus only: the two independent cell stats (label vs color) and an\n // optional block field for block-scope coloring.\n labelStat?: string;\n colorStat?: string;\n blockField?: string;\n}\n\nexport type Row = Record<string, unknown>;\n\nconst TABLE = 'data';\nconst MAX_GROUPS = 50;\nconst MAX_POINTS = 1000;\n\n// Quote a SQL identifier (column name) for DuckDB.\nexport const qIdent = (name: string): string => `\"${String(name).replace(/\"/g, '\"\"')}\"`;\n\n// Render a value as a SQL literal: numeric stays raw, everything else is a\n// single-quoted, escaped string.\nexport const qLit = (v: unknown): string => {\n const s = String(v);\n if (/^-?\\d+(\\.\\d+)?$/.test(s)) return s;\n if (s === 'true' || s === 'false') return s;\n return `'${s.replace(/'/g, \"''\")}'`;\n};\n\n// The dataset stores every column as VARCHAR (state values are JSON strings), so\n// numeric aggregations must coerce the column to a number first: SUM/AVG hard\n// error on VARCHAR (\"No function matches sum(VARCHAR)\"), and MIN/MAX would sort\n// lexically (\"9\" > \"10\"). TRY_CAST is used (not a bare ::DECIMAL / CAST) so a\n// non-numeric or empty cell yields NULL — which the aggregate skips — instead of\n// failing the whole query. DECIMAL keeps SUM/AVG exact (no float drift).\nconst qNum = (col: string): string => `TRY_CAST(${qIdent(col)} AS DECIMAL(18,6))`;\n\n// Aggregate expression. count -> COUNT(*); distinct -> COUNT(DISTINCT col); else FN(col).\nexport const aggExpr = (agg: string | undefined, col?: string): string => {\n const fn = (agg || 'count').toLowerCase();\n if (fn === 'count') return 'COUNT(*)';\n if (!col) return 'COUNT(*)';\n const c = qIdent(col);\n switch (fn) {\n case 'distinct': return `COUNT(DISTINCT ${c})`;\n case 'sum': return `SUM(${qNum(col)})`;\n case 'avg': return `AVG(${qNum(col)})`;\n case 'min': return `MIN(${qNum(col)})`;\n case 'max': return `MAX(${qNum(col)})`;\n case 'median': return `MEDIAN(${qNum(col)})`;\n default: return 'COUNT(*)';\n }\n};\n\n// Compile structured filter rows into a WHERE clause (filters AND-ed).\n// Each filter: { column, op, value }. Returns '' or ' WHERE ...'.\nexport const compileWhere = (filters?: ChartFilter[]): string => {\n const conds = (filters || [])\n .filter((f) => f && f.column && f.op)\n .map((f): string | null => {\n const c = qIdent(f.column);\n switch (f.op) {\n case 'IS NULL': return `${c} IS NULL`;\n case 'IS NOT NULL': return `${c} IS NOT NULL`;\n case 'IN':\n case 'NOT IN': {\n const items = String(f.value ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n if (!items.length) return null;\n return `${c} ${f.op} (${items.map(qLit).join(', ')})`;\n }\n case 'BETWEEN': {\n const parts = String(f.value ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n if (parts.length !== 2) return null;\n return `${c} BETWEEN ${qLit(parts[0])} AND ${qLit(parts[1])}`;\n }\n case 'LIKE': return `${c} LIKE ${qLit(f.value)}`;\n default: // = != < <= > >=\n if (f.value == null || f.value === '') return null;\n return `${c} ${f.op} ${qLit(f.value)}`;\n }\n })\n .filter((x): x is string => Boolean(x));\n return conds.length ? ` WHERE ${conds.join(' AND ')}` : '';\n};\n\n// Build a chart SQL query from the builder config. Returns a SQL string, or\n// null if the config is incomplete for the chart type.\nexport const buildChartSQL = ({\n chartType,\n xFields = [],\n yFields = [],\n valueField = null,\n filters = [],\n labelStat,\n colorStat,\n blockField,\n}: ChartConfig): string | null => {\n const where = compileWhere(filters);\n const x = xFields[0]?.name;\n const y = yFields[0]?.name;\n\n switch (chartType) {\n case 'bar': {\n if (!x) return null;\n const metric = aggExpr(yFields[0]?.agg || 'count', yFields[0]?.name);\n return `SELECT ${qIdent(x)} AS g, ${metric} AS v FROM ${TABLE}${where} GROUP BY 1 ORDER BY 2 DESC LIMIT ${MAX_GROUPS}`;\n }\n case 'grouped-bar': {\n if (!x || !yFields.length) return null;\n const metrics = yFields.map((yf, i) => `${aggExpr(yf.agg || 'count', yf.name)} AS m${i}`);\n return `SELECT ${qIdent(x)} AS g, ${metrics.join(', ')} FROM ${TABLE}${where} GROUP BY 1 ORDER BY 2 DESC LIMIT ${MAX_GROUPS}`;\n }\n case 'pie': {\n if (!x) return null;\n return `SELECT ${qIdent(x)} AS g, COUNT(*) AS v FROM ${TABLE}${where} GROUP BY 1 ORDER BY 2 DESC LIMIT ${MAX_GROUPS}`;\n }\n case 'line': {\n if (!x || !y) return null;\n const w = where ? `${where} AND ${qIdent(x)} IS NOT NULL AND ${qIdent(y)} IS NOT NULL`\n : ` WHERE ${qIdent(x)} IS NOT NULL AND ${qIdent(y)} IS NOT NULL`;\n return `SELECT ${qIdent(x)} AS x, ${qIdent(y)} AS y FROM ${TABLE}${w} ORDER BY 1 LIMIT 500`;\n }\n case 'scatter': {\n if (!x || !y) return null;\n // Scatter is numeric-on-numeric. The dataset stores VARCHAR, so coerce\n // both axes with TRY_CAST and keep only rows where BOTH coerce to a\n // number — non-numeric/empty cells become NULL and are filtered out\n // (instead of silently plotting at 0). DOUBLE (not the aggregate\n // DECIMAL) avoids fixed-scale clamping of raw point values.\n const nx = `TRY_CAST(${qIdent(x)} AS DOUBLE)`, ny = `TRY_CAST(${qIdent(y)} AS DOUBLE)`;\n const extra = `${nx} IS NOT NULL AND ${ny} IS NOT NULL`;\n const w = where ? `${where} AND ${extra}` : ` WHERE ${extra}`;\n return `SELECT ${nx} AS x, ${ny} AS y FROM ${TABLE}${w} LIMIT ${MAX_POINTS}`;\n }\n case 'heatmap': {\n if (!x || !y) return null;\n const metric = valueField ? aggExpr(valueField.agg || 'count', valueField.name) : 'COUNT(*)';\n return `SELECT ${qIdent(x)} AS r, ${qIdent(y)} AS c, ${metric} AS v FROM ${TABLE}${where} GROUP BY 1, 2`;\n }\n case 'heatmap-plus': {\n if (!x || !y) return null;\n const col = valueField?.name;\n // Two independent stats per cell (label vs color); no value column ⇒\n // both are a row count. GROUPING SETS computes the body cells AND the\n // row/col/grand margins in ONE pass — every margin aggregated over the\n // UNDERLYING rows (so median/avg margins stay correct, never a stat of\n // already-aggregated cells). GROUPING() flags which set each row is.\n const lv = col ? aggExpr(labelStat || valueField?.agg || 'count', col) : 'COUNT(*)';\n const cv = col ? aggExpr(colorStat || labelStat || valueField?.agg || 'count', col) : 'COUNT(*)';\n const blockSel = blockField ? `, ANY_VALUE(${qIdent(blockField)}) AS block` : '';\n return `SELECT ${qIdent(x)} AS r, ${qIdent(y)} AS c, ${lv} AS lv, ${cv} AS cv${blockSel}, `\n + `GROUPING(${qIdent(x)}) AS gr, GROUPING(${qIdent(y)}) AS gc `\n + `FROM ${TABLE}${where} `\n + `GROUP BY GROUPING SETS ((${qIdent(x)}, ${qIdent(y)}), (${qIdent(x)}), (${qIdent(y)}), ())`;\n }\n default:\n return null;\n }\n};\n\n// Shape SQL result rows into the data structure each Nivo view consumes.\nexport const shapeChartData = (\n chartType: ChartType,\n rows: Row[],\n { yFields = [] }: { yFields?: ChartField[] } = {},\n): unknown => {\n rows = rows || [];\n switch (chartType) {\n case 'bar':\n return rows.map((r) => ({ group: String(r.g ?? '(null)'), value: Number(r.v) || 0 }));\n case 'grouped-bar': {\n const keys = yFields.map((yf) => `${yf.agg || 'count'}(${yf.name})`);\n const data = rows.map((r) => {\n const out: Record<string, string | number> = { group: String(r.g ?? '(null)') };\n yFields.forEach((_, i) => { out[keys[i]] = Number(r[`m${i}`]) || 0; });\n return out;\n });\n return { data, keys };\n }\n case 'pie':\n return rows.map((r) => ({ id: String(r.g ?? '(null)'), label: String(r.g ?? '(null)'), value: Number(r.v) || 0 }));\n case 'line':\n return [{ id: 'series', data: rows.map((r) => ({ x: String(r.x), y: Number(r.y) || 0 })) }];\n case 'scatter':\n // Keep only finite numeric points (the SQL already coerces + filters,\n // but guard the client path too — never collapse bad cells onto 0).\n return [{\n id: 'points',\n data: rows\n .map((r) => ({ x: Number(r.x), y: Number(r.y) }))\n .filter((p) => Number.isFinite(p.x) && Number.isFinite(p.y)),\n }];\n case 'heatmap': {\n // Pivot flat (r, c, v) rows into the Nivo heatmap series shape. Order\n // and capping are applied downstream by HeatmapView (which also draws\n // the marginal totals), so return the full set here.\n const rowKeys: string[] = [];\n const colKeys: string[] = [];\n const cell: Record<string, Record<string, number>> = {};\n for (const r of rows) {\n const rk = String(r.r ?? '(null)');\n const ck = String(r.c ?? '(null)');\n if (!cell[rk]) { cell[rk] = {}; rowKeys.push(rk); }\n if (!colKeys.includes(ck)) colKeys.push(ck);\n cell[rk][ck] = Number(r.v) || 0;\n }\n return rowKeys.map((rk) => ({\n id: rk,\n data: colKeys.map((ck) => ({ x: ck, y: cell[rk][ck] || 0 })),\n }));\n }\n case 'heatmap-plus': {\n // Flat (r, c, lv, cv, gr, gc, block) rows — body cells plus margin\n // rows (gr/gc flag which). HeatmapPlusView assembles the matrix,\n // ordering, margins and coloring; here just coerce types. r/c stay\n // null on margin rows (the view keys margins by the non-grouped axis).\n return rows.map((r) => ({\n r: r.r == null ? null : String(r.r),\n c: r.c == null ? null : String(r.c),\n lv: Number(r.lv) || 0,\n cv: Number(r.cv) || 0,\n gr: Number(r.gr) || 0,\n gc: Number(r.gc) || 0,\n ...(r.block != null ? { block: String(r.block) } : {}),\n }));\n }\n default:\n return [];\n }\n};\n","// chartStyle — a single, standardized chart-appearance model shared by every\n// chart view. A plain `ChartStyle` object (see DEFAULT_CHART_STYLE) is the\n// source of truth; `buildNivoTheme` turns it into a Nivo `theme`, and\n// `axisLegend` produces the per-axis legend props (title text/position/offset).\n//\n// Nivo already supports all of this natively (theme + axis legend*), so every\n// view just consumes the same style object instead of hardcoding its own theme.\n\nexport type LegendAnchor = 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'none';\nexport type LegendPosition = 'start' | 'middle' | 'end';\nexport type TitleAlign = 'left' | 'center' | 'right';\n\nexport interface ChartStyle {\n background: string;\n textColor: string;\n legendColor: string;\n fontSize: number;\n gridColor: string;\n tooltipBg: string;\n tooltipColor: string;\n // Axis titles (legends): position along the axis + distance from it.\n xLegendPosition: LegendPosition;\n xLegendOffset: number;\n yLegendPosition: LegendPosition;\n yLegendOffset: number;\n // Custom axis title text ('' ⇒ fall back to the column name) + show/hide.\n xAxisLabel: string;\n yAxisLabel: string;\n showXLegend: boolean;\n showYLegend: boolean;\n // Axis title emphasis: bold weight + a highlight halo (outline) colour.\n legendBold: boolean;\n legendHighlight: string; // '' ⇒ no halo\n // Tick handling (overflow): rotate the x / y ticks, truncate long tick labels\n // to N chars with an ellipsis (0 ⇒ off), and/or WRAP long labels onto\n // multiple lines (default on — wrapping reads better than rotation).\n xTickRotation: number;\n yTickRotation: number;\n tickTruncate: number;\n tickWrap: boolean;\n tickWrapWidth: number; // chars per wrapped line\n // Table cells: wrap long values, and format numbers (decimal precision +\n // optional truncation). cellPrecision applies to float/decimal values only.\n cellWrap: boolean;\n cellPrecision: number;\n cellTruncate: number; // 0 ⇒ off\n // Series legend placement (charts that have one: pie, grouped bar).\n legendAnchor: LegendAnchor;\n // Panel title (rendered as HTML by DashboardRenderer's header).\n titleAlign: TitleAlign;\n titleBold: boolean;\n titleBackground: string; // '' ⇒ transparent\n titleColor: string; // '' ⇒ inherit\n}\n\nexport const DEFAULT_CHART_STYLE: ChartStyle = {\n background: 'transparent', // chart canvas background\n textColor: '#94a3b8', // ticks + labels\n legendColor: '#cbd5e1', // axis titles (legends)\n fontSize: 11,\n gridColor: 'rgba(148,163,184,0.1)',\n tooltipBg: '#1e293b',\n tooltipColor: '#e2e8f0',\n // Axis titles (legends): position along the axis + distance from it.\n xLegendPosition: 'middle',\n xLegendOffset: 46,\n yLegendPosition: 'middle',\n yLegendOffset: -50,\n // Custom axis title text + visibility.\n xAxisLabel: '',\n yAxisLabel: '',\n showXLegend: true,\n showYLegend: true,\n // Axis title emphasis.\n legendBold: false,\n legendHighlight: '',\n // Tick overflow handling.\n xTickRotation: 0,\n yTickRotation: 0,\n tickTruncate: 0,\n tickWrap: true,\n tickWrapWidth: 14,\n // Table cells.\n cellWrap: true,\n cellPrecision: 2,\n cellTruncate: 0,\n // Series legend placement (charts that have one: pie, grouped bar).\n legendAnchor: 'right',\n // Panel title (rendered by DashboardRenderer's panel header).\n titleAlign: 'left',\n titleBold: false,\n titleBackground: '',\n titleColor: '',\n};\n\nexport const LEGEND_ANCHORS: LegendAnchor[] = ['right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none'];\n\n// Merge a partial style over the defaults (safe for undefined/null).\nexport const withStyleDefaults = (style?: Partial<ChartStyle> | null): ChartStyle => ({\n ...DEFAULT_CHART_STYLE,\n ...(style || {}),\n});\n\n// Build a Nivo `theme` object from a style.\nexport const buildNivoTheme = (style?: Partial<ChartStyle> | null) => {\n const s = withStyleDefaults(style);\n return {\n background: s.background,\n text: { fill: s.textColor, fontSize: s.fontSize },\n axis: {\n ticks: { text: { fill: s.textColor, fontSize: s.fontSize } },\n legend: {\n text: {\n fill: s.legendColor,\n fontSize: s.fontSize + 2,\n fontWeight: s.legendBold ? 700 : 400,\n // A highlight is drawn as a text outline (halo) — the clean,\n // SVG-native way to make an axis title stand out.\n outlineWidth: s.legendHighlight ? 3 : 0,\n outlineColor: s.legendHighlight || 'transparent',\n },\n },\n },\n grid: { line: { stroke: s.gridColor } },\n crosshair: { line: { stroke: s.textColor, strokeDasharray: '6 6' } },\n labels: { text: { fontSize: s.fontSize } },\n legends: { text: { fill: s.textColor, fontSize: s.fontSize } },\n tooltip: { container: { background: s.tooltipBg, color: s.tooltipColor, border: '1px solid #334155' } },\n };\n};\n\n// Series-legend config (Nivo `legends` entry) for charts that have a discrete\n// legend (pie, grouped bar). Returns null when the legend is hidden.\nexport const legendConfig = (style?: Partial<ChartStyle> | null) => {\n const s = withStyleDefaults(style);\n if (s.legendAnchor === 'none') return null;\n const base = {\n anchor: s.legendAnchor,\n direction: 'column' as const,\n itemWidth: 90,\n itemHeight: 18,\n itemsSpacing: 2,\n symbolSize: 10,\n symbolShape: 'circle' as const,\n itemTextColor: s.textColor,\n };\n if (s.legendAnchor === 'right') {\n // Outside the plot on the right (charts reserve right margin for this).\n return { ...base, translateX: 100 };\n }\n // Corner-anchored, inset inside the plot area.\n const tx = s.legendAnchor.includes('left') ? 10 : -10;\n const ty = s.legendAnchor.includes('top') ? 10 : -10;\n return { ...base, translateX: tx, translateY: ty };\n};\n\n// Truncate a tick label to n chars with an ellipsis (overflow handling).\nconst truncate = (v: unknown, n: number): string => {\n const str = String(v);\n return n > 0 && str.length > n ? `${str.slice(0, n)}…` : str;\n};\n\n// Axis props for a given axis ('x' | 'y'): the title (custom text or the column\n// name, hidden when its legend is toggled off), plus tick rotation/format so\n// long or numeric tick labels don't overflow. `numeric` ⇒ thousands-format the\n// ticks (value axes); otherwise long categorical labels are truncated.\nexport const axisLegend = (\n style: Partial<ChartStyle> | null | undefined,\n axis: 'x' | 'y',\n columnName: string,\n opts: { numeric?: boolean } = {},\n) => {\n const s = withStyleDefaults(style);\n const isX = axis === 'x';\n const show = isX ? s.showXLegend : s.showYLegend;\n const label = (isX ? s.xAxisLabel : s.yAxisLabel) || columnName;\n\n const out: Record<string, unknown> = {};\n if (show && label) {\n out.legend = label;\n out.legendPosition = isX ? s.xLegendPosition : s.yLegendPosition;\n out.legendOffset = isX ? s.xLegendOffset : s.yLegendOffset;\n }\n out.tickRotation = isX ? s.xTickRotation : s.yTickRotation;\n if (opts.numeric) out.format = (v: unknown) => Number(v).toLocaleString();\n else if (s.tickTruncate > 0) out.format = (v: unknown) => truncate(v, s.tickTruncate);\n return out;\n};\n","// dataShape — pure client-side grouping/aggregation helpers used by the chart\n// views when they aggregate records locally (the fallback path; the primary path\n// is server/WASM SQL via sqlgen).\n\nimport type { Row } from './sqlgen';\n\nexport type AggFn = 'count' | 'distinct' | 'sum' | 'avg' | 'min' | 'max' | 'median';\n\n// Group records by the string value of a column.\nexport const groupBy = (records: Row[], column: string): Record<string, Row[]> => {\n const groups: Record<string, Row[]> = {};\n for (const rec of records) {\n const key = String(rec[column] ?? '(null)');\n if (!groups[key]) groups[key] = [];\n groups[key].push(rec);\n }\n return groups;\n};\n\n// Aggregate a column over a set of records.\nexport const aggregate = (records: Row[], column: string, fn: AggFn | string): number => {\n const values = records.map((r) => r[column]).filter((v) => v != null);\n switch (fn) {\n case 'count': return records.length;\n case 'distinct': return new Set(values.map(String)).size;\n case 'sum': return values.reduce((a: number, b) => a + Number(b), 0);\n case 'avg': return values.length ? values.reduce((a: number, b) => a + Number(b), 0) / values.length : 0;\n case 'min': return Math.min(...values.map(Number));\n case 'max': return Math.max(...values.map(Number));\n case 'median': {\n const nums = values.map(Number).filter((v) => !Number.isNaN(v)).sort((a, b) => a - b);\n if (!nums.length) return 0;\n const mid = Math.floor(nums.length / 2);\n return nums.length % 2 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\n }\n default: return records.length;\n }\n};\n","// heatmapColor — the heatmap's color engine (pure; no nivo, no React).\n//\n// Cell color = cmap(method(colorValue, within = scope)):\n// scope — which cells share a color domain: global | row | column | block\n// method — how a value maps to [0,1] inside its scope:\n// linear (min→max position) or rank (Hazen percentile — robust to\n// outliers, spreads color evenly across clumpy distributions)\n//\n// nivo's built-in scales normalize globally, so they cannot express these\n// scopes; the view precomputes each cell's t ∈ [0,1] here and hands nivo a\n// colors FUNCTION. Margins always normalize within their own partition (row\n// margins together, column margins together), never folded into the body.\n\nimport { interpolateRdYlGn } from 'd3-scale-chromatic';\n\nexport type HeatStat = 'count' | 'sum' | 'avg' | 'min' | 'max' | 'median';\nexport type ColorScope = 'global' | 'row' | 'column' | 'block';\nexport type ColorMethod = 'linear' | 'rank';\n\nexport const HEAT_STATS: HeatStat[] = ['count', 'sum', 'avg', 'min', 'max', 'median'];\n\n// One body cell (or margin cell) to be colored. `block` is only consulted when\n// scope = block (cells with the same block value share a domain).\nexport interface HeatCell {\n row: string;\n col: string;\n colorValue: number;\n block?: string;\n}\n\nexport interface ColorOptions {\n scope?: ColorScope;\n method?: ColorMethod;\n // Fixed domain override for cross-chart comparability (linear method only —\n // rank is magnitude-free by construction).\n vmin?: number;\n vmax?: number;\n}\n\nexport const cellKey = (row: string, col: string): string => `${row}\u0000${col}`;\n\n// Normalize one partition's values to t ∈ [0,1] by method.\nconst normalizePartition = (\n cells: HeatCell[],\n method: ColorMethod,\n vmin?: number,\n vmax?: number,\n): Map<string, number> => {\n const out = new Map<string, number>();\n const values = cells.map((c) => c.colorValue).filter((v) => Number.isFinite(v));\n if (!values.length) return out;\n\n if (method === 'rank') {\n // Hazen percentile: (below + 0.5·ties) / n — ties share one t, and a\n // single-value partition lands mid-scale instead of an extreme.\n const sorted = [...values].sort((a, b) => a - b);\n for (const c of cells) {\n const below = sorted.findIndex((v) => v >= c.colorValue);\n const ties = sorted.filter((v) => v === c.colorValue).length;\n out.set(cellKey(c.row, c.col), (below + 0.5 * ties) / sorted.length);\n }\n return out;\n }\n\n // linear: position across [lo, hi] (fixed override wins), clamped.\n const lo = vmin ?? Math.min(...values);\n const hi = vmax ?? Math.max(...values);\n for (const c of cells) {\n const t = hi === lo ? 0.5 : (c.colorValue - lo) / (hi - lo);\n out.set(cellKey(c.row, c.col), Math.max(0, Math.min(1, t)));\n }\n return out;\n};\n\n// Partition body cells by scope, normalize each partition independently, and\n// return cellKey → t. block scope without block values degrades to global.\nexport const normalizeCells = (\n cells: HeatCell[],\n { scope = 'global', method = 'linear', vmin, vmax }: ColorOptions = {},\n): Map<string, number> => {\n const partitions = new Map<string, HeatCell[]>();\n const partOf = (c: HeatCell): string => {\n switch (scope) {\n case 'row': return `r:${c.row}`;\n case 'column': return `c:${c.col}`;\n case 'block': return c.block != null ? `b:${c.block}` : 'global';\n default: return 'global';\n }\n };\n for (const c of cells) {\n const k = partOf(c);\n const part = partitions.get(k);\n if (part) part.push(c);\n else partitions.set(k, [c]);\n }\n const out = new Map<string, number>();\n for (const part of partitions.values()) {\n for (const [k, t] of normalizePartition(part, method, vmin, vmax)) out.set(k, t);\n }\n return out;\n};\n\n// Default colormap: RdYlGn — red = low → green = high.\nexport const heatColor = (t: number): string => interpolateRdYlGn(Math.max(0, Math.min(1, t)));\n\n// Cell-label color auto-contrasts on the cell's color: RdYlGn extremes are\n// dark (white text), the mid yellows are light (dark text). Computed from the\n// actual interpolated color's relative luminance, not the t value.\nexport const heatLabelColor = (t: number): string => {\n const m = heatColor(t).match(/\\d+/g);\n if (!m) return '#0f172a';\n const [r, g, b] = m.map(Number);\n const lum = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per-channel weights, 0–255\n return lum > 140 ? '#0f172a' : '#f8fafc';\n};\n","import { useMemo } from 'react';\n\nimport { aggregate } from '../../dataShape';\nimport type { Row } from '../../sqlgen';\n\nexport interface MetricConfig {\n column: string;\n agg?: string;\n label?: string;\n}\n\nexport interface MetricViewProps {\n records?: Row[];\n config: MetricConfig;\n /** Pre-computed value bypasses client-side aggregation. */\n value?: number | string | null;\n}\n\n/** Single-number metric card. Shows a big number with a label. */\nexport function MetricView({ records, config, value: presetValue }: MetricViewProps) {\n const value = useMemo(() => {\n if (presetValue != null) return presetValue;\n if (!records?.length) return 0;\n return aggregate(records, config.column, config.agg || 'count');\n }, [records, config, presetValue]);\n\n const formatted = typeof value === 'number'\n ? value.toLocaleString(undefined, { maximumFractionDigits: 2 })\n : value;\n\n return (\n <div className=\"h-full flex flex-col items-center justify-center\">\n <div className=\"text-4xl font-mono text-midnight-accent\">{formatted}</div>\n <div className=\"text-sm text-midnight-text-muted mt-2\">{config.label || `${config.agg}(${config.column})`}</div>\n </div>\n );\n}\n\nexport default MetricView;\n","export interface InsightConfig {\n text?: string;\n}\n\nexport interface InsightViewProps {\n config: InsightConfig;\n}\n\n/** Text insight card rendered from AI analysis. */\nexport function InsightView({ config }: InsightViewProps) {\n return (\n <div className=\"h-full p-4 overflow-auto\">\n <p className=\"text-sm text-midnight-text-body leading-relaxed whitespace-pre-wrap\">\n {config.text}\n </p>\n </div>\n );\n}\n\nexport default InsightView;\n","// axis.tsx — one shared builder for a Nivo axis (bottom / left) from a ChartStyle.\n//\n// Centralizes axis-title text/visibility, tick rotation (x AND y), truncation,\n// and multi-line WRAPPING (default on — wrapping reads better than rotation for\n// long categorical labels). Every view uses makeAxis so behaviour is identical\n// across bar / line / scatter / grouped-bar (this also fixes the y-tick angle,\n// which the grouped-bar view previously ignored).\n\nimport type { ReactNode } from 'react';\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\n\ntype Axis = 'x' | 'y';\n\ninterface AxisOpts {\n numeric?: boolean; // value axes → thousands-format the ticks\n}\n\n// Format a tick value to a display string: numeric → locale, then truncate.\nfunction formatVal(value: unknown, s: ChartStyle, numeric: boolean): string {\n let str = numeric ? Number(value).toLocaleString() : String(value);\n if (s.tickTruncate > 0 && str.length > s.tickTruncate) str = `${str.slice(0, s.tickTruncate)}…`;\n return str;\n}\n\n// Wrap a string into lines of at most `width` chars, breaking on spaces where\n// possible (hard-splitting an over-long single token). Caps at 4 lines.\nfunction wrapText(str: string, width: number): string[] {\n if (width <= 0 || str.length <= width) return [str];\n const words = str.split(/\\s+/);\n const lines: string[] = [];\n let cur = '';\n const push = (t: string) => { if (t) lines.push(t); };\n for (const w of words) {\n if (w.length > width) {\n push(cur); cur = '';\n for (let i = 0; i < w.length; i += width) lines.push(w.slice(i, i + width));\n continue;\n }\n if (!cur) cur = w;\n else if (cur.length + 1 + w.length <= width) cur += ` ${w}`;\n else { push(cur); cur = w; }\n }\n push(cur);\n if (lines.length > 4) {\n const kept = lines.slice(0, 4);\n kept[3] = `${kept[3].slice(0, Math.max(0, width - 1))}…`;\n return kept;\n }\n return lines;\n}\n\n// Build the full Nivo axis object for the given axis from a style. Returns `any`\n// for friction-free interop with each chart's axis-prop type (the views differ).\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function makeAxis(style: Partial<ChartStyle> | null | undefined, axis: Axis, columnName: string, opts: AxisOpts = {}): any {\n const s = withStyleDefaults(style);\n const isX = axis === 'x';\n const numeric = !!opts.numeric;\n const show = isX ? s.showXLegend : s.showYLegend;\n const label = (isX ? s.xAxisLabel : s.yAxisLabel) || columnName;\n const rotate = isX ? s.xTickRotation : s.yTickRotation;\n\n const out: Record<string, unknown> = { tickSize: 5, tickPadding: 5 };\n if (show && label) {\n out.legend = label;\n out.legendPosition = isX ? s.xLegendPosition : s.yLegendPosition;\n out.legendOffset = isX ? s.xLegendOffset : s.yLegendOffset;\n }\n\n if (s.tickWrap) {\n // Custom tick: format → wrap into <tspan> lines → rotate. (Nivo SVG text\n // can't wrap on its own.)\n out.renderTick = (tick: {\n x: number; y: number; value: unknown; textX: number; textY: number;\n textAnchor: string; textBaseline: string;\n }): ReactNode => {\n const lines = wrapText(formatVal(tick.value, s, numeric), s.tickWrapWidth);\n const firstDy = isX ? '0' : `${-((lines.length - 1) * 0.55)}em`;\n return (\n <g transform={`translate(${tick.x},${tick.y})`}>\n <line x2={isX ? 0 : -5} y2={isX ? 5 : 0} style={{ stroke: s.textColor, strokeWidth: 1, opacity: 0.3 }} />\n <text\n transform={`translate(${tick.textX},${tick.textY}) rotate(${rotate})`}\n textAnchor={tick.textAnchor as never}\n dominantBaseline={tick.textBaseline as never}\n style={{ fill: s.textColor, fontSize: s.fontSize }}\n >\n {lines.map((ln, i) => (\n <tspan key={i} x={0} dy={i === 0 ? firstDy : '1.1em'}>{ln}</tspan>\n ))}\n </text>\n </g>\n );\n };\n } else {\n out.tickRotation = rotate;\n out.format = (v: unknown) => formatVal(v, s, numeric);\n }\n return out;\n}\n","import { useMemo } from 'react';\nimport { ResponsiveBar } from '@nivo/bar';\n\nimport { groupBy, aggregate } from '../../dataShape';\nimport { buildNivoTheme } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport { makeAxis } from '../axis';\nimport type { Row } from '../../sqlgen';\n\nexport interface BarDatum {\n group: string;\n value: number;\n}\n\nexport interface BarViewProps {\n records?: Row[];\n groupColumn: string;\n valueColumn: string;\n aggFn?: string;\n /** Pre-aggregated [{group, value}] bypasses client-side aggregation. */\n data?: BarDatum[];\n style?: Partial<ChartStyle>;\n}\n\nexport function BarView({ records, groupColumn, valueColumn, aggFn = 'count', data: presetData, style }: BarViewProps) {\n const computed = useMemo<BarDatum[]>(() => {\n if (presetData || !records) return [];\n const groups = groupBy(records, groupColumn);\n return Object.entries(groups)\n .map(([key, recs]) => ({ group: key, value: aggregate(recs, valueColumn, aggFn) }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 50);\n }, [records, groupColumn, valueColumn, aggFn, presetData]);\n const data = presetData || computed;\n\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveBar\n data={data as never}\n keys={['value']}\n indexBy=\"group\"\n margin={{ top: 20, right: 20, bottom: 60, left: 60 }}\n padding={0.3}\n colors={['rgba(74, 222, 128, 0.8)']}\n borderColor={{ from: 'color', modifiers: [['darker', 1.6]] } as never}\n axisBottom={makeAxis(style, 'x', groupColumn)}\n axisLeft={makeAxis(style, 'y', valueColumn, { numeric: true })}\n labelSkipWidth={12}\n labelSkipHeight={12}\n labelTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default BarView;\n","import { useMemo } from 'react';\nimport { ResponsivePie } from '@nivo/pie';\n\nimport { groupBy } from '../../dataShape';\nimport { buildNivoTheme, legendConfig } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport type { Row } from '../../sqlgen';\n\nexport interface PieDatum {\n id: string;\n label: string;\n value: number;\n}\n\nexport interface PieViewProps {\n records?: Row[];\n groupColumn: string;\n /** Pre-aggregated [{id, label, value}] bypasses client-side aggregation. */\n data?: PieDatum[];\n style?: Partial<ChartStyle>;\n}\n\nexport function PieView({ records, groupColumn, data: presetData, style }: PieViewProps) {\n const computed = useMemo<PieDatum[]>(() => {\n if (presetData || !records) return [];\n const groups = groupBy(records, groupColumn);\n const sorted = Object.entries(groups).sort((a, b) => b[1].length - a[1].length);\n const top = sorted.slice(0, 12);\n const otherCount = sorted.slice(12).reduce((sum, [, recs]) => sum + recs.length, 0);\n const result: PieDatum[] = top.map(([key, recs]) => ({ id: key, label: key, value: recs.length }));\n if (otherCount > 0) result.push({ id: '(other)', label: '(other)', value: otherCount });\n return result;\n }, [records, groupColumn, presetData]);\n const data = presetData || computed;\n\n const legend = legendConfig(style);\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsivePie\n data={data as never}\n margin={{ top: 20, right: 120, bottom: 20, left: 20 }}\n innerRadius={0.4}\n padAngle={1}\n cornerRadius={3}\n activeOuterRadiusOffset={8}\n colors={{ scheme: 'set2' }}\n borderWidth={1}\n borderColor={{ from: 'color', modifiers: [['darker', 0.2]] } as never}\n arcLinkLabelsSkipAngle={10}\n arcLinkLabelsTextColor=\"#94a3b8\"\n arcLinkLabelsColor={{ from: 'color' }}\n arcLabelsSkipAngle={10}\n arcLabelsTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n legends={legend ? [legend as never] : []}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default PieView;\n","import { useMemo } from 'react';\nimport { ResponsiveLine } from '@nivo/line';\n\nimport { buildNivoTheme } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport { makeAxis } from '../axis';\nimport type { Row } from '../../sqlgen';\n\nexport interface LineSerie {\n id: string;\n data: { x: string; y: number }[];\n}\n\nexport interface LineViewProps {\n records?: Row[];\n xColumn: string;\n yColumn: string;\n /** Pre-shaped Nivo line series bypasses client-side processing. */\n data?: LineSerie[];\n style?: Partial<ChartStyle>;\n}\n\nexport function LineView({ records, xColumn, yColumn, data: presetData, style }: LineViewProps) {\n const computed = useMemo<LineSerie[]>(() => {\n if (presetData || !records) return [];\n const sorted = [...records]\n .filter((r) => r[xColumn] != null && r[yColumn] != null)\n .sort((a, b) => {\n const av = a[xColumn] as never;\n const bv = b[xColumn] as never;\n return av < bv ? -1 : av > bv ? 1 : 0;\n })\n .slice(0, 500);\n\n return [{\n id: yColumn,\n data: sorted.map((r) => ({ x: String(r[xColumn]), y: Number(r[yColumn]) || 0 })),\n }];\n }, [records, xColumn, yColumn, presetData]);\n const data = presetData || computed;\n\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveLine\n data={data as never}\n margin={{ top: 20, right: 20, bottom: 60, left: 60 }}\n xScale={{ type: 'point' }}\n yScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n curve=\"monotoneX\"\n enableArea={true}\n areaOpacity={0.15}\n colors={['rgba(96, 165, 250, 0.9)']}\n pointSize={(data[0]?.data.length ?? 0) > 50 ? 0 : 6}\n pointColor={{ theme: 'background' }}\n pointBorderWidth={2}\n pointBorderColor={{ from: 'serieColor' }}\n enableGridX={false}\n axisBottom={makeAxis(style, 'x', xColumn)}\n axisLeft={makeAxis(style, 'y', yColumn, { numeric: true })}\n useMesh={true}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default LineView;\n","import { useMemo } from 'react';\nimport { ResponsiveScatterPlot } from '@nivo/scatterplot';\n\nimport { buildNivoTheme } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport { makeAxis } from '../axis';\nimport type { Row } from '../../sqlgen';\n\nexport interface ScatterSerie {\n id: string;\n data: { x: number; y: number }[];\n}\n\nexport interface ScatterViewProps {\n records?: Row[];\n xColumn: string;\n yColumn: string;\n /** Pre-shaped Nivo scatter series bypasses client-side processing. */\n data?: ScatterSerie[];\n style?: Partial<ChartStyle>;\n}\n\nexport function ScatterView({ records, xColumn, yColumn, data: presetData, style }: ScatterViewProps) {\n const computed = useMemo<ScatterSerie[]>(() => {\n if (presetData || !records) return [];\n // Scatter axes are both numeric (linear scales). Coerce, then DROP any\n // point whose x or y isn't a finite number — coercing non-numeric cells\n // to 0 (the old behaviour) collapsed them onto the origin/axes and\n // produced a misleading plot.\n const points = records\n .map((r) => ({ x: Number(r[xColumn]), y: Number(r[yColumn]) }))\n .filter((p) => Number.isFinite(p.x) && Number.isFinite(p.y))\n .slice(0, 1000);\n\n return [{ id: `${xColumn} vs ${yColumn}`, data: points }];\n }, [records, xColumn, yColumn, presetData]);\n const data = presetData || computed;\n\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveScatterPlot\n data={data as never}\n margin={{ top: 20, right: 20, bottom: 60, left: 60 }}\n xScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n yScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n colors={['rgba(167, 139, 250, 0.7)']}\n nodeSize={6}\n axisBottom={makeAxis(style, 'x', xColumn, { numeric: true })}\n axisLeft={makeAxis(style, 'y', yColumn, { numeric: true })}\n useMesh={true}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default ScatterView;\n","import { useMemo } from 'react';\nimport { ResponsiveHeatMap } from '@nivo/heatmap';\n\nimport { groupBy, aggregate } from '../../dataShape';\nimport { buildNivoTheme, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport type { Row } from '../../sqlgen';\n\nconst MAX_AXIS = 30;\n\nexport interface HeatmapSerie {\n id: string;\n data: { x: string; y: number }[];\n}\n\ntype AxisOrder = 'alpha' | 'total-asc' | 'total-desc';\n\n// Reduce a list of cell values to a single marginal (row/column total).\nconst reduceVals = (vals: number[], agg: string): number => {\n const nums = vals.map(Number).filter((v) => !Number.isNaN(v));\n switch (agg) {\n case 'avg': return nums.length ? nums.reduce((a, b) => a + b, 0) / nums.length : 0;\n case 'min': return nums.length ? Math.min(...nums) : 0;\n case 'max': return nums.length ? Math.max(...nums) : 0;\n case 'count': return vals.length;\n case 'sum':\n default: return nums.reduce((a, b) => a + b, 0);\n }\n};\n\nconst fmtNum = (n: number): string => {\n if (typeof n !== 'number' || Number.isNaN(n)) return '';\n return Number.isInteger(n) ? n.toLocaleString() : n.toLocaleString(undefined, { maximumFractionDigits: 2 });\n};\n\n// Order a list of ids: alphabetical, or by a marginal value (asc/desc).\nconst orderIds = (ids: string[], marginals: Record<string, number>, order: AxisOrder): string[] => {\n const sorted = [...ids];\n if (order === 'total-desc') sorted.sort((a, b) => (marginals[b] || 0) - (marginals[a] || 0));\n else if (order === 'total-asc') sorted.sort((a, b) => (marginals[a] || 0) - (marginals[b] || 0));\n else sorted.sort();\n return sorted;\n};\n\nexport interface HeatmapViewProps {\n records?: Row[];\n rowColumn: string;\n colColumn: string;\n valueColumn?: string;\n aggFn?: string;\n data?: HeatmapSerie[];\n rowOrder?: AxisOrder;\n colOrder?: AxisOrder;\n marginAgg?: string;\n showTotals?: boolean;\n style?: Partial<ChartStyle>;\n}\n\n/**\n * HeatmapView builds a cross-tabulation heatmap (confusion / pairwise matrix).\n * rowColumn values become rows, colColumn values become columns; the cell value\n * is aggFn over valueColumn (or a record count when no valueColumn).\n */\nexport function HeatmapView({\n records, rowColumn, colColumn, valueColumn, aggFn = 'count', data: presetData,\n rowOrder = 'alpha', colOrder = 'alpha', marginAgg = 'sum', showTotals = false, style,\n}: HeatmapViewProps) {\n const s = withStyleDefaults(style);\n\n // 1. Build the base (unordered, uncapped) series from records or preset data.\n const base = useMemo<HeatmapSerie[]>(() => {\n if (presetData) return presetData;\n if (!records) return [];\n const rowGroups = groupBy(records, rowColumn);\n const colValues = [...new Set(records.map((r) => String(r[colColumn] ?? '(null)')))];\n const fn = valueColumn ? aggFn : 'count';\n return Object.keys(rowGroups).map((rowVal) => ({\n id: rowVal,\n data: colValues.map((colVal) => {\n const cellRecords = rowGroups[rowVal]?.filter((r) => String(r[colColumn] ?? '(null)') === colVal) || [];\n return { x: colVal, y: cellRecords.length && valueColumn ? aggregate(cellRecords, valueColumn, fn) : cellRecords.length };\n }),\n }));\n }, [records, rowColumn, colColumn, valueColumn, aggFn, presetData]);\n\n // 2. Order + cap rows and columns by marginal totals, and compute the totals.\n const { data, rowTotals, colTotals } = useMemo(() => {\n if (!base.length) return { data: [] as HeatmapSerie[], rowTotals: {} as Record<string, number>, colTotals: {} as Record<string, number> };\n\n const cell: Record<string, Record<string, number>> = {};\n const colIdSet: string[] = [];\n for (const row of base) {\n cell[row.id] = {};\n for (const d of row.data) {\n cell[row.id][d.x] = Number(d.y) || 0;\n if (!colIdSet.includes(d.x)) colIdSet.push(d.x);\n }\n }\n const rowIds = base.map((r) => r.id);\n\n const rowMarg: Record<string, number> = {};\n rowIds.forEach((rid) => { rowMarg[rid] = reduceVals(colIdSet.map((cid) => cell[rid][cid] ?? 0), marginAgg); });\n const colMarg: Record<string, number> = {};\n colIdSet.forEach((cid) => { colMarg[cid] = reduceVals(rowIds.map((rid) => cell[rid][cid] ?? 0), marginAgg); });\n\n const orderedRows = orderIds(rowIds, rowMarg, rowOrder).slice(0, MAX_AXIS);\n const orderedCols = orderIds(colIdSet, colMarg, colOrder).slice(0, MAX_AXIS);\n\n const shaped: HeatmapSerie[] = orderedRows.map((rid) => ({\n id: rid,\n data: orderedCols.map((cid) => ({ x: cid, y: cell[rid][cid] ?? 0 })),\n }));\n return { data: shaped, rowTotals: rowMarg, colTotals: colMarg };\n }, [base, rowOrder, colOrder, marginAgg]);\n\n if (!data.length || !data[0].data.length) {\n return <div className=\"p-8 text-center text-midnight-text-muted\">Not enough distinct values for a heatmap</div>;\n }\n\n const margin = showTotals\n ? { top: 60, right: 70, bottom: 60, left: 100 }\n : { top: 60, right: 20, bottom: 20, left: 100 };\n\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveHeatMap\n data={data as never}\n margin={margin}\n axisTop={{ tickSize: 5, tickPadding: 5, tickRotation: s.xTickRotation, legend: s.showXLegend ? (s.xAxisLabel || colColumn) : '', legendPosition: s.xLegendPosition, legendOffset: -50 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, legend: s.showYLegend ? (s.yAxisLabel || rowColumn) : '', legendPosition: s.yLegendPosition, legendOffset: -80 }}\n axisRight={showTotals ? { tickSize: 5, tickPadding: 5, format: (id) => fmtNum(rowTotals[id as string]), legend: `${marginAgg} ▸`, legendOffset: 60 } : null}\n axisBottom={showTotals ? { tickSize: 5, tickPadding: 5, tickRotation: -35, format: (id) => fmtNum(colTotals[id as string]) } : null}\n colors={{ type: 'sequential', scheme: 'blue_green', minValue: 0 }}\n emptyColor=\"#1e293b\"\n borderWidth={1}\n borderColor=\"#334155\"\n labelTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n hoverTarget=\"cell\"\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default HeatmapView;\n","import { useMemo } from 'react';\nimport { ResponsiveHeatMap } from '@nivo/heatmap';\n\nimport { groupBy, aggregate } from '../../dataShape';\nimport { buildNivoTheme, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport type { Row } from '../../sqlgen';\nimport {\n normalizeCells, heatColor, heatLabelColor, cellKey,\n type HeatStat, type ColorScope, type ColorMethod, type HeatCell,\n} from '../../heatmapColor';\n\nconst MAX_AXIS = 30;\nconst TOTAL_ID = 'Σ';\nconst NULL = '(null)';\n\n// One cell's two stat values (label vs color), plus an optional block tag.\ninterface CellStat { lv: number; cv: number; block?: string }\ntype Stats = Record<string, Record<string, CellStat>>; // [row][col]\ntype Margin = Record<string, CellStat>;\n\n// Flat datum emitted by sqlgen's heatmap-plus shaper: body cells plus margin\n// rows, distinguished by the GROUPING flags gr/gc.\nexport interface HeatPlusDatum {\n r: string | null;\n c: string | null;\n lv: number;\n cv: number;\n gr?: number;\n gc?: number;\n block?: string;\n}\n\n// margin-* and total-* are aliases (so the builder's existing order control,\n// which emits total-*, drives both heatmaps).\ntype AxisOrder = 'alpha' | 'margin-asc' | 'margin-desc' | 'total-asc' | 'total-desc';\n\nexport interface HeatmapPlusViewProps {\n // Direct path: raw rows + field config (margins computed over these rows).\n records?: Row[];\n rowColumn: string;\n colColumn: string;\n valueColumn?: string;\n labelStat?: HeatStat;\n colorStat?: HeatStat;\n blockField?: string;\n // Baked/SQL path: pre-aggregated cells + margins (gr/gc flagged).\n data?: HeatPlusDatum[];\n // Color engine.\n scope?: ColorScope;\n method?: ColorMethod;\n vmin?: number;\n vmax?: number;\n // Axis ordering + margin display.\n rowOrder?: AxisOrder;\n colOrder?: AxisOrder;\n showMargins?: boolean;\n style?: Partial<ChartStyle>;\n}\n\nconst fmtNum = (n: number): string => {\n if (typeof n !== 'number' || Number.isNaN(n)) return '';\n return Number.isInteger(n) ? n.toLocaleString() : n.toLocaleString(undefined, { maximumFractionDigits: 2 });\n};\n\nconst orderIds = (ids: string[], margin: Margin, order: AxisOrder): string[] => {\n const sorted = [...ids];\n if (order.endsWith('-desc')) sorted.sort((a, b) => (margin[b]?.lv ?? 0) - (margin[a]?.lv ?? 0));\n else if (order.endsWith('-asc')) sorted.sort((a, b) => (margin[a]?.lv ?? 0) - (margin[b]?.lv ?? 0));\n else sorted.sort();\n return sorted;\n};\n\n// Assemble cells + margins from raw records: every margin aggregated over the\n// UNDERLYING rows (group → aggregate), so median/avg margins stay correct.\nfunction fromRecords(\n records: Row[], rowCol: string, colCol: string,\n valueCol: string | undefined, labelStat: HeatStat, colorStat: HeatStat, blockField?: string,\n): { rowIds: string[]; colIds: string[]; cells: Stats; rowMargin: Margin; colMargin: Margin; grand: CellStat } {\n const col = valueCol || rowCol; // unused for count; aggregate ignores it\n const statOf = (rs: Row[], s: HeatStat): number => (valueCol ? aggregate(rs, col, s) : rs.length);\n const both = (rs: Row[]): CellStat => ({ lv: statOf(rs, labelStat), cv: statOf(rs, colorStat) });\n\n const byRow = groupBy(records, rowCol);\n const rowIds: string[] = Object.keys(byRow);\n const colIds: string[] = [...new Set(records.map((r) => String(r[colCol] ?? NULL)))];\n\n const cells: Stats = {};\n for (const rid of rowIds) {\n cells[rid] = {};\n const byCol = groupBy(byRow[rid], colCol);\n for (const cid of colIds) {\n const cellRows = byCol[cid] || [];\n const stat = both(cellRows);\n if (blockField && cellRows.length) stat.block = String(cellRows[0][blockField] ?? NULL);\n cells[rid][cid] = stat;\n }\n }\n const rowMargin: Margin = {};\n for (const rid of rowIds) rowMargin[rid] = both(byRow[rid]);\n const colMargin: Margin = {};\n const byCol = groupBy(records, colCol);\n for (const cid of colIds) colMargin[cid] = both(byCol[cid] || []);\n return { rowIds, colIds, cells, rowMargin, colMargin, grand: both(records) };\n}\n\n// Assemble cells + margins from the flat baked data (margins already computed\n// over underlying rows server-side via GROUPING SETS).\nfunction fromData(\n data: HeatPlusDatum[],\n): { rowIds: string[]; colIds: string[]; cells: Stats; rowMargin: Margin; colMargin: Margin; grand: CellStat } {\n const cells: Stats = {};\n const rowMargin: Margin = {};\n const colMargin: Margin = {};\n let grand: CellStat = { lv: 0, cv: 0 };\n const rowIds: string[] = [];\n const colIds: string[] = [];\n for (const d of data) {\n const stat: CellStat = { lv: d.lv, cv: d.cv, ...(d.block != null ? { block: d.block } : {}) };\n if (d.gr && d.gc) { grand = stat; continue; } // grand total\n if (d.gr) { if (d.c != null) colMargin[d.c] = stat; continue; } // column margin\n if (d.gc) { if (d.r != null) rowMargin[d.r] = stat; continue; } // row margin\n const r = d.r ?? NULL, c = d.c ?? NULL; // body cell\n if (!cells[r]) { cells[r] = {}; rowIds.push(r); }\n if (!colIds.includes(c)) colIds.push(c);\n cells[r][c] = stat;\n }\n return { rowIds, colIds, cells, rowMargin, colMargin, grand };\n}\n\n/**\n * HeatmapPlusView — a cross-tab heatmap with independent label/color stats,\n * margins computed over the underlying rows, and a scope/method color engine\n * (see heatmapColor.ts). nivo's built-in scales normalize globally, so colors\n * are precomputed per cell here and handed to nivo as a function.\n */\nexport function HeatmapPlusView({\n records, rowColumn, colColumn, valueColumn,\n labelStat = 'count', colorStat = 'count', blockField,\n data: presetData,\n scope = 'global', method = 'linear', vmin, vmax,\n rowOrder = 'alpha', colOrder = 'alpha', showMargins = false, style,\n}: HeatmapPlusViewProps) {\n const s = withStyleDefaults(style);\n\n const model = useMemo(() => {\n if (presetData) return fromData(presetData);\n if (records) return fromRecords(records, rowColumn, colColumn, valueColumn, labelStat, colorStat, blockField);\n return null;\n }, [presetData, records, rowColumn, colColumn, valueColumn, labelStat, colorStat, blockField]);\n\n const built = useMemo(() => {\n if (!model || !model.rowIds.length || !model.colIds.length) return null;\n const { cells, rowMargin, colMargin, grand } = model;\n\n const rows = orderIds(model.rowIds, rowMargin, rowOrder).slice(0, MAX_AXIS);\n const cols = orderIds(model.colIds, colMargin, colOrder).slice(0, MAX_AXIS);\n\n // Precompute normalized t per cell. Body uses the chosen scope+method (+\n // optional fixed vmin/vmax). Margins normalize on their OWN scope (row\n // margins together, column margins together, grand alone) — never folded\n // into the body — using the same method, but no fixed override.\n const bodyCells: HeatCell[] = [];\n for (const rid of rows) for (const cid of cols) {\n bodyCells.push({ row: rid, col: cid, colorValue: cells[rid]?.[cid]?.cv ?? NaN, block: cells[rid]?.[cid]?.block });\n }\n const t = new Map<string, number>(normalizeCells(bodyCells, { scope, method, vmin, vmax }));\n\n if (showMargins) {\n const rowMc: HeatCell[] = rows.map((rid) => ({ row: rid, col: TOTAL_ID, colorValue: rowMargin[rid]?.cv ?? NaN }));\n const colMc: HeatCell[] = cols.map((cid) => ({ row: TOTAL_ID, col: cid, colorValue: colMargin[cid]?.cv ?? NaN }));\n for (const [k, v] of normalizeCells(rowMc, { scope: 'global', method })) t.set(k, v);\n for (const [k, v] of normalizeCells(colMc, { scope: 'global', method })) t.set(k, v);\n t.set(cellKey(TOTAL_ID, TOTAL_ID), 0.5);\n }\n\n // nivo matrix: y carries the LABEL stat (drives the cell label); color\n // comes from the precomputed t map, not y.\n const colKeys = showMargins ? [...cols, TOTAL_ID] : cols;\n const nivoData = rows.map((rid) => ({\n id: rid,\n data: colKeys.map((cid) => ({\n x: cid,\n y: cid === TOTAL_ID ? (rowMargin[rid]?.lv ?? 0) : (cells[rid]?.[cid]?.lv ?? 0),\n })),\n }));\n if (showMargins) {\n nivoData.push({\n id: TOTAL_ID,\n data: colKeys.map((cid) => ({\n x: cid,\n y: cid === TOTAL_ID ? grand.lv : (colMargin[cid]?.lv ?? 0),\n })),\n });\n }\n return { nivoData, t };\n }, [model, rowOrder, colOrder, scope, method, vmin, vmax, showMargins]);\n\n if (!built) {\n return <div className=\"p-8 text-center text-midnight-text-muted\">Not enough distinct values for a heatmap</div>;\n }\n\n const { nivoData, t } = built;\n const tAt = (serieId: string, x: string): number => t.get(cellKey(serieId, x)) ?? 0;\n\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveHeatMap\n data={nivoData as never}\n margin={{ top: 60, right: 20, bottom: showMargins ? 60 : 20, left: 100 }}\n valueFormat={((v: number) => fmtNum(v)) as never}\n axisTop={{ tickSize: 5, tickPadding: 5, tickRotation: s.xTickRotation, legend: s.showXLegend ? (s.xAxisLabel || colColumn) : '', legendPosition: s.xLegendPosition, legendOffset: -50 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, legend: s.showYLegend ? (s.yAxisLabel || rowColumn) : '', legendPosition: s.yLegendPosition, legendOffset: -80 }}\n colors={((cell: { serieId: string; data: { x: string } }) => heatColor(tAt(cell.serieId, cell.data.x))) as never}\n emptyColor=\"#1e293b\"\n borderWidth={1}\n borderColor=\"#334155\"\n labelTextColor={((cell: { serieId: string; data: { x: string } }) => heatLabelColor(tAt(cell.serieId, cell.data.x))) as never}\n hoverTarget=\"cell\"\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default HeatmapPlusView;\n","import { useState } from 'react';\nimport PivotTableUI from 'react-pivottable/PivotTableUI';\nimport 'react-pivottable/pivottable.css';\n\nimport type { Row } from '../../sqlgen';\n\nexport interface PivotViewProps {\n records?: Row[];\n}\n\n/**\n * PivotView wraps react-pivottable — a drag-and-drop pivot table that\n * introspects columns from the data automatically.\n */\nexport function PivotView({ records }: PivotViewProps) {\n const [pivotState, setPivotState] = useState<Record<string, unknown>>({});\n\n if (!records?.length) {\n return <div className=\"p-8 text-center text-midnight-text-muted\">No data for pivot</div>;\n }\n\n return (\n <div className=\"h-full overflow-auto pivot-dark-theme\">\n <style>{`\n /* Override react-pivottable styles for dark theme */\n .pivot-dark-theme .pvtUi { background: transparent; color: #e2e8f0; }\n .pivot-dark-theme table.pvtTable { font-size: 12px; color: #e2e8f0; border-collapse: collapse; }\n .pivot-dark-theme table.pvtTable thead tr th,\n .pivot-dark-theme table.pvtTable tbody tr th { background: #1e293b; color: #94a3b8; border: 1px solid #334155; padding: 4px 8px; }\n .pivot-dark-theme table.pvtTable tbody tr td { background: #0f172a; color: #e2e8f0; border: 1px solid #334155; padding: 4px 8px; text-align: right; }\n .pivot-dark-theme .pvtAxisContainer, .pivot-dark-theme .pvtVals { background: #1e293b; border: 1px solid #334155; }\n .pivot-dark-theme .pvtAxisContainer li.pvtAxis { background: #334155; color: #e2e8f0; border: 1px solid #475569; border-radius: 3px; }\n .pivot-dark-theme .pvtFilterBox { background: #1e293b; border: 1px solid #334155; color: #e2e8f0; }\n .pivot-dark-theme .pvtDropdown { background: #1e293b; color: #e2e8f0; border: 1px solid #334155; }\n .pivot-dark-theme .pvtSearch { background: #0f172a; color: #e2e8f0; border: 1px solid #334155; }\n .pivot-dark-theme select, .pivot-dark-theme .pvtAggregator { background: #1e293b; color: #e2e8f0; border: 1px solid #334155; }\n .pivot-dark-theme .pvtRenderers { background: #1e293b; color: #e2e8f0; border: 1px solid #334155; }\n `}</style>\n <PivotTableUI\n data={records}\n onChange={(s: Record<string, unknown>) => setPivotState(s)}\n {...pivotState}\n />\n </div>\n );\n}\n\nexport default PivotView;\n","import { type ReactNode } from 'react';\nimport { TerminalToggle, TerminalSlider, TerminalSelect, TerminalInput } from '@quantumwake/terminal-ux-components';\n\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\n\n// ChartStyleControls — the standardized appearance editor used across all charts.\n// Built from the shared design system (TerminalToggle / TerminalSlider /\n// TerminalSelect / TerminalInput) so it matches the rest of the ISM UI exactly.\n// Edits a plain ChartStyle object (see chartStyle.ts); the parent persists it and\n// passes it to the views.\n\n// ─── Layout ─────────────────────────────────────────────────────────────────\n\n// A titled group, separated by a divider so related controls cluster visually.\n// Layout uses inline styles (not arbitrary Tailwind values like grid-cols-[..]),\n// which a consuming app's Tailwind may not generate for this package — that was\n// the cause of controls dropping onto the next line.\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <div className=\"border-t border-midnight-border font-mono\" style={{ paddingTop: 12, paddingBottom: 12 }}>\n <div className=\"uppercase tracking-wider text-midnight-text-subdued\" style={{ fontSize: 10, marginBottom: 8 }}>{title}</div>\n <div style={{ display: 'flex', flexDirection: 'column', rowGap: 6 }}>{children}</div>\n </div>\n );\n}\n\n// One control row: label (left) + control (right) on the SAME row, two cells,\n// fixed height so every row shares the same vertical rhythm. Inline grid so it\n// never collapses to block flow regardless of the host's Tailwind config.\nfunction Row({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div style={{ display: 'grid', gridTemplateColumns: '84px minmax(0, 1fr)', alignItems: 'center', columnGap: 8, height: 32 }}>\n <span className=\"text-xs font-mono text-midnight-text-muted truncate\" title={label}>{label}</span>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', width: '100%', minWidth: 0 }}>{children}</div>\n </div>\n );\n}\n\n// Native colour swatch — the design system has no colour picker; this is the one\n// raw control, styled to match the midnight inputs.\nfunction ColorControl({ value, onChange }: { value: string; onChange: (v: string) => void }) {\n return (\n <input\n type=\"color\"\n value={/^#/.test(value) ? value : '#94a3b8'}\n onChange={e => onChange(e.target.value)}\n className=\"w-9 h-6 bg-transparent border border-midnight-border cursor-pointer p-0\"\n />\n );\n}\n\n// Optional colour: a toggle enables it (defaulting to `fallback`); off ⇒ '' (none).\nfunction OptionalColor({ value, onChange, fallback = '#a78bfa' }: { value: string; onChange: (v: string) => void; fallback?: string }) {\n const on = !!value;\n return (\n <div className=\"flex items-center gap-2\">\n {on && <ColorControl value={value} onChange={onChange} />}\n <TerminalToggle size=\"small\" checked={on} onChange={v => onChange(v ? fallback : '')} />\n </div>\n );\n}\n\n// ─── Editor ─────────────────────────────────────────────────────────────────\n\nexport interface ChartStyleControlsProps {\n style?: Partial<ChartStyle> | null;\n onChange: (next: ChartStyle) => void;\n}\n\nexport function ChartStyleControls({ style, onChange }: ChartStyleControlsProps) {\n const s = withStyleDefaults(style);\n const set = <K extends keyof ChartStyle>(key: K, value: ChartStyle[K]) => onChange({ ...s, [key]: value });\n\n return (\n <div>\n <Section title=\"Canvas\">\n <Row label=\"Background\"><ColorControl value={s.background} onChange={v => set('background', v)} /></Row>\n <Row label=\"Text\"><ColorControl value={s.textColor} onChange={v => set('textColor', v)} /></Row>\n <Row label=\"Grid\"><ColorControl value={s.gridColor} onChange={v => set('gridColor', v)} /></Row>\n <Row label=\"Font size\"><TerminalSlider value={s.fontSize} min={6} max={24} unit=\"px\" onChange={v => set('fontSize', v)} /></Row>\n </Section>\n\n <Section title=\"Axis titles\">\n <Row label=\"X title\"><TerminalInput size=\"small\" value={s.xAxisLabel} placeholder=\"(column)\" onChange={e => set('xAxisLabel', e.target.value)} /></Row>\n <Row label=\"Show X\"><TerminalToggle size=\"small\" checked={s.showXLegend} onChange={v => set('showXLegend', v)} /></Row>\n <Row label=\"Y title\"><TerminalInput size=\"small\" value={s.yAxisLabel} placeholder=\"(column)\" onChange={e => set('yAxisLabel', e.target.value)} /></Row>\n <Row label=\"Show Y\"><TerminalToggle size=\"small\" checked={s.showYLegend} onChange={v => set('showYLegend', v)} /></Row>\n <Row label=\"Color\"><ColorControl value={s.legendColor} onChange={v => set('legendColor', v)} /></Row>\n <Row label=\"Bold\"><TerminalToggle size=\"small\" checked={s.legendBold} onChange={v => set('legendBold', v)} /></Row>\n <Row label=\"Highlight\"><OptionalColor value={s.legendHighlight} onChange={v => set('legendHighlight', v)} /></Row>\n </Section>\n\n <Section title=\"Axis placement\">\n <Row label=\"X pos\"><TerminalSelect size=\"small\" value={s.xLegendPosition} options={['start', 'middle', 'end']} onChange={v => set('xLegendPosition', v as ChartStyle['xLegendPosition'])} /></Row>\n <Row label=\"X offset\"><TerminalSlider value={s.xLegendOffset} min={-80} max={80} onChange={v => set('xLegendOffset', v)} /></Row>\n <Row label=\"Y pos\"><TerminalSelect size=\"small\" value={s.yLegendPosition} options={['start', 'middle', 'end']} onChange={v => set('yLegendPosition', v as ChartStyle['yLegendPosition'])} /></Row>\n <Row label=\"Y offset\"><TerminalSlider value={s.yLegendOffset} min={-80} max={80} onChange={v => set('yLegendOffset', v)} /></Row>\n </Section>\n\n <Section title=\"Ticks\">\n <Row label=\"Wrap\"><TerminalToggle size=\"small\" checked={s.tickWrap} onChange={v => set('tickWrap', v)} /></Row>\n <Row label=\"Wrap width\"><TerminalSlider value={s.tickWrapWidth} min={4} max={40} onChange={v => set('tickWrapWidth', v)} /></Row>\n <Row label=\"X angle\"><TerminalSlider value={s.xTickRotation} min={-90} max={90} unit=\"°\" onChange={v => set('xTickRotation', v)} /></Row>\n <Row label=\"Y angle\"><TerminalSlider value={s.yTickRotation} min={-90} max={90} unit=\"°\" onChange={v => set('yTickRotation', v)} /></Row>\n <Row label=\"Truncate\"><TerminalSlider value={s.tickTruncate} min={0} max={40} onChange={v => set('tickTruncate', v)} /></Row>\n </Section>\n\n <Section title=\"Table cells\">\n <Row label=\"Wrap\"><TerminalToggle size=\"small\" checked={s.cellWrap} onChange={v => set('cellWrap', v)} /></Row>\n <Row label=\"Decimals\"><TerminalSlider value={s.cellPrecision} min={0} max={8} onChange={v => set('cellPrecision', v)} /></Row>\n <Row label=\"Truncate\"><TerminalSlider value={s.cellTruncate} min={0} max={80} onChange={v => set('cellTruncate', v)} /></Row>\n </Section>\n\n <Section title=\"Panel title\">\n <Row label=\"Align\"><TerminalSelect size=\"small\" value={s.titleAlign} options={['left', 'center', 'right']} onChange={v => set('titleAlign', v as ChartStyle['titleAlign'])} /></Row>\n <Row label=\"Bold\"><TerminalToggle size=\"small\" checked={s.titleBold} onChange={v => set('titleBold', v)} /></Row>\n <Row label=\"Color\"><OptionalColor value={s.titleColor} onChange={v => set('titleColor', v)} fallback=\"#e2e8f0\" /></Row>\n <Row label=\"Background\"><OptionalColor value={s.titleBackground} onChange={v => set('titleBackground', v)} fallback=\"#1e293b\" /></Row>\n </Section>\n\n <Section title=\"Series legend\">\n <Row label=\"Position\"><TerminalSelect size=\"small\" value={s.legendAnchor} options={['right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none']} onChange={v => set('legendAnchor', v as ChartStyle['legendAnchor'])} /></Row>\n </Section>\n </div>\n );\n}\n\nexport default ChartStyleControls;\n","// duckdbSql — DuckDB-flavoured SQL autocomplete for the SqlConsole editor.\n//\n// The PostgreSQL CodeMirror dialect already covers most of what DuckDB inherits\n// (it's intentionally PG-compatible), so we use it for keywords. On top we add a\n// curated source of DuckDB functions, types, extra keywords, and a few snippets\n// (GROUP BY etc.). Combined with schema/keyword completion in SqlConsole.\n\nimport { completeFromList, snippetCompletion, type Completion, type CompletionSource } from '@codemirror/autocomplete';\n\n// Aggregates + window functions (the ones people reach for in analysis).\nconst AGGREGATES = [\n 'count', 'count_if', 'sum', 'avg', 'min', 'max', 'median', 'mode',\n 'stddev', 'stddev_pop', 'stddev_samp', 'var_pop', 'var_samp', 'variance',\n 'quantile', 'quantile_cont', 'quantile_disc', 'approx_count_distinct', 'approx_quantile',\n 'arg_max', 'arg_min', 'first', 'last', 'product', 'bool_and', 'bool_or',\n 'bit_and', 'bit_or', 'bit_xor', 'string_agg', 'list', 'array_agg', 'histogram',\n 'corr', 'covar_pop', 'covar_samp', 'kurtosis', 'skewness', 'entropy',\n 'row_number', 'rank', 'dense_rank', 'percent_rank', 'cume_dist', 'ntile',\n 'lag', 'lead', 'first_value', 'last_value', 'nth_value',\n];\n\n// Scalar functions across string / date / math / list / json / conditional.\nconst SCALARS = [\n // string\n 'length', 'len', 'lower', 'upper', 'trim', 'ltrim', 'rtrim', 'substring', 'substr',\n 'concat', 'concat_ws', 'replace', 'reverse', 'repeat', 'lpad', 'rpad', 'left', 'right',\n 'contains', 'starts_with', 'ends_with', 'position', 'split_part', 'string_split',\n 'regexp_matches', 'regexp_replace', 'regexp_extract', 'regexp_full_match', 'regexp_split_to_array',\n 'format', 'printf', 'md5', 'sha256', 'levenshtein', 'jaccard', 'ascii', 'chr',\n // date / time\n 'now', 'current_date', 'current_timestamp', 'today', 'date_trunc', 'date_part', 'date_diff',\n 'date_add', 'date_sub', 'age', 'strftime', 'strptime', 'epoch', 'epoch_ms', 'extract',\n 'make_date', 'make_time', 'make_timestamp', 'last_day', 'dayname', 'monthname',\n 'year', 'month', 'day', 'hour', 'minute', 'second', 'dayofweek', 'dayofyear', 'week', 'quarter', 'time_bucket',\n // math\n 'abs', 'ceil', 'ceiling', 'floor', 'round', 'trunc', 'sign', 'mod', 'pow', 'power', 'sqrt', 'cbrt',\n 'exp', 'ln', 'log', 'log2', 'log10', 'greatest', 'least', 'gcd', 'lcm', 'factorial', 'random',\n 'pi', 'degrees', 'radians', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2',\n // conditional / null / cast\n 'coalesce', 'ifnull', 'nullif', 'nvl', 'if', 'try_cast', 'cast', 'typeof',\n // list / struct / map / json\n 'list_value', 'list_aggregate', 'list_distinct', 'list_sort', 'list_reverse', 'list_slice',\n 'list_concat', 'list_contains', 'list_position', 'list_extract', 'list_transform', 'list_filter',\n 'unnest', 'array_length', 'array_to_string', 'struct_pack', 'struct_extract',\n 'map', 'map_keys', 'map_values', 'json_extract', 'json_extract_string', 'to_json', 'from_json',\n 'json_array_length', 'json_keys', 'generate_series', 'range',\n];\n\nconst TYPES = [\n 'BOOLEAN', 'TINYINT', 'SMALLINT', 'INTEGER', 'BIGINT', 'HUGEINT',\n 'UTINYINT', 'USMALLINT', 'UINTEGER', 'UBIGINT', 'FLOAT', 'REAL', 'DOUBLE',\n 'DECIMAL', 'NUMERIC', 'VARCHAR', 'CHAR', 'TEXT', 'BLOB', 'BIT',\n 'DATE', 'TIME', 'TIMESTAMP', 'TIMESTAMPTZ', 'INTERVAL', 'UUID', 'JSON',\n 'LIST', 'ARRAY', 'STRUCT', 'MAP', 'UNION', 'ENUM',\n];\n\n// DuckDB keywords/clauses that the PostgreSQL dialect doesn't know about.\nconst EXTRA_KEYWORDS = [\n 'QUALIFY', 'EXCLUDE', 'PIVOT', 'UNPIVOT', 'ASOF', 'POSITIONAL', 'SEMI', 'ANTI',\n 'SUMMARIZE', 'DISTINCT ON', 'GROUP BY ALL', 'ORDER BY ALL', 'USING SAMPLE',\n];\n\nfunction opts(labels: string[], type: string, boost = 0): Completion[] {\n return labels.map((label) => ({ label, type, boost }));\n}\n\nconst SNIPPETS: Completion[] = [\n snippetCompletion('SELECT ${col}, count(*) AS n\\nFROM data\\nGROUP BY ${col}\\nORDER BY n DESC', {\n label: 'group by count', type: 'snippet', detail: 'aggregate by column',\n }),\n snippetCompletion('SELECT *\\nFROM data\\nORDER BY ${col} DESC\\nLIMIT 10', {\n label: 'top N', type: 'snippet', detail: 'order + limit',\n }),\n snippetCompletion('SELECT DISTINCT ${col}\\nFROM data', {\n label: 'select distinct', type: 'snippet',\n }),\n];\n\n// duckdbCompletionSource completes DuckDB functions/types/keywords/snippets. It\n// fires on word characters (so it merges with schema + keyword completion).\nexport const duckdbCompletionSource: CompletionSource = completeFromList([\n ...opts(AGGREGATES, 'function', 1), // boost aggregates slightly — common in analysis\n ...opts(SCALARS, 'function'),\n ...opts(TYPES, 'type'),\n ...opts(EXTRA_KEYWORDS, 'keyword'),\n ...SNIPPETS,\n]);\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Play, Loader2, AlertCircle, Rows3, ChevronDown } from 'lucide-react';\nimport CodeMirror, { keymap, Prec, EditorView } from '@uiw/react-codemirror';\nimport { sql as sqlLang, PostgreSQL, schemaCompletionSource, keywordCompletionSource } from '@codemirror/lang-sql';\nimport { autocompletion, acceptCompletion } from '@codemirror/autocomplete';\nimport { useDashboard } from '../context/DashboardContext';\nimport { duckdbCompletionSource } from '../duckdbSql';\nimport type { Row } from '../sqlgen';\n\nconst DEFAULT_SQL = 'SELECT *\\nFROM data\\nLIMIT 100';\n\n// A schema column descriptor surfaced as an insertable chip below the editor.\nexport interface SqlConsoleColumn {\n name: string;\n type?: string;\n}\n\nexport interface SqlConsoleProps {\n // Optional schema columns rendered as click-to-insert chips. Defaults to none.\n columns?: SqlConsoleColumn[];\n // Optional state selector forwarded to runQuery (host may be multi-state).\n stateId?: string;\n // Whether the column-chip list starts expanded. Defaults to false (collapsed)\n // so the editor stays uncluttered; click \"Columns (N)\" to reveal the chips.\n defaultColumnsOpen?: boolean;\n // Initial editor query. Defaults to SELECT * FROM data LIMIT 100.\n defaultSql?: string;\n // Run the default query automatically on mount (and on stateId change) so the\n // viewer shows rows immediately without a manual Run. Defaults to false.\n autoRun?: boolean;\n}\n\n// Renders a single result cell value safely.\nconst renderCell = (v: unknown): string => {\n if (v == null) return '';\n if (typeof v === 'object') return JSON.stringify(v);\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n return String(v);\n};\n\ninterface QueryState {\n columns: string[];\n rows: Row[];\n}\n\n/**\n * SqlConsole — a HuggingFace-style read-only SQL editor over a state's full\n * dataset. The state's data is exposed (server-side DuckDB in studio, DuckDB-WASM\n * in the viewer) as a view named `data`; queries run against the entire dataset,\n * not a client sample.\n */\nexport function SqlConsole({ columns = [], stateId, defaultColumnsOpen = false, defaultSql = DEFAULT_SQL, autoRun = false }: SqlConsoleProps) {\n const { theme, runQuery } = useDashboard();\n\n const [sql, setSql] = useState<string>(defaultSql);\n const [result, setResult] = useState<QueryState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [running, setRunning] = useState<boolean>(false);\n const [columnsOpen, setColumnsOpen] = useState<boolean>(defaultColumnsOpen);\n\n // run executes `text` (defaults to the editor's current query). Passing the\n // text explicitly lets auto-run fire the default query without waiting for the\n // `sql` state to settle.\n const run = async (text: string = sql): Promise<void> => {\n if (running || !text.trim()) return;\n setRunning(true);\n setError(null);\n try {\n const data = await runQuery(text, stateId);\n setResult({ columns: data.columns || [], rows: data.rows || [] });\n } catch (err) {\n setResult(null);\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setRunning(false);\n }\n };\n\n // Auto-run the default query on mount / state change so the viewer shows rows\n // immediately. Only mounts once the host has materialized the data (the\n // published viewer gates this behind its loader), so this never bypasses a\n // download confirm. eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!autoRun || !stateId) return;\n setSql(defaultSql);\n void run(defaultSql);\n }, [stateId, autoRun, defaultSql]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Keep the ⌘↵ keybinding pointed at the latest run closure without rebuilding\n // the editor extensions on every keystroke.\n const runRef = useRef<() => void>(() => {});\n runRef.current = () => { void run(); };\n\n // SQL language + autocomplete. The PostgreSQL dialect covers most DuckDB\n // keywords/types/functions; on top we complete the `data` table's columns\n // (unqualified, via defaultTable) and a curated DuckDB function/type/snippet\n // source. Rebuilt only when the column set changes (keyed by name list) so\n // typing doesn't reconfigure the editor. ⌘↵ runs; Tab accepts a suggestion.\n const schemaKey = columns.map(c => c.name).join(',');\n const extensions = useMemo(() => {\n const sqlConfig = {\n dialect: PostgreSQL,\n schema: { data: columns.map(c => c.name) },\n defaultTable: 'data',\n upperCaseKeywords: true,\n };\n return [\n sqlLang(sqlConfig),\n autocompletion({\n override: [\n schemaCompletionSource(sqlConfig),\n keywordCompletionSource(PostgreSQL, true),\n duckdbCompletionSource,\n ],\n }),\n EditorView.lineWrapping,\n Prec.highest(keymap.of([\n { key: 'Mod-Enter', run: () => { runRef.current(); return true; } },\n { key: 'Tab', run: acceptCompletion },\n ])),\n ];\n }, [schemaKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const resultColumns = result?.columns || [];\n\n return (\n <div className=\"flex flex-col h-full\">\n {/* Editor */}\n <div className={`border-b ${theme.border} bg-midnight-elevated p-3 shrink-0`}>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs uppercase text-midnight-text-muted font-mono\">\n SQL — table is <code className=\"text-midnight-accent\">data</code>\n </span>\n <button onClick={() => void run()} disabled={running || !sql.trim()}\n className={`flex items-center gap-1.5 px-3 py-1 border text-xs font-mono transition-colors ${\n running ? 'border-midnight-border opacity-50' : 'border-midnight-accent text-midnight-accent hover:bg-midnight-accent/10'\n }`}>\n {running ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : <Play className=\"w-3.5 h-3.5\" />}\n Run <span className=\"opacity-60\">⌘↵</span>\n </button>\n </div>\n <CodeMirror\n value={sql}\n onChange={setSql}\n extensions={extensions}\n theme=\"dark\"\n basicSetup={{ lineNumbers: false, foldGutter: false, highlightActiveLine: false, autocompletion: false }}\n height=\"120px\"\n placeholder=\"SELECT ... FROM data\"\n className=\"border border-midnight-border text-sm overflow-hidden focus-within:border-midnight-accent\"\n />\n {columns.length > 0 && (\n <div className=\"mt-2\">\n <button onClick={() => setColumnsOpen(o => !o)}\n className=\"flex items-center gap-1 text-[11px] font-mono text-midnight-text-muted hover:text-midnight-text-body transition-colors\">\n <ChevronDown className={`w-3 h-3 transition-transform ${columnsOpen ? '' : '-rotate-90'}`} />\n Columns ({columns.length})\n </button>\n {columnsOpen && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {columns.map(c => (\n <button key={c.name} title={`Insert ${c.name}`}\n onClick={() => setSql(s => `${s}${s.endsWith(' ') || s.endsWith('\\n') || !s ? '' : ' '}${c.name}`)}\n className=\"px-1.5 py-0.5 border border-midnight-border text-[11px] font-mono text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n {c.name}<span className=\"opacity-50 ml-1\">{c.type}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Result meta */}\n {(result || error) && (\n <div className={`flex items-center gap-4 px-3 py-1.5 border-b ${theme.border} text-xs font-mono shrink-0 ${error ? 'text-red-400' : 'text-midnight-text-muted'}`}>\n {error ? (\n <span className=\"flex items-center gap-1.5\"><AlertCircle className=\"w-3.5 h-3.5\" /> {error}</span>\n ) : (\n <span className=\"flex items-center gap-1\"><Rows3 className=\"w-3.5 h-3.5\" /> {result!.rows.length.toLocaleString()} rows</span>\n )}\n </div>\n )}\n\n {/* Results table */}\n <div className=\"flex-1 min-h-0 overflow-auto\">\n {result && !error && resultColumns.length > 0 ? (\n <table className=\"w-full text-xs\">\n <thead className=\"sticky top-0 bg-midnight-elevated\">\n <tr>\n {resultColumns.map(c => (\n <th key={c} className=\"px-2 py-1.5 text-left text-midnight-text-muted font-mono border-b border-midnight-border whitespace-nowrap\">\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.map((row, i) => (\n <tr key={i} className=\"border-b border-dashed border-midnight-border hover:bg-midnight-raised\">\n {resultColumns.map(c => (\n <td key={c} className=\"px-2 py-1 text-midnight-text-body font-mono truncate max-w-[300px]\">\n {renderCell(row[c])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n ) : !error && (\n <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">\n Write a query and press <span className=\"text-midnight-accent mx-1\">Run</span> (⌘↵)\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default SqlConsole;\n","import { useState, useMemo, useEffect, useRef, Suspense } from 'react';\nimport { ResponsiveBar } from '@nivo/bar';\nimport {\n BarChart3, PieChart, TrendingUp, ScatterChart, LayoutGrid, Grid3x3,\n Plus, X, GripVertical, ChevronDown, Filter, Code, Loader2, AlertCircle,\n} from 'lucide-react';\n\nimport { useDashboard } from '../context/DashboardContext';\nimport { buildChartSQL, shapeChartData } from '../sqlgen';\nimport type { ChartType, ChartConfig, ChartField, ChartFilter, Row } from '../sqlgen';\nimport { buildNivoTheme, legendConfig, DEFAULT_CHART_STYLE } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\nimport { makeAxis } from './axis';\nimport { groupBy, aggregate } from '../dataShape';\nimport {\n BarView, PieView, LineView, ScatterView, HeatmapView, HeatmapPlusView,\n type BarDatum, type PieDatum, type LineSerie, type ScatterSerie, type HeatmapSerie, type HeatPlusDatum,\n} from './views';\nimport { HEAT_STATS, type HeatStat, type ColorScope, type ColorMethod } from '../heatmapColor';\nimport { ChartStyleControls } from './ChartStyleControls';\nimport { TerminalToggle } from '@quantumwake/terminal-ux-components';\n\n// ─── Public types ─────────────────────────────────────────────────\n\n// A schema column descriptor (name + type tag used for the pill color).\nexport interface ChartBuilderColumn {\n name: string;\n type?: string;\n}\n\n// The panel descriptor handed to onSave when the user clicks \"Add to Dashboard\".\n// Mirrors the legacy stateFsSlice.addDashboardPanel payload (the host assigns the\n// panel id). config is intentionally loose — it carries both the legacy\n// client-side fields and the SQL-mode fields, exactly as the studio persists.\nexport interface ChartPanel {\n title: string;\n type: ChartType | 'bar';\n config: Record<string, unknown>;\n width: number;\n height: number;\n}\n\nexport interface ChartBuilderProps {\n // Loaded sample records, used by the 'direct' (client-side) engine mode and\n // forwarded to the views for local aggregation.\n records?: Row[];\n // Schema columns offered in the field pickers / available-fields list.\n columns: ChartBuilderColumn[];\n // Optional state selector forwarded to runQuery (host may be multi-state).\n stateId?: string;\n // Optional persistence hook. Absent ⇒ the \"Add to Dashboard\" button is hidden\n // (read-only viewer). Called with the assembled panel descriptor.\n onSave?: (panel: ChartPanel) => void;\n}\n\n// ─── Chart Types ──────────────────────────────────────────────────\n\ninterface ChartTypeOption {\n id: ChartType;\n icon: typeof BarChart3;\n label: string;\n}\n\nconst CHART_TYPES: ChartTypeOption[] = [\n { id: 'bar', icon: BarChart3, label: 'Bar' },\n { id: 'pie', icon: PieChart, label: 'Pie' },\n { id: 'line', icon: TrendingUp, label: 'Line' },\n { id: 'scatter', icon: ScatterChart, label: 'Scatter' },\n { id: 'heatmap', icon: LayoutGrid, label: 'Heatmap' },\n { id: 'heatmap-plus', icon: Grid3x3, label: 'Heatmap+' },\n { id: 'grouped-bar', icon: BarChart3, label: 'Grouped Bar' },\n];\n\nconst AGG_OPTIONS = ['count', 'distinct', 'sum', 'avg', 'min', 'max'];\n\nconst FILTER_OPS = ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN', 'LIKE', 'BETWEEN', 'IS NULL', 'IS NOT NULL'];\nconst OPS_NO_VALUE = new Set(['IS NULL', 'IS NOT NULL']);\n\ninterface IdLabel {\n id: string;\n label: string;\n}\n\n// Themed select. The package can't import the host's TerminalDropdown, so this is\n// a raw <select> styled to match the surrounding Appearance/filter controls.\ninterface SelectControlProps {\n value: string;\n options: IdLabel[];\n onChange: (id: string) => void;\n className?: string;\n}\n\nconst SelectControl = ({ value, options, onChange, className = 'w-28' }: SelectControlProps) => (\n <div className={className}>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent transition-colors\"\n >\n {options.map((o) => (\n <option key={o.id} value={o.id}>{o.label}</option>\n ))}\n </select>\n </div>\n);\n\nconst ORDER_OPTIONS: IdLabel[] = [\n { id: 'alpha', label: 'A → Z' },\n { id: 'total-desc', label: 'Total ↓' },\n { id: 'total-asc', label: 'Total ↑' },\n];\nconst MARGIN_AGGS: IdLabel[] = ['sum', 'avg', 'min', 'max', 'count'].map((a) => ({ id: a, label: a }));\n// heatmap-plus controls.\nconst HEAT_STAT_OPTIONS: IdLabel[] = HEAT_STATS.map((a) => ({ id: a, label: a }));\nconst SCOPE_OPTIONS: IdLabel[] = [\n { id: 'global', label: 'Global' },\n { id: 'row', label: 'Per row' },\n { id: 'column', label: 'Per column' },\n { id: 'block', label: 'Per block' },\n];\nconst METHOD_OPTIONS: IdLabel[] = [\n { id: 'linear', label: 'Linear' },\n { id: 'rank', label: 'Rank' },\n];\nconst FILTER_OP_OPTIONS: IdLabel[] = FILTER_OPS.map((o) => ({ id: o, label: o }));\n\n// ─── Field Pill ───────────────────────────────────────────────────\n\ninterface FieldPillProps {\n name: string;\n type?: string;\n onRemove?: () => void;\n onChangeAgg?: (agg: string) => void;\n agg?: string;\n showAgg?: boolean;\n}\n\nconst FieldPill = ({ name, type, onRemove, onChangeAgg, agg, showAgg }: FieldPillProps) => {\n const typeColor = ({\n string: 'border-green-500/50 text-green-400',\n int64: 'border-blue-500/50 text-blue-400',\n float64: 'border-purple-500/50 text-purple-400',\n bool: 'border-orange-500/50 text-orange-400',\n } as Record<string, string>)[type ?? ''] || 'border-midnight-border text-midnight-text-body';\n\n return (\n <div className={`flex items-center gap-1 px-2 py-1 border ${typeColor} bg-midnight-surface text-xs font-mono`}>\n <GripVertical className=\"w-3 h-3 opacity-40\" />\n <span>{name}</span>\n {showAgg && (\n <select value={agg} onChange={(e) => onChangeAgg?.(e.target.value)}\n className=\"bg-transparent border-none text-xs outline-none ml-1 text-midnight-text-muted\">\n {AGG_OPTIONS.map((a) => <option key={a} value={a}>{a}</option>)}\n </select>\n )}\n {onRemove && (\n <button onClick={onRemove} className=\"ml-1 hover:text-red-400\"><X className=\"w-3 h-3\" /></button>\n )}\n </div>\n );\n};\n\n// ─── Drop Zone ────────────────────────────────────────────────────\n\ninterface DropZoneProps {\n label: string;\n fields: ChartField[];\n onAdd: (field: ChartField) => void;\n onRemove: (idx: number) => void;\n onChangeAgg: (idx: number, agg: string) => void;\n columns: ChartBuilderColumn[];\n showAgg?: boolean;\n maxFields?: number;\n}\n\nconst DropZone = ({ label, fields, onAdd, onRemove, onChangeAgg, columns, showAgg = false, maxFields = 5 }: DropZoneProps) => {\n const [showPicker, setShowPicker] = useState(false);\n const usedNames = new Set(fields.map((f) => f.name));\n const available = columns.filter((c) => !usedNames.has(c.name));\n\n return (\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-1 font-mono\">{label}</div>\n <div className=\"flex flex-wrap gap-1 min-h-[32px] p-1.5 border border-dashed border-midnight-border bg-midnight-surface/50\">\n {fields.map((f, i) => (\n <FieldPill\n key={f.name}\n name={f.name}\n type={(f as ChartField & { type?: string }).type}\n agg={f.agg}\n showAgg={showAgg}\n onRemove={() => onRemove(i)}\n onChangeAgg={(agg) => onChangeAgg(i, agg)}\n />\n ))}\n {fields.length < maxFields && available.length > 0 && (\n <div className=\"relative\">\n <button onClick={() => setShowPicker(!showPicker)}\n className=\"flex items-center gap-1 px-2 py-1 border border-dashed border-midnight-border text-xs text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n <Plus className=\"w-3 h-3\" /> Add\n </button>\n {showPicker && (\n <div className=\"absolute top-full left-0 mt-1 z-20 bg-midnight-elevated border border-midnight-border shadow-lg max-h-[200px] overflow-auto min-w-[150px]\">\n {available.map((col) => (\n <button key={col.name}\n onClick={() => { onAdd({ name: col.name, type: col.type, agg: 'count' } as ChartField); setShowPicker(false); }}\n className=\"block w-full text-left px-3 py-1.5 text-xs font-mono text-midnight-text-body hover:bg-midnight-raised transition-colors\">\n <span>{col.name}</span>\n <span className=\"text-midnight-text-muted ml-2\">({col.type})</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ─── Filters (compile to a WHERE clause) ─────────────────────────\n\ninterface FiltersSectionProps {\n filters: ChartFilter[];\n columns: ChartBuilderColumn[];\n onChange: (filters: ChartFilter[]) => void;\n}\n\nconst FiltersSection = ({ filters, columns, onChange }: FiltersSectionProps) => {\n const addFilter = () => onChange([...filters, { column: columns[0]?.name || '', op: '=', value: '' }]);\n const updateFilter = (i: number, patch: Partial<ChartFilter>) => onChange(filters.map((f, idx) => idx === i ? { ...f, ...patch } : f));\n const removeFilter = (i: number) => onChange(filters.filter((_, idx) => idx !== i));\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"text-xs uppercase text-midnight-text-muted font-mono flex items-center gap-1\"><Filter className=\"w-3 h-3\" /> Filters</div>\n <button onClick={addFilter} disabled={!columns.length}\n className=\"flex items-center gap-1 px-1.5 py-0.5 border border-dashed border-midnight-border text-xs text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n <Plus className=\"w-3 h-3\" /> Add\n </button>\n </div>\n <div className=\"space-y-1\">\n {filters.map((f, i) => (\n <div key={i} className=\"flex items-center gap-1\">\n <SelectControl\n value={f.column}\n options={columns.map((c) => ({ id: c.name, label: c.name }))}\n onChange={(colId) => updateFilter(i, { column: colId })}\n className=\"flex-1 min-w-0\"\n />\n <SelectControl\n value={f.op}\n options={FILTER_OP_OPTIONS}\n onChange={(op) => updateFilter(i, { op })}\n className=\"w-24 shrink-0\"\n />\n {!OPS_NO_VALUE.has(f.op) && (\n <div className=\"w-20 shrink-0\">\n <input\n value={f.value ?? ''}\n onChange={(e) => updateFilter(i, { value: e.target.value })}\n placeholder={f.op === 'IN' || f.op === 'NOT IN' ? 'a,b,c' : f.op === 'BETWEEN' ? 'lo,hi' : 'value'}\n className=\"w-full px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent transition-colors\"\n />\n </div>\n )}\n <button onClick={() => removeFilter(i)} className=\"text-midnight-text-muted hover:text-red-400\"><X className=\"w-3 h-3\" /></button>\n </div>\n ))}\n {!filters.length && <div className=\"text-xs text-midnight-text-muted font-mono px-1\">No filters</div>}\n </div>\n </div>\n );\n};\n\n// ─── Multi-Series Bar Chart (built inline for grouped data) ──────\n\ninterface GroupedBarRow {\n group: string;\n [key: string]: string | number;\n}\n\nexport interface GroupedBarChartProps {\n records?: Row[];\n xFields?: ChartField[];\n yFields?: ChartField[];\n groupField?: ChartField | null;\n data?: GroupedBarRow[];\n keys?: string[];\n style?: Partial<ChartStyle>;\n}\n\nexport const GroupedBarChart = ({ records, xFields = [], yFields = [], groupField, data: presetData, keys: presetKeys, style }: GroupedBarChartProps) => {\n const computed = useMemo<GroupedBarRow[]>(() => {\n if (presetData || !records || !xFields.length || !yFields.length) return [];\n const xCol = xFields[0].name;\n const groups = groupBy(records, xCol);\n\n return Object.entries(groups)\n .map(([key, recs]) => {\n const row: GroupedBarRow = { group: key };\n yFields.forEach((yf) => {\n row[`${yf.agg}(${yf.name})`] = aggregate(recs, yf.name, yf.agg ?? 'count');\n });\n return row;\n })\n .sort((a, b) => {\n const firstKey = `${yFields[0].agg}(${yFields[0].name})`;\n return (Number(b[firstKey]) || 0) - (Number(a[firstKey]) || 0);\n })\n .slice(0, 50);\n }, [records, xFields, yFields, presetData]);\n\n const data = presetData || computed;\n if (!data.length) return null;\n\n const keys = presetKeys || yFields.map((yf) => `${yf.agg}(${yf.name})`);\n const colors = ['rgba(74,222,128,0.8)', 'rgba(96,165,250,0.8)', 'rgba(251,146,60,0.8)', 'rgba(167,139,250,0.8)', 'rgba(248,113,113,0.8)'];\n\n const legend = legendConfig(style);\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveBar\n data={data as never}\n keys={keys}\n indexBy=\"group\"\n groupMode={groupField ? 'grouped' : 'stacked'}\n margin={{ top: 20, right: 120, bottom: 60, left: 60 }}\n padding={0.3}\n colors={colors.slice(0, keys.length)}\n axisBottom={makeAxis(style, 'x', xFields[0]?.name || '')}\n axisLeft={makeAxis(style, 'y', '', { numeric: true })}\n labelSkipWidth={12}\n labelSkipHeight={12}\n labelTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n legends={legend ? [{ dataFrom: 'keys', ...legend } as never] : []}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n};\n\n// ─── Chart Preview ────────────────────────────────────────────────\n\ninterface HeatmapOpts {\n rowOrder?: 'alpha' | 'total-asc' | 'total-desc';\n colOrder?: 'alpha' | 'total-asc' | 'total-desc';\n marginAgg?: string;\n showTotals?: boolean;\n}\n\n// heatmap-plus preview options (the dual stats + color engine + margins).\ninterface HeatPlusOpts {\n labelStat?: HeatStat;\n colorStat?: HeatStat;\n blockField?: string;\n scope?: ColorScope;\n method?: ColorMethod;\n vmin?: number;\n vmax?: number;\n rowOrder?: 'alpha' | 'total-asc' | 'total-desc';\n colOrder?: 'alpha' | 'total-asc' | 'total-desc';\n showMargins?: boolean;\n}\n\ninterface ChartPreviewProps {\n chartType: ChartType;\n records?: Row[];\n xFields: ChartField[];\n yFields: ChartField[];\n valueField: ChartField | null;\n groupField: ChartField | null;\n colorField: ChartField | null;\n engineMode: 'sql' | 'direct';\n sqlRows: Row[] | null;\n sqlLoading: boolean;\n sqlError: string | null;\n heatmapOpts?: HeatmapOpts;\n heatPlusOpts?: HeatPlusOpts;\n style: ChartStyle;\n}\n\nconst ChartPreview = ({\n chartType, records, xFields, yFields, valueField, groupField, engineMode,\n sqlRows, sqlLoading, sqlError, heatmapOpts = {}, heatPlusOpts = {}, style,\n}: ChartPreviewProps) => {\n const xCol = xFields[0]?.name;\n const yCol = yFields[0]?.name;\n const yAgg = yFields[0]?.agg || 'count';\n\n // ─── SQL mode: render from server-side query results ──────────────\n if (engineMode === 'sql') {\n if (sqlError) {\n return <div className=\"flex items-center justify-center h-full text-sm text-red-400 gap-2 px-4 text-center\"><AlertCircle className=\"w-4 h-4 shrink-0\" /> {sqlError}</div>;\n }\n if (sqlLoading && !sqlRows) {\n return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted gap-2\"><Loader2 className=\"w-4 h-4 animate-spin\" /> Running query…</div>;\n }\n if (!sqlRows) {\n return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">Configure the chart to run a query</div>;\n }\n if (chartType === 'grouped-bar' || (chartType === 'bar' && (yFields.length > 1 || groupField))) {\n const { data, keys } = shapeChartData('grouped-bar', sqlRows, { yFields }) as { data: GroupedBarRow[]; keys: string[] };\n return <GroupedBarChart data={data} keys={keys} yFields={yFields} groupField={groupField} style={style} />;\n }\n const shaped = shapeChartData(chartType, sqlRows, { yFields });\n switch (chartType) {\n case 'bar': return <Suspense fallback={null}><BarView data={shaped as BarDatum[]} groupColumn={xCol} valueColumn={yCol} style={style} /></Suspense>;\n case 'pie': return <Suspense fallback={null}><PieView data={shaped as PieDatum[]} groupColumn={xCol} style={style} /></Suspense>;\n case 'line': return <Suspense fallback={null}><LineView data={shaped as LineSerie[]} xColumn={xCol} yColumn={yCol} style={style} /></Suspense>;\n case 'scatter': return <Suspense fallback={null}><ScatterView data={shaped as ScatterSerie[]} xColumn={xCol} yColumn={yCol} style={style} /></Suspense>;\n case 'heatmap': return (shaped as HeatmapSerie[]).length ? <Suspense fallback={null}><HeatmapView data={shaped as HeatmapSerie[]} rowColumn={xCol} colColumn={yCol} {...heatmapOpts} style={style} /></Suspense>\n : <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">No data</div>;\n case 'heatmap-plus': return (shaped as HeatPlusDatum[]).length ? <Suspense fallback={null}><HeatmapPlusView data={shaped as HeatPlusDatum[]} rowColumn={xCol} colColumn={yCol} {...heatPlusOpts} style={style} /></Suspense>\n : <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">No data</div>;\n default: return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">Select a chart type</div>;\n }\n }\n\n // ─── Direct mode: client-side aggregation over the loaded sample ──\n if (!records?.length) return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">No data</div>;\n\n switch (chartType) {\n case 'bar':\n if (yFields.length > 1 || groupField) {\n return <GroupedBarChart records={records} xFields={xFields} yFields={yFields} groupField={groupField} style={style} />;\n }\n return xCol ? <Suspense fallback={null}><BarView records={records} groupColumn={xCol} valueColumn={yCol} aggFn={yAgg} style={style} /></Suspense> : null;\n\n case 'grouped-bar':\n return <GroupedBarChart records={records} xFields={xFields} yFields={yFields} groupField={groupField} style={style} />;\n\n case 'pie':\n return xCol ? <Suspense fallback={null}><PieView records={records} groupColumn={xCol} style={style} /></Suspense> : null;\n\n case 'line':\n return xCol && yCol ? <Suspense fallback={null}><LineView records={records} xColumn={xCol} yColumn={yCol} style={style} /></Suspense> : null;\n\n case 'scatter':\n return xCol && yCol ? <Suspense fallback={null}><ScatterView records={records} xColumn={xCol} yColumn={yCol} style={style} /></Suspense> : null;\n\n case 'heatmap':\n return xCol && yCol ? <Suspense fallback={null}><HeatmapView records={records} rowColumn={xCol} colColumn={yCol} valueColumn={valueField?.name} aggFn={valueField?.agg || 'count'} {...heatmapOpts} style={style} /></Suspense> : null;\n\n case 'heatmap-plus':\n return xCol && yCol ? <Suspense fallback={null}><HeatmapPlusView records={records} rowColumn={xCol} colColumn={yCol} valueColumn={valueField?.name} {...heatPlusOpts} style={style} /></Suspense> : null;\n\n default:\n return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">Select a chart type</div>;\n }\n};\n\n// ─── Main ChartBuilder ────────────────────────────────────────────\n\ntype Zone = 'x' | 'y' | 'value' | 'group' | 'color';\n\n/**\n * ChartBuilder — visual chart authoring over a state's dataset. Generates DuckDB\n * SQL from the visual config (SQL engine mode, exact over the full dataset) or\n * aggregates the loaded sample client-side (Direct mode). The host injects\n * runQuery + theme via <DashboardProvider>; an optional onSave persists the\n * assembled panel (absent ⇒ the save affordance is hidden / read-only).\n */\n// Cap on rows baked onto a panel as precomputed data (config.data, inlined into\n// the dashboard JSON / published manifest). Aggregations are tiny; this guards\n// against baking a scatter-of-everything (those stay live/Refresh-only).\n// TODO(precompute-parquet): for larger results, back the precomputed output with\n// a small RESULT PARQUET (written next to the snapshot) referenced by the panel\n// (e.g. config.dataKey) and loaded via DuckDB-WASM, instead of inlining rows in\n// the metadata JSON — keeps the manifest small and the result database-backed.\n// See docs/activities.md.\nconst MAX_PRECOMPUTE_ROWS = 5000;\n\nexport function ChartBuilder({ records, columns, stateId, onSave }: ChartBuilderProps) {\n const { theme, runQuery } = useDashboard();\n // Hold runQuery in a ref so effects don't depend on its identity — hosts\n // commonly pass an inline runQuery (new each render); depending on it would\n // re-fire the query effect every render → infinite setState loop.\n const runQueryRef = useRef(runQuery);\n runQueryRef.current = runQuery;\n\n const [chartType, setChartType] = useState<ChartType>('bar');\n const [xFields, setXFields] = useState<ChartField[]>([]);\n const [yFields, setYFields] = useState<ChartField[]>([]);\n const [valueField, setValueField] = useState<ChartField | null>(null);\n const [groupField, setGroupField] = useState<ChartField | null>(null);\n const [colorField, setColorField] = useState<ChartField | null>(null);\n const [title, setTitle] = useState('');\n\n // Query engine: 'sql' = exact, server-side over the full dataset (default);\n // 'direct' = client-side aggregation over the loaded sample (fallback).\n const [engineMode, setEngineMode] = useState<'sql' | 'direct'>('sql');\n const [filters, setFilters] = useState<ChartFilter[]>([]);\n const [showSql, setShowSql] = useState(false);\n\n // Heatmap axis ordering + marginal totals.\n const [rowOrder, setRowOrder] = useState<'alpha' | 'total-asc' | 'total-desc'>('alpha');\n const [colOrder, setColOrder] = useState<'alpha' | 'total-asc' | 'total-desc'>('alpha');\n const [marginAgg, setMarginAgg] = useState('sum');\n const [showTotals, setShowTotals] = useState(false);\n\n // Heatmap+ dual cell stats + color engine. labelStat → cell label; colorStat\n // → cell color (default: same). scope/method drive the color normalization\n // (see heatmapColor.ts); vmin/vmax pin the linear domain for cross-chart\n // comparability ('' = auto). The block field reuses the color field zone.\n const [labelStat, setLabelStat] = useState<HeatStat>('count');\n const [colorStat, setColorStat] = useState<HeatStat>('count');\n const [scope, setScope] = useState<ColorScope>('global');\n const [method, setMethod] = useState<ColorMethod>('linear');\n const [vmin, setVmin] = useState('');\n const [vmax, setVmax] = useState('');\n const [showMargins, setShowMargins] = useState(false);\n\n // Standardized chart appearance (see chartStyle.ts).\n const [style, setStyle] = useState<ChartStyle>(DEFAULT_CHART_STYLE);\n const [showStyle, setShowStyle] = useState(false);\n const [showFields, setShowFields] = useState(false);\n // Maximize: the saved panel spans the full dashboard width + a tall height.\n const [fillContainer, setFillContainer] = useState(false);\n\n // SQL preview state (driven by runQuery when engineMode === 'sql').\n const [sqlRows, setSqlRows] = useState<Row[] | null>(null);\n const [sqlLoading, setSqlLoading] = useState(false);\n const [sqlError, setSqlError] = useState<string | null>(null);\n\n // The SQL generated from the current visual config.\n const generatedSql = useMemo(\n () => buildChartSQL({\n chartType, xFields, yFields, valueField, filters,\n labelStat, colorStat, blockField: colorField?.name,\n } as ChartConfig),\n [chartType, xFields, yFields, valueField, filters, labelStat, colorStat, colorField],\n );\n\n // Run the generated query whenever it changes (SQL mode only).\n useEffect(() => {\n if (engineMode !== 'sql') return undefined;\n if (!generatedSql) { setSqlRows(null); setSqlError(null); return undefined; }\n let cancelled = false;\n setSqlLoading(true);\n setSqlError(null);\n runQueryRef.current(generatedSql, stateId).then((res) => {\n if (cancelled) return;\n setSqlLoading(false);\n setSqlRows(res.rows || []);\n }).catch((err: unknown) => {\n if (cancelled) return;\n setSqlLoading(false);\n setSqlRows(null);\n setSqlError(err instanceof Error ? err.message : String(err) || 'Query failed');\n });\n return () => { cancelled = true; };\n }, [engineMode, generatedSql, stateId]);\n\n const addField = (zone: Zone, field: ChartField) => {\n switch (zone) {\n case 'x': setXFields((f) => [...f, field]); break;\n case 'y': setYFields((f) => [...f, field]); break;\n case 'value': setValueField(field); break;\n case 'group': setGroupField(field); break;\n case 'color': setColorField(field); break;\n }\n };\n\n const removeField = (zone: Zone, idx?: number) => {\n switch (zone) {\n case 'x': setXFields((f) => f.filter((_, i) => i !== idx)); break;\n case 'y': setYFields((f) => f.filter((_, i) => i !== idx)); break;\n case 'value': setValueField(null); break;\n case 'group': setGroupField(null); break;\n case 'color': setColorField(null); break;\n }\n };\n\n const changeAgg = (zone: Zone, idx: number, agg: string) => {\n if (zone === 'y') {\n setYFields((f) => f.map((field, i) => i === idx ? { ...field, agg } : field));\n } else if (zone === 'value') {\n setValueField((f) => f ? { ...f, agg } : f);\n }\n };\n\n // Save current chart config as a dashboard panel.\n const handleSaveToDashboard = () => {\n if (!onSave) return;\n const config: Record<string, unknown> = {};\n if (xFields.length) config.group = xFields[0].name;\n if (yFields.length) { config.value = yFields[0].name; config.agg = yFields[0].agg; }\n if (chartType === 'line' || chartType === 'scatter') {\n config.x = xFields[0]?.name;\n config.y = yFields[0]?.name;\n }\n if (chartType === 'heatmap') {\n config.row = xFields[0]?.name;\n config.col = yFields[0]?.name;\n // Value column is optional; absence means cell value = count.\n if (valueField) {\n config.value = valueField.name;\n config.agg = valueField.agg || 'count';\n } else {\n delete config.value;\n delete config.agg;\n }\n // Axis ordering + marginal totals.\n config.rowOrder = rowOrder;\n config.colOrder = colOrder;\n config.marginAgg = marginAgg;\n config.showTotals = showTotals;\n }\n if (chartType === 'heatmap-plus') {\n config.row = xFields[0]?.name;\n config.col = yFields[0]?.name;\n // Value column optional; absent ⇒ both stats are a row count.\n if (valueField) config.value = valueField.name;\n else delete config.value;\n config.labelStat = labelStat;\n config.colorStat = colorStat;\n if (colorField) config.blockField = colorField.name; else delete config.blockField;\n config.scope = scope;\n config.method = method;\n // '' ⇒ auto (omit), else a finite number.\n const nMin = parseFloat(vmin), nMax = parseFloat(vmax);\n if (Number.isFinite(nMin)) config.vmin = nMin; else delete config.vmin;\n if (Number.isFinite(nMax)) config.vmax = nMax; else delete config.vmax;\n config.rowOrder = rowOrder;\n config.colOrder = colOrder;\n config.showMargins = showMargins;\n }\n\n // In SQL mode persist the generated query + filters so the saved panel\n // renders server-side (exact, full dataset). Legacy fields above remain\n // for backward-compatible client-side rendering when the endpoint is absent.\n if (engineMode === 'sql' && generatedSql) {\n config.sql = generatedSql;\n config.chartType = chartType; // shaping hint for the renderer\n if (filters.length) config.filters = filters;\n if (yFields.length) config.yFields = yFields.map((f) => ({ name: f.name, agg: f.agg }));\n // PRECOMPUTE: bake the current preview result onto the panel so it\n // renders without a live query (instant in the studio, and carried into\n // published dashboards verbatim). Skip oversized results (e.g. a\n // scatter of every row) — those stay live/Refresh-only.\n if (sqlRows && sqlRows.length <= MAX_PRECOMPUTE_ROWS) {\n config.data = sqlRows;\n config.refreshedAt = new Date().toISOString();\n }\n }\n\n // Standardized appearance travels with the panel.\n config.style = style;\n // Maximize hint (full width + tall height), persisted on the panel config.\n config.fill = fillContainer;\n\n onSave({\n title: title || `${chartType} chart`,\n type: chartType === 'grouped-bar' ? 'bar' : chartType,\n config,\n width: fillContainer ? 12 : 6,\n height: fillContainer ? 8 : 2,\n });\n };\n\n // Both heatmaps share the Rows/Columns/Cell-Value field layout.\n const isHeat = chartType === 'heatmap' || chartType === 'heatmap-plus';\n\n return (\n <div className=\"flex h-full\">\n {/* Left: Config Panel */}\n <div className={`w-[280px] shrink-0 border-r ${theme.border} bg-midnight-elevated overflow-y-auto p-3 space-y-4`}>\n {/* Chart Type */}\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Chart Type</div>\n <div className=\"grid grid-cols-3 gap-1\">\n {CHART_TYPES.map((ct) => (\n <button key={ct.id} onClick={() => setChartType(ct.id)}\n className={`flex flex-col items-center gap-1 p-2 border text-xs font-mono transition-colors ${\n chartType === ct.id\n ? 'border-midnight-accent text-midnight-accent bg-midnight-accent/10'\n : 'border-midnight-border text-midnight-text-muted hover:bg-midnight-raised'\n }`}>\n <ct.icon className=\"w-4 h-4\" />\n {ct.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Query engine toggle */}\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-1 font-mono\">Query Engine</div>\n <div className=\"flex border border-midnight-border\">\n {([\n { id: 'sql', label: 'SQL (full data)' },\n { id: 'direct', label: 'Direct (sample)' },\n ] as { id: 'sql' | 'direct'; label: string }[]).map((m) => (\n <button key={m.id} onClick={() => setEngineMode(m.id)}\n className={`flex-1 px-2 py-1 text-xs font-mono transition-colors ${\n engineMode === m.id ? 'bg-midnight-accent/10 text-midnight-accent' : 'text-midnight-text-muted hover:bg-midnight-raised'\n }`}>\n {m.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Drop Zones */}\n <DropZone\n label={isHeat ? 'Rows' : 'X Axis / Group By'}\n fields={xFields}\n columns={columns}\n onAdd={(f) => addField('x', f)}\n onRemove={(i) => removeField('x', i)}\n onChangeAgg={() => {}}\n maxFields={chartType === 'pie' || isHeat ? 1 : 3}\n />\n\n <DropZone\n label={isHeat ? 'Columns' : 'Y Axis / Values'}\n fields={yFields}\n columns={columns}\n onAdd={(f) => addField('y', f)}\n onRemove={(i) => removeField('y', i)}\n onChangeAgg={(i, agg) => changeAgg('y', i, agg)}\n showAgg={!isHeat}\n maxFields={isHeat ? 1 : 5}\n />\n\n {isHeat && (\n <DropZone\n label=\"Cell Value (optional — defaults to count)\"\n fields={valueField ? [valueField] : []}\n columns={columns}\n onAdd={(f) => addField('value', f)}\n onRemove={() => removeField('value')}\n onChangeAgg={(i, agg) => changeAgg('value', i, agg)}\n showAgg={chartType === 'heatmap'}\n maxFields={1}\n />\n )}\n\n {chartType === 'heatmap-plus' && (\n <>\n <DropZone\n label=\"Block (optional — color-scope grouping)\"\n fields={colorField ? [colorField] : []}\n columns={columns}\n onAdd={(f) => addField('color', f)}\n onRemove={() => removeField('color')}\n onChangeAgg={() => {}}\n maxFields={1}\n />\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Cell Stats</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Label stat</span>\n <SelectControl value={labelStat} options={HEAT_STAT_OPTIONS} onChange={(v) => setLabelStat(v as HeatStat)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Color stat</span>\n <SelectControl value={colorStat} options={HEAT_STAT_OPTIONS} onChange={(v) => setColorStat(v as HeatStat)} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Color Engine</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Scale scope</span>\n <SelectControl value={scope} options={SCOPE_OPTIONS} onChange={(v) => setScope(v as ColorScope)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Scale method</span>\n <SelectControl value={method} options={METHOD_OPTIONS} onChange={(v) => setMethod(v as ColorMethod)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Fixed min / max</span>\n <div className=\"flex gap-1\">\n <input value={vmin} onChange={(e) => setVmin(e.target.value)} placeholder=\"auto\" inputMode=\"decimal\"\n className=\"w-14 px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent\" />\n <input value={vmax} onChange={(e) => setVmax(e.target.value)} placeholder=\"auto\" inputMode=\"decimal\"\n className=\"w-14 px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent\" />\n </div>\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Order & Margins</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order rows</span>\n <SelectControl value={rowOrder} options={ORDER_OPTIONS} onChange={(v) => setRowOrder(v as typeof rowOrder)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order columns</span>\n <SelectControl value={colOrder} options={ORDER_OPTIONS} onChange={(v) => setColOrder(v as typeof colOrder)} />\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={showMargins} onChange={(e) => setShowMargins(e.target.checked)} className=\"accent-midnight-accent\" />\n <span className=\"text-xs font-mono text-midnight-text-muted\">Show margins (row / col / grand)</span>\n </label>\n </div>\n </div>\n </>\n )}\n\n {chartType === 'heatmap' && (\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Order & Totals</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order rows</span>\n <SelectControl value={rowOrder} options={ORDER_OPTIONS} onChange={(v) => setRowOrder(v as typeof rowOrder)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order columns</span>\n <SelectControl value={colOrder} options={ORDER_OPTIONS} onChange={(v) => setColOrder(v as typeof colOrder)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Total aggregator</span>\n <SelectControl value={marginAgg} options={MARGIN_AGGS} onChange={setMarginAgg} />\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={showTotals}\n onChange={(e) => setShowTotals(e.target.checked)}\n className=\"accent-midnight-accent\"\n />\n <span className=\"text-xs font-mono text-midnight-text-muted\">Show row/column totals</span>\n </label>\n </div>\n </div>\n )}\n\n {(chartType === 'bar' || chartType === 'grouped-bar') && (\n <DropZone\n label=\"Group / Color\"\n fields={groupField ? [groupField] : []}\n columns={columns}\n onAdd={(f) => addField('group', f)}\n onRemove={() => removeField('group')}\n onChangeAgg={() => {}}\n maxFields={1}\n />\n )}\n\n {/* Filters → WHERE */}\n <FiltersSection filters={filters} columns={columns} onChange={setFilters} />\n\n {/* Generated SQL (read-only preview, SQL mode) */}\n {engineMode === 'sql' && (\n <div>\n <button onClick={() => setShowSql((s) => !s)}\n className=\"flex items-center gap-1 text-xs uppercase text-midnight-text-muted font-mono hover:text-midnight-text-body transition-colors\">\n <Code className=\"w-3 h-3\" />\n <ChevronDown className={`w-3 h-3 transition-transform ${showSql ? '' : '-rotate-90'}`} />\n Generated SQL\n </button>\n {showSql && (\n <pre className=\"mt-1 p-2 bg-midnight-surface border border-midnight-border text-[11px] font-mono text-midnight-text-body whitespace-pre-wrap break-words max-h-[160px] overflow-auto\">\n {generatedSql || '— configure the chart —'}\n </pre>\n )}\n </div>\n )}\n\n {/* Appearance (standardized across all charts) */}\n <div>\n <button onClick={() => setShowStyle((s) => !s)}\n className=\"flex items-center gap-1 text-xs uppercase text-midnight-text-muted font-mono hover:text-midnight-text-body transition-colors\">\n <ChevronDown className={`w-3 h-3 transition-transform ${showStyle ? '' : '-rotate-90'}`} />\n Appearance\n </button>\n {showStyle && (\n <div className=\"mt-2\">\n <ChartStyleControls style={style} onChange={setStyle} />\n </div>\n )}\n </div>\n\n {/* Title + Save */}\n {onSave && (\n <div className=\"pt-4 border-t border-midnight-border\">\n <input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Chart title...\"\n className=\"w-full mb-2 px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent transition-colors\"\n />\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-mono text-midnight-text-muted\" title=\"Span the full dashboard width and height\">Maximize size</span>\n <TerminalToggle size=\"small\" checked={fillContainer} onChange={setFillContainer} />\n </div>\n <button onClick={handleSaveToDashboard}\n className=\"w-full px-3 py-1.5 border border-midnight-accent text-midnight-accent text-xs font-mono hover:bg-midnight-accent/10 transition-colors\">\n + Add to Dashboard\n </button>\n </div>\n )}\n\n {/* Available Fields (reference) — collapsed by default */}\n <div className=\"pt-4 border-t border-midnight-border\">\n <button onClick={() => setShowFields((s) => !s)}\n className=\"flex items-center gap-1 text-xs uppercase text-midnight-text-muted font-mono hover:text-midnight-text-body transition-colors\">\n <ChevronDown className={`w-3 h-3 transition-transform ${showFields ? '' : '-rotate-90'}`} />\n Available Fields\n <span className=\"text-midnight-text-muted/60 normal-case\">({columns.length})</span>\n </button>\n {showFields && (\n <div className=\"space-y-1 mt-2\">\n {columns.map((col) => (\n <div key={col.name} className=\"flex items-center justify-between text-xs font-mono px-1 py-0.5\">\n <span className=\"text-midnight-text-body\">{col.name}</span>\n <span className=\"text-midnight-text-muted\">{col.type}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Right: Chart Preview */}\n <div className=\"flex-1 min-h-0 p-2\">\n <ChartPreview\n chartType={chartType}\n records={records}\n xFields={xFields}\n yFields={yFields}\n valueField={valueField}\n groupField={groupField}\n colorField={colorField}\n engineMode={engineMode}\n sqlRows={sqlRows}\n sqlLoading={sqlLoading}\n sqlError={sqlError}\n heatmapOpts={{ rowOrder, colOrder, marginAgg, showTotals }}\n heatPlusOpts={{\n labelStat, colorStat, blockField: colorField?.name,\n scope, method,\n vmin: Number.isFinite(parseFloat(vmin)) ? parseFloat(vmin) : undefined,\n vmax: Number.isFinite(parseFloat(vmax)) ? parseFloat(vmax) : undefined,\n rowOrder, colOrder, showMargins,\n }}\n style={style}\n />\n </div>\n </div>\n );\n}\n\nexport default ChartBuilder;\n","// DashboardRenderer — host-agnostic renderer for a grid of AI-generated or\n// manually configured dashboard panels. Uses a 12-column CSS grid.\n//\n// Capabilities (theme, runQuery, removePanel) are injected by the host via\n// DashboardContext — this component never imports a store or API client.\n// - full-capability host (studio): wires removePanel ⇒ panels show a remove button.\n// - read-only host (published viewer): omits removePanel ⇒ read-only dashboard.\n\nimport { Suspense, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { X, Sparkles, RefreshCw, AlertCircle } from 'lucide-react';\nimport GridLayout, { WidthProvider, type Layout } from 'react-grid-layout';\n\nimport { useDashboard, useCapabilities, type PanelLayout } from '../context/DashboardContext';\nimport { shapeChartData, buildChartSQL, aggExpr, qIdent } from '../sqlgen';\nimport type { Row, ChartType, ChartField, ChartConfig, ChartFilter } from '../sqlgen';\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\nimport {\n BarView,\n PieView,\n LineView,\n ScatterView,\n HeatmapView,\n HeatmapPlusView,\n PivotView,\n MetricView,\n InsightView,\n} from './views';\nimport { GroupedBarChart } from './ChartBuilder';\n\n// ─── Panel / dashboard shapes ──────────────────────────────────────────────\n\n// PanelConfig is the per-panel config blob. The host (studio AI or chart\n// builder) owns the full schema; the renderer reads the fields it dispatches on.\nexport interface PanelConfig {\n sql?: string;\n chartType?: ChartType | 'metric';\n style?: Partial<ChartStyle>;\n\n // client-side aggregation columns\n group?: string;\n value?: string;\n agg?: string;\n x?: string;\n y?: string;\n row?: string;\n col?: string;\n\n // grouped-bar / heatmap extras\n yFields?: ChartField[];\n rowOrder?: string;\n colOrder?: string;\n marginAgg?: string;\n showTotals?: boolean;\n\n // heatmap-plus extras: dual cell stats, block field, color engine, margins.\n labelStat?: string;\n colorStat?: string;\n blockField?: string;\n scope?: string;\n method?: string;\n vmin?: number;\n vmax?: number;\n showMargins?: boolean;\n\n // table / insight\n columns?: string[];\n text?: string;\n\n // metric\n label?: string;\n column?: string;\n\n // layout: when true the panel takes the full dashboard width + a tall height.\n fill?: boolean;\n\n // PRECOMPUTED result of config.sql, baked at build/refresh time. When present\n // the panel renders from it directly — no live query. refreshedAt is when it\n // was last computed (studio Refresh). Published dashboards rely on this.\n data?: Row[];\n refreshedAt?: string;\n\n [key: string]: unknown;\n}\n\nexport interface DashboardPanel {\n id: string;\n type: string;\n title?: string;\n // Grid geometry (12-col units). width/height = span; x/y = top-left cell.\n // x/y are optional — absent ⇒ the renderer auto-packs in panel order.\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n config?: PanelConfig;\n}\n\nexport interface Dashboard {\n insights?: string;\n panels?: DashboardPanel[];\n}\n\nexport interface ColumnDef {\n name: string;\n}\n\nexport interface DashboardRendererProps {\n dashboard?: Dashboard | null;\n records?: Row[];\n columns?: ColumnDef[];\n}\n\n// ─── Loading fallback ──────────────────────────────────────────────────────\n\nfunction ViewLoading() {\n return (\n <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">Loading...</div>\n );\n}\n\n// ─── SqlPanel ──────────────────────────────────────────────────────────────\n\ninterface SqlPanelProps {\n panel: DashboardPanel;\n}\n\n// Chart types whose data buildChartSQL can compile from a panel's flat config —\n// so an AI-generated / Direct-mode panel (no config.sql) is still computed,\n// baked (precomputed), and refreshable, exactly like a manual SQL chart.\nconst SQL_CHART_TYPES = new Set<string>(['bar', 'grouped-bar', 'pie', 'line', 'scatter', 'heatmap', 'heatmap-plus']);\n\n// Panel types that are SQL-backed but NOT compiled via buildChartSQL: table\n// (row preview) and metric (single aggregate). Routing them through SqlPanel\n// gives them the same Refresh + precompute (bake) path as the charts — so AI/\n// Direct table & metric panels also show data on publish.\nconst SQL_DATA_TYPES = new Set<string>(['table', 'metric']);\n\n// Rows fetched/baked for a table panel preview (kept small — it's a glance, and\n// it inlines into the dashboard/published manifest like any precomputed result).\nconst TABLE_PREVIEW_ROWS = 200;\n\n// SQL for a table panel: the chosen columns (or all) capped to a preview size.\nfunction tableSql(config: PanelConfig): string {\n const cols = config.columns?.length ? config.columns.map(qIdent).join(', ') : '*';\n return `SELECT ${cols} FROM data LIMIT ${TABLE_PREVIEW_ROWS}`;\n}\n\n// SQL for a metric panel: a single aggregate over the full dataset.\nfunction metricSql(config: PanelConfig): string {\n return `SELECT ${aggExpr(config.agg, config.column)} AS v FROM data`;\n}\n\n// Map a panel's flat config (group/value/agg/x/y/row/col — the AI/Direct shape)\n// to the ChartConfig buildChartSQL expects.\nfunction panelToChartConfig(chartType: ChartType, config: PanelConfig): ChartConfig {\n const cfg: ChartConfig = { chartType, xFields: [], yFields: [], filters: (config.filters as ChartFilter[]) || [] };\n switch (chartType) {\n case 'bar':\n case 'grouped-bar':\n if (config.group) cfg.xFields = [{ name: config.group }];\n cfg.yFields = config.yFields?.length\n ? config.yFields\n : config.value ? [{ name: config.value, agg: config.agg }] : [];\n break;\n case 'pie':\n if (config.group) cfg.xFields = [{ name: config.group }];\n break;\n case 'line':\n case 'scatter':\n if (config.x) cfg.xFields = [{ name: config.x }];\n if (config.y) cfg.yFields = [{ name: config.y }];\n break;\n case 'heatmap':\n if (config.row) cfg.xFields = [{ name: config.row }];\n if (config.col) cfg.yFields = [{ name: config.col }];\n if (config.value) cfg.valueField = { name: config.value, agg: config.agg };\n break;\n case 'heatmap-plus':\n if (config.row) cfg.xFields = [{ name: config.row }];\n if (config.col) cfg.yFields = [{ name: config.col }];\n if (config.value) cfg.valueField = { name: config.value, agg: config.labelStat };\n cfg.labelStat = config.labelStat;\n cfg.colorStat = config.colorStat;\n cfg.blockField = config.blockField;\n break;\n }\n return cfg;\n}\n\n// The SQL a panel runs: its explicit config.sql, else compiled from its config\n// (charts), or built for table / metric panels.\nfunction panelSql(type: string, config: PanelConfig): string {\n if (config.sql) return config.sql;\n if (type === 'table') return tableSql(config);\n if (type === 'metric') return metricSql(config);\n if (SQL_CHART_TYPES.has(type)) return buildChartSQL(panelToChartConfig(type as ChartType, config)) || '';\n return '';\n}\n\n// Format one table cell: numbers get decimal precision (floats → N dp, integers\n// left whole), non-numeric strings pass through, then optional char truncation.\nfunction formatCell(value: unknown, s: ChartStyle): string {\n if (value == null) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n let str: string;\n const n = typeof value === 'number' ? value : Number(value);\n if (value !== '' && typeof value !== 'boolean' && Number.isFinite(n)) {\n str = Number.isInteger(n)\n ? n.toLocaleString()\n : n.toLocaleString(undefined, { minimumFractionDigits: s.cellPrecision, maximumFractionDigits: s.cellPrecision });\n } else {\n str = String(value);\n }\n if (s.cellTruncate > 0 && str.length > s.cellTruncate) str = `${str.slice(0, s.cellTruncate)}…`;\n return str;\n}\n\n// A compact scrollable table for table panels (and the records fallback). Cells\n// wrap (default) and numbers are precision-formatted per the panel's style.\nfunction DataTable({ rows, columns, style }: { rows: Row[]; columns?: string[]; style?: Partial<ChartStyle> }) {\n const s = withStyleDefaults(style);\n const colNames = columns?.length ? columns : rows[0] ? Object.keys(rows[0]) : [];\n const cellCls = s.cellWrap\n ? 'px-2 py-1 text-midnight-text-body align-top whitespace-normal break-words max-w-[280px]'\n : 'px-2 py-1 text-midnight-text-body truncate max-w-[200px]';\n return (\n <div className=\"overflow-auto h-full text-xs\">\n <table className=\"w-full\">\n <thead className=\"sticky top-0 bg-midnight-elevated\">\n <tr>{colNames.map((n) => <th key={n} className=\"px-2 py-1 text-left text-midnight-text-muted font-mono border-b border-midnight-border\">{n}</th>)}</tr>\n </thead>\n <tbody>\n {rows.map((r, i) => (\n <tr key={i} className=\"border-b border-dashed border-midnight-border hover:bg-midnight-raised\">\n {colNames.map((n) => (\n <td key={n} className={cellCls}>{formatCell(r[n], s)}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * SqlPanel renders a SQL-backed panel (config.sql or a compiled chart config).\n * PRECOMPUTE model:\n * - config.data present → render it directly (NO live query). This is how\n * published dashboards render — instant, no dataset download.\n * - config.data absent + studio (canRefresh) → live-query once to compute it.\n * - config.data absent + read-only viewer → \"Chart data not available\" (the\n * viewer never live-queries a dashboard panel — that's a dataset download).\n * The studio shows a Refresh button that re-runs the query and hands the rows to\n * persistPanelData so the host stores them on the panel and saves.\n */\nfunction SqlPanel({ panel }: SqlPanelProps) {\n const { runQuery, persistPanelData } = useDashboard();\n const { canRefresh } = useCapabilities();\n // Ref so the query effect doesn't depend on runQuery's identity (hosts pass\n // an inline runQuery → depending on it would loop). See ChartBuilder.\n const runQueryRef = useRef(runQuery);\n runQueryRef.current = runQuery;\n const config: PanelConfig = panel.config || {};\n const chartType = (config.chartType || panel.type) as string;\n // Explicit SQL, else compiled from the panel's chart/table/metric config.\n const sql = panelSql(chartType, config);\n const precomputed = config.data;\n\n const [rows, setRows] = useState<Row[] | null>(precomputed ?? null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState<boolean>(!precomputed && canRefresh);\n const [refreshing, setRefreshing] = useState(false);\n\n // Compute live ONLY when there's no precomputed result and the host can persist\n // (studio first-build). The published viewer relies solely on config.data.\n useEffect(() => {\n if (precomputed) { setRows(precomputed); setLoading(false); return; }\n if (!canRefresh) { setLoading(false); return; }\n let cancelled = false;\n setLoading(true);\n setError(null);\n runQueryRef.current(sql).then(\n (res) => { if (!cancelled) { setLoading(false); setRows(res?.rows || []); } },\n (err: unknown) => { if (!cancelled) { setLoading(false); setRows(null); setError(err instanceof Error ? err.message : String(err) || 'Query failed'); } },\n );\n return () => { cancelled = true; };\n // precomputed identity is intentionally excluded — a stored result is stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sql, canRefresh]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n const res = await runQueryRef.current(sql);\n const r = res?.rows || [];\n setRows(r);\n persistPanelData?.(panel.id, r, new Date().toISOString());\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err) || 'Query failed');\n } finally {\n setRefreshing(false);\n }\n }, [sql, panel.id, persistPanelData]);\n\n const refreshBtn = canRefresh ? (\n <button\n onClick={refresh}\n disabled={refreshing}\n title={config.refreshedAt ? `Last computed ${new Date(config.refreshedAt).toLocaleString()} — click to refresh` : 'Compute & save this chart’s data'}\n className=\"absolute top-1 right-1 z-10 p-1 bg-midnight-elevated/80 border border-midnight-border text-midnight-text-muted hover:text-midnight-accent transition-colors\"\n >\n <RefreshCw className={`w-3 h-3 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n ) : null;\n\n if (loading && !rows) {\n return <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">Running…</div>;\n }\n // No precomputed result and read-only viewer: don't live-query — surface it.\n if (!rows && !error && !canRefresh) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-1 px-2 text-center text-xs text-midnight-text-muted\">\n <AlertCircle className=\"w-4 h-4\" />\n <span>Chart data not available</span>\n <span className=\"text-[10px] text-midnight-text-subdued\">Download the dataset to view this chart.</span>\n </div>\n );\n }\n if (error) {\n return (\n <div className=\"relative flex items-center justify-center h-full px-2 text-center text-xs text-red-400\">\n {refreshBtn}\n {error}\n </div>\n );\n }\n if (!rows) return null;\n\n let chart: ReactNode;\n if (chartType === 'metric') {\n const first = rows[0];\n const v = first ? Object.values(first)[0] : 0;\n chart = <MetricView value={Number(v) || 0} config={{ column: config.column || '', agg: config.agg, label: config.label }} />;\n } else if (chartType === 'table') {\n chart = <DataTable rows={rows} columns={config.columns} style={config.style} />;\n } else {\n const shaped = shapeChartData(chartType as ChartType, rows, { yFields: config.yFields || [] });\n switch (chartType) {\n case 'bar':\n chart = <BarView data={shaped as never} groupColumn={config.group || ''} valueColumn={config.value || ''} style={config.style} />;\n break;\n case 'grouped-bar': {\n const gb = shaped as { data: unknown[]; keys: string[] };\n chart = <GroupedBarChart data={gb.data as never} keys={gb.keys} yFields={config.yFields || []} style={config.style} />;\n break;\n }\n case 'pie':\n chart = <PieView data={shaped as never} groupColumn={config.group || ''} style={config.style} />;\n break;\n case 'line':\n chart = <LineView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n break;\n case 'scatter':\n chart = <ScatterView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n break;\n case 'heatmap':\n chart = (shaped as unknown[]).length\n ? <HeatmapView data={shaped as never} rowColumn={config.row || ''} colColumn={config.col || ''} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} marginAgg={config.marginAgg} showTotals={config.showTotals} style={config.style} />\n : <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">No data</div>;\n break;\n case 'heatmap-plus':\n chart = (shaped as unknown[]).length\n ? <HeatmapPlusView data={shaped as never} rowColumn={config.row || ''} colColumn={config.col || ''} scope={config.scope as never} method={config.method as never} vmin={config.vmin} vmax={config.vmax} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} showMargins={config.showMargins} style={config.style} />\n : <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">No data</div>;\n break;\n default:\n chart = <div className=\"p-4 text-xs text-midnight-text-muted\">Unsupported SQL chart: {chartType}</div>;\n }\n }\n\n return (\n <div className=\"relative h-full w-full\">\n {refreshBtn}\n {chart}\n </div>\n );\n}\n\n// ─── PanelContent ──────────────────────────────────────────────────────────\n\ninterface PanelContentProps {\n panel: DashboardPanel;\n records?: Row[];\n columns?: ColumnDef[];\n}\n\n/**\n * Renders a single dashboard panel based on its type and config.\n * Panels saved with a SQL query render server-side (full dataset); the rest\n * fall back to client-side aggregation over the loaded records.\n */\nfunction PanelContent({ panel, records, columns }: PanelContentProps) {\n const { type } = panel;\n const config: PanelConfig = panel.config || {};\n\n // SQL-backed panels — explicit config.sql, a compilable chart type, or a\n // table/metric panel — go through SqlPanel so they compute, bake (precompute),\n // and refresh server-side over the FULL dataset (and show data on publish).\n const effType = (config.chartType || type) as string;\n if (config.sql || SQL_CHART_TYPES.has(effType) || SQL_DATA_TYPES.has(effType)) {\n return <SqlPanel panel={panel} />;\n }\n\n if (!records?.length && type !== 'insight') {\n return <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">No data</div>;\n }\n\n switch (type) {\n case 'bar':\n return config.group ? <BarView records={records} groupColumn={config.group} valueColumn={config.value || ''} aggFn={config.agg || 'count'} style={config.style} /> : null;\n case 'pie':\n return config.group ? <PieView records={records} groupColumn={config.group} style={config.style} /> : null;\n case 'line':\n return config.x && config.y ? <LineView records={records} xColumn={config.x} yColumn={config.y} style={config.style} /> : null;\n case 'scatter':\n return config.x && config.y ? <ScatterView records={records} xColumn={config.x} yColumn={config.y} style={config.style} /> : null;\n case 'heatmap':\n return config.row && config.col ? <HeatmapView records={records} rowColumn={config.row} colColumn={config.col} valueColumn={config.value} aggFn={config.agg || 'count'} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} marginAgg={config.marginAgg} showTotals={config.showTotals} style={config.style} /> : null;\n case 'heatmap-plus':\n return config.row && config.col ? <HeatmapPlusView records={records} rowColumn={config.row} colColumn={config.col} valueColumn={config.value} labelStat={config.labelStat as never} colorStat={config.colorStat as never} blockField={config.blockField} scope={config.scope as never} method={config.method as never} vmin={config.vmin} vmax={config.vmax} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} showMargins={config.showMargins} style={config.style} /> : null;\n case 'pivot':\n return <PivotView records={records} />;\n case 'metric':\n return <MetricView records={records} config={{ column: config.column || '', agg: config.agg, label: config.label }} />;\n case 'insight':\n return <InsightView config={{ text: config.text }} />;\n case 'table':\n // Records fallback (SQL-backed tables route through SqlPanel above).\n return <DataTable rows={(records || []).slice(0, 50)} columns={config.columns || columns?.map((c) => c.name)} style={config.style} />;\n default:\n return <div className=\"p-4 text-xs text-midnight-text-muted\">Unknown panel type: {type}</div>;\n }\n}\n\n// PanelChart renders a panel's chart/table/metric BODY only — no panel frame,\n// no title bar. Host-agnostic: the published viewer's single-chart embed route\n// renders exactly this (so an iframe shows the chart and nothing else), and the\n// studio can use it anywhere a bare chart body is needed.\nexport const PanelChart = PanelContent;\nexport type PanelChartProps = PanelContentProps;\n\n// ─── DashboardRenderer ─────────────────────────────────────────────────────\n\nconst GRID_COLS = 12;\nconst ROW_HEIGHT = 80; // px per grid row unit\nconst GRID_MARGIN = 10; // px gap between panels\n// A panel header drag-handle class — only the header drags (so charts stay\n// interactive). react-grid-layout matches it via draggableHandle.\nconst DRAG_HANDLE = 'panel-drag-handle';\n\n// react-grid-layout needs its CSS for the resize handle + drag transitions.\n// Rather than make every host import a stylesheet, inject the minimal rules once\n// (scoped to .react-grid-* / .react-resizable-*). Styled to match the dark theme.\nconst RGL_CSS = `\n.react-grid-layout { position: relative; transition: height 200ms ease; }\n.react-grid-item { transition: all 200ms ease; transition-property: left, top, width, height; box-sizing: border-box; }\n.react-grid-item.cssTransforms { transition-property: transform, width, height; }\n.react-grid-item.resizing { transition: none; z-index: 3; will-change: width, height; }\n.react-grid-item.react-draggable-dragging { transition: none; z-index: 3; will-change: transform; }\n.react-grid-item.react-grid-placeholder { background: rgba(99,102,241,0.18); border: 1px dashed #6366f1; border-radius: 2px; transition-duration: 100ms; z-index: 2; user-select: none; }\n.react-grid-item > .react-resizable-handle { position: absolute; width: 18px; height: 18px; bottom: 0; right: 0; cursor: se-resize; }\n.react-grid-item > .react-resizable-handle::after { content: ''; position: absolute; right: 4px; bottom: 4px; width: 6px; height: 6px; border-right: 2px solid rgba(148,163,184,0.7); border-bottom: 2px solid rgba(148,163,184,0.7); }\n.${DRAG_HANDLE} { cursor: grab; }\n.react-grid-item.react-draggable-dragging .${DRAG_HANDLE} { cursor: grabbing; }\n`;\n\nlet rglCssInjected = false;\nfunction useInjectRglCss() {\n useEffect(() => {\n if (rglCssInjected || typeof document === 'undefined') return;\n const el = document.createElement('style');\n el.setAttribute('data-rgl', 'dashboard-renderer');\n el.textContent = RGL_CSS;\n document.head.appendChild(el);\n rglCssInjected = true;\n }, []);\n}\n\n// WidthProvider sizes the grid to its container; computed once (module scope) so\n// the HOC identity is stable across renders.\nconst GridLayoutWithWidth = WidthProvider(GridLayout);\n\n// Build the react-grid-layout `layout` from the panels. Honors saved x/y; for\n// panels without a saved position, auto-packs them left→right, top→bottom in\n// panel order (so legacy dashboards — which only stored width/height — still lay\n// out sensibly until the user drags them).\nfunction buildLayout(panels: DashboardPanel[]): Layout[] {\n let cx = 0, cy = 0, rowH = 0;\n return panels.map((p) => {\n // A \"fill\" panel takes the full width and a tall height.\n const fill = !!p.config?.fill;\n const w = fill ? GRID_COLS : Math.min(Math.max(p.width || 6, 1), GRID_COLS);\n const h = fill ? Math.max(p.height || 8, 6) : Math.max(p.height || 4, 1);\n if (typeof p.x === 'number' && typeof p.y === 'number') {\n return { i: p.id, x: fill ? 0 : p.x, y: p.y, w, h, minW: 2, minH: 2 };\n }\n // Auto-pack: wrap to the next row when this panel won't fit.\n if (cx + w > GRID_COLS) { cx = 0; cy += rowH; rowH = 0; }\n const item = { i: p.id, x: cx, y: cy, w, h, minW: 2, minH: 2 };\n cx += w;\n rowH = Math.max(rowH, h);\n return item;\n });\n}\n\n/**\n * DashboardRenderer — renders a grid of AI-generated or manually configured\n * panels via react-grid-layout. Editing is capability-gated:\n * - studio (persistLayout wired) ⇒ panels drag (by their header) + resize, and\n * the new geometry is persisted back to the host.\n * - published viewer (no persistLayout) ⇒ a static grid, rendered exactly where\n * the studio left the panels.\n * The per-panel remove button is similarly gated behind canEditPanels.\n */\nexport function DashboardRenderer({ dashboard, records, columns }: DashboardRendererProps) {\n const { theme, removePanel, persistLayout, panelHeaderExtra } = useDashboard();\n const { canEditPanels, canEditLayout } = useCapabilities();\n useInjectRglCss();\n\n const panels = dashboard?.panels ?? [];\n // Recompute only when the panel set / geometry changes (not on every render).\n const layout = useMemo(() => buildLayout(panels), [panels]);\n\n const onLayoutChange = useCallback((next: Layout[]) => {\n if (!persistLayout) return;\n persistLayout(next.map((l): PanelLayout => ({ id: l.i, x: l.x, y: l.y, w: l.w, h: l.h })));\n }, [persistLayout]);\n\n if (!dashboard) return null;\n\n // One panel frame (header + content), reused by the grid and the full-bleed\n // single-panel layout. `draggable` adds the drag-handle class to the header.\n const panelFrame = (panel: DashboardPanel, draggable: boolean) => (\n <div key={panel.id} className={`border ${theme.border} bg-midnight-surface flex flex-col overflow-hidden h-full`}>\n <div className={`flex items-center justify-between px-3 py-1.5 border-b ${theme.border} bg-midnight-elevated ${draggable ? DRAG_HANDLE : ''}`}>\n <span\n className=\"flex-1 text-xs font-mono text-midnight-text-body truncate px-1\"\n style={{\n textAlign: panel.config?.style?.titleAlign || 'left',\n fontWeight: panel.config?.style?.titleBold ? 700 : undefined,\n background: panel.config?.style?.titleBackground || undefined,\n color: panel.config?.style?.titleColor || undefined,\n }}\n >{panel.title || panel.type}</span>\n {panelHeaderExtra && (\n // Host-injected per-panel affordance (e.g. the viewer's\n // copy-embed-link icon). Stop drag from hijacking the click.\n <span onMouseDown={(e) => e.stopPropagation()} className=\"flex items-center\">\n {panelHeaderExtra(panel)}\n </span>\n )}\n {canEditPanels && removePanel && (\n <button\n // Stop drag from starting when the user aims for the X.\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => removePanel(panel.id)}\n className=\"p-0.5 hover:bg-midnight-raised text-midnight-text-muted hover:text-midnight-text-body transition-colors\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n <div className=\"flex-1 min-h-0\">\n <Suspense fallback={<ViewLoading />}>\n <PanelContent panel={panel} records={records} columns={columns} />\n </Suspense>\n </div>\n </div>\n );\n\n const insightsBanner = dashboard.insights ? (\n <div className={`border ${theme.border} bg-midnight-elevated px-4 py-3 flex items-start gap-3`}>\n <Sparkles className=\"w-5 h-5 text-midnight-accent shrink-0 mt-0.5\" />\n <p className={`text-sm ${theme.text} leading-relaxed`}>{dashboard.insights}</p>\n </div>\n ) : null;\n\n // A single-chart dashboard always maximizes — full width AND height (this is\n // the published default for one-chart shares). No grid; the panel fills.\n if (panels.length === 1) {\n return (\n <div className=\"flex flex-col gap-4 p-2 h-full min-h-[60vh]\">\n {insightsBanner}\n <div className=\"flex-1 min-h-0\">{panelFrame(panels[0], false)}</div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4 p-2\">\n {insightsBanner}\n\n {/* Panel grid (draggable/resizable in the studio, static in the viewer) */}\n <GridLayoutWithWidth\n className=\"layout\"\n layout={layout}\n cols={GRID_COLS}\n rowHeight={ROW_HEIGHT}\n margin={[GRID_MARGIN, GRID_MARGIN]}\n isDraggable={canEditLayout}\n isResizable={canEditLayout}\n draggableHandle={`.${DRAG_HANDLE}`}\n onDragStop={onLayoutChange}\n onResizeStop={onLayoutChange}\n // Editing → vertical-compact (no floating gaps). Viewer → null, so\n // the published dashboard renders exactly where the studio left it.\n compactType={canEditLayout ? 'vertical' : null}\n >\n {panels.map((panel) => panelFrame(panel, canEditLayout))}\n </GridLayoutWithWidth>\n </div>\n );\n}\n\nexport default DashboardRenderer;\n","// DataExplorer — the host-agnostic container for the Data Explorer.\n//\n// This is the most store-coupled component, yet here it reads NO store: all\n// data/state arrives via props, and every logged-in-only verb\n// (save/load/search/delete/analyze/refine/edit) is an OPTIONAL injected\n// capability consumed through useDashboard()/useCapabilities(). When a\n// capability is absent its affordance is hidden and a read-only host\n// renders read-only.\n//\n// State ownership:\n// - data/state-in (records, columns, states, profile, dashboard,\n// savedDashboards, loading flags, active selection) → PROPS (the host owns\n// fetching/selection and its own store).\n// - actions (save/list/search/load/delete/analyze/refine) → injected caps.\n// - purely-local UI (active tab, save-name input, showSaved toggle,\n// fullscreen) → useState.\n\nimport { useState } from 'react';\nimport {\n Database, BarChart3, Rows3, Plus,\n ChevronDown, Sparkles, Send, Loader2, RefreshCw, Save, FolderOpen, Trash2, Terminal, Maximize2, Minimize2,\n} from 'lucide-react';\n\nimport { DashboardRenderer } from './DashboardRenderer';\nimport { ChartBuilder } from './ChartBuilder';\nimport { SqlConsole } from './SqlConsole';\nimport { useDashboard, useCapabilities, type DashboardTheme, type SavedDashboard } from '../context/DashboardContext';\nimport type { Row } from '../sqlgen';\n\n// ─── Domain types (host-supplied shapes) ──────────────────────────\n\n/** A dataset column descriptor: name + DuckDB-ish type tag. */\nexport interface Column {\n name: string;\n type: string;\n}\n\n/** A selectable state (dataset) in the host's catalog. */\nexport interface StatefsState {\n state_id: string;\n row_count?: number;\n [key: string]: unknown;\n}\n\n/** Per-column profile statistics shown in the ProfileSummary table. */\nexport interface ProfileColumn {\n name: string;\n type: string;\n distinct_count?: number;\n null_count?: number;\n avg_length?: number;\n min_length?: number;\n max_length?: number;\n min?: number | string;\n max?: number | string;\n top_values?: string[];\n [key: string]: unknown;\n}\n\n/** Dataset profile (row/column counts + per-column stats). */\nexport interface DatasetProfile {\n total_rows?: number;\n columns?: ProfileColumn[];\n [key: string]: unknown;\n}\n\n/** A single dashboard panel descriptor. */\nexport interface DashboardPanel {\n id: string;\n type: string;\n title?: string;\n width?: number;\n height?: number;\n config?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** A dashboard config: AI insights + a grid of panels. */\nexport interface Dashboard {\n insights?: string;\n panels?: DashboardPanel[];\n [key: string]: unknown;\n}\n\ntype Mode = 'dashboard' | 'builder' | 'sql';\n\n// ─── Profile Summary ──────────────────────────────────────────────\n\ninterface ProfileSummaryProps {\n profile?: DatasetProfile | null;\n theme: DashboardTheme;\n}\n\nfunction ProfileSummary({ profile, theme }: ProfileSummaryProps) {\n const [open, setOpen] = useState(false);\n if (!profile) return null;\n\n return (\n <div className={`border ${theme.border} bg-midnight-surface mb-3`}>\n <button onClick={() => setOpen(!open)}\n className={`w-full px-3 py-2 bg-midnight-elevated flex items-center gap-2 hover:bg-midnight-raised transition-colors text-left`}>\n <ChevronDown className={`w-4 h-4 transition-transform ${open ? '' : '-rotate-90'}`} />\n <BarChart3 className=\"w-4 h-4\" />\n <span className={`text-sm font-mono ${theme.text}`}>{profile.total_rows?.toLocaleString()} rows, {profile.columns?.length} columns</span>\n </button>\n {open && (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead><tr className={`border-b ${theme.border} bg-midnight-elevated`}>\n {['Column', 'Type', 'Distinct', 'Nulls', 'Stats', 'Top Values'].map(h => (\n <th key={h} className={`px-3 py-1 text-left uppercase ${theme.textSecondary}`}>{h}</th>\n ))}\n </tr></thead>\n <tbody>{profile.columns?.map(col => (\n <tr key={col.name} className={`border-b border-dashed ${theme.border}`}>\n <td className={`px-3 py-1 font-mono ${theme.text}`}>{col.name}</td>\n <td className={`px-3 py-1 ${theme.textSecondary}`}>{col.type}</td>\n <td className={`px-3 py-1 text-right ${theme.textSecondary}`}>{col.distinct_count}</td>\n <td className={`px-3 py-1 text-right ${theme.textSecondary}`}>{col.null_count}</td>\n <td className={`px-3 py-1 ${theme.textSecondary}`}>\n {col.type === 'string' && (col.avg_length ?? 0) > 0 && `len: ${col.min_length}–${col.max_length}`}\n {(col.type === 'int64' || col.type === 'float64') && col.min !== undefined && `${col.min}–${col.max}`}\n </td>\n <td className={`px-3 py-1 ${theme.textSecondary} max-w-[200px] truncate`}>{col.top_values?.slice(0, 3).join(', ')}</td>\n </tr>\n ))}</tbody>\n </table>\n </div>\n )}\n </div>\n );\n}\n\n// ─── State Selector ───────────────────────────────────────────────\n\ninterface StateSelectorProps {\n states: StatefsState[];\n activeStateId?: string | null;\n onSelect: (id: string) => void;\n theme: DashboardTheme;\n}\n\nfunction StateSelector({ states, activeStateId, onSelect, theme }: StateSelectorProps) {\n return (\n <div className={`border ${theme.border} bg-midnight-surface mb-3`}>\n <div className={`px-3 py-2 bg-midnight-elevated flex items-center gap-2`}>\n <Database className=\"w-4 h-4\" />\n <span className={`text-sm font-mono ${theme.text}`}>States ({states.length})</span>\n </div>\n <div className=\"max-h-[140px] overflow-y-auto\">\n {states.map(s => (\n <div key={s.state_id} onClick={() => onSelect(s.state_id)}\n className={`px-3 py-1.5 cursor-pointer flex justify-between items-center border-b border-dashed ${theme.border} ${s.state_id === activeStateId ? 'bg-midnight-raised' : ''} hover:bg-midnight-raised transition-colors`}>\n <span className={`font-mono text-xs ${theme.text} truncate`}>{s.state_id}</span>\n <span className={`text-xs ${theme.textSecondary} ml-2 shrink-0`}>{s.row_count?.toLocaleString()} rows</span>\n </div>\n ))}\n {!states.length && <div className={`px-3 py-4 text-center text-sm ${theme.textSecondary}`}>No states found</div>}\n </div>\n </div>\n );\n}\n\n// ─── Chat Input ───────────────────────────────────────────────────\n\ninterface ChatInputProps {\n onSend: (text: string) => void;\n loading: boolean;\n theme: DashboardTheme;\n}\n\nfunction ChatInput({ onSend, loading, theme }: ChatInputProps) {\n const [text, setText] = useState('');\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!text.trim() || loading) return;\n onSend(text.trim());\n setText('');\n };\n return (\n <form onSubmit={handleSubmit} className={`flex gap-2 px-3 py-2 border-t ${theme.border} bg-midnight-elevated shrink-0`}>\n <input value={text} onChange={e => setText(e.target.value)}\n placeholder=\"Ask AI to refine the dashboard...\" disabled={loading}\n className=\"flex-1 bg-midnight-surface border border-midnight-border px-3 py-1.5 text-sm outline-none text-midnight-text-body placeholder:text-midnight-text-muted\" />\n <button type=\"submit\" disabled={loading || !text.trim()}\n className={`px-3 py-1.5 border border-midnight-border text-sm flex items-center gap-1 ${loading ? 'opacity-50' : 'hover:bg-midnight-raised'} transition-colors`}>\n {loading ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Send className=\"w-4 h-4\" />}\n </button>\n </form>\n );\n}\n\n// ─── Mode Tab Button ──────────────────────────────────────────────\n\ninterface ModeTabProps {\n active: boolean;\n onClick: () => void;\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n}\n\nfunction ModeTab({ active, onClick, icon: Icon, label }: ModeTabProps) {\n return (\n <button onClick={onClick}\n className={`px-3 py-1 text-xs font-mono border transition-colors ${\n active ? 'border-midnight-accent text-midnight-accent bg-midnight-accent/10' : 'border-midnight-border text-midnight-text-muted hover:bg-midnight-raised'\n }`}>\n <Icon className=\"w-3 h-3 inline mr-1\" />{label}\n </button>\n );\n}\n\n// The available mode tabs, in display order. `tabs` filters this set.\nconst MODE_TABS: { mode: Mode; icon: React.ComponentType<{ className?: string }>; label: string }[] = [\n { mode: 'dashboard', icon: Sparkles, label: 'Dashboard' },\n { mode: 'builder', icon: BarChart3, label: 'Chart Builder' },\n { mode: 'sql', icon: Terminal, label: 'SQL' },\n];\n\n// ─── Main ─────────────────────────────────────────────────────────\n\nexport interface DataExplorerProps {\n /** All records for the active state (viz/builder source). Empty when not loaded. */\n records: Row[];\n /** Active state's columns ({ name, type }), from schema or profile. */\n columns: Column[];\n /** The catalog of selectable states. */\n states?: StatefsState[];\n /** Currently-selected state id (null = none selected). */\n activeStateId?: string | null;\n /** Profile (stats) of the active state. */\n profile?: DatasetProfile | null;\n /** Active dashboard config (null = not yet generated). */\n dashboard?: Dashboard | null;\n /** Persisted id of the active dashboard (null = unsaved). Drives Save vs Save-as. */\n dashboardId?: string | null;\n /** Saved dashboards listed for the current project (shown in the saved panel). */\n savedDashboards?: SavedDashboard[];\n /** True while the catalog/profile/records are loading. */\n loading?: boolean;\n /** True while the AI is generating/refining the dashboard. */\n analyzing?: boolean;\n /** Initial mode tab. Defaults to 'dashboard'; the published viewer uses 'sql'\n * so the SQL console is the primary surface. Clamped to `tabs`. */\n defaultMode?: Mode;\n /** Which mode tabs to show, in order. Defaults to all three. Pass a subset to\n * turn tabs off (e.g. ['sql'] for a SQL-only explorer). */\n tabs?: Mode[];\n\n /** Select a state (host fetches its profile/records). */\n onSelectState: (id: string) => void;\n /** Refresh the states catalog. */\n onRefreshStates?: () => void;\n}\n\nexport function DataExplorer({\n records,\n columns,\n states = [],\n activeStateId,\n profile,\n dashboard,\n dashboardId,\n savedDashboards = [],\n loading = false,\n analyzing = false,\n defaultMode = 'dashboard',\n tabs = ['dashboard', 'builder', 'sql'],\n onSelectState,\n onRefreshStates,\n}: DataExplorerProps) {\n const { theme, newDashboard, addPanel, saveDashboard, listDashboards, searchDashboards, loadDashboard, deleteDashboard, analyzeDataset, refineDashboard } = useDashboard();\n const caps = useCapabilities();\n\n const visibleTabs = MODE_TABS.filter(t => tabs.includes(t.mode));\n const [mode, setMode] = useState<Mode>(tabs.includes(defaultMode) ? defaultMode : tabs[0] ?? 'sql');\n const [fullscreen, setFullscreen] = useState(false);\n const [showSaved, setShowSaved] = useState(false);\n const [saveName, setSaveName] = useState('');\n const [showSaveInput, setShowSaveInput] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n // The save/load/list panel is only meaningful if the host can persist.\n const showPersistence = caps.canSave || caps.canList || caps.canLoad || caps.canDelete;\n\n const handleAutoAnalyze = () => {\n setMode('dashboard');\n analyzeDataset?.();\n };\n\n const handleSave = async () => {\n if (!caps.canSave) return;\n if (showSaveInput && saveName.trim()) {\n await saveDashboard?.(saveName.trim());\n setShowSaveInput(false);\n setSaveName('');\n } else if (dashboardId) {\n await saveDashboard?.(); // update existing\n } else {\n setShowSaveInput(true);\n }\n };\n\n const handleOpenSaved = () => {\n listDashboards?.();\n setShowSaved(!showSaved);\n };\n\n const handleSearch = (q: string) => {\n setSearchQuery(q);\n searchDashboards?.(q);\n };\n\n return (\n <div className={`flex flex-col ${theme.bg} ${theme.text} p-4 ${fullscreen ? 'fixed inset-0 z-50' : 'h-full'}`}>\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-3 shrink-0\">\n <Rows3 className=\"w-5 h-5\" />\n <h1 className=\"text-lg font-mono\">Data Explorer</h1>\n {(loading || analyzing) && <Loader2 className=\"w-4 h-4 animate-spin text-midnight-text-muted ml-2\" />}\n {onRefreshStates && (\n <button onClick={onRefreshStates} className=\"ml-auto p-1 hover:bg-midnight-raised transition-colors\">\n <RefreshCw className=\"w-4 h-4\" />\n </button>\n )}\n <button onClick={() => setFullscreen(f => !f)} title={fullscreen ? 'Exit full screen' : 'Full screen'}\n className={`p-1 hover:bg-midnight-raised transition-colors ${onRefreshStates ? '' : 'ml-auto'}`}>\n {fullscreen ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n </div>\n\n {/* State selector */}\n <div className=\"shrink-0\">\n <StateSelector states={states} activeStateId={activeStateId} onSelect={onSelectState} theme={theme} />\n </div>\n\n {activeStateId && (\n <>\n {/* Profile + controls */}\n <div className=\"flex items-start gap-3 mb-3 shrink-0\">\n <div className=\"flex-1\"><ProfileSummary profile={profile} theme={theme} /></div>\n {caps.canAnalyze && (\n <button onClick={handleAutoAnalyze} disabled={analyzing || !profile}\n className={`shrink-0 flex items-center gap-2 px-4 py-2 border text-sm font-mono transition-colors ${\n analyzing ? 'border-midnight-border opacity-50' : 'border-midnight-accent text-midnight-accent hover:bg-midnight-accent/10'\n }`}>\n {analyzing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Sparkles className=\"w-4 h-4\" />}\n {analyzing ? 'Analyzing...' : 'Auto-Analyze'}\n </button>\n )}\n </div>\n\n {/* Mode tabs + save/load */}\n <div className=\"flex items-center gap-1 mb-3 shrink-0\">\n {visibleTabs.map(t => (\n <ModeTab key={t.mode} active={mode === t.mode} onClick={() => setMode(t.mode)} icon={t.icon} label={t.label} />\n ))}\n\n {caps.canNew && (\n <button onClick={() => { newDashboard?.(); setMode('builder'); }} title=\"Start a new dashboard\"\n className=\"flex items-center gap-1 px-2 py-1 text-xs font-mono border border-midnight-border text-midnight-text-muted hover:bg-midnight-raised hover:text-midnight-accent transition-colors\">\n <Plus className=\"w-3.5 h-3.5\" /> New Dashboard\n </button>\n )}\n\n {showPersistence && (\n <div className=\"flex items-center gap-1 ml-auto\">\n {caps.canSave && showSaveInput && (\n <input value={saveName} onChange={e => setSaveName(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') void handleSave(); }}\n placeholder=\"Dashboard name...\"\n className=\"bg-midnight-surface border border-midnight-border px-2 py-1 text-xs outline-none text-midnight-text-body w-40\" autoFocus />\n )}\n {caps.canSave && dashboard && (\n <button onClick={() => void handleSave()} title={dashboardId ? 'Save' : 'Save as...'}\n className=\"p-1 border border-midnight-border text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n <Save className=\"w-3.5 h-3.5\" />\n </button>\n )}\n {(caps.canList || caps.canLoad || caps.canDelete) && (\n <button onClick={handleOpenSaved} title=\"Saved dashboards\"\n className={`p-1 border transition-colors ${showSaved ? 'border-midnight-accent text-midnight-accent' : 'border-midnight-border text-midnight-text-muted hover:bg-midnight-raised'}`}>\n <FolderOpen className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Saved dashboards panel */}\n {showSaved && (caps.canList || caps.canLoad || caps.canDelete) && (\n <div className={`border ${theme.border} bg-midnight-surface mb-3 shrink-0 max-h-[200px] overflow-y-auto`}>\n {caps.canSearch && (\n <input value={searchQuery} onChange={e => handleSearch(e.target.value)}\n placeholder=\"Search dashboards...\"\n className=\"w-full bg-midnight-surface border-b border-midnight-border px-3 py-1.5 text-xs outline-none text-midnight-text-body placeholder:text-midnight-text-muted sticky top-0\" />\n )}\n {savedDashboards.length === 0 ? (\n <div className=\"px-3 py-3 text-center text-xs text-midnight-text-muted\">No saved dashboards</div>\n ) : savedDashboards.map(d => (\n <div key={d.id} className={`flex items-center justify-between px-3 py-1.5 border-b border-dashed ${theme.border} hover:bg-midnight-raised transition-colors`}>\n {caps.canLoad ? (\n <button onClick={() => { void loadDashboard?.(d.id); setShowSaved(false); setMode('dashboard'); }}\n className=\"flex-1 text-left text-xs font-mono text-midnight-text-body truncate\">\n {d.name}\n </button>\n ) : (\n <span className=\"flex-1 text-xs font-mono text-midnight-text-body truncate\">{d.name}</span>\n )}\n {typeof d.updated_at === 'string' && (\n <span className=\"text-xs text-midnight-text-muted mx-2\">{new Date(d.updated_at).toLocaleDateString()}</span>\n )}\n {caps.canDelete && (\n <button onClick={() => void deleteDashboard?.(d.id)}\n className=\"p-0.5 text-midnight-text-muted hover:text-red-400 transition-colors\">\n <Trash2 className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Content */}\n <div className={`border ${theme.border} bg-midnight-surface flex-1 flex flex-col min-h-0`}>\n {mode === 'sql' ? (\n <SqlConsole columns={columns} stateId={activeStateId ?? undefined} />\n ) : mode === 'builder' ? (\n <ChartBuilder records={records} columns={columns} stateId={activeStateId ?? undefined}\n onSave={addPanel ? (panel) => { addPanel(panel); setMode('dashboard'); } : undefined} />\n ) : (\n <>\n <div className=\"flex-1 min-h-0 overflow-auto\">\n {dashboard ? (\n <DashboardRenderer dashboard={dashboard} records={records} columns={columns} />\n ) : (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-midnight-text-muted\">\n <Sparkles className=\"w-8 h-8\" />\n <p className=\"text-sm\">\n {caps.canAnalyze\n ? <>Click <strong>Auto-Analyze</strong> to generate an AI dashboard</>\n : caps.canNew\n ? 'Start a new dashboard, then add charts from the Chart Builder'\n : 'No dashboard to display'}\n </p>\n {caps.canNew && (\n <button onClick={() => { newDashboard?.(); setMode('builder'); }}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-mono border border-midnight-accent text-midnight-accent hover:bg-midnight-accent/10 transition-colors\">\n <Plus className=\"w-4 h-4\" /> Create Dashboard\n </button>\n )}\n </div>\n )}\n </div>\n {dashboard && caps.canRefine && refineDashboard && (\n <ChatInput onSend={refineDashboard} loading={analyzing} theme={theme} />\n )}\n </>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport default DataExplorer;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/context/DashboardContext.tsx","../src/sqlgen.ts","../src/chartStyle.ts","../src/dataShape.ts","../src/heatmapColor.ts","../src/components/views/MetricView.tsx","../src/components/views/InsightView.tsx","../src/components/axis.tsx","../src/components/views/BarView.tsx","../src/components/views/PieView.tsx","../src/components/views/LineView.tsx","../src/components/views/SparklineView.tsx","../src/components/views/ScatterView.tsx","../src/components/views/HeatmapView.tsx","../src/components/views/HeatmapPlusView.tsx","../src/components/views/PivotView.tsx","../src/components/ChartStyleControls.tsx","../src/duckdbSql.ts","../src/components/SqlConsole.tsx","../src/components/ChartBuilder.tsx","../src/components/DashboardRenderer.tsx","../src/components/DataExplorer.tsx"],"names":["createContext","jsx","useContext","opts","interpolateRdYlGn","useMemo","jsxs","ResponsiveBar","ResponsivePie","Fragment","ResponsiveLine","useId","ResponsiveScatterPlot","ResponsiveHeatMap","MAX_AXIS","fmtNum","orderIds","byCol","t","nivoData","useState","PivotTableUI","TerminalToggle","TerminalSlider","TerminalInput","TerminalSelect","snippetCompletion","completeFromList","useEffect","useRef","PostgreSQL","sqlLang","autocompletion","schemaCompletionSource","keywordCompletionSource","EditorView","Prec","keymap","acceptCompletion","Loader2","Play","CodeMirror","ChevronDown","AlertCircle","Rows3","BarChart3","PieChart","TrendingUp","ScatterChart","LayoutGrid","Grid3x3","GripVertical","X","Plus","Filter","Suspense","Code","useCallback","RefreshCw","WidthProvider","GridLayout","Sparkles","Database","Send","Terminal","Minimize2","Maximize2","Save","FolderOpen","Trash2"],"mappings":"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","file":"index.cjs","sourcesContent":["// DashboardContext — the capability-injection contract for the dashboard\n// components. The components themselves are host-agnostic: they never import a\n// store or an API client. Instead the HOST wires concrete functions here, and\n// the components call them via useDashboard().\n//\n// Any number of hosts, one component tree:\n// - full-capability host (studio, source of truth): provides everything —\n// runQuery against a SQL service /query, plus the logged-in verbs (save/load/\n// search/delete/analyze/refine/edit).\n// - read-only host (published viewer, immutable): provides ONLY theme + runQuery\n// (e.g. DuckDB-WASM). The logged-in-only verbs are omitted, so the chart\n// builder, dashboard and SQL runner render read-only — no save/edit/load.\n//\n// Rule of thumb: a capability that is absent ⇒ its affordance is hidden. So a\n// read-only host drops nothing functionally except persistence/editing.\n\nimport { createContext, useContext, type ReactNode } from 'react';\n\n// DashboardTheme mirrors the host's terminal theme: a flat map of Tailwind class\n// strings (text/border/bg/accent/...). Kept loose so the package doesn't depend\n// on a specific theme implementation.\nexport type DashboardTheme = Record<string, string>;\n\n// QueryResult is the shape every runQuery implementation returns.\nexport interface QueryResult {\n columns: string[];\n rows: Record<string, unknown>[];\n}\n\n// SavedDashboard is an opaque persisted dashboard descriptor (the host owns its\n// schema; the components only need id + name for listing/loading).\nexport interface SavedDashboard {\n id: string;\n name: string;\n [key: string]: unknown;\n}\n\n// PanelInput is a chart panel handed to addPanel (the host assigns the id and\n// appends it to the active dashboard, creating one if none exists).\nexport interface PanelInput {\n title: string;\n type: string;\n config: Record<string, unknown>;\n width: number;\n height: number;\n}\n\n// DashboardCapabilities are the functions a host wires in. runQuery is REQUIRED;\n// the rest are OPTIONAL and gate their UI (absent ⇒ hidden).\nexport interface DashboardCapabilities {\n // REQUIRED. Run a chart/console SQL string against a state's dataset (exposed\n // as the view `data`) and return rows. Full host → a SQL service /query;\n // read-only host → DuckDB-WASM. stateId selects the dataset when the host is\n // multi-state.\n runQuery: (sql: string, stateId?: string) => Promise<QueryResult>;\n\n // OPTIONAL — studio-only (logged-in user) verbs. Omitted by the viewer.\n saveDashboard?: (name?: string) => Promise<void> | void;\n listDashboards?: () => Promise<SavedDashboard[]> | SavedDashboard[];\n searchDashboards?: (query: string) => Promise<SavedDashboard[]> | SavedDashboard[];\n loadDashboard?: (id: string) => Promise<void> | void;\n deleteDashboard?: (id: string) => Promise<void> | void;\n\n // OPTIONAL — AI assist (studio-only).\n analyzeDataset?: () => Promise<void> | void;\n refineDashboard?: (prompt: string) => Promise<void> | void;\n\n // OPTIONAL — start a fresh, empty dashboard (studio-only). Absent ⇒ no explicit\n // \"New Dashboard\" affordance (a dashboard is otherwise created implicitly by\n // the first addPanel). The host sets a blank active dashboard + clears the\n // persisted id so the next Save creates a new record.\n newDashboard?: () => void;\n\n // OPTIONAL — add a chart panel to the active dashboard (studio-only). Absent ⇒\n // the chart builder's \"Add to Dashboard\" affordance is hidden. The host\n // appends the panel (and creates the dashboard if none exists).\n addPanel?: (panel: PanelInput) => void;\n\n // OPTIONAL — editing (studio-only). Absent ⇒ panels are read-only.\n removePanel?: (panelId: string) => void;\n\n // OPTIONAL — persist a panel's PRECOMPUTED result (studio-only). When wired,\n // SQL-backed panels show a Refresh button: refresh runs runQuery and hands the\n // result rows back here so the host stores them on the panel (config.data) and\n // saves. Published dashboards are then rendered from that stored result — no\n // live query, no dataset download. Absent ⇒ no Refresh; panels are pure\n // precomputed-or-unavailable (the published viewer).\n persistPanelData?: (panelId: string, rows: QueryResult['rows'], refreshedAt: string) => void;\n\n // OPTIONAL — persist the dashboard grid layout (studio-only). When wired,\n // panels become draggable + resizable; on drop/resize the new geometry\n // (per-panel x/y/w/h, in 12-col grid units) is handed back here so the host\n // stores it on the panels and saves. Absent ⇒ a static (read-only) grid — the\n // published viewer renders panels exactly where the studio left them.\n persistLayout?: (items: PanelLayout[]) => void;\n\n // OPTIONAL — host-injected extra content on each panel's title row (rendered\n // before the remove button). The published viewer uses it for a per-chart\n // copy-embed-link icon. Absent ⇒ nothing extra renders.\n panelHeaderExtra?: (panel: PanelRef) => ReactNode;\n}\n\n// PanelRef is the minimal panel identity handed to panelHeaderExtra (the full\n// DashboardPanel type lives in DashboardRenderer; this avoids a circular import).\nexport interface PanelRef {\n id: string;\n type: string;\n title?: string;\n}\n\n// PanelLayout is one panel's position + size in the 12-column grid (grid units,\n// not pixels). x/y are the top-left cell; w/h the span.\nexport interface PanelLayout {\n id: string;\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface DashboardContextValue extends DashboardCapabilities {\n theme: DashboardTheme;\n}\n\nconst DashboardContext = createContext<DashboardContextValue | null>(null);\n\nexport interface DashboardProviderProps extends DashboardCapabilities {\n theme: DashboardTheme;\n children: ReactNode;\n}\n\n// DashboardProvider wires the host's theme + capabilities into the component tree.\nexport function DashboardProvider({ children, ...value }: DashboardProviderProps) {\n return <DashboardContext.Provider value={value}>{children}</DashboardContext.Provider>;\n}\n\n// useDashboard returns the wired theme + capabilities. Throws if used outside a\n// provider (a programming error — the host must wrap the dashboard UI).\nexport function useDashboard(): DashboardContextValue {\n const ctx = useContext(DashboardContext);\n if (!ctx) {\n throw new Error('useDashboard must be used within a <DashboardProvider>');\n }\n return ctx;\n}\n\n// useCapabilities is a convenience derived from which functions the host wired —\n// components use it to show/hide affordances (e.g. `canSave && <SaveButton/>`).\nexport function useCapabilities() {\n const c = useDashboard();\n return {\n canRun: true,\n canSave: !!c.saveDashboard,\n canList: !!c.listDashboards,\n canSearch: !!c.searchDashboards,\n canLoad: !!c.loadDashboard,\n canDelete: !!c.deleteDashboard,\n canAnalyze: !!c.analyzeDataset,\n canRefine: !!c.refineDashboard,\n canNew: !!c.newDashboard,\n canAddPanel: !!c.addPanel,\n canEditPanels: !!c.removePanel,\n // Studio can recompute + persist a panel's precomputed result.\n canRefresh: !!c.persistPanelData,\n // Studio can drag/resize panels and persist the grid layout.\n canEditLayout: !!c.persistLayout,\n };\n}\n","// sqlgen — generate DuckDB SQL from a visual chart config, and shape the\n// resulting rows into the data shape each Nivo view expects.\n//\n// The query runner exposes a state's full dataset as a view named `data`. The\n// chart builder generates SQL against `data` (exact over the whole dataset)\n// instead of aggregating a client-side sample. The SAME SQL runs server-side in\n// a full host (e.g. a SQL service /query) or client-side in a read-only host\n// (e.g. DuckDB-WASM).\n//\n// Generated queries alias their output columns to stable names (g, v, m0…, x,\n// y, r, c) so the shaping functions don't depend on user column names.\n\nexport type ChartType = 'bar' | 'grouped-bar' | 'pie' | 'line' | 'scatter' | 'heatmap' | 'heatmap-plus';\n\nexport interface ChartField {\n name: string;\n agg?: string;\n}\n\nexport interface ChartFilter {\n column: string;\n op: string;\n value?: string | null;\n}\n\nexport interface ChartConfig {\n chartType: ChartType;\n xFields?: ChartField[];\n yFields?: ChartField[];\n valueField?: ChartField | null;\n filters?: ChartFilter[];\n // heatmap-plus only: the two independent cell stats (label vs color) and an\n // optional block field for block-scope coloring.\n labelStat?: string;\n colorStat?: string;\n blockField?: string;\n}\n\nexport type Row = Record<string, unknown>;\n\nconst TABLE = 'data';\nconst MAX_GROUPS = 50;\nconst MAX_POINTS = 1000;\n\n// Quote a SQL identifier (column name) for DuckDB.\nexport const qIdent = (name: string): string => `\"${String(name).replace(/\"/g, '\"\"')}\"`;\n\n// Render a value as a SQL literal: numeric stays raw, everything else is a\n// single-quoted, escaped string.\nexport const qLit = (v: unknown): string => {\n const s = String(v);\n if (/^-?\\d+(\\.\\d+)?$/.test(s)) return s;\n if (s === 'true' || s === 'false') return s;\n return `'${s.replace(/'/g, \"''\")}'`;\n};\n\n// The dataset stores every column as VARCHAR (state values are JSON strings), so\n// numeric aggregations must coerce the column to a number first: SUM/AVG hard\n// error on VARCHAR (\"No function matches sum(VARCHAR)\"), and MIN/MAX would sort\n// lexically (\"9\" > \"10\"). TRY_CAST is used (not a bare ::DECIMAL / CAST) so a\n// non-numeric or empty cell yields NULL — which the aggregate skips — instead of\n// failing the whole query. DECIMAL keeps SUM/AVG exact (no float drift).\nconst qNum = (col: string): string => `TRY_CAST(${qIdent(col)} AS DECIMAL(18,6))`;\n\n// Aggregate expression. count -> COUNT(*); distinct -> COUNT(DISTINCT col); else FN(col).\nexport const aggExpr = (agg: string | undefined, col?: string): string => {\n const fn = (agg || 'count').toLowerCase();\n if (fn === 'count') return 'COUNT(*)';\n if (!col) return 'COUNT(*)';\n const c = qIdent(col);\n switch (fn) {\n case 'distinct': return `COUNT(DISTINCT ${c})`;\n case 'sum': return `SUM(${qNum(col)})`;\n case 'avg': return `AVG(${qNum(col)})`;\n case 'min': return `MIN(${qNum(col)})`;\n case 'max': return `MAX(${qNum(col)})`;\n case 'median': return `MEDIAN(${qNum(col)})`;\n default: return 'COUNT(*)';\n }\n};\n\n// Compile structured filter rows into a WHERE clause (filters AND-ed).\n// Each filter: { column, op, value }. Returns '' or ' WHERE ...'.\nexport const compileWhere = (filters?: ChartFilter[]): string => {\n const conds = (filters || [])\n .filter((f) => f && f.column && f.op)\n .map((f): string | null => {\n const c = qIdent(f.column);\n switch (f.op) {\n case 'IS NULL': return `${c} IS NULL`;\n case 'IS NOT NULL': return `${c} IS NOT NULL`;\n case 'IN':\n case 'NOT IN': {\n const items = String(f.value ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n if (!items.length) return null;\n return `${c} ${f.op} (${items.map(qLit).join(', ')})`;\n }\n case 'BETWEEN': {\n const parts = String(f.value ?? '').split(',').map((s) => s.trim()).filter(Boolean);\n if (parts.length !== 2) return null;\n return `${c} BETWEEN ${qLit(parts[0])} AND ${qLit(parts[1])}`;\n }\n case 'LIKE': return `${c} LIKE ${qLit(f.value)}`;\n default: // = != < <= > >=\n if (f.value == null || f.value === '') return null;\n return `${c} ${f.op} ${qLit(f.value)}`;\n }\n })\n .filter((x): x is string => Boolean(x));\n return conds.length ? ` WHERE ${conds.join(' AND ')}` : '';\n};\n\n// Build a chart SQL query from the builder config. Returns a SQL string, or\n// null if the config is incomplete for the chart type.\nexport const buildChartSQL = ({\n chartType,\n xFields = [],\n yFields = [],\n valueField = null,\n filters = [],\n labelStat,\n colorStat,\n blockField,\n}: ChartConfig): string | null => {\n const where = compileWhere(filters);\n const x = xFields[0]?.name;\n const y = yFields[0]?.name;\n\n switch (chartType) {\n case 'bar': {\n if (!x) return null;\n const metric = aggExpr(yFields[0]?.agg || 'count', yFields[0]?.name);\n return `SELECT ${qIdent(x)} AS g, ${metric} AS v FROM ${TABLE}${where} GROUP BY 1 ORDER BY 2 DESC LIMIT ${MAX_GROUPS}`;\n }\n case 'grouped-bar': {\n if (!x || !yFields.length) return null;\n const metrics = yFields.map((yf, i) => `${aggExpr(yf.agg || 'count', yf.name)} AS m${i}`);\n return `SELECT ${qIdent(x)} AS g, ${metrics.join(', ')} FROM ${TABLE}${where} GROUP BY 1 ORDER BY 2 DESC LIMIT ${MAX_GROUPS}`;\n }\n case 'pie': {\n if (!x) return null;\n return `SELECT ${qIdent(x)} AS g, COUNT(*) AS v FROM ${TABLE}${where} GROUP BY 1 ORDER BY 2 DESC LIMIT ${MAX_GROUPS}`;\n }\n case 'line': {\n if (!x || !y) return null;\n const w = where ? `${where} AND ${qIdent(x)} IS NOT NULL AND ${qIdent(y)} IS NOT NULL`\n : ` WHERE ${qIdent(x)} IS NOT NULL AND ${qIdent(y)} IS NOT NULL`;\n return `SELECT ${qIdent(x)} AS x, ${qIdent(y)} AS y FROM ${TABLE}${w} ORDER BY 1 LIMIT 500`;\n }\n case 'scatter': {\n if (!x || !y) return null;\n // Scatter is numeric-on-numeric. The dataset stores VARCHAR, so coerce\n // both axes with TRY_CAST and keep only rows where BOTH coerce to a\n // number — non-numeric/empty cells become NULL and are filtered out\n // (instead of silently plotting at 0). DOUBLE (not the aggregate\n // DECIMAL) avoids fixed-scale clamping of raw point values.\n const nx = `TRY_CAST(${qIdent(x)} AS DOUBLE)`, ny = `TRY_CAST(${qIdent(y)} AS DOUBLE)`;\n const extra = `${nx} IS NOT NULL AND ${ny} IS NOT NULL`;\n const w = where ? `${where} AND ${extra}` : ` WHERE ${extra}`;\n return `SELECT ${nx} AS x, ${ny} AS y FROM ${TABLE}${w} LIMIT ${MAX_POINTS}`;\n }\n case 'heatmap': {\n if (!x || !y) return null;\n const metric = valueField ? aggExpr(valueField.agg || 'count', valueField.name) : 'COUNT(*)';\n return `SELECT ${qIdent(x)} AS r, ${qIdent(y)} AS c, ${metric} AS v FROM ${TABLE}${where} GROUP BY 1, 2`;\n }\n case 'heatmap-plus': {\n if (!x || !y) return null;\n const col = valueField?.name;\n // Two independent stats per cell (label vs color); no value column ⇒\n // both are a row count. GROUPING SETS computes the body cells AND the\n // row/col/grand margins in ONE pass — every margin aggregated over the\n // UNDERLYING rows (so median/avg margins stay correct, never a stat of\n // already-aggregated cells). GROUPING() flags which set each row is.\n const lv = col ? aggExpr(labelStat || valueField?.agg || 'count', col) : 'COUNT(*)';\n const cv = col ? aggExpr(colorStat || labelStat || valueField?.agg || 'count', col) : 'COUNT(*)';\n const blockSel = blockField ? `, ANY_VALUE(${qIdent(blockField)}) AS block` : '';\n return `SELECT ${qIdent(x)} AS r, ${qIdent(y)} AS c, ${lv} AS lv, ${cv} AS cv${blockSel}, `\n + `GROUPING(${qIdent(x)}) AS gr, GROUPING(${qIdent(y)}) AS gc `\n + `FROM ${TABLE}${where} `\n + `GROUP BY GROUPING SETS ((${qIdent(x)}, ${qIdent(y)}), (${qIdent(x)}), (${qIdent(y)}), ())`;\n }\n default:\n return null;\n }\n};\n\n// Shape SQL result rows into the data structure each Nivo view consumes.\nexport const shapeChartData = (\n chartType: ChartType,\n rows: Row[],\n { yFields = [] }: { yFields?: ChartField[] } = {},\n): unknown => {\n rows = rows || [];\n switch (chartType) {\n case 'bar':\n return rows.map((r) => ({ group: String(r.g ?? '(null)'), value: Number(r.v) || 0 }));\n case 'grouped-bar': {\n const keys = yFields.map((yf) => `${yf.agg || 'count'}(${yf.name})`);\n const data = rows.map((r) => {\n const out: Record<string, string | number> = { group: String(r.g ?? '(null)') };\n yFields.forEach((_, i) => { out[keys[i]] = Number(r[`m${i}`]) || 0; });\n return out;\n });\n return { data, keys };\n }\n case 'pie':\n return rows.map((r) => ({ id: String(r.g ?? '(null)'), label: String(r.g ?? '(null)'), value: Number(r.v) || 0 }));\n case 'line':\n return [{ id: 'series', data: rows.map((r) => ({ x: String(r.x), y: Number(r.y) || 0 })) }];\n case 'scatter':\n // Keep only finite numeric points (the SQL already coerces + filters,\n // but guard the client path too — never collapse bad cells onto 0).\n return [{\n id: 'points',\n data: rows\n .map((r) => ({ x: Number(r.x), y: Number(r.y) }))\n .filter((p) => Number.isFinite(p.x) && Number.isFinite(p.y)),\n }];\n case 'heatmap': {\n // Pivot flat (r, c, v) rows into the Nivo heatmap series shape. Order\n // and capping are applied downstream by HeatmapView (which also draws\n // the marginal totals), so return the full set here.\n const rowKeys: string[] = [];\n const colKeys: string[] = [];\n const cell: Record<string, Record<string, number>> = {};\n for (const r of rows) {\n const rk = String(r.r ?? '(null)');\n const ck = String(r.c ?? '(null)');\n if (!cell[rk]) { cell[rk] = {}; rowKeys.push(rk); }\n if (!colKeys.includes(ck)) colKeys.push(ck);\n cell[rk][ck] = Number(r.v) || 0;\n }\n return rowKeys.map((rk) => ({\n id: rk,\n data: colKeys.map((ck) => ({ x: ck, y: cell[rk][ck] || 0 })),\n }));\n }\n case 'heatmap-plus': {\n // Flat (r, c, lv, cv, gr, gc, block) rows — body cells plus margin\n // rows (gr/gc flag which). HeatmapPlusView assembles the matrix,\n // ordering, margins and coloring; here just coerce types. r/c stay\n // null on margin rows (the view keys margins by the non-grouped axis).\n return rows.map((r) => ({\n r: r.r == null ? null : String(r.r),\n c: r.c == null ? null : String(r.c),\n lv: Number(r.lv) || 0,\n cv: Number(r.cv) || 0,\n gr: Number(r.gr) || 0,\n gc: Number(r.gc) || 0,\n ...(r.block != null ? { block: String(r.block) } : {}),\n }));\n }\n default:\n return [];\n }\n};\n","// chartStyle — a single, standardized chart-appearance model shared by every\n// chart view. A plain `ChartStyle` object (see DEFAULT_CHART_STYLE) is the\n// source of truth; `buildNivoTheme` turns it into a Nivo `theme`, and\n// `axisLegend` produces the per-axis legend props (title text/position/offset).\n//\n// Nivo already supports all of this natively (theme + axis legend*), so every\n// view just consumes the same style object instead of hardcoding its own theme.\n\nexport type LegendAnchor = 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'none';\nexport type LegendPosition = 'start' | 'middle' | 'end';\nexport type TitleAlign = 'left' | 'center' | 'right';\n\nexport interface ChartMargin {\n top: number;\n right: number;\n bottom: number;\n left: number;\n}\n\nexport interface ChartStyle {\n background: string;\n textColor: string;\n legendColor: string;\n fontSize: number;\n gridColor: string;\n tooltipBg: string;\n tooltipColor: string;\n // Axis titles (legends): position along the axis + distance from it.\n xLegendPosition: LegendPosition;\n xLegendOffset: number;\n yLegendPosition: LegendPosition;\n yLegendOffset: number;\n // Custom axis title text ('' ⇒ fall back to the column name) + show/hide.\n xAxisLabel: string;\n yAxisLabel: string;\n showXLegend: boolean;\n showYLegend: boolean;\n // Axis title emphasis: bold weight + a highlight halo (outline) colour.\n legendBold: boolean;\n legendHighlight: string; // '' ⇒ no halo\n // Tick handling (overflow): rotate the x / y ticks, truncate long tick labels\n // to N chars with an ellipsis (0 ⇒ off), and/or WRAP long labels onto\n // multiple lines (default on — wrapping reads better than rotation).\n xTickRotation: number;\n yTickRotation: number;\n tickTruncate: number;\n tickWrap: boolean;\n tickWrapWidth: number; // chars per wrapped line\n // Table cells: wrap long values, and format numbers (decimal precision +\n // optional truncation). cellPrecision applies to float/decimal values only.\n cellWrap: boolean;\n cellPrecision: number;\n cellTruncate: number; // 0 ⇒ off\n // Series legend placement (charts that have one: pie, grouped bar).\n legendAnchor: LegendAnchor;\n // Panel title (rendered as HTML by DashboardRenderer's header).\n titleAlign: TitleAlign;\n titleBold: boolean;\n titleBackground: string; // '' ⇒ transparent\n titleColor: string; // '' ⇒ inherit\n // Chart frame: a fixed pixel height (0 ⇒ fill the parent, the previous\n // behaviour) and a margin override merged over the view's default (null\n // ⇒ the view's default). Views ignored these before this field existed —\n // every view now honours them via chartSizing().\n height: number;\n margin: Partial<ChartMargin> | null;\n // Point-scale x axes label EVERY point; maxXTicks caps them to at most N\n // evenly-spaced ticks (0 ⇒ all ticks). See thinTicks(). On NUMERIC axes\n // maxXTicks/maxYTicks become the Nivo tick-count hint instead.\n maxXTicks: number;\n maxYTicks: number;\n // Line charts: the area fill under each line (0 ⇒ no shading — several\n // overlapping fills read as mush).\n areaOpacity: number;\n // Bar charts: the value label drawn on each bar (off when bars are\n // dense — the labels collide with the axis).\n barLabels: boolean;\n // Fixed-order categorical series palette ([] ⇒ the view's default hue,\n // or DEFAULT_SERIES_COLORS once a chart holds several series). Series\n // past the palette's end fold to a neutral — never a cycled hue.\n seriesColors: string[];\n}\n\nexport const DEFAULT_CHART_STYLE: ChartStyle = {\n background: 'transparent', // chart canvas background\n textColor: '#94a3b8', // ticks + labels\n legendColor: '#cbd5e1', // axis titles (legends)\n fontSize: 11,\n gridColor: 'rgba(148,163,184,0.1)',\n tooltipBg: '#1e293b',\n tooltipColor: '#e2e8f0',\n // Axis titles (legends): position along the axis + distance from it.\n xLegendPosition: 'middle',\n xLegendOffset: 46,\n yLegendPosition: 'middle',\n yLegendOffset: -50,\n // Custom axis title text + visibility.\n xAxisLabel: '',\n yAxisLabel: '',\n showXLegend: true,\n showYLegend: true,\n // Axis title emphasis.\n legendBold: false,\n legendHighlight: '',\n // Tick overflow handling.\n xTickRotation: 0,\n yTickRotation: 0,\n tickTruncate: 0,\n tickWrap: true,\n tickWrapWidth: 14,\n // Table cells.\n cellWrap: true,\n cellPrecision: 2,\n cellTruncate: 0,\n // Series legend placement (charts that have one: pie, grouped bar).\n legendAnchor: 'right',\n // Panel title (rendered by DashboardRenderer's panel header).\n titleAlign: 'left',\n titleBold: false,\n titleBackground: '',\n titleColor: '',\n // Chart frame + series color model.\n height: 0,\n margin: null,\n maxXTicks: 0,\n maxYTicks: 0,\n areaOpacity: 0.15,\n barLabels: true,\n seriesColors: [],\n};\n\n// The default categorical series palette: eight hues stepped for a dark\n// terminal surface, in a FIXED order that is the colorblind-safety mechanism\n// (adjacent pairs validated: CVD ΔE ≥ 8, normal-vision ΔE ≥ 15, ≥ 3:1\n// contrast on #0e0e10). Assign by series index, never cycle.\nexport const DEFAULT_SERIES_COLORS: string[] = [\n '#3987e5', // blue\n '#d95926', // orange\n '#199e70', // aqua\n '#c98500', // yellow\n '#d55181', // magenta\n '#008300', // green\n '#9085e9', // violet\n '#e66767', // red\n];\n\n// Neutral for series past the palette's end (\"Other\") — folding beats cycling,\n// which would hand two series one hue.\nexport const SERIES_OVERFLOW_COLOR = '#707078';\n\n// seriesColor answers \"what color is series i\" under the style's palette:\n// the indexed slot, or the overflow neutral once slots run out. Consumers\n// (legends, chips) use this to stay in step with the charts.\nexport const seriesColor = (i: number, style?: Partial<ChartStyle> | null): string => {\n const s = withStyleDefaults(style);\n const palette = s.seriesColors.length ? s.seriesColors : DEFAULT_SERIES_COLORS;\n return i < palette.length ? palette[i] : SERIES_OVERFLOW_COLOR;\n};\n\n// chartSizing resolves the frame each view renders into: a fixed height when\n// the style sets one (else fill-parent with the historical 160px floor), and\n// the style's margin merged over the view's default.\nexport const chartSizing = (\n style: Partial<ChartStyle> | null | undefined,\n defaultMargin: ChartMargin,\n): { frameClass: string; frameStyle: { height?: number }; margin: ChartMargin } => {\n const s = withStyleDefaults(style);\n return {\n frameClass: s.height > 0 ? 'w-full' : 'h-full w-full min-h-[160px]',\n frameStyle: s.height > 0 ? { height: s.height } : {},\n margin: { ...defaultMargin, ...(s.margin || {}) },\n };\n};\n\n// thinTicks picks at most `max` evenly-spaced values (first and last always\n// kept) for a point-scale axis's tickValues. undefined ⇒ let the chart label\n// every point (max 0, or few enough points already).\nexport function thinTicks<T>(values: T[], max: number): T[] | undefined {\n if (max <= 0 || values.length <= max) return undefined;\n if (max === 1) return [values[values.length - 1]];\n const picked: T[] = [];\n for (let i = 0; i < max; i++) {\n picked.push(values[Math.round((i * (values.length - 1)) / (max - 1))]);\n }\n return [...new Set(picked)];\n}\n\nexport const LEGEND_ANCHORS: LegendAnchor[] = ['right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none'];\n\n// Merge a partial style over the defaults (safe for undefined/null).\nexport const withStyleDefaults = (style?: Partial<ChartStyle> | null): ChartStyle => ({\n ...DEFAULT_CHART_STYLE,\n ...(style || {}),\n});\n\n// Build a Nivo `theme` object from a style.\nexport const buildNivoTheme = (style?: Partial<ChartStyle> | null) => {\n const s = withStyleDefaults(style);\n return {\n background: s.background,\n text: { fill: s.textColor, fontSize: s.fontSize },\n axis: {\n ticks: { text: { fill: s.textColor, fontSize: s.fontSize } },\n legend: {\n text: {\n fill: s.legendColor,\n fontSize: s.fontSize + 2,\n fontWeight: s.legendBold ? 700 : 400,\n // A highlight is drawn as a text outline (halo) — the clean,\n // SVG-native way to make an axis title stand out.\n outlineWidth: s.legendHighlight ? 3 : 0,\n outlineColor: s.legendHighlight || 'transparent',\n },\n },\n },\n grid: { line: { stroke: s.gridColor } },\n crosshair: { line: { stroke: s.textColor, strokeDasharray: '6 6' } },\n labels: { text: { fontSize: s.fontSize } },\n legends: { text: { fill: s.textColor, fontSize: s.fontSize } },\n tooltip: { container: { background: s.tooltipBg, color: s.tooltipColor, border: '1px solid #334155' } },\n };\n};\n\n// Series-legend config (Nivo `legends` entry) for charts that have a discrete\n// legend (pie, grouped bar). Returns null when the legend is hidden.\nexport const legendConfig = (style?: Partial<ChartStyle> | null) => {\n const s = withStyleDefaults(style);\n if (s.legendAnchor === 'none') return null;\n const base = {\n anchor: s.legendAnchor,\n direction: 'column' as const,\n itemWidth: 90,\n itemHeight: 18,\n itemsSpacing: 2,\n symbolSize: 10,\n symbolShape: 'circle' as const,\n itemTextColor: s.textColor,\n };\n if (s.legendAnchor === 'right') {\n // Outside the plot on the right (charts reserve right margin for this).\n return { ...base, translateX: 100 };\n }\n // Corner-anchored, inset inside the plot area.\n const tx = s.legendAnchor.includes('left') ? 10 : -10;\n const ty = s.legendAnchor.includes('top') ? 10 : -10;\n return { ...base, translateX: tx, translateY: ty };\n};\n\n// Truncate a tick label to n chars with an ellipsis (overflow handling).\nconst truncate = (v: unknown, n: number): string => {\n const str = String(v);\n return n > 0 && str.length > n ? `${str.slice(0, n)}…` : str;\n};\n\n// Axis props for a given axis ('x' | 'y'): the title (custom text or the column\n// name, hidden when its legend is toggled off), plus tick rotation/format so\n// long or numeric tick labels don't overflow. `numeric` ⇒ thousands-format the\n// ticks (value axes); otherwise long categorical labels are truncated.\nexport const axisLegend = (\n style: Partial<ChartStyle> | null | undefined,\n axis: 'x' | 'y',\n columnName: string,\n opts: { numeric?: boolean } = {},\n) => {\n const s = withStyleDefaults(style);\n const isX = axis === 'x';\n const show = isX ? s.showXLegend : s.showYLegend;\n const label = (isX ? s.xAxisLabel : s.yAxisLabel) || columnName;\n\n const out: Record<string, unknown> = {};\n if (show && label) {\n out.legend = label;\n out.legendPosition = isX ? s.xLegendPosition : s.yLegendPosition;\n out.legendOffset = isX ? s.xLegendOffset : s.yLegendOffset;\n }\n out.tickRotation = isX ? s.xTickRotation : s.yTickRotation;\n if (opts.numeric) out.format = (v: unknown) => Number(v).toLocaleString();\n else if (s.tickTruncate > 0) out.format = (v: unknown) => truncate(v, s.tickTruncate);\n return out;\n};\n","// dataShape — pure client-side grouping/aggregation helpers used by the chart\n// views when they aggregate records locally (the fallback path; the primary path\n// is server/WASM SQL via sqlgen).\n\nimport type { Row } from './sqlgen';\n\nexport type AggFn = 'count' | 'distinct' | 'sum' | 'avg' | 'min' | 'max' | 'median';\n\n// Group records by the string value of a column.\nexport const groupBy = (records: Row[], column: string): Record<string, Row[]> => {\n const groups: Record<string, Row[]> = {};\n for (const rec of records) {\n const key = String(rec[column] ?? '(null)');\n if (!groups[key]) groups[key] = [];\n groups[key].push(rec);\n }\n return groups;\n};\n\n// Aggregate a column over a set of records.\nexport const aggregate = (records: Row[], column: string, fn: AggFn | string): number => {\n const values = records.map((r) => r[column]).filter((v) => v != null);\n switch (fn) {\n case 'count': return records.length;\n case 'distinct': return new Set(values.map(String)).size;\n case 'sum': return values.reduce((a: number, b) => a + Number(b), 0);\n case 'avg': return values.length ? values.reduce((a: number, b) => a + Number(b), 0) / values.length : 0;\n case 'min': return Math.min(...values.map(Number));\n case 'max': return Math.max(...values.map(Number));\n case 'median': {\n const nums = values.map(Number).filter((v) => !Number.isNaN(v)).sort((a, b) => a - b);\n if (!nums.length) return 0;\n const mid = Math.floor(nums.length / 2);\n return nums.length % 2 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;\n }\n default: return records.length;\n }\n};\n","// heatmapColor — the heatmap's color engine (pure; no nivo, no React).\n//\n// Cell color = cmap(method(colorValue, within = scope)):\n// scope — which cells share a color domain: global | row | column | block\n// method — how a value maps to [0,1] inside its scope:\n// linear (min→max position) or rank (Hazen percentile — robust to\n// outliers, spreads color evenly across clumpy distributions)\n//\n// nivo's built-in scales normalize globally, so they cannot express these\n// scopes; the view precomputes each cell's t ∈ [0,1] here and hands nivo a\n// colors FUNCTION. Margins always normalize within their own partition (row\n// margins together, column margins together), never folded into the body.\n\nimport { interpolateRdYlGn } from 'd3-scale-chromatic';\n\nexport type HeatStat = 'count' | 'sum' | 'avg' | 'min' | 'max' | 'median';\nexport type ColorScope = 'global' | 'row' | 'column' | 'block';\nexport type ColorMethod = 'linear' | 'rank';\n\nexport const HEAT_STATS: HeatStat[] = ['count', 'sum', 'avg', 'min', 'max', 'median'];\n\n// One body cell (or margin cell) to be colored. `block` is only consulted when\n// scope = block (cells with the same block value share a domain).\nexport interface HeatCell {\n row: string;\n col: string;\n colorValue: number;\n block?: string;\n}\n\nexport interface ColorOptions {\n scope?: ColorScope;\n method?: ColorMethod;\n // Fixed domain override for cross-chart comparability (linear method only —\n // rank is magnitude-free by construction).\n vmin?: number;\n vmax?: number;\n}\n\nexport const cellKey = (row: string, col: string): string => `${row}\u0000${col}`;\n\n// Normalize one partition's values to t ∈ [0,1] by method.\nconst normalizePartition = (\n cells: HeatCell[],\n method: ColorMethod,\n vmin?: number,\n vmax?: number,\n): Map<string, number> => {\n const out = new Map<string, number>();\n const values = cells.map((c) => c.colorValue).filter((v) => Number.isFinite(v));\n if (!values.length) return out;\n\n if (method === 'rank') {\n // Hazen percentile: (below + 0.5·ties) / n — ties share one t, and a\n // single-value partition lands mid-scale instead of an extreme.\n const sorted = [...values].sort((a, b) => a - b);\n for (const c of cells) {\n const below = sorted.findIndex((v) => v >= c.colorValue);\n const ties = sorted.filter((v) => v === c.colorValue).length;\n out.set(cellKey(c.row, c.col), (below + 0.5 * ties) / sorted.length);\n }\n return out;\n }\n\n // linear: position across [lo, hi] (fixed override wins), clamped.\n const lo = vmin ?? Math.min(...values);\n const hi = vmax ?? Math.max(...values);\n for (const c of cells) {\n const t = hi === lo ? 0.5 : (c.colorValue - lo) / (hi - lo);\n out.set(cellKey(c.row, c.col), Math.max(0, Math.min(1, t)));\n }\n return out;\n};\n\n// Partition body cells by scope, normalize each partition independently, and\n// return cellKey → t. block scope without block values degrades to global.\nexport const normalizeCells = (\n cells: HeatCell[],\n { scope = 'global', method = 'linear', vmin, vmax }: ColorOptions = {},\n): Map<string, number> => {\n const partitions = new Map<string, HeatCell[]>();\n const partOf = (c: HeatCell): string => {\n switch (scope) {\n case 'row': return `r:${c.row}`;\n case 'column': return `c:${c.col}`;\n case 'block': return c.block != null ? `b:${c.block}` : 'global';\n default: return 'global';\n }\n };\n for (const c of cells) {\n const k = partOf(c);\n const part = partitions.get(k);\n if (part) part.push(c);\n else partitions.set(k, [c]);\n }\n const out = new Map<string, number>();\n for (const part of partitions.values()) {\n for (const [k, t] of normalizePartition(part, method, vmin, vmax)) out.set(k, t);\n }\n return out;\n};\n\n// Default colormap: RdYlGn — red = low → green = high.\nexport const heatColor = (t: number): string => interpolateRdYlGn(Math.max(0, Math.min(1, t)));\n\n// Cell-label color auto-contrasts on the cell's color: RdYlGn extremes are\n// dark (white text), the mid yellows are light (dark text). Computed from the\n// actual interpolated color's relative luminance, not the t value.\nexport const heatLabelColor = (t: number): string => {\n const m = heatColor(t).match(/\\d+/g);\n if (!m) return '#0f172a';\n const [r, g, b] = m.map(Number);\n const lum = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per-channel weights, 0–255\n return lum > 140 ? '#0f172a' : '#f8fafc';\n};\n","import { useMemo } from 'react';\n\nimport { aggregate } from '../../dataShape';\nimport type { Row } from '../../sqlgen';\n\nexport interface MetricConfig {\n column: string;\n agg?: string;\n label?: string;\n}\n\nexport interface MetricViewProps {\n records?: Row[];\n config: MetricConfig;\n /** Pre-computed value bypasses client-side aggregation. */\n value?: number | string | null;\n}\n\n/** Single-number metric card. Shows a big number with a label. */\nexport function MetricView({ records, config, value: presetValue }: MetricViewProps) {\n const value = useMemo(() => {\n if (presetValue != null) return presetValue;\n if (!records?.length) return 0;\n return aggregate(records, config.column, config.agg || 'count');\n }, [records, config, presetValue]);\n\n const formatted = typeof value === 'number'\n ? value.toLocaleString(undefined, { maximumFractionDigits: 2 })\n : value;\n\n return (\n <div className=\"h-full flex flex-col items-center justify-center\">\n <div className=\"text-4xl font-mono text-midnight-accent\">{formatted}</div>\n <div className=\"text-sm text-midnight-text-muted mt-2\">{config.label || `${config.agg}(${config.column})`}</div>\n </div>\n );\n}\n\nexport default MetricView;\n","export interface InsightConfig {\n text?: string;\n}\n\nexport interface InsightViewProps {\n config: InsightConfig;\n}\n\n/** Text insight card rendered from AI analysis. */\nexport function InsightView({ config }: InsightViewProps) {\n return (\n <div className=\"h-full p-4 overflow-auto\">\n <p className=\"text-sm text-midnight-text-body leading-relaxed whitespace-pre-wrap\">\n {config.text}\n </p>\n </div>\n );\n}\n\nexport default InsightView;\n","// axis.tsx — one shared builder for a Nivo axis (bottom / left) from a ChartStyle.\n//\n// Centralizes axis-title text/visibility, tick rotation (x AND y), truncation,\n// and multi-line WRAPPING (default on — wrapping reads better than rotation for\n// long categorical labels). Every view uses makeAxis so behaviour is identical\n// across bar / line / scatter / grouped-bar (this also fixes the y-tick angle,\n// which the grouped-bar view previously ignored).\n\nimport type { ReactNode } from 'react';\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\n\ntype Axis = 'x' | 'y';\n\ninterface AxisOpts {\n numeric?: boolean; // value axes → thousands-format the ticks\n}\n\n// Format a tick value to a display string: numeric → locale, then truncate.\nfunction formatVal(value: unknown, s: ChartStyle, numeric: boolean): string {\n let str = numeric ? Number(value).toLocaleString() : String(value);\n if (s.tickTruncate > 0 && str.length > s.tickTruncate) str = `${str.slice(0, s.tickTruncate)}…`;\n return str;\n}\n\n// Wrap a string into lines of at most `width` chars, breaking on spaces where\n// possible (hard-splitting an over-long single token). Caps at 4 lines.\nfunction wrapText(str: string, width: number): string[] {\n if (width <= 0 || str.length <= width) return [str];\n const words = str.split(/\\s+/);\n const lines: string[] = [];\n let cur = '';\n const push = (t: string) => { if (t) lines.push(t); };\n for (const w of words) {\n if (w.length > width) {\n push(cur); cur = '';\n for (let i = 0; i < w.length; i += width) lines.push(w.slice(i, i + width));\n continue;\n }\n if (!cur) cur = w;\n else if (cur.length + 1 + w.length <= width) cur += ` ${w}`;\n else { push(cur); cur = w; }\n }\n push(cur);\n if (lines.length > 4) {\n const kept = lines.slice(0, 4);\n kept[3] = `${kept[3].slice(0, Math.max(0, width - 1))}…`;\n return kept;\n }\n return lines;\n}\n\n// Build the full Nivo axis object for the given axis from a style. Returns `any`\n// for friction-free interop with each chart's axis-prop type (the views differ).\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function makeAxis(style: Partial<ChartStyle> | null | undefined, axis: Axis, columnName: string, opts: AxisOpts = {}): any {\n const s = withStyleDefaults(style);\n const isX = axis === 'x';\n const numeric = !!opts.numeric;\n const show = isX ? s.showXLegend : s.showYLegend;\n const label = (isX ? s.xAxisLabel : s.yAxisLabel) || columnName;\n const rotate = isX ? s.xTickRotation : s.yTickRotation;\n\n const out: Record<string, unknown> = { tickSize: 5, tickPadding: 5 };\n if (show && label) {\n out.legend = label;\n out.legendPosition = isX ? s.xLegendPosition : s.yLegendPosition;\n out.legendOffset = isX ? s.xLegendOffset : s.yLegendOffset;\n }\n\n if (s.tickWrap) {\n // Custom tick: format → wrap into <tspan> lines → rotate. (Nivo SVG text\n // can't wrap on its own.)\n out.renderTick = (tick: {\n x: number; y: number; value: unknown; textX: number; textY: number;\n textAnchor: string; textBaseline: string;\n }): ReactNode => {\n const lines = wrapText(formatVal(tick.value, s, numeric), s.tickWrapWidth);\n const firstDy = isX ? '0' : `${-((lines.length - 1) * 0.55)}em`;\n return (\n <g transform={`translate(${tick.x},${tick.y})`}>\n <line x2={isX ? 0 : -5} y2={isX ? 5 : 0} style={{ stroke: s.textColor, strokeWidth: 1, opacity: 0.3 }} />\n <text\n transform={`translate(${tick.textX},${tick.textY}) rotate(${rotate})`}\n textAnchor={tick.textAnchor as never}\n dominantBaseline={tick.textBaseline as never}\n style={{ fill: s.textColor, fontSize: s.fontSize }}\n >\n {lines.map((ln, i) => (\n <tspan key={i} x={0} dy={i === 0 ? firstDy : '1.1em'}>{ln}</tspan>\n ))}\n </text>\n </g>\n );\n };\n } else {\n out.tickRotation = rotate;\n out.format = (v: unknown) => formatVal(v, s, numeric);\n }\n\n // Numeric axes: honor the tick cap as Nivo's tick-count hint (point/band\n // axes instead take an explicit tickValues subset from the view).\n const maxTicks = isX ? s.maxXTicks : s.maxYTicks;\n if (numeric && maxTicks > 0) out.tickValues = maxTicks;\n return out;\n}\n","import { useMemo } from 'react';\nimport { ResponsiveBar } from '@nivo/bar';\n\nimport { groupBy, aggregate } from '../../dataShape';\nimport { buildNivoTheme, chartSizing, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport { makeAxis } from '../axis';\nimport type { Row } from '../../sqlgen';\n\nexport interface BarDatum {\n group: string;\n value: number;\n}\n\nexport interface BarViewProps {\n records?: Row[];\n groupColumn: string;\n valueColumn: string;\n aggFn?: string;\n /** Pre-aggregated [{group, value}] bypasses client-side aggregation. */\n data?: BarDatum[];\n /** 'horizontal' lays categories on the y axis — the readable form for\n * many bars with long names (labels never collide). Default vertical. */\n layout?: 'vertical' | 'horizontal';\n style?: Partial<ChartStyle>;\n}\n\nexport function BarView({ records, groupColumn, valueColumn, aggFn = 'count', data: presetData, layout = 'vertical', style }: BarViewProps) {\n const computed = useMemo<BarDatum[]>(() => {\n if (presetData || !records) return [];\n const groups = groupBy(records, groupColumn);\n return Object.entries(groups)\n .map(([key, recs]) => ({ group: key, value: aggregate(recs, valueColumn, aggFn) }))\n .sort((a, b) => b.value - a.value)\n .slice(0, 50);\n }, [records, groupColumn, valueColumn, aggFn, presetData]);\n const data = presetData || computed;\n\n const s = withStyleDefaults(style);\n const { frameClass, frameStyle, margin } = chartSizing(style, { top: 20, right: 20, bottom: 60, left: 60 });\n\n // Horizontal swaps the axes' jobs: values along the bottom (numeric),\n // category names down the left. Horizontal data is reversed so the\n // largest bar renders at the TOP (Nivo draws the first datum bottom-up).\n const horizontal = layout === 'horizontal';\n const plotted = horizontal ? [...data].reverse() : data;\n const axisBottom = horizontal\n ? makeAxis(style, 'x', valueColumn, { numeric: true })\n : makeAxis(style, 'x', groupColumn);\n const axisLeft = horizontal\n ? makeAxis(style, 'y', groupColumn)\n : makeAxis(style, 'y', valueColumn, { numeric: true });\n\n return (\n <div className={frameClass} style={frameStyle}>\n <ResponsiveBar\n data={plotted as never}\n keys={['value']}\n indexBy=\"group\"\n layout={layout}\n margin={margin}\n padding={0.3}\n colors={[s.seriesColors[0] || 'rgba(74, 222, 128, 0.8)']}\n borderColor={{ from: 'color', modifiers: [['darker', 1.6]] } as never}\n axisBottom={axisBottom}\n axisLeft={axisLeft}\n enableLabel={s.barLabels}\n labelSkipWidth={12}\n labelSkipHeight={12}\n labelTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default BarView;\n","import { useMemo } from 'react';\nimport { ResponsivePie } from '@nivo/pie';\n\nimport { groupBy } from '../../dataShape';\nimport { buildNivoTheme, chartSizing, seriesColor, legendConfig, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport type { Row } from '../../sqlgen';\n\nexport interface PieDatum {\n id: string;\n label: string;\n value: number;\n}\n\nexport interface PieViewProps {\n records?: Row[];\n groupColumn: string;\n /** Pre-aggregated [{id, label, value}] bypasses client-side aggregation. */\n data?: PieDatum[];\n style?: Partial<ChartStyle>;\n}\n\nexport function PieView({ records, groupColumn, data: presetData, style }: PieViewProps) {\n const computed = useMemo<PieDatum[]>(() => {\n if (presetData || !records) return [];\n const groups = groupBy(records, groupColumn);\n const sorted = Object.entries(groups).sort((a, b) => b[1].length - a[1].length);\n const top = sorted.slice(0, 12);\n const otherCount = sorted.slice(12).reduce((sum, [, recs]) => sum + recs.length, 0);\n const result: PieDatum[] = top.map(([key, recs]) => ({ id: key, label: key, value: recs.length }));\n if (otherCount > 0) result.push({ id: '(other)', label: '(other)', value: otherCount });\n return result;\n }, [records, groupColumn, presetData]);\n const data = presetData || computed;\n\n const legend = legendConfig(style);\n const s = withStyleDefaults(style);\n const { frameClass, frameStyle, margin } = chartSizing(style, { top: 20, right: 120, bottom: 20, left: 20 });\n\n // Slices carry identity → the fixed-order categorical palette, assigned by\n // slice index ('(other)' lands on the overflow neutral past the palette).\n const colorById = new Map(data.map((d, i) => [d.id, seriesColor(i, s)]));\n\n return (\n <div className={frameClass} style={frameStyle}>\n <ResponsivePie\n data={data as never}\n margin={margin}\n innerRadius={0.4}\n padAngle={1}\n cornerRadius={3}\n activeOuterRadiusOffset={8}\n colors={((d: { id: string }) => colorById.get(d.id)) as never}\n borderWidth={1}\n borderColor={{ from: 'color', modifiers: [['darker', 0.2]] } as never}\n arcLinkLabelsSkipAngle={10}\n arcLinkLabelsTextColor=\"#94a3b8\"\n arcLinkLabelsColor={{ from: 'color' }}\n arcLabelsSkipAngle={10}\n arcLabelsTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n legends={legend ? [legend as never] : []}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default PieView;\n","import { useMemo } from 'react';\nimport { ResponsiveLine } from '@nivo/line';\n\nimport { buildNivoTheme, chartSizing, seriesColor, thinTicks, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport { makeAxis } from '../axis';\nimport type { Row } from '../../sqlgen';\n\nexport interface LineSerie {\n id: string;\n data: { x: string; y: number }[];\n}\n\nexport interface LineViewProps {\n records?: Row[];\n xColumn: string;\n yColumn: string;\n /** Pre-shaped Nivo line series bypasses client-side processing. */\n data?: LineSerie[];\n /** Serie ids to draw dotted — the aggregate-vs-individual distinction\n * (an average line reads as derived, a member line as observed). */\n dashedIds?: string[];\n style?: Partial<ChartStyle>;\n}\n\n// Line layer datum shape Nivo hands custom layers (typed loosely on purpose —\n// only the fields the dashed layer touches).\ninterface LayerSerie {\n id: string | number;\n color: string;\n data: { position: { x: number | null; y: number | null } }[];\n}\n\nexport function LineView({ records, xColumn, yColumn, data: presetData, dashedIds, style }: LineViewProps) {\n const computed = useMemo<LineSerie[]>(() => {\n if (presetData || !records) return [];\n const sorted = [...records]\n .filter((r) => r[xColumn] != null && r[yColumn] != null)\n .sort((a, b) => {\n const av = a[xColumn] as never;\n const bv = b[xColumn] as never;\n return av < bv ? -1 : av > bv ? 1 : 0;\n })\n .slice(0, 500);\n\n return [{\n id: yColumn,\n data: sorted.map((r) => ({ x: String(r[xColumn]), y: Number(r[yColumn]) || 0 })),\n }];\n }, [records, xColumn, yColumn, presetData]);\n const data = presetData || computed;\n\n const s = withStyleDefaults(style);\n const { frameClass, frameStyle, margin } = chartSizing(style, { top: 20, right: 20, bottom: 60, left: 60 });\n\n // One serie keeps the historical single-hue look; several series take the\n // fixed-order categorical palette (identical hues were unreadable). The\n // serie→color map is by INDEX in the data, so a consumer using\n // seriesColor() for its legend/chips stays in step.\n const colorById = new Map(data.map((serie, i) => [\n serie.id,\n s.seriesColors.length || data.length > 1 ? seriesColor(i, s) : 'rgba(96, 165, 250, 0.9)',\n ]));\n\n // Point x-scales label every point — thin to the style's cap (the ticks\n // must be a subset of the x values, so compute from the longest serie).\n const longest = data.reduce((a, b) => (b.data.length > a.data.length ? b : a), { id: '', data: [] as LineSerie['data'] });\n const tickValues = thinTicks(longest.data.map((d) => d.x), s.maxXTicks);\n\n // Dotted series need a custom lines layer (Nivo has no per-serie dash).\n const dashed = new Set(dashedIds || []);\n const linesLayer = ({ series, lineGenerator }: { series: LayerSerie[]; lineGenerator: (pts: unknown) => string }) => (\n <>\n {series.map((serie) => (\n <path\n key={serie.id}\n d={lineGenerator(serie.data.map((d) => d.position))}\n fill=\"none\"\n stroke={serie.color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={dashed.has(String(serie.id)) ? '1 5' : undefined}\n />\n ))}\n </>\n );\n\n return (\n <div className={frameClass} style={frameStyle}>\n <ResponsiveLine\n data={data as never}\n margin={margin}\n xScale={{ type: 'point' }}\n yScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n curve=\"monotoneX\"\n enableArea={s.areaOpacity > 0}\n areaOpacity={s.areaOpacity}\n colors={((serie: LineSerie) => colorById.get(serie.id)) as never}\n pointSize={0}\n pointColor={{ theme: 'background' }}\n pointBorderWidth={2}\n pointBorderColor={{ from: 'serieColor' }}\n enableGridX={false}\n axisBottom={{ ...makeAxis(style, 'x', xColumn), ...(tickValues ? { tickValues } : {}) }}\n axisLeft={makeAxis(style, 'y', yColumn, { numeric: true })}\n useMesh={true}\n layers={['grid', 'markers', 'axes', 'areas', linesLayer, 'crosshair', 'slices', 'mesh', 'legends'] as never}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default LineView;\n","import { useId } from 'react';\n\n// SparklineView — a dependency-free inline trend mark: a single numeric\n// series as a 2px line over a soft gradient area, no axes, no ticks, no\n// tooltip. For the \"shape at a glance\" slot (status bars, stat tiles);\n// anything that needs values, comparison, or hover belongs in LineView.\n\nexport interface SparklineViewProps {\n /** The series, oldest first. */\n data: number[];\n /** Viewbox height in px (the svg scales to its container's width). */\n height?: number;\n /** Line + area hue. */\n color?: string;\n}\n\nexport function SparklineView({ data, height = 56, color = '#3987e5' }: SparklineViewProps) {\n // useId keeps gradient defs distinct when several sparklines share a page.\n const gradientId = useId();\n const width = 260; // viewBox width; preserveAspectRatio scales it away\n const pts = data && data.length ? data : [0];\n const max = Math.max(...pts, 1);\n const dx = pts.length > 1 ? width / (pts.length - 1) : width;\n const xy = (v: number, i: number): [number, number] => [i * dx, height - (v / max) * (height - 4) - 2];\n const line = pts.map((v, i) => `${i === 0 ? 'M' : 'L'} ${xy(v, i)[0].toFixed(1)} ${xy(v, i)[1].toFixed(1)}`).join(' ');\n const area = `${line} L ${width} ${height} L 0 ${height} Z`;\n\n return (\n <svg viewBox={`0 0 ${width} ${height}`} height={height} className=\"w-full\" preserveAspectRatio=\"none\">\n <defs>\n <linearGradient id={gradientId} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity=\"0.25\" />\n <stop offset=\"100%\" stopColor={color} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill={`url(#${gradientId})`} />\n <path d={line} fill=\"none\" stroke={color} strokeWidth=\"2\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n );\n}\n\nexport default SparklineView;\n","import { useMemo } from 'react';\nimport { ResponsiveScatterPlot } from '@nivo/scatterplot';\n\nimport { buildNivoTheme, chartSizing, seriesColor, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport { makeAxis } from '../axis';\nimport type { Row } from '../../sqlgen';\n\nexport interface ScatterSerie {\n id: string;\n data: { x: number; y: number }[];\n}\n\nexport interface ScatterViewProps {\n records?: Row[];\n xColumn: string;\n yColumn: string;\n /** Pre-shaped Nivo scatter series bypasses client-side processing. */\n data?: ScatterSerie[];\n style?: Partial<ChartStyle>;\n}\n\nexport function ScatterView({ records, xColumn, yColumn, data: presetData, style }: ScatterViewProps) {\n const computed = useMemo<ScatterSerie[]>(() => {\n if (presetData || !records) return [];\n // Scatter axes are both numeric (linear scales). Coerce, then DROP any\n // point whose x or y isn't a finite number — coercing non-numeric cells\n // to 0 (the old behaviour) collapsed them onto the origin/axes and\n // produced a misleading plot.\n const points = records\n .map((r) => ({ x: Number(r[xColumn]), y: Number(r[yColumn]) }))\n .filter((p) => Number.isFinite(p.x) && Number.isFinite(p.y))\n .slice(0, 1000);\n\n return [{ id: `${xColumn} vs ${yColumn}`, data: points }];\n }, [records, xColumn, yColumn, presetData]);\n const data = presetData || computed;\n\n const s = withStyleDefaults(style);\n const { frameClass, frameStyle, margin } = chartSizing(style, { top: 20, right: 20, bottom: 60, left: 60 });\n\n // One serie keeps the historical hue; several take the categorical palette\n // by serie index (scatter is an all-pairs form — keep series counts low).\n const colorById = new Map(data.map((serie, i) => [\n serie.id,\n s.seriesColors.length || data.length > 1 ? seriesColor(i, s) : 'rgba(167, 139, 250, 0.7)',\n ]));\n\n return (\n <div className={frameClass} style={frameStyle}>\n <ResponsiveScatterPlot\n data={data as never}\n margin={margin}\n xScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n yScale={{ type: 'linear', min: 'auto', max: 'auto' }}\n colors={((serie: { serieId?: string; id?: string }) => colorById.get(serie.serieId ?? serie.id ?? '')) as never}\n nodeSize={6}\n axisBottom={makeAxis(style, 'x', xColumn, { numeric: true })}\n axisLeft={makeAxis(style, 'y', yColumn, { numeric: true })}\n useMesh={true}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default ScatterView;\n","import { useMemo } from 'react';\nimport { ResponsiveHeatMap } from '@nivo/heatmap';\n\nimport { groupBy, aggregate } from '../../dataShape';\nimport { buildNivoTheme, chartSizing, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport type { Row } from '../../sqlgen';\n\nconst MAX_AXIS = 30;\n\nexport interface HeatmapSerie {\n id: string;\n data: { x: string; y: number }[];\n}\n\ntype AxisOrder = 'alpha' | 'total-asc' | 'total-desc';\n\n// Reduce a list of cell values to a single marginal (row/column total).\nconst reduceVals = (vals: number[], agg: string): number => {\n const nums = vals.map(Number).filter((v) => !Number.isNaN(v));\n switch (agg) {\n case 'avg': return nums.length ? nums.reduce((a, b) => a + b, 0) / nums.length : 0;\n case 'min': return nums.length ? Math.min(...nums) : 0;\n case 'max': return nums.length ? Math.max(...nums) : 0;\n case 'count': return vals.length;\n case 'sum':\n default: return nums.reduce((a, b) => a + b, 0);\n }\n};\n\nconst fmtNum = (n: number): string => {\n if (typeof n !== 'number' || Number.isNaN(n)) return '';\n return Number.isInteger(n) ? n.toLocaleString() : n.toLocaleString(undefined, { maximumFractionDigits: 2 });\n};\n\n// Order a list of ids: alphabetical, or by a marginal value (asc/desc).\nconst orderIds = (ids: string[], marginals: Record<string, number>, order: AxisOrder): string[] => {\n const sorted = [...ids];\n if (order === 'total-desc') sorted.sort((a, b) => (marginals[b] || 0) - (marginals[a] || 0));\n else if (order === 'total-asc') sorted.sort((a, b) => (marginals[a] || 0) - (marginals[b] || 0));\n else sorted.sort();\n return sorted;\n};\n\nexport interface HeatmapViewProps {\n records?: Row[];\n rowColumn: string;\n colColumn: string;\n valueColumn?: string;\n aggFn?: string;\n data?: HeatmapSerie[];\n rowOrder?: AxisOrder;\n colOrder?: AxisOrder;\n marginAgg?: string;\n showTotals?: boolean;\n style?: Partial<ChartStyle>;\n}\n\n/**\n * HeatmapView builds a cross-tabulation heatmap (confusion / pairwise matrix).\n * rowColumn values become rows, colColumn values become columns; the cell value\n * is aggFn over valueColumn (or a record count when no valueColumn).\n */\nexport function HeatmapView({\n records, rowColumn, colColumn, valueColumn, aggFn = 'count', data: presetData,\n rowOrder = 'alpha', colOrder = 'alpha', marginAgg = 'sum', showTotals = false, style,\n}: HeatmapViewProps) {\n const s = withStyleDefaults(style);\n\n // 1. Build the base (unordered, uncapped) series from records or preset data.\n const base = useMemo<HeatmapSerie[]>(() => {\n if (presetData) return presetData;\n if (!records) return [];\n const rowGroups = groupBy(records, rowColumn);\n const colValues = [...new Set(records.map((r) => String(r[colColumn] ?? '(null)')))];\n const fn = valueColumn ? aggFn : 'count';\n return Object.keys(rowGroups).map((rowVal) => ({\n id: rowVal,\n data: colValues.map((colVal) => {\n const cellRecords = rowGroups[rowVal]?.filter((r) => String(r[colColumn] ?? '(null)') === colVal) || [];\n return { x: colVal, y: cellRecords.length && valueColumn ? aggregate(cellRecords, valueColumn, fn) : cellRecords.length };\n }),\n }));\n }, [records, rowColumn, colColumn, valueColumn, aggFn, presetData]);\n\n // 2. Order + cap rows and columns by marginal totals, and compute the totals.\n const { data, rowTotals, colTotals } = useMemo(() => {\n if (!base.length) return { data: [] as HeatmapSerie[], rowTotals: {} as Record<string, number>, colTotals: {} as Record<string, number> };\n\n const cell: Record<string, Record<string, number>> = {};\n const colIdSet: string[] = [];\n for (const row of base) {\n cell[row.id] = {};\n for (const d of row.data) {\n cell[row.id][d.x] = Number(d.y) || 0;\n if (!colIdSet.includes(d.x)) colIdSet.push(d.x);\n }\n }\n const rowIds = base.map((r) => r.id);\n\n const rowMarg: Record<string, number> = {};\n rowIds.forEach((rid) => { rowMarg[rid] = reduceVals(colIdSet.map((cid) => cell[rid][cid] ?? 0), marginAgg); });\n const colMarg: Record<string, number> = {};\n colIdSet.forEach((cid) => { colMarg[cid] = reduceVals(rowIds.map((rid) => cell[rid][cid] ?? 0), marginAgg); });\n\n const orderedRows = orderIds(rowIds, rowMarg, rowOrder).slice(0, MAX_AXIS);\n const orderedCols = orderIds(colIdSet, colMarg, colOrder).slice(0, MAX_AXIS);\n\n const shaped: HeatmapSerie[] = orderedRows.map((rid) => ({\n id: rid,\n data: orderedCols.map((cid) => ({ x: cid, y: cell[rid][cid] ?? 0 })),\n }));\n return { data: shaped, rowTotals: rowMarg, colTotals: colMarg };\n }, [base, rowOrder, colOrder, marginAgg]);\n\n if (!data.length || !data[0].data.length) {\n return <div className=\"p-8 text-center text-midnight-text-muted\">Not enough distinct values for a heatmap</div>;\n }\n\n const { frameClass, frameStyle, margin } = chartSizing(style, showTotals\n ? { top: 60, right: 70, bottom: 60, left: 100 }\n : { top: 60, right: 20, bottom: 20, left: 100 });\n\n return (\n <div className={frameClass} style={frameStyle}>\n <ResponsiveHeatMap\n data={data as never}\n margin={margin}\n axisTop={{ tickSize: 5, tickPadding: 5, tickRotation: s.xTickRotation, legend: s.showXLegend ? (s.xAxisLabel || colColumn) : '', legendPosition: s.xLegendPosition, legendOffset: -50 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, legend: s.showYLegend ? (s.yAxisLabel || rowColumn) : '', legendPosition: s.yLegendPosition, legendOffset: -80 }}\n axisRight={showTotals ? { tickSize: 5, tickPadding: 5, format: (id) => fmtNum(rowTotals[id as string]), legend: `${marginAgg} ▸`, legendOffset: 60 } : null}\n axisBottom={showTotals ? { tickSize: 5, tickPadding: 5, tickRotation: -35, format: (id) => fmtNum(colTotals[id as string]) } : null}\n colors={{ type: 'sequential', scheme: 'blue_green', minValue: 0 }}\n emptyColor=\"#1e293b\"\n borderWidth={1}\n borderColor=\"#334155\"\n labelTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n hoverTarget=\"cell\"\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default HeatmapView;\n","import { useMemo } from 'react';\nimport { ResponsiveHeatMap } from '@nivo/heatmap';\n\nimport { groupBy, aggregate } from '../../dataShape';\nimport { buildNivoTheme, chartSizing, withStyleDefaults } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\nimport type { Row } from '../../sqlgen';\nimport {\n normalizeCells, heatColor, heatLabelColor, cellKey,\n type HeatStat, type ColorScope, type ColorMethod, type HeatCell,\n} from '../../heatmapColor';\n\nconst MAX_AXIS = 30;\nconst TOTAL_ID = 'Σ';\nconst NULL = '(null)';\n\n// One cell's two stat values (label vs color), plus an optional block tag.\ninterface CellStat { lv: number; cv: number; block?: string }\ntype Stats = Record<string, Record<string, CellStat>>; // [row][col]\ntype Margin = Record<string, CellStat>;\n\n// Flat datum emitted by sqlgen's heatmap-plus shaper: body cells plus margin\n// rows, distinguished by the GROUPING flags gr/gc.\nexport interface HeatPlusDatum {\n r: string | null;\n c: string | null;\n lv: number;\n cv: number;\n gr?: number;\n gc?: number;\n block?: string;\n}\n\n// margin-* and total-* are aliases (so the builder's existing order control,\n// which emits total-*, drives both heatmaps).\ntype AxisOrder = 'alpha' | 'margin-asc' | 'margin-desc' | 'total-asc' | 'total-desc';\n\nexport interface HeatmapPlusViewProps {\n // Direct path: raw rows + field config (margins computed over these rows).\n records?: Row[];\n rowColumn: string;\n colColumn: string;\n valueColumn?: string;\n labelStat?: HeatStat;\n colorStat?: HeatStat;\n blockField?: string;\n // Baked/SQL path: pre-aggregated cells + margins (gr/gc flagged).\n data?: HeatPlusDatum[];\n // Color engine.\n scope?: ColorScope;\n method?: ColorMethod;\n vmin?: number;\n vmax?: number;\n // Axis ordering + margin display.\n rowOrder?: AxisOrder;\n colOrder?: AxisOrder;\n showMargins?: boolean;\n style?: Partial<ChartStyle>;\n}\n\nconst fmtNum = (n: number): string => {\n if (typeof n !== 'number' || Number.isNaN(n)) return '';\n return Number.isInteger(n) ? n.toLocaleString() : n.toLocaleString(undefined, { maximumFractionDigits: 2 });\n};\n\nconst orderIds = (ids: string[], margin: Margin, order: AxisOrder): string[] => {\n const sorted = [...ids];\n if (order.endsWith('-desc')) sorted.sort((a, b) => (margin[b]?.lv ?? 0) - (margin[a]?.lv ?? 0));\n else if (order.endsWith('-asc')) sorted.sort((a, b) => (margin[a]?.lv ?? 0) - (margin[b]?.lv ?? 0));\n else sorted.sort();\n return sorted;\n};\n\n// Assemble cells + margins from raw records: every margin aggregated over the\n// UNDERLYING rows (group → aggregate), so median/avg margins stay correct.\nfunction fromRecords(\n records: Row[], rowCol: string, colCol: string,\n valueCol: string | undefined, labelStat: HeatStat, colorStat: HeatStat, blockField?: string,\n): { rowIds: string[]; colIds: string[]; cells: Stats; rowMargin: Margin; colMargin: Margin; grand: CellStat } {\n const col = valueCol || rowCol; // unused for count; aggregate ignores it\n const statOf = (rs: Row[], s: HeatStat): number => (valueCol ? aggregate(rs, col, s) : rs.length);\n const both = (rs: Row[]): CellStat => ({ lv: statOf(rs, labelStat), cv: statOf(rs, colorStat) });\n\n const byRow = groupBy(records, rowCol);\n const rowIds: string[] = Object.keys(byRow);\n const colIds: string[] = [...new Set(records.map((r) => String(r[colCol] ?? NULL)))];\n\n const cells: Stats = {};\n for (const rid of rowIds) {\n cells[rid] = {};\n const byCol = groupBy(byRow[rid], colCol);\n for (const cid of colIds) {\n const cellRows = byCol[cid] || [];\n const stat = both(cellRows);\n if (blockField && cellRows.length) stat.block = String(cellRows[0][blockField] ?? NULL);\n cells[rid][cid] = stat;\n }\n }\n const rowMargin: Margin = {};\n for (const rid of rowIds) rowMargin[rid] = both(byRow[rid]);\n const colMargin: Margin = {};\n const byCol = groupBy(records, colCol);\n for (const cid of colIds) colMargin[cid] = both(byCol[cid] || []);\n return { rowIds, colIds, cells, rowMargin, colMargin, grand: both(records) };\n}\n\n// Assemble cells + margins from the flat baked data (margins already computed\n// over underlying rows server-side via GROUPING SETS).\nfunction fromData(\n data: HeatPlusDatum[],\n): { rowIds: string[]; colIds: string[]; cells: Stats; rowMargin: Margin; colMargin: Margin; grand: CellStat } {\n const cells: Stats = {};\n const rowMargin: Margin = {};\n const colMargin: Margin = {};\n let grand: CellStat = { lv: 0, cv: 0 };\n const rowIds: string[] = [];\n const colIds: string[] = [];\n for (const d of data) {\n const stat: CellStat = { lv: d.lv, cv: d.cv, ...(d.block != null ? { block: d.block } : {}) };\n if (d.gr && d.gc) { grand = stat; continue; } // grand total\n if (d.gr) { if (d.c != null) colMargin[d.c] = stat; continue; } // column margin\n if (d.gc) { if (d.r != null) rowMargin[d.r] = stat; continue; } // row margin\n const r = d.r ?? NULL, c = d.c ?? NULL; // body cell\n if (!cells[r]) { cells[r] = {}; rowIds.push(r); }\n if (!colIds.includes(c)) colIds.push(c);\n cells[r][c] = stat;\n }\n return { rowIds, colIds, cells, rowMargin, colMargin, grand };\n}\n\n/**\n * HeatmapPlusView — a cross-tab heatmap with independent label/color stats,\n * margins computed over the underlying rows, and a scope/method color engine\n * (see heatmapColor.ts). nivo's built-in scales normalize globally, so colors\n * are precomputed per cell here and handed to nivo as a function.\n */\nexport function HeatmapPlusView({\n records, rowColumn, colColumn, valueColumn,\n labelStat = 'count', colorStat = 'count', blockField,\n data: presetData,\n scope = 'global', method = 'linear', vmin, vmax,\n rowOrder = 'alpha', colOrder = 'alpha', showMargins = false, style,\n}: HeatmapPlusViewProps) {\n const s = withStyleDefaults(style);\n\n const model = useMemo(() => {\n if (presetData) return fromData(presetData);\n if (records) return fromRecords(records, rowColumn, colColumn, valueColumn, labelStat, colorStat, blockField);\n return null;\n }, [presetData, records, rowColumn, colColumn, valueColumn, labelStat, colorStat, blockField]);\n\n const built = useMemo(() => {\n if (!model || !model.rowIds.length || !model.colIds.length) return null;\n const { cells, rowMargin, colMargin, grand } = model;\n\n const rows = orderIds(model.rowIds, rowMargin, rowOrder).slice(0, MAX_AXIS);\n const cols = orderIds(model.colIds, colMargin, colOrder).slice(0, MAX_AXIS);\n\n // Precompute normalized t per cell. Body uses the chosen scope+method (+\n // optional fixed vmin/vmax). Margins normalize on their OWN scope (row\n // margins together, column margins together, grand alone) — never folded\n // into the body — using the same method, but no fixed override.\n const bodyCells: HeatCell[] = [];\n for (const rid of rows) for (const cid of cols) {\n bodyCells.push({ row: rid, col: cid, colorValue: cells[rid]?.[cid]?.cv ?? NaN, block: cells[rid]?.[cid]?.block });\n }\n const t = new Map<string, number>(normalizeCells(bodyCells, { scope, method, vmin, vmax }));\n\n if (showMargins) {\n const rowMc: HeatCell[] = rows.map((rid) => ({ row: rid, col: TOTAL_ID, colorValue: rowMargin[rid]?.cv ?? NaN }));\n const colMc: HeatCell[] = cols.map((cid) => ({ row: TOTAL_ID, col: cid, colorValue: colMargin[cid]?.cv ?? NaN }));\n for (const [k, v] of normalizeCells(rowMc, { scope: 'global', method })) t.set(k, v);\n for (const [k, v] of normalizeCells(colMc, { scope: 'global', method })) t.set(k, v);\n t.set(cellKey(TOTAL_ID, TOTAL_ID), 0.5);\n }\n\n // nivo matrix: y carries the LABEL stat (drives the cell label); color\n // comes from the precomputed t map, not y.\n const colKeys = showMargins ? [...cols, TOTAL_ID] : cols;\n const nivoData = rows.map((rid) => ({\n id: rid,\n data: colKeys.map((cid) => ({\n x: cid,\n y: cid === TOTAL_ID ? (rowMargin[rid]?.lv ?? 0) : (cells[rid]?.[cid]?.lv ?? 0),\n })),\n }));\n if (showMargins) {\n nivoData.push({\n id: TOTAL_ID,\n data: colKeys.map((cid) => ({\n x: cid,\n y: cid === TOTAL_ID ? grand.lv : (colMargin[cid]?.lv ?? 0),\n })),\n });\n }\n return { nivoData, t };\n }, [model, rowOrder, colOrder, scope, method, vmin, vmax, showMargins]);\n\n if (!built) {\n return <div className=\"p-8 text-center text-midnight-text-muted\">Not enough distinct values for a heatmap</div>;\n }\n\n const { nivoData, t } = built;\n const tAt = (serieId: string, x: string): number => t.get(cellKey(serieId, x)) ?? 0;\n\n const { frameClass, frameStyle, margin } = chartSizing(style, { top: 60, right: 20, bottom: showMargins ? 60 : 20, left: 100 });\n\n return (\n <div className={frameClass} style={frameStyle}>\n <ResponsiveHeatMap\n data={nivoData as never}\n margin={margin}\n valueFormat={((v: number) => fmtNum(v)) as never}\n axisTop={{ tickSize: 5, tickPadding: 5, tickRotation: s.xTickRotation, legend: s.showXLegend ? (s.xAxisLabel || colColumn) : '', legendPosition: s.xLegendPosition, legendOffset: -50 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, legend: s.showYLegend ? (s.yAxisLabel || rowColumn) : '', legendPosition: s.yLegendPosition, legendOffset: -80 }}\n colors={((cell: { serieId: string; data: { x: string } }) => heatColor(tAt(cell.serieId, cell.data.x))) as never}\n emptyColor=\"#1e293b\"\n borderWidth={1}\n borderColor=\"#334155\"\n labelTextColor={((cell: { serieId: string; data: { x: string } }) => heatLabelColor(tAt(cell.serieId, cell.data.x))) as never}\n hoverTarget=\"cell\"\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n}\n\nexport default HeatmapPlusView;\n","import { useState } from 'react';\nimport PivotTableUI from 'react-pivottable/PivotTableUI';\nimport 'react-pivottable/pivottable.css';\n\nimport type { Row } from '../../sqlgen';\n\nexport interface PivotViewProps {\n records?: Row[];\n}\n\n/**\n * PivotView wraps react-pivottable — a drag-and-drop pivot table that\n * introspects columns from the data automatically.\n */\nexport function PivotView({ records }: PivotViewProps) {\n const [pivotState, setPivotState] = useState<Record<string, unknown>>({});\n\n if (!records?.length) {\n return <div className=\"p-8 text-center text-midnight-text-muted\">No data for pivot</div>;\n }\n\n return (\n <div className=\"h-full overflow-auto pivot-dark-theme\">\n <style>{`\n /* Override react-pivottable styles for dark theme */\n .pivot-dark-theme .pvtUi { background: transparent; color: #e2e8f0; }\n .pivot-dark-theme table.pvtTable { font-size: 12px; color: #e2e8f0; border-collapse: collapse; }\n .pivot-dark-theme table.pvtTable thead tr th,\n .pivot-dark-theme table.pvtTable tbody tr th { background: #1e293b; color: #94a3b8; border: 1px solid #334155; padding: 4px 8px; }\n .pivot-dark-theme table.pvtTable tbody tr td { background: #0f172a; color: #e2e8f0; border: 1px solid #334155; padding: 4px 8px; text-align: right; }\n .pivot-dark-theme .pvtAxisContainer, .pivot-dark-theme .pvtVals { background: #1e293b; border: 1px solid #334155; }\n .pivot-dark-theme .pvtAxisContainer li.pvtAxis { background: #334155; color: #e2e8f0; border: 1px solid #475569; border-radius: 3px; }\n .pivot-dark-theme .pvtFilterBox { background: #1e293b; border: 1px solid #334155; color: #e2e8f0; }\n .pivot-dark-theme .pvtDropdown { background: #1e293b; color: #e2e8f0; border: 1px solid #334155; }\n .pivot-dark-theme .pvtSearch { background: #0f172a; color: #e2e8f0; border: 1px solid #334155; }\n .pivot-dark-theme select, .pivot-dark-theme .pvtAggregator { background: #1e293b; color: #e2e8f0; border: 1px solid #334155; }\n .pivot-dark-theme .pvtRenderers { background: #1e293b; color: #e2e8f0; border: 1px solid #334155; }\n `}</style>\n <PivotTableUI\n data={records}\n onChange={(s: Record<string, unknown>) => setPivotState(s)}\n {...pivotState}\n />\n </div>\n );\n}\n\nexport default PivotView;\n","import { type ReactNode } from 'react';\nimport { TerminalToggle, TerminalSlider, TerminalSelect, TerminalInput } from '@quantumwake/terminal-ux-components';\n\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\n\n// ChartStyleControls — the standardized appearance editor used across all charts.\n// Built from the shared design system (TerminalToggle / TerminalSlider /\n// TerminalSelect / TerminalInput) so it matches the rest of the ISM UI exactly.\n// Edits a plain ChartStyle object (see chartStyle.ts); the parent persists it and\n// passes it to the views.\n\n// ─── Layout ─────────────────────────────────────────────────────────────────\n\n// A titled group, separated by a divider so related controls cluster visually.\n// Layout uses inline styles (not arbitrary Tailwind values like grid-cols-[..]),\n// which a consuming app's Tailwind may not generate for this package — that was\n// the cause of controls dropping onto the next line.\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\n return (\n <div className=\"border-t border-midnight-border font-mono\" style={{ paddingTop: 12, paddingBottom: 12 }}>\n <div className=\"uppercase tracking-wider text-midnight-text-subdued\" style={{ fontSize: 10, marginBottom: 8 }}>{title}</div>\n <div style={{ display: 'flex', flexDirection: 'column', rowGap: 6 }}>{children}</div>\n </div>\n );\n}\n\n// One control row: label (left) + control (right) on the SAME row, two cells,\n// fixed height so every row shares the same vertical rhythm. Inline grid so it\n// never collapses to block flow regardless of the host's Tailwind config.\nfunction Row({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div style={{ display: 'grid', gridTemplateColumns: '84px minmax(0, 1fr)', alignItems: 'center', columnGap: 8, height: 32 }}>\n <span className=\"text-xs font-mono text-midnight-text-muted truncate\" title={label}>{label}</span>\n <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'flex-end', width: '100%', minWidth: 0 }}>{children}</div>\n </div>\n );\n}\n\n// Native colour swatch — the design system has no colour picker; this is the one\n// raw control, styled to match the midnight inputs.\nfunction ColorControl({ value, onChange }: { value: string; onChange: (v: string) => void }) {\n return (\n <input\n type=\"color\"\n value={/^#/.test(value) ? value : '#94a3b8'}\n onChange={e => onChange(e.target.value)}\n className=\"w-9 h-6 bg-transparent border border-midnight-border cursor-pointer p-0\"\n />\n );\n}\n\n// Optional colour: a toggle enables it (defaulting to `fallback`); off ⇒ '' (none).\nfunction OptionalColor({ value, onChange, fallback = '#a78bfa' }: { value: string; onChange: (v: string) => void; fallback?: string }) {\n const on = !!value;\n return (\n <div className=\"flex items-center gap-2\">\n {on && <ColorControl value={value} onChange={onChange} />}\n <TerminalToggle size=\"small\" checked={on} onChange={v => onChange(v ? fallback : '')} />\n </div>\n );\n}\n\n// ─── Editor ─────────────────────────────────────────────────────────────────\n\nexport interface ChartStyleControlsProps {\n style?: Partial<ChartStyle> | null;\n onChange: (next: ChartStyle) => void;\n}\n\nexport function ChartStyleControls({ style, onChange }: ChartStyleControlsProps) {\n const s = withStyleDefaults(style);\n const set = <K extends keyof ChartStyle>(key: K, value: ChartStyle[K]) => onChange({ ...s, [key]: value });\n\n return (\n <div>\n <Section title=\"Canvas\">\n <Row label=\"Background\"><ColorControl value={s.background} onChange={v => set('background', v)} /></Row>\n <Row label=\"Text\"><ColorControl value={s.textColor} onChange={v => set('textColor', v)} /></Row>\n <Row label=\"Grid\"><ColorControl value={s.gridColor} onChange={v => set('gridColor', v)} /></Row>\n <Row label=\"Font size\"><TerminalSlider value={s.fontSize} min={6} max={24} unit=\"px\" onChange={v => set('fontSize', v)} /></Row>\n </Section>\n\n <Section title=\"Axis titles\">\n <Row label=\"X title\"><TerminalInput size=\"small\" value={s.xAxisLabel} placeholder=\"(column)\" onChange={e => set('xAxisLabel', e.target.value)} /></Row>\n <Row label=\"Show X\"><TerminalToggle size=\"small\" checked={s.showXLegend} onChange={v => set('showXLegend', v)} /></Row>\n <Row label=\"Y title\"><TerminalInput size=\"small\" value={s.yAxisLabel} placeholder=\"(column)\" onChange={e => set('yAxisLabel', e.target.value)} /></Row>\n <Row label=\"Show Y\"><TerminalToggle size=\"small\" checked={s.showYLegend} onChange={v => set('showYLegend', v)} /></Row>\n <Row label=\"Color\"><ColorControl value={s.legendColor} onChange={v => set('legendColor', v)} /></Row>\n <Row label=\"Bold\"><TerminalToggle size=\"small\" checked={s.legendBold} onChange={v => set('legendBold', v)} /></Row>\n <Row label=\"Highlight\"><OptionalColor value={s.legendHighlight} onChange={v => set('legendHighlight', v)} /></Row>\n </Section>\n\n <Section title=\"Axis placement\">\n <Row label=\"X pos\"><TerminalSelect size=\"small\" value={s.xLegendPosition} options={['start', 'middle', 'end']} onChange={v => set('xLegendPosition', v as ChartStyle['xLegendPosition'])} /></Row>\n <Row label=\"X offset\"><TerminalSlider value={s.xLegendOffset} min={-80} max={80} onChange={v => set('xLegendOffset', v)} /></Row>\n <Row label=\"Y pos\"><TerminalSelect size=\"small\" value={s.yLegendPosition} options={['start', 'middle', 'end']} onChange={v => set('yLegendPosition', v as ChartStyle['yLegendPosition'])} /></Row>\n <Row label=\"Y offset\"><TerminalSlider value={s.yLegendOffset} min={-80} max={80} onChange={v => set('yLegendOffset', v)} /></Row>\n </Section>\n\n <Section title=\"Ticks\">\n <Row label=\"Wrap\"><TerminalToggle size=\"small\" checked={s.tickWrap} onChange={v => set('tickWrap', v)} /></Row>\n <Row label=\"Wrap width\"><TerminalSlider value={s.tickWrapWidth} min={4} max={40} onChange={v => set('tickWrapWidth', v)} /></Row>\n <Row label=\"X angle\"><TerminalSlider value={s.xTickRotation} min={-90} max={90} unit=\"°\" onChange={v => set('xTickRotation', v)} /></Row>\n <Row label=\"Y angle\"><TerminalSlider value={s.yTickRotation} min={-90} max={90} unit=\"°\" onChange={v => set('yTickRotation', v)} /></Row>\n <Row label=\"Truncate\"><TerminalSlider value={s.tickTruncate} min={0} max={40} onChange={v => set('tickTruncate', v)} /></Row>\n </Section>\n\n <Section title=\"Table cells\">\n <Row label=\"Wrap\"><TerminalToggle size=\"small\" checked={s.cellWrap} onChange={v => set('cellWrap', v)} /></Row>\n <Row label=\"Decimals\"><TerminalSlider value={s.cellPrecision} min={0} max={8} onChange={v => set('cellPrecision', v)} /></Row>\n <Row label=\"Truncate\"><TerminalSlider value={s.cellTruncate} min={0} max={80} onChange={v => set('cellTruncate', v)} /></Row>\n </Section>\n\n <Section title=\"Panel title\">\n <Row label=\"Align\"><TerminalSelect size=\"small\" value={s.titleAlign} options={['left', 'center', 'right']} onChange={v => set('titleAlign', v as ChartStyle['titleAlign'])} /></Row>\n <Row label=\"Bold\"><TerminalToggle size=\"small\" checked={s.titleBold} onChange={v => set('titleBold', v)} /></Row>\n <Row label=\"Color\"><OptionalColor value={s.titleColor} onChange={v => set('titleColor', v)} fallback=\"#e2e8f0\" /></Row>\n <Row label=\"Background\"><OptionalColor value={s.titleBackground} onChange={v => set('titleBackground', v)} fallback=\"#1e293b\" /></Row>\n </Section>\n\n <Section title=\"Series legend\">\n <Row label=\"Position\"><TerminalSelect size=\"small\" value={s.legendAnchor} options={['right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none']} onChange={v => set('legendAnchor', v as ChartStyle['legendAnchor'])} /></Row>\n </Section>\n </div>\n );\n}\n\nexport default ChartStyleControls;\n","// duckdbSql — DuckDB-flavoured SQL autocomplete for the SqlConsole editor.\n//\n// The PostgreSQL CodeMirror dialect already covers most of what DuckDB inherits\n// (it's intentionally PG-compatible), so we use it for keywords. On top we add a\n// curated source of DuckDB functions, types, extra keywords, and a few snippets\n// (GROUP BY etc.). Combined with schema/keyword completion in SqlConsole.\n\nimport { completeFromList, snippetCompletion, type Completion, type CompletionSource } from '@codemirror/autocomplete';\n\n// Aggregates + window functions (the ones people reach for in analysis).\nconst AGGREGATES = [\n 'count', 'count_if', 'sum', 'avg', 'min', 'max', 'median', 'mode',\n 'stddev', 'stddev_pop', 'stddev_samp', 'var_pop', 'var_samp', 'variance',\n 'quantile', 'quantile_cont', 'quantile_disc', 'approx_count_distinct', 'approx_quantile',\n 'arg_max', 'arg_min', 'first', 'last', 'product', 'bool_and', 'bool_or',\n 'bit_and', 'bit_or', 'bit_xor', 'string_agg', 'list', 'array_agg', 'histogram',\n 'corr', 'covar_pop', 'covar_samp', 'kurtosis', 'skewness', 'entropy',\n 'row_number', 'rank', 'dense_rank', 'percent_rank', 'cume_dist', 'ntile',\n 'lag', 'lead', 'first_value', 'last_value', 'nth_value',\n];\n\n// Scalar functions across string / date / math / list / json / conditional.\nconst SCALARS = [\n // string\n 'length', 'len', 'lower', 'upper', 'trim', 'ltrim', 'rtrim', 'substring', 'substr',\n 'concat', 'concat_ws', 'replace', 'reverse', 'repeat', 'lpad', 'rpad', 'left', 'right',\n 'contains', 'starts_with', 'ends_with', 'position', 'split_part', 'string_split',\n 'regexp_matches', 'regexp_replace', 'regexp_extract', 'regexp_full_match', 'regexp_split_to_array',\n 'format', 'printf', 'md5', 'sha256', 'levenshtein', 'jaccard', 'ascii', 'chr',\n // date / time\n 'now', 'current_date', 'current_timestamp', 'today', 'date_trunc', 'date_part', 'date_diff',\n 'date_add', 'date_sub', 'age', 'strftime', 'strptime', 'epoch', 'epoch_ms', 'extract',\n 'make_date', 'make_time', 'make_timestamp', 'last_day', 'dayname', 'monthname',\n 'year', 'month', 'day', 'hour', 'minute', 'second', 'dayofweek', 'dayofyear', 'week', 'quarter', 'time_bucket',\n // math\n 'abs', 'ceil', 'ceiling', 'floor', 'round', 'trunc', 'sign', 'mod', 'pow', 'power', 'sqrt', 'cbrt',\n 'exp', 'ln', 'log', 'log2', 'log10', 'greatest', 'least', 'gcd', 'lcm', 'factorial', 'random',\n 'pi', 'degrees', 'radians', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'atan2',\n // conditional / null / cast\n 'coalesce', 'ifnull', 'nullif', 'nvl', 'if', 'try_cast', 'cast', 'typeof',\n // list / struct / map / json\n 'list_value', 'list_aggregate', 'list_distinct', 'list_sort', 'list_reverse', 'list_slice',\n 'list_concat', 'list_contains', 'list_position', 'list_extract', 'list_transform', 'list_filter',\n 'unnest', 'array_length', 'array_to_string', 'struct_pack', 'struct_extract',\n 'map', 'map_keys', 'map_values', 'json_extract', 'json_extract_string', 'to_json', 'from_json',\n 'json_array_length', 'json_keys', 'generate_series', 'range',\n];\n\nconst TYPES = [\n 'BOOLEAN', 'TINYINT', 'SMALLINT', 'INTEGER', 'BIGINT', 'HUGEINT',\n 'UTINYINT', 'USMALLINT', 'UINTEGER', 'UBIGINT', 'FLOAT', 'REAL', 'DOUBLE',\n 'DECIMAL', 'NUMERIC', 'VARCHAR', 'CHAR', 'TEXT', 'BLOB', 'BIT',\n 'DATE', 'TIME', 'TIMESTAMP', 'TIMESTAMPTZ', 'INTERVAL', 'UUID', 'JSON',\n 'LIST', 'ARRAY', 'STRUCT', 'MAP', 'UNION', 'ENUM',\n];\n\n// DuckDB keywords/clauses that the PostgreSQL dialect doesn't know about.\nconst EXTRA_KEYWORDS = [\n 'QUALIFY', 'EXCLUDE', 'PIVOT', 'UNPIVOT', 'ASOF', 'POSITIONAL', 'SEMI', 'ANTI',\n 'SUMMARIZE', 'DISTINCT ON', 'GROUP BY ALL', 'ORDER BY ALL', 'USING SAMPLE',\n];\n\nfunction opts(labels: string[], type: string, boost = 0): Completion[] {\n return labels.map((label) => ({ label, type, boost }));\n}\n\nconst SNIPPETS: Completion[] = [\n snippetCompletion('SELECT ${col}, count(*) AS n\\nFROM data\\nGROUP BY ${col}\\nORDER BY n DESC', {\n label: 'group by count', type: 'snippet', detail: 'aggregate by column',\n }),\n snippetCompletion('SELECT *\\nFROM data\\nORDER BY ${col} DESC\\nLIMIT 10', {\n label: 'top N', type: 'snippet', detail: 'order + limit',\n }),\n snippetCompletion('SELECT DISTINCT ${col}\\nFROM data', {\n label: 'select distinct', type: 'snippet',\n }),\n];\n\n// duckdbCompletionSource completes DuckDB functions/types/keywords/snippets. It\n// fires on word characters (so it merges with schema + keyword completion).\nexport const duckdbCompletionSource: CompletionSource = completeFromList([\n ...opts(AGGREGATES, 'function', 1), // boost aggregates slightly — common in analysis\n ...opts(SCALARS, 'function'),\n ...opts(TYPES, 'type'),\n ...opts(EXTRA_KEYWORDS, 'keyword'),\n ...SNIPPETS,\n]);\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport { Play, Loader2, AlertCircle, Rows3, ChevronDown } from 'lucide-react';\nimport CodeMirror, { keymap, Prec, EditorView } from '@uiw/react-codemirror';\nimport { sql as sqlLang, PostgreSQL, schemaCompletionSource, keywordCompletionSource } from '@codemirror/lang-sql';\nimport { autocompletion, acceptCompletion } from '@codemirror/autocomplete';\nimport { useDashboard } from '../context/DashboardContext';\nimport { duckdbCompletionSource } from '../duckdbSql';\nimport type { Row } from '../sqlgen';\n\nconst DEFAULT_SQL = 'SELECT *\\nFROM data\\nLIMIT 100';\n\n// A schema column descriptor surfaced as an insertable chip below the editor.\nexport interface SqlConsoleColumn {\n name: string;\n type?: string;\n}\n\nexport interface SqlConsoleProps {\n // Optional schema columns rendered as click-to-insert chips. Defaults to none.\n columns?: SqlConsoleColumn[];\n // Optional state selector forwarded to runQuery (host may be multi-state).\n stateId?: string;\n // Whether the column-chip list starts expanded. Defaults to false (collapsed)\n // so the editor stays uncluttered; click \"Columns (N)\" to reveal the chips.\n defaultColumnsOpen?: boolean;\n // Initial editor query. Defaults to SELECT * FROM data LIMIT 100.\n defaultSql?: string;\n // Run the default query automatically on mount (and on stateId change) so the\n // viewer shows rows immediately without a manual Run. Defaults to false.\n autoRun?: boolean;\n}\n\n// Renders a single result cell value safely.\nconst renderCell = (v: unknown): string => {\n if (v == null) return '';\n if (typeof v === 'object') return JSON.stringify(v);\n if (typeof v === 'boolean') return v ? 'true' : 'false';\n return String(v);\n};\n\ninterface QueryState {\n columns: string[];\n rows: Row[];\n}\n\n/**\n * SqlConsole — a HuggingFace-style read-only SQL editor over a state's full\n * dataset. The state's data is exposed (server-side DuckDB in studio, DuckDB-WASM\n * in the viewer) as a view named `data`; queries run against the entire dataset,\n * not a client sample.\n */\nexport function SqlConsole({ columns = [], stateId, defaultColumnsOpen = false, defaultSql = DEFAULT_SQL, autoRun = false }: SqlConsoleProps) {\n const { theme, runQuery } = useDashboard();\n\n const [sql, setSql] = useState<string>(defaultSql);\n const [result, setResult] = useState<QueryState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [running, setRunning] = useState<boolean>(false);\n const [columnsOpen, setColumnsOpen] = useState<boolean>(defaultColumnsOpen);\n\n // run executes `text` (defaults to the editor's current query). Passing the\n // text explicitly lets auto-run fire the default query without waiting for the\n // `sql` state to settle.\n const run = async (text: string = sql): Promise<void> => {\n if (running || !text.trim()) return;\n setRunning(true);\n setError(null);\n try {\n const data = await runQuery(text, stateId);\n setResult({ columns: data.columns || [], rows: data.rows || [] });\n } catch (err) {\n setResult(null);\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setRunning(false);\n }\n };\n\n // Auto-run the default query on mount / state change so the viewer shows rows\n // immediately. Only mounts once the host has materialized the data (the\n // published viewer gates this behind its loader), so this never bypasses a\n // download confirm. eslint-disable-next-line react-hooks/exhaustive-deps\n useEffect(() => {\n if (!autoRun || !stateId) return;\n setSql(defaultSql);\n void run(defaultSql);\n }, [stateId, autoRun, defaultSql]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // Keep the ⌘↵ keybinding pointed at the latest run closure without rebuilding\n // the editor extensions on every keystroke.\n const runRef = useRef<() => void>(() => {});\n runRef.current = () => { void run(); };\n\n // SQL language + autocomplete. The PostgreSQL dialect covers most DuckDB\n // keywords/types/functions; on top we complete the `data` table's columns\n // (unqualified, via defaultTable) and a curated DuckDB function/type/snippet\n // source. Rebuilt only when the column set changes (keyed by name list) so\n // typing doesn't reconfigure the editor. ⌘↵ runs; Tab accepts a suggestion.\n const schemaKey = columns.map(c => c.name).join(',');\n const extensions = useMemo(() => {\n const sqlConfig = {\n dialect: PostgreSQL,\n schema: { data: columns.map(c => c.name) },\n defaultTable: 'data',\n upperCaseKeywords: true,\n };\n return [\n sqlLang(sqlConfig),\n autocompletion({\n override: [\n schemaCompletionSource(sqlConfig),\n keywordCompletionSource(PostgreSQL, true),\n duckdbCompletionSource,\n ],\n }),\n EditorView.lineWrapping,\n Prec.highest(keymap.of([\n { key: 'Mod-Enter', run: () => { runRef.current(); return true; } },\n { key: 'Tab', run: acceptCompletion },\n ])),\n ];\n }, [schemaKey]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const resultColumns = result?.columns || [];\n\n return (\n <div className=\"flex flex-col h-full\">\n {/* Editor */}\n <div className={`border-b ${theme.border} bg-midnight-elevated p-3 shrink-0`}>\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs uppercase text-midnight-text-muted font-mono\">\n SQL — table is <code className=\"text-midnight-accent\">data</code>\n </span>\n <button onClick={() => void run()} disabled={running || !sql.trim()}\n className={`flex items-center gap-1.5 px-3 py-1 border text-xs font-mono transition-colors ${\n running ? 'border-midnight-border opacity-50' : 'border-midnight-accent text-midnight-accent hover:bg-midnight-accent/10'\n }`}>\n {running ? <Loader2 className=\"w-3.5 h-3.5 animate-spin\" /> : <Play className=\"w-3.5 h-3.5\" />}\n Run <span className=\"opacity-60\">⌘↵</span>\n </button>\n </div>\n <CodeMirror\n value={sql}\n onChange={setSql}\n extensions={extensions}\n theme=\"dark\"\n basicSetup={{ lineNumbers: false, foldGutter: false, highlightActiveLine: false, autocompletion: false }}\n height=\"120px\"\n placeholder=\"SELECT ... FROM data\"\n className=\"border border-midnight-border text-sm overflow-hidden focus-within:border-midnight-accent\"\n />\n {columns.length > 0 && (\n <div className=\"mt-2\">\n <button onClick={() => setColumnsOpen(o => !o)}\n className=\"flex items-center gap-1 text-[11px] font-mono text-midnight-text-muted hover:text-midnight-text-body transition-colors\">\n <ChevronDown className={`w-3 h-3 transition-transform ${columnsOpen ? '' : '-rotate-90'}`} />\n Columns ({columns.length})\n </button>\n {columnsOpen && (\n <div className=\"mt-1.5 flex flex-wrap gap-1\">\n {columns.map(c => (\n <button key={c.name} title={`Insert ${c.name}`}\n onClick={() => setSql(s => `${s}${s.endsWith(' ') || s.endsWith('\\n') || !s ? '' : ' '}${c.name}`)}\n className=\"px-1.5 py-0.5 border border-midnight-border text-[11px] font-mono text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n {c.name}<span className=\"opacity-50 ml-1\">{c.type}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n\n {/* Result meta */}\n {(result || error) && (\n <div className={`flex items-center gap-4 px-3 py-1.5 border-b ${theme.border} text-xs font-mono shrink-0 ${error ? 'text-red-400' : 'text-midnight-text-muted'}`}>\n {error ? (\n <span className=\"flex items-center gap-1.5\"><AlertCircle className=\"w-3.5 h-3.5\" /> {error}</span>\n ) : (\n <span className=\"flex items-center gap-1\"><Rows3 className=\"w-3.5 h-3.5\" /> {result!.rows.length.toLocaleString()} rows</span>\n )}\n </div>\n )}\n\n {/* Results table */}\n <div className=\"flex-1 min-h-0 overflow-auto\">\n {result && !error && resultColumns.length > 0 ? (\n <table className=\"w-full text-xs\">\n <thead className=\"sticky top-0 bg-midnight-elevated\">\n <tr>\n {resultColumns.map(c => (\n <th key={c} className=\"px-2 py-1.5 text-left text-midnight-text-muted font-mono border-b border-midnight-border whitespace-nowrap\">\n {c}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {result.rows.map((row, i) => (\n <tr key={i} className=\"border-b border-dashed border-midnight-border hover:bg-midnight-raised\">\n {resultColumns.map(c => (\n <td key={c} className=\"px-2 py-1 text-midnight-text-body font-mono truncate max-w-[300px]\">\n {renderCell(row[c])}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n ) : !error && (\n <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">\n Write a query and press <span className=\"text-midnight-accent mx-1\">Run</span> (⌘↵)\n </div>\n )}\n </div>\n </div>\n );\n}\n\nexport default SqlConsole;\n","import { useState, useMemo, useEffect, useRef, Suspense } from 'react';\nimport { ResponsiveBar } from '@nivo/bar';\nimport {\n BarChart3, PieChart, TrendingUp, ScatterChart, LayoutGrid, Grid3x3,\n Plus, X, GripVertical, ChevronDown, Filter, Code, Loader2, AlertCircle,\n} from 'lucide-react';\n\nimport { useDashboard } from '../context/DashboardContext';\nimport { buildChartSQL, shapeChartData } from '../sqlgen';\nimport type { ChartType, ChartConfig, ChartField, ChartFilter, Row } from '../sqlgen';\nimport { buildNivoTheme, legendConfig, DEFAULT_CHART_STYLE } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\nimport { makeAxis } from './axis';\nimport { groupBy, aggregate } from '../dataShape';\nimport {\n BarView, PieView, LineView, ScatterView, HeatmapView, HeatmapPlusView,\n type BarDatum, type PieDatum, type LineSerie, type ScatterSerie, type HeatmapSerie, type HeatPlusDatum,\n} from './views';\nimport { HEAT_STATS, type HeatStat, type ColorScope, type ColorMethod } from '../heatmapColor';\nimport { ChartStyleControls } from './ChartStyleControls';\nimport { TerminalToggle } from '@quantumwake/terminal-ux-components';\n\n// ─── Public types ─────────────────────────────────────────────────\n\n// A schema column descriptor (name + type tag used for the pill color).\nexport interface ChartBuilderColumn {\n name: string;\n type?: string;\n}\n\n// The panel descriptor handed to onSave when the user clicks \"Add to Dashboard\".\n// Mirrors the legacy stateFsSlice.addDashboardPanel payload (the host assigns the\n// panel id). config is intentionally loose — it carries both the legacy\n// client-side fields and the SQL-mode fields, exactly as the studio persists.\nexport interface ChartPanel {\n title: string;\n type: ChartType | 'bar';\n config: Record<string, unknown>;\n width: number;\n height: number;\n}\n\nexport interface ChartBuilderProps {\n // Loaded sample records, used by the 'direct' (client-side) engine mode and\n // forwarded to the views for local aggregation.\n records?: Row[];\n // Schema columns offered in the field pickers / available-fields list.\n columns: ChartBuilderColumn[];\n // Optional state selector forwarded to runQuery (host may be multi-state).\n stateId?: string;\n // Optional persistence hook. Absent ⇒ the \"Add to Dashboard\" button is hidden\n // (read-only viewer). Called with the assembled panel descriptor.\n onSave?: (panel: ChartPanel) => void;\n}\n\n// ─── Chart Types ──────────────────────────────────────────────────\n\ninterface ChartTypeOption {\n id: ChartType;\n icon: typeof BarChart3;\n label: string;\n}\n\nconst CHART_TYPES: ChartTypeOption[] = [\n { id: 'bar', icon: BarChart3, label: 'Bar' },\n { id: 'pie', icon: PieChart, label: 'Pie' },\n { id: 'line', icon: TrendingUp, label: 'Line' },\n { id: 'scatter', icon: ScatterChart, label: 'Scatter' },\n { id: 'heatmap', icon: LayoutGrid, label: 'Heatmap' },\n { id: 'heatmap-plus', icon: Grid3x3, label: 'Heatmap+' },\n { id: 'grouped-bar', icon: BarChart3, label: 'Grouped Bar' },\n];\n\nconst AGG_OPTIONS = ['count', 'distinct', 'sum', 'avg', 'min', 'max'];\n\nconst FILTER_OPS = ['=', '!=', '<', '<=', '>', '>=', 'IN', 'NOT IN', 'LIKE', 'BETWEEN', 'IS NULL', 'IS NOT NULL'];\nconst OPS_NO_VALUE = new Set(['IS NULL', 'IS NOT NULL']);\n\ninterface IdLabel {\n id: string;\n label: string;\n}\n\n// Themed select. The package can't import the host's TerminalDropdown, so this is\n// a raw <select> styled to match the surrounding Appearance/filter controls.\ninterface SelectControlProps {\n value: string;\n options: IdLabel[];\n onChange: (id: string) => void;\n className?: string;\n}\n\nconst SelectControl = ({ value, options, onChange, className = 'w-28' }: SelectControlProps) => (\n <div className={className}>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"w-full px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent transition-colors\"\n >\n {options.map((o) => (\n <option key={o.id} value={o.id}>{o.label}</option>\n ))}\n </select>\n </div>\n);\n\nconst ORDER_OPTIONS: IdLabel[] = [\n { id: 'alpha', label: 'A → Z' },\n { id: 'total-desc', label: 'Total ↓' },\n { id: 'total-asc', label: 'Total ↑' },\n];\nconst MARGIN_AGGS: IdLabel[] = ['sum', 'avg', 'min', 'max', 'count'].map((a) => ({ id: a, label: a }));\n// heatmap-plus controls.\nconst HEAT_STAT_OPTIONS: IdLabel[] = HEAT_STATS.map((a) => ({ id: a, label: a }));\nconst SCOPE_OPTIONS: IdLabel[] = [\n { id: 'global', label: 'Global' },\n { id: 'row', label: 'Per row' },\n { id: 'column', label: 'Per column' },\n { id: 'block', label: 'Per block' },\n];\nconst METHOD_OPTIONS: IdLabel[] = [\n { id: 'linear', label: 'Linear' },\n { id: 'rank', label: 'Rank' },\n];\nconst FILTER_OP_OPTIONS: IdLabel[] = FILTER_OPS.map((o) => ({ id: o, label: o }));\n\n// ─── Field Pill ───────────────────────────────────────────────────\n\ninterface FieldPillProps {\n name: string;\n type?: string;\n onRemove?: () => void;\n onChangeAgg?: (agg: string) => void;\n agg?: string;\n showAgg?: boolean;\n}\n\nconst FieldPill = ({ name, type, onRemove, onChangeAgg, agg, showAgg }: FieldPillProps) => {\n const typeColor = ({\n string: 'border-green-500/50 text-green-400',\n int64: 'border-blue-500/50 text-blue-400',\n float64: 'border-purple-500/50 text-purple-400',\n bool: 'border-orange-500/50 text-orange-400',\n } as Record<string, string>)[type ?? ''] || 'border-midnight-border text-midnight-text-body';\n\n return (\n <div className={`flex items-center gap-1 px-2 py-1 border ${typeColor} bg-midnight-surface text-xs font-mono`}>\n <GripVertical className=\"w-3 h-3 opacity-40\" />\n <span>{name}</span>\n {showAgg && (\n <select value={agg} onChange={(e) => onChangeAgg?.(e.target.value)}\n className=\"bg-transparent border-none text-xs outline-none ml-1 text-midnight-text-muted\">\n {AGG_OPTIONS.map((a) => <option key={a} value={a}>{a}</option>)}\n </select>\n )}\n {onRemove && (\n <button onClick={onRemove} className=\"ml-1 hover:text-red-400\"><X className=\"w-3 h-3\" /></button>\n )}\n </div>\n );\n};\n\n// ─── Drop Zone ────────────────────────────────────────────────────\n\ninterface DropZoneProps {\n label: string;\n fields: ChartField[];\n onAdd: (field: ChartField) => void;\n onRemove: (idx: number) => void;\n onChangeAgg: (idx: number, agg: string) => void;\n columns: ChartBuilderColumn[];\n showAgg?: boolean;\n maxFields?: number;\n}\n\nconst DropZone = ({ label, fields, onAdd, onRemove, onChangeAgg, columns, showAgg = false, maxFields = 5 }: DropZoneProps) => {\n const [showPicker, setShowPicker] = useState(false);\n const usedNames = new Set(fields.map((f) => f.name));\n const available = columns.filter((c) => !usedNames.has(c.name));\n\n return (\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-1 font-mono\">{label}</div>\n <div className=\"flex flex-wrap gap-1 min-h-[32px] p-1.5 border border-dashed border-midnight-border bg-midnight-surface/50\">\n {fields.map((f, i) => (\n <FieldPill\n key={f.name}\n name={f.name}\n type={(f as ChartField & { type?: string }).type}\n agg={f.agg}\n showAgg={showAgg}\n onRemove={() => onRemove(i)}\n onChangeAgg={(agg) => onChangeAgg(i, agg)}\n />\n ))}\n {fields.length < maxFields && available.length > 0 && (\n <div className=\"relative\">\n <button onClick={() => setShowPicker(!showPicker)}\n className=\"flex items-center gap-1 px-2 py-1 border border-dashed border-midnight-border text-xs text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n <Plus className=\"w-3 h-3\" /> Add\n </button>\n {showPicker && (\n <div className=\"absolute top-full left-0 mt-1 z-20 bg-midnight-elevated border border-midnight-border shadow-lg max-h-[200px] overflow-auto min-w-[150px]\">\n {available.map((col) => (\n <button key={col.name}\n onClick={() => { onAdd({ name: col.name, type: col.type, agg: 'count' } as ChartField); setShowPicker(false); }}\n className=\"block w-full text-left px-3 py-1.5 text-xs font-mono text-midnight-text-body hover:bg-midnight-raised transition-colors\">\n <span>{col.name}</span>\n <span className=\"text-midnight-text-muted ml-2\">({col.type})</span>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ─── Filters (compile to a WHERE clause) ─────────────────────────\n\ninterface FiltersSectionProps {\n filters: ChartFilter[];\n columns: ChartBuilderColumn[];\n onChange: (filters: ChartFilter[]) => void;\n}\n\nconst FiltersSection = ({ filters, columns, onChange }: FiltersSectionProps) => {\n const addFilter = () => onChange([...filters, { column: columns[0]?.name || '', op: '=', value: '' }]);\n const updateFilter = (i: number, patch: Partial<ChartFilter>) => onChange(filters.map((f, idx) => idx === i ? { ...f, ...patch } : f));\n const removeFilter = (i: number) => onChange(filters.filter((_, idx) => idx !== i));\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <div className=\"text-xs uppercase text-midnight-text-muted font-mono flex items-center gap-1\"><Filter className=\"w-3 h-3\" /> Filters</div>\n <button onClick={addFilter} disabled={!columns.length}\n className=\"flex items-center gap-1 px-1.5 py-0.5 border border-dashed border-midnight-border text-xs text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n <Plus className=\"w-3 h-3\" /> Add\n </button>\n </div>\n <div className=\"space-y-1\">\n {filters.map((f, i) => (\n <div key={i} className=\"flex items-center gap-1\">\n <SelectControl\n value={f.column}\n options={columns.map((c) => ({ id: c.name, label: c.name }))}\n onChange={(colId) => updateFilter(i, { column: colId })}\n className=\"flex-1 min-w-0\"\n />\n <SelectControl\n value={f.op}\n options={FILTER_OP_OPTIONS}\n onChange={(op) => updateFilter(i, { op })}\n className=\"w-24 shrink-0\"\n />\n {!OPS_NO_VALUE.has(f.op) && (\n <div className=\"w-20 shrink-0\">\n <input\n value={f.value ?? ''}\n onChange={(e) => updateFilter(i, { value: e.target.value })}\n placeholder={f.op === 'IN' || f.op === 'NOT IN' ? 'a,b,c' : f.op === 'BETWEEN' ? 'lo,hi' : 'value'}\n className=\"w-full px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent transition-colors\"\n />\n </div>\n )}\n <button onClick={() => removeFilter(i)} className=\"text-midnight-text-muted hover:text-red-400\"><X className=\"w-3 h-3\" /></button>\n </div>\n ))}\n {!filters.length && <div className=\"text-xs text-midnight-text-muted font-mono px-1\">No filters</div>}\n </div>\n </div>\n );\n};\n\n// ─── Multi-Series Bar Chart (built inline for grouped data) ──────\n\ninterface GroupedBarRow {\n group: string;\n [key: string]: string | number;\n}\n\nexport interface GroupedBarChartProps {\n records?: Row[];\n xFields?: ChartField[];\n yFields?: ChartField[];\n groupField?: ChartField | null;\n data?: GroupedBarRow[];\n keys?: string[];\n style?: Partial<ChartStyle>;\n}\n\nexport const GroupedBarChart = ({ records, xFields = [], yFields = [], groupField, data: presetData, keys: presetKeys, style }: GroupedBarChartProps) => {\n const computed = useMemo<GroupedBarRow[]>(() => {\n if (presetData || !records || !xFields.length || !yFields.length) return [];\n const xCol = xFields[0].name;\n const groups = groupBy(records, xCol);\n\n return Object.entries(groups)\n .map(([key, recs]) => {\n const row: GroupedBarRow = { group: key };\n yFields.forEach((yf) => {\n row[`${yf.agg}(${yf.name})`] = aggregate(recs, yf.name, yf.agg ?? 'count');\n });\n return row;\n })\n .sort((a, b) => {\n const firstKey = `${yFields[0].agg}(${yFields[0].name})`;\n return (Number(b[firstKey]) || 0) - (Number(a[firstKey]) || 0);\n })\n .slice(0, 50);\n }, [records, xFields, yFields, presetData]);\n\n const data = presetData || computed;\n if (!data.length) return null;\n\n const keys = presetKeys || yFields.map((yf) => `${yf.agg}(${yf.name})`);\n const colors = ['rgba(74,222,128,0.8)', 'rgba(96,165,250,0.8)', 'rgba(251,146,60,0.8)', 'rgba(167,139,250,0.8)', 'rgba(248,113,113,0.8)'];\n\n const legend = legendConfig(style);\n return (\n <div className=\"h-full w-full min-h-[160px]\">\n <ResponsiveBar\n data={data as never}\n keys={keys}\n indexBy=\"group\"\n groupMode={groupField ? 'grouped' : 'stacked'}\n margin={{ top: 20, right: 120, bottom: 60, left: 60 }}\n padding={0.3}\n colors={colors.slice(0, keys.length)}\n axisBottom={makeAxis(style, 'x', xFields[0]?.name || '')}\n axisLeft={makeAxis(style, 'y', '', { numeric: true })}\n labelSkipWidth={12}\n labelSkipHeight={12}\n labelTextColor={{ from: 'color', modifiers: [['darker', 3]] } as never}\n legends={legend ? [{ dataFrom: 'keys', ...legend } as never] : []}\n theme={buildNivoTheme(style)}\n />\n </div>\n );\n};\n\n// ─── Chart Preview ────────────────────────────────────────────────\n\ninterface HeatmapOpts {\n rowOrder?: 'alpha' | 'total-asc' | 'total-desc';\n colOrder?: 'alpha' | 'total-asc' | 'total-desc';\n marginAgg?: string;\n showTotals?: boolean;\n}\n\n// heatmap-plus preview options (the dual stats + color engine + margins).\ninterface HeatPlusOpts {\n labelStat?: HeatStat;\n colorStat?: HeatStat;\n blockField?: string;\n scope?: ColorScope;\n method?: ColorMethod;\n vmin?: number;\n vmax?: number;\n rowOrder?: 'alpha' | 'total-asc' | 'total-desc';\n colOrder?: 'alpha' | 'total-asc' | 'total-desc';\n showMargins?: boolean;\n}\n\ninterface ChartPreviewProps {\n chartType: ChartType;\n records?: Row[];\n xFields: ChartField[];\n yFields: ChartField[];\n valueField: ChartField | null;\n groupField: ChartField | null;\n colorField: ChartField | null;\n engineMode: 'sql' | 'direct';\n sqlRows: Row[] | null;\n sqlLoading: boolean;\n sqlError: string | null;\n heatmapOpts?: HeatmapOpts;\n heatPlusOpts?: HeatPlusOpts;\n style: ChartStyle;\n}\n\nconst ChartPreview = ({\n chartType, records, xFields, yFields, valueField, groupField, engineMode,\n sqlRows, sqlLoading, sqlError, heatmapOpts = {}, heatPlusOpts = {}, style,\n}: ChartPreviewProps) => {\n const xCol = xFields[0]?.name;\n const yCol = yFields[0]?.name;\n const yAgg = yFields[0]?.agg || 'count';\n\n // ─── SQL mode: render from server-side query results ──────────────\n if (engineMode === 'sql') {\n if (sqlError) {\n return <div className=\"flex items-center justify-center h-full text-sm text-red-400 gap-2 px-4 text-center\"><AlertCircle className=\"w-4 h-4 shrink-0\" /> {sqlError}</div>;\n }\n if (sqlLoading && !sqlRows) {\n return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted gap-2\"><Loader2 className=\"w-4 h-4 animate-spin\" /> Running query…</div>;\n }\n if (!sqlRows) {\n return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">Configure the chart to run a query</div>;\n }\n if (chartType === 'grouped-bar' || (chartType === 'bar' && (yFields.length > 1 || groupField))) {\n const { data, keys } = shapeChartData('grouped-bar', sqlRows, { yFields }) as { data: GroupedBarRow[]; keys: string[] };\n return <GroupedBarChart data={data} keys={keys} yFields={yFields} groupField={groupField} style={style} />;\n }\n const shaped = shapeChartData(chartType, sqlRows, { yFields });\n switch (chartType) {\n case 'bar': return <Suspense fallback={null}><BarView data={shaped as BarDatum[]} groupColumn={xCol} valueColumn={yCol} style={style} /></Suspense>;\n case 'pie': return <Suspense fallback={null}><PieView data={shaped as PieDatum[]} groupColumn={xCol} style={style} /></Suspense>;\n case 'line': return <Suspense fallback={null}><LineView data={shaped as LineSerie[]} xColumn={xCol} yColumn={yCol} style={style} /></Suspense>;\n case 'scatter': return <Suspense fallback={null}><ScatterView data={shaped as ScatterSerie[]} xColumn={xCol} yColumn={yCol} style={style} /></Suspense>;\n case 'heatmap': return (shaped as HeatmapSerie[]).length ? <Suspense fallback={null}><HeatmapView data={shaped as HeatmapSerie[]} rowColumn={xCol} colColumn={yCol} {...heatmapOpts} style={style} /></Suspense>\n : <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">No data</div>;\n case 'heatmap-plus': return (shaped as HeatPlusDatum[]).length ? <Suspense fallback={null}><HeatmapPlusView data={shaped as HeatPlusDatum[]} rowColumn={xCol} colColumn={yCol} {...heatPlusOpts} style={style} /></Suspense>\n : <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">No data</div>;\n default: return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">Select a chart type</div>;\n }\n }\n\n // ─── Direct mode: client-side aggregation over the loaded sample ──\n if (!records?.length) return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">No data</div>;\n\n switch (chartType) {\n case 'bar':\n if (yFields.length > 1 || groupField) {\n return <GroupedBarChart records={records} xFields={xFields} yFields={yFields} groupField={groupField} style={style} />;\n }\n return xCol ? <Suspense fallback={null}><BarView records={records} groupColumn={xCol} valueColumn={yCol} aggFn={yAgg} style={style} /></Suspense> : null;\n\n case 'grouped-bar':\n return <GroupedBarChart records={records} xFields={xFields} yFields={yFields} groupField={groupField} style={style} />;\n\n case 'pie':\n return xCol ? <Suspense fallback={null}><PieView records={records} groupColumn={xCol} style={style} /></Suspense> : null;\n\n case 'line':\n return xCol && yCol ? <Suspense fallback={null}><LineView records={records} xColumn={xCol} yColumn={yCol} style={style} /></Suspense> : null;\n\n case 'scatter':\n return xCol && yCol ? <Suspense fallback={null}><ScatterView records={records} xColumn={xCol} yColumn={yCol} style={style} /></Suspense> : null;\n\n case 'heatmap':\n return xCol && yCol ? <Suspense fallback={null}><HeatmapView records={records} rowColumn={xCol} colColumn={yCol} valueColumn={valueField?.name} aggFn={valueField?.agg || 'count'} {...heatmapOpts} style={style} /></Suspense> : null;\n\n case 'heatmap-plus':\n return xCol && yCol ? <Suspense fallback={null}><HeatmapPlusView records={records} rowColumn={xCol} colColumn={yCol} valueColumn={valueField?.name} {...heatPlusOpts} style={style} /></Suspense> : null;\n\n default:\n return <div className=\"flex items-center justify-center h-full text-sm text-midnight-text-muted\">Select a chart type</div>;\n }\n};\n\n// ─── Main ChartBuilder ────────────────────────────────────────────\n\ntype Zone = 'x' | 'y' | 'value' | 'group' | 'color';\n\n/**\n * ChartBuilder — visual chart authoring over a state's dataset. Generates DuckDB\n * SQL from the visual config (SQL engine mode, exact over the full dataset) or\n * aggregates the loaded sample client-side (Direct mode). The host injects\n * runQuery + theme via <DashboardProvider>; an optional onSave persists the\n * assembled panel (absent ⇒ the save affordance is hidden / read-only).\n */\n// Cap on rows baked onto a panel as precomputed data (config.data, inlined into\n// the dashboard JSON / published manifest). Aggregations are tiny; this guards\n// against baking a scatter-of-everything (those stay live/Refresh-only).\n// TODO(precompute-parquet): for larger results, back the precomputed output with\n// a small RESULT PARQUET (written next to the snapshot) referenced by the panel\n// (e.g. config.dataKey) and loaded via DuckDB-WASM, instead of inlining rows in\n// the metadata JSON — keeps the manifest small and the result database-backed.\n// See docs/activities.md.\nconst MAX_PRECOMPUTE_ROWS = 5000;\n\nexport function ChartBuilder({ records, columns, stateId, onSave }: ChartBuilderProps) {\n const { theme, runQuery } = useDashboard();\n // Hold runQuery in a ref so effects don't depend on its identity — hosts\n // commonly pass an inline runQuery (new each render); depending on it would\n // re-fire the query effect every render → infinite setState loop.\n const runQueryRef = useRef(runQuery);\n runQueryRef.current = runQuery;\n\n const [chartType, setChartType] = useState<ChartType>('bar');\n const [xFields, setXFields] = useState<ChartField[]>([]);\n const [yFields, setYFields] = useState<ChartField[]>([]);\n const [valueField, setValueField] = useState<ChartField | null>(null);\n const [groupField, setGroupField] = useState<ChartField | null>(null);\n const [colorField, setColorField] = useState<ChartField | null>(null);\n const [title, setTitle] = useState('');\n\n // Query engine: 'sql' = exact, server-side over the full dataset (default);\n // 'direct' = client-side aggregation over the loaded sample (fallback).\n const [engineMode, setEngineMode] = useState<'sql' | 'direct'>('sql');\n const [filters, setFilters] = useState<ChartFilter[]>([]);\n const [showSql, setShowSql] = useState(false);\n\n // Heatmap axis ordering + marginal totals.\n const [rowOrder, setRowOrder] = useState<'alpha' | 'total-asc' | 'total-desc'>('alpha');\n const [colOrder, setColOrder] = useState<'alpha' | 'total-asc' | 'total-desc'>('alpha');\n const [marginAgg, setMarginAgg] = useState('sum');\n const [showTotals, setShowTotals] = useState(false);\n\n // Heatmap+ dual cell stats + color engine. labelStat → cell label; colorStat\n // → cell color (default: same). scope/method drive the color normalization\n // (see heatmapColor.ts); vmin/vmax pin the linear domain for cross-chart\n // comparability ('' = auto). The block field reuses the color field zone.\n const [labelStat, setLabelStat] = useState<HeatStat>('count');\n const [colorStat, setColorStat] = useState<HeatStat>('count');\n const [scope, setScope] = useState<ColorScope>('global');\n const [method, setMethod] = useState<ColorMethod>('linear');\n const [vmin, setVmin] = useState('');\n const [vmax, setVmax] = useState('');\n const [showMargins, setShowMargins] = useState(false);\n\n // Standardized chart appearance (see chartStyle.ts).\n const [style, setStyle] = useState<ChartStyle>(DEFAULT_CHART_STYLE);\n const [showStyle, setShowStyle] = useState(false);\n const [showFields, setShowFields] = useState(false);\n // Maximize: the saved panel spans the full dashboard width + a tall height.\n const [fillContainer, setFillContainer] = useState(false);\n\n // SQL preview state (driven by runQuery when engineMode === 'sql').\n const [sqlRows, setSqlRows] = useState<Row[] | null>(null);\n const [sqlLoading, setSqlLoading] = useState(false);\n const [sqlError, setSqlError] = useState<string | null>(null);\n\n // The SQL generated from the current visual config.\n const generatedSql = useMemo(\n () => buildChartSQL({\n chartType, xFields, yFields, valueField, filters,\n labelStat, colorStat, blockField: colorField?.name,\n } as ChartConfig),\n [chartType, xFields, yFields, valueField, filters, labelStat, colorStat, colorField],\n );\n\n // Run the generated query whenever it changes (SQL mode only).\n useEffect(() => {\n if (engineMode !== 'sql') return undefined;\n if (!generatedSql) { setSqlRows(null); setSqlError(null); return undefined; }\n let cancelled = false;\n setSqlLoading(true);\n setSqlError(null);\n runQueryRef.current(generatedSql, stateId).then((res) => {\n if (cancelled) return;\n setSqlLoading(false);\n setSqlRows(res.rows || []);\n }).catch((err: unknown) => {\n if (cancelled) return;\n setSqlLoading(false);\n setSqlRows(null);\n setSqlError(err instanceof Error ? err.message : String(err) || 'Query failed');\n });\n return () => { cancelled = true; };\n }, [engineMode, generatedSql, stateId]);\n\n const addField = (zone: Zone, field: ChartField) => {\n switch (zone) {\n case 'x': setXFields((f) => [...f, field]); break;\n case 'y': setYFields((f) => [...f, field]); break;\n case 'value': setValueField(field); break;\n case 'group': setGroupField(field); break;\n case 'color': setColorField(field); break;\n }\n };\n\n const removeField = (zone: Zone, idx?: number) => {\n switch (zone) {\n case 'x': setXFields((f) => f.filter((_, i) => i !== idx)); break;\n case 'y': setYFields((f) => f.filter((_, i) => i !== idx)); break;\n case 'value': setValueField(null); break;\n case 'group': setGroupField(null); break;\n case 'color': setColorField(null); break;\n }\n };\n\n const changeAgg = (zone: Zone, idx: number, agg: string) => {\n if (zone === 'y') {\n setYFields((f) => f.map((field, i) => i === idx ? { ...field, agg } : field));\n } else if (zone === 'value') {\n setValueField((f) => f ? { ...f, agg } : f);\n }\n };\n\n // Save current chart config as a dashboard panel.\n const handleSaveToDashboard = () => {\n if (!onSave) return;\n const config: Record<string, unknown> = {};\n if (xFields.length) config.group = xFields[0].name;\n if (yFields.length) { config.value = yFields[0].name; config.agg = yFields[0].agg; }\n if (chartType === 'line' || chartType === 'scatter') {\n config.x = xFields[0]?.name;\n config.y = yFields[0]?.name;\n }\n if (chartType === 'heatmap') {\n config.row = xFields[0]?.name;\n config.col = yFields[0]?.name;\n // Value column is optional; absence means cell value = count.\n if (valueField) {\n config.value = valueField.name;\n config.agg = valueField.agg || 'count';\n } else {\n delete config.value;\n delete config.agg;\n }\n // Axis ordering + marginal totals.\n config.rowOrder = rowOrder;\n config.colOrder = colOrder;\n config.marginAgg = marginAgg;\n config.showTotals = showTotals;\n }\n if (chartType === 'heatmap-plus') {\n config.row = xFields[0]?.name;\n config.col = yFields[0]?.name;\n // Value column optional; absent ⇒ both stats are a row count.\n if (valueField) config.value = valueField.name;\n else delete config.value;\n config.labelStat = labelStat;\n config.colorStat = colorStat;\n if (colorField) config.blockField = colorField.name; else delete config.blockField;\n config.scope = scope;\n config.method = method;\n // '' ⇒ auto (omit), else a finite number.\n const nMin = parseFloat(vmin), nMax = parseFloat(vmax);\n if (Number.isFinite(nMin)) config.vmin = nMin; else delete config.vmin;\n if (Number.isFinite(nMax)) config.vmax = nMax; else delete config.vmax;\n config.rowOrder = rowOrder;\n config.colOrder = colOrder;\n config.showMargins = showMargins;\n }\n\n // In SQL mode persist the generated query + filters so the saved panel\n // renders server-side (exact, full dataset). Legacy fields above remain\n // for backward-compatible client-side rendering when the endpoint is absent.\n if (engineMode === 'sql' && generatedSql) {\n config.sql = generatedSql;\n config.chartType = chartType; // shaping hint for the renderer\n if (filters.length) config.filters = filters;\n if (yFields.length) config.yFields = yFields.map((f) => ({ name: f.name, agg: f.agg }));\n // PRECOMPUTE: bake the current preview result onto the panel so it\n // renders without a live query (instant in the studio, and carried into\n // published dashboards verbatim). Skip oversized results (e.g. a\n // scatter of every row) — those stay live/Refresh-only.\n if (sqlRows && sqlRows.length <= MAX_PRECOMPUTE_ROWS) {\n config.data = sqlRows;\n config.refreshedAt = new Date().toISOString();\n }\n }\n\n // Standardized appearance travels with the panel.\n config.style = style;\n // Maximize hint (full width + tall height), persisted on the panel config.\n config.fill = fillContainer;\n\n onSave({\n title: title || `${chartType} chart`,\n type: chartType === 'grouped-bar' ? 'bar' : chartType,\n config,\n width: fillContainer ? 12 : 6,\n height: fillContainer ? 8 : 2,\n });\n };\n\n // Both heatmaps share the Rows/Columns/Cell-Value field layout.\n const isHeat = chartType === 'heatmap' || chartType === 'heatmap-plus';\n\n return (\n <div className=\"flex h-full\">\n {/* Left: Config Panel */}\n <div className={`w-[280px] shrink-0 border-r ${theme.border} bg-midnight-elevated overflow-y-auto p-3 space-y-4`}>\n {/* Chart Type */}\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Chart Type</div>\n <div className=\"grid grid-cols-3 gap-1\">\n {CHART_TYPES.map((ct) => (\n <button key={ct.id} onClick={() => setChartType(ct.id)}\n className={`flex flex-col items-center gap-1 p-2 border text-xs font-mono transition-colors ${\n chartType === ct.id\n ? 'border-midnight-accent text-midnight-accent bg-midnight-accent/10'\n : 'border-midnight-border text-midnight-text-muted hover:bg-midnight-raised'\n }`}>\n <ct.icon className=\"w-4 h-4\" />\n {ct.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Query engine toggle */}\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-1 font-mono\">Query Engine</div>\n <div className=\"flex border border-midnight-border\">\n {([\n { id: 'sql', label: 'SQL (full data)' },\n { id: 'direct', label: 'Direct (sample)' },\n ] as { id: 'sql' | 'direct'; label: string }[]).map((m) => (\n <button key={m.id} onClick={() => setEngineMode(m.id)}\n className={`flex-1 px-2 py-1 text-xs font-mono transition-colors ${\n engineMode === m.id ? 'bg-midnight-accent/10 text-midnight-accent' : 'text-midnight-text-muted hover:bg-midnight-raised'\n }`}>\n {m.label}\n </button>\n ))}\n </div>\n </div>\n\n {/* Drop Zones */}\n <DropZone\n label={isHeat ? 'Rows' : 'X Axis / Group By'}\n fields={xFields}\n columns={columns}\n onAdd={(f) => addField('x', f)}\n onRemove={(i) => removeField('x', i)}\n onChangeAgg={() => {}}\n maxFields={chartType === 'pie' || isHeat ? 1 : 3}\n />\n\n <DropZone\n label={isHeat ? 'Columns' : 'Y Axis / Values'}\n fields={yFields}\n columns={columns}\n onAdd={(f) => addField('y', f)}\n onRemove={(i) => removeField('y', i)}\n onChangeAgg={(i, agg) => changeAgg('y', i, agg)}\n showAgg={!isHeat}\n maxFields={isHeat ? 1 : 5}\n />\n\n {isHeat && (\n <DropZone\n label=\"Cell Value (optional — defaults to count)\"\n fields={valueField ? [valueField] : []}\n columns={columns}\n onAdd={(f) => addField('value', f)}\n onRemove={() => removeField('value')}\n onChangeAgg={(i, agg) => changeAgg('value', i, agg)}\n showAgg={chartType === 'heatmap'}\n maxFields={1}\n />\n )}\n\n {chartType === 'heatmap-plus' && (\n <>\n <DropZone\n label=\"Block (optional — color-scope grouping)\"\n fields={colorField ? [colorField] : []}\n columns={columns}\n onAdd={(f) => addField('color', f)}\n onRemove={() => removeField('color')}\n onChangeAgg={() => {}}\n maxFields={1}\n />\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Cell Stats</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Label stat</span>\n <SelectControl value={labelStat} options={HEAT_STAT_OPTIONS} onChange={(v) => setLabelStat(v as HeatStat)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Color stat</span>\n <SelectControl value={colorStat} options={HEAT_STAT_OPTIONS} onChange={(v) => setColorStat(v as HeatStat)} />\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Color Engine</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Scale scope</span>\n <SelectControl value={scope} options={SCOPE_OPTIONS} onChange={(v) => setScope(v as ColorScope)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Scale method</span>\n <SelectControl value={method} options={METHOD_OPTIONS} onChange={(v) => setMethod(v as ColorMethod)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Fixed min / max</span>\n <div className=\"flex gap-1\">\n <input value={vmin} onChange={(e) => setVmin(e.target.value)} placeholder=\"auto\" inputMode=\"decimal\"\n className=\"w-14 px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent\" />\n <input value={vmax} onChange={(e) => setVmax(e.target.value)} placeholder=\"auto\" inputMode=\"decimal\"\n className=\"w-14 px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent\" />\n </div>\n </div>\n </div>\n </div>\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Order & Margins</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order rows</span>\n <SelectControl value={rowOrder} options={ORDER_OPTIONS} onChange={(v) => setRowOrder(v as typeof rowOrder)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order columns</span>\n <SelectControl value={colOrder} options={ORDER_OPTIONS} onChange={(v) => setColOrder(v as typeof colOrder)} />\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input type=\"checkbox\" checked={showMargins} onChange={(e) => setShowMargins(e.target.checked)} className=\"accent-midnight-accent\" />\n <span className=\"text-xs font-mono text-midnight-text-muted\">Show margins (row / col / grand)</span>\n </label>\n </div>\n </div>\n </>\n )}\n\n {chartType === 'heatmap' && (\n <div>\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Order & Totals</div>\n <div className=\"space-y-2\">\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order rows</span>\n <SelectControl value={rowOrder} options={ORDER_OPTIONS} onChange={(v) => setRowOrder(v as typeof rowOrder)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Order columns</span>\n <SelectControl value={colOrder} options={ORDER_OPTIONS} onChange={(v) => setColOrder(v as typeof colOrder)} />\n </div>\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className=\"text-xs font-mono text-midnight-text-muted\">Total aggregator</span>\n <SelectControl value={marginAgg} options={MARGIN_AGGS} onChange={setMarginAgg} />\n </div>\n <label className=\"flex items-center gap-2 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={showTotals}\n onChange={(e) => setShowTotals(e.target.checked)}\n className=\"accent-midnight-accent\"\n />\n <span className=\"text-xs font-mono text-midnight-text-muted\">Show row/column totals</span>\n </label>\n </div>\n </div>\n )}\n\n {(chartType === 'bar' || chartType === 'grouped-bar') && (\n <DropZone\n label=\"Group / Color\"\n fields={groupField ? [groupField] : []}\n columns={columns}\n onAdd={(f) => addField('group', f)}\n onRemove={() => removeField('group')}\n onChangeAgg={() => {}}\n maxFields={1}\n />\n )}\n\n {/* Filters → WHERE */}\n <FiltersSection filters={filters} columns={columns} onChange={setFilters} />\n\n {/* Generated SQL (read-only preview, SQL mode) */}\n {engineMode === 'sql' && (\n <div>\n <button onClick={() => setShowSql((s) => !s)}\n className=\"flex items-center gap-1 text-xs uppercase text-midnight-text-muted font-mono hover:text-midnight-text-body transition-colors\">\n <Code className=\"w-3 h-3\" />\n <ChevronDown className={`w-3 h-3 transition-transform ${showSql ? '' : '-rotate-90'}`} />\n Generated SQL\n </button>\n {showSql && (\n <pre className=\"mt-1 p-2 bg-midnight-surface border border-midnight-border text-[11px] font-mono text-midnight-text-body whitespace-pre-wrap break-words max-h-[160px] overflow-auto\">\n {generatedSql || '— configure the chart —'}\n </pre>\n )}\n </div>\n )}\n\n {/* Appearance (standardized across all charts) */}\n <div>\n <button onClick={() => setShowStyle((s) => !s)}\n className=\"flex items-center gap-1 text-xs uppercase text-midnight-text-muted font-mono hover:text-midnight-text-body transition-colors\">\n <ChevronDown className={`w-3 h-3 transition-transform ${showStyle ? '' : '-rotate-90'}`} />\n Appearance\n </button>\n {showStyle && (\n <div className=\"mt-2\">\n <ChartStyleControls style={style} onChange={setStyle} />\n </div>\n )}\n </div>\n\n {/* Title + Save */}\n {onSave && (\n <div className=\"pt-4 border-t border-midnight-border\">\n <input\n value={title}\n onChange={(e) => setTitle(e.target.value)}\n placeholder=\"Chart title...\"\n className=\"w-full mb-2 px-2 py-1 text-xs font-mono bg-midnight-surface border border-midnight-border text-midnight-text-body outline-none focus:border-midnight-accent transition-colors\"\n />\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-mono text-midnight-text-muted\" title=\"Span the full dashboard width and height\">Maximize size</span>\n <TerminalToggle size=\"small\" checked={fillContainer} onChange={setFillContainer} />\n </div>\n <button onClick={handleSaveToDashboard}\n className=\"w-full px-3 py-1.5 border border-midnight-accent text-midnight-accent text-xs font-mono hover:bg-midnight-accent/10 transition-colors\">\n + Add to Dashboard\n </button>\n </div>\n )}\n\n {/* Available Fields (reference) — collapsed by default */}\n <div className=\"pt-4 border-t border-midnight-border\">\n <button onClick={() => setShowFields((s) => !s)}\n className=\"flex items-center gap-1 text-xs uppercase text-midnight-text-muted font-mono hover:text-midnight-text-body transition-colors\">\n <ChevronDown className={`w-3 h-3 transition-transform ${showFields ? '' : '-rotate-90'}`} />\n Available Fields\n <span className=\"text-midnight-text-muted/60 normal-case\">({columns.length})</span>\n </button>\n {showFields && (\n <div className=\"space-y-1 mt-2\">\n {columns.map((col) => (\n <div key={col.name} className=\"flex items-center justify-between text-xs font-mono px-1 py-0.5\">\n <span className=\"text-midnight-text-body\">{col.name}</span>\n <span className=\"text-midnight-text-muted\">{col.type}</span>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n\n {/* Right: Chart Preview */}\n <div className=\"flex-1 min-h-0 p-2\">\n <ChartPreview\n chartType={chartType}\n records={records}\n xFields={xFields}\n yFields={yFields}\n valueField={valueField}\n groupField={groupField}\n colorField={colorField}\n engineMode={engineMode}\n sqlRows={sqlRows}\n sqlLoading={sqlLoading}\n sqlError={sqlError}\n heatmapOpts={{ rowOrder, colOrder, marginAgg, showTotals }}\n heatPlusOpts={{\n labelStat, colorStat, blockField: colorField?.name,\n scope, method,\n vmin: Number.isFinite(parseFloat(vmin)) ? parseFloat(vmin) : undefined,\n vmax: Number.isFinite(parseFloat(vmax)) ? parseFloat(vmax) : undefined,\n rowOrder, colOrder, showMargins,\n }}\n style={style}\n />\n </div>\n </div>\n );\n}\n\nexport default ChartBuilder;\n","// DashboardRenderer — host-agnostic renderer for a grid of AI-generated or\n// manually configured dashboard panels. Uses a 12-column CSS grid.\n//\n// Capabilities (theme, runQuery, removePanel) are injected by the host via\n// DashboardContext — this component never imports a store or API client.\n// - full-capability host (studio): wires removePanel ⇒ panels show a remove button.\n// - read-only host (published viewer): omits removePanel ⇒ read-only dashboard.\n\nimport { Suspense, useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\nimport { X, Sparkles, RefreshCw, AlertCircle } from 'lucide-react';\nimport GridLayout, { WidthProvider, type Layout } from 'react-grid-layout';\n\nimport { useDashboard, useCapabilities, type PanelLayout } from '../context/DashboardContext';\nimport { shapeChartData, buildChartSQL, aggExpr, qIdent } from '../sqlgen';\nimport type { Row, ChartType, ChartField, ChartConfig, ChartFilter } from '../sqlgen';\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\nimport {\n BarView,\n PieView,\n LineView,\n ScatterView,\n HeatmapView,\n HeatmapPlusView,\n PivotView,\n MetricView,\n InsightView,\n} from './views';\nimport { GroupedBarChart } from './ChartBuilder';\n\n// ─── Panel / dashboard shapes ──────────────────────────────────────────────\n\n// PanelConfig is the per-panel config blob. The host (studio AI or chart\n// builder) owns the full schema; the renderer reads the fields it dispatches on.\nexport interface PanelConfig {\n sql?: string;\n chartType?: ChartType | 'metric';\n style?: Partial<ChartStyle>;\n\n // client-side aggregation columns\n group?: string;\n value?: string;\n agg?: string;\n x?: string;\n y?: string;\n row?: string;\n col?: string;\n\n // grouped-bar / heatmap extras\n yFields?: ChartField[];\n rowOrder?: string;\n colOrder?: string;\n marginAgg?: string;\n showTotals?: boolean;\n\n // heatmap-plus extras: dual cell stats, block field, color engine, margins.\n labelStat?: string;\n colorStat?: string;\n blockField?: string;\n scope?: string;\n method?: string;\n vmin?: number;\n vmax?: number;\n showMargins?: boolean;\n\n // table / insight\n columns?: string[];\n text?: string;\n\n // metric\n label?: string;\n column?: string;\n\n // layout: when true the panel takes the full dashboard width + a tall height.\n fill?: boolean;\n\n // PRECOMPUTED result of config.sql, baked at build/refresh time. When present\n // the panel renders from it directly — no live query. refreshedAt is when it\n // was last computed (studio Refresh). Published dashboards rely on this.\n data?: Row[];\n refreshedAt?: string;\n\n [key: string]: unknown;\n}\n\nexport interface DashboardPanel {\n id: string;\n type: string;\n title?: string;\n // Grid geometry (12-col units). width/height = span; x/y = top-left cell.\n // x/y are optional — absent ⇒ the renderer auto-packs in panel order.\n width?: number;\n height?: number;\n x?: number;\n y?: number;\n config?: PanelConfig;\n}\n\nexport interface Dashboard {\n insights?: string;\n panels?: DashboardPanel[];\n}\n\nexport interface ColumnDef {\n name: string;\n}\n\nexport interface DashboardRendererProps {\n dashboard?: Dashboard | null;\n records?: Row[];\n columns?: ColumnDef[];\n}\n\n// ─── Loading fallback ──────────────────────────────────────────────────────\n\nfunction ViewLoading() {\n return (\n <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">Loading...</div>\n );\n}\n\n// ─── SqlPanel ──────────────────────────────────────────────────────────────\n\ninterface SqlPanelProps {\n panel: DashboardPanel;\n}\n\n// Chart types whose data buildChartSQL can compile from a panel's flat config —\n// so an AI-generated / Direct-mode panel (no config.sql) is still computed,\n// baked (precomputed), and refreshable, exactly like a manual SQL chart.\nconst SQL_CHART_TYPES = new Set<string>(['bar', 'grouped-bar', 'pie', 'line', 'scatter', 'heatmap', 'heatmap-plus']);\n\n// Panel types that are SQL-backed but NOT compiled via buildChartSQL: table\n// (row preview) and metric (single aggregate). Routing them through SqlPanel\n// gives them the same Refresh + precompute (bake) path as the charts — so AI/\n// Direct table & metric panels also show data on publish.\nconst SQL_DATA_TYPES = new Set<string>(['table', 'metric']);\n\n// Rows fetched/baked for a table panel preview (kept small — it's a glance, and\n// it inlines into the dashboard/published manifest like any precomputed result).\nconst TABLE_PREVIEW_ROWS = 200;\n\n// SQL for a table panel: the chosen columns (or all) capped to a preview size.\nfunction tableSql(config: PanelConfig): string {\n const cols = config.columns?.length ? config.columns.map(qIdent).join(', ') : '*';\n return `SELECT ${cols} FROM data LIMIT ${TABLE_PREVIEW_ROWS}`;\n}\n\n// SQL for a metric panel: a single aggregate over the full dataset.\nfunction metricSql(config: PanelConfig): string {\n return `SELECT ${aggExpr(config.agg, config.column)} AS v FROM data`;\n}\n\n// Map a panel's flat config (group/value/agg/x/y/row/col — the AI/Direct shape)\n// to the ChartConfig buildChartSQL expects.\nfunction panelToChartConfig(chartType: ChartType, config: PanelConfig): ChartConfig {\n const cfg: ChartConfig = { chartType, xFields: [], yFields: [], filters: (config.filters as ChartFilter[]) || [] };\n switch (chartType) {\n case 'bar':\n case 'grouped-bar':\n if (config.group) cfg.xFields = [{ name: config.group }];\n cfg.yFields = config.yFields?.length\n ? config.yFields\n : config.value ? [{ name: config.value, agg: config.agg }] : [];\n break;\n case 'pie':\n if (config.group) cfg.xFields = [{ name: config.group }];\n break;\n case 'line':\n case 'scatter':\n if (config.x) cfg.xFields = [{ name: config.x }];\n if (config.y) cfg.yFields = [{ name: config.y }];\n break;\n case 'heatmap':\n if (config.row) cfg.xFields = [{ name: config.row }];\n if (config.col) cfg.yFields = [{ name: config.col }];\n if (config.value) cfg.valueField = { name: config.value, agg: config.agg };\n break;\n case 'heatmap-plus':\n if (config.row) cfg.xFields = [{ name: config.row }];\n if (config.col) cfg.yFields = [{ name: config.col }];\n if (config.value) cfg.valueField = { name: config.value, agg: config.labelStat };\n cfg.labelStat = config.labelStat;\n cfg.colorStat = config.colorStat;\n cfg.blockField = config.blockField;\n break;\n }\n return cfg;\n}\n\n// The SQL a panel runs: its explicit config.sql, else compiled from its config\n// (charts), or built for table / metric panels.\nfunction panelSql(type: string, config: PanelConfig): string {\n if (config.sql) return config.sql;\n if (type === 'table') return tableSql(config);\n if (type === 'metric') return metricSql(config);\n if (SQL_CHART_TYPES.has(type)) return buildChartSQL(panelToChartConfig(type as ChartType, config)) || '';\n return '';\n}\n\n// Format one table cell: numbers get decimal precision (floats → N dp, integers\n// left whole), non-numeric strings pass through, then optional char truncation.\nfunction formatCell(value: unknown, s: ChartStyle): string {\n if (value == null) return '';\n if (typeof value === 'object') return JSON.stringify(value);\n let str: string;\n const n = typeof value === 'number' ? value : Number(value);\n if (value !== '' && typeof value !== 'boolean' && Number.isFinite(n)) {\n str = Number.isInteger(n)\n ? n.toLocaleString()\n : n.toLocaleString(undefined, { minimumFractionDigits: s.cellPrecision, maximumFractionDigits: s.cellPrecision });\n } else {\n str = String(value);\n }\n if (s.cellTruncate > 0 && str.length > s.cellTruncate) str = `${str.slice(0, s.cellTruncate)}…`;\n return str;\n}\n\n// A compact scrollable table for table panels (and the records fallback). Cells\n// wrap (default) and numbers are precision-formatted per the panel's style.\nfunction DataTable({ rows, columns, style }: { rows: Row[]; columns?: string[]; style?: Partial<ChartStyle> }) {\n const s = withStyleDefaults(style);\n const colNames = columns?.length ? columns : rows[0] ? Object.keys(rows[0]) : [];\n const cellCls = s.cellWrap\n ? 'px-2 py-1 text-midnight-text-body align-top whitespace-normal break-words max-w-[280px]'\n : 'px-2 py-1 text-midnight-text-body truncate max-w-[200px]';\n return (\n <div className=\"overflow-auto h-full text-xs\">\n <table className=\"w-full\">\n <thead className=\"sticky top-0 bg-midnight-elevated\">\n <tr>{colNames.map((n) => <th key={n} className=\"px-2 py-1 text-left text-midnight-text-muted font-mono border-b border-midnight-border\">{n}</th>)}</tr>\n </thead>\n <tbody>\n {rows.map((r, i) => (\n <tr key={i} className=\"border-b border-dashed border-midnight-border hover:bg-midnight-raised\">\n {colNames.map((n) => (\n <td key={n} className={cellCls}>{formatCell(r[n], s)}</td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\n/**\n * SqlPanel renders a SQL-backed panel (config.sql or a compiled chart config).\n * PRECOMPUTE model:\n * - config.data present → render it directly (NO live query). This is how\n * published dashboards render — instant, no dataset download.\n * - config.data absent + studio (canRefresh) → live-query once to compute it.\n * - config.data absent + read-only viewer → \"Chart data not available\" (the\n * viewer never live-queries a dashboard panel — that's a dataset download).\n * The studio shows a Refresh button that re-runs the query and hands the rows to\n * persistPanelData so the host stores them on the panel and saves.\n */\nfunction SqlPanel({ panel }: SqlPanelProps) {\n const { runQuery, persistPanelData } = useDashboard();\n const { canRefresh } = useCapabilities();\n // Ref so the query effect doesn't depend on runQuery's identity (hosts pass\n // an inline runQuery → depending on it would loop). See ChartBuilder.\n const runQueryRef = useRef(runQuery);\n runQueryRef.current = runQuery;\n const config: PanelConfig = panel.config || {};\n const chartType = (config.chartType || panel.type) as string;\n // Explicit SQL, else compiled from the panel's chart/table/metric config.\n const sql = panelSql(chartType, config);\n const precomputed = config.data;\n\n const [rows, setRows] = useState<Row[] | null>(precomputed ?? null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState<boolean>(!precomputed && canRefresh);\n const [refreshing, setRefreshing] = useState(false);\n\n // Compute live ONLY when there's no precomputed result and the host can persist\n // (studio first-build). The published viewer relies solely on config.data.\n useEffect(() => {\n if (precomputed) { setRows(precomputed); setLoading(false); return; }\n if (!canRefresh) { setLoading(false); return; }\n let cancelled = false;\n setLoading(true);\n setError(null);\n runQueryRef.current(sql).then(\n (res) => { if (!cancelled) { setLoading(false); setRows(res?.rows || []); } },\n (err: unknown) => { if (!cancelled) { setLoading(false); setRows(null); setError(err instanceof Error ? err.message : String(err) || 'Query failed'); } },\n );\n return () => { cancelled = true; };\n // precomputed identity is intentionally excluded — a stored result is stable.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [sql, canRefresh]);\n\n const refresh = useCallback(async () => {\n setRefreshing(true);\n setError(null);\n try {\n const res = await runQueryRef.current(sql);\n const r = res?.rows || [];\n setRows(r);\n persistPanelData?.(panel.id, r, new Date().toISOString());\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err) || 'Query failed');\n } finally {\n setRefreshing(false);\n }\n }, [sql, panel.id, persistPanelData]);\n\n const refreshBtn = canRefresh ? (\n <button\n onClick={refresh}\n disabled={refreshing}\n title={config.refreshedAt ? `Last computed ${new Date(config.refreshedAt).toLocaleString()} — click to refresh` : 'Compute & save this chart’s data'}\n className=\"absolute top-1 right-1 z-10 p-1 bg-midnight-elevated/80 border border-midnight-border text-midnight-text-muted hover:text-midnight-accent transition-colors\"\n >\n <RefreshCw className={`w-3 h-3 ${refreshing ? 'animate-spin' : ''}`} />\n </button>\n ) : null;\n\n if (loading && !rows) {\n return <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">Running…</div>;\n }\n // No precomputed result and read-only viewer: don't live-query — surface it.\n if (!rows && !error && !canRefresh) {\n return (\n <div className=\"flex flex-col items-center justify-center h-full gap-1 px-2 text-center text-xs text-midnight-text-muted\">\n <AlertCircle className=\"w-4 h-4\" />\n <span>Chart data not available</span>\n <span className=\"text-[10px] text-midnight-text-subdued\">Download the dataset to view this chart.</span>\n </div>\n );\n }\n if (error) {\n return (\n <div className=\"relative flex items-center justify-center h-full px-2 text-center text-xs text-red-400\">\n {refreshBtn}\n {error}\n </div>\n );\n }\n if (!rows) return null;\n\n let chart: ReactNode;\n if (chartType === 'metric') {\n const first = rows[0];\n const v = first ? Object.values(first)[0] : 0;\n chart = <MetricView value={Number(v) || 0} config={{ column: config.column || '', agg: config.agg, label: config.label }} />;\n } else if (chartType === 'table') {\n chart = <DataTable rows={rows} columns={config.columns} style={config.style} />;\n } else {\n const shaped = shapeChartData(chartType as ChartType, rows, { yFields: config.yFields || [] });\n switch (chartType) {\n case 'bar':\n chart = <BarView data={shaped as never} groupColumn={config.group || ''} valueColumn={config.value || ''} style={config.style} />;\n break;\n case 'grouped-bar': {\n const gb = shaped as { data: unknown[]; keys: string[] };\n chart = <GroupedBarChart data={gb.data as never} keys={gb.keys} yFields={config.yFields || []} style={config.style} />;\n break;\n }\n case 'pie':\n chart = <PieView data={shaped as never} groupColumn={config.group || ''} style={config.style} />;\n break;\n case 'line':\n chart = <LineView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n break;\n case 'scatter':\n chart = <ScatterView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n break;\n case 'heatmap':\n chart = (shaped as unknown[]).length\n ? <HeatmapView data={shaped as never} rowColumn={config.row || ''} colColumn={config.col || ''} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} marginAgg={config.marginAgg} showTotals={config.showTotals} style={config.style} />\n : <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">No data</div>;\n break;\n case 'heatmap-plus':\n chart = (shaped as unknown[]).length\n ? <HeatmapPlusView data={shaped as never} rowColumn={config.row || ''} colColumn={config.col || ''} scope={config.scope as never} method={config.method as never} vmin={config.vmin} vmax={config.vmax} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} showMargins={config.showMargins} style={config.style} />\n : <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">No data</div>;\n break;\n default:\n chart = <div className=\"p-4 text-xs text-midnight-text-muted\">Unsupported SQL chart: {chartType}</div>;\n }\n }\n\n return (\n <div className=\"relative h-full w-full\">\n {refreshBtn}\n {chart}\n </div>\n );\n}\n\n// ─── PanelContent ──────────────────────────────────────────────────────────\n\ninterface PanelContentProps {\n panel: DashboardPanel;\n records?: Row[];\n columns?: ColumnDef[];\n}\n\n/**\n * Renders a single dashboard panel based on its type and config.\n * Panels saved with a SQL query render server-side (full dataset); the rest\n * fall back to client-side aggregation over the loaded records.\n */\nfunction PanelContent({ panel, records, columns }: PanelContentProps) {\n const { type } = panel;\n const config: PanelConfig = panel.config || {};\n\n // SQL-backed panels — explicit config.sql, a compilable chart type, or a\n // table/metric panel — go through SqlPanel so they compute, bake (precompute),\n // and refresh server-side over the FULL dataset (and show data on publish).\n const effType = (config.chartType || type) as string;\n if (config.sql || SQL_CHART_TYPES.has(effType) || SQL_DATA_TYPES.has(effType)) {\n return <SqlPanel panel={panel} />;\n }\n\n if (!records?.length && type !== 'insight') {\n return <div className=\"flex items-center justify-center h-full text-xs text-midnight-text-muted\">No data</div>;\n }\n\n switch (type) {\n case 'bar':\n return config.group ? <BarView records={records} groupColumn={config.group} valueColumn={config.value || ''} aggFn={config.agg || 'count'} style={config.style} /> : null;\n case 'pie':\n return config.group ? <PieView records={records} groupColumn={config.group} style={config.style} /> : null;\n case 'line':\n return config.x && config.y ? <LineView records={records} xColumn={config.x} yColumn={config.y} style={config.style} /> : null;\n case 'scatter':\n return config.x && config.y ? <ScatterView records={records} xColumn={config.x} yColumn={config.y} style={config.style} /> : null;\n case 'heatmap':\n return config.row && config.col ? <HeatmapView records={records} rowColumn={config.row} colColumn={config.col} valueColumn={config.value} aggFn={config.agg || 'count'} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} marginAgg={config.marginAgg} showTotals={config.showTotals} style={config.style} /> : null;\n case 'heatmap-plus':\n return config.row && config.col ? <HeatmapPlusView records={records} rowColumn={config.row} colColumn={config.col} valueColumn={config.value} labelStat={config.labelStat as never} colorStat={config.colorStat as never} blockField={config.blockField} scope={config.scope as never} method={config.method as never} vmin={config.vmin} vmax={config.vmax} rowOrder={config.rowOrder as never} colOrder={config.colOrder as never} showMargins={config.showMargins} style={config.style} /> : null;\n case 'pivot':\n return <PivotView records={records} />;\n case 'metric':\n return <MetricView records={records} config={{ column: config.column || '', agg: config.agg, label: config.label }} />;\n case 'insight':\n return <InsightView config={{ text: config.text }} />;\n case 'table':\n // Records fallback (SQL-backed tables route through SqlPanel above).\n return <DataTable rows={(records || []).slice(0, 50)} columns={config.columns || columns?.map((c) => c.name)} style={config.style} />;\n default:\n return <div className=\"p-4 text-xs text-midnight-text-muted\">Unknown panel type: {type}</div>;\n }\n}\n\n// PanelChart renders a panel's chart/table/metric BODY only — no panel frame,\n// no title bar. Host-agnostic: the published viewer's single-chart embed route\n// renders exactly this (so an iframe shows the chart and nothing else), and the\n// studio can use it anywhere a bare chart body is needed.\nexport const PanelChart = PanelContent;\nexport type PanelChartProps = PanelContentProps;\n\n// ─── DashboardRenderer ─────────────────────────────────────────────────────\n\nconst GRID_COLS = 12;\nconst ROW_HEIGHT = 80; // px per grid row unit\nconst GRID_MARGIN = 10; // px gap between panels\n// A panel header drag-handle class — only the header drags (so charts stay\n// interactive). react-grid-layout matches it via draggableHandle.\nconst DRAG_HANDLE = 'panel-drag-handle';\n\n// react-grid-layout needs its CSS for the resize handle + drag transitions.\n// Rather than make every host import a stylesheet, inject the minimal rules once\n// (scoped to .react-grid-* / .react-resizable-*). Styled to match the dark theme.\nconst RGL_CSS = `\n.react-grid-layout { position: relative; transition: height 200ms ease; }\n.react-grid-item { transition: all 200ms ease; transition-property: left, top, width, height; box-sizing: border-box; }\n.react-grid-item.cssTransforms { transition-property: transform, width, height; }\n.react-grid-item.resizing { transition: none; z-index: 3; will-change: width, height; }\n.react-grid-item.react-draggable-dragging { transition: none; z-index: 3; will-change: transform; }\n.react-grid-item.react-grid-placeholder { background: rgba(99,102,241,0.18); border: 1px dashed #6366f1; border-radius: 2px; transition-duration: 100ms; z-index: 2; user-select: none; }\n.react-grid-item > .react-resizable-handle { position: absolute; width: 18px; height: 18px; bottom: 0; right: 0; cursor: se-resize; }\n.react-grid-item > .react-resizable-handle::after { content: ''; position: absolute; right: 4px; bottom: 4px; width: 6px; height: 6px; border-right: 2px solid rgba(148,163,184,0.7); border-bottom: 2px solid rgba(148,163,184,0.7); }\n.${DRAG_HANDLE} { cursor: grab; }\n.react-grid-item.react-draggable-dragging .${DRAG_HANDLE} { cursor: grabbing; }\n`;\n\nlet rglCssInjected = false;\nfunction useInjectRglCss() {\n useEffect(() => {\n if (rglCssInjected || typeof document === 'undefined') return;\n const el = document.createElement('style');\n el.setAttribute('data-rgl', 'dashboard-renderer');\n el.textContent = RGL_CSS;\n document.head.appendChild(el);\n rglCssInjected = true;\n }, []);\n}\n\n// WidthProvider sizes the grid to its container; computed once (module scope) so\n// the HOC identity is stable across renders.\nconst GridLayoutWithWidth = WidthProvider(GridLayout);\n\n// Build the react-grid-layout `layout` from the panels. Honors saved x/y; for\n// panels without a saved position, auto-packs them left→right, top→bottom in\n// panel order (so legacy dashboards — which only stored width/height — still lay\n// out sensibly until the user drags them).\nfunction buildLayout(panels: DashboardPanel[]): Layout[] {\n let cx = 0, cy = 0, rowH = 0;\n return panels.map((p) => {\n // A \"fill\" panel takes the full width and a tall height.\n const fill = !!p.config?.fill;\n const w = fill ? GRID_COLS : Math.min(Math.max(p.width || 6, 1), GRID_COLS);\n const h = fill ? Math.max(p.height || 8, 6) : Math.max(p.height || 4, 1);\n if (typeof p.x === 'number' && typeof p.y === 'number') {\n return { i: p.id, x: fill ? 0 : p.x, y: p.y, w, h, minW: 2, minH: 2 };\n }\n // Auto-pack: wrap to the next row when this panel won't fit.\n if (cx + w > GRID_COLS) { cx = 0; cy += rowH; rowH = 0; }\n const item = { i: p.id, x: cx, y: cy, w, h, minW: 2, minH: 2 };\n cx += w;\n rowH = Math.max(rowH, h);\n return item;\n });\n}\n\n/**\n * DashboardRenderer — renders a grid of AI-generated or manually configured\n * panels via react-grid-layout. Editing is capability-gated:\n * - studio (persistLayout wired) ⇒ panels drag (by their header) + resize, and\n * the new geometry is persisted back to the host.\n * - published viewer (no persistLayout) ⇒ a static grid, rendered exactly where\n * the studio left the panels.\n * The per-panel remove button is similarly gated behind canEditPanels.\n */\nexport function DashboardRenderer({ dashboard, records, columns }: DashboardRendererProps) {\n const { theme, removePanel, persistLayout, panelHeaderExtra } = useDashboard();\n const { canEditPanels, canEditLayout } = useCapabilities();\n useInjectRglCss();\n\n const panels = dashboard?.panels ?? [];\n // Recompute only when the panel set / geometry changes (not on every render).\n const layout = useMemo(() => buildLayout(panels), [panels]);\n\n const onLayoutChange = useCallback((next: Layout[]) => {\n if (!persistLayout) return;\n persistLayout(next.map((l): PanelLayout => ({ id: l.i, x: l.x, y: l.y, w: l.w, h: l.h })));\n }, [persistLayout]);\n\n if (!dashboard) return null;\n\n // One panel frame (header + content), reused by the grid and the full-bleed\n // single-panel layout. `draggable` adds the drag-handle class to the header.\n const panelFrame = (panel: DashboardPanel, draggable: boolean) => (\n <div key={panel.id} className={`border ${theme.border} bg-midnight-surface flex flex-col overflow-hidden h-full`}>\n <div className={`flex items-center justify-between px-3 py-1.5 border-b ${theme.border} bg-midnight-elevated ${draggable ? DRAG_HANDLE : ''}`}>\n <span\n className=\"flex-1 text-xs font-mono text-midnight-text-body truncate px-1\"\n style={{\n textAlign: panel.config?.style?.titleAlign || 'left',\n fontWeight: panel.config?.style?.titleBold ? 700 : undefined,\n background: panel.config?.style?.titleBackground || undefined,\n color: panel.config?.style?.titleColor || undefined,\n }}\n >{panel.title || panel.type}</span>\n {panelHeaderExtra && (\n // Host-injected per-panel affordance (e.g. the viewer's\n // copy-embed-link icon). Stop drag from hijacking the click.\n <span onMouseDown={(e) => e.stopPropagation()} className=\"flex items-center\">\n {panelHeaderExtra(panel)}\n </span>\n )}\n {canEditPanels && removePanel && (\n <button\n // Stop drag from starting when the user aims for the X.\n onMouseDown={(e) => e.stopPropagation()}\n onClick={() => removePanel(panel.id)}\n className=\"p-0.5 hover:bg-midnight-raised text-midnight-text-muted hover:text-midnight-text-body transition-colors\"\n >\n <X className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n <div className=\"flex-1 min-h-0\">\n <Suspense fallback={<ViewLoading />}>\n <PanelContent panel={panel} records={records} columns={columns} />\n </Suspense>\n </div>\n </div>\n );\n\n const insightsBanner = dashboard.insights ? (\n <div className={`border ${theme.border} bg-midnight-elevated px-4 py-3 flex items-start gap-3`}>\n <Sparkles className=\"w-5 h-5 text-midnight-accent shrink-0 mt-0.5\" />\n <p className={`text-sm ${theme.text} leading-relaxed`}>{dashboard.insights}</p>\n </div>\n ) : null;\n\n // A single-chart dashboard always maximizes — full width AND height (this is\n // the published default for one-chart shares). No grid; the panel fills.\n if (panels.length === 1) {\n return (\n <div className=\"flex flex-col gap-4 p-2 h-full min-h-[60vh]\">\n {insightsBanner}\n <div className=\"flex-1 min-h-0\">{panelFrame(panels[0], false)}</div>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-4 p-2\">\n {insightsBanner}\n\n {/* Panel grid (draggable/resizable in the studio, static in the viewer) */}\n <GridLayoutWithWidth\n className=\"layout\"\n layout={layout}\n cols={GRID_COLS}\n rowHeight={ROW_HEIGHT}\n margin={[GRID_MARGIN, GRID_MARGIN]}\n isDraggable={canEditLayout}\n isResizable={canEditLayout}\n draggableHandle={`.${DRAG_HANDLE}`}\n onDragStop={onLayoutChange}\n onResizeStop={onLayoutChange}\n // Editing → vertical-compact (no floating gaps). Viewer → null, so\n // the published dashboard renders exactly where the studio left it.\n compactType={canEditLayout ? 'vertical' : null}\n >\n {panels.map((panel) => panelFrame(panel, canEditLayout))}\n </GridLayoutWithWidth>\n </div>\n );\n}\n\nexport default DashboardRenderer;\n","// DataExplorer — the host-agnostic container for the Data Explorer.\n//\n// This is the most store-coupled component, yet here it reads NO store: all\n// data/state arrives via props, and every logged-in-only verb\n// (save/load/search/delete/analyze/refine/edit) is an OPTIONAL injected\n// capability consumed through useDashboard()/useCapabilities(). When a\n// capability is absent its affordance is hidden and a read-only host\n// renders read-only.\n//\n// State ownership:\n// - data/state-in (records, columns, states, profile, dashboard,\n// savedDashboards, loading flags, active selection) → PROPS (the host owns\n// fetching/selection and its own store).\n// - actions (save/list/search/load/delete/analyze/refine) → injected caps.\n// - purely-local UI (active tab, save-name input, showSaved toggle,\n// fullscreen) → useState.\n\nimport { useState } from 'react';\nimport {\n Database, BarChart3, Rows3, Plus,\n ChevronDown, Sparkles, Send, Loader2, RefreshCw, Save, FolderOpen, Trash2, Terminal, Maximize2, Minimize2,\n} from 'lucide-react';\n\nimport { DashboardRenderer } from './DashboardRenderer';\nimport { ChartBuilder } from './ChartBuilder';\nimport { SqlConsole } from './SqlConsole';\nimport { useDashboard, useCapabilities, type DashboardTheme, type SavedDashboard } from '../context/DashboardContext';\nimport type { Row } from '../sqlgen';\n\n// ─── Domain types (host-supplied shapes) ──────────────────────────\n\n/** A dataset column descriptor: name + DuckDB-ish type tag. */\nexport interface Column {\n name: string;\n type: string;\n}\n\n/** A selectable state (dataset) in the host's catalog. */\nexport interface StatefsState {\n state_id: string;\n row_count?: number;\n [key: string]: unknown;\n}\n\n/** Per-column profile statistics shown in the ProfileSummary table. */\nexport interface ProfileColumn {\n name: string;\n type: string;\n distinct_count?: number;\n null_count?: number;\n avg_length?: number;\n min_length?: number;\n max_length?: number;\n min?: number | string;\n max?: number | string;\n top_values?: string[];\n [key: string]: unknown;\n}\n\n/** Dataset profile (row/column counts + per-column stats). */\nexport interface DatasetProfile {\n total_rows?: number;\n columns?: ProfileColumn[];\n [key: string]: unknown;\n}\n\n/** A single dashboard panel descriptor. */\nexport interface DashboardPanel {\n id: string;\n type: string;\n title?: string;\n width?: number;\n height?: number;\n config?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/** A dashboard config: AI insights + a grid of panels. */\nexport interface Dashboard {\n insights?: string;\n panels?: DashboardPanel[];\n [key: string]: unknown;\n}\n\ntype Mode = 'dashboard' | 'builder' | 'sql';\n\n// ─── Profile Summary ──────────────────────────────────────────────\n\ninterface ProfileSummaryProps {\n profile?: DatasetProfile | null;\n theme: DashboardTheme;\n}\n\nfunction ProfileSummary({ profile, theme }: ProfileSummaryProps) {\n const [open, setOpen] = useState(false);\n if (!profile) return null;\n\n return (\n <div className={`border ${theme.border} bg-midnight-surface mb-3`}>\n <button onClick={() => setOpen(!open)}\n className={`w-full px-3 py-2 bg-midnight-elevated flex items-center gap-2 hover:bg-midnight-raised transition-colors text-left`}>\n <ChevronDown className={`w-4 h-4 transition-transform ${open ? '' : '-rotate-90'}`} />\n <BarChart3 className=\"w-4 h-4\" />\n <span className={`text-sm font-mono ${theme.text}`}>{profile.total_rows?.toLocaleString()} rows, {profile.columns?.length} columns</span>\n </button>\n {open && (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs\">\n <thead><tr className={`border-b ${theme.border} bg-midnight-elevated`}>\n {['Column', 'Type', 'Distinct', 'Nulls', 'Stats', 'Top Values'].map(h => (\n <th key={h} className={`px-3 py-1 text-left uppercase ${theme.textSecondary}`}>{h}</th>\n ))}\n </tr></thead>\n <tbody>{profile.columns?.map(col => (\n <tr key={col.name} className={`border-b border-dashed ${theme.border}`}>\n <td className={`px-3 py-1 font-mono ${theme.text}`}>{col.name}</td>\n <td className={`px-3 py-1 ${theme.textSecondary}`}>{col.type}</td>\n <td className={`px-3 py-1 text-right ${theme.textSecondary}`}>{col.distinct_count}</td>\n <td className={`px-3 py-1 text-right ${theme.textSecondary}`}>{col.null_count}</td>\n <td className={`px-3 py-1 ${theme.textSecondary}`}>\n {col.type === 'string' && (col.avg_length ?? 0) > 0 && `len: ${col.min_length}–${col.max_length}`}\n {(col.type === 'int64' || col.type === 'float64') && col.min !== undefined && `${col.min}–${col.max}`}\n </td>\n <td className={`px-3 py-1 ${theme.textSecondary} max-w-[200px] truncate`}>{col.top_values?.slice(0, 3).join(', ')}</td>\n </tr>\n ))}</tbody>\n </table>\n </div>\n )}\n </div>\n );\n}\n\n// ─── State Selector ───────────────────────────────────────────────\n\ninterface StateSelectorProps {\n states: StatefsState[];\n activeStateId?: string | null;\n onSelect: (id: string) => void;\n theme: DashboardTheme;\n}\n\nfunction StateSelector({ states, activeStateId, onSelect, theme }: StateSelectorProps) {\n return (\n <div className={`border ${theme.border} bg-midnight-surface mb-3`}>\n <div className={`px-3 py-2 bg-midnight-elevated flex items-center gap-2`}>\n <Database className=\"w-4 h-4\" />\n <span className={`text-sm font-mono ${theme.text}`}>States ({states.length})</span>\n </div>\n <div className=\"max-h-[140px] overflow-y-auto\">\n {states.map(s => (\n <div key={s.state_id} onClick={() => onSelect(s.state_id)}\n className={`px-3 py-1.5 cursor-pointer flex justify-between items-center border-b border-dashed ${theme.border} ${s.state_id === activeStateId ? 'bg-midnight-raised' : ''} hover:bg-midnight-raised transition-colors`}>\n <span className={`font-mono text-xs ${theme.text} truncate`}>{s.state_id}</span>\n <span className={`text-xs ${theme.textSecondary} ml-2 shrink-0`}>{s.row_count?.toLocaleString()} rows</span>\n </div>\n ))}\n {!states.length && <div className={`px-3 py-4 text-center text-sm ${theme.textSecondary}`}>No states found</div>}\n </div>\n </div>\n );\n}\n\n// ─── Chat Input ───────────────────────────────────────────────────\n\ninterface ChatInputProps {\n onSend: (text: string) => void;\n loading: boolean;\n theme: DashboardTheme;\n}\n\nfunction ChatInput({ onSend, loading, theme }: ChatInputProps) {\n const [text, setText] = useState('');\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (!text.trim() || loading) return;\n onSend(text.trim());\n setText('');\n };\n return (\n <form onSubmit={handleSubmit} className={`flex gap-2 px-3 py-2 border-t ${theme.border} bg-midnight-elevated shrink-0`}>\n <input value={text} onChange={e => setText(e.target.value)}\n placeholder=\"Ask AI to refine the dashboard...\" disabled={loading}\n className=\"flex-1 bg-midnight-surface border border-midnight-border px-3 py-1.5 text-sm outline-none text-midnight-text-body placeholder:text-midnight-text-muted\" />\n <button type=\"submit\" disabled={loading || !text.trim()}\n className={`px-3 py-1.5 border border-midnight-border text-sm flex items-center gap-1 ${loading ? 'opacity-50' : 'hover:bg-midnight-raised'} transition-colors`}>\n {loading ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Send className=\"w-4 h-4\" />}\n </button>\n </form>\n );\n}\n\n// ─── Mode Tab Button ──────────────────────────────────────────────\n\ninterface ModeTabProps {\n active: boolean;\n onClick: () => void;\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n}\n\nfunction ModeTab({ active, onClick, icon: Icon, label }: ModeTabProps) {\n return (\n <button onClick={onClick}\n className={`px-3 py-1 text-xs font-mono border transition-colors ${\n active ? 'border-midnight-accent text-midnight-accent bg-midnight-accent/10' : 'border-midnight-border text-midnight-text-muted hover:bg-midnight-raised'\n }`}>\n <Icon className=\"w-3 h-3 inline mr-1\" />{label}\n </button>\n );\n}\n\n// The available mode tabs, in display order. `tabs` filters this set.\nconst MODE_TABS: { mode: Mode; icon: React.ComponentType<{ className?: string }>; label: string }[] = [\n { mode: 'dashboard', icon: Sparkles, label: 'Dashboard' },\n { mode: 'builder', icon: BarChart3, label: 'Chart Builder' },\n { mode: 'sql', icon: Terminal, label: 'SQL' },\n];\n\n// ─── Main ─────────────────────────────────────────────────────────\n\nexport interface DataExplorerProps {\n /** All records for the active state (viz/builder source). Empty when not loaded. */\n records: Row[];\n /** Active state's columns ({ name, type }), from schema or profile. */\n columns: Column[];\n /** The catalog of selectable states. */\n states?: StatefsState[];\n /** Currently-selected state id (null = none selected). */\n activeStateId?: string | null;\n /** Profile (stats) of the active state. */\n profile?: DatasetProfile | null;\n /** Active dashboard config (null = not yet generated). */\n dashboard?: Dashboard | null;\n /** Persisted id of the active dashboard (null = unsaved). Drives Save vs Save-as. */\n dashboardId?: string | null;\n /** Saved dashboards listed for the current project (shown in the saved panel). */\n savedDashboards?: SavedDashboard[];\n /** True while the catalog/profile/records are loading. */\n loading?: boolean;\n /** True while the AI is generating/refining the dashboard. */\n analyzing?: boolean;\n /** Initial mode tab. Defaults to 'dashboard'; the published viewer uses 'sql'\n * so the SQL console is the primary surface. Clamped to `tabs`. */\n defaultMode?: Mode;\n /** Which mode tabs to show, in order. Defaults to all three. Pass a subset to\n * turn tabs off (e.g. ['sql'] for a SQL-only explorer). */\n tabs?: Mode[];\n\n /** Select a state (host fetches its profile/records). */\n onSelectState: (id: string) => void;\n /** Refresh the states catalog. */\n onRefreshStates?: () => void;\n}\n\nexport function DataExplorer({\n records,\n columns,\n states = [],\n activeStateId,\n profile,\n dashboard,\n dashboardId,\n savedDashboards = [],\n loading = false,\n analyzing = false,\n defaultMode = 'dashboard',\n tabs = ['dashboard', 'builder', 'sql'],\n onSelectState,\n onRefreshStates,\n}: DataExplorerProps) {\n const { theme, newDashboard, addPanel, saveDashboard, listDashboards, searchDashboards, loadDashboard, deleteDashboard, analyzeDataset, refineDashboard } = useDashboard();\n const caps = useCapabilities();\n\n const visibleTabs = MODE_TABS.filter(t => tabs.includes(t.mode));\n const [mode, setMode] = useState<Mode>(tabs.includes(defaultMode) ? defaultMode : tabs[0] ?? 'sql');\n const [fullscreen, setFullscreen] = useState(false);\n const [showSaved, setShowSaved] = useState(false);\n const [saveName, setSaveName] = useState('');\n const [showSaveInput, setShowSaveInput] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n\n // The save/load/list panel is only meaningful if the host can persist.\n const showPersistence = caps.canSave || caps.canList || caps.canLoad || caps.canDelete;\n\n const handleAutoAnalyze = () => {\n setMode('dashboard');\n analyzeDataset?.();\n };\n\n const handleSave = async () => {\n if (!caps.canSave) return;\n if (showSaveInput && saveName.trim()) {\n await saveDashboard?.(saveName.trim());\n setShowSaveInput(false);\n setSaveName('');\n } else if (dashboardId) {\n await saveDashboard?.(); // update existing\n } else {\n setShowSaveInput(true);\n }\n };\n\n const handleOpenSaved = () => {\n listDashboards?.();\n setShowSaved(!showSaved);\n };\n\n const handleSearch = (q: string) => {\n setSearchQuery(q);\n searchDashboards?.(q);\n };\n\n return (\n <div className={`flex flex-col ${theme.bg} ${theme.text} p-4 ${fullscreen ? 'fixed inset-0 z-50' : 'h-full'}`}>\n {/* Header */}\n <div className=\"flex items-center gap-2 mb-3 shrink-0\">\n <Rows3 className=\"w-5 h-5\" />\n <h1 className=\"text-lg font-mono\">Data Explorer</h1>\n {(loading || analyzing) && <Loader2 className=\"w-4 h-4 animate-spin text-midnight-text-muted ml-2\" />}\n {onRefreshStates && (\n <button onClick={onRefreshStates} className=\"ml-auto p-1 hover:bg-midnight-raised transition-colors\">\n <RefreshCw className=\"w-4 h-4\" />\n </button>\n )}\n <button onClick={() => setFullscreen(f => !f)} title={fullscreen ? 'Exit full screen' : 'Full screen'}\n className={`p-1 hover:bg-midnight-raised transition-colors ${onRefreshStates ? '' : 'ml-auto'}`}>\n {fullscreen ? <Minimize2 className=\"w-4 h-4\" /> : <Maximize2 className=\"w-4 h-4\" />}\n </button>\n </div>\n\n {/* State selector */}\n <div className=\"shrink-0\">\n <StateSelector states={states} activeStateId={activeStateId} onSelect={onSelectState} theme={theme} />\n </div>\n\n {activeStateId && (\n <>\n {/* Profile + controls */}\n <div className=\"flex items-start gap-3 mb-3 shrink-0\">\n <div className=\"flex-1\"><ProfileSummary profile={profile} theme={theme} /></div>\n {caps.canAnalyze && (\n <button onClick={handleAutoAnalyze} disabled={analyzing || !profile}\n className={`shrink-0 flex items-center gap-2 px-4 py-2 border text-sm font-mono transition-colors ${\n analyzing ? 'border-midnight-border opacity-50' : 'border-midnight-accent text-midnight-accent hover:bg-midnight-accent/10'\n }`}>\n {analyzing ? <Loader2 className=\"w-4 h-4 animate-spin\" /> : <Sparkles className=\"w-4 h-4\" />}\n {analyzing ? 'Analyzing...' : 'Auto-Analyze'}\n </button>\n )}\n </div>\n\n {/* Mode tabs + save/load */}\n <div className=\"flex items-center gap-1 mb-3 shrink-0\">\n {visibleTabs.map(t => (\n <ModeTab key={t.mode} active={mode === t.mode} onClick={() => setMode(t.mode)} icon={t.icon} label={t.label} />\n ))}\n\n {caps.canNew && (\n <button onClick={() => { newDashboard?.(); setMode('builder'); }} title=\"Start a new dashboard\"\n className=\"flex items-center gap-1 px-2 py-1 text-xs font-mono border border-midnight-border text-midnight-text-muted hover:bg-midnight-raised hover:text-midnight-accent transition-colors\">\n <Plus className=\"w-3.5 h-3.5\" /> New Dashboard\n </button>\n )}\n\n {showPersistence && (\n <div className=\"flex items-center gap-1 ml-auto\">\n {caps.canSave && showSaveInput && (\n <input value={saveName} onChange={e => setSaveName(e.target.value)}\n onKeyDown={e => { if (e.key === 'Enter') void handleSave(); }}\n placeholder=\"Dashboard name...\"\n className=\"bg-midnight-surface border border-midnight-border px-2 py-1 text-xs outline-none text-midnight-text-body w-40\" autoFocus />\n )}\n {caps.canSave && dashboard && (\n <button onClick={() => void handleSave()} title={dashboardId ? 'Save' : 'Save as...'}\n className=\"p-1 border border-midnight-border text-midnight-text-muted hover:bg-midnight-raised transition-colors\">\n <Save className=\"w-3.5 h-3.5\" />\n </button>\n )}\n {(caps.canList || caps.canLoad || caps.canDelete) && (\n <button onClick={handleOpenSaved} title=\"Saved dashboards\"\n className={`p-1 border transition-colors ${showSaved ? 'border-midnight-accent text-midnight-accent' : 'border-midnight-border text-midnight-text-muted hover:bg-midnight-raised'}`}>\n <FolderOpen className=\"w-3.5 h-3.5\" />\n </button>\n )}\n </div>\n )}\n </div>\n\n {/* Saved dashboards panel */}\n {showSaved && (caps.canList || caps.canLoad || caps.canDelete) && (\n <div className={`border ${theme.border} bg-midnight-surface mb-3 shrink-0 max-h-[200px] overflow-y-auto`}>\n {caps.canSearch && (\n <input value={searchQuery} onChange={e => handleSearch(e.target.value)}\n placeholder=\"Search dashboards...\"\n className=\"w-full bg-midnight-surface border-b border-midnight-border px-3 py-1.5 text-xs outline-none text-midnight-text-body placeholder:text-midnight-text-muted sticky top-0\" />\n )}\n {savedDashboards.length === 0 ? (\n <div className=\"px-3 py-3 text-center text-xs text-midnight-text-muted\">No saved dashboards</div>\n ) : savedDashboards.map(d => (\n <div key={d.id} className={`flex items-center justify-between px-3 py-1.5 border-b border-dashed ${theme.border} hover:bg-midnight-raised transition-colors`}>\n {caps.canLoad ? (\n <button onClick={() => { void loadDashboard?.(d.id); setShowSaved(false); setMode('dashboard'); }}\n className=\"flex-1 text-left text-xs font-mono text-midnight-text-body truncate\">\n {d.name}\n </button>\n ) : (\n <span className=\"flex-1 text-xs font-mono text-midnight-text-body truncate\">{d.name}</span>\n )}\n {typeof d.updated_at === 'string' && (\n <span className=\"text-xs text-midnight-text-muted mx-2\">{new Date(d.updated_at).toLocaleDateString()}</span>\n )}\n {caps.canDelete && (\n <button onClick={() => void deleteDashboard?.(d.id)}\n className=\"p-0.5 text-midnight-text-muted hover:text-red-400 transition-colors\">\n <Trash2 className=\"w-3 h-3\" />\n </button>\n )}\n </div>\n ))}\n </div>\n )}\n\n {/* Content */}\n <div className={`border ${theme.border} bg-midnight-surface flex-1 flex flex-col min-h-0`}>\n {mode === 'sql' ? (\n <SqlConsole columns={columns} stateId={activeStateId ?? undefined} />\n ) : mode === 'builder' ? (\n <ChartBuilder records={records} columns={columns} stateId={activeStateId ?? undefined}\n onSave={addPanel ? (panel) => { addPanel(panel); setMode('dashboard'); } : undefined} />\n ) : (\n <>\n <div className=\"flex-1 min-h-0 overflow-auto\">\n {dashboard ? (\n <DashboardRenderer dashboard={dashboard} records={records} columns={columns} />\n ) : (\n <div className=\"flex flex-col items-center justify-center h-full gap-4 text-midnight-text-muted\">\n <Sparkles className=\"w-8 h-8\" />\n <p className=\"text-sm\">\n {caps.canAnalyze\n ? <>Click <strong>Auto-Analyze</strong> to generate an AI dashboard</>\n : caps.canNew\n ? 'Start a new dashboard, then add charts from the Chart Builder'\n : 'No dashboard to display'}\n </p>\n {caps.canNew && (\n <button onClick={() => { newDashboard?.(); setMode('builder'); }}\n className=\"flex items-center gap-1.5 px-3 py-1.5 text-xs font-mono border border-midnight-accent text-midnight-accent hover:bg-midnight-accent/10 transition-colors\">\n <Plus className=\"w-4 h-4\" /> Create Dashboard\n </button>\n )}\n </div>\n )}\n </div>\n {dashboard && caps.canRefine && refineDashboard && (\n <ChatInput onSend={refineDashboard} loading={analyzing} theme={theme} />\n )}\n </>\n )}\n </div>\n </>\n )}\n </div>\n );\n}\n\nexport default DataExplorer;\n"]}
|