@seed-ship/mcp-ui-solid 6.23.0 → 6.24.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 (79) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/README.md +107 -2
  3. package/dist/components/ChartJSRenderer.cjs +192 -66
  4. package/dist/components/ChartJSRenderer.cjs.map +1 -1
  5. package/dist/components/ChartJSRenderer.d.ts.map +1 -1
  6. package/dist/components/ChartJSRenderer.js +192 -66
  7. package/dist/components/ChartJSRenderer.js.map +1 -1
  8. package/dist/components/DegradedFallback.cjs +34 -2
  9. package/dist/components/DegradedFallback.cjs.map +1 -1
  10. package/dist/components/DegradedFallback.d.ts +7 -0
  11. package/dist/components/DegradedFallback.d.ts.map +1 -1
  12. package/dist/components/DegradedFallback.js +34 -2
  13. package/dist/components/DegradedFallback.js.map +1 -1
  14. package/dist/components/MissingValue.cjs +43 -0
  15. package/dist/components/MissingValue.cjs.map +1 -0
  16. package/dist/components/MissingValue.d.ts +27 -0
  17. package/dist/components/MissingValue.d.ts.map +1 -0
  18. package/dist/components/MissingValue.js +43 -0
  19. package/dist/components/MissingValue.js.map +1 -0
  20. package/dist/components/UIResourceRenderer.cjs +237 -199
  21. package/dist/components/UIResourceRenderer.cjs.map +1 -1
  22. package/dist/components/UIResourceRenderer.d.ts.map +1 -1
  23. package/dist/components/UIResourceRenderer.js +237 -199
  24. package/dist/components/UIResourceRenderer.js.map +1 -1
  25. package/dist/components/chart-data-table.cjs +30 -5
  26. package/dist/components/chart-data-table.cjs.map +1 -1
  27. package/dist/components/chart-data-table.d.ts +18 -1
  28. package/dist/components/chart-data-table.d.ts.map +1 -1
  29. package/dist/components/chart-data-table.js +30 -5
  30. package/dist/components/chart-data-table.js.map +1 -1
  31. package/dist/components/chart-missing-plugin.cjs +194 -0
  32. package/dist/components/chart-missing-plugin.cjs.map +1 -0
  33. package/dist/components/chart-missing-plugin.d.ts +127 -0
  34. package/dist/components/chart-missing-plugin.d.ts.map +1 -0
  35. package/dist/components/chart-missing-plugin.js +194 -0
  36. package/dist/components/chart-missing-plugin.js.map +1 -0
  37. package/dist/context/MCPUIStringsContext.cjs +12 -1
  38. package/dist/context/MCPUIStringsContext.cjs.map +1 -1
  39. package/dist/context/MCPUIStringsContext.d.ts +62 -0
  40. package/dist/context/MCPUIStringsContext.d.ts.map +1 -1
  41. package/dist/context/MCPUIStringsContext.js +12 -1
  42. package/dist/context/MCPUIStringsContext.js.map +1 -1
  43. package/dist/services/component-registry.cjs +9 -2
  44. package/dist/services/component-registry.cjs.map +1 -1
  45. package/dist/services/component-registry.d.ts.map +1 -1
  46. package/dist/services/component-registry.js +9 -2
  47. package/dist/services/component-registry.js.map +1 -1
  48. package/dist/services/validation.cjs +31 -8
  49. package/dist/services/validation.cjs.map +1 -1
  50. package/dist/services/validation.d.ts.map +1 -1
  51. package/dist/services/validation.js +31 -8
  52. package/dist/services/validation.js.map +1 -1
  53. package/dist/types/index.d.ts +14 -2
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/utils/degraded-projections.cjs +19 -3
  56. package/dist/utils/degraded-projections.cjs.map +1 -1
  57. package/dist/utils/degraded-projections.d.ts +22 -2
  58. package/dist/utils/degraded-projections.d.ts.map +1 -1
  59. package/dist/utils/degraded-projections.js +19 -3
  60. package/dist/utils/degraded-projections.js.map +1 -1
  61. package/dist/utils/missing-value.cjs +60 -0
  62. package/dist/utils/missing-value.cjs.map +1 -0
  63. package/dist/utils/missing-value.d.ts +79 -0
  64. package/dist/utils/missing-value.d.ts.map +1 -0
  65. package/dist/utils/missing-value.js +60 -0
  66. package/dist/utils/missing-value.js.map +1 -0
  67. package/package.json +3 -3
  68. package/src/components/ChartJSRenderer.tsx +159 -6
  69. package/src/components/DegradedFallback.tsx +24 -2
  70. package/src/components/MissingValue.tsx +61 -0
  71. package/src/components/UIResourceRenderer.tsx +42 -9
  72. package/src/components/chart-data-table.ts +50 -6
  73. package/src/components/chart-missing-plugin.ts +334 -0
  74. package/src/context/MCPUIStringsContext.tsx +76 -0
  75. package/src/services/component-registry.ts +10 -2
  76. package/src/services/validation.ts +44 -9
  77. package/src/types/index.ts +13 -1
  78. package/src/utils/degraded-projections.ts +44 -4
  79. package/src/utils/missing-value.ts +127 -0
@@ -2,12 +2,15 @@ import { createComponent, getNextElement, getNextMarker, insert, effect, setAttr
2
2
  import { createSignal, createMemo, createUniqueId, createEffect, untrack, onCleanup, Show, For } from "solid-js";
3
3
  import { ExpandableWrapper, useExpanded } from "./ExpandableWrapper.js";
4
4
  import { DegradedFallback } from "./DegradedFallback.js";
5
+ import { MissingValueMark, MissingValueLegend } from "./MissingValue.js";
5
6
  import { chartToDataTable } from "./chart-data-table.js";
7
+ import { missingNoteKind, applyUnitAxisTitle, createTooltipLabel, withDatasetsNoGapSpan, createMissingLegendGenerator, createMissingValuesPlugin } from "./chart-missing-plugin.js";
8
+ import { summarizeChartMissing, PART_TO_WHOLE_CHART_TYPES } from "../utils/missing-value.js";
6
9
  import { useTelemetry } from "../context/MCPUITelemetryContext.js";
7
10
  import { useMCPUIConfig } from "../context/MCPUIConfigContext.js";
8
11
  import { useMCPUIStrings } from "../context/MCPUIStringsContext.js";
9
12
  import { formatMCPUIString } from "../utils/format-string.js";
10
- var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button class="opacity-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__ */ 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__ */ 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__ */ template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$6 = /* @__PURE__ */ template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">`), _tmpl$8 = /* @__PURE__ */ template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/>`), _tmpl$9 = /* @__PURE__ */ template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$0 = /* @__PURE__ */ template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$1 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
13
+ var _tmpl$ = /* @__PURE__ */ template(`<h3 class="text-sm font-semibold text-gray-900 dark:text-white">`), _tmpl$2 = /* @__PURE__ */ template(`<button type=button class="opacity-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__ */ 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__ */ 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__ */ template(`<tr><td class="px-3 py-6 text-center text-gray-500 dark:text-gray-400">`), _tmpl$6 = /* @__PURE__ */ template(`<div><table class="w-full border-collapse text-left text-sm"><caption class=sr-only><!$><!/> — <!$><!/></caption><thead class="bg-gray-50 dark:bg-gray-900/40"><tr></tr></thead><tbody><!$><!/><!$><!/>`), _tmpl$7 = /* @__PURE__ */ template(`<div class="absolute inset-0 flex items-center justify-center bg-white/80 dark:bg-gray-800/80"><div class="flex flex-col items-center gap-2"><div class="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600"></div><span class="text-sm text-gray-500 dark:text-gray-400">`), _tmpl$8 = /* @__PURE__ */ template(`<p>`), _tmpl$9 = /* @__PURE__ */ template(`<p data-mcp-chart-note=no-data>`), _tmpl$0 = /* @__PURE__ */ template(`<div data-mcp-chart-notes class="mt-2 space-y-0.5 text-xs text-gray-600 dark:text-gray-400"><!$><!/><!$><!/>`), _tmpl$1 = /* @__PURE__ */ template(`<div><div class="flex items-center justify-between gap-3 mb-3 flex-shrink-0"><div class=min-w-0></div><div class="flex items-center gap-2"><div class="inline-flex rounded-md border border-gray-200 p-0.5 dark:border-gray-600"role=group><button type=button></button><button type=button></button></div><!$><!/><!$><!/></div></div><p class=sr-only><!$><!/>. <!$><!/></p><!$><!/><!$><!/><div><canvas role=img></canvas><!$><!/></div><!$><!/>`), _tmpl$10 = /* @__PURE__ */ template(`<th scope=col class="px-3 py-2 font-medium text-gray-900 dark:text-gray-100">`), _tmpl$11 = /* @__PURE__ */ template(`<tr class="border-t border-gray-100 dark:border-gray-700">`), _tmpl$12 = /* @__PURE__ */ template(`<td class="px-3 py-2 text-gray-700 dark:text-gray-300">`);
11
14
  let ChartJS = null;
12
15
  let chartJSLoadPromise = null;
13
16
  const loadChartJS = async () => {
@@ -108,9 +111,33 @@ const ChartJSRenderer = (props) => {
108
111
  series: strings.chartTableSeries,
109
112
  point: strings.chartTablePoint,
110
113
  label: strings.degradedColLabel,
111
- seriesName: strings.degradedSeries
114
+ seriesName: strings.degradedSeries,
115
+ withUnit: strings.chartLabelWithUnit
112
116
  }));
117
+ const missingSummary = createMemo(() => summarizeChartMissing(params()));
118
+ const unit = () => {
119
+ const value = params().unit;
120
+ return typeof value === "string" && value !== "" ? value : void 0;
121
+ };
122
+ const anyMissingCell = () => tableData().missing.some((row) => row.some(Boolean));
123
+ const notesShown = () => missingSummary().hasMissing && !PART_TO_WHOLE_CHART_TYPES.has(params().type) && activeView() === "chart" && !error();
124
+ const noteKind = () => missingNoteKind(params().type, params().options);
125
+ const conventionNoteShown = () => noteKind() === "bars" ? missingSummary().hasMissing : missingSummary().partiallyMissing.some(Boolean);
126
+ const noDataSeries = () => {
127
+ var _a;
128
+ const names = (((_a = params().data) == null ? void 0 : _a.datasets) ?? []).map((dataset, index) => missingSummary().fullyMissing[index] ? (dataset == null ? void 0 : dataset.label) || formatMCPUIString(strings.degradedSeries, {
129
+ n: index + 1
130
+ }) : null).filter((name) => name !== null);
131
+ try {
132
+ return new Intl.ListFormat(strings.locale, {
133
+ type: "conjunction"
134
+ }).format(names);
135
+ } catch {
136
+ return names.join(", ");
137
+ }
138
+ };
113
139
  const descriptionId = createUniqueId();
140
+ const notesId = createUniqueId();
114
141
  const title = () => params().title || strings.chartView;
115
142
  const exportEnabled = () => params().exportable !== false;
116
143
  const copyDataJSON = () => JSON.stringify({
@@ -180,9 +207,11 @@ const ChartJSRenderer = (props) => {
180
207
  a.click();
181
208
  };
182
209
  createEffect(async () => {
183
- var _a, _b, _c, _d, _e, _f, _g, _h;
210
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p;
184
211
  if (!canvasRef) return;
185
212
  const chartParams = params();
213
+ const chartMissing = missingSummary();
214
+ const chartUnit = unit();
186
215
  const zoom = zoomOptions();
187
216
  const version = ++renderVersion;
188
217
  setIsLoading(true);
@@ -194,6 +223,9 @@ const ChartJSRenderer = (props) => {
194
223
  chartInstance.destroy();
195
224
  chartInstance = null;
196
225
  }
226
+ if (chartMissing.hasMissing && PART_TO_WHOLE_CHART_TYPES.has(chartParams.type)) {
227
+ throw new Error(strings.chartMissingUnsupported);
228
+ }
197
229
  const hostZoomOptions = (_b = (_a = chartParams.options) == null ? void 0 : _a.plugins) == null ? void 0 : _b.zoom;
198
230
  const baseOptions = {
199
231
  responsive: true,
@@ -239,11 +271,46 @@ const ChartJSRenderer = (props) => {
239
271
  }
240
272
  };
241
273
  }
242
- chartInstance = new Chart(canvasRef, {
274
+ applyUnitAxisTitle(baseOptions, chartParams.type, chartUnit);
275
+ const chartConfig = {
243
276
  type: chartParams.type,
244
277
  data: chartParams.data,
245
278
  options: baseOptions
246
- });
279
+ };
280
+ if (chartUnit !== void 0 || chartMissing.hasMissing) {
281
+ const tooltip = baseOptions.plugins.tooltip;
282
+ if (tooltip !== false && tooltip !== null && !((_g = tooltip == null ? void 0 : tooltip.callbacks) == null ? void 0 : _g.label)) {
283
+ baseOptions.plugins.tooltip = {
284
+ ...tooltip,
285
+ callbacks: {
286
+ ...tooltip == null ? void 0 : tooltip.callbacks,
287
+ label: createTooltipLabel(() => strings, chartUnit, chartParams.type)
288
+ }
289
+ };
290
+ }
291
+ }
292
+ if (chartMissing.hasMissing) {
293
+ chartConfig.data = withDatasetsNoGapSpan(chartParams.data);
294
+ 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);
295
+ if (typeof defaultGenerate === "function") {
296
+ baseOptions.plugins.legend = {
297
+ ...baseOptions.plugins.legend,
298
+ labels: {
299
+ ...(_n = baseOptions.plugins.legend) == null ? void 0 : _n.labels,
300
+ generateLabels: createMissingLegendGenerator(defaultGenerate, chartMissing.fullyMissing, () => strings)
301
+ }
302
+ };
303
+ }
304
+ chartConfig.plugins = [createMissingValuesPlugin({
305
+ allMissing: chartMissing.allMissing,
306
+ getNoDataText: () => strings.chartNoData,
307
+ getFontFamily: () => {
308
+ var _a2, _b2;
309
+ return (_b2 = (_a2 = Chart == null ? void 0 : Chart.defaults) == null ? void 0 : _a2.font) == null ? void 0 : _b2.family;
310
+ }
311
+ })];
312
+ }
313
+ chartInstance = new Chart(canvasRef, chartConfig);
247
314
  setIsZoomed(false);
248
315
  setIsLoading(false);
249
316
  } catch (err) {
@@ -254,11 +321,11 @@ const ChartJSRenderer = (props) => {
254
321
  telemetry == null ? void 0 : telemetry.dispatch({
255
322
  type: "render:error",
256
323
  errorMessage: error2.message,
257
- id: ((_g = props.component) == null ? void 0 : _g.id) ?? "",
324
+ id: ((_o = props.component) == null ? void 0 : _o.id) ?? "",
258
325
  componentType: "chart",
259
326
  ts: Date.now()
260
327
  });
261
- (_h = props.onError) == null ? void 0 : _h.call(props, error2);
328
+ (_p = props.onError) == null ? void 0 : _p.call(props, error2);
262
329
  }
263
330
  });
264
331
  createEffect(() => {
@@ -292,7 +359,7 @@ const ChartJSRenderer = (props) => {
292
359
  get children() {
293
360
  return createComponent(ContextAwareChartLayout, {
294
361
  render: (isExpanded2) => (() => {
295
- var _el$ = 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] = getNextMarker(_el$14.nextSibling), _el$16 = _el$15.nextSibling, [_el$17, _co$3] = getNextMarker(_el$16.nextSibling), _el$18 = _el$2.nextSibling, _el$20 = _el$18.firstChild, [_el$21, _co$4] = getNextMarker(_el$20.nextSibling), _el$19 = _el$21.nextSibling, _el$22 = _el$19.nextSibling, [_el$23, _co$5] = getNextMarker(_el$22.nextSibling), _el$49 = _el$18.nextSibling, [_el$50, _co$1] = getNextMarker(_el$49.nextSibling), _el$51 = _el$50.nextSibling, [_el$52, _co$10] = getNextMarker(_el$51.nextSibling), _el$41 = _el$52.nextSibling, _el$42 = _el$41.firstChild, _el$47 = _el$42.nextSibling, [_el$48, _co$0] = getNextMarker(_el$47.nextSibling);
362
+ var _el$ = 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] = getNextMarker(_el$14.nextSibling), _el$16 = _el$15.nextSibling, [_el$17, _co$3] = getNextMarker(_el$16.nextSibling), _el$18 = _el$2.nextSibling, _el$20 = _el$18.firstChild, [_el$21, _co$4] = getNextMarker(_el$20.nextSibling), _el$19 = _el$21.nextSibling, _el$22 = _el$19.nextSibling, [_el$23, _co$5] = getNextMarker(_el$22.nextSibling), _el$56 = _el$18.nextSibling, [_el$57, _co$11] = getNextMarker(_el$56.nextSibling), _el$58 = _el$57.nextSibling, [_el$59, _co$12] = getNextMarker(_el$58.nextSibling), _el$41 = _el$59.nextSibling, _el$42 = _el$41.firstChild, _el$47 = _el$42.nextSibling, [_el$48, _co$0] = getNextMarker(_el$47.nextSibling), _el$60 = _el$41.nextSibling, [_el$61, _co$13] = getNextMarker(_el$60.nextSibling);
296
363
  insert(_el$3, createComponent(Show, {
297
364
  get when() {
298
365
  return params().title;
@@ -393,73 +460,94 @@ const ChartJSRenderer = (props) => {
393
460
  }
394
461
  }, tableData));
395
462
  }
396
- }), _el$50, _co$1);
463
+ }), _el$57, _co$11);
397
464
  insert(_el$, createComponent(Show, {
398
465
  get when() {
399
466
  return activeView() === "data";
400
467
  },
401
468
  get children() {
402
- var _el$24 = getNextElement(_tmpl$6), _el$25 = _el$24.firstChild, _el$26 = _el$25.firstChild, _el$28 = _el$26.firstChild, [_el$29, _co$6] = getNextMarker(_el$28.nextSibling), _el$27 = _el$29.nextSibling, _el$30 = _el$27.nextSibling, [_el$31, _co$7] = 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] = getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = getNextMarker(_el$39.nextSibling);
403
- insert(_el$26, title, _el$29, _co$6);
404
- insert(_el$26, () => strings.chartDataTable, _el$31, _co$7);
405
- insert(_el$33, createComponent(For, {
406
- get each() {
407
- return tableData().columns;
408
- },
409
- children: (column) => (() => {
410
- var _el$53 = getNextElement(_tmpl$9);
411
- insert(_el$53, column);
412
- return _el$53;
413
- })()
414
- }));
415
- insert(_el$34, createComponent(For, {
416
- get each() {
417
- return tableData().rows;
418
- },
419
- children: (row) => (() => {
420
- var _el$54 = getNextElement(_tmpl$0);
421
- insert(_el$54, createComponent(For, {
422
- get each() {
423
- return tableData().columns;
424
- },
425
- children: (_column, index) => (() => {
426
- var _el$55 = getNextElement(_tmpl$1);
427
- insert(_el$55, () => String(row[index()] ?? ""));
428
- return _el$55;
429
- })()
430
- }));
431
- return _el$54;
432
- })()
433
- }), _el$38, _co$8);
434
- insert(_el$34, createComponent(Show, {
469
+ return [(() => {
470
+ var _el$24 = getNextElement(_tmpl$6), _el$25 = _el$24.firstChild, _el$26 = _el$25.firstChild, _el$28 = _el$26.firstChild, [_el$29, _co$6] = getNextMarker(_el$28.nextSibling), _el$27 = _el$29.nextSibling, _el$30 = _el$27.nextSibling, [_el$31, _co$7] = 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] = getNextMarker(_el$37.nextSibling), _el$39 = _el$38.nextSibling, [_el$40, _co$9] = getNextMarker(_el$39.nextSibling);
471
+ insert(_el$26, title, _el$29, _co$6);
472
+ insert(_el$26, () => strings.chartDataTable, _el$31, _co$7);
473
+ insert(_el$33, createComponent(For, {
474
+ get each() {
475
+ return tableData().columns;
476
+ },
477
+ children: (column) => (() => {
478
+ var _el$62 = getNextElement(_tmpl$10);
479
+ insert(_el$62, column);
480
+ return _el$62;
481
+ })()
482
+ }));
483
+ insert(_el$34, createComponent(For, {
484
+ get each() {
485
+ return tableData().rows;
486
+ },
487
+ children: (row, rowIndex) => (() => {
488
+ var _el$63 = getNextElement(_tmpl$11);
489
+ insert(_el$63, createComponent(For, {
490
+ get each() {
491
+ return tableData().columns;
492
+ },
493
+ children: (_column, index) => (() => {
494
+ var _el$64 = getNextElement(_tmpl$12);
495
+ insert(_el$64, createComponent(Show, {
496
+ get when() {
497
+ var _a;
498
+ return (_a = tableData().missing[rowIndex()]) == null ? void 0 : _a[index()];
499
+ },
500
+ get fallback() {
501
+ return String(row[index()] ?? "");
502
+ },
503
+ get children() {
504
+ return createComponent(MissingValueMark, {});
505
+ }
506
+ }));
507
+ return _el$64;
508
+ })()
509
+ }));
510
+ return _el$63;
511
+ })()
512
+ }), _el$38, _co$8);
513
+ insert(_el$34, createComponent(Show, {
514
+ get when() {
515
+ return tableData().rows.length === 0;
516
+ },
517
+ get children() {
518
+ var _el$35 = getNextElement(_tmpl$5), _el$36 = _el$35.firstChild;
519
+ insert(_el$36, () => strings.chartNoData);
520
+ effect(() => setAttribute(_el$36, "colspan", Math.max(1, tableData().columns.length)));
521
+ return _el$35;
522
+ }
523
+ }), _el$40, _co$9);
524
+ effect((_p$) => {
525
+ 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 : {
526
+ height: params().height || "250px",
527
+ "max-height": "70vh"
528
+ };
529
+ _v$0 !== _p$.e && className(_el$24, _p$.e = _v$0);
530
+ _p$.t = style(_el$24, _v$1, _p$.t);
531
+ return _p$;
532
+ }, {
533
+ e: void 0,
534
+ t: void 0
535
+ });
536
+ return _el$24;
537
+ })(), createComponent(Show, {
435
538
  get when() {
436
- return tableData().rows.length === 0;
539
+ return anyMissingCell();
437
540
  },
438
541
  get children() {
439
- var _el$35 = getNextElement(_tmpl$5), _el$36 = _el$35.firstChild;
440
- insert(_el$36, () => strings.chartNoData);
441
- effect(() => setAttribute(_el$36, "colspan", Math.max(1, tableData().columns.length)));
442
- return _el$35;
542
+ return createComponent(MissingValueLegend, {
543
+ "class": "mt-2"
544
+ });
443
545
  }
444
- }), _el$40, _co$9);
445
- effect((_p$) => {
446
- 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 : {
447
- height: params().height || "250px",
448
- "max-height": "70vh"
449
- };
450
- _v$0 !== _p$.e && className(_el$24, _p$.e = _v$0);
451
- _p$.t = style(_el$24, _v$1, _p$.t);
452
- return _p$;
453
- }, {
454
- e: void 0,
455
- t: void 0
456
- });
457
- return _el$24;
546
+ })];
458
547
  }
459
- }), _el$52, _co$10);
548
+ }), _el$59, _co$12);
460
549
  var _ref$ = canvasRef;
461
550
  typeof _ref$ === "function" ? use(_ref$, _el$42) : canvasRef = _el$42;
462
- setAttribute(_el$42, "aria-describedby", descriptionId);
463
551
  insert(_el$41, createComponent(Show, {
464
552
  get when() {
465
553
  return memo(() => !!isLoading())() && activeView() === "chart";
@@ -470,6 +558,42 @@ const ChartJSRenderer = (props) => {
470
558
  return _el$43;
471
559
  }
472
560
  }), _el$48, _co$0);
561
+ insert(_el$, createComponent(Show, {
562
+ get when() {
563
+ return notesShown();
564
+ },
565
+ get children() {
566
+ var _el$49 = getNextElement(_tmpl$0), _el$52 = _el$49.firstChild, [_el$53, _co$1] = getNextMarker(_el$52.nextSibling), _el$54 = _el$53.nextSibling, [_el$55, _co$10] = getNextMarker(_el$54.nextSibling);
567
+ setAttribute(_el$49, "id", notesId);
568
+ insert(_el$49, createComponent(Show, {
569
+ get when() {
570
+ return conventionNoteShown();
571
+ },
572
+ get children() {
573
+ var _el$50 = getNextElement(_tmpl$8);
574
+ insert(_el$50, (() => {
575
+ var _c$ = memo(() => noteKind() === "bars");
576
+ return () => _c$() ? strings.chartMissingBars : memo(() => noteKind() === "omitted")() ? strings.chartMissingPoints : strings.chartMissingGaps;
577
+ })());
578
+ effect(() => setAttribute(_el$50, "data-mcp-chart-note", noteKind()));
579
+ return _el$50;
580
+ }
581
+ }), _el$53, _co$1);
582
+ insert(_el$49, createComponent(Show, {
583
+ get when() {
584
+ return missingSummary().fullyMissing.some(Boolean);
585
+ },
586
+ get children() {
587
+ var _el$51 = getNextElement(_tmpl$9);
588
+ insert(_el$51, () => formatMCPUIString(strings.chartSeriesNoData, {
589
+ series: noDataSeries()
590
+ }));
591
+ return _el$51;
592
+ }
593
+ }), _el$55, _co$10);
594
+ return _el$49;
595
+ }
596
+ }), _el$61, _co$13);
473
597
  effect((_p$) => {
474
598
  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" ? {
475
599
  display: "none"
@@ -479,7 +603,7 @@ const ChartJSRenderer = (props) => {
479
603
  } : {
480
604
  height: params().height || "250px",
481
605
  display: "block"
482
- }, _v$18 = title(), _v$19 = activeView() !== "chart" || Boolean(error());
606
+ }, _v$18 = title(), _v$19 = notesShown() ? `${descriptionId} ${notesId}` : descriptionId, _v$20 = activeView() !== "chart" || Boolean(error());
483
607
  _v$10 !== _p$.e && className(_el$, _p$.e = _v$10);
484
608
  _v$11 !== _p$.t && setAttribute(_el$6, "aria-label", _p$.t = _v$11);
485
609
  _v$12 !== _p$.a && setAttribute(_el$7, "aria-pressed", _p$.a = _v$12);
@@ -489,7 +613,8 @@ const ChartJSRenderer = (props) => {
489
613
  _v$16 !== _p$.s && className(_el$41, _p$.s = _v$16);
490
614
  _p$.h = style(_el$41, _v$17, _p$.h);
491
615
  _v$18 !== _p$.r && setAttribute(_el$42, "aria-label", _p$.r = _v$18);
492
- _v$19 !== _p$.d && setAttribute(_el$42, "aria-hidden", _p$.d = _v$19);
616
+ _v$19 !== _p$.d && setAttribute(_el$42, "aria-describedby", _p$.d = _v$19);
617
+ _v$20 !== _p$.l && setAttribute(_el$42, "aria-hidden", _p$.l = _v$20);
493
618
  return _p$;
494
619
  }, {
495
620
  e: void 0,
@@ -501,7 +626,8 @@ const ChartJSRenderer = (props) => {
501
626
  s: void 0,
502
627
  h: void 0,
503
628
  r: void 0,
504
- d: void 0
629
+ d: void 0,
630
+ l: void 0
505
631
  });
506
632
  runHydrationEvents();
507
633
  return _el$;