@useatlas/react 0.0.1 → 0.0.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.
Files changed (65) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +79 -2
  3. package/dist/{chunk-5SEVKHS5.cjs → chunk-35SCTKSW.js} +100 -7
  4. package/dist/chunk-35SCTKSW.js.map +1 -0
  5. package/dist/{chunk-UIRB6L36.cjs → chunk-DZFSZSQB.cjs} +46 -54
  6. package/dist/chunk-DZFSZSQB.cjs.map +1 -0
  7. package/dist/{chunk-2WFDP7G5.js → chunk-FMSGREKS.js} +46 -54
  8. package/dist/chunk-FMSGREKS.js.map +1 -0
  9. package/dist/{chunk-44HBZYKP.js → chunk-IDXGFWFS.cjs} +109 -3
  10. package/dist/chunk-IDXGFWFS.cjs.map +1 -0
  11. package/dist/global.d.ts +36 -0
  12. package/dist/hooks.cjs +10 -10
  13. package/dist/hooks.cjs.map +1 -1
  14. package/dist/hooks.d.cts +2 -2
  15. package/dist/hooks.d.ts +2 -2
  16. package/dist/hooks.js +3 -3
  17. package/dist/hooks.js.map +1 -1
  18. package/dist/index.cjs +385 -265
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +224 -4
  21. package/dist/index.d.ts +224 -4
  22. package/dist/index.js +328 -208
  23. package/dist/index.js.map +1 -1
  24. package/dist/lib/widget-types.d.ts +232 -0
  25. package/dist/{result-chart-YLCKBNV4.cjs → result-chart-ANZOT6FL.cjs} +24 -34
  26. package/dist/result-chart-ANZOT6FL.cjs.map +1 -0
  27. package/dist/{result-chart-NFAJ4IQ5.js → result-chart-C3EJTN5G.js} +22 -32
  28. package/dist/result-chart-C3EJTN5G.js.map +1 -0
  29. package/dist/widget.css +2 -2
  30. package/dist/widget.js +215 -246
  31. package/package.json +26 -16
  32. package/src/components/__tests__/data-table.test.tsx +125 -0
  33. package/src/components/actions/action-approval-card.tsx +26 -19
  34. package/src/components/actions/action-status-badge.tsx +3 -3
  35. package/src/components/atlas-chat.tsx +97 -37
  36. package/src/components/chart/result-chart.tsx +13 -37
  37. package/src/components/chat/api-key-bar.tsx +4 -4
  38. package/src/components/chat/data-table.tsx +42 -3
  39. package/src/components/chat/error-banner.tsx +108 -5
  40. package/src/components/chat/follow-up-chips.tsx +1 -1
  41. package/src/components/chat/managed-auth-card.tsx +6 -6
  42. package/src/components/conversations/conversation-item.tsx +19 -14
  43. package/src/components/conversations/conversation-list.tsx +3 -3
  44. package/src/components/conversations/conversation-sidebar.tsx +15 -4
  45. package/src/components/conversations/delete-confirmation.tsx +2 -2
  46. package/src/components/error-boundary.tsx +66 -0
  47. package/src/components/schema-explorer/schema-explorer.tsx +4 -0
  48. package/src/env.d.ts +9 -7
  49. package/src/global.d.ts +36 -0
  50. package/src/hooks/__tests__/use-atlas-conversations.test.tsx +4 -6
  51. package/src/hooks/use-atlas-chat.ts +1 -1
  52. package/src/hooks/use-atlas-conversations.ts +2 -2
  53. package/src/hooks/use-conversations.ts +60 -68
  54. package/src/index.ts +8 -0
  55. package/src/lib/action-types.ts +2 -2
  56. package/src/lib/helpers.ts +16 -16
  57. package/src/lib/types.ts +3 -2
  58. package/src/lib/widget-types.ts +232 -0
  59. package/src/test-setup.ts +2 -2
  60. package/dist/chunk-2WFDP7G5.js.map +0 -1
  61. package/dist/chunk-44HBZYKP.js.map +0 -1
  62. package/dist/chunk-5SEVKHS5.cjs.map +0 -1
  63. package/dist/chunk-UIRB6L36.cjs.map +0 -1
  64. package/dist/result-chart-NFAJ4IQ5.js.map +0 -1
  65. package/dist/result-chart-YLCKBNV4.cjs.map +0 -1
@@ -0,0 +1,232 @@
1
+ /**
2
+ * TypeScript type definitions for the Atlas widget script-tag API.
3
+ *
4
+ * When embedded via `<script src="https://api.example.com/widget.js">`,
5
+ * the loader exposes `window.Atlas` with a programmatic API for controlling
6
+ * the chat widget.
7
+ *
8
+ * **Usage for embedders:**
9
+ *
10
+ * Add a triple-slash reference at the top of your script to get full
11
+ * autocomplete and type-checking:
12
+ *
13
+ * ```ts
14
+ * /// <reference types="@useatlas/react/widget" />
15
+ *
16
+ * Atlas.open();
17
+ * Atlas.ask("How many users signed up today?");
18
+ * Atlas.on("queryComplete", (detail) => {
19
+ * console.log("Query returned", detail.rowCount, "rows");
20
+ * });
21
+ * ```
22
+ *
23
+ * @module
24
+ */
25
+
26
+ // ---------------------------------------------------------------------------
27
+ // Event map
28
+ // ---------------------------------------------------------------------------
29
+
30
+ /**
31
+ * Map of event names to their detail payloads.
32
+ *
33
+ * Used by {@link AtlasWidget.on} to provide type-safe event handling.
34
+ */
35
+ export interface AtlasWidgetEventMap {
36
+ /** Fired when the widget panel opens. */
37
+ open: Record<string, never>;
38
+ /** Fired when the widget panel closes. */
39
+ close: Record<string, never>;
40
+ /** Fired when a SQL query completes inside the widget. */
41
+ queryComplete: { sql?: string; rowCount?: number };
42
+ /** Fired when the widget encounters an error. */
43
+ error: { code?: string; message?: string };
44
+ }
45
+
46
+ // ---------------------------------------------------------------------------
47
+ // Script-tag configuration (data-* attributes)
48
+ // ---------------------------------------------------------------------------
49
+
50
+ /**
51
+ * Configuration options read from `data-*` attributes on the `<script>` tag.
52
+ *
53
+ * @example
54
+ * ```html
55
+ * <script src="https://api.example.com/widget.js"
56
+ * data-api-url="https://api.example.com"
57
+ * data-api-key="sk-..."
58
+ * data-theme="dark"
59
+ * data-position="bottom-left"
60
+ * data-on-open="onAtlasOpen"
61
+ * data-on-error="onAtlasError">
62
+ * </script>
63
+ * ```
64
+ */
65
+ export interface AtlasWidgetConfig {
66
+ /**
67
+ * Base URL of the Atlas API (required).
68
+ *
69
+ * Must use `http:` or `https:` protocol.
70
+ */
71
+ apiUrl: string;
72
+ /**
73
+ * API key for authentication (optional).
74
+ *
75
+ * Passed to the widget iframe as an auth token.
76
+ */
77
+ apiKey?: string;
78
+ /**
79
+ * Widget color theme (optional, default `"light"`).
80
+ */
81
+ theme?: "light" | "dark";
82
+ /**
83
+ * Position of the floating chat bubble (optional, default `"bottom-right"`).
84
+ */
85
+ position?: "bottom-right" | "bottom-left";
86
+ /**
87
+ * Name of a global function called when the widget opens (optional).
88
+ *
89
+ * The function must exist on `window` at the time the event fires.
90
+ */
91
+ onOpen?: string;
92
+ /**
93
+ * Name of a global function called when the widget closes (optional).
94
+ */
95
+ onClose?: string;
96
+ /**
97
+ * Name of a global function called when a query completes (optional).
98
+ */
99
+ onQueryComplete?: string;
100
+ /**
101
+ * Name of a global function called when the widget encounters an error (optional).
102
+ */
103
+ onError?: string;
104
+ }
105
+
106
+ // ---------------------------------------------------------------------------
107
+ // Programmatic API
108
+ // ---------------------------------------------------------------------------
109
+
110
+ /**
111
+ * Programmatic API exposed on `window.Atlas` after the widget script loads.
112
+ *
113
+ * @example
114
+ * ```ts
115
+ * /// <reference types="@useatlas/react/widget" />
116
+ *
117
+ * // Open the widget
118
+ * Atlas.open();
119
+ *
120
+ * // Send a question programmatically
121
+ * Atlas.ask("What are the top 10 customers by revenue?");
122
+ *
123
+ * // Listen for events
124
+ * Atlas.on("queryComplete", (detail) => {
125
+ * console.log(`Query returned ${detail.rowCount} rows`);
126
+ * });
127
+ *
128
+ * // Change theme at runtime
129
+ * Atlas.setTheme("dark");
130
+ *
131
+ * // Clean up when done
132
+ * Atlas.destroy();
133
+ * ```
134
+ */
135
+ export interface AtlasWidget {
136
+ /**
137
+ * Opens the widget panel.
138
+ *
139
+ * No-op if the widget has been destroyed.
140
+ */
141
+ open(): void;
142
+
143
+ /**
144
+ * Closes the widget panel.
145
+ *
146
+ * No-op if the widget has been destroyed.
147
+ */
148
+ close(): void;
149
+
150
+ /**
151
+ * Toggles the widget panel open or closed.
152
+ *
153
+ * No-op if the widget has been destroyed.
154
+ */
155
+ toggle(): void;
156
+
157
+ /**
158
+ * Opens the widget and sends a question to the Atlas agent.
159
+ *
160
+ * @param question - The natural-language question to ask.
161
+ *
162
+ * @example
163
+ * ```ts
164
+ * Atlas.ask("How many users signed up this week?");
165
+ * ```
166
+ */
167
+ ask(question: string): void;
168
+
169
+ /**
170
+ * Removes the widget from the DOM, cleans up all event listeners,
171
+ * and deletes `window.Atlas`.
172
+ *
173
+ * After calling `destroy()`, all other methods become no-ops.
174
+ */
175
+ destroy(): void;
176
+
177
+ /**
178
+ * Binds a type-safe event listener.
179
+ *
180
+ * Supported events: `"open"`, `"close"`, `"queryComplete"`, `"error"`.
181
+ *
182
+ * @param event - The event name.
183
+ * @param handler - Callback receiving the event detail payload.
184
+ *
185
+ * @example
186
+ * ```ts
187
+ * Atlas.on("error", (detail) => {
188
+ * console.error(`Atlas error [${detail.code}]: ${detail.message}`);
189
+ * });
190
+ * ```
191
+ */
192
+ on<K extends keyof AtlasWidgetEventMap>(
193
+ event: K,
194
+ handler: (detail: AtlasWidgetEventMap[K]) => void,
195
+ ): void;
196
+
197
+ /**
198
+ * Sends an authentication token to the widget iframe.
199
+ *
200
+ * Use this when the auth token is obtained after the script tag loads
201
+ * (e.g., after a user logs in).
202
+ *
203
+ * @param token - The authentication token string.
204
+ */
205
+ setAuthToken(token: string): void;
206
+
207
+ /**
208
+ * Sets the widget color theme at runtime.
209
+ *
210
+ * @param theme - `"light"` or `"dark"`.
211
+ */
212
+ setTheme(theme: "light" | "dark"): void;
213
+ }
214
+
215
+ /**
216
+ * Pre-load command queue entry.
217
+ *
218
+ * Before the widget script loads, `window.Atlas` can be set to an array
219
+ * of queued commands that are replayed once the widget initializes:
220
+ *
221
+ * ```ts
222
+ * window.Atlas = window.Atlas || [];
223
+ * Atlas.push(["open"]);
224
+ * Atlas.push(["ask", "How many users signed up today?"]);
225
+ * ```
226
+ *
227
+ * Each entry is a tuple of `[methodName, ...args]`.
228
+ */
229
+ export type AtlasWidgetCommand = [
230
+ keyof AtlasWidget,
231
+ ...unknown[],
232
+ ];
@@ -1,30 +1,12 @@
1
1
  'use strict';
2
2
 
3
- var chunk5SEVKHS5_cjs = require('./chunk-5SEVKHS5.cjs');
3
+ var chunkIDXGFWFS_cjs = require('./chunk-IDXGFWFS.cjs');
4
4
  var react = require('react');
5
5
  var recharts = require('recharts');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
 
8
- var ChartErrorBoundary = class extends react.Component {
9
- constructor(props) {
10
- super(props);
11
- this.state = { hasError: false };
12
- }
13
- static getDerivedStateFromError() {
14
- return { hasError: true };
15
- }
16
- componentDidCatch(error, info) {
17
- console.error("Chart rendering failed:", error, info.componentStack);
18
- }
19
- render() {
20
- if (this.state.hasError) {
21
- return this.props.fallback ?? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400", children: "Chart could not be rendered. Switch to Table view to see your data." });
22
- }
23
- return this.props.children;
24
- }
25
- };
26
8
  function getColors(dark) {
27
- return dark ? chunk5SEVKHS5_cjs.CHART_COLORS_DARK : chunk5SEVKHS5_cjs.CHART_COLORS_LIGHT;
9
+ return dark ? chunkIDXGFWFS_cjs.CHART_COLORS_DARK : chunkIDXGFWFS_cjs.CHART_COLORS_LIGHT;
28
10
  }
29
11
  function themeTokens(dark) {
30
12
  return {
@@ -339,7 +321,8 @@ function ChartTypeSelector({
339
321
  "button",
340
322
  {
341
323
  onClick: () => onChange(rec.type),
342
- className: `rounded px-2 py-0.5 text-xs font-medium transition-colors ${active === rec.type ? "bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400" : "text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200"}`,
324
+ "aria-pressed": active === rec.type,
325
+ className: `rounded px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 ${active === rec.type ? "bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400" : "text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200"}`,
343
326
  children: CHART_LABELS[rec.type]
344
327
  },
345
328
  rec.type
@@ -352,7 +335,7 @@ function ChartRenderer({
352
335
  defaultRec,
353
336
  dark
354
337
  }) {
355
- const chartData = rec === defaultRec ? defaultData : chunk5SEVKHS5_cjs.transformData(rows, rec);
338
+ const chartData = rec === defaultRec ? defaultData : chunkIDXGFWFS_cjs.transformData(rows, rec);
356
339
  const type = rec.type;
357
340
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-2", children: type === "bar" ? /* @__PURE__ */ jsxRuntime.jsx(BarChartView, { data: chartData, rec, dark }) : type === "line" ? /* @__PURE__ */ jsxRuntime.jsx(LineChartView, { data: chartData, rec, dark }) : type === "area" ? /* @__PURE__ */ jsxRuntime.jsx(AreaChartView, { data: chartData, rec, dark }) : type === "stacked-bar" ? /* @__PURE__ */ jsxRuntime.jsx(StackedBarChartView, { data: chartData, rec, dark }) : type === "scatter" ? /* @__PURE__ */ jsxRuntime.jsx(ScatterChartView, { data: chartData, rec, dark }) : /* @__PURE__ */ jsxRuntime.jsx(PieChartView, { data: chartData, rec, dark }) });
358
341
  }
@@ -363,7 +346,7 @@ function ResultChart({
363
346
  detectionResult
364
347
  }) {
365
348
  const result = react.useMemo(
366
- () => detectionResult ?? chunk5SEVKHS5_cjs.detectCharts(headers, rows),
349
+ () => detectionResult ?? chunkIDXGFWFS_cjs.detectCharts(headers, rows),
367
350
  [headers, rows, detectionResult]
368
351
  );
369
352
  const [activeType, setActiveType] = react.useState(null);
@@ -382,19 +365,26 @@ function ResultChart({
382
365
  }
383
366
  )
384
367
  ] }),
385
- /* @__PURE__ */ jsxRuntime.jsx(ChartErrorBoundary, { children: /* @__PURE__ */ jsxRuntime.jsx(
386
- ChartRenderer,
368
+ /* @__PURE__ */ jsxRuntime.jsx(
369
+ chunkIDXGFWFS_cjs.ErrorBoundary,
387
370
  {
388
- rows,
389
- rec: currentRec,
390
- defaultData: result.data,
391
- defaultRec: result.recommendations[0],
392
- dark
393
- }
394
- ) }, currentType)
371
+ fallback: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400", children: "Unable to render chart. Switch to Table view to see your data." }),
372
+ children: /* @__PURE__ */ jsxRuntime.jsx(
373
+ ChartRenderer,
374
+ {
375
+ rows,
376
+ rec: currentRec,
377
+ defaultData: result.data,
378
+ defaultRec: result.recommendations[0],
379
+ dark
380
+ }
381
+ )
382
+ },
383
+ currentType
384
+ )
395
385
  ] });
396
386
  }
397
387
 
398
388
  exports.ResultChart = ResultChart;
399
- //# sourceMappingURL=result-chart-YLCKBNV4.cjs.map
400
- //# sourceMappingURL=result-chart-YLCKBNV4.cjs.map
389
+ //# sourceMappingURL=result-chart-ANZOT6FL.cjs.map
390
+ //# sourceMappingURL=result-chart-ANZOT6FL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chart/result-chart.tsx"],"names":["CHART_COLORS_DARK","CHART_COLORS_LIGHT","jsxs","jsx","ResponsiveContainer","BarChart","CartesianGrid","XAxis","YAxis","Tooltip","Legend","Bar","LineChart","Line","PieChart","Pie","Cell","useId","AreaChart","Area","ScatterChart","ZAxis","Scatter","transformData","useMemo","detectCharts","useState","ErrorBoundary"],"mappings":"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","file":"result-chart-ANZOT6FL.cjs","sourcesContent":["\"use client\";\n\nimport { useMemo, useId, useState } from \"react\";\nimport { ErrorBoundary } from \"../error-boundary\";\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n LineChart,\n Line,\n AreaChart,\n Area,\n ScatterChart,\n Scatter,\n ZAxis,\n PieChart,\n Pie,\n Cell,\n CartesianGrid,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n} from \"recharts\";\nimport {\n detectCharts,\n transformData,\n CHART_COLORS_LIGHT,\n CHART_COLORS_DARK,\n type ChartRecommendation,\n type ChartType,\n type RechartsRow,\n type ChartDetectionResult,\n} from \"./chart-detection\";\n\n/* ------------------------------------------------------------------ */\n/* Theme helpers */\n/* ------------------------------------------------------------------ */\n\nfunction getColors(dark: boolean) {\n return dark ? CHART_COLORS_DARK : CHART_COLORS_LIGHT;\n}\n\nfunction themeTokens(dark: boolean) {\n return {\n grid: dark ? \"#3f3f46\" : \"#e4e4e7\",\n axis: dark ? \"#a1a1aa\" : \"#71717a\",\n tooltipBg: dark ? \"#18181b\" : \"#ffffff\",\n tooltipBorder: dark ? \"#3f3f46\" : \"#e4e4e7\",\n tooltipText: dark ? \"#e4e4e7\" : \"#27272a\",\n legendText: dark ? \"#a1a1aa\" : \"#71717a\",\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Number formatter for axis / tooltip */\n/* ------------------------------------------------------------------ */\n\nfunction formatNumber(value: unknown): string {\n const num = Number(value);\n if (!isFinite(num)) return String(value ?? \"\");\n if (Math.abs(num) >= 1_000_000) return `${(num / 1_000_000).toFixed(1)}M`;\n if (Math.abs(num) >= 1_000) return `${(num / 1_000).toFixed(1)}K`;\n return Number.isInteger(num) ? num.toLocaleString() : num.toFixed(2);\n}\n\nfunction truncateLabel(label: unknown, maxLen = 12): string {\n const str = String(label ?? \"\");\n return str.length > maxLen ? str.slice(0, maxLen) + \"\\u2026\" : str;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tooltip */\n/* ------------------------------------------------------------------ */\n\nconst TOOLTIP_LABEL_STYLE = { fontWeight: 600, marginBottom: 4 } as const;\n\nconst tooltipStyleCache = new Map<boolean, React.CSSProperties>();\nfunction getTooltipStyle(dark: boolean): React.CSSProperties {\n let style = tooltipStyleCache.get(dark);\n if (!style) {\n const t = themeTokens(dark);\n style = {\n background: t.tooltipBg,\n border: `1px solid ${t.tooltipBorder}`,\n borderRadius: 6,\n padding: \"8px 12px\",\n fontSize: 12,\n color: t.tooltipText,\n };\n tooltipStyleCache.set(dark, style);\n }\n return style;\n}\n\nfunction ChartTooltip({ active, payload, label, dark }: {\n active?: boolean;\n payload?: Array<{ name: string; value: number; color: string }>;\n label?: string;\n dark: boolean;\n}) {\n if (!active || !payload?.length) return null;\n return (\n <div style={getTooltipStyle(dark)}>\n {label && <p style={TOOLTIP_LABEL_STYLE}>{label}</p>}\n {payload.map((entry, i) => (\n <p key={i} style={{ color: entry.color }}>\n {entry.name}: {typeof entry.value === \"number\" ? formatNumber(entry.value) : entry.value}\n </p>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-chart components */\n/* ------------------------------------------------------------------ */\n\nfunction BarChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <div className=\"aspect-[4/3] sm:aspect-[16/9]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n {valKeys.length > 1 && (\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n )}\n {valKeys.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n fill={colors[i % colors.length]}\n radius={[4, 4, 0, 0]}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\nfunction LineChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <div className=\"aspect-[4/3] sm:aspect-[16/9]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n {valKeys.length > 1 && (\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n )}\n {valKeys.map((key, i) => (\n <Line\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={colors[i % colors.length]}\n strokeWidth={2}\n dot={{ r: 3, fill: colors[i % colors.length] }}\n activeDot={{ r: 5 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\nfunction PieChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKey = rec.valueColumns[0].header;\n\n const total = data.reduce((sum, d) => sum + (typeof d[valKey] === \"number\" ? (d[valKey] as number) : 0), 0);\n\n const hasNegative = data.some(d => typeof d[valKey] === \"number\" && (d[valKey] as number) < 0);\n if (total <= 0 || hasNegative) {\n return (\n <div className=\"flex aspect-[4/3] items-center justify-center text-xs text-zinc-400 sm:aspect-[16/9]\">\n Pie chart is not suitable for this data.\n </div>\n );\n }\n\n return (\n <div className=\"aspect-[4/3] sm:aspect-[16/9]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={data}\n dataKey={valKey}\n nameKey={catKey}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={40}\n outerRadius={100}\n label={({ name, value }: { name?: string; value?: number }) =>\n `${truncateLabel(String(name ?? \"\"), 10)} ${total > 0 && value != null ? ((value / total) * 100).toFixed(0) : 0}%`\n }\n labelLine={{ stroke: t.axis }}\n fontSize={11}\n >\n {data.map((_, i) => (\n <Cell key={i} fill={colors[i % colors.length]} />\n ))}\n </Pie>\n <Tooltip content={<ChartTooltip dark={dark} />} />\n </PieChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Area chart */\n/* ------------------------------------------------------------------ */\n\nfunction AreaChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const chartId = useId();\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <AreaChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <defs>\n {valKeys.map((key, i) => (\n <linearGradient key={key} id={`area-grad-${chartId}-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor={colors[i % colors.length]} stopOpacity={0.3} />\n <stop offset=\"95%\" stopColor={colors[i % colors.length]} stopOpacity={0.05} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n {valKeys.length > 1 && (\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n )}\n {valKeys.map((key, i) => (\n <Area\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={colors[i % colors.length]}\n strokeWidth={2}\n fill={`url(#area-grad-${chartId}-${i})`}\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Stacked bar chart */\n/* ------------------------------------------------------------------ */\n\nfunction StackedBarChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n {valKeys.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n stackId=\"a\"\n fill={colors[i % colors.length]}\n radius={i === valKeys.length - 1 ? [4, 4, 0, 0] : undefined}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Scatter chart */\n/* ------------------------------------------------------------------ */\n\nfunction ScatterChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const xKey = rec.categoryColumn.header;\n const yKey = rec.valueColumns[0].header;\n const zKey = rec.valueColumns.length > 1 ? rec.valueColumns[1].header : undefined;\n\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <ScatterChart margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={xKey}\n type=\"number\"\n name={xKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <YAxis\n dataKey={yKey}\n type=\"number\"\n name={yKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n {zKey && <ZAxis dataKey={zKey} type=\"number\" name={zKey} range={[40, 400]} />}\n <Tooltip\n content={<ChartTooltip dark={dark} />}\n cursor={{ strokeDasharray: \"3 3\" }}\n />\n <Scatter\n data={data}\n fill={colors[0]}\n />\n </ScatterChart>\n </ResponsiveContainer>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart type selector */\n/* ------------------------------------------------------------------ */\n\nconst CHART_LABELS: Record<ChartType, string> = {\n bar: \"Bar\",\n line: \"Line\",\n pie: \"Pie\",\n area: \"Area\",\n \"stacked-bar\": \"Stacked\",\n scatter: \"Scatter\",\n};\n\nfunction ChartTypeSelector({\n recommendations,\n active,\n onChange,\n}: {\n recommendations: ChartRecommendation[];\n active: ChartType;\n onChange: (t: ChartType) => void;\n}) {\n if (recommendations.length <= 1) return null;\n\n const seen = new Set<ChartType>();\n const unique = recommendations.filter((r) => {\n if (seen.has(r.type)) return false;\n seen.add(r.type);\n return true;\n });\n\n if (unique.length <= 1) return null;\n\n return (\n <div className=\"flex gap-1\">\n {unique.map((rec) => (\n <button\n key={rec.type}\n onClick={() => onChange(rec.type)}\n aria-pressed={active === rec.type}\n className={`rounded px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 ${\n active === rec.type\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400\"\n : \"text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200\"\n }`}\n >\n {CHART_LABELS[rec.type]}\n </button>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart renderer (inside error boundary) */\n/* ------------------------------------------------------------------ */\n\nfunction ChartRenderer({\n rows,\n rec,\n defaultData,\n defaultRec,\n dark,\n}: {\n rows: string[][];\n rec: ChartRecommendation;\n defaultData: RechartsRow[];\n defaultRec: ChartRecommendation;\n dark: boolean;\n}) {\n // Re-transform data when switching chart type (category axis may differ)\n const chartData = rec === defaultRec ? defaultData : transformData(rows, rec);\n const type = rec.type;\n\n return (\n <div className=\"p-2\">\n {type === \"bar\" ? <BarChartView data={chartData} rec={rec} dark={dark} />\n : type === \"line\" ? <LineChartView data={chartData} rec={rec} dark={dark} />\n : type === \"area\" ? <AreaChartView data={chartData} rec={rec} dark={dark} />\n : type === \"stacked-bar\" ? <StackedBarChartView data={chartData} rec={rec} dark={dark} />\n : type === \"scatter\" ? <ScatterChartView data={chartData} rec={rec} dark={dark} />\n : <PieChartView data={chartData} rec={rec} dark={dark} />}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main ResultChart component */\n/* ------------------------------------------------------------------ */\n\nexport function ResultChart({\n headers,\n rows,\n dark,\n detectionResult,\n}: {\n headers: string[];\n rows: string[][];\n dark: boolean;\n detectionResult?: ChartDetectionResult;\n}) {\n const result = useMemo(\n () => detectionResult ?? detectCharts(headers, rows),\n [headers, rows, detectionResult],\n );\n\n const [activeType, setActiveType] = useState<ChartType | null>(null);\n\n if (!result.chartable) return null;\n\n const currentType = activeType ?? result.recommendations[0].type;\n const currentRec = result.recommendations.find((r) => r.type === currentType) ?? result.recommendations[0];\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700\">\n <div className=\"flex items-center justify-between border-b border-zinc-100 bg-zinc-50/50 px-3 py-2 dark:border-zinc-800 dark:bg-zinc-900/50\">\n <span className=\"text-xs text-zinc-500 dark:text-zinc-400\">{currentRec.reason}</span>\n <ChartTypeSelector\n recommendations={result.recommendations}\n active={currentType}\n onChange={setActiveType}\n />\n </div>\n <ErrorBoundary\n key={currentType}\n fallback={\n <div className=\"rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Unable to render chart. Switch to Table view to see your data.\n </div>\n }\n >\n <ChartRenderer\n rows={rows}\n rec={currentRec}\n defaultData={result.data}\n defaultRec={result.recommendations[0]}\n dark={dark}\n />\n </ErrorBoundary>\n </div>\n );\n}\n"]}
@@ -1,26 +1,8 @@
1
- import { detectCharts, transformData, CHART_COLORS_DARK, CHART_COLORS_LIGHT } from './chunk-44HBZYKP.js';
2
- import { useMemo, useState, Component, useId } from 'react';
1
+ import { detectCharts, ErrorBoundary, transformData, CHART_COLORS_DARK, CHART_COLORS_LIGHT } from './chunk-35SCTKSW.js';
2
+ import { useMemo, useState, useId } from 'react';
3
3
  import { ResponsiveContainer, BarChart, CartesianGrid, XAxis, YAxis, Tooltip, Legend, Bar, LineChart, Line, AreaChart, Area, ScatterChart, ZAxis, Scatter, PieChart, Pie, Cell } from 'recharts';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
6
- var ChartErrorBoundary = class extends Component {
7
- constructor(props) {
8
- super(props);
9
- this.state = { hasError: false };
10
- }
11
- static getDerivedStateFromError() {
12
- return { hasError: true };
13
- }
14
- componentDidCatch(error, info) {
15
- console.error("Chart rendering failed:", error, info.componentStack);
16
- }
17
- render() {
18
- if (this.state.hasError) {
19
- return this.props.fallback ?? /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400", children: "Chart could not be rendered. Switch to Table view to see your data." });
20
- }
21
- return this.props.children;
22
- }
23
- };
24
6
  function getColors(dark) {
25
7
  return dark ? CHART_COLORS_DARK : CHART_COLORS_LIGHT;
26
8
  }
@@ -337,7 +319,8 @@ function ChartTypeSelector({
337
319
  "button",
338
320
  {
339
321
  onClick: () => onChange(rec.type),
340
- className: `rounded px-2 py-0.5 text-xs font-medium transition-colors ${active === rec.type ? "bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400" : "text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200"}`,
322
+ "aria-pressed": active === rec.type,
323
+ className: `rounded px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 ${active === rec.type ? "bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400" : "text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200"}`,
341
324
  children: CHART_LABELS[rec.type]
342
325
  },
343
326
  rec.type
@@ -380,19 +363,26 @@ function ResultChart({
380
363
  }
381
364
  )
382
365
  ] }),
383
- /* @__PURE__ */ jsx(ChartErrorBoundary, { children: /* @__PURE__ */ jsx(
384
- ChartRenderer,
366
+ /* @__PURE__ */ jsx(
367
+ ErrorBoundary,
385
368
  {
386
- rows,
387
- rec: currentRec,
388
- defaultData: result.data,
389
- defaultRec: result.recommendations[0],
390
- dark
391
- }
392
- ) }, currentType)
369
+ fallback: /* @__PURE__ */ jsx("div", { className: "rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400", children: "Unable to render chart. Switch to Table view to see your data." }),
370
+ children: /* @__PURE__ */ jsx(
371
+ ChartRenderer,
372
+ {
373
+ rows,
374
+ rec: currentRec,
375
+ defaultData: result.data,
376
+ defaultRec: result.recommendations[0],
377
+ dark
378
+ }
379
+ )
380
+ },
381
+ currentType
382
+ )
393
383
  ] });
394
384
  }
395
385
 
396
386
  export { ResultChart };
397
- //# sourceMappingURL=result-chart-NFAJ4IQ5.js.map
398
- //# sourceMappingURL=result-chart-NFAJ4IQ5.js.map
387
+ //# sourceMappingURL=result-chart-C3EJTN5G.js.map
388
+ //# sourceMappingURL=result-chart-C3EJTN5G.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/chart/result-chart.tsx"],"names":[],"mappings":"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","file":"result-chart-C3EJTN5G.js","sourcesContent":["\"use client\";\n\nimport { useMemo, useId, useState } from \"react\";\nimport { ErrorBoundary } from \"../error-boundary\";\nimport {\n ResponsiveContainer,\n BarChart,\n Bar,\n LineChart,\n Line,\n AreaChart,\n Area,\n ScatterChart,\n Scatter,\n ZAxis,\n PieChart,\n Pie,\n Cell,\n CartesianGrid,\n XAxis,\n YAxis,\n Tooltip,\n Legend,\n} from \"recharts\";\nimport {\n detectCharts,\n transformData,\n CHART_COLORS_LIGHT,\n CHART_COLORS_DARK,\n type ChartRecommendation,\n type ChartType,\n type RechartsRow,\n type ChartDetectionResult,\n} from \"./chart-detection\";\n\n/* ------------------------------------------------------------------ */\n/* Theme helpers */\n/* ------------------------------------------------------------------ */\n\nfunction getColors(dark: boolean) {\n return dark ? CHART_COLORS_DARK : CHART_COLORS_LIGHT;\n}\n\nfunction themeTokens(dark: boolean) {\n return {\n grid: dark ? \"#3f3f46\" : \"#e4e4e7\",\n axis: dark ? \"#a1a1aa\" : \"#71717a\",\n tooltipBg: dark ? \"#18181b\" : \"#ffffff\",\n tooltipBorder: dark ? \"#3f3f46\" : \"#e4e4e7\",\n tooltipText: dark ? \"#e4e4e7\" : \"#27272a\",\n legendText: dark ? \"#a1a1aa\" : \"#71717a\",\n };\n}\n\n/* ------------------------------------------------------------------ */\n/* Number formatter for axis / tooltip */\n/* ------------------------------------------------------------------ */\n\nfunction formatNumber(value: unknown): string {\n const num = Number(value);\n if (!isFinite(num)) return String(value ?? \"\");\n if (Math.abs(num) >= 1_000_000) return `${(num / 1_000_000).toFixed(1)}M`;\n if (Math.abs(num) >= 1_000) return `${(num / 1_000).toFixed(1)}K`;\n return Number.isInteger(num) ? num.toLocaleString() : num.toFixed(2);\n}\n\nfunction truncateLabel(label: unknown, maxLen = 12): string {\n const str = String(label ?? \"\");\n return str.length > maxLen ? str.slice(0, maxLen) + \"\\u2026\" : str;\n}\n\n/* ------------------------------------------------------------------ */\n/* Tooltip */\n/* ------------------------------------------------------------------ */\n\nconst TOOLTIP_LABEL_STYLE = { fontWeight: 600, marginBottom: 4 } as const;\n\nconst tooltipStyleCache = new Map<boolean, React.CSSProperties>();\nfunction getTooltipStyle(dark: boolean): React.CSSProperties {\n let style = tooltipStyleCache.get(dark);\n if (!style) {\n const t = themeTokens(dark);\n style = {\n background: t.tooltipBg,\n border: `1px solid ${t.tooltipBorder}`,\n borderRadius: 6,\n padding: \"8px 12px\",\n fontSize: 12,\n color: t.tooltipText,\n };\n tooltipStyleCache.set(dark, style);\n }\n return style;\n}\n\nfunction ChartTooltip({ active, payload, label, dark }: {\n active?: boolean;\n payload?: Array<{ name: string; value: number; color: string }>;\n label?: string;\n dark: boolean;\n}) {\n if (!active || !payload?.length) return null;\n return (\n <div style={getTooltipStyle(dark)}>\n {label && <p style={TOOLTIP_LABEL_STYLE}>{label}</p>}\n {payload.map((entry, i) => (\n <p key={i} style={{ color: entry.color }}>\n {entry.name}: {typeof entry.value === \"number\" ? formatNumber(entry.value) : entry.value}\n </p>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Sub-chart components */\n/* ------------------------------------------------------------------ */\n\nfunction BarChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <div className=\"aspect-[4/3] sm:aspect-[16/9]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n {valKeys.length > 1 && (\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n )}\n {valKeys.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n fill={colors[i % colors.length]}\n radius={[4, 4, 0, 0]}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\nfunction LineChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <div className=\"aspect-[4/3] sm:aspect-[16/9]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <LineChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n {valKeys.length > 1 && (\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n )}\n {valKeys.map((key, i) => (\n <Line\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={colors[i % colors.length]}\n strokeWidth={2}\n dot={{ r: 3, fill: colors[i % colors.length] }}\n activeDot={{ r: 5 }}\n />\n ))}\n </LineChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\nfunction PieChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKey = rec.valueColumns[0].header;\n\n const total = data.reduce((sum, d) => sum + (typeof d[valKey] === \"number\" ? (d[valKey] as number) : 0), 0);\n\n const hasNegative = data.some(d => typeof d[valKey] === \"number\" && (d[valKey] as number) < 0);\n if (total <= 0 || hasNegative) {\n return (\n <div className=\"flex aspect-[4/3] items-center justify-center text-xs text-zinc-400 sm:aspect-[16/9]\">\n Pie chart is not suitable for this data.\n </div>\n );\n }\n\n return (\n <div className=\"aspect-[4/3] sm:aspect-[16/9]\">\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <PieChart>\n <Pie\n data={data}\n dataKey={valKey}\n nameKey={catKey}\n cx=\"50%\"\n cy=\"50%\"\n innerRadius={40}\n outerRadius={100}\n label={({ name, value }: { name?: string; value?: number }) =>\n `${truncateLabel(String(name ?? \"\"), 10)} ${total > 0 && value != null ? ((value / total) * 100).toFixed(0) : 0}%`\n }\n labelLine={{ stroke: t.axis }}\n fontSize={11}\n >\n {data.map((_, i) => (\n <Cell key={i} fill={colors[i % colors.length]} />\n ))}\n </Pie>\n <Tooltip content={<ChartTooltip dark={dark} />} />\n </PieChart>\n </ResponsiveContainer>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Area chart */\n/* ------------------------------------------------------------------ */\n\nfunction AreaChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const chartId = useId();\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <AreaChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <defs>\n {valKeys.map((key, i) => (\n <linearGradient key={key} id={`area-grad-${chartId}-${i}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"5%\" stopColor={colors[i % colors.length]} stopOpacity={0.3} />\n <stop offset=\"95%\" stopColor={colors[i % colors.length]} stopOpacity={0.05} />\n </linearGradient>\n ))}\n </defs>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n {valKeys.length > 1 && (\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n )}\n {valKeys.map((key, i) => (\n <Area\n key={key}\n type=\"monotone\"\n dataKey={key}\n stroke={colors[i % colors.length]}\n strokeWidth={2}\n fill={`url(#area-grad-${chartId}-${i})`}\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Stacked bar chart */\n/* ------------------------------------------------------------------ */\n\nfunction StackedBarChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const catKey = rec.categoryColumn.header;\n const valKeys = rec.valueColumns.map((c) => c.header);\n\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <BarChart data={data} margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={catKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={(v: string) => truncateLabel(v)}\n angle={-45}\n textAnchor=\"end\"\n height={60}\n />\n <YAxis tick={{ fill: t.axis, fontSize: 11 }} tickFormatter={formatNumber} />\n <Tooltip content={<ChartTooltip dark={dark} />} />\n <Legend wrapperStyle={{ fontSize: 12, color: t.legendText }} />\n {valKeys.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n stackId=\"a\"\n fill={colors[i % colors.length]}\n radius={i === valKeys.length - 1 ? [4, 4, 0, 0] : undefined}\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Scatter chart */\n/* ------------------------------------------------------------------ */\n\nfunction ScatterChartView({\n data,\n rec,\n dark,\n}: {\n data: RechartsRow[];\n rec: ChartRecommendation;\n dark: boolean;\n}) {\n const colors = getColors(dark);\n const t = themeTokens(dark);\n const xKey = rec.categoryColumn.header;\n const yKey = rec.valueColumns[0].header;\n const zKey = rec.valueColumns.length > 1 ? rec.valueColumns[1].header : undefined;\n\n return (\n <ResponsiveContainer width=\"100%\" height={300}>\n <ScatterChart margin={{ top: 8, right: 8, bottom: 40, left: 8 }}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={t.grid} />\n <XAxis\n dataKey={xKey}\n type=\"number\"\n name={xKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n <YAxis\n dataKey={yKey}\n type=\"number\"\n name={yKey}\n tick={{ fill: t.axis, fontSize: 11 }}\n tickFormatter={formatNumber}\n />\n {zKey && <ZAxis dataKey={zKey} type=\"number\" name={zKey} range={[40, 400]} />}\n <Tooltip\n content={<ChartTooltip dark={dark} />}\n cursor={{ strokeDasharray: \"3 3\" }}\n />\n <Scatter\n data={data}\n fill={colors[0]}\n />\n </ScatterChart>\n </ResponsiveContainer>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart type selector */\n/* ------------------------------------------------------------------ */\n\nconst CHART_LABELS: Record<ChartType, string> = {\n bar: \"Bar\",\n line: \"Line\",\n pie: \"Pie\",\n area: \"Area\",\n \"stacked-bar\": \"Stacked\",\n scatter: \"Scatter\",\n};\n\nfunction ChartTypeSelector({\n recommendations,\n active,\n onChange,\n}: {\n recommendations: ChartRecommendation[];\n active: ChartType;\n onChange: (t: ChartType) => void;\n}) {\n if (recommendations.length <= 1) return null;\n\n const seen = new Set<ChartType>();\n const unique = recommendations.filter((r) => {\n if (seen.has(r.type)) return false;\n seen.add(r.type);\n return true;\n });\n\n if (unique.length <= 1) return null;\n\n return (\n <div className=\"flex gap-1\">\n {unique.map((rec) => (\n <button\n key={rec.type}\n onClick={() => onChange(rec.type)}\n aria-pressed={active === rec.type}\n className={`rounded px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50 ${\n active === rec.type\n ? \"bg-blue-100 text-blue-700 dark:bg-blue-600/20 dark:text-blue-400\"\n : \"text-zinc-500 hover:text-zinc-800 dark:text-zinc-400 dark:hover:text-zinc-200\"\n }`}\n >\n {CHART_LABELS[rec.type]}\n </button>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Chart renderer (inside error boundary) */\n/* ------------------------------------------------------------------ */\n\nfunction ChartRenderer({\n rows,\n rec,\n defaultData,\n defaultRec,\n dark,\n}: {\n rows: string[][];\n rec: ChartRecommendation;\n defaultData: RechartsRow[];\n defaultRec: ChartRecommendation;\n dark: boolean;\n}) {\n // Re-transform data when switching chart type (category axis may differ)\n const chartData = rec === defaultRec ? defaultData : transformData(rows, rec);\n const type = rec.type;\n\n return (\n <div className=\"p-2\">\n {type === \"bar\" ? <BarChartView data={chartData} rec={rec} dark={dark} />\n : type === \"line\" ? <LineChartView data={chartData} rec={rec} dark={dark} />\n : type === \"area\" ? <AreaChartView data={chartData} rec={rec} dark={dark} />\n : type === \"stacked-bar\" ? <StackedBarChartView data={chartData} rec={rec} dark={dark} />\n : type === \"scatter\" ? <ScatterChartView data={chartData} rec={rec} dark={dark} />\n : <PieChartView data={chartData} rec={rec} dark={dark} />}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Main ResultChart component */\n/* ------------------------------------------------------------------ */\n\nexport function ResultChart({\n headers,\n rows,\n dark,\n detectionResult,\n}: {\n headers: string[];\n rows: string[][];\n dark: boolean;\n detectionResult?: ChartDetectionResult;\n}) {\n const result = useMemo(\n () => detectionResult ?? detectCharts(headers, rows),\n [headers, rows, detectionResult],\n );\n\n const [activeType, setActiveType] = useState<ChartType | null>(null);\n\n if (!result.chartable) return null;\n\n const currentType = activeType ?? result.recommendations[0].type;\n const currentRec = result.recommendations.find((r) => r.type === currentType) ?? result.recommendations[0];\n\n return (\n <div className=\"overflow-hidden rounded-lg border border-zinc-200 dark:border-zinc-700\">\n <div className=\"flex items-center justify-between border-b border-zinc-100 bg-zinc-50/50 px-3 py-2 dark:border-zinc-800 dark:bg-zinc-900/50\">\n <span className=\"text-xs text-zinc-500 dark:text-zinc-400\">{currentRec.reason}</span>\n <ChartTypeSelector\n recommendations={result.recommendations}\n active={currentType}\n onChange={setActiveType}\n />\n </div>\n <ErrorBoundary\n key={currentType}\n fallback={\n <div className=\"rounded-lg border border-yellow-300 bg-yellow-50 px-3 py-2 text-xs text-yellow-700 dark:border-yellow-900/50 dark:bg-yellow-950/20 dark:text-yellow-400\">\n Unable to render chart. Switch to Table view to see your data.\n </div>\n }\n >\n <ChartRenderer\n rows={rows}\n rec={currentRec}\n defaultData={result.data}\n defaultRec={result.recommendations[0]}\n dark={dark}\n />\n </ErrorBoundary>\n </div>\n );\n}\n"]}