@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
@@ -2,29 +2,44 @@
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="text-xs text-amber-600 dark:text-amber-400 p-2">[DataPreviewSection] Invalid content format`), _tmpl$2 = /* @__PURE__ */ web.template(`<span class=font-medium>`), _tmpl$3 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<span><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ web.template(`<span>`), _tmpl$7 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<td class="px-3 py-2 text-gray-800 dark:text-gray-200">`);
6
- function formatNumber(value, format) {
5
+ const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
6
+ const formatString = require("../utils/format-string.cjs");
7
+ var _tmpl$ = /* @__PURE__ */ web.template(`<div class="text-xs text-amber-600 dark:text-amber-400 p-2">`), _tmpl$2 = /* @__PURE__ */ web.template(`<span class=font-medium>`), _tmpl$3 = /* @__PURE__ */ web.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__ */ web.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__ */ web.template(`<span><!$><!/><!$><!/>`), _tmpl$6 = /* @__PURE__ */ web.template(`<span>`), _tmpl$7 = /* @__PURE__ */ web.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__ */ web.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__ */ web.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__ */ web.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__ */ web.template(`<td class="px-3 py-2 text-gray-800 dark:text-gray-200">`);
8
+ function formatNumber(value, format, locale = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.locale) {
7
9
  if (typeof value !== "number" || !isFinite(value)) return String(value ?? "");
8
- if (format === "percent") return `${(value * 100).toFixed(1)}%`;
9
- if (format === "currency") return `${value.toLocaleString("fr-FR")} EUR`;
10
- if (Number.isInteger(value)) return value.toLocaleString("fr-FR");
11
- return value.toLocaleString("fr-FR", {
10
+ if (format === "percent") {
11
+ return new Intl.NumberFormat(locale, {
12
+ style: "percent",
13
+ minimumFractionDigits: 1,
14
+ maximumFractionDigits: 1,
15
+ useGrouping: false
16
+ }).format(value);
17
+ }
18
+ if (format === "currency") return `${value.toLocaleString(locale)} EUR`;
19
+ if (Number.isInteger(value)) return value.toLocaleString(locale);
20
+ return value.toLocaleString(locale, {
12
21
  maximumFractionDigits: 2
13
22
  });
14
23
  }
15
- function formatCell(value, col) {
24
+ function formatCell(value, col, locale = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.locale, zoneAware = true) {
16
25
  if (value == null) return "—";
17
- if (col.type === "number") return formatNumber(value, col.format);
26
+ if (col.type === "number") return formatNumber(value, col.format, locale);
18
27
  if (col.type === "date" && typeof value === "string") {
28
+ const date = new Date(value);
29
+ if (Number.isNaN(date.getTime())) return value;
30
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(value);
31
+ if (!dateOnly && !zoneAware) return value;
19
32
  try {
20
- return new Date(value).toLocaleDateString("fr-FR");
33
+ return date.toLocaleDateString(locale, dateOnly ? {
34
+ timeZone: "UTC"
35
+ } : void 0);
21
36
  } catch {
22
37
  return value;
23
38
  }
24
39
  }
25
40
  return String(value);
26
41
  }
27
- function compareValues(a, b, type) {
42
+ function compareValues(a, b, type, locale = MCPUIStringsContext.DEFAULT_MCPUI_STRINGS.locale) {
28
43
  if (a == null && b == null) return 0;
29
44
  if (a == null) return 1;
30
45
  if (b == null) return -1;
@@ -44,7 +59,7 @@ function compareValues(a, b, type) {
44
59
  if (isNaN(db)) return -1;
45
60
  return da - db;
46
61
  }
47
- return String(a).localeCompare(String(b), "fr", {
62
+ return String(a).localeCompare(String(b), locale, {
48
63
  sensitivity: "base"
49
64
  });
50
65
  }
@@ -86,6 +101,7 @@ function resolveContent(raw) {
86
101
  }
87
102
  function DataPreviewSection(props) {
88
103
  var _a;
104
+ const strings = MCPUIStringsContext.useMCPUIStrings();
89
105
  const content = solidJs.createMemo(() => {
90
106
  const resolved = resolveContent(props.content);
91
107
  if (!resolved) {
@@ -110,6 +126,8 @@ function DataPreviewSection(props) {
110
126
  return ((_a2 = content()) == null ? void 0 : _a2.showPageInfo) !== false;
111
127
  };
112
128
  const [page, setPage] = solidJs.createSignal(((_a = content()) == null ? void 0 : _a.initialPage) ?? 0);
129
+ const [mounted, setMounted] = solidJs.createSignal(false);
130
+ solidJs.onMount(() => setMounted(true));
113
131
  const [sortKey, setSortKey] = solidJs.createSignal(null);
114
132
  const [sortDir, setSortDir] = solidJs.createSignal(null);
115
133
  solidJs.createEffect(() => {
@@ -137,7 +155,7 @@ function DataPreviewSection(props) {
137
155
  if (!key || !dir) return r;
138
156
  const col = columns().find((c) => c.key === key);
139
157
  return [...r].sort((a, b) => {
140
- const cmp = compareValues(a[key], b[key], col == null ? void 0 : col.type);
158
+ const cmp = compareValues(a[key], b[key], col == null ? void 0 : col.type, strings.locale);
141
159
  return dir === "desc" ? -cmp : cmp;
142
160
  });
143
161
  });
@@ -172,10 +190,14 @@ function DataPreviewSection(props) {
172
190
  return content();
173
191
  },
174
192
  get fallback() {
175
- return web.getNextElement(_tmpl$);
193
+ return (() => {
194
+ var _el$ = web.getNextElement(_tmpl$);
195
+ web.insert(_el$, () => strings.previewInvalidContent);
196
+ return _el$;
197
+ })();
176
198
  },
177
199
  children: (c) => (() => {
178
- var _el$2 = web.getNextElement(_tmpl$8), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = web.getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = web.getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = web.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] = web.getNextMarker(_el$36.nextSibling), _el$38 = _el$37.nextSibling, [_el$39, _co$9] = web.getNextMarker(_el$38.nextSibling), _el$40 = _el$39.nextSibling, [_el$41, _co$0] = web.getNextMarker(_el$40.nextSibling);
200
+ var _el$2 = web.getNextElement(_tmpl$8), _el$3 = _el$2.firstChild, _el$4 = _el$3.firstChild, _el$7 = _el$4.firstChild, [_el$8, _co$] = web.getNextMarker(_el$7.nextSibling), _el$9 = _el$8.nextSibling, [_el$0, _co$2] = web.getNextMarker(_el$9.nextSibling), _el$12 = _el$4.nextSibling, [_el$13, _co$3] = web.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] = web.getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = web.getNextMarker(_el$39.nextSibling), _el$41 = _el$40.nextSibling, [_el$42, _co$0] = web.getNextMarker(_el$41.nextSibling);
179
201
  web.insert(_el$4, web.createComponent(solidJs.Show, {
180
202
  get when() {
181
203
  return c().source;
@@ -205,7 +227,11 @@ function DataPreviewSection(props) {
205
227
  _el$10.$$click = handleExportCSV;
206
228
  _el$11.$$click = handleExportJSON;
207
229
  web.effect((_p$) => {
208
- var _v$ = `Export CSV (${sortedRows().length} rows)`, _v$2 = `Export JSON (${sortedRows().length} rows)`;
230
+ var _v$ = formatString.formatMCPUIString(strings.exportCsvRows, {
231
+ count: sortedRows().length
232
+ }), _v$2 = formatString.formatMCPUIString(strings.exportJsonRows, {
233
+ count: sortedRows().length
234
+ });
209
235
  _v$ !== _p$.e && web.setAttribute(_el$10, "title", _p$.e = _v$);
210
236
  _v$2 !== _p$.t && web.setAttribute(_el$11, "title", _p$.t = _v$2);
211
237
  return _p$;
@@ -222,18 +248,20 @@ function DataPreviewSection(props) {
222
248
  return columns();
223
249
  },
224
250
  children: (col) => (() => {
225
- var _el$42 = web.getNextElement(_tmpl$9), _el$43 = _el$42.firstChild, _el$45 = _el$43.firstChild, [_el$46, _co$1] = web.getNextMarker(_el$45.nextSibling), _el$44 = _el$46.nextSibling;
226
- _el$42.$$click = () => handleSort(col.key);
227
- web.insert(_el$43, () => col.label, _el$46, _co$1);
228
- web.insert(_el$44, () => sortIndicator(col.key));
251
+ var _el$43 = web.getNextElement(_tmpl$9), _el$44 = _el$43.firstChild, _el$46 = _el$44.firstChild, [_el$47, _co$1] = web.getNextMarker(_el$46.nextSibling), _el$45 = _el$47.nextSibling;
252
+ _el$43.$$click = () => handleSort(col.key);
253
+ web.insert(_el$44, () => col.label, _el$47, _co$1);
254
+ web.insert(_el$45, () => sortIndicator(col.key));
229
255
  web.effect((_p$) => {
230
- var _v$5 = columnAlign(col), _v$6 = `Sort by ${col.label}`, _v$7 = {
256
+ var _v$7 = columnAlign(col), _v$8 = formatString.formatMCPUIString(strings.sortBy, {
257
+ column: col.label
258
+ }), _v$9 = {
231
259
  "opacity-30": sortKey() !== col.key,
232
260
  "opacity-100 text-blue-600 dark:text-blue-400": sortKey() === col.key
233
261
  };
234
- _v$5 !== _p$.e && web.setStyleProperty(_el$42, "text-align", _p$.e = _v$5);
235
- _v$6 !== _p$.t && web.setAttribute(_el$42, "title", _p$.t = _v$6);
236
- _p$.a = web.classList(_el$44, _v$7, _p$.a);
262
+ _v$7 !== _p$.e && web.setStyleProperty(_el$43, "text-align", _p$.e = _v$7);
263
+ _v$8 !== _p$.t && web.setAttribute(_el$43, "title", _p$.t = _v$8);
264
+ _p$.a = web.classList(_el$45, _v$9, _p$.a);
237
265
  return _p$;
238
266
  }, {
239
267
  e: void 0,
@@ -241,7 +269,7 @@ function DataPreviewSection(props) {
241
269
  a: void 0
242
270
  });
243
271
  web.runHydrationEvents();
244
- return _el$42;
272
+ return _el$43;
245
273
  })()
246
274
  }));
247
275
  web.insert(_el$18, web.createComponent(solidJs.For, {
@@ -249,22 +277,22 @@ function DataPreviewSection(props) {
249
277
  return visibleRows();
250
278
  },
251
279
  children: (row, i) => (() => {
252
- var _el$47 = web.getNextElement(_tmpl$0);
253
- web.insert(_el$47, web.createComponent(solidJs.For, {
280
+ var _el$48 = web.getNextElement(_tmpl$0);
281
+ web.insert(_el$48, web.createComponent(solidJs.For, {
254
282
  get each() {
255
283
  return columns();
256
284
  },
257
285
  children: (col) => (() => {
258
- var _el$48 = web.getNextElement(_tmpl$1);
259
- web.insert(_el$48, () => formatCell(row[col.key], col));
260
- web.effect((_$p) => web.setStyleProperty(_el$48, "text-align", columnAlign(col)));
261
- return _el$48;
286
+ var _el$49 = web.getNextElement(_tmpl$1);
287
+ web.insert(_el$49, () => formatCell(row[col.key], col, strings.locale, mounted()));
288
+ web.effect((_$p) => web.setStyleProperty(_el$49, "text-align", columnAlign(col)));
289
+ return _el$49;
262
290
  })()
263
291
  }));
264
- web.effect((_$p) => web.classList(_el$47, {
292
+ web.effect((_$p) => web.classList(_el$48, {
265
293
  "bg-gray-25 dark:bg-gray-850": i() % 2 === 1
266
294
  }, _$p));
267
- return _el$47;
295
+ return _el$48;
268
296
  })()
269
297
  }));
270
298
  web.insert(_el$19, web.createComponent(solidJs.Show, {
@@ -275,15 +303,25 @@ function DataPreviewSection(props) {
275
303
  var _el$20 = web.getNextElement(_tmpl$5), _el$21 = _el$20.firstChild, [_el$22, _co$4] = web.getNextMarker(_el$21.nextSibling), _el$23 = _el$22.nextSibling, [_el$24, _co$5] = web.getNextMarker(_el$23.nextSibling);
276
304
  web.insert(_el$20, (() => {
277
305
  var _c$ = web.memo(() => !!isPaginated());
278
- return () => _c$() ? `Showing ${rangeStart()}–${rangeEnd()} of ${sortedRows().length.toLocaleString("fr-FR")}` : `${sortedRows().length} row${sortedRows().length !== 1 ? "s" : ""}`;
306
+ return () => _c$() ? formatString.formatMCPUIString(strings.previewShowingRange, {
307
+ start: rangeStart().toLocaleString(strings.locale),
308
+ end: rangeEnd().toLocaleString(strings.locale),
309
+ // `strings.locale` formats the count, so the chrome
310
+ // string and the digits agree (and SSR matches the client).
311
+ total: sortedRows().length.toLocaleString(strings.locale)
312
+ }) : formatString.formatMCPUIString(sortedRows().length === 1 ? strings.previewRowsOne : strings.previewRowsMany, {
313
+ count: sortedRows().length.toLocaleString(strings.locale)
314
+ });
279
315
  })(), _el$22, _co$4);
280
316
  web.insert(_el$20, (() => {
281
317
  var _c$2 = web.memo(() => !!(c().totalRows && c().totalRows > sortedRows().length));
282
- return () => _c$2() ? ` (${c().totalRows.toLocaleString("fr-FR")} total)` : "";
318
+ return () => _c$2() ? formatString.formatMCPUIString(strings.previewTotalSuffix, {
319
+ total: c().totalRows.toLocaleString(strings.locale)
320
+ }) : "";
283
321
  })(), _el$24, _co$5);
284
322
  return _el$20;
285
323
  }
286
- }), _el$37, _co$8);
324
+ }), _el$38, _co$8);
287
325
  web.insert(_el$19, web.createComponent(solidJs.Show, {
288
326
  get when() {
289
327
  return !showPageInfo();
@@ -291,30 +329,39 @@ function DataPreviewSection(props) {
291
329
  get children() {
292
330
  return web.getNextElement(_tmpl$6);
293
331
  }
294
- }), _el$39, _co$9);
332
+ }), _el$40, _co$9);
295
333
  web.insert(_el$19, web.createComponent(solidJs.Show, {
296
334
  get when() {
297
335
  return isPaginated();
298
336
  },
299
337
  get children() {
300
- var _el$26 = web.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] = web.getNextMarker(_el$31.nextSibling), _el$30 = _el$32.nextSibling, _el$33 = _el$30.nextSibling, [_el$34, _co$7] = web.getNextMarker(_el$33.nextSibling), _el$35 = _el$28.nextSibling;
338
+ var _el$26 = web.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] = web.getNextMarker(_el$30.nextSibling), _el$32 = _el$27.nextSibling, _el$33 = _el$32.nextSibling, _el$35 = _el$33.firstChild, [_el$36, _co$7] = web.getNextMarker(_el$35.nextSibling);
339
+ _el$36.nextSibling;
301
340
  _el$27.$$click = () => setPage((p) => p - 1);
302
- web.insert(_el$28, () => page() + 1, _el$32, _co$6);
303
- web.insert(_el$28, totalPages, _el$34, _co$7);
304
- _el$35.$$click = () => setPage((p) => p + 1);
341
+ web.insert(_el$27, () => strings.previewPrev, _el$31, _co$6);
342
+ web.insert(_el$32, () => formatString.formatMCPUIString(strings.previewPageIndicator, {
343
+ page: page() + 1,
344
+ total: totalPages()
345
+ }));
346
+ _el$33.$$click = () => setPage((p) => p + 1);
347
+ web.insert(_el$33, () => strings.previewNext, _el$36, _co$7);
305
348
  web.effect((_p$) => {
306
- var _v$3 = page() === 0, _v$4 = page() >= totalPages() - 1;
349
+ var _v$3 = page() === 0, _v$4 = strings.paginationPrevious, _v$5 = page() >= totalPages() - 1, _v$6 = strings.paginationNext;
307
350
  _v$3 !== _p$.e && web.setProperty(_el$27, "disabled", _p$.e = _v$3);
308
- _v$4 !== _p$.t && web.setProperty(_el$35, "disabled", _p$.t = _v$4);
351
+ _v$4 !== _p$.t && web.setAttribute(_el$27, "aria-label", _p$.t = _v$4);
352
+ _v$5 !== _p$.a && web.setProperty(_el$33, "disabled", _p$.a = _v$5);
353
+ _v$6 !== _p$.o && web.setAttribute(_el$33, "aria-label", _p$.o = _v$6);
309
354
  return _p$;
310
355
  }, {
311
356
  e: void 0,
312
- t: void 0
357
+ t: void 0,
358
+ a: void 0,
359
+ o: void 0
313
360
  });
314
361
  web.runHydrationEvents();
315
362
  return _el$26;
316
363
  }
317
- }), _el$41, _co$0);
364
+ }), _el$42, _co$0);
318
365
  return _el$2;
319
366
  })()
320
367
  });
@@ -1 +1 @@
1
- {"version":3,"file":"DataPreviewSection.cjs","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.cjs","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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"DataPreviewSection.d.ts","sourceRoot":"","sources":["../../src/components/DataPreviewSection.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAA;AAE9E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AA0FD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,kCAyNhE"}
1
+ {"version":3,"file":"DataPreviewSection.d.ts","sourceRoot":"","sources":["../../src/components/DataPreviewSection.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,mBAAmB,CAAA;AAO9E,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,kBAAkB,CAAA;CAC5B;AAgID,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,kCAgPhE"}