@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
@@ -1,11 +1,12 @@
1
- import { createComponent, getNextElement, getNextMarker, insert, effect, setProperty, runHydrationEvents, setAttribute, mergeProps, memo, className, style, template, use, delegateEvents } from "solid-js/web";
1
+ import { createComponent, getNextElement, getNextMarker, insert, effect, setProperty, setAttribute, runHydrationEvents, mergeProps, memo, className, style, template, use, delegateEvents } from "solid-js/web";
2
2
  import { createSignal, createMemo, createUniqueId, createEffect, onCleanup, Show, For } from "solid-js";
3
3
  import { ExpandableWrapper, useExpanded } from "./ExpandableWrapper.js";
4
4
  import { DegradedFallback } from "./DegradedFallback.js";
5
5
  import { chartToDataTable } from "./chart-data-table.js";
6
6
  import { useTelemetry } from "../context/MCPUITelemetryContext.js";
7
7
  import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
8
- var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button class="opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed 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="Download PNG"aria-label="Download chart as PNG"><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">`), _tmpl$3 = /* @__PURE__ */ template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$4 = /* @__PURE__ */ template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">Loading chart...`), _tmpl$6 = /* @__PURE__ */ template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$8 = /* @__PURE__ */ template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$9 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
8
+ import { formatMCPUIString } from "../utils/format-string.js";
9
+ var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button class="opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed 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"><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">`), _tmpl$3 = /* @__PURE__ */ template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$4 = /* @__PURE__ */ template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$5 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">`), _tmpl$6 = /* @__PURE__ */ template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$8 = /* @__PURE__ */ template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$9 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
9
10
  let ChartJS = null;
10
11
  let chartJSLoadPromise = null;
11
12
  const loadChartJS = async () => {
@@ -38,9 +39,14 @@ const ChartJSRenderer = (props) => {
38
39
  let chartInstance;
39
40
  let renderVersion = 0;
40
41
  const params = () => props.component.params;
41
- const tableData = createMemo(() => chartToDataTable(params()));
42
42
  const telemetry = useTelemetry();
43
43
  const strings = useMCPUIStrings();
44
+ const tableData = createMemo(() => chartToDataTable(params(), {
45
+ series: strings.chartTableSeries,
46
+ point: strings.chartTablePoint,
47
+ label: strings.degradedColLabel,
48
+ seriesName: strings.degradedSeries
49
+ }));
44
50
  const descriptionId = createUniqueId();
45
51
  const title = () => params().title || strings.chartView;
46
52
  const exportEnabled = () => params().exportable !== false;
@@ -112,7 +118,7 @@ const ChartJSRenderer = (props) => {
112
118
  setIsLoading(false);
113
119
  } catch (err) {
114
120
  if (version !== renderVersion) return;
115
- const error2 = err instanceof Error ? err : new Error("Chart rendering failed");
121
+ const error2 = err instanceof Error ? err : new Error(strings.chartRenderError);
116
122
  setError(error2.message);
117
123
  setIsLoading(false);
118
124
  telemetry == null ? void 0 : telemetry.dispatch({
@@ -146,14 +152,16 @@ const ChartJSRenderer = (props) => {
146
152
  get copyData() {
147
153
  return copyDataJSON();
148
154
  },
149
- copyLabel: "Copy chart data (JSON)",
155
+ get copyLabel() {
156
+ return strings.chartCopy;
157
+ },
150
158
  get toolbarVariant() {
151
159
  return props.toolbarVariant;
152
160
  },
153
161
  get children() {
154
162
  return createComponent(ContextAwareChartLayout, {
155
163
  render: (isExpanded) => (() => {
156
- var _el$ = getNextElement(_tmpl$6), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$0 = _el$6.nextSibling, [_el$1, _co$] = getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = getNextMarker(_el$14.nextSibling), _el$38 = _el$10.nextSibling, [_el$39, _co$9] = getNextMarker(_el$38.nextSibling), _el$40 = _el$39.nextSibling, [_el$41, _co$0] = getNextMarker(_el$40.nextSibling), _el$33 = _el$41.nextSibling, _el$34 = _el$33.firstChild, _el$36 = _el$34.nextSibling, [_el$37, _co$8] = getNextMarker(_el$36.nextSibling);
164
+ var _el$ = getNextElement(_tmpl$6), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$0 = _el$6.nextSibling, [_el$1, _co$] = getNextMarker(_el$0.nextSibling), _el$10 = _el$2.nextSibling, _el$12 = _el$10.firstChild, [_el$13, _co$2] = getNextMarker(_el$12.nextSibling), _el$11 = _el$13.nextSibling, _el$14 = _el$11.nextSibling, [_el$15, _co$3] = getNextMarker(_el$14.nextSibling), _el$41 = _el$10.nextSibling, [_el$42, _co$9] = getNextMarker(_el$41.nextSibling), _el$43 = _el$42.nextSibling, [_el$44, _co$0] = getNextMarker(_el$43.nextSibling), _el$33 = _el$44.nextSibling, _el$34 = _el$33.firstChild, _el$39 = _el$34.nextSibling, [_el$40, _co$8] = getNextMarker(_el$39.nextSibling);
157
165
  insert(_el$3, createComponent(Show, {
158
166
  get when() {
159
167
  return params().title;
@@ -175,7 +183,17 @@ const ChartJSRenderer = (props) => {
175
183
  get children() {
176
184
  var _el$9 = getNextElement(_tmpl$2);
177
185
  _el$9.$$click = handleExportPNG;
178
- effect(() => setProperty(_el$9, "disabled", activeView() !== "chart" || isLoading() || Boolean(error())));
186
+ effect((_p$) => {
187
+ var _v$ = activeView() !== "chart" || isLoading() || Boolean(error()), _v$2 = strings.chartDownloadPng, _v$3 = strings.chartDownloadPngAria;
188
+ _v$ !== _p$.e && setProperty(_el$9, "disabled", _p$.e = _v$);
189
+ _v$2 !== _p$.t && setAttribute(_el$9, "title", _p$.t = _v$2);
190
+ _v$3 !== _p$.a && setAttribute(_el$9, "aria-label", _p$.a = _v$3);
191
+ return _p$;
192
+ }, {
193
+ e: void 0,
194
+ t: void 0,
195
+ a: void 0
196
+ });
179
197
  runHydrationEvents();
180
198
  return _el$9;
181
199
  }
@@ -190,12 +208,16 @@ const ChartJSRenderer = (props) => {
190
208
  get children() {
191
209
  return createComponent(DegradedFallback, mergeProps({
192
210
  get message() {
193
- return `Chart rendering failed: ${error()}`;
211
+ return formatMCPUIString(strings.chartRenderFailed, {
212
+ error: String(error())
213
+ });
194
214
  },
195
- caption: "Showing the chart data as a table — the interactive chart is unavailable."
215
+ get caption() {
216
+ return strings.chartDegradedCaption;
217
+ }
196
218
  }, tableData));
197
219
  }
198
- }), _el$39, _co$9);
220
+ }), _el$42, _co$9);
199
221
  insert(_el$, createComponent(Show, {
200
222
  get when() {
201
223
  return activeView() === "data";
@@ -209,9 +231,9 @@ const ChartJSRenderer = (props) => {
209
231
  return tableData().columns;
210
232
  },
211
233
  children: (column) => (() => {
212
- var _el$42 = getNextElement(_tmpl$7);
213
- insert(_el$42, column);
214
- return _el$42;
234
+ var _el$45 = getNextElement(_tmpl$7);
235
+ insert(_el$45, column);
236
+ return _el$45;
215
237
  })()
216
238
  }));
217
239
  insert(_el$26, createComponent(For, {
@@ -219,18 +241,18 @@ const ChartJSRenderer = (props) => {
219
241
  return tableData().rows;
220
242
  },
221
243
  children: (row) => (() => {
222
- var _el$43 = getNextElement(_tmpl$8);
223
- insert(_el$43, createComponent(For, {
244
+ var _el$46 = getNextElement(_tmpl$8);
245
+ insert(_el$46, createComponent(For, {
224
246
  get each() {
225
247
  return tableData().columns;
226
248
  },
227
249
  children: (_column, index) => (() => {
228
- var _el$44 = getNextElement(_tmpl$9);
229
- insert(_el$44, () => String(row[index()] ?? ""));
230
- return _el$44;
250
+ var _el$47 = getNextElement(_tmpl$9);
251
+ insert(_el$47, () => String(row[index()] ?? ""));
252
+ return _el$47;
231
253
  })()
232
254
  }));
233
- return _el$43;
255
+ return _el$46;
234
256
  })()
235
257
  }), _el$30, _co$6);
236
258
  insert(_el$26, createComponent(Show, {
@@ -245,12 +267,12 @@ const ChartJSRenderer = (props) => {
245
267
  }
246
268
  }), _el$32, _co$7);
247
269
  effect((_p$) => {
248
- var _v$ = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$2 = isExpanded() ? void 0 : {
270
+ var _v$4 = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$5 = isExpanded() ? void 0 : {
249
271
  height: params().height || "250px",
250
272
  "max-height": "70vh"
251
273
  };
252
- _v$ !== _p$.e && className(_el$16, _p$.e = _v$);
253
- _p$.t = style(_el$16, _v$2, _p$.t);
274
+ _v$4 !== _p$.e && className(_el$16, _p$.e = _v$4);
275
+ _p$.t = style(_el$16, _v$5, _p$.t);
254
276
  return _p$;
255
277
  }, {
256
278
  e: void 0,
@@ -258,7 +280,7 @@ const ChartJSRenderer = (props) => {
258
280
  });
259
281
  return _el$16;
260
282
  }
261
- }), _el$41, _co$0);
283
+ }), _el$44, _co$0);
262
284
  var _ref$ = canvasRef;
263
285
  typeof _ref$ === "function" ? use(_ref$, _el$34) : canvasRef = _el$34;
264
286
  setAttribute(_el$34, "aria-describedby", descriptionId);
@@ -267,11 +289,13 @@ const ChartJSRenderer = (props) => {
267
289
  return memo(() => !!isLoading())() && activeView() === "chart";
268
290
  },
269
291
  get children() {
270
- return getNextElement(_tmpl$5);
292
+ var _el$35 = getNextElement(_tmpl$5), _el$36 = _el$35.firstChild, _el$37 = _el$36.firstChild, _el$38 = _el$37.nextSibling;
293
+ insert(_el$38, () => strings.chartLoading);
294
+ return _el$35;
271
295
  }
272
- }), _el$37, _co$8);
296
+ }), _el$40, _co$8);
273
297
  effect((_p$) => {
274
- var _v$3 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""} ${params().className || ""}`, _v$4 = strings.chartViewSelector, _v$5 = activeView() === "chart", _v$6 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "chart" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$7 = activeView() === "data", _v$8 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "data" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$9 = `relative w-full ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$0 = error() || activeView() === "data" ? {
298
+ var _v$6 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${isExpanded() ? "flex-1 min-h-0 flex flex-col" : ""} ${params().className || ""}`, _v$7 = strings.chartViewSelector, _v$8 = activeView() === "chart", _v$9 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "chart" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$0 = activeView() === "data", _v$1 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "data" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$10 = `relative w-full ${isExpanded() ? "flex-1 min-h-0" : ""}`, _v$11 = error() || activeView() === "data" ? {
275
299
  display: "none"
276
300
  } : isExpanded() ? {
277
301
  height: "100%",
@@ -279,17 +303,17 @@ const ChartJSRenderer = (props) => {
279
303
  } : {
280
304
  height: params().height || "250px",
281
305
  display: "block"
282
- }, _v$1 = title(), _v$10 = activeView() !== "chart" || Boolean(error());
283
- _v$3 !== _p$.e && className(_el$, _p$.e = _v$3);
284
- _v$4 !== _p$.t && setAttribute(_el$6, "aria-label", _p$.t = _v$4);
285
- _v$5 !== _p$.a && setAttribute(_el$7, "aria-pressed", _p$.a = _v$5);
286
- _v$6 !== _p$.o && className(_el$7, _p$.o = _v$6);
287
- _v$7 !== _p$.i && setAttribute(_el$8, "aria-pressed", _p$.i = _v$7);
288
- _v$8 !== _p$.n && className(_el$8, _p$.n = _v$8);
289
- _v$9 !== _p$.s && className(_el$33, _p$.s = _v$9);
290
- _p$.h = style(_el$33, _v$0, _p$.h);
291
- _v$1 !== _p$.r && setAttribute(_el$34, "aria-label", _p$.r = _v$1);
292
- _v$10 !== _p$.d && setAttribute(_el$34, "aria-hidden", _p$.d = _v$10);
306
+ }, _v$12 = title(), _v$13 = activeView() !== "chart" || Boolean(error());
307
+ _v$6 !== _p$.e && className(_el$, _p$.e = _v$6);
308
+ _v$7 !== _p$.t && setAttribute(_el$6, "aria-label", _p$.t = _v$7);
309
+ _v$8 !== _p$.a && setAttribute(_el$7, "aria-pressed", _p$.a = _v$8);
310
+ _v$9 !== _p$.o && className(_el$7, _p$.o = _v$9);
311
+ _v$0 !== _p$.i && setAttribute(_el$8, "aria-pressed", _p$.i = _v$0);
312
+ _v$1 !== _p$.n && className(_el$8, _p$.n = _v$1);
313
+ _v$10 !== _p$.s && className(_el$33, _p$.s = _v$10);
314
+ _p$.h = style(_el$33, _v$11, _p$.h);
315
+ _v$12 !== _p$.r && setAttribute(_el$34, "aria-label", _p$.r = _v$12);
316
+ _v$13 !== _p$.d && setAttribute(_el$34, "aria-hidden", _p$.d = _v$13);
293
317
  return _p$;
294
318
  }, {
295
319
  e: void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"ChartJSRenderer.js","sources":["../../src/components/ChartJSRenderer.tsx"],"sourcesContent":["/**\n * ChartJSRenderer - Native Chart.js rendering\n * Sprint 4: State & Charts\n *\n * Requires chart.js peer dependency:\n * ```\n * pnpm add chart.js\n * ```\n */\n\nimport {\n Component,\n For,\n createEffect,\n createMemo,\n createUniqueId,\n onCleanup,\n createSignal,\n Show,\n} from 'solid-js';\nimport type { Accessor, JSX } from 'solid-js';\nimport type { UIComponent, ChartComponentParams } from '../types';\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper';\nimport { DegradedFallback } from './DegradedFallback';\nimport { chartToDataTable } from './chart-data-table';\nimport { useTelemetry } from '../context/MCPUITelemetryContext';\nimport { useMCPUIStrings } from '../context/MCPUIStringsContext';\n\n// Lazy load Chart.js to avoid bundling if not used\nlet ChartJS: any = null;\nlet chartJSLoadPromise: Promise<any> | null = null;\n\nconst loadChartJS = async () => {\n if (ChartJS) return ChartJS;\n\n if (!chartJSLoadPromise) {\n chartJSLoadPromise = import('chart.js/auto')\n .then((module) => {\n ChartJS = module.default || module.Chart;\n return ChartJS;\n })\n .catch((err) => {\n chartJSLoadPromise = null;\n throw err;\n });\n }\n\n return chartJSLoadPromise;\n};\n\n/**\n * Check if Chart.js is available\n */\nexport async function isChartJSAvailable(): Promise<boolean> {\n try {\n await loadChartJS();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ChartJSRendererProps {\n /**\n * UIComponent with chart params\n */\n component: UIComponent;\n\n /**\n * Error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible';\n}\n\nconst ContextAwareChartLayout: Component<{\n render: (isExpanded: Accessor<boolean>) => JSX.Element;\n}> = (props) => props.render(useExpanded());\n\n/**\n * Native Chart.js renderer component\n *\n * @example\n * ```tsx\n * const chartComponent: UIComponent = {\n * id: 'revenue-chart',\n * type: 'chart',\n * position: { colStart: 1, colSpan: 6 },\n * params: {\n * type: 'bar',\n * title: 'Monthly Revenue',\n * data: {\n * labels: ['Jan', 'Feb', 'Mar'],\n * datasets: [{ label: 'Revenue', data: [100, 200, 150] }]\n * },\n * renderer: 'native',\n * },\n * }\n * <ChartJSRenderer component={chartComponent} />\n * ```\n */\nexport const ChartJSRenderer: Component<ChartJSRendererProps> = (props) => {\n const [isLoading, setIsLoading] = createSignal(true);\n const [error, setError] = createSignal<string>();\n const [activeView, setActiveView] = createSignal<'chart' | 'data'>('chart');\n let canvasRef: HTMLCanvasElement | undefined;\n let chartInstance: any;\n let renderVersion = 0;\n\n const params = () => props.component.params as ChartComponentParams;\n const tableData = createMemo(() => chartToDataTable(params()));\n const telemetry = useTelemetry();\n const strings = useMCPUIStrings();\n const descriptionId = createUniqueId();\n const title = () => params().title || strings.chartView;\n\n // v6.1.0 — export visibility :\n // - undefined / true → button shown (new default, was opt-in)\n // - false → button hidden (explicit opt-out, unchanged)\n const exportEnabled = () => params().exportable !== false;\n\n // v6.1.0 — copy data for the ExpandableWrapper modal-header copy button.\n // Lazy-stringified each time the button is clicked.\n const copyDataJSON = () => JSON.stringify({ type: params().type, data: params().data }, null, 2);\n\n // Chart PNG export\n const handleExportPNG = () => {\n if (!canvasRef) return;\n const url = canvasRef.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(params().title || 'chart').replace(/\\s+/g, '-').toLowerCase()}.png`;\n a.click();\n };\n\n // Create/update chart when params change\n createEffect(async () => {\n if (!canvasRef) return;\n\n // Access params to track dependencies\n const chartParams = params();\n const version = ++renderVersion;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const Chart = await loadChartJS();\n\n // A newer prop update or an unmount superseded this async render.\n if (version !== renderVersion || !canvasRef) return;\n\n // Destroy previous instance\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n\n // Build options, merging time-axis config if present (v3.1.0)\n const baseOptions: any = {\n responsive: true,\n maintainAspectRatio: false,\n ...chartParams.options,\n plugins: {\n ...chartParams.options?.plugins,\n legend: {\n display: true,\n position: 'bottom',\n ...chartParams.options?.plugins?.legend,\n },\n },\n };\n\n // Time-series axis (v3.1.0)\n if (chartParams.timeAxis) {\n const ta = chartParams.timeAxis;\n baseOptions.scales = {\n ...baseOptions.scales,\n x: {\n ...baseOptions.scales?.x,\n type: 'time',\n time: {\n parser: ta.parser,\n unit: ta.unit,\n tooltipFormat: ta.tooltipFormat,\n },\n ...(ta.min ? { min: ta.min } : {}),\n ...(ta.max ? { max: ta.max } : {}),\n },\n };\n }\n\n // Create new chart\n chartInstance = new Chart(canvasRef, {\n type: chartParams.type,\n data: chartParams.data,\n options: baseOptions,\n });\n\n setIsLoading(false);\n } catch (err) {\n if (version !== renderVersion) return;\n const error = err instanceof Error ? err : new Error('Chart rendering failed');\n setError(error.message);\n setIsLoading(false);\n // Fallback ladder (P2.5): record the failure so it's observable, then\n // degrade to the series table below instead of a blank canvas.\n telemetry?.dispatch({\n type: 'render:error',\n errorMessage: error.message,\n id: props.component?.id ?? '',\n componentType: 'chart',\n ts: Date.now(),\n });\n props.onError?.(error);\n }\n });\n\n // Chart.js may measure a zero-sized canvas while the data view is visible.\n // Resize once Solid has revealed it again.\n createEffect(() => {\n if (activeView() !== 'chart' || !chartInstance) return;\n queueMicrotask(() => chartInstance?.resize?.());\n });\n\n // Cleanup on unmount\n onCleanup(() => {\n renderVersion += 1;\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n });\n\n return (\n <ExpandableWrapper\n title={title()}\n copyData={copyDataJSON()}\n copyLabel=\"Copy chart data (JSON)\"\n toolbarVariant={props.toolbarVariant}\n >\n <ContextAwareChartLayout\n render={(isExpanded) => (\n <div\n class={`relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${\n isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''\n } ${params().className || ''}`}\n >\n <div class=\"flex items-center justify-between gap-3 mb-3 flex-shrink-0\">\n <div class=\"min-w-0\">\n <Show when={params().title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params().title}</h3>\n </Show>\n </div>\n <div class=\"flex items-center gap-2\">\n <div\n class=\"inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600\"\n role=\"group\"\n aria-label={strings.chartViewSelector}\n >\n <button\n type=\"button\"\n aria-pressed={activeView() === 'chart'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'chart'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('chart')}\n >\n {strings.chartView}\n </button>\n <button\n type=\"button\"\n aria-pressed={activeView() === 'data'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'data'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('data')}\n >\n {strings.chartDataView}\n </button>\n </div>\n <Show when={exportEnabled()}>\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={activeView() !== 'chart' || isLoading() || Boolean(error())}\n class=\"opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed 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\"\n title=\"Download PNG\"\n aria-label=\"Download chart as PNG\"\n >\n <svg\n class=\"w-3 h-3 text-gray-500 dark:text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n 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\"\n />\n </svg>\n </button>\n </Show>\n </div>\n </div>\n\n <p id={descriptionId} class=\"sr-only\">\n {title()}. {strings.chartDataSummary}\n </p>\n\n {/* Fallback ladder (P2.5): degrade to a series table on render error\n instead of a bare \"Chart Error\" message. */}\n <Show when={error() && activeView() === 'chart'}>\n <DegradedFallback\n message={`Chart rendering failed: ${error()}`}\n caption=\"Showing the chart data as a table — the interactive chart is unavailable.\"\n {...tableData()}\n />\n </Show>\n\n <Show when={activeView() === 'data'}>\n <div\n class={`w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${\n isExpanded() ? 'flex-1 min-h-0' : ''\n }`}\n style={\n isExpanded()\n ? undefined\n : { height: params().height || '250px', 'max-height': '70vh' }\n }\n >\n <table class=\"w-full border-collapse text-left text-sm\">\n <caption class=\"sr-only\">\n {title()} — {strings.chartDataTable}\n </caption>\n <thead class=\"bg-gray-50 dark:bg-gray-900/40\">\n <tr>\n <For each={tableData().columns}>\n {(column) => (\n <th scope=\"col\" class=\"px-3 py-2 font-medium text-gray-900 dark:text-gray-100\">\n {column}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={tableData().rows}>\n {(row) => (\n <tr class=\"border-t border-gray-100 dark:border-gray-700\">\n <For each={tableData().columns}>\n {(_column, index) => (\n <td class=\"px-3 py-2 text-gray-700 dark:text-gray-300\">\n {String(row[index()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n <Show when={tableData().rows.length === 0}>\n <tr>\n <td\n colSpan={Math.max(1, tableData().columns.length)}\n class=\"px-3 py-6 text-center text-gray-500 dark:text-gray-400\"\n >\n {strings.chartNoData}\n </td>\n </tr>\n </Show>\n </tbody>\n </table>\n </div>\n </Show>\n\n <div\n class={`relative w-full ${isExpanded() ? 'flex-1 min-h-0' : ''}`}\n style={\n error() || activeView() === 'data'\n ? { display: 'none' }\n : isExpanded()\n ? { height: '100%', display: 'block' }\n : { height: params().height || '250px', display: 'block' }\n }\n >\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={title()}\n aria-describedby={descriptionId}\n aria-hidden={activeView() !== 'chart' || Boolean(error())}\n />\n <Show when={isLoading() && activeView() === 'chart'}>\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80\">\n <div class=\"flex flex-col items-center gap-2\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span class=\"text-sm text-gray-500 dark:text-gray-400\">Loading chart...</span>\n </div>\n </div>\n </Show>\n </div>\n </div>\n )}\n />\n </ExpandableWrapper>\n );\n};\n"],"names":["ChartJS","chartJSLoadPromise","loadChartJS","then","module","default","Chart","catch","err","isChartJSAvailable","ContextAwareChartLayout","props","render","useExpanded","ChartJSRenderer","isLoading","setIsLoading","createSignal","error","setError","activeView","setActiveView","canvasRef","chartInstance","renderVersion","params","component","tableData","createMemo","chartToDataTable","telemetry","useTelemetry","strings","useMCPUIStrings","descriptionId","createUniqueId","title","chartView","exportEnabled","exportable","copyDataJSON","JSON","stringify","type","data","handleExportPNG","url","toDataURL","a","document","createElement","href","download","replace","toLowerCase","click","createEffect","chartParams","version","undefined","destroy","baseOptions","responsive","maintainAspectRatio","options","plugins","legend","display","position","timeAxis","ta","scales","x","time","parser","unit","tooltipFormat","min","max","Error","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","queueMicrotask","resize","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","toolbarVariant","children","isExpanded","_el$","_$getNextElement","_tmpl$6","_el$2","firstChild","_el$3","_el$5","nextSibling","_el$6","_el$7","_el$8","_el$0","_el$1","_co$","_$getNextMarker","_el$10","_el$12","_el$13","_co$2","_el$11","_el$14","_el$15","_co$3","_el$38","_el$39","_co$9","_el$40","_el$41","_co$0","_el$33","_el$34","_el$36","_el$37","_co$8","_$insert","Show","when","_el$4","_tmpl$","$$click","chartDataView","_el$9","_tmpl$2","_$effect","_$setProperty","Boolean","_$runHydrationEvents","_$setAttribute","chartDataSummary","_$memo","DegradedFallback","_$mergeProps","caption","_el$16","_tmpl$4","_el$17","_el$18","_el$20","_el$21","_co$4","_el$19","_el$22","_el$23","_co$5","_el$24","_el$25","_el$26","_el$29","_el$30","_co$6","_el$31","_el$32","_co$7","chartDataTable","For","each","columns","column","_el$42","_tmpl$7","rows","row","_el$43","_tmpl$8","_column","index","_el$44","_tmpl$9","String","length","_el$27","_tmpl$3","_el$28","chartNoData","Math","_p$","_v$","_v$2","height","e","_$className","t","_$style","_ref$","_$use","_tmpl$5","_v$3","className","_v$4","chartViewSelector","_v$5","_v$6","_v$7","_v$8","_v$9","_v$0","_v$1","_v$10","o","i","n","s","h","r","d","_$delegateEvents"],"mappings":"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"}
1
+ {"version":3,"file":"ChartJSRenderer.js","sources":["../../src/components/ChartJSRenderer.tsx"],"sourcesContent":["/**\n * ChartJSRenderer - Native Chart.js rendering\n * Sprint 4: State & Charts\n *\n * Requires chart.js peer dependency:\n * ```\n * pnpm add chart.js\n * ```\n */\n\nimport {\n Component,\n For,\n createEffect,\n createMemo,\n createUniqueId,\n onCleanup,\n createSignal,\n Show,\n} from 'solid-js';\nimport type { Accessor, JSX } from 'solid-js';\nimport type { UIComponent, ChartComponentParams } from '../types';\nimport { ExpandableWrapper, useExpanded } from './ExpandableWrapper';\nimport { DegradedFallback } from './DegradedFallback';\nimport { chartToDataTable } from './chart-data-table';\nimport { useTelemetry } from '../context/MCPUITelemetryContext';\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext';\n\n// Lazy load Chart.js to avoid bundling if not used\nlet ChartJS: any = null;\nlet chartJSLoadPromise: Promise<any> | null = null;\n\nconst loadChartJS = async () => {\n if (ChartJS) return ChartJS;\n\n if (!chartJSLoadPromise) {\n chartJSLoadPromise = import('chart.js/auto')\n .then((module) => {\n ChartJS = module.default || module.Chart;\n return ChartJS;\n })\n .catch((err) => {\n chartJSLoadPromise = null;\n throw err;\n });\n }\n\n return chartJSLoadPromise;\n};\n\n/**\n * Check if Chart.js is available\n */\nexport async function isChartJSAvailable(): Promise<boolean> {\n try {\n await loadChartJS();\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface ChartJSRendererProps {\n /**\n * UIComponent with chart params\n */\n component: UIComponent;\n\n /**\n * Error callback\n */\n onError?: (error: Error) => void;\n\n /**\n * Forwarded to the underlying `<ExpandableWrapper>` (v6.3.1).\n * @see ExpandableWrapperProps.toolbarVariant\n */\n toolbarVariant?: 'hover' | 'always-visible';\n}\n\nconst ContextAwareChartLayout: Component<{\n render: (isExpanded: Accessor<boolean>) => JSX.Element;\n}> = (props) => props.render(useExpanded());\n\n/**\n * Native Chart.js renderer component\n *\n * @example\n * ```tsx\n * const chartComponent: UIComponent = {\n * id: 'revenue-chart',\n * type: 'chart',\n * position: { colStart: 1, colSpan: 6 },\n * params: {\n * type: 'bar',\n * title: 'Monthly Revenue',\n * data: {\n * labels: ['Jan', 'Feb', 'Mar'],\n * datasets: [{ label: 'Revenue', data: [100, 200, 150] }]\n * },\n * renderer: 'native',\n * },\n * }\n * <ChartJSRenderer component={chartComponent} />\n * ```\n */\nexport const ChartJSRenderer: Component<ChartJSRendererProps> = (props) => {\n const [isLoading, setIsLoading] = createSignal(true);\n const [error, setError] = createSignal<string>();\n const [activeView, setActiveView] = createSignal<'chart' | 'data'>('chart');\n let canvasRef: HTMLCanvasElement | undefined;\n let chartInstance: any;\n let renderVersion = 0;\n\n const params = () => props.component.params as ChartComponentParams;\n const telemetry = useTelemetry();\n const strings = useMCPUIStrings();\n // The accessible data table is a pure projection: its column headers come\n // from the chrome strings, injected rather than hardcoded in the helper.\n const tableData = createMemo(() =>\n chartToDataTable(params(), {\n series: strings.chartTableSeries,\n point: strings.chartTablePoint,\n label: strings.degradedColLabel,\n seriesName: strings.degradedSeries,\n })\n );\n const descriptionId = createUniqueId();\n const title = () => params().title || strings.chartView;\n\n // v6.1.0 — export visibility :\n // - undefined / true → button shown (new default, was opt-in)\n // - false → button hidden (explicit opt-out, unchanged)\n const exportEnabled = () => params().exportable !== false;\n\n // v6.1.0 — copy data for the ExpandableWrapper modal-header copy button.\n // Lazy-stringified each time the button is clicked.\n const copyDataJSON = () => JSON.stringify({ type: params().type, data: params().data }, null, 2);\n\n // Chart PNG export\n const handleExportPNG = () => {\n if (!canvasRef) return;\n const url = canvasRef.toDataURL('image/png');\n const a = document.createElement('a');\n a.href = url;\n a.download = `${(params().title || 'chart').replace(/\\s+/g, '-').toLowerCase()}.png`;\n a.click();\n };\n\n // Create/update chart when params change\n createEffect(async () => {\n if (!canvasRef) return;\n\n // Access params to track dependencies\n const chartParams = params();\n const version = ++renderVersion;\n\n setIsLoading(true);\n setError(undefined);\n\n try {\n const Chart = await loadChartJS();\n\n // A newer prop update or an unmount superseded this async render.\n if (version !== renderVersion || !canvasRef) return;\n\n // Destroy previous instance\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n\n // Build options, merging time-axis config if present (v3.1.0)\n const baseOptions: any = {\n responsive: true,\n maintainAspectRatio: false,\n ...chartParams.options,\n plugins: {\n ...chartParams.options?.plugins,\n legend: {\n display: true,\n position: 'bottom',\n ...chartParams.options?.plugins?.legend,\n },\n },\n };\n\n // Time-series axis (v3.1.0)\n if (chartParams.timeAxis) {\n const ta = chartParams.timeAxis;\n baseOptions.scales = {\n ...baseOptions.scales,\n x: {\n ...baseOptions.scales?.x,\n type: 'time',\n time: {\n parser: ta.parser,\n unit: ta.unit,\n tooltipFormat: ta.tooltipFormat,\n },\n ...(ta.min ? { min: ta.min } : {}),\n ...(ta.max ? { max: ta.max } : {}),\n },\n };\n }\n\n // Create new chart\n chartInstance = new Chart(canvasRef, {\n type: chartParams.type,\n data: chartParams.data,\n options: baseOptions,\n });\n\n setIsLoading(false);\n } catch (err) {\n if (version !== renderVersion) return;\n const error = err instanceof Error ? err : new Error(strings.chartRenderError);\n setError(error.message);\n setIsLoading(false);\n // Fallback ladder (P2.5): record the failure so it's observable, then\n // degrade to the series table below instead of a blank canvas.\n telemetry?.dispatch({\n type: 'render:error',\n errorMessage: error.message,\n id: props.component?.id ?? '',\n componentType: 'chart',\n ts: Date.now(),\n });\n props.onError?.(error);\n }\n });\n\n // Chart.js may measure a zero-sized canvas while the data view is visible.\n // Resize once Solid has revealed it again.\n createEffect(() => {\n if (activeView() !== 'chart' || !chartInstance) return;\n queueMicrotask(() => chartInstance?.resize?.());\n });\n\n // Cleanup on unmount\n onCleanup(() => {\n renderVersion += 1;\n if (chartInstance) {\n chartInstance.destroy();\n chartInstance = null;\n }\n });\n\n return (\n <ExpandableWrapper\n title={title()}\n copyData={copyDataJSON()}\n copyLabel={strings.chartCopy}\n toolbarVariant={props.toolbarVariant}\n >\n <ContextAwareChartLayout\n render={(isExpanded) => (\n <div\n class={`relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${\n isExpanded() ? 'flex-1 min-h-0 flex flex-col' : ''\n } ${params().className || ''}`}\n >\n <div class=\"flex items-center justify-between gap-3 mb-3 flex-shrink-0\">\n <div class=\"min-w-0\">\n <Show when={params().title}>\n <h3 class=\"text-sm font-semibold text-gray-900 dark:text-white\">{params().title}</h3>\n </Show>\n </div>\n <div class=\"flex items-center gap-2\">\n <div\n class=\"inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600\"\n role=\"group\"\n aria-label={strings.chartViewSelector}\n >\n <button\n type=\"button\"\n aria-pressed={activeView() === 'chart'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'chart'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('chart')}\n >\n {strings.chartView}\n </button>\n <button\n type=\"button\"\n aria-pressed={activeView() === 'data'}\n class={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n activeView() === 'data'\n ? 'bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900'\n : 'text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700'\n }`}\n onClick={() => setActiveView('data')}\n >\n {strings.chartDataView}\n </button>\n </div>\n <Show when={exportEnabled()}>\n <button\n type=\"button\"\n onClick={handleExportPNG}\n disabled={activeView() !== 'chart' || isLoading() || Boolean(error())}\n class=\"opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed 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\"\n title={strings.chartDownloadPng}\n aria-label={strings.chartDownloadPngAria}\n >\n <svg\n class=\"w-3 h-3 text-gray-500 dark:text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n 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\"\n />\n </svg>\n </button>\n </Show>\n </div>\n </div>\n\n <p id={descriptionId} class=\"sr-only\">\n {title()}. {strings.chartDataSummary}\n </p>\n\n {/* Fallback ladder (P2.5): degrade to a series table on render error\n instead of a bare \"Chart Error\" message. */}\n <Show when={error() && activeView() === 'chart'}>\n <DegradedFallback\n message={formatMCPUIString(strings.chartRenderFailed, { error: String(error()) })}\n caption={strings.chartDegradedCaption}\n {...tableData()}\n />\n </Show>\n\n <Show when={activeView() === 'data'}>\n <div\n class={`w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${\n isExpanded() ? 'flex-1 min-h-0' : ''\n }`}\n style={\n isExpanded()\n ? undefined\n : { height: params().height || '250px', 'max-height': '70vh' }\n }\n >\n <table class=\"w-full border-collapse text-left text-sm\">\n <caption class=\"sr-only\">\n {title()} — {strings.chartDataTable}\n </caption>\n <thead class=\"bg-gray-50 dark:bg-gray-900/40\">\n <tr>\n <For each={tableData().columns}>\n {(column) => (\n <th scope=\"col\" class=\"px-3 py-2 font-medium text-gray-900 dark:text-gray-100\">\n {column}\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={tableData().rows}>\n {(row) => (\n <tr class=\"border-t border-gray-100 dark:border-gray-700\">\n <For each={tableData().columns}>\n {(_column, index) => (\n <td class=\"px-3 py-2 text-gray-700 dark:text-gray-300\">\n {String(row[index()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n <Show when={tableData().rows.length === 0}>\n <tr>\n <td\n colSpan={Math.max(1, tableData().columns.length)}\n class=\"px-3 py-6 text-center text-gray-500 dark:text-gray-400\"\n >\n {strings.chartNoData}\n </td>\n </tr>\n </Show>\n </tbody>\n </table>\n </div>\n </Show>\n\n <div\n class={`relative w-full ${isExpanded() ? 'flex-1 min-h-0' : ''}`}\n style={\n error() || activeView() === 'data'\n ? { display: 'none' }\n : isExpanded()\n ? { height: '100%', display: 'block' }\n : { height: params().height || '250px', display: 'block' }\n }\n >\n <canvas\n ref={canvasRef}\n role=\"img\"\n aria-label={title()}\n aria-describedby={descriptionId}\n aria-hidden={activeView() !== 'chart' || Boolean(error())}\n />\n <Show when={isLoading() && activeView() === 'chart'}>\n <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80\">\n <div class=\"flex flex-col items-center gap-2\">\n <div class=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600\" />\n <span class=\"text-sm text-gray-500 dark:text-gray-400\">{strings.chartLoading}</span>\n </div>\n </div>\n </Show>\n </div>\n </div>\n )}\n />\n </ExpandableWrapper>\n );\n};\n"],"names":["ChartJS","chartJSLoadPromise","loadChartJS","then","module","default","Chart","catch","err","isChartJSAvailable","ContextAwareChartLayout","props","render","useExpanded","ChartJSRenderer","isLoading","setIsLoading","createSignal","error","setError","activeView","setActiveView","canvasRef","chartInstance","renderVersion","params","component","telemetry","useTelemetry","strings","useMCPUIStrings","tableData","createMemo","chartToDataTable","series","chartTableSeries","point","chartTablePoint","label","degradedColLabel","seriesName","degradedSeries","descriptionId","createUniqueId","title","chartView","exportEnabled","exportable","copyDataJSON","JSON","stringify","type","data","handleExportPNG","url","toDataURL","a","document","createElement","href","download","replace","toLowerCase","click","createEffect","chartParams","version","undefined","destroy","baseOptions","responsive","maintainAspectRatio","options","plugins","legend","display","position","timeAxis","ta","scales","x","time","parser","unit","tooltipFormat","min","max","Error","chartRenderError","message","dispatch","errorMessage","id","componentType","ts","Date","now","onError","queueMicrotask","resize","onCleanup","_$createComponent","ExpandableWrapper","copyData","copyLabel","chartCopy","toolbarVariant","children","isExpanded","_el$","_$getNextElement","_tmpl$6","_el$2","firstChild","_el$3","_el$5","nextSibling","_el$6","_el$7","_el$8","_el$0","_el$1","_co$","_$getNextMarker","_el$10","_el$12","_el$13","_co$2","_el$11","_el$14","_el$15","_co$3","_el$41","_el$42","_co$9","_el$43","_el$44","_co$0","_el$33","_el$34","_el$39","_el$40","_co$8","_$insert","Show","when","_el$4","_tmpl$","$$click","chartDataView","_el$9","_tmpl$2","_$effect","_p$","_v$","Boolean","_v$2","chartDownloadPng","_v$3","chartDownloadPngAria","e","_$setProperty","t","_$setAttribute","_$runHydrationEvents","chartDataSummary","_$memo","DegradedFallback","_$mergeProps","formatMCPUIString","chartRenderFailed","String","caption","chartDegradedCaption","_el$16","_tmpl$4","_el$17","_el$18","_el$20","_el$21","_co$4","_el$19","_el$22","_el$23","_co$5","_el$24","_el$25","_el$26","_el$29","_el$30","_co$6","_el$31","_el$32","_co$7","chartDataTable","For","each","columns","column","_el$45","_tmpl$7","rows","row","_el$46","_tmpl$8","_column","index","_el$47","_tmpl$9","length","_el$27","_tmpl$3","_el$28","chartNoData","Math","_v$4","_v$5","height","_$className","_$style","_ref$","_$use","_el$35","_tmpl$5","_el$36","_el$37","_el$38","chartLoading","_v$6","className","_v$7","chartViewSelector","_v$8","_v$9","_v$0","_v$1","_v$10","_v$11","_v$12","_v$13","o","i","n","s","h","r","d","_$delegateEvents"],"mappings":";;;;;;;;;AA6BA,IAAIA,UAAe;AACnB,IAAIC,qBAA0C;AAE9C,MAAMC,cAAc,YAAY;AAC9B,MAAIF,QAAS,QAAOA;AAEpB,MAAI,CAACC,oBAAoB;AACvBA,yBAAqB,OAAO,eAAe,EACxCE,KAAMC,CAAAA,WAAW;AAChBJ,gBAAUI,OAAOC,WAAWD,OAAOE;AACnC,aAAON;AAAAA,IACT,CAAC,EACAO,MAAOC,CAAAA,QAAQ;AACdP,2BAAqB;AACrB,YAAMO;AAAAA,IACR,CAAC;AAAA,EACL;AAEA,SAAOP;AACT;AAKA,eAAsBQ,qBAAuC;AAC3D,MAAI;AACF,UAAMP,YAAAA;AACN,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAoBA,MAAMQ,0BAEAC,CAAAA,UAAUA,MAAMC,OAAOC,aAAa;AAwBnC,MAAMC,kBAAoDH,CAAAA,UAAU;AACzE,QAAM,CAACI,WAAWC,YAAY,IAAIC,aAAa,IAAI;AACnD,QAAM,CAACC,OAAOC,QAAQ,IAAIF,aAAAA;AAC1B,QAAM,CAACG,YAAYC,aAAa,IAAIJ,aAA+B,OAAO;AAC1E,MAAIK;AACJ,MAAIC;AACJ,MAAIC,gBAAgB;AAEpB,QAAMC,SAASA,MAAMd,MAAMe,UAAUD;AACrC,QAAME,YAAYC,aAAAA;AAClB,QAAMC,UAAUC,gBAAAA;AAGhB,QAAMC,YAAYC,WAAW,MAC3BC,iBAAiBR,UAAU;AAAA,IACzBS,QAAQL,QAAQM;AAAAA,IAChBC,OAAOP,QAAQQ;AAAAA,IACfC,OAAOT,QAAQU;AAAAA,IACfC,YAAYX,QAAQY;AAAAA,EAAAA,CACrB,CACH;AACA,QAAMC,gBAAgBC,eAAAA;AACtB,QAAMC,QAAQA,MAAMnB,OAAAA,EAASmB,SAASf,QAAQgB;AAK9C,QAAMC,gBAAgBA,MAAMrB,OAAAA,EAASsB,eAAe;AAIpD,QAAMC,eAAeA,MAAMC,KAAKC,UAAU;AAAA,IAAEC,MAAM1B,SAAS0B;AAAAA,IAAMC,MAAM3B,SAAS2B;AAAAA,EAAAA,GAAQ,MAAM,CAAC;AAG/F,QAAMC,kBAAkBA,MAAM;AAC5B,QAAI,CAAC/B,UAAW;AAChB,UAAMgC,MAAMhC,UAAUiC,UAAU,WAAW;AAC3C,UAAMC,IAAIC,SAASC,cAAc,GAAG;AACpCF,MAAEG,OAAOL;AACTE,MAAEI,WAAW,IAAInC,OAAAA,EAASmB,SAAS,SAASiB,QAAQ,QAAQ,GAAG,EAAEC,YAAAA,CAAa;AAC9EN,MAAEO,MAAAA;AAAAA,EACJ;AAGAC,eAAa,YAAY;;AACvB,QAAI,CAAC1C,UAAW;AAGhB,UAAM2C,cAAcxC,OAAAA;AACpB,UAAMyC,UAAU,EAAE1C;AAElBR,iBAAa,IAAI;AACjBG,aAASgD,MAAS;AAElB,QAAI;AACF,YAAM7D,QAAQ,MAAMJ,YAAAA;AAGpB,UAAIgE,YAAY1C,iBAAiB,CAACF,UAAW;AAG7C,UAAIC,eAAe;AACjBA,sBAAc6C,QAAAA;AACd7C,wBAAgB;AAAA,MAClB;AAGA,YAAM8C,cAAmB;AAAA,QACvBC,YAAY;AAAA,QACZC,qBAAqB;AAAA,QACrB,GAAGN,YAAYO;AAAAA,QACfC,SAAS;AAAA,UACP,IAAGR,iBAAYO,YAAZP,mBAAqBQ;AAAAA,UACxBC,QAAQ;AAAA,YACNC,SAAS;AAAA,YACTC,UAAU;AAAA,YACV,IAAGX,uBAAYO,YAAZP,mBAAqBQ,YAArBR,mBAA8BS;AAAAA,UAAAA;AAAAA,QACnC;AAAA,MACF;AAIF,UAAIT,YAAYY,UAAU;AACxB,cAAMC,KAAKb,YAAYY;AACvBR,oBAAYU,SAAS;AAAA,UACnB,GAAGV,YAAYU;AAAAA,UACfC,GAAG;AAAA,YACD,IAAGX,iBAAYU,WAAZV,mBAAoBW;AAAAA,YACvB7B,MAAM;AAAA,YACN8B,MAAM;AAAA,cACJC,QAAQJ,GAAGI;AAAAA,cACXC,MAAML,GAAGK;AAAAA,cACTC,eAAeN,GAAGM;AAAAA,YAAAA;AAAAA,YAEpB,GAAIN,GAAGO,MAAM;AAAA,cAAEA,KAAKP,GAAGO;AAAAA,YAAAA,IAAQ,CAAA;AAAA,YAC/B,GAAIP,GAAGQ,MAAM;AAAA,cAAEA,KAAKR,GAAGQ;AAAAA,YAAAA,IAAQ,CAAA;AAAA,UAAC;AAAA,QAClC;AAAA,MAEJ;AAGA/D,sBAAgB,IAAIjB,MAAMgB,WAAW;AAAA,QACnC6B,MAAMc,YAAYd;AAAAA,QAClBC,MAAMa,YAAYb;AAAAA,QAClBoB,SAASH;AAAAA,MAAAA,CACV;AAEDrD,mBAAa,KAAK;AAAA,IACpB,SAASR,KAAK;AACZ,UAAI0D,YAAY1C,cAAe;AAC/B,YAAMN,SAAQV,eAAe+E,QAAQ/E,MAAM,IAAI+E,MAAM1D,QAAQ2D,gBAAgB;AAC7ErE,eAASD,OAAMuE,OAAO;AACtBzE,mBAAa,KAAK;AAGlBW,6CAAW+D,SAAS;AAAA,QAClBvC,MAAM;AAAA,QACNwC,cAAczE,OAAMuE;AAAAA,QACpBG,MAAIjF,WAAMe,cAANf,mBAAiBiF,OAAM;AAAA,QAC3BC,eAAe;AAAA,QACfC,IAAIC,KAAKC,IAAAA;AAAAA,MAAI;AAEfrF,kBAAMsF,YAANtF,+BAAgBO;AAAAA,IAClB;AAAA,EACF,CAAC;AAID8C,eAAa,MAAM;AACjB,QAAI5C,WAAAA,MAAiB,WAAW,CAACG,cAAe;AAChD2E,mBAAe,MAAA;;AAAM3E,kEAAe4E,WAAf5E;AAAAA,KAAyB;AAAA,EAChD,CAAC;AAGD6E,YAAU,MAAM;AACd5E,qBAAiB;AACjB,QAAID,eAAe;AACjBA,oBAAc6C,QAAAA;AACd7C,sBAAgB;AAAA,IAClB;AAAA,EACF,CAAC;AAED,SAAA8E,gBACGC,mBAAiB;AAAA,IAAA,IAChB1D,QAAK;AAAA,aAAEA,MAAAA;AAAAA,IAAO;AAAA,IAAA,IACd2D,WAAQ;AAAA,aAAEvD,aAAAA;AAAAA,IAAc;AAAA,IAAA,IACxBwD,YAAS;AAAA,aAAE3E,QAAQ4E;AAAAA,IAAS;AAAA,IAAA,IAC5BC,iBAAc;AAAA,aAAE/F,MAAM+F;AAAAA,IAAc;AAAA,IAAA,IAAAC,WAAA;AAAA,aAAAN,gBAEnC3F,yBAAuB;AAAA,QACtBE,QAASgG,iBAAU,MAAA;AAAA,cAAAC,OAAAC,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAC,YAAAE,QAAAD,MAAAE,aAAAC,QAAAF,MAAAF,YAAAK,QAAAD,MAAAJ,YAAAM,QAAAD,MAAAF,aAAAI,QAAAH,MAAAD,aAAA,CAAAK,OAAAC,IAAA,IAAAC,cAAAH,MAAAJ,WAAA,GAAAQ,SAAAZ,MAAAI,aAAAS,SAAAD,OAAAX,YAAA,CAAAa,QAAAC,KAAA,IAAAJ,cAAAE,OAAAT,WAAA,GAAAY,SAAAF,OAAAV,aAAAa,SAAAD,OAAAZ,aAAA,CAAAc,QAAAC,KAAA,IAAAR,cAAAM,OAAAb,WAAA,GAAAgB,SAAAR,OAAAR,aAAA,CAAAiB,QAAAC,KAAA,IAAAX,cAAAS,OAAAhB,WAAA,GAAAmB,SAAAF,OAAAjB,aAAA,CAAAoB,QAAAC,KAAA,IAAAd,cAAAY,OAAAnB,WAAA,GAAAsB,SAAAF,OAAApB,aAAAuB,SAAAD,OAAAzB,YAAA2B,SAAAD,OAAAvB,aAAA,CAAAyB,QAAAC,KAAA,IAAAnB,cAAAiB,OAAAxB,WAAA;AAAA2B,iBAAA7B,OAAAb,gBAQd2C,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAExH,SAASmB;AAAAA,YAAK;AAAA,YAAA,IAAA+D,WAAA;AAAA,kBAAAuC,QAAApC,eAAAqC,MAAA;AAAAJ,qBAAAG,OAAA,MACyCzH,OAAAA,EAASmB,KAAK;AAAA,qBAAAsG;AAAAA,YAAA;AAAA,UAAA,CAAA,CAAA;AAAA5B,gBAAA8B,UAiBpE,MAAM/H,cAAc,OAAO;AAAC0H,iBAAAzB,OAAA,MAEpCzF,QAAQgB,SAAS;AAAA0E,gBAAA6B,UAUT,MAAM/H,cAAc,MAAM;AAAC0H,iBAAAxB,OAAA,MAEnC1F,QAAQwH,aAAa;AAAAN,iBAAA5B,OAAAd,gBAGzB2C,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEnG,cAAAA;AAAAA,YAAe;AAAA,YAAA,IAAA6D,WAAA;AAAA,kBAAA2C,QAAAxC,eAAAyC,OAAA;AAAAD,oBAAAF,UAGd/F;AAAemG,qBAAAC,CAAAA,QAAA;AAAA,oBAAAC,MACdtI,WAAAA,MAAiB,WAAWL,eAAe4I,QAAQzI,MAAAA,CAAO,GAAC0I,OAE9D/H,QAAQgI,kBAAgBC,OACnBjI,QAAQkI;AAAoBL,wBAAAD,IAAAO,KAAAC,YAAAX,OAAA,YAAAG,IAAAO,IAAAN,GAAA;AAAAE,yBAAAH,IAAAS,KAAAC,aAAAb,OAAA,SAAAG,IAAAS,IAAAN,IAAA;AAAAE,yBAAAL,IAAAjG,KAAA2G,aAAAb,OAAA,cAAAG,IAAAjG,IAAAsG,IAAA;AAAA,uBAAAL;AAAAA,cAAA,GAAA;AAAA,gBAAAO,GAAA7F;AAAAA,gBAAA+F,GAAA/F;AAAAA,gBAAAX,GAAAW;AAAAA,cAAAA,CAAA;AAAAiG,iCAAAA;AAAA,qBAAAd;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAA7B,OAAAC,IAAA;AAAAyC,uBAAAvC,QAAA,MAoBzClF,aAAa;AAAAqG,iBAAAnB,QACjBhF,OAAKkF,QAAAC,KAAA;AAAAgB,iBAAAnB,QAAA,MAAM/F,QAAQwI,kBAAgBnC,QAAAC,KAAA;AAAAY,iBAAAlC,MAAAR,gBAKrC2C,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEqB,KAAA,MAAA,CAAA,CAAApJ,OAAO,EAAA,KAAIE,WAAAA,MAAiB;AAAA,YAAO;AAAA,YAAA,IAAAuF,WAAA;AAAA,qBAAAN,gBAC5CkE,kBAAgBC,WAAA;AAAA,gBAAA,IACf/E,UAAO;AAAA,yBAAEgF,kBAAkB5I,QAAQ6I,mBAAmB;AAAA,oBAAExJ,OAAOyJ,OAAOzJ,MAAAA,CAAO;AAAA,kBAAA,CAAG;AAAA,gBAAC;AAAA,gBAAA,IACjF0J,UAAO;AAAA,yBAAE/I,QAAQgJ;AAAAA,gBAAoB;AAAA,cAAA,GACjC9I,SAAS,CAAA;AAAA,YAAA;AAAA,UAAA,CAAA,GAAAsG,QAAAC,KAAA;AAAAS,iBAAAlC,MAAAR,gBAIhB2C,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAE7H,iBAAiB;AAAA,YAAM;AAAA,YAAA,IAAAuF,WAAA;AAAA,kBAAAmE,SAAAhE,eAAAiE,OAAA,GAAAC,SAAAF,OAAA7D,YAAAgE,SAAAD,OAAA/D,YAAAiE,SAAAD,OAAAhE,YAAA,CAAAkE,QAAAC,KAAA,IAAAzD,cAAAuD,OAAA9D,WAAA,GAAAiE,SAAAF,OAAA/D,aAAAkE,SAAAD,OAAAjE,aAAA,CAAAmE,QAAAC,KAAA,IAAA7D,cAAA2D,OAAAlE,WAAA,GAAAqE,SAAAR,OAAA7D,aAAAsE,SAAAD,OAAAxE,YAAA0E,SAAAF,OAAArE,aAAAwE,SAAAD,OAAA1E,YAAA,CAAA4E,QAAAC,KAAA,IAAAnE,cAAAiE,OAAAxE,WAAA,GAAA2E,SAAAF,OAAAzE,aAAA,CAAA4E,QAAAC,KAAA,IAAAtE,cAAAoE,OAAA3E,WAAA;AAAA2B,qBAAAkC,QAa1BrI,OAAKuI,QAAAC,KAAA;AAAArC,qBAAAkC,QAAA,MAAOpJ,QAAQqK,gBAAcX,QAAAC,KAAA;AAAAzC,qBAAA2C,QAAArF,gBAIhC8F,KAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAErK,YAAYsK;AAAAA,gBAAO;AAAA,gBAAA1F,UAC1B2F,aAAM,MAAA;AAAA,sBAAAC,SAAAzF,eAAA0F,OAAA;AAAAzD,yBAAAwD,QAEHD,MAAM;AAAA,yBAAAC;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAEV,CAAA;AAAAxD,qBAAA4C,QAAAtF,gBAKJ8F,KAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAErK,YAAY0K;AAAAA,gBAAI;AAAA,gBAAA9F,UACvB+F,UAAG,MAAA;AAAA,sBAAAC,SAAA7F,eAAA8F,OAAA;AAAA7D,yBAAA4D,QAAAtG,gBAEA8F,KAAG;AAAA,oBAAA,IAACC,OAAI;AAAA,6BAAErK,YAAYsK;AAAAA,oBAAO;AAAA,oBAAA1F,UAC3BA,CAACkG,SAASC,WAAK,MAAA;AAAA,0BAAAC,SAAAjG,eAAAkG,OAAA;AAAAjE,6BAAAgE,QAAA,MAEXpC,OAAO+B,IAAII,OAAO,KAAK,EAAE,CAAC;AAAA,6BAAAC;AAAAA,oBAAA,GAAA;AAAA,kBAAA,CAE9B,CAAA;AAAA,yBAAAJ;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAGN,GAAAd,QAAAC,KAAA;AAAA/C,qBAAA4C,QAAAtF,gBAEF2C,MAAI;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAElH,UAAAA,EAAY0K,KAAKQ,WAAW;AAAA,gBAAC;AAAA,gBAAA,IAAAtG,WAAA;AAAA,sBAAAuG,SAAApG,eAAAqG,OAAA,GAAAC,SAAAF,OAAAjG;AAAA8B,yBAAAqE,QAAA,MAMlCvL,QAAQwL,WAAW;AAAA7D,+BAAAW,aAAAiD,QAAA,WAHXE,KAAKhI,IAAI,GAAGvD,UAAAA,EAAYsK,QAAQY,MAAM,CAAC,CAAA;AAAA,yBAAAC;AAAAA,gBAAA;AAAA,cAAA,CAAA,GAAAlB,QAAAC,KAAA;AAAAzC,qBAAAC,CAAAA,QAAA;AAAA,oBAAA8D,OAzCnD,4EACL3G,eAAe,mBAAmB,EAAE,IACpC4G,OAEA5G,WAAAA,IACIzC,SACA;AAAA,kBAAEsJ,QAAQhM,SAASgM,UAAU;AAAA,kBAAS,cAAc;AAAA,gBAAA;AAAQF,yBAAA9D,IAAAO,KAAA0D,UAAA5C,QAAArB,IAAAO,IAAAuD,IAAA;AAAA9D,oBAAAS,IAAAyD,MAAA7C,QAAA0C,MAAA/D,IAAAS,CAAA;AAAA,uBAAAT;AAAAA,cAAA,GAAA;AAAA,gBAAAO,GAAA7F;AAAAA,gBAAA+F,GAAA/F;AAAAA,cAAAA,CAAA;AAAA,qBAAA2G;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAtC,QAAAC,KAAA;AAAA,cAAAmF,QA0D7DtM;AAAS,iBAAAsM,UAAA,aAAAC,IAAAD,OAAAjF,MAAA,IAATrH,YAASqH;AAAAwB,uBAAAxB,QAAA,oBAGIjG,aAAa;AAAAqG,iBAAAL,QAAArC,gBAGhC2C,MAAI;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEqB,KAAA,MAAA,CAAA,CAAAvJ,WAAW,EAAA,KAAIK,WAAAA,MAAiB;AAAA,YAAO;AAAA,YAAA,IAAAuF,WAAA;AAAA,kBAAAmH,SAAAhH,eAAAiH,OAAA,GAAAC,SAAAF,OAAA7G,YAAAgH,SAAAD,OAAA/G,YAAAiH,SAAAD,OAAA7G;AAAA2B,qBAAAmF,QAAA,MAIWrM,QAAQsM,YAAY;AAAA,qBAAAL;AAAAA,YAAA;AAAA,UAAA,CAAA,GAAAjF,QAAAC,KAAA;AAAAU,iBAAAC,CAAAA,QAAA;AAAA,gBAAA2E,OA9JzE,wIACLxH,eAAe,iCAAiC,EAAE,IAChDnF,SAAS4M,aAAa,EAAE,IAAEC,OAYhBzM,QAAQ0M,mBAAiBC,OAIrBpN,WAAAA,MAAiB,SAAOqN,OAC/B,2DACLrN,WAAAA,MAAiB,UACb,+DACA,2EAA2E,IAC/EsN,OAOYtN,WAAAA,MAAiB,QAAMuN,OAC9B,2DACLvN,WAAAA,MAAiB,SACb,+DACA,2EAA2E,IAC/EwN,QAuGD,mBAAmBhI,WAAAA,IAAe,mBAAmB,EAAE,IAAEiI,QAE9D3N,MAAAA,KAAWE,WAAAA,MAAiB,SACxB;AAAA,cAAEuD,SAAS;AAAA,YAAA,IACXiC,eACE;AAAA,cAAE6G,QAAQ;AAAA,cAAQ9I,SAAS;AAAA,YAAA,IAC3B;AAAA,cAAE8I,QAAQhM,SAASgM,UAAU;AAAA,cAAS9I,SAAS;AAAA,YAAA,GAASmK,QAMlDlM,MAAAA,GAAOmM,QAEN3N,iBAAiB,WAAWuI,QAAQzI,OAAO;AAACkN,qBAAA3E,IAAAO,KAAA0D,UAAA7G,MAAA4C,IAAAO,IAAAoE,IAAA;AAAAE,qBAAA7E,IAAAS,KAAAC,aAAA9C,OAAA,cAAAoC,IAAAS,IAAAoE,IAAA;AAAAE,qBAAA/E,IAAAjG,KAAA2G,aAAA7C,OAAA,gBAAAmC,IAAAjG,IAAAgL,IAAA;AAAAC,qBAAAhF,IAAAuF,KAAAtB,UAAApG,OAAAmC,IAAAuF,IAAAP,IAAA;AAAAC,qBAAAjF,IAAAwF,KAAA9E,aAAA5C,OAAA,gBAAAkC,IAAAwF,IAAAP,IAAA;AAAAC,qBAAAlF,IAAAyF,KAAAxB,UAAAnG,OAAAkC,IAAAyF,IAAAP,IAAA;AAAAC,sBAAAnF,IAAA0F,KAAAzB,UAAAhF,QAAAe,IAAA0F,IAAAP,KAAA;AAAAnF,gBAAA2F,IAAAzB,MAAAjF,QAAAmG,OAAApF,IAAA2F,CAAA;AAAAN,sBAAArF,IAAA4F,KAAAlF,aAAAxB,QAAA,cAAAc,IAAA4F,IAAAP,KAAA;AAAAC,sBAAAtF,IAAA6F,KAAAnF,aAAAxB,QAAA,eAAAc,IAAA6F,IAAAP,KAAA;AAAA,mBAAAtF;AAAAA,UAAA,GAAA;AAAA,YAAAO,GAAA7F;AAAAA,YAAA+F,GAAA/F;AAAAA,YAAAX,GAAAW;AAAAA,YAAA6K,GAAA7K;AAAAA,YAAA8K,GAAA9K;AAAAA,YAAA+K,GAAA/K;AAAAA,YAAAgL,GAAAhL;AAAAA,YAAAiL,GAAAjL;AAAAA,YAAAkL,GAAAlL;AAAAA,YAAAmL,GAAAnL;AAAAA,UAAAA,CAAA;AAAAiG,6BAAAA;AAAA,iBAAAvD;AAAAA,QAAA,GAAA;AAAA,MAAA,CAY5D;AAAA,IAAA;AAAA,EAAA,CAAA;AAIT;AAAE0I,eAAA,CAAA,OAAA,CAAA;"}
@@ -3,13 +3,15 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const web = require("solid-js/web");
4
4
  const solidJs = require("solid-js");
5
5
  const FormFieldRenderer = require("./FormFieldRenderer.cjs");
6
+ const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
6
7
  var _tmpl$ = /* @__PURE__ */ web.template(`<div class="w-full max-w-2xl mx-auto mb-2 bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 shadow-lg overflow-visible"role=dialog style="animation:chat-prompt-slide-up 0.2s ease-out"><div class="flex items-center justify-between px-4 py-2.5 border-b border-gray-100 dark:border-gray-700"><p class="text-sm font-medium text-gray-900 dark:text-white"></p><button></button></div><div class="px-4 py-3"></div><style>
7
8
  @keyframes chat-prompt-slide-up {
8
9
  from { opacity: 0; transform: translateY(8px); }
9
10
  to { opacity: 1; transform: translateY(0); }
10
11
  }
11
- `), _tmpl$2 = /* @__PURE__ */ web.template(`<svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div>`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button>`), _tmpl$5 = /* @__PURE__ */ web.template(`<span class=mr-2>`), _tmpl$6 = /* @__PURE__ */ web.template(`<span class="block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal">`), _tmpl$7 = /* @__PURE__ */ web.template(`<p class="text-sm text-gray-600 dark:text-gray-400 mb-3">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div><!$><!/><div class="flex gap-2 justify-end"><button class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"></button><button>`), _tmpl$9 = /* @__PURE__ */ web.template(`<p class="text-blue-400 animate-pulse">Loading preview...`), _tmpl$0 = /* @__PURE__ */ web.template(`<div class="px-3 py-2 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800 text-sm">`), _tmpl$1 = /* @__PURE__ */ web.template(`<form class="flex flex-col gap-3"><!$><!/><!$><!/><div class="flex justify-end"><button type=submit class="px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors">`), _tmpl$10 = /* @__PURE__ */ web.template(`<p class="text-blue-700 dark:text-blue-300">`);
12
+ `), _tmpl$2 = /* @__PURE__ */ web.template(`<svg class="w-4 h-4"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M6 18L18 6M6 6l12 12">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div>`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button>`), _tmpl$5 = /* @__PURE__ */ web.template(`<span class=mr-2>`), _tmpl$6 = /* @__PURE__ */ web.template(`<span class="block text-xs text-gray-500 dark:text-gray-400 mt-0.5 font-normal">`), _tmpl$7 = /* @__PURE__ */ web.template(`<p class="text-sm text-gray-600 dark:text-gray-400 mb-3">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div><!$><!/><div class="flex gap-2 justify-end"><button class="px-4 py-2 text-sm font-medium rounded-lg border border-gray-200 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors"></button><button>`), _tmpl$9 = /* @__PURE__ */ web.template(`<p class="text-blue-400 animate-pulse">`), _tmpl$0 = /* @__PURE__ */ web.template(`<div class="px-3 py-2 bg-blue-50 dark:bg-blue-900/20 rounded-lg border border-blue-200 dark:border-blue-800 text-sm">`), _tmpl$1 = /* @__PURE__ */ web.template(`<form class="flex flex-col gap-3"><!$><!/><!$><!/><div class="flex justify-end"><button type=submit class="px-4 py-2 text-sm font-medium rounded-lg text-white bg-blue-600 hover:bg-blue-700 disabled:bg-gray-400 disabled:cursor-not-allowed transition-colors">`), _tmpl$10 = /* @__PURE__ */ web.template(`<p class="text-blue-700 dark:text-blue-300">`);
12
13
  const ChatPrompt = (props) => {
14
+ const strings = MCPUIStringsContext.useMCPUIStrings();
13
15
  if (!props.config) return null;
14
16
  return (() => {
15
17
  var _el$ = web.getNextElement(_tmpl$), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$4 = _el$3.nextSibling, _el$5 = _el$2.nextSibling;
@@ -65,7 +67,7 @@ const ChatPrompt = (props) => {
65
67
  onConfirm: () => props.onSubmit({
66
68
  type: "confirm",
67
69
  value: "confirmed",
68
- label: props.config.config.confirmLabel || "Confirmed"
70
+ label: props.config.config.confirmLabel || strings.promptConfirmed
69
71
  }),
70
72
  onCancel: () => {
71
73
  var _a;
@@ -73,7 +75,7 @@ const ChatPrompt = (props) => {
73
75
  props.onSubmit({
74
76
  type: "confirm",
75
77
  value: "cancelled",
76
- label: props.config.config.cancelLabel || "Cancelled",
78
+ label: props.config.config.cancelLabel || strings.promptCancelled,
77
79
  dismissed: true
78
80
  });
79
81
  }
@@ -99,7 +101,7 @@ const ChatPrompt = (props) => {
99
101
  }
100
102
  }));
101
103
  web.effect((_p$) => {
102
- var _v$ = props.config.title, _v$2 = props.dismissLabel ? "px-3 py-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-lg transition-colors" : "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors", _v$3 = props.dismissLabel || "Dismiss";
104
+ var _v$ = props.config.title, _v$2 = props.dismissLabel ? "px-3 py-1 text-xs font-medium text-blue-600 dark:text-blue-400 hover:bg-blue-50 dark:hover:bg-blue-900/20 rounded-lg transition-colors" : "p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors", _v$3 = props.dismissLabel || strings.dismiss;
103
105
  _v$ !== _p$.e && web.setAttribute(_el$, "aria-label", _p$.e = _v$);
104
106
  _v$2 !== _p$.t && web.className(_el$4, _p$.t = _v$2);
105
107
  _v$3 !== _p$.a && web.setAttribute(_el$4, "aria-label", _p$.a = _v$3);
@@ -181,6 +183,7 @@ const ChoiceBody = (props) => {
181
183
  })();
182
184
  };
183
185
  const ConfirmBody = (props) => {
186
+ const strings = MCPUIStringsContext.useMCPUIStrings();
184
187
  const isDanger = () => props.config.variant === "danger";
185
188
  return (() => {
186
189
  var _el$1 = web.getNextElement(_tmpl$8), _el$14 = _el$1.firstChild, [_el$15, _co$] = web.getNextMarker(_el$14.nextSibling), _el$11 = _el$15.nextSibling, _el$12 = _el$11.firstChild, _el$13 = _el$12.nextSibling;
@@ -195,15 +198,16 @@ const ConfirmBody = (props) => {
195
198
  }
196
199
  }), _el$15, _co$);
197
200
  web.addEventListener(_el$12, "click", props.onCancel, true);
198
- web.insert(_el$12, () => props.config.cancelLabel || "Cancel");
201
+ web.insert(_el$12, () => props.config.cancelLabel || strings.cancel);
199
202
  web.addEventListener(_el$13, "click", props.onConfirm, true);
200
- web.insert(_el$13, () => props.config.confirmLabel || "Confirm");
203
+ web.insert(_el$13, () => props.config.confirmLabel || strings.confirm);
201
204
  web.effect(() => web.className(_el$13, `px-4 py-2 text-sm font-medium rounded-lg text-white transition-colors ${isDanger() ? "bg-red-600 hover:bg-red-700" : "bg-blue-600 hover:bg-blue-700"}`));
202
205
  web.runHydrationEvents();
203
206
  return _el$1;
204
207
  })();
205
208
  };
206
209
  const FormBody = (props) => {
210
+ const strings = MCPUIStringsContext.useMCPUIStrings();
207
211
  const [formData, setFormData] = solidJs.createSignal({});
208
212
  const [dynamicOptions, setDynamicOptions] = solidJs.createSignal({});
209
213
  const [previewText, setPreviewText] = solidJs.createSignal("");
@@ -285,7 +289,7 @@ const FormBody = (props) => {
285
289
  e.preventDefault();
286
290
  const data = formData();
287
291
  const label = Object.entries(data).filter(([, v]) => v !== void 0 && v !== "" && !(Array.isArray(v) && v.length === 0)).map(([k, v]) => `${k}: ${Array.isArray(v) ? v.join(", ") : v}`).join(", ");
288
- props.onSubmit(data, label || "Form submitted");
292
+ props.onSubmit(data, label || strings.promptFormSubmitted);
289
293
  };
290
294
  const isValid = () => {
291
295
  const data = formData();
@@ -342,13 +346,15 @@ const FormBody = (props) => {
342
346
  })();
343
347
  },
344
348
  get children() {
345
- return web.getNextElement(_tmpl$9);
349
+ var _el$18 = web.getNextElement(_tmpl$9);
350
+ web.insert(_el$18, () => strings.promptLoadingPreview);
351
+ return _el$18;
346
352
  }
347
353
  }));
348
354
  return _el$17;
349
355
  }
350
356
  }), _el$24, _co$3);
351
- web.insert(_el$20, () => props.config.submitLabel || "Submit");
357
+ web.insert(_el$20, () => props.config.submitLabel || strings.submit);
352
358
  web.effect(() => web.setProperty(_el$20, "disabled", !isValid()));
353
359
  return _el$16;
354
360
  })();