@seed-ship/mcp-ui-solid 6.19.0 → 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 (262) hide show
  1. package/CHANGELOG.md +532 -0
  2. package/README.md +798 -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/FeedbackInline.cjs +19 -3
  86. package/dist/components/FeedbackInline.cjs.map +1 -1
  87. package/dist/components/FeedbackInline.js +19 -3
  88. package/dist/components/FeedbackInline.js.map +1 -1
  89. package/dist/components/FooterRenderer.cjs +21 -17
  90. package/dist/components/FooterRenderer.cjs.map +1 -1
  91. package/dist/components/FooterRenderer.d.ts.map +1 -1
  92. package/dist/components/FooterRenderer.js +21 -17
  93. package/dist/components/FooterRenderer.js.map +1 -1
  94. package/dist/components/FormFieldRenderer.cjs +116 -93
  95. package/dist/components/FormFieldRenderer.cjs.map +1 -1
  96. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  97. package/dist/components/FormFieldRenderer.js +116 -93
  98. package/dist/components/FormFieldRenderer.js.map +1 -1
  99. package/dist/components/FormRenderer.cjs +55 -31
  100. package/dist/components/FormRenderer.cjs.map +1 -1
  101. package/dist/components/FormRenderer.d.ts.map +1 -1
  102. package/dist/components/FormRenderer.js +55 -31
  103. package/dist/components/FormRenderer.js.map +1 -1
  104. package/dist/components/GenerativeUIErrorBoundary.cjs +20 -15
  105. package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
  106. package/dist/components/GenerativeUIErrorBoundary.d.ts.map +1 -1
  107. package/dist/components/GenerativeUIErrorBoundary.js +20 -15
  108. package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
  109. package/dist/components/GraphRenderer.cjs +56 -33
  110. package/dist/components/GraphRenderer.cjs.map +1 -1
  111. package/dist/components/GraphRenderer.d.ts.map +1 -1
  112. package/dist/components/GraphRenderer.js +56 -33
  113. package/dist/components/GraphRenderer.js.map +1 -1
  114. package/dist/components/ImageGalleryRenderer.cjs +13 -4
  115. package/dist/components/ImageGalleryRenderer.cjs.map +1 -1
  116. package/dist/components/ImageGalleryRenderer.d.ts.map +1 -1
  117. package/dist/components/ImageGalleryRenderer.js +13 -4
  118. package/dist/components/ImageGalleryRenderer.js.map +1 -1
  119. package/dist/components/LightboxOverlay.cjs +16 -8
  120. package/dist/components/LightboxOverlay.cjs.map +1 -1
  121. package/dist/components/LightboxOverlay.d.ts.map +1 -1
  122. package/dist/components/LightboxOverlay.js +17 -9
  123. package/dist/components/LightboxOverlay.js.map +1 -1
  124. package/dist/components/MapRenderer.cjs +59 -29
  125. package/dist/components/MapRenderer.cjs.map +1 -1
  126. package/dist/components/MapRenderer.d.ts +10 -2
  127. package/dist/components/MapRenderer.d.ts.map +1 -1
  128. package/dist/components/MapRenderer.js +60 -30
  129. package/dist/components/MapRenderer.js.map +1 -1
  130. package/dist/components/ModalRenderer.cjs +4 -1
  131. package/dist/components/ModalRenderer.cjs.map +1 -1
  132. package/dist/components/ModalRenderer.d.ts.map +1 -1
  133. package/dist/components/ModalRenderer.js +5 -2
  134. package/dist/components/ModalRenderer.js.map +1 -1
  135. package/dist/components/ScratchpadPanel.cjs +578 -535
  136. package/dist/components/ScratchpadPanel.cjs.map +1 -1
  137. package/dist/components/ScratchpadPanel.d.ts.map +1 -1
  138. package/dist/components/ScratchpadPanel.js +578 -535
  139. package/dist/components/ScratchpadPanel.js.map +1 -1
  140. package/dist/components/StreamingUIRenderer.cjs +92 -28
  141. package/dist/components/StreamingUIRenderer.cjs.map +1 -1
  142. package/dist/components/StreamingUIRenderer.d.ts.map +1 -1
  143. package/dist/components/StreamingUIRenderer.js +92 -28
  144. package/dist/components/StreamingUIRenderer.js.map +1 -1
  145. package/dist/components/UIResourceRenderer.cjs +456 -363
  146. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  147. package/dist/components/UIResourceRenderer.d.ts +21 -0
  148. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  149. package/dist/components/UIResourceRenderer.js +458 -365
  150. package/dist/components/UIResourceRenderer.js.map +1 -1
  151. package/dist/components/VerifiedText.cjs +39 -20
  152. package/dist/components/VerifiedText.cjs.map +1 -1
  153. package/dist/components/VerifiedText.d.ts +2 -1
  154. package/dist/components/VerifiedText.d.ts.map +1 -1
  155. package/dist/components/VerifiedText.js +39 -20
  156. package/dist/components/VerifiedText.js.map +1 -1
  157. package/dist/components/VideoRenderer.cjs +10 -5
  158. package/dist/components/VideoRenderer.cjs.map +1 -1
  159. package/dist/components/VideoRenderer.d.ts.map +1 -1
  160. package/dist/components/VideoRenderer.js +10 -5
  161. package/dist/components/VideoRenderer.js.map +1 -1
  162. package/dist/components/chart-data-table.cjs +38 -17
  163. package/dist/components/chart-data-table.cjs.map +1 -1
  164. package/dist/components/chart-data-table.d.ts +30 -1
  165. package/dist/components/chart-data-table.d.ts.map +1 -1
  166. package/dist/components/chart-data-table.js +38 -17
  167. package/dist/components/chart-data-table.js.map +1 -1
  168. package/dist/context/MCPActionContext.cjs +3 -1
  169. package/dist/context/MCPActionContext.cjs.map +1 -1
  170. package/dist/context/MCPActionContext.d.ts.map +1 -1
  171. package/dist/context/MCPActionContext.js +3 -1
  172. package/dist/context/MCPActionContext.js.map +1 -1
  173. package/dist/context/MCPUIStringsContext.cjs +285 -2
  174. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  175. package/dist/context/MCPUIStringsContext.d.ts +600 -3
  176. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  177. package/dist/context/MCPUIStringsContext.js +285 -2
  178. package/dist/context/MCPUIStringsContext.js.map +1 -1
  179. package/dist/hooks/index.d.ts +2 -2
  180. package/dist/hooks/index.d.ts.map +1 -1
  181. package/dist/hooks/useStreamingUI.cjs +28 -10
  182. package/dist/hooks/useStreamingUI.cjs.map +1 -1
  183. package/dist/hooks/useStreamingUI.d.ts +37 -0
  184. package/dist/hooks/useStreamingUI.d.ts.map +1 -1
  185. package/dist/hooks/useStreamingUI.js +28 -10
  186. package/dist/hooks/useStreamingUI.js.map +1 -1
  187. package/dist/hooks.cjs +1 -0
  188. package/dist/hooks.cjs.map +1 -1
  189. package/dist/hooks.js +2 -1
  190. package/dist/index.cjs +23 -8
  191. package/dist/index.cjs.map +1 -1
  192. package/dist/index.d.cts +9 -3
  193. package/dist/index.d.ts +9 -3
  194. package/dist/index.d.ts.map +1 -1
  195. package/dist/index.js +18 -3
  196. package/dist/index.js.map +1 -1
  197. package/dist/services/validation.cjs +41 -16
  198. package/dist/services/validation.cjs.map +1 -1
  199. package/dist/services/validation.d.ts +47 -2
  200. package/dist/services/validation.d.ts.map +1 -1
  201. package/dist/services/validation.js +41 -16
  202. package/dist/services/validation.js.map +1 -1
  203. package/dist/utils/degraded-projections.cjs +37 -12
  204. package/dist/utils/degraded-projections.cjs.map +1 -1
  205. package/dist/utils/degraded-projections.d.ts +39 -3
  206. package/dist/utils/degraded-projections.d.ts.map +1 -1
  207. package/dist/utils/degraded-projections.js +37 -12
  208. package/dist/utils/degraded-projections.js.map +1 -1
  209. package/dist/utils/format-string.cjs +10 -0
  210. package/dist/utils/format-string.cjs.map +1 -0
  211. package/dist/utils/format-string.d.ts +26 -0
  212. package/dist/utils/format-string.d.ts.map +1 -0
  213. package/dist/utils/format-string.js +10 -0
  214. package/dist/utils/format-string.js.map +1 -0
  215. package/dist/validation.cjs +3 -0
  216. package/dist/validation.cjs.map +1 -1
  217. package/dist/validation.d.cts +2 -1
  218. package/dist/validation.d.ts +2 -1
  219. package/dist/validation.d.ts.map +1 -1
  220. package/dist/validation.js +4 -1
  221. package/package.json +1 -1
  222. package/src/adapters/connector.ts +58 -4
  223. package/src/adapters/index.ts +12 -2
  224. package/src/adapters/macro-run.ts +71 -11
  225. package/src/components/ActionGroupRenderer.tsx +3 -1
  226. package/src/components/AgentCard.tsx +27 -9
  227. package/src/components/AgentHandoff.tsx +4 -1
  228. package/src/components/ArtifactRenderer.tsx +17 -5
  229. package/src/components/AutocompleteDropdown.tsx +8 -6
  230. package/src/components/AutocompleteFormField.tsx +5 -1
  231. package/src/components/BriefingDiff.tsx +11 -3
  232. package/src/components/CarouselRenderer.tsx +4 -2
  233. package/src/components/ChartJSRenderer.tsx +18 -9
  234. package/src/components/ChatPrompt.tsx +13 -8
  235. package/src/components/CodeBlockRenderer.tsx +12 -10
  236. package/src/components/DataPreviewSection.tsx +92 -26
  237. package/src/components/DegradedFallback.tsx +4 -2
  238. package/src/components/FeedbackInline.tsx +2 -2
  239. package/src/components/FooterRenderer.tsx +3 -1
  240. package/src/components/FormFieldRenderer.tsx +34 -19
  241. package/src/components/FormRenderer.tsx +38 -10
  242. package/src/components/GenerativeUIErrorBoundary.tsx +8 -3
  243. package/src/components/GraphRenderer.tsx +31 -16
  244. package/src/components/ImageGalleryRenderer.tsx +8 -4
  245. package/src/components/LightboxOverlay.tsx +6 -4
  246. package/src/components/MapRenderer.tsx +57 -20
  247. package/src/components/ModalRenderer.tsx +3 -1
  248. package/src/components/ScratchpadPanel.tsx +95 -44
  249. package/src/components/StreamingUIRenderer.tsx +41 -11
  250. package/src/components/UIResourceRenderer.tsx +145 -63
  251. package/src/components/VerifiedText.tsx +19 -9
  252. package/src/components/VideoRenderer.tsx +6 -4
  253. package/src/components/chart-data-table.ts +68 -14
  254. package/src/context/MCPActionContext.tsx +4 -1
  255. package/src/context/MCPUIStringsContext.tsx +1004 -1
  256. package/src/hooks/index.ts +2 -1
  257. package/src/hooks/useStreamingUI.ts +64 -10
  258. package/src/index.ts +23 -0
  259. package/src/services/validation.ts +93 -16
  260. package/src/utils/degraded-projections.ts +75 -12
  261. package/src/utils/format-string.ts +33 -0
  262. package/src/validation.ts +5 -0
@@ -1,28 +1,43 @@
1
1
  import { createComponent, getNextElement, getNextMarker, insert, effect, setAttribute, runHydrationEvents, setStyleProperty, classList, memo, setProperty, template, delegateEvents } from "solid-js/web";
2
- import { createMemo, createSignal, createEffect, Show, For } from "solid-js";
3
- var _tmpl$ = /* @__PURE__ */ template(`<div class="text-xs text-amber-600 dark:text-amber-400 p-2">[DataPreviewSection] Invalid content format`), _tmpl$2 = /* @__PURE__ */ template(`<span class=font-medium>`), _tmpl$3 = /* @__PURE__ */ template(`<span class="px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="flex items-center gap-1"><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">CSV</button><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">JSON`), _tmpl$5 = /* @__PURE__ */ template(`<span><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ template(`<span>`), _tmpl$7 = /* @__PURE__ */ template(`<div class="flex items-center gap-1"><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">&#x25C0; Prev</button><span class=px-2>Page <!$><!/> / <!$><!/></span><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">Next &#x25B6;`), _tmpl$8 = /* @__PURE__ */ template(`<div class=data-preview-section><div class="flex items-center justify-between mb-2"><div class="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/></div><!$><!/></div><div class="overflow-x-auto rounded border border-gray-200 dark:border-gray-700"><table class="w-full text-sm"><thead><tr class="bg-gray-50 dark:bg-gray-800"></tr></thead><tbody></tbody></table></div><div class="flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<th class="px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors"><span class="inline-flex items-center gap-1"><!$><!/><span class="text-[10px] leading-none">`), _tmpl$0 = /* @__PURE__ */ template(`<tr class="border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors">`), _tmpl$1 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-800 dark:text-gray-200">`);
4
- function formatNumber(value, format) {
2
+ import { createMemo, createSignal, onMount, createEffect, Show, For } from "solid-js";
3
+ import { useMCPUIStrings, DEFAULT_MCPUI_STRINGS } from "../context/MCPUIStringsContext.js";
4
+ import { formatMCPUIString } from "../utils/format-string.js";
5
+ var _tmpl$ = /* @__PURE__ */ template(`<div class="text-xs text-amber-600 dark:text-amber-400 p-2">`), _tmpl$2 = /* @__PURE__ */ template(`<span class=font-medium>`), _tmpl$3 = /* @__PURE__ */ template(`<span class="px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300">`), _tmpl$4 = /* @__PURE__ */ template(`<div class="flex items-center gap-1"><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">CSV</button><button class="px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors">JSON`), _tmpl$5 = /* @__PURE__ */ template(`<span><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ template(`<span>`), _tmpl$7 = /* @__PURE__ */ template(`<div class="flex items-center gap-1"><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 class=px-2 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;`), _tmpl$8 = /* @__PURE__ */ template(`<div class=data-preview-section><div class="flex items-center justify-between mb-2"><div class="flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/></div><!$><!/></div><div class="overflow-x-auto rounded border border-gray-200 dark:border-gray-700"><table class="w-full text-sm"><thead><tr class="bg-gray-50 dark:bg-gray-800"></tr></thead><tbody></tbody></table></div><div class="flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400"><!$><!/><!$><!/><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<th class="px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors"><span class="inline-flex items-center gap-1"><!$><!/><span class="text-[10px] leading-none">`), _tmpl$0 = /* @__PURE__ */ template(`<tr class="border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors">`), _tmpl$1 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-800 dark:text-gray-200">`);
6
+ function formatNumber(value, format, locale = DEFAULT_MCPUI_STRINGS.locale) {
5
7
  if (typeof value !== "number" || !isFinite(value)) return String(value ?? "");
6
- if (format === "percent") return `${(value * 100).toFixed(1)}%`;
7
- if (format === "currency") return `${value.toLocaleString("fr-FR")} EUR`;
8
- if (Number.isInteger(value)) return value.toLocaleString("fr-FR");
9
- return value.toLocaleString("fr-FR", {
8
+ if (format === "percent") {
9
+ return new Intl.NumberFormat(locale, {
10
+ style: "percent",
11
+ minimumFractionDigits: 1,
12
+ maximumFractionDigits: 1,
13
+ useGrouping: false
14
+ }).format(value);
15
+ }
16
+ if (format === "currency") return `${value.toLocaleString(locale)} EUR`;
17
+ if (Number.isInteger(value)) return value.toLocaleString(locale);
18
+ return value.toLocaleString(locale, {
10
19
  maximumFractionDigits: 2
11
20
  });
12
21
  }
13
- function formatCell(value, col) {
22
+ function formatCell(value, col, locale = DEFAULT_MCPUI_STRINGS.locale, zoneAware = true) {
14
23
  if (value == null) return "—";
15
- if (col.type === "number") return formatNumber(value, col.format);
24
+ if (col.type === "number") return formatNumber(value, col.format, locale);
16
25
  if (col.type === "date" && typeof value === "string") {
26
+ const date = new Date(value);
27
+ if (Number.isNaN(date.getTime())) return value;
28
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(value);
29
+ if (!dateOnly && !zoneAware) return value;
17
30
  try {
18
- return new Date(value).toLocaleDateString("fr-FR");
31
+ return date.toLocaleDateString(locale, dateOnly ? {
32
+ timeZone: "UTC"
33
+ } : void 0);
19
34
  } catch {
20
35
  return value;
21
36
  }
22
37
  }
23
38
  return String(value);
24
39
  }
25
- function compareValues(a, b, type) {
40
+ function compareValues(a, b, type, locale = DEFAULT_MCPUI_STRINGS.locale) {
26
41
  if (a == null && b == null) return 0;
27
42
  if (a == null) return 1;
28
43
  if (b == null) return -1;
@@ -42,7 +57,7 @@ function compareValues(a, b, type) {
42
57
  if (isNaN(db)) return -1;
43
58
  return da - db;
44
59
  }
45
- return String(a).localeCompare(String(b), "fr", {
60
+ return String(a).localeCompare(String(b), locale, {
46
61
  sensitivity: "base"
47
62
  });
48
63
  }
@@ -84,6 +99,7 @@ function resolveContent(raw) {
84
99
  }
85
100
  function DataPreviewSection(props) {
86
101
  var _a;
102
+ const strings = useMCPUIStrings();
87
103
  const content = createMemo(() => {
88
104
  const resolved = resolveContent(props.content);
89
105
  if (!resolved) {
@@ -108,6 +124,8 @@ function DataPreviewSection(props) {
108
124
  return ((_a2 = content()) == null ? void 0 : _a2.showPageInfo) !== false;
109
125
  };
110
126
  const [page, setPage] = createSignal(((_a = content()) == null ? void 0 : _a.initialPage) ?? 0);
127
+ const [mounted, setMounted] = createSignal(false);
128
+ onMount(() => setMounted(true));
111
129
  const [sortKey, setSortKey] = createSignal(null);
112
130
  const [sortDir, setSortDir] = createSignal(null);
113
131
  createEffect(() => {
@@ -135,7 +153,7 @@ function DataPreviewSection(props) {
135
153
  if (!key || !dir) return r;
136
154
  const col = columns().find((c) => c.key === key);
137
155
  return [...r].sort((a, b) => {
138
- const cmp = compareValues(a[key], b[key], col == null ? void 0 : col.type);
156
+ const cmp = compareValues(a[key], b[key], col == null ? void 0 : col.type, strings.locale);
139
157
  return dir === "desc" ? -cmp : cmp;
140
158
  });
141
159
  });
@@ -170,10 +188,14 @@ function DataPreviewSection(props) {
170
188
  return content();
171
189
  },
172
190
  get fallback() {
173
- return getNextElement(_tmpl$);
191
+ return (() => {
192
+ var _el$ = getNextElement(_tmpl$);
193
+ insert(_el$, () => strings.previewInvalidContent);
194
+ return _el$;
195
+ })();
174
196
  },
175
197
  children: (c) => (() => {
176
- var _el$2 = getNextElement(_tmpl$8), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = getNextMarker(_el$12.nextSibling), _el$14 = _el$3.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$16.nextSibling, _el$19 = _el$14.nextSibling, _el$36 = _el$19.firstChild, [_el$37, _co$8] = getNextMarker(_el$36.nextSibling), _el$38 = _el$37.nextSibling, [_el$39, _co$9] = getNextMarker(_el$38.nextSibling), _el$40 = _el$39.nextSibling, [_el$41, _co$0] = getNextMarker(_el$40.nextSibling);
198
+ var _el$2 = getNextElement(_tmpl$8), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = getNextMarker(_el$12.nextSibling), _el$14 = _el$3.nextSibling, _el$15 = _el$14.firstChild, _el$16 = _el$15.firstChild, _el$17 = _el$16.firstChild, _el$18 = _el$16.nextSibling, _el$19 = _el$14.nextSibling, _el$37 = _el$19.firstChild, [_el$38, _co$8] = getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = getNextMarker(_el$39.nextSibling), _el$41 = _el$40.nextSibling, [_el$42, _co$0] = getNextMarker(_el$41.nextSibling);
177
199
  insert(_el$4, createComponent(Show, {
178
200
  get when() {
179
201
  return c().source;
@@ -203,7 +225,11 @@ function DataPreviewSection(props) {
203
225
  _el$10.$$click = handleExportCSV;
204
226
  _el$11.$$click = handleExportJSON;
205
227
  effect((_p$) => {
206
- var _v$ = `Export CSV (${sortedRows().length} rows)`, _v$2 = `Export JSON (${sortedRows().length} rows)`;
228
+ var _v$ = formatMCPUIString(strings.exportCsvRows, {
229
+ count: sortedRows().length
230
+ }), _v$2 = formatMCPUIString(strings.exportJsonRows, {
231
+ count: sortedRows().length
232
+ });
207
233
  _v$ !== _p$.e && setAttribute(_el$10, "title", _p$.e = _v$);
208
234
  _v$2 !== _p$.t && setAttribute(_el$11, "title", _p$.t = _v$2);
209
235
  return _p$;
@@ -220,18 +246,20 @@ function DataPreviewSection(props) {
220
246
  return columns();
221
247
  },
222
248
  children: (col) => (() => {
223
- var _el$42 = getNextElement(_tmpl$9), _el$43 = _el$42.firstChild, _el$45 = _el$43.firstChild, [_el$46, _co$1] = getNextMarker(_el$45.nextSibling), _el$44 = _el$46.nextSibling;
224
- _el$42.$$click = () => handleSort(col.key);
225
- insert(_el$43, () => col.label, _el$46, _co$1);
226
- insert(_el$44, () => sortIndicator(col.key));
249
+ var _el$43 = getNextElement(_tmpl$9), _el$44 = _el$43.firstChild, _el$46 = _el$44.firstChild, [_el$47, _co$1] = getNextMarker(_el$46.nextSibling), _el$45 = _el$47.nextSibling;
250
+ _el$43.$$click = () => handleSort(col.key);
251
+ insert(_el$44, () => col.label, _el$47, _co$1);
252
+ insert(_el$45, () => sortIndicator(col.key));
227
253
  effect((_p$) => {
228
- var _v$5 = columnAlign(col), _v$6 = `Sort by ${col.label}`, _v$7 = {
254
+ var _v$7 = columnAlign(col), _v$8 = formatMCPUIString(strings.sortBy, {
255
+ column: col.label
256
+ }), _v$9 = {
229
257
  "opacity-30": sortKey() !== col.key,
230
258
  "opacity-100 text-blue-600 dark:text-blue-400": sortKey() === col.key
231
259
  };
232
- _v$5 !== _p$.e && setStyleProperty(_el$42, "text-align", _p$.e = _v$5);
233
- _v$6 !== _p$.t && setAttribute(_el$42, "title", _p$.t = _v$6);
234
- _p$.a = classList(_el$44, _v$7, _p$.a);
260
+ _v$7 !== _p$.e && setStyleProperty(_el$43, "text-align", _p$.e = _v$7);
261
+ _v$8 !== _p$.t && setAttribute(_el$43, "title", _p$.t = _v$8);
262
+ _p$.a = classList(_el$45, _v$9, _p$.a);
235
263
  return _p$;
236
264
  }, {
237
265
  e: void 0,
@@ -239,7 +267,7 @@ function DataPreviewSection(props) {
239
267
  a: void 0
240
268
  });
241
269
  runHydrationEvents();
242
- return _el$42;
270
+ return _el$43;
243
271
  })()
244
272
  }));
245
273
  insert(_el$18, createComponent(For, {
@@ -247,22 +275,22 @@ function DataPreviewSection(props) {
247
275
  return visibleRows();
248
276
  },
249
277
  children: (row, i) => (() => {
250
- var _el$47 = getNextElement(_tmpl$0);
251
- insert(_el$47, createComponent(For, {
278
+ var _el$48 = getNextElement(_tmpl$0);
279
+ insert(_el$48, createComponent(For, {
252
280
  get each() {
253
281
  return columns();
254
282
  },
255
283
  children: (col) => (() => {
256
- var _el$48 = getNextElement(_tmpl$1);
257
- insert(_el$48, () => formatCell(row[col.key], col));
258
- effect((_$p) => setStyleProperty(_el$48, "text-align", columnAlign(col)));
259
- return _el$48;
284
+ var _el$49 = getNextElement(_tmpl$1);
285
+ insert(_el$49, () => formatCell(row[col.key], col, strings.locale, mounted()));
286
+ effect((_$p) => setStyleProperty(_el$49, "text-align", columnAlign(col)));
287
+ return _el$49;
260
288
  })()
261
289
  }));
262
- effect((_$p) => classList(_el$47, {
290
+ effect((_$p) => classList(_el$48, {
263
291
  "bg-gray-25 dark:bg-gray-850": i() % 2 === 1
264
292
  }, _$p));
265
- return _el$47;
293
+ return _el$48;
266
294
  })()
267
295
  }));
268
296
  insert(_el$19, createComponent(Show, {
@@ -273,15 +301,25 @@ function DataPreviewSection(props) {
273
301
  var _el$20 = getNextElement(_tmpl$5), _el$21 = _el$20.firstChild, [_el$22, _co$4] = getNextMarker(_el$21.nextSibling), _el$23 = _el$22.nextSibling, [_el$24, _co$5] = getNextMarker(_el$23.nextSibling);
274
302
  insert(_el$20, (() => {
275
303
  var _c$ = memo(() => !!isPaginated());
276
- return () => _c$() ? `Showing ${rangeStart()}–${rangeEnd()} of ${sortedRows().length.toLocaleString("fr-FR")}` : `${sortedRows().length} row${sortedRows().length !== 1 ? "s" : ""}`;
304
+ return () => _c$() ? formatMCPUIString(strings.previewShowingRange, {
305
+ start: rangeStart().toLocaleString(strings.locale),
306
+ end: rangeEnd().toLocaleString(strings.locale),
307
+ // `strings.locale` formats the count, so the chrome
308
+ // string and the digits agree (and SSR matches the client).
309
+ total: sortedRows().length.toLocaleString(strings.locale)
310
+ }) : formatMCPUIString(sortedRows().length === 1 ? strings.previewRowsOne : strings.previewRowsMany, {
311
+ count: sortedRows().length.toLocaleString(strings.locale)
312
+ });
277
313
  })(), _el$22, _co$4);
278
314
  insert(_el$20, (() => {
279
315
  var _c$2 = memo(() => !!(c().totalRows && c().totalRows > sortedRows().length));
280
- return () => _c$2() ? ` (${c().totalRows.toLocaleString("fr-FR")} total)` : "";
316
+ return () => _c$2() ? formatMCPUIString(strings.previewTotalSuffix, {
317
+ total: c().totalRows.toLocaleString(strings.locale)
318
+ }) : "";
281
319
  })(), _el$24, _co$5);
282
320
  return _el$20;
283
321
  }
284
- }), _el$37, _co$8);
322
+ }), _el$38, _co$8);
285
323
  insert(_el$19, createComponent(Show, {
286
324
  get when() {
287
325
  return !showPageInfo();
@@ -289,30 +327,39 @@ function DataPreviewSection(props) {
289
327
  get children() {
290
328
  return getNextElement(_tmpl$6);
291
329
  }
292
- }), _el$39, _co$9);
330
+ }), _el$40, _co$9);
293
331
  insert(_el$19, createComponent(Show, {
294
332
  get when() {
295
333
  return isPaginated();
296
334
  },
297
335
  get children() {
298
- var _el$26 = getNextElement(_tmpl$7), _el$27 = _el$26.firstChild, _el$28 = _el$27.nextSibling, _el$29 = _el$28.firstChild, _el$31 = _el$29.nextSibling, [_el$32, _co$6] = getNextMarker(_el$31.nextSibling), _el$30 = _el$32.nextSibling, _el$33 = _el$30.nextSibling, [_el$34, _co$7] = getNextMarker(_el$33.nextSibling), _el$35 = _el$28.nextSibling;
336
+ var _el$26 = getNextElement(_tmpl$7), _el$27 = _el$26.firstChild, _el$28 = _el$27.firstChild, _el$29 = _el$28.nextSibling, _el$30 = _el$29.nextSibling, [_el$31, _co$6] = getNextMarker(_el$30.nextSibling), _el$32 = _el$27.nextSibling, _el$33 = _el$32.nextSibling, _el$35 = _el$33.firstChild, [_el$36, _co$7] = getNextMarker(_el$35.nextSibling);
337
+ _el$36.nextSibling;
299
338
  _el$27.$$click = () => setPage((p) => p - 1);
300
- insert(_el$28, () => page() + 1, _el$32, _co$6);
301
- insert(_el$28, totalPages, _el$34, _co$7);
302
- _el$35.$$click = () => setPage((p) => p + 1);
339
+ insert(_el$27, () => strings.previewPrev, _el$31, _co$6);
340
+ insert(_el$32, () => formatMCPUIString(strings.previewPageIndicator, {
341
+ page: page() + 1,
342
+ total: totalPages()
343
+ }));
344
+ _el$33.$$click = () => setPage((p) => p + 1);
345
+ insert(_el$33, () => strings.previewNext, _el$36, _co$7);
303
346
  effect((_p$) => {
304
- var _v$3 = page() === 0, _v$4 = page() >= totalPages() - 1;
347
+ var _v$3 = page() === 0, _v$4 = strings.paginationPrevious, _v$5 = page() >= totalPages() - 1, _v$6 = strings.paginationNext;
305
348
  _v$3 !== _p$.e && setProperty(_el$27, "disabled", _p$.e = _v$3);
306
- _v$4 !== _p$.t && setProperty(_el$35, "disabled", _p$.t = _v$4);
349
+ _v$4 !== _p$.t && setAttribute(_el$27, "aria-label", _p$.t = _v$4);
350
+ _v$5 !== _p$.a && setProperty(_el$33, "disabled", _p$.a = _v$5);
351
+ _v$6 !== _p$.o && setAttribute(_el$33, "aria-label", _p$.o = _v$6);
307
352
  return _p$;
308
353
  }, {
309
354
  e: void 0,
310
- t: void 0
355
+ t: void 0,
356
+ a: void 0,
357
+ o: void 0
311
358
  });
312
359
  runHydrationEvents();
313
360
  return _el$26;
314
361
  }
315
- }), _el$41, _co$0);
362
+ }), _el$42, _co$0);
316
363
  return _el$2;
317
364
  })()
318
365
  });
@@ -1 +1 @@
1
- {"version":3,"file":"DataPreviewSection.js","sources":["../../src/components/DataPreviewSection.tsx"],"sourcesContent":["/**\n * DataPreviewSection — paginated, sortable data table with export\n * v4.0.4: Full pagination spec (auto-activate, pageSize=0 disable, showPageInfo, onPageChange)\n *\n * @experimental\n */\n\nimport { createSignal, createMemo, createEffect, For, Show } from 'solid-js'\nimport type { DataPreviewContent, DataPreviewColumn } from '../types/chat-bus'\n\nexport interface DataPreviewSectionProps {\n content: DataPreviewContent\n}\n\ntype SortDir = 'asc' | 'desc' | null\n\n// ─── Formatting helpers ─────────────────────────────────────\n\nfunction formatNumber(value: unknown, format?: string): string {\n if (typeof value !== 'number' || !isFinite(value)) return String(value ?? '')\n if (format === 'percent') return `${(value * 100).toFixed(1)}%`\n if (format === 'currency') return `${value.toLocaleString('fr-FR')} EUR`\n if (Number.isInteger(value)) return value.toLocaleString('fr-FR')\n return value.toLocaleString('fr-FR', { maximumFractionDigits: 2 })\n}\n\nfunction formatCell(value: unknown, col: DataPreviewColumn): string {\n if (value == null) return '\\u2014'\n if (col.type === 'number') return formatNumber(value, col.format)\n if (col.type === 'date' && typeof value === 'string') {\n try { return new Date(value).toLocaleDateString('fr-FR') } catch { return value }\n }\n return String(value)\n}\n\nfunction compareValues(a: unknown, b: unknown, type?: string): number {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (type === 'number') {\n const na = typeof a === 'number' ? a : Number(a)\n const nb = typeof b === 'number' ? b : Number(b)\n if (isNaN(na) && isNaN(nb)) return 0\n if (isNaN(na)) return 1\n if (isNaN(nb)) return -1\n return na - nb\n }\n if (type === 'date') {\n const da = new Date(String(a)).getTime()\n const db = new Date(String(b)).getTime()\n if (isNaN(da) && isNaN(db)) return 0\n if (isNaN(da)) return 1\n if (isNaN(db)) return -1\n return da - db\n }\n return String(a).localeCompare(String(b), 'fr', { sensitivity: 'base' })\n}\n\n// ─── Export helpers ─────────────────────────────────────────\n\nfunction toCSV(columns: DataPreviewColumn[], rows: Record<string, unknown>[]): string {\n const header = columns.map(c => `\"${c.label.replace(/\"/g, '\"\"')}\"`).join(';')\n const body = rows.map(row =>\n columns.map(c => {\n const val = row[c.key]\n if (val == null) return ''\n if (typeof val === 'string') return `\"${val.replace(/\"/g, '\"\"')}\"`\n return String(val)\n }).join(';')\n ).join('\\n')\n return `${header}\\n${body}`\n}\n\nfunction downloadFile(content: string, filename: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// ─── Content resolver ───────────────────────────────────────\n\nfunction resolveContent(raw: unknown): DataPreviewContent | null {\n if (!raw || typeof raw !== 'object') return null\n const obj = raw as Record<string, unknown>\n if (Array.isArray(obj.columns) && Array.isArray(obj.rows)) {\n return obj as unknown as DataPreviewContent\n }\n if (obj.content && typeof obj.content === 'object') {\n const inner = obj.content as Record<string, unknown>\n if (Array.isArray(inner.columns) && Array.isArray(inner.rows)) {\n return inner as unknown as DataPreviewContent\n }\n }\n return null\n}\n\n// ─── Component ──────────────────────────────────────────────\n\nexport function DataPreviewSection(props: DataPreviewSectionProps) {\n const content = createMemo(() => {\n const resolved = resolveContent(props.content)\n if (!resolved) {\n console.warn('[MCP-UI] DataPreviewSection: invalid content — expected { columns, rows }', props.content)\n }\n return resolved\n })\n\n const columns = () => content()?.columns || []\n const rawRows = () => content()?.rows || []\n const pageSizeVal = () => content()?.pageSize ?? 25\n const showPageInfo = () => content()?.showPageInfo !== false\n\n const [page, setPage] = createSignal(content()?.initialPage ?? 0)\n const [sortKey, setSortKey] = createSignal<string | null>(null)\n const [sortDir, setSortDir] = createSignal<SortDir>(null)\n\n // Notify parent on page change\n createEffect(() => {\n const p = page()\n content()?.onPageChange?.(p)\n })\n\n const handleSort = (key: string) => {\n if (sortKey() === key) {\n if (sortDir() === 'asc') setSortDir('desc')\n else { setSortKey(null); setSortDir(null) }\n } else {\n setSortKey(key)\n setSortDir('asc')\n }\n setPage(0)\n }\n\n const sortedRows = createMemo(() => {\n const r = rawRows()\n const key = sortKey()\n const dir = sortDir()\n if (!key || !dir) return r\n const col = columns().find(c => c.key === key)\n return [...r].sort((a, b) => {\n const cmp = compareValues(a[key], b[key], col?.type)\n return dir === 'desc' ? -cmp : cmp\n })\n })\n\n // Pagination: auto-enabled when rows > pageSize, disabled when pageSize=0\n const isPaginated = () => pageSizeVal() > 0 && sortedRows().length > pageSizeVal()\n const totalPages = () => isPaginated() ? Math.ceil(sortedRows().length / pageSizeVal()) : 1\n\n const visibleRows = createMemo(() => {\n if (!isPaginated()) return sortedRows()\n const start = page() * pageSizeVal()\n return sortedRows().slice(start, start + pageSizeVal())\n })\n\n const rangeStart = () => isPaginated() ? page() * pageSizeVal() + 1 : 1\n const rangeEnd = () => isPaginated()\n ? Math.min((page() + 1) * pageSizeVal(), sortedRows().length)\n : sortedRows().length\n\n // Export ALL rows (not just page)\n const handleExportCSV = () => {\n const c = content()\n if (!c) return\n downloadFile(toCSV(c.columns, sortedRows()), 'data-export.csv', 'text/csv;charset=utf-8')\n }\n const handleExportJSON = () => {\n downloadFile(JSON.stringify(sortedRows(), null, 2), 'data-export.json', 'application/json')\n }\n\n const columnAlign = (col: DataPreviewColumn) => {\n if (col.align) return col.align\n if (col.type === 'number') return 'right'\n return 'left'\n }\n\n const sortIndicator = (key: string) => {\n if (sortKey() !== key) return '\\u2195'\n return sortDir() === 'asc' ? '\\u2191' : '\\u2193'\n }\n\n return (\n <Show when={content()} fallback={\n <div class=\"text-xs text-amber-600 dark:text-amber-400 p-2\">\n [DataPreviewSection] Invalid content format\n </div>\n }>\n {(c) => (\n <div class=\"data-preview-section\">\n {/* Header: source + export */}\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={c().source}>\n <span class=\"font-medium\">{c().source}</span>\n </Show>\n <Show when={c().freshness}>\n <span class=\"px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {c().freshness}\n </span>\n </Show>\n </div>\n <Show when={c().exportable !== false}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportCSV}\n title={`Export CSV (${sortedRows().length} rows)`}\n >\n CSV\n </button>\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportJSON}\n title={`Export JSON (${sortedRows().length} rows)`}\n >\n JSON\n </button>\n </div>\n </Show>\n </div>\n\n {/* Table */}\n <div class=\"overflow-x-auto rounded border border-gray-200 dark:border-gray-700\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"bg-gray-50 dark:bg-gray-800\">\n <For each={columns()}>\n {(col) => (\n <th\n class=\"px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors\"\n style={{ \"text-align\": columnAlign(col) }}\n onClick={() => handleSort(col.key)}\n title={`Sort by ${col.label}`}\n >\n <span class=\"inline-flex items-center gap-1\">\n {col.label}\n <span\n class=\"text-[10px] leading-none\"\n classList={{\n 'opacity-30': sortKey() !== col.key,\n 'opacity-100 text-blue-600 dark:text-blue-400': sortKey() === col.key,\n }}\n >\n {sortIndicator(col.key)}\n </span>\n </span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={visibleRows()}>\n {(row, i) => (\n <tr\n class=\"border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n classList={{ 'bg-gray-25 dark:bg-gray-850': i() % 2 === 1 }}\n >\n <For each={columns()}>\n {(col) => (\n <td\n class=\"px-3 py-2 text-gray-800 dark:text-gray-200\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {formatCell(row[col.key], col)}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n {/* Footer: pagination + page info */}\n <div class=\"flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={showPageInfo()}>\n <span>\n {isPaginated()\n ? `Showing ${rangeStart()}\\u2013${rangeEnd()} of ${sortedRows().length.toLocaleString('fr-FR')}`\n : `${sortedRows().length} row${sortedRows().length !== 1 ? 's' : ''}`\n }\n {c().totalRows && c().totalRows! > sortedRows().length\n ? ` (${c().totalRows!.toLocaleString('fr-FR')} total)`\n : ''\n }\n </span>\n </Show>\n <Show when={!showPageInfo()}><span /></Show>\n\n <Show when={isPaginated()}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() === 0}\n onClick={() => setPage(p => p - 1)}\n >\n &#x25C0; Prev\n </button>\n <span class=\"px-2\">Page {page() + 1} / {totalPages()}</span>\n <button\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() >= totalPages() - 1}\n onClick={() => setPage(p => p + 1)}\n >\n Next &#x25B6;\n </button>\n </div>\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["formatNumber","value","format","isFinite","String","toFixed","toLocaleString","Number","isInteger","maximumFractionDigits","formatCell","col","type","Date","toLocaleDateString","compareValues","a","b","na","nb","isNaN","da","getTime","db","localeCompare","sensitivity","toCSV","columns","rows","header","map","c","label","replace","join","body","row","val","key","downloadFile","content","filename","mimeType","blob","Blob","url","URL","createObjectURL","document","createElement","href","download","click","revokeObjectURL","resolveContent","raw","obj","Array","isArray","inner","DataPreviewSection","props","createMemo","resolved","console","warn","rawRows","pageSizeVal","pageSize","showPageInfo","page","setPage","createSignal","initialPage","sortKey","setSortKey","sortDir","setSortDir","createEffect","p","onPageChange","handleSort","sortedRows","r","dir","find","sort","cmp","isPaginated","length","totalPages","Math","ceil","visibleRows","start","slice","rangeStart","rangeEnd","min","handleExportCSV","handleExportJSON","JSON","stringify","columnAlign","align","sortIndicator","_$createComponent","Show","when","fallback","_$getNextElement","_tmpl$","children","_el$2","_tmpl$8","_el$3","firstChild","_el$4","_el$7","_el$8","_co$","_$getNextMarker","nextSibling","_el$9","_el$0","_co$2","_el$12","_el$13","_co$3","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","_el$36","_el$37","_co$8","_el$38","_el$39","_co$9","_el$40","_el$41","_co$0","_$insert","source","_el$5","_tmpl$2","freshness","_el$6","_tmpl$3","exportable","_el$1","_tmpl$4","_el$10","_el$11","$$click","_$effect","_p$","_v$","_v$2","e","_$setAttribute","t","undefined","_$runHydrationEvents","For","each","_el$42","_tmpl$9","_el$43","_el$45","_el$46","_co$1","_el$44","_v$5","_v$6","_v$7","_$setStyleProperty","_$classList","i","_el$47","_tmpl$0","_el$48","_tmpl$1","_$p","_el$20","_tmpl$5","_el$21","_el$22","_co$4","_el$23","_el$24","_co$5","_c$","_$memo","_c$2","totalRows","_tmpl$6","_el$26","_tmpl$7","_el$27","_el$28","_el$29","_el$31","_el$32","_co$6","_el$30","_el$33","_el$34","_co$7","_el$35","_v$3","_v$4","_$setProperty","_$delegateEvents"],"mappings":"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"}
1
+ {"version":3,"file":"DataPreviewSection.js","sources":["../../src/components/DataPreviewSection.tsx"],"sourcesContent":["/**\n * DataPreviewSection — paginated, sortable data table with export\n * v4.0.4: Full pagination spec (auto-activate, pageSize=0 disable, showPageInfo, onPageChange)\n *\n * @experimental\n */\n\nimport { createSignal, createMemo, createEffect, For, Show, onMount } from 'solid-js'\nimport type { DataPreviewContent, DataPreviewColumn } from '../types/chat-bus'\nimport {\n DEFAULT_MCPUI_STRINGS,\n formatMCPUIString,\n useMCPUIStrings,\n} from '../context/MCPUIStringsContext'\n\nexport interface DataPreviewSectionProps {\n content: DataPreviewContent\n}\n\ntype SortDir = 'asc' | 'desc' | null\n\n// ─── Formatting helpers ─────────────────────────────────────\n\n/**\n * `locale` — BCP-47 tag (`MCPUIStrings.locale`, default `'en-US'`). Before\n * 6.20.0 these helpers hardcoded `'fr-FR'` / `'fr'`.\n */\nfunction formatNumber(\n value: unknown,\n format?: string,\n locale: string = DEFAULT_MCPUI_STRINGS.locale\n): string {\n if (typeof value !== 'number' || !isFinite(value)) return String(value ?? '')\n if (format === 'percent') {\n return new Intl.NumberFormat(locale, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n useGrouping: false,\n }).format(value)\n }\n if (format === 'currency') return `${value.toLocaleString(locale)} EUR`\n if (Number.isInteger(value)) return value.toLocaleString(locale)\n return value.toLocaleString(locale, { maximumFractionDigits: 2 })\n}\n\nfunction formatCell(\n value: unknown,\n col: DataPreviewColumn,\n locale: string = DEFAULT_MCPUI_STRINGS.locale,\n /** False before mount: date-time values stay raw so SSR and hydration match. */\n zoneAware = true\n): string {\n if (value == null) return '\\u2014'\n if (col.type === 'number') return formatNumber(value, col.format, locale)\n if (col.type === 'date' && typeof value === 'string') {\n const date = new Date(value)\n if (Number.isNaN(date.getTime())) return value\n // A date-only value (`2026-09-17`) has no time zone: format it in UTC so\n // every viewer, and the server, shows the same calendar date.\n const dateOnly = /^\\d{4}-\\d{2}-\\d{2}$/.test(value)\n // A date-time's calendar date depends on the viewer's time zone, which the\n // server cannot know: keep the raw value until the component has mounted.\n if (!dateOnly && !zoneAware) return value\n try {\n return date.toLocaleDateString(locale, dateOnly ? { timeZone: 'UTC' } : undefined)\n } catch {\n return value\n }\n }\n return String(value)\n}\n\nfunction compareValues(\n a: unknown,\n b: unknown,\n type?: string,\n locale: string = DEFAULT_MCPUI_STRINGS.locale\n): number {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n if (type === 'number') {\n const na = typeof a === 'number' ? a : Number(a)\n const nb = typeof b === 'number' ? b : Number(b)\n if (isNaN(na) && isNaN(nb)) return 0\n if (isNaN(na)) return 1\n if (isNaN(nb)) return -1\n return na - nb\n }\n if (type === 'date') {\n const da = new Date(String(a)).getTime()\n const db = new Date(String(b)).getTime()\n if (isNaN(da) && isNaN(db)) return 0\n if (isNaN(da)) return 1\n if (isNaN(db)) return -1\n return da - db\n }\n return String(a).localeCompare(String(b), locale, { sensitivity: 'base' })\n}\n\n// ─── Export helpers ─────────────────────────────────────────\n\nfunction toCSV(columns: DataPreviewColumn[], rows: Record<string, unknown>[]): string {\n const header = columns.map(c => `\"${c.label.replace(/\"/g, '\"\"')}\"`).join(';')\n const body = rows.map(row =>\n columns.map(c => {\n const val = row[c.key]\n if (val == null) return ''\n if (typeof val === 'string') return `\"${val.replace(/\"/g, '\"\"')}\"`\n return String(val)\n }).join(';')\n ).join('\\n')\n return `${header}\\n${body}`\n}\n\nfunction downloadFile(content: string, filename: string, mimeType: string) {\n const blob = new Blob([content], { type: mimeType })\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\n// ─── Content resolver ───────────────────────────────────────\n\nfunction resolveContent(raw: unknown): DataPreviewContent | null {\n if (!raw || typeof raw !== 'object') return null\n const obj = raw as Record<string, unknown>\n if (Array.isArray(obj.columns) && Array.isArray(obj.rows)) {\n return obj as unknown as DataPreviewContent\n }\n if (obj.content && typeof obj.content === 'object') {\n const inner = obj.content as Record<string, unknown>\n if (Array.isArray(inner.columns) && Array.isArray(inner.rows)) {\n return inner as unknown as DataPreviewContent\n }\n }\n return null\n}\n\n// ─── Component ──────────────────────────────────────────────\n\nexport function DataPreviewSection(props: DataPreviewSectionProps) {\n const strings = useMCPUIStrings()\n const content = createMemo(() => {\n const resolved = resolveContent(props.content)\n if (!resolved) {\n console.warn('[MCP-UI] DataPreviewSection: invalid content — expected { columns, rows }', props.content)\n }\n return resolved\n })\n\n const columns = () => content()?.columns || []\n const rawRows = () => content()?.rows || []\n const pageSizeVal = () => content()?.pageSize ?? 25\n const showPageInfo = () => content()?.showPageInfo !== false\n\n const [page, setPage] = createSignal(content()?.initialPage ?? 0)\n const [mounted, setMounted] = createSignal(false)\n onMount(() => setMounted(true))\n const [sortKey, setSortKey] = createSignal<string | null>(null)\n const [sortDir, setSortDir] = createSignal<SortDir>(null)\n\n // Notify parent on page change\n createEffect(() => {\n const p = page()\n content()?.onPageChange?.(p)\n })\n\n const handleSort = (key: string) => {\n if (sortKey() === key) {\n if (sortDir() === 'asc') setSortDir('desc')\n else { setSortKey(null); setSortDir(null) }\n } else {\n setSortKey(key)\n setSortDir('asc')\n }\n setPage(0)\n }\n\n const sortedRows = createMemo(() => {\n const r = rawRows()\n const key = sortKey()\n const dir = sortDir()\n if (!key || !dir) return r\n const col = columns().find(c => c.key === key)\n return [...r].sort((a, b) => {\n const cmp = compareValues(a[key], b[key], col?.type, strings.locale)\n return dir === 'desc' ? -cmp : cmp\n })\n })\n\n // Pagination: auto-enabled when rows > pageSize, disabled when pageSize=0\n const isPaginated = () => pageSizeVal() > 0 && sortedRows().length > pageSizeVal()\n const totalPages = () => isPaginated() ? Math.ceil(sortedRows().length / pageSizeVal()) : 1\n\n const visibleRows = createMemo(() => {\n if (!isPaginated()) return sortedRows()\n const start = page() * pageSizeVal()\n return sortedRows().slice(start, start + pageSizeVal())\n })\n\n const rangeStart = () => isPaginated() ? page() * pageSizeVal() + 1 : 1\n const rangeEnd = () => isPaginated()\n ? Math.min((page() + 1) * pageSizeVal(), sortedRows().length)\n : sortedRows().length\n\n // Export ALL rows (not just page)\n const handleExportCSV = () => {\n const c = content()\n if (!c) return\n downloadFile(toCSV(c.columns, sortedRows()), 'data-export.csv', 'text/csv;charset=utf-8')\n }\n const handleExportJSON = () => {\n downloadFile(JSON.stringify(sortedRows(), null, 2), 'data-export.json', 'application/json')\n }\n\n const columnAlign = (col: DataPreviewColumn) => {\n if (col.align) return col.align\n if (col.type === 'number') return 'right'\n return 'left'\n }\n\n const sortIndicator = (key: string) => {\n if (sortKey() !== key) return '\\u2195'\n return sortDir() === 'asc' ? '\\u2191' : '\\u2193'\n }\n\n return (\n <Show when={content()} fallback={\n <div class=\"text-xs text-amber-600 dark:text-amber-400 p-2\">\n {strings.previewInvalidContent}\n </div>\n }>\n {(c) => (\n <div class=\"data-preview-section\">\n {/* Header: source + export */}\n <div class=\"flex items-center justify-between mb-2\">\n <div class=\"flex items-center gap-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={c().source}>\n <span class=\"font-medium\">{c().source}</span>\n </Show>\n <Show when={c().freshness}>\n <span class=\"px-1.5 py-0.5 rounded bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-300\">\n {c().freshness}\n </span>\n </Show>\n </div>\n <Show when={c().exportable !== false}>\n <div class=\"flex items-center gap-1\">\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportCSV}\n title={formatMCPUIString(strings.exportCsvRows, { count: sortedRows().length })}\n >\n CSV\n </button>\n <button\n class=\"px-2 py-1 text-xs rounded border border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors\"\n onClick={handleExportJSON}\n title={formatMCPUIString(strings.exportJsonRows, { count: sortedRows().length })}\n >\n JSON\n </button>\n </div>\n </Show>\n </div>\n\n {/* Table */}\n <div class=\"overflow-x-auto rounded border border-gray-200 dark:border-gray-700\">\n <table class=\"w-full text-sm\">\n <thead>\n <tr class=\"bg-gray-50 dark:bg-gray-800\">\n <For each={columns()}>\n {(col) => (\n <th\n class=\"px-3 py-2 font-medium text-xs text-gray-600 dark:text-gray-400 uppercase tracking-wider border-b border-gray-200 dark:border-gray-700 cursor-pointer select-none hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors\"\n style={{ \"text-align\": columnAlign(col) }}\n onClick={() => handleSort(col.key)}\n title={formatMCPUIString(strings.sortBy, { column: col.label })}\n >\n <span class=\"inline-flex items-center gap-1\">\n {col.label}\n <span\n class=\"text-[10px] leading-none\"\n classList={{\n 'opacity-30': sortKey() !== col.key,\n 'opacity-100 text-blue-600 dark:text-blue-400': sortKey() === col.key,\n }}\n >\n {sortIndicator(col.key)}\n </span>\n </span>\n </th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={visibleRows()}>\n {(row, i) => (\n <tr\n class=\"border-b border-gray-100 dark:border-gray-800 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n classList={{ 'bg-gray-25 dark:bg-gray-850': i() % 2 === 1 }}\n >\n <For each={columns()}>\n {(col) => (\n <td\n class=\"px-3 py-2 text-gray-800 dark:text-gray-200\"\n style={{ \"text-align\": columnAlign(col) }}\n >\n {formatCell(row[col.key], col, strings.locale, mounted())}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n\n {/* Footer: pagination + page info */}\n <div class=\"flex items-center justify-between mt-2 text-xs text-gray-500 dark:text-gray-400\">\n <Show when={showPageInfo()}>\n <span>\n {isPaginated()\n ? formatMCPUIString(strings.previewShowingRange, {\n start: rangeStart().toLocaleString(strings.locale),\n end: rangeEnd().toLocaleString(strings.locale),\n // `strings.locale` formats the count, so the chrome\n // string and the digits agree (and SSR matches the client).\n total: sortedRows().length.toLocaleString(strings.locale),\n })\n : formatMCPUIString(\n sortedRows().length === 1 ? strings.previewRowsOne : strings.previewRowsMany,\n { count: sortedRows().length.toLocaleString(strings.locale) }\n )}\n {c().totalRows && c().totalRows! > sortedRows().length\n ? formatMCPUIString(strings.previewTotalSuffix, {\n total: c().totalRows!.toLocaleString(strings.locale),\n })\n : ''}\n </span>\n </Show>\n <Show when={!showPageInfo()}><span /></Show>\n\n <Show when={isPaginated()}>\n <div class=\"flex items-center gap-1\">\n <button\n type=\"button\"\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() === 0}\n onClick={() => setPage(p => p - 1)}\n aria-label={strings.paginationPrevious}\n data-mcp-ui-action=\"page-prev\"\n >\n <span aria-hidden=\"true\">&#x25C0;</span> {strings.previewPrev}\n </button>\n <span class=\"px-2\" aria-live=\"polite\">\n {formatMCPUIString(strings.previewPageIndicator, {\n page: page() + 1,\n total: totalPages(),\n })}\n </span>\n <button\n type=\"button\"\n class=\"px-2 py-1 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n disabled={page() >= totalPages() - 1}\n onClick={() => setPage(p => p + 1)}\n aria-label={strings.paginationNext}\n data-mcp-ui-action=\"page-next\"\n >\n {strings.previewNext} <span aria-hidden=\"true\">&#x25B6;</span>\n </button>\n </div>\n </Show>\n </div>\n </div>\n )}\n </Show>\n )\n}\n"],"names":["formatNumber","value","format","locale","DEFAULT_MCPUI_STRINGS","isFinite","String","Intl","NumberFormat","style","minimumFractionDigits","maximumFractionDigits","useGrouping","toLocaleString","Number","isInteger","formatCell","col","zoneAware","type","date","Date","isNaN","getTime","dateOnly","test","toLocaleDateString","timeZone","undefined","compareValues","a","b","na","nb","da","db","localeCompare","sensitivity","toCSV","columns","rows","header","map","c","label","replace","join","body","row","val","key","downloadFile","content","filename","mimeType","blob","Blob","url","URL","createObjectURL","document","createElement","href","download","click","revokeObjectURL","resolveContent","raw","obj","Array","isArray","inner","DataPreviewSection","props","strings","useMCPUIStrings","createMemo","resolved","console","warn","rawRows","pageSizeVal","pageSize","showPageInfo","page","setPage","createSignal","initialPage","mounted","setMounted","onMount","sortKey","setSortKey","sortDir","setSortDir","createEffect","p","onPageChange","handleSort","sortedRows","r","dir","find","sort","cmp","isPaginated","length","totalPages","Math","ceil","visibleRows","start","slice","rangeStart","rangeEnd","min","handleExportCSV","handleExportJSON","JSON","stringify","columnAlign","align","sortIndicator","_$createComponent","Show","when","fallback","_el$","_$getNextElement","_tmpl$","_$insert","previewInvalidContent","children","_el$2","_tmpl$8","_el$3","firstChild","_el$4","_el$7","_el$8","_co$","_$getNextMarker","nextSibling","_el$9","_el$0","_co$2","_el$12","_el$13","_co$3","_el$14","_el$15","_el$16","_el$17","_el$18","_el$19","_el$37","_el$38","_co$8","_el$39","_el$40","_co$9","_el$41","_el$42","_co$0","source","_el$5","_tmpl$2","freshness","_el$6","_tmpl$3","exportable","_el$1","_tmpl$4","_el$10","_el$11","$$click","_$effect","_p$","_v$","formatMCPUIString","exportCsvRows","count","_v$2","exportJsonRows","e","_$setAttribute","t","_$runHydrationEvents","For","each","_el$43","_tmpl$9","_el$44","_el$46","_el$47","_co$1","_el$45","_v$7","_v$8","sortBy","column","_v$9","_$setStyleProperty","_$classList","i","_el$48","_tmpl$0","_el$49","_tmpl$1","_$p","_el$20","_tmpl$5","_el$21","_el$22","_co$4","_el$23","_el$24","_co$5","_c$","_$memo","previewShowingRange","end","total","previewRowsOne","previewRowsMany","_c$2","totalRows","previewTotalSuffix","_tmpl$6","_el$26","_tmpl$7","_el$27","_el$28","_el$29","_el$30","_el$31","_co$6","_el$32","_el$33","_el$35","_el$36","_co$7","previewPrev","previewPageIndicator","previewNext","_v$3","_v$4","paginationPrevious","_v$5","_v$6","paginationNext","_$setProperty","o","_$delegateEvents"],"mappings":"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"}
@@ -2,8 +2,11 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const web = require("solid-js/web");
4
4
  const solidJs = require("solid-js");
5
- var _tmpl$ = /* @__PURE__ */ web.template(`<div class="mt-2 max-h-64 overflow-auto rounded border border-amber-200 dark:border-amber-800"><table class="w-full border-collapse text-left text-xs"><thead class="sticky top-0 bg-amber-100 dark:bg-amber-900/40"><tr></tr></thead><tbody>`), _tmpl$2 = /* @__PURE__ */ web.template(`<p class="mt-1 text-[10px] text-amber-600 dark:text-amber-400">+<!$><!/> more rows not shown.`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class="w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20"role=alert><p class="text-sm font-medium text-amber-900 dark:text-amber-100"></p><p class="mt-0.5 text-xs text-amber-700 dark:text-amber-300"></p><!$><!/>`), _tmpl$4 = /* @__PURE__ */ web.template(`<th class="px-2 py-1 font-medium text-amber-900 dark:text-amber-100">`), _tmpl$5 = /* @__PURE__ */ web.template(`<tr class="border-t border-amber-100 dark:border-amber-800/60">`), _tmpl$6 = /* @__PURE__ */ web.template(`<td class="px-2 py-1 text-amber-800 dark:text-amber-200">`);
5
+ const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
6
+ const formatString = require("../utils/format-string.cjs");
7
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div class="mt-2 max-h-64 overflow-auto rounded border border-amber-200 dark:border-amber-800"><table class="w-full border-collapse text-left text-xs"><thead class="sticky top-0 bg-amber-100 dark:bg-amber-900/40"><tr></tr></thead><tbody>`), _tmpl$2 = /* @__PURE__ */ web.template(`<p class="mt-1 text-[10px] text-amber-600 dark:text-amber-400">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class="w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20"role=alert><p class="text-sm font-medium text-amber-900 dark:text-amber-100"></p><p class="mt-0.5 text-xs text-amber-700 dark:text-amber-300"></p><!$><!/>`), _tmpl$4 = /* @__PURE__ */ web.template(`<th class="px-2 py-1 font-medium text-amber-900 dark:text-amber-100">`), _tmpl$5 = /* @__PURE__ */ web.template(`<tr class="border-t border-amber-100 dark:border-amber-800/60">`), _tmpl$6 = /* @__PURE__ */ web.template(`<td class="px-2 py-1 text-amber-800 dark:text-amber-200">`);
6
8
  const DegradedFallback = (props) => {
9
+ const strings = MCPUIStringsContext.useMCPUIStrings();
7
10
  const maxRows = () => props.maxRows ?? 50;
8
11
  const allRows = () => props.rows ?? [];
9
12
  const shownRows = () => allRows().slice(0, maxRows());
@@ -13,9 +16,9 @@ const DegradedFallback = (props) => {
13
16
  return (((_a = props.columns) == null ? void 0 : _a.length) ?? 0) > 0 && allRows().length > 0;
14
17
  };
15
18
  return (() => {
16
- var _el$ = web.getNextElement(_tmpl$3), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$12 = _el$3.nextSibling, [_el$13, _co$2] = web.getNextMarker(_el$12.nextSibling);
19
+ var _el$ = web.getNextElement(_tmpl$3), _el$2 = _el$.firstChild, _el$3 = _el$2.nextSibling, _el$0 = _el$3.nextSibling, [_el$1, _co$] = web.getNextMarker(_el$0.nextSibling);
17
20
  web.insert(_el$2, () => props.message);
18
- web.insert(_el$3, () => props.caption ?? "Showing the underlying data — the interactive view is unavailable.");
21
+ web.insert(_el$3, () => props.caption ?? strings.degradedCaption);
19
22
  web.insert(_el$, web.createComponent(solidJs.Show, {
20
23
  get when() {
21
24
  return hasTable();
@@ -28,9 +31,9 @@ const DegradedFallback = (props) => {
28
31
  return props.columns;
29
32
  },
30
33
  children: (col) => (() => {
31
- var _el$14 = web.getNextElement(_tmpl$4);
32
- web.insert(_el$14, col);
33
- return _el$14;
34
+ var _el$10 = web.getNextElement(_tmpl$4);
35
+ web.insert(_el$10, col);
36
+ return _el$10;
34
37
  })()
35
38
  }));
36
39
  web.insert(_el$8, web.createComponent(solidJs.For, {
@@ -38,18 +41,18 @@ const DegradedFallback = (props) => {
38
41
  return shownRows();
39
42
  },
40
43
  children: (row) => (() => {
41
- var _el$15 = web.getNextElement(_tmpl$5);
42
- web.insert(_el$15, web.createComponent(solidJs.For, {
44
+ var _el$11 = web.getNextElement(_tmpl$5);
45
+ web.insert(_el$11, web.createComponent(solidJs.For, {
43
46
  get each() {
44
47
  return props.columns;
45
48
  },
46
49
  children: (_col, i) => (() => {
47
- var _el$16 = web.getNextElement(_tmpl$6);
48
- web.insert(_el$16, () => String(row[i()] ?? ""));
49
- return _el$16;
50
+ var _el$12 = web.getNextElement(_tmpl$6);
51
+ web.insert(_el$12, () => String(row[i()] ?? ""));
52
+ return _el$12;
50
53
  })()
51
54
  }));
52
- return _el$15;
55
+ return _el$11;
53
56
  })()
54
57
  }));
55
58
  return _el$4;
@@ -58,14 +61,15 @@ const DegradedFallback = (props) => {
58
61
  return hiddenCount() > 0;
59
62
  },
60
63
  get children() {
61
- var _el$9 = web.getNextElement(_tmpl$2), _el$0 = _el$9.firstChild, _el$10 = _el$0.nextSibling, [_el$11, _co$] = web.getNextMarker(_el$10.nextSibling);
62
- _el$11.nextSibling;
63
- web.insert(_el$9, hiddenCount, _el$11, _co$);
64
+ var _el$9 = web.getNextElement(_tmpl$2);
65
+ web.insert(_el$9, () => formatString.formatMCPUIString(strings.degradedMoreRows, {
66
+ count: hiddenCount()
67
+ }));
64
68
  return _el$9;
65
69
  }
66
70
  })];
67
71
  }
68
- }), _el$13, _co$2);
72
+ }), _el$1, _co$);
69
73
  return _el$;
70
74
  })();
71
75
  };
@@ -1 +1 @@
1
- {"version":3,"file":"DegradedFallback.cjs","sources":["../../src/components/DegradedFallback.tsx"],"sourcesContent":["/**\n * DegradedFallback — the middle rung of the renderer fallback ladder\n * (audit 2026-05-30, P2.5).\n *\n * Each heavy renderer (graph / map / chart) follows the same contract:\n * 1. native render when its peer lib is available and succeeds;\n * 2. **degraded but useful** view when the native render throws — this\n * component: a visible notice + a plain data table so the user still\n * sees the underlying data instead of a blank space;\n * 3. (the caller also emits a `render:error` telemetry event).\n *\n * Pure / presentational — no peer deps, no side effects — so a render-path\n * failure in a heavy lib can never cascade into the fallback itself, and it\n * is trivially unit-testable. Rows/cells are rendered as text; callers are\n * responsible for stringifying complex cell values.\n */\n\nimport { Component, For, Show } from 'solid-js';\n\nexport interface DegradedFallbackProps {\n /** Short, human-readable reason the native render was skipped/failed. */\n message: string;\n /**\n * Column headers for the degraded data table. When omitted (or empty),\n * only the notice banner is shown.\n */\n columns?: string[];\n /** Row data — each row is an array of cells aligned to `columns`. */\n rows?: Array<Array<string | number>>;\n /**\n * Caption under the table. Defaults to a generic\n * \"interactive view unavailable\" line.\n */\n caption?: string;\n /** Max rows to render before truncating (default 50). */\n maxRows?: number;\n}\n\nexport const DegradedFallback: Component<DegradedFallbackProps> = (props) => {\n const maxRows = () => props.maxRows ?? 50;\n const allRows = () => props.rows ?? [];\n const shownRows = () => allRows().slice(0, maxRows());\n const hiddenCount = () => Math.max(0, allRows().length - shownRows().length);\n const hasTable = () => (props.columns?.length ?? 0) > 0 && allRows().length > 0;\n\n return (\n <div\n class=\"w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20\"\n role=\"alert\"\n >\n <p class=\"text-sm font-medium text-amber-900 dark:text-amber-100\">{props.message}</p>\n <p class=\"mt-0.5 text-xs text-amber-700 dark:text-amber-300\">\n {props.caption ?? 'Showing the underlying data — the interactive view is unavailable.'}\n </p>\n\n <Show when={hasTable()}>\n <div class=\"mt-2 max-h-64 overflow-auto rounded border border-amber-200 dark:border-amber-800\">\n <table class=\"w-full border-collapse text-left text-xs\">\n <thead class=\"sticky top-0 bg-amber-100 dark:bg-amber-900/40\">\n <tr>\n <For each={props.columns}>\n {(col) => (\n <th class=\"px-2 py-1 font-medium text-amber-900 dark:text-amber-100\">{col}</th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={shownRows()}>\n {(row) => (\n <tr class=\"border-t border-amber-100 dark:border-amber-800/60\">\n <For each={props.columns}>\n {(_col, i) => (\n <td class=\"px-2 py-1 text-amber-800 dark:text-amber-200\">\n {String(row[i()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"mt-1 text-[10px] text-amber-600 dark:text-amber-400\">\n +{hiddenCount()} more rows not shown.\n </p>\n </Show>\n </Show>\n </div>\n );\n};\n"],"names":["DegradedFallback","props","maxRows","allRows","rows","shownRows","slice","hiddenCount","Math","max","length","hasTable","columns","_el$","_$getNextElement","_tmpl$3","_el$2","firstChild","_el$3","nextSibling","_el$12","_el$13","_co$2","_$getNextMarker","_$insert","message","caption","_$createComponent","Show","when","children","_el$4","_tmpl$","_el$5","_el$6","_el$7","_el$8","For","each","col","_el$14","_tmpl$4","row","_el$15","_tmpl$5","_col","i","_el$16","_tmpl$6","String","_el$9","_tmpl$2","_el$0","_el$10","_el$11","_co$"],"mappings":";;;;;AAsCO,MAAMA,mBAAsDC,CAAAA,UAAU;AAC3E,QAAMC,UAAUA,MAAMD,MAAMC,WAAW;AACvC,QAAMC,UAAUA,MAAMF,MAAMG,QAAQ,CAAA;AACpC,QAAMC,YAAYA,MAAMF,QAAAA,EAAUG,MAAM,GAAGJ,SAAS;AACpD,QAAMK,cAAcA,MAAMC,KAAKC,IAAI,GAAGN,UAAUO,SAASL,UAAAA,EAAYK,MAAM;AAC3E,QAAMC,WAAWA,MAAAA;;AAAOV,yBAAMW,YAANX,mBAAeS,WAAU,KAAK,KAAKP,UAAUO,SAAS;AAAA;AAE9E,UAAA,MAAA;AAAA,QAAAG,OAAAC,IAAAA,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAG,aAAAC,SAAAF,MAAAC,aAAA,CAAAE,QAAAC,KAAA,IAAAC,IAAAA,cAAAH,OAAAD,WAAA;AAAAK,QAAAA,OAAAR,OAAA,MAKuEf,MAAMwB,OAAO;AAAAD,QAAAA,OAAAN,OAAA,MAE7EjB,MAAMyB,WAAW,oEAAoE;AAAAF,eAAAX,MAAAc,IAAAA,gBAGvFC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAElB,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAAmB,WAAA;AAAA,eAAA,EAAA,MAAA;AAAA,cAAAC,QAAAjB,IAAAA,eAAAkB,MAAA,GAAAC,QAAAF,MAAAd,YAAAiB,QAAAD,MAAAhB,YAAAkB,QAAAD,MAAAjB,YAAAmB,QAAAF,MAAAf;AAAAK,qBAAAW,OAAAR,IAAAA,gBAKXU,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAErC,MAAMW;AAAAA,YAAO;AAAA,YAAAkB,UACpBS,UAAG,MAAA;AAAA,kBAAAC,SAAA1B,IAAAA,eAAA2B,OAAA;AAAAjB,kBAAAA,OAAAgB,QACmED,GAAG;AAAA,qBAAAC;AAAAA,YAAA,GAAA;AAAA,UAAA,CAC1E,CAAA;AAAAhB,qBAAAY,OAAAT,IAAAA,gBAKJU,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAEjC,UAAAA;AAAAA,YAAW;AAAA,YAAAyB,UAClBY,UAAG,MAAA;AAAA,kBAAAC,SAAA7B,IAAAA,eAAA8B,OAAA;AAAApB,yBAAAmB,QAAAhB,IAAAA,gBAEAU,aAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAErC,MAAMW;AAAAA,gBAAO;AAAA,gBAAAkB,UACrBA,CAACe,MAAMC,OAAC,MAAA;AAAA,sBAAAC,SAAAjC,IAAAA,eAAAkC,OAAA;AAAAxB,sBAAAA,OAAAuB,QAAA,MAEJE,OAAOP,IAAII,GAAG,KAAK,EAAE,CAAC;AAAA,yBAAAC;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAE1B,CAAA;AAAA,qBAAAJ;AAAAA,YAAA,GAAA;AAAA,UAAA,CAGN,CAAA;AAAA,iBAAAZ;AAAAA,QAAA,GAAA,GAAAJ,IAAAA,gBAKRC,cAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEtB,gBAAgB;AAAA,UAAC;AAAA,UAAA,IAAAuB,WAAA;AAAA,gBAAAoB,QAAApC,IAAAA,eAAAqC,OAAA,GAAAC,QAAAF,MAAAjC,YAAAoC,SAAAD,MAAAjC,aAAA,CAAAmC,QAAAC,IAAA,IAAAhC,IAAAA,cAAA8B,OAAAlC,WAAA;AAAAmC,mBAAAnC;AAAAK,gBAAAA,OAAA0B,OAEvB3C,aAAW+C,QAAAC,IAAA;AAAA,mBAAAL;AAAAA,UAAA;AAAA,QAAA,CAAA,CAAA;AAAA,MAAA;AAAA,IAAA,CAAA,GAAA7B,QAAAC,KAAA;AAAA,WAAAT;AAAAA,EAAA,GAAA;AAMzB;;"}
1
+ {"version":3,"file":"DegradedFallback.cjs","sources":["../../src/components/DegradedFallback.tsx"],"sourcesContent":["/**\n * DegradedFallback — the middle rung of the renderer fallback ladder\n * (audit 2026-05-30, P2.5).\n *\n * Each heavy renderer (graph / map / chart) follows the same contract:\n * 1. native render when its peer lib is available and succeeds;\n * 2. **degraded but useful** view when the native render throws — this\n * component: a visible notice + a plain data table so the user still\n * sees the underlying data instead of a blank space;\n * 3. (the caller also emits a `render:error` telemetry event).\n *\n * Pure / presentational — no peer deps, no side effects — so a render-path\n * failure in a heavy lib can never cascade into the fallback itself, and it\n * is trivially unit-testable. Rows/cells are rendered as text; callers are\n * responsible for stringifying complex cell values.\n */\n\nimport { Component, For, Show } from 'solid-js';\nimport { formatMCPUIString, useMCPUIStrings } from '../context/MCPUIStringsContext';\n\nexport interface DegradedFallbackProps {\n /** Short, human-readable reason the native render was skipped/failed. */\n message: string;\n /**\n * Column headers for the degraded data table. When omitted (or empty),\n * only the notice banner is shown.\n */\n columns?: string[];\n /** Row data — each row is an array of cells aligned to `columns`. */\n rows?: Array<Array<string | number>>;\n /**\n * Caption under the table. Defaults to a generic\n * \"interactive view unavailable\" line.\n */\n caption?: string;\n /** Max rows to render before truncating (default 50). */\n maxRows?: number;\n}\n\nexport const DegradedFallback: Component<DegradedFallbackProps> = (props) => {\n const strings = useMCPUIStrings();\n const maxRows = () => props.maxRows ?? 50;\n const allRows = () => props.rows ?? [];\n const shownRows = () => allRows().slice(0, maxRows());\n const hiddenCount = () => Math.max(0, allRows().length - shownRows().length);\n const hasTable = () => (props.columns?.length ?? 0) > 0 && allRows().length > 0;\n\n return (\n <div\n class=\"w-full rounded-lg border border-amber-200 bg-amber-50 p-3 dark:border-amber-800 dark:bg-amber-900/20\"\n role=\"alert\"\n >\n <p class=\"text-sm font-medium text-amber-900 dark:text-amber-100\">{props.message}</p>\n <p class=\"mt-0.5 text-xs text-amber-700 dark:text-amber-300\">\n {props.caption ?? strings.degradedCaption}\n </p>\n\n <Show when={hasTable()}>\n <div class=\"mt-2 max-h-64 overflow-auto rounded border border-amber-200 dark:border-amber-800\">\n <table class=\"w-full border-collapse text-left text-xs\">\n <thead class=\"sticky top-0 bg-amber-100 dark:bg-amber-900/40\">\n <tr>\n <For each={props.columns}>\n {(col) => (\n <th class=\"px-2 py-1 font-medium text-amber-900 dark:text-amber-100\">{col}</th>\n )}\n </For>\n </tr>\n </thead>\n <tbody>\n <For each={shownRows()}>\n {(row) => (\n <tr class=\"border-t border-amber-100 dark:border-amber-800/60\">\n <For each={props.columns}>\n {(_col, i) => (\n <td class=\"px-2 py-1 text-amber-800 dark:text-amber-200\">\n {String(row[i()] ?? '')}\n </td>\n )}\n </For>\n </tr>\n )}\n </For>\n </tbody>\n </table>\n </div>\n <Show when={hiddenCount() > 0}>\n <p class=\"mt-1 text-[10px] text-amber-600 dark:text-amber-400\">\n {formatMCPUIString(strings.degradedMoreRows, { count: hiddenCount() })}\n </p>\n </Show>\n </Show>\n </div>\n );\n};\n"],"names":["DegradedFallback","props","strings","useMCPUIStrings","maxRows","allRows","rows","shownRows","slice","hiddenCount","Math","max","length","hasTable","columns","_el$","_$getNextElement","_tmpl$3","_el$2","firstChild","_el$3","nextSibling","_el$0","_el$1","_co$","_$getNextMarker","_$insert","message","caption","degradedCaption","_$createComponent","Show","when","children","_el$4","_tmpl$","_el$5","_el$6","_el$7","_el$8","For","each","col","_el$10","_tmpl$4","row","_el$11","_tmpl$5","_col","i","_el$12","_tmpl$6","String","_el$9","_tmpl$2","formatMCPUIString","degradedMoreRows","count"],"mappings":";;;;;;;AAuCO,MAAMA,mBAAsDC,CAAAA,UAAU;AAC3E,QAAMC,UAAUC,oBAAAA,gBAAAA;AAChB,QAAMC,UAAUA,MAAMH,MAAMG,WAAW;AACvC,QAAMC,UAAUA,MAAMJ,MAAMK,QAAQ,CAAA;AACpC,QAAMC,YAAYA,MAAMF,QAAAA,EAAUG,MAAM,GAAGJ,SAAS;AACpD,QAAMK,cAAcA,MAAMC,KAAKC,IAAI,GAAGN,UAAUO,SAASL,UAAAA,EAAYK,MAAM;AAC3E,QAAMC,WAAWA,MAAAA;;AAAOZ,yBAAMa,YAANb,mBAAeW,WAAU,KAAK,KAAKP,UAAUO,SAAS;AAAA;AAE9E,UAAA,MAAA;AAAA,QAAAG,OAAAC,IAAAA,eAAAC,OAAA,GAAAC,QAAAH,KAAAI,YAAAC,QAAAF,MAAAG,aAAAC,QAAAF,MAAAC,aAAA,CAAAE,OAAAC,IAAA,IAAAC,IAAAA,cAAAH,MAAAD,WAAA;AAAAK,QAAAA,OAAAR,OAAA,MAKuEjB,MAAM0B,OAAO;AAAAD,QAAAA,OAAAN,OAAA,MAE7EnB,MAAM2B,WAAW1B,QAAQ2B,eAAe;AAAAH,eAAAX,MAAAe,IAAAA,gBAG1CC,cAAI;AAAA,MAAA,IAACC,OAAI;AAAA,eAAEnB,SAAAA;AAAAA,MAAU;AAAA,MAAA,IAAAoB,WAAA;AAAA,eAAA,EAAA,MAAA;AAAA,cAAAC,QAAAlB,IAAAA,eAAAmB,MAAA,GAAAC,QAAAF,MAAAf,YAAAkB,QAAAD,MAAAjB,YAAAmB,QAAAD,MAAAlB,YAAAoB,QAAAF,MAAAhB;AAAAK,qBAAAY,OAAAR,IAAAA,gBAKXU,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAExC,MAAMa;AAAAA,YAAO;AAAA,YAAAmB,UACpBS,UAAG,MAAA;AAAA,kBAAAC,SAAA3B,IAAAA,eAAA4B,OAAA;AAAAlB,kBAAAA,OAAAiB,QACmED,GAAG;AAAA,qBAAAC;AAAAA,YAAA,GAAA;AAAA,UAAA,CAC1E,CAAA;AAAAjB,qBAAAa,OAAAT,IAAAA,gBAKJU,aAAG;AAAA,YAAA,IAACC,OAAI;AAAA,qBAAElC,UAAAA;AAAAA,YAAW;AAAA,YAAA0B,UAClBY,UAAG,MAAA;AAAA,kBAAAC,SAAA9B,IAAAA,eAAA+B,OAAA;AAAArB,yBAAAoB,QAAAhB,IAAAA,gBAEAU,aAAG;AAAA,gBAAA,IAACC,OAAI;AAAA,yBAAExC,MAAMa;AAAAA,gBAAO;AAAA,gBAAAmB,UACrBA,CAACe,MAAMC,OAAC,MAAA;AAAA,sBAAAC,SAAAlC,IAAAA,eAAAmC,OAAA;AAAAzB,sBAAAA,OAAAwB,QAAA,MAEJE,OAAOP,IAAII,GAAG,KAAK,EAAE,CAAC;AAAA,yBAAAC;AAAAA,gBAAA,GAAA;AAAA,cAAA,CAE1B,CAAA;AAAA,qBAAAJ;AAAAA,YAAA,GAAA;AAAA,UAAA,CAGN,CAAA;AAAA,iBAAAZ;AAAAA,QAAA,GAAA,GAAAJ,IAAAA,gBAKRC,cAAI;AAAA,UAAA,IAACC,OAAI;AAAA,mBAAEvB,gBAAgB;AAAA,UAAC;AAAA,UAAA,IAAAwB,WAAA;AAAA,gBAAAoB,QAAArC,IAAAA,eAAAsC,OAAA;AAAA5B,gBAAAA,OAAA2B,OAAA,MAExBE,+BAAkBrD,QAAQsD,kBAAkB;AAAA,cAAEC,OAAOhD,YAAAA;AAAAA,YAAY,CAAG,CAAC;AAAA,mBAAA4C;AAAAA,UAAA;AAAA,QAAA,CAAA,CAAA;AAAA,MAAA;AAAA,IAAA,CAAA,GAAA9B,OAAAC,IAAA;AAAA,WAAAT;AAAAA,EAAA,GAAA;AAMlF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"DegradedFallback.d.ts","sourceRoot":"","sources":["../../src/components/DegradedFallback.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;AAEhD,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,qBAAqB,CAsD7D,CAAC"}
1
+ {"version":3,"file":"DegradedFallback.d.ts","sourceRoot":"","sources":["../../src/components/DegradedFallback.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAa,MAAM,UAAU,CAAC;AAGhD,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC;IACrC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,eAAO,MAAM,gBAAgB,EAAE,SAAS,CAAC,qBAAqB,CAuD7D,CAAC"}