@seed-ship/mcp-ui-solid 6.17.0 → 6.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/README.md +50 -3
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/presentation.cjs +141 -0
- package/dist/adapters/presentation.cjs.map +1 -0
- package/dist/adapters/presentation.d.ts +68 -0
- package/dist/adapters/presentation.d.ts.map +1 -0
- package/dist/adapters/presentation.js +141 -0
- package/dist/adapters/presentation.js.map +1 -0
- package/dist/adapters.cjs +4 -0
- package/dist/adapters.cjs.map +1 -1
- package/dist/adapters.d.cts +2 -0
- package/dist/adapters.d.ts +2 -0
- package/dist/adapters.js +4 -0
- package/dist/adapters.js.map +1 -1
- package/dist/components/ChartJSRenderer.cjs +165 -65
- package/dist/components/ChartJSRenderer.cjs.map +1 -1
- package/dist/components/ChartJSRenderer.d.ts.map +1 -1
- package/dist/components/ChartJSRenderer.js +168 -68
- package/dist/components/ChartJSRenderer.js.map +1 -1
- package/dist/components/ComponentToolbar.cjs.map +1 -1
- package/dist/components/ComponentToolbar.d.ts.map +1 -1
- package/dist/components/ComponentToolbar.js.map +1 -1
- package/dist/components/EditableLayoutContext.cjs +17 -0
- package/dist/components/EditableLayoutContext.cjs.map +1 -0
- package/dist/components/EditableLayoutContext.d.ts +5 -0
- package/dist/components/EditableLayoutContext.d.ts.map +1 -0
- package/dist/components/EditableLayoutContext.js +17 -0
- package/dist/components/EditableLayoutContext.js.map +1 -0
- package/dist/components/EditableUIResourceRenderer.cjs +87 -84
- package/dist/components/EditableUIResourceRenderer.cjs.map +1 -1
- package/dist/components/EditableUIResourceRenderer.d.ts.map +1 -1
- package/dist/components/EditableUIResourceRenderer.js +87 -84
- package/dist/components/EditableUIResourceRenderer.js.map +1 -1
- package/dist/components/ElicitationForm.cjs.map +1 -1
- package/dist/components/ElicitationForm.js.map +1 -1
- package/dist/components/FeedbackInline.cjs +0 -1
- package/dist/components/FeedbackInline.cjs.map +1 -1
- package/dist/components/FeedbackInline.js +0 -1
- package/dist/components/FeedbackInline.js.map +1 -1
- package/dist/components/GraphRenderer.cjs.map +1 -1
- package/dist/components/GraphRenderer.d.ts.map +1 -1
- package/dist/components/GraphRenderer.js.map +1 -1
- package/dist/components/GridRenderer.cjs +12 -6
- package/dist/components/GridRenderer.cjs.map +1 -1
- package/dist/components/GridRenderer.d.ts.map +1 -1
- package/dist/components/GridRenderer.js +13 -7
- package/dist/components/GridRenderer.js.map +1 -1
- package/dist/components/MapRenderer.cjs.map +1 -1
- package/dist/components/MapRenderer.d.ts.map +1 -1
- package/dist/components/MapRenderer.js.map +1 -1
- package/dist/components/PresentationFeedback.cjs +0 -1
- package/dist/components/PresentationFeedback.cjs.map +1 -1
- package/dist/components/PresentationFeedback.js +0 -1
- package/dist/components/PresentationFeedback.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +37 -22
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +38 -23
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/components/VerifiedText.cjs +0 -4
- package/dist/components/VerifiedText.cjs.map +1 -1
- package/dist/components/VerifiedText.d.ts.map +1 -1
- package/dist/components/VerifiedText.js +0 -4
- package/dist/components/VerifiedText.js.map +1 -1
- package/dist/components/chart-data-table.cjs +73 -0
- package/dist/components/chart-data-table.cjs.map +1 -0
- package/dist/components/chart-data-table.d.ts +23 -0
- package/dist/components/chart-data-table.d.ts.map +1 -0
- package/dist/components/chart-data-table.js +73 -0
- package/dist/components/chart-data-table.js.map +1 -0
- package/dist/context/MCPUIStringsContext.cjs +10 -9
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +17 -5
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +11 -10
- package/dist/context/MCPUIStringsContext.js.map +1 -1
- package/dist/hooks/createResponsiveGrid.cjs +37 -0
- package/dist/hooks/createResponsiveGrid.cjs.map +1 -0
- package/dist/hooks/createResponsiveGrid.d.ts +6 -0
- package/dist/hooks/createResponsiveGrid.d.ts.map +1 -0
- package/dist/hooks/createResponsiveGrid.js +37 -0
- package/dist/hooks/createResponsiveGrid.js.map +1 -0
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-ui-spec/dist/schemas.cjs +13 -1
- package/dist/mcp-ui-spec/dist/schemas.cjs.map +1 -1
- package/dist/mcp-ui-spec/dist/schemas.js +13 -1
- package/dist/mcp-ui-spec/dist/schemas.js.map +1 -1
- package/dist/services/chat-bus.cjs.map +1 -1
- package/dist/services/chat-bus.d.ts.map +1 -1
- package/dist/services/chat-bus.js.map +1 -1
- package/dist/services/chat-prompt-controller.cjs.map +1 -1
- package/dist/services/chat-prompt-controller.d.ts.map +1 -1
- package/dist/services/chat-prompt-controller.js.map +1 -1
- package/dist/services/component-registry.cjs +162 -22
- package/dist/services/component-registry.cjs.map +1 -1
- package/dist/services/component-registry.d.ts +6 -3
- package/dist/services/component-registry.d.ts.map +1 -1
- package/dist/services/component-registry.js +162 -22
- package/dist/services/component-registry.js.map +1 -1
- package/dist/services/telemetry.cjs +0 -1
- package/dist/services/telemetry.cjs.map +1 -1
- package/dist/services/telemetry.js +0 -1
- package/dist/services/telemetry.js.map +1 -1
- package/dist/services/validation.cjs +21 -7
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +21 -7
- package/dist/services/validation.js.map +1 -1
- package/dist/types/index.d.ts +43 -8
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types.d.cts +43 -8
- package/dist/types.d.ts +43 -8
- package/docs/briefs/VISUALIZATION-FOUNDATION-2026-09-14.md +105 -0
- package/package.json +4 -4
- package/src/adapters/index.ts +18 -0
- package/src/adapters/presentation.test.ts +114 -0
- package/src/adapters/presentation.ts +229 -0
- package/src/components/ChartJSRenderer.test.tsx +325 -0
- package/src/components/ChartJSRenderer.tsx +162 -27
- package/src/components/ChatPrompt.test.tsx +1 -1
- package/src/components/ComponentToolbar.tsx +1 -1
- package/src/components/EditableLayoutContext.tsx +12 -0
- package/src/components/EditableUIResourceRenderer.tsx +11 -8
- package/src/components/ElicitationForm.tsx +1 -1
- package/src/components/FeedbackInline.tsx +1 -1
- package/src/components/GraphRenderer.test.tsx +1 -2
- package/src/components/GraphRenderer.tsx +0 -2
- package/src/components/GridRenderer.tsx +6 -4
- package/src/components/MapRenderer.tsx +0 -3
- package/src/components/PresentationFeedback.tsx +1 -1
- package/src/components/ResponsiveGrid.test.tsx +166 -0
- package/src/components/TableRenderer.pagination.test.tsx +31 -0
- package/src/components/UIResourceRenderer.tsx +14 -9
- package/src/components/VerifiedText.tsx +0 -5
- package/src/components/chart-data-table.ts +97 -0
- package/src/context/MCPUIStringsContext.test.tsx +60 -0
- package/src/context/MCPUIStringsContext.tsx +31 -12
- package/src/hooks/createResponsiveGrid.ts +41 -0
- package/src/services/chat-bus.test.ts +1 -1
- package/src/services/chat-bus.ts +0 -2
- package/src/services/chat-prompt-controller.ts +0 -8
- package/src/services/component-registry.test.ts +81 -2
- package/src/services/component-registry.ts +167 -23
- package/src/services/telemetry.ts +1 -1
- package/src/services/validation.test.ts +1 -14
- package/src/services/validation.ts +23 -6
- package/src/services/visualization-validation.test.ts +42 -0
- package/src/types/index.ts +50 -9
- package/src/types/visualization-contracts.test.ts +66 -0
- package/src/utils/perf.test.ts +3 -3
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -26,9 +26,10 @@ const web = require("solid-js/web");
|
|
|
26
26
|
const solidJs = require("solid-js");
|
|
27
27
|
const ExpandableWrapper = require("./ExpandableWrapper.cjs");
|
|
28
28
|
const DegradedFallback = require("./DegradedFallback.cjs");
|
|
29
|
-
const
|
|
29
|
+
const chartDataTable = require("./chart-data-table.cjs");
|
|
30
30
|
const MCPUITelemetryContext = require("../context/MCPUITelemetryContext.cjs");
|
|
31
|
-
|
|
31
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
32
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ web.template(`<button type=button class="opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"title="Download PNG"aria-label="Download chart as PNG"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z">`), _tmpl$3 = /* @__PURE__ */ web.template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$4 = /* @__PURE__ */ web.template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">Loading chart...`), _tmpl$6 = /* @__PURE__ */ web.template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$8 = /* @__PURE__ */ web.template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$9 = /* @__PURE__ */ web.template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
|
|
32
33
|
let ChartJS = null;
|
|
33
34
|
let chartJSLoadPromise = null;
|
|
34
35
|
const loadChartJS = async () => {
|
|
@@ -52,14 +53,20 @@ async function isChartJSAvailable() {
|
|
|
52
53
|
return false;
|
|
53
54
|
}
|
|
54
55
|
}
|
|
56
|
+
const ContextAwareChartLayout = (props) => props.render(ExpandableWrapper.useExpanded());
|
|
55
57
|
const ChartJSRenderer = (props) => {
|
|
56
58
|
const [isLoading, setIsLoading] = solidJs.createSignal(true);
|
|
57
59
|
const [error, setError] = solidJs.createSignal();
|
|
60
|
+
const [activeView, setActiveView] = solidJs.createSignal("chart");
|
|
58
61
|
let canvasRef;
|
|
59
62
|
let chartInstance;
|
|
63
|
+
let renderVersion = 0;
|
|
60
64
|
const params = () => props.component.params;
|
|
61
|
-
const
|
|
65
|
+
const tableData = solidJs.createMemo(() => chartDataTable.chartToDataTable(params()));
|
|
62
66
|
const telemetry = MCPUITelemetryContext.useTelemetry();
|
|
67
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
68
|
+
const descriptionId = solidJs.createUniqueId();
|
|
69
|
+
const title = () => params().title || strings.chartView;
|
|
63
70
|
const exportEnabled = () => params().exportable !== false;
|
|
64
71
|
const copyDataJSON = () => JSON.stringify({
|
|
65
72
|
type: params().type,
|
|
@@ -77,10 +84,12 @@ const ChartJSRenderer = (props) => {
|
|
|
77
84
|
var _a, _b, _c, _d, _e, _f;
|
|
78
85
|
if (!canvasRef) return;
|
|
79
86
|
const chartParams = params();
|
|
87
|
+
const version = ++renderVersion;
|
|
80
88
|
setIsLoading(true);
|
|
81
89
|
setError(void 0);
|
|
82
90
|
try {
|
|
83
91
|
const Chart = await loadChartJS();
|
|
92
|
+
if (version !== renderVersion || !canvasRef) return;
|
|
84
93
|
if (chartInstance) {
|
|
85
94
|
chartInstance.destroy();
|
|
86
95
|
chartInstance = null;
|
|
@@ -126,6 +135,7 @@ const ChartJSRenderer = (props) => {
|
|
|
126
135
|
});
|
|
127
136
|
setIsLoading(false);
|
|
128
137
|
} catch (err) {
|
|
138
|
+
if (version !== renderVersion) return;
|
|
129
139
|
const error2 = err instanceof Error ? err : new Error("Chart rendering failed");
|
|
130
140
|
setError(error2.message);
|
|
131
141
|
setIsLoading(false);
|
|
@@ -139,7 +149,15 @@ const ChartJSRenderer = (props) => {
|
|
|
139
149
|
(_f = props.onError) == null ? void 0 : _f.call(props, error2);
|
|
140
150
|
}
|
|
141
151
|
});
|
|
152
|
+
solidJs.createEffect(() => {
|
|
153
|
+
if (activeView() !== "chart" || !chartInstance) return;
|
|
154
|
+
queueMicrotask(() => {
|
|
155
|
+
var _a;
|
|
156
|
+
return (_a = chartInstance == null ? void 0 : chartInstance.resize) == null ? void 0 : _a.call(chartInstance);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
142
159
|
solidJs.onCleanup(() => {
|
|
160
|
+
renderVersion += 1;
|
|
143
161
|
if (chartInstance) {
|
|
144
162
|
chartInstance.destroy();
|
|
145
163
|
chartInstance = null;
|
|
@@ -147,7 +165,7 @@ const ChartJSRenderer = (props) => {
|
|
|
147
165
|
});
|
|
148
166
|
return web.createComponent(ExpandableWrapper.ExpandableWrapper, {
|
|
149
167
|
get title() {
|
|
150
|
-
return
|
|
168
|
+
return title();
|
|
151
169
|
},
|
|
152
170
|
get copyData() {
|
|
153
171
|
return copyDataJSON();
|
|
@@ -157,80 +175,162 @@ const ChartJSRenderer = (props) => {
|
|
|
157
175
|
return props.toolbarVariant;
|
|
158
176
|
},
|
|
159
177
|
get children() {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
},
|
|
165
|
-
get children() {
|
|
166
|
-
var _el$2 = web.getNextElement(_tmpl$3), _el$5 = _el$2.firstChild, [_el$6, _co$] = web.getNextMarker(_el$5.nextSibling), _el$7 = _el$6.nextSibling, [_el$8, _co$2] = web.getNextMarker(_el$7.nextSibling);
|
|
167
|
-
web.insert(_el$2, web.createComponent(solidJs.Show, {
|
|
178
|
+
return web.createComponent(ContextAwareChartLayout, {
|
|
179
|
+
render: (isExpanded) => (() => {
|
|
180
|
+
var _el$ = web.getNextElement(_tmpl$6), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$0 = _el$6.nextSibling, [_el$1, _co$] = web.getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = web.getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = web.getNextMarker(_el$14.nextSibling), _el$38 = _el$10.nextSibling, [_el$39, _co$9] = web.getNextMarker(_el$38.nextSibling), _el$40 = _el$39.nextSibling, [_el$41, _co$0] = web.getNextMarker(_el$40.nextSibling), _el$33 = _el$41.nextSibling, _el$34 = _el$33.firstChild, _el$36 = _el$34.nextSibling, [_el$37, _co$8] = web.getNextMarker(_el$36.nextSibling);
|
|
181
|
+
web.insert(_el$3, web.createComponent(solidJs.Show, {
|
|
168
182
|
get when() {
|
|
169
183
|
return params().title;
|
|
170
184
|
},
|
|
171
185
|
get children() {
|
|
172
|
-
var _el$
|
|
173
|
-
web.insert(_el$
|
|
174
|
-
return _el$
|
|
186
|
+
var _el$4 = web.getNextElement(_tmpl$);
|
|
187
|
+
web.insert(_el$4, () => params().title);
|
|
188
|
+
return _el$4;
|
|
175
189
|
}
|
|
176
|
-
})
|
|
177
|
-
|
|
190
|
+
}));
|
|
191
|
+
_el$7.$$click = () => setActiveView("chart");
|
|
192
|
+
web.insert(_el$7, () => strings.chartView);
|
|
193
|
+
_el$8.$$click = () => setActiveView("data");
|
|
194
|
+
web.insert(_el$8, () => strings.chartDataView);
|
|
195
|
+
web.insert(_el$5, web.createComponent(solidJs.Show, {
|
|
178
196
|
get when() {
|
|
179
197
|
return exportEnabled();
|
|
180
198
|
},
|
|
181
199
|
get children() {
|
|
182
|
-
var _el$
|
|
183
|
-
_el$
|
|
200
|
+
var _el$9 = web.getNextElement(_tmpl$2);
|
|
201
|
+
_el$9.$$click = handleExportPNG;
|
|
202
|
+
web.effect(() => web.setProperty(_el$9, "disabled", activeView() !== "chart" || isLoading() || Boolean(error())));
|
|
184
203
|
web.runHydrationEvents();
|
|
185
|
-
return _el$
|
|
204
|
+
return _el$9;
|
|
186
205
|
}
|
|
187
|
-
}), _el$
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
},
|
|
195
|
-
get children() {
|
|
196
|
-
return web.getNextElement(_tmpl$4);
|
|
197
|
-
}
|
|
198
|
-
}), _el$13, _co$4);
|
|
199
|
-
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
200
|
-
get when() {
|
|
201
|
-
return error();
|
|
202
|
-
},
|
|
203
|
-
get children() {
|
|
204
|
-
return web.createComponent(DegradedFallback.DegradedFallback, web.mergeProps({
|
|
205
|
-
get message() {
|
|
206
|
-
return `Chart rendering failed: ${error()}`;
|
|
206
|
+
}), _el$1, _co$);
|
|
207
|
+
web.setAttribute(_el$10, "id", descriptionId);
|
|
208
|
+
web.insert(_el$10, title, _el$13, _co$2);
|
|
209
|
+
web.insert(_el$10, () => strings.chartDataSummary, _el$15, _co$3);
|
|
210
|
+
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
211
|
+
get when() {
|
|
212
|
+
return web.memo(() => !!error())() && activeView() === "chart";
|
|
207
213
|
},
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
214
|
+
get children() {
|
|
215
|
+
return web.createComponent(DegradedFallback.DegradedFallback, web.mergeProps({
|
|
216
|
+
get message() {
|
|
217
|
+
return `Chart rendering failed: ${error()}`;
|
|
218
|
+
},
|
|
219
|
+
caption: "Showing the chart data as a table — the interactive chart is unavailable."
|
|
220
|
+
}, tableData));
|
|
221
|
+
}
|
|
222
|
+
}), _el$39, _co$9);
|
|
223
|
+
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
224
|
+
get when() {
|
|
225
|
+
return activeView() === "data";
|
|
226
|
+
},
|
|
227
|
+
get children() {
|
|
228
|
+
var _el$16 = web.getNextElement(_tmpl$4), _el$17 = _el$16.firstChild, _el$18 = _el$17.firstChild, _el$20 = _el$18.firstChild, [_el$21, _co$4] = web.getNextMarker(_el$20.nextSibling), _el$19 = _el$21.nextSibling, _el$22 = _el$19.nextSibling, [_el$23, _co$5] = web.getNextMarker(_el$22.nextSibling), _el$24 = _el$18.nextSibling, _el$25 = _el$24.firstChild, _el$26 = _el$24.nextSibling, _el$29 = _el$26.firstChild, [_el$30, _co$6] = web.getNextMarker(_el$29.nextSibling), _el$31 = _el$30.nextSibling, [_el$32, _co$7] = web.getNextMarker(_el$31.nextSibling);
|
|
229
|
+
web.insert(_el$18, title, _el$21, _co$4);
|
|
230
|
+
web.insert(_el$18, () => strings.chartDataTable, _el$23, _co$5);
|
|
231
|
+
web.insert(_el$25, web.createComponent(solidJs.For, {
|
|
232
|
+
get each() {
|
|
233
|
+
return tableData().columns;
|
|
234
|
+
},
|
|
235
|
+
children: (column) => (() => {
|
|
236
|
+
var _el$42 = web.getNextElement(_tmpl$7);
|
|
237
|
+
web.insert(_el$42, column);
|
|
238
|
+
return _el$42;
|
|
239
|
+
})()
|
|
240
|
+
}));
|
|
241
|
+
web.insert(_el$26, web.createComponent(solidJs.For, {
|
|
242
|
+
get each() {
|
|
243
|
+
return tableData().rows;
|
|
244
|
+
},
|
|
245
|
+
children: (row) => (() => {
|
|
246
|
+
var _el$43 = web.getNextElement(_tmpl$8);
|
|
247
|
+
web.insert(_el$43, web.createComponent(solidJs.For, {
|
|
248
|
+
get each() {
|
|
249
|
+
return tableData().columns;
|
|
250
|
+
},
|
|
251
|
+
children: (_column, index) => (() => {
|
|
252
|
+
var _el$44 = web.getNextElement(_tmpl$9);
|
|
253
|
+
web.insert(_el$44, () => String(row[index()] ?? ""));
|
|
254
|
+
return _el$44;
|
|
255
|
+
})()
|
|
256
|
+
}));
|
|
257
|
+
return _el$43;
|
|
258
|
+
})()
|
|
259
|
+
}), _el$30, _co$6);
|
|
260
|
+
web.insert(_el$26, web.createComponent(solidJs.Show, {
|
|
261
|
+
get when() {
|
|
262
|
+
return tableData().rows.length === 0;
|
|
263
|
+
},
|
|
264
|
+
get children() {
|
|
265
|
+
var _el$27 = web.getNextElement(_tmpl$3), _el$28 = _el$27.firstChild;
|
|
266
|
+
web.insert(_el$28, () => strings.chartNoData);
|
|
267
|
+
web.effect(() => web.setAttribute(_el$28, "colspan", Math.max(1, tableData().columns.length)));
|
|
268
|
+
return _el$27;
|
|
269
|
+
}
|
|
270
|
+
}), _el$32, _co$7);
|
|
271
|
+
web.effect((_p$) => {
|
|
272
|
+
var _v$ = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$2 = isExpanded() ? void 0 : {
|
|
273
|
+
height: params().height || "250px",
|
|
274
|
+
"max-height": "70vh"
|
|
275
|
+
};
|
|
276
|
+
_v$ !== _p$.e && web.className(_el$16, _p$.e = _v$);
|
|
277
|
+
_p$.t = web.style(_el$16, _v$2, _p$.t);
|
|
278
|
+
return _p$;
|
|
279
|
+
}, {
|
|
280
|
+
e: void 0,
|
|
281
|
+
t: void 0
|
|
282
|
+
});
|
|
283
|
+
return _el$16;
|
|
284
|
+
}
|
|
285
|
+
}), _el$41, _co$0);
|
|
286
|
+
var _ref$ = canvasRef;
|
|
287
|
+
typeof _ref$ === "function" ? web.use(_ref$, _el$34) : canvasRef = _el$34;
|
|
288
|
+
web.setAttribute(_el$34, "aria-describedby", descriptionId);
|
|
289
|
+
web.insert(_el$33, web.createComponent(solidJs.Show, {
|
|
290
|
+
get when() {
|
|
291
|
+
return web.memo(() => !!isLoading())() && activeView() === "chart";
|
|
292
|
+
},
|
|
293
|
+
get children() {
|
|
294
|
+
return web.getNextElement(_tmpl$5);
|
|
295
|
+
}
|
|
296
|
+
}), _el$37, _co$8);
|
|
297
|
+
web.effect((_p$) => {
|
|
298
|
+
var _v$3 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""} ${params().className || ""}`, _v$4 = strings.chartViewSelector, _v$5 = activeView() === "chart", _v$6 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "chart" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$7 = activeView() === "data", _v$8 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "data" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$9 = `relative w-full ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$0 = error() || activeView() === "data" ? {
|
|
299
|
+
display: "none"
|
|
300
|
+
} : isExpanded() ? {
|
|
301
|
+
height: "100%",
|
|
302
|
+
display: "block"
|
|
303
|
+
} : {
|
|
304
|
+
height: params().height || "250px",
|
|
305
|
+
display: "block"
|
|
306
|
+
}, _v$1 = title(), _v$10 = activeView() !== "chart" || Boolean(error());
|
|
307
|
+
_v$3 !== _p$.e && web.className(_el$, _p$.e = _v$3);
|
|
308
|
+
_v$4 !== _p$.t && web.setAttribute(_el$6, "aria-label", _p$.t = _v$4);
|
|
309
|
+
_v$5 !== _p$.a && web.setAttribute(_el$7, "aria-pressed", _p$.a = _v$5);
|
|
310
|
+
_v$6 !== _p$.o && web.className(_el$7, _p$.o = _v$6);
|
|
311
|
+
_v$7 !== _p$.i && web.setAttribute(_el$8, "aria-pressed", _p$.i = _v$7);
|
|
312
|
+
_v$8 !== _p$.n && web.className(_el$8, _p$.n = _v$8);
|
|
313
|
+
_v$9 !== _p$.s && web.className(_el$33, _p$.s = _v$9);
|
|
314
|
+
_p$.h = web.style(_el$33, _v$0, _p$.h);
|
|
315
|
+
_v$1 !== _p$.r && web.setAttribute(_el$34, "aria-label", _p$.r = _v$1);
|
|
316
|
+
_v$10 !== _p$.d && web.setAttribute(_el$34, "aria-hidden", _p$.d = _v$10);
|
|
317
|
+
return _p$;
|
|
318
|
+
}, {
|
|
319
|
+
e: void 0,
|
|
320
|
+
t: void 0,
|
|
321
|
+
a: void 0,
|
|
322
|
+
o: void 0,
|
|
323
|
+
i: void 0,
|
|
324
|
+
n: void 0,
|
|
325
|
+
s: void 0,
|
|
326
|
+
h: void 0,
|
|
327
|
+
r: void 0,
|
|
328
|
+
d: void 0
|
|
329
|
+
});
|
|
330
|
+
web.runHydrationEvents();
|
|
331
|
+
return _el$;
|
|
332
|
+
})()
|
|
232
333
|
});
|
|
233
|
-
return _el$;
|
|
234
334
|
}
|
|
235
335
|
});
|
|
236
336
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartJSRenderer.cjs","sources":["../../src/components/ChartJSRenderer.tsx"],"sourcesContent":["/**\n * ChartJSRenderer - Native Chart.js rendering\n * Sprint 4: State & Charts\n *\n * Requires chart.js peer dependency:\n * ```\n * pnpm add chart.js\n * ```\n */\n\nimport { Component, createEffect, onCleanup, createSignal, Show } from 'solid-js';\nimport type { UIComponent, ChartComponentParams } from '../types';\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper';\nimport { DegradedFallback } from './DegradedFallback';\nimport { chartToDegradedTable } from '../utils/degraded-projections';\nimport { useTelemetry } from '../context/MCPUITelemetryContext';\n\n// Lazy load Chart.js to avoid bundling if not used\nlet ChartJS: any = null;\nlet chartJSLoadPromise: Promise<any> | null = null;\n\nconst loadChartJS = async () => {\n if (ChartJS) return ChartJS;\n\n if (!chartJSLoadPromise) {\n chartJSLoadPromise = import('chart.js/auto')\n .then((module) => {\n ChartJS = module.default || module.Chart;\n return ChartJS;\n })\n .catch((err) => {\n chartJSLoadPromise = null;\n throw err;\n });\n }\n\n return chartJSLoadPromise;\n};\n\n/**\n * Check if Chart.js is available\n */\nexport async function isChartJSAvailable(): Promise<boolean> {\n try {\n await loadChartJS();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ChartJSRendererProps {\n /**\n * UIComponent with chart params\n */\n component: UIComponent;\n\n /**\n * Error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible';\n}\n\n/**\n * Native Chart.js renderer component\n *\n * @example\n * ```tsx\n * const chartComponent: UIComponent = {\n * id: 'revenue-chart',\n * type: 'chart',\n * position: { colStart: 1, colSpan: 6 },\n * params: {\n * type: 'bar',\n * title: 'Monthly Revenue',\n * data: {\n * labels: ['Jan', 'Feb', 'Mar'],\n * datasets: [{ label: 'Revenue', data: [100, 200, 150] }]\n * },\n * renderer: 'native',\n * },\n * }\n * <ChartJSRenderer component={chartComponent} />\n * ```\n */\nexport const ChartJSRenderer: Component<ChartJSRendererProps> = (props) => {\n const [isLoading, setIsLoading] = createSignal(true);\n const [error, setError] = createSignal<string>();\n let canvasRef: HTMLCanvasElement | undefined;\n let chartInstance: any;\n\n const params = () => props.component.params as ChartComponentParams;\n const isExpanded = useExpanded();\n const telemetry = useTelemetry();\n\n // v6.1.0 — export visibility :\n // - undefined / true → button shown (new default, was opt-in)\n // - false → button hidden (explicit opt-out, unchanged)\n const exportEnabled = () => params().exportable !== false;\n\n // v6.1.0 — copy data for the ExpandableWrapper modal-header copy button.\n // Lazy-stringified each time the button is clicked.\n const copyDataJSON = () => JSON.stringify({ type: params().type, data: params().data }, null, 2);\n\n // Chart PNG export\n const handleExportPNG = () => {\n if (!canvasRef) return;\n const url = canvasRef.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(params().title || 'chart').replace(/\\s+/g, '-').toLowerCase()}.png`;\n a.click();\n };\n\n // Create/update chart when params change\n createEffect(async () => {\n if (!canvasRef) return;\n\n // Access params to track dependencies\n const chartParams = params();\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const Chart = await loadChartJS();\n\n // Destroy previous instance\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n\n // Build options, merging time-axis config if present (v3.1.0)\n const baseOptions: any = {\n responsive: true,\n maintainAspectRatio: false,\n ...chartParams.options,\n plugins: {\n ...chartParams.options?.plugins,\n legend: {\n display: true,\n position: 'bottom',\n ...chartParams.options?.plugins?.legend,\n },\n },\n };\n\n // Time-series axis (v3.1.0)\n if (chartParams.timeAxis) {\n const ta = chartParams.timeAxis;\n baseOptions.scales = {\n ...baseOptions.scales,\n x: {\n ...baseOptions.scales?.x,\n type: 'time',\n time: {\n parser: ta.parser,\n unit: ta.unit,\n tooltipFormat: ta.tooltipFormat,\n },\n ...(ta.min ? { min: ta.min } : {}),\n ...(ta.max ? { max: ta.max } : {}),\n },\n };\n }\n\n // Create new chart\n chartInstance = new Chart(canvasRef, {\n type: chartParams.type,\n data: chartParams.data,\n options: baseOptions,\n });\n\n setIsLoading(false);\n } catch (err) {\n const error = err instanceof Error ? err : new Error('Chart rendering failed');\n setError(error.message);\n setIsLoading(false);\n // Fallback ladder (P2.5): record the failure so it's observable, then\n // degrade to the series table below instead of a blank canvas.\n telemetry?.dispatch({\n type: 'render:error',\n errorMessage: error.message,\n id: props.component?.id ?? '',\n componentType: 'chart',\n ts: Date.now(),\n });\n props.onError?.(error);\n }\n });\n\n // Cleanup on unmount\n onCleanup(() => {\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n });\n\n return (\n <ExpandableWrapper\n title={params().title || 'Chart'}\n copyData={copyDataJSON()}\n copyLabel=\"Copy chart data (JSON)\"\n toolbarVariant={props.toolbarVariant}\n >\n <div\n class={`relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${\n isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''\n }`}\n >\n <Show when={params().title || exportEnabled()}>\n <div class=\"flex items-center justify-between mb-3 flex-shrink-0\">\n <Show when={params().title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params().title}</h3>\n </Show>\n <Show when={exportEnabled()}>\n <button\n onClick={handleExportPNG}\n class=\"opacity-0 group-hover:opacity-60 hover:!opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm\"\n title=\"Download PNG\"\n aria-label=\"Download chart as PNG\"\n >\n <svg\n class=\"w-3 h-3 text-gray-500 dark:text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n </Show>\n </div>\n </Show>\n\n <Show when={isLoading()}>\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80\">\n <div class=\"flex flex-col items-center gap-2\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span class=\"text-sm text-gray-500 dark:text-gray-400\">Loading chart...</span>\n </div>\n </div>\n </Show>\n\n {/* Fallback ladder (P2.5): degrade to a series table on render error\n instead of a bare \"Chart Error\" message. */}\n <Show when={error()}>\n <DegradedFallback\n message={`Chart rendering failed: ${error()}`}\n caption=\"Showing the chart data as a table — the interactive chart is unavailable.\"\n {...chartToDegradedTable(params() ?? {})}\n />\n </Show>\n\n <div\n class={`w-full ${isExpanded() ? 'flex-1 min-h-0' : ''}`}\n style={\n error()\n ? { display: 'none' }\n : isExpanded()\n ? { height: '100%', display: 'block' }\n : { height: params().height || '250px', display: 'block' }\n }\n >\n <canvas ref={canvasRef} />\n </div>\n </div>\n </ExpandableWrapper>\n );\n};\n"],"names":["ChartJS","chartJSLoadPromise","loadChartJS","then","module","default","Chart","catch","err","isChartJSAvailable","ChartJSRenderer","props","isLoading","setIsLoading","createSignal","error","setError","canvasRef","chartInstance","params","component","isExpanded","useExpanded","telemetry","useTelemetry","exportEnabled","exportable","copyDataJSON","JSON","stringify","type","data","handleExportPNG","url","toDataURL","a","document","createElement","href","download","title","replace","toLowerCase","click","createEffect","chartParams","undefined","destroy","baseOptions","responsive","maintainAspectRatio","options","plugins","legend","display","position","timeAxis","ta","scales","x","time","parser","unit","tooltipFormat","min","max","Error","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","toolbarVariant","children","_el$","_$getNextElement","_tmpl$5","_el$10","firstChild","_el$11","_co$3","_$getNextMarker","nextSibling","_el$12","_el$13","_co$4","_el$14","_el$15","_co$5","_el$0","_el$1","_$insert","Show","when","_el$2","_tmpl$3","_el$5","_el$6","_co$","_el$7","_el$8","_co$2","_el$3","_tmpl$","_el$4","_tmpl$2","$$click","_$runHydrationEvents","_tmpl$4","DegradedFallback","_$mergeProps","caption","chartToDegradedTable","_ref$","_$use","_$effect","_p$","_v$","_v$2","_v$3","height","e","_$className","t","_$style","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ChartJSRenderer.cjs","sources":["../../src/components/ChartJSRenderer.tsx"],"sourcesContent":["/**\n * ChartJSRenderer - Native Chart.js rendering\n * Sprint 4: State & Charts\n *\n * Requires chart.js peer dependency:\n * ```\n * pnpm add chart.js\n * ```\n */\n\nimport {\n Component,\n For,\n createEffect,\n createMemo,\n createUniqueId,\n onCleanup,\n createSignal,\n Show,\n} from 'solid-js';\nimport type { Accessor, JSX } from 'solid-js';\nimport type { UIComponent, ChartComponentParams } from '../types';\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper';\nimport { DegradedFallback } from './DegradedFallback';\nimport { chartToDataTable } from './chart-data-table';\nimport { useTelemetry } from '../context/MCPUITelemetryContext';\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext';\n\n// Lazy load Chart.js to avoid bundling if not used\nlet ChartJS: any = null;\nlet chartJSLoadPromise: Promise<any> | null = null;\n\nconst loadChartJS = async () => {\n if (ChartJS) return ChartJS;\n\n if (!chartJSLoadPromise) {\n chartJSLoadPromise = import('chart.js/auto')\n .then((module) => {\n ChartJS = module.default || module.Chart;\n return ChartJS;\n })\n .catch((err) => {\n chartJSLoadPromise = null;\n throw err;\n });\n }\n\n return chartJSLoadPromise;\n};\n\n/**\n * Check if Chart.js is available\n */\nexport async function isChartJSAvailable(): Promise<boolean> {\n try {\n await loadChartJS();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ChartJSRendererProps {\n /**\n * UIComponent with chart params\n */\n component: UIComponent;\n\n /**\n * Error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible';\n}\n\nconst ContextAwareChartLayout: Component<{\n render: (isExpanded: Accessor<boolean>) => JSX.Element;\n}> = (props) => props.render(useExpanded());\n\n/**\n * Native Chart.js renderer component\n *\n * @example\n * ```tsx\n * const chartComponent: UIComponent = {\n * id: 'revenue-chart',\n * type: 'chart',\n * position: { colStart: 1, colSpan: 6 },\n * params: {\n * type: 'bar',\n * title: 'Monthly Revenue',\n * data: {\n * labels: ['Jan', 'Feb', 'Mar'],\n * datasets: [{ label: 'Revenue', data: [100, 200, 150] }]\n * },\n * renderer: 'native',\n * },\n * }\n * <ChartJSRenderer component={chartComponent} />\n * ```\n */\nexport const ChartJSRenderer: Component<ChartJSRendererProps> = (props) => {\n const [isLoading, setIsLoading] = createSignal(true);\n const [error, setError] = createSignal<string>();\n const [activeView, setActiveView] = createSignal<'chart' | 'data'>('chart');\n let canvasRef: HTMLCanvasElement | undefined;\n let chartInstance: any;\n let renderVersion = 0;\n\n const params = () => props.component.params as ChartComponentParams;\n const tableData = createMemo(() => chartToDataTable(params()));\n const telemetry = useTelemetry();\n const strings = useMCPUIStrings();\n const descriptionId = createUniqueId();\n const title = () => params().title || strings.chartView;\n\n // v6.1.0 — export visibility :\n // - undefined / true → button shown (new default, was opt-in)\n // - false → button hidden (explicit opt-out, unchanged)\n const exportEnabled = () => params().exportable !== false;\n\n // v6.1.0 — copy data for the ExpandableWrapper modal-header copy button.\n // Lazy-stringified each time the button is clicked.\n const copyDataJSON = () => JSON.stringify({ type: params().type, data: params().data }, null, 2);\n\n // Chart PNG export\n const handleExportPNG = () => {\n if (!canvasRef) return;\n const url = canvasRef.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(params().title || 'chart').replace(/\\s+/g, '-').toLowerCase()}.png`;\n a.click();\n };\n\n // Create/update chart when params change\n createEffect(async () => {\n if (!canvasRef) return;\n\n // Access params to track dependencies\n const chartParams = params();\n const version = ++renderVersion;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const Chart = await loadChartJS();\n\n // A newer prop update or an unmount superseded this async render.\n if (version !== renderVersion || !canvasRef) return;\n\n // Destroy previous instance\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n\n // Build options, merging time-axis config if present (v3.1.0)\n const baseOptions: any = {\n responsive: true,\n maintainAspectRatio: false,\n ...chartParams.options,\n plugins: {\n ...chartParams.options?.plugins,\n legend: {\n display: true,\n position: 'bottom',\n ...chartParams.options?.plugins?.legend,\n },\n },\n };\n\n // Time-series axis (v3.1.0)\n if (chartParams.timeAxis) {\n const ta = chartParams.timeAxis;\n baseOptions.scales = {\n ...baseOptions.scales,\n x: {\n ...baseOptions.scales?.x,\n type: 'time',\n time: {\n parser: ta.parser,\n unit: ta.unit,\n tooltipFormat: ta.tooltipFormat,\n },\n ...(ta.min ? { min: ta.min } : {}),\n ...(ta.max ? { max: ta.max } : {}),\n },\n };\n }\n\n // Create new chart\n chartInstance = new Chart(canvasRef, {\n type: chartParams.type,\n data: chartParams.data,\n options: baseOptions,\n });\n\n setIsLoading(false);\n } catch (err) {\n if (version !== renderVersion) return;\n const error = err instanceof Error ? err : new Error('Chart rendering failed');\n setError(error.message);\n setIsLoading(false);\n // Fallback ladder (P2.5): record the failure so it's observable, then\n // degrade to the series table below instead of a blank canvas.\n telemetry?.dispatch({\n type: 'render:error',\n errorMessage: error.message,\n id: props.component?.id ?? '',\n componentType: 'chart',\n ts: Date.now(),\n });\n props.onError?.(error);\n }\n });\n\n // Chart.js may measure a zero-sized canvas while the data view is visible.\n // Resize once Solid has revealed it again.\n createEffect(() => {\n if (activeView() !== 'chart' || !chartInstance) return;\n queueMicrotask(() => chartInstance?.resize?.());\n });\n\n // Cleanup on unmount\n onCleanup(() => {\n renderVersion += 1;\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n });\n\n return (\n <ExpandableWrapper\n title={title()}\n copyData={copyDataJSON()}\n copyLabel=\"Copy chart data (JSON)\"\n toolbarVariant={props.toolbarVariant}\n >\n <ContextAwareChartLayout\n render={(isExpanded) => (\n <div\n class={`relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${\n isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''\n } ${params().className || ''}`}\n >\n <div class=\"flex items-center justify-between gap-3 mb-3 flex-shrink-0\">\n <div class=\"min-w-0\">\n <Show when={params().title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params().title}</h3>\n </Show>\n </div>\n <div class=\"flex items-center gap-2\">\n <div\n class=\"inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600\"\n role=\"group\"\n aria-label={strings.chartViewSelector}\n >\n <button\n type=\"button\"\n aria-pressed={activeView() === 'chart'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'chart'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('chart')}\n >\n {strings.chartView}\n </button>\n <button\n type=\"button\"\n aria-pressed={activeView() === 'data'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'data'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('data')}\n >\n {strings.chartDataView}\n </button>\n </div>\n <Show when={exportEnabled()}>\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={activeView() !== 'chart' || isLoading() || Boolean(error())}\n class=\"opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm\"\n title=\"Download PNG\"\n aria-label=\"Download chart as PNG\"\n >\n <svg\n class=\"w-3 h-3 text-gray-500 dark:text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n </button>\n </Show>\n </div>\n </div>\n\n <p id={descriptionId} class=\"sr-only\">\n {title()}. {strings.chartDataSummary}\n </p>\n\n {/* Fallback ladder (P2.5): degrade to a series table on render error\n instead of a bare \"Chart Error\" message. */}\n <Show when={error() && activeView() === 'chart'}>\n <DegradedFallback\n message={`Chart rendering failed: ${error()}`}\n caption=\"Showing the chart data as a table — the interactive chart is unavailable.\"\n {...tableData()}\n />\n </Show>\n\n <Show when={activeView() === 'data'}>\n <div\n class={`w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${\n isExpanded() ? 'flex-1 min-h-0' : ''\n }`}\n style={\n isExpanded()\n ? undefined\n : { height: params().height || '250px', 'max-height': '70vh' }\n }\n >\n <table class=\"w-full border-collapse text-left text-sm\">\n <caption class=\"sr-only\">\n {title()} — {strings.chartDataTable}\n </caption>\n <thead class=\"bg-gray-50 dark:bg-gray-900/40\">\n <tr>\n <For each={tableData().columns}>\n {(column) => (\n <th scope=\"col\" class=\"px-3 py-2 font-medium text-gray-900 dark:text-gray-100\">\n {column}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={tableData().rows}>\n {(row) => (\n <tr class=\"border-t border-gray-100 dark:border-gray-700\">\n <For each={tableData().columns}>\n {(_column, index) => (\n <td class=\"px-3 py-2 text-gray-700 dark:text-gray-300\">\n {String(row[index()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n <Show when={tableData().rows.length === 0}>\n <tr>\n <td\n colSpan={Math.max(1, tableData().columns.length)}\n class=\"px-3 py-6 text-center text-gray-500 dark:text-gray-400\"\n >\n {strings.chartNoData}\n </td>\n </tr>\n </Show>\n </tbody>\n </table>\n </div>\n </Show>\n\n <div\n class={`relative w-full ${isExpanded() ? 'flex-1 min-h-0' : ''}`}\n style={\n error() || activeView() === 'data'\n ? { display: 'none' }\n : isExpanded()\n ? { height: '100%', display: 'block' }\n : { height: params().height || '250px', display: 'block' }\n }\n >\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={title()}\n aria-describedby={descriptionId}\n aria-hidden={activeView() !== 'chart' || Boolean(error())}\n />\n <Show when={isLoading() && activeView() === 'chart'}>\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80\">\n <div class=\"flex flex-col items-center gap-2\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span class=\"text-sm text-gray-500 dark:text-gray-400\">Loading chart...</span>\n </div>\n </div>\n </Show>\n </div>\n </div>\n )}\n />\n </ExpandableWrapper>\n );\n};\n"],"names":["ChartJS","chartJSLoadPromise","loadChartJS","then","module","default","Chart","catch","err","isChartJSAvailable","ContextAwareChartLayout","props","render","useExpanded","ChartJSRenderer","isLoading","setIsLoading","createSignal","error","setError","activeView","setActiveView","canvasRef","chartInstance","renderVersion","params","component","tableData","createMemo","chartToDataTable","telemetry","useTelemetry","strings","useMCPUIStrings","descriptionId","createUniqueId","title","chartView","exportEnabled","exportable","copyDataJSON","JSON","stringify","type","data","handleExportPNG","url","toDataURL","a","document","createElement","href","download","replace","toLowerCase","click","createEffect","chartParams","version","undefined","destroy","baseOptions","responsive","maintainAspectRatio","options","plugins","legend","display","position","timeAxis","ta","scales","x","time","parser","unit","tooltipFormat","min","max","Error","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","queueMicrotask","resize","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","toolbarVariant","children","isExpanded","_el$","_$getNextElement","_tmpl$6","_el$2","firstChild","_el$3","_el$5","nextSibling","_el$6","_el$7","_el$8","_el$0","_el$1","_co$","_$getNextMarker","_el$10","_el$12","_el$13","_co$2","_el$11","_el$14","_el$15","_co$3","_el$38","_el$39","_co$9","_el$40","_el$41","_co$0","_el$33","_el$34","_el$36","_el$37","_co$8","_$insert","Show","when","_el$4","_tmpl$","$$click","chartDataView","_el$9","_tmpl$2","_$effect","_$setProperty","Boolean","_$runHydrationEvents","_$setAttribute","chartDataSummary","_$memo","DegradedFallback","_$mergeProps","caption","_el$16","_tmpl$4","_el$17","_el$18","_el$20","_el$21","_co$4","_el$19","_el$22","_el$23","_co$5","_el$24","_el$25","_el$26","_el$29","_el$30","_co$6","_el$31","_el$32","_co$7","chartDataTable","For","each","columns","column","_el$42","_tmpl$7","rows","row","_el$43","_tmpl$8","_column","index","_el$44","_tmpl$9","String","length","_el$27","_tmpl$3","_el$28","chartNoData","Math","_p$","_v$","_v$2","height","e","_$className","t","_$style","_ref$","_$use","_tmpl$5","_v$3","className","_v$4","chartViewSelector","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_v$1","_v$10","o","i","n","s","h","r","d","_$delegateEvents"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartJSRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ChartJSRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"ChartJSRenderer.d.ts","sourceRoot":"","sources":["../../src/components/ChartJSRenderer.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,SAAS,EAQV,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,UAAU,CAAC;AA6BlE;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAO3D;AAED,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,SAAS,EAAE,WAAW,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEjC;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAAC;CAC7C;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,eAAe,EAAE,SAAS,CAAC,oBAAoB,CAuT3D,CAAC"}
|