@quantumwake/terminal-ux-dashboard-components 0.1.1 → 0.1.2
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 +3 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +3 -2
- 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/components/views/MetricView.tsx","../src/components/views/InsightView.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/PivotView.tsx","../src/components/ChartStyleControls.tsx","../src/components/SqlConsole.tsx","../src/components/ChartBuilder.tsx","../src/components/DashboardRenderer.tsx","../src/components/DataExplorer.tsx"],"names":["createContext","jsx","useContext","useMemo","jsxs","ResponsiveBar","ResponsivePie","ResponsiveLine","ResponsiveScatterPlot","ResponsiveHeatMap","useState","PivotTableUI","Loader2","Play","AlertCircle","Rows3","BarChart3","PieChart","TrendingUp","ScatterChart","LayoutGrid","GripVertical","X","Plus","Filter","Suspense","useRef","useEffect","Code","ChevronDown","Sparkles","Database","Send","RefreshCw","Minimize2","Maximize2","Fragment","Terminal","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// Two hosts, one component tree:\n// - ui-enterprise (studio, source of truth): provides everything — runQuery\n// against statefs-node /query, plus the logged-in verbs (save/load/search/\n// delete/analyze/refine/edit).\n// - publish-ui (published viewer, immutable): provides ONLY theme + runQuery\n// (DuckDB-WASM). The studio-only verbs are omitted, so the chart builder,\n// dashboard and SQL runner render read-only — no save/edit/load affordances.\n//\n// Rule of thumb: a capability that is absent ⇒ its affordance is hidden. So\n// publish-ui 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// 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. Studio → statefs-node /query; viewer →\n // DuckDB-WASM. stateId selects the dataset when the host is 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 — editing (studio-only). Absent ⇒ panels are read-only.\n removePanel?: (panelId: string) => void;\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 canEditPanels: !!c.removePanel,\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// the studio (statefs-node /query) or client-side in the viewer (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';\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}\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// statefs 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 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}: 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 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} 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 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 return [{ id: 'points', data: rows.map((r) => ({ x: Number(r.x) || 0, y: Number(r.y) || 0 })) }];\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 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 xLegendPosition: LegendPosition;\n xLegendOffset: number;\n yLegendPosition: LegendPosition;\n yLegendOffset: number;\n legendAnchor: LegendAnchor;\n titleAlign: TitleAlign;\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 // Series legend placement (charts that have one: pie, grouped bar).\n legendAnchor: 'right',\n // Panel title alignment (rendered by DashboardRenderer's panel header).\n titleAlign: 'left',\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: { text: { fill: s.legendColor, fontSize: s.fontSize + 2 } },\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// Axis legend (title) props for a given axis ('x' | 'y').\nexport const axisLegend = (style: Partial<ChartStyle> | null | undefined, axis: 'x' | 'y', legendText: string) => {\n const s = withStyleDefaults(style);\n const isX = axis === 'x';\n return {\n legend: legendText,\n legendPosition: isX ? s.xLegendPosition : s.yLegendPosition,\n legendOffset: isX ? s.xLegendOffset : s.yLegendOffset,\n };\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). Extracted from ui-enterprise's DataExplorer.\n\nimport type { Row } from './sqlgen';\n\nexport type AggFn = 'count' | 'distinct' | 'sum' | 'avg' | 'min' | 'max';\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 default: return records.length;\n }\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","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 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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, tickRotation: -35 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, format: (v) => Number(v).toLocaleString() }}\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 min-h-[400px]\">\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, axisLegend } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, tickRotation: -35, ...axisLegend(style, 'x', xColumn) }}\n axisLeft={{ tickSize: 5, tickPadding: 5, ...axisLegend(style, 'y', yColumn) }}\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, axisLegend } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\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 const points = records\n .filter((r) => r[xColumn] != null && r[yColumn] != null)\n .map((r) => ({ x: Number(r[xColumn]) || 0, y: Number(r[yColumn]) || 0 }))\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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, ...axisLegend(style, 'x', xColumn) }}\n axisLeft={{ tickSize: 5, tickPadding: 5, ...axisLegend(style, 'y', yColumn) }}\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 min-h-[400px]\">\n <ResponsiveHeatMap\n data={data as never}\n margin={margin}\n axisTop={{ tickSize: 5, tickPadding: 5, tickRotation: -35, legend: colColumn, legendPosition: s.xLegendPosition, legendOffset: -50 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, legend: 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 { 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 { useDashboard } from '../context/DashboardContext';\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\n\n// A single labelled control row — fixed label column + control, so every row in\n// the panel lines up on the same grid (consistent spacing/alignment).\ninterface RowProps {\n label: string;\n children: ReactNode;\n}\n\nfunction Row({ label, children }: RowProps) {\n const { theme } = useDashboard();\n return (\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className={`text-xs ${theme.font} text-midnight-text-muted`}>{label}</span>\n <div className=\"flex items-center\">{children}</div>\n </div>\n );\n}\n\ninterface ColorControlProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction ColorControl({ value, onChange }: ColorControlProps) {\n const { theme } = useDashboard();\n return (\n <input type=\"color\" value={/^#/.test(value) ? value : '#94a3b8'} onChange={e => onChange(e.target.value)}\n className={`w-9 h-6 bg-transparent border ${theme.border} cursor-pointer`} />\n );\n}\n\ninterface NumberControlProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n}\n\nfunction NumberControl({ value, onChange, min, max }: NumberControlProps) {\n const { theme } = useDashboard();\n return (\n <input type=\"number\" value={value} min={min} max={max} onChange={e => onChange(Number(e.target.value))}\n className={`w-20 px-2 py-1 text-xs ${theme.font} bg-midnight-surface border ${theme.border} text-midnight-text-body outline-none focus:border-midnight-accent`} />\n );\n}\n\ninterface ChoiceProps<T extends string> {\n value: T;\n options: readonly T[];\n onChange: (value: T) => void;\n}\n\n// Themed native <select> for a simple string-option choice. (Replaces the\n// host-coupled TerminalDropdown so the component stays host-agnostic.)\nfunction Choice<T extends string>({ value, options, onChange }: ChoiceProps<T>) {\n const { theme } = useDashboard();\n return (\n <div className=\"w-28\">\n <select value={value} onChange={e => onChange(e.target.value as T)}\n className={`w-full px-2 py-1 text-xs ${theme.font} bg-midnight-surface border ${theme.border} text-midnight-text-body outline-none focus:border-midnight-accent`}>\n {options.map(o => <option key={o} value={o}>{o}</option>)}\n </select>\n </div>\n );\n}\n\ninterface GroupProps {\n children: ReactNode;\n last?: boolean;\n}\n\nfunction Group({ children, last }: GroupProps) {\n const { theme } = useDashboard();\n return <div className={`space-y-2 pb-3 ${last ? '' : `mb-3 border-b ${theme.border}`}`}>{children}</div>;\n}\n\nexport interface ChartStyleControlsProps {\n style?: Partial<ChartStyle> | null;\n onChange: (next: ChartStyle) => void;\n}\n\n/**\n * ChartStyleControls — the standardized appearance editor used across all\n * charts. Edits a plain style object (see chartStyle.ts); theme-aware via the\n * host-injected DashboardContext theme. Parent persists the style and passes it\n * to the views.\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 <Group>\n <Row label=\"Background\"><ColorControl value={s.background} onChange={v => set('background', v)} /></Row>\n <Row label=\"Text color\"><ColorControl value={s.textColor} onChange={v => set('textColor', v)} /></Row>\n <Row label=\"Title color\"><ColorControl value={s.legendColor} onChange={v => set('legendColor', v)} /></Row>\n <Row label=\"Grid color\"><ColorControl value={s.gridColor} onChange={v => set('gridColor', v)} /></Row>\n <Row label=\"Font size\"><NumberControl value={s.fontSize} min={6} max={24} onChange={v => set('fontSize', v)} /></Row>\n </Group>\n\n <Group>\n <Row label=\"X title pos\"><Choice value={s.xLegendPosition} options={['start', 'middle', 'end'] as const} onChange={v => set('xLegendPosition', v)} /></Row>\n <Row label=\"X title offset\"><NumberControl value={s.xLegendOffset} onChange={v => set('xLegendOffset', v)} /></Row>\n <Row label=\"Y title pos\"><Choice value={s.yLegendPosition} options={['start', 'middle', 'end'] as const} onChange={v => set('yLegendPosition', v)} /></Row>\n <Row label=\"Y title offset\"><NumberControl value={s.yLegendOffset} onChange={v => set('yLegendOffset', v)} /></Row>\n </Group>\n\n <Group last>\n <Row label=\"Legend\"><Choice value={s.legendAnchor} options={['right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none'] as const} onChange={v => set('legendAnchor', v)} /></Row>\n <Row label=\"Title align\"><Choice value={s.titleAlign} options={['left', 'center', 'right'] as const} onChange={v => set('titleAlign', v)} /></Row>\n </Group>\n </div>\n );\n}\n\nexport default ChartStyleControls;\n","import { useState, type KeyboardEvent } from 'react';\nimport { Play, Loader2, AlertCircle, Rows3 } from 'lucide-react';\nimport { useDashboard } from '../context/DashboardContext';\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}\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 }: SqlConsoleProps) {\n const { theme, runQuery } = useDashboard();\n\n const [sql, setSql] = useState<string>(DEFAULT_SQL);\n const [result, setResult] = useState<QueryState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [running, setRunning] = useState<boolean>(false);\n\n const run = async (): Promise<void> => {\n if (running || !sql.trim()) return;\n setRunning(true);\n setError(null);\n try {\n const data = await runQuery(sql, 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 const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>): void => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') { e.preventDefault(); void run(); }\n };\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 <textarea\n value={sql}\n onChange={e => setSql(e.target.value)}\n onKeyDown={onKeyDown}\n spellCheck={false}\n rows={5}\n className=\"w-full bg-midnight-surface border border-midnight-border px-3 py-2 text-sm font-mono outline-none text-midnight-text-body resize-y focus:border-midnight-accent transition-colors\"\n placeholder=\"SELECT ... FROM data\"\n />\n {columns.length > 0 && (\n <div className=\"mt-2 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 {/* 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,\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 { groupBy, aggregate } from '../dataShape';\nimport {\n BarView, PieView, LineView, ScatterView, HeatmapView,\n type BarDatum, type PieDatum, type LineSerie, type ScatterSerie, type HeatmapSerie,\n} from './views';\nimport { ChartStyleControls } from './ChartStyleControls';\n\n// ─── Public types ─────────────────────────────────────────────────\n\n// A schema column descriptor (name + statefs 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: '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 }));\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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, tickRotation: -35 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, format: (v) => Number(v).toLocaleString() }}\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\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 style: ChartStyle;\n}\n\nconst ChartPreview = ({\n chartType, records, xFields, yFields, valueField, groupField, engineMode,\n sqlRows, sqlLoading, sqlError, heatmapOpts = {}, 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 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 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 */\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 // Standardized chart appearance (see chartStyle.ts).\n const [style, setStyle] = useState<ChartStyle>(DEFAULT_CHART_STYLE);\n const [showStyle, setShowStyle] = 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({ chartType, xFields, yFields, valueField, filters } as ChartConfig),\n [chartType, xFields, yFields, valueField, filters],\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\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 }\n\n // Standardized appearance travels with the panel.\n config.style = style;\n\n onSave({\n title: title || `${chartType} chart`,\n type: chartType === 'grouped-bar' ? 'bar' : chartType,\n config,\n width: 6,\n height: 2,\n });\n };\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={chartType === 'heatmap' ? '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' || chartType === 'heatmap' ? 1 : 3}\n />\n\n <DropZone\n label={chartType === 'heatmap' ? '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={chartType !== 'heatmap'}\n maxFields={chartType === 'heatmap' ? 1 : 5}\n />\n\n {chartType === 'heatmap' && (\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={true}\n maxFields={1}\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 <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) */}\n <div className=\"pt-4 border-t border-midnight-border\">\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Available Fields</div>\n <div className=\"space-y-1\">\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 </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 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// - studio (ui-enterprise): wires removePanel ⇒ panels show a remove button.\n// - published viewer (publish-ui): omits removePanel ⇒ read-only dashboard.\n\nimport { Suspense, useEffect, useRef, useState } from 'react';\nimport { X, Sparkles } from 'lucide-react';\n\nimport { useDashboard, useCapabilities } from '../context/DashboardContext';\nimport { shapeChartData } from '../sqlgen';\nimport type { Row, ChartType, ChartField } from '../sqlgen';\nimport type { ChartStyle } from '../chartStyle';\nimport {\n BarView,\n PieView,\n LineView,\n ScatterView,\n HeatmapView,\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 // table / insight\n columns?: string[];\n text?: string;\n\n // metric\n label?: string;\n column?: string;\n\n [key: string]: unknown;\n}\n\nexport interface DashboardPanel {\n id: string;\n type: string;\n title?: string;\n width?: number;\n height?: 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/**\n * SqlPanel renders a panel whose config carries a server-side SQL query\n * (config.sql), running it against the full dataset (via the host's runQuery)\n * and shaping the result for the chart view. Query errors are kept in LOCAL\n * state (the host's runQuery just resolves/rejects).\n */\nfunction SqlPanel({ panel }: SqlPanelProps) {\n const { runQuery } = useDashboard();\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 ChartType | 'metric');\n\n const [rows, setRows] = useState<Row[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n const sql = config.sql || '';\n runQueryRef.current(sql).then(\n (res) => {\n if (cancelled) return;\n setLoading(false);\n setRows(res?.rows || []);\n },\n (err: unknown) => {\n if (cancelled) return;\n setLoading(false);\n setRows(null);\n setError(err instanceof Error ? err.message : String(err) || 'Query failed');\n },\n );\n return () => { cancelled = true; };\n }, [config.sql]);\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 if (error) {\n return <div className=\"flex items-center justify-center h-full text-xs text-red-400 px-2 text-center\">{error}</div>;\n }\n if (!rows) return null;\n\n if (chartType === 'metric') {\n const first = rows[0];\n const v = first ? Object.values(first)[0] : 0;\n return <MetricView value={Number(v) || 0} config={{ column: config.column || '', agg: config.agg, label: config.label }} />;\n }\n\n const shaped = shapeChartData(chartType, rows, { yFields: config.yFields || [] });\n switch (chartType) {\n case 'bar':\n return <BarView data={shaped as never} groupColumn={config.group || ''} valueColumn={config.value || ''} style={config.style} />;\n case 'grouped-bar': {\n // Preset data + keys from the SQL result; groupField is only used for\n // the client-side computation path, so it is irrelevant here.\n const gb = shaped as { data: unknown[]; keys: string[] };\n return <GroupedBarChart data={gb.data as never} keys={gb.keys} yFields={config.yFields || []} style={config.style} />;\n }\n case 'pie':\n return <PieView data={shaped as never} groupColumn={config.group || ''} style={config.style} />;\n case 'line':\n return <LineView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n case 'scatter':\n return <ScatterView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n case 'heatmap':\n return (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 default:\n return <div className=\"p-4 text-xs text-midnight-text-muted\">Unsupported SQL chart: {chartType}</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 fetch their own (full-dataset) data via runQuery.\n if (config.sql) {\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 '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 const cols = config.columns\n ? config.columns.map((c) => ({ name: c }))\n : columns;\n // Inline simple table for dashboard panels.\n const colNames = cols?.map((c) => c.name) || (records && records[0] ? Object.keys(records[0]) : []);\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 {(records || []).slice(0, 50).map((r, i) => (\n <tr key={i} className=\"border-b border-dashed border-midnight-border hover:bg-midnight-raised\">\n {colNames.map((n) => {\n const cellValue = r[n];\n return (\n <td key={n} className=\"px-2 py-1 text-midnight-text-body truncate max-w-[200px]\">\n {cellValue == null ? '' : typeof cellValue === 'object' ? JSON.stringify(cellValue) : String(cellValue)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n default:\n return <div className=\"p-4 text-xs text-midnight-text-muted\">Unknown panel type: {type}</div>;\n }\n}\n\n// ─── DashboardRenderer ─────────────────────────────────────────────────────\n\nconst ROW_HEIGHT = 180; // px per grid row\n\n/**\n * DashboardRenderer — renders a grid of AI-generated or manually configured\n * panels. The per-panel remove button is gated behind canEditPanels: the\n * published viewer (no removePanel) renders the dashboard READ-ONLY.\n */\nexport function DashboardRenderer({ dashboard, records, columns }: DashboardRendererProps) {\n const { theme, removePanel } = useDashboard();\n const { canEditPanels } = useCapabilities();\n\n if (!dashboard) return null;\n\n return (\n <div className=\"flex flex-col gap-4 p-2\">\n {/* Insights banner */}\n {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 )}\n\n {/* Panel grid */}\n <div className=\"grid grid-cols-12 gap-3\">\n {dashboard.panels?.map((panel) => {\n const colSpan = Math.min(Math.max(panel.width || 6, 1), 12);\n const rowSpan = Math.min(Math.max(panel.height || 2, 1), 4);\n\n return (\n <div\n key={panel.id}\n className={`border ${theme.border} bg-midnight-surface flex flex-col`}\n style={{\n gridColumn: `span ${colSpan}`,\n minHeight: `${rowSpan * ROW_HEIGHT}px`,\n }}\n >\n {/* Panel header */}\n <div className={`flex items-center justify-between px-3 py-1.5 border-b ${theme.border} bg-midnight-elevated`}>\n <span className=\"flex-1 text-xs font-mono text-midnight-text-body truncate\" style={{ textAlign: panel.config?.style?.titleAlign || 'left' }}>{panel.title || panel.type}</span>\n {canEditPanels && removePanel && (\n <button\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 {/* Panel content */}\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 </div>\n </div>\n );\n}\n\nexport default DashboardRenderer;\n","// DataExplorer — the host-agnostic container for the statefs Data Explorer.\n//\n// This is the most store-coupled component in the studio. Here it reads NO\n// store: all data/state arrives via props, and every studio-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 the published viewer\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 the zustand 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,\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 statefs 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// ─── 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\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 onSelectState,\n onRefreshStates,\n}: DataExplorerProps) {\n const { theme, saveDashboard, listDashboards, searchDashboards, loadDashboard, deleteDashboard, analyzeDataset, refineDashboard } = useDashboard();\n const caps = useCapabilities();\n\n const [mode, setMode] = useState<Mode>('dashboard');\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 <ModeTab active={mode === 'dashboard'} onClick={() => setMode('dashboard')} icon={Sparkles} label=\"Dashboard\" />\n <ModeTab active={mode === 'builder'} onClick={() => setMode('builder')} icon={BarChart3} label=\"Chart Builder\" />\n <ModeTab active={mode === 'sql'} onClick={() => setMode('sql')} icon={Terminal} label=\"SQL\" />\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 ) : (\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 : 'No dashboard to display'}\n </p>\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/components/views/MetricView.tsx","../src/components/views/InsightView.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/PivotView.tsx","../src/components/ChartStyleControls.tsx","../src/components/SqlConsole.tsx","../src/components/ChartBuilder.tsx","../src/components/DashboardRenderer.tsx","../src/components/DataExplorer.tsx"],"names":["createContext","jsx","useContext","useMemo","jsxs","ResponsiveBar","ResponsivePie","ResponsiveLine","ResponsiveScatterPlot","ResponsiveHeatMap","useState","PivotTableUI","Loader2","Play","AlertCircle","Rows3","BarChart3","PieChart","TrendingUp","ScatterChart","LayoutGrid","GripVertical","X","Plus","Filter","Suspense","useRef","useEffect","Code","ChevronDown","Sparkles","Database","Send","RefreshCw","Minimize2","Maximize2","Fragment","Terminal","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// Two hosts, one component tree:\n// - ui-enterprise (studio, source of truth): provides everything — runQuery\n// against statefs-node /query, plus the logged-in verbs (save/load/search/\n// delete/analyze/refine/edit).\n// - publish-ui (published viewer, immutable): provides ONLY theme + runQuery\n// (DuckDB-WASM). The studio-only verbs are omitted, so the chart builder,\n// dashboard and SQL runner render read-only — no save/edit/load affordances.\n//\n// Rule of thumb: a capability that is absent ⇒ its affordance is hidden. So\n// publish-ui 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. Studio → statefs-node /query; viewer →\n // DuckDB-WASM. stateId selects the dataset when the host is 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 — 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\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 canAddPanel: !!c.addPanel,\n canEditPanels: !!c.removePanel,\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// the studio (statefs-node /query) or client-side in the viewer (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';\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}\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// statefs 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 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}: 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 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} 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 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 return [{ id: 'points', data: rows.map((r) => ({ x: Number(r.x) || 0, y: Number(r.y) || 0 })) }];\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 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 xLegendPosition: LegendPosition;\n xLegendOffset: number;\n yLegendPosition: LegendPosition;\n yLegendOffset: number;\n legendAnchor: LegendAnchor;\n titleAlign: TitleAlign;\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 // Series legend placement (charts that have one: pie, grouped bar).\n legendAnchor: 'right',\n // Panel title alignment (rendered by DashboardRenderer's panel header).\n titleAlign: 'left',\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: { text: { fill: s.legendColor, fontSize: s.fontSize + 2 } },\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// Axis legend (title) props for a given axis ('x' | 'y').\nexport const axisLegend = (style: Partial<ChartStyle> | null | undefined, axis: 'x' | 'y', legendText: string) => {\n const s = withStyleDefaults(style);\n const isX = axis === 'x';\n return {\n legend: legendText,\n legendPosition: isX ? s.xLegendPosition : s.yLegendPosition,\n legendOffset: isX ? s.xLegendOffset : s.yLegendOffset,\n };\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). Extracted from ui-enterprise's DataExplorer.\n\nimport type { Row } from './sqlgen';\n\nexport type AggFn = 'count' | 'distinct' | 'sum' | 'avg' | 'min' | 'max';\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 default: return records.length;\n }\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","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 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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, tickRotation: -35 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, format: (v) => Number(v).toLocaleString() }}\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 min-h-[400px]\">\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, axisLegend } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, tickRotation: -35, ...axisLegend(style, 'x', xColumn) }}\n axisLeft={{ tickSize: 5, tickPadding: 5, ...axisLegend(style, 'y', yColumn) }}\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, axisLegend } from '../../chartStyle';\nimport type { ChartStyle } from '../../chartStyle';\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 const points = records\n .filter((r) => r[xColumn] != null && r[yColumn] != null)\n .map((r) => ({ x: Number(r[xColumn]) || 0, y: Number(r[yColumn]) || 0 }))\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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, ...axisLegend(style, 'x', xColumn) }}\n axisLeft={{ tickSize: 5, tickPadding: 5, ...axisLegend(style, 'y', yColumn) }}\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 min-h-[400px]\">\n <ResponsiveHeatMap\n data={data as never}\n margin={margin}\n axisTop={{ tickSize: 5, tickPadding: 5, tickRotation: -35, legend: colColumn, legendPosition: s.xLegendPosition, legendOffset: -50 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, legend: 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 { 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 { useDashboard } from '../context/DashboardContext';\nimport { withStyleDefaults } from '../chartStyle';\nimport type { ChartStyle } from '../chartStyle';\n\n// A single labelled control row — fixed label column + control, so every row in\n// the panel lines up on the same grid (consistent spacing/alignment).\ninterface RowProps {\n label: string;\n children: ReactNode;\n}\n\nfunction Row({ label, children }: RowProps) {\n const { theme } = useDashboard();\n return (\n <div className=\"flex items-center justify-between gap-3 min-h-[28px]\">\n <span className={`text-xs ${theme.font} text-midnight-text-muted`}>{label}</span>\n <div className=\"flex items-center\">{children}</div>\n </div>\n );\n}\n\ninterface ColorControlProps {\n value: string;\n onChange: (value: string) => void;\n}\n\nfunction ColorControl({ value, onChange }: ColorControlProps) {\n const { theme } = useDashboard();\n return (\n <input type=\"color\" value={/^#/.test(value) ? value : '#94a3b8'} onChange={e => onChange(e.target.value)}\n className={`w-9 h-6 bg-transparent border ${theme.border} cursor-pointer`} />\n );\n}\n\ninterface NumberControlProps {\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n}\n\nfunction NumberControl({ value, onChange, min, max }: NumberControlProps) {\n const { theme } = useDashboard();\n return (\n <input type=\"number\" value={value} min={min} max={max} onChange={e => onChange(Number(e.target.value))}\n className={`w-20 px-2 py-1 text-xs ${theme.font} bg-midnight-surface border ${theme.border} text-midnight-text-body outline-none focus:border-midnight-accent`} />\n );\n}\n\ninterface ChoiceProps<T extends string> {\n value: T;\n options: readonly T[];\n onChange: (value: T) => void;\n}\n\n// Themed native <select> for a simple string-option choice. (Replaces the\n// host-coupled TerminalDropdown so the component stays host-agnostic.)\nfunction Choice<T extends string>({ value, options, onChange }: ChoiceProps<T>) {\n const { theme } = useDashboard();\n return (\n <div className=\"w-28\">\n <select value={value} onChange={e => onChange(e.target.value as T)}\n className={`w-full px-2 py-1 text-xs ${theme.font} bg-midnight-surface border ${theme.border} text-midnight-text-body outline-none focus:border-midnight-accent`}>\n {options.map(o => <option key={o} value={o}>{o}</option>)}\n </select>\n </div>\n );\n}\n\ninterface GroupProps {\n children: ReactNode;\n last?: boolean;\n}\n\nfunction Group({ children, last }: GroupProps) {\n const { theme } = useDashboard();\n return <div className={`space-y-2 pb-3 ${last ? '' : `mb-3 border-b ${theme.border}`}`}>{children}</div>;\n}\n\nexport interface ChartStyleControlsProps {\n style?: Partial<ChartStyle> | null;\n onChange: (next: ChartStyle) => void;\n}\n\n/**\n * ChartStyleControls — the standardized appearance editor used across all\n * charts. Edits a plain style object (see chartStyle.ts); theme-aware via the\n * host-injected DashboardContext theme. Parent persists the style and passes it\n * to the views.\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 <Group>\n <Row label=\"Background\"><ColorControl value={s.background} onChange={v => set('background', v)} /></Row>\n <Row label=\"Text color\"><ColorControl value={s.textColor} onChange={v => set('textColor', v)} /></Row>\n <Row label=\"Title color\"><ColorControl value={s.legendColor} onChange={v => set('legendColor', v)} /></Row>\n <Row label=\"Grid color\"><ColorControl value={s.gridColor} onChange={v => set('gridColor', v)} /></Row>\n <Row label=\"Font size\"><NumberControl value={s.fontSize} min={6} max={24} onChange={v => set('fontSize', v)} /></Row>\n </Group>\n\n <Group>\n <Row label=\"X title pos\"><Choice value={s.xLegendPosition} options={['start', 'middle', 'end'] as const} onChange={v => set('xLegendPosition', v)} /></Row>\n <Row label=\"X title offset\"><NumberControl value={s.xLegendOffset} onChange={v => set('xLegendOffset', v)} /></Row>\n <Row label=\"Y title pos\"><Choice value={s.yLegendPosition} options={['start', 'middle', 'end'] as const} onChange={v => set('yLegendPosition', v)} /></Row>\n <Row label=\"Y title offset\"><NumberControl value={s.yLegendOffset} onChange={v => set('yLegendOffset', v)} /></Row>\n </Group>\n\n <Group last>\n <Row label=\"Legend\"><Choice value={s.legendAnchor} options={['right', 'top-left', 'top-right', 'bottom-left', 'bottom-right', 'none'] as const} onChange={v => set('legendAnchor', v)} /></Row>\n <Row label=\"Title align\"><Choice value={s.titleAlign} options={['left', 'center', 'right'] as const} onChange={v => set('titleAlign', v)} /></Row>\n </Group>\n </div>\n );\n}\n\nexport default ChartStyleControls;\n","import { useState, type KeyboardEvent } from 'react';\nimport { Play, Loader2, AlertCircle, Rows3 } from 'lucide-react';\nimport { useDashboard } from '../context/DashboardContext';\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}\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 }: SqlConsoleProps) {\n const { theme, runQuery } = useDashboard();\n\n const [sql, setSql] = useState<string>(DEFAULT_SQL);\n const [result, setResult] = useState<QueryState | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [running, setRunning] = useState<boolean>(false);\n\n const run = async (): Promise<void> => {\n if (running || !sql.trim()) return;\n setRunning(true);\n setError(null);\n try {\n const data = await runQuery(sql, 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 const onKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>): void => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'Enter') { e.preventDefault(); void run(); }\n };\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 <textarea\n value={sql}\n onChange={e => setSql(e.target.value)}\n onKeyDown={onKeyDown}\n spellCheck={false}\n rows={5}\n className=\"w-full bg-midnight-surface border border-midnight-border px-3 py-2 text-sm font-mono outline-none text-midnight-text-body resize-y focus:border-midnight-accent transition-colors\"\n placeholder=\"SELECT ... FROM data\"\n />\n {columns.length > 0 && (\n <div className=\"mt-2 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 {/* 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,\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 { groupBy, aggregate } from '../dataShape';\nimport {\n BarView, PieView, LineView, ScatterView, HeatmapView,\n type BarDatum, type PieDatum, type LineSerie, type ScatterSerie, type HeatmapSerie,\n} from './views';\nimport { ChartStyleControls } from './ChartStyleControls';\n\n// ─── Public types ─────────────────────────────────────────────────\n\n// A schema column descriptor (name + statefs 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: '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 }));\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 min-h-[400px]\">\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={{ tickSize: 5, tickPadding: 5, tickRotation: -35 }}\n axisLeft={{ tickSize: 5, tickPadding: 5, format: (v) => Number(v).toLocaleString() }}\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\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 style: ChartStyle;\n}\n\nconst ChartPreview = ({\n chartType, records, xFields, yFields, valueField, groupField, engineMode,\n sqlRows, sqlLoading, sqlError, heatmapOpts = {}, 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 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 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 */\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 // Standardized chart appearance (see chartStyle.ts).\n const [style, setStyle] = useState<ChartStyle>(DEFAULT_CHART_STYLE);\n const [showStyle, setShowStyle] = 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({ chartType, xFields, yFields, valueField, filters } as ChartConfig),\n [chartType, xFields, yFields, valueField, filters],\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\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 }\n\n // Standardized appearance travels with the panel.\n config.style = style;\n\n onSave({\n title: title || `${chartType} chart`,\n type: chartType === 'grouped-bar' ? 'bar' : chartType,\n config,\n width: 6,\n height: 2,\n });\n };\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={chartType === 'heatmap' ? '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' || chartType === 'heatmap' ? 1 : 3}\n />\n\n <DropZone\n label={chartType === 'heatmap' ? '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={chartType !== 'heatmap'}\n maxFields={chartType === 'heatmap' ? 1 : 5}\n />\n\n {chartType === 'heatmap' && (\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={true}\n maxFields={1}\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 <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) */}\n <div className=\"pt-4 border-t border-midnight-border\">\n <div className=\"text-xs uppercase text-midnight-text-muted mb-2 font-mono\">Available Fields</div>\n <div className=\"space-y-1\">\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 </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 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// - studio (ui-enterprise): wires removePanel ⇒ panels show a remove button.\n// - published viewer (publish-ui): omits removePanel ⇒ read-only dashboard.\n\nimport { Suspense, useEffect, useRef, useState } from 'react';\nimport { X, Sparkles } from 'lucide-react';\n\nimport { useDashboard, useCapabilities } from '../context/DashboardContext';\nimport { shapeChartData } from '../sqlgen';\nimport type { Row, ChartType, ChartField } from '../sqlgen';\nimport type { ChartStyle } from '../chartStyle';\nimport {\n BarView,\n PieView,\n LineView,\n ScatterView,\n HeatmapView,\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 // table / insight\n columns?: string[];\n text?: string;\n\n // metric\n label?: string;\n column?: string;\n\n [key: string]: unknown;\n}\n\nexport interface DashboardPanel {\n id: string;\n type: string;\n title?: string;\n width?: number;\n height?: 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/**\n * SqlPanel renders a panel whose config carries a server-side SQL query\n * (config.sql), running it against the full dataset (via the host's runQuery)\n * and shaping the result for the chart view. Query errors are kept in LOCAL\n * state (the host's runQuery just resolves/rejects).\n */\nfunction SqlPanel({ panel }: SqlPanelProps) {\n const { runQuery } = useDashboard();\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 ChartType | 'metric');\n\n const [rows, setRows] = useState<Row[] | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n setLoading(true);\n setError(null);\n const sql = config.sql || '';\n runQueryRef.current(sql).then(\n (res) => {\n if (cancelled) return;\n setLoading(false);\n setRows(res?.rows || []);\n },\n (err: unknown) => {\n if (cancelled) return;\n setLoading(false);\n setRows(null);\n setError(err instanceof Error ? err.message : String(err) || 'Query failed');\n },\n );\n return () => { cancelled = true; };\n }, [config.sql]);\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 if (error) {\n return <div className=\"flex items-center justify-center h-full text-xs text-red-400 px-2 text-center\">{error}</div>;\n }\n if (!rows) return null;\n\n if (chartType === 'metric') {\n const first = rows[0];\n const v = first ? Object.values(first)[0] : 0;\n return <MetricView value={Number(v) || 0} config={{ column: config.column || '', agg: config.agg, label: config.label }} />;\n }\n\n const shaped = shapeChartData(chartType, rows, { yFields: config.yFields || [] });\n switch (chartType) {\n case 'bar':\n return <BarView data={shaped as never} groupColumn={config.group || ''} valueColumn={config.value || ''} style={config.style} />;\n case 'grouped-bar': {\n // Preset data + keys from the SQL result; groupField is only used for\n // the client-side computation path, so it is irrelevant here.\n const gb = shaped as { data: unknown[]; keys: string[] };\n return <GroupedBarChart data={gb.data as never} keys={gb.keys} yFields={config.yFields || []} style={config.style} />;\n }\n case 'pie':\n return <PieView data={shaped as never} groupColumn={config.group || ''} style={config.style} />;\n case 'line':\n return <LineView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n case 'scatter':\n return <ScatterView data={shaped as never} xColumn={config.x || ''} yColumn={config.y || ''} style={config.style} />;\n case 'heatmap':\n return (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 default:\n return <div className=\"p-4 text-xs text-midnight-text-muted\">Unsupported SQL chart: {chartType}</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 fetch their own (full-dataset) data via runQuery.\n if (config.sql) {\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 '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 const cols = config.columns\n ? config.columns.map((c) => ({ name: c }))\n : columns;\n // Inline simple table for dashboard panels.\n const colNames = cols?.map((c) => c.name) || (records && records[0] ? Object.keys(records[0]) : []);\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 {(records || []).slice(0, 50).map((r, i) => (\n <tr key={i} className=\"border-b border-dashed border-midnight-border hover:bg-midnight-raised\">\n {colNames.map((n) => {\n const cellValue = r[n];\n return (\n <td key={n} className=\"px-2 py-1 text-midnight-text-body truncate max-w-[200px]\">\n {cellValue == null ? '' : typeof cellValue === 'object' ? JSON.stringify(cellValue) : String(cellValue)}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n }\n default:\n return <div className=\"p-4 text-xs text-midnight-text-muted\">Unknown panel type: {type}</div>;\n }\n}\n\n// ─── DashboardRenderer ─────────────────────────────────────────────────────\n\nconst ROW_HEIGHT = 180; // px per grid row\n\n/**\n * DashboardRenderer — renders a grid of AI-generated or manually configured\n * panels. The per-panel remove button is gated behind canEditPanels: the\n * published viewer (no removePanel) renders the dashboard READ-ONLY.\n */\nexport function DashboardRenderer({ dashboard, records, columns }: DashboardRendererProps) {\n const { theme, removePanel } = useDashboard();\n const { canEditPanels } = useCapabilities();\n\n if (!dashboard) return null;\n\n return (\n <div className=\"flex flex-col gap-4 p-2\">\n {/* Insights banner */}\n {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 )}\n\n {/* Panel grid */}\n <div className=\"grid grid-cols-12 gap-3\">\n {dashboard.panels?.map((panel) => {\n const colSpan = Math.min(Math.max(panel.width || 6, 1), 12);\n const rowSpan = Math.min(Math.max(panel.height || 2, 1), 4);\n\n return (\n <div\n key={panel.id}\n className={`border ${theme.border} bg-midnight-surface flex flex-col`}\n style={{\n gridColumn: `span ${colSpan}`,\n minHeight: `${rowSpan * ROW_HEIGHT}px`,\n }}\n >\n {/* Panel header */}\n <div className={`flex items-center justify-between px-3 py-1.5 border-b ${theme.border} bg-midnight-elevated`}>\n <span className=\"flex-1 text-xs font-mono text-midnight-text-body truncate\" style={{ textAlign: panel.config?.style?.titleAlign || 'left' }}>{panel.title || panel.type}</span>\n {canEditPanels && removePanel && (\n <button\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 {/* Panel content */}\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 </div>\n </div>\n );\n}\n\nexport default DashboardRenderer;\n","// DataExplorer — the host-agnostic container for the statefs Data Explorer.\n//\n// This is the most store-coupled component in the studio. Here it reads NO\n// store: all data/state arrives via props, and every studio-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 the published viewer\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 the zustand 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,\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 statefs 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// ─── 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\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 onSelectState,\n onRefreshStates,\n}: DataExplorerProps) {\n const { theme, addPanel, saveDashboard, listDashboards, searchDashboards, loadDashboard, deleteDashboard, analyzeDataset, refineDashboard } = useDashboard();\n const caps = useCapabilities();\n\n const [mode, setMode] = useState<Mode>('dashboard');\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 <ModeTab active={mode === 'dashboard'} onClick={() => setMode('dashboard')} icon={Sparkles} label=\"Dashboard\" />\n <ModeTab active={mode === 'builder'} onClick={() => setMode('builder')} icon={BarChart3} label=\"Chart Builder\" />\n <ModeTab active={mode === 'sql'} onClick={() => setMode('sql')} icon={Terminal} label=\"SQL\" />\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} onSave={addPanel} />\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 : 'No dashboard to display'}\n </p>\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"]}
|