@seed-ship/mcp-ui-solid 6.23.0 → 6.25.1

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 (172) hide show
  1. package/CHANGELOG.md +167 -0
  2. package/README.md +154 -2
  3. package/dist/components/ActionGroupRenderer.cjs +6 -6
  4. package/dist/components/ActionGroupRenderer.cjs.map +1 -1
  5. package/dist/components/ActionGroupRenderer.js +6 -6
  6. package/dist/components/ActionGroupRenderer.js.map +1 -1
  7. package/dist/components/AutocompleteDropdown.cjs +6 -6
  8. package/dist/components/AutocompleteDropdown.cjs.map +1 -1
  9. package/dist/components/AutocompleteDropdown.js +6 -6
  10. package/dist/components/AutocompleteDropdown.js.map +1 -1
  11. package/dist/components/AutocompleteFormField.cjs +6 -5
  12. package/dist/components/AutocompleteFormField.cjs.map +1 -1
  13. package/dist/components/AutocompleteFormField.d.ts.map +1 -1
  14. package/dist/components/AutocompleteFormField.js +6 -5
  15. package/dist/components/AutocompleteFormField.js.map +1 -1
  16. package/dist/components/ChartJSRenderer.cjs +406 -70
  17. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  18. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  19. package/dist/components/ChartJSRenderer.js +407 -71
  20. package/dist/components/ChartJSRenderer.js.map +1 -1
  21. package/dist/components/ChatPrompt.cjs +5 -5
  22. package/dist/components/ChatPrompt.cjs.map +1 -1
  23. package/dist/components/ChatPrompt.js +5 -5
  24. package/dist/components/ChatPrompt.js.map +1 -1
  25. package/dist/components/ComponentToolbar.cjs +5 -5
  26. package/dist/components/ComponentToolbar.cjs.map +1 -1
  27. package/dist/components/ComponentToolbar.js +5 -5
  28. package/dist/components/ComponentToolbar.js.map +1 -1
  29. package/dist/components/DegradedFallback.cjs +35 -3
  30. package/dist/components/DegradedFallback.cjs.map +1 -1
  31. package/dist/components/DegradedFallback.d.ts +7 -0
  32. package/dist/components/DegradedFallback.d.ts.map +1 -1
  33. package/dist/components/DegradedFallback.js +35 -3
  34. package/dist/components/DegradedFallback.js.map +1 -1
  35. package/dist/components/ExpandableWrapper.cjs +10 -7
  36. package/dist/components/ExpandableWrapper.cjs.map +1 -1
  37. package/dist/components/ExpandableWrapper.d.ts.map +1 -1
  38. package/dist/components/ExpandableWrapper.js +10 -7
  39. package/dist/components/ExpandableWrapper.js.map +1 -1
  40. package/dist/components/FormFieldRenderer.cjs +13 -12
  41. package/dist/components/FormFieldRenderer.cjs.map +1 -1
  42. package/dist/components/FormFieldRenderer.d.ts.map +1 -1
  43. package/dist/components/FormFieldRenderer.js +13 -12
  44. package/dist/components/FormFieldRenderer.js.map +1 -1
  45. package/dist/components/FormRenderer.cjs +1 -1
  46. package/dist/components/FormRenderer.cjs.map +1 -1
  47. package/dist/components/FormRenderer.js +1 -1
  48. package/dist/components/FormRenderer.js.map +1 -1
  49. package/dist/components/GenerativeUIErrorBoundary.cjs +1 -1
  50. package/dist/components/GenerativeUIErrorBoundary.cjs.map +1 -1
  51. package/dist/components/GenerativeUIErrorBoundary.js +1 -1
  52. package/dist/components/GenerativeUIErrorBoundary.js.map +1 -1
  53. package/dist/components/GhostText.cjs +2 -2
  54. package/dist/components/GhostText.cjs.map +1 -1
  55. package/dist/components/GhostText.js +2 -2
  56. package/dist/components/GhostText.js.map +1 -1
  57. package/dist/components/GraphRenderer.cjs +100 -29
  58. package/dist/components/GraphRenderer.cjs.map +1 -1
  59. package/dist/components/GraphRenderer.d.ts +1 -1
  60. package/dist/components/GraphRenderer.d.ts.map +1 -1
  61. package/dist/components/GraphRenderer.js +100 -29
  62. package/dist/components/GraphRenderer.js.map +1 -1
  63. package/dist/components/MissingValue.cjs +43 -0
  64. package/dist/components/MissingValue.cjs.map +1 -0
  65. package/dist/components/MissingValue.d.ts +27 -0
  66. package/dist/components/MissingValue.d.ts.map +1 -0
  67. package/dist/components/MissingValue.js +43 -0
  68. package/dist/components/MissingValue.js.map +1 -0
  69. package/dist/components/ModalRenderer.cjs +39 -31
  70. package/dist/components/ModalRenderer.cjs.map +1 -1
  71. package/dist/components/ModalRenderer.d.ts.map +1 -1
  72. package/dist/components/ModalRenderer.js +40 -32
  73. package/dist/components/ModalRenderer.js.map +1 -1
  74. package/dist/components/PortalDropdownMenu.cjs +6 -3
  75. package/dist/components/PortalDropdownMenu.cjs.map +1 -1
  76. package/dist/components/PortalDropdownMenu.d.ts.map +1 -1
  77. package/dist/components/PortalDropdownMenu.js +7 -4
  78. package/dist/components/PortalDropdownMenu.js.map +1 -1
  79. package/dist/components/ScratchpadPanel.cjs +38 -44
  80. package/dist/components/ScratchpadPanel.cjs.map +1 -1
  81. package/dist/components/ScratchpadPanel.d.ts.map +1 -1
  82. package/dist/components/ScratchpadPanel.js +38 -44
  83. package/dist/components/ScratchpadPanel.js.map +1 -1
  84. package/dist/components/UIResourceRenderer.cjs +255 -217
  85. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  86. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  87. package/dist/components/UIResourceRenderer.js +255 -217
  88. package/dist/components/UIResourceRenderer.js.map +1 -1
  89. package/dist/components/chart-data-table.cjs +30 -5
  90. package/dist/components/chart-data-table.cjs.map +1 -1
  91. package/dist/components/chart-data-table.d.ts +18 -1
  92. package/dist/components/chart-data-table.d.ts.map +1 -1
  93. package/dist/components/chart-data-table.js +30 -5
  94. package/dist/components/chart-data-table.js.map +1 -1
  95. package/dist/components/chart-missing-plugin.cjs +194 -0
  96. package/dist/components/chart-missing-plugin.cjs.map +1 -0
  97. package/dist/components/chart-missing-plugin.d.ts +129 -0
  98. package/dist/components/chart-missing-plugin.d.ts.map +1 -0
  99. package/dist/components/chart-missing-plugin.js +194 -0
  100. package/dist/components/chart-missing-plugin.js.map +1 -0
  101. package/dist/context/MCPUIStringsContext.cjs +12 -1
  102. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  103. package/dist/context/MCPUIStringsContext.d.ts +62 -0
  104. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  105. package/dist/context/MCPUIStringsContext.js +12 -1
  106. package/dist/context/MCPUIStringsContext.js.map +1 -1
  107. package/dist/services/component-registry.cjs +9 -2
  108. package/dist/services/component-registry.cjs.map +1 -1
  109. package/dist/services/component-registry.d.ts.map +1 -1
  110. package/dist/services/component-registry.js +9 -2
  111. package/dist/services/component-registry.js.map +1 -1
  112. package/dist/services/validation.cjs +31 -8
  113. package/dist/services/validation.cjs.map +1 -1
  114. package/dist/services/validation.d.ts.map +1 -1
  115. package/dist/services/validation.js +31 -8
  116. package/dist/services/validation.js.map +1 -1
  117. package/dist/types/index.d.ts +14 -2
  118. package/dist/types/index.d.ts.map +1 -1
  119. package/dist/utils/degraded-projections.cjs +19 -3
  120. package/dist/utils/degraded-projections.cjs.map +1 -1
  121. package/dist/utils/degraded-projections.d.ts +22 -2
  122. package/dist/utils/degraded-projections.d.ts.map +1 -1
  123. package/dist/utils/degraded-projections.js +19 -3
  124. package/dist/utils/degraded-projections.js.map +1 -1
  125. package/dist/utils/math-markdown.cjs +1 -1
  126. package/dist/utils/math-markdown.cjs.map +1 -1
  127. package/dist/utils/math-markdown.js +1 -1
  128. package/dist/utils/math-markdown.js.map +1 -1
  129. package/dist/utils/missing-value.cjs +60 -0
  130. package/dist/utils/missing-value.cjs.map +1 -0
  131. package/dist/utils/missing-value.d.ts +79 -0
  132. package/dist/utils/missing-value.d.ts.map +1 -0
  133. package/dist/utils/missing-value.js +60 -0
  134. package/dist/utils/missing-value.js.map +1 -0
  135. package/dist/utils/theme.cjs +91 -0
  136. package/dist/utils/theme.cjs.map +1 -0
  137. package/dist/utils/theme.d.ts +11 -0
  138. package/dist/utils/theme.d.ts.map +1 -0
  139. package/dist/utils/theme.js +91 -0
  140. package/dist/utils/theme.js.map +1 -0
  141. package/docs/SECURITY-DEPENDENCIES.md +81 -0
  142. package/docs/THEMING.md +205 -0
  143. package/package.json +7 -5
  144. package/src/components/ActionGroupRenderer.tsx +6 -6
  145. package/src/components/AutocompleteDropdown.tsx +17 -17
  146. package/src/components/AutocompleteFormField.tsx +10 -9
  147. package/src/components/ChartJSRenderer.tsx +609 -212
  148. package/src/components/ChatPrompt.tsx +16 -16
  149. package/src/components/ComponentToolbar.tsx +5 -5
  150. package/src/components/DegradedFallback.tsx +33 -11
  151. package/src/components/ExpandableWrapper.tsx +15 -11
  152. package/src/components/FormFieldRenderer.tsx +52 -51
  153. package/src/components/FormRenderer.tsx +12 -12
  154. package/src/components/GenerativeUIErrorBoundary.tsx +6 -6
  155. package/src/components/GhostText.tsx +7 -7
  156. package/src/components/GraphRenderer.tsx +83 -67
  157. package/src/components/MissingValue.tsx +61 -0
  158. package/src/components/ModalRenderer.tsx +11 -5
  159. package/src/components/PortalDropdownMenu.tsx +6 -2
  160. package/src/components/ScratchpadPanel.tsx +144 -141
  161. package/src/components/UIResourceRenderer.tsx +143 -110
  162. package/src/components/chart-data-table.ts +50 -6
  163. package/src/components/chart-missing-plugin.ts +336 -0
  164. package/src/context/MCPUIStringsContext.tsx +76 -0
  165. package/src/services/component-registry.ts +10 -2
  166. package/src/services/validation.ts +44 -9
  167. package/src/styles/autocomplete.css +53 -53
  168. package/src/types/index.ts +13 -1
  169. package/src/utils/degraded-projections.ts +44 -4
  170. package/src/utils/math-markdown.ts +1 -1
  171. package/src/utils/missing-value.ts +127 -0
  172. package/src/utils/theme.ts +101 -0
@@ -26,12 +26,188 @@ const web = require("solid-js/web");
26
26
  const solidJs = require("solid-js");
27
27
  const ExpandableWrapper = require("./ExpandableWrapper.cjs");
28
28
  const DegradedFallback = require("./DegradedFallback.cjs");
29
+ const MissingValue = require("./MissingValue.cjs");
29
30
  const chartDataTable = require("./chart-data-table.cjs");
31
+ const chartMissingPlugin = require("./chart-missing-plugin.cjs");
32
+ const missingValue = require("../utils/missing-value.cjs");
30
33
  const MCPUITelemetryContext = require("../context/MCPUITelemetryContext.cjs");
31
34
  const MCPUIConfigContext = require("../context/MCPUIConfigContext.cjs");
32
35
  const MCPUIStringsContext = require("../context/MCPUIStringsContext.cjs");
36
+ const theme = require("../utils/theme.cjs");
33
37
  const formatString = require("../utils/format-string.cjs");
34
- var _tmpl$ = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ web.template(`<button type=button class="opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class="inline-flex items-center gap-1"><button type=button class="opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM13.5 10.5h-6"></path></svg></button><button type=button class="opacity-60 hover:opacity-100 px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6"></path></svg></button><!$><!/>`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button class="opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-600 rounded-full hover:bg-gray-100 dark:hover:bg-gray-700 transition-all shadow-sm"><svg class="w-3 h-3 text-gray-500 dark:text-gray-400"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z">`), _tmpl$5 = /* @__PURE__ */ web.template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$6 = /* @__PURE__ */ web.template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">`), _tmpl$8 = /* @__PURE__ */ web.template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/>`), _tmpl$9 = /* @__PURE__ */ web.template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$0 = /* @__PURE__ */ web.template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$1 = /* @__PURE__ */ web.template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
38
+ var _tmpl$ = /* @__PURE__ */ web.template(`<h3 class="text-sm font-semibold text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-white,#fff))]">`), _tmpl$2 = /* @__PURE__ */ web.template(`<button type=button class="opacity-60 hover:opacity-100 px-2 py-1 bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded-full hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))] transition-all shadow-[var(--mcp-ui-shadow,var(--shadow-sm))]"><svg class="w-3 h-3 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15">`), _tmpl$3 = /* @__PURE__ */ web.template(`<div class="inline-flex items-center gap-1"><button type=button class="opacity-60 hover:opacity-100 px-2 py-1 bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded-full hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))] transition-all shadow-[var(--mcp-ui-shadow,var(--shadow-sm))]"><svg class="w-3 h-3 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM13.5 10.5h-6"></path></svg></button><button type=button class="opacity-60 hover:opacity-100 px-2 py-1 bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded-full hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))] transition-all shadow-[var(--mcp-ui-shadow,var(--shadow-sm))]"><svg class="w-3 h-3 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6"></path></svg></button><!$><!/>`), _tmpl$4 = /* @__PURE__ */ web.template(`<button type=button class="opacity-0 group-hover:opacity-60 hover:!opacity-100 disabled:!opacity-30 disabled:cursor-not-allowed px-2 py-1 bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))] rounded-full hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))] transition-all shadow-[var(--mcp-ui-shadow,var(--shadow-sm))]"><svg class="w-3 h-3 text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]"fill=none viewBox="0 0 24 24"stroke=currentColor><path stroke-linecap=round stroke-linejoin=round stroke-width=2 d="M12 10v6m0 0l-3-3m3 3l3-3m2 8H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z">`), _tmpl$5 = /* @__PURE__ */ web.template(`<tr><td class="px-3 py-6 text-center text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">`), _tmpl$6 = /* @__PURE__ */ web.template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-[color:var(--mcp-ui-surface-muted,var(--color-gray-50,#f9fafb))] dark:bg-[color:var(--mcp-ui-surface,color-mix(in_oklab,var(--color-gray-900,#111827)_40%,transparent))]"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$7 = /* @__PURE__ */ web.template(`<div class="absolute inset-0 flex items-center justify-center bg-[color:var(--mcp-ui-surface,color-mix(in_oklab,var(--color-white,#fff)_80%,transparent))] dark:bg-[color:var(--mcp-ui-surface,color-mix(in_oklab,var(--color-gray-800,#1f2937)_80%,transparent))]"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-[color:var(--mcp-ui-accent-border,var(--color-blue-600))]"></div><span class="text-sm text-[color:var(--mcp-ui-fg-muted,var(--color-gray-500,#6b7280))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]">`), _tmpl$8 = /* @__PURE__ */ web.template(`<p>`), _tmpl$9 = /* @__PURE__ */ web.template(`<p data-mcp-chart-note=no-data>`), _tmpl$0 = /* @__PURE__ */ web.template(`<div data-mcp-chart-notes class="mt-2 space-y-0.5 text-xs text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] dark:text-[color:var(--mcp-ui-fg-subtle,var(--color-gray-400,#9ca3af))]"><!$><!/><!$><!/>`), _tmpl$1 = /* @__PURE__ */ web.template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] p-0.5 dark:border-[color:var(--mcp-ui-border,var(--color-gray-600,#4b5563))]"role=group><button type=button></button><button type=button></button></div><!$><!/><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/></div><!$><!/>`), _tmpl$10 = /* @__PURE__ */ web.template(`<th scope=col class="px-3 py-2 font-medium text-[color:var(--mcp-ui-fg,var(--color-gray-900,#111827))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-100,#f3f4f6))]">`), _tmpl$11 = /* @__PURE__ */ web.template(`<tr class="border-t border-[color:var(--mcp-ui-border,var(--color-gray-100,#f3f4f6))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))]">`), _tmpl$12 = /* @__PURE__ */ web.template(`<td class="px-3 py-2 text-[color:var(--mcp-ui-fg,var(--color-gray-700,#374151))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))]">`);
39
+ const CHART_THEME_TOKENS = [...Array.from({
40
+ length: 8
41
+ }, (_, i) => `--mcp-ui-chart-${i + 1}`), "--mcp-ui-chart-grid", "--mcp-ui-chart-axis", "--mcp-ui-chart-label", "--mcp-ui-surface", "--mcp-ui-fg", "--mcp-ui-border"];
42
+ function createChartTheme(params, baseOptions, root, chartConfig) {
43
+ let tokens = theme.readThemeTokens(root, CHART_THEME_TOKENS);
44
+ const originalDatasets = params.data.datasets.map((dataset) => ({
45
+ ...dataset
46
+ }));
47
+ let engineColors;
48
+ const sharedPaintOptions = /* @__PURE__ */ new WeakMap();
49
+ const paths = [{
50
+ path: ["plugins", "legend", "labels", "color"],
51
+ token: "--mcp-ui-chart-label"
52
+ }, {
53
+ path: ["plugins", "tooltip", "backgroundColor"],
54
+ token: "--mcp-ui-surface"
55
+ }, {
56
+ path: ["plugins", "tooltip", "titleColor"],
57
+ token: "--mcp-ui-fg"
58
+ }, {
59
+ path: ["plugins", "tooltip", "bodyColor"],
60
+ token: "--mcp-ui-fg"
61
+ }, {
62
+ path: ["plugins", "tooltip", "footerColor"],
63
+ token: "--mcp-ui-fg"
64
+ }, {
65
+ path: ["plugins", "tooltip", "borderColor"],
66
+ token: "--mcp-ui-border"
67
+ }];
68
+ const configuredScales = Object.keys(baseOptions.scales ?? {});
69
+ const scales = configuredScales.length ? configuredScales : params.type === "radar" || params.type === "polarArea" ? ["r"] : params.type === "pie" || params.type === "doughnut" ? [] : ["x", "y"];
70
+ const knownScales = /* @__PURE__ */ new Set();
71
+ const addScalePaths = (names) => {
72
+ for (const scale of names) {
73
+ if (knownScales.has(scale)) continue;
74
+ knownScales.add(scale);
75
+ for (const [part, token] of [["grid", "--mcp-ui-chart-grid"], ["border", "--mcp-ui-chart-axis"], ["ticks", "--mcp-ui-chart-label"], ["title", "--mcp-ui-chart-label"], ...scale === "r" ? [["angleLines", "--mcp-ui-chart-grid"], ["pointLabels", "--mcp-ui-chart-label"]] : []]) paths.push({
76
+ path: ["scales", scale, part, "color"],
77
+ token
78
+ });
79
+ }
80
+ };
81
+ addScalePaths(scales);
82
+ const read = (value, path) => path.reduce((part, key) => part == null ? void 0 : part[key], value);
83
+ const owned = /* @__PURE__ */ new Set();
84
+ const applyOptions = (options) => {
85
+ var _a;
86
+ for (const {
87
+ path,
88
+ token
89
+ } of paths) {
90
+ if (read(baseOptions, path) !== void 0) continue;
91
+ if (token === "--mcp-ui-chart-label" && ((_a = params.options) == null ? void 0 : _a.color) !== void 0) continue;
92
+ let blocked = false;
93
+ for (let i = 1; i < path.length; i++) {
94
+ const part = read(baseOptions, path.slice(0, i));
95
+ if (part === false || part === null) blocked = true;
96
+ }
97
+ if (blocked) continue;
98
+ const key = path.join(".");
99
+ const color = tokens[token];
100
+ if (!color && !owned.has(key)) continue;
101
+ let target = options;
102
+ for (const part of path.slice(0, -1)) {
103
+ target[part] = {
104
+ ...target[part]
105
+ };
106
+ target = target[part];
107
+ }
108
+ if (color) {
109
+ target[path.at(-1)] = color;
110
+ owned.add(key);
111
+ } else {
112
+ delete target[path.at(-1)];
113
+ owned.delete(key);
114
+ }
115
+ }
116
+ };
117
+ const plugin = {
118
+ id: "mcp-ui-theme",
119
+ beforeInit(chart) {
120
+ addScalePaths(Object.keys(chart.config.options.scales ?? {}));
121
+ applyOptions(chart.config.options);
122
+ },
123
+ // Global Colors runs first. Capture its actual output rather than copying
124
+ // a version-specific 7-color palette (or changing its opt-out semantics).
125
+ beforeLayout(chart) {
126
+ const datasets = chart.data.datasets;
127
+ engineColors ?? (engineColors = datasets.map((dataset) => ({
128
+ backgroundColor: Array.isArray(dataset.backgroundColor) ? [...dataset.backgroundColor] : dataset.backgroundColor,
129
+ borderColor: Array.isArray(dataset.borderColor) ? [...dataset.borderColor] : dataset.borderColor
130
+ })));
131
+ const callerOptions = params.options;
132
+ let pointOffset = 0;
133
+ datasets.forEach((dataset, index) => {
134
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
135
+ const original = originalDatasets[index];
136
+ const baseline = engineColors[index];
137
+ if (!original || !baseline) return;
138
+ const datasetType = original.type ?? params.type;
139
+ const perPoint = ["pie", "doughnut", "polarArea"].includes(datasetType);
140
+ const lineWithPoints = datasetType === "line" || datasetType === "radar";
141
+ const elementKinds = datasetType === "bar" ? ["bar"] : perPoint ? ["arc"] : lineWithPoints ? ["line"] : ["point"];
142
+ const hasSeriesToken = perPoint ? dataset.data.some((_, i) => tokens[`--mcp-ui-chart-${(pointOffset + i) % 8 + 1}`]) : Boolean(tokens[`--mcp-ui-chart-${index % 8 + 1}`]);
143
+ for (const field of ["backgroundColor", "borderColor"]) {
144
+ if (original[field] !== void 0) continue;
145
+ const callerDatasetColor = (_b = (_a = callerOptions == null ? void 0 : callerOptions.datasets) == null ? void 0 : _a[datasetType]) == null ? void 0 : _b[field];
146
+ if (callerDatasetColor !== void 0) {
147
+ const color = hasSeriesToken ? callerDatasetColor : baseline[field];
148
+ if (color !== void 0) dataset[field] = color;
149
+ else delete dataset[field];
150
+ continue;
151
+ }
152
+ if ((callerOptions == null ? void 0 : callerOptions[field]) !== void 0 || elementKinds.some((kind) => {
153
+ var _a2, _b2;
154
+ return ((_b2 = (_a2 = callerOptions == null ? void 0 : callerOptions.elements) == null ? void 0 : _a2[kind]) == null ? void 0 : _b2[field]) !== void 0;
155
+ })) continue;
156
+ if (lineWithPoints && hasSeriesToken) {
157
+ const pointField = field === "borderColor" ? "pointBorderColor" : "pointBackgroundColor";
158
+ const scopedPointPaint = (_f = (_e = (_d = (_c = callerOptions == null ? void 0 : callerOptions.datasets) == null ? void 0 : _c[datasetType]) == null ? void 0 : _d.elements) == null ? void 0 : _e.point) == null ? void 0 : _f[field];
159
+ const pointPaint = scopedPointPaint !== void 0 ? scopedPointPaint : (_h = (_g = callerOptions == null ? void 0 : callerOptions.elements) == null ? void 0 : _g.point) == null ? void 0 : _h[field];
160
+ if (original[pointField] === void 0 && ((_j = (_i = callerOptions == null ? void 0 : callerOptions.datasets) == null ? void 0 : _i[datasetType]) == null ? void 0 : _j[pointField]) === void 0 && (callerOptions == null ? void 0 : callerOptions[pointField]) === void 0 && pointPaint !== void 0) {
161
+ dataset[pointField] = pointPaint;
162
+ }
163
+ }
164
+ if (perPoint && field === "borderColor") continue;
165
+ if (perPoint) {
166
+ const previous = baseline[field];
167
+ const colors = dataset.data.map((_, i) => tokens[`--mcp-ui-chart-${(pointOffset + i) % 8 + 1}`] ?? (Array.isArray(previous) ? previous[i % previous.length] : previous));
168
+ dataset[field] = colors.some((_, i) => tokens[`--mcp-ui-chart-${(pointOffset + i) % 8 + 1}`]) ? colors : previous;
169
+ } else {
170
+ const color = tokens[`--mcp-ui-chart-${index % 8 + 1}`];
171
+ if (color || baseline[field] !== void 0) dataset[field] = color ?? baseline[field];
172
+ else delete dataset[field];
173
+ }
174
+ }
175
+ if (perPoint) pointOffset += dataset.data.length;
176
+ });
177
+ },
178
+ afterDatasetUpdate(_chart, args) {
179
+ var _a, _b;
180
+ const meta = args.meta;
181
+ if (!((_a = meta == null ? void 0 : meta.data) == null ? void 0 : _a.length) || typeof ((_b = meta.controller) == null ? void 0 : _b.getStyle) !== "function") return;
182
+ const index = meta.data.findIndex((element) => {
183
+ var _a2;
184
+ return ((_a2 = element.options) == null ? void 0 : _a2.$shared) && !element.active;
185
+ });
186
+ if (index >= 0 && !Object.isFrozen(meta.data[index].options)) {
187
+ sharedPaintOptions.set(meta.controller, meta.data[index].options);
188
+ }
189
+ if (args.mode !== "none") return;
190
+ const shared = sharedPaintOptions.get(meta.controller);
191
+ if (!shared) return;
192
+ const resolved = meta.controller.getStyle(index >= 0 ? index : 0, false);
193
+ if (!resolved.$shared) return;
194
+ shared.backgroundColor = resolved.backgroundColor;
195
+ shared.borderColor = resolved.borderColor;
196
+ }
197
+ };
198
+ chartConfig.plugins = [...chartConfig.plugins ?? [], plugin];
199
+ return {
200
+ applyOptions,
201
+ refresh(chart) {
202
+ const next = theme.readThemeTokens(root, CHART_THEME_TOKENS);
203
+ if (CHART_THEME_TOKENS.every((name) => next[name] === tokens[name])) return;
204
+ tokens = next;
205
+ addScalePaths(Object.keys(chart.scales ?? chart.config.options.scales ?? {}));
206
+ applyOptions(chart.config.options);
207
+ chart.update("none");
208
+ }
209
+ };
210
+ }
35
211
  let ChartJS = null;
36
212
  let chartJSLoadPromise = null;
37
213
  const loadChartJS = async () => {
@@ -122,8 +298,18 @@ const ChartJSRenderer = (props) => {
122
298
  const [zoomPlugin, setZoomPlugin] = solidJs.createSignal(null);
123
299
  const [isZoomed, setIsZoomed] = solidJs.createSignal(false);
124
300
  let canvasRef;
301
+ let themeRoot;
125
302
  let chartInstance;
303
+ let chartTheme;
126
304
  let renderVersion = 0;
305
+ solidJs.onMount(() => {
306
+ if (themeRoot) {
307
+ const stop = theme.observeTheme(themeRoot, () => {
308
+ if (chartInstance) chartTheme == null ? void 0 : chartTheme.refresh(chartInstance);
309
+ });
310
+ solidJs.onCleanup(stop);
311
+ }
312
+ });
127
313
  const params = () => props.component.params;
128
314
  const telemetry = MCPUITelemetryContext.useTelemetry();
129
315
  const config = MCPUIConfigContext.useMCPUIConfig();
@@ -132,9 +318,33 @@ const ChartJSRenderer = (props) => {
132
318
  series: strings.chartTableSeries,
133
319
  point: strings.chartTablePoint,
134
320
  label: strings.degradedColLabel,
135
- seriesName: strings.degradedSeries
321
+ seriesName: strings.degradedSeries,
322
+ withUnit: strings.chartLabelWithUnit
136
323
  }));
324
+ const missingSummary = solidJs.createMemo(() => missingValue.summarizeChartMissing(params()));
325
+ const unit = () => {
326
+ const value = params().unit;
327
+ return typeof value === "string" && value !== "" ? value : void 0;
328
+ };
329
+ const anyMissingCell = () => tableData().missing.some((row) => row.some(Boolean));
330
+ const notesShown = () => missingSummary().hasMissing && !missingValue.PART_TO_WHOLE_CHART_TYPES.has(params().type) && activeView() === "chart" && !error();
331
+ const noteKind = () => chartMissingPlugin.missingNoteKind(params().type, params().options);
332
+ const conventionNoteShown = () => noteKind() === "bars" ? missingSummary().hasMissing : missingSummary().partiallyMissing.some(Boolean);
333
+ const noDataSeries = () => {
334
+ var _a;
335
+ const names = (((_a = params().data) == null ? void 0 : _a.datasets) ?? []).map((dataset, index) => missingSummary().fullyMissing[index] ? (dataset == null ? void 0 : dataset.label) || formatString.formatMCPUIString(strings.degradedSeries, {
336
+ n: index + 1
337
+ }) : null).filter((name) => name !== null);
338
+ try {
339
+ return new Intl.ListFormat(strings.locale, {
340
+ type: "conjunction"
341
+ }).format(names);
342
+ } catch {
343
+ return names.join(", ");
344
+ }
345
+ };
137
346
  const descriptionId = solidJs.createUniqueId();
347
+ const notesId = solidJs.createUniqueId();
138
348
  const title = () => params().title || strings.chartView;
139
349
  const exportEnabled = () => params().exportable !== false;
140
350
  const copyDataJSON = () => JSON.stringify({
@@ -204,9 +414,11 @@ const ChartJSRenderer = (props) => {
204
414
  a.click();
205
415
  };
206
416
  solidJs.createEffect(async () => {
207
- var _a, _b, _c, _d, _e, _f, _g, _h;
417
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
208
418
  if (!canvasRef) return;
209
419
  const chartParams = params();
420
+ const chartMissing = missingSummary();
421
+ const chartUnit = unit();
210
422
  const zoom = zoomOptions();
211
423
  const version = ++renderVersion;
212
424
  setIsLoading(true);
@@ -218,6 +430,9 @@ const ChartJSRenderer = (props) => {
218
430
  chartInstance.destroy();
219
431
  chartInstance = null;
220
432
  }
433
+ if (chartMissing.hasMissing && missingValue.PART_TO_WHOLE_CHART_TYPES.has(chartParams.type)) {
434
+ throw new Error(strings.chartMissingUnsupported);
435
+ }
221
436
  const hostZoomOptions = (_b = (_a = chartParams.options) == null ? void 0 : _a.plugins) == null ? void 0 : _b.zoom;
222
437
  const baseOptions = {
223
438
  responsive: true,
@@ -263,11 +478,71 @@ const ChartJSRenderer = (props) => {
263
478
  }
264
479
  };
265
480
  }
266
- chartInstance = new Chart(canvasRef, {
481
+ chartMissingPlugin.applyUnitAxisTitle(baseOptions, chartParams.type, chartUnit);
482
+ const chartConfig = {
267
483
  type: chartParams.type,
268
- data: chartParams.data,
484
+ // The Colors plugin writes its generated palette onto datasets. Never
485
+ // let that turn a shared payload into caller-supplied colors for the
486
+ // next renderer, nor mutate data owned by a host application.
487
+ data: {
488
+ ...chartParams.data,
489
+ datasets: chartParams.data.datasets.map((dataset) => ({
490
+ ...dataset
491
+ }))
492
+ },
269
493
  options: baseOptions
270
- });
494
+ };
495
+ if (chartUnit !== void 0 || chartMissing.hasMissing) {
496
+ const tooltip = baseOptions.plugins.tooltip;
497
+ if (tooltip !== false && tooltip !== null && !((_g = tooltip == null ? void 0 : tooltip.callbacks) == null ? void 0 : _g.label)) {
498
+ baseOptions.plugins.tooltip = {
499
+ ...tooltip,
500
+ callbacks: {
501
+ ...tooltip == null ? void 0 : tooltip.callbacks,
502
+ label: chartMissingPlugin.createTooltipLabel(() => strings, chartUnit, chartParams.type)
503
+ }
504
+ };
505
+ }
506
+ }
507
+ if (chartMissing.hasMissing) {
508
+ chartConfig.data = chartMissingPlugin.withDatasetsNoGapSpan(chartParams.data);
509
+ const defaultGenerate = ((_i = (_h = baseOptions.plugins.legend) == null ? void 0 : _h.labels) == null ? void 0 : _i.generateLabels) ?? ((_m = (_l = (_k = (_j = Chart == null ? void 0 : Chart.defaults) == null ? void 0 : _j.plugins) == null ? void 0 : _k.legend) == null ? void 0 : _l.labels) == null ? void 0 : _m.generateLabels);
510
+ if (typeof defaultGenerate === "function") {
511
+ baseOptions.plugins.legend = {
512
+ ...baseOptions.plugins.legend,
513
+ labels: {
514
+ ...(_n = baseOptions.plugins.legend) == null ? void 0 : _n.labels,
515
+ generateLabels: chartMissingPlugin.createMissingLegendGenerator(defaultGenerate, chartMissing.fullyMissing, () => strings)
516
+ }
517
+ };
518
+ }
519
+ chartConfig.plugins = [chartMissingPlugin.createMissingValuesPlugin({
520
+ allMissing: chartMissing.allMissing,
521
+ getNoDataText: () => strings.chartNoData,
522
+ getFontFamily: () => {
523
+ var _a2, _b2;
524
+ return (_b2 = (_a2 = Chart == null ? void 0 : Chart.defaults) == null ? void 0 : _a2.font) == null ? void 0 : _b2.family;
525
+ },
526
+ getTextColor: () => {
527
+ var _a2;
528
+ return ((_a2 = chartParams.options) == null ? void 0 : _a2.color) ?? theme.readThemeTokens(themeRoot, ["--mcp-ui-chart-label"])["--mcp-ui-chart-label"];
529
+ }
530
+ })];
531
+ }
532
+ if (themeRoot) {
533
+ const originalOptions = {
534
+ ...baseOptions,
535
+ plugins: {
536
+ ...baseOptions.plugins
537
+ },
538
+ scales: baseOptions.scales ? {
539
+ ...baseOptions.scales
540
+ } : void 0
541
+ };
542
+ chartTheme = createChartTheme(chartParams, originalOptions, themeRoot, chartConfig);
543
+ chartTheme.applyOptions(baseOptions);
544
+ }
545
+ chartInstance = new Chart(canvasRef, chartConfig);
271
546
  setIsZoomed(false);
272
547
  setIsLoading(false);
273
548
  } catch (err) {
@@ -278,11 +553,11 @@ const ChartJSRenderer = (props) => {
278
553
  telemetry == null ? void 0 : telemetry.dispatch({
279
554
  type: "render:error",
280
555
  errorMessage: error2.message,
281
- id: ((_g = props.component) == null ? void 0 : _g.id) ?? "",
556
+ id: ((_o = props.component) == null ? void 0 : _o.id) ?? "",
282
557
  componentType: "chart",
283
558
  ts: Date.now()
284
559
  });
285
- (_h = props.onError) == null ? void 0 : _h.call(props, error2);
560
+ (_p = props.onError) == null ? void 0 : _p.call(props, error2);
286
561
  }
287
562
  });
288
563
  solidJs.createEffect(() => {
@@ -316,7 +591,9 @@ const ChartJSRenderer = (props) => {
316
591
  get children() {
317
592
  return web.createComponent(ContextAwareChartLayout, {
318
593
  render: (isExpanded2) => (() => {
319
- var _el$ = web.getNextElement(_tmpl$8), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$14 = _el$6.nextSibling, [_el$15, _co$2] = web.getNextMarker(_el$14.nextSibling), _el$16 = _el$15.nextSibling, [_el$17, _co$3] = web.getNextMarker(_el$16.nextSibling), _el$18 = _el$2.nextSibling, _el$20 = _el$18.firstChild, [_el$21, _co$4] = web.getNextMarker(_el$20.nextSibling), _el$19 = _el$21.nextSibling, _el$22 = _el$19.nextSibling, [_el$23, _co$5] = web.getNextMarker(_el$22.nextSibling), _el$49 = _el$18.nextSibling, [_el$50, _co$1] = web.getNextMarker(_el$49.nextSibling), _el$51 = _el$50.nextSibling, [_el$52, _co$10] = web.getNextMarker(_el$51.nextSibling), _el$41 = _el$52.nextSibling, _el$42 = _el$41.firstChild, _el$47 = _el$42.nextSibling, [_el$48, _co$0] = web.getNextMarker(_el$47.nextSibling);
594
+ var _el$ = web.getNextElement(_tmpl$1), _el$2 = _el$.firstChild, _el$3 = _el$2.firstChild, _el$5 = _el$3.nextSibling, _el$6 = _el$5.firstChild, _el$7 = _el$6.firstChild, _el$8 = _el$7.nextSibling, _el$14 = _el$6.nextSibling, [_el$15, _co$2] = web.getNextMarker(_el$14.nextSibling), _el$16 = _el$15.nextSibling, [_el$17, _co$3] = web.getNextMarker(_el$16.nextSibling), _el$18 = _el$2.nextSibling, _el$20 = _el$18.firstChild, [_el$21, _co$4] = web.getNextMarker(_el$20.nextSibling), _el$19 = _el$21.nextSibling, _el$22 = _el$19.nextSibling, [_el$23, _co$5] = web.getNextMarker(_el$22.nextSibling), _el$56 = _el$18.nextSibling, [_el$57, _co$11] = web.getNextMarker(_el$56.nextSibling), _el$58 = _el$57.nextSibling, [_el$59, _co$12] = web.getNextMarker(_el$58.nextSibling), _el$41 = _el$59.nextSibling, _el$42 = _el$41.firstChild, _el$47 = _el$42.nextSibling, [_el$48, _co$0] = web.getNextMarker(_el$47.nextSibling), _el$60 = _el$41.nextSibling, [_el$61, _co$13] = web.getNextMarker(_el$60.nextSibling);
595
+ var _ref$ = themeRoot;
596
+ typeof _ref$ === "function" ? web.use(_ref$, _el$) : themeRoot = _el$;
320
597
  web.insert(_el$3, web.createComponent(solidJs.Show, {
321
598
  get when() {
322
599
  return params().title;
@@ -417,73 +694,94 @@ const ChartJSRenderer = (props) => {
417
694
  }
418
695
  }, tableData));
419
696
  }
420
- }), _el$50, _co$1);
697
+ }), _el$57, _co$11);
421
698
  web.insert(_el$, web.createComponent(solidJs.Show, {
422
699
  get when() {
423
700
  return activeView() === "data";
424
701
  },
425
702
  get children() {
426
- var _el$24 = web.getNextElement(_tmpl$6), _el$25 = _el$24.firstChild, _el$26 = _el$25.firstChild, _el$28 = _el$26.firstChild, [_el$29, _co$6] = web.getNextMarker(_el$28.nextSibling), _el$27 = _el$29.nextSibling, _el$30 = _el$27.nextSibling, [_el$31, _co$7] = web.getNextMarker(_el$30.nextSibling), _el$32 = _el$26.nextSibling, _el$33 = _el$32.firstChild, _el$34 = _el$32.nextSibling, _el$37 = _el$34.firstChild, [_el$38, _co$8] = web.getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = web.getNextMarker(_el$39.nextSibling);
427
- web.insert(_el$26, title, _el$29, _co$6);
428
- web.insert(_el$26, () => strings.chartDataTable, _el$31, _co$7);
429
- web.insert(_el$33, web.createComponent(solidJs.For, {
430
- get each() {
431
- return tableData().columns;
432
- },
433
- children: (column) => (() => {
434
- var _el$53 = web.getNextElement(_tmpl$9);
435
- web.insert(_el$53, column);
436
- return _el$53;
437
- })()
438
- }));
439
- web.insert(_el$34, web.createComponent(solidJs.For, {
440
- get each() {
441
- return tableData().rows;
442
- },
443
- children: (row) => (() => {
444
- var _el$54 = web.getNextElement(_tmpl$0);
445
- web.insert(_el$54, web.createComponent(solidJs.For, {
446
- get each() {
447
- return tableData().columns;
448
- },
449
- children: (_column, index) => (() => {
450
- var _el$55 = web.getNextElement(_tmpl$1);
451
- web.insert(_el$55, () => String(row[index()] ?? ""));
452
- return _el$55;
453
- })()
454
- }));
455
- return _el$54;
456
- })()
457
- }), _el$38, _co$8);
458
- web.insert(_el$34, web.createComponent(solidJs.Show, {
703
+ return [(() => {
704
+ var _el$24 = web.getNextElement(_tmpl$6), _el$25 = _el$24.firstChild, _el$26 = _el$25.firstChild, _el$28 = _el$26.firstChild, [_el$29, _co$6] = web.getNextMarker(_el$28.nextSibling), _el$27 = _el$29.nextSibling, _el$30 = _el$27.nextSibling, [_el$31, _co$7] = web.getNextMarker(_el$30.nextSibling), _el$32 = _el$26.nextSibling, _el$33 = _el$32.firstChild, _el$34 = _el$32.nextSibling, _el$37 = _el$34.firstChild, [_el$38, _co$8] = web.getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = web.getNextMarker(_el$39.nextSibling);
705
+ web.insert(_el$26, title, _el$29, _co$6);
706
+ web.insert(_el$26, () => strings.chartDataTable, _el$31, _co$7);
707
+ web.insert(_el$33, web.createComponent(solidJs.For, {
708
+ get each() {
709
+ return tableData().columns;
710
+ },
711
+ children: (column) => (() => {
712
+ var _el$62 = web.getNextElement(_tmpl$10);
713
+ web.insert(_el$62, column);
714
+ return _el$62;
715
+ })()
716
+ }));
717
+ web.insert(_el$34, web.createComponent(solidJs.For, {
718
+ get each() {
719
+ return tableData().rows;
720
+ },
721
+ children: (row, rowIndex) => (() => {
722
+ var _el$63 = web.getNextElement(_tmpl$11);
723
+ web.insert(_el$63, web.createComponent(solidJs.For, {
724
+ get each() {
725
+ return tableData().columns;
726
+ },
727
+ children: (_column, index) => (() => {
728
+ var _el$64 = web.getNextElement(_tmpl$12);
729
+ web.insert(_el$64, web.createComponent(solidJs.Show, {
730
+ get when() {
731
+ var _a;
732
+ return (_a = tableData().missing[rowIndex()]) == null ? void 0 : _a[index()];
733
+ },
734
+ get fallback() {
735
+ return String(row[index()] ?? "");
736
+ },
737
+ get children() {
738
+ return web.createComponent(MissingValue.MissingValueMark, {});
739
+ }
740
+ }));
741
+ return _el$64;
742
+ })()
743
+ }));
744
+ return _el$63;
745
+ })()
746
+ }), _el$38, _co$8);
747
+ web.insert(_el$34, web.createComponent(solidJs.Show, {
748
+ get when() {
749
+ return tableData().rows.length === 0;
750
+ },
751
+ get children() {
752
+ var _el$35 = web.getNextElement(_tmpl$5), _el$36 = _el$35.firstChild;
753
+ web.insert(_el$36, () => strings.chartNoData);
754
+ web.effect(() => web.setAttribute(_el$36, "colspan", Math.max(1, tableData().columns.length)));
755
+ return _el$35;
756
+ }
757
+ }), _el$40, _co$9);
758
+ web.effect((_p$) => {
759
+ var _v$0 = `w-full overflow-auto rounded border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] ${isExpanded2() ? "flex-1 min-h-0" : ""}`, _v$1 = isExpanded2() ? void 0 : {
760
+ height: params().height || "250px",
761
+ "max-height": "70vh"
762
+ };
763
+ _v$0 !== _p$.e && web.className(_el$24, _p$.e = _v$0);
764
+ _p$.t = web.style(_el$24, _v$1, _p$.t);
765
+ return _p$;
766
+ }, {
767
+ e: void 0,
768
+ t: void 0
769
+ });
770
+ return _el$24;
771
+ })(), web.createComponent(solidJs.Show, {
459
772
  get when() {
460
- return tableData().rows.length === 0;
773
+ return anyMissingCell();
461
774
  },
462
775
  get children() {
463
- var _el$35 = web.getNextElement(_tmpl$5), _el$36 = _el$35.firstChild;
464
- web.insert(_el$36, () => strings.chartNoData);
465
- web.effect(() => web.setAttribute(_el$36, "colspan", Math.max(1, tableData().columns.length)));
466
- return _el$35;
776
+ return web.createComponent(MissingValue.MissingValueLegend, {
777
+ "class": "mt-2"
778
+ });
467
779
  }
468
- }), _el$40, _co$9);
469
- web.effect((_p$) => {
470
- var _v$0 = `w-full overflow-auto rounded border border-gray-200 dark:border-gray-700 ${isExpanded2() ? "flex-1 min-h-0" : ""}`, _v$1 = isExpanded2() ? void 0 : {
471
- height: params().height || "250px",
472
- "max-height": "70vh"
473
- };
474
- _v$0 !== _p$.e && web.className(_el$24, _p$.e = _v$0);
475
- _p$.t = web.style(_el$24, _v$1, _p$.t);
476
- return _p$;
477
- }, {
478
- e: void 0,
479
- t: void 0
480
- });
481
- return _el$24;
780
+ })];
482
781
  }
483
- }), _el$52, _co$10);
484
- var _ref$ = canvasRef;
485
- typeof _ref$ === "function" ? web.use(_ref$, _el$42) : canvasRef = _el$42;
486
- web.setAttribute(_el$42, "aria-describedby", descriptionId);
782
+ }), _el$59, _co$12);
783
+ var _ref$2 = canvasRef;
784
+ typeof _ref$2 === "function" ? web.use(_ref$2, _el$42) : canvasRef = _el$42;
487
785
  web.insert(_el$41, web.createComponent(solidJs.Show, {
488
786
  get when() {
489
787
  return web.memo(() => !!isLoading())() && activeView() === "chart";
@@ -494,8 +792,44 @@ const ChartJSRenderer = (props) => {
494
792
  return _el$43;
495
793
  }
496
794
  }), _el$48, _co$0);
795
+ web.insert(_el$, web.createComponent(solidJs.Show, {
796
+ get when() {
797
+ return notesShown();
798
+ },
799
+ get children() {
800
+ var _el$49 = web.getNextElement(_tmpl$0), _el$52 = _el$49.firstChild, [_el$53, _co$1] = web.getNextMarker(_el$52.nextSibling), _el$54 = _el$53.nextSibling, [_el$55, _co$10] = web.getNextMarker(_el$54.nextSibling);
801
+ web.setAttribute(_el$49, "id", notesId);
802
+ web.insert(_el$49, web.createComponent(solidJs.Show, {
803
+ get when() {
804
+ return conventionNoteShown();
805
+ },
806
+ get children() {
807
+ var _el$50 = web.getNextElement(_tmpl$8);
808
+ web.insert(_el$50, (() => {
809
+ var _c$ = web.memo(() => noteKind() === "bars");
810
+ return () => _c$() ? strings.chartMissingBars : web.memo(() => noteKind() === "omitted")() ? strings.chartMissingPoints : strings.chartMissingGaps;
811
+ })());
812
+ web.effect(() => web.setAttribute(_el$50, "data-mcp-chart-note", noteKind()));
813
+ return _el$50;
814
+ }
815
+ }), _el$53, _co$1);
816
+ web.insert(_el$49, web.createComponent(solidJs.Show, {
817
+ get when() {
818
+ return missingSummary().fullyMissing.some(Boolean);
819
+ },
820
+ get children() {
821
+ var _el$51 = web.getNextElement(_tmpl$9);
822
+ web.insert(_el$51, () => formatString.formatMCPUIString(strings.chartSeriesNoData, {
823
+ series: noDataSeries()
824
+ }));
825
+ return _el$51;
826
+ }
827
+ }), _el$55, _co$10);
828
+ return _el$49;
829
+ }
830
+ }), _el$61, _co$13);
497
831
  web.effect((_p$) => {
498
- var _v$10 = `relative w-full bg-white dark:bg-gray-800 rounded-lg shadow-sm border border-gray-200 dark:border-gray-700 overflow-hidden p-4 group ${isExpanded2() ? "flex-1 min-h-0 flex flex-col" : ""} ${params().className || ""}`, _v$11 = strings.chartViewSelector, _v$12 = activeView() === "chart", _v$13 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "chart" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$14 = activeView() === "data", _v$15 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "data" ? "bg-gray-900 text-white dark:bg-gray-100 dark:text-gray-900" : "text-gray-600 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"}`, _v$16 = `relative w-full ${isExpanded2() ? "flex-1 min-h-0" : ""}`, _v$17 = error() || activeView() === "data" ? {
832
+ var _v$10 = `mcp-ui-root relative w-full bg-[color:var(--mcp-ui-surface,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-surface,var(--color-gray-800,#1f2937))] rounded-lg shadow-[var(--mcp-ui-shadow,var(--shadow-sm))] border border-[color:var(--mcp-ui-border,var(--color-gray-200,#e5e7eb))] dark:border-[color:var(--mcp-ui-border,var(--color-gray-700,#374151))] overflow-hidden p-4 group ${isExpanded2() ? "flex-1 min-h-0 flex flex-col" : ""} ${params().className || ""}`, _v$11 = strings.chartViewSelector, _v$12 = activeView() === "chart", _v$13 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "chart" ? "bg-[color:var(--mcp-ui-accent,var(--color-gray-900,#111827))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-accent,var(--color-gray-100,#f3f4f6))] dark:text-[color:var(--mcp-ui-accent-fg,var(--color-gray-900,#111827))]" : "text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))]"}`, _v$14 = activeView() === "data", _v$15 = `rounded px-2 py-1 text-xs font-medium transition-colors ${activeView() === "data" ? "bg-[color:var(--mcp-ui-accent,var(--color-gray-900,#111827))] text-[color:var(--mcp-ui-accent-fg,var(--color-white,#fff))] dark:bg-[color:var(--mcp-ui-accent,var(--color-gray-100,#f3f4f6))] dark:text-[color:var(--mcp-ui-accent-fg,var(--color-gray-900,#111827))]" : "text-[color:var(--mcp-ui-fg-muted,var(--color-gray-600,#4b5563))] hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-100,#f3f4f6))] dark:text-[color:var(--mcp-ui-fg,var(--color-gray-300,#d1d5db))] dark:hover:bg-[color:var(--mcp-ui-surface-hover,var(--color-gray-700,#374151))]"}`, _v$16 = `relative w-full ${isExpanded2() ? "flex-1 min-h-0" : ""}`, _v$17 = error() || activeView() === "data" ? {
499
833
  display: "none"
500
834
  } : isExpanded2() ? {
501
835
  height: "100%",
@@ -503,7 +837,7 @@ const ChartJSRenderer = (props) => {
503
837
  } : {
504
838
  height: params().height || "250px",
505
839
  display: "block"
506
- }, _v$18 = title(), _v$19 = activeView() !== "chart" || Boolean(error());
840
+ }, _v$18 = title(), _v$19 = notesShown() ? `${descriptionId} ${notesId}` : descriptionId, _v$20 = activeView() !== "chart" || Boolean(error());
507
841
  _v$10 !== _p$.e && web.className(_el$, _p$.e = _v$10);
508
842
  _v$11 !== _p$.t && web.setAttribute(_el$6, "aria-label", _p$.t = _v$11);
509
843
  _v$12 !== _p$.a && web.setAttribute(_el$7, "aria-pressed", _p$.a = _v$12);
@@ -513,7 +847,8 @@ const ChartJSRenderer = (props) => {
513
847
  _v$16 !== _p$.s && web.className(_el$41, _p$.s = _v$16);
514
848
  _p$.h = web.style(_el$41, _v$17, _p$.h);
515
849
  _v$18 !== _p$.r && web.setAttribute(_el$42, "aria-label", _p$.r = _v$18);
516
- _v$19 !== _p$.d && web.setAttribute(_el$42, "aria-hidden", _p$.d = _v$19);
850
+ _v$19 !== _p$.d && web.setAttribute(_el$42, "aria-describedby", _p$.d = _v$19);
851
+ _v$20 !== _p$.l && web.setAttribute(_el$42, "aria-hidden", _p$.l = _v$20);
517
852
  return _p$;
518
853
  }, {
519
854
  e: void 0,
@@ -525,7 +860,8 @@ const ChartJSRenderer = (props) => {
525
860
  s: void 0,
526
861
  h: void 0,
527
862
  r: void 0,
528
- d: void 0
863
+ d: void 0,
864
+ l: void 0
529
865
  });
530
866
  web.runHydrationEvents();
531
867
  return _el$;