@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.
Files changed (282) hide show
  1. package/CHANGELOG.md +663 -0
  2. package/README.md +911 -4
  3. package/dist/adapters/connector.cjs +15 -4
  4. package/dist/adapters/connector.cjs.map +1 -1
  5. package/dist/adapters/connector.d.ts +38 -0
  6. package/dist/adapters/connector.d.ts.map +1 -1
  7. package/dist/adapters/connector.js +15 -4
  8. package/dist/adapters/connector.js.map +1 -1
  9. package/dist/adapters/index.d.ts +4 -3
  10. package/dist/adapters/index.d.ts.map +1 -1
  11. package/dist/adapters/macro-run.cjs +25 -13
  12. package/dist/adapters/macro-run.cjs.map +1 -1
  13. package/dist/adapters/macro-run.d.ts +37 -2
  14. package/dist/adapters/macro-run.d.ts.map +1 -1
  15. package/dist/adapters/macro-run.js +25 -13
  16. package/dist/adapters/macro-run.js.map +1 -1
  17. package/dist/adapters.cjs +2 -0
  18. package/dist/adapters.cjs.map +1 -1
  19. package/dist/adapters.js +4 -2
  20. package/dist/components/ActionGroupRenderer.cjs +3 -1
  21. package/dist/components/ActionGroupRenderer.cjs.map +1 -1
  22. package/dist/components/ActionGroupRenderer.d.ts.map +1 -1
  23. package/dist/components/ActionGroupRenderer.js +3 -1
  24. package/dist/components/ActionGroupRenderer.js.map +1 -1
  25. package/dist/components/AgentCard.cjs +11 -8
  26. package/dist/components/AgentCard.cjs.map +1 -1
  27. package/dist/components/AgentCard.d.ts.map +1 -1
  28. package/dist/components/AgentCard.js +11 -8
  29. package/dist/components/AgentCard.js.map +1 -1
  30. package/dist/components/AgentHandoff.cjs +6 -1
  31. package/dist/components/AgentHandoff.cjs.map +1 -1
  32. package/dist/components/AgentHandoff.d.ts.map +1 -1
  33. package/dist/components/AgentHandoff.js +6 -1
  34. package/dist/components/AgentHandoff.js.map +1 -1
  35. package/dist/components/ArtifactRenderer.cjs +25 -6
  36. package/dist/components/ArtifactRenderer.cjs.map +1 -1
  37. package/dist/components/ArtifactRenderer.d.ts.map +1 -1
  38. package/dist/components/ArtifactRenderer.js +25 -6
  39. package/dist/components/ArtifactRenderer.js.map +1 -1
  40. package/dist/components/AutocompleteDropdown.cjs +30 -24
  41. package/dist/components/AutocompleteDropdown.cjs.map +1 -1
  42. package/dist/components/AutocompleteDropdown.d.ts.map +1 -1
  43. package/dist/components/AutocompleteDropdown.js +30 -24
  44. package/dist/components/AutocompleteDropdown.js.map +1 -1
  45. package/dist/components/AutocompleteFormField.cjs +3 -1
  46. package/dist/components/AutocompleteFormField.cjs.map +1 -1
  47. package/dist/components/AutocompleteFormField.d.ts.map +1 -1
  48. package/dist/components/AutocompleteFormField.js +4 -2
  49. package/dist/components/AutocompleteFormField.js.map +1 -1
  50. package/dist/components/BriefingDiff.cjs +45 -39
  51. package/dist/components/BriefingDiff.cjs.map +1 -1
  52. package/dist/components/BriefingDiff.d.ts.map +1 -1
  53. package/dist/components/BriefingDiff.js +45 -39
  54. package/dist/components/BriefingDiff.js.map +1 -1
  55. package/dist/components/CarouselRenderer.cjs +8 -2
  56. package/dist/components/CarouselRenderer.cjs.map +1 -1
  57. package/dist/components/CarouselRenderer.d.ts.map +1 -1
  58. package/dist/components/CarouselRenderer.js +8 -2
  59. package/dist/components/CarouselRenderer.js.map +1 -1
  60. package/dist/components/ChartJSRenderer.cjs +60 -36
  61. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  62. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  63. package/dist/components/ChartJSRenderer.js +61 -37
  64. package/dist/components/ChartJSRenderer.js.map +1 -1
  65. package/dist/components/ChatPrompt.cjs +15 -9
  66. package/dist/components/ChatPrompt.cjs.map +1 -1
  67. package/dist/components/ChatPrompt.d.ts.map +1 -1
  68. package/dist/components/ChatPrompt.js +15 -9
  69. package/dist/components/ChatPrompt.js.map +1 -1
  70. package/dist/components/CodeBlockRenderer.cjs +34 -16
  71. package/dist/components/CodeBlockRenderer.cjs.map +1 -1
  72. package/dist/components/CodeBlockRenderer.d.ts.map +1 -1
  73. package/dist/components/CodeBlockRenderer.js +34 -16
  74. package/dist/components/CodeBlockRenderer.js.map +1 -1
  75. package/dist/components/DataPreviewSection.cjs +91 -44
  76. package/dist/components/DataPreviewSection.cjs.map +1 -1
  77. package/dist/components/DataPreviewSection.d.ts.map +1 -1
  78. package/dist/components/DataPreviewSection.js +92 -45
  79. package/dist/components/DataPreviewSection.js.map +1 -1
  80. package/dist/components/DegradedFallback.cjs +20 -16
  81. package/dist/components/DegradedFallback.cjs.map +1 -1
  82. package/dist/components/DegradedFallback.d.ts.map +1 -1
  83. package/dist/components/DegradedFallback.js +20 -16
  84. package/dist/components/DegradedFallback.js.map +1 -1
  85. package/dist/components/FooterRenderer.cjs +21 -17
  86. package/dist/components/FooterRenderer.cjs.map +1 -1
  87. package/dist/components/FooterRenderer.d.ts.map +1 -1
  88. package/dist/components/FooterRenderer.js +21 -17
  89. package/dist/components/FooterRenderer.js.map +1 -1
  90. package/dist/components/FormFieldRenderer.cjs +116 -93
  91. package/dist/components/FormFieldRenderer.cjs.map +1 -1
  92. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  93. package/dist/components/FormFieldRenderer.js +116 -93
  94. package/dist/components/FormFieldRenderer.js.map +1 -1
  95. package/dist/components/FormRenderer.cjs +55 -31
  96. package/dist/components/FormRenderer.cjs.map +1 -1
  97. package/dist/components/FormRenderer.d.ts.map +1 -1
  98. package/dist/components/FormRenderer.js +55 -31
  99. package/dist/components/FormRenderer.js.map +1 -1
  100. package/dist/components/GenerativeUIErrorBoundary.cjs +20 -15
  101. package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
  102. package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
  103. package/dist/components/GenerativeUIErrorBoundary.js +20 -15
  104. package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
  105. package/dist/components/GraphRenderer.cjs +56 -33
  106. package/dist/components/GraphRenderer.cjs.map +1 -1
  107. package/dist/components/GraphRenderer.d.ts.map +1 -1
  108. package/dist/components/GraphRenderer.js +56 -33
  109. package/dist/components/GraphRenderer.js.map +1 -1
  110. package/dist/components/IframeFallbackLink.cjs +37 -0
  111. package/dist/components/IframeFallbackLink.cjs.map +1 -0
  112. package/dist/components/IframeFallbackLink.d.ts +23 -0
  113. package/dist/components/IframeFallbackLink.d.ts.map +1 -0
  114. package/dist/components/IframeFallbackLink.js +37 -0
  115. package/dist/components/IframeFallbackLink.js.map +1 -0
  116. package/dist/components/ImageGalleryRenderer.cjs +13 -4
  117. package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
  118. package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
  119. package/dist/components/ImageGalleryRenderer.js +13 -4
  120. package/dist/components/ImageGalleryRenderer.js.map +1 -1
  121. package/dist/components/LightboxOverlay.cjs +16 -8
  122. package/dist/components/LightboxOverlay.cjs.map +1 -1
  123. package/dist/components/LightboxOverlay.d.ts.map +1 -1
  124. package/dist/components/LightboxOverlay.js +17 -9
  125. package/dist/components/LightboxOverlay.js.map +1 -1
  126. package/dist/components/MapRenderer.cjs +59 -29
  127. package/dist/components/MapRenderer.cjs.map +1 -1
  128. package/dist/components/MapRenderer.d.ts +10 -2
  129. package/dist/components/MapRenderer.d.ts.map +1 -1
  130. package/dist/components/MapRenderer.js +60 -30
  131. package/dist/components/MapRenderer.js.map +1 -1
  132. package/dist/components/ModalRenderer.cjs +4 -1
  133. package/dist/components/ModalRenderer.cjs.map +1 -1
  134. package/dist/components/ModalRenderer.d.ts.map +1 -1
  135. package/dist/components/ModalRenderer.js +5 -2
  136. package/dist/components/ModalRenderer.js.map +1 -1
  137. package/dist/components/ScratchpadPanel.cjs +578 -535
  138. package/dist/components/ScratchpadPanel.cjs.map +1 -1
  139. package/dist/components/ScratchpadPanel.d.ts.map +1 -1
  140. package/dist/components/ScratchpadPanel.js +578 -535
  141. package/dist/components/ScratchpadPanel.js.map +1 -1
  142. package/dist/components/StreamingUIRenderer.cjs +92 -28
  143. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  144. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  145. package/dist/components/StreamingUIRenderer.js +92 -28
  146. package/dist/components/StreamingUIRenderer.js.map +1 -1
  147. package/dist/components/UIResourceRenderer.cjs +481 -365
  148. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  149. package/dist/components/UIResourceRenderer.d.ts +21 -0
  150. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  151. package/dist/components/UIResourceRenderer.js +484 -368
  152. package/dist/components/UIResourceRenderer.js.map +1 -1
  153. package/dist/components/VerifiedText.cjs +39 -20
  154. package/dist/components/VerifiedText.cjs.map +1 -1
  155. package/dist/components/VerifiedText.d.ts +2 -1
  156. package/dist/components/VerifiedText.d.ts.map +1 -1
  157. package/dist/components/VerifiedText.js +39 -20
  158. package/dist/components/VerifiedText.js.map +1 -1
  159. package/dist/components/VideoRenderer.cjs +51 -20
  160. package/dist/components/VideoRenderer.cjs.map +1 -1
  161. package/dist/components/VideoRenderer.d.ts.map +1 -1
  162. package/dist/components/VideoRenderer.js +51 -20
  163. package/dist/components/VideoRenderer.js.map +1 -1
  164. package/dist/components/chart-data-table.cjs +38 -17
  165. package/dist/components/chart-data-table.cjs.map +1 -1
  166. package/dist/components/chart-data-table.d.ts +30 -1
  167. package/dist/components/chart-data-table.d.ts.map +1 -1
  168. package/dist/components/chart-data-table.js +38 -17
  169. package/dist/components/chart-data-table.js.map +1 -1
  170. package/dist/context/MCPActionContext.cjs +3 -1
  171. package/dist/context/MCPActionContext.cjs.map +1 -1
  172. package/dist/context/MCPActionContext.d.ts.map +1 -1
  173. package/dist/context/MCPActionContext.js +3 -1
  174. package/dist/context/MCPActionContext.js.map +1 -1
  175. package/dist/context/MCPUIConfigContext.cjs +29 -0
  176. package/dist/context/MCPUIConfigContext.cjs.map +1 -0
  177. package/dist/context/MCPUIConfigContext.d.ts +124 -0
  178. package/dist/context/MCPUIConfigContext.d.ts.map +1 -0
  179. package/dist/context/MCPUIConfigContext.js +29 -0
  180. package/dist/context/MCPUIConfigContext.js.map +1 -0
  181. package/dist/context/MCPUIStringsContext.cjs +287 -2
  182. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  183. package/dist/context/MCPUIStringsContext.d.ts +607 -3
  184. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  185. package/dist/context/MCPUIStringsContext.js +287 -2
  186. package/dist/context/MCPUIStringsContext.js.map +1 -1
  187. package/dist/hooks/index.d.ts +2 -2
  188. package/dist/hooks/index.d.ts.map +1 -1
  189. package/dist/hooks/useStreamingUI.cjs +28 -10
  190. package/dist/hooks/useStreamingUI.cjs.map +1 -1
  191. package/dist/hooks/useStreamingUI.d.ts +37 -0
  192. package/dist/hooks/useStreamingUI.d.ts.map +1 -1
  193. package/dist/hooks/useStreamingUI.js +28 -10
  194. package/dist/hooks/useStreamingUI.js.map +1 -1
  195. package/dist/hooks.cjs +1 -0
  196. package/dist/hooks.cjs.map +1 -1
  197. package/dist/hooks.js +2 -1
  198. package/dist/index.cjs +29 -8
  199. package/dist/index.cjs.map +1 -1
  200. package/dist/index.d.cts +12 -4
  201. package/dist/index.d.ts +12 -4
  202. package/dist/index.d.ts.map +1 -1
  203. package/dist/index.js +24 -3
  204. package/dist/index.js.map +1 -1
  205. package/dist/services/index.d.ts +1 -1
  206. package/dist/services/index.d.ts.map +1 -1
  207. package/dist/services/validation.cjs +52 -26
  208. package/dist/services/validation.cjs.map +1 -1
  209. package/dist/services/validation.d.ts +67 -2
  210. package/dist/services/validation.d.ts.map +1 -1
  211. package/dist/services/validation.js +52 -26
  212. package/dist/services/validation.js.map +1 -1
  213. package/dist/utils/degraded-projections.cjs +37 -12
  214. package/dist/utils/degraded-projections.cjs.map +1 -1
  215. package/dist/utils/degraded-projections.d.ts +39 -3
  216. package/dist/utils/degraded-projections.d.ts.map +1 -1
  217. package/dist/utils/degraded-projections.js +37 -12
  218. package/dist/utils/degraded-projections.js.map +1 -1
  219. package/dist/utils/format-string.cjs +10 -0
  220. package/dist/utils/format-string.cjs.map +1 -0
  221. package/dist/utils/format-string.d.ts +26 -0
  222. package/dist/utils/format-string.d.ts.map +1 -0
  223. package/dist/utils/format-string.js +10 -0
  224. package/dist/utils/format-string.js.map +1 -0
  225. package/dist/utils/iframe-coep.cjs +30 -0
  226. package/dist/utils/iframe-coep.cjs.map +1 -0
  227. package/dist/utils/iframe-coep.d.ts +46 -0
  228. package/dist/utils/iframe-coep.d.ts.map +1 -0
  229. package/dist/utils/iframe-coep.js +30 -0
  230. package/dist/utils/iframe-coep.js.map +1 -0
  231. package/dist/validation.cjs +5 -0
  232. package/dist/validation.cjs.map +1 -1
  233. package/dist/validation.d.cts +2 -1
  234. package/dist/validation.d.ts +2 -1
  235. package/dist/validation.d.ts.map +1 -1
  236. package/dist/validation.js +6 -1
  237. package/package.json +1 -1
  238. package/src/adapters/connector.ts +58 -4
  239. package/src/adapters/index.ts +12 -2
  240. package/src/adapters/macro-run.ts +71 -11
  241. package/src/components/ActionGroupRenderer.tsx +3 -1
  242. package/src/components/AgentCard.tsx +27 -9
  243. package/src/components/AgentHandoff.tsx +4 -1
  244. package/src/components/ArtifactRenderer.tsx +17 -5
  245. package/src/components/AutocompleteDropdown.tsx +8 -6
  246. package/src/components/AutocompleteFormField.tsx +5 -1
  247. package/src/components/BriefingDiff.tsx +11 -3
  248. package/src/components/CarouselRenderer.tsx +4 -2
  249. package/src/components/ChartJSRenderer.tsx +18 -9
  250. package/src/components/ChatPrompt.tsx +13 -8
  251. package/src/components/CodeBlockRenderer.tsx +12 -10
  252. package/src/components/DataPreviewSection.tsx +92 -26
  253. package/src/components/DegradedFallback.tsx +4 -2
  254. package/src/components/FooterRenderer.tsx +3 -1
  255. package/src/components/FormFieldRenderer.tsx +34 -19
  256. package/src/components/FormRenderer.tsx +38 -10
  257. package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
  258. package/src/components/GraphRenderer.tsx +31 -16
  259. package/src/components/IframeFallbackLink.tsx +57 -0
  260. package/src/components/ImageGalleryRenderer.tsx +8 -4
  261. package/src/components/LightboxOverlay.tsx +6 -4
  262. package/src/components/MapRenderer.tsx +57 -20
  263. package/src/components/ModalRenderer.tsx +3 -1
  264. package/src/components/ScratchpadPanel.tsx +95 -44
  265. package/src/components/StreamingUIRenderer.tsx +41 -11
  266. package/src/components/UIResourceRenderer.tsx +176 -67
  267. package/src/components/VerifiedText.tsx +19 -9
  268. package/src/components/VideoRenderer.tsx +26 -4
  269. package/src/components/chart-data-table.ts +68 -14
  270. package/src/context/MCPActionContext.tsx +4 -1
  271. package/src/context/MCPUIConfigContext.tsx +151 -0
  272. package/src/context/MCPUIStringsContext.tsx +1014 -1
  273. package/src/hooks/index.ts +2 -1
  274. package/src/hooks/useStreamingUI.ts +64 -10
  275. package/src/index.ts +38 -0
  276. package/src/services/index.ts +1 -0
  277. package/src/services/validation.ts +131 -32
  278. package/src/solid-jsx-attrs.d.ts +24 -0
  279. package/src/utils/degraded-projections.ts +75 -12
  280. package/src/utils/format-string.ts +33 -0
  281. package/src/utils/iframe-coep.ts +74 -0
  282. package/src/validation.ts +9 -0
@@ -1,17 +1,20 @@
1
- import { createComponent, getNextElement, getNextMarker, spread, mergeProps, use, insert, effect, style, setAttribute, runHydrationEvents, template, className, memo, isServer, setProperty, addEventListener, classList, setStyleProperty, delegateEvents } from "solid-js/web";
1
+ import { createComponent, getNextElement, getNextMarker, spread, mergeProps, use, insert, effect, style, setAttribute, runHydrationEvents, memo, template, className, isServer, setProperty, addEventListener, classList, setStyleProperty, delegateEvents } from "solid-js/web";
2
2
  import { createMemo, onMount, onCleanup, For, Show, createSignal, createEffect } from "solid-js";
3
3
  import { sanitizeHtml, SANITIZE_PROFILES, canSanitizeHtml } from "../utils/sanitize-html.js";
4
4
  import { escapeHtml } from "../utils/escape-html.js";
5
5
  import { safeUrl } from "../utils/safe-url.js";
6
6
  import { SafeHtml } from "./SafeHtml.js";
7
- import { validateComponent, getIframeSandbox, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
7
+ import { validateComponent, getIframeSandbox, isTrustedIframeDomain, DEFAULT_RESOURCE_LIMITS } from "../services/validation.js";
8
8
  import { GenerativeUIErrorBoundary } from "./GenerativeUIErrorBoundary.js";
9
9
  import { markRenderStart, markRenderEnd, PERF_PREFIX } from "../utils/perf.js";
10
10
  import { isDebugEnabled } from "../utils/logger.js";
11
11
  import { getUiResourceStableKey } from "../utils/stable-key.js";
12
12
  import { _registerMount, _unregisterMount, getDuplicateMountReporter } from "../utils/duplicate-mount-registry.js";
13
13
  import { useTelemetry } from "../context/MCPUITelemetryContext.js";
14
- import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
14
+ import { useMCPUIStrings, DEFAULT_MCPUI_STRINGS } from "../context/MCPUIStringsContext.js";
15
+ import { useMCPUIConfig } from "../context/MCPUIConfigContext.js";
16
+ import { shouldSetCredentialless } from "../utils/iframe-coep.js";
17
+ import { IframeFallbackLink } from "./IframeFallbackLink.js";
15
18
  import { GridRenderer } from "./GridRenderer.js";
16
19
  import { FooterRenderer } from "./FooterRenderer.js";
17
20
  import { CarouselRenderer } from "./CarouselRenderer.js";
@@ -33,8 +36,10 @@ import { RenderProvider } from "./RenderContext.js";
33
36
  import { useAction } from "../hooks/useAction.js";
34
37
  import { createResponsiveGrid } from "../hooks/createResponsiveGrid.js";
35
38
  import { marked } from "marked";
36
- var _tmpl$ = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z">`), _tmpl$2 = /* @__PURE__ */ template(`<button data-mcp-ui-action=copy type=button>`), _tmpl$3 = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-green-500"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M5 13l4 4L19 7">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="p-4 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700"><p class="text-red-500 dark:text-red-400 text-sm">Invalid chart data: missing data.datasets`), _tmpl$5 = /* @__PURE__ */ template(`<div class=p-3>`), _tmpl$6 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$7 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium">Chart Error</p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$8 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$9 = /* @__PURE__ */ template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"role=img><img class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$0 = /* @__PURE__ */ template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/><!$><!/>`), _tmpl$1 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">`), _tmpl$10 = /* @__PURE__ */ template(`<tr>`), _tmpl$11 = /* @__PURE__ */ template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6">`), _tmpl$12 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 relative">`), _tmpl$13 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">Copy TSV`), _tmpl$14 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">Download CSV`), _tmpl$15 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">Download JSON`), _tmpl$16 = /* @__PURE__ */ template(`<div class="absolute right-10 top-2 z-10"><button class="opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"title="Export table"aria-label="Export table"aria-haspopup=menu><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg></button><!$><!/>`), _tmpl$17 = /* @__PURE__ */ template(`<span class="ml-2 text-xs font-normal text-gray-400">(virtualized: <!$><!/> rows)`), _tmpl$18 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3 flex-shrink-0"><!$><!/><!$><!/>`), _tmpl$19 = /* @__PURE__ */ template(`<button type=button class="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-sm"aria-label="Clear search">&times;`), _tmpl$20 = /* @__PURE__ */ template(`<div class="relative mb-3"><span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 pointer-events-none text-sm">🔍</span><input type=text class="w-full max-w-xs min-w-[200px] pl-8 pr-8 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none"><!$><!/>`), _tmpl$21 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 mb-2"><!$><!/> result<!$><!/> on <!$><!/>`), _tmpl$22 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>Showing <!$><!/> - <!$><!/> of <!$><!/>`), _tmpl$23 = /* @__PURE__ */ template(`<select class="ml-2 px-1 py-0.5 text-xs border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"data-mcp-ui-action=page-size>`), _tmpl$24 = /* @__PURE__ */ template(`<span class=text-gray-400>/ page`), _tmpl$25 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span><!$><!/>&ndash;<!$><!/> / <!$><!/></span><div class="flex items-center gap-2"><button type=button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"data-mcp-ui-action=page-prev><span aria-hidden=true>&#x25C0;</span></button><span aria-live=polite><!$><!/> / <!$><!/></span><button type=button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"data-mcp-ui-action=page-next><span aria-hidden=true>&#x25B6;</span></button><!$><!/>`), _tmpl$26 = /* @__PURE__ */ template(`<div><!$><!/><div><!$><!/><!$><!/><div role=region tabindex=0><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-100 dark:bg-gray-900 sticky top-0 z-10"><tr></tr></thead><!$><!/></table></div><!$><!/><!$><!/>`), _tmpl$27 = /* @__PURE__ */ template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6 bg-gray-100 dark:bg-gray-900 cursor-pointer select-none hover:bg-gray-200 dark:hover:bg-gray-800 transition-colors"><span class="inline-flex items-center gap-1"><!$><!/><span class="text-[10px] leading-none">`), _tmpl$28 = /* @__PURE__ */ template(`<option>`), _tmpl$29 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$30 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$31 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$32 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$33 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><!$><!/>`), _tmpl$34 = /* @__PURE__ */ template(`<img class="max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity"loading=lazy>`, true, false, false), _tmpl$35 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"></div><div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center italic">`), _tmpl$36 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"class=cursor-zoom-in>`), _tmpl$37 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$38 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"loading=lazy>`, true, false, false), _tmpl$39 = /* @__PURE__ */ template(`<figcaption class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$40 = /* @__PURE__ */ template(`<figure><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class="cursor-zoom-in focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded"><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$41 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$42 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$43 = /* @__PURE__ */ template(`<div class="inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-xs text-yellow-800 dark:text-yellow-200"role=alert aria-label="Component validation warning"><svg xmlns=http://www.w3.org/2000/svg class="w-3.5 h-3.5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1=12 y1=9 x2=12 y2=13></line><line x1=12 y1=17 x2=12.01 y2=17></line></svg><span>Invalid <!$><!/>`), _tmpl$44 = /* @__PURE__ */ template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100">Validation Error</p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$45 = /* @__PURE__ */ template(`<div role=alert class="w-full rounded-lg border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:border-amber-700/50 dark:bg-amber-900/20 dark:text-amber-200">Unsupported component type: <code class=font-mono>`), _tmpl$46 = /* @__PURE__ */ template(`<span aria-hidden=true>`), _tmpl$47 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$48 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"aria-hidden=true>`), _tmpl$49 = /* @__PURE__ */ template(`<button type=button><!$><!/><!$><!/><!$><!/>`), _tmpl$50 = /* @__PURE__ */ template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">Type: <!$><!/>`), _tmpl$51 = /* @__PURE__ */ template(`<div class=mt-3><p class="text-xs font-medium text-red-700 dark:text-red-300">Suggestions:</p><ul class="mt-1 text-xs text-red-600 dark:text-red-400 list-disc list-inside">`), _tmpl$52 = /* @__PURE__ */ template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$53 = /* @__PURE__ */ template(`<div class="relative w-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 group"><!$><!/><div class="flex items-start gap-3"><div class="p-2 bg-red-100 dark:bg-red-900/40 rounded-full shrink-0"><svg class="w-5 h-5 text-red-600 dark:text-red-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-semibold text-red-800 dark:text-red-200">Tool Error: <!$><!/></h4><p class="text-sm text-red-700 dark:text-red-300 mt-1"></p><!$><!/><!$><!/><!$><!/>`), _tmpl$54 = /* @__PURE__ */ template(`<li>`), _tmpl$55 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white capitalize">`), _tmpl$56 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/>`), _tmpl$57 = /* @__PURE__ */ template(`<div><div class="grid gap-4"data-mcp-ui-grid></div><!$><!/>`), _tmpl$58 = /* @__PURE__ */ template(`<div class=min-w-0>`);
39
+ import { formatMCPUIString } from "../utils/format-string.js";
40
+ var _tmpl$ = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z">`), _tmpl$2 = /* @__PURE__ */ template(`<button data-mcp-ui-action=copy type=button>`), _tmpl$3 = /* @__PURE__ */ template(`<svg class="w-3 h-3 text-green-500"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M5 13l4 4L19 7">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="p-4 bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700"><p class="text-red-500 dark:text-red-400 text-sm">`), _tmpl$5 = /* @__PURE__ */ template(`<div class=p-3>`), _tmpl$6 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600">`), _tmpl$7 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center p-4"><div class=text-center><p class="text-red-600 dark:text-red-400 text-sm font-medium"></p><p class="text-gray-600 dark:text-gray-400 text-xs mt-1">`), _tmpl$8 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$9 = /* @__PURE__ */ template(`<div class="w-full h-full p-4"><!$><!/><div class="w-full h-full"role=img><img class="w-full h-auto max-h-[300px] object-contain">`), _tmpl$0 = /* @__PURE__ */ template(`<div class="relative w-full h-full min-h-[300px] bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/><!$><!/><!$><!/>`), _tmpl$1 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">`), _tmpl$10 = /* @__PURE__ */ template(`<tr>`), _tmpl$11 = /* @__PURE__ */ template(`<td class="px-6 py-4 text-sm text-gray-700 dark:text-gray-200 whitespace-normal break-words leading-relaxed first:pl-6 last:pr-6">`), _tmpl$12 = /* @__PURE__ */ template(`<tbody class="bg-white dark:bg-gray-800 relative">`), _tmpl$13 = /* @__PURE__ */ template(`<button class="w-full text-left px-3 py-1.5 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300">`), _tmpl$14 = /* @__PURE__ */ template(`<div class="absolute right-10 top-2 z-10"><button class="opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"aria-haspopup=menu><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"></path></svg></button><!$><!/>`), _tmpl$15 = /* @__PURE__ */ template(`<span class="ml-2 text-xs font-normal text-gray-400">`), _tmpl$16 = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3 flex-shrink-0"><!$><!/><!$><!/>`), _tmpl$17 = /* @__PURE__ */ template(`<button type=button class="absolute right-2 top-1/2 -translate-y-1/2 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 text-sm">&times;`), _tmpl$18 = /* @__PURE__ */ template(`<div class="relative mb-3"><span class="absolute left-3 top-1/2 -translate-y-1/2 text-gray-400 pointer-events-none text-sm">🔍</span><input type=text class="w-full max-w-xs min-w-[200px] pl-8 pr-8 py-1.5 text-sm border border-gray-200 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-900 dark:text-white placeholder-gray-400 focus:border-blue-400 focus:ring-1 focus:ring-blue-400 outline-none"><!$><!/>`), _tmpl$19 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 mb-2">`), _tmpl$20 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>`), _tmpl$21 = /* @__PURE__ */ template(`<select class="ml-2 px-1 py-0.5 text-xs border border-gray-200 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-300"data-mcp-ui-action=page-size>`), _tmpl$22 = /* @__PURE__ */ template(`<span class=text-gray-400>`), _tmpl$23 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span><!$><!/>&ndash;<!$><!/> / <!$><!/></span><div class="flex items-center gap-2"><button type=button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"data-mcp-ui-action=page-prev><span aria-hidden=true>&#x25C0;</span></button><span aria-live=polite><!$><!/> / <!$><!/></span><button type=button class="px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors"data-mcp-ui-action=page-next><span aria-hidden=true>&#x25B6;</span></button><!$><!/>`), _tmpl$24 = /* @__PURE__ */ template(`<div><!$><!/><div><!$><!/><!$><!/><div role=region tabindex=0><table class="min-w-full divide-y divide-gray-200 dark:divide-gray-700 border-separate border-spacing-0"><thead class="bg-gray-100 dark:bg-gray-900 sticky top-0 z-10"><tr></tr></thead><!$><!/></table></div><!$><!/><!$><!/>`), _tmpl$25 = /* @__PURE__ */ template(`<th scope=col class="px-6 py-3 text-left text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 first:pl-6 last:pr-6 bg-gray-100 dark:bg-gray-900 cursor-pointer select-none hover:bg-gray-200 dark:hover:bg-gray-800 transition-colors"><span class="inline-flex items-center gap-1"><!$><!/><span class="text-[10px] leading-none">`), _tmpl$26 = /* @__PURE__ */ template(`<option>`), _tmpl$27 = /* @__PURE__ */ template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$28 = /* @__PURE__ */ template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$29 = /* @__PURE__ */ template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$30 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><div class="flex flex-col h-full justify-between"><div><p class="text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide"></p><div class="mt-2 flex items-baseline"><p class="text-2xl font-semibold text-gray-900 dark:text-white"></p><!$><!/></div></div><!$><!/><!$><!/>`), _tmpl$31 = /* @__PURE__ */ template(`<div class="relative w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 p-4 group"><!$><!/><!$><!/>`), _tmpl$32 = /* @__PURE__ */ template(`<img class="max-w-full max-h-[400px] object-contain rounded shadow-sm hover:opacity-90 transition-opacity"loading=lazy>`, true, false, false), _tmpl$33 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"></div><div class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center italic">`), _tmpl$34 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"class=cursor-zoom-in>`), _tmpl$35 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$36 = /* @__PURE__ */ template(`<div class="w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col"><!$><!/><iframe class="w-full border-0 flex-1"loading=lazy></iframe><!$><!/>`, true, false, false), _tmpl$37 = /* @__PURE__ */ template(`<figcaption class="p-3 border-t border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-800"><p class="text-sm text-gray-600 dark:text-gray-400 text-center">`), _tmpl$38 = /* @__PURE__ */ template(`<figure><div class="flex-1 flex items-center justify-center p-4 bg-gray-50 dark:bg-gray-900 min-h-[200px]"><a target=_blank rel="noopener noreferrer"class="cursor-zoom-in focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 rounded"><img class="max-w-full max-h-[500px] object-contain rounded shadow-sm hover:opacity-95 transition-opacity"loading=lazy></a></div><!$><!/>`, true, false, false), _tmpl$39 = /* @__PURE__ */ template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$40 = /* @__PURE__ */ template(`<a target=_blank rel="noopener noreferrer"><div class="p-2 bg-blue-50 dark:bg-blue-900/30 rounded-full text-blue-600 dark:text-blue-400 group-hover:bg-blue-100 dark:group-hover:bg-blue-900/50 shrink-0 transition-colors"aria-hidden=true><svg xmlns=http://www.w3.org/2000/svg class="w-5 h-5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-medium text-gray-900 dark:text-white truncate group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"></h4><!$><!/></div><svg xmlns=http://www.w3.org/2000/svg class="w-4 h-4 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-gray-300 shrink-0 transition-colors"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1=10 y1=14 x2=21 y2=3>`), _tmpl$41 = /* @__PURE__ */ template(`<div class="inline-flex items-center gap-1.5 px-2 py-1 rounded-md bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 text-xs text-yellow-800 dark:text-yellow-200"role=alert><svg xmlns=http://www.w3.org/2000/svg class="w-3.5 h-3.5"viewBox="0 0 24 24"fill=none stroke=currentColor stroke-width=2 stroke-linecap=round stroke-linejoin=round aria-hidden=true><path d="M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"></path><line x1=12 y1=9 x2=12 y2=13></line><line x1=12 y1=17 x2=12.01 y2=17></line></svg><span>`), _tmpl$42 = /* @__PURE__ */ template(`<div class="w-full h-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4"><p class="text-sm font-medium text-red-900 dark:text-red-100"></p><p class="text-xs text-red-700 dark:text-red-300 mt-1">`), _tmpl$43 = /* @__PURE__ */ template(`<div role=alert class="w-full rounded-lg border border-amber-300 bg-amber-50 px-3 py-2 text-sm text-amber-800 dark:border-amber-700/50 dark:bg-amber-900/20 dark:text-amber-200"><!$><!/> <code class=font-mono>`), _tmpl$44 = /* @__PURE__ */ template(`<span aria-hidden=true>`), _tmpl$45 = /* @__PURE__ */ template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$46 = /* @__PURE__ */ template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"aria-hidden=true>`), _tmpl$47 = /* @__PURE__ */ template(`<button type=button><!$><!/><!$><!/><!$><!/>`), _tmpl$48 = /* @__PURE__ */ template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">`), _tmpl$49 = /* @__PURE__ */ template(`<div class=mt-3><p class="text-xs font-medium text-red-700 dark:text-red-300"></p><ul class="mt-1 text-xs text-red-600 dark:text-red-400 list-disc list-inside">`), _tmpl$50 = /* @__PURE__ */ template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$51 = /* @__PURE__ */ template(`<div class="relative w-full bg-red-50 dark:bg-red-900/20 border border-red-200 dark:border-red-800 rounded-lg p-4 group"><!$><!/><div class="flex items-start gap-3"><div class="p-2 bg-red-100 dark:bg-red-900/40 rounded-full shrink-0"><svg class="w-5 h-5 text-red-600 dark:text-red-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"></path></svg></div><div class="flex-1 min-w-0"><h4 class="text-sm font-semibold text-red-800 dark:text-red-200"></h4><p class="text-sm text-red-700 dark:text-red-300 mt-1"></p><!$><!/><!$><!/><!$><!/>`), _tmpl$52 = /* @__PURE__ */ template(`<li>`), _tmpl$53 = /* @__PURE__ */ template(`<div class="px-4 py-2 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900"><h3 class="text-sm font-semibold text-gray-900 dark:text-white capitalize">`), _tmpl$54 = /* @__PURE__ */ template(`<div class="w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden"><!$><!/><!$><!/>`), _tmpl$55 = /* @__PURE__ */ template(`<div><div class="grid gap-4"data-mcp-ui-grid></div><!$><!/>`), _tmpl$56 = /* @__PURE__ */ template(`<div class=min-w-0>`);
37
41
  function CopyButton(props) {
42
+ const strings = useMCPUIStrings();
38
43
  const [copied, setCopied] = createSignal(false);
39
44
  const handleCopy = async () => {
40
45
  try {
@@ -63,7 +68,7 @@ function CopyButton(props) {
63
68
  }
64
69
  }));
65
70
  effect((_p$) => {
66
- var _v$ = `${positionClasses()} opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm z-10`, _v$2 = props.title || "Copy", _v$3 = props.title || "Copy";
71
+ var _v$ = `${positionClasses()} opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm z-10`, _v$2 = props.title || strings.copy, _v$3 = props.title || strings.copy;
67
72
  _v$ !== _p$.e && className(_el$, _p$.e = _v$);
68
73
  _v$2 !== _p$.t && setAttribute(_el$, "title", _p$.t = _v$2);
69
74
  _v$3 !== _p$.a && setAttribute(_el$, "aria-label", _p$.a = _v$3);
@@ -79,6 +84,7 @@ function CopyButton(props) {
79
84
  }
80
85
  function ChartRenderer(props) {
81
86
  var _a, _b;
87
+ const strings = useMCPUIStrings();
82
88
  const [useNative, setUseNative] = createSignal(false);
83
89
  const [iframeUrl, setIframeUrl] = createSignal();
84
90
  const [isLoading, setIsLoading] = createSignal(true);
@@ -91,6 +97,12 @@ function ChartRenderer(props) {
91
97
  return ((_a2 = params()) == null ? void 0 : _a2.renderer) || "auto";
92
98
  };
93
99
  const allowQuickchart = () => props.allowQuickchartFallback === true;
100
+ const chartImageAlt = () => {
101
+ var _a2;
102
+ return ((_a2 = params()) == null ? void 0 : _a2.title) ? formatMCPUIString(strings.chartWithTitleAlt, {
103
+ title: String(params().title)
104
+ }) : strings.chartVisualizationAlt;
105
+ };
94
106
  const signalBlockedFallback = (reason) => {
95
107
  setDegraded(true);
96
108
  setIsLoading(false);
@@ -104,7 +116,11 @@ function ChartRenderer(props) {
104
116
  });
105
117
  };
106
118
  if (!((_b = (_a = params()) == null ? void 0 : _a.data) == null ? void 0 : _b.datasets)) {
107
- return getNextElement(_tmpl$4);
119
+ return (() => {
120
+ var _el$4 = getNextElement(_tmpl$4), _el$5 = _el$4.firstChild;
121
+ insert(_el$5, () => strings.chartInvalidData);
122
+ return _el$4;
123
+ })();
108
124
  }
109
125
  createEffect(async () => {
110
126
  const pref = rendererPref();
@@ -121,7 +137,7 @@ function ChartRenderer(props) {
121
137
  setUseNative(true);
122
138
  setIsLoading(false);
123
139
  } else {
124
- setError("Chart.js is not available. Install chart.js peer dependency.");
140
+ setError(strings.chartJsUnavailable);
125
141
  setIsLoading(false);
126
142
  }
127
143
  } else {
@@ -161,61 +177,68 @@ function ChartRenderer(props) {
161
177
  },
162
178
  get fallback() {
163
179
  return (() => {
164
- var _el$5 = getNextElement(_tmpl$0), _el$16 = _el$5.firstChild, [_el$17, _co$2] = getNextMarker(_el$16.nextSibling), _el$18 = _el$17.nextSibling, [_el$19, _co$3] = getNextMarker(_el$18.nextSibling), _el$20 = _el$19.nextSibling, [_el$21, _co$4] = getNextMarker(_el$20.nextSibling), _el$22 = _el$21.nextSibling, [_el$23, _co$5] = getNextMarker(_el$22.nextSibling);
165
- insert(_el$5, createComponent(Show, {
180
+ var _el$6 = getNextElement(_tmpl$0), _el$17 = _el$6.firstChild, [_el$18, _co$2] = getNextMarker(_el$17.nextSibling), _el$19 = _el$18.nextSibling, [_el$20, _co$3] = getNextMarker(_el$19.nextSibling), _el$21 = _el$20.nextSibling, [_el$22, _co$4] = getNextMarker(_el$21.nextSibling), _el$23 = _el$22.nextSibling, [_el$24, _co$5] = getNextMarker(_el$23.nextSibling);
181
+ insert(_el$6, createComponent(Show, {
166
182
  get when() {
167
183
  return degraded();
168
184
  },
169
185
  get children() {
170
- var _el$6 = getNextElement(_tmpl$5);
171
- insert(_el$6, createComponent(DegradedFallback, mergeProps({
172
- message: "Interactive chart unavailable — install the chart.js peer dependency, or set allowQuickchartFallback to use the external quickchart.io renderer.",
173
- caption: "Showing the chart data as a table."
174
- }, () => chartToDegradedTable(params() ?? {}))));
175
- return _el$6;
186
+ var _el$7 = getNextElement(_tmpl$5);
187
+ insert(_el$7, createComponent(DegradedFallback, mergeProps({
188
+ get message() {
189
+ return strings.chartIframeUnavailable;
190
+ },
191
+ get caption() {
192
+ return strings.chartQuickchartCaption;
193
+ }
194
+ }, () => chartToDegradedTable(params() ?? {}, {
195
+ series: strings.degradedSeries
196
+ }))));
197
+ return _el$7;
176
198
  }
177
- }), _el$17, _co$2);
178
- insert(_el$5, createComponent(Show, {
199
+ }), _el$18, _co$2);
200
+ insert(_el$6, createComponent(Show, {
179
201
  get when() {
180
202
  return isLoading();
181
203
  },
182
204
  get children() {
183
205
  return getNextElement(_tmpl$6);
184
206
  }
185
- }), _el$19, _co$3);
186
- insert(_el$5, createComponent(Show, {
207
+ }), _el$20, _co$3);
208
+ insert(_el$6, createComponent(Show, {
187
209
  get when() {
188
210
  return error();
189
211
  },
190
212
  get children() {
191
- var _el$8 = getNextElement(_tmpl$7), _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
192
- insert(_el$1, error);
193
- return _el$8;
213
+ var _el$9 = getNextElement(_tmpl$7), _el$0 = _el$9.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling;
214
+ insert(_el$1, () => strings.chartError);
215
+ insert(_el$10, error);
216
+ return _el$9;
194
217
  }
195
- }), _el$21, _co$4);
196
- insert(_el$5, createComponent(Show, {
218
+ }), _el$22, _co$4);
219
+ insert(_el$6, createComponent(Show, {
197
220
  get when() {
198
221
  return memo(() => !!iframeUrl())() && !error();
199
222
  },
200
223
  get children() {
201
- var _el$10 = getNextElement(_tmpl$9), _el$14 = _el$10.firstChild, [_el$15, _co$] = getNextMarker(_el$14.nextSibling), _el$12 = _el$15.nextSibling, _el$13 = _el$12.firstChild;
202
- insert(_el$10, createComponent(Show, {
224
+ var _el$11 = getNextElement(_tmpl$9), _el$15 = _el$11.firstChild, [_el$16, _co$] = getNextMarker(_el$15.nextSibling), _el$13 = _el$16.nextSibling, _el$14 = _el$13.firstChild;
225
+ insert(_el$11, createComponent(Show, {
203
226
  get when() {
204
227
  var _a2;
205
228
  return (_a2 = params()) == null ? void 0 : _a2.title;
206
229
  },
207
230
  get children() {
208
- var _el$11 = getNextElement(_tmpl$8);
209
- insert(_el$11, () => {
231
+ var _el$12 = getNextElement(_tmpl$8);
232
+ insert(_el$12, () => {
210
233
  var _a2;
211
234
  return (_a2 = params()) == null ? void 0 : _a2.title;
212
235
  });
213
- return _el$11;
236
+ return _el$12;
214
237
  }
215
- }), _el$15, _co$);
216
- _el$13.addEventListener("error", () => {
238
+ }), _el$16, _co$);
239
+ _el$14.addEventListener("error", () => {
217
240
  var _a2;
218
- setError("Failed to load chart");
241
+ setError(strings.chartLoadFailed);
219
242
  (_a2 = props.onError) == null ? void 0 : _a2.call(props, {
220
243
  type: "render",
221
244
  message: "Chart rendering failed",
@@ -223,21 +246,20 @@ function ChartRenderer(props) {
223
246
  });
224
247
  });
225
248
  effect((_p$) => {
226
- var _a2, _b2, _c, _d;
227
- var _v$4 = ((_a2 = params()) == null ? void 0 : _a2.title) ? `Chart: ${(_b2 = params()) == null ? void 0 : _b2.title}` : "Chart visualization", _v$5 = iframeUrl(), _v$6 = ((_c = params()) == null ? void 0 : _c.title) ? `Chart: ${(_d = params()) == null ? void 0 : _d.title}` : "Chart visualization";
228
- _v$4 !== _p$.e && setAttribute(_el$12, "aria-label", _p$.e = _v$4);
229
- _v$5 !== _p$.t && setAttribute(_el$13, "src", _p$.t = _v$5);
230
- _v$6 !== _p$.a && setAttribute(_el$13, "alt", _p$.a = _v$6);
249
+ var _v$4 = chartImageAlt(), _v$5 = iframeUrl(), _v$6 = chartImageAlt();
250
+ _v$4 !== _p$.e && setAttribute(_el$13, "aria-label", _p$.e = _v$4);
251
+ _v$5 !== _p$.t && setAttribute(_el$14, "src", _p$.t = _v$5);
252
+ _v$6 !== _p$.a && setAttribute(_el$14, "alt", _p$.a = _v$6);
231
253
  return _p$;
232
254
  }, {
233
255
  e: void 0,
234
256
  t: void 0,
235
257
  a: void 0
236
258
  });
237
- return _el$10;
259
+ return _el$11;
238
260
  }
239
- }), _el$23, _co$5);
240
- return _el$5;
261
+ }), _el$24, _co$5);
262
+ return _el$6;
241
263
  })();
242
264
  },
243
265
  get children() {
@@ -304,13 +326,15 @@ function highlightQuery(html, query) {
304
326
  }
305
327
  return template2.innerHTML;
306
328
  }
307
- function defaultCitationChip(pageNum, fileName, verified = true) {
329
+ function defaultCitationChip(pageNum, fileName, verified = true, viewSourceLabel = DEFAULT_MCPUI_STRINGS.citationViewSource) {
308
330
  const safeDocName = encodeURIComponent(fileName || "");
309
331
  const label = fileName ? `${fileName} - ${pageNum}` : `${pageNum}`;
310
332
  if (!verified) {
311
333
  return `<span class="citation-ref inline-flex items-center gap-0.5 align-middle opacity-60"><span class="text-gray-500 line-through">[${label}]</span></span>`;
312
334
  }
313
- return ['<span class="citation-ref inline-flex items-center gap-0.5 align-middle">', `<span class="text-gray-500">[${label}]</span>`, '<button class="inline-flex items-center ml-0.5 px-1 py-0.5 text-xs bg-gray-800 hover:bg-gray-700 border border-gray-600 hover:border-teal-500 rounded cursor-pointer transition-colors align-middle"', ` data-citation-page="${pageNum}"`, ` data-citation-doc="${safeDocName}"`, ' data-citation-verified="true"', ` title="View source - ${label}">`, '<svg class="w-3 h-3" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>', "</button>", "</span>"].join("");
335
+ return ['<span class="citation-ref inline-flex items-center gap-0.5 align-middle">', `<span class="text-gray-500">[${label}]</span>`, '<button class="inline-flex items-center ml-0.5 px-1 py-0.5 text-xs bg-gray-800 hover:bg-gray-700 border border-gray-600 hover:border-teal-500 rounded cursor-pointer transition-colors align-middle"', ` data-citation-page="${pageNum}"`, ` data-citation-doc="${safeDocName}"`, ' data-citation-verified="true"', ` title="${escapeHtml(formatMCPUIString(viewSourceLabel, {
336
+ label
337
+ }))}">`, '<svg class="w-3 h-3" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>', "</button>", "</span>"].join("");
314
338
  }
315
339
  function transformCellCitations(text, ctx) {
316
340
  let out = text.replace(new RegExp("(?<![p.])\\[(\\d{1,2})\\](?!\\()", "g"), "[📄 CITATION $1]");
@@ -320,8 +344,10 @@ function transformCellCitations(text, ctx) {
320
344
  const id = parseInt(idStr, 10);
321
345
  const mapping = ctx.map[id] ?? ctx.map[String(id)];
322
346
  if (ctx.render) return ctx.render(id, mapping);
323
- if (mapping) return defaultCitationChip(mapping.page, mapping.file ?? "", true);
324
- return Object.keys(ctx.map).length > 0 ? "" : `[réf. ${id}]`;
347
+ if (mapping) return defaultCitationChip(mapping.page, mapping.file ?? "", true, ctx.viewSourceLabel);
348
+ return Object.keys(ctx.map).length > 0 ? "" : formatMCPUIString(ctx.unresolvedLabel ?? DEFAULT_MCPUI_STRINGS.citationUnresolved, {
349
+ id
350
+ });
325
351
  });
326
352
  }
327
353
  function renderCellValue(value, citationCtx) {
@@ -381,7 +407,14 @@ function TableRenderer(props) {
381
407
  const strings = useMCPUIStrings();
382
408
  const citationCtx = tableParams.citationMap ? {
383
409
  map: tableParams.citationMap,
384
- render: tableParams.citationRender
410
+ render: tableParams.citationRender,
411
+ // Getters, not snapshots: cells read the provider's current wording.
412
+ get unresolvedLabel() {
413
+ return strings.citationUnresolved;
414
+ },
415
+ get viewSourceLabel() {
416
+ return strings.citationViewSource;
417
+ }
385
418
  } : void 0;
386
419
  const allRows = () => tableParams.rows || [];
387
420
  const columns = () => tableParams.columns || [];
@@ -417,7 +450,7 @@ function TableRenderer(props) {
417
450
  if (isNum) {
418
451
  cmp = (Number(va) || 0) - (Number(vb) || 0);
419
452
  } else {
420
- cmp = String(va).localeCompare(String(vb), "fr", {
453
+ cmp = String(va).localeCompare(String(vb), strings.locale, {
421
454
  sensitivity: "base"
422
455
  });
423
456
  }
@@ -432,7 +465,7 @@ function TableRenderer(props) {
432
465
  const [debouncedQuery, setDebouncedQuery] = createSignal("");
433
466
  let searchTimer = null;
434
467
  const isSearchable = () => tableParams.searchable !== false;
435
- const searchPlaceholder = () => tableParams.searchPlaceholder || "Rechercher dans le tableau...";
468
+ const searchPlaceholder = () => tableParams.searchPlaceholder || strings.tableSearchPlaceholder;
436
469
  const handleSearch = (value) => {
437
470
  setSearchQuery(value);
438
471
  if (searchTimer) clearTimeout(searchTimer);
@@ -490,7 +523,7 @@ function TableRenderer(props) {
490
523
  }
491
524
  opts.push({
492
525
  value: 0,
493
- label: "All"
526
+ label: strings.paginationAllRows
494
527
  });
495
528
  return opts;
496
529
  };
@@ -617,30 +650,30 @@ ${dataRows}`;
617
650
  };
618
651
  const tableId = `table-${Math.random().toString(36).slice(2, 9)}`;
619
652
  const StandardTableBody = () => (() => {
620
- var _el$24 = getNextElement(_tmpl$1);
621
- insert(_el$24, createComponent(For, {
653
+ var _el$25 = getNextElement(_tmpl$1);
654
+ insert(_el$25, createComponent(For, {
622
655
  get each() {
623
656
  return clientVisibleRows().slice(0, DEFAULT_RESOURCE_LIMITS.maxTableRows);
624
657
  },
625
658
  children: (row, i) => (() => {
626
- var _el$25 = getNextElement(_tmpl$10);
627
- insert(_el$25, createComponent(For, {
659
+ var _el$26 = getNextElement(_tmpl$10);
660
+ insert(_el$26, createComponent(For, {
628
661
  get each() {
629
662
  return tableParams.columns;
630
663
  },
631
664
  children: (column) => (() => {
632
- var _el$26 = getNextElement(_tmpl$11);
633
- insert(_el$26, createComponent(SafeHtml, {
665
+ var _el$27 = getNextElement(_tmpl$11);
666
+ insert(_el$27, createComponent(SafeHtml, {
634
667
  html: () => highlightQuery(renderCellValue(row[column.key], citationCtx), debouncedQuery())
635
668
  }));
636
- return _el$26;
669
+ return _el$27;
637
670
  })()
638
671
  }));
639
- effect(() => className(_el$25, `hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors ${i() % 2 === 0 ? "bg-white dark:bg-gray-800" : "bg-gray-50/30 dark:bg-gray-800/50"}`));
640
- return _el$25;
672
+ effect(() => className(_el$26, `hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors ${i() % 2 === 0 ? "bg-white dark:bg-gray-800" : "bg-gray-50/30 dark:bg-gray-800/50"}`));
673
+ return _el$26;
641
674
  })()
642
675
  }));
643
- return _el$24;
676
+ return _el$25;
644
677
  })();
645
678
  const VirtualizedTableBody = () => {
646
679
  const v = virtualizer();
@@ -650,72 +683,76 @@ ${dataRows}`;
650
683
  const opts = virtualizeOpts();
651
684
  const rowHeight = opts.rowHeight ?? 48;
652
685
  return (() => {
653
- var _el$27 = getNextElement(_tmpl$12);
654
- setStyleProperty(_el$27, "height", `${totalSize}px`);
655
- insert(_el$27, createComponent(For, {
686
+ var _el$28 = getNextElement(_tmpl$12);
687
+ setStyleProperty(_el$28, "height", `${totalSize}px`);
688
+ insert(_el$28, createComponent(For, {
656
689
  each: items,
657
690
  children: (virtualRow) => {
658
691
  const row = tableParams.rows[virtualRow.index];
659
692
  return (() => {
660
- var _el$28 = getNextElement(_tmpl$10);
661
- setStyleProperty(_el$28, "height", `${rowHeight}px`);
662
- insert(_el$28, createComponent(For, {
693
+ var _el$29 = getNextElement(_tmpl$10);
694
+ setStyleProperty(_el$29, "height", `${rowHeight}px`);
695
+ insert(_el$29, createComponent(For, {
663
696
  get each() {
664
697
  return tableParams.columns;
665
698
  },
666
699
  children: (column) => (() => {
667
- var _el$29 = getNextElement(_tmpl$11);
668
- insert(_el$29, createComponent(SafeHtml, {
700
+ var _el$30 = getNextElement(_tmpl$11);
701
+ insert(_el$30, createComponent(SafeHtml, {
669
702
  html: () => highlightQuery(renderCellValue(row[column.key], citationCtx), debouncedQuery())
670
703
  }));
671
- return _el$29;
704
+ return _el$30;
672
705
  })()
673
706
  }));
674
707
  effect((_p$) => {
675
708
  var _v$7 = `hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors absolute left-0 right-0 ${virtualRow.index % 2 === 0 ? "bg-white dark:bg-gray-800" : "bg-gray-50/30 dark:bg-gray-800/50"}`, _v$8 = `translateY(${virtualRow.start}px)`;
676
- _v$7 !== _p$.e && className(_el$28, _p$.e = _v$7);
677
- _v$8 !== _p$.t && setStyleProperty(_el$28, "transform", _p$.t = _v$8);
709
+ _v$7 !== _p$.e && className(_el$29, _p$.e = _v$7);
710
+ _v$8 !== _p$.t && setStyleProperty(_el$29, "transform", _p$.t = _v$8);
678
711
  return _p$;
679
712
  }, {
680
713
  e: void 0,
681
714
  t: void 0
682
715
  });
683
- return _el$28;
716
+ return _el$29;
684
717
  })();
685
718
  }
686
719
  }));
687
- return _el$27;
720
+ return _el$28;
688
721
  })();
689
722
  };
690
723
  return createComponent(ExpandableWrapper, {
691
724
  get title() {
692
- return tableParams.title || "Table";
725
+ return tableParams.title || strings.tableTitle;
693
726
  },
694
727
  get copyData() {
695
728
  return getTableCSV();
696
729
  },
697
- copyLabel: "Copy table (CSV)",
730
+ get copyLabel() {
731
+ return strings.tableCopyCsv;
732
+ },
698
733
  get toolbarVariant() {
699
734
  return props.toolbarVariant;
700
735
  },
701
736
  onExpandedChange: setSelfExpanded,
702
737
  get children() {
703
- var _el$30 = getNextElement(_tmpl$26), _el$114 = _el$30.firstChild, [_el$115, _co$26] = getNextMarker(_el$114.nextSibling), _el$38 = _el$115.nextSibling, _el$106 = _el$38.firstChild, [_el$107, _co$22] = getNextMarker(_el$106.nextSibling), _el$108 = _el$107.nextSibling, [_el$109, _co$23] = getNextMarker(_el$108.nextSibling), _el$64 = _el$109.nextSibling, _el$65 = _el$64.firstChild, _el$66 = _el$65.firstChild, _el$67 = _el$66.firstChild, _el$68 = _el$66.nextSibling, [_el$69, _co$12] = getNextMarker(_el$68.nextSibling), _el$110 = _el$64.nextSibling, [_el$111, _co$24] = getNextMarker(_el$110.nextSibling), _el$112 = _el$111.nextSibling, [_el$113, _co$25] = getNextMarker(_el$112.nextSibling);
704
- insert(_el$30, createComponent(Show, {
738
+ var _el$31 = getNextElement(_tmpl$24), _el$92 = _el$31.firstChild, [_el$93, _co$19] = getNextMarker(_el$92.nextSibling), _el$39 = _el$93.nextSibling, _el$84 = _el$39.firstChild, [_el$85, _co$15] = getNextMarker(_el$84.nextSibling), _el$86 = _el$85.nextSibling, [_el$87, _co$16] = getNextMarker(_el$86.nextSibling), _el$53 = _el$87.nextSibling, _el$54 = _el$53.firstChild, _el$55 = _el$54.firstChild, _el$56 = _el$55.firstChild, _el$57 = _el$55.nextSibling, [_el$58, _co$0] = getNextMarker(_el$57.nextSibling), _el$88 = _el$53.nextSibling, [_el$89, _co$17] = getNextMarker(_el$88.nextSibling), _el$90 = _el$89.nextSibling, [_el$91, _co$18] = getNextMarker(_el$90.nextSibling);
739
+ insert(_el$31, createComponent(Show, {
705
740
  when: exportable,
706
741
  get fallback() {
707
742
  return createComponent(CopyButton, {
708
743
  getText: getTableCSV,
709
- title: "Copy table (CSV)",
744
+ get title() {
745
+ return strings.tableCopyCsv;
746
+ },
710
747
  position: "top-right"
711
748
  });
712
749
  },
713
750
  get children() {
714
- var _el$31 = getNextElement(_tmpl$16), _el$32 = _el$31.firstChild, _el$36 = _el$32.nextSibling, [_el$37, _co$6] = getNextMarker(_el$36.nextSibling);
715
- _el$32.$$click = () => setShowExportMenu(!showExportMenu());
751
+ var _el$32 = getNextElement(_tmpl$14), _el$33 = _el$32.firstChild, _el$37 = _el$33.nextSibling, [_el$38, _co$6] = getNextMarker(_el$37.nextSibling);
752
+ _el$33.$$click = () => setShowExportMenu(!showExportMenu());
716
753
  var _ref$ = exportTriggerRef;
717
- typeof _ref$ === "function" ? use(_ref$, _el$32) : exportTriggerRef = _el$32;
718
- insert(_el$31, createComponent(PortalDropdownMenu, {
754
+ typeof _ref$ === "function" ? use(_ref$, _el$33) : exportTriggerRef = _el$33;
755
+ insert(_el$32, createComponent(PortalDropdownMenu, {
719
756
  get open() {
720
757
  return showExportMenu();
721
758
  },
@@ -728,136 +765,154 @@ ${dataRows}`;
728
765
  return exportFormats.includes("tsv");
729
766
  },
730
767
  get children() {
731
- var _el$33 = getNextElement(_tmpl$13);
732
- _el$33.$$click = () => handleExport("tsv");
768
+ var _el$34 = getNextElement(_tmpl$13);
769
+ _el$34.$$click = () => handleExport("tsv");
770
+ insert(_el$34, () => strings.tableCopyTsv);
733
771
  runHydrationEvents();
734
- return _el$33;
772
+ return _el$34;
735
773
  }
736
774
  }), createComponent(Show, {
737
775
  get when() {
738
776
  return exportFormats.includes("csv");
739
777
  },
740
778
  get children() {
741
- var _el$34 = getNextElement(_tmpl$14);
742
- _el$34.$$click = () => handleExport("csv");
779
+ var _el$35 = getNextElement(_tmpl$13);
780
+ _el$35.$$click = () => handleExport("csv");
781
+ insert(_el$35, () => strings.tableDownloadCsv);
743
782
  runHydrationEvents();
744
- return _el$34;
783
+ return _el$35;
745
784
  }
746
785
  }), createComponent(Show, {
747
786
  get when() {
748
787
  return exportFormats.includes("json");
749
788
  },
750
789
  get children() {
751
- var _el$35 = getNextElement(_tmpl$15);
752
- _el$35.$$click = () => handleExport("json");
790
+ var _el$36 = getNextElement(_tmpl$13);
791
+ _el$36.$$click = () => handleExport("json");
792
+ insert(_el$36, () => strings.tableDownloadJson);
753
793
  runHydrationEvents();
754
- return _el$35;
794
+ return _el$36;
755
795
  }
756
796
  })];
757
797
  }
758
- }), _el$37, _co$6);
759
- effect(() => setAttribute(_el$32, "aria-expanded", showExportMenu()));
798
+ }), _el$38, _co$6);
799
+ effect((_p$) => {
800
+ var _v$9 = strings.tableExport, _v$0 = strings.tableExport, _v$1 = showExportMenu();
801
+ _v$9 !== _p$.e && setAttribute(_el$33, "title", _p$.e = _v$9);
802
+ _v$0 !== _p$.t && setAttribute(_el$33, "aria-label", _p$.t = _v$0);
803
+ _v$1 !== _p$.a && setAttribute(_el$33, "aria-expanded", _p$.a = _v$1);
804
+ return _p$;
805
+ }, {
806
+ e: void 0,
807
+ t: void 0,
808
+ a: void 0
809
+ });
760
810
  runHydrationEvents();
761
- return _el$31;
811
+ return _el$32;
762
812
  }
763
- }), _el$115, _co$26);
764
- insert(_el$38, createComponent(Show, {
813
+ }), _el$93, _co$19);
814
+ insert(_el$39, createComponent(Show, {
765
815
  get when() {
766
816
  return tableParams.title;
767
817
  },
768
818
  get children() {
769
- var _el$39 = getNextElement(_tmpl$18), _el$45 = _el$39.firstChild, [_el$46, _co$8] = getNextMarker(_el$45.nextSibling), _el$47 = _el$46.nextSibling, [_el$48, _co$9] = getNextMarker(_el$47.nextSibling);
770
- setAttribute(_el$39, "id", `${tableId}-title`);
771
- insert(_el$39, () => tableParams.title, _el$46, _co$8);
772
- insert(_el$39, createComponent(Show, {
819
+ var _el$40 = getNextElement(_tmpl$16), _el$42 = _el$40.firstChild, [_el$43, _co$7] = getNextMarker(_el$42.nextSibling), _el$44 = _el$43.nextSibling, [_el$45, _co$8] = getNextMarker(_el$44.nextSibling);
820
+ setAttribute(_el$40, "id", `${tableId}-title`);
821
+ insert(_el$40, () => tableParams.title, _el$43, _co$7);
822
+ insert(_el$40, createComponent(Show, {
773
823
  get when() {
774
824
  return isVirtualizing();
775
825
  },
776
826
  get children() {
777
- var _el$40 = getNextElement(_tmpl$17), _el$41 = _el$40.firstChild, _el$43 = _el$41.nextSibling, [_el$44, _co$7] = getNextMarker(_el$43.nextSibling);
778
- _el$44.nextSibling;
779
- insert(_el$40, () => {
827
+ var _el$41 = getNextElement(_tmpl$15);
828
+ insert(_el$41, () => {
780
829
  var _a;
781
- return (_a = tableParams.rows) == null ? void 0 : _a.length;
782
- }, _el$44, _co$7);
783
- return _el$40;
830
+ return formatMCPUIString(strings.tableVirtualizedRows, {
831
+ count: ((_a = tableParams.rows) == null ? void 0 : _a.length) ?? 0
832
+ });
833
+ });
834
+ return _el$41;
784
835
  }
785
- }), _el$48, _co$9);
786
- return _el$39;
836
+ }), _el$45, _co$8);
837
+ return _el$40;
787
838
  }
788
- }), _el$107, _co$22);
789
- insert(_el$38, createComponent(Show, {
839
+ }), _el$85, _co$15);
840
+ insert(_el$39, createComponent(Show, {
790
841
  get when() {
791
842
  return isSearchable();
792
843
  },
793
844
  get children() {
794
845
  return [(() => {
795
- var _el$49 = getNextElement(_tmpl$20), _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling, _el$53 = _el$51.nextSibling, [_el$54, _co$0] = getNextMarker(_el$53.nextSibling);
796
- _el$51.$$input = (e) => handleSearch(e.currentTarget.value);
797
- insert(_el$49, createComponent(Show, {
846
+ var _el$46 = getNextElement(_tmpl$18), _el$47 = _el$46.firstChild, _el$48 = _el$47.nextSibling, _el$50 = _el$48.nextSibling, [_el$51, _co$9] = getNextMarker(_el$50.nextSibling);
847
+ _el$48.$$input = (e) => handleSearch(e.currentTarget.value);
848
+ insert(_el$46, createComponent(Show, {
798
849
  get when() {
799
850
  return searchQuery();
800
851
  },
801
852
  get children() {
802
- var _el$52 = getNextElement(_tmpl$19);
803
- _el$52.$$click = () => {
853
+ var _el$49 = getNextElement(_tmpl$17);
854
+ _el$49.$$click = () => {
804
855
  handleSearch("");
805
856
  setSearchQuery("");
806
857
  setDebouncedQuery("");
807
858
  };
859
+ effect(() => setAttribute(_el$49, "aria-label", strings.tableClearSearch));
808
860
  runHydrationEvents();
809
- return _el$52;
861
+ return _el$49;
810
862
  }
811
- }), _el$54, _co$0);
812
- effect(() => setAttribute(_el$51, "placeholder", searchPlaceholder()));
813
- effect(() => setProperty(_el$51, "value", searchQuery()));
863
+ }), _el$51, _co$9);
864
+ effect(() => setAttribute(_el$48, "placeholder", searchPlaceholder()));
865
+ effect(() => setProperty(_el$48, "value", searchQuery()));
814
866
  runHydrationEvents();
815
- return _el$49;
867
+ return _el$46;
816
868
  })(), createComponent(Show, {
817
869
  get when() {
818
870
  return memo(() => !!debouncedQuery())() && filteredRows().length !== sortedRows().length;
819
871
  },
820
872
  get children() {
821
- var _el$55 = getNextElement(_tmpl$21), _el$58 = _el$55.firstChild, [_el$59, _co$1] = getNextMarker(_el$58.nextSibling), _el$56 = _el$59.nextSibling, _el$60 = _el$56.nextSibling, [_el$61, _co$10] = getNextMarker(_el$60.nextSibling), _el$57 = _el$61.nextSibling, _el$62 = _el$57.nextSibling, [_el$63, _co$11] = getNextMarker(_el$62.nextSibling);
822
- insert(_el$55, () => filteredRows().length, _el$59, _co$1);
823
- insert(_el$55, () => filteredRows().length !== 1 ? "s" : "", _el$61, _co$10);
824
- insert(_el$55, () => sortedRows().length, _el$63, _co$11);
825
- return _el$55;
873
+ var _el$52 = getNextElement(_tmpl$19);
874
+ insert(_el$52, () => formatMCPUIString(filteredRows().length === 1 ? strings.tableSearchResultsOne : strings.tableSearchResultsMany, {
875
+ count: filteredRows().length,
876
+ total: sortedRows().length
877
+ }));
878
+ return _el$52;
826
879
  }
827
880
  })];
828
881
  }
829
- }), _el$109, _co$23);
882
+ }), _el$87, _co$16);
830
883
  var _ref$2 = scrollContainerRef;
831
- typeof _ref$2 === "function" ? use(_ref$2, _el$64) : scrollContainerRef = _el$64;
832
- insert(_el$67, createComponent(For, {
884
+ typeof _ref$2 === "function" ? use(_ref$2, _el$53) : scrollContainerRef = _el$53;
885
+ insert(_el$56, createComponent(For, {
833
886
  get each() {
834
887
  return tableParams.columns;
835
888
  },
836
889
  children: (column) => (() => {
837
- var _el$116 = getNextElement(_tmpl$27), _el$117 = _el$116.firstChild, _el$119 = _el$117.firstChild, [_el$120, _co$27] = getNextMarker(_el$119.nextSibling), _el$118 = _el$120.nextSibling;
838
- addEventListener(_el$116, "click", () => handleSort(column.key));
839
- insert(_el$117, () => column.label, _el$120, _co$27);
840
- insert(_el$118, () => sortIndicator(column.key));
890
+ var _el$94 = getNextElement(_tmpl$25), _el$95 = _el$94.firstChild, _el$97 = _el$95.firstChild, [_el$98, _co$20] = getNextMarker(_el$97.nextSibling), _el$96 = _el$98.nextSibling;
891
+ addEventListener(_el$94, "click", () => handleSort(column.key));
892
+ insert(_el$95, () => column.label, _el$98, _co$20);
893
+ insert(_el$96, () => sortIndicator(column.key));
841
894
  effect((_p$) => {
842
- var _v$17 = column.width ? {
895
+ var _v$20 = column.width ? {
843
896
  width: column.width
844
- } : {}, _v$18 = `Sort by ${column.label}`, _v$19 = {
897
+ } : {}, _v$21 = formatMCPUIString(strings.sortBy, {
898
+ column: column.label
899
+ }), _v$22 = {
845
900
  "opacity-30": sortKey() !== column.key,
846
901
  "opacity-100 text-blue-600 dark:text-blue-400": sortKey() === column.key
847
902
  };
848
- _p$.e = style(_el$116, _v$17, _p$.e);
849
- _v$18 !== _p$.t && setAttribute(_el$116, "title", _p$.t = _v$18);
850
- _p$.a = classList(_el$118, _v$19, _p$.a);
903
+ _p$.e = style(_el$94, _v$20, _p$.e);
904
+ _v$21 !== _p$.t && setAttribute(_el$94, "title", _p$.t = _v$21);
905
+ _p$.a = classList(_el$96, _v$22, _p$.a);
851
906
  return _p$;
852
907
  }, {
853
908
  e: void 0,
854
909
  t: void 0,
855
910
  a: void 0
856
911
  });
857
- return _el$116;
912
+ return _el$94;
858
913
  })()
859
914
  }));
860
- insert(_el$65, createComponent(Show, {
915
+ insert(_el$54, createComponent(Show, {
861
916
  get when() {
862
917
  return isVirtualizing();
863
918
  },
@@ -867,63 +922,69 @@ ${dataRows}`;
867
922
  get children() {
868
923
  return createComponent(VirtualizedTableBody, {});
869
924
  }
870
- }), _el$69, _co$12);
871
- insert(_el$38, createComponent(Show, {
925
+ }), _el$58, _co$0);
926
+ insert(_el$39, createComponent(Show, {
872
927
  get when() {
873
928
  return tableParams.pagination;
874
929
  },
875
930
  get children() {
876
- var _el$70 = getNextElement(_tmpl$22), _el$71 = _el$70.firstChild, _el$72 = _el$71.firstChild, _el$77 = _el$72.nextSibling, [_el$78, _co$13] = getNextMarker(_el$77.nextSibling), _el$73 = _el$78.nextSibling, _el$79 = _el$73.nextSibling, [_el$80, _co$14] = getNextMarker(_el$79.nextSibling), _el$75 = _el$80.nextSibling, _el$81 = _el$75.nextSibling, [_el$82, _co$15] = getNextMarker(_el$81.nextSibling);
877
- insert(_el$71, () => tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1, _el$78, _co$13);
878
- insert(_el$71, () => Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows), _el$80, _co$14);
879
- insert(_el$71, () => tableParams.pagination.totalRows, _el$82, _co$15);
880
- return _el$70;
931
+ var _el$59 = getNextElement(_tmpl$20), _el$60 = _el$59.firstChild;
932
+ insert(_el$60, () => formatMCPUIString(strings.tableServerPageRange, {
933
+ start: tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1,
934
+ end: Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows),
935
+ total: tableParams.pagination.totalRows
936
+ }));
937
+ return _el$59;
881
938
  }
882
- }), _el$111, _co$24);
883
- insert(_el$38, createComponent(Show, {
939
+ }), _el$89, _co$17);
940
+ insert(_el$39, createComponent(Show, {
884
941
  get when() {
885
942
  return needsClientPagination();
886
943
  },
887
944
  get children() {
888
- var _el$83 = getNextElement(_tmpl$25), _el$84 = _el$83.firstChild, _el$87 = _el$84.firstChild, [_el$88, _co$16] = getNextMarker(_el$87.nextSibling), _el$85 = _el$88.nextSibling, _el$89 = _el$85.nextSibling, [_el$90, _co$17] = getNextMarker(_el$89.nextSibling), _el$86 = _el$90.nextSibling, _el$91 = _el$86.nextSibling, [_el$92, _co$18] = getNextMarker(_el$91.nextSibling), _el$93 = _el$84.nextSibling, _el$94 = _el$93.firstChild, _el$95 = _el$94.nextSibling, _el$97 = _el$95.firstChild, [_el$98, _co$19] = getNextMarker(_el$97.nextSibling), _el$96 = _el$98.nextSibling, _el$99 = _el$96.nextSibling, [_el$100, _co$20] = getNextMarker(_el$99.nextSibling), _el$101 = _el$95.nextSibling, _el$104 = _el$101.nextSibling, [_el$105, _co$21] = getNextMarker(_el$104.nextSibling);
889
- insert(_el$84, clientRangeStart, _el$88, _co$16);
890
- insert(_el$84, clientRangeEnd, _el$90, _co$17);
891
- insert(_el$84, () => filteredRows().length.toLocaleString("fr-FR"), _el$92, _co$18);
892
- _el$94.$$click = () => setClientPage((p) => p - 1);
893
- insert(_el$95, () => clientPage() + 1, _el$98, _co$19);
894
- insert(_el$95, clientTotalPages, _el$100, _co$20);
895
- _el$101.$$click = () => setClientPage((p) => p + 1);
896
- insert(_el$93, createComponent(Show, {
945
+ var _el$61 = getNextElement(_tmpl$23), _el$62 = _el$61.firstChild, _el$65 = _el$62.firstChild, [_el$66, _co$1] = getNextMarker(_el$65.nextSibling), _el$63 = _el$66.nextSibling, _el$67 = _el$63.nextSibling, [_el$68, _co$10] = getNextMarker(_el$67.nextSibling), _el$64 = _el$68.nextSibling, _el$69 = _el$64.nextSibling, [_el$70, _co$11] = getNextMarker(_el$69.nextSibling), _el$71 = _el$62.nextSibling, _el$72 = _el$71.firstChild, _el$73 = _el$72.nextSibling, _el$75 = _el$73.firstChild, [_el$76, _co$12] = getNextMarker(_el$75.nextSibling), _el$74 = _el$76.nextSibling, _el$77 = _el$74.nextSibling, [_el$78, _co$13] = getNextMarker(_el$77.nextSibling), _el$79 = _el$73.nextSibling, _el$82 = _el$79.nextSibling, [_el$83, _co$14] = getNextMarker(_el$82.nextSibling);
946
+ insert(_el$62, clientRangeStart, _el$66, _co$1);
947
+ insert(_el$62, clientRangeEnd, _el$68, _co$10);
948
+ insert(_el$62, () => filteredRows().length.toLocaleString(strings.locale), _el$70, _co$11);
949
+ _el$72.$$click = () => setClientPage((p) => p - 1);
950
+ insert(_el$73, () => clientPage() + 1, _el$76, _co$12);
951
+ insert(_el$73, clientTotalPages, _el$78, _co$13);
952
+ _el$79.$$click = () => setClientPage((p) => p + 1);
953
+ insert(_el$71, createComponent(Show, {
897
954
  get when() {
898
955
  return memo(() => !!isExpanded())() && filteredRows().length > 10;
899
956
  },
900
957
  get children() {
901
958
  return [(() => {
902
- var _el$102 = getNextElement(_tmpl$23);
903
- _el$102.addEventListener("change", (e) => handlePageSizeChange(Number(e.currentTarget.value)));
904
- insert(_el$102, createComponent(For, {
959
+ var _el$80 = getNextElement(_tmpl$21);
960
+ _el$80.addEventListener("change", (e) => handlePageSizeChange(Number(e.currentTarget.value)));
961
+ insert(_el$80, createComponent(For, {
905
962
  get each() {
906
963
  return pageSizeOptions();
907
964
  },
908
965
  children: (opt) => (() => {
909
- var _el$121 = getNextElement(_tmpl$28);
910
- insert(_el$121, () => opt.label);
911
- effect(() => setProperty(_el$121, "value", opt.value));
912
- return _el$121;
966
+ var _el$99 = getNextElement(_tmpl$26);
967
+ insert(_el$99, () => opt.label);
968
+ effect(() => setProperty(_el$99, "value", opt.value));
969
+ return _el$99;
913
970
  })()
914
971
  }));
915
- effect(() => setAttribute(_el$102, "aria-label", strings.paginationPageSize));
916
- effect(() => setProperty(_el$102, "value", clientPageSize()));
917
- return _el$102;
918
- })(), getNextElement(_tmpl$24)];
972
+ effect(() => setAttribute(_el$80, "aria-label", strings.paginationPageSize));
973
+ effect(() => setProperty(_el$80, "value", clientPageSize()));
974
+ return _el$80;
975
+ })(), (() => {
976
+ var _el$81 = getNextElement(_tmpl$22);
977
+ insert(_el$81, () => strings.perPageSuffix);
978
+ return _el$81;
979
+ })()];
919
980
  }
920
- }), _el$105, _co$21);
981
+ }), _el$83, _co$14);
921
982
  effect((_p$) => {
922
- var _v$9 = clientPage() === 0, _v$0 = strings.paginationPrevious, _v$1 = clientPage() >= clientTotalPages() - 1, _v$10 = strings.paginationNext;
923
- _v$9 !== _p$.e && setProperty(_el$94, "disabled", _p$.e = _v$9);
924
- _v$0 !== _p$.t && setAttribute(_el$94, "aria-label", _p$.t = _v$0);
925
- _v$1 !== _p$.a && setProperty(_el$101, "disabled", _p$.a = _v$1);
926
- _v$10 !== _p$.o && setAttribute(_el$101, "aria-label", _p$.o = _v$10);
983
+ var _v$10 = clientPage() === 0, _v$11 = strings.paginationPrevious, _v$12 = clientPage() >= clientTotalPages() - 1, _v$13 = strings.paginationNext;
984
+ _v$10 !== _p$.e && setProperty(_el$72, "disabled", _p$.e = _v$10);
985
+ _v$11 !== _p$.t && setAttribute(_el$72, "aria-label", _p$.t = _v$11);
986
+ _v$12 !== _p$.a && setProperty(_el$79, "disabled", _p$.a = _v$12);
987
+ _v$13 !== _p$.o && setAttribute(_el$79, "aria-label", _p$.o = _v$13);
927
988
  return _p$;
928
989
  }, {
929
990
  e: void 0,
@@ -932,11 +993,11 @@ ${dataRows}`;
932
993
  o: void 0
933
994
  });
934
995
  runHydrationEvents();
935
- return _el$83;
996
+ return _el$61;
936
997
  }
937
- }), _el$113, _co$25);
998
+ }), _el$91, _co$18);
938
999
  effect((_p$) => {
939
- var _v$11 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : "h-full"} ${tableParams.className || ""}`, _v$12 = `p-4 ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""}`, _v$13 = `overflow-x-auto ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$14 = (
1000
+ var _v$14 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden group ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : "h-full"} ${tableParams.className || ""}`, _v$15 = `p-4 ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""}`, _v$16 = `overflow-x-auto ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$17 = (
940
1001
  // v6.1.0 — when expanded, the scroll container fills the
941
1002
  // remaining vertical space and scrolls internally.
942
1003
  // v6.3.0 — `params.maxHeight` opt-out (axe 1 deposium handoff)
@@ -965,13 +1026,13 @@ ${dataRows}`;
965
1026
  };
966
1027
  return {};
967
1028
  })()
968
- ), _v$15 = tableParams.title || "Data table", _v$16 = tableParams.title ? `${tableId}-title` : void 0;
969
- _v$11 !== _p$.e && className(_el$30, _p$.e = _v$11);
970
- _v$12 !== _p$.t && className(_el$38, _p$.t = _v$12);
971
- _v$13 !== _p$.a && className(_el$64, _p$.a = _v$13);
972
- _p$.o = style(_el$64, _v$14, _p$.o);
973
- _v$15 !== _p$.i && setAttribute(_el$64, "aria-label", _p$.i = _v$15);
974
- _v$16 !== _p$.n && setAttribute(_el$65, "aria-labelledby", _p$.n = _v$16);
1029
+ ), _v$18 = tableParams.title || strings.tableAriaLabel, _v$19 = tableParams.title ? `${tableId}-title` : void 0;
1030
+ _v$14 !== _p$.e && className(_el$31, _p$.e = _v$14);
1031
+ _v$15 !== _p$.t && className(_el$39, _p$.t = _v$15);
1032
+ _v$16 !== _p$.a && className(_el$53, _p$.a = _v$16);
1033
+ _p$.o = style(_el$53, _v$17, _p$.o);
1034
+ _v$18 !== _p$.i && setAttribute(_el$53, "aria-label", _p$.i = _v$18);
1035
+ _v$19 !== _p$.n && setAttribute(_el$54, "aria-labelledby", _p$.n = _v$19);
975
1036
  return _p$;
976
1037
  }, {
977
1038
  e: void 0,
@@ -981,11 +1042,12 @@ ${dataRows}`;
981
1042
  i: void 0,
982
1043
  n: void 0
983
1044
  });
984
- return _el$30;
1045
+ return _el$31;
985
1046
  }
986
1047
  });
987
1048
  }
988
1049
  function MetricRenderer(props) {
1050
+ const strings = useMCPUIStrings();
989
1051
  const metricParams = props.component.params;
990
1052
  const getMetricText = () => {
991
1053
  const title = metricParams.title || metricParams.label || "";
@@ -994,59 +1056,61 @@ function MetricRenderer(props) {
994
1056
  return `${title}: ${value}${unit ? " " + unit : ""}`;
995
1057
  };
996
1058
  return (() => {
997
- var _el$122 = getNextElement(_tmpl$32), _el$144 = _el$122.firstChild, [_el$145, _co$33] = getNextMarker(_el$144.nextSibling), _el$123 = _el$145.nextSibling, _el$124 = _el$123.firstChild, _el$125 = _el$124.firstChild, _el$126 = _el$125.nextSibling, _el$127 = _el$126.firstChild, _el$129 = _el$127.nextSibling, [_el$130, _co$28] = getNextMarker(_el$129.nextSibling), _el$140 = _el$124.nextSibling, [_el$141, _co$31] = getNextMarker(_el$140.nextSibling), _el$142 = _el$141.nextSibling, [_el$143, _co$32] = getNextMarker(_el$142.nextSibling);
998
- insert(_el$122, createComponent(CopyButton, {
1059
+ var _el$100 = getNextElement(_tmpl$30), _el$122 = _el$100.firstChild, [_el$123, _co$26] = getNextMarker(_el$122.nextSibling), _el$101 = _el$123.nextSibling, _el$102 = _el$101.firstChild, _el$103 = _el$102.firstChild, _el$104 = _el$103.nextSibling, _el$105 = _el$104.firstChild, _el$107 = _el$105.nextSibling, [_el$108, _co$21] = getNextMarker(_el$107.nextSibling), _el$118 = _el$102.nextSibling, [_el$119, _co$24] = getNextMarker(_el$118.nextSibling), _el$120 = _el$119.nextSibling, [_el$121, _co$25] = getNextMarker(_el$120.nextSibling);
1060
+ insert(_el$100, createComponent(CopyButton, {
999
1061
  getText: getMetricText,
1000
- title: "Copy metric",
1062
+ get title() {
1063
+ return strings.copyMetric;
1064
+ },
1001
1065
  position: "top-right"
1002
- }), _el$145, _co$33);
1003
- insert(_el$125, () => metricParams.title);
1004
- insert(_el$127, () => metricParams.value);
1005
- insert(_el$126, createComponent(Show, {
1066
+ }), _el$123, _co$26);
1067
+ insert(_el$103, () => metricParams.title);
1068
+ insert(_el$105, () => metricParams.value);
1069
+ insert(_el$104, createComponent(Show, {
1006
1070
  get when() {
1007
1071
  return metricParams.unit;
1008
1072
  },
1009
1073
  get children() {
1010
- var _el$128 = getNextElement(_tmpl$29);
1011
- insert(_el$128, () => metricParams.unit);
1012
- return _el$128;
1074
+ var _el$106 = getNextElement(_tmpl$27);
1075
+ insert(_el$106, () => metricParams.unit);
1076
+ return _el$106;
1013
1077
  }
1014
- }), _el$130, _co$28);
1015
- insert(_el$123, createComponent(Show, {
1078
+ }), _el$108, _co$21);
1079
+ insert(_el$101, createComponent(Show, {
1016
1080
  get when() {
1017
1081
  return metricParams.trend;
1018
1082
  },
1019
1083
  get children() {
1020
- var _el$131 = getNextElement(_tmpl$30), _el$132 = _el$131.firstChild, _el$135 = _el$132.firstChild, [_el$136, _co$29] = getNextMarker(_el$135.nextSibling), _el$133 = _el$136.nextSibling, _el$137 = _el$133.nextSibling, [_el$138, _co$30] = getNextMarker(_el$137.nextSibling);
1021
- _el$138.nextSibling;
1022
- insert(_el$132, (() => {
1084
+ var _el$109 = getNextElement(_tmpl$28), _el$110 = _el$109.firstChild, _el$113 = _el$110.firstChild, [_el$114, _co$22] = getNextMarker(_el$113.nextSibling), _el$111 = _el$114.nextSibling, _el$115 = _el$111.nextSibling, [_el$116, _co$23] = getNextMarker(_el$115.nextSibling);
1085
+ _el$116.nextSibling;
1086
+ insert(_el$110, (() => {
1023
1087
  var _c$ = memo(() => metricParams.trend.direction === "up");
1024
1088
  return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
1025
- })(), _el$136, _co$29);
1026
- insert(_el$132, () => Math.abs(metricParams.trend.value), _el$138, _co$30);
1027
- effect(() => className(_el$132, `text-sm font-medium ${metricParams.trend.direction === "up" ? "text-green-600 dark:text-green-400" : metricParams.trend.direction === "down" ? "text-red-600 dark:text-red-400" : "text-gray-600 dark:text-gray-400"}`));
1028
- return _el$131;
1089
+ })(), _el$114, _co$22);
1090
+ insert(_el$110, () => Math.abs(metricParams.trend.value), _el$116, _co$23);
1091
+ effect(() => className(_el$110, `text-sm font-medium ${metricParams.trend.direction === "up" ? "text-green-600 dark:text-green-400" : metricParams.trend.direction === "down" ? "text-red-600 dark:text-red-400" : "text-gray-600 dark:text-gray-400"}`));
1092
+ return _el$109;
1029
1093
  }
1030
- }), _el$141, _co$31);
1031
- insert(_el$123, createComponent(Show, {
1094
+ }), _el$119, _co$24);
1095
+ insert(_el$101, createComponent(Show, {
1032
1096
  get when() {
1033
1097
  return metricParams.subtitle;
1034
1098
  },
1035
1099
  get children() {
1036
- var _el$139 = getNextElement(_tmpl$31);
1037
- insert(_el$139, () => metricParams.subtitle);
1038
- return _el$139;
1100
+ var _el$117 = getNextElement(_tmpl$29);
1101
+ insert(_el$117, () => metricParams.subtitle);
1102
+ return _el$117;
1039
1103
  }
1040
- }), _el$143, _co$32);
1041
- return _el$122;
1104
+ }), _el$121, _co$25);
1105
+ return _el$100;
1042
1106
  })();
1043
1107
  }
1044
- function extractImageFromMarkdown(content) {
1108
+ function extractImageFromMarkdown(content, fallbackAlt) {
1045
1109
  const imagePattern = /\[!\[([^\]]*)\]\(([^)]+)\)\]\(([^)]+)\)\s*\*([^*]+)\*/;
1046
1110
  const match = content.match(imagePattern);
1047
1111
  if (match) {
1048
1112
  return {
1049
- alt: match[1] || "Image",
1113
+ alt: match[1] || fallbackAlt,
1050
1114
  imageUrl: match[2],
1051
1115
  linkUrl: match[3],
1052
1116
  credit: match[4].trim()
@@ -1055,10 +1119,11 @@ function extractImageFromMarkdown(content) {
1055
1119
  return null;
1056
1120
  }
1057
1121
  function TextRenderer(props) {
1122
+ const strings = useMCPUIStrings();
1058
1123
  const textParams = props.component.params;
1059
1124
  const imageData = createMemo(() => {
1060
1125
  if (textParams.markdown && textParams.content) {
1061
- const extracted = extractImageFromMarkdown(textParams.content);
1126
+ const extracted = extractImageFromMarkdown(textParams.content, strings.imageAlt);
1062
1127
  if (!extracted) return null;
1063
1128
  const imageUrl = safeUrl(extracted.imageUrl, {
1064
1129
  allowDataImage: true
@@ -1094,38 +1159,40 @@ function TextRenderer(props) {
1094
1159
  },
1095
1160
  get fallback() {
1096
1161
  return (() => {
1097
- var _el$146 = getNextElement(_tmpl$33), _el$147 = _el$146.firstChild, [_el$148, _co$34] = getNextMarker(_el$147.nextSibling), _el$149 = _el$148.nextSibling, [_el$150, _co$35] = getNextMarker(_el$149.nextSibling);
1098
- insert(_el$146, createComponent(CopyButton, {
1162
+ var _el$124 = getNextElement(_tmpl$31), _el$125 = _el$124.firstChild, [_el$126, _co$27] = getNextMarker(_el$125.nextSibling), _el$127 = _el$126.nextSibling, [_el$128, _co$28] = getNextMarker(_el$127.nextSibling);
1163
+ insert(_el$124, createComponent(CopyButton, {
1099
1164
  getText: getTextContent,
1100
- title: "Copy text",
1165
+ get title() {
1166
+ return strings.copyText;
1167
+ },
1101
1168
  position: "top-right"
1102
- }), _el$148, _co$34);
1103
- insert(_el$146, createComponent(SafeHtml, {
1169
+ }), _el$126, _co$27);
1170
+ insert(_el$124, createComponent(SafeHtml, {
1104
1171
  get ["class"]() {
1105
1172
  return `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`;
1106
1173
  },
1107
1174
  html: htmlContent
1108
- }), _el$150, _co$35);
1109
- return _el$146;
1175
+ }), _el$128, _co$28);
1176
+ return _el$124;
1110
1177
  })();
1111
1178
  },
1112
1179
  children: (data) => {
1113
1180
  const image = () => (() => {
1114
- var _el$151 = getNextElement(_tmpl$34);
1181
+ var _el$129 = getNextElement(_tmpl$32);
1115
1182
  effect((_p$) => {
1116
- var _v$20 = data().imageUrl, _v$21 = data().alt;
1117
- _v$20 !== _p$.e && setAttribute(_el$151, "src", _p$.e = _v$20);
1118
- _v$21 !== _p$.t && setAttribute(_el$151, "alt", _p$.t = _v$21);
1183
+ var _v$23 = data().imageUrl, _v$24 = data().alt;
1184
+ _v$23 !== _p$.e && setAttribute(_el$129, "src", _p$.e = _v$23);
1185
+ _v$24 !== _p$.t && setAttribute(_el$129, "alt", _p$.t = _v$24);
1119
1186
  return _p$;
1120
1187
  }, {
1121
1188
  e: void 0,
1122
1189
  t: void 0
1123
1190
  });
1124
- return _el$151;
1191
+ return _el$129;
1125
1192
  })();
1126
1193
  return (() => {
1127
- var _el$152 = getNextElement(_tmpl$35), _el$153 = _el$152.firstChild, _el$154 = _el$153.nextSibling, _el$155 = _el$154.firstChild;
1128
- insert(_el$153, createComponent(Show, {
1194
+ var _el$130 = getNextElement(_tmpl$33), _el$131 = _el$130.firstChild, _el$132 = _el$131.nextSibling, _el$133 = _el$132.firstChild;
1195
+ insert(_el$131, createComponent(Show, {
1129
1196
  get when() {
1130
1197
  return data().linkUrl;
1131
1198
  },
@@ -1133,71 +1200,91 @@ function TextRenderer(props) {
1133
1200
  return image();
1134
1201
  },
1135
1202
  children: (href) => (() => {
1136
- var _el$156 = getNextElement(_tmpl$36);
1137
- insert(_el$156, image);
1138
- effect(() => setAttribute(_el$156, "href", href()));
1139
- return _el$156;
1203
+ var _el$134 = getNextElement(_tmpl$34);
1204
+ insert(_el$134, image);
1205
+ effect(() => setAttribute(_el$134, "href", href()));
1206
+ return _el$134;
1140
1207
  })()
1141
1208
  }));
1142
- insert(_el$155, () => data().credit);
1143
- return _el$152;
1209
+ insert(_el$133, () => data().credit);
1210
+ return _el$130;
1144
1211
  })();
1145
1212
  }
1146
1213
  });
1147
1214
  }
1148
1215
  function IframeRenderer(props) {
1216
+ const strings = useMCPUIStrings();
1217
+ const config = useMCPUIConfig();
1149
1218
  const params = props.component.params;
1219
+ const trustOptions = () => ({
1220
+ customTrustedDomains: config.customTrustedIframeDomains
1221
+ });
1150
1222
  return (() => {
1151
- var _el$157 = getNextElement(_tmpl$38), _el$161 = _el$157.firstChild, [_el$162, _co$36] = getNextMarker(_el$161.nextSibling), _el$160 = _el$162.nextSibling;
1152
- insert(_el$157, createComponent(Show, {
1223
+ var _el$135 = getNextElement(_tmpl$36), _el$139 = _el$135.firstChild, [_el$140, _co$29] = getNextMarker(_el$139.nextSibling), _el$138 = _el$140.nextSibling, _el$141 = _el$138.nextSibling, [_el$142, _co$30] = getNextMarker(_el$141.nextSibling);
1224
+ insert(_el$135, createComponent(Show, {
1153
1225
  get when() {
1154
1226
  return params.title;
1155
1227
  },
1156
1228
  get children() {
1157
- var _el$158 = getNextElement(_tmpl$37), _el$159 = _el$158.firstChild;
1158
- insert(_el$159, () => params.title);
1159
- return _el$158;
1229
+ var _el$136 = getNextElement(_tmpl$35), _el$137 = _el$136.firstChild;
1230
+ insert(_el$137, () => params.title);
1231
+ return _el$136;
1160
1232
  }
1161
- }), _el$162, _co$36);
1233
+ }), _el$140, _co$29);
1234
+ insert(_el$135, createComponent(IframeFallbackLink, {
1235
+ get url() {
1236
+ return params.url;
1237
+ },
1238
+ "class": "border-t border-gray-200 dark:border-gray-700"
1239
+ }), _el$142, _co$30);
1162
1240
  effect((_p$) => {
1163
- var _v$22 = params.url, _v$23 = params.title || "Embedded content", _v$24 = `height: ${params.height || "400px"}; min-height: 300px;`, _v$25 = getIframeSandbox(params.url);
1164
- _v$22 !== _p$.e && setAttribute(_el$160, "src", _p$.e = _v$22);
1165
- _v$23 !== _p$.t && setAttribute(_el$160, "title", _p$.t = _v$23);
1166
- _p$.a = style(_el$160, _v$24, _p$.a);
1167
- _v$25 !== _p$.o && setAttribute(_el$160, "sandbox", _p$.o = _v$25);
1241
+ var _v$25 = params.url, _v$26 = params.title || strings.iframeTitle, _v$27 = `height: ${params.height || "400px"}; min-height: 300px;`, _v$28 = getIframeSandbox(params.url, trustOptions()), _v$29 = shouldSetCredentialless(params.url, config, {
1242
+ // This iframe's sandbox never carries `allow-same-origin` for an
1243
+ // untrusted host, so it already runs without cookies.
1244
+ sandboxedWithoutSameOrigin: !isTrustedIframeDomain(params.url, trustOptions())
1245
+ }) || void 0;
1246
+ _v$25 !== _p$.e && setAttribute(_el$138, "src", _p$.e = _v$25);
1247
+ _v$26 !== _p$.t && setAttribute(_el$138, "title", _p$.t = _v$26);
1248
+ _p$.a = style(_el$138, _v$27, _p$.a);
1249
+ _v$28 !== _p$.o && setAttribute(_el$138, "sandbox", _p$.o = _v$28);
1250
+ _v$29 !== _p$.i && setAttribute(_el$138, "credentialless", _p$.i = _v$29);
1168
1251
  return _p$;
1169
1252
  }, {
1170
1253
  e: void 0,
1171
1254
  t: void 0,
1172
1255
  a: void 0,
1173
- o: void 0
1256
+ o: void 0,
1257
+ i: void 0
1174
1258
  });
1175
- return _el$157;
1259
+ return _el$135;
1176
1260
  })();
1177
1261
  }
1178
1262
  function ImageRenderer(props) {
1263
+ const strings = useMCPUIStrings();
1179
1264
  const params = props.component.params;
1180
1265
  return (() => {
1181
- var _el$163 = getNextElement(_tmpl$40), _el$164 = _el$163.firstChild, _el$165 = _el$164.firstChild, _el$166 = _el$165.firstChild, _el$169 = _el$164.nextSibling, [_el$170, _co$37] = getNextMarker(_el$169.nextSibling);
1182
- insert(_el$163, createComponent(Show, {
1266
+ var _el$143 = getNextElement(_tmpl$38), _el$144 = _el$143.firstChild, _el$145 = _el$144.firstChild, _el$146 = _el$145.firstChild, _el$149 = _el$144.nextSibling, [_el$150, _co$31] = getNextMarker(_el$149.nextSibling);
1267
+ insert(_el$143, createComponent(Show, {
1183
1268
  get when() {
1184
1269
  return params.caption;
1185
1270
  },
1186
1271
  get children() {
1187
- var _el$167 = getNextElement(_tmpl$39), _el$168 = _el$167.firstChild;
1188
- insert(_el$168, () => params.caption);
1189
- return _el$167;
1272
+ var _el$147 = getNextElement(_tmpl$37), _el$148 = _el$147.firstChild;
1273
+ insert(_el$148, () => params.caption);
1274
+ return _el$147;
1190
1275
  }
1191
- }), _el$170, _co$37);
1276
+ }), _el$150, _co$31);
1192
1277
  effect((_p$) => {
1193
- var _v$26 = `w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col ${params.className || ""}`, _v$27 = safeUrl(params.url), _v$28 = `View full size: ${params.alt || "image"}`, _v$29 = safeUrl(params.url, {
1278
+ var _v$30 = `w-full h-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col ${params.className || ""}`, _v$31 = safeUrl(params.url), _v$32 = formatMCPUIString(strings.imageViewFullSize, {
1279
+ alt: params.alt || strings.imageAltFallback
1280
+ }), _v$33 = safeUrl(params.url, {
1194
1281
  allowDataImage: true
1195
- }), _v$30 = params.alt || "Image";
1196
- _v$26 !== _p$.e && className(_el$163, _p$.e = _v$26);
1197
- _v$27 !== _p$.t && setAttribute(_el$165, "href", _p$.t = _v$27);
1198
- _v$28 !== _p$.a && setAttribute(_el$165, "aria-label", _p$.a = _v$28);
1199
- _v$29 !== _p$.o && setAttribute(_el$166, "src", _p$.o = _v$29);
1200
- _v$30 !== _p$.i && setAttribute(_el$166, "alt", _p$.i = _v$30);
1282
+ }), _v$34 = params.alt || strings.imageAlt;
1283
+ _v$30 !== _p$.e && className(_el$143, _p$.e = _v$30);
1284
+ _v$31 !== _p$.t && setAttribute(_el$145, "href", _p$.t = _v$31);
1285
+ _v$32 !== _p$.a && setAttribute(_el$145, "aria-label", _p$.a = _v$32);
1286
+ _v$33 !== _p$.o && setAttribute(_el$146, "src", _p$.o = _v$33);
1287
+ _v$34 !== _p$.i && setAttribute(_el$146, "alt", _p$.i = _v$34);
1201
1288
  return _p$;
1202
1289
  }, {
1203
1290
  e: void 0,
@@ -1206,30 +1293,34 @@ function ImageRenderer(props) {
1206
1293
  o: void 0,
1207
1294
  i: void 0
1208
1295
  });
1209
- return _el$163;
1296
+ return _el$143;
1210
1297
  })();
1211
1298
  }
1212
1299
  function LinkRenderer(props) {
1300
+ const strings = useMCPUIStrings();
1213
1301
  const params = props.component.params;
1214
1302
  return (() => {
1215
- var _el$171 = getNextElement(_tmpl$42), _el$172 = _el$171.firstChild, _el$173 = _el$172.nextSibling, _el$174 = _el$173.firstChild, _el$176 = _el$174.nextSibling, [_el$177, _co$38] = getNextMarker(_el$176.nextSibling);
1216
- _el$171.$$click = (e) => e.stopPropagation();
1217
- insert(_el$174, () => params.label || params.url);
1218
- insert(_el$173, createComponent(Show, {
1303
+ var _el$151 = getNextElement(_tmpl$40), _el$152 = _el$151.firstChild, _el$153 = _el$152.nextSibling, _el$154 = _el$153.firstChild, _el$156 = _el$154.nextSibling, [_el$157, _co$32] = getNextMarker(_el$156.nextSibling);
1304
+ _el$151.$$click = (e) => e.stopPropagation();
1305
+ insert(_el$154, () => params.label || params.url);
1306
+ insert(_el$153, createComponent(Show, {
1219
1307
  get when() {
1220
1308
  return params.description;
1221
1309
  },
1222
1310
  get children() {
1223
- var _el$175 = getNextElement(_tmpl$41);
1224
- insert(_el$175, () => params.description);
1225
- return _el$175;
1311
+ var _el$155 = getNextElement(_tmpl$39);
1312
+ insert(_el$155, () => params.description);
1313
+ return _el$155;
1226
1314
  }
1227
- }), _el$177, _co$38);
1315
+ }), _el$157, _co$32);
1228
1316
  effect((_p$) => {
1229
- var _v$31 = safeUrl(params.url), _v$32 = `${params.label || "Link"}: ${params.description || params.url} (opens in new tab)`, _v$33 = `flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${params.className || ""}`;
1230
- _v$31 !== _p$.e && setAttribute(_el$171, "href", _p$.e = _v$31);
1231
- _v$32 !== _p$.t && setAttribute(_el$171, "aria-label", _p$.t = _v$32);
1232
- _v$33 !== _p$.a && className(_el$171, _p$.a = _v$33);
1317
+ var _v$35 = safeUrl(params.url), _v$36 = formatMCPUIString(strings.linkOpensInNewTab, {
1318
+ label: params.label || strings.linkLabel,
1319
+ description: params.description || params.url
1320
+ }), _v$37 = `flex items-center gap-3 p-4 bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors group h-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 ${params.className || ""}`;
1321
+ _v$35 !== _p$.e && setAttribute(_el$151, "href", _p$.e = _v$35);
1322
+ _v$36 !== _p$.t && setAttribute(_el$151, "aria-label", _p$.t = _v$36);
1323
+ _v$37 !== _p$.a && className(_el$151, _p$.a = _v$37);
1233
1324
  return _p$;
1234
1325
  }, {
1235
1326
  e: void 0,
@@ -1237,13 +1328,15 @@ function LinkRenderer(props) {
1237
1328
  a: void 0
1238
1329
  });
1239
1330
  runHydrationEvents();
1240
- return _el$171;
1331
+ return _el$151;
1241
1332
  })();
1242
1333
  }
1243
1334
  function ComponentRenderer(props) {
1244
1335
  var _a, _b, _c, _d, _e, _f, _g;
1245
1336
  markRenderStart(props.component.id);
1246
1337
  const telemetry = useTelemetry();
1338
+ const strings = useMCPUIStrings();
1339
+ const componentConfig = useMCPUIConfig();
1247
1340
  onMount(() => {
1248
1341
  markRenderEnd(props.component.id);
1249
1342
  if (telemetry) {
@@ -1279,7 +1372,10 @@ function ComponentRenderer(props) {
1279
1372
  });
1280
1373
  }
1281
1374
  });
1282
- const validation = validateComponent(props.component);
1375
+ const validation = validateComponent(props.component, {
1376
+ iframePolicy: componentConfig.iframePolicy,
1377
+ customIframeDomains: componentConfig.customIframeDomains
1378
+ });
1283
1379
  if (!validation.valid) {
1284
1380
  (_a = props.onError) == null ? void 0 : _a.call(props, {
1285
1381
  type: "validation",
@@ -1298,7 +1394,7 @@ function ComponentRenderer(props) {
1298
1394
  });
1299
1395
  }
1300
1396
  const mode = props.errorMode ?? "block";
1301
- const firstError = ((_f = (_e = validation.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || "Unknown validation error";
1397
+ const firstError = ((_f = (_e = validation.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || strings.validationUnknownError;
1302
1398
  if ((_g = validation.errors) == null ? void 0 : _g.some((e) => e.code === "UNKNOWN_COMPONENT_TYPE")) {
1303
1399
  return createComponent(UnsupportedComponentFallback, {
1304
1400
  get component() {
@@ -1311,16 +1407,20 @@ function ComponentRenderer(props) {
1311
1407
  }
1312
1408
  if (mode === "inline-warn") {
1313
1409
  return (() => {
1314
- var _el$178 = getNextElement(_tmpl$43), _el$179 = _el$178.firstChild, _el$180 = _el$179.nextSibling, _el$181 = _el$180.firstChild, _el$182 = _el$181.nextSibling, [_el$183, _co$39] = getNextMarker(_el$182.nextSibling);
1315
- setAttribute(_el$178, "title", firstError);
1316
- insert(_el$180, () => props.component.type, _el$183, _co$39);
1317
- return _el$178;
1410
+ var _el$158 = getNextElement(_tmpl$41), _el$159 = _el$158.firstChild, _el$160 = _el$159.nextSibling;
1411
+ setAttribute(_el$158, "title", firstError);
1412
+ insert(_el$160, () => formatMCPUIString(strings.invalidComponent, {
1413
+ type: props.component.type
1414
+ }));
1415
+ effect(() => setAttribute(_el$158, "aria-label", strings.validationWarning));
1416
+ return _el$158;
1318
1417
  })();
1319
1418
  }
1320
1419
  return (() => {
1321
- var _el$184 = getNextElement(_tmpl$44), _el$185 = _el$184.firstChild, _el$186 = _el$185.nextSibling;
1322
- insert(_el$186, firstError);
1323
- return _el$184;
1420
+ var _el$161 = getNextElement(_tmpl$42), _el$162 = _el$161.firstChild, _el$163 = _el$162.nextSibling;
1421
+ insert(_el$162, () => strings.validationError);
1422
+ insert(_el$163, firstError);
1423
+ return _el$161;
1324
1424
  })();
1325
1425
  }
1326
1426
  return createComponent(GenerativeUIErrorBoundary, {
@@ -1612,10 +1712,12 @@ function ComponentRenderer(props) {
1612
1712
  });
1613
1713
  }
1614
1714
  function UnsupportedComponentFallback(props) {
1715
+ const strings = useMCPUIStrings();
1615
1716
  return (() => {
1616
- var _el$187 = getNextElement(_tmpl$45), _el$188 = _el$187.firstChild, _el$189 = _el$188.nextSibling;
1617
- insert(_el$189, () => props.component.type);
1618
- return _el$187;
1717
+ var _el$164 = getNextElement(_tmpl$43), _el$167 = _el$164.firstChild, [_el$168, _co$33] = getNextMarker(_el$167.nextSibling), _el$165 = _el$168.nextSibling, _el$166 = _el$165.nextSibling;
1718
+ insert(_el$164, () => strings.unsupportedComponentType, _el$168, _co$33);
1719
+ insert(_el$166, () => props.component.type);
1720
+ return _el$164;
1619
1721
  })();
1620
1722
  }
1621
1723
  function ActionRenderer(props) {
@@ -1655,27 +1757,27 @@ function ActionRenderer(props) {
1655
1757
  const isDisabled = () => params.disabled || isExecutable() && isExecuting();
1656
1758
  if (params.type === "link" || params.action === "link") {
1657
1759
  return (() => {
1658
- var _el$190 = getNextElement(_tmpl$47), _el$192 = _el$190.firstChild, [_el$193, _co$40] = getNextMarker(_el$192.nextSibling), _el$194 = _el$193.nextSibling, [_el$195, _co$41] = getNextMarker(_el$194.nextSibling);
1659
- _el$190.$$click = handleClick;
1660
- insert(_el$190, createComponent(Show, {
1760
+ var _el$169 = getNextElement(_tmpl$45), _el$171 = _el$169.firstChild, [_el$172, _co$34] = getNextMarker(_el$171.nextSibling), _el$173 = _el$172.nextSibling, [_el$174, _co$35] = getNextMarker(_el$173.nextSibling);
1761
+ _el$169.$$click = handleClick;
1762
+ insert(_el$169, createComponent(Show, {
1661
1763
  get when() {
1662
1764
  return params.icon;
1663
1765
  },
1664
1766
  get children() {
1665
- var _el$191 = getNextElement(_tmpl$46);
1666
- insert(_el$191, () => params.icon);
1667
- return _el$191;
1767
+ var _el$170 = getNextElement(_tmpl$44);
1768
+ insert(_el$170, () => params.icon);
1769
+ return _el$170;
1668
1770
  }
1669
- }), _el$193, _co$40);
1670
- insert(_el$190, () => params.label, _el$195, _co$41);
1771
+ }), _el$172, _co$34);
1772
+ insert(_el$169, () => params.label, _el$174, _co$35);
1671
1773
  effect((_p$) => {
1672
- var _v$34 = safeUrl(params.url) ?? "#", _v$35 = safeUrl(params.url) ? "_blank" : void 0, _v$36 = params.ariaLabel || params.label, _v$37 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500
1774
+ var _v$38 = safeUrl(params.url) ?? "#", _v$39 = safeUrl(params.url) ? "_blank" : void 0, _v$40 = params.ariaLabel || params.label, _v$41 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500
1673
1775
  ${params.variant === "primary" ? "bg-blue-600 text-white hover:bg-blue-700" : params.variant === "outline" ? "border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800" : "text-blue-600 hover:text-blue-800 dark:text-blue-400 dark:hover:text-blue-300"}
1674
1776
  ${params.className || ""}`;
1675
- _v$34 !== _p$.e && setAttribute(_el$190, "href", _p$.e = _v$34);
1676
- _v$35 !== _p$.t && setAttribute(_el$190, "target", _p$.t = _v$35);
1677
- _v$36 !== _p$.a && setAttribute(_el$190, "aria-label", _p$.a = _v$36);
1678
- _v$37 !== _p$.o && className(_el$190, _p$.o = _v$37);
1777
+ _v$38 !== _p$.e && setAttribute(_el$169, "href", _p$.e = _v$38);
1778
+ _v$39 !== _p$.t && setAttribute(_el$169, "target", _p$.t = _v$39);
1779
+ _v$40 !== _p$.a && setAttribute(_el$169, "aria-label", _p$.a = _v$40);
1780
+ _v$41 !== _p$.o && className(_el$169, _p$.o = _v$41);
1679
1781
  return _p$;
1680
1782
  }, {
1681
1783
  e: void 0,
@@ -1684,41 +1786,41 @@ function ActionRenderer(props) {
1684
1786
  o: void 0
1685
1787
  });
1686
1788
  runHydrationEvents();
1687
- return _el$190;
1789
+ return _el$169;
1688
1790
  })();
1689
1791
  }
1690
1792
  return (() => {
1691
- var _el$196 = getNextElement(_tmpl$49), _el$199 = _el$196.firstChild, [_el$200, _co$42] = getNextMarker(_el$199.nextSibling), _el$201 = _el$200.nextSibling, [_el$202, _co$43] = getNextMarker(_el$201.nextSibling), _el$203 = _el$202.nextSibling, [_el$204, _co$44] = getNextMarker(_el$203.nextSibling);
1692
- _el$196.$$click = handleClick;
1693
- insert(_el$196, createComponent(Show, {
1793
+ var _el$175 = getNextElement(_tmpl$47), _el$178 = _el$175.firstChild, [_el$179, _co$36] = getNextMarker(_el$178.nextSibling), _el$180 = _el$179.nextSibling, [_el$181, _co$37] = getNextMarker(_el$180.nextSibling), _el$182 = _el$181.nextSibling, [_el$183, _co$38] = getNextMarker(_el$182.nextSibling);
1794
+ _el$175.$$click = handleClick;
1795
+ insert(_el$175, createComponent(Show, {
1694
1796
  get when() {
1695
1797
  return memo(() => !!isExecuting())() && isExecutable();
1696
1798
  },
1697
1799
  get children() {
1698
- return getNextElement(_tmpl$48);
1800
+ return getNextElement(_tmpl$46);
1699
1801
  }
1700
- }), _el$200, _co$42);
1701
- insert(_el$196, createComponent(Show, {
1802
+ }), _el$179, _co$36);
1803
+ insert(_el$175, createComponent(Show, {
1702
1804
  get when() {
1703
1805
  return memo(() => !!params.icon)() && !(isExecuting() && isExecutable());
1704
1806
  },
1705
1807
  get children() {
1706
- var _el$198 = getNextElement(_tmpl$46);
1707
- insert(_el$198, () => params.icon);
1708
- return _el$198;
1808
+ var _el$177 = getNextElement(_tmpl$44);
1809
+ insert(_el$177, () => params.icon);
1810
+ return _el$177;
1709
1811
  }
1710
- }), _el$202, _co$43);
1711
- insert(_el$196, () => params.label, _el$204, _co$44);
1812
+ }), _el$181, _co$37);
1813
+ insert(_el$175, () => params.label, _el$183, _co$38);
1712
1814
  effect((_p$) => {
1713
- var _v$38 = isDisabled(), _v$39 = isExecuting() && isExecutable(), _v$40 = params.ariaLabel || params.label, _v$41 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500
1815
+ var _v$42 = isDisabled(), _v$43 = isExecuting() && isExecutable(), _v$44 = params.ariaLabel || params.label, _v$45 = `inline-flex items-center gap-2 px-4 py-2 rounded-md text-sm font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500
1714
1816
  ${params.variant === "primary" ? "bg-blue-600 text-white hover:bg-blue-700 shadow-sm" : params.variant === "secondary" ? "bg-gray-100 text-gray-900 hover:bg-gray-200 dark:bg-gray-700 dark:text-white dark:hover:bg-gray-600" : params.variant === "outline" ? "border border-gray-300 text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800" : params.variant === "danger" ? "bg-red-600 text-white hover:bg-red-700" : "bg-transparent text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800"}
1715
1817
  ${isDisabled() ? "opacity-50 cursor-not-allowed" : ""}
1716
1818
  ${params.size === "sm" ? "px-3 py-1.5 text-xs" : params.size === "lg" ? "px-6 py-3 text-base" : ""}
1717
1819
  ${params.className || ""}`;
1718
- _v$38 !== _p$.e && setProperty(_el$196, "disabled", _p$.e = _v$38);
1719
- _v$39 !== _p$.t && setAttribute(_el$196, "aria-busy", _p$.t = _v$39);
1720
- _v$40 !== _p$.a && setAttribute(_el$196, "aria-label", _p$.a = _v$40);
1721
- _v$41 !== _p$.o && className(_el$196, _p$.o = _v$41);
1820
+ _v$42 !== _p$.e && setProperty(_el$175, "disabled", _p$.e = _v$42);
1821
+ _v$43 !== _p$.t && setAttribute(_el$175, "aria-busy", _p$.t = _v$43);
1822
+ _v$44 !== _p$.a && setAttribute(_el$175, "aria-label", _p$.a = _v$44);
1823
+ _v$45 !== _p$.o && className(_el$175, _p$.o = _v$45);
1722
1824
  return _p$;
1723
1825
  }, {
1724
1826
  e: void 0,
@@ -1727,63 +1829,76 @@ function ActionRenderer(props) {
1727
1829
  o: void 0
1728
1830
  });
1729
1831
  runHydrationEvents();
1730
- return _el$196;
1832
+ return _el$175;
1731
1833
  })();
1732
1834
  }
1733
1835
  function ErrorCardRenderer(props) {
1836
+ const strings = useMCPUIStrings();
1837
+ const [mounted, setMounted] = createSignal(false);
1838
+ onMount(() => setMounted(true));
1734
1839
  const getErrorText = () => {
1735
- return `Error in ${props.error.tool || "unknown tool"}: ${props.error.message || "Unknown error"}`;
1840
+ return formatMCPUIString(strings.errorCopyText, {
1841
+ tool: props.error.tool || strings.errorUnknownTool,
1842
+ message: props.error.message || strings.errorUnknown
1843
+ });
1736
1844
  };
1737
1845
  return (() => {
1738
- var _el$205 = getNextElement(_tmpl$53), _el$228 = _el$205.firstChild, [_el$229, _co$50] = getNextMarker(_el$228.nextSibling), _el$206 = _el$229.nextSibling, _el$207 = _el$206.firstChild, _el$208 = _el$207.nextSibling, _el$209 = _el$208.firstChild, _el$210 = _el$209.firstChild, _el$211 = _el$210.nextSibling, [_el$212, _co$45] = getNextMarker(_el$211.nextSibling), _el$213 = _el$209.nextSibling, _el$222 = _el$213.nextSibling, [_el$223, _co$47] = getNextMarker(_el$222.nextSibling), _el$224 = _el$223.nextSibling, [_el$225, _co$48] = getNextMarker(_el$224.nextSibling), _el$226 = _el$225.nextSibling, [_el$227, _co$49] = getNextMarker(_el$226.nextSibling);
1739
- insert(_el$205, createComponent(CopyButton, {
1846
+ var _el$184 = getNextElement(_tmpl$51), _el$201 = _el$184.firstChild, [_el$202, _co$42] = getNextMarker(_el$201.nextSibling), _el$185 = _el$202.nextSibling, _el$186 = _el$185.firstChild, _el$187 = _el$186.nextSibling, _el$188 = _el$187.firstChild, _el$189 = _el$188.nextSibling, _el$195 = _el$189.nextSibling, [_el$196, _co$39] = getNextMarker(_el$195.nextSibling), _el$197 = _el$196.nextSibling, [_el$198, _co$40] = getNextMarker(_el$197.nextSibling), _el$199 = _el$198.nextSibling, [_el$200, _co$41] = getNextMarker(_el$199.nextSibling);
1847
+ insert(_el$184, createComponent(CopyButton, {
1740
1848
  getText: getErrorText,
1741
- title: "Copy error details",
1849
+ get title() {
1850
+ return strings.copyErrorDetails;
1851
+ },
1742
1852
  position: "top-right"
1743
- }), _el$229, _co$50);
1744
- insert(_el$209, () => props.error.tool || "Unknown", _el$212, _co$45);
1745
- insert(_el$213, () => props.error.message || "An error occurred during tool execution");
1746
- insert(_el$208, createComponent(Show, {
1853
+ }), _el$202, _co$42);
1854
+ insert(_el$188, () => formatMCPUIString(strings.toolErrorTitle, {
1855
+ tool: props.error.tool || strings.errorUnknownToolName
1856
+ }));
1857
+ insert(_el$189, () => props.error.message || strings.errorToolExecution);
1858
+ insert(_el$187, createComponent(Show, {
1747
1859
  get when() {
1748
1860
  return props.error.type;
1749
1861
  },
1750
1862
  get children() {
1751
- var _el$214 = getNextElement(_tmpl$50), _el$215 = _el$214.firstChild, _el$216 = _el$215.nextSibling, [_el$217, _co$46] = getNextMarker(_el$216.nextSibling);
1752
- insert(_el$214, () => props.error.type, _el$217, _co$46);
1753
- return _el$214;
1863
+ var _el$190 = getNextElement(_tmpl$48);
1864
+ insert(_el$190, () => formatMCPUIString(strings.errorTypeLabel, {
1865
+ type: props.error.type
1866
+ }));
1867
+ return _el$190;
1754
1868
  }
1755
- }), _el$223, _co$47);
1756
- insert(_el$208, createComponent(Show, {
1869
+ }), _el$196, _co$39);
1870
+ insert(_el$187, createComponent(Show, {
1757
1871
  get when() {
1758
1872
  var _a;
1759
1873
  return (_a = props.error.suggestions) == null ? void 0 : _a.length;
1760
1874
  },
1761
1875
  get children() {
1762
- var _el$218 = getNextElement(_tmpl$51), _el$219 = _el$218.firstChild, _el$220 = _el$219.nextSibling;
1763
- insert(_el$220, createComponent(For, {
1876
+ var _el$191 = getNextElement(_tmpl$49), _el$192 = _el$191.firstChild, _el$193 = _el$192.nextSibling;
1877
+ insert(_el$192, () => strings.errorSuggestions);
1878
+ insert(_el$193, createComponent(For, {
1764
1879
  get each() {
1765
1880
  return props.error.suggestions;
1766
1881
  },
1767
1882
  children: (suggestion) => (() => {
1768
- var _el$230 = getNextElement(_tmpl$54);
1769
- insert(_el$230, suggestion);
1770
- return _el$230;
1883
+ var _el$203 = getNextElement(_tmpl$52);
1884
+ insert(_el$203, suggestion);
1885
+ return _el$203;
1771
1886
  })()
1772
1887
  }));
1773
- return _el$218;
1888
+ return _el$191;
1774
1889
  }
1775
- }), _el$225, _co$48);
1776
- insert(_el$208, createComponent(Show, {
1890
+ }), _el$198, _co$40);
1891
+ insert(_el$187, createComponent(Show, {
1777
1892
  get when() {
1778
- return props.error.timestamp;
1893
+ return memo(() => !!mounted())() && props.error.timestamp;
1779
1894
  },
1780
1895
  get children() {
1781
- var _el$221 = getNextElement(_tmpl$52);
1782
- insert(_el$221, () => new Date(props.error.timestamp).toLocaleString());
1783
- return _el$221;
1896
+ var _el$194 = getNextElement(_tmpl$50);
1897
+ insert(_el$194, () => new Date(props.error.timestamp).toLocaleString(strings.locale));
1898
+ return _el$194;
1784
1899
  }
1785
- }), _el$227, _co$49);
1786
- return _el$205;
1900
+ }), _el$200, _co$41);
1901
+ return _el$184;
1787
1902
  })();
1788
1903
  }
1789
1904
  function isErrorResponse(content) {
@@ -1794,6 +1909,7 @@ function isUIResource(content) {
1794
1909
  return content && typeof content === "object" && (((_a = content.uri) == null ? void 0 : _a.startsWith("ui://")) || ((_b = content.content) == null ? void 0 : _b.type) === "rawHtml" || ((_c = content.content) == null ? void 0 : _c.htmlString));
1795
1910
  }
1796
1911
  function UIResourceHtmlRenderer(props) {
1912
+ const strings = useMCPUIStrings();
1797
1913
  const htmlContent = () => {
1798
1914
  var _a;
1799
1915
  if ((_a = props.resource.content) == null ? void 0 : _a.htmlString) {
@@ -1803,26 +1919,26 @@ function UIResourceHtmlRenderer(props) {
1803
1919
  };
1804
1920
  const resourceTitle = () => {
1805
1921
  var _a, _b;
1806
- return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || ((_b = props.resource.uri) == null ? void 0 : _b.replace("ui://deposium/", "")) || "Resource";
1922
+ return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || ((_b = props.resource.uri) == null ? void 0 : _b.replace("ui://deposium/", "")) || strings.resourceTitle;
1807
1923
  };
1808
1924
  return (() => {
1809
- var _el$231 = getNextElement(_tmpl$56), _el$234 = _el$231.firstChild, [_el$235, _co$51] = getNextMarker(_el$234.nextSibling), _el$236 = _el$235.nextSibling, [_el$237, _co$52] = getNextMarker(_el$236.nextSibling);
1810
- insert(_el$231, createComponent(Show, {
1925
+ var _el$204 = getNextElement(_tmpl$54), _el$207 = _el$204.firstChild, [_el$208, _co$43] = getNextMarker(_el$207.nextSibling), _el$209 = _el$208.nextSibling, [_el$210, _co$44] = getNextMarker(_el$209.nextSibling);
1926
+ insert(_el$204, createComponent(Show, {
1811
1927
  get when() {
1812
1928
  var _a;
1813
1929
  return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || props.resource.uri;
1814
1930
  },
1815
1931
  get children() {
1816
- var _el$232 = getNextElement(_tmpl$55), _el$233 = _el$232.firstChild;
1817
- insert(_el$233, resourceTitle);
1818
- return _el$232;
1932
+ var _el$205 = getNextElement(_tmpl$53), _el$206 = _el$205.firstChild;
1933
+ insert(_el$206, resourceTitle);
1934
+ return _el$205;
1819
1935
  }
1820
- }), _el$235, _co$51);
1821
- insert(_el$231, createComponent(SafeHtml, {
1936
+ }), _el$208, _co$43);
1937
+ insert(_el$204, createComponent(SafeHtml, {
1822
1938
  "class": "p-4 prose prose-sm dark:prose-invert max-w-none",
1823
1939
  html: htmlContent
1824
- }), _el$237, _co$52);
1825
- return _el$231;
1940
+ }), _el$210, _co$44);
1941
+ return _el$204;
1826
1942
  })();
1827
1943
  }
1828
1944
  const UIResourceRenderer = (props) => {
@@ -1928,8 +2044,8 @@ const UIResourceRenderer = (props) => {
1928
2044
  return createComponent(RenderProvider, {
1929
2045
  renderComponent,
1930
2046
  get children() {
1931
- var _el$238 = getNextElement(_tmpl$57), _el$239 = _el$238.firstChild, _el$240 = _el$239.nextSibling, [_el$241, _co$53] = getNextMarker(_el$240.nextSibling);
1932
- spread(_el$238, mergeProps({
2047
+ var _el$211 = getNextElement(_tmpl$55), _el$212 = _el$211.firstChild, _el$213 = _el$212.nextSibling, [_el$214, _co$45] = getNextMarker(_el$213.nextSibling);
2048
+ spread(_el$211, mergeProps({
1933
2049
  get ["class"]() {
1934
2050
  return `w-full ${props.class || ""}`;
1935
2051
  }
@@ -1939,14 +2055,14 @@ const UIResourceRenderer = (props) => {
1939
2055
  "data-mcp-ui-component-id": outerKey()
1940
2056
  }), false, true);
1941
2057
  var _ref$3 = responsiveGrid.ref;
1942
- typeof _ref$3 === "function" ? use(_ref$3, _el$239) : responsiveGrid.ref = _el$239;
1943
- insert(_el$239, createComponent(For, {
2058
+ typeof _ref$3 === "function" ? use(_ref$3, _el$212) : responsiveGrid.ref = _el$212;
2059
+ insert(_el$212, createComponent(For, {
1944
2060
  get each() {
1945
2061
  return layout().components;
1946
2062
  },
1947
2063
  children: (component) => (() => {
1948
- var _el$242 = getNextElement(_tmpl$58);
1949
- insert(_el$242, createComponent(ComponentRenderer, {
2064
+ var _el$215 = getNextElement(_tmpl$56);
2065
+ insert(_el$215, createComponent(ComponentRenderer, {
1950
2066
  component,
1951
2067
  get onError() {
1952
2068
  return props.onError;
@@ -1962,18 +2078,18 @@ const UIResourceRenderer = (props) => {
1962
2078
  }
1963
2079
  }));
1964
2080
  effect((_p$) => {
1965
- var _v$44 = getGridStyleString(component), _v$45 = getUiResourceStableKey(component);
1966
- _p$.e = style(_el$242, _v$44, _p$.e);
1967
- _v$45 !== _p$.t && setAttribute(_el$242, "data-mcp-ui-component-id", _p$.t = _v$45);
2081
+ var _v$48 = getGridStyleString(component), _v$49 = getUiResourceStableKey(component);
2082
+ _p$.e = style(_el$215, _v$48, _p$.e);
2083
+ _v$49 !== _p$.t && setAttribute(_el$215, "data-mcp-ui-component-id", _p$.t = _v$49);
1968
2084
  return _p$;
1969
2085
  }, {
1970
2086
  e: void 0,
1971
2087
  t: void 0
1972
2088
  });
1973
- return _el$242;
2089
+ return _el$215;
1974
2090
  })()
1975
2091
  }));
1976
- insert(_el$238, createComponent(Show, {
2092
+ insert(_el$211, createComponent(Show, {
1977
2093
  get when() {
1978
2094
  return shouldShowAutoFooter();
1979
2095
  },
@@ -1984,18 +2100,18 @@ const UIResourceRenderer = (props) => {
1984
2100
  }
1985
2101
  });
1986
2102
  }
1987
- }), _el$241, _co$53);
2103
+ }), _el$214, _co$45);
1988
2104
  effect((_p$) => {
1989
- var _v$42 = gridContainerStyle(), _v$43 = responsiveGrid.stacked();
1990
- _p$.e = style(_el$239, _v$42, _p$.e);
1991
- _v$43 !== _p$.t && setAttribute(_el$239, "data-mcp-ui-stacked", _p$.t = _v$43);
2105
+ var _v$46 = gridContainerStyle(), _v$47 = responsiveGrid.stacked();
2106
+ _p$.e = style(_el$212, _v$46, _p$.e);
2107
+ _v$47 !== _p$.t && setAttribute(_el$212, "data-mcp-ui-stacked", _p$.t = _v$47);
1992
2108
  return _p$;
1993
2109
  }, {
1994
2110
  e: void 0,
1995
2111
  t: void 0
1996
2112
  });
1997
2113
  runHydrationEvents();
1998
- return _el$238;
2114
+ return _el$211;
1999
2115
  }
2000
2116
  });
2001
2117
  };