@seed-ship/mcp-ui-solid 6.19.1 → 6.20.0

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