@seed-ship/mcp-ui-solid 6.19.0 → 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 +532 -0
- package/README.md +798 -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/FeedbackInline.cjs +19 -3
- package/dist/components/FeedbackInline.cjs.map +1 -1
- package/dist/components/FeedbackInline.js +19 -3
- package/dist/components/FeedbackInline.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/FeedbackInline.tsx +2 -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,28 +1,43 @@
|
|
|
1
1
|
import { createComponent, getNextElement, getNextMarker, insert, effect, setAttribute, runHydrationEvents, setStyleProperty, classList, memo, setProperty, template, delegateEvents } from "solid-js/web";
|
|
2
|
-
import { createMemo, createSignal, createEffect, Show, For } from "solid-js";
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { createMemo, createSignal, onMount, createEffect, Show, For } from "solid-js";
|
|
3
|
+
import { useMCPUIStrings, DEFAULT_MCPUI_STRINGS } from "../context/MCPUIStringsContext.js";
|
|
4
|
+
import { formatMCPUIString } from "../utils/format-string.js";
|
|
5
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div class="text-xs text-amber-600 dark:text-amber-400 p-2">`), _tmpl$2 = /* @__PURE__ */ template(`<span class=font-medium>`), _tmpl$3 = /* @__PURE__ */ template(`<span class="px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="flex items-center gap-1"><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">CSV</button><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">JSON`), _tmpl$5 = /* @__PURE__ */ template(`<span><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ template(`<span>`), _tmpl$7 = /* @__PURE__ */ template(`<div class="flex items-center gap-1"><button type=button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"data-mcp-ui-action=page-prev><span aria-hidden=true>◀</span> <!$><!/></button><span class=px-2 aria-live=polite></span><button type=button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"data-mcp-ui-action=page-next><!$><!/> <span aria-hidden=true>▶`), _tmpl$8 = /* @__PURE__ */ template(`<div class=data-preview-section><div class="flex items-center justify-between mb-2"><div class="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/></div><!$><!/></div><div class="overflow-x-auto rounded border border-gray-200 dark:border-gray-700"><table class="w-full text-sm"><thead><tr class="bg-gray-50 dark:bg-gray-800"></tr></thead><tbody></tbody></table></div><div class="flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<th class="px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors"><span class="inline-flex items-center gap-1"><!$><!/><span class="text-[10px] leading-none">`), _tmpl$0 = /* @__PURE__ */ template(`<tr class="border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors">`), _tmpl$1 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-800 dark:text-gray-200">`);
|
|
6
|
+
function formatNumber(value, format, locale = DEFAULT_MCPUI_STRINGS.locale) {
|
|
5
7
|
if (typeof value !== "number" || !isFinite(value)) return String(value ?? "");
|
|
6
|
-
if (format === "percent")
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
if (format === "percent") {
|
|
9
|
+
return new Intl.NumberFormat(locale, {
|
|
10
|
+
style: "percent",
|
|
11
|
+
minimumFractionDigits: 1,
|
|
12
|
+
maximumFractionDigits: 1,
|
|
13
|
+
useGrouping: false
|
|
14
|
+
}).format(value);
|
|
15
|
+
}
|
|
16
|
+
if (format === "currency") return `${value.toLocaleString(locale)} EUR`;
|
|
17
|
+
if (Number.isInteger(value)) return value.toLocaleString(locale);
|
|
18
|
+
return value.toLocaleString(locale, {
|
|
10
19
|
maximumFractionDigits: 2
|
|
11
20
|
});
|
|
12
21
|
}
|
|
13
|
-
function formatCell(value, col) {
|
|
22
|
+
function formatCell(value, col, locale = DEFAULT_MCPUI_STRINGS.locale, zoneAware = true) {
|
|
14
23
|
if (value == null) return "—";
|
|
15
|
-
if (col.type === "number") return formatNumber(value, col.format);
|
|
24
|
+
if (col.type === "number") return formatNumber(value, col.format, locale);
|
|
16
25
|
if (col.type === "date" && typeof value === "string") {
|
|
26
|
+
const date = new Date(value);
|
|
27
|
+
if (Number.isNaN(date.getTime())) return value;
|
|
28
|
+
const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(value);
|
|
29
|
+
if (!dateOnly && !zoneAware) return value;
|
|
17
30
|
try {
|
|
18
|
-
return
|
|
31
|
+
return date.toLocaleDateString(locale, dateOnly ? {
|
|
32
|
+
timeZone: "UTC"
|
|
33
|
+
} : void 0);
|
|
19
34
|
} catch {
|
|
20
35
|
return value;
|
|
21
36
|
}
|
|
22
37
|
}
|
|
23
38
|
return String(value);
|
|
24
39
|
}
|
|
25
|
-
function compareValues(a, b, type) {
|
|
40
|
+
function compareValues(a, b, type, locale = DEFAULT_MCPUI_STRINGS.locale) {
|
|
26
41
|
if (a == null && b == null) return 0;
|
|
27
42
|
if (a == null) return 1;
|
|
28
43
|
if (b == null) return -1;
|
|
@@ -42,7 +57,7 @@ function compareValues(a, b, type) {
|
|
|
42
57
|
if (isNaN(db)) return -1;
|
|
43
58
|
return da - db;
|
|
44
59
|
}
|
|
45
|
-
return String(a).localeCompare(String(b),
|
|
60
|
+
return String(a).localeCompare(String(b), locale, {
|
|
46
61
|
sensitivity: "base"
|
|
47
62
|
});
|
|
48
63
|
}
|
|
@@ -84,6 +99,7 @@ function resolveContent(raw) {
|
|
|
84
99
|
}
|
|
85
100
|
function DataPreviewSection(props) {
|
|
86
101
|
var _a;
|
|
102
|
+
const strings = useMCPUIStrings();
|
|
87
103
|
const content = createMemo(() => {
|
|
88
104
|
const resolved = resolveContent(props.content);
|
|
89
105
|
if (!resolved) {
|
|
@@ -108,6 +124,8 @@ function DataPreviewSection(props) {
|
|
|
108
124
|
return ((_a2 = content()) == null ? void 0 : _a2.showPageInfo) !== false;
|
|
109
125
|
};
|
|
110
126
|
const [page, setPage] = createSignal(((_a = content()) == null ? void 0 : _a.initialPage) ?? 0);
|
|
127
|
+
const [mounted, setMounted] = createSignal(false);
|
|
128
|
+
onMount(() => setMounted(true));
|
|
111
129
|
const [sortKey, setSortKey] = createSignal(null);
|
|
112
130
|
const [sortDir, setSortDir] = createSignal(null);
|
|
113
131
|
createEffect(() => {
|
|
@@ -135,7 +153,7 @@ function DataPreviewSection(props) {
|
|
|
135
153
|
if (!key || !dir) return r;
|
|
136
154
|
const col = columns().find((c) => c.key === key);
|
|
137
155
|
return [...r].sort((a, b) => {
|
|
138
|
-
const cmp = compareValues(a[key], b[key], col == null ? void 0 : col.type);
|
|
156
|
+
const cmp = compareValues(a[key], b[key], col == null ? void 0 : col.type, strings.locale);
|
|
139
157
|
return dir === "desc" ? -cmp : cmp;
|
|
140
158
|
});
|
|
141
159
|
});
|
|
@@ -170,10 +188,14 @@ function DataPreviewSection(props) {
|
|
|
170
188
|
return content();
|
|
171
189
|
},
|
|
172
190
|
get fallback() {
|
|
173
|
-
return
|
|
191
|
+
return (() => {
|
|
192
|
+
var _el$ = getNextElement(_tmpl$);
|
|
193
|
+
insert(_el$, () => strings.previewInvalidContent);
|
|
194
|
+
return _el$;
|
|
195
|
+
})();
|
|
174
196
|
},
|
|
175
197
|
children: (c) => (() => {
|
|
176
|
-
var _el$2 = getNextElement(_tmpl$8), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = getNextMarker(_el$12.nextSibling), _el$14 = _el$3.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$16.nextSibling, _el$19 = _el$14.nextSibling, _el$
|
|
198
|
+
var _el$2 = getNextElement(_tmpl$8), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = getNextMarker(_el$12.nextSibling), _el$14 = _el$3.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$16.nextSibling, _el$19 = _el$14.nextSibling, _el$37 = _el$19.firstChild, [_el$38, _co$8] = getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = getNextMarker(_el$39.nextSibling), _el$41 = _el$40.nextSibling, [_el$42, _co$0] = getNextMarker(_el$41.nextSibling);
|
|
177
199
|
insert(_el$4, createComponent(Show, {
|
|
178
200
|
get when() {
|
|
179
201
|
return c().source;
|
|
@@ -203,7 +225,11 @@ function DataPreviewSection(props) {
|
|
|
203
225
|
_el$10.$$click = handleExportCSV;
|
|
204
226
|
_el$11.$$click = handleExportJSON;
|
|
205
227
|
effect((_p$) => {
|
|
206
|
-
var _v$ =
|
|
228
|
+
var _v$ = formatMCPUIString(strings.exportCsvRows, {
|
|
229
|
+
count: sortedRows().length
|
|
230
|
+
}), _v$2 = formatMCPUIString(strings.exportJsonRows, {
|
|
231
|
+
count: sortedRows().length
|
|
232
|
+
});
|
|
207
233
|
_v$ !== _p$.e && setAttribute(_el$10, "title", _p$.e = _v$);
|
|
208
234
|
_v$2 !== _p$.t && setAttribute(_el$11, "title", _p$.t = _v$2);
|
|
209
235
|
return _p$;
|
|
@@ -220,18 +246,20 @@ function DataPreviewSection(props) {
|
|
|
220
246
|
return columns();
|
|
221
247
|
},
|
|
222
248
|
children: (col) => (() => {
|
|
223
|
-
var _el$
|
|
224
|
-
_el$
|
|
225
|
-
insert(_el$
|
|
226
|
-
insert(_el$
|
|
249
|
+
var _el$43 = getNextElement(_tmpl$9), _el$44 = _el$43.firstChild, _el$46 = _el$44.firstChild, [_el$47, _co$1] = getNextMarker(_el$46.nextSibling), _el$45 = _el$47.nextSibling;
|
|
250
|
+
_el$43.$$click = () => handleSort(col.key);
|
|
251
|
+
insert(_el$44, () => col.label, _el$47, _co$1);
|
|
252
|
+
insert(_el$45, () => sortIndicator(col.key));
|
|
227
253
|
effect((_p$) => {
|
|
228
|
-
var _v$
|
|
254
|
+
var _v$7 = columnAlign(col), _v$8 = formatMCPUIString(strings.sortBy, {
|
|
255
|
+
column: col.label
|
|
256
|
+
}), _v$9 = {
|
|
229
257
|
"opacity-30": sortKey() !== col.key,
|
|
230
258
|
"opacity-100 text-blue-600 dark:text-blue-400": sortKey() === col.key
|
|
231
259
|
};
|
|
232
|
-
_v$
|
|
233
|
-
_v$
|
|
234
|
-
_p$.a = classList(_el$
|
|
260
|
+
_v$7 !== _p$.e && setStyleProperty(_el$43, "text-align", _p$.e = _v$7);
|
|
261
|
+
_v$8 !== _p$.t && setAttribute(_el$43, "title", _p$.t = _v$8);
|
|
262
|
+
_p$.a = classList(_el$45, _v$9, _p$.a);
|
|
235
263
|
return _p$;
|
|
236
264
|
}, {
|
|
237
265
|
e: void 0,
|
|
@@ -239,7 +267,7 @@ function DataPreviewSection(props) {
|
|
|
239
267
|
a: void 0
|
|
240
268
|
});
|
|
241
269
|
runHydrationEvents();
|
|
242
|
-
return _el$
|
|
270
|
+
return _el$43;
|
|
243
271
|
})()
|
|
244
272
|
}));
|
|
245
273
|
insert(_el$18, createComponent(For, {
|
|
@@ -247,22 +275,22 @@ function DataPreviewSection(props) {
|
|
|
247
275
|
return visibleRows();
|
|
248
276
|
},
|
|
249
277
|
children: (row, i) => (() => {
|
|
250
|
-
var _el$
|
|
251
|
-
insert(_el$
|
|
278
|
+
var _el$48 = getNextElement(_tmpl$0);
|
|
279
|
+
insert(_el$48, createComponent(For, {
|
|
252
280
|
get each() {
|
|
253
281
|
return columns();
|
|
254
282
|
},
|
|
255
283
|
children: (col) => (() => {
|
|
256
|
-
var _el$
|
|
257
|
-
insert(_el$
|
|
258
|
-
effect((_$p) => setStyleProperty(_el$
|
|
259
|
-
return _el$
|
|
284
|
+
var _el$49 = getNextElement(_tmpl$1);
|
|
285
|
+
insert(_el$49, () => formatCell(row[col.key], col, strings.locale, mounted()));
|
|
286
|
+
effect((_$p) => setStyleProperty(_el$49, "text-align", columnAlign(col)));
|
|
287
|
+
return _el$49;
|
|
260
288
|
})()
|
|
261
289
|
}));
|
|
262
|
-
effect((_$p) => classList(_el$
|
|
290
|
+
effect((_$p) => classList(_el$48, {
|
|
263
291
|
"bg-gray-25 dark:bg-gray-850": i() % 2 === 1
|
|
264
292
|
}, _$p));
|
|
265
|
-
return _el$
|
|
293
|
+
return _el$48;
|
|
266
294
|
})()
|
|
267
295
|
}));
|
|
268
296
|
insert(_el$19, createComponent(Show, {
|
|
@@ -273,15 +301,25 @@ function DataPreviewSection(props) {
|
|
|
273
301
|
var _el$20 = getNextElement(_tmpl$5), _el$21 = _el$20.firstChild, [_el$22, _co$4] = getNextMarker(_el$21.nextSibling), _el$23 = _el$22.nextSibling, [_el$24, _co$5] = getNextMarker(_el$23.nextSibling);
|
|
274
302
|
insert(_el$20, (() => {
|
|
275
303
|
var _c$ = memo(() => !!isPaginated());
|
|
276
|
-
return () => _c$() ?
|
|
304
|
+
return () => _c$() ? formatMCPUIString(strings.previewShowingRange, {
|
|
305
|
+
start: rangeStart().toLocaleString(strings.locale),
|
|
306
|
+
end: rangeEnd().toLocaleString(strings.locale),
|
|
307
|
+
// `strings.locale` formats the count, so the chrome
|
|
308
|
+
// string and the digits agree (and SSR matches the client).
|
|
309
|
+
total: sortedRows().length.toLocaleString(strings.locale)
|
|
310
|
+
}) : formatMCPUIString(sortedRows().length === 1 ? strings.previewRowsOne : strings.previewRowsMany, {
|
|
311
|
+
count: sortedRows().length.toLocaleString(strings.locale)
|
|
312
|
+
});
|
|
277
313
|
})(), _el$22, _co$4);
|
|
278
314
|
insert(_el$20, (() => {
|
|
279
315
|
var _c$2 = memo(() => !!(c().totalRows && c().totalRows > sortedRows().length));
|
|
280
|
-
return () => _c$2() ?
|
|
316
|
+
return () => _c$2() ? formatMCPUIString(strings.previewTotalSuffix, {
|
|
317
|
+
total: c().totalRows.toLocaleString(strings.locale)
|
|
318
|
+
}) : "";
|
|
281
319
|
})(), _el$24, _co$5);
|
|
282
320
|
return _el$20;
|
|
283
321
|
}
|
|
284
|
-
}), _el$
|
|
322
|
+
}), _el$38, _co$8);
|
|
285
323
|
insert(_el$19, createComponent(Show, {
|
|
286
324
|
get when() {
|
|
287
325
|
return !showPageInfo();
|
|
@@ -289,30 +327,39 @@ function DataPreviewSection(props) {
|
|
|
289
327
|
get children() {
|
|
290
328
|
return getNextElement(_tmpl$6);
|
|
291
329
|
}
|
|
292
|
-
}), _el$
|
|
330
|
+
}), _el$40, _co$9);
|
|
293
331
|
insert(_el$19, createComponent(Show, {
|
|
294
332
|
get when() {
|
|
295
333
|
return isPaginated();
|
|
296
334
|
},
|
|
297
335
|
get children() {
|
|
298
|
-
var _el$26 = getNextElement(_tmpl$7), _el$27 = _el$26.firstChild, _el$28 = _el$27.
|
|
336
|
+
var _el$26 = getNextElement(_tmpl$7), _el$27 = _el$26.firstChild, _el$28 = _el$27.firstChild, _el$29 = _el$28.nextSibling, _el$30 = _el$29.nextSibling, [_el$31, _co$6] = getNextMarker(_el$30.nextSibling), _el$32 = _el$27.nextSibling, _el$33 = _el$32.nextSibling, _el$35 = _el$33.firstChild, [_el$36, _co$7] = getNextMarker(_el$35.nextSibling);
|
|
337
|
+
_el$36.nextSibling;
|
|
299
338
|
_el$27.$$click = () => setPage((p) => p - 1);
|
|
300
|
-
insert(_el$
|
|
301
|
-
insert(_el$
|
|
302
|
-
|
|
339
|
+
insert(_el$27, () => strings.previewPrev, _el$31, _co$6);
|
|
340
|
+
insert(_el$32, () => formatMCPUIString(strings.previewPageIndicator, {
|
|
341
|
+
page: page() + 1,
|
|
342
|
+
total: totalPages()
|
|
343
|
+
}));
|
|
344
|
+
_el$33.$$click = () => setPage((p) => p + 1);
|
|
345
|
+
insert(_el$33, () => strings.previewNext, _el$36, _co$7);
|
|
303
346
|
effect((_p$) => {
|
|
304
|
-
var _v$3 = page() === 0, _v$4 = page() >= totalPages() - 1;
|
|
347
|
+
var _v$3 = page() === 0, _v$4 = strings.paginationPrevious, _v$5 = page() >= totalPages() - 1, _v$6 = strings.paginationNext;
|
|
305
348
|
_v$3 !== _p$.e && setProperty(_el$27, "disabled", _p$.e = _v$3);
|
|
306
|
-
_v$4 !== _p$.t &&
|
|
349
|
+
_v$4 !== _p$.t && setAttribute(_el$27, "aria-label", _p$.t = _v$4);
|
|
350
|
+
_v$5 !== _p$.a && setProperty(_el$33, "disabled", _p$.a = _v$5);
|
|
351
|
+
_v$6 !== _p$.o && setAttribute(_el$33, "aria-label", _p$.o = _v$6);
|
|
307
352
|
return _p$;
|
|
308
353
|
}, {
|
|
309
354
|
e: void 0,
|
|
310
|
-
t: void 0
|
|
355
|
+
t: void 0,
|
|
356
|
+
a: void 0,
|
|
357
|
+
o: void 0
|
|
311
358
|
});
|
|
312
359
|
runHydrationEvents();
|
|
313
360
|
return _el$26;
|
|
314
361
|
}
|
|
315
|
-
}), _el$
|
|
362
|
+
}), _el$42, _co$0);
|
|
316
363
|
return _el$2;
|
|
317
364
|
})()
|
|
318
365
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataPreviewSection.js","sources":["../../src/components/DataPreviewSection.tsx"],"sourcesContent":["/**\n * DataPreviewSection — paginated, sortable data table with export\n * v4.0.4: Full pagination spec (auto-activate, pageSize=0 disable, showPageInfo, onPageChange)\n *\n * @experimental\n */\n\nimport { createSignal, createMemo, createEffect, For, Show } from 'solid-js'\nimport type { DataPreviewContent, DataPreviewColumn } from '../types/chat-bus'\n\nexport interface DataPreviewSectionProps {\n content: DataPreviewContent\n}\n\ntype SortDir = 'asc' | 'desc' | null\n\n// ─── Formatting helpers ─────────────────────────────────────\n\nfunction formatNumber(value: unknown, format?: string): string {\n if (typeof value !== 'number' || !isFinite(value)) return String(value ?? '')\n if (format === 'percent') return `${(value * 100).toFixed(1)}%`\n if (format === 'currency') return `${value.toLocaleString('fr-FR')} EUR`\n if (Number.isInteger(value)) return value.toLocaleString('fr-FR')\n return value.toLocaleString('fr-FR', { maximumFractionDigits: 2 })\n}\n\nfunction formatCell(value: unknown, col: DataPreviewColumn): string {\n if (value == null) return '\\u2014'\n if (col.type === 'number') return formatNumber(value, col.format)\n if (col.type === 'date' && typeof value === 'string') {\n try { return new Date(value).toLocaleDateString('fr-FR') } catch { return value }\n }\n return String(value)\n}\n\nfunction compareValues(a: unknown, b: unknown, type?: string): number {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (type === 'number') {\n const na = typeof a === 'number' ? a : Number(a)\n const nb = typeof b === 'number' ? b : Number(b)\n if (isNaN(na) && isNaN(nb)) return 0\n if (isNaN(na)) return 1\n if (isNaN(nb)) return -1\n return na - nb\n }\n if (type === 'date') {\n const da = new Date(String(a)).getTime()\n const db = new Date(String(b)).getTime()\n if (isNaN(da) && isNaN(db)) return 0\n if (isNaN(da)) return 1\n if (isNaN(db)) return -1\n return da - db\n }\n return String(a).localeCompare(String(b), 'fr', { sensitivity: 'base' })\n}\n\n// ─── Export helpers ─────────────────────────────────────────\n\nfunction toCSV(columns: DataPreviewColumn[], rows: Record<string, unknown>[]): string {\n const header = columns.map(c => `\"${c.label.replace(/\"/g, '\"\"')}\"`).join(';')\n const body = rows.map(row =>\n columns.map(c => {\n const val = row[c.key]\n if (val == null) return ''\n if (typeof val === 'string') return `\"${val.replace(/\"/g, '\"\"')}\"`\n return String(val)\n }).join(';')\n ).join('\\n')\n return `${header}\\n${body}`\n}\n\nfunction downloadFile(content: string, filename: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// ─── Content resolver ───────────────────────────────────────\n\nfunction resolveContent(raw: unknown): DataPreviewContent | null {\n if (!raw || typeof raw !== 'object') return null\n const obj = raw as Record<string, unknown>\n if (Array.isArray(obj.columns) && Array.isArray(obj.rows)) {\n return obj as unknown as DataPreviewContent\n }\n if (obj.content && typeof obj.content === 'object') {\n const inner = obj.content as Record<string, unknown>\n if (Array.isArray(inner.columns) && Array.isArray(inner.rows)) {\n return inner as unknown as DataPreviewContent\n }\n }\n return null\n}\n\n// ─── Component ──────────────────────────────────────────────\n\nexport function DataPreviewSection(props: DataPreviewSectionProps) {\n const content = createMemo(() => {\n const resolved = resolveContent(props.content)\n if (!resolved) {\n console.warn('[MCP-UI] DataPreviewSection: invalid content — expected { columns, rows }', props.content)\n }\n return resolved\n })\n\n const columns = () => content()?.columns || []\n const rawRows = () => content()?.rows || []\n const pageSizeVal = () => content()?.pageSize ?? 25\n const showPageInfo = () => content()?.showPageInfo !== false\n\n const [page, setPage] = createSignal(content()?.initialPage ?? 0)\n const [sortKey, setSortKey] = createSignal<string | null>(null)\n const [sortDir, setSortDir] = createSignal<SortDir>(null)\n\n // Notify parent on page change\n createEffect(() => {\n const p = page()\n content()?.onPageChange?.(p)\n })\n\n const handleSort = (key: string) => {\n if (sortKey() === key) {\n if (sortDir() === 'asc') setSortDir('desc')\n else { setSortKey(null); setSortDir(null) }\n } else {\n setSortKey(key)\n setSortDir('asc')\n }\n setPage(0)\n }\n\n const sortedRows = createMemo(() => {\n const r = rawRows()\n const key = sortKey()\n const dir = sortDir()\n if (!key || !dir) return r\n const col = columns().find(c => c.key === key)\n return [...r].sort((a, b) => {\n const cmp = compareValues(a[key], b[key], col?.type)\n return dir === 'desc' ? -cmp : cmp\n })\n })\n\n // Pagination: auto-enabled when rows > pageSize, disabled when pageSize=0\n const isPaginated = () => pageSizeVal() > 0 && sortedRows().length > pageSizeVal()\n const totalPages = () => isPaginated() ? Math.ceil(sortedRows().length / pageSizeVal()) : 1\n\n const visibleRows = createMemo(() => {\n if (!isPaginated()) return sortedRows()\n const start = page() * pageSizeVal()\n return sortedRows().slice(start, start + pageSizeVal())\n })\n\n const rangeStart = () => isPaginated() ? page() * pageSizeVal() + 1 : 1\n const rangeEnd = () => isPaginated()\n ? Math.min((page() + 1) * pageSizeVal(), sortedRows().length)\n : sortedRows().length\n\n // Export ALL rows (not just page)\n const handleExportCSV = () => {\n const c = content()\n if (!c) return\n downloadFile(toCSV(c.columns, sortedRows()), 'data-export.csv', 'text/csv;charset=utf-8')\n }\n const handleExportJSON = () => {\n downloadFile(JSON.stringify(sortedRows(), null, 2), 'data-export.json', 'application/json')\n }\n\n const columnAlign = (col: DataPreviewColumn) => {\n if (col.align) return col.align\n if (col.type === 'number') return 'right'\n return 'left'\n }\n\n const sortIndicator = (key: string) => {\n if (sortKey() !== key) return '\\u2195'\n return sortDir() === 'asc' ? '\\u2191' : '\\u2193'\n }\n\n return (\n <Show when={content()} fallback={\n <div class=\"text-xs text-amber-600 dark:text-amber-400 p-2\">\n [DataPreviewSection] Invalid content format\n </div>\n }>\n {(c) => (\n <div class=\"data-preview-section\">\n {/* Header: source + export */}\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={c().source}>\n <span class=\"font-medium\">{c().source}</span>\n </Show>\n <Show when={c().freshness}>\n <span class=\"px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {c().freshness}\n </span>\n </Show>\n </div>\n <Show when={c().exportable !== false}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportCSV}\n title={`Export CSV (${sortedRows().length} rows)`}\n >\n CSV\n </button>\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportJSON}\n title={`Export JSON (${sortedRows().length} rows)`}\n >\n JSON\n </button>\n </div>\n </Show>\n </div>\n\n {/* Table */}\n <div class=\"overflow-x-auto rounded border border-gray-200 dark:border-gray-700\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"bg-gray-50 dark:bg-gray-800\">\n <For each={columns()}>\n {(col) => (\n <th\n class=\"px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors\"\n style={{ \"text-align\": columnAlign(col) }}\n onClick={() => handleSort(col.key)}\n title={`Sort by ${col.label}`}\n >\n <span class=\"inline-flex items-center gap-1\">\n {col.label}\n <span\n class=\"text-[10px] leading-none\"\n classList={{\n 'opacity-30': sortKey() !== col.key,\n 'opacity-100 text-blue-600 dark:text-blue-400': sortKey() === col.key,\n }}\n >\n {sortIndicator(col.key)}\n </span>\n </span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={visibleRows()}>\n {(row, i) => (\n <tr\n class=\"border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n classList={{ 'bg-gray-25 dark:bg-gray-850': i() % 2 === 1 }}\n >\n <For each={columns()}>\n {(col) => (\n <td\n class=\"px-3 py-2 text-gray-800 dark:text-gray-200\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {formatCell(row[col.key], col)}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n {/* Footer: pagination + page info */}\n <div class=\"flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={showPageInfo()}>\n <span>\n {isPaginated()\n ? `Showing ${rangeStart()}\\u2013${rangeEnd()} of ${sortedRows().length.toLocaleString('fr-FR')}`\n : `${sortedRows().length} row${sortedRows().length !== 1 ? 's' : ''}`\n }\n {c().totalRows && c().totalRows! > sortedRows().length\n ? ` (${c().totalRows!.toLocaleString('fr-FR')} total)`\n : ''\n }\n </span>\n </Show>\n <Show when={!showPageInfo()}><span /></Show>\n\n <Show when={isPaginated()}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() === 0}\n onClick={() => setPage(p => p - 1)}\n >\n ◀ Prev\n </button>\n <span class=\"px-2\">Page {page() + 1} / {totalPages()}</span>\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() >= totalPages() - 1}\n onClick={() => setPage(p => p + 1)}\n >\n Next ▶\n </button>\n </div>\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["formatNumber","value","format","isFinite","String","toFixed","toLocaleString","Number","isInteger","maximumFractionDigits","formatCell","col","type","Date","toLocaleDateString","compareValues","a","b","na","nb","isNaN","da","getTime","db","localeCompare","sensitivity","toCSV","columns","rows","header","map","c","label","replace","join","body","row","val","key","downloadFile","content","filename","mimeType","blob","Blob","url","URL","createObjectURL","document","createElement","href","download","click","revokeObjectURL","resolveContent","raw","obj","Array","isArray","inner","DataPreviewSection","props","createMemo","resolved","console","warn","rawRows","pageSizeVal","pageSize","showPageInfo","page","setPage","createSignal","initialPage","sortKey","setSortKey","sortDir","setSortDir","createEffect","p","onPageChange","handleSort","sortedRows","r","dir","find","sort","cmp","isPaginated","length","totalPages","Math","ceil","visibleRows","start","slice","rangeStart","rangeEnd","min","handleExportCSV","handleExportJSON","JSON","stringify","columnAlign","align","sortIndicator","_$createComponent","Show","when","fallback","_$getNextElement","_tmpl$","children","_el$2","_tmpl$8","_el$3","firstChild","_el$4","_el$7","_el$8","_co$","_$getNextMarker","nextSibling","_el$9","_el$0","_co$2","_el$12","_el$13","_co$3","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","_el$36","_el$37","_co$8","_el$38","_el$39","_co$9","_el$40","_el$41","_co$0","_$insert","source","_el$5","_tmpl$2","freshness","_el$6","_tmpl$3","exportable","_el$1","_tmpl$4","_el$10","_el$11","$$click","_$effect","_p$","_v$","_v$2","e","_$setAttribute","t","undefined","_$runHydrationEvents","For","each","_el$42","_tmpl$9","_el$43","_el$45","_el$46","_co$1","_el$44","_v$5","_v$6","_v$7","_$setStyleProperty","_$classList","i","_el$47","_tmpl$0","_el$48","_tmpl$1","_$p","_el$20","_tmpl$5","_el$21","_el$22","_co$4","_el$23","_el$24","_co$5","_c$","_$memo","_c$2","totalRows","_tmpl$6","_el$26","_tmpl$7","_el$27","_el$28","_el$29","_el$31","_el$32","_co$6","_el$30","_el$33","_el$34","_co$7","_el$35","_v$3","_v$4","_$setProperty","_$delegateEvents"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DataPreviewSection.js","sources":["../../src/components/DataPreviewSection.tsx"],"sourcesContent":["/**\n * DataPreviewSection — paginated, sortable data table with export\n * v4.0.4: Full pagination spec (auto-activate, pageSize=0 disable, showPageInfo, onPageChange)\n *\n * @experimental\n */\n\nimport { createSignal, createMemo, createEffect, For, Show, onMount } from 'solid-js'\nimport type { DataPreviewContent, DataPreviewColumn } from '../types/chat-bus'\nimport {\n DEFAULT_MCPUI_STRINGS,\n formatMCPUIString,\n useMCPUIStrings,\n} from '../context/MCPUIStringsContext'\n\nexport interface DataPreviewSectionProps {\n content: DataPreviewContent\n}\n\ntype SortDir = 'asc' | 'desc' | null\n\n// ─── Formatting helpers ─────────────────────────────────────\n\n/**\n * `locale` — BCP-47 tag (`MCPUIStrings.locale`, default `'en-US'`). Before\n * 6.20.0 these helpers hardcoded `'fr-FR'` / `'fr'`.\n */\nfunction formatNumber(\n value: unknown,\n format?: string,\n locale: string = DEFAULT_MCPUI_STRINGS.locale\n): string {\n if (typeof value !== 'number' || !isFinite(value)) return String(value ?? '')\n if (format === 'percent') {\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n useGrouping: false,\n }).format(value)\n }\n if (format === 'currency') return `${value.toLocaleString(locale)} EUR`\n if (Number.isInteger(value)) return value.toLocaleString(locale)\n return value.toLocaleString(locale, { maximumFractionDigits: 2 })\n}\n\nfunction formatCell(\n value: unknown,\n col: DataPreviewColumn,\n locale: string = DEFAULT_MCPUI_STRINGS.locale,\n /** False before mount: date-time values stay raw so SSR and hydration match. */\n zoneAware = true\n): string {\n if (value == null) return '\\u2014'\n if (col.type === 'number') return formatNumber(value, col.format, locale)\n if (col.type === 'date' && typeof value === 'string') {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return value\n // A date-only value (`2026-09-17`) has no time zone: format it in UTC so\n // every viewer, and the server, shows the same calendar date.\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n // A date-time's calendar date depends on the viewer's time zone, which the\n // server cannot know: keep the raw value until the component has mounted.\n if (!dateOnly && !zoneAware) return value\n try {\n return date.toLocaleDateString(locale, dateOnly ? { timeZone: 'UTC' } : undefined)\n } catch {\n return value\n }\n }\n return String(value)\n}\n\nfunction compareValues(\n a: unknown,\n b: unknown,\n type?: string,\n locale: string = DEFAULT_MCPUI_STRINGS.locale\n): number {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (type === 'number') {\n const na = typeof a === 'number' ? a : Number(a)\n const nb = typeof b === 'number' ? b : Number(b)\n if (isNaN(na) && isNaN(nb)) return 0\n if (isNaN(na)) return 1\n if (isNaN(nb)) return -1\n return na - nb\n }\n if (type === 'date') {\n const da = new Date(String(a)).getTime()\n const db = new Date(String(b)).getTime()\n if (isNaN(da) && isNaN(db)) return 0\n if (isNaN(da)) return 1\n if (isNaN(db)) return -1\n return da - db\n }\n return String(a).localeCompare(String(b), locale, { sensitivity: 'base' })\n}\n\n// ─── Export helpers ─────────────────────────────────────────\n\nfunction toCSV(columns: DataPreviewColumn[], rows: Record<string, unknown>[]): string {\n const header = columns.map(c => `\"${c.label.replace(/\"/g, '\"\"')}\"`).join(';')\n const body = rows.map(row =>\n columns.map(c => {\n const val = row[c.key]\n if (val == null) return ''\n if (typeof val === 'string') return `\"${val.replace(/\"/g, '\"\"')}\"`\n return String(val)\n }).join(';')\n ).join('\\n')\n return `${header}\\n${body}`\n}\n\nfunction downloadFile(content: string, filename: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// ─── Content resolver ───────────────────────────────────────\n\nfunction resolveContent(raw: unknown): DataPreviewContent | null {\n if (!raw || typeof raw !== 'object') return null\n const obj = raw as Record<string, unknown>\n if (Array.isArray(obj.columns) && Array.isArray(obj.rows)) {\n return obj as unknown as DataPreviewContent\n }\n if (obj.content && typeof obj.content === 'object') {\n const inner = obj.content as Record<string, unknown>\n if (Array.isArray(inner.columns) && Array.isArray(inner.rows)) {\n return inner as unknown as DataPreviewContent\n }\n }\n return null\n}\n\n// ─── Component ──────────────────────────────────────────────\n\nexport function DataPreviewSection(props: DataPreviewSectionProps) {\n const strings = useMCPUIStrings()\n const content = createMemo(() => {\n const resolved = resolveContent(props.content)\n if (!resolved) {\n console.warn('[MCP-UI] DataPreviewSection: invalid content — expected { columns, rows }', props.content)\n }\n return resolved\n })\n\n const columns = () => content()?.columns || []\n const rawRows = () => content()?.rows || []\n const pageSizeVal = () => content()?.pageSize ?? 25\n const showPageInfo = () => content()?.showPageInfo !== false\n\n const [page, setPage] = createSignal(content()?.initialPage ?? 0)\n const [mounted, setMounted] = createSignal(false)\n onMount(() => setMounted(true))\n const [sortKey, setSortKey] = createSignal<string | null>(null)\n const [sortDir, setSortDir] = createSignal<SortDir>(null)\n\n // Notify parent on page change\n createEffect(() => {\n const p = page()\n content()?.onPageChange?.(p)\n })\n\n const handleSort = (key: string) => {\n if (sortKey() === key) {\n if (sortDir() === 'asc') setSortDir('desc')\n else { setSortKey(null); setSortDir(null) }\n } else {\n setSortKey(key)\n setSortDir('asc')\n }\n setPage(0)\n }\n\n const sortedRows = createMemo(() => {\n const r = rawRows()\n const key = sortKey()\n const dir = sortDir()\n if (!key || !dir) return r\n const col = columns().find(c => c.key === key)\n return [...r].sort((a, b) => {\n const cmp = compareValues(a[key], b[key], col?.type, strings.locale)\n return dir === 'desc' ? -cmp : cmp\n })\n })\n\n // Pagination: auto-enabled when rows > pageSize, disabled when pageSize=0\n const isPaginated = () => pageSizeVal() > 0 && sortedRows().length > pageSizeVal()\n const totalPages = () => isPaginated() ? Math.ceil(sortedRows().length / pageSizeVal()) : 1\n\n const visibleRows = createMemo(() => {\n if (!isPaginated()) return sortedRows()\n const start = page() * pageSizeVal()\n return sortedRows().slice(start, start + pageSizeVal())\n })\n\n const rangeStart = () => isPaginated() ? page() * pageSizeVal() + 1 : 1\n const rangeEnd = () => isPaginated()\n ? Math.min((page() + 1) * pageSizeVal(), sortedRows().length)\n : sortedRows().length\n\n // Export ALL rows (not just page)\n const handleExportCSV = () => {\n const c = content()\n if (!c) return\n downloadFile(toCSV(c.columns, sortedRows()), 'data-export.csv', 'text/csv;charset=utf-8')\n }\n const handleExportJSON = () => {\n downloadFile(JSON.stringify(sortedRows(), null, 2), 'data-export.json', 'application/json')\n }\n\n const columnAlign = (col: DataPreviewColumn) => {\n if (col.align) return col.align\n if (col.type === 'number') return 'right'\n return 'left'\n }\n\n const sortIndicator = (key: string) => {\n if (sortKey() !== key) return '\\u2195'\n return sortDir() === 'asc' ? '\\u2191' : '\\u2193'\n }\n\n return (\n <Show when={content()} fallback={\n <div class=\"text-xs text-amber-600 dark:text-amber-400 p-2\">\n {strings.previewInvalidContent}\n </div>\n }>\n {(c) => (\n <div class=\"data-preview-section\">\n {/* Header: source + export */}\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={c().source}>\n <span class=\"font-medium\">{c().source}</span>\n </Show>\n <Show when={c().freshness}>\n <span class=\"px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {c().freshness}\n </span>\n </Show>\n </div>\n <Show when={c().exportable !== false}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportCSV}\n title={formatMCPUIString(strings.exportCsvRows, { count: sortedRows().length })}\n >\n CSV\n </button>\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportJSON}\n title={formatMCPUIString(strings.exportJsonRows, { count: sortedRows().length })}\n >\n JSON\n </button>\n </div>\n </Show>\n </div>\n\n {/* Table */}\n <div class=\"overflow-x-auto rounded border border-gray-200 dark:border-gray-700\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"bg-gray-50 dark:bg-gray-800\">\n <For each={columns()}>\n {(col) => (\n <th\n class=\"px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors\"\n style={{ \"text-align\": columnAlign(col) }}\n onClick={() => handleSort(col.key)}\n title={formatMCPUIString(strings.sortBy, { column: col.label })}\n >\n <span class=\"inline-flex items-center gap-1\">\n {col.label}\n <span\n class=\"text-[10px] leading-none\"\n classList={{\n 'opacity-30': sortKey() !== col.key,\n 'opacity-100 text-blue-600 dark:text-blue-400': sortKey() === col.key,\n }}\n >\n {sortIndicator(col.key)}\n </span>\n </span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={visibleRows()}>\n {(row, i) => (\n <tr\n class=\"border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n classList={{ 'bg-gray-25 dark:bg-gray-850': i() % 2 === 1 }}\n >\n <For each={columns()}>\n {(col) => (\n <td\n class=\"px-3 py-2 text-gray-800 dark:text-gray-200\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {formatCell(row[col.key], col, strings.locale, mounted())}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n {/* Footer: pagination + page info */}\n <div class=\"flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={showPageInfo()}>\n <span>\n {isPaginated()\n ? formatMCPUIString(strings.previewShowingRange, {\n start: rangeStart().toLocaleString(strings.locale),\n end: rangeEnd().toLocaleString(strings.locale),\n // `strings.locale` formats the count, so the chrome\n // string and the digits agree (and SSR matches the client).\n total: sortedRows().length.toLocaleString(strings.locale),\n })\n : formatMCPUIString(\n sortedRows().length === 1 ? strings.previewRowsOne : strings.previewRowsMany,\n { count: sortedRows().length.toLocaleString(strings.locale) }\n )}\n {c().totalRows && c().totalRows! > sortedRows().length\n ? formatMCPUIString(strings.previewTotalSuffix, {\n total: c().totalRows!.toLocaleString(strings.locale),\n })\n : ''}\n </span>\n </Show>\n <Show when={!showPageInfo()}><span /></Show>\n\n <Show when={isPaginated()}>\n <div class=\"flex items-center gap-1\">\n <button\n type=\"button\"\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() === 0}\n onClick={() => setPage(p => p - 1)}\n aria-label={strings.paginationPrevious}\n data-mcp-ui-action=\"page-prev\"\n >\n <span aria-hidden=\"true\">◀</span> {strings.previewPrev}\n </button>\n <span class=\"px-2\" aria-live=\"polite\">\n {formatMCPUIString(strings.previewPageIndicator, {\n page: page() + 1,\n total: totalPages(),\n })}\n </span>\n <button\n type=\"button\"\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() >= totalPages() - 1}\n onClick={() => setPage(p => p + 1)}\n aria-label={strings.paginationNext}\n data-mcp-ui-action=\"page-next\"\n >\n {strings.previewNext} <span aria-hidden=\"true\">▶</span>\n </button>\n </div>\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["formatNumber","value","format","locale","DEFAULT_MCPUI_STRINGS","isFinite","String","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","useGrouping","toLocaleString","Number","isInteger","formatCell","col","zoneAware","type","date","Date","isNaN","getTime","dateOnly","test","toLocaleDateString","timeZone","undefined","compareValues","a","b","na","nb","da","db","localeCompare","sensitivity","toCSV","columns","rows","header","map","c","label","replace","join","body","row","val","key","downloadFile","content","filename","mimeType","blob","Blob","url","URL","createObjectURL","document","createElement","href","download","click","revokeObjectURL","resolveContent","raw","obj","Array","isArray","inner","DataPreviewSection","props","strings","useMCPUIStrings","createMemo","resolved","console","warn","rawRows","pageSizeVal","pageSize","showPageInfo","page","setPage","createSignal","initialPage","mounted","setMounted","onMount","sortKey","setSortKey","sortDir","setSortDir","createEffect","p","onPageChange","handleSort","sortedRows","r","dir","find","sort","cmp","isPaginated","length","totalPages","Math","ceil","visibleRows","start","slice","rangeStart","rangeEnd","min","handleExportCSV","handleExportJSON","JSON","stringify","columnAlign","align","sortIndicator","_$createComponent","Show","when","fallback","_el$","_$getNextElement","_tmpl$","_$insert","previewInvalidContent","children","_el$2","_tmpl$8","_el$3","firstChild","_el$4","_el$7","_el$8","_co$","_$getNextMarker","nextSibling","_el$9","_el$0","_co$2","_el$12","_el$13","_co$3","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","_el$37","_el$38","_co$8","_el$39","_el$40","_co$9","_el$41","_el$42","_co$0","source","_el$5","_tmpl$2","freshness","_el$6","_tmpl$3","exportable","_el$1","_tmpl$4","_el$10","_el$11","$$click","_$effect","_p$","_v$","formatMCPUIString","exportCsvRows","count","_v$2","exportJsonRows","e","_$setAttribute","t","_$runHydrationEvents","For","each","_el$43","_tmpl$9","_el$44","_el$46","_el$47","_co$1","_el$45","_v$7","_v$8","sortBy","column","_v$9","_$setStyleProperty","_$classList","i","_el$48","_tmpl$0","_el$49","_tmpl$1","_$p","_el$20","_tmpl$5","_el$21","_el$22","_co$4","_el$23","_el$24","_co$5","_c$","_$memo","previewShowingRange","end","total","previewRowsOne","previewRowsMany","_c$2","totalRows","previewTotalSuffix","_tmpl$6","_el$26","_tmpl$7","_el$27","_el$28","_el$29","_el$30","_el$31","_co$6","_el$32","_el$33","_el$35","_el$36","_co$7","previewPrev","previewPageIndicator","previewNext","_v$3","_v$4","paginationPrevious","_v$5","_v$6","paginationNext","_$setProperty","o","_$delegateEvents"],"mappings":"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"}
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
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 MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
|
|
6
|
+
const formatString = require("../utils/format-string.cjs");
|
|
7
|
+
var _tmpl$ = /* @__PURE__ */ web.template(`<div class="mt-2 max-h-64 overflow-auto rounded border border-amber-200 dark:border-amber-800"><table class="w-full border-collapse text-left text-xs"><thead class="sticky top-0 bg-amber-100 dark:bg-amber-900/40"><tr></tr></thead><tbody>`), _tmpl$2 = /* @__PURE__ */ web.template(`<p class="mt-1 text-[10px] text-amber-600 dark:text-amber-400">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class="w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20"role=alert><p class="text-sm font-medium text-amber-900 dark:text-amber-100"></p><p class="mt-0.5 text-xs text-amber-700 dark:text-amber-300"></p><!$><!/>`), _tmpl$4 = /* @__PURE__ */ web.template(`<th class="px-2 py-1 font-medium text-amber-900 dark:text-amber-100">`), _tmpl$5 = /* @__PURE__ */ web.template(`<tr class="border-t border-amber-100 dark:border-amber-800/60">`), _tmpl$6 = /* @__PURE__ */ web.template(`<td class="px-2 py-1 text-amber-800 dark:text-amber-200">`);
|
|
6
8
|
const DegradedFallback = (props) => {
|
|
9
|
+
const strings = MCPUIStringsContext.useMCPUIStrings();
|
|
7
10
|
const maxRows = () => props.maxRows ?? 50;
|
|
8
11
|
const allRows = () => props.rows ?? [];
|
|
9
12
|
const shownRows = () => allRows().slice(0, maxRows());
|
|
@@ -13,9 +16,9 @@ const DegradedFallback = (props) => {
|
|
|
13
16
|
return (((_a = props.columns) == null ? void 0 : _a.length) ?? 0) > 0 && allRows().length > 0;
|
|
14
17
|
};
|
|
15
18
|
return (() => {
|
|
16
|
-
var _el$ = web.getNextElement(_tmpl$3), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$
|
|
19
|
+
var _el$ = web.getNextElement(_tmpl$3), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$0 = _el$3.nextSibling, [_el$1, _co$] = web.getNextMarker(_el$0.nextSibling);
|
|
17
20
|
web.insert(_el$2, () => props.message);
|
|
18
|
-
web.insert(_el$3, () => props.caption ??
|
|
21
|
+
web.insert(_el$3, () => props.caption ?? strings.degradedCaption);
|
|
19
22
|
web.insert(_el$, web.createComponent(solidJs.Show, {
|
|
20
23
|
get when() {
|
|
21
24
|
return hasTable();
|
|
@@ -28,9 +31,9 @@ const DegradedFallback = (props) => {
|
|
|
28
31
|
return props.columns;
|
|
29
32
|
},
|
|
30
33
|
children: (col) => (() => {
|
|
31
|
-
var _el$
|
|
32
|
-
web.insert(_el$
|
|
33
|
-
return _el$
|
|
34
|
+
var _el$10 = web.getNextElement(_tmpl$4);
|
|
35
|
+
web.insert(_el$10, col);
|
|
36
|
+
return _el$10;
|
|
34
37
|
})()
|
|
35
38
|
}));
|
|
36
39
|
web.insert(_el$8, web.createComponent(solidJs.For, {
|
|
@@ -38,18 +41,18 @@ const DegradedFallback = (props) => {
|
|
|
38
41
|
return shownRows();
|
|
39
42
|
},
|
|
40
43
|
children: (row) => (() => {
|
|
41
|
-
var _el$
|
|
42
|
-
web.insert(_el$
|
|
44
|
+
var _el$11 = web.getNextElement(_tmpl$5);
|
|
45
|
+
web.insert(_el$11, web.createComponent(solidJs.For, {
|
|
43
46
|
get each() {
|
|
44
47
|
return props.columns;
|
|
45
48
|
},
|
|
46
49
|
children: (_col, i) => (() => {
|
|
47
|
-
var _el$
|
|
48
|
-
web.insert(_el$
|
|
49
|
-
return _el$
|
|
50
|
+
var _el$12 = web.getNextElement(_tmpl$6);
|
|
51
|
+
web.insert(_el$12, () => String(row[i()] ?? ""));
|
|
52
|
+
return _el$12;
|
|
50
53
|
})()
|
|
51
54
|
}));
|
|
52
|
-
return _el$
|
|
55
|
+
return _el$11;
|
|
53
56
|
})()
|
|
54
57
|
}));
|
|
55
58
|
return _el$4;
|
|
@@ -58,14 +61,15 @@ const DegradedFallback = (props) => {
|
|
|
58
61
|
return hiddenCount() > 0;
|
|
59
62
|
},
|
|
60
63
|
get children() {
|
|
61
|
-
var _el$9 = web.getNextElement(_tmpl$2)
|
|
62
|
-
_el$
|
|
63
|
-
|
|
64
|
+
var _el$9 = web.getNextElement(_tmpl$2);
|
|
65
|
+
web.insert(_el$9, () => formatString.formatMCPUIString(strings.degradedMoreRows, {
|
|
66
|
+
count: hiddenCount()
|
|
67
|
+
}));
|
|
64
68
|
return _el$9;
|
|
65
69
|
}
|
|
66
70
|
})];
|
|
67
71
|
}
|
|
68
|
-
}), _el$
|
|
72
|
+
}), _el$1, _co$);
|
|
69
73
|
return _el$;
|
|
70
74
|
})();
|
|
71
75
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DegradedFallback.cjs","sources":["../../src/components/DegradedFallback.tsx"],"sourcesContent":["/**\n * DegradedFallback — the middle rung of the renderer fallback ladder\n * (audit 2026-05-30, P2.5).\n *\n * Each heavy renderer (graph / map / chart) follows the same contract:\n * 1. native render when its peer lib is available and succeeds;\n * 2. **degraded but useful** view when the native render throws — this\n * component: a visible notice + a plain data table so the user still\n * sees the underlying data instead of a blank space;\n * 3. (the caller also emits a `render:error` telemetry event).\n *\n * Pure / presentational — no peer deps, no side effects — so a render-path\n * failure in a heavy lib can never cascade into the fallback itself, and it\n * is trivially unit-testable. Rows/cells are rendered as text; callers are\n * responsible for stringifying complex cell values.\n */\n\nimport { Component, For, Show } from 'solid-js';\n\nexport interface DegradedFallbackProps {\n /** Short, human-readable reason the native render was skipped/failed. */\n message: string;\n /**\n * Column headers for the degraded data table. When omitted (or empty),\n * only the notice banner is shown.\n */\n columns?: string[];\n /** Row data — each row is an array of cells aligned to `columns`. */\n rows?: Array<Array<string | number>>;\n /**\n * Caption under the table. Defaults to a generic\n * \"interactive view unavailable\" line.\n */\n caption?: string;\n /** Max rows to render before truncating (default 50). */\n maxRows?: number;\n}\n\nexport const DegradedFallback: Component<DegradedFallbackProps> = (props) => {\n const maxRows = () => props.maxRows ?? 50;\n const allRows = () => props.rows ?? [];\n const shownRows = () => allRows().slice(0, maxRows());\n const hiddenCount = () => Math.max(0, allRows().length - shownRows().length);\n const hasTable = () => (props.columns?.length ?? 0) > 0 && allRows().length > 0;\n\n return (\n <div\n class=\"w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20\"\n role=\"alert\"\n >\n <p class=\"text-sm font-medium text-amber-900 dark:text-amber-100\">{props.message}</p>\n <p class=\"mt-0.5 text-xs text-amber-700 dark:text-amber-300\">\n {props.caption ??
|
|
1
|
+
{"version":3,"file":"DegradedFallback.cjs","sources":["../../src/components/DegradedFallback.tsx"],"sourcesContent":["/**\n * DegradedFallback — the middle rung of the renderer fallback ladder\n * (audit 2026-05-30, P2.5).\n *\n * Each heavy renderer (graph / map / chart) follows the same contract:\n * 1. native render when its peer lib is available and succeeds;\n * 2. **degraded but useful** view when the native render throws — this\n * component: a visible notice + a plain data table so the user still\n * sees the underlying data instead of a blank space;\n * 3. (the caller also emits a `render:error` telemetry event).\n *\n * Pure / presentational — no peer deps, no side effects — so a render-path\n * failure in a heavy lib can never cascade into the fallback itself, and it\n * is trivially unit-testable. Rows/cells are rendered as text; callers are\n * responsible for stringifying complex cell values.\n */\n\nimport { Component, For, Show } from 'solid-js';\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext';\n\nexport interface DegradedFallbackProps {\n /** Short, human-readable reason the native render was skipped/failed. */\n message: string;\n /**\n * Column headers for the degraded data table. When omitted (or empty),\n * only the notice banner is shown.\n */\n columns?: string[];\n /** Row data — each row is an array of cells aligned to `columns`. */\n rows?: Array<Array<string | number>>;\n /**\n * Caption under the table. Defaults to a generic\n * \"interactive view unavailable\" line.\n */\n caption?: string;\n /** Max rows to render before truncating (default 50). */\n maxRows?: number;\n}\n\nexport const DegradedFallback: Component<DegradedFallbackProps> = (props) => {\n const strings = useMCPUIStrings();\n const maxRows = () => props.maxRows ?? 50;\n const allRows = () => props.rows ?? [];\n const shownRows = () => allRows().slice(0, maxRows());\n const hiddenCount = () => Math.max(0, allRows().length - shownRows().length);\n const hasTable = () => (props.columns?.length ?? 0) > 0 && allRows().length > 0;\n\n return (\n <div\n class=\"w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20\"\n role=\"alert\"\n >\n <p class=\"text-sm font-medium text-amber-900 dark:text-amber-100\">{props.message}</p>\n <p class=\"mt-0.5 text-xs text-amber-700 dark:text-amber-300\">\n {props.caption ?? strings.degradedCaption}\n </p>\n\n <Show when={hasTable()}>\n <div class=\"mt-2 max-h-64 overflow-auto rounded border border-amber-200 dark:border-amber-800\">\n <table class=\"w-full border-collapse text-left text-xs\">\n <thead class=\"sticky top-0 bg-amber-100 dark:bg-amber-900/40\">\n <tr>\n <For each={props.columns}>\n {(col) => (\n <th class=\"px-2 py-1 font-medium text-amber-900 dark:text-amber-100\">{col}</th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={shownRows()}>\n {(row) => (\n <tr class=\"border-t border-amber-100 dark:border-amber-800/60\">\n <For each={props.columns}>\n {(_col, i) => (\n <td class=\"px-2 py-1 text-amber-800 dark:text-amber-200\">\n {String(row[i()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"mt-1 text-[10px] text-amber-600 dark:text-amber-400\">\n {formatMCPUIString(strings.degradedMoreRows, { count: hiddenCount() })}\n </p>\n </Show>\n </Show>\n </div>\n );\n};\n"],"names":["DegradedFallback","props","strings","useMCPUIStrings","maxRows","allRows","rows","shownRows","slice","hiddenCount","Math","max","length","hasTable","columns","_el$","_$getNextElement","_tmpl$3","_el$2","firstChild","_el$3","nextSibling","_el$0","_el$1","_co$","_$getNextMarker","_$insert","message","caption","degradedCaption","_$createComponent","Show","when","children","_el$4","_tmpl$","_el$5","_el$6","_el$7","_el$8","For","each","col","_el$10","_tmpl$4","row","_el$11","_tmpl$5","_col","i","_el$12","_tmpl$6","String","_el$9","_tmpl$2","formatMCPUIString","degradedMoreRows","count"],"mappings":";;;;;;;AAuCO,MAAMA,mBAAsDC,CAAAA,UAAU;AAC3E,QAAMC,UAAUC,oBAAAA,gBAAAA;AAChB,QAAMC,UAAUA,MAAMH,MAAMG,WAAW;AACvC,QAAMC,UAAUA,MAAMJ,MAAMK,QAAQ,CAAA;AACpC,QAAMC,YAAYA,MAAMF,QAAAA,EAAUG,MAAM,GAAGJ,SAAS;AACpD,QAAMK,cAAcA,MAAMC,KAAKC,IAAI,GAAGN,UAAUO,SAASL,UAAAA,EAAYK,MAAM;AAC3E,QAAMC,WAAWA,MAAAA;;AAAOZ,yBAAMa,YAANb,mBAAeW,WAAU,KAAK,KAAKP,UAAUO,SAAS;AAAA;AAE9E,UAAA,MAAA;AAAA,QAAAG,OAAAC,IAAAA,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAC,aAAA,CAAAE,OAAAC,IAAA,IAAAC,IAAAA,cAAAH,MAAAD,WAAA;AAAAK,QAAAA,OAAAR,OAAA,MAKuEjB,MAAM0B,OAAO;AAAAD,QAAAA,OAAAN,OAAA,MAE7EnB,MAAM2B,WAAW1B,QAAQ2B,eAAe;AAAAH,eAAAX,MAAAe,IAAAA,gBAG1CC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEnB,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAAoB,WAAA;AAAA,eAAA,EAAA,MAAA;AAAA,cAAAC,QAAAlB,IAAAA,eAAAmB,MAAA,GAAAC,QAAAF,MAAAf,YAAAkB,QAAAD,MAAAjB,YAAAmB,QAAAD,MAAAlB,YAAAoB,QAAAF,MAAAhB;AAAAK,qBAAAY,OAAAR,IAAAA,gBAKXU,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAExC,MAAMa;AAAAA,YAAO;AAAA,YAAAmB,UACpBS,UAAG,MAAA;AAAA,kBAAAC,SAAA3B,IAAAA,eAAA4B,OAAA;AAAAlB,kBAAAA,OAAAiB,QACmED,GAAG;AAAA,qBAAAC;AAAAA,YAAA,GAAA;AAAA,UAAA,CAC1E,CAAA;AAAAjB,qBAAAa,OAAAT,IAAAA,gBAKJU,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAElC,UAAAA;AAAAA,YAAW;AAAA,YAAA0B,UAClBY,UAAG,MAAA;AAAA,kBAAAC,SAAA9B,IAAAA,eAAA+B,OAAA;AAAArB,yBAAAoB,QAAAhB,IAAAA,gBAEAU,aAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAExC,MAAMa;AAAAA,gBAAO;AAAA,gBAAAmB,UACrBA,CAACe,MAAMC,OAAC,MAAA;AAAA,sBAAAC,SAAAlC,IAAAA,eAAAmC,OAAA;AAAAzB,sBAAAA,OAAAwB,QAAA,MAEJE,OAAOP,IAAII,GAAG,KAAK,EAAE,CAAC;AAAA,yBAAAC;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAE1B,CAAA;AAAA,qBAAAJ;AAAAA,YAAA,GAAA;AAAA,UAAA,CAGN,CAAA;AAAA,iBAAAZ;AAAAA,QAAA,GAAA,GAAAJ,IAAAA,gBAKRC,cAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEvB,gBAAgB;AAAA,UAAC;AAAA,UAAA,IAAAwB,WAAA;AAAA,gBAAAoB,QAAArC,IAAAA,eAAAsC,OAAA;AAAA5B,gBAAAA,OAAA2B,OAAA,MAExBE,+BAAkBrD,QAAQsD,kBAAkB;AAAA,cAAEC,OAAOhD,YAAAA;AAAAA,YAAY,CAAG,CAAC;AAAA,mBAAA4C;AAAAA,UAAA;AAAA,QAAA,CAAA,CAAA;AAAA,MAAA;AAAA,IAAA,CAAA,GAAA9B,OAAAC,IAAA;AAAA,WAAAT;AAAAA,EAAA,GAAA;AAMlF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DegradedFallback.d.ts","sourceRoot":"","sources":["../../src/components/DegradedFallback.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"DegradedFallback.d.ts","sourceRoot":"","sources":["../../src/components/DegradedFallback.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;AAGhD,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,qBAAqB,CAuD7D,CAAC"}
|