@seed-ship/mcp-ui-solid 6.19.1 → 6.21.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 +663 -0
- package/README.md +911 -4
- 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/IframeFallbackLink.cjs +37 -0
- package/dist/components/IframeFallbackLink.cjs.map +1 -0
- package/dist/components/IframeFallbackLink.d.ts +23 -0
- package/dist/components/IframeFallbackLink.d.ts.map +1 -0
- package/dist/components/IframeFallbackLink.js +37 -0
- package/dist/components/IframeFallbackLink.js.map +1 -0
- 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 +481 -365
- 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 +484 -368
- 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 +51 -20
- package/dist/components/VideoRenderer.cjs.map +1 -1
- package/dist/components/VideoRenderer.d.ts.map +1 -1
- package/dist/components/VideoRenderer.js +51 -20
- 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/MCPUIConfigContext.cjs +29 -0
- package/dist/context/MCPUIConfigContext.cjs.map +1 -0
- package/dist/context/MCPUIConfigContext.d.ts +124 -0
- package/dist/context/MCPUIConfigContext.d.ts.map +1 -0
- package/dist/context/MCPUIConfigContext.js +29 -0
- package/dist/context/MCPUIConfigContext.js.map +1 -0
- package/dist/context/MCPUIStringsContext.cjs +287 -2
- package/dist/context/MCPUIStringsContext.cjs.map +1 -1
- package/dist/context/MCPUIStringsContext.d.ts +607 -3
- package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
- package/dist/context/MCPUIStringsContext.js +287 -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 +29 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -4
- package/dist/index.d.ts +12 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- package/dist/services/index.d.ts +1 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/validation.cjs +52 -26
- package/dist/services/validation.cjs.map +1 -1
- package/dist/services/validation.d.ts +67 -2
- package/dist/services/validation.d.ts.map +1 -1
- package/dist/services/validation.js +52 -26
- 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/utils/iframe-coep.cjs +30 -0
- package/dist/utils/iframe-coep.cjs.map +1 -0
- package/dist/utils/iframe-coep.d.ts +46 -0
- package/dist/utils/iframe-coep.d.ts.map +1 -0
- package/dist/utils/iframe-coep.js +30 -0
- package/dist/utils/iframe-coep.js.map +1 -0
- package/dist/validation.cjs +5 -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 +6 -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/IframeFallbackLink.tsx +57 -0
- 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 +176 -67
- package/src/components/VerifiedText.tsx +19 -9
- package/src/components/VideoRenderer.tsx +26 -4
- package/src/components/chart-data-table.ts +68 -14
- package/src/context/MCPActionContext.tsx +4 -1
- package/src/context/MCPUIConfigContext.tsx +151 -0
- package/src/context/MCPUIStringsContext.tsx +1014 -1
- package/src/hooks/index.ts +2 -1
- package/src/hooks/useStreamingUI.ts +64 -10
- package/src/index.ts +38 -0
- package/src/services/index.ts +1 -0
- package/src/services/validation.ts +131 -32
- package/src/solid-jsx-attrs.d.ts +24 -0
- package/src/utils/degraded-projections.ts +75 -12
- package/src/utils/format-string.ts +33 -0
- package/src/utils/iframe-coep.ts +74 -0
- package/src/validation.ts +9 -0
package/README.md
CHANGED
|
@@ -5,6 +5,110 @@ SolidJS components + chat toolkit for MCP-generated UI. Part of the [MCP UI ecos
|
|
|
5
5
|
[](https://www.npmjs.com/package/@seed-ship/mcp-ui-solid)
|
|
6
6
|
[](https://opensource.org/licenses/MIT)
|
|
7
7
|
|
|
8
|
+
## What's New in v6.21.0
|
|
9
|
+
|
|
10
|
+
- **Iframes work under `Cross-Origin-Embedder-Policy: credentialless`.** Both
|
|
11
|
+
iframes the library renders — the `iframe` component and `VideoRenderer`'s
|
|
12
|
+
YouTube / Vimeo embed — now carry the boolean `credentialless` attribute
|
|
13
|
+
when their host is **not** in `TRUSTED_IFRAME_DOMAINS`. Trusted hosts
|
|
14
|
+
deliberately do not get it (a cookie-less authenticated embed shows a login
|
|
15
|
+
screen). Chrome / Edge 110+ honour the attribute; Firefox ignores it; Safari
|
|
16
|
+
ignores the COEP value entirely — see
|
|
17
|
+
[*Iframes under COEP*](#iframes-under-coep--mcpuiconfigprovider-v6210).
|
|
18
|
+
- **New `<MCPUIConfigProvider>`** (`MCPUIConfig`, `useMCPUIConfig`,
|
|
19
|
+
`DEFAULT_MCPUI_CONFIG`) — host-level rendering policy:
|
|
20
|
+
`iframeCredentialless`, `customTrustedIframeDomains`, `iframeFallbackLink`.
|
|
21
|
+
- **New `isTrustedIframeDomain()`** export (root barrel and `/validation`),
|
|
22
|
+
and a new `iframeOpenInNewTab` chrome string for the "open in a new tab"
|
|
23
|
+
link rendered under an embed that COEP may have blocked silently.
|
|
24
|
+
- **Fixed**: `IframeRenderer` called `getIframeSandbox()` without options, so
|
|
25
|
+
a host's custom trusted domains never reached the sandbox.
|
|
26
|
+
|
|
27
|
+
## What's New in v6.20.0
|
|
28
|
+
|
|
29
|
+
- **Complete i18n of the library chrome.** Every user-visible chrome string —
|
|
30
|
+
copy/export/download button titles, the code toolbar, prefill source
|
|
31
|
+
badges, the lightbox, the modal close button, `VerifiedText`'s tooltips,
|
|
32
|
+
degraded-fallback captions, status badges, form-validation messages, and
|
|
33
|
+
more — now reads from `MCPUIStrings` (components, via `useMCPUIStrings()`)
|
|
34
|
+
or an exported `messages`/`labels` option (runtime-free adapters, services,
|
|
35
|
+
helpers), except the exclusion policy P1–P8 in
|
|
36
|
+
[`CHANGELOG.md`](./CHANGELOG.md) (keyboard key caps, the OpenStreetMap
|
|
37
|
+
attribution, developer/peer-dependency diagnostics, file-format acronyms
|
|
38
|
+
and HTTP verbs, components with their own `labels`/`messages` prop, hook-level errors and `console.*`, and
|
|
39
|
+
LLM-facing registry examples). See **Internationalization** below for the
|
|
40
|
+
full key table and a French example dictionary.
|
|
41
|
+
- **New exported `formatMCPUIString(template, vars)` helper** for hosts that
|
|
42
|
+
render their own chrome and want the same `{placeholder}` substitution
|
|
43
|
+
`mcp-ui-solid` uses internally. It lives in the dependency-free
|
|
44
|
+
`src/utils/format-string.ts`, so the runtime-free adapters use it too.
|
|
45
|
+
- **New `messages` option on `connectorResultToUILayout()`** — the connector
|
|
46
|
+
adapter's own degraded-state paragraphs (unreadable payload, unrecognized
|
|
47
|
+
schema version) are no longer hardcoded French; they default to English
|
|
48
|
+
`DEFAULT_CONNECTOR_MESSAGES` and accept a partial override for hosts that
|
|
49
|
+
render in another language. See **Server-side producers** below. The macro
|
|
50
|
+
adapter gets the same treatment: `macroRunToScratchpadState()` /
|
|
51
|
+
`macroInterrogationToChatPromptConfig()` take a `messages` option backed by
|
|
52
|
+
`DEFAULT_MACRO_RUN_MESSAGES` (`"Agent"` / `"Progress"` / `"Result"` section
|
|
53
|
+
titles, abort/failure/confirm copy) — see the injectable-wording bullet
|
|
54
|
+
below.
|
|
55
|
+
- **Five chrome defaults changed from French to English** —
|
|
56
|
+
`tableSearchPlaceholder` (`"Rechercher dans le tableau..."` →
|
|
57
|
+
`"Search the table..."`), `verifiedStripLabel` (`"[non vérifié]"` →
|
|
58
|
+
`"[unverified]"`), `scratchpadEdit` (`"Modifier"` → `"Edit"`),
|
|
59
|
+
`citationUnresolved` (`"[réf. {id}]"` → `"[ref. {id}]"`, via the new
|
|
60
|
+
`CitationCtx.unresolvedLabel`), and `formPrefilledOne` / `formPrefilledMany`
|
|
61
|
+
(`"{count} champ(s) pré-rempli(s) sur {total}"` → `"{count} field(s)
|
|
62
|
+
pre-filled out of {total}"`). A connector's own
|
|
63
|
+
`tableParams.searchPlaceholder` still wins; otherwise restore the French
|
|
64
|
+
text via `<MCPUIStringsProvider>`. See [`CHANGELOG.md`](./CHANGELOG.md) for
|
|
65
|
+
the complete key list.
|
|
66
|
+
- **`StreamingUIRenderer` no longer shows the machine code `ssr` as its error
|
|
67
|
+
heading** during server rendering; it shows `streamServerSideTitle`
|
|
68
|
+
(`"Streaming unavailable"`). The hook's `StreamError.error` keeps `'ssr'`.
|
|
69
|
+
- **Injectable wording for the runtime-free helpers.** Modules that cannot
|
|
70
|
+
read the context (they must stay free of `solid-js`) now take their English
|
|
71
|
+
as a TRAILING OPTIONAL parameter with an exported default table, so every
|
|
72
|
+
existing call is unchanged:
|
|
73
|
+
`macroRunToScratchpadState(run, { messages })` /
|
|
74
|
+
`macroInterrogationToChatPromptConfig(q, { messages })`
|
|
75
|
+
(`DEFAULT_MACRO_RUN_MESSAGES`),
|
|
76
|
+
`validateFieldValue(value, field, messages)` /
|
|
77
|
+
`validateFormData(data, fields, messages)` (`DEFAULT_VALIDATION_MESSAGES` —
|
|
78
|
+
`FormRenderer` feeds it from `MCPUIStrings`),
|
|
79
|
+
`graphToDegradedTable` / `mapToDegradedTable` / `chartToDegradedTable`
|
|
80
|
+
(`DEGRADED_PROJECTION_LABELS`) and `chartToDataTable`
|
|
81
|
+
(`CHART_DATA_TABLE_LABELS`).
|
|
82
|
+
- **The chrome-strings guard is now a TypeScript-AST scanner over all of
|
|
83
|
+
`src`** (`scripts/chrome-scan.ts`, not published) — it follows literals
|
|
84
|
+
through `||` / `??` / ternary branches / template spans / helper returns /
|
|
85
|
+
signal setters into visible attributes, JSX children and the clipboard,
|
|
86
|
+
and flags French and hardcoded locales anywhere. Each exemption names an
|
|
87
|
+
exclusion-policy item and is kept live by a test; a runtime
|
|
88
|
+
pseudo-localization test renders the renderers with marker strings and CJK
|
|
89
|
+
payloads and fails on any Latin text left in the DOM.
|
|
90
|
+
- **New `locale` key (default `'en-US'`)** drives every number / date
|
|
91
|
+
formatting and collation call — a **default change**: these sites used
|
|
92
|
+
`'fr-FR'` / `'fr'` or the runtime locale before. See
|
|
93
|
+
[`locale`](#locale--number-date-and-sort-formatting-default-change-in-v6200).
|
|
94
|
+
- **`useStreamingUI({ messages })`** — the hook's progress and error messages
|
|
95
|
+
are injectable (`DEFAULT_STREAMING_UI_MESSAGES`); `StreamingUIRenderer`
|
|
96
|
+
feeds them from `MCPUIStrings` (`stream*` keys).
|
|
97
|
+
- `MCPUIStrings` now covers **270 keys** in total, all grouped by the
|
|
98
|
+
component they belong to. See the full key reference below.
|
|
99
|
+
|
|
100
|
+
> **Not covered by `MCPUIStringsProvider`:** `PresentationFeedback` documents
|
|
101
|
+
> its own `labels` prop (`DEFAULT_PRESENTATION_FEEDBACK_LABELS`) and is
|
|
102
|
+
> localized through that prop, not through the chrome-strings context.
|
|
103
|
+
|
|
104
|
+
The handful of strings that stay hardcoded fall under an explicit exclusion
|
|
105
|
+
policy (P1–P8: keyboard key caps, the OpenStreetMap/ODbL attribution,
|
|
106
|
+
developer diagnostics naming an npm/peer dependency or a config flag,
|
|
107
|
+
file-format acronyms and HTTP verbs, components with their own documented `labels`/`messages` prop, hook-level
|
|
108
|
+
errors consumers handle, and LLM-facing example payloads) — see
|
|
109
|
+
[`CHANGELOG.md`](./CHANGELOG.md)'s `## [6.20.0]` entry for the full policy
|
|
110
|
+
text and every concrete occurrence.
|
|
111
|
+
|
|
8
112
|
## What's New in v6.19.1
|
|
9
113
|
|
|
10
114
|
- `FeedbackInline`'s thumb buttons now take their `aria-label` from
|
|
@@ -182,6 +286,24 @@ Sprint OpenData / macros — `docs/briefs/ROADMAP-opendata-macro-mcpui.md`.
|
|
|
182
286
|
const layout = connectorResultToUILayout(connectorResult)
|
|
183
287
|
```
|
|
184
288
|
|
|
289
|
+
**Since v6.20.0** — `connectorResultToUILayout`'s two degraded-state
|
|
290
|
+
paragraphs (unreadable payload, unrecognized schema version) used to be
|
|
291
|
+
hardcoded French. They now default to English `ConnectorAdapterMessages`
|
|
292
|
+
(`DEFAULT_CONNECTOR_MESSAGES`) and accept a partial override via the
|
|
293
|
+
`messages` option, since these adapters are dependency-free and cannot
|
|
294
|
+
read `<MCPUIStringsProvider>`:
|
|
295
|
+
|
|
296
|
+
```ts
|
|
297
|
+
import { connectorResultToUILayout } from '@seed-ship/mcp-ui-solid/adapters'
|
|
298
|
+
|
|
299
|
+
const layout = connectorResultToUILayout(connectorResult, {
|
|
300
|
+
messages: {
|
|
301
|
+
versionWarning:
|
|
302
|
+
'> ⚠ Schéma connecteur non reconnu (`{version}`, attendu `{expected}`). Le rendu ci-dessous est en mode dégradé.',
|
|
303
|
+
},
|
|
304
|
+
})
|
|
305
|
+
```
|
|
306
|
+
|
|
185
307
|
> **Note** — `FeedbackInline`'s acknowledgement defaults changed from
|
|
186
308
|
> French to English (`'Thanks!'`, `"Noted — we'll improve"`). Wrap your app
|
|
187
309
|
> in `<MCPUIStringsProvider>` with French strings, or pass `positiveAck` /
|
|
@@ -265,7 +387,7 @@ Everything rolled up from the 4.x series is documented in the previous section b
|
|
|
265
387
|
|
|
266
388
|
- **Data Verification Layer** - Anti-hallucination: `validateAgainstSource()` detects ~90% of numerical hallucinations, zero LLM cost, <1ms
|
|
267
389
|
- **VerifiedText component** - Inline badges (verified/hallucinated) with highlight, strip, annotate modes
|
|
268
|
-
- **DataPreviewSection** - Paginated data table with CSV/JSON export, source attribution,
|
|
390
|
+
- **DataPreviewSection** - Paginated data table with CSV/JSON export, source attribution, locale formatting (`MCPUIStrings.locale`)
|
|
269
391
|
- **GeoJSON maps** - Polygon/line/point rendering, choropleth coloring, feature popups, multi-layer support
|
|
270
392
|
- **PMTiles** - Vector tiles for large datasets (>5000 features) via optional `protomaps-leaflet`
|
|
271
393
|
- **Time-series charts** - `timeAxis` config for date-based x-axis in ChartJSRenderer
|
|
@@ -848,7 +970,7 @@ const { state, pinned, close } = useScratchpadState()
|
|
|
848
970
|
| `modal` | Portal overlay, sizes sm-full, Escape/backdrop close |
|
|
849
971
|
| `image-gallery` | Grid layout, lightbox, keyboard nav |
|
|
850
972
|
| `video` | YouTube/Vimeo/direct URL |
|
|
851
|
-
| `iframe` | Tiered sandbox, 80+ whitelisted domains |
|
|
973
|
+
| `iframe` | Tiered sandbox, 80+ whitelisted domains, COEP `credentialless` (v6.21.0) |
|
|
852
974
|
| `image` | Responsive with lazy loading |
|
|
853
975
|
| `link` | Styled link cards |
|
|
854
976
|
| `action` | Tool call buttons |
|
|
@@ -858,6 +980,99 @@ const { state, pinned, close } = useScratchpadState()
|
|
|
858
980
|
| `artifact` | File download/preview |
|
|
859
981
|
| `footer` | Metadata display |
|
|
860
982
|
|
|
983
|
+
## Iframes under COEP — `MCPUIConfigProvider` (v6.21.0)
|
|
984
|
+
|
|
985
|
+
The library renders exactly two iframes: the `iframe` component
|
|
986
|
+
(`IframeRenderer`) and `VideoRenderer`'s YouTube / Vimeo embed. Both are
|
|
987
|
+
constrained by `DEFAULT_IFRAME_DOMAINS` (the allow-list) and
|
|
988
|
+
`getIframeSandbox()` (the tiered sandbox — `allow-same-origin allow-forms`
|
|
989
|
+
for `TRUSTED_IFRAME_DOMAINS`, `allow-scripts allow-popups` for everything
|
|
990
|
+
else).
|
|
991
|
+
|
|
992
|
+
A host that serves `Cross-Origin-Embedder-Policy: credentialless` adds a
|
|
993
|
+
third constraint: the browser refuses any cross-origin iframe whose own
|
|
994
|
+
document sends no COEP header — which is YouTube, Vimeo, Google Docs, Notion
|
|
995
|
+
and most of the allow-list. The frame stays blank, and the page cannot even
|
|
996
|
+
detect it (a refused cross-origin document fires no `error` event). The fix
|
|
997
|
+
is the boolean HTML attribute `<iframe credentialless>`.
|
|
998
|
+
|
|
999
|
+
By default (`'auto'`) the library sets it only where nothing is lost: the
|
|
1000
|
+
`iframe` component pointing at a **non-trusted** host, whose sandbox already
|
|
1001
|
+
has no `allow-same-origin` and therefore no cookies or storage. Two cases are
|
|
1002
|
+
left alone on purpose:
|
|
1003
|
+
|
|
1004
|
+
- **Trusted hosts** are in that list because they need their own cookies to
|
|
1005
|
+
authenticate, and a cookie-less authenticated embed only renders a login
|
|
1006
|
+
screen — a clear block beats a broken frame.
|
|
1007
|
+
- **The video embed** carries no sandbox, so a YouTube or Vimeo frame really
|
|
1008
|
+
does hold provider cookies (consent, playback state). A host under COEP
|
|
1009
|
+
unblocks it with `iframeCredentialless: 'always'`, accepting that trade;
|
|
1010
|
+
a host without COEP keeps 6.20.0 behaviour and changes nothing.
|
|
1011
|
+
|
|
1012
|
+
`<MCPUIConfigProvider>` is where a host overrides all of this. It is the
|
|
1013
|
+
behavioural counterpart of `<MCPUIStringsProvider>`: context-based, entirely
|
|
1014
|
+
optional, and `DEFAULT_MCPUI_CONFIG` applies when it is absent.
|
|
1015
|
+
|
|
1016
|
+
```tsx
|
|
1017
|
+
import { MCPUIConfigProvider } from '@seed-ship/mcp-ui-solid'
|
|
1018
|
+
|
|
1019
|
+
<MCPUIConfigProvider
|
|
1020
|
+
config={{
|
|
1021
|
+
iframeCredentialless: 'always', // also unblocks the video embed
|
|
1022
|
+
iframePolicy: 'extend', // accept hosts outside the allow-list
|
|
1023
|
+
customIframeDomains: ['embed.acme.com'], // …these ones
|
|
1024
|
+
customTrustedIframeDomains: ['embed.acme.com'], // …and treat them as trusted
|
|
1025
|
+
iframeFallbackLink: 'auto', // default
|
|
1026
|
+
}}
|
|
1027
|
+
>
|
|
1028
|
+
<App />
|
|
1029
|
+
</MCPUIConfigProvider>
|
|
1030
|
+
```
|
|
1031
|
+
|
|
1032
|
+
| Option | Values | Default | What it does |
|
|
1033
|
+
|--------|--------|---------|--------------|
|
|
1034
|
+
| `iframeCredentialless` | `'auto'` \| `'always'` \| `'never'` | `'auto'` | `'auto'`: the attribute on the `iframe` component when its host is **not** in `TRUSTED_IFRAME_DOMAINS` (+ `customTrustedIframeDomains`) — those frames already run without cookies. The video embed is excluded, since it has none of that sandboxing. `'always'`: every iframe, video and trusted hosts included — what a COEP host wants. `'never'`: none. |
|
|
1035
|
+
| `customTrustedIframeDomains` | `string[]` | `[]` | Hosts treated as trusted on top of `TRUSTED_IFRAME_DOMAINS`: no `credentialless`, and `allow-same-origin` in the sandbox. Subdomains of a listed host match. This only reclassifies a host the allow-list already accepts — pair it with `customIframeDomains` for anything else. |
|
|
1036
|
+
| `iframePolicy` | `'strict'` \| `'extend'` \| `'allow-all'` | `'strict'` | How `UIResourceRenderer` validates an `iframe` component's host. `'strict'` accepts `DEFAULT_IFRAME_DOMAINS` only; a host outside it is replaced by the validation card before any renderer runs. |
|
|
1037
|
+
| `customIframeDomains` | `string[]` | `[]` | Extra hosts the allow-list accepts when `iframePolicy` is `'extend'`. |
|
|
1038
|
+
| `iframeFallbackLink` | `'auto'` \| `'always'` \| `'never'` | `'auto'` | Whether an "open in a new tab" link (`strings.iframeOpenInNewTab`) shows under the embed. `'auto'` shows it only when the page is cross-origin isolated. `window.crossOriginIsolated` is read **after mount**, so SSR markup and hydration match. Note that flag needs COOP `same-origin` **and** COEP: a host that sends COEP alone blocks embeds while the flag is false, so it should set `'always'`. |
|
|
1039
|
+
|
|
1040
|
+
The attribute is a boolean attribute: absent from the DOM when it does not
|
|
1041
|
+
apply, never `credentialless="false"`.
|
|
1042
|
+
|
|
1043
|
+
Like `<MCPUIStringsProvider>`, a nested `<MCPUIConfigProvider>` merges over the
|
|
1044
|
+
defaults, not over an outer provider: repeat the options you want to keep.
|
|
1045
|
+
|
|
1046
|
+
`isTrustedIframeDomain(url, { customTrustedDomains? })` is exported (root
|
|
1047
|
+
barrel and the `/validation` subpath) if you need the same decision outside
|
|
1048
|
+
the renderers.
|
|
1049
|
+
|
|
1050
|
+
### Browser support
|
|
1051
|
+
|
|
1052
|
+
| | header `COEP: credentialless` | attribute `<iframe credentialless>` |
|
|
1053
|
+
| --- | --- | --- |
|
|
1054
|
+
| Chrome / Edge | 96+ | **110+** |
|
|
1055
|
+
| Firefox | 119+ | **not supported** |
|
|
1056
|
+
| Safari | not supported (value ignored) | not supported |
|
|
1057
|
+
|
|
1058
|
+
Firefox applies the header but ignores the attribute, so third-party iframes
|
|
1059
|
+
stay blocked there while the host sends COEP — nothing in this library can
|
|
1060
|
+
change that, and the fallback link is what the user gets. Safari does not
|
|
1061
|
+
know the value, treats the header as absent, and embeds simply work.
|
|
1062
|
+
|
|
1063
|
+
### The CSP is still yours
|
|
1064
|
+
|
|
1065
|
+
The allow-list is not a substitute for your Content-Security-Policy. The
|
|
1066
|
+
browser enforces `frame-src`, which the **host** sets, and a domain missing
|
|
1067
|
+
from it stays blocked whatever this library emits:
|
|
1068
|
+
|
|
1069
|
+
```
|
|
1070
|
+
Content-Security-Policy: frame-src https://www.youtube-nocookie.com https://player.vimeo.com …
|
|
1071
|
+
```
|
|
1072
|
+
|
|
1073
|
+
The comment on `DEFAULT_IFRAME_DOMAINS` in `services/validation.ts` says the
|
|
1074
|
+
same thing: *"Must match CSP frame-src directive."*
|
|
1075
|
+
|
|
861
1076
|
## SSR Compatibility
|
|
862
1077
|
|
|
863
1078
|
The published `dist/` is a DOM (client) Solid build — importing it directly
|
|
@@ -907,6 +1122,695 @@ to load or throws.
|
|
|
907
1122
|
Net effect: an SSR pass never leaks or executes untrusted markup, and the
|
|
908
1123
|
client upgrades to the rich version — with a visible reflow — once mounted.
|
|
909
1124
|
|
|
1125
|
+
## Internationalization (i18n) — `MCPUIStrings`
|
|
1126
|
+
|
|
1127
|
+
`<MCPUIStringsProvider>` localizes the library's own **chrome** — button
|
|
1128
|
+
titles, `aria-label`s, placeholders, empty states. It never touches
|
|
1129
|
+
**content** (`params.title`, table data, action labels, chat prompt copy):
|
|
1130
|
+
that comes from the payload and is already localized by whoever produced
|
|
1131
|
+
it. Every key is optional; an omitted key falls back to its English
|
|
1132
|
+
`DEFAULT_MCPUI_STRINGS` value, so mounting the provider is entirely opt-in
|
|
1133
|
+
and partial overrides are the normal case.
|
|
1134
|
+
|
|
1135
|
+
```tsx
|
|
1136
|
+
import { MCPUIStringsProvider } from '@seed-ship/mcp-ui-solid'
|
|
1137
|
+
|
|
1138
|
+
<MCPUIStringsProvider strings={{ expand: 'Agrandir', feedbackUseful: 'Utile' }}>
|
|
1139
|
+
<App />
|
|
1140
|
+
</MCPUIStringsProvider>
|
|
1141
|
+
```
|
|
1142
|
+
|
|
1143
|
+
A handful of keys are templates: they carry a `{placeholder}` the renderer
|
|
1144
|
+
fills in at call time via the exported `formatMCPUIString(template, vars)`
|
|
1145
|
+
helper. Hosts that render their own equivalent chrome (e.g. a custom sort
|
|
1146
|
+
header) can call the same helper to get the same substitution behavior —
|
|
1147
|
+
an unrecognized `{placeholder}` is left verbatim rather than becoming
|
|
1148
|
+
`undefined`:
|
|
1149
|
+
|
|
1150
|
+
```ts
|
|
1151
|
+
import { formatMCPUIString } from '@seed-ship/mcp-ui-solid'
|
|
1152
|
+
|
|
1153
|
+
formatMCPUIString('Sort by {column}', { column: 'Revenue' }) // 'Sort by Revenue'
|
|
1154
|
+
formatMCPUIString('Export CSV ({count} rows)', { count: 42 }) // 'Export CSV (42 rows)'
|
|
1155
|
+
```
|
|
1156
|
+
|
|
1157
|
+
### Full key reference
|
|
1158
|
+
|
|
1159
|
+
| Key | English default | Where it appears |
|
|
1160
|
+
|-----|------------------|-------------------|
|
|
1161
|
+
| `expand` | `Expand` | `ExpandableWrapper` toolbar — expand-to-fullscreen button `title` |
|
|
1162
|
+
| `expandedView` | `Expanded view` | `ExpandableWrapper` — fullscreen modal heading/`aria-label` when untitled |
|
|
1163
|
+
| `copyToClipboard` | `Copy to clipboard` | `ExpandableWrapper` — default copy-button tooltip (overridden by a `copyLabel` prop) |
|
|
1164
|
+
| `closeExpandedView` | `Close expanded view` | `ExpandableWrapper` — fullscreen modal close button `aria-label` |
|
|
1165
|
+
| `feedbackUseful` | `Useful` | `FeedbackInline` — thumb-up button `title`/`aria-label` |
|
|
1166
|
+
| `feedbackNotUseful` | `Not useful` | `FeedbackInline` — thumb-down button `title`/`aria-label` |
|
|
1167
|
+
| `feedbackPositiveAck` | `Thanks!` | `FeedbackInline` — acknowledgement after a positive rating |
|
|
1168
|
+
| `feedbackNegativeAck` | `Noted — we'll improve` | `FeedbackInline` — acknowledgement after a negative rating |
|
|
1169
|
+
| `retry` | `Retry` | `StreamingUIRenderer` — retry button label |
|
|
1170
|
+
| `ok` | `OK` | `ScratchpadPanel` — inline filter editor confirm button |
|
|
1171
|
+
| `cancel` | `Cancel` | `ScratchpadPanel` (inline filter editor), `ChatPrompt` (`ConfirmBody`, payload `cancelLabel` still wins) — generic cancel button |
|
|
1172
|
+
| `confirm` | `Confirm` | `ChatPrompt` (`ConfirmBody`) — generic confirm button |
|
|
1173
|
+
| `submit` | `Submit` | `ChatPrompt` (`FormBody`), `FormRenderer`, `ScratchpadPanel` (`EmbeddedFormSection`) — generic submit button |
|
|
1174
|
+
| `dismiss` | `Dismiss` | `ChatPrompt` — `aria-label` of the dismiss button |
|
|
1175
|
+
| `yes` | `Yes` | `StreamingUIRenderer` (cached cell), `ScratchpadPanel` (`FeedbackSection` approve label) |
|
|
1176
|
+
| `no` | `No` | `ScratchpadPanel` — `FeedbackSection` reject label |
|
|
1177
|
+
| `chartView` | `Chart` | `ChartJSRenderer` — chart/data view switch, "chart" side |
|
|
1178
|
+
| `chartDataView` | `Data` | `ChartJSRenderer` — chart/data view switch, "data" side |
|
|
1179
|
+
| `chartViewSelector` | `Chart or data view` | `ChartJSRenderer` — view switch accessible name |
|
|
1180
|
+
| `chartDataTable` | `Chart data` | `ChartJSRenderer` — data-table caption/accessible name |
|
|
1181
|
+
| `chartDataSummary` | `Exact values are available in the data view.` | `ChartJSRenderer` — screen-reader description of the chart canvas |
|
|
1182
|
+
| `chartNoData` | `No chart data` | `ChartJSRenderer` — empty state |
|
|
1183
|
+
| `paginationPrevious` | `Previous page` | `UIResourceRenderer` (table) — pagination "previous" button accessible name |
|
|
1184
|
+
| `paginationNext` | `Next page` | `UIResourceRenderer` (table) — pagination "next" button accessible name |
|
|
1185
|
+
| `paginationPageSize` | `Rows per page` | `UIResourceRenderer` (table) — page-size `<select>` accessible name |
|
|
1186
|
+
| `gridRegion` | `Layout grid` | `GridRenderer` — fallback `aria-label` for an untitled grid region |
|
|
1187
|
+
| `autocompleteSuggestions` | `Suggestions` | `AutocompleteDropdown` — suggestions listbox `aria-label` |
|
|
1188
|
+
| `autocompleteLoading` | `Loading...` | `AutocompleteDropdown` — fallback loading message |
|
|
1189
|
+
| `autocompleteEmpty` | `No suggestions found` | `AutocompleteDropdown` — fallback empty state |
|
|
1190
|
+
| `carouselTitle` | `Carousel` | `CarouselRenderer` — expandable-wrapper toolbar title |
|
|
1191
|
+
| `carouselCopy` | `Copy items (JSON)` | `CarouselRenderer` — copy button `copyLabel` |
|
|
1192
|
+
| `mapTitle` | `Map` | `MapRenderer` — expandable-wrapper toolbar title |
|
|
1193
|
+
| `mapCopy` | `Copy markers as GeoJSON` | `MapRenderer` — copy button `copyLabel` |
|
|
1194
|
+
| `chartDownloadPng` | `Download PNG` | `ChartJSRenderer` — PNG export button `title` |
|
|
1195
|
+
| `chartDownloadPngAria` | `Download chart as PNG` | `ChartJSRenderer` — PNG export button `aria-label` |
|
|
1196
|
+
| `chartCopy` | `Copy chart data (JSON)` | `ChartJSRenderer` — copy button `copyLabel` |
|
|
1197
|
+
| `chartLoading` | `Loading chart...` | `ChartJSRenderer` — overlay shown while the chart library and data are loading |
|
|
1198
|
+
| `codeSearchPlaceholder` | `Search…` | `CodeBlockRenderer` — in-code search input `placeholder` |
|
|
1199
|
+
| `codeSearchAria` | `Search in code` | `CodeBlockRenderer` — in-code search input `aria-label` |
|
|
1200
|
+
| `codeDownloadAria` | `Download code as file` | `CodeBlockRenderer` — download button `aria-label` |
|
|
1201
|
+
| `codeDownload` | `Download code` | `CodeBlockRenderer` — download button `title` |
|
|
1202
|
+
| `codeToggleWordWrap` | `Toggle word wrap` | `CodeBlockRenderer` — word-wrap toggle `aria-label` |
|
|
1203
|
+
| `codeCopy` | `Copy code` | `CodeBlockRenderer` — copy button `title`/`aria-label` |
|
|
1204
|
+
| `codeTitle` | `Code` | `CodeBlockRenderer` — heading and toolbar title when no filename/language is given |
|
|
1205
|
+
| `codeWordWrapEnable` | `Enable word wrap` | `CodeBlockRenderer` — word-wrap toggle `title` while word wrap is OFF |
|
|
1206
|
+
| `codeWordWrapDisable` | `Disable word wrap` | `CodeBlockRenderer` — word-wrap toggle `title` while word wrap is ON |
|
|
1207
|
+
| `exportCsvRows` | `Export CSV ({count} rows)` | `DataPreviewSection` — CSV export button `title`. Template: `{count}` |
|
|
1208
|
+
| `exportJsonRows` | `Export JSON ({count} rows)` | `DataPreviewSection` — JSON export button `title`. Template: `{count}` |
|
|
1209
|
+
| `sortBy` | `Sort by {column}` | `DataPreviewSection` / tables — sortable column header `title`. Template: `{column}` |
|
|
1210
|
+
| `removeItem` | `Remove {name}` | Form fields (chips/tags/filters) — removal button `aria-label`. Template: `{name}` |
|
|
1211
|
+
| `filterPlaceholder` | `Filter...` | Form fields — multi-select options filter input `placeholder` |
|
|
1212
|
+
| `fieldNotSupported` | `Not supported` | `FormFieldRenderer` — badge shown next to a field whose type the renderer does not support |
|
|
1213
|
+
| `fieldNoMatches` | `No matches` | `FormFieldRenderer` (`MultiSelectField`) — empty state of the option list |
|
|
1214
|
+
| `fieldGroupContainer` | `Group container` | `FormFieldRenderer` — fallback help text of a `fieldset` field with none |
|
|
1215
|
+
| `fieldSelectPlaceholder` | `Select...` | `FormFieldRenderer` — fallback `placeholder` of the multi-select trigger |
|
|
1216
|
+
| `fieldTagsPlaceholder` | `Type and press Enter...` | `FormFieldRenderer` (`TagsField`) — fallback `placeholder` of the tags input |
|
|
1217
|
+
| `scratchpadClose` | `Close` | `ScratchpadPanel` — close button `aria-label` |
|
|
1218
|
+
| `scratchpadPreview` | `Preview` | `ScratchpadPanel` — heading of the filter preview block |
|
|
1219
|
+
| `scratchpadNoResults` | `No results for these filters` | `ScratchpadPanel` — empty state of the filter preview block |
|
|
1220
|
+
| `scratchpadModifyFilters` | `Modify filters` | `ScratchpadPanel` — "refine the filters" button in the empty preview |
|
|
1221
|
+
| `scratchpadNoFilters` | `No filters` | `ScratchpadPanel` — empty state of the active-filter chip row |
|
|
1222
|
+
| `scratchpadEdit` | `Edit` | `ScratchpadPanel` — collapsed embedded form's "edit" button |
|
|
1223
|
+
| `scratchpadSend` | `Send` | `ScratchpadPanel` (`FeedbackSection`) — free-text feedback "send" button |
|
|
1224
|
+
| `scratchpadShowRaw` | `Show raw SSE payload` | `ScratchpadPanel` (`FormDebugTrace`) — debug toggle while the raw payload is hidden |
|
|
1225
|
+
| `scratchpadHideRaw` | `Hide raw SSE payload` | `ScratchpadPanel` (`FormDebugTrace`) — debug toggle while the raw payload is shown |
|
|
1226
|
+
| `scratchpadCommentPlaceholder` | `Add a comment...` | `ScratchpadPanel` (`FeedbackSection`) — fallback `placeholder` of the free-text feedback input |
|
|
1227
|
+
| `scratchpadError` | `Error` | `ScratchpadPanel` (`ErrorSectionRenderer`) — fallback message of an error section with none |
|
|
1228
|
+
| `scratchpadSource` | `Source` | `ScratchpadPanel` (`SourceCardSection`) — fallback name of a source card with none |
|
|
1229
|
+
| `graphExport` | `Export graph` | `GraphRenderer` — export-menu trigger `title`/`aria-label` |
|
|
1230
|
+
| `graphCopy` | `Copy graph (JSON)` | `GraphRenderer` — copy button `copyLabel` |
|
|
1231
|
+
| `graphTitle` | `Graph` | `GraphRenderer` — expandable-wrapper toolbar title when untitled |
|
|
1232
|
+
| `graphExportMenu` | `Export ▾` | `GraphRenderer` — visible label of the export-menu trigger button |
|
|
1233
|
+
| `graphDownloadPng` | `Download PNG` | `GraphRenderer` — "download PNG" export-menu item label |
|
|
1234
|
+
| `graphDownloadPngHint` | `visual snapshot` | `GraphRenderer` — hint under the "download PNG" item |
|
|
1235
|
+
| `graphDownloadMermaid` | `Download Mermaid` | `GraphRenderer` — "download Mermaid" export-menu item label |
|
|
1236
|
+
| `graphDownloadMermaidHint` | `markdown / GitHub` | `GraphRenderer` — hint under the "download Mermaid" item |
|
|
1237
|
+
| `graphDownloadJson` | `Download JSON` | `GraphRenderer` — "download JSON" export-menu item label |
|
|
1238
|
+
| `graphDownloadJsonHint` | `raw data` | `GraphRenderer` — hint under the "download JSON" item |
|
|
1239
|
+
| `galleryCopy` | `Copy image URLs` | `ImageGalleryRenderer` — copy button `copyLabel` |
|
|
1240
|
+
| `galleryTitle` | `Gallery` | `ImageGalleryRenderer` — expandable-wrapper toolbar title when untitled |
|
|
1241
|
+
| `videoCopy` | `Copy video URL` | `VideoRenderer` — copy button `copyLabel` |
|
|
1242
|
+
| `videoTitle` | `Video` | `VideoRenderer` — toolbar title and iframe `title` when untitled |
|
|
1243
|
+
| `sourceDetected` | `Detected from message` | `FormFieldRenderer` — "detected" prefill-source badge `title` |
|
|
1244
|
+
| `sourceInferred` | `Inferred from context` | `FormFieldRenderer` — "inferred" prefill-source badge `title` |
|
|
1245
|
+
| `sourcePrevious` | `Previously provided` | `FormFieldRenderer` — "user"/previous prefill-source badge `title` |
|
|
1246
|
+
| `lightboxLabel` | `Image lightbox` | `LightboxOverlay` — dialog `aria-label` |
|
|
1247
|
+
| `lightboxClose` | `Close lightbox` | `LightboxOverlay` — close button `aria-label` |
|
|
1248
|
+
| `lightboxPrevious` | `Previous image` | `LightboxOverlay` — previous-image button `aria-label` |
|
|
1249
|
+
| `lightboxNext` | `Next image` | `LightboxOverlay` — next-image button `aria-label` |
|
|
1250
|
+
| `modalClose` | `Close modal` | `ModalRenderer` — close button `aria-label` |
|
|
1251
|
+
| `copy` | `Copy` | `UIResourceRenderer` — default generic copy-button `title`/`aria-label` |
|
|
1252
|
+
| `copyMetric` | `Copy metric` | `UIResourceRenderer` (metric) — copy button `title` |
|
|
1253
|
+
| `copyText` | `Copy text` | `UIResourceRenderer` (text) — copy button `title` |
|
|
1254
|
+
| `copyErrorDetails` | `Copy error details` | `UIResourceRenderer` (error) — copy button `title` |
|
|
1255
|
+
| `tableTitle` | `Table` | `UIResourceRenderer` (table) — expandable-wrapper toolbar title when untitled |
|
|
1256
|
+
| `tableCopyCsv` | `Copy table (CSV)` | `UIResourceRenderer` (table) — CSV copy button `title`/`copyLabel` |
|
|
1257
|
+
| `tableExport` | `Export table` | `UIResourceRenderer` (table) — export-menu trigger `title`/`aria-label` |
|
|
1258
|
+
| `tableClearSearch` | `Clear search` | `UIResourceRenderer` (table) — search reset button `aria-label` |
|
|
1259
|
+
| `tableAriaLabel` | `Data table` | `UIResourceRenderer` (table) — scroll-region fallback `aria-label` when untitled |
|
|
1260
|
+
| `tableSearchPlaceholder` | `Search the table...` | `UIResourceRenderer` (table) — search input `placeholder`. A connector's own `tableParams.searchPlaceholder` still wins when set |
|
|
1261
|
+
| `tableCopyTsv` | `Copy TSV` | `UIResourceRenderer` (table) — "copy as TSV" export-menu item |
|
|
1262
|
+
| `tableDownloadCsv` | `Download CSV` | `UIResourceRenderer` (table) — "download CSV" export-menu item |
|
|
1263
|
+
| `tableDownloadJson` | `Download JSON` | `UIResourceRenderer` (table) — "download JSON" export-menu item |
|
|
1264
|
+
| `perPageSuffix` | `/ page` | `UIResourceRenderer` (table) — suffix after the pagination page-size selector |
|
|
1265
|
+
| `imageAlt` | `Image` | `UIResourceRenderer` (image) — fallback `alt` text |
|
|
1266
|
+
| `imageViewFullSize` | `View full size: {alt}` | `UIResourceRenderer` (image) — zoom-link `aria-label`. Template: `{alt}` |
|
|
1267
|
+
| `iframeTitle` | `Embedded content` | `UIResourceRenderer` (iframe) — fallback `title` |
|
|
1268
|
+
| `iframeOpenInNewTab` | `Open in a new tab` | `IframeRenderer` / `VideoRenderer` — label of the COEP fallback link under an embed (v6.21.0) |
|
|
1269
|
+
| `linkLabel` | `Link` | `UIResourceRenderer` (link) — fallback visible label |
|
|
1270
|
+
| `linkOpensInNewTab` | `{label}: {description} (opens in new tab)` | `UIResourceRenderer` (link) — `aria-label`. Template: `{label}`, `{description}` |
|
|
1271
|
+
| `validationWarning` | `Component validation warning` | `UIResourceRenderer` — inline component-validation warning chip `aria-label` |
|
|
1272
|
+
| `resourceTitle` | `Resource` | `UIResourceRenderer` — fallback heading for an HTML resource with no title or URI |
|
|
1273
|
+
| `chartError` | `Chart Error` | `UIResourceRenderer` (`ChartRenderer`) — heading of the chart renderer's error overlay |
|
|
1274
|
+
| `validationError` | `Validation Error` | `UIResourceRenderer` — heading of the blocking component-validation error card |
|
|
1275
|
+
| `validationUnknownError` | `Unknown validation error` | `UIResourceRenderer` — fallback detail of a validation error carrying no message |
|
|
1276
|
+
| `errorUnknown` | `Unknown error` | `UIResourceRenderer` (`ErrorCardRenderer`) — fallback message inside the error card's copyable text |
|
|
1277
|
+
| `errorUnknownToolName` | `Unknown` | `UIResourceRenderer` (`ErrorCardRenderer`) — fallback tool name in the error card heading |
|
|
1278
|
+
| `errorToolExecution` | `An error occurred during tool execution` | `UIResourceRenderer` (`ErrorCardRenderer`) — fallback body of an error card carrying no message |
|
|
1279
|
+
| `verifiedTitle` | `Verified against source data` | `VerifiedText` — `title` of a verified segment |
|
|
1280
|
+
| `verifiedAria` | `verified` | `VerifiedText` — verified marker glyph `aria-label` |
|
|
1281
|
+
| `unverifiedAria` | `unverified` | `VerifiedText` — unverified marker glyph `aria-label` |
|
|
1282
|
+
| `verifiedNotFound` | `Not found in source data` | `VerifiedText` — `title` when there is no closest match |
|
|
1283
|
+
| `verifiedNotFoundClosest` | `Not found in source data. Closest: {closest} ({pct}% off)` | `VerifiedText` — `title` when there is a closest match. Template: `{closest}`, `{pct}` |
|
|
1284
|
+
| `verifiedStripLabel` | `[unverified]` | `VerifiedText` — placeholder shown in `mode="strip"` |
|
|
1285
|
+
| `verifiedConfidence` | `{pct}% verified` | `ScratchpadPanel` (`ActionSection`), `VerifiedText` — confidence summary of a validated answer. Template: `{pct}` |
|
|
1286
|
+
| `verifiedUnverifiedCount` | `({count} unverified)` | `ScratchpadPanel` (`ActionSection`), `VerifiedText` — count of unverified numbers next to the confidence summary. Template: `{count}` |
|
|
1287
|
+
| `promptLoadingPreview` | `Loading preview...` | `ChatPrompt` (`FormBody`) — placeholder shown while the form's live preview is loading |
|
|
1288
|
+
| `promptConfirmed` | `Confirmed` | `ChatPrompt` — submitted label of a confirmed `confirm` prompt (no `confirmLabel`) |
|
|
1289
|
+
| `promptCancelled` | `Cancelled` | `ChatPrompt` — submitted label of a cancelled `confirm` prompt (no `cancelLabel`) |
|
|
1290
|
+
| `promptFormSubmitted` | `Form submitted` | `ChatPrompt` — submitted label of a `form` prompt whose fields are all empty |
|
|
1291
|
+
| `formSubmissionFailed` | `Submission failed` | `FormRenderer` — fallback error when the submit action fails without a message |
|
|
1292
|
+
| `formSubmitCountdown` | `{label} in {seconds}s...` | `FormRenderer` — auto-submit countdown notice. Template: `{label}`, `{seconds}` |
|
|
1293
|
+
| `actionGroupLabel` | `Action group` | `ActionGroupRenderer` — fallback `aria-label` of an action group without one |
|
|
1294
|
+
| `artifactDescription` | `Generated artifact` | `ArtifactRenderer` — fallback description of an artifact card without one |
|
|
1295
|
+
| `degradedCaption` | `Showing the underlying data — the interactive view is unavailable.` | `DegradedFallback` — fallback caption of the degraded-renderer notice |
|
|
1296
|
+
| `metaProvider` | `Provider` | `StreamingUIRenderer` — metadata panel provider cell label |
|
|
1297
|
+
| `metaModel` | `Model` | `StreamingUIRenderer` — metadata panel model cell label |
|
|
1298
|
+
| `metaExecutionTime` | `Execution Time` | `StreamingUIRenderer` — metadata panel execution-time cell label |
|
|
1299
|
+
| `metaCost` | `Cost` | `StreamingUIRenderer` — metadata panel cost cell label |
|
|
1300
|
+
| `metaTtfb` | `TTFB` | `StreamingUIRenderer` — metadata panel time-to-first-byte cell label |
|
|
1301
|
+
| `metaCached` | `Cached` | `StreamingUIRenderer` — metadata panel cache-hit cell label |
|
|
1302
|
+
| `download` | `Download` | `ArtifactRenderer` — download link label |
|
|
1303
|
+
| `unknown` | `unknown` | `GenerativeUIErrorBoundary` — fallback for a missing component type/id |
|
|
1304
|
+
| `citationUnresolved` | `[ref. {id}]` | `UIResourceRenderer` (table) — placeholder kept for a citation marker no `citationMap` resolves (empty map only). Template: `{id}` |
|
|
1305
|
+
| `invalidComponent` | `Invalid {type}` | `UIResourceRenderer` — `errorMode: 'inline-warn'` validation chip text. Template: `{type}` |
|
|
1306
|
+
| `toolErrorTitle` | `Tool Error: {tool}` | `UIResourceRenderer` — tool-error card heading. Template: `{tool}` (falls back to `errorUnknownToolName`) |
|
|
1307
|
+
| `errorTypeLabel` | `Type: {type}` | `UIResourceRenderer` — tool-error card error-type line. Template: `{type}` |
|
|
1308
|
+
| `errorSuggestions` | `Suggestions:` | `UIResourceRenderer` — heading above the tool-error suggestion list |
|
|
1309
|
+
| `chartInvalidData` | `Invalid chart data: missing data.datasets` | `UIResourceRenderer` (`ChartRenderer`) — shown when the payload has no `data.datasets` |
|
|
1310
|
+
| `unsupportedComponentType` | `Unsupported component type:` | `UIResourceRenderer` — prefix of the unsupported-component notice (the type follows in a `<code>`) |
|
|
1311
|
+
| `previewPrev` | `Prev` | `DataPreviewSection` — previous-page button visible label |
|
|
1312
|
+
| `previewNext` | `Next` | `DataPreviewSection` — next-page button visible label |
|
|
1313
|
+
| `previewPageIndicator` | `Page {page} / {total}` | `DataPreviewSection` — page indicator between the two buttons. Template: `{page}`, `{total}` |
|
|
1314
|
+
| `fieldResolving` | `Resolving...` | `FormFieldRenderer` — inline notice while an entity reference is being resolved |
|
|
1315
|
+
| `formPrefilledOne` | `{count} field pre-filled out of {total}` | `FormRenderer`, `ScratchpadPanel` — prefill summary, single field. Template: `{count}` (always 1), `{total}` |
|
|
1316
|
+
| `formPrefilledMany` | `{count} fields pre-filled out of {total}` | `FormRenderer`, `ScratchpadPanel` — prefill summary, several fields. Template: `{count}`, `{total}` |
|
|
1317
|
+
| `formSubmitting` | `Submitting...` | `FormRenderer` — busy label of the submit button while submitting |
|
|
1318
|
+
| `formReset` | `Reset` | `FormRenderer` — reset button label |
|
|
1319
|
+
| `errorBoundaryTitle` | `Component Failed to Render` | `GenerativeUIErrorBoundary` — default fallback heading |
|
|
1320
|
+
| `errorBoundaryMeta` | `Type: {type} \| ID: {id}...` | `GenerativeUIErrorBoundary` — default fallback metadata line. Template: `{type}`, `{id}` (both fall back to `unknown`) |
|
|
1321
|
+
| `errorBoundaryRetry` | `Retry Rendering` | `GenerativeUIErrorBoundary` — default fallback retry button label |
|
|
1322
|
+
| `scratchpadSearch` | `Search` | `ScratchpadPanel` — `waiting_human` search button label |
|
|
1323
|
+
| `scratchpadNextStep` | `Next` | `ScratchpadPanel` (`EnrichedStepsSection`) — advance-to-next-step button label |
|
|
1324
|
+
| `scratchpadPlan` | `Plan:` | `ScratchpadPanel` (`PromptSection`) — label preceding the interrogation plan summary |
|
|
1325
|
+
| `scratchpadModify` | `Modify` | `ScratchpadPanel` (`PromptSection`) — "modify this prompt" button label |
|
|
1326
|
+
| `scratchpadDetails` | `Details` | `ScratchpadPanel` (`ErrorSectionRenderer`) — "show details" toggle label |
|
|
1327
|
+
| `scratchpadItems` | `items` | `ScratchpadPanel` (`ActionSection`) — unit suffix after the item count |
|
|
1328
|
+
| `videoUnsupported` | `Your browser does not support the video tag.` | `VideoRenderer` — fallback text of a `<video>` element the browser cannot play |
|
|
1329
|
+
| `previewShowingRange` | `Showing {start}–{end} of {total}` | `DataPreviewSection` — paginated page-info line (template) |
|
|
1330
|
+
| `previewRowsOne` | `{count} row` | `DataPreviewSection` — unpaginated row count, singular (template) |
|
|
1331
|
+
| `previewRowsMany` | `{count} rows` | `DataPreviewSection` — unpaginated row count, plural (template) |
|
|
1332
|
+
| `previewTotalSuffix` | ` ({total} total)` | `DataPreviewSection` — suffix when the payload declares more rows than sent (template) |
|
|
1333
|
+
| `statusLoading` | `Loading...` | `ScratchpadPanel` — status badge, `loading` |
|
|
1334
|
+
| `statusActionAvailable` | `Action available` | `ScratchpadPanel` — status badge, `ready` |
|
|
1335
|
+
| `statusYourTurn` | `Your turn` | `ScratchpadPanel` — status badge, `waiting_human` |
|
|
1336
|
+
| `statusProcessing` | `Processing...` | `ScratchpadPanel` — status badge, `processing` |
|
|
1337
|
+
| `statusComplete` | `Complete` | `ScratchpadPanel` — status badge, `complete` (the `error` badge reuses `scratchpadError`) |
|
|
1338
|
+
| `agentStatusIdle` | `Idle` | `AgentCard` / `AgentStatusBadge` — status label |
|
|
1339
|
+
| `agentStatusRunning` | `Running` | `AgentCard` / `AgentStatusBadge` — status label |
|
|
1340
|
+
| `agentStatusWaiting` | `Waiting` | `AgentCard` / `AgentStatusBadge` — status label |
|
|
1341
|
+
| `agentStatusDone` | `Done` | `AgentCard` / `AgentStatusBadge` — status label |
|
|
1342
|
+
| `agentStatusError` | `Error` | `AgentCard` / `AgentStatusBadge` — status label |
|
|
1343
|
+
| `handoffItems` | `{count} items` | `AgentHandoff` — fallback summary (template); `content.summary` wins |
|
|
1344
|
+
| `degradedMoreRows` | `+{count} more rows not shown.` | `DegradedFallback` — truncation notice (template) |
|
|
1345
|
+
| `chartDegradedCaption` | `Showing the chart data as a table — the interactive chart is unavailable.` | `ChartJSRenderer` — degraded table caption |
|
|
1346
|
+
| `chartRenderFailed` | `Chart rendering failed: {error}` | `ChartJSRenderer` — degraded table notice (template) |
|
|
1347
|
+
| `chartRenderError` | `Chart rendering failed` | `ChartJSRenderer` — fallback reason when the render throws without a message |
|
|
1348
|
+
| `chartQuickchartCaption` | `Showing the chart data as a table.` | `UIResourceRenderer` — degraded table caption when chart.js is missing |
|
|
1349
|
+
| `graphDegradedCaption` | `Showing the graph data as a table — the interactive view is unavailable.` | `GraphRenderer` — degraded table caption |
|
|
1350
|
+
| `graphRenderFailed` | `Graph rendering failed: {error}` | `GraphRenderer` — degraded table notice (template) |
|
|
1351
|
+
| `graphRenderError` | `Failed to render graph` | `GraphRenderer` — fallback reason when the G6 render throws without a message |
|
|
1352
|
+
| `graphPngUnsupported` | `PNG export not supported in current renderer mode` | `GraphRenderer` — PNG export error |
|
|
1353
|
+
| `graphPngExportFailed` | `PNG export failed` | `GraphRenderer` — PNG export error without a message |
|
|
1354
|
+
| `mapDegradedCaption` | `Showing the map data as a coordinate table — the interactive map is unavailable.` | `MapRenderer` — degraded table caption |
|
|
1355
|
+
| `mapRenderFailed` | `Map rendering failed: {error}` | `MapRenderer` — degraded table notice (template) |
|
|
1356
|
+
| `mapRenderError` | `Failed to render map` | `MapRenderer` — fallback reason when the Leaflet render throws without a message |
|
|
1357
|
+
| `mapLibraryUnavailable` | `Map library could not be loaded.` | `MapRenderer` — the Leaflet bundle failed to load |
|
|
1358
|
+
| `degradedColType` | `Type` | Degraded map table — feature type column |
|
|
1359
|
+
| `degradedColLat` | `Lat` | Degraded map table — latitude column |
|
|
1360
|
+
| `degradedColLng` | `Lng` | Degraded map table — longitude column |
|
|
1361
|
+
| `degradedColInfo` | `Info` | Degraded map table — property summary column |
|
|
1362
|
+
| `degradedColSource` | `Source` | Degraded graph table — edge source column |
|
|
1363
|
+
| `degradedColTarget` | `Target` | Degraded graph table — edge target column |
|
|
1364
|
+
| `degradedColNode` | `Node` | Degraded graph table — node id column |
|
|
1365
|
+
| `degradedColLabel` | `Label` | Degraded graph / chart tables — label column |
|
|
1366
|
+
| `degradedSeries` | `Series {n}` | Degraded chart table — unlabelled dataset name (template) |
|
|
1367
|
+
| `chartTableSeries` | `Series` | `ChartJSRenderer` accessible data table — series column |
|
|
1368
|
+
| `chartTablePoint` | `Point` | `ChartJSRenderer` accessible data table — point-index column |
|
|
1369
|
+
| `autocompleteHintNavigate` | ` to navigate, ` | `AutocompleteDropdown` — hint prose between the arrow and Enter key caps |
|
|
1370
|
+
| `autocompleteHintSelect` | ` to select, ` | `AutocompleteDropdown` — hint prose between the Enter and Esc key caps |
|
|
1371
|
+
| `autocompleteHintDismiss` | ` to dismiss` | `AutocompleteDropdown` — hint prose after the Esc key cap |
|
|
1372
|
+
| `autocompleteTabToAccept` | `Tab to accept` | `AutocompleteFormField` — ghost-text hint |
|
|
1373
|
+
| `fieldAddMorePlaceholder` | `Add more...` | `FormFieldRenderer` — multi-value entity picker placeholder |
|
|
1374
|
+
| `galleryViewImage` | `View image {index}` | `ImageGalleryRenderer` — thumbnail button `aria-label` (template); `image.alt` wins |
|
|
1375
|
+
| `galleryImageAlt` | `Image {index}` | `ImageGalleryRenderer` — image `alt` (template); `image.alt` wins |
|
|
1376
|
+
| `imageAltFallback` | `image` | `UIResourceRenderer` — noun substituted into `imageViewFullSize` when the image has no `alt` |
|
|
1377
|
+
| `chartVisualizationAlt` | `Chart visualization` | `UIResourceRenderer` — chart image `alt`/`aria-label` with no payload title |
|
|
1378
|
+
| `chartWithTitleAlt` | `Chart: {title}` | `UIResourceRenderer` — chart image `alt`/`aria-label` with a title (template) |
|
|
1379
|
+
| `chartLoadFailed` | `Failed to load chart` | `UIResourceRenderer` — the chart image failed to load |
|
|
1380
|
+
| `paginationAllRows` | `All` | `UIResourceRenderer` — page-size option that disables pagination |
|
|
1381
|
+
| `fieldRequired` | `{field} is required` | Form validation (template) |
|
|
1382
|
+
| `fieldMustBeChecked` | `{field} must be checked` | Form validation (template) |
|
|
1383
|
+
| `fieldMinLength` | `Minimum {min} characters required` | Form validation (template) |
|
|
1384
|
+
| `fieldMaxLength` | `Maximum {max} characters allowed` | Form validation (template) |
|
|
1385
|
+
| `fieldInvalidPattern` | `Invalid format` | Form validation — value does not match `field.pattern` |
|
|
1386
|
+
| `fieldInvalidEmail` | `Invalid email address` | Form validation |
|
|
1387
|
+
| `fieldInvalidNumber` | `Must be a valid number` | Form validation |
|
|
1388
|
+
| `fieldMinValue` | `Minimum value is {min}` | Form validation (template) |
|
|
1389
|
+
| `fieldMaxValue` | `Maximum value is {max}` | Form validation (template) |
|
|
1390
|
+
| `fieldMinDate` | `Date must be after {min}` | Form validation (template) |
|
|
1391
|
+
| `fieldMaxDate` | `Date must be before {max}` | Form validation (template) |
|
|
1392
|
+
| `fieldInvalidOption` | `Please select a valid option` | Form validation |
|
|
1393
|
+
| `fieldInvalidFormat` | `Invalid format (expected: {format})` | Form validation (template); `field.valueFormatHint` wins |
|
|
1394
|
+
| `locale` | `en-US` | BCP-47 tag for number / date formatting and collation in chrome and table cells (see below) |
|
|
1395
|
+
| `briefingAdded` | `+{count} added` | `BriefingDiff` — stats summary (template) |
|
|
1396
|
+
| `briefingRemoved` | `{count} removed` | `BriefingDiff` — stats summary (template) |
|
|
1397
|
+
| `briefingChanged` | `{count} changed` | `BriefingDiff` — stats summary (template) |
|
|
1398
|
+
| `footerSources` | `{count} sources` | `FooterRenderer` — source count (template) |
|
|
1399
|
+
| `degradedMarker` | `marker` | Degraded map table — `Type` cell of a marker row |
|
|
1400
|
+
| `degradedFeature` | `feature` | Degraded map table — `Type` cell of a GeoJSON feature without a geometry type |
|
|
1401
|
+
| `fieldUnknownType` | `Unknown field type: {type}` | `FormFieldRenderer` — warning under a field of unknown type (template) |
|
|
1402
|
+
| `fieldSelectedCount` | `{count} selected` | `FormFieldRenderer` — multiselect trigger with selections (template) |
|
|
1403
|
+
| `scratchpadErrorCode` | `Code: {code}` | `ScratchpadPanel` — error state code line (template) |
|
|
1404
|
+
| `scratchpadResultCount` | `{count} results` | `ScratchpadPanel` — data-source card row count (template) |
|
|
1405
|
+
| `tableVirtualizedRows` | `(virtualized: {count} rows)` | `UIResourceRenderer` — table title suffix while virtualized (template) |
|
|
1406
|
+
| `tableSearchResultsOne` | `{count} result on {total}` | `UIResourceRenderer` — search result count, singular (template) |
|
|
1407
|
+
| `tableSearchResultsMany` | `{count} results on {total}` | `UIResourceRenderer` — search result count, plural (template) |
|
|
1408
|
+
| `tableServerPageRange` | `Showing {start} - {end} of {total}` | `UIResourceRenderer` — server-side pagination range (template) |
|
|
1409
|
+
| `errorCopyText` | `Error in {tool}: {message}` | `UIResourceRenderer` — text the tool-error card's Copy button puts on the clipboard (template) |
|
|
1410
|
+
| `errorUnknownTool` | `unknown tool` | `UIResourceRenderer` — tool name in `errorCopyText` when the error has none |
|
|
1411
|
+
| `streamInitializing` | `Initializing...` | `StreamingUIRenderer` — progress message before the stream starts |
|
|
1412
|
+
| `streamConnecting` | `Connecting to server...` | `StreamingUIRenderer` — progress message while connecting |
|
|
1413
|
+
| `streamLoadingComponent` | `Loading {type} component...` | `StreamingUIRenderer` — progress message per streamed component (template) |
|
|
1414
|
+
| `streamDashboardLoaded` | `Dashboard loaded` | `StreamingUIRenderer` — progress message on completion |
|
|
1415
|
+
| `streamErrorProgress` | `Error: {message}` | `StreamingUIRenderer` — progress message after an error (template) |
|
|
1416
|
+
| `streamConnectionFailed` | `Stream connection failed` | `StreamingUIRenderer` — error title when the connection fails |
|
|
1417
|
+
| `streamRequestFailed` | `Stream request failed` | `StreamingUIRenderer` — error message for a non-OK response without a message |
|
|
1418
|
+
| `streamEmptyResponse` | `Response body is null` | `StreamingUIRenderer` — error message for a response without a body |
|
|
1419
|
+
| `streamServerSide` | `Streaming UI cannot start on server-side` | `StreamingUIRenderer` — error message when started during SSR |
|
|
1420
|
+
| `streamUnknownError` | `Unknown error` | `StreamingUIRenderer` — error message when the failure has none |
|
|
1421
|
+
| `streamServerSideTitle` | `Streaming unavailable` | `StreamingUIRenderer` — error heading when streaming was started during SSR (replaces the machine code `ssr`) |
|
|
1422
|
+
| `graphUnavailable` | `Graph rendering unavailable` | `GraphRenderer` — heading when the `@antv/g6` peer is missing |
|
|
1423
|
+
| `mapPmtilesUnavailable` | `PMTiles layer unavailable — the optional "protomaps-leaflet" peer dependency failed to load or render.` | `MapRenderer` — banner when the PMTiles overlay fails |
|
|
1424
|
+
| `mapBaseMapStillShown` | `The base map is still shown.` | `MapRenderer` — sentence after the PMTiles banner |
|
|
1425
|
+
| `chartJsUnavailable` | `Chart.js is not available. Install chart.js peer dependency.` | `UIResourceRenderer` chart — error when `renderer: 'native'` is forced without chart.js |
|
|
1426
|
+
| `chartIframeUnavailable` | `Interactive chart unavailable — install the chart.js peer dependency, or set allowQuickchartFallback to use the external quickchart.io renderer.` | `UIResourceRenderer` chart — degraded-table message when chart.js is missing and quickchart is not allowed |
|
|
1427
|
+
| `previewInvalidContent` | `[DataPreviewSection] Invalid content format` | `DataPreviewSection` — fallback when the content is not `{ columns, rows }` |
|
|
1428
|
+
| `citationViewSource` | `View source - {label}` | `UIResourceRenderer` table — default citation chip tooltip (template; via `CitationCtx.viewSourceLabel`) |
|
|
1429
|
+
| `sizeBytes` | `{size} B` | `ArtifactRenderer` — file size below 1 KB (template) |
|
|
1430
|
+
| `sizeKilobytes` | `{size} KB` | `ArtifactRenderer` — file size in kilobytes (template) |
|
|
1431
|
+
| `sizeMegabytes` | `{size} MB` | `ArtifactRenderer` — file size in megabytes (template) |
|
|
1432
|
+
|
|
1433
|
+
### `locale` — number, date and sort formatting (default change in v6.20.0)
|
|
1434
|
+
|
|
1435
|
+
`strings.locale` (default `'en-US'`) is passed to every `toLocaleString` /
|
|
1436
|
+
`toLocaleDateString` / `localeCompare` the library calls itself: table sorting
|
|
1437
|
+
and the client-side range count in `UIResourceRenderer`, the tool-error card
|
|
1438
|
+
timestamp, `DataPreviewSection` number / currency / date cells, sorting and
|
|
1439
|
+
page-info counts, `ScratchpadPanel` preview / data-source counts, and
|
|
1440
|
+
`MapRenderer` auto-generated popups. Before v6.20.0 these sites hardcoded
|
|
1441
|
+
`'fr-FR'` / `'fr'` or used the runtime's implicit locale (which could differ
|
|
1442
|
+
between SSR and hydration). To keep French formatting:
|
|
1443
|
+
`<MCPUIStringsProvider strings={{ locale: 'fr-FR' }}>`.
|
|
1444
|
+
|
|
1445
|
+
**SSR determinism.** `strings.locale` always resolves to an explicit BCP-47
|
|
1446
|
+
tag — `'en-US'` unless a provider overrides it — never to the server's or the
|
|
1447
|
+
browser's ambient locale. That is what makes it safe to call in SSR
|
|
1448
|
+
components: the same tag renders the same formatted string on the server and
|
|
1449
|
+
after hydration, so there is no server/client markup mismatch. Relying on the
|
|
1450
|
+
runtime's implicit locale (an argument-less `toLocaleString()`) is exactly
|
|
1451
|
+
the pre-v6.20.0 behavior this key replaces, and it did not have that
|
|
1452
|
+
guarantee. An invalid tag in the provider resolves to `'en-US'` instead of
|
|
1453
|
+
making `Intl` throw (`resolveMCPUILocale()` exposes the same check).
|
|
1454
|
+
|
|
1455
|
+
The locale does not fix the time zone. Date-only `DataPreviewSection` cells
|
|
1456
|
+
are formatted in UTC so every viewer sees the same calendar date. Date-time
|
|
1457
|
+
cells and the tool-error card timestamp are formatted only after mount, in the
|
|
1458
|
+
viewer's time zone: server markup shows the raw date-time value.
|
|
1459
|
+
|
|
1460
|
+
`useStreamingUI()` called directly (without `StreamingUIRenderer`) takes the
|
|
1461
|
+
same messages as a `messages` option (`DEFAULT_STREAMING_UI_MESSAGES`).
|
|
1462
|
+
|
|
1463
|
+
### `tableSearchPlaceholder`, `verifiedStripLabel`, `scratchpadEdit`, `citationUnresolved` and `formPrefilledOne`/`formPrefilledMany` changed from French to English
|
|
1464
|
+
|
|
1465
|
+
As of v6.20.0 these five defaults are English, matching every other key. If
|
|
1466
|
+
you relied on the previous French defaults with no provider mounted,
|
|
1467
|
+
restore them explicitly:
|
|
1468
|
+
|
|
1469
|
+
```tsx
|
|
1470
|
+
<MCPUIStringsProvider
|
|
1471
|
+
strings={{
|
|
1472
|
+
tableSearchPlaceholder: 'Rechercher dans le tableau...',
|
|
1473
|
+
verifiedStripLabel: '[non vérifié]',
|
|
1474
|
+
scratchpadEdit: 'Modifier',
|
|
1475
|
+
citationUnresolved: '[réf. {id}]',
|
|
1476
|
+
formPrefilledOne: '{count} champ pré-rempli sur {total}',
|
|
1477
|
+
formPrefilledMany: '{count} champs pré-remplis sur {total}',
|
|
1478
|
+
}}
|
|
1479
|
+
>
|
|
1480
|
+
<App />
|
|
1481
|
+
</MCPUIStringsProvider>
|
|
1482
|
+
```
|
|
1483
|
+
|
|
1484
|
+
### French example dictionary
|
|
1485
|
+
|
|
1486
|
+
A complete override covering every key above:
|
|
1487
|
+
|
|
1488
|
+
```tsx
|
|
1489
|
+
import { MCPUIStringsProvider } from '@seed-ship/mcp-ui-solid'
|
|
1490
|
+
import type { MCPUIStrings } from '@seed-ship/mcp-ui-solid'
|
|
1491
|
+
|
|
1492
|
+
const fr: MCPUIStrings = {
|
|
1493
|
+
expand: 'Agrandir',
|
|
1494
|
+
expandedView: 'Vue agrandie',
|
|
1495
|
+
copyToClipboard: 'Copier dans le presse-papiers',
|
|
1496
|
+
closeExpandedView: 'Fermer la vue agrandie',
|
|
1497
|
+
feedbackUseful: 'Utile',
|
|
1498
|
+
feedbackNotUseful: 'Pas utile',
|
|
1499
|
+
feedbackPositiveAck: 'Merci !',
|
|
1500
|
+
feedbackNegativeAck: "Noté — on va s'améliorer",
|
|
1501
|
+
retry: 'Réessayer',
|
|
1502
|
+
ok: 'OK',
|
|
1503
|
+
cancel: 'Annuler',
|
|
1504
|
+
confirm: 'Confirmer',
|
|
1505
|
+
submit: 'Envoyer',
|
|
1506
|
+
dismiss: 'Fermer',
|
|
1507
|
+
yes: 'Oui',
|
|
1508
|
+
no: 'Non',
|
|
1509
|
+
chartView: 'Graphique',
|
|
1510
|
+
chartDataView: 'Données',
|
|
1511
|
+
chartViewSelector: 'Vue graphique ou données',
|
|
1512
|
+
chartDataTable: 'Données du graphique',
|
|
1513
|
+
chartDataSummary: 'Les valeurs exactes sont disponibles dans la vue données.',
|
|
1514
|
+
chartNoData: 'Aucune donnée de graphique',
|
|
1515
|
+
paginationPrevious: 'Page précédente',
|
|
1516
|
+
paginationNext: 'Page suivante',
|
|
1517
|
+
paginationPageSize: 'Lignes par page',
|
|
1518
|
+
gridRegion: 'Grille de mise en page',
|
|
1519
|
+
autocompleteSuggestions: 'Suggestions',
|
|
1520
|
+
autocompleteLoading: 'Chargement...',
|
|
1521
|
+
autocompleteEmpty: 'Aucune suggestion trouvée',
|
|
1522
|
+
carouselTitle: 'Carrousel',
|
|
1523
|
+
carouselCopy: 'Copier les éléments (JSON)',
|
|
1524
|
+
mapTitle: 'Carte',
|
|
1525
|
+
mapCopy: 'Copier les repères en GeoJSON',
|
|
1526
|
+
chartDownloadPng: 'Télécharger en PNG',
|
|
1527
|
+
chartDownloadPngAria: 'Télécharger le graphique en PNG',
|
|
1528
|
+
chartCopy: 'Copier les données du graphique (JSON)',
|
|
1529
|
+
chartLoading: 'Chargement du graphique...',
|
|
1530
|
+
codeSearchPlaceholder: 'Rechercher…',
|
|
1531
|
+
codeSearchAria: 'Rechercher dans le code',
|
|
1532
|
+
codeDownloadAria: 'Télécharger le code en fichier',
|
|
1533
|
+
codeDownload: 'Télécharger le code',
|
|
1534
|
+
codeToggleWordWrap: 'Activer/désactiver le retour à la ligne',
|
|
1535
|
+
codeCopy: 'Copier le code',
|
|
1536
|
+
codeTitle: 'Code',
|
|
1537
|
+
codeWordWrapEnable: 'Activer le retour à la ligne',
|
|
1538
|
+
codeWordWrapDisable: 'Désactiver le retour à la ligne',
|
|
1539
|
+
exportCsvRows: 'Exporter en CSV ({count} lignes)',
|
|
1540
|
+
exportJsonRows: 'Exporter en JSON ({count} lignes)',
|
|
1541
|
+
sortBy: 'Trier par {column}',
|
|
1542
|
+
removeItem: 'Supprimer {name}',
|
|
1543
|
+
filterPlaceholder: 'Filtrer...',
|
|
1544
|
+
fieldNotSupported: 'Non pris en charge',
|
|
1545
|
+
fieldNoMatches: 'Aucun résultat',
|
|
1546
|
+
fieldGroupContainer: 'Conteneur de groupe',
|
|
1547
|
+
fieldSelectPlaceholder: 'Sélectionner...',
|
|
1548
|
+
fieldTagsPlaceholder: 'Saisir puis appuyer sur Entrée...',
|
|
1549
|
+
scratchpadClose: 'Fermer',
|
|
1550
|
+
scratchpadPreview: 'Aperçu',
|
|
1551
|
+
scratchpadNoResults: 'Aucun résultat pour ces filtres',
|
|
1552
|
+
scratchpadModifyFilters: 'Modifier les filtres',
|
|
1553
|
+
scratchpadNoFilters: 'Aucun filtre',
|
|
1554
|
+
scratchpadEdit: 'Modifier',
|
|
1555
|
+
scratchpadSend: 'Envoyer',
|
|
1556
|
+
scratchpadShowRaw: 'Afficher la charge SSE brute',
|
|
1557
|
+
scratchpadHideRaw: 'Masquer la charge SSE brute',
|
|
1558
|
+
scratchpadCommentPlaceholder: 'Ajouter un commentaire...',
|
|
1559
|
+
scratchpadError: 'Erreur',
|
|
1560
|
+
scratchpadSource: 'Source',
|
|
1561
|
+
graphExport: 'Exporter le graphe',
|
|
1562
|
+
graphCopy: 'Copier le graphe (JSON)',
|
|
1563
|
+
graphTitle: 'Graphe',
|
|
1564
|
+
graphExportMenu: 'Exporter ▾',
|
|
1565
|
+
graphDownloadPng: 'Télécharger en PNG',
|
|
1566
|
+
graphDownloadPngHint: 'instantané visuel',
|
|
1567
|
+
graphDownloadMermaid: 'Télécharger en Mermaid',
|
|
1568
|
+
graphDownloadMermaidHint: 'markdown / GitHub',
|
|
1569
|
+
graphDownloadJson: 'Télécharger en JSON',
|
|
1570
|
+
graphDownloadJsonHint: 'données brutes',
|
|
1571
|
+
galleryCopy: 'Copier les URL des images',
|
|
1572
|
+
galleryTitle: 'Galerie',
|
|
1573
|
+
videoCopy: "Copier l'URL de la vidéo",
|
|
1574
|
+
videoTitle: 'Vidéo',
|
|
1575
|
+
sourceDetected: 'Détecté depuis le message',
|
|
1576
|
+
sourceInferred: 'Déduit du contexte',
|
|
1577
|
+
sourcePrevious: 'Fourni précédemment',
|
|
1578
|
+
lightboxLabel: "Visionneuse d'image",
|
|
1579
|
+
lightboxClose: 'Fermer la visionneuse',
|
|
1580
|
+
lightboxPrevious: 'Image précédente',
|
|
1581
|
+
lightboxNext: 'Image suivante',
|
|
1582
|
+
modalClose: 'Fermer la fenêtre modale',
|
|
1583
|
+
copy: 'Copier',
|
|
1584
|
+
copyMetric: 'Copier la métrique',
|
|
1585
|
+
copyText: 'Copier le texte',
|
|
1586
|
+
copyErrorDetails: "Copier les détails de l'erreur",
|
|
1587
|
+
tableTitle: 'Tableau',
|
|
1588
|
+
tableCopyCsv: 'Copier le tableau (CSV)',
|
|
1589
|
+
tableExport: 'Exporter le tableau',
|
|
1590
|
+
tableClearSearch: 'Effacer la recherche',
|
|
1591
|
+
tableAriaLabel: 'Tableau de données',
|
|
1592
|
+
tableSearchPlaceholder: 'Rechercher dans le tableau...',
|
|
1593
|
+
tableCopyTsv: 'Copier en TSV',
|
|
1594
|
+
tableDownloadCsv: 'Télécharger en CSV',
|
|
1595
|
+
tableDownloadJson: 'Télécharger en JSON',
|
|
1596
|
+
perPageSuffix: '/ page',
|
|
1597
|
+
imageAlt: 'Image',
|
|
1598
|
+
imageViewFullSize: 'Voir en taille réelle : {alt}',
|
|
1599
|
+
iframeTitle: 'Contenu intégré',
|
|
1600
|
+
iframeOpenInNewTab: 'Ouvrir dans un nouvel onglet',
|
|
1601
|
+
linkLabel: 'Lien',
|
|
1602
|
+
linkOpensInNewTab: '{label} : {description} (ouvre un nouvel onglet)',
|
|
1603
|
+
validationWarning: 'Avertissement de validation du composant',
|
|
1604
|
+
resourceTitle: 'Ressource',
|
|
1605
|
+
chartError: 'Erreur du graphique',
|
|
1606
|
+
validationError: 'Erreur de validation',
|
|
1607
|
+
validationUnknownError: 'Erreur de validation inconnue',
|
|
1608
|
+
errorUnknown: 'Erreur inconnue',
|
|
1609
|
+
errorUnknownToolName: 'Inconnu',
|
|
1610
|
+
errorToolExecution: "Une erreur s'est produite lors de l'exécution de l'outil",
|
|
1611
|
+
verifiedTitle: 'Vérifié par rapport aux données source',
|
|
1612
|
+
verifiedAria: 'vérifié',
|
|
1613
|
+
unverifiedAria: 'non vérifié',
|
|
1614
|
+
verifiedNotFound: 'Introuvable dans les données source',
|
|
1615
|
+
verifiedNotFoundClosest: "Introuvable dans les données source. Le plus proche : {closest} ({pct} % d'écart)",
|
|
1616
|
+
verifiedStripLabel: '[non vérifié]',
|
|
1617
|
+
verifiedConfidence: '{pct}% vérifié',
|
|
1618
|
+
verifiedUnverifiedCount: '({count} non vérifié)',
|
|
1619
|
+
promptLoadingPreview: "Chargement de l'aperçu...",
|
|
1620
|
+
promptConfirmed: 'Confirmé',
|
|
1621
|
+
promptCancelled: 'Annulé',
|
|
1622
|
+
promptFormSubmitted: 'Formulaire envoyé',
|
|
1623
|
+
formSubmissionFailed: 'Envoi échoué',
|
|
1624
|
+
formSubmitCountdown: '{label} dans {seconds}s...',
|
|
1625
|
+
actionGroupLabel: "Groupe d'actions",
|
|
1626
|
+
artifactDescription: 'Artefact généré',
|
|
1627
|
+
degradedCaption: "Affichage des données sous-jacentes — la vue interactive n'est pas disponible.",
|
|
1628
|
+
metaProvider: 'Fournisseur',
|
|
1629
|
+
metaModel: 'Modèle',
|
|
1630
|
+
metaExecutionTime: "Temps d'exécution",
|
|
1631
|
+
metaCost: 'Coût',
|
|
1632
|
+
metaTtfb: 'TTFB',
|
|
1633
|
+
metaCached: 'En cache',
|
|
1634
|
+
download: 'Télécharger',
|
|
1635
|
+
unknown: 'inconnu',
|
|
1636
|
+
citationUnresolved: '[réf. {id}]',
|
|
1637
|
+
invalidComponent: '{type} invalide',
|
|
1638
|
+
toolErrorTitle: 'Erreur outil : {tool}',
|
|
1639
|
+
errorTypeLabel: 'Type : {type}',
|
|
1640
|
+
errorSuggestions: 'Suggestions :',
|
|
1641
|
+
chartInvalidData: 'Données de graphique invalides : data.datasets manquant',
|
|
1642
|
+
unsupportedComponentType: 'Type de composant non pris en charge :',
|
|
1643
|
+
previewPrev: 'Préc.',
|
|
1644
|
+
previewNext: 'Suiv.',
|
|
1645
|
+
previewPageIndicator: 'Page {page} / {total}',
|
|
1646
|
+
fieldResolving: 'Résolution...',
|
|
1647
|
+
formPrefilledOne: '{count} champ pré-rempli sur {total}',
|
|
1648
|
+
formPrefilledMany: '{count} champs pré-remplis sur {total}',
|
|
1649
|
+
formSubmitting: 'Envoi...',
|
|
1650
|
+
formReset: 'Réinitialiser',
|
|
1651
|
+
errorBoundaryTitle: "Le composant n'a pas pu être rendu",
|
|
1652
|
+
errorBoundaryMeta: 'Type : {type} | ID : {id}...',
|
|
1653
|
+
errorBoundaryRetry: 'Réessayer le rendu',
|
|
1654
|
+
scratchpadSearch: 'Rechercher',
|
|
1655
|
+
scratchpadNextStep: 'Suivant',
|
|
1656
|
+
scratchpadPlan: 'Plan :',
|
|
1657
|
+
scratchpadModify: 'Modifier',
|
|
1658
|
+
scratchpadDetails: 'Détails',
|
|
1659
|
+
scratchpadItems: 'éléments',
|
|
1660
|
+
videoUnsupported: 'Votre navigateur ne prend pas en charge la balise vidéo.',
|
|
1661
|
+
previewShowingRange: 'Affichage de {start}–{end} sur {total}',
|
|
1662
|
+
previewRowsOne: '{count} ligne',
|
|
1663
|
+
previewRowsMany: '{count} lignes',
|
|
1664
|
+
previewTotalSuffix: ' ({total} au total)',
|
|
1665
|
+
statusLoading: 'Chargement...',
|
|
1666
|
+
statusActionAvailable: 'Action disponible',
|
|
1667
|
+
statusYourTurn: 'À vous',
|
|
1668
|
+
statusProcessing: 'Traitement...',
|
|
1669
|
+
statusComplete: 'Terminé',
|
|
1670
|
+
agentStatusIdle: 'Inactif',
|
|
1671
|
+
agentStatusRunning: 'En cours',
|
|
1672
|
+
agentStatusWaiting: 'En attente',
|
|
1673
|
+
agentStatusDone: 'Terminé',
|
|
1674
|
+
agentStatusError: 'Erreur',
|
|
1675
|
+
handoffItems: '{count} éléments',
|
|
1676
|
+
degradedMoreRows: '+{count} lignes supplémentaires non affichées.',
|
|
1677
|
+
chartDegradedCaption:
|
|
1678
|
+
"Affichage des données du graphique sous forme de tableau — le graphique interactif n'est pas disponible.",
|
|
1679
|
+
chartRenderFailed: 'Échec du rendu du graphique : {error}',
|
|
1680
|
+
chartRenderError: 'Échec du rendu du graphique',
|
|
1681
|
+
chartQuickchartCaption: 'Affichage des données du graphique sous forme de tableau.',
|
|
1682
|
+
graphDegradedCaption:
|
|
1683
|
+
"Affichage des données du graphe sous forme de tableau — la vue interactive n'est pas disponible.",
|
|
1684
|
+
graphRenderFailed: 'Échec du rendu du graphe : {error}',
|
|
1685
|
+
graphRenderError: 'Échec du rendu du graphe',
|
|
1686
|
+
graphPngUnsupported: "Export PNG non pris en charge dans ce mode de rendu",
|
|
1687
|
+
graphPngExportFailed: 'Échec de l’export PNG',
|
|
1688
|
+
mapDegradedCaption:
|
|
1689
|
+
"Affichage des données de la carte sous forme de tableau de coordonnées — la carte interactive n'est pas disponible.",
|
|
1690
|
+
mapRenderFailed: 'Échec du rendu de la carte : {error}',
|
|
1691
|
+
mapRenderError: 'Échec du rendu de la carte',
|
|
1692
|
+
mapLibraryUnavailable: 'Impossible de charger la bibliothèque de cartographie.',
|
|
1693
|
+
degradedColType: 'Type',
|
|
1694
|
+
degradedColLat: 'Lat',
|
|
1695
|
+
degradedColLng: 'Long',
|
|
1696
|
+
degradedColInfo: 'Infos',
|
|
1697
|
+
degradedColSource: 'Source',
|
|
1698
|
+
degradedColTarget: 'Cible',
|
|
1699
|
+
degradedColNode: 'Nœud',
|
|
1700
|
+
degradedColLabel: 'Libellé',
|
|
1701
|
+
degradedSeries: 'Série {n}',
|
|
1702
|
+
chartTableSeries: 'Série',
|
|
1703
|
+
chartTablePoint: 'Point',
|
|
1704
|
+
autocompleteHintNavigate: ' pour naviguer, ',
|
|
1705
|
+
autocompleteHintSelect: ' pour sélectionner, ',
|
|
1706
|
+
autocompleteHintDismiss: ' pour fermer',
|
|
1707
|
+
autocompleteTabToAccept: 'Tab pour accepter',
|
|
1708
|
+
fieldAddMorePlaceholder: 'Ajouter...',
|
|
1709
|
+
galleryViewImage: "Voir l'image {index}",
|
|
1710
|
+
galleryImageAlt: 'Image {index}',
|
|
1711
|
+
imageAltFallback: 'image',
|
|
1712
|
+
chartVisualizationAlt: 'Visualisation du graphique',
|
|
1713
|
+
chartWithTitleAlt: 'Graphique : {title}',
|
|
1714
|
+
chartLoadFailed: 'Échec du chargement du graphique',
|
|
1715
|
+
paginationAllRows: 'Toutes',
|
|
1716
|
+
fieldRequired: '{field} est requis',
|
|
1717
|
+
fieldMustBeChecked: '{field} doit être coché',
|
|
1718
|
+
fieldMinLength: '{min} caractères minimum requis',
|
|
1719
|
+
fieldMaxLength: '{max} caractères maximum autorisés',
|
|
1720
|
+
fieldInvalidPattern: 'Format invalide',
|
|
1721
|
+
fieldInvalidEmail: 'Adresse e-mail invalide',
|
|
1722
|
+
fieldInvalidNumber: 'Doit être un nombre valide',
|
|
1723
|
+
fieldMinValue: 'La valeur minimale est {min}',
|
|
1724
|
+
fieldMaxValue: 'La valeur maximale est {max}',
|
|
1725
|
+
fieldMinDate: 'La date doit être postérieure au {min}',
|
|
1726
|
+
fieldMaxDate: 'La date doit être antérieure au {max}',
|
|
1727
|
+
fieldInvalidOption: 'Veuillez sélectionner une option valide',
|
|
1728
|
+
fieldInvalidFormat: 'Format invalide (attendu : {format})',
|
|
1729
|
+
locale: 'fr-FR',
|
|
1730
|
+
briefingAdded: '+{count} ajouté(s)',
|
|
1731
|
+
briefingRemoved: '{count} supprimé(s)',
|
|
1732
|
+
briefingChanged: '{count} modifié(s)',
|
|
1733
|
+
footerSources: '{count} sources',
|
|
1734
|
+
degradedMarker: 'repère',
|
|
1735
|
+
degradedFeature: 'entité',
|
|
1736
|
+
fieldUnknownType: 'Type de champ inconnu : {type}',
|
|
1737
|
+
fieldSelectedCount: '{count} sélectionné(s)',
|
|
1738
|
+
scratchpadErrorCode: 'Code : {code}',
|
|
1739
|
+
scratchpadResultCount: '{count} résultats',
|
|
1740
|
+
tableVirtualizedRows: '(virtualisé : {count} lignes)',
|
|
1741
|
+
tableSearchResultsOne: '{count} résultat sur {total}',
|
|
1742
|
+
tableSearchResultsMany: '{count} résultats sur {total}',
|
|
1743
|
+
tableServerPageRange: 'Lignes {start} à {end} sur {total}',
|
|
1744
|
+
errorCopyText: 'Erreur dans {tool} : {message}',
|
|
1745
|
+
errorUnknownTool: 'outil inconnu',
|
|
1746
|
+
streamInitializing: 'Initialisation...',
|
|
1747
|
+
streamConnecting: 'Connexion au serveur...',
|
|
1748
|
+
streamLoadingComponent: 'Chargement du composant {type}...',
|
|
1749
|
+
streamDashboardLoaded: 'Tableau de bord chargé',
|
|
1750
|
+
streamErrorProgress: 'Erreur : {message}',
|
|
1751
|
+
streamConnectionFailed: 'Échec de la connexion au flux',
|
|
1752
|
+
streamRequestFailed: 'Échec de la requête de flux',
|
|
1753
|
+
streamEmptyResponse: 'Réponse vide',
|
|
1754
|
+
streamServerSide: 'Le streaming ne peut pas démarrer côté serveur',
|
|
1755
|
+
streamUnknownError: 'Erreur inconnue',
|
|
1756
|
+
streamServerSideTitle: 'Streaming indisponible',
|
|
1757
|
+
graphUnavailable: 'Rendu du graphe indisponible',
|
|
1758
|
+
mapPmtilesUnavailable:
|
|
1759
|
+
"Couche PMTiles indisponible — la dépendance optionnelle « protomaps-leaflet » n'a pas pu être chargée ou rendue.",
|
|
1760
|
+
mapBaseMapStillShown: 'Le fond de carte reste affiché.',
|
|
1761
|
+
chartJsUnavailable: "Chart.js n'est pas disponible. Installez la dépendance chart.js.",
|
|
1762
|
+
chartIframeUnavailable:
|
|
1763
|
+
'Graphique interactif indisponible — installez la dépendance chart.js, ou activez allowQuickchartFallback pour utiliser le rendu externe quickchart.io.',
|
|
1764
|
+
previewInvalidContent: 'Format de contenu invalide',
|
|
1765
|
+
citationViewSource: 'Voir la source - {label}',
|
|
1766
|
+
sizeBytes: '{size} o',
|
|
1767
|
+
sizeKilobytes: '{size} Ko',
|
|
1768
|
+
sizeMegabytes: '{size} Mo',
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1771
|
+
<MCPUIStringsProvider strings={fr}><App /></MCPUIStringsProvider>
|
|
1772
|
+
```
|
|
1773
|
+
|
|
1774
|
+
### Exclusion policy
|
|
1775
|
+
|
|
1776
|
+
A handful of strings stay hardcoded on purpose — P1–P8, with every concrete
|
|
1777
|
+
occurrence, live in [`CHANGELOG.md`](./CHANGELOG.md)'s `## [6.20.0]` entry.
|
|
1778
|
+
In short:
|
|
1779
|
+
|
|
1780
|
+
| # | What stays hardcoded | Why |
|
|
1781
|
+
|---|---|---|
|
|
1782
|
+
| P1 | Keyboard key caps inside `<kbd>` (`Enter`, `Esc`) | The physical key reads the same in any language |
|
|
1783
|
+
| P2 | The OpenStreetMap / ODbL tile attribution | Exact wording required by the license; override via `params.attribution` |
|
|
1784
|
+
| P3 | Developer diagnostics naming an npm/peer package or a config flag, bracketed `[Component] …` messages, debug-only panels, developer-misuse errors, and the structural `ValidationError.message` of `services/validation.ts` | Addressed to a developer or to the payload producer, not to the end user |
|
|
1785
|
+
| P4 | Machine tokens: file-format acronyms, HTTP verbs, unit symbols, ISO currency codes, chart point property names (`x`/`y`/`r`) | Not prose — still overridable where a `labels` parameter exists |
|
|
1786
|
+
| P5 | Pure module functions with a documented render override | No occurrence remains — the citation chip tooltip is now `citationViewSource` |
|
|
1787
|
+
| P6 | `PresentationFeedback`'s labels | The component documents its own `labels` prop instead |
|
|
1788
|
+
| P7 | Hook-level errors returned to the consumer, `onError` payloads, `console`/logger/telemetry strings | The library itself never renders these |
|
|
1789
|
+
| P8 | `services/component-registry.ts` and `plugins/` system prompts | LLM-facing schema/example text — translating it would teach the model non-English payloads |
|
|
1790
|
+
|
|
1791
|
+
### Options — runtime-free adapters, services and hooks
|
|
1792
|
+
|
|
1793
|
+
These modules cannot rely on `MCPUIStringsProvider`: the adapters, services
|
|
1794
|
+
and helpers are runtime-free (no `solid-js` import), and `useStreamingUI` is a
|
|
1795
|
+
hook a host may call outside any provider. So each takes its own English wording as a trailing optional parameter with an
|
|
1796
|
+
exported default table:
|
|
1797
|
+
|
|
1798
|
+
| Module | Function(s) | Option | Default table | Keys |
|
|
1799
|
+
|---|---|---|---|---|
|
|
1800
|
+
| `adapters/connector.ts` (`/adapters`) | `connectorResultToUILayout` | `options.messages?: Partial<ConnectorAdapterMessages>` | `DEFAULT_CONNECTOR_MESSAGES` | `degradedNotice`, `degradedVersionSuffix`, `versionWarning` |
|
|
1801
|
+
| `adapters/macro-run.ts` (`/adapters`) | `macroRunToScratchpadState`, `macroInterrogationToChatPromptConfig` | `options.messages?: Partial<MacroRunAdapterMessages>` | `DEFAULT_MACRO_RUN_MESSAGES` | `agentSectionTitle`, `progressSectionTitle`, `resultSectionTitle`, `runAborted`, `runFailed`, `confirmDefault` |
|
|
1802
|
+
| `services/validation.ts` (root, `/validation`) | `validateFieldValue`, `validateFormData` | `messages?: Partial<FormValidationMessages>` | `DEFAULT_VALIDATION_MESSAGES` | `required`, `mustBeChecked`, `minLength`, `maxLength`, `invalidPattern`, `invalidEmail`, `invalidNumber`, `minValue`, `maxValue`, `minDate`, `maxDate`, `invalidOption`, `invalidFormat` |
|
|
1803
|
+
| `utils/degraded-projections.ts` (root) | `graphToDegradedTable`, `mapToDegradedTable`, `chartToDegradedTable` | `labels?: Partial<DegradedProjectionLabels>` | `DEGRADED_PROJECTION_LABELS` | `source`, `target`, `label`, `node`, `type`, `lat`, `lng`, `info`, `marker`, `feature`, `series` |
|
|
1804
|
+
| `components/chart-data-table.ts` (root) | `chartToDataTable` | `labels?: Partial<ChartDataTableLabels>` | `CHART_DATA_TABLE_LABELS` | `series`, `point`, `label`, `seriesName`, `x`, `y`, `r` |
|
|
1805
|
+
| `hooks/useStreamingUI.ts` (root, `/hooks`) | `useStreamingUI` | `options.messages?: Partial<StreamingUIMessages>` | `DEFAULT_STREAMING_UI_MESSAGES` | `initializing`, `connecting`, `loadingComponent`, `dashboardLoaded`, `errorProgress`, `connectionFailed`, `requestFailed`, `emptyResponse`, `serverSide`, `unknownError` |
|
|
1806
|
+
|
|
1807
|
+
Every option is a trailing OPTIONAL parameter, so existing calls keep
|
|
1808
|
+
type-checking and behaving identically. `StreamingUIRenderer` and
|
|
1809
|
+
`FormRenderer` feed their module's table from `useMCPUIStrings()`
|
|
1810
|
+
automatically — a host only calls these functions with an explicit
|
|
1811
|
+
`messages`/`labels` override when it uses the adapter or helper directly,
|
|
1812
|
+
outside a component that already wires it up.
|
|
1813
|
+
|
|
910
1814
|
## Telemetry
|
|
911
1815
|
|
|
912
1816
|
Optional, fail-open event sink for component lifecycle, validation and action
|
|
@@ -991,6 +1895,7 @@ import {
|
|
|
991
1895
|
GraphRenderer, isG6Available, graphToMermaid, graphToJSON,
|
|
992
1896
|
renderCellValue, // v5.7.0 — citation-chip-aware table cell renderer
|
|
993
1897
|
MCPUIStringsProvider, useMCPUIStrings, DEFAULT_MCPUI_STRINGS, // v6.6.0 i18n chrome
|
|
1898
|
+
MCPUIConfigProvider, useMCPUIConfig, DEFAULT_MCPUI_CONFIG, // v6.21.0 host policy
|
|
994
1899
|
} from '@seed-ship/mcp-ui-solid'
|
|
995
1900
|
|
|
996
1901
|
// Hooks
|
|
@@ -1018,7 +1923,8 @@ import {
|
|
|
1018
1923
|
// Validation + Security
|
|
1019
1924
|
import {
|
|
1020
1925
|
validateComponent, validateLayout, validateIframeDomain,
|
|
1021
|
-
getIframeSandbox,
|
|
1926
|
+
getIframeSandbox, isTrustedIframeDomain, // v6.21.0 — trusted-host test
|
|
1927
|
+
DEFAULT_RESOURCE_LIMITS,
|
|
1022
1928
|
DEFAULT_IFRAME_DOMAINS, TRUSTED_IFRAME_DOMAINS,
|
|
1023
1929
|
ComponentRegistry, mergeScratchpadSections,
|
|
1024
1930
|
validateAgainstSource, // v4.0.0 — anti-hallucination
|
|
@@ -1059,7 +1965,8 @@ import type {
|
|
|
1059
1965
|
MapPopupConfig, MapLayer, MapPMTilesConfig,
|
|
1060
1966
|
IframePolicy, ValidationOptions,
|
|
1061
1967
|
CitationCtx, CitationEntry, DuplicateMountInfo, DuplicateMountReporter,
|
|
1062
|
-
MCPUIStrings,
|
|
1968
|
+
MCPUIStrings, MCPUIConfig, // v6.21.0
|
|
1969
|
+
TelemetryEvent, TelemetrySink, TelemetryOptions, TelemetryDispatcher,
|
|
1063
1970
|
DataValidation, HallucinatedNumber, DataValidationOptions,
|
|
1064
1971
|
VerifiedTextContent, DataPreviewContent, MapSectionContent,
|
|
1065
1972
|
ChatBus, ChatEvents, ChatCommands, ScratchpadState, ScratchpadSection,
|