@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
@@ -36,6 +36,9 @@ const stableKey = require("../utils/stable-key.cjs");
36
36
  const duplicateMountRegistry = require("../utils/duplicate-mount-registry.cjs");
37
37
  const MCPUITelemetryContext = require("../context/MCPUITelemetryContext.cjs");
38
38
  const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
39
+ const MCPUIConfigContext = require("../context/MCPUIConfigContext.cjs");
40
+ const iframeCoep = require("../utils/iframe-coep.cjs");
41
+ const IframeFallbackLink = require("./IframeFallbackLink.cjs");
39
42
  const GridRenderer = require("./GridRenderer.cjs");
40
43
  const FooterRenderer = require("./FooterRenderer.cjs");
41
44
  const CarouselRenderer = require("./CarouselRenderer.cjs");
@@ -57,8 +60,10 @@ const RenderContext = require("./RenderContext.cjs");
57
60
  const useAction = require("../hooks/useAction.cjs");
58
61
  const createResponsiveGrid = require("../hooks/createResponsiveGrid.cjs");
59
62
  const marked = require("marked");
60
- var _tmpl$ = /* @__PURE__ */ web.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__ */ web.template(`<button data-mcp-ui-action=copy type=button>`), _tmpl$3 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<div class=p-3>`), _tmpl$6 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$9 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">`), _tmpl$10 = /* @__PURE__ */ web.template(`<tr>`), _tmpl$11 = /* @__PURE__ */ web.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__ */ web.template(`<tbody class="bg-white dark:bg-gray-800 relative">`), _tmpl$13 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<span class="ml-2 text-xs font-normal text-gray-400">(virtualized: <!$><!/> rows)`), _tmpl$18 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3 flex-shrink-0"><!$><!/><!$><!/>`), _tmpl$19 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 mb-2"><!$><!/> result<!$><!/> on <!$><!/>`), _tmpl$22 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<span class=text-gray-400>/ page`), _tmpl$25 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<option>`), _tmpl$29 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$30 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$31 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$32 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<a target=_blank rel="noopener noreferrer"class=cursor-zoom-in>`), _tmpl$37 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$42 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<span aria-hidden=true>`), _tmpl$47 = /* @__PURE__ */ web.template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$48 = /* @__PURE__ */ web.template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"aria-hidden=true>`), _tmpl$49 = /* @__PURE__ */ web.template(`<button type=button><!$><!/><!$><!/><!$><!/>`), _tmpl$50 = /* @__PURE__ */ web.template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">Type: <!$><!/>`), _tmpl$51 = /* @__PURE__ */ web.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__ */ web.template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$53 = /* @__PURE__ */ web.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__ */ web.template(`<li>`), _tmpl$55 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<div><div class="grid gap-4"data-mcp-ui-grid></div><!$><!/>`), _tmpl$58 = /* @__PURE__ */ web.template(`<div class=min-w-0>`);
63
+ const formatString = require("../utils/format-string.cjs");
64
+ var _tmpl$ = /* @__PURE__ */ web.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__ */ web.template(`<button data-mcp-ui-action=copy type=button>`), _tmpl$3 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<div class=p-3>`), _tmpl$6 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3">`), _tmpl$9 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<tbody class="bg-white dark:bg-gray-800 divide-y divide-gray-200 dark:divide-gray-700">`), _tmpl$10 = /* @__PURE__ */ web.template(`<tr>`), _tmpl$11 = /* @__PURE__ */ web.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__ */ web.template(`<tbody class="bg-white dark:bg-gray-800 relative">`), _tmpl$13 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<span class="ml-2 text-xs font-normal text-gray-400">`), _tmpl$16 = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white mb-3 flex-shrink-0"><!$><!/><!$><!/>`), _tmpl$17 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 mb-2">`), _tmpl$20 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center justify-between text-xs text-gray-500 dark:text-gray-400"><span>`), _tmpl$21 = /* @__PURE__ */ web.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__ */ web.template(`<span class=text-gray-400>`), _tmpl$23 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<option>`), _tmpl$27 = /* @__PURE__ */ web.template(`<span class="ml-2 text-sm font-medium text-gray-500 dark:text-gray-400">`), _tmpl$28 = /* @__PURE__ */ web.template(`<div class="mt-3 flex items-center"><span><!$><!/> <!$><!/>%`), _tmpl$29 = /* @__PURE__ */ web.template(`<p class="mt-2 text-xs text-gray-500 dark:text-gray-400">`), _tmpl$30 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<a target=_blank rel="noopener noreferrer"class=cursor-zoom-in>`), _tmpl$35 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<p class="text-xs text-gray-500 dark:text-gray-400 truncate">`), _tmpl$40 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<span aria-hidden=true>`), _tmpl$45 = /* @__PURE__ */ web.template(`<a rel="noopener noreferrer"><!$><!/><!$><!/>`), _tmpl$46 = /* @__PURE__ */ web.template(`<span class="animate-spin h-4 w-4 border-2 border-current border-t-transparent rounded-full"aria-hidden=true>`), _tmpl$47 = /* @__PURE__ */ web.template(`<button type=button><!$><!/><!$><!/><!$><!/>`), _tmpl$48 = /* @__PURE__ */ web.template(`<p class="text-xs text-red-600 dark:text-red-400 mt-1">`), _tmpl$49 = /* @__PURE__ */ web.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__ */ web.template(`<p class="text-xs text-red-500 dark:text-red-500 mt-2">`), _tmpl$51 = /* @__PURE__ */ web.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__ */ web.template(`<li>`), _tmpl$53 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<div><div class="grid gap-4"data-mcp-ui-grid></div><!$><!/>`), _tmpl$56 = /* @__PURE__ */ web.template(`<div class=min-w-0>`);
61
65
  function CopyButton(props) {
66
+ const strings = MCPUIStringsContext.useMCPUIStrings();
62
67
  const [copied, setCopied] = solidJs.createSignal(false);
63
68
  const handleCopy = async () => {
64
69
  try {
@@ -87,7 +92,7 @@ function CopyButton(props) {
87
92
  }
88
93
  }));
89
94
  web.effect((_p$) => {
90
- 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";
95
+ 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;
91
96
  _v$ !== _p$.e && web.className(_el$, _p$.e = _v$);
92
97
  _v$2 !== _p$.t && web.setAttribute(_el$, "title", _p$.t = _v$2);
93
98
  _v$3 !== _p$.a && web.setAttribute(_el$, "aria-label", _p$.a = _v$3);
@@ -103,6 +108,7 @@ function CopyButton(props) {
103
108
  }
104
109
  function ChartRenderer(props) {
105
110
  var _a, _b;
111
+ const strings = MCPUIStringsContext.useMCPUIStrings();
106
112
  const [useNative, setUseNative] = solidJs.createSignal(false);
107
113
  const [iframeUrl, setIframeUrl] = solidJs.createSignal();
108
114
  const [isLoading, setIsLoading] = solidJs.createSignal(true);
@@ -115,6 +121,12 @@ function ChartRenderer(props) {
115
121
  return ((_a2 = params()) == null ? void 0 : _a2.renderer) || "auto";
116
122
  };
117
123
  const allowQuickchart = () => props.allowQuickchartFallback === true;
124
+ const chartImageAlt = () => {
125
+ var _a2;
126
+ return ((_a2 = params()) == null ? void 0 : _a2.title) ? formatString.formatMCPUIString(strings.chartWithTitleAlt, {
127
+ title: String(params().title)
128
+ }) : strings.chartVisualizationAlt;
129
+ };
118
130
  const signalBlockedFallback = (reason) => {
119
131
  setDegraded(true);
120
132
  setIsLoading(false);
@@ -128,7 +140,11 @@ function ChartRenderer(props) {
128
140
  });
129
141
  };
130
142
  if (!((_b = (_a = params()) == null ? void 0 : _a.data) == null ? void 0 : _b.datasets)) {
131
- return web.getNextElement(_tmpl$4);
143
+ return (() => {
144
+ var _el$4 = web.getNextElement(_tmpl$4), _el$5 = _el$4.firstChild;
145
+ web.insert(_el$5, () => strings.chartInvalidData);
146
+ return _el$4;
147
+ })();
132
148
  }
133
149
  solidJs.createEffect(async () => {
134
150
  const pref = rendererPref();
@@ -145,7 +161,7 @@ function ChartRenderer(props) {
145
161
  setUseNative(true);
146
162
  setIsLoading(false);
147
163
  } else {
148
- setError("Chart.js is not available. Install chart.js peer dependency.");
164
+ setError(strings.chartJsUnavailable);
149
165
  setIsLoading(false);
150
166
  }
151
167
  } else {
@@ -185,61 +201,68 @@ function ChartRenderer(props) {
185
201
  },
186
202
  get fallback() {
187
203
  return (() => {
188
- var _el$5 = web.getNextElement(_tmpl$0), _el$16 = _el$5.firstChild, [_el$17, _co$2] = web.getNextMarker(_el$16.nextSibling), _el$18 = _el$17.nextSibling, [_el$19, _co$3] = web.getNextMarker(_el$18.nextSibling), _el$20 = _el$19.nextSibling, [_el$21, _co$4] = web.getNextMarker(_el$20.nextSibling), _el$22 = _el$21.nextSibling, [_el$23, _co$5] = web.getNextMarker(_el$22.nextSibling);
189
- web.insert(_el$5, web.createComponent(solidJs.Show, {
204
+ var _el$6 = web.getNextElement(_tmpl$0), _el$17 = _el$6.firstChild, [_el$18, _co$2] = web.getNextMarker(_el$17.nextSibling), _el$19 = _el$18.nextSibling, [_el$20, _co$3] = web.getNextMarker(_el$19.nextSibling), _el$21 = _el$20.nextSibling, [_el$22, _co$4] = web.getNextMarker(_el$21.nextSibling), _el$23 = _el$22.nextSibling, [_el$24, _co$5] = web.getNextMarker(_el$23.nextSibling);
205
+ web.insert(_el$6, web.createComponent(solidJs.Show, {
190
206
  get when() {
191
207
  return degraded();
192
208
  },
193
209
  get children() {
194
- var _el$6 = web.getNextElement(_tmpl$5);
195
- web.insert(_el$6, web.createComponent(DegradedFallback.DegradedFallback, web.mergeProps({
196
- message: "Interactive chart unavailable — install the chart.js peer dependency, or set allowQuickchartFallback to use the external quickchart.io renderer.",
197
- caption: "Showing the chart data as a table."
198
- }, () => degradedProjections.chartToDegradedTable(params() ?? {}))));
199
- return _el$6;
210
+ var _el$7 = web.getNextElement(_tmpl$5);
211
+ web.insert(_el$7, web.createComponent(DegradedFallback.DegradedFallback, web.mergeProps({
212
+ get message() {
213
+ return strings.chartIframeUnavailable;
214
+ },
215
+ get caption() {
216
+ return strings.chartQuickchartCaption;
217
+ }
218
+ }, () => degradedProjections.chartToDegradedTable(params() ?? {}, {
219
+ series: strings.degradedSeries
220
+ }))));
221
+ return _el$7;
200
222
  }
201
- }), _el$17, _co$2);
202
- web.insert(_el$5, web.createComponent(solidJs.Show, {
223
+ }), _el$18, _co$2);
224
+ web.insert(_el$6, web.createComponent(solidJs.Show, {
203
225
  get when() {
204
226
  return isLoading();
205
227
  },
206
228
  get children() {
207
229
  return web.getNextElement(_tmpl$6);
208
230
  }
209
- }), _el$19, _co$3);
210
- web.insert(_el$5, web.createComponent(solidJs.Show, {
231
+ }), _el$20, _co$3);
232
+ web.insert(_el$6, web.createComponent(solidJs.Show, {
211
233
  get when() {
212
234
  return error();
213
235
  },
214
236
  get children() {
215
- var _el$8 = web.getNextElement(_tmpl$7), _el$9 = _el$8.firstChild, _el$0 = _el$9.firstChild, _el$1 = _el$0.nextSibling;
216
- web.insert(_el$1, error);
217
- return _el$8;
237
+ var _el$9 = web.getNextElement(_tmpl$7), _el$0 = _el$9.firstChild, _el$1 = _el$0.firstChild, _el$10 = _el$1.nextSibling;
238
+ web.insert(_el$1, () => strings.chartError);
239
+ web.insert(_el$10, error);
240
+ return _el$9;
218
241
  }
219
- }), _el$21, _co$4);
220
- web.insert(_el$5, web.createComponent(solidJs.Show, {
242
+ }), _el$22, _co$4);
243
+ web.insert(_el$6, web.createComponent(solidJs.Show, {
221
244
  get when() {
222
245
  return web.memo(() => !!iframeUrl())() && !error();
223
246
  },
224
247
  get children() {
225
- var _el$10 = web.getNextElement(_tmpl$9), _el$14 = _el$10.firstChild, [_el$15, _co$] = web.getNextMarker(_el$14.nextSibling), _el$12 = _el$15.nextSibling, _el$13 = _el$12.firstChild;
226
- web.insert(_el$10, web.createComponent(solidJs.Show, {
248
+ var _el$11 = web.getNextElement(_tmpl$9), _el$15 = _el$11.firstChild, [_el$16, _co$] = web.getNextMarker(_el$15.nextSibling), _el$13 = _el$16.nextSibling, _el$14 = _el$13.firstChild;
249
+ web.insert(_el$11, web.createComponent(solidJs.Show, {
227
250
  get when() {
228
251
  var _a2;
229
252
  return (_a2 = params()) == null ? void 0 : _a2.title;
230
253
  },
231
254
  get children() {
232
- var _el$11 = web.getNextElement(_tmpl$8);
233
- web.insert(_el$11, () => {
255
+ var _el$12 = web.getNextElement(_tmpl$8);
256
+ web.insert(_el$12, () => {
234
257
  var _a2;
235
258
  return (_a2 = params()) == null ? void 0 : _a2.title;
236
259
  });
237
- return _el$11;
260
+ return _el$12;
238
261
  }
239
- }), _el$15, _co$);
240
- _el$13.addEventListener("error", () => {
262
+ }), _el$16, _co$);
263
+ _el$14.addEventListener("error", () => {
241
264
  var _a2;
242
- setError("Failed to load chart");
265
+ setError(strings.chartLoadFailed);
243
266
  (_a2 = props.onError) == null ? void 0 : _a2.call(props, {
244
267
  type: "render",
245
268
  message: "Chart rendering failed",
@@ -247,21 +270,20 @@ function ChartRenderer(props) {
247
270
  });
248
271
  });
249
272
  web.effect((_p$) => {
250
- var _a2, _b2, _c, _d;
251
- 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";
252
- _v$4 !== _p$.e && web.setAttribute(_el$12, "aria-label", _p$.e = _v$4);
253
- _v$5 !== _p$.t && web.setAttribute(_el$13, "src", _p$.t = _v$5);
254
- _v$6 !== _p$.a && web.setAttribute(_el$13, "alt", _p$.a = _v$6);
273
+ var _v$4 = chartImageAlt(), _v$5 = iframeUrl(), _v$6 = chartImageAlt();
274
+ _v$4 !== _p$.e && web.setAttribute(_el$13, "aria-label", _p$.e = _v$4);
275
+ _v$5 !== _p$.t && web.setAttribute(_el$14, "src", _p$.t = _v$5);
276
+ _v$6 !== _p$.a && web.setAttribute(_el$14, "alt", _p$.a = _v$6);
255
277
  return _p$;
256
278
  }, {
257
279
  e: void 0,
258
280
  t: void 0,
259
281
  a: void 0
260
282
  });
261
- return _el$10;
283
+ return _el$11;
262
284
  }
263
- }), _el$23, _co$5);
264
- return _el$5;
285
+ }), _el$24, _co$5);
286
+ return _el$6;
265
287
  })();
266
288
  },
267
289
  get children() {
@@ -328,13 +350,15 @@ function highlightQuery(html, query) {
328
350
  }
329
351
  return template.innerHTML;
330
352
  }
331
- function defaultCitationChip(pageNum, fileName, verified = true) {
353
+ function defaultCitationChip(pageNum, fileName, verified = true, viewSourceLabel = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.citationViewSource) {
332
354
  const safeDocName = encodeURIComponent(fileName || "");
333
355
  const label = fileName ? `${fileName} - ${pageNum}` : `${pageNum}`;
334
356
  if (!verified) {
335
357
  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>`;
336
358
  }
337
- 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("");
359
+ 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.escapeHtml(formatString.formatMCPUIString(viewSourceLabel, {
360
+ label
361
+ }))}">`, '<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("");
338
362
  }
339
363
  function transformCellCitations(text, ctx) {
340
364
  let out = text.replace(new RegExp("(?<![p.])\\[(\\d{1,2})\\](?!\\()", "g"), "[📄 CITATION $1]");
@@ -344,8 +368,10 @@ function transformCellCitations(text, ctx) {
344
368
  const id = parseInt(idStr, 10);
345
369
  const mapping = ctx.map[id] ?? ctx.map[String(id)];
346
370
  if (ctx.render) return ctx.render(id, mapping);
347
- if (mapping) return defaultCitationChip(mapping.page, mapping.file ?? "", true);
348
- return Object.keys(ctx.map).length > 0 ? "" : `[réf. ${id}]`;
371
+ if (mapping) return defaultCitationChip(mapping.page, mapping.file ?? "", true, ctx.viewSourceLabel);
372
+ return Object.keys(ctx.map).length > 0 ? "" : formatString.formatMCPUIString(ctx.unresolvedLabel ?? MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.citationUnresolved, {
373
+ id
374
+ });
349
375
  });
350
376
  }
351
377
  function renderCellValue(value, citationCtx) {
@@ -405,7 +431,14 @@ function TableRenderer(props) {
405
431
  const strings = MCPUIStringsContext.useMCPUIStrings();
406
432
  const citationCtx = tableParams.citationMap ? {
407
433
  map: tableParams.citationMap,
408
- render: tableParams.citationRender
434
+ render: tableParams.citationRender,
435
+ // Getters, not snapshots: cells read the provider's current wording.
436
+ get unresolvedLabel() {
437
+ return strings.citationUnresolved;
438
+ },
439
+ get viewSourceLabel() {
440
+ return strings.citationViewSource;
441
+ }
409
442
  } : void 0;
410
443
  const allRows = () => tableParams.rows || [];
411
444
  const columns = () => tableParams.columns || [];
@@ -441,7 +474,7 @@ function TableRenderer(props) {
441
474
  if (isNum) {
442
475
  cmp = (Number(va) || 0) - (Number(vb) || 0);
443
476
  } else {
444
- cmp = String(va).localeCompare(String(vb), "fr", {
477
+ cmp = String(va).localeCompare(String(vb), strings.locale, {
445
478
  sensitivity: "base"
446
479
  });
447
480
  }
@@ -456,7 +489,7 @@ function TableRenderer(props) {
456
489
  const [debouncedQuery, setDebouncedQuery] = solidJs.createSignal("");
457
490
  let searchTimer = null;
458
491
  const isSearchable = () => tableParams.searchable !== false;
459
- const searchPlaceholder = () => tableParams.searchPlaceholder || "Rechercher dans le tableau...";
492
+ const searchPlaceholder = () => tableParams.searchPlaceholder || strings.tableSearchPlaceholder;
460
493
  const handleSearch = (value) => {
461
494
  setSearchQuery(value);
462
495
  if (searchTimer) clearTimeout(searchTimer);
@@ -514,7 +547,7 @@ function TableRenderer(props) {
514
547
  }
515
548
  opts.push({
516
549
  value: 0,
517
- label: "All"
550
+ label: strings.paginationAllRows
518
551
  });
519
552
  return opts;
520
553
  };
@@ -641,30 +674,30 @@ ${dataRows}`;
641
674
  };
642
675
  const tableId = `table-${Math.random().toString(36).slice(2, 9)}`;
643
676
  const StandardTableBody = () => (() => {
644
- var _el$24 = web.getNextElement(_tmpl$1);
645
- web.insert(_el$24, web.createComponent(solidJs.For, {
677
+ var _el$25 = web.getNextElement(_tmpl$1);
678
+ web.insert(_el$25, web.createComponent(solidJs.For, {
646
679
  get each() {
647
680
  return clientVisibleRows().slice(0, validation.DEFAULT_RESOURCE_LIMITS.maxTableRows);
648
681
  },
649
682
  children: (row, i) => (() => {
650
- var _el$25 = web.getNextElement(_tmpl$10);
651
- web.insert(_el$25, web.createComponent(solidJs.For, {
683
+ var _el$26 = web.getNextElement(_tmpl$10);
684
+ web.insert(_el$26, web.createComponent(solidJs.For, {
652
685
  get each() {
653
686
  return tableParams.columns;
654
687
  },
655
688
  children: (column) => (() => {
656
- var _el$26 = web.getNextElement(_tmpl$11);
657
- web.insert(_el$26, web.createComponent(SafeHtml.SafeHtml, {
689
+ var _el$27 = web.getNextElement(_tmpl$11);
690
+ web.insert(_el$27, web.createComponent(SafeHtml.SafeHtml, {
658
691
  html: () => highlightQuery(renderCellValue(row[column.key], citationCtx), debouncedQuery())
659
692
  }));
660
- return _el$26;
693
+ return _el$27;
661
694
  })()
662
695
  }));
663
- web.effect(() => web.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"}`));
664
- return _el$25;
696
+ web.effect(() => web.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"}`));
697
+ return _el$26;
665
698
  })()
666
699
  }));
667
- return _el$24;
700
+ return _el$25;
668
701
  })();
669
702
  const VirtualizedTableBody = () => {
670
703
  const v = virtualizer();
@@ -674,72 +707,76 @@ ${dataRows}`;
674
707
  const opts = virtualizeOpts();
675
708
  const rowHeight = opts.rowHeight ?? 48;
676
709
  return (() => {
677
- var _el$27 = web.getNextElement(_tmpl$12);
678
- web.setStyleProperty(_el$27, "height", `${totalSize}px`);
679
- web.insert(_el$27, web.createComponent(solidJs.For, {
710
+ var _el$28 = web.getNextElement(_tmpl$12);
711
+ web.setStyleProperty(_el$28, "height", `${totalSize}px`);
712
+ web.insert(_el$28, web.createComponent(solidJs.For, {
680
713
  each: items,
681
714
  children: (virtualRow) => {
682
715
  const row = tableParams.rows[virtualRow.index];
683
716
  return (() => {
684
- var _el$28 = web.getNextElement(_tmpl$10);
685
- web.setStyleProperty(_el$28, "height", `${rowHeight}px`);
686
- web.insert(_el$28, web.createComponent(solidJs.For, {
717
+ var _el$29 = web.getNextElement(_tmpl$10);
718
+ web.setStyleProperty(_el$29, "height", `${rowHeight}px`);
719
+ web.insert(_el$29, web.createComponent(solidJs.For, {
687
720
  get each() {
688
721
  return tableParams.columns;
689
722
  },
690
723
  children: (column) => (() => {
691
- var _el$29 = web.getNextElement(_tmpl$11);
692
- web.insert(_el$29, web.createComponent(SafeHtml.SafeHtml, {
724
+ var _el$30 = web.getNextElement(_tmpl$11);
725
+ web.insert(_el$30, web.createComponent(SafeHtml.SafeHtml, {
693
726
  html: () => highlightQuery(renderCellValue(row[column.key], citationCtx), debouncedQuery())
694
727
  }));
695
- return _el$29;
728
+ return _el$30;
696
729
  })()
697
730
  }));
698
731
  web.effect((_p$) => {
699
732
  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)`;
700
- _v$7 !== _p$.e && web.className(_el$28, _p$.e = _v$7);
701
- _v$8 !== _p$.t && web.setStyleProperty(_el$28, "transform", _p$.t = _v$8);
733
+ _v$7 !== _p$.e && web.className(_el$29, _p$.e = _v$7);
734
+ _v$8 !== _p$.t && web.setStyleProperty(_el$29, "transform", _p$.t = _v$8);
702
735
  return _p$;
703
736
  }, {
704
737
  e: void 0,
705
738
  t: void 0
706
739
  });
707
- return _el$28;
740
+ return _el$29;
708
741
  })();
709
742
  }
710
743
  }));
711
- return _el$27;
744
+ return _el$28;
712
745
  })();
713
746
  };
714
747
  return web.createComponent(ExpandableWrapper.ExpandableWrapper, {
715
748
  get title() {
716
- return tableParams.title || "Table";
749
+ return tableParams.title || strings.tableTitle;
717
750
  },
718
751
  get copyData() {
719
752
  return getTableCSV();
720
753
  },
721
- copyLabel: "Copy table (CSV)",
754
+ get copyLabel() {
755
+ return strings.tableCopyCsv;
756
+ },
722
757
  get toolbarVariant() {
723
758
  return props.toolbarVariant;
724
759
  },
725
760
  onExpandedChange: setSelfExpanded,
726
761
  get children() {
727
- var _el$30 = web.getNextElement(_tmpl$26), _el$114 = _el$30.firstChild, [_el$115, _co$26] = web.getNextMarker(_el$114.nextSibling), _el$38 = _el$115.nextSibling, _el$106 = _el$38.firstChild, [_el$107, _co$22] = web.getNextMarker(_el$106.nextSibling), _el$108 = _el$107.nextSibling, [_el$109, _co$23] = web.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] = web.getNextMarker(_el$68.nextSibling), _el$110 = _el$64.nextSibling, [_el$111, _co$24] = web.getNextMarker(_el$110.nextSibling), _el$112 = _el$111.nextSibling, [_el$113, _co$25] = web.getNextMarker(_el$112.nextSibling);
728
- web.insert(_el$30, web.createComponent(solidJs.Show, {
762
+ var _el$31 = web.getNextElement(_tmpl$24), _el$92 = _el$31.firstChild, [_el$93, _co$19] = web.getNextMarker(_el$92.nextSibling), _el$39 = _el$93.nextSibling, _el$84 = _el$39.firstChild, [_el$85, _co$15] = web.getNextMarker(_el$84.nextSibling), _el$86 = _el$85.nextSibling, [_el$87, _co$16] = web.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] = web.getNextMarker(_el$57.nextSibling), _el$88 = _el$53.nextSibling, [_el$89, _co$17] = web.getNextMarker(_el$88.nextSibling), _el$90 = _el$89.nextSibling, [_el$91, _co$18] = web.getNextMarker(_el$90.nextSibling);
763
+ web.insert(_el$31, web.createComponent(solidJs.Show, {
729
764
  when: exportable,
730
765
  get fallback() {
731
766
  return web.createComponent(CopyButton, {
732
767
  getText: getTableCSV,
733
- title: "Copy table (CSV)",
768
+ get title() {
769
+ return strings.tableCopyCsv;
770
+ },
734
771
  position: "top-right"
735
772
  });
736
773
  },
737
774
  get children() {
738
- var _el$31 = web.getNextElement(_tmpl$16), _el$32 = _el$31.firstChild, _el$36 = _el$32.nextSibling, [_el$37, _co$6] = web.getNextMarker(_el$36.nextSibling);
739
- _el$32.$$click = () => setShowExportMenu(!showExportMenu());
775
+ var _el$32 = web.getNextElement(_tmpl$14), _el$33 = _el$32.firstChild, _el$37 = _el$33.nextSibling, [_el$38, _co$6] = web.getNextMarker(_el$37.nextSibling);
776
+ _el$33.$$click = () => setShowExportMenu(!showExportMenu());
740
777
  var _ref$ = exportTriggerRef;
741
- typeof _ref$ === "function" ? web.use(_ref$, _el$32) : exportTriggerRef = _el$32;
742
- web.insert(_el$31, web.createComponent(PortalDropdownMenu.PortalDropdownMenu, {
778
+ typeof _ref$ === "function" ? web.use(_ref$, _el$33) : exportTriggerRef = _el$33;
779
+ web.insert(_el$32, web.createComponent(PortalDropdownMenu.PortalDropdownMenu, {
743
780
  get open() {
744
781
  return showExportMenu();
745
782
  },
@@ -752,136 +789,154 @@ ${dataRows}`;
752
789
  return exportFormats.includes("tsv");
753
790
  },
754
791
  get children() {
755
- var _el$33 = web.getNextElement(_tmpl$13);
756
- _el$33.$$click = () => handleExport("tsv");
792
+ var _el$34 = web.getNextElement(_tmpl$13);
793
+ _el$34.$$click = () => handleExport("tsv");
794
+ web.insert(_el$34, () => strings.tableCopyTsv);
757
795
  web.runHydrationEvents();
758
- return _el$33;
796
+ return _el$34;
759
797
  }
760
798
  }), web.createComponent(solidJs.Show, {
761
799
  get when() {
762
800
  return exportFormats.includes("csv");
763
801
  },
764
802
  get children() {
765
- var _el$34 = web.getNextElement(_tmpl$14);
766
- _el$34.$$click = () => handleExport("csv");
803
+ var _el$35 = web.getNextElement(_tmpl$13);
804
+ _el$35.$$click = () => handleExport("csv");
805
+ web.insert(_el$35, () => strings.tableDownloadCsv);
767
806
  web.runHydrationEvents();
768
- return _el$34;
807
+ return _el$35;
769
808
  }
770
809
  }), web.createComponent(solidJs.Show, {
771
810
  get when() {
772
811
  return exportFormats.includes("json");
773
812
  },
774
813
  get children() {
775
- var _el$35 = web.getNextElement(_tmpl$15);
776
- _el$35.$$click = () => handleExport("json");
814
+ var _el$36 = web.getNextElement(_tmpl$13);
815
+ _el$36.$$click = () => handleExport("json");
816
+ web.insert(_el$36, () => strings.tableDownloadJson);
777
817
  web.runHydrationEvents();
778
- return _el$35;
818
+ return _el$36;
779
819
  }
780
820
  })];
781
821
  }
782
- }), _el$37, _co$6);
783
- web.effect(() => web.setAttribute(_el$32, "aria-expanded", showExportMenu()));
822
+ }), _el$38, _co$6);
823
+ web.effect((_p$) => {
824
+ var _v$9 = strings.tableExport, _v$0 = strings.tableExport, _v$1 = showExportMenu();
825
+ _v$9 !== _p$.e && web.setAttribute(_el$33, "title", _p$.e = _v$9);
826
+ _v$0 !== _p$.t && web.setAttribute(_el$33, "aria-label", _p$.t = _v$0);
827
+ _v$1 !== _p$.a && web.setAttribute(_el$33, "aria-expanded", _p$.a = _v$1);
828
+ return _p$;
829
+ }, {
830
+ e: void 0,
831
+ t: void 0,
832
+ a: void 0
833
+ });
784
834
  web.runHydrationEvents();
785
- return _el$31;
835
+ return _el$32;
786
836
  }
787
- }), _el$115, _co$26);
788
- web.insert(_el$38, web.createComponent(solidJs.Show, {
837
+ }), _el$93, _co$19);
838
+ web.insert(_el$39, web.createComponent(solidJs.Show, {
789
839
  get when() {
790
840
  return tableParams.title;
791
841
  },
792
842
  get children() {
793
- var _el$39 = web.getNextElement(_tmpl$18), _el$45 = _el$39.firstChild, [_el$46, _co$8] = web.getNextMarker(_el$45.nextSibling), _el$47 = _el$46.nextSibling, [_el$48, _co$9] = web.getNextMarker(_el$47.nextSibling);
794
- web.setAttribute(_el$39, "id", `${tableId}-title`);
795
- web.insert(_el$39, () => tableParams.title, _el$46, _co$8);
796
- web.insert(_el$39, web.createComponent(solidJs.Show, {
843
+ var _el$40 = web.getNextElement(_tmpl$16), _el$42 = _el$40.firstChild, [_el$43, _co$7] = web.getNextMarker(_el$42.nextSibling), _el$44 = _el$43.nextSibling, [_el$45, _co$8] = web.getNextMarker(_el$44.nextSibling);
844
+ web.setAttribute(_el$40, "id", `${tableId}-title`);
845
+ web.insert(_el$40, () => tableParams.title, _el$43, _co$7);
846
+ web.insert(_el$40, web.createComponent(solidJs.Show, {
797
847
  get when() {
798
848
  return isVirtualizing();
799
849
  },
800
850
  get children() {
801
- var _el$40 = web.getNextElement(_tmpl$17), _el$41 = _el$40.firstChild, _el$43 = _el$41.nextSibling, [_el$44, _co$7] = web.getNextMarker(_el$43.nextSibling);
802
- _el$44.nextSibling;
803
- web.insert(_el$40, () => {
851
+ var _el$41 = web.getNextElement(_tmpl$15);
852
+ web.insert(_el$41, () => {
804
853
  var _a;
805
- return (_a = tableParams.rows) == null ? void 0 : _a.length;
806
- }, _el$44, _co$7);
807
- return _el$40;
854
+ return formatString.formatMCPUIString(strings.tableVirtualizedRows, {
855
+ count: ((_a = tableParams.rows) == null ? void 0 : _a.length) ?? 0
856
+ });
857
+ });
858
+ return _el$41;
808
859
  }
809
- }), _el$48, _co$9);
810
- return _el$39;
860
+ }), _el$45, _co$8);
861
+ return _el$40;
811
862
  }
812
- }), _el$107, _co$22);
813
- web.insert(_el$38, web.createComponent(solidJs.Show, {
863
+ }), _el$85, _co$15);
864
+ web.insert(_el$39, web.createComponent(solidJs.Show, {
814
865
  get when() {
815
866
  return isSearchable();
816
867
  },
817
868
  get children() {
818
869
  return [(() => {
819
- var _el$49 = web.getNextElement(_tmpl$20), _el$50 = _el$49.firstChild, _el$51 = _el$50.nextSibling, _el$53 = _el$51.nextSibling, [_el$54, _co$0] = web.getNextMarker(_el$53.nextSibling);
820
- _el$51.$$input = (e) => handleSearch(e.currentTarget.value);
821
- web.insert(_el$49, web.createComponent(solidJs.Show, {
870
+ var _el$46 = web.getNextElement(_tmpl$18), _el$47 = _el$46.firstChild, _el$48 = _el$47.nextSibling, _el$50 = _el$48.nextSibling, [_el$51, _co$9] = web.getNextMarker(_el$50.nextSibling);
871
+ _el$48.$$input = (e) => handleSearch(e.currentTarget.value);
872
+ web.insert(_el$46, web.createComponent(solidJs.Show, {
822
873
  get when() {
823
874
  return searchQuery();
824
875
  },
825
876
  get children() {
826
- var _el$52 = web.getNextElement(_tmpl$19);
827
- _el$52.$$click = () => {
877
+ var _el$49 = web.getNextElement(_tmpl$17);
878
+ _el$49.$$click = () => {
828
879
  handleSearch("");
829
880
  setSearchQuery("");
830
881
  setDebouncedQuery("");
831
882
  };
883
+ web.effect(() => web.setAttribute(_el$49, "aria-label", strings.tableClearSearch));
832
884
  web.runHydrationEvents();
833
- return _el$52;
885
+ return _el$49;
834
886
  }
835
- }), _el$54, _co$0);
836
- web.effect(() => web.setAttribute(_el$51, "placeholder", searchPlaceholder()));
837
- web.effect(() => web.setProperty(_el$51, "value", searchQuery()));
887
+ }), _el$51, _co$9);
888
+ web.effect(() => web.setAttribute(_el$48, "placeholder", searchPlaceholder()));
889
+ web.effect(() => web.setProperty(_el$48, "value", searchQuery()));
838
890
  web.runHydrationEvents();
839
- return _el$49;
891
+ return _el$46;
840
892
  })(), web.createComponent(solidJs.Show, {
841
893
  get when() {
842
894
  return web.memo(() => !!debouncedQuery())() && filteredRows().length !== sortedRows().length;
843
895
  },
844
896
  get children() {
845
- var _el$55 = web.getNextElement(_tmpl$21), _el$58 = _el$55.firstChild, [_el$59, _co$1] = web.getNextMarker(_el$58.nextSibling), _el$56 = _el$59.nextSibling, _el$60 = _el$56.nextSibling, [_el$61, _co$10] = web.getNextMarker(_el$60.nextSibling), _el$57 = _el$61.nextSibling, _el$62 = _el$57.nextSibling, [_el$63, _co$11] = web.getNextMarker(_el$62.nextSibling);
846
- web.insert(_el$55, () => filteredRows().length, _el$59, _co$1);
847
- web.insert(_el$55, () => filteredRows().length !== 1 ? "s" : "", _el$61, _co$10);
848
- web.insert(_el$55, () => sortedRows().length, _el$63, _co$11);
849
- return _el$55;
897
+ var _el$52 = web.getNextElement(_tmpl$19);
898
+ web.insert(_el$52, () => formatString.formatMCPUIString(filteredRows().length === 1 ? strings.tableSearchResultsOne : strings.tableSearchResultsMany, {
899
+ count: filteredRows().length,
900
+ total: sortedRows().length
901
+ }));
902
+ return _el$52;
850
903
  }
851
904
  })];
852
905
  }
853
- }), _el$109, _co$23);
906
+ }), _el$87, _co$16);
854
907
  var _ref$2 = scrollContainerRef;
855
- typeof _ref$2 === "function" ? web.use(_ref$2, _el$64) : scrollContainerRef = _el$64;
856
- web.insert(_el$67, web.createComponent(solidJs.For, {
908
+ typeof _ref$2 === "function" ? web.use(_ref$2, _el$53) : scrollContainerRef = _el$53;
909
+ web.insert(_el$56, web.createComponent(solidJs.For, {
857
910
  get each() {
858
911
  return tableParams.columns;
859
912
  },
860
913
  children: (column) => (() => {
861
- var _el$116 = web.getNextElement(_tmpl$27), _el$117 = _el$116.firstChild, _el$119 = _el$117.firstChild, [_el$120, _co$27] = web.getNextMarker(_el$119.nextSibling), _el$118 = _el$120.nextSibling;
862
- web.addEventListener(_el$116, "click", () => handleSort(column.key));
863
- web.insert(_el$117, () => column.label, _el$120, _co$27);
864
- web.insert(_el$118, () => sortIndicator(column.key));
914
+ var _el$94 = web.getNextElement(_tmpl$25), _el$95 = _el$94.firstChild, _el$97 = _el$95.firstChild, [_el$98, _co$20] = web.getNextMarker(_el$97.nextSibling), _el$96 = _el$98.nextSibling;
915
+ web.addEventListener(_el$94, "click", () => handleSort(column.key));
916
+ web.insert(_el$95, () => column.label, _el$98, _co$20);
917
+ web.insert(_el$96, () => sortIndicator(column.key));
865
918
  web.effect((_p$) => {
866
- var _v$17 = column.width ? {
919
+ var _v$20 = column.width ? {
867
920
  width: column.width
868
- } : {}, _v$18 = `Sort by ${column.label}`, _v$19 = {
921
+ } : {}, _v$21 = formatString.formatMCPUIString(strings.sortBy, {
922
+ column: column.label
923
+ }), _v$22 = {
869
924
  "opacity-30": sortKey() !== column.key,
870
925
  "opacity-100 text-blue-600 dark:text-blue-400": sortKey() === column.key
871
926
  };
872
- _p$.e = web.style(_el$116, _v$17, _p$.e);
873
- _v$18 !== _p$.t && web.setAttribute(_el$116, "title", _p$.t = _v$18);
874
- _p$.a = web.classList(_el$118, _v$19, _p$.a);
927
+ _p$.e = web.style(_el$94, _v$20, _p$.e);
928
+ _v$21 !== _p$.t && web.setAttribute(_el$94, "title", _p$.t = _v$21);
929
+ _p$.a = web.classList(_el$96, _v$22, _p$.a);
875
930
  return _p$;
876
931
  }, {
877
932
  e: void 0,
878
933
  t: void 0,
879
934
  a: void 0
880
935
  });
881
- return _el$116;
936
+ return _el$94;
882
937
  })()
883
938
  }));
884
- web.insert(_el$65, web.createComponent(solidJs.Show, {
939
+ web.insert(_el$54, web.createComponent(solidJs.Show, {
885
940
  get when() {
886
941
  return isVirtualizing();
887
942
  },
@@ -891,63 +946,69 @@ ${dataRows}`;
891
946
  get children() {
892
947
  return web.createComponent(VirtualizedTableBody, {});
893
948
  }
894
- }), _el$69, _co$12);
895
- web.insert(_el$38, web.createComponent(solidJs.Show, {
949
+ }), _el$58, _co$0);
950
+ web.insert(_el$39, web.createComponent(solidJs.Show, {
896
951
  get when() {
897
952
  return tableParams.pagination;
898
953
  },
899
954
  get children() {
900
- var _el$70 = web.getNextElement(_tmpl$22), _el$71 = _el$70.firstChild, _el$72 = _el$71.firstChild, _el$77 = _el$72.nextSibling, [_el$78, _co$13] = web.getNextMarker(_el$77.nextSibling), _el$73 = _el$78.nextSibling, _el$79 = _el$73.nextSibling, [_el$80, _co$14] = web.getNextMarker(_el$79.nextSibling), _el$75 = _el$80.nextSibling, _el$81 = _el$75.nextSibling, [_el$82, _co$15] = web.getNextMarker(_el$81.nextSibling);
901
- web.insert(_el$71, () => tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1, _el$78, _co$13);
902
- web.insert(_el$71, () => Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows), _el$80, _co$14);
903
- web.insert(_el$71, () => tableParams.pagination.totalRows, _el$82, _co$15);
904
- return _el$70;
955
+ var _el$59 = web.getNextElement(_tmpl$20), _el$60 = _el$59.firstChild;
956
+ web.insert(_el$60, () => formatString.formatMCPUIString(strings.tableServerPageRange, {
957
+ start: tableParams.pagination.currentPage * tableParams.pagination.pageSize + 1,
958
+ end: Math.min((tableParams.pagination.currentPage + 1) * tableParams.pagination.pageSize, tableParams.pagination.totalRows),
959
+ total: tableParams.pagination.totalRows
960
+ }));
961
+ return _el$59;
905
962
  }
906
- }), _el$111, _co$24);
907
- web.insert(_el$38, web.createComponent(solidJs.Show, {
963
+ }), _el$89, _co$17);
964
+ web.insert(_el$39, web.createComponent(solidJs.Show, {
908
965
  get when() {
909
966
  return needsClientPagination();
910
967
  },
911
968
  get children() {
912
- var _el$83 = web.getNextElement(_tmpl$25), _el$84 = _el$83.firstChild, _el$87 = _el$84.firstChild, [_el$88, _co$16] = web.getNextMarker(_el$87.nextSibling), _el$85 = _el$88.nextSibling, _el$89 = _el$85.nextSibling, [_el$90, _co$17] = web.getNextMarker(_el$89.nextSibling), _el$86 = _el$90.nextSibling, _el$91 = _el$86.nextSibling, [_el$92, _co$18] = web.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] = web.getNextMarker(_el$97.nextSibling), _el$96 = _el$98.nextSibling, _el$99 = _el$96.nextSibling, [_el$100, _co$20] = web.getNextMarker(_el$99.nextSibling), _el$101 = _el$95.nextSibling, _el$104 = _el$101.nextSibling, [_el$105, _co$21] = web.getNextMarker(_el$104.nextSibling);
913
- web.insert(_el$84, clientRangeStart, _el$88, _co$16);
914
- web.insert(_el$84, clientRangeEnd, _el$90, _co$17);
915
- web.insert(_el$84, () => filteredRows().length.toLocaleString("fr-FR"), _el$92, _co$18);
916
- _el$94.$$click = () => setClientPage((p) => p - 1);
917
- web.insert(_el$95, () => clientPage() + 1, _el$98, _co$19);
918
- web.insert(_el$95, clientTotalPages, _el$100, _co$20);
919
- _el$101.$$click = () => setClientPage((p) => p + 1);
920
- web.insert(_el$93, web.createComponent(solidJs.Show, {
969
+ var _el$61 = web.getNextElement(_tmpl$23), _el$62 = _el$61.firstChild, _el$65 = _el$62.firstChild, [_el$66, _co$1] = web.getNextMarker(_el$65.nextSibling), _el$63 = _el$66.nextSibling, _el$67 = _el$63.nextSibling, [_el$68, _co$10] = web.getNextMarker(_el$67.nextSibling), _el$64 = _el$68.nextSibling, _el$69 = _el$64.nextSibling, [_el$70, _co$11] = web.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] = web.getNextMarker(_el$75.nextSibling), _el$74 = _el$76.nextSibling, _el$77 = _el$74.nextSibling, [_el$78, _co$13] = web.getNextMarker(_el$77.nextSibling), _el$79 = _el$73.nextSibling, _el$82 = _el$79.nextSibling, [_el$83, _co$14] = web.getNextMarker(_el$82.nextSibling);
970
+ web.insert(_el$62, clientRangeStart, _el$66, _co$1);
971
+ web.insert(_el$62, clientRangeEnd, _el$68, _co$10);
972
+ web.insert(_el$62, () => filteredRows().length.toLocaleString(strings.locale), _el$70, _co$11);
973
+ _el$72.$$click = () => setClientPage((p) => p - 1);
974
+ web.insert(_el$73, () => clientPage() + 1, _el$76, _co$12);
975
+ web.insert(_el$73, clientTotalPages, _el$78, _co$13);
976
+ _el$79.$$click = () => setClientPage((p) => p + 1);
977
+ web.insert(_el$71, web.createComponent(solidJs.Show, {
921
978
  get when() {
922
979
  return web.memo(() => !!isExpanded())() && filteredRows().length > 10;
923
980
  },
924
981
  get children() {
925
982
  return [(() => {
926
- var _el$102 = web.getNextElement(_tmpl$23);
927
- _el$102.addEventListener("change", (e) => handlePageSizeChange(Number(e.currentTarget.value)));
928
- web.insert(_el$102, web.createComponent(solidJs.For, {
983
+ var _el$80 = web.getNextElement(_tmpl$21);
984
+ _el$80.addEventListener("change", (e) => handlePageSizeChange(Number(e.currentTarget.value)));
985
+ web.insert(_el$80, web.createComponent(solidJs.For, {
929
986
  get each() {
930
987
  return pageSizeOptions();
931
988
  },
932
989
  children: (opt) => (() => {
933
- var _el$121 = web.getNextElement(_tmpl$28);
934
- web.insert(_el$121, () => opt.label);
935
- web.effect(() => web.setProperty(_el$121, "value", opt.value));
936
- return _el$121;
990
+ var _el$99 = web.getNextElement(_tmpl$26);
991
+ web.insert(_el$99, () => opt.label);
992
+ web.effect(() => web.setProperty(_el$99, "value", opt.value));
993
+ return _el$99;
937
994
  })()
938
995
  }));
939
- web.effect(() => web.setAttribute(_el$102, "aria-label", strings.paginationPageSize));
940
- web.effect(() => web.setProperty(_el$102, "value", clientPageSize()));
941
- return _el$102;
942
- })(), web.getNextElement(_tmpl$24)];
996
+ web.effect(() => web.setAttribute(_el$80, "aria-label", strings.paginationPageSize));
997
+ web.effect(() => web.setProperty(_el$80, "value", clientPageSize()));
998
+ return _el$80;
999
+ })(), (() => {
1000
+ var _el$81 = web.getNextElement(_tmpl$22);
1001
+ web.insert(_el$81, () => strings.perPageSuffix);
1002
+ return _el$81;
1003
+ })()];
943
1004
  }
944
- }), _el$105, _co$21);
1005
+ }), _el$83, _co$14);
945
1006
  web.effect((_p$) => {
946
- var _v$9 = clientPage() === 0, _v$0 = strings.paginationPrevious, _v$1 = clientPage() >= clientTotalPages() - 1, _v$10 = strings.paginationNext;
947
- _v$9 !== _p$.e && web.setProperty(_el$94, "disabled", _p$.e = _v$9);
948
- _v$0 !== _p$.t && web.setAttribute(_el$94, "aria-label", _p$.t = _v$0);
949
- _v$1 !== _p$.a && web.setProperty(_el$101, "disabled", _p$.a = _v$1);
950
- _v$10 !== _p$.o && web.setAttribute(_el$101, "aria-label", _p$.o = _v$10);
1007
+ var _v$10 = clientPage() === 0, _v$11 = strings.paginationPrevious, _v$12 = clientPage() >= clientTotalPages() - 1, _v$13 = strings.paginationNext;
1008
+ _v$10 !== _p$.e && web.setProperty(_el$72, "disabled", _p$.e = _v$10);
1009
+ _v$11 !== _p$.t && web.setAttribute(_el$72, "aria-label", _p$.t = _v$11);
1010
+ _v$12 !== _p$.a && web.setProperty(_el$79, "disabled", _p$.a = _v$12);
1011
+ _v$13 !== _p$.o && web.setAttribute(_el$79, "aria-label", _p$.o = _v$13);
951
1012
  return _p$;
952
1013
  }, {
953
1014
  e: void 0,
@@ -956,11 +1017,11 @@ ${dataRows}`;
956
1017
  o: void 0
957
1018
  });
958
1019
  web.runHydrationEvents();
959
- return _el$83;
1020
+ return _el$61;
960
1021
  }
961
- }), _el$113, _co$25);
1022
+ }), _el$91, _co$18);
962
1023
  web.effect((_p$) => {
963
- 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 = (
1024
+ 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 = (
964
1025
  // v6.1.0 — when expanded, the scroll container fills the
965
1026
  // remaining vertical space and scrolls internally.
966
1027
  // v6.3.0 — `params.maxHeight` opt-out (axe 1 deposium handoff)
@@ -989,13 +1050,13 @@ ${dataRows}`;
989
1050
  };
990
1051
  return {};
991
1052
  })()
992
- ), _v$15 = tableParams.title || "Data table", _v$16 = tableParams.title ? `${tableId}-title` : void 0;
993
- _v$11 !== _p$.e && web.className(_el$30, _p$.e = _v$11);
994
- _v$12 !== _p$.t && web.className(_el$38, _p$.t = _v$12);
995
- _v$13 !== _p$.a && web.className(_el$64, _p$.a = _v$13);
996
- _p$.o = web.style(_el$64, _v$14, _p$.o);
997
- _v$15 !== _p$.i && web.setAttribute(_el$64, "aria-label", _p$.i = _v$15);
998
- _v$16 !== _p$.n && web.setAttribute(_el$65, "aria-labelledby", _p$.n = _v$16);
1053
+ ), _v$18 = tableParams.title || strings.tableAriaLabel, _v$19 = tableParams.title ? `${tableId}-title` : void 0;
1054
+ _v$14 !== _p$.e && web.className(_el$31, _p$.e = _v$14);
1055
+ _v$15 !== _p$.t && web.className(_el$39, _p$.t = _v$15);
1056
+ _v$16 !== _p$.a && web.className(_el$53, _p$.a = _v$16);
1057
+ _p$.o = web.style(_el$53, _v$17, _p$.o);
1058
+ _v$18 !== _p$.i && web.setAttribute(_el$53, "aria-label", _p$.i = _v$18);
1059
+ _v$19 !== _p$.n && web.setAttribute(_el$54, "aria-labelledby", _p$.n = _v$19);
999
1060
  return _p$;
1000
1061
  }, {
1001
1062
  e: void 0,
@@ -1005,11 +1066,12 @@ ${dataRows}`;
1005
1066
  i: void 0,
1006
1067
  n: void 0
1007
1068
  });
1008
- return _el$30;
1069
+ return _el$31;
1009
1070
  }
1010
1071
  });
1011
1072
  }
1012
1073
  function MetricRenderer(props) {
1074
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1013
1075
  const metricParams = props.component.params;
1014
1076
  const getMetricText = () => {
1015
1077
  const title = metricParams.title || metricParams.label || "";
@@ -1018,59 +1080,61 @@ function MetricRenderer(props) {
1018
1080
  return `${title}: ${value}${unit ? " " + unit : ""}`;
1019
1081
  };
1020
1082
  return (() => {
1021
- var _el$122 = web.getNextElement(_tmpl$32), _el$144 = _el$122.firstChild, [_el$145, _co$33] = web.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] = web.getNextMarker(_el$129.nextSibling), _el$140 = _el$124.nextSibling, [_el$141, _co$31] = web.getNextMarker(_el$140.nextSibling), _el$142 = _el$141.nextSibling, [_el$143, _co$32] = web.getNextMarker(_el$142.nextSibling);
1022
- web.insert(_el$122, web.createComponent(CopyButton, {
1083
+ var _el$100 = web.getNextElement(_tmpl$30), _el$122 = _el$100.firstChild, [_el$123, _co$26] = web.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] = web.getNextMarker(_el$107.nextSibling), _el$118 = _el$102.nextSibling, [_el$119, _co$24] = web.getNextMarker(_el$118.nextSibling), _el$120 = _el$119.nextSibling, [_el$121, _co$25] = web.getNextMarker(_el$120.nextSibling);
1084
+ web.insert(_el$100, web.createComponent(CopyButton, {
1023
1085
  getText: getMetricText,
1024
- title: "Copy metric",
1086
+ get title() {
1087
+ return strings.copyMetric;
1088
+ },
1025
1089
  position: "top-right"
1026
- }), _el$145, _co$33);
1027
- web.insert(_el$125, () => metricParams.title);
1028
- web.insert(_el$127, () => metricParams.value);
1029
- web.insert(_el$126, web.createComponent(solidJs.Show, {
1090
+ }), _el$123, _co$26);
1091
+ web.insert(_el$103, () => metricParams.title);
1092
+ web.insert(_el$105, () => metricParams.value);
1093
+ web.insert(_el$104, web.createComponent(solidJs.Show, {
1030
1094
  get when() {
1031
1095
  return metricParams.unit;
1032
1096
  },
1033
1097
  get children() {
1034
- var _el$128 = web.getNextElement(_tmpl$29);
1035
- web.insert(_el$128, () => metricParams.unit);
1036
- return _el$128;
1098
+ var _el$106 = web.getNextElement(_tmpl$27);
1099
+ web.insert(_el$106, () => metricParams.unit);
1100
+ return _el$106;
1037
1101
  }
1038
- }), _el$130, _co$28);
1039
- web.insert(_el$123, web.createComponent(solidJs.Show, {
1102
+ }), _el$108, _co$21);
1103
+ web.insert(_el$101, web.createComponent(solidJs.Show, {
1040
1104
  get when() {
1041
1105
  return metricParams.trend;
1042
1106
  },
1043
1107
  get children() {
1044
- var _el$131 = web.getNextElement(_tmpl$30), _el$132 = _el$131.firstChild, _el$135 = _el$132.firstChild, [_el$136, _co$29] = web.getNextMarker(_el$135.nextSibling), _el$133 = _el$136.nextSibling, _el$137 = _el$133.nextSibling, [_el$138, _co$30] = web.getNextMarker(_el$137.nextSibling);
1045
- _el$138.nextSibling;
1046
- web.insert(_el$132, (() => {
1108
+ var _el$109 = web.getNextElement(_tmpl$28), _el$110 = _el$109.firstChild, _el$113 = _el$110.firstChild, [_el$114, _co$22] = web.getNextMarker(_el$113.nextSibling), _el$111 = _el$114.nextSibling, _el$115 = _el$111.nextSibling, [_el$116, _co$23] = web.getNextMarker(_el$115.nextSibling);
1109
+ _el$116.nextSibling;
1110
+ web.insert(_el$110, (() => {
1047
1111
  var _c$ = web.memo(() => metricParams.trend.direction === "up");
1048
1112
  return () => _c$() ? "�" : metricParams.trend.direction === "down" ? "�" : "�";
1049
- })(), _el$136, _co$29);
1050
- web.insert(_el$132, () => Math.abs(metricParams.trend.value), _el$138, _co$30);
1051
- web.effect(() => web.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"}`));
1052
- return _el$131;
1113
+ })(), _el$114, _co$22);
1114
+ web.insert(_el$110, () => Math.abs(metricParams.trend.value), _el$116, _co$23);
1115
+ web.effect(() => web.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"}`));
1116
+ return _el$109;
1053
1117
  }
1054
- }), _el$141, _co$31);
1055
- web.insert(_el$123, web.createComponent(solidJs.Show, {
1118
+ }), _el$119, _co$24);
1119
+ web.insert(_el$101, web.createComponent(solidJs.Show, {
1056
1120
  get when() {
1057
1121
  return metricParams.subtitle;
1058
1122
  },
1059
1123
  get children() {
1060
- var _el$139 = web.getNextElement(_tmpl$31);
1061
- web.insert(_el$139, () => metricParams.subtitle);
1062
- return _el$139;
1124
+ var _el$117 = web.getNextElement(_tmpl$29);
1125
+ web.insert(_el$117, () => metricParams.subtitle);
1126
+ return _el$117;
1063
1127
  }
1064
- }), _el$143, _co$32);
1065
- return _el$122;
1128
+ }), _el$121, _co$25);
1129
+ return _el$100;
1066
1130
  })();
1067
1131
  }
1068
- function extractImageFromMarkdown(content) {
1132
+ function extractImageFromMarkdown(content, fallbackAlt) {
1069
1133
  const imagePattern = /\[!\[([^\]]*)\]\(([^)]+)\)\]\(([^)]+)\)\s*\*([^*]+)\*/;
1070
1134
  const match = content.match(imagePattern);
1071
1135
  if (match) {
1072
1136
  return {
1073
- alt: match[1] || "Image",
1137
+ alt: match[1] || fallbackAlt,
1074
1138
  imageUrl: match[2],
1075
1139
  linkUrl: match[3],
1076
1140
  credit: match[4].trim()
@@ -1079,10 +1143,11 @@ function extractImageFromMarkdown(content) {
1079
1143
  return null;
1080
1144
  }
1081
1145
  function TextRenderer(props) {
1146
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1082
1147
  const textParams = props.component.params;
1083
1148
  const imageData = solidJs.createMemo(() => {
1084
1149
  if (textParams.markdown && textParams.content) {
1085
- const extracted = extractImageFromMarkdown(textParams.content);
1150
+ const extracted = extractImageFromMarkdown(textParams.content, strings.imageAlt);
1086
1151
  if (!extracted) return null;
1087
1152
  const imageUrl = safeUrl.safeUrl(extracted.imageUrl, {
1088
1153
  allowDataImage: true
@@ -1118,38 +1183,40 @@ function TextRenderer(props) {
1118
1183
  },
1119
1184
  get fallback() {
1120
1185
  return (() => {
1121
- var _el$146 = web.getNextElement(_tmpl$33), _el$147 = _el$146.firstChild, [_el$148, _co$34] = web.getNextMarker(_el$147.nextSibling), _el$149 = _el$148.nextSibling, [_el$150, _co$35] = web.getNextMarker(_el$149.nextSibling);
1122
- web.insert(_el$146, web.createComponent(CopyButton, {
1186
+ var _el$124 = web.getNextElement(_tmpl$31), _el$125 = _el$124.firstChild, [_el$126, _co$27] = web.getNextMarker(_el$125.nextSibling), _el$127 = _el$126.nextSibling, [_el$128, _co$28] = web.getNextMarker(_el$127.nextSibling);
1187
+ web.insert(_el$124, web.createComponent(CopyButton, {
1123
1188
  getText: getTextContent,
1124
- title: "Copy text",
1189
+ get title() {
1190
+ return strings.copyText;
1191
+ },
1125
1192
  position: "top-right"
1126
- }), _el$148, _co$34);
1127
- web.insert(_el$146, web.createComponent(SafeHtml.SafeHtml, {
1193
+ }), _el$126, _co$27);
1194
+ web.insert(_el$124, web.createComponent(SafeHtml.SafeHtml, {
1128
1195
  get ["class"]() {
1129
1196
  return `prose prose-sm dark:prose-invert max-w-none ${textParams.className || ""}`;
1130
1197
  },
1131
1198
  html: htmlContent
1132
- }), _el$150, _co$35);
1133
- return _el$146;
1199
+ }), _el$128, _co$28);
1200
+ return _el$124;
1134
1201
  })();
1135
1202
  },
1136
1203
  children: (data) => {
1137
1204
  const image = () => (() => {
1138
- var _el$151 = web.getNextElement(_tmpl$34);
1205
+ var _el$129 = web.getNextElement(_tmpl$32);
1139
1206
  web.effect((_p$) => {
1140
- var _v$20 = data().imageUrl, _v$21 = data().alt;
1141
- _v$20 !== _p$.e && web.setAttribute(_el$151, "src", _p$.e = _v$20);
1142
- _v$21 !== _p$.t && web.setAttribute(_el$151, "alt", _p$.t = _v$21);
1207
+ var _v$23 = data().imageUrl, _v$24 = data().alt;
1208
+ _v$23 !== _p$.e && web.setAttribute(_el$129, "src", _p$.e = _v$23);
1209
+ _v$24 !== _p$.t && web.setAttribute(_el$129, "alt", _p$.t = _v$24);
1143
1210
  return _p$;
1144
1211
  }, {
1145
1212
  e: void 0,
1146
1213
  t: void 0
1147
1214
  });
1148
- return _el$151;
1215
+ return _el$129;
1149
1216
  })();
1150
1217
  return (() => {
1151
- var _el$152 = web.getNextElement(_tmpl$35), _el$153 = _el$152.firstChild, _el$154 = _el$153.nextSibling, _el$155 = _el$154.firstChild;
1152
- web.insert(_el$153, web.createComponent(solidJs.Show, {
1218
+ var _el$130 = web.getNextElement(_tmpl$33), _el$131 = _el$130.firstChild, _el$132 = _el$131.nextSibling, _el$133 = _el$132.firstChild;
1219
+ web.insert(_el$131, web.createComponent(solidJs.Show, {
1153
1220
  get when() {
1154
1221
  return data().linkUrl;
1155
1222
  },
@@ -1157,71 +1224,91 @@ function TextRenderer(props) {
1157
1224
  return image();
1158
1225
  },
1159
1226
  children: (href) => (() => {
1160
- var _el$156 = web.getNextElement(_tmpl$36);
1161
- web.insert(_el$156, image);
1162
- web.effect(() => web.setAttribute(_el$156, "href", href()));
1163
- return _el$156;
1227
+ var _el$134 = web.getNextElement(_tmpl$34);
1228
+ web.insert(_el$134, image);
1229
+ web.effect(() => web.setAttribute(_el$134, "href", href()));
1230
+ return _el$134;
1164
1231
  })()
1165
1232
  }));
1166
- web.insert(_el$155, () => data().credit);
1167
- return _el$152;
1233
+ web.insert(_el$133, () => data().credit);
1234
+ return _el$130;
1168
1235
  })();
1169
1236
  }
1170
1237
  });
1171
1238
  }
1172
1239
  function IframeRenderer(props) {
1240
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1241
+ const config = MCPUIConfigContext.useMCPUIConfig();
1173
1242
  const params = props.component.params;
1243
+ const trustOptions = () => ({
1244
+ customTrustedDomains: config.customTrustedIframeDomains
1245
+ });
1174
1246
  return (() => {
1175
- var _el$157 = web.getNextElement(_tmpl$38), _el$161 = _el$157.firstChild, [_el$162, _co$36] = web.getNextMarker(_el$161.nextSibling), _el$160 = _el$162.nextSibling;
1176
- web.insert(_el$157, web.createComponent(solidJs.Show, {
1247
+ var _el$135 = web.getNextElement(_tmpl$36), _el$139 = _el$135.firstChild, [_el$140, _co$29] = web.getNextMarker(_el$139.nextSibling), _el$138 = _el$140.nextSibling, _el$141 = _el$138.nextSibling, [_el$142, _co$30] = web.getNextMarker(_el$141.nextSibling);
1248
+ web.insert(_el$135, web.createComponent(solidJs.Show, {
1177
1249
  get when() {
1178
1250
  return params.title;
1179
1251
  },
1180
1252
  get children() {
1181
- var _el$158 = web.getNextElement(_tmpl$37), _el$159 = _el$158.firstChild;
1182
- web.insert(_el$159, () => params.title);
1183
- return _el$158;
1253
+ var _el$136 = web.getNextElement(_tmpl$35), _el$137 = _el$136.firstChild;
1254
+ web.insert(_el$137, () => params.title);
1255
+ return _el$136;
1184
1256
  }
1185
- }), _el$162, _co$36);
1257
+ }), _el$140, _co$29);
1258
+ web.insert(_el$135, web.createComponent(IframeFallbackLink.IframeFallbackLink, {
1259
+ get url() {
1260
+ return params.url;
1261
+ },
1262
+ "class": "border-t border-gray-200 dark:border-gray-700"
1263
+ }), _el$142, _co$30);
1186
1264
  web.effect((_p$) => {
1187
- var _v$22 = params.url, _v$23 = params.title || "Embedded content", _v$24 = `height: ${params.height || "400px"}; min-height: 300px;`, _v$25 = validation.getIframeSandbox(params.url);
1188
- _v$22 !== _p$.e && web.setAttribute(_el$160, "src", _p$.e = _v$22);
1189
- _v$23 !== _p$.t && web.setAttribute(_el$160, "title", _p$.t = _v$23);
1190
- _p$.a = web.style(_el$160, _v$24, _p$.a);
1191
- _v$25 !== _p$.o && web.setAttribute(_el$160, "sandbox", _p$.o = _v$25);
1265
+ var _v$25 = params.url, _v$26 = params.title || strings.iframeTitle, _v$27 = `height: ${params.height || "400px"}; min-height: 300px;`, _v$28 = validation.getIframeSandbox(params.url, trustOptions()), _v$29 = iframeCoep.shouldSetCredentialless(params.url, config, {
1266
+ // This iframe's sandbox never carries `allow-same-origin` for an
1267
+ // untrusted host, so it already runs without cookies.
1268
+ sandboxedWithoutSameOrigin: !validation.isTrustedIframeDomain(params.url, trustOptions())
1269
+ }) || void 0;
1270
+ _v$25 !== _p$.e && web.setAttribute(_el$138, "src", _p$.e = _v$25);
1271
+ _v$26 !== _p$.t && web.setAttribute(_el$138, "title", _p$.t = _v$26);
1272
+ _p$.a = web.style(_el$138, _v$27, _p$.a);
1273
+ _v$28 !== _p$.o && web.setAttribute(_el$138, "sandbox", _p$.o = _v$28);
1274
+ _v$29 !== _p$.i && web.setAttribute(_el$138, "credentialless", _p$.i = _v$29);
1192
1275
  return _p$;
1193
1276
  }, {
1194
1277
  e: void 0,
1195
1278
  t: void 0,
1196
1279
  a: void 0,
1197
- o: void 0
1280
+ o: void 0,
1281
+ i: void 0
1198
1282
  });
1199
- return _el$157;
1283
+ return _el$135;
1200
1284
  })();
1201
1285
  }
1202
1286
  function ImageRenderer(props) {
1287
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1203
1288
  const params = props.component.params;
1204
1289
  return (() => {
1205
- var _el$163 = web.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] = web.getNextMarker(_el$169.nextSibling);
1206
- web.insert(_el$163, web.createComponent(solidJs.Show, {
1290
+ var _el$143 = web.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] = web.getNextMarker(_el$149.nextSibling);
1291
+ web.insert(_el$143, web.createComponent(solidJs.Show, {
1207
1292
  get when() {
1208
1293
  return params.caption;
1209
1294
  },
1210
1295
  get children() {
1211
- var _el$167 = web.getNextElement(_tmpl$39), _el$168 = _el$167.firstChild;
1212
- web.insert(_el$168, () => params.caption);
1213
- return _el$167;
1296
+ var _el$147 = web.getNextElement(_tmpl$37), _el$148 = _el$147.firstChild;
1297
+ web.insert(_el$148, () => params.caption);
1298
+ return _el$147;
1214
1299
  }
1215
- }), _el$170, _co$37);
1300
+ }), _el$150, _co$31);
1216
1301
  web.effect((_p$) => {
1217
- 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.safeUrl(params.url), _v$28 = `View full size: ${params.alt || "image"}`, _v$29 = safeUrl.safeUrl(params.url, {
1302
+ 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.safeUrl(params.url), _v$32 = formatString.formatMCPUIString(strings.imageViewFullSize, {
1303
+ alt: params.alt || strings.imageAltFallback
1304
+ }), _v$33 = safeUrl.safeUrl(params.url, {
1218
1305
  allowDataImage: true
1219
- }), _v$30 = params.alt || "Image";
1220
- _v$26 !== _p$.e && web.className(_el$163, _p$.e = _v$26);
1221
- _v$27 !== _p$.t && web.setAttribute(_el$165, "href", _p$.t = _v$27);
1222
- _v$28 !== _p$.a && web.setAttribute(_el$165, "aria-label", _p$.a = _v$28);
1223
- _v$29 !== _p$.o && web.setAttribute(_el$166, "src", _p$.o = _v$29);
1224
- _v$30 !== _p$.i && web.setAttribute(_el$166, "alt", _p$.i = _v$30);
1306
+ }), _v$34 = params.alt || strings.imageAlt;
1307
+ _v$30 !== _p$.e && web.className(_el$143, _p$.e = _v$30);
1308
+ _v$31 !== _p$.t && web.setAttribute(_el$145, "href", _p$.t = _v$31);
1309
+ _v$32 !== _p$.a && web.setAttribute(_el$145, "aria-label", _p$.a = _v$32);
1310
+ _v$33 !== _p$.o && web.setAttribute(_el$146, "src", _p$.o = _v$33);
1311
+ _v$34 !== _p$.i && web.setAttribute(_el$146, "alt", _p$.i = _v$34);
1225
1312
  return _p$;
1226
1313
  }, {
1227
1314
  e: void 0,
@@ -1230,30 +1317,34 @@ function ImageRenderer(props) {
1230
1317
  o: void 0,
1231
1318
  i: void 0
1232
1319
  });
1233
- return _el$163;
1320
+ return _el$143;
1234
1321
  })();
1235
1322
  }
1236
1323
  function LinkRenderer(props) {
1324
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1237
1325
  const params = props.component.params;
1238
1326
  return (() => {
1239
- var _el$171 = web.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] = web.getNextMarker(_el$176.nextSibling);
1240
- _el$171.$$click = (e) => e.stopPropagation();
1241
- web.insert(_el$174, () => params.label || params.url);
1242
- web.insert(_el$173, web.createComponent(solidJs.Show, {
1327
+ var _el$151 = web.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] = web.getNextMarker(_el$156.nextSibling);
1328
+ _el$151.$$click = (e) => e.stopPropagation();
1329
+ web.insert(_el$154, () => params.label || params.url);
1330
+ web.insert(_el$153, web.createComponent(solidJs.Show, {
1243
1331
  get when() {
1244
1332
  return params.description;
1245
1333
  },
1246
1334
  get children() {
1247
- var _el$175 = web.getNextElement(_tmpl$41);
1248
- web.insert(_el$175, () => params.description);
1249
- return _el$175;
1335
+ var _el$155 = web.getNextElement(_tmpl$39);
1336
+ web.insert(_el$155, () => params.description);
1337
+ return _el$155;
1250
1338
  }
1251
- }), _el$177, _co$38);
1339
+ }), _el$157, _co$32);
1252
1340
  web.effect((_p$) => {
1253
- var _v$31 = safeUrl.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 || ""}`;
1254
- _v$31 !== _p$.e && web.setAttribute(_el$171, "href", _p$.e = _v$31);
1255
- _v$32 !== _p$.t && web.setAttribute(_el$171, "aria-label", _p$.t = _v$32);
1256
- _v$33 !== _p$.a && web.className(_el$171, _p$.a = _v$33);
1341
+ var _v$35 = safeUrl.safeUrl(params.url), _v$36 = formatString.formatMCPUIString(strings.linkOpensInNewTab, {
1342
+ label: params.label || strings.linkLabel,
1343
+ description: params.description || params.url
1344
+ }), _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 || ""}`;
1345
+ _v$35 !== _p$.e && web.setAttribute(_el$151, "href", _p$.e = _v$35);
1346
+ _v$36 !== _p$.t && web.setAttribute(_el$151, "aria-label", _p$.t = _v$36);
1347
+ _v$37 !== _p$.a && web.className(_el$151, _p$.a = _v$37);
1257
1348
  return _p$;
1258
1349
  }, {
1259
1350
  e: void 0,
@@ -1261,13 +1352,15 @@ function LinkRenderer(props) {
1261
1352
  a: void 0
1262
1353
  });
1263
1354
  web.runHydrationEvents();
1264
- return _el$171;
1355
+ return _el$151;
1265
1356
  })();
1266
1357
  }
1267
1358
  function ComponentRenderer(props) {
1268
1359
  var _a, _b, _c, _d, _e, _f, _g;
1269
1360
  perf.markRenderStart(props.component.id);
1270
1361
  const telemetry = MCPUITelemetryContext.useTelemetry();
1362
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1363
+ const componentConfig = MCPUIConfigContext.useMCPUIConfig();
1271
1364
  solidJs.onMount(() => {
1272
1365
  perf.markRenderEnd(props.component.id);
1273
1366
  if (telemetry) {
@@ -1303,7 +1396,10 @@ function ComponentRenderer(props) {
1303
1396
  });
1304
1397
  }
1305
1398
  });
1306
- const validation$1 = validation.validateComponent(props.component);
1399
+ const validation$1 = validation.validateComponent(props.component, {
1400
+ iframePolicy: componentConfig.iframePolicy,
1401
+ customIframeDomains: componentConfig.customIframeDomains
1402
+ });
1307
1403
  if (!validation$1.valid) {
1308
1404
  (_a = props.onError) == null ? void 0 : _a.call(props, {
1309
1405
  type: "validation",
@@ -1322,7 +1418,7 @@ function ComponentRenderer(props) {
1322
1418
  });
1323
1419
  }
1324
1420
  const mode = props.errorMode ?? "block";
1325
- const firstError = ((_f = (_e = validation$1.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || "Unknown validation error";
1421
+ const firstError = ((_f = (_e = validation$1.errors) == null ? void 0 : _e[0]) == null ? void 0 : _f.message) || strings.validationUnknownError;
1326
1422
  if ((_g = validation$1.errors) == null ? void 0 : _g.some((e) => e.code === "UNKNOWN_COMPONENT_TYPE")) {
1327
1423
  return web.createComponent(UnsupportedComponentFallback, {
1328
1424
  get component() {
@@ -1335,16 +1431,20 @@ function ComponentRenderer(props) {
1335
1431
  }
1336
1432
  if (mode === "inline-warn") {
1337
1433
  return (() => {
1338
- var _el$178 = web.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] = web.getNextMarker(_el$182.nextSibling);
1339
- web.setAttribute(_el$178, "title", firstError);
1340
- web.insert(_el$180, () => props.component.type, _el$183, _co$39);
1341
- return _el$178;
1434
+ var _el$158 = web.getNextElement(_tmpl$41), _el$159 = _el$158.firstChild, _el$160 = _el$159.nextSibling;
1435
+ web.setAttribute(_el$158, "title", firstError);
1436
+ web.insert(_el$160, () => formatString.formatMCPUIString(strings.invalidComponent, {
1437
+ type: props.component.type
1438
+ }));
1439
+ web.effect(() => web.setAttribute(_el$158, "aria-label", strings.validationWarning));
1440
+ return _el$158;
1342
1441
  })();
1343
1442
  }
1344
1443
  return (() => {
1345
- var _el$184 = web.getNextElement(_tmpl$44), _el$185 = _el$184.firstChild, _el$186 = _el$185.nextSibling;
1346
- web.insert(_el$186, firstError);
1347
- return _el$184;
1444
+ var _el$161 = web.getNextElement(_tmpl$42), _el$162 = _el$161.firstChild, _el$163 = _el$162.nextSibling;
1445
+ web.insert(_el$162, () => strings.validationError);
1446
+ web.insert(_el$163, firstError);
1447
+ return _el$161;
1348
1448
  })();
1349
1449
  }
1350
1450
  return web.createComponent(GenerativeUIErrorBoundary.GenerativeUIErrorBoundary, {
@@ -1636,10 +1736,12 @@ function ComponentRenderer(props) {
1636
1736
  });
1637
1737
  }
1638
1738
  function UnsupportedComponentFallback(props) {
1739
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1639
1740
  return (() => {
1640
- var _el$187 = web.getNextElement(_tmpl$45), _el$188 = _el$187.firstChild, _el$189 = _el$188.nextSibling;
1641
- web.insert(_el$189, () => props.component.type);
1642
- return _el$187;
1741
+ var _el$164 = web.getNextElement(_tmpl$43), _el$167 = _el$164.firstChild, [_el$168, _co$33] = web.getNextMarker(_el$167.nextSibling), _el$165 = _el$168.nextSibling, _el$166 = _el$165.nextSibling;
1742
+ web.insert(_el$164, () => strings.unsupportedComponentType, _el$168, _co$33);
1743
+ web.insert(_el$166, () => props.component.type);
1744
+ return _el$164;
1643
1745
  })();
1644
1746
  }
1645
1747
  function ActionRenderer(props) {
@@ -1679,27 +1781,27 @@ function ActionRenderer(props) {
1679
1781
  const isDisabled = () => params.disabled || isExecutable() && isExecuting();
1680
1782
  if (params.type === "link" || params.action === "link") {
1681
1783
  return (() => {
1682
- var _el$190 = web.getNextElement(_tmpl$47), _el$192 = _el$190.firstChild, [_el$193, _co$40] = web.getNextMarker(_el$192.nextSibling), _el$194 = _el$193.nextSibling, [_el$195, _co$41] = web.getNextMarker(_el$194.nextSibling);
1683
- _el$190.$$click = handleClick;
1684
- web.insert(_el$190, web.createComponent(solidJs.Show, {
1784
+ var _el$169 = web.getNextElement(_tmpl$45), _el$171 = _el$169.firstChild, [_el$172, _co$34] = web.getNextMarker(_el$171.nextSibling), _el$173 = _el$172.nextSibling, [_el$174, _co$35] = web.getNextMarker(_el$173.nextSibling);
1785
+ _el$169.$$click = handleClick;
1786
+ web.insert(_el$169, web.createComponent(solidJs.Show, {
1685
1787
  get when() {
1686
1788
  return params.icon;
1687
1789
  },
1688
1790
  get children() {
1689
- var _el$191 = web.getNextElement(_tmpl$46);
1690
- web.insert(_el$191, () => params.icon);
1691
- return _el$191;
1791
+ var _el$170 = web.getNextElement(_tmpl$44);
1792
+ web.insert(_el$170, () => params.icon);
1793
+ return _el$170;
1692
1794
  }
1693
- }), _el$193, _co$40);
1694
- web.insert(_el$190, () => params.label, _el$195, _co$41);
1795
+ }), _el$172, _co$34);
1796
+ web.insert(_el$169, () => params.label, _el$174, _co$35);
1695
1797
  web.effect((_p$) => {
1696
- var _v$34 = safeUrl.safeUrl(params.url) ?? "#", _v$35 = safeUrl.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
1798
+ var _v$38 = safeUrl.safeUrl(params.url) ?? "#", _v$39 = safeUrl.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
1697
1799
  ${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"}
1698
1800
  ${params.className || ""}`;
1699
- _v$34 !== _p$.e && web.setAttribute(_el$190, "href", _p$.e = _v$34);
1700
- _v$35 !== _p$.t && web.setAttribute(_el$190, "target", _p$.t = _v$35);
1701
- _v$36 !== _p$.a && web.setAttribute(_el$190, "aria-label", _p$.a = _v$36);
1702
- _v$37 !== _p$.o && web.className(_el$190, _p$.o = _v$37);
1801
+ _v$38 !== _p$.e && web.setAttribute(_el$169, "href", _p$.e = _v$38);
1802
+ _v$39 !== _p$.t && web.setAttribute(_el$169, "target", _p$.t = _v$39);
1803
+ _v$40 !== _p$.a && web.setAttribute(_el$169, "aria-label", _p$.a = _v$40);
1804
+ _v$41 !== _p$.o && web.className(_el$169, _p$.o = _v$41);
1703
1805
  return _p$;
1704
1806
  }, {
1705
1807
  e: void 0,
@@ -1708,41 +1810,41 @@ function ActionRenderer(props) {
1708
1810
  o: void 0
1709
1811
  });
1710
1812
  web.runHydrationEvents();
1711
- return _el$190;
1813
+ return _el$169;
1712
1814
  })();
1713
1815
  }
1714
1816
  return (() => {
1715
- var _el$196 = web.getNextElement(_tmpl$49), _el$199 = _el$196.firstChild, [_el$200, _co$42] = web.getNextMarker(_el$199.nextSibling), _el$201 = _el$200.nextSibling, [_el$202, _co$43] = web.getNextMarker(_el$201.nextSibling), _el$203 = _el$202.nextSibling, [_el$204, _co$44] = web.getNextMarker(_el$203.nextSibling);
1716
- _el$196.$$click = handleClick;
1717
- web.insert(_el$196, web.createComponent(solidJs.Show, {
1817
+ var _el$175 = web.getNextElement(_tmpl$47), _el$178 = _el$175.firstChild, [_el$179, _co$36] = web.getNextMarker(_el$178.nextSibling), _el$180 = _el$179.nextSibling, [_el$181, _co$37] = web.getNextMarker(_el$180.nextSibling), _el$182 = _el$181.nextSibling, [_el$183, _co$38] = web.getNextMarker(_el$182.nextSibling);
1818
+ _el$175.$$click = handleClick;
1819
+ web.insert(_el$175, web.createComponent(solidJs.Show, {
1718
1820
  get when() {
1719
1821
  return web.memo(() => !!isExecuting())() && isExecutable();
1720
1822
  },
1721
1823
  get children() {
1722
- return web.getNextElement(_tmpl$48);
1824
+ return web.getNextElement(_tmpl$46);
1723
1825
  }
1724
- }), _el$200, _co$42);
1725
- web.insert(_el$196, web.createComponent(solidJs.Show, {
1826
+ }), _el$179, _co$36);
1827
+ web.insert(_el$175, web.createComponent(solidJs.Show, {
1726
1828
  get when() {
1727
1829
  return web.memo(() => !!params.icon)() && !(isExecuting() && isExecutable());
1728
1830
  },
1729
1831
  get children() {
1730
- var _el$198 = web.getNextElement(_tmpl$46);
1731
- web.insert(_el$198, () => params.icon);
1732
- return _el$198;
1832
+ var _el$177 = web.getNextElement(_tmpl$44);
1833
+ web.insert(_el$177, () => params.icon);
1834
+ return _el$177;
1733
1835
  }
1734
- }), _el$202, _co$43);
1735
- web.insert(_el$196, () => params.label, _el$204, _co$44);
1836
+ }), _el$181, _co$37);
1837
+ web.insert(_el$175, () => params.label, _el$183, _co$38);
1736
1838
  web.effect((_p$) => {
1737
- 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
1839
+ 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
1738
1840
  ${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"}
1739
1841
  ${isDisabled() ? "opacity-50 cursor-not-allowed" : ""}
1740
1842
  ${params.size === "sm" ? "px-3 py-1.5 text-xs" : params.size === "lg" ? "px-6 py-3 text-base" : ""}
1741
1843
  ${params.className || ""}`;
1742
- _v$38 !== _p$.e && web.setProperty(_el$196, "disabled", _p$.e = _v$38);
1743
- _v$39 !== _p$.t && web.setAttribute(_el$196, "aria-busy", _p$.t = _v$39);
1744
- _v$40 !== _p$.a && web.setAttribute(_el$196, "aria-label", _p$.a = _v$40);
1745
- _v$41 !== _p$.o && web.className(_el$196, _p$.o = _v$41);
1844
+ _v$42 !== _p$.e && web.setProperty(_el$175, "disabled", _p$.e = _v$42);
1845
+ _v$43 !== _p$.t && web.setAttribute(_el$175, "aria-busy", _p$.t = _v$43);
1846
+ _v$44 !== _p$.a && web.setAttribute(_el$175, "aria-label", _p$.a = _v$44);
1847
+ _v$45 !== _p$.o && web.className(_el$175, _p$.o = _v$45);
1746
1848
  return _p$;
1747
1849
  }, {
1748
1850
  e: void 0,
@@ -1751,63 +1853,76 @@ function ActionRenderer(props) {
1751
1853
  o: void 0
1752
1854
  });
1753
1855
  web.runHydrationEvents();
1754
- return _el$196;
1856
+ return _el$175;
1755
1857
  })();
1756
1858
  }
1757
1859
  function ErrorCardRenderer(props) {
1860
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1861
+ const [mounted, setMounted] = solidJs.createSignal(false);
1862
+ solidJs.onMount(() => setMounted(true));
1758
1863
  const getErrorText = () => {
1759
- return `Error in ${props.error.tool || "unknown tool"}: ${props.error.message || "Unknown error"}`;
1864
+ return formatString.formatMCPUIString(strings.errorCopyText, {
1865
+ tool: props.error.tool || strings.errorUnknownTool,
1866
+ message: props.error.message || strings.errorUnknown
1867
+ });
1760
1868
  };
1761
1869
  return (() => {
1762
- var _el$205 = web.getNextElement(_tmpl$53), _el$228 = _el$205.firstChild, [_el$229, _co$50] = web.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] = web.getNextMarker(_el$211.nextSibling), _el$213 = _el$209.nextSibling, _el$222 = _el$213.nextSibling, [_el$223, _co$47] = web.getNextMarker(_el$222.nextSibling), _el$224 = _el$223.nextSibling, [_el$225, _co$48] = web.getNextMarker(_el$224.nextSibling), _el$226 = _el$225.nextSibling, [_el$227, _co$49] = web.getNextMarker(_el$226.nextSibling);
1763
- web.insert(_el$205, web.createComponent(CopyButton, {
1870
+ var _el$184 = web.getNextElement(_tmpl$51), _el$201 = _el$184.firstChild, [_el$202, _co$42] = web.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] = web.getNextMarker(_el$195.nextSibling), _el$197 = _el$196.nextSibling, [_el$198, _co$40] = web.getNextMarker(_el$197.nextSibling), _el$199 = _el$198.nextSibling, [_el$200, _co$41] = web.getNextMarker(_el$199.nextSibling);
1871
+ web.insert(_el$184, web.createComponent(CopyButton, {
1764
1872
  getText: getErrorText,
1765
- title: "Copy error details",
1873
+ get title() {
1874
+ return strings.copyErrorDetails;
1875
+ },
1766
1876
  position: "top-right"
1767
- }), _el$229, _co$50);
1768
- web.insert(_el$209, () => props.error.tool || "Unknown", _el$212, _co$45);
1769
- web.insert(_el$213, () => props.error.message || "An error occurred during tool execution");
1770
- web.insert(_el$208, web.createComponent(solidJs.Show, {
1877
+ }), _el$202, _co$42);
1878
+ web.insert(_el$188, () => formatString.formatMCPUIString(strings.toolErrorTitle, {
1879
+ tool: props.error.tool || strings.errorUnknownToolName
1880
+ }));
1881
+ web.insert(_el$189, () => props.error.message || strings.errorToolExecution);
1882
+ web.insert(_el$187, web.createComponent(solidJs.Show, {
1771
1883
  get when() {
1772
1884
  return props.error.type;
1773
1885
  },
1774
1886
  get children() {
1775
- var _el$214 = web.getNextElement(_tmpl$50), _el$215 = _el$214.firstChild, _el$216 = _el$215.nextSibling, [_el$217, _co$46] = web.getNextMarker(_el$216.nextSibling);
1776
- web.insert(_el$214, () => props.error.type, _el$217, _co$46);
1777
- return _el$214;
1887
+ var _el$190 = web.getNextElement(_tmpl$48);
1888
+ web.insert(_el$190, () => formatString.formatMCPUIString(strings.errorTypeLabel, {
1889
+ type: props.error.type
1890
+ }));
1891
+ return _el$190;
1778
1892
  }
1779
- }), _el$223, _co$47);
1780
- web.insert(_el$208, web.createComponent(solidJs.Show, {
1893
+ }), _el$196, _co$39);
1894
+ web.insert(_el$187, web.createComponent(solidJs.Show, {
1781
1895
  get when() {
1782
1896
  var _a;
1783
1897
  return (_a = props.error.suggestions) == null ? void 0 : _a.length;
1784
1898
  },
1785
1899
  get children() {
1786
- var _el$218 = web.getNextElement(_tmpl$51), _el$219 = _el$218.firstChild, _el$220 = _el$219.nextSibling;
1787
- web.insert(_el$220, web.createComponent(solidJs.For, {
1900
+ var _el$191 = web.getNextElement(_tmpl$49), _el$192 = _el$191.firstChild, _el$193 = _el$192.nextSibling;
1901
+ web.insert(_el$192, () => strings.errorSuggestions);
1902
+ web.insert(_el$193, web.createComponent(solidJs.For, {
1788
1903
  get each() {
1789
1904
  return props.error.suggestions;
1790
1905
  },
1791
1906
  children: (suggestion) => (() => {
1792
- var _el$230 = web.getNextElement(_tmpl$54);
1793
- web.insert(_el$230, suggestion);
1794
- return _el$230;
1907
+ var _el$203 = web.getNextElement(_tmpl$52);
1908
+ web.insert(_el$203, suggestion);
1909
+ return _el$203;
1795
1910
  })()
1796
1911
  }));
1797
- return _el$218;
1912
+ return _el$191;
1798
1913
  }
1799
- }), _el$225, _co$48);
1800
- web.insert(_el$208, web.createComponent(solidJs.Show, {
1914
+ }), _el$198, _co$40);
1915
+ web.insert(_el$187, web.createComponent(solidJs.Show, {
1801
1916
  get when() {
1802
- return props.error.timestamp;
1917
+ return web.memo(() => !!mounted())() && props.error.timestamp;
1803
1918
  },
1804
1919
  get children() {
1805
- var _el$221 = web.getNextElement(_tmpl$52);
1806
- web.insert(_el$221, () => new Date(props.error.timestamp).toLocaleString());
1807
- return _el$221;
1920
+ var _el$194 = web.getNextElement(_tmpl$50);
1921
+ web.insert(_el$194, () => new Date(props.error.timestamp).toLocaleString(strings.locale));
1922
+ return _el$194;
1808
1923
  }
1809
- }), _el$227, _co$49);
1810
- return _el$205;
1924
+ }), _el$200, _co$41);
1925
+ return _el$184;
1811
1926
  })();
1812
1927
  }
1813
1928
  function isErrorResponse(content) {
@@ -1818,6 +1933,7 @@ function isUIResource(content) {
1818
1933
  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));
1819
1934
  }
1820
1935
  function UIResourceHtmlRenderer(props) {
1936
+ const strings = MCPUIStringsContext.useMCPUIStrings();
1821
1937
  const htmlContent = () => {
1822
1938
  var _a;
1823
1939
  if ((_a = props.resource.content) == null ? void 0 : _a.htmlString) {
@@ -1827,26 +1943,26 @@ function UIResourceHtmlRenderer(props) {
1827
1943
  };
1828
1944
  const resourceTitle = () => {
1829
1945
  var _a, _b;
1830
- return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || ((_b = props.resource.uri) == null ? void 0 : _b.replace("ui://deposium/", "")) || "Resource";
1946
+ return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || ((_b = props.resource.uri) == null ? void 0 : _b.replace("ui://deposium/", "")) || strings.resourceTitle;
1831
1947
  };
1832
1948
  return (() => {
1833
- var _el$231 = web.getNextElement(_tmpl$56), _el$234 = _el$231.firstChild, [_el$235, _co$51] = web.getNextMarker(_el$234.nextSibling), _el$236 = _el$235.nextSibling, [_el$237, _co$52] = web.getNextMarker(_el$236.nextSibling);
1834
- web.insert(_el$231, web.createComponent(solidJs.Show, {
1949
+ var _el$204 = web.getNextElement(_tmpl$54), _el$207 = _el$204.firstChild, [_el$208, _co$43] = web.getNextMarker(_el$207.nextSibling), _el$209 = _el$208.nextSibling, [_el$210, _co$44] = web.getNextMarker(_el$209.nextSibling);
1950
+ web.insert(_el$204, web.createComponent(solidJs.Show, {
1835
1951
  get when() {
1836
1952
  var _a;
1837
1953
  return ((_a = props.resource.metadata) == null ? void 0 : _a.title) || props.resource.uri;
1838
1954
  },
1839
1955
  get children() {
1840
- var _el$232 = web.getNextElement(_tmpl$55), _el$233 = _el$232.firstChild;
1841
- web.insert(_el$233, resourceTitle);
1842
- return _el$232;
1956
+ var _el$205 = web.getNextElement(_tmpl$53), _el$206 = _el$205.firstChild;
1957
+ web.insert(_el$206, resourceTitle);
1958
+ return _el$205;
1843
1959
  }
1844
- }), _el$235, _co$51);
1845
- web.insert(_el$231, web.createComponent(SafeHtml.SafeHtml, {
1960
+ }), _el$208, _co$43);
1961
+ web.insert(_el$204, web.createComponent(SafeHtml.SafeHtml, {
1846
1962
  "class": "p-4 prose prose-sm dark:prose-invert max-w-none",
1847
1963
  html: htmlContent
1848
- }), _el$237, _co$52);
1849
- return _el$231;
1964
+ }), _el$210, _co$44);
1965
+ return _el$204;
1850
1966
  })();
1851
1967
  }
1852
1968
  const UIResourceRenderer = (props) => {
@@ -1952,8 +2068,8 @@ const UIResourceRenderer = (props) => {
1952
2068
  return web.createComponent(RenderContext.RenderProvider, {
1953
2069
  renderComponent,
1954
2070
  get children() {
1955
- var _el$238 = web.getNextElement(_tmpl$57), _el$239 = _el$238.firstChild, _el$240 = _el$239.nextSibling, [_el$241, _co$53] = web.getNextMarker(_el$240.nextSibling);
1956
- web.spread(_el$238, web.mergeProps({
2071
+ var _el$211 = web.getNextElement(_tmpl$55), _el$212 = _el$211.firstChild, _el$213 = _el$212.nextSibling, [_el$214, _co$45] = web.getNextMarker(_el$213.nextSibling);
2072
+ web.spread(_el$211, web.mergeProps({
1957
2073
  get ["class"]() {
1958
2074
  return `w-full ${props.class || ""}`;
1959
2075
  }
@@ -1963,14 +2079,14 @@ const UIResourceRenderer = (props) => {
1963
2079
  "data-mcp-ui-component-id": outerKey()
1964
2080
  }), false, true);
1965
2081
  var _ref$3 = responsiveGrid.ref;
1966
- typeof _ref$3 === "function" ? web.use(_ref$3, _el$239) : responsiveGrid.ref = _el$239;
1967
- web.insert(_el$239, web.createComponent(solidJs.For, {
2082
+ typeof _ref$3 === "function" ? web.use(_ref$3, _el$212) : responsiveGrid.ref = _el$212;
2083
+ web.insert(_el$212, web.createComponent(solidJs.For, {
1968
2084
  get each() {
1969
2085
  return layout().components;
1970
2086
  },
1971
2087
  children: (component) => (() => {
1972
- var _el$242 = web.getNextElement(_tmpl$58);
1973
- web.insert(_el$242, web.createComponent(ComponentRenderer, {
2088
+ var _el$215 = web.getNextElement(_tmpl$56);
2089
+ web.insert(_el$215, web.createComponent(ComponentRenderer, {
1974
2090
  component,
1975
2091
  get onError() {
1976
2092
  return props.onError;
@@ -1986,18 +2102,18 @@ const UIResourceRenderer = (props) => {
1986
2102
  }
1987
2103
  }));
1988
2104
  web.effect((_p$) => {
1989
- var _v$44 = getGridStyleString(component), _v$45 = stableKey.getUiResourceStableKey(component);
1990
- _p$.e = web.style(_el$242, _v$44, _p$.e);
1991
- _v$45 !== _p$.t && web.setAttribute(_el$242, "data-mcp-ui-component-id", _p$.t = _v$45);
2105
+ var _v$48 = getGridStyleString(component), _v$49 = stableKey.getUiResourceStableKey(component);
2106
+ _p$.e = web.style(_el$215, _v$48, _p$.e);
2107
+ _v$49 !== _p$.t && web.setAttribute(_el$215, "data-mcp-ui-component-id", _p$.t = _v$49);
1992
2108
  return _p$;
1993
2109
  }, {
1994
2110
  e: void 0,
1995
2111
  t: void 0
1996
2112
  });
1997
- return _el$242;
2113
+ return _el$215;
1998
2114
  })()
1999
2115
  }));
2000
- web.insert(_el$238, web.createComponent(solidJs.Show, {
2116
+ web.insert(_el$211, web.createComponent(solidJs.Show, {
2001
2117
  get when() {
2002
2118
  return shouldShowAutoFooter();
2003
2119
  },
@@ -2008,18 +2124,18 @@ const UIResourceRenderer = (props) => {
2008
2124
  }
2009
2125
  });
2010
2126
  }
2011
- }), _el$241, _co$53);
2127
+ }), _el$214, _co$45);
2012
2128
  web.effect((_p$) => {
2013
- var _v$42 = gridContainerStyle(), _v$43 = responsiveGrid.stacked();
2014
- _p$.e = web.style(_el$239, _v$42, _p$.e);
2015
- _v$43 !== _p$.t && web.setAttribute(_el$239, "data-mcp-ui-stacked", _p$.t = _v$43);
2129
+ var _v$46 = gridContainerStyle(), _v$47 = responsiveGrid.stacked();
2130
+ _p$.e = web.style(_el$212, _v$46, _p$.e);
2131
+ _v$47 !== _p$.t && web.setAttribute(_el$212, "data-mcp-ui-stacked", _p$.t = _v$47);
2016
2132
  return _p$;
2017
2133
  }, {
2018
2134
  e: void 0,
2019
2135
  t: void 0
2020
2136
  });
2021
2137
  web.runHydrationEvents();
2022
- return _el$238;
2138
+ return _el$211;
2023
2139
  }
2024
2140
  });
2025
2141
  };