@seed-ship/mcp-ui-solid 6.19.1 → 6.20.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 +519 -0
- package/README.md +791 -1
- package/dist/adapters/connector.cjs +15 -4
- package/dist/adapters/connector.cjs.map +1 -1
- package/dist/adapters/connector.d.ts +38 -0
- package/dist/adapters/connector.d.ts.map +1 -1
- package/dist/adapters/connector.js +15 -4
- package/dist/adapters/connector.js.map +1 -1
- package/dist/adapters/index.d.ts +4 -3
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/macro-run.cjs +25 -13
- package/dist/adapters/macro-run.cjs.map +1 -1
- package/dist/adapters/macro-run.d.ts +37 -2
- package/dist/adapters/macro-run.d.ts.map +1 -1
- package/dist/adapters/macro-run.js +25 -13
- package/dist/adapters/macro-run.js.map +1 -1
- package/dist/adapters.cjs +2 -0
- package/dist/adapters.cjs.map +1 -1
- package/dist/adapters.js +4 -2
- package/dist/components/ActionGroupRenderer.cjs +3 -1
- package/dist/components/ActionGroupRenderer.cjs.map +1 -1
- package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
- package/dist/components/ActionGroupRenderer.js +3 -1
- package/dist/components/ActionGroupRenderer.js.map +1 -1
- package/dist/components/AgentCard.cjs +11 -8
- package/dist/components/AgentCard.cjs.map +1 -1
- package/dist/components/AgentCard.d.ts.map +1 -1
- package/dist/components/AgentCard.js +11 -8
- package/dist/components/AgentCard.js.map +1 -1
- package/dist/components/AgentHandoff.cjs +6 -1
- package/dist/components/AgentHandoff.cjs.map +1 -1
- package/dist/components/AgentHandoff.d.ts.map +1 -1
- package/dist/components/AgentHandoff.js +6 -1
- package/dist/components/AgentHandoff.js.map +1 -1
- package/dist/components/ArtifactRenderer.cjs +25 -6
- package/dist/components/ArtifactRenderer.cjs.map +1 -1
- package/dist/components/ArtifactRenderer.d.ts.map +1 -1
- package/dist/components/ArtifactRenderer.js +25 -6
- package/dist/components/ArtifactRenderer.js.map +1 -1
- package/dist/components/AutocompleteDropdown.cjs +30 -24
- package/dist/components/AutocompleteDropdown.cjs.map +1 -1
- package/dist/components/AutocompleteDropdown.d.ts.map +1 -1
- package/dist/components/AutocompleteDropdown.js +30 -24
- package/dist/components/AutocompleteDropdown.js.map +1 -1
- package/dist/components/AutocompleteFormField.cjs +3 -1
- package/dist/components/AutocompleteFormField.cjs.map +1 -1
- package/dist/components/AutocompleteFormField.d.ts.map +1 -1
- package/dist/components/AutocompleteFormField.js +4 -2
- package/dist/components/AutocompleteFormField.js.map +1 -1
- package/dist/components/BriefingDiff.cjs +45 -39
- package/dist/components/BriefingDiff.cjs.map +1 -1
- package/dist/components/BriefingDiff.d.ts.map +1 -1
- package/dist/components/BriefingDiff.js +45 -39
- package/dist/components/BriefingDiff.js.map +1 -1
- package/dist/components/CarouselRenderer.cjs +8 -2
- package/dist/components/CarouselRenderer.cjs.map +1 -1
- package/dist/components/CarouselRenderer.d.ts.map +1 -1
- package/dist/components/CarouselRenderer.js +8 -2
- package/dist/components/CarouselRenderer.js.map +1 -1
- package/dist/components/ChartJSRenderer.cjs +60 -36
- package/dist/components/ChartJSRenderer.cjs.map +1 -1
- package/dist/components/ChartJSRenderer.d.ts.map +1 -1
- package/dist/components/ChartJSRenderer.js +61 -37
- package/dist/components/ChartJSRenderer.js.map +1 -1
- package/dist/components/ChatPrompt.cjs +15 -9
- package/dist/components/ChatPrompt.cjs.map +1 -1
- package/dist/components/ChatPrompt.d.ts.map +1 -1
- package/dist/components/ChatPrompt.js +15 -9
- package/dist/components/ChatPrompt.js.map +1 -1
- package/dist/components/CodeBlockRenderer.cjs +34 -16
- package/dist/components/CodeBlockRenderer.cjs.map +1 -1
- package/dist/components/CodeBlockRenderer.d.ts.map +1 -1
- package/dist/components/CodeBlockRenderer.js +34 -16
- package/dist/components/CodeBlockRenderer.js.map +1 -1
- package/dist/components/DataPreviewSection.cjs +91 -44
- package/dist/components/DataPreviewSection.cjs.map +1 -1
- package/dist/components/DataPreviewSection.d.ts.map +1 -1
- package/dist/components/DataPreviewSection.js +92 -45
- package/dist/components/DataPreviewSection.js.map +1 -1
- package/dist/components/DegradedFallback.cjs +20 -16
- package/dist/components/DegradedFallback.cjs.map +1 -1
- package/dist/components/DegradedFallback.d.ts.map +1 -1
- package/dist/components/DegradedFallback.js +20 -16
- package/dist/components/DegradedFallback.js.map +1 -1
- package/dist/components/FooterRenderer.cjs +21 -17
- package/dist/components/FooterRenderer.cjs.map +1 -1
- package/dist/components/FooterRenderer.d.ts.map +1 -1
- package/dist/components/FooterRenderer.js +21 -17
- package/dist/components/FooterRenderer.js.map +1 -1
- package/dist/components/FormFieldRenderer.cjs +116 -93
- package/dist/components/FormFieldRenderer.cjs.map +1 -1
- package/dist/components/FormFieldRenderer.d.ts.map +1 -1
- package/dist/components/FormFieldRenderer.js +116 -93
- package/dist/components/FormFieldRenderer.js.map +1 -1
- package/dist/components/FormRenderer.cjs +55 -31
- package/dist/components/FormRenderer.cjs.map +1 -1
- package/dist/components/FormRenderer.d.ts.map +1 -1
- package/dist/components/FormRenderer.js +55 -31
- package/dist/components/FormRenderer.js.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.cjs +20 -15
- package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
- package/dist/components/GenerativeUIErrorBoundary.js +20 -15
- package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
- package/dist/components/GraphRenderer.cjs +56 -33
- package/dist/components/GraphRenderer.cjs.map +1 -1
- package/dist/components/GraphRenderer.d.ts.map +1 -1
- package/dist/components/GraphRenderer.js +56 -33
- package/dist/components/GraphRenderer.js.map +1 -1
- package/dist/components/ImageGalleryRenderer.cjs +13 -4
- package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
- package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
- package/dist/components/ImageGalleryRenderer.js +13 -4
- package/dist/components/ImageGalleryRenderer.js.map +1 -1
- package/dist/components/LightboxOverlay.cjs +16 -8
- package/dist/components/LightboxOverlay.cjs.map +1 -1
- package/dist/components/LightboxOverlay.d.ts.map +1 -1
- package/dist/components/LightboxOverlay.js +17 -9
- package/dist/components/LightboxOverlay.js.map +1 -1
- package/dist/components/MapRenderer.cjs +59 -29
- package/dist/components/MapRenderer.cjs.map +1 -1
- package/dist/components/MapRenderer.d.ts +10 -2
- package/dist/components/MapRenderer.d.ts.map +1 -1
- package/dist/components/MapRenderer.js +60 -30
- package/dist/components/MapRenderer.js.map +1 -1
- package/dist/components/ModalRenderer.cjs +4 -1
- package/dist/components/ModalRenderer.cjs.map +1 -1
- package/dist/components/ModalRenderer.d.ts.map +1 -1
- package/dist/components/ModalRenderer.js +5 -2
- package/dist/components/ModalRenderer.js.map +1 -1
- package/dist/components/ScratchpadPanel.cjs +578 -535
- package/dist/components/ScratchpadPanel.cjs.map +1 -1
- package/dist/components/ScratchpadPanel.d.ts.map +1 -1
- package/dist/components/ScratchpadPanel.js +578 -535
- package/dist/components/ScratchpadPanel.js.map +1 -1
- package/dist/components/StreamingUIRenderer.cjs +92 -28
- package/dist/components/StreamingUIRenderer.cjs.map +1 -1
- package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
- package/dist/components/StreamingUIRenderer.js +92 -28
- package/dist/components/StreamingUIRenderer.js.map +1 -1
- package/dist/components/UIResourceRenderer.cjs +456 -363
- package/dist/components/UIResourceRenderer.cjs.map +1 -1
- package/dist/components/UIResourceRenderer.d.ts +21 -0
- package/dist/components/UIResourceRenderer.d.ts.map +1 -1
- package/dist/components/UIResourceRenderer.js +458 -365
- package/dist/components/UIResourceRenderer.js.map +1 -1
- package/dist/components/VerifiedText.cjs +39 -20
- package/dist/components/VerifiedText.cjs.map +1 -1
- package/dist/components/VerifiedText.d.ts +2 -1
- package/dist/components/VerifiedText.d.ts.map +1 -1
- package/dist/components/VerifiedText.js +39 -20
- package/dist/components/VerifiedText.js.map +1 -1
- package/dist/components/VideoRenderer.cjs +10 -5
- package/dist/components/VideoRenderer.cjs.map +1 -1
- package/dist/components/VideoRenderer.d.ts.map +1 -1
- package/dist/components/VideoRenderer.js +10 -5
- package/dist/components/VideoRenderer.js.map +1 -1
- package/dist/components/chart-data-table.cjs +38 -17
- package/dist/components/chart-data-table.cjs.map +1 -1
- package/dist/components/chart-data-table.d.ts +30 -1
- package/dist/components/chart-data-table.d.ts.map +1 -1
- package/dist/components/chart-data-table.js +38 -17
- package/dist/components/chart-data-table.js.map +1 -1
- package/dist/context/MCPActionContext.cjs +3 -1
- package/dist/context/MCPActionContext.cjs.map +1 -1
- package/dist/context/MCPActionContext.d.ts.map +1 -1
- package/dist/context/MCPActionContext.js +3 -1
- package/dist/context/MCPActionContext.js.map +1 -1
- package/dist/context/MCPUIStringsContext.cjs +285 -2
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +600 -3
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +285 -2
- package/dist/context/MCPUIStringsContext.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/useStreamingUI.cjs +28 -10
- package/dist/hooks/useStreamingUI.cjs.map +1 -1
- package/dist/hooks/useStreamingUI.d.ts +37 -0
- package/dist/hooks/useStreamingUI.d.ts.map +1 -1
- package/dist/hooks/useStreamingUI.js +28 -10
- package/dist/hooks/useStreamingUI.js.map +1 -1
- package/dist/hooks.cjs +1 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.js +2 -1
- package/dist/index.cjs +23 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -3
- package/dist/index.d.ts +9 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -3
- package/dist/index.js.map +1 -1
- package/dist/services/validation.cjs +41 -16
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts +47 -2
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +41 -16
- package/dist/services/validation.js.map +1 -1
- package/dist/utils/degraded-projections.cjs +37 -12
- package/dist/utils/degraded-projections.cjs.map +1 -1
- package/dist/utils/degraded-projections.d.ts +39 -3
- package/dist/utils/degraded-projections.d.ts.map +1 -1
- package/dist/utils/degraded-projections.js +37 -12
- package/dist/utils/degraded-projections.js.map +1 -1
- package/dist/utils/format-string.cjs +10 -0
- package/dist/utils/format-string.cjs.map +1 -0
- package/dist/utils/format-string.d.ts +26 -0
- package/dist/utils/format-string.d.ts.map +1 -0
- package/dist/utils/format-string.js +10 -0
- package/dist/utils/format-string.js.map +1 -0
- package/dist/validation.cjs +3 -0
- package/dist/validation.cjs.map +1 -1
- package/dist/validation.d.cts +2 -1
- package/dist/validation.d.ts +2 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +4 -1
- package/package.json +1 -1
- package/src/adapters/connector.ts +58 -4
- package/src/adapters/index.ts +12 -2
- package/src/adapters/macro-run.ts +71 -11
- package/src/components/ActionGroupRenderer.tsx +3 -1
- package/src/components/AgentCard.tsx +27 -9
- package/src/components/AgentHandoff.tsx +4 -1
- package/src/components/ArtifactRenderer.tsx +17 -5
- package/src/components/AutocompleteDropdown.tsx +8 -6
- package/src/components/AutocompleteFormField.tsx +5 -1
- package/src/components/BriefingDiff.tsx +11 -3
- package/src/components/CarouselRenderer.tsx +4 -2
- package/src/components/ChartJSRenderer.tsx +18 -9
- package/src/components/ChatPrompt.tsx +13 -8
- package/src/components/CodeBlockRenderer.tsx +12 -10
- package/src/components/DataPreviewSection.tsx +92 -26
- package/src/components/DegradedFallback.tsx +4 -2
- package/src/components/FooterRenderer.tsx +3 -1
- package/src/components/FormFieldRenderer.tsx +34 -19
- package/src/components/FormRenderer.tsx +38 -10
- package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
- package/src/components/GraphRenderer.tsx +31 -16
- package/src/components/ImageGalleryRenderer.tsx +8 -4
- package/src/components/LightboxOverlay.tsx +6 -4
- package/src/components/MapRenderer.tsx +57 -20
- package/src/components/ModalRenderer.tsx +3 -1
- package/src/components/ScratchpadPanel.tsx +95 -44
- package/src/components/StreamingUIRenderer.tsx +41 -11
- package/src/components/UIResourceRenderer.tsx +145 -63
- package/src/components/VerifiedText.tsx +19 -9
- package/src/components/VideoRenderer.tsx +6 -4
- package/src/components/chart-data-table.ts +68 -14
- package/src/context/MCPActionContext.tsx +4 -1
- package/src/context/MCPUIStringsContext.tsx +1004 -1
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useStreamingUI.ts +64 -10
- package/src/index.ts +23 -0
- package/src/services/validation.ts +93 -16
- package/src/utils/degraded-projections.ts +75 -12
- package/src/utils/format-string.ts +33 -0
- package/src/validation.ts +5 -0
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { createComponent, getNextElement, getNextMarker, insert, effect, setProperty,
|
|
1
|
+
import { createComponent, getNextElement, getNextMarker, insert, effect, setProperty, setAttribute, runHydrationEvents, mergeProps, memo, className, style, template, use, delegateEvents } from "solid-js/web";
|
|
2
2
|
import { createSignal, createMemo, createUniqueId, createEffect, onCleanup, Show, For } from "solid-js";
|
|
3
3
|
import { ExpandableWrapper, useExpanded } from "./ExpandableWrapper.js";
|
|
4
4
|
import { DegradedFallback } from "./DegradedFallback.js";
|
|
5
5
|
import { chartToDataTable } from "./chart-data-table.js";
|
|
6
6
|
import { useTelemetry } from "../context/MCPUITelemetryContext.js";
|
|
7
7
|
import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
|
|
8
|
-
|
|
8
|
+
import { formatMCPUIString } from "../utils/format-string.js";
|
|
9
|
+
var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ 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"><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__ */ template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$4 = /* @__PURE__ */ 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__ */ 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">`), _tmpl$6 = /* @__PURE__ */ 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__ */ template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$8 = /* @__PURE__ */ template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$9 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
|
|
9
10
|
let ChartJS = null;
|
|
10
11
|
let chartJSLoadPromise = null;
|
|
11
12
|
const loadChartJS = async () => {
|
|
@@ -38,9 +39,14 @@ const ChartJSRenderer = (props) => {
|
|
|
38
39
|
let chartInstance;
|
|
39
40
|
let renderVersion = 0;
|
|
40
41
|
const params = () => props.component.params;
|
|
41
|
-
const tableData = createMemo(() => chartToDataTable(params()));
|
|
42
42
|
const telemetry = useTelemetry();
|
|
43
43
|
const strings = useMCPUIStrings();
|
|
44
|
+
const tableData = createMemo(() => chartToDataTable(params(), {
|
|
45
|
+
series: strings.chartTableSeries,
|
|
46
|
+
point: strings.chartTablePoint,
|
|
47
|
+
label: strings.degradedColLabel,
|
|
48
|
+
seriesName: strings.degradedSeries
|
|
49
|
+
}));
|
|
44
50
|
const descriptionId = createUniqueId();
|
|
45
51
|
const title = () => params().title || strings.chartView;
|
|
46
52
|
const exportEnabled = () => params().exportable !== false;
|
|
@@ -112,7 +118,7 @@ const ChartJSRenderer = (props) => {
|
|
|
112
118
|
setIsLoading(false);
|
|
113
119
|
} catch (err) {
|
|
114
120
|
if (version !== renderVersion) return;
|
|
115
|
-
const error2 = err instanceof Error ? err : new Error(
|
|
121
|
+
const error2 = err instanceof Error ? err : new Error(strings.chartRenderError);
|
|
116
122
|
setError(error2.message);
|
|
117
123
|
setIsLoading(false);
|
|
118
124
|
telemetry == null ? void 0 : telemetry.dispatch({
|
|
@@ -146,14 +152,16 @@ const ChartJSRenderer = (props) => {
|
|
|
146
152
|
get copyData() {
|
|
147
153
|
return copyDataJSON();
|
|
148
154
|
},
|
|
149
|
-
copyLabel
|
|
155
|
+
get copyLabel() {
|
|
156
|
+
return strings.chartCopy;
|
|
157
|
+
},
|
|
150
158
|
get toolbarVariant() {
|
|
151
159
|
return props.toolbarVariant;
|
|
152
160
|
},
|
|
153
161
|
get children() {
|
|
154
162
|
return createComponent(ContextAwareChartLayout, {
|
|
155
163
|
render: (isExpanded) => (() => {
|
|
156
|
-
var _el$ = 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$] = getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = getNextMarker(_el$14.nextSibling), _el$
|
|
164
|
+
var _el$ = 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$] = getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = getNextMarker(_el$14.nextSibling), _el$41 = _el$10.nextSibling, [_el$42, _co$9] = getNextMarker(_el$41.nextSibling), _el$43 = _el$42.nextSibling, [_el$44, _co$0] = getNextMarker(_el$43.nextSibling), _el$33 = _el$44.nextSibling, _el$34 = _el$33.firstChild, _el$39 = _el$34.nextSibling, [_el$40, _co$8] = getNextMarker(_el$39.nextSibling);
|
|
157
165
|
insert(_el$3, createComponent(Show, {
|
|
158
166
|
get when() {
|
|
159
167
|
return params().title;
|
|
@@ -175,7 +183,17 @@ const ChartJSRenderer = (props) => {
|
|
|
175
183
|
get children() {
|
|
176
184
|
var _el$9 = getNextElement(_tmpl$2);
|
|
177
185
|
_el$9.$$click = handleExportPNG;
|
|
178
|
-
effect(() =>
|
|
186
|
+
effect((_p$) => {
|
|
187
|
+
var _v$ = activeView() !== "chart" || isLoading() || Boolean(error()), _v$2 = strings.chartDownloadPng, _v$3 = strings.chartDownloadPngAria;
|
|
188
|
+
_v$ !== _p$.e && setProperty(_el$9, "disabled", _p$.e = _v$);
|
|
189
|
+
_v$2 !== _p$.t && setAttribute(_el$9, "title", _p$.t = _v$2);
|
|
190
|
+
_v$3 !== _p$.a && setAttribute(_el$9, "aria-label", _p$.a = _v$3);
|
|
191
|
+
return _p$;
|
|
192
|
+
}, {
|
|
193
|
+
e: void 0,
|
|
194
|
+
t: void 0,
|
|
195
|
+
a: void 0
|
|
196
|
+
});
|
|
179
197
|
runHydrationEvents();
|
|
180
198
|
return _el$9;
|
|
181
199
|
}
|
|
@@ -190,12 +208,16 @@ const ChartJSRenderer = (props) => {
|
|
|
190
208
|
get children() {
|
|
191
209
|
return createComponent(DegradedFallback, mergeProps({
|
|
192
210
|
get message() {
|
|
193
|
-
return
|
|
211
|
+
return formatMCPUIString(strings.chartRenderFailed, {
|
|
212
|
+
error: String(error())
|
|
213
|
+
});
|
|
194
214
|
},
|
|
195
|
-
caption
|
|
215
|
+
get caption() {
|
|
216
|
+
return strings.chartDegradedCaption;
|
|
217
|
+
}
|
|
196
218
|
}, tableData));
|
|
197
219
|
}
|
|
198
|
-
}), _el$
|
|
220
|
+
}), _el$42, _co$9);
|
|
199
221
|
insert(_el$, createComponent(Show, {
|
|
200
222
|
get when() {
|
|
201
223
|
return activeView() === "data";
|
|
@@ -209,9 +231,9 @@ const ChartJSRenderer = (props) => {
|
|
|
209
231
|
return tableData().columns;
|
|
210
232
|
},
|
|
211
233
|
children: (column) => (() => {
|
|
212
|
-
var _el$
|
|
213
|
-
insert(_el$
|
|
214
|
-
return _el$
|
|
234
|
+
var _el$45 = getNextElement(_tmpl$7);
|
|
235
|
+
insert(_el$45, column);
|
|
236
|
+
return _el$45;
|
|
215
237
|
})()
|
|
216
238
|
}));
|
|
217
239
|
insert(_el$26, createComponent(For, {
|
|
@@ -219,18 +241,18 @@ const ChartJSRenderer = (props) => {
|
|
|
219
241
|
return tableData().rows;
|
|
220
242
|
},
|
|
221
243
|
children: (row) => (() => {
|
|
222
|
-
var _el$
|
|
223
|
-
insert(_el$
|
|
244
|
+
var _el$46 = getNextElement(_tmpl$8);
|
|
245
|
+
insert(_el$46, createComponent(For, {
|
|
224
246
|
get each() {
|
|
225
247
|
return tableData().columns;
|
|
226
248
|
},
|
|
227
249
|
children: (_column, index) => (() => {
|
|
228
|
-
var _el$
|
|
229
|
-
insert(_el$
|
|
230
|
-
return _el$
|
|
250
|
+
var _el$47 = getNextElement(_tmpl$9);
|
|
251
|
+
insert(_el$47, () => String(row[index()] ?? ""));
|
|
252
|
+
return _el$47;
|
|
231
253
|
})()
|
|
232
254
|
}));
|
|
233
|
-
return _el$
|
|
255
|
+
return _el$46;
|
|
234
256
|
})()
|
|
235
257
|
}), _el$30, _co$6);
|
|
236
258
|
insert(_el$26, createComponent(Show, {
|
|
@@ -245,12 +267,12 @@ const ChartJSRenderer = (props) => {
|
|
|
245
267
|
}
|
|
246
268
|
}), _el$32, _co$7);
|
|
247
269
|
effect((_p$) => {
|
|
248
|
-
var _v$ = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$
|
|
270
|
+
var _v$4 = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$5 = isExpanded() ? void 0 : {
|
|
249
271
|
height: params().height || "250px",
|
|
250
272
|
"max-height": "70vh"
|
|
251
273
|
};
|
|
252
|
-
_v$ !== _p$.e && className(_el$16, _p$.e = _v$);
|
|
253
|
-
_p$.t = style(_el$16, _v$
|
|
274
|
+
_v$4 !== _p$.e && className(_el$16, _p$.e = _v$4);
|
|
275
|
+
_p$.t = style(_el$16, _v$5, _p$.t);
|
|
254
276
|
return _p$;
|
|
255
277
|
}, {
|
|
256
278
|
e: void 0,
|
|
@@ -258,7 +280,7 @@ const ChartJSRenderer = (props) => {
|
|
|
258
280
|
});
|
|
259
281
|
return _el$16;
|
|
260
282
|
}
|
|
261
|
-
}), _el$
|
|
283
|
+
}), _el$44, _co$0);
|
|
262
284
|
var _ref$ = canvasRef;
|
|
263
285
|
typeof _ref$ === "function" ? use(_ref$, _el$34) : canvasRef = _el$34;
|
|
264
286
|
setAttribute(_el$34, "aria-describedby", descriptionId);
|
|
@@ -267,11 +289,13 @@ const ChartJSRenderer = (props) => {
|
|
|
267
289
|
return memo(() => !!isLoading())() && activeView() === "chart";
|
|
268
290
|
},
|
|
269
291
|
get children() {
|
|
270
|
-
|
|
292
|
+
var _el$35 = getNextElement(_tmpl$5), _el$36 = _el$35.firstChild, _el$37 = _el$36.firstChild, _el$38 = _el$37.nextSibling;
|
|
293
|
+
insert(_el$38, () => strings.chartLoading);
|
|
294
|
+
return _el$35;
|
|
271
295
|
}
|
|
272
|
-
}), _el$
|
|
296
|
+
}), _el$40, _co$8);
|
|
273
297
|
effect((_p$) => {
|
|
274
|
-
var _v$
|
|
298
|
+
var _v$6 = `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$7 = strings.chartViewSelector, _v$8 = activeView() === "chart", _v$9 = `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$0 = activeView() === "data", _v$1 = `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$10 = `relative w-full ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$11 = error() || activeView() === "data" ? {
|
|
275
299
|
display: "none"
|
|
276
300
|
} : isExpanded() ? {
|
|
277
301
|
height: "100%",
|
|
@@ -279,17 +303,17 @@ const ChartJSRenderer = (props) => {
|
|
|
279
303
|
} : {
|
|
280
304
|
height: params().height || "250px",
|
|
281
305
|
display: "block"
|
|
282
|
-
}, _v$
|
|
283
|
-
_v$
|
|
284
|
-
_v$
|
|
285
|
-
_v$
|
|
286
|
-
_v$
|
|
287
|
-
_v$
|
|
288
|
-
_v$
|
|
289
|
-
_v$
|
|
290
|
-
_p$.h = style(_el$33, _v$
|
|
291
|
-
_v$
|
|
292
|
-
_v$
|
|
306
|
+
}, _v$12 = title(), _v$13 = activeView() !== "chart" || Boolean(error());
|
|
307
|
+
_v$6 !== _p$.e && className(_el$, _p$.e = _v$6);
|
|
308
|
+
_v$7 !== _p$.t && setAttribute(_el$6, "aria-label", _p$.t = _v$7);
|
|
309
|
+
_v$8 !== _p$.a && setAttribute(_el$7, "aria-pressed", _p$.a = _v$8);
|
|
310
|
+
_v$9 !== _p$.o && className(_el$7, _p$.o = _v$9);
|
|
311
|
+
_v$0 !== _p$.i && setAttribute(_el$8, "aria-pressed", _p$.i = _v$0);
|
|
312
|
+
_v$1 !== _p$.n && className(_el$8, _p$.n = _v$1);
|
|
313
|
+
_v$10 !== _p$.s && className(_el$33, _p$.s = _v$10);
|
|
314
|
+
_p$.h = style(_el$33, _v$11, _p$.h);
|
|
315
|
+
_v$12 !== _p$.r && setAttribute(_el$34, "aria-label", _p$.r = _v$12);
|
|
316
|
+
_v$13 !== _p$.d && setAttribute(_el$34, "aria-hidden", _p$.d = _v$13);
|
|
293
317
|
return _p$;
|
|
294
318
|
}, {
|
|
295
319
|
e: void 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChartJSRenderer.js","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
|
+
{"version":3,"file":"ChartJSRenderer.js","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 { formatMCPUIString, 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 telemetry = useTelemetry();\n const strings = useMCPUIStrings();\n // The accessible data table is a pure projection: its column headers come\n // from the chrome strings, injected rather than hardcoded in the helper.\n const tableData = createMemo(() =>\n chartToDataTable(params(), {\n series: strings.chartTableSeries,\n point: strings.chartTablePoint,\n label: strings.degradedColLabel,\n seriesName: strings.degradedSeries,\n })\n );\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(strings.chartRenderError);\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={strings.chartCopy}\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={strings.chartDownloadPng}\n aria-label={strings.chartDownloadPngAria}\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={formatMCPUIString(strings.chartRenderFailed, { error: String(error()) })}\n caption={strings.chartDegradedCaption}\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\">{strings.chartLoading}</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","telemetry","useTelemetry","strings","useMCPUIStrings","tableData","createMemo","chartToDataTable","series","chartTableSeries","point","chartTablePoint","label","degradedColLabel","seriesName","degradedSeries","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","chartRenderError","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","queueMicrotask","resize","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","chartCopy","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$41","_el$42","_co$9","_el$43","_el$44","_co$0","_el$33","_el$34","_el$39","_el$40","_co$8","_$insert","Show","when","_el$4","_tmpl$","$$click","chartDataView","_el$9","_tmpl$2","_$effect","_p$","_v$","Boolean","_v$2","chartDownloadPng","_v$3","chartDownloadPngAria","e","_$setProperty","t","_$setAttribute","_$runHydrationEvents","chartDataSummary","_$memo","DegradedFallback","_$mergeProps","formatMCPUIString","chartRenderFailed","String","caption","chartDegradedCaption","_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$45","_tmpl$7","rows","row","_el$46","_tmpl$8","_column","index","_el$47","_tmpl$9","length","_el$27","_tmpl$3","_el$28","chartNoData","Math","_v$4","_v$5","height","_$className","_$style","_ref$","_$use","_el$35","_tmpl$5","_el$36","_el$37","_el$38","chartLoading","_v$6","className","_v$7","chartViewSelector","_v$8","_v$9","_v$0","_v$1","_v$10","_v$11","_v$12","_v$13","o","i","n","s","h","r","d","_$delegateEvents"],"mappings":"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"}
|
|
@@ -3,13 +3,15 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const web = require("solid-js/web");
|
|
4
4
|
const solidJs = require("solid-js");
|
|
5
5
|
const FormFieldRenderer = require("./FormFieldRenderer.cjs");
|
|
6
|
+
const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
6
7
|
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="w-full max-w-2xl mx-auto mb-2 bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-lg overflow-visible"role=dialog style="animation:chat-prompt-slide-up 0.2s ease-out"><div class="flex items-center justify-between px-4 py-2.5 border-b border-gray-100 dark:border-gray-700"><p class="text-sm font-medium text-gray-900 dark:text-white"></p><button></button></div><div class="px-4 py-3"></div><style>
|
|
7
8
|
@keyframes chat-prompt-slide-up {
|
|
8
9
|
from { opacity: 0; transform: translateY(8px); }
|
|
9
10
|
to { opacity: 1; transform: translateY(0); }
|
|
10
11
|
}
|
|
11
|
-
`), _tmpl$2 = /* @__PURE__ */ web.template(`<svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div>`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button>`), _tmpl$5 = /* @__PURE__ */ web.template(`<span class=mr-2>`), _tmpl$6 = /* @__PURE__ */ web.template(`<span class="block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal">`), _tmpl$7 = /* @__PURE__ */ web.template(`<p class="text-sm text-gray-600 dark:text-gray-400 mb-3">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div><!$><!/><div class="flex gap-2 justify-end"><button class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"></button><button>`), _tmpl$9 = /* @__PURE__ */ web.template(`<p class="text-blue-400 animate-pulse"
|
|
12
|
+
`), _tmpl$2 = /* @__PURE__ */ web.template(`<svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div>`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button>`), _tmpl$5 = /* @__PURE__ */ web.template(`<span class=mr-2>`), _tmpl$6 = /* @__PURE__ */ web.template(`<span class="block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal">`), _tmpl$7 = /* @__PURE__ */ web.template(`<p class="text-sm text-gray-600 dark:text-gray-400 mb-3">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div><!$><!/><div class="flex gap-2 justify-end"><button class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"></button><button>`), _tmpl$9 = /* @__PURE__ */ web.template(`<p class="text-blue-400 animate-pulse">`), _tmpl$0 = /* @__PURE__ */ web.template(`<div class="px-3 py-2 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800 text-sm">`), _tmpl$1 = /* @__PURE__ */ web.template(`<form class="flex flex-col gap-3"><!$><!/><!$><!/><div class="flex justify-end"><button type=submit class="px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors">`), _tmpl$10 = /* @__PURE__ */ web.template(`<p class="text-blue-700 dark:text-blue-300">`);
|
|
12
13
|
const ChatPrompt = (props) => {
|
|
14
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
13
15
|
if (!props.config) return null;
|
|
14
16
|
return (() => {
|
|
15
17
|
var _el$ = web.getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling;
|
|
@@ -65,7 +67,7 @@ const ChatPrompt = (props) => {
|
|
|
65
67
|
onConfirm: () => props.onSubmit({
|
|
66
68
|
type: "confirm",
|
|
67
69
|
value: "confirmed",
|
|
68
|
-
label: props.config.config.confirmLabel ||
|
|
70
|
+
label: props.config.config.confirmLabel || strings.promptConfirmed
|
|
69
71
|
}),
|
|
70
72
|
onCancel: () => {
|
|
71
73
|
var _a;
|
|
@@ -73,7 +75,7 @@ const ChatPrompt = (props) => {
|
|
|
73
75
|
props.onSubmit({
|
|
74
76
|
type: "confirm",
|
|
75
77
|
value: "cancelled",
|
|
76
|
-
label: props.config.config.cancelLabel ||
|
|
78
|
+
label: props.config.config.cancelLabel || strings.promptCancelled,
|
|
77
79
|
dismissed: true
|
|
78
80
|
});
|
|
79
81
|
}
|
|
@@ -99,7 +101,7 @@ const ChatPrompt = (props) => {
|
|
|
99
101
|
}
|
|
100
102
|
}));
|
|
101
103
|
web.effect((_p$) => {
|
|
102
|
-
var _v$ = props.config.title, _v$2 = props.dismissLabel ? "px-3 py-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-lg transition-colors" : "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors", _v$3 = props.dismissLabel ||
|
|
104
|
+
var _v$ = props.config.title, _v$2 = props.dismissLabel ? "px-3 py-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-lg transition-colors" : "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors", _v$3 = props.dismissLabel || strings.dismiss;
|
|
103
105
|
_v$ !== _p$.e && web.setAttribute(_el$, "aria-label", _p$.e = _v$);
|
|
104
106
|
_v$2 !== _p$.t && web.className(_el$4, _p$.t = _v$2);
|
|
105
107
|
_v$3 !== _p$.a && web.setAttribute(_el$4, "aria-label", _p$.a = _v$3);
|
|
@@ -181,6 +183,7 @@ const ChoiceBody = (props) => {
|
|
|
181
183
|
})();
|
|
182
184
|
};
|
|
183
185
|
const ConfirmBody = (props) => {
|
|
186
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
184
187
|
const isDanger = () => props.config.variant === "danger";
|
|
185
188
|
return (() => {
|
|
186
189
|
var _el$1 = web.getNextElement(_tmpl$8), _el$14 = _el$1.firstChild, [_el$15, _co$] = web.getNextMarker(_el$14.nextSibling), _el$11 = _el$15.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling;
|
|
@@ -195,15 +198,16 @@ const ConfirmBody = (props) => {
|
|
|
195
198
|
}
|
|
196
199
|
}), _el$15, _co$);
|
|
197
200
|
web.addEventListener(_el$12, "click", props.onCancel, true);
|
|
198
|
-
web.insert(_el$12, () => props.config.cancelLabel ||
|
|
201
|
+
web.insert(_el$12, () => props.config.cancelLabel || strings.cancel);
|
|
199
202
|
web.addEventListener(_el$13, "click", props.onConfirm, true);
|
|
200
|
-
web.insert(_el$13, () => props.config.confirmLabel ||
|
|
203
|
+
web.insert(_el$13, () => props.config.confirmLabel || strings.confirm);
|
|
201
204
|
web.effect(() => web.className(_el$13, `px-4 py-2 text-sm font-medium rounded-lg text-white transition-colors ${isDanger() ? "bg-red-600 hover:bg-red-700" : "bg-blue-600 hover:bg-blue-700"}`));
|
|
202
205
|
web.runHydrationEvents();
|
|
203
206
|
return _el$1;
|
|
204
207
|
})();
|
|
205
208
|
};
|
|
206
209
|
const FormBody = (props) => {
|
|
210
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
207
211
|
const [formData, setFormData] = solidJs.createSignal({});
|
|
208
212
|
const [dynamicOptions, setDynamicOptions] = solidJs.createSignal({});
|
|
209
213
|
const [previewText, setPreviewText] = solidJs.createSignal("");
|
|
@@ -285,7 +289,7 @@ const FormBody = (props) => {
|
|
|
285
289
|
e.preventDefault();
|
|
286
290
|
const data = formData();
|
|
287
291
|
const label = Object.entries(data).filter(([, v]) => v !== void 0 && v !== "" && !(Array.isArray(v) && v.length === 0)).map(([k, v]) => `${k}: ${Array.isArray(v) ? v.join(", ") : v}`).join(", ");
|
|
288
|
-
props.onSubmit(data, label ||
|
|
292
|
+
props.onSubmit(data, label || strings.promptFormSubmitted);
|
|
289
293
|
};
|
|
290
294
|
const isValid = () => {
|
|
291
295
|
const data = formData();
|
|
@@ -342,13 +346,15 @@ const FormBody = (props) => {
|
|
|
342
346
|
})();
|
|
343
347
|
},
|
|
344
348
|
get children() {
|
|
345
|
-
|
|
349
|
+
var _el$18 = web.getNextElement(_tmpl$9);
|
|
350
|
+
web.insert(_el$18, () => strings.promptLoadingPreview);
|
|
351
|
+
return _el$18;
|
|
346
352
|
}
|
|
347
353
|
}));
|
|
348
354
|
return _el$17;
|
|
349
355
|
}
|
|
350
356
|
}), _el$24, _co$3);
|
|
351
|
-
web.insert(_el$20, () => props.config.submitLabel ||
|
|
357
|
+
web.insert(_el$20, () => props.config.submitLabel || strings.submit);
|
|
352
358
|
web.effect(() => web.setProperty(_el$20, "disabled", !isValid()));
|
|
353
359
|
return _el$16;
|
|
354
360
|
})();
|