@pixerate/editor 0.162.1 → 0.163.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 (57) hide show
  1. package/README.md +1 -1
  2. package/dist/agent/index.cjs +34 -34
  3. package/dist/agent/index.js +5 -5
  4. package/dist/canvas/index.cjs +6 -6
  5. package/dist/canvas/index.js +2 -2
  6. package/dist/chart/commands.d.cts +2 -1
  7. package/dist/chart/commands.d.ts +2 -1
  8. package/dist/chart/controller.d.cts +109 -1
  9. package/dist/chart/controller.d.ts +109 -1
  10. package/dist/chart/index.cjs +605 -130
  11. package/dist/chart/index.d.cts +1 -0
  12. package/dist/chart/index.d.ts +1 -0
  13. package/dist/chart/index.js +490 -15
  14. package/dist/chart/layout-annotations.d.cts +29 -0
  15. package/dist/chart/layout-annotations.d.ts +29 -0
  16. package/dist/chart/layout-families.d.cts +23 -0
  17. package/dist/chart/layout-families.d.ts +23 -0
  18. package/dist/chart/mermaid.d.cts +2 -1
  19. package/dist/chart/mermaid.d.ts +2 -1
  20. package/dist/chart/schemas.d.cts +13 -0
  21. package/dist/chart/schemas.d.ts +13 -0
  22. package/dist/chart/spec.d.cts +30 -5
  23. package/dist/chart/spec.d.ts +30 -5
  24. package/dist/chart/stats.d.cts +9 -1
  25. package/dist/chart/stats.d.ts +9 -1
  26. package/dist/chart/tools.d.cts +1 -1
  27. package/dist/chart/tools.d.ts +1 -1
  28. package/dist/chart/tree.d.cts +62 -0
  29. package/dist/chart/tree.d.ts +62 -0
  30. package/dist/chart/types.d.cts +77 -3
  31. package/dist/chart/types.d.ts +77 -3
  32. package/dist/{chunk-7YBDRJXT.cjs → chunk-22KLZZGH.cjs} +8 -8
  33. package/dist/{chunk-HLOKB7WW.js → chunk-3NEZJCBY.js} +366 -6
  34. package/dist/{chunk-EVPZ5IKN.js → chunk-5FNGLV2D.js} +65 -3
  35. package/dist/{chunk-EQ46F75O.cjs → chunk-D54JHQK2.cjs} +51 -51
  36. package/dist/{chunk-NO5QQDHZ.js → chunk-DAPQGA55.js} +2 -2
  37. package/dist/{chunk-3IHNXRUV.cjs → chunk-GKNEJ6EN.cjs} +399 -67
  38. package/dist/{chunk-4NGVHHJB.cjs → chunk-NZD2MZJC.cjs} +80 -18
  39. package/dist/{chunk-CX6JLDFC.js → chunk-OXERWBKE.js} +3 -3
  40. package/dist/{chunk-7CKPUUN4.js → chunk-POR54B55.js} +61 -10
  41. package/dist/{chunk-LL3H5XUH.cjs → chunk-R3P2M7HU.cjs} +367 -7
  42. package/dist/{chunk-HDGBM7EA.cjs → chunk-SBQVEBSU.cjs} +580 -53
  43. package/dist/{chunk-XDCFJEU7.js → chunk-SZA42R4N.js} +346 -14
  44. package/dist/{chunk-GLMP22FT.js → chunk-TALQONZ5.js} +3 -3
  45. package/dist/{chunk-NA4UVVJ4.cjs → chunk-YGG7WDWT.cjs} +76 -25
  46. package/dist/{chunk-EY22AY6R.cjs → chunk-YSAGBIRW.cjs} +16 -16
  47. package/dist/{chunk-DTSTNRPH.js → chunk-Z4P2RBMJ.js} +536 -9
  48. package/dist/export/index.cjs +4 -4
  49. package/dist/export/index.js +3 -3
  50. package/dist/extensions/index.cjs +7 -7
  51. package/dist/extensions/index.js +6 -6
  52. package/dist/index.cjs +13 -13
  53. package/dist/index.js +7 -7
  54. package/dist/paint-editor/index.cjs +0 -20
  55. package/dist/paint-editor/index.js +0 -20
  56. package/package.json +1 -1
  57. package/skills/pixerate-canvas/SKILL.md +16 -0
@@ -7,7 +7,6 @@
7
7
 
8
8
 
9
9
 
10
- var _chunk4NGVHHJBcjs = require('../chunk-4NGVHHJB.cjs');
11
10
 
12
11
 
13
12
 
@@ -15,7 +14,7 @@ var _chunk4NGVHHJBcjs = require('../chunk-4NGVHHJB.cjs');
15
14
 
16
15
 
17
16
 
18
- var _chunkNA4UVVJ4cjs = require('../chunk-NA4UVVJ4.cjs');
17
+ var _chunkNZD2MZJCcjs = require('../chunk-NZD2MZJC.cjs');
19
18
 
20
19
 
21
20
 
@@ -23,6 +22,7 @@ var _chunkNA4UVVJ4cjs = require('../chunk-NA4UVVJ4.cjs');
23
22
 
24
23
 
25
24
 
25
+ var _chunkYGG7WDWTcjs = require('../chunk-YGG7WDWT.cjs');
26
26
 
27
27
 
28
28
 
@@ -37,7 +37,6 @@ var _chunkNA4UVVJ4cjs = require('../chunk-NA4UVVJ4.cjs');
37
37
 
38
38
 
39
39
 
40
- var _chunk3IHNXRUVcjs = require('../chunk-3IHNXRUV.cjs');
41
40
 
42
41
 
43
42
 
@@ -45,6 +44,7 @@ var _chunk3IHNXRUVcjs = require('../chunk-3IHNXRUV.cjs');
45
44
 
46
45
 
47
46
 
47
+ var _chunkGKNEJ6ENcjs = require('../chunk-GKNEJ6EN.cjs');
48
48
 
49
49
 
50
50
 
@@ -76,7 +76,6 @@ var _chunk3IHNXRUVcjs = require('../chunk-3IHNXRUV.cjs');
76
76
 
77
77
 
78
78
 
79
- var _chunkHDGBM7EAcjs = require('../chunk-HDGBM7EA.cjs');
80
79
 
81
80
 
82
81
 
@@ -85,6 +84,7 @@ var _chunkHDGBM7EAcjs = require('../chunk-HDGBM7EA.cjs');
85
84
 
86
85
 
87
86
 
87
+ var _chunkSBQVEBSUcjs = require('../chunk-SBQVEBSU.cjs');
88
88
 
89
89
 
90
90
 
@@ -138,7 +138,39 @@ var _chunkHDGBM7EAcjs = require('../chunk-HDGBM7EA.cjs');
138
138
 
139
139
 
140
140
 
141
- var _chunkLL3H5XUHcjs = require('../chunk-LL3H5XUH.cjs');
141
+
142
+
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+
158
+
159
+
160
+
161
+
162
+
163
+
164
+
165
+
166
+
167
+
168
+
169
+
170
+
171
+
172
+
173
+ var _chunkR3P2M7HUcjs = require('../chunk-R3P2M7HU.cjs');
142
174
  require('../chunk-55AKPTLM.cjs');
143
175
 
144
176
 
@@ -271,7 +303,7 @@ function chartFileName(spec, extension) {
271
303
  }
272
304
  async function downloadChartPng(spec, options = {}) {
273
305
  const { width = 800, height = 450, filename = chartFileName(spec, "png"), theme, ...raster } = options;
274
- const svg = _chunk3IHNXRUVcjs.chartToSvg.call(void 0, spec, { width, height, theme });
306
+ const svg = _chunkGKNEJ6ENcjs.chartToSvg.call(void 0, spec, { width, height, theme });
275
307
  const { url, width: w, height: h } = await svgToPngDataUrl(svg, { ...raster, width, height });
276
308
  const doc = _nullishCoalesce(raster.document, () => ( globalThis.document));
277
309
  const link = doc.createElement("a");
@@ -286,7 +318,7 @@ async function downloadChartPng(spec, options = {}) {
286
318
 
287
319
  // src/chart/recommend.ts
288
320
  var blank = (c) => c === null || c === void 0 || String(c).trim() === "";
289
- var isText = (c) => blank(c) || _chunkLL3H5XUHcjs.parseChartValue.call(void 0, c) === void 0;
321
+ var isText = (c) => blank(c) || _chunkR3P2M7HUcjs.parseChartValue.call(void 0, c) === void 0;
290
322
  function analyzeChartTable(rows) {
291
323
  const grid = rows.filter((r) => r.some((c) => !blank(c)));
292
324
  const height = grid.length;
@@ -304,7 +336,7 @@ function analyzeChartTable(rows) {
304
336
  let anyPositive = false;
305
337
  for (let r = headerRow ? 1 : 0; r < height; r++)
306
338
  for (let c = labelColumn ? 1 : 0; c < width; c++) {
307
- const v = _chunkLL3H5XUHcjs.parseChartValue.call(void 0, cell(r, c));
339
+ const v = _chunkR3P2M7HUcjs.parseChartValue.call(void 0, cell(r, c));
308
340
  if (typeof v !== "number") continue;
309
341
  anyNumber = true;
310
342
  if (v < 0) {
@@ -313,7 +345,7 @@ function analyzeChartTable(rows) {
313
345
  } else if (v > 0) anyPositive = true;
314
346
  }
315
347
  const labels = byRows ? _nullishCoalesce(_optionalChain([grid, 'access', _20 => _20[0], 'optionalAccess', _21 => _21.slice, 'call', _22 => _22(labelColumn ? 1 : 0)]), () => ( [])) : grid.slice(headerRow ? 1 : 0).map((r) => r[0]);
316
- const dates = (byRows ? headerRow : labelColumn) && labels.length > 1 && labels.filter((l) => !blank(l) && _chunkHDGBM7EAcjs.parseChartDate.call(void 0, String(l)) !== null).length >= labels.length * 0.8;
348
+ const dates = (byRows ? headerRow : labelColumn) && labels.length > 1 && labels.filter((l) => !blank(l) && _chunkSBQVEBSUcjs.parseChartDate.call(void 0, String(l)) !== null).length >= labels.length * 0.8;
317
349
  return {
318
350
  headerRow,
319
351
  labelColumn,
@@ -367,6 +399,7 @@ function recommendForShape(shape) {
367
399
  add("donut", "Donut", "Shares of a whole with the total in the middle.");
368
400
  if (shape.points >= 5) add("treemap", "Treemap", "Compares many shares by area.");
369
401
  add("funnel", "Funnel", "Shows stages that narrow down.");
402
+ add("parliament", "Parliament", "Seats or votes per group, with the majority line.");
370
403
  }
371
404
  add("line", "Line", "Shows the values in order.");
372
405
  }
@@ -378,11 +411,13 @@ function recommendForShape(shape) {
378
411
  add("area", "Area", "Emphasises volume.");
379
412
  add("bar", "Stacked column", "Shows how the series add up.", "stacked");
380
413
  } else {
414
+ if (shape.series === 2 && shape.labelColumn) add("slope", "Slope", "Two columns per item: shows what rose and what fell between them.");
381
415
  add("bar", "Column", "Several series: clustered columns compare them per category.");
382
416
  add("bar", "Bar", "Horizontal bars fit long category names.");
383
417
  add("bar", "Stacked column", "Shows how the series add up.", "stacked");
384
418
  add("line", "Line", "Shows the series in order.");
385
419
  if (shape.points >= 3 && shape.series <= 6) add("radar", "Radar", "Compares several measures across the series.");
420
+ if (shape.nonNegative && shape.series >= 3 && shape.series <= 7) add("likert", "Likert", "Survey answers per question (columns from most negative to most positive): shows agreement against disagreement.");
386
421
  }
387
422
  return out;
388
423
  }
@@ -400,7 +435,7 @@ function chartFromTable(rows, options = {}) {
400
435
  if (xFromFirst) {
401
436
  table = table.map((r) => [r[1], ...r.slice(2)]);
402
437
  }
403
- const data = _chunkLL3H5XUHcjs.chartDataFromTable.call(void 0, table, { seriesIn: shape.byRows ? "rows" : "columns", header: true, xFromFirstColumn: xFromFirst });
438
+ const data = _chunkR3P2M7HUcjs.chartDataFromTable.call(void 0, table, { seriesIn: shape.byRows ? "rows" : "columns", header: true, xFromFirstColumn: xFromFirst });
404
439
  return { type, stacking, categories: data.categories, series: data.series, issues: data.issues, shape };
405
440
  }
406
441
 
@@ -436,10 +471,10 @@ function createChartCommands(controller, options = {}) {
436
471
  readOnly: true,
437
472
  keywords: ["chart", "data", "spec", "get", "summary"],
438
473
  description: "Returns the chart spec, its data as a table (series names in the header row) and a summary: per-series min / max / mean / trend, axes as drawn, layout warnings and a colour check.",
439
- params: object({ width: _chunk4NGVHHJBcjs.WIDTH, height: _chunk4NGVHHJBcjs.HEIGHT }),
474
+ params: object({ width: _chunkNZD2MZJCcjs.WIDTH, height: _chunkNZD2MZJCcjs.HEIGHT }),
440
475
  run: (_ctx, params = {}) => {
441
476
  const spec = controller.getSpec();
442
- return { spec: controller.toJSON(), table: _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, spec), summary: _chunk3IHNXRUVcjs.summarizeChart.call(void 0, controller.toJSON(), { width: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _25 => _25.width]), () => ( 640)), height: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _26 => _26.height]), () => ( 400)) }), issues: controller.getState().issues };
477
+ return { spec: controller.toJSON(), table: _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, spec), summary: _chunkGKNEJ6ENcjs.summarizeChart.call(void 0, controller.toJSON(), { width: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _25 => _25.width]), () => ( 640)), height: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _26 => _26.height]), () => ( 400)) }), issues: controller.getState().issues };
443
478
  }
444
479
  },
445
480
  {
@@ -447,8 +482,8 @@ function createChartCommands(controller, options = {}) {
447
482
  id: `${prefix}update`,
448
483
  label: "Change Chart\u2026",
449
484
  keywords: ["chart", "title", "axis", "legend", "stack", "style", "format", "type"],
450
- description: 'Changes chart presentation as one undo step: type, titles, axes (xAxis = categories, yAxis = values, yAxis2 = secondary values; reverse, and scale "log" on value axes), legend, stacking, orientation, curve, points, data labels, palette, donut hole, bar spacing, histogram bins, waterfall total, or radar rings and grid shape. Invalid values change nothing and return why.',
451
- params: object(_chunk4NGVHHJBcjs.CHART_UPDATE_PROPERTIES),
485
+ description: 'Changes chart presentation as one undo step: type, titles, axes (xAxis = categories, yAxis = values, yAxis2 = secondary values; reverse, and scale "log" on value axes), legend, stacking, orientation, curve, points, data labels, palette, donut hole, bar spacing, histogram bins, waterfall total, or radar rings and grid shape, note, highlight, reference lines and bands, or colour by category (varyColors). Invalid values change nothing and return why.',
486
+ params: object(_chunkNZD2MZJCcjs.CHART_UPDATE_PROPERTIES),
452
487
  run: (_ctx, params) => {
453
488
  check(controller.update(params));
454
489
  return { spec: controller.toJSON() };
@@ -462,11 +497,11 @@ function createChartCommands(controller, options = {}) {
462
497
  description: "Replaces the categories and series as one undo step. Each series has one value per category (padded with gaps).",
463
498
  params: object({
464
499
  categories: { type: "array", items: { type: "string" }, description: "Category labels in order." },
465
- series: { type: "array", description: "The new series.", items: object({ id: { type: "string", description: "Stable id (optional)." }, ..._chunk4NGVHHJBcjs.SERIES_PROPS }, ["name", "values"]) }
500
+ series: { type: "array", description: "The new series.", items: object({ id: { type: "string", description: "Stable id (optional)." }, ..._chunkNZD2MZJCcjs.SERIES_PROPS }, ["name", "values"]) }
466
501
  }),
467
502
  run: (_ctx, params) => {
468
503
  check(controller.setData(params));
469
- return { table: _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, controller.getSpec()) };
504
+ return { table: _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, controller.getSpec()) };
470
505
  }
471
506
  },
472
507
  {
@@ -475,10 +510,10 @@ function createChartCommands(controller, options = {}) {
475
510
  label: "Set Chart Values\u2026",
476
511
  keywords: ["chart", "value", "cell", "edit"],
477
512
  description: "Sets individual values as one undo step. Series by id or name; category by index or label.",
478
- params: object({ cells: { type: "array", minItems: 1, description: "Values to set.", items: object({ series: _chunk4NGVHHJBcjs.SERIES_REF, category: _chunk4NGVHHJBcjs.CATEGORY_REF, value: _chunk4NGVHHJBcjs.VALUE }, ["series", "category", "value"]) } }, ["cells"]),
513
+ params: object({ cells: { type: "array", minItems: 1, description: "Values to set.", items: object({ series: _chunkNZD2MZJCcjs.SERIES_REF, category: _chunkNZD2MZJCcjs.CATEGORY_REF, value: _chunkNZD2MZJCcjs.VALUE }, ["series", "category", "value"]) } }, ["cells"]),
479
514
  run: (_ctx, params) => {
480
515
  check(controller.setValues(params.cells.map((c) => ({ seriesId: resolveSeries(c.series).id, index: resolveCategory(c.category), value: c.value }))));
481
- return { table: _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, controller.getSpec()) };
516
+ return { table: _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, controller.getSpec()) };
482
517
  }
483
518
  },
484
519
  {
@@ -487,7 +522,7 @@ function createChartCommands(controller, options = {}) {
487
522
  label: "Add Series",
488
523
  keywords: ["chart", "series", "new"],
489
524
  description: "Adds a series (default: an empty one at the end). Returns its id.",
490
- params: object({ ..._chunk4NGVHHJBcjs.SERIES_PROPS, id: { type: "string", description: "Id to use (default series-N)." }, at: { type: "integer", minimum: 0, description: "Position (default: last)." } }),
525
+ params: object({ ..._chunkNZD2MZJCcjs.SERIES_PROPS, id: { type: "string", description: "Id to use (default series-N)." }, at: { type: "integer", minimum: 0, description: "Position (default: last)." } }),
491
526
  run: (_ctx, params = {}) => {
492
527
  const { at, ...input } = _nullishCoalesce(params, () => ( {}));
493
528
  const clean = Object.fromEntries(Object.entries(input).filter(([, v]) => v !== null));
@@ -502,7 +537,7 @@ function createChartCommands(controller, options = {}) {
502
537
  label: "Change Series\u2026",
503
538
  keywords: ["chart", "series", "rename", "colour", "color", "hide", "axis", "marker"],
504
539
  description: "Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn, including error bars (null resets a field).",
505
- params: object({ series: _chunk4NGVHHJBcjs.SERIES_REF, ...Object.fromEntries(Object.entries(_chunk4NGVHHJBcjs.SERIES_PROPS).filter(([k]) => k !== "values")) }, ["series"]),
540
+ params: object({ series: _chunkNZD2MZJCcjs.SERIES_REF, ...Object.fromEntries(Object.entries(_chunkNZD2MZJCcjs.SERIES_PROPS).filter(([k]) => k !== "values")) }, ["series"]),
506
541
  run: (_ctx, params) => {
507
542
  const { series, ...patch } = params;
508
543
  const id = resolveSeries(series).id;
@@ -516,7 +551,7 @@ function createChartCommands(controller, options = {}) {
516
551
  label: "Delete Series",
517
552
  keywords: ["chart", "series", "remove"],
518
553
  description: "Deletes a series by id or name.",
519
- params: object({ series: _chunk4NGVHHJBcjs.SERIES_REF }, ["series"]),
554
+ params: object({ series: _chunkNZD2MZJCcjs.SERIES_REF }, ["series"]),
520
555
  run: (_ctx, params) => {
521
556
  check(controller.removeSeries(resolveSeries(params.series).id));
522
557
  return { series: seriesIds() };
@@ -529,7 +564,11 @@ function createChartCommands(controller, options = {}) {
529
564
  keywords: ["chart", "category", "row", "label"],
530
565
  description: "Inserts a category (gaps in every series) at `at` (default: the end).",
531
566
  params: object({ label: { type: "string", description: "Category label (default: its number)." }, at: { type: "integer", minimum: 0, description: "Index to insert at (default: the end)." } }),
532
- run: (_ctx, params = {}) => controller.addCategory(_optionalChain([params, 'optionalAccess', _27 => _27.label]), { at: _optionalChain([params, 'optionalAccess', _28 => _28.at]) })
567
+ run: (_ctx, params = {}) => {
568
+ const result = controller.addCategory(_optionalChain([params, 'optionalAccess', _27 => _27.label]), { at: _optionalChain([params, 'optionalAccess', _28 => _28.at]) });
569
+ check(result);
570
+ return result;
571
+ }
533
572
  },
534
573
  {
535
574
  ...base,
@@ -537,7 +576,7 @@ function createChartCommands(controller, options = {}) {
537
576
  label: "Delete Category",
538
577
  keywords: ["chart", "category", "row", "remove"],
539
578
  description: "Deletes a category (and its values) by index or label.",
540
- params: object({ category: _chunk4NGVHHJBcjs.CATEGORY_REF }, ["category"]),
579
+ params: object({ category: _chunkNZD2MZJCcjs.CATEGORY_REF }, ["category"]),
541
580
  run: (_ctx, params) => {
542
581
  check(controller.removeCategory(resolveCategory(params.category)));
543
582
  return { categories: controller.getSpec().categories };
@@ -549,7 +588,7 @@ function createChartCommands(controller, options = {}) {
549
588
  label: "Add Trendline\u2026",
550
589
  keywords: ["chart", "trend", "regression", "fit", "forecast", "moving average"],
551
590
  description: "Fits a trendline to a series (linear, exponential, logarithmic, power, polynomial or moving average). Returns its index and the fit.",
552
- params: object({ series: _chunk4NGVHHJBcjs.SERIES_REF, ..._chunk4NGVHHJBcjs.TRENDLINE_PROPS }, ["series", "type"]),
591
+ params: object({ series: _chunkNZD2MZJCcjs.SERIES_REF, ..._chunkNZD2MZJCcjs.TRENDLINE_PROPS }, ["series", "type"]),
553
592
  run: (_ctx, params) => {
554
593
  const { series, ...line } = params;
555
594
  const result = controller.addTrendline(resolveSeries(series).id, line);
@@ -564,12 +603,203 @@ function createChartCommands(controller, options = {}) {
564
603
  label: "Delete Trendline",
565
604
  keywords: ["chart", "trend", "remove"],
566
605
  description: "Deletes a trendline from a series.",
567
- params: object({ series: _chunk4NGVHHJBcjs.SERIES_REF, index: { type: "integer", minimum: 0, description: "Trendline index (0 = first)." } }, ["series", "index"]),
606
+ params: object({ series: _chunkNZD2MZJCcjs.SERIES_REF, index: { type: "integer", minimum: 0, description: "Trendline index (0 = first)." } }, ["series", "index"]),
568
607
  run: (_ctx, params) => {
569
608
  check(controller.removeTrendline(resolveSeries(params.series).id, params.index));
570
609
  return { trendlines: _nullishCoalesce(_optionalChain([controller, 'access', _29 => _29.getSeries, 'call', _30 => _30(resolveSeries(params.series).id), 'optionalAccess', _31 => _31.trendlines]), () => ( [])) };
571
610
  }
572
611
  },
612
+ {
613
+ ...base,
614
+ id: `${prefix}addReferenceLine`,
615
+ label: "Add Reference Line\u2026",
616
+ keywords: ["chart", "target", "goal", "threshold", "average", "reference", "line", "annotation"],
617
+ description: "Draws a dashed line across the plot at one value (a target, floor or average). Returns its index.",
618
+ params: object(_chunkNZD2MZJCcjs.REFERENCE_LINE_PROPS, ["value"]),
619
+ run: (_ctx, params) => {
620
+ const result = controller.addReferenceLine(params);
621
+ check(result);
622
+ return { index: result.index, referenceLines: controller.getSpec().referenceLines };
623
+ }
624
+ },
625
+ {
626
+ ...base,
627
+ id: `${prefix}updateReferenceLine`,
628
+ label: "Change Reference Line\u2026",
629
+ keywords: ["chart", "target", "reference", "line", "annotation"],
630
+ description: "Changes a reference line by index; label, axis and color take null to remove them.",
631
+ params: object({ index: _chunkNZD2MZJCcjs.REFERENCE_INDEX.call(void 0, "Reference line"), ..._chunkNZD2MZJCcjs.REFERENCE_LINE_PATCH }, ["index"]),
632
+ run: (_ctx, params) => {
633
+ const { index, ...patch } = params;
634
+ check(controller.updateReferenceLine(index, patch));
635
+ return { referenceLine: controller.getSpec().referenceLines[index] };
636
+ }
637
+ },
638
+ {
639
+ ...base,
640
+ id: `${prefix}removeReferenceLine`,
641
+ label: "Delete Reference Line",
642
+ keywords: ["chart", "target", "reference", "line", "remove"],
643
+ description: "Deletes a reference line by index.",
644
+ params: object({ index: _chunkNZD2MZJCcjs.REFERENCE_INDEX.call(void 0, "Reference line") }, ["index"]),
645
+ run: (_ctx, params) => {
646
+ check(controller.removeReferenceLine(params.index));
647
+ return { referenceLines: controller.getSpec().referenceLines };
648
+ }
649
+ },
650
+ {
651
+ ...base,
652
+ id: `${prefix}addReferenceBand`,
653
+ label: "Add Reference Band\u2026",
654
+ keywords: ["chart", "target", "range", "band", "reference", "shade", "annotation"],
655
+ description: "Shades a band across the plot between two values (a target or normal range). Returns its index.",
656
+ params: object(_chunkNZD2MZJCcjs.REFERENCE_BAND_PROPS, ["from", "to"]),
657
+ run: (_ctx, params) => {
658
+ const result = controller.addReferenceBand(params);
659
+ check(result);
660
+ return { index: result.index, referenceBands: controller.getSpec().referenceBands };
661
+ }
662
+ },
663
+ {
664
+ ...base,
665
+ id: `${prefix}updateReferenceBand`,
666
+ label: "Change Reference Band\u2026",
667
+ keywords: ["chart", "range", "band", "reference", "annotation"],
668
+ description: "Changes a reference band by index; label, axis and color take null to remove them.",
669
+ params: object({ index: _chunkNZD2MZJCcjs.REFERENCE_INDEX.call(void 0, "Reference band"), ..._chunkNZD2MZJCcjs.REFERENCE_BAND_PATCH }, ["index"]),
670
+ run: (_ctx, params) => {
671
+ const { index, ...patch } = params;
672
+ check(controller.updateReferenceBand(index, patch));
673
+ return { referenceBand: controller.getSpec().referenceBands[index] };
674
+ }
675
+ },
676
+ {
677
+ ...base,
678
+ id: `${prefix}removeReferenceBand`,
679
+ label: "Delete Reference Band",
680
+ keywords: ["chart", "range", "band", "reference", "remove"],
681
+ description: "Deletes a reference band by index.",
682
+ params: object({ index: _chunkNZD2MZJCcjs.REFERENCE_INDEX.call(void 0, "Reference band") }, ["index"]),
683
+ run: (_ctx, params) => {
684
+ check(controller.removeReferenceBand(params.index));
685
+ return { referenceBands: controller.getSpec().referenceBands };
686
+ }
687
+ },
688
+ {
689
+ ...base,
690
+ id: `${prefix}setCallout`,
691
+ label: "Pin Label to Point\u2026",
692
+ keywords: ["chart", "callout", "annotation", "label", "note", "point"],
693
+ description: 'Pins a short label to one bar or point (label null or "" removes it).',
694
+ params: object({ series: _chunkNZD2MZJCcjs.SERIES_REF, category: _chunkNZD2MZJCcjs.CATEGORY_REF, label: { type: ["string", "null"], description: "The label (a few words), or null to remove it." } }, ["series", "category", "label"]),
695
+ run: (_ctx, params) => {
696
+ const series = resolveSeries(params.series);
697
+ const index = resolveCategory(params.category);
698
+ check(controller.setCallout(series.id, index, params.label));
699
+ return { series: series.id, index, label: _nullishCoalesce(_optionalChain([controller, 'access', _32 => _32.getSeries, 'call', _33 => _33(series.id), 'optionalAccess', _34 => _34.callouts, 'optionalAccess', _35 => _35[index]]), () => ( null)) };
700
+ }
701
+ },
702
+ {
703
+ ...base,
704
+ id: `${prefix}highlight`,
705
+ label: "Highlight\u2026",
706
+ keywords: ["chart", "highlight", "emphasise", "emphasize", "focus", "mute", "dim"],
707
+ description: "Draws the named categories and series normally and mutes the rest ([] shows everything). Unknown names change nothing.",
708
+ params: object({ names: { type: "array", items: { type: "string" }, description: "Category labels and / or series names or ids; [] clears the highlight." } }, ["names"]),
709
+ run: (_ctx, params) => {
710
+ const result = controller.setHighlight(params.names);
711
+ check(result);
712
+ const { categories, series } = result;
713
+ return { highlight: controller.getSpec().highlight, categories, series };
714
+ }
715
+ },
716
+ {
717
+ ...base,
718
+ id: `${prefix}setTree`,
719
+ label: "Replace Grouped Data\u2026",
720
+ keywords: ["chart", "tree", "hierarchy", "groups", "treemap", "sunburst", "nested"],
721
+ description: "Replaces the data with groups of items (a tree) for treemaps and sunbursts; [] goes back to plain data.",
722
+ params: { type: "object", properties: { tree: { type: "array", items: { $ref: "#/$defs/chartTreeNode" }, description: "The top-level nodes; [] removes the grouping." } }, required: ["tree"], additionalProperties: false, $defs: _chunkNZD2MZJCcjs.TREE_DEFS },
723
+ run: (_ctx, params) => {
724
+ check(controller.setTree(params.tree));
725
+ return { groups: controller.getSpec().tree.map((n) => ({ name: n.name, total: _chunkR3P2M7HUcjs.chartTreeTotal.call(void 0, n) })) };
726
+ }
727
+ },
728
+ {
729
+ ...base,
730
+ id: `${prefix}importTreeCsv`,
731
+ label: "Import Grouped Data from CSV\u2026",
732
+ keywords: ["chart", "tree", "hierarchy", "csv", "import", "treemap", "sunburst"],
733
+ description: "Replaces the data with grouped data from CSV / TSV: names in every column but the last (group, \u2026, item), the value in the last.",
734
+ params: object(
735
+ {
736
+ csv: { type: "string", description: "CSV or TSV text." },
737
+ header: { type: ["boolean", "string"], enum: [true, false, "auto"], description: "The first row holds column names (default auto)." }
738
+ },
739
+ ["csv"]
740
+ ),
741
+ run: (_ctx, params) => {
742
+ check(controller.importTreeTable(_chunkN3KJFGXTcjs.parseCsv.call(void 0, params.csv, { delimiter: params.csv.includes(" ") ? " " : "," }), { header: params.header }));
743
+ return { tree: controller.getSpec().tree };
744
+ }
745
+ },
746
+ {
747
+ ...base,
748
+ id: `${prefix}addTreeNode`,
749
+ label: "Add Item or Group\u2026",
750
+ keywords: ["chart", "tree", "group", "item", "add", "treemap", "sunburst"],
751
+ description: "Adds an item or group under a group of the grouped data ([] for the top level). Returns its path.",
752
+ params: {
753
+ type: "object",
754
+ properties: {
755
+ parent: { type: "array", items: { type: "string" }, description: "Path of the group to add to; [] or omitted for the top level." },
756
+ node: { $ref: "#/$defs/chartTreeNode", description: "The item or group to add." },
757
+ at: { type: "integer", minimum: 0, description: "Position among its siblings (default: the end)." }
758
+ },
759
+ required: ["node"],
760
+ additionalProperties: false,
761
+ $defs: _chunkNZD2MZJCcjs.TREE_DEFS
762
+ },
763
+ run: (_ctx, params) => {
764
+ const result = controller.addTreeNode(_nullishCoalesce(params.parent, () => ( [])), params.node, { at: params.at });
765
+ check(result);
766
+ return { path: result.path };
767
+ }
768
+ },
769
+ {
770
+ ...base,
771
+ id: `${prefix}updateTreeNode`,
772
+ label: "Change Item or Group\u2026",
773
+ keywords: ["chart", "tree", "group", "item", "rename", "value"],
774
+ description: "Renames a node, sets an item's value or sets a node's colour (null for the palette).",
775
+ params: object(
776
+ {
777
+ path: _chunkNZD2MZJCcjs.TREE_PATH,
778
+ name: { type: "string", description: "New name." },
779
+ value: { type: "number", minimum: 0, description: "Items only: the new amount." },
780
+ color: { type: ["string", "null"], description: "CSS colour, or null for the palette colour." }
781
+ },
782
+ ["path"]
783
+ ),
784
+ run: (_ctx, params) => {
785
+ const { path, ...patch } = params;
786
+ const result = controller.updateTreeNode(path, patch);
787
+ check(result);
788
+ return { path: result.path };
789
+ }
790
+ },
791
+ {
792
+ ...base,
793
+ id: `${prefix}removeTreeNode`,
794
+ label: "Delete Item or Group",
795
+ keywords: ["chart", "tree", "group", "item", "remove", "delete"],
796
+ description: "Deletes a node of the grouped data with everything under it.",
797
+ params: object({ path: _chunkNZD2MZJCcjs.TREE_PATH }, ["path"]),
798
+ run: (_ctx, params) => {
799
+ check(controller.removeTreeNode(params.path));
800
+ return { groups: controller.getSpec().tree.map((n) => ({ name: n.name, total: _chunkR3P2M7HUcjs.chartTreeTotal.call(void 0, n) })) };
801
+ }
802
+ },
573
803
  {
574
804
  ...base,
575
805
  id: `${prefix}applyPreset`,
@@ -577,8 +807,8 @@ function createChartCommands(controller, options = {}) {
577
807
  keywords: ["chart", "quick layout", "style", "colours", "colors", "monochrome", "theme"],
578
808
  description: "Applies a quick layout and / or colour scheme as one undo step.",
579
809
  params: object({
580
- layout: { type: "string", enum: _chunk3IHNXRUVcjs.CHART_LAYOUT_PRESETS.map((p) => p.id), description: "Quick layout id." },
581
- colors: { type: "string", enum: _chunk3IHNXRUVcjs.CHART_COLOR_SCHEMES.map((p) => p.id), description: "Colour scheme id." }
810
+ layout: { type: "string", enum: _chunkGKNEJ6ENcjs.CHART_LAYOUT_PRESETS.map((p) => p.id), description: "Quick layout id." },
811
+ colors: { type: "string", enum: _chunkGKNEJ6ENcjs.CHART_COLOR_SCHEMES.map((p) => p.id), description: "Colour scheme id." }
582
812
  }),
583
813
  run: (_ctx, params = {}) => {
584
814
  check(controller.applyPreset(_nullishCoalesce(params, () => ( {}))));
@@ -593,7 +823,7 @@ function createChartCommands(controller, options = {}) {
593
823
  description: "Swaps series and categories as one undo step.",
594
824
  run: () => {
595
825
  check(controller.transpose());
596
- return { table: _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, controller.getSpec()) };
826
+ return { table: _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, controller.getSpec()) };
597
827
  }
598
828
  },
599
829
  {
@@ -613,7 +843,7 @@ function createChartCommands(controller, options = {}) {
613
843
  run: (_ctx, params) => {
614
844
  const result = controller.importCsv(params.csv, { seriesIn: params.seriesIn, header: params.header });
615
845
  check(result);
616
- return { table: _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, controller.getSpec()), issues: _nullishCoalesce(result.issues, () => ( [])) };
846
+ return { table: _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, controller.getSpec()), issues: _nullishCoalesce(result.issues, () => ( [])) };
617
847
  }
618
848
  },
619
849
  {
@@ -624,7 +854,7 @@ function createChartCommands(controller, options = {}) {
624
854
  description: "Replaces the chart with Mermaid xychart-beta, pie or radar-beta text (one undo step). Unreadable lines are listed with line numbers.",
625
855
  params: object({ mermaid: { type: "string", description: "Mermaid text." } }, ["mermaid"]),
626
856
  run: (_ctx, params) => {
627
- const read = _chunk3IHNXRUVcjs.chartFromMermaid.call(void 0, params.mermaid);
857
+ const read = _chunkGKNEJ6ENcjs.chartFromMermaid.call(void 0, params.mermaid);
628
858
  if (!read.family) fail(read.issues.map((i) => i.message).join(" ") || "Expected Mermaid starting with xychart-beta, pie or radar-beta.");
629
859
  check(controller.update({ ...read.spec }, { label: "Import Mermaid chart" }));
630
860
  return { spec: controller.toJSON(), issues: read.issues };
@@ -638,7 +868,7 @@ function createChartCommands(controller, options = {}) {
638
868
  keywords: ["chart", "mermaid", "markdown", "export"],
639
869
  description: "Returns the chart as Mermaid text (with a round-trip comment unless meta is false).",
640
870
  params: object({ meta: { type: "boolean", description: "Include the %% @pixerate round-trip comment (default true)." } }),
641
- run: (_ctx, params = {}) => ({ mermaid: _chunk3IHNXRUVcjs.chartToMermaid.call(void 0, controller.toJSON(), { meta: _optionalChain([params, 'optionalAccess', _32 => _32.meta]) }) })
871
+ run: (_ctx, params = {}) => ({ mermaid: _chunkGKNEJ6ENcjs.chartToMermaid.call(void 0, controller.toJSON(), { meta: _optionalChain([params, 'optionalAccess', _36 => _36.meta]) }) })
642
872
  },
643
873
  {
644
874
  ...base,
@@ -647,7 +877,7 @@ function createChartCommands(controller, options = {}) {
647
877
  readOnly: true,
648
878
  keywords: ["chart", "office", "word", "powerpoint", "docx", "pptx", "xml", "export"],
649
879
  description: "Returns the chart as a DrawingML chart part (c:chartSpace) and what could not be written.",
650
- run: () => _chunkNA4UVVJ4cjs.chartToOoxml.call(void 0, controller.toJSON())
880
+ run: () => _chunkYGG7WDWTcjs.chartToOoxml.call(void 0, controller.toJSON())
651
881
  },
652
882
  {
653
883
  ...base,
@@ -656,9 +886,9 @@ function createChartCommands(controller, options = {}) {
656
886
  readOnly: true,
657
887
  keywords: ["chart", "svg", "export", "image"],
658
888
  description: "Returns the chart drawn as a standalone, accessible SVG string (with <title> and <desc>).",
659
- params: object({ width: _chunk4NGVHHJBcjs.WIDTH, height: _chunk4NGVHHJBcjs.HEIGHT }),
889
+ params: object({ width: _chunkNZD2MZJCcjs.WIDTH, height: _chunkNZD2MZJCcjs.HEIGHT }),
660
890
  run: (_ctx, params = {}) => ({
661
- svg: _chunk3IHNXRUVcjs.chartToSvg.call(void 0, controller.toJSON(), { width: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _33 => _33.width]), () => ( 640)), height: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _34 => _34.height]), () => ( 400)) })
891
+ svg: _chunkGKNEJ6ENcjs.chartToSvg.call(void 0, controller.toJSON(), { width: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _37 => _37.width]), () => ( 640)), height: _nullishCoalesce(_optionalChain([params, 'optionalAccess', _38 => _38.height]), () => ( 400)) })
662
892
  })
663
893
  },
664
894
  {
@@ -670,7 +900,7 @@ function createChartCommands(controller, options = {}) {
670
900
  description: "Suggests chart types for the current data (or CSV), best first, each with a reason.",
671
901
  params: object({ csv: { type: "string", description: "CSV text to analyse instead of the current data." } }),
672
902
  run: (_ctx, params = {}) => ({
673
- recommendations: recommendChartTypes(_optionalChain([params, 'optionalAccess', _35 => _35.csv]) !== void 0 ? _chunkN3KJFGXTcjs.parseCsv.call(void 0, params.csv) : _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, controller.getSpec()))
903
+ recommendations: recommendChartTypes(_optionalChain([params, 'optionalAccess', _39 => _39.csv]) !== void 0 ? _chunkN3KJFGXTcjs.parseCsv.call(void 0, params.csv) : _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, controller.getSpec()))
674
904
  })
675
905
  },
676
906
  {
@@ -683,8 +913,8 @@ function createChartCommands(controller, options = {}) {
683
913
  run: () => {
684
914
  const s = controller.getSpec();
685
915
  const visible = s.series.filter((x) => !x.hidden);
686
- const colors = _chunkLL3H5XUHcjs.chartColorsByCategory.call(void 0, s.type) ? s.categories.map((_, i) => _optionalChain([visible, 'access', _36 => _36[0], 'optionalAccess', _37 => _37.pointColors, 'optionalAccess', _38 => _38[i]]) || _chunkLL3H5XUHcjs.chartSliceColor.call(void 0, s, i)) : visible.map((x) => _chunkLL3H5XUHcjs.chartSeriesColor.call(void 0, s, s.series.indexOf(x)));
687
- return { colors, ..._chunkLL3H5XUHcjs.checkChartColors.call(void 0, colors) };
916
+ const colors = _chunkR3P2M7HUcjs.chartSpecColorsByCategory.call(void 0, s) ? s.categories.map((_, i) => _optionalChain([visible, 'access', _40 => _40[0], 'optionalAccess', _41 => _41.pointColors, 'optionalAccess', _42 => _42[i]]) || _chunkR3P2M7HUcjs.chartSliceColor.call(void 0, s, i)) : visible.map((x) => _chunkR3P2M7HUcjs.chartSeriesColor.call(void 0, s, s.series.indexOf(x)));
917
+ return { colors, ..._chunkR3P2M7HUcjs.checkChartColors.call(void 0, colors) };
688
918
  }
689
919
  },
690
920
  {
@@ -713,9 +943,9 @@ function chartClientToScene(scene, box, clientX, clientY) {
713
943
  return { x: (clientX - box.left) * sx, y: (clientY - box.top) * sy };
714
944
  }
715
945
  function canDragChartPoint(controller, scene, target) {
716
- if (_optionalChain([target, 'optionalAccess', _39 => _39.kind]) !== "point" || !scene.valueScale || scene.percent) return false;
946
+ if (_optionalChain([target, 'optionalAccess', _43 => _43.kind]) !== "point" || !scene.valueScale || scene.percent) return false;
717
947
  const spec = controller.getSpec();
718
- const family = _chunkLL3H5XUHcjs.chartFamily.call(void 0, spec);
948
+ const family = _chunkR3P2M7HUcjs.chartFamily.call(void 0, spec);
719
949
  if (family !== "cartesian" && family !== "xy" && family !== "waterfall") return false;
720
950
  const series = controller.getSeries(target.seriesId);
721
951
  return !!series && !series.hidden && series.values[target.index] !== null;
@@ -724,7 +954,7 @@ function snapChartDragValue(scene, value, options = {}) {
724
954
  const scale = _nullishCoalesce(options.scale, () => ( scene.valueScale));
725
955
  const tolerance = _nullishCoalesce(options.tolerancePx, () => ( 6));
726
956
  if (scale) {
727
- const px = (v) => _chunkHDGBM7EAcjs.chartScaleToPixel.call(void 0, v, scale);
957
+ const px = (v) => _chunkSBQVEBSUcjs.chartScaleToPixel.call(void 0, v, scale);
728
958
  const at = px(value);
729
959
  let best = null;
730
960
  let bestDist = tolerance;
@@ -739,7 +969,7 @@ function snapChartDragValue(scene, value, options = {}) {
739
969
  }
740
970
  if (best !== null) return best;
741
971
  }
742
- return _chunkHDGBM7EAcjs.snapChartValue.call(void 0, scene, value, options.step, _optionalChain([scale, 'optionalAccess', _40 => _40.ticks]), _optionalChain([scale, 'optionalAccess', _41 => _41.logBase]));
972
+ return _chunkSBQVEBSUcjs.snapChartValue.call(void 0, scene, value, options.step, _optionalChain([scale, 'optionalAccess', _44 => _44.ticks]), _optionalChain([scale, 'optionalAccess', _45 => _45.logBase]));
743
973
  }
744
974
  function startChartPointDrag(controller, scene, target, start, options = {}) {
745
975
  if (!canDragChartPoint(controller, scene, target)) return null;
@@ -748,11 +978,11 @@ function startChartPointDrag(controller, scene, target, start, options = {}) {
748
978
  const series = controller.getSeries(seriesId);
749
979
  const secondary = series.axis === "secondary" && !!scene.valueScale2;
750
980
  const scale = secondary ? scene.valueScale2 : scene.valueScale;
751
- const xy = _chunkLL3H5XUHcjs.chartFamily.call(void 0, spec) === "xy" && !!scene.xScale;
981
+ const xy = _chunkR3P2M7HUcjs.chartFamily.call(void 0, spec) === "xy" && !!scene.xScale;
752
982
  const startValue = _nullishCoalesce(series.values[index], () => ( 0));
753
- const startX = _nullishCoalesce(_optionalChain([series, 'access', _42 => _42.x, 'optionalAccess', _43 => _43[index]]), () => ( null));
754
- const startAt = _chunkHDGBM7EAcjs.chartValueAtPoint.call(void 0, scene, start, secondary);
755
- const startAtX = xy ? _chunkHDGBM7EAcjs.chartXAtPoint.call(void 0, scene, start) : void 0;
983
+ const startX = _nullishCoalesce(_optionalChain([series, 'access', _46 => _46.x, 'optionalAccess', _47 => _47[index]]), () => ( null));
984
+ const startAt = _chunkSBQVEBSUcjs.chartValueAtPoint.call(void 0, scene, start, secondary);
985
+ const startAtX = xy ? _chunkSBQVEBSUcjs.chartXAtPoint.call(void 0, scene, start) : void 0;
756
986
  if (startAt === void 0) return null;
757
987
  const candidates = [0, startValue];
758
988
  if (!xy) {
@@ -770,7 +1000,7 @@ function startChartPointDrag(controller, scene, target, start, options = {}) {
770
1000
  target: { seriesId, index },
771
1001
  move(point, moveOptions = {}) {
772
1002
  if (ended) return;
773
- const at = _chunkHDGBM7EAcjs.chartValueAtPoint.call(void 0, scene, point, secondary);
1003
+ const at = _chunkSBQVEBSUcjs.chartValueAtPoint.call(void 0, scene, point, secondary);
774
1004
  if (at === void 0) return;
775
1005
  const factor = moveOptions.fine ? 0.1 : 1;
776
1006
  const moved = (from, to, s, value) => s.logBase && value > 0 && from > 0 && to > 0 ? value * Math.pow(to / from, factor) : value + (to - from) * factor;
@@ -778,7 +1008,7 @@ function startChartPointDrag(controller, scene, target, start, options = {}) {
778
1008
  let moveX = false;
779
1009
  let atX;
780
1010
  if (xy && startX !== null && startAtX !== void 0) {
781
- atX = _chunkHDGBM7EAcjs.chartXAtPoint.call(void 0, scene, point);
1011
+ atX = _chunkSBQVEBSUcjs.chartXAtPoint.call(void 0, scene, point);
782
1012
  moveX = atX !== void 0;
783
1013
  if (moveOptions.lockAxis) {
784
1014
  if (Math.abs(point.x - start.x) >= Math.abs(point.y - start.y)) moveY = false;
@@ -790,7 +1020,7 @@ function startChartPointDrag(controller, scene, target, start, options = {}) {
790
1020
  if (moveOptions.fine) {
791
1021
  if (s.logBase && !options.step) return v > 0 ? Number(v.toPrecision(3)) : v;
792
1022
  const unit = options.step ? options.step / 10 : s.ticks.length > 1 ? (s.ticks[1] - s.ticks[0]) / 100 : void 0;
793
- return _chunkHDGBM7EAcjs.snapChartValue.call(void 0, scene, v, unit, s.ticks);
1023
+ return _chunkSBQVEBSUcjs.snapChartValue.call(void 0, scene, v, unit, s.ticks);
794
1024
  }
795
1025
  return snapChartDragValue(scene, v, { candidates: c, tolerancePx: options.tolerancePx, step: options.step, scale: s });
796
1026
  };
@@ -801,7 +1031,7 @@ function startChartPointDrag(controller, scene, target, start, options = {}) {
801
1031
  const xs = [..._nullishCoalesce(series.x, () => ( []))];
802
1032
  xs[index] = x;
803
1033
  controller.setValue(seriesId, index, y, { label });
804
- if (x !== _optionalChain([controller, 'access', _44 => _44.getSeries, 'call', _45 => _45(seriesId), 'optionalAccess', _46 => _46.x, 'optionalAccess', _47 => _47[index]])) controller.updateSeries(seriesId, { x: xs });
1034
+ if (x !== _optionalChain([controller, 'access', _48 => _48.getSeries, 'call', _49 => _49(seriesId), 'optionalAccess', _50 => _50.x, 'optionalAccess', _51 => _51[index]])) controller.updateSeries(seriesId, { x: xs });
805
1035
  } else controller.setValue(seriesId, index, y, { label });
806
1036
  },
807
1037
  end() {
@@ -835,7 +1065,7 @@ function handleChartKey(controller, scene, event) {
835
1065
  return true;
836
1066
  case "ArrowLeft":
837
1067
  case "ArrowRight": {
838
- if (event.altKey || _optionalChain([selection, 'optionalAccess', _48 => _48.kind]) !== "point" && _optionalChain([selection, 'optionalAccess', _49 => _49.kind]) !== "category") return false;
1068
+ if (event.altKey || _optionalChain([selection, 'optionalAccess', _52 => _52.kind]) !== "point" && _optionalChain([selection, 'optionalAccess', _53 => _53.kind]) !== "category") return false;
839
1069
  const n = spec.categories.length;
840
1070
  const index = Math.max(0, Math.min(n - 1, selection.index + (event.key === "ArrowRight" ? 1 : -1)));
841
1071
  controller.select({ ...selection, index });
@@ -843,14 +1073,14 @@ function handleChartKey(controller, scene, event) {
843
1073
  }
844
1074
  case "ArrowUp":
845
1075
  case "ArrowDown": {
846
- if (_optionalChain([selection, 'optionalAccess', _50 => _50.kind]) !== "point" || _optionalChain([scene, 'optionalAccess', _51 => _51.percent])) return false;
1076
+ if (_optionalChain([selection, 'optionalAccess', _54 => _54.kind]) !== "point" || _optionalChain([scene, 'optionalAccess', _55 => _55.percent])) return false;
847
1077
  const series = controller.getSeries(selection.seriesId);
848
- const secondary = _optionalChain([series, 'optionalAccess', _52 => _52.axis]) === "secondary";
849
- const scale = _nullishCoalesce((secondary ? _optionalChain([scene, 'optionalAccess', _53 => _53.valueScale2]) : null), () => ( _optionalChain([scene, 'optionalAccess', _54 => _54.valueScale])));
850
- const ticks = _nullishCoalesce(_optionalChain([scale, 'optionalAccess', _55 => _55.ticks]), () => ( []));
1078
+ const secondary = _optionalChain([series, 'optionalAccess', _56 => _56.axis]) === "secondary";
1079
+ const scale = _nullishCoalesce((secondary ? _optionalChain([scene, 'optionalAccess', _57 => _57.valueScale2]) : null), () => ( _optionalChain([scene, 'optionalAccess', _58 => _58.valueScale])));
1080
+ const ticks = _nullishCoalesce(_optionalChain([scale, 'optionalAccess', _59 => _59.ticks]), () => ( []));
851
1081
  const up = event.key === "ArrowUp";
852
- const current = _nullishCoalesce(_optionalChain([series, 'optionalAccess', _56 => _56.values, 'access', _57 => _57[selection.index]]), () => ( null));
853
- if (_optionalChain([scale, 'optionalAccess', _58 => _58.logBase]) && current !== null && current > 0) {
1082
+ const current = _nullishCoalesce(_optionalChain([series, 'optionalAccess', _60 => _60.values, 'access', _61 => _61[selection.index]]), () => ( null));
1083
+ if (_optionalChain([scale, 'optionalAccess', _62 => _62.logBase]) && current !== null && current > 0) {
854
1084
  const power = event.shiftKey ? 1 : event.altKey ? 0.01 : 0.1;
855
1085
  const next = Number((current * Math.pow(scale.logBase, up ? power : -power)).toPrecision(event.altKey ? 4 : 3));
856
1086
  controller.nudgeValue(selection.seriesId, selection.index, next - current);
@@ -878,22 +1108,22 @@ function describeChartSelection(controller, selection = controller.getState().se
878
1108
  case "legend":
879
1109
  return "Legend";
880
1110
  case "axis":
881
- return selection.axis === "x" ? _chunkLL3H5XUHcjs.chartFamily.call(void 0, spec) === "xy" ? "X axis" : "Category axis" : selection.axis === "y" ? "Value axis" : "Secondary value axis";
1111
+ return selection.axis === "x" ? _chunkR3P2M7HUcjs.chartFamily.call(void 0, spec) === "xy" ? "X axis" : "Category axis" : selection.axis === "y" ? "Value axis" : "Secondary value axis";
882
1112
  case "series":
883
- return `Series "${_nullishCoalesce(_optionalChain([controller, 'access', _59 => _59.getSeries, 'call', _60 => _60(selection.seriesId), 'optionalAccess', _61 => _61.name]), () => ( selection.seriesId))}"`;
1113
+ return `Series "${_nullishCoalesce(_optionalChain([controller, 'access', _63 => _63.getSeries, 'call', _64 => _64(selection.seriesId), 'optionalAccess', _65 => _65.name]), () => ( selection.seriesId))}"`;
884
1114
  case "category":
885
1115
  return `Category "${_nullishCoalesce(spec.categories[selection.index], () => ( selection.index))}"`;
886
1116
  case "trendline": {
887
1117
  const series = controller.getSeries(selection.seriesId);
888
- const line = _optionalChain([series, 'optionalAccess', _62 => _62.trendlines, 'optionalAccess', _63 => _63[selection.index]]);
889
- return `${line ? line.type.replace("-", " ") : "Trendline"} trendline on "${_nullishCoalesce(_optionalChain([series, 'optionalAccess', _64 => _64.name]), () => ( selection.seriesId))}"`;
1118
+ const line = _optionalChain([series, 'optionalAccess', _66 => _66.trendlines, 'optionalAccess', _67 => _67[selection.index]]);
1119
+ return `${line ? line.type.replace("-", " ") : "Trendline"} trendline on "${_nullishCoalesce(_optionalChain([series, 'optionalAccess', _68 => _68.name]), () => ( selection.seriesId))}"`;
890
1120
  }
891
1121
  case "point": {
892
1122
  const series = controller.getSeries(selection.seriesId);
893
- const value = _optionalChain([series, 'optionalAccess', _65 => _65.values, 'access', _66 => _66[selection.index]]);
894
- const x = _optionalChain([series, 'optionalAccess', _67 => _67.x, 'optionalAccess', _68 => _68[selection.index]]);
895
- if (x !== void 0 && x !== null && _chunkLL3H5XUHcjs.chartFamily.call(void 0, spec) === "xy") return `${_nullishCoalesce(_optionalChain([series, 'optionalAccess', _69 => _69.name]), () => ( selection.seriesId))}: (${x}, ${_nullishCoalesce(value, () => ( "blank"))})`;
896
- return `${_nullishCoalesce(_optionalChain([series, 'optionalAccess', _70 => _70.name]), () => ( selection.seriesId))} \xB7 ${_nullishCoalesce(spec.categories[selection.index], () => ( selection.index))}: ${_nullishCoalesce(value, () => ( "blank"))}`;
1123
+ const value = _optionalChain([series, 'optionalAccess', _69 => _69.values, 'access', _70 => _70[selection.index]]);
1124
+ const x = _optionalChain([series, 'optionalAccess', _71 => _71.x, 'optionalAccess', _72 => _72[selection.index]]);
1125
+ if (x !== void 0 && x !== null && _chunkR3P2M7HUcjs.chartFamily.call(void 0, spec) === "xy") return `${_nullishCoalesce(_optionalChain([series, 'optionalAccess', _73 => _73.name]), () => ( selection.seriesId))}: (${x}, ${_nullishCoalesce(value, () => ( "blank"))})`;
1126
+ return `${_nullishCoalesce(_optionalChain([series, 'optionalAccess', _74 => _74.name]), () => ( selection.seriesId))} \xB7 ${_nullishCoalesce(spec.categories[selection.index], () => ( selection.index))}: ${_nullishCoalesce(value, () => ( "blank"))}`;
897
1127
  }
898
1128
  }
899
1129
  }
@@ -940,7 +1170,7 @@ var CHART_PRESENCE_COLORS = _chunkSWTUM32Hcjs.PRESENCE_COLORS;
940
1170
  var realChartClock = _chunkSWTUM32Hcjs.realPresenceClock;
941
1171
  var createInstantChartClock = _chunkSWTUM32Hcjs.createInstantPresenceClock;
942
1172
  function chartPointAnchor(scene, seriesId, index) {
943
- const mark = scene.marks.find((m) => (m.role === "bar" || m.role === "point") && _optionalChain([m, 'access', _71 => _71.target, 'optionalAccess', _72 => _72.kind]) === "point" && m.target.seriesId === seriesId && m.target.index === index);
1173
+ const mark = scene.marks.find((m) => (m.role === "bar" || m.role === "point") && _optionalChain([m, 'access', _75 => _75.target, 'optionalAccess', _76 => _76.kind]) === "point" && m.target.seriesId === seriesId && m.target.index === index);
944
1174
  if (!mark) return null;
945
1175
  if (mark.kind === "rect") return { x: mark.x + mark.width / 2, y: mark.y };
946
1176
  if (mark.kind === "circle") return { x: mark.cx, y: mark.cy };
@@ -966,10 +1196,10 @@ function planChartCommand(spec, scene, command, speed = 1) {
966
1196
  case "setValue": {
967
1197
  const at = chartPointAnchor(scene, command.seriesId, command.index);
968
1198
  const series = spec.series.find((s) => s.id === command.seriesId);
969
- const from = _nullishCoalesce(_optionalChain([series, 'optionalAccess', _73 => _73.values, 'access', _74 => _74[command.index]]), () => ( 0));
970
- const scale = _optionalChain([series, 'optionalAccess', _75 => _75.axis]) === "secondary" ? _nullishCoalesce(scene.valueScale2, () => ( scene.valueScale)) : scene.valueScale;
1199
+ const from = _nullishCoalesce(_optionalChain([series, 'optionalAccess', _77 => _77.values, 'access', _78 => _78[command.index]]), () => ( 0));
1200
+ const scale = _optionalChain([series, 'optionalAccess', _79 => _79.axis]) === "secondary" ? _nullishCoalesce(scene.valueScale2, () => ( scene.valueScale)) : scene.valueScale;
971
1201
  if (at && scale) {
972
- const px = _chunkHDGBM7EAcjs.linearMap.call(void 0, command.value, scale.domain, scale.range);
1202
+ const px = _chunkSBQVEBSUcjs.linearMap.call(void 0, command.value, scale.domain, scale.range);
973
1203
  const to = scale.axis === "y" ? { x: at.x, y: px } : { x: px, y: at.y };
974
1204
  steps.push({ type: "move", to: at, ms: ms(380) }, { type: "press" }, { type: "drag", to, ms: ms(520), from, value: command.value }, { type: "release" });
975
1205
  } else steps.push({ type: "drag", to: { x: scene.plot.x + scene.plot.width / 2, y: scene.plot.y + scene.plot.height / 2 }, ms: ms(200), from, value: command.value });
@@ -979,12 +1209,12 @@ function planChartCommand(spec, scene, command, speed = 1) {
979
1209
  case "select": {
980
1210
  const sel = command.selection;
981
1211
  let to = null;
982
- if (_optionalChain([sel, 'optionalAccess', _76 => _76.kind]) === "point") to = chartPointAnchor(scene, sel.seriesId, sel.index);
1212
+ if (_optionalChain([sel, 'optionalAccess', _80 => _80.kind]) === "point") to = chartPointAnchor(scene, sel.seriesId, sel.index);
983
1213
  else if (sel) {
984
1214
  const m = scene.marks.find((x) => x.target && JSON.stringify(x.target) === JSON.stringify(sel));
985
- if (_optionalChain([m, 'optionalAccess', _77 => _77.kind]) === "text") to = { x: m.x, y: m.y };
986
- else if (_optionalChain([m, 'optionalAccess', _78 => _78.kind]) === "rect") to = { x: m.x + m.width / 2, y: m.y + m.height / 2 };
987
- else if (_optionalChain([m, 'optionalAccess', _79 => _79.kind]) === "circle") to = { x: m.cx, y: m.cy };
1215
+ if (_optionalChain([m, 'optionalAccess', _81 => _81.kind]) === "text") to = { x: m.x, y: m.y };
1216
+ else if (_optionalChain([m, 'optionalAccess', _82 => _82.kind]) === "rect") to = { x: m.x + m.width / 2, y: m.y + m.height / 2 };
1217
+ else if (_optionalChain([m, 'optionalAccess', _83 => _83.kind]) === "circle") to = { x: m.cx, y: m.cy };
988
1218
  }
989
1219
  if (to) steps.push({ type: "move", to, ms: ms(380) }, { type: "press" }, { type: "release" });
990
1220
  steps.push({ type: "commit" });
@@ -1066,7 +1296,7 @@ var ChartDirector = class {
1066
1296
  if (command.kind !== "setValue") break;
1067
1297
  const stale2 = this.stale(command);
1068
1298
  if (stale2) return { ok: false, command, message: stale2 };
1069
- const label = `${_nullishCoalesce(_optionalChain([this, 'access', _80 => _80.presence, 'access', _81 => _81.getState, 'call', _82 => _82(), 'access', _83 => _83.actors, 'access', _84 => _84.find, 'call', _85 => _85((a) => a.id === id), 'optionalAccess', _86 => _86.name]), () => ( "Agent"))}: edit value`;
1299
+ const label = `${_nullishCoalesce(_optionalChain([this, 'access', _84 => _84.presence, 'access', _85 => _85.getState, 'call', _86 => _86(), 'access', _87 => _87.actors, 'access', _88 => _88.find, 'call', _89 => _89((a) => a.id === id), 'optionalAccess', _90 => _90.name]), () => ( "Agent"))}: edit value`;
1070
1300
  await this.move(id, where(), step.to, step.ms, (e) => {
1071
1301
  const v = step.from + (step.value - step.from) * e;
1072
1302
  this.controller.setValue(command.seriesId, command.index, Number(v.toPrecision(12)), { label });
@@ -1131,6 +1361,11 @@ function planChartToolPlayback(tool, args) {
1131
1361
  if (args.kind === "point" && typeof args.series === "string" && args.category !== void 0) return click(chartPointRef(args.series, args.category));
1132
1362
  return typeof args.kind === "string" && args.kind !== "none" ? click(control(args.kind)) : null;
1133
1363
  case "set_chart_data":
1364
+ case "set_chart_tree":
1365
+ case "import_chart_tree_csv":
1366
+ case "add_chart_tree_node":
1367
+ case "update_chart_tree_node":
1368
+ case "remove_chart_tree_node":
1134
1369
  case "import_chart_csv":
1135
1370
  case "import_chart_mermaid":
1136
1371
  case "import_chart_ooxml":
@@ -1144,6 +1379,19 @@ function planChartToolPlayback(tool, args) {
1144
1379
  case "add_chart_trendline":
1145
1380
  case "remove_chart_trendline":
1146
1381
  return click(control("trendline.add"));
1382
+ case "add_chart_reference_line":
1383
+ case "update_chart_reference_line":
1384
+ case "remove_chart_reference_line":
1385
+ return click(control("referenceLine.add"));
1386
+ case "add_chart_reference_band":
1387
+ case "update_chart_reference_band":
1388
+ case "remove_chart_reference_band":
1389
+ return click(control("referenceBand.add"));
1390
+ case "set_chart_callout":
1391
+ if (typeof args.series === "string" && (typeof args.category === "string" || typeof args.category === "number")) return [...click(chartPointRef(args.series, args.category)), ...click(control("series.callout"))];
1392
+ return click(control("series.callout"));
1393
+ case "highlight_chart":
1394
+ return click(control("highlight"));
1147
1395
  case "render_chart":
1148
1396
  return [{ type: "target", ref: { kind: "action", id: "download-png" } }];
1149
1397
  case "undo_chart":
@@ -1202,13 +1450,19 @@ function createChartToolProvider(controller, options = {}) {
1202
1450
  fail2(`There is no category ${JSON.stringify(ref)}; expected an index from 0 to ${categories.length - 1} or one of ${categories.slice(0, 20).map((c) => JSON.stringify(c)).join(", ")}.`);
1203
1451
  return index;
1204
1452
  };
1205
- const table = () => _chunkLL3H5XUHcjs.chartDataToTable.call(void 0, spec());
1453
+ const table = () => _chunkR3P2M7HUcjs.chartDataToTable.call(void 0, spec());
1454
+ const treeTable = () => {
1455
+ const rows = _chunkR3P2M7HUcjs.chartTreeToRows.call(void 0, spec().tree);
1456
+ const depth = _chunkR3P2M7HUcjs.chartTreeDepth.call(void 0, spec().tree);
1457
+ return [[...Array.from({ length: depth }, (_, k) => k === 0 ? "Group" : k === depth - 1 ? "Item" : `Level ${k + 1}`), "Value"], ...rows.map((r) => [...r.path, ...Array(depth - r.path.length).fill(""), r.value])];
1458
+ };
1459
+ const treeSummary = () => ({ tree: spec().tree, groups: spec().tree.map((n) => ({ name: n.name, total: _chunkR3P2M7HUcjs.chartTreeTotal.call(void 0, n) })), depth: _chunkR3P2M7HUcjs.chartTreeDepth.call(void 0, spec().tree) });
1206
1460
  const Parser = () => _nullishCoalesce(options.DOMParser, () => ( globalThis.DOMParser));
1207
1461
  const getChart = {
1208
1462
  name: "get_chart",
1209
1463
  title: "Read the chart",
1210
- description: "Returns the chart spec (type, titles, axes, legend, series with ids and settings), its data as a table (header row of series names, then one row per category), the current selection, and a summary at the given size: per-series min / max / mean / trend, the axes as drawn, layout warnings (hidden labels, thinned lines), a colour check and a plain-language description. Use the series ids and category indexes it returns with the write tools.",
1211
- inputSchema: { type: "object", properties: { width: _chunk4NGVHHJBcjs.WIDTH, height: _chunk4NGVHHJBcjs.HEIGHT }, additionalProperties: false },
1464
+ description: "Returns the chart spec (type, titles, axes, legend, series with ids and settings), its data as a table (header row of series names, then one row per category), grouped data as treeTable (path of names to each item, then its value) when the chart has a tree, the current selection, and a summary at the given size: per-series min / max / mean / trend, the axes as drawn, layout warnings (hidden labels, thinned lines), a colour check and a plain-language description. Use the series ids and category indexes it returns with the write tools.",
1465
+ inputSchema: { type: "object", properties: { width: _chunkNZD2MZJCcjs.WIDTH, height: _chunkNZD2MZJCcjs.HEIGHT }, additionalProperties: false },
1212
1466
  annotations: { title: "Read the chart", ...READ },
1213
1467
  handler: ({ width = size.width, height = size.height }) => {
1214
1468
  const reason = readOnlyReason();
@@ -1216,7 +1470,8 @@ function createChartToolProvider(controller, options = {}) {
1216
1470
  spec: controller.toJSON(),
1217
1471
  table: table(),
1218
1472
  selection: controller.getState().selection,
1219
- summary: _chunk3IHNXRUVcjs.summarizeChart.call(void 0, controller.toJSON(), { width, height }),
1473
+ summary: _chunkGKNEJ6ENcjs.summarizeChart.call(void 0, controller.toJSON(), { width, height }),
1474
+ ...spec().tree.length ? { treeTable: treeTable() } : {},
1220
1475
  issues: controller.getState().issues,
1221
1476
  ...reason ? { readOnly: reason } : {}
1222
1477
  };
@@ -1229,8 +1484,8 @@ function createChartToolProvider(controller, options = {}) {
1229
1484
  inputSchema: {
1230
1485
  type: "object",
1231
1486
  properties: {
1232
- width: _chunk4NGVHHJBcjs.WIDTH,
1233
- height: _chunk4NGVHHJBcjs.HEIGHT,
1487
+ width: _chunkNZD2MZJCcjs.WIDTH,
1488
+ height: _chunkNZD2MZJCcjs.HEIGHT,
1234
1489
  format: { type: "string", enum: ["svg", "png"], description: "svg (default): the SVG document as text. png: an image to look at (only when the host can rasterize; costs image tokens)." }
1235
1490
  },
1236
1491
  additionalProperties: false
@@ -1238,8 +1493,8 @@ function createChartToolProvider(controller, options = {}) {
1238
1493
  annotations: { title: "Render the chart", ...READ },
1239
1494
  handler: async ({ width = size.width, height = size.height, format = "svg" }) => {
1240
1495
  const json = controller.toJSON();
1241
- const scene = _chunkHDGBM7EAcjs.layoutChart.call(void 0, json, { width, height, selection: null });
1242
- const svg = _chunk3IHNXRUVcjs.chartSceneToSvg.call(void 0, scene, { ariaLabel: json.title || void 0, description: _chunk3IHNXRUVcjs.describeChart.call(void 0, json) });
1496
+ const scene = _chunkSBQVEBSUcjs.layoutChart.call(void 0, json, { width, height, selection: null });
1497
+ const svg = _chunkGKNEJ6ENcjs.chartSceneToSvg.call(void 0, scene, { ariaLabel: json.title || void 0, description: _chunkGKNEJ6ENcjs.describeChart.call(void 0, json) });
1243
1498
  const warnings = scene.warnings;
1244
1499
  if (format === "png") {
1245
1500
  if (!options.rasterize) fail2('This host cannot rasterize charts; call render_chart with format "svg", or get_chart for the layout warnings.');
@@ -1260,7 +1515,7 @@ function createChartToolProvider(controller, options = {}) {
1260
1515
  const checkColors = {
1261
1516
  name: "check_chart_colors",
1262
1517
  title: "Check chart colours",
1263
- description: "Checks that colours can be told apart with normal vision and with protanopia, deuteranopia and tritanopia (OKLab distance after simulation), and that they stand out from the background. Checks the chart's own series (or slice) colours unless colours are given. Returns the closest pair per vision, contrast ratios and problems as sentences.",
1518
+ description: "Checks whether the chart's colours are accessible: that colour-blind readers can tell them apart (protanopia, deuteranopia and tritanopia, by OKLab distance after simulation) as well as people with normal vision, and that they stand out from the background. Checks the chart's own series (or slice) colours unless colours are given. Returns the closest pair per vision, contrast ratios and problems as sentences.",
1264
1519
  inputSchema: {
1265
1520
  type: "object",
1266
1521
  properties: {
@@ -1273,8 +1528,8 @@ function createChartToolProvider(controller, options = {}) {
1273
1528
  handler: ({ colors, surface }) => {
1274
1529
  const s = spec();
1275
1530
  const visible = s.series.filter((x) => !x.hidden);
1276
- const own = _chunkLL3H5XUHcjs.chartColorsByCategory.call(void 0, s.type) ? s.categories.map((_, i) => _optionalChain([visible, 'access', _87 => _87[0], 'optionalAccess', _88 => _88.pointColors, 'optionalAccess', _89 => _89[i]]) || _chunkLL3H5XUHcjs.chartSliceColor.call(void 0, s, i)) : visible.map((x) => _chunkLL3H5XUHcjs.chartSeriesColor.call(void 0, s, s.series.indexOf(x)));
1277
- return { colors: _nullishCoalesce(colors, () => ( own)), ..._chunkLL3H5XUHcjs.checkChartColors.call(void 0, _nullishCoalesce(colors, () => ( own)), { surface }) };
1531
+ const own = _chunkR3P2M7HUcjs.chartSpecColorsByCategory.call(void 0, s) ? s.categories.map((_, i) => _optionalChain([visible, 'access', _91 => _91[0], 'optionalAccess', _92 => _92.pointColors, 'optionalAccess', _93 => _93[i]]) || _chunkR3P2M7HUcjs.chartSliceColor.call(void 0, s, i)) : visible.map((x) => _chunkR3P2M7HUcjs.chartSeriesColor.call(void 0, s, s.series.indexOf(x)));
1532
+ return { colors: _nullishCoalesce(colors, () => ( own)), ..._chunkR3P2M7HUcjs.checkChartColors.call(void 0, _nullishCoalesce(colors, () => ( own)), { surface }) };
1278
1533
  }
1279
1534
  };
1280
1535
  const recommend = {
@@ -1296,15 +1551,15 @@ function createChartToolProvider(controller, options = {}) {
1296
1551
  description: "Returns a trendline's fitted coefficients (in x for category charts, x = 1, 2, 3, \u2026), R\xB2, equation and the number of points, or the moving-average points.",
1297
1552
  inputSchema: {
1298
1553
  type: "object",
1299
- properties: { series: _chunk4NGVHHJBcjs.SERIES_REF, index: { type: "integer", minimum: 0, description: "Trendline index on the series (0 = first)." } },
1554
+ properties: { series: _chunkNZD2MZJCcjs.SERIES_REF, index: { type: "integer", minimum: 0, description: "Trendline index on the series (0 = first)." } },
1300
1555
  required: ["series", "index"],
1301
1556
  additionalProperties: false
1302
1557
  },
1303
1558
  annotations: { title: "Read a trendline fit", ...READ },
1304
1559
  handler: ({ series, index }) => {
1305
1560
  const s = seriesById(series);
1306
- const line = _optionalChain([s, 'access', _90 => _90.trendlines, 'optionalAccess', _91 => _91[index]]);
1307
- if (!line) fail2(`"${s.name}" has no trendline ${index}; it has ${_nullishCoalesce(_optionalChain([s, 'access', _92 => _92.trendlines, 'optionalAccess', _93 => _93.length]), () => ( 0))}.`);
1561
+ const line = _optionalChain([s, 'access', _94 => _94.trendlines, 'optionalAccess', _95 => _95[index]]);
1562
+ if (!line) fail2(`"${s.name}" has no trendline ${index}; it has ${_nullishCoalesce(_optionalChain([s, 'access', _96 => _96.trendlines, 'optionalAccess', _97 => _97.length]), () => ( 0))}.`);
1308
1563
  if (line.type === "moving-average") return { trendline: line, points: controller.trendlineMovingAverage(s.id, index) };
1309
1564
  const fit = controller.trendlineFit(s.id, index);
1310
1565
  if (!fit) fail2(`The ${line.type} trendline on "${s.name}" cannot be fitted: it needs more points (and positive values for log, exponential and power fits).`);
@@ -1318,8 +1573,8 @@ function createChartToolProvider(controller, options = {}) {
1318
1573
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
1319
1574
  annotations: { title: "List chart presets", ...READ },
1320
1575
  handler: () => ({
1321
- layouts: _chunk3IHNXRUVcjs.CHART_LAYOUT_PRESETS.map(({ id, label, description }) => ({ id, label, description })),
1322
- colorSchemes: _chunk3IHNXRUVcjs.CHART_COLOR_SCHEMES.map(({ id, label, description, palette }) => ({ id, label, description, palette }))
1576
+ layouts: _chunkGKNEJ6ENcjs.CHART_LAYOUT_PRESETS.map(({ id, label, description }) => ({ id, label, description })),
1577
+ colorSchemes: _chunkGKNEJ6ENcjs.CHART_COLOR_SCHEMES.map(({ id, label, description, palette }) => ({ id, label, description, palette }))
1323
1578
  })
1324
1579
  };
1325
1580
  const exportMermaid = {
@@ -1328,7 +1583,7 @@ function createChartToolProvider(controller, options = {}) {
1328
1583
  description: 'Returns the chart as Mermaid text (xychart-beta, pie or radar-beta) for Markdown or chat. With meta (default true) one "%% @pixerate {\u2026}" comment keeps what Mermaid cannot express, so import_chart_mermaid gets the chart back exactly.',
1329
1584
  inputSchema: { type: "object", properties: { meta: { type: "boolean", description: "Include the round-trip comment (default true)." } }, additionalProperties: false },
1330
1585
  annotations: { title: "Export chart as Mermaid", ...READ },
1331
- handler: ({ meta = true }) => ({ mermaid: _chunk3IHNXRUVcjs.chartToMermaid.call(void 0, controller.toJSON(), { meta }) })
1586
+ handler: ({ meta = true }) => ({ mermaid: _chunkGKNEJ6ENcjs.chartToMermaid.call(void 0, controller.toJSON(), { meta }) })
1332
1587
  };
1333
1588
  const exportOoxml = {
1334
1589
  name: "export_chart_ooxml",
@@ -1336,15 +1591,15 @@ function createChartToolProvider(controller, options = {}) {
1336
1591
  description: "Returns the chart as a DrawingML chart part (c:chartSpace) for Word or PowerPoint files, with what could not be written as sentences.",
1337
1592
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
1338
1593
  annotations: { title: "Export chart as Office XML", ...READ },
1339
- handler: () => _chunkNA4UVVJ4cjs.chartToOoxml.call(void 0, controller.toJSON())
1594
+ handler: () => _chunkYGG7WDWTcjs.chartToOoxml.call(void 0, controller.toJSON())
1340
1595
  };
1341
1596
  const updateChart = {
1342
1597
  name: "update_chart",
1343
1598
  title: "Change chart presentation",
1344
- description: 'Changes how the chart looks, as one undo step: type, titles, axes (xAxis = categories or numeric x, yAxis = values, yAxis2 = secondary values; each can be reversed, and value axes can be logarithmic with scale "log"), legend, stacking, orientation, curve, points, data labels and their position, palette, donut hole, bar spacing, histogram bins, waterfall total, radar rings (radarTicks) and grid shape (radarGraticule). All-or-nothing: invalid values change nothing and come back as sentences. Returns the new spec.',
1599
+ description: 'Changes how the chart looks, as one undo step: type, titles, axes (xAxis = categories or numeric x, yAxis = values, yAxis2 = secondary values; each can be reversed, and value axes can be logarithmic with scale "log"), legend, stacking, orientation, curve, points, data labels and their position, palette, donut hole, bar spacing, histogram bins, waterfall total, radar rings (radarTicks) and grid shape (radarGraticule), note, highlight, reference lines and bands (whole lists), and varyColors. All-or-nothing: invalid values change nothing and come back as sentences. Returns the new spec.',
1345
1600
  inputSchema: {
1346
1601
  type: "object",
1347
- properties: _chunk4NGVHHJBcjs.CHART_UPDATE_PROPERTIES,
1602
+ properties: _chunkNZD2MZJCcjs.CHART_UPDATE_PROPERTIES,
1348
1603
  additionalProperties: false
1349
1604
  },
1350
1605
  annotations: { title: "Change chart presentation", ...WRITE_IDEMPOTENT },
@@ -1365,7 +1620,7 @@ function createChartToolProvider(controller, options = {}) {
1365
1620
  series: {
1366
1621
  type: "array",
1367
1622
  description: "The new series (replaces all).",
1368
- items: { type: "object", properties: { id: { type: "string", description: "Stable id (optional)." }, ..._chunk4NGVHHJBcjs.SERIES_PROPS }, required: ["name", "values"], additionalProperties: false }
1623
+ items: { type: "object", properties: { id: { type: "string", description: "Stable id (optional)." }, ..._chunkNZD2MZJCcjs.SERIES_PROPS }, required: ["name", "values"], additionalProperties: false }
1369
1624
  }
1370
1625
  },
1371
1626
  additionalProperties: false
@@ -1388,7 +1643,7 @@ function createChartToolProvider(controller, options = {}) {
1388
1643
  type: "array",
1389
1644
  minItems: 1,
1390
1645
  description: "Values to set.",
1391
- items: { type: "object", properties: { series: _chunk4NGVHHJBcjs.SERIES_REF, category: _chunk4NGVHHJBcjs.CATEGORY_REF, value: _chunk4NGVHHJBcjs.VALUE }, required: ["series", "category", "value"], additionalProperties: false }
1646
+ items: { type: "object", properties: { series: _chunkNZD2MZJCcjs.SERIES_REF, category: _chunkNZD2MZJCcjs.CATEGORY_REF, value: _chunkNZD2MZJCcjs.VALUE }, required: ["series", "category", "value"], additionalProperties: false }
1392
1647
  }
1393
1648
  },
1394
1649
  required: ["cells"],
@@ -1397,7 +1652,7 @@ function createChartToolProvider(controller, options = {}) {
1397
1652
  annotations: { title: "Set chart values", ...WRITE_IDEMPOTENT },
1398
1653
  handler: async ({ cells }) => {
1399
1654
  const resolved = cells.map((c) => ({ seriesId: seriesById(c.series).id, index: categoryIndex(c.category), value: c.value }));
1400
- const parsed = resolved.map((c) => _chunkLL3H5XUHcjs.parseChartValue.call(void 0, c.value));
1655
+ const parsed = resolved.map((c) => _chunkR3P2M7HUcjs.parseChartValue.call(void 0, c.value));
1401
1656
  const bad = resolved.find((_, i) => parsed[i] === void 0);
1402
1657
  if (bad) fail2(`"${String(bad.value)}" is not a number; pass a number, numeric text or null for a gap. Nothing was changed.`);
1403
1658
  if (options.director && parsed.every((v) => typeof v === "number")) {
@@ -1414,7 +1669,7 @@ function createChartToolProvider(controller, options = {}) {
1414
1669
  description: "Adds a series (values padded to the categories) and selects it. Returns its id and stored values.",
1415
1670
  inputSchema: {
1416
1671
  type: "object",
1417
- properties: { ..._chunk4NGVHHJBcjs.SERIES_PROPS, id: { type: "string", description: "Id to use (default: series-N)." }, at: { type: "integer", minimum: 0, description: "Position (default: last)." } },
1672
+ properties: { ..._chunkNZD2MZJCcjs.SERIES_PROPS, id: { type: "string", description: "Id to use (default: series-N)." }, at: { type: "integer", minimum: 0, description: "Position (default: last)." } },
1418
1673
  required: ["name"],
1419
1674
  additionalProperties: false
1420
1675
  },
@@ -1432,7 +1687,7 @@ function createChartToolProvider(controller, options = {}) {
1432
1687
  description: "Renames, recolours, hides, moves to the secondary axis or changes how a series is drawn (marker, curve, labels, format, x values, bubble sizes, point colours, error bars). null resets a field. Values change with set_chart_values. Returns the series.",
1433
1688
  inputSchema: {
1434
1689
  type: "object",
1435
- properties: { series: _chunk4NGVHHJBcjs.SERIES_REF, ...Object.fromEntries(Object.entries(_chunk4NGVHHJBcjs.SERIES_PROPS).filter(([k]) => k !== "values")) },
1690
+ properties: { series: _chunkNZD2MZJCcjs.SERIES_REF, ...Object.fromEntries(Object.entries(_chunkNZD2MZJCcjs.SERIES_PROPS).filter(([k]) => k !== "values")) },
1436
1691
  required: ["series"],
1437
1692
  additionalProperties: false
1438
1693
  },
@@ -1448,7 +1703,7 @@ function createChartToolProvider(controller, options = {}) {
1448
1703
  name: "remove_chart_series",
1449
1704
  title: "Delete a series",
1450
1705
  description: "Deletes a series and its values. Returns the remaining series ids.",
1451
- inputSchema: { type: "object", properties: { series: _chunk4NGVHHJBcjs.SERIES_REF }, required: ["series"], additionalProperties: false },
1706
+ inputSchema: { type: "object", properties: { series: _chunkNZD2MZJCcjs.SERIES_REF }, required: ["series"], additionalProperties: false },
1452
1707
  annotations: { title: "Delete a series", ...DESTRUCTIVE },
1453
1708
  handler: ({ series }) => {
1454
1709
  resolve(controller.removeSeries(seriesById(series).id));
@@ -1466,7 +1721,7 @@ function createChartToolProvider(controller, options = {}) {
1466
1721
  },
1467
1722
  annotations: { title: "Add a category", ...WRITE },
1468
1723
  handler: ({ label, at }) => {
1469
- const result = controller.addCategory(label, { at });
1724
+ const result = resolve(controller.addCategory(label, { at }));
1470
1725
  return { index: result.index, categories: spec().categories };
1471
1726
  }
1472
1727
  };
@@ -1474,7 +1729,7 @@ function createChartToolProvider(controller, options = {}) {
1474
1729
  name: "remove_chart_category",
1475
1730
  title: "Delete a category",
1476
1731
  description: "Deletes a category and its value in every series. Returns the remaining categories.",
1477
- inputSchema: { type: "object", properties: { category: _chunk4NGVHHJBcjs.CATEGORY_REF }, required: ["category"], additionalProperties: false },
1732
+ inputSchema: { type: "object", properties: { category: _chunkNZD2MZJCcjs.CATEGORY_REF }, required: ["category"], additionalProperties: false },
1478
1733
  annotations: { title: "Delete a category", ...DESTRUCTIVE },
1479
1734
  handler: ({ category }) => {
1480
1735
  resolve(controller.removeCategory(categoryIndex(category)));
@@ -1517,7 +1772,7 @@ function createChartToolProvider(controller, options = {}) {
1517
1772
  annotations: { title: "Import a Mermaid chart", ...DESTRUCTIVE },
1518
1773
  handler: ({ mermaid }) => {
1519
1774
  const fenced = /```(?:mermaid)?\s*\n([\s\S]*?)```/.exec(mermaid);
1520
- const read = _chunk3IHNXRUVcjs.chartFromMermaid.call(void 0, fenced ? fenced[1] : mermaid);
1775
+ const read = _chunkGKNEJ6ENcjs.chartFromMermaid.call(void 0, fenced ? fenced[1] : mermaid);
1521
1776
  if (!read.family) fail2(read.issues.map((i) => i.message).join(" ") || "Expected Mermaid starting with xychart-beta, pie or radar-beta.");
1522
1777
  resolve(controller.update({ ...read.spec }, { label: "Import Mermaid chart" }));
1523
1778
  return { spec: controller.toJSON(), issues: read.issues };
@@ -1530,7 +1785,7 @@ function createChartToolProvider(controller, options = {}) {
1530
1785
  inputSchema: { type: "object", properties: { xml: { type: "string", description: "The chart part XML, e.g. word/charts/chart1.xml." } }, required: ["xml"], additionalProperties: false },
1531
1786
  annotations: { title: "Import an Office chart", ...DESTRUCTIVE },
1532
1787
  handler: ({ xml }) => {
1533
- const read = _chunkNA4UVVJ4cjs.chartFromOoxml.call(void 0, xml, { DOMParser: Parser() });
1788
+ const read = _chunkYGG7WDWTcjs.chartFromOoxml.call(void 0, xml, { DOMParser: Parser() });
1534
1789
  if (read.issues.some((i) => i.path === "" || i.path === "plotArea")) fail2(read.issues.map((i) => i.message).join(" "));
1535
1790
  resolve(controller.update({ ...read.spec }, { label: "Import Office chart" }));
1536
1791
  return { spec: controller.toJSON(), issues: read.issues.map((i) => i.message), unsupported: read.unsupported, lossless: read.lossless };
@@ -1540,7 +1795,7 @@ function createChartToolProvider(controller, options = {}) {
1540
1795
  name: "add_chart_trendline",
1541
1796
  title: "Add a trendline",
1542
1797
  description: "Fits a trendline to a series and draws it (unstacked bar, line, area, scatter and bubble charts). Returns its index and the fit: coefficients, R\xB2 and equation.",
1543
- inputSchema: { type: "object", properties: { series: _chunk4NGVHHJBcjs.SERIES_REF, ..._chunk4NGVHHJBcjs.TRENDLINE_PROPS }, required: ["series", "type"], additionalProperties: false },
1798
+ inputSchema: { type: "object", properties: { series: _chunkNZD2MZJCcjs.SERIES_REF, ..._chunkNZD2MZJCcjs.TRENDLINE_PROPS }, required: ["series", "type"], additionalProperties: false },
1544
1799
  annotations: { title: "Add a trendline", ...WRITE },
1545
1800
  handler: ({ series, ...line }) => {
1546
1801
  const s = seriesById(series);
@@ -1554,7 +1809,7 @@ function createChartToolProvider(controller, options = {}) {
1554
1809
  description: "Deletes a trendline from a series. Returns the series' remaining trendlines.",
1555
1810
  inputSchema: {
1556
1811
  type: "object",
1557
- properties: { series: _chunk4NGVHHJBcjs.SERIES_REF, index: { type: "integer", minimum: 0, description: "Trendline index on the series (0 = first)." } },
1812
+ properties: { series: _chunkNZD2MZJCcjs.SERIES_REF, index: { type: "integer", minimum: 0, description: "Trendline index on the series (0 = first)." } },
1558
1813
  required: ["series", "index"],
1559
1814
  additionalProperties: false
1560
1815
  },
@@ -1562,7 +1817,169 @@ function createChartToolProvider(controller, options = {}) {
1562
1817
  handler: ({ series, index }) => {
1563
1818
  const s = seriesById(series);
1564
1819
  resolve(controller.removeTrendline(s.id, index));
1565
- return { series: s.id, trendlines: _nullishCoalesce(_optionalChain([controller, 'access', _94 => _94.getSeries, 'call', _95 => _95(s.id), 'optionalAccess', _96 => _96.trendlines]), () => ( [])) };
1820
+ return { series: s.id, trendlines: _nullishCoalesce(_optionalChain([controller, 'access', _98 => _98.getSeries, 'call', _99 => _99(s.id), 'optionalAccess', _100 => _100.trendlines]), () => ( [])) };
1821
+ }
1822
+ };
1823
+ const referenceTools = (what) => {
1824
+ const Kind = what === "line" ? "Reference line" : "Reference band";
1825
+ const list = () => what === "line" ? spec().referenceLines : spec().referenceBands;
1826
+ const listKey = what === "line" ? "referenceLines" : "referenceBands";
1827
+ const add = {
1828
+ name: `add_chart_reference_${what}`,
1829
+ title: `Add a reference ${what}`,
1830
+ description: what === "line" ? "Draws a dashed line across the plot at one value: a target, a floor, an average (bar, line, area, scatter and bubble charts). The axis grows to keep it in view. Returns its index and the reference lines." : "Shades a band across the plot between two values: a target or normal range (bar, line, area, scatter and bubble charts), drawn under the data. The axis grows to keep it in view. Returns its index and the reference bands.",
1831
+ inputSchema: { type: "object", properties: what === "line" ? _chunkNZD2MZJCcjs.REFERENCE_LINE_PROPS : _chunkNZD2MZJCcjs.REFERENCE_BAND_PROPS, required: what === "line" ? ["value"] : ["from", "to"], additionalProperties: false },
1832
+ annotations: { title: `Add a reference ${what}`, ...WRITE },
1833
+ handler: (args) => {
1834
+ const result = resolve(what === "line" ? controller.addReferenceLine(args) : controller.addReferenceBand(args));
1835
+ return { index: result.index, [listKey]: list() };
1836
+ }
1837
+ };
1838
+ const update = {
1839
+ name: `update_chart_reference_${what}`,
1840
+ title: `Change a reference ${what}`,
1841
+ description: `Changes a reference ${what} by index (all-or-nothing); label, axis and color take null to remove them. Returns the ${what} as stored.`,
1842
+ inputSchema: { type: "object", properties: { index: _chunkNZD2MZJCcjs.REFERENCE_INDEX.call(void 0, Kind), ...what === "line" ? _chunkNZD2MZJCcjs.REFERENCE_LINE_PATCH : _chunkNZD2MZJCcjs.REFERENCE_BAND_PATCH }, required: ["index"], additionalProperties: false },
1843
+ annotations: { title: `Change a reference ${what}`, ...WRITE_IDEMPOTENT },
1844
+ handler: ({ index, ...patch }) => {
1845
+ if (!Object.keys(patch).length) fail2(`Nothing to change: pass at least one field besides index, e.g. {"index": ${index}, "label": "Target"}.`);
1846
+ resolve(what === "line" ? controller.updateReferenceLine(index, patch) : controller.updateReferenceBand(index, patch));
1847
+ return { index, [`reference${what === "line" ? "Line" : "Band"}`]: list()[index] };
1848
+ }
1849
+ };
1850
+ const remove = {
1851
+ name: `remove_chart_reference_${what}`,
1852
+ title: `Delete a reference ${what}`,
1853
+ description: `Deletes a reference ${what} by index; the ones after it move up one. Returns the reference ${what}s left.`,
1854
+ inputSchema: { type: "object", properties: { index: _chunkNZD2MZJCcjs.REFERENCE_INDEX.call(void 0, Kind) }, required: ["index"], additionalProperties: false },
1855
+ annotations: { title: `Delete a reference ${what}`, ...DESTRUCTIVE },
1856
+ handler: ({ index }) => {
1857
+ resolve(what === "line" ? controller.removeReferenceLine(index) : controller.removeReferenceBand(index));
1858
+ return { [listKey]: list() };
1859
+ }
1860
+ };
1861
+ return [add, update, remove];
1862
+ };
1863
+ const [addReferenceLine, updateReferenceLine, removeReferenceLine] = referenceTools("line");
1864
+ const [addReferenceBand, updateReferenceBand, removeReferenceBand] = referenceTools("band");
1865
+ const setCallout = {
1866
+ name: "set_chart_callout",
1867
+ title: "Pin a label to a point",
1868
+ description: 'Pins a short label to one bar or point, with a leader line, to say why it matters ("Record quarter", "Launch"); label null or "" removes it. Bar, line, area, scatter and bubble charts; the point must have a value. Selects the point and returns the series id, category index and label.',
1869
+ inputSchema: {
1870
+ type: "object",
1871
+ properties: { series: _chunkNZD2MZJCcjs.SERIES_REF, category: _chunkNZD2MZJCcjs.CATEGORY_REF, label: { type: ["string", "null"], description: "The label (keep it to a few words), or null to remove it." } },
1872
+ required: ["series", "category", "label"],
1873
+ additionalProperties: false
1874
+ },
1875
+ annotations: { title: "Pin a label to a point", ...WRITE_IDEMPOTENT },
1876
+ handler: ({ series, category, label }) => {
1877
+ const s = seriesById(series);
1878
+ const index = categoryIndex(category);
1879
+ resolve(controller.setCallout(s.id, index, label));
1880
+ return { series: s.id, index, category: spec().categories[index], label: _nullishCoalesce(_optionalChain([controller, 'access', _101 => _101.getSeries, 'call', _102 => _102(s.id), 'optionalAccess', _103 => _103.callouts, 'optionalAccess', _104 => _104[index]]), () => ( null)) };
1881
+ }
1882
+ };
1883
+ const highlight = {
1884
+ name: "highlight_chart",
1885
+ title: "Highlight categories or series",
1886
+ description: "Draws the named categories (labels) and series (names or ids) normally and mutes the rest, to draw attention to the marks the chart is about; [] shows everything again. A point stays bright when its category or its series is named. Unknown names change nothing and are reported. Returns the category indexes and series ids that matched.",
1887
+ inputSchema: {
1888
+ type: "object",
1889
+ properties: { names: { type: "array", items: { type: "string" }, description: "Category labels and / or series names or ids, exactly as get_chart shows them. [] clears the highlight." } },
1890
+ required: ["names"],
1891
+ additionalProperties: false
1892
+ },
1893
+ annotations: { title: "Highlight categories or series", ...WRITE_IDEMPOTENT },
1894
+ handler: ({ names }) => {
1895
+ const result = resolve(controller.setHighlight(names));
1896
+ const s = spec();
1897
+ return { highlight: s.highlight, categories: result.categories.map((index) => ({ index, label: s.categories[index] })), series: result.series.map((id) => ({ id, name: s.series.find((x) => x.id === id).name })) };
1898
+ }
1899
+ };
1900
+ const setTree = {
1901
+ name: "set_chart_tree",
1902
+ title: "Replace grouped data",
1903
+ description: `Replaces the chart's data with groups of items (a tree) for treemaps and sunbursts, as one undo step: items {"name", "value"} and groups {"name", "children"}, up to 6 levels, names unique among siblings. The top-level groups become the categories and their totals the first series, so other chart types draw the totals. [] goes back to plain data (the totals stay as values). Returns the tree, each group's total and the depth.`,
1904
+ inputSchema: { type: "object", properties: { tree: { type: "array", items: { $ref: "#/$defs/chartTreeNode" }, description: "The top-level nodes; [] removes the grouping." } }, required: ["tree"], additionalProperties: false, $defs: _chunkNZD2MZJCcjs.TREE_DEFS },
1905
+ annotations: { title: "Replace grouped data", ...WRITE_IDEMPOTENT },
1906
+ handler: ({ tree }) => {
1907
+ resolve(controller.setTree(tree));
1908
+ return treeSummary();
1909
+ }
1910
+ };
1911
+ const importTreeCsv = {
1912
+ name: "import_chart_tree_csv",
1913
+ title: "Import grouped data from CSV",
1914
+ description: "Replaces the data with grouped data from CSV or TSV: every column but the last holds names (group, subgroup, \u2026, item), the last holds the value. A blank group name repeats the one above, as spreadsheets lay out groups. One undo step. Returns the tree, group totals and depth.",
1915
+ inputSchema: {
1916
+ type: "object",
1917
+ properties: {
1918
+ csv: { type: "string", description: 'CSV or TSV text, e.g. "Region,Country,Customers\\nEurope,France,40\\n,Spain,25".' },
1919
+ header: { type: ["boolean", "string"], enum: [true, false, "auto"], description: "The first row holds column names (default auto: when its last cell is not a number)." }
1920
+ },
1921
+ required: ["csv"],
1922
+ additionalProperties: false
1923
+ },
1924
+ annotations: { title: "Import grouped data from CSV", ...WRITE },
1925
+ handler: ({ csv, header }) => {
1926
+ resolve(controller.importTreeTable(_chunkN3KJFGXTcjs.parseCsv.call(void 0, csv, { delimiter: csv.includes(" ") ? " " : "," }), { header }));
1927
+ return treeSummary();
1928
+ }
1929
+ };
1930
+ const addTreeNode = {
1931
+ name: "add_chart_tree_node",
1932
+ title: "Add an item or group",
1933
+ description: "Adds an item or a group (with children) under a group of the grouped data, or at the top level. Returns its path and its parent's new total.",
1934
+ inputSchema: {
1935
+ type: "object",
1936
+ properties: {
1937
+ parent: { type: "array", items: { type: "string" }, description: "Path of the group to add to; [] or omitted for the top level." },
1938
+ node: { $ref: "#/$defs/chartTreeNode", description: 'The item ({"name", "value"}) or group ({"name", "children"}) to add.' },
1939
+ at: { type: "integer", minimum: 0, description: "Position among its siblings (default: the end)." }
1940
+ },
1941
+ required: ["node"],
1942
+ additionalProperties: false,
1943
+ $defs: _chunkNZD2MZJCcjs.TREE_DEFS
1944
+ },
1945
+ annotations: { title: "Add an item or group", ...WRITE },
1946
+ handler: ({ parent = [], node, at }) => {
1947
+ const result = resolve(controller.addTreeNode(parent, node, { at }));
1948
+ const group = parent.length ? _chunkR3P2M7HUcjs.findChartTreeNode.call(void 0, spec().tree, parent) : null;
1949
+ return { path: result.path, parentTotal: group ? _chunkR3P2M7HUcjs.chartTreeTotal.call(void 0, group) : spec().tree.reduce((t, n) => t + _chunkR3P2M7HUcjs.chartTreeTotal.call(void 0, n), 0) };
1950
+ }
1951
+ };
1952
+ const updateTreeNode = {
1953
+ name: "update_chart_tree_node",
1954
+ title: "Change an item or group",
1955
+ description: "Renames a node, sets an item's value, or sets a node's colour (null goes back to the palette). Groups have no value of their own. Returns the node's path (new if renamed) and the node.",
1956
+ inputSchema: {
1957
+ type: "object",
1958
+ properties: {
1959
+ path: _chunkNZD2MZJCcjs.TREE_PATH,
1960
+ name: { type: "string", description: "New name (unique among its siblings)." },
1961
+ value: { type: "number", minimum: 0, description: "Items only: the new amount." },
1962
+ color: { type: ["string", "null"], description: "CSS colour, or null for the palette colour." }
1963
+ },
1964
+ required: ["path"],
1965
+ additionalProperties: false
1966
+ },
1967
+ annotations: { title: "Change an item or group", ...WRITE_IDEMPOTENT },
1968
+ handler: ({ path, ...patch }) => {
1969
+ if (!Object.keys(patch).length) fail2("Nothing to change: pass name, value or color with the path.");
1970
+ const result = resolve(controller.updateTreeNode(path, patch));
1971
+ return { path: result.path, node: _chunkR3P2M7HUcjs.findChartTreeNode.call(void 0, spec().tree, result.path) };
1972
+ }
1973
+ };
1974
+ const removeTreeNode = {
1975
+ name: "remove_chart_tree_node",
1976
+ title: "Delete an item or group",
1977
+ description: "Deletes a node of the grouped data with everything under it (a group left empty becomes an item with value 0). Returns the group totals left.",
1978
+ inputSchema: { type: "object", properties: { path: _chunkNZD2MZJCcjs.TREE_PATH }, required: ["path"], additionalProperties: false },
1979
+ annotations: { title: "Delete an item or group", ...DESTRUCTIVE },
1980
+ handler: ({ path }) => {
1981
+ resolve(controller.removeTreeNode(path));
1982
+ return { groups: treeSummary().groups };
1566
1983
  }
1567
1984
  };
1568
1985
  const applyPreset = {
@@ -1572,8 +1989,8 @@ function createChartToolProvider(controller, options = {}) {
1572
1989
  inputSchema: {
1573
1990
  type: "object",
1574
1991
  properties: {
1575
- layout: { type: "string", enum: _chunk3IHNXRUVcjs.CHART_LAYOUT_PRESETS.map((p) => p.id), description: "Quick layout id." },
1576
- colors: { type: "string", enum: _chunk3IHNXRUVcjs.CHART_COLOR_SCHEMES.map((p) => p.id), description: "Colour scheme id." }
1992
+ layout: { type: "string", enum: _chunkGKNEJ6ENcjs.CHART_LAYOUT_PRESETS.map((p) => p.id), description: "Quick layout id." },
1993
+ colors: { type: "string", enum: _chunkGKNEJ6ENcjs.CHART_COLOR_SCHEMES.map((p) => p.id), description: "Colour scheme id." }
1577
1994
  },
1578
1995
  additionalProperties: false
1579
1996
  },
@@ -1602,8 +2019,8 @@ function createChartToolProvider(controller, options = {}) {
1602
2019
  type: "object",
1603
2020
  properties: {
1604
2021
  kind: { type: "string", enum: ["none", "chart", "title", "subtitle", "legend", "axis", "series", "point", "category", "trendline"], description: "What to select." },
1605
- series: { ..._chunk4NGVHHJBcjs.SERIES_REF, description: "Series id or name (series, point, trendline)." },
1606
- category: { ..._chunk4NGVHHJBcjs.CATEGORY_REF, description: "Category index or label (point, category)." },
2022
+ series: { ..._chunkNZD2MZJCcjs.SERIES_REF, description: "Series id or name (series, point, trendline)." },
2023
+ category: { ..._chunkNZD2MZJCcjs.CATEGORY_REF, description: "Category index or label (point, category)." },
1607
2024
  axis: { type: "string", enum: ["x", "y", "y2"], description: "Axis (axis)." },
1608
2025
  index: { type: "integer", minimum: 0, description: "Trendline index (trendline)." }
1609
2026
  },
@@ -1661,20 +2078,20 @@ function createChartToolProvider(controller, options = {}) {
1661
2078
  to: { type: "object", description: "End, as fractions of the chart.", properties: { x: { type: "number", minimum: 0, maximum: 1, description: "Fraction of the width." }, y: { type: "number", minimum: 0, maximum: 1, description: "Fraction of the height." } }, required: ["x", "y"], additionalProperties: false },
1662
2079
  fine: { type: "boolean", description: "Move a tenth as far (Alt)." },
1663
2080
  lockAxis: { type: "boolean", description: "Scatter charts: change only the axis moved along most (Shift)." },
1664
- width: _chunk4NGVHHJBcjs.WIDTH,
1665
- height: _chunk4NGVHHJBcjs.HEIGHT
2081
+ width: _chunkNZD2MZJCcjs.WIDTH,
2082
+ height: _chunkNZD2MZJCcjs.HEIGHT
1666
2083
  },
1667
2084
  required: ["from", "to"],
1668
2085
  additionalProperties: false
1669
2086
  },
1670
2087
  annotations: { title: "Drag a chart point", ...WRITE },
1671
2088
  handler: ({ from, to, fine, lockAxis, width = size.width, height = size.height }) => {
1672
- const scene = _chunkHDGBM7EAcjs.layoutChart.call(void 0, controller.toJSON(), { width, height });
2089
+ const scene = _chunkSBQVEBSUcjs.layoutChart.call(void 0, controller.toJSON(), { width, height });
1673
2090
  const start = { x: from.x * width, y: from.y * height };
1674
2091
  const target = chartHitTest(scene, start);
1675
- if (_optionalChain([target, 'optionalAccess', _97 => _97.kind]) !== "point") fail2(`There is no bar or point at (${from.x}, ${from.y}); ${target ? `that is the ${target.kind}` : "that is outside the chart"}. Use render_chart to find marks.`);
2092
+ if (_optionalChain([target, 'optionalAccess', _105 => _105.kind]) !== "point") fail2(`There is no bar or point at (${from.x}, ${from.y}); ${target ? `that is the ${target.kind}` : "that is outside the chart"}. Use render_chart to find marks.`);
1676
2093
  const t = target;
1677
- const before = _nullishCoalesce(_optionalChain([controller, 'access', _98 => _98.getSeries, 'call', _99 => _99(t.seriesId), 'optionalAccess', _100 => _100.values, 'access', _101 => _101[t.index]]), () => ( null));
2094
+ const before = _nullishCoalesce(_optionalChain([controller, 'access', _106 => _106.getSeries, 'call', _107 => _107(t.seriesId), 'optionalAccess', _108 => _108.values, 'access', _109 => _109[t.index]]), () => ( null));
1678
2095
  const session = startChartPointDrag(controller, scene, t, start);
1679
2096
  if (!session) fail2("That point cannot be dragged here (percent-stacked charts, pies and gaps cannot be dragged).");
1680
2097
  session.move({ x: to.x * width, y: to.y * height }, { fine, lockAxis });
@@ -1699,10 +2116,10 @@ function createChartToolProvider(controller, options = {}) {
1699
2116
  },
1700
2117
  annotations: { title: "Press a key on the chart", ...DESTRUCTIVE },
1701
2118
  handler: ({ key: k, shift, alt }) => {
1702
- const scene = _chunkHDGBM7EAcjs.layoutChart.call(void 0, controller.toJSON(), size);
2119
+ const scene = _chunkSBQVEBSUcjs.layoutChart.call(void 0, controller.toJSON(), size);
1703
2120
  const used = handleChartKey(controller, scene, { key: k, shiftKey: shift, altKey: alt });
1704
2121
  const sel = controller.getState().selection;
1705
- const value = _optionalChain([sel, 'optionalAccess', _102 => _102.kind]) === "point" ? _nullishCoalesce(_optionalChain([controller, 'access', _103 => _103.getSeries, 'call', _104 => _104(sel.seriesId), 'optionalAccess', _105 => _105.values, 'access', _106 => _106[sel.index]]), () => ( null)) : void 0;
2122
+ const value = _optionalChain([sel, 'optionalAccess', _110 => _110.kind]) === "point" ? _nullishCoalesce(_optionalChain([controller, 'access', _111 => _111.getSeries, 'call', _112 => _112(sel.seriesId), 'optionalAccess', _113 => _113.values, 'access', _114 => _114[sel.index]]), () => ( null)) : void 0;
1706
2123
  return { used, selection: sel, ...value !== void 0 ? { value } : {} };
1707
2124
  }
1708
2125
  };
@@ -1731,12 +2148,45 @@ function createChartToolProvider(controller, options = {}) {
1731
2148
  }
1732
2149
  };
1733
2150
  const reads = [getChart, renderChart, checkColors, recommend, getTrendline, listPresets, exportMermaid, exportOoxml];
1734
- const writes = [updateChart, setData, setValues, addSeries, updateSeries, removeSeries, addCategory, removeCategory, importCsv, importMermaid, addTrendline, removeTrendline, applyPreset, transpose, select, drag, key, undo, redo];
2151
+ const writes = [
2152
+ updateChart,
2153
+ setData,
2154
+ setValues,
2155
+ addSeries,
2156
+ updateSeries,
2157
+ removeSeries,
2158
+ addCategory,
2159
+ removeCategory,
2160
+ importCsv,
2161
+ importMermaid,
2162
+ addTrendline,
2163
+ removeTrendline,
2164
+ addReferenceLine,
2165
+ updateReferenceLine,
2166
+ removeReferenceLine,
2167
+ addReferenceBand,
2168
+ updateReferenceBand,
2169
+ removeReferenceBand,
2170
+ setCallout,
2171
+ highlight,
2172
+ setTree,
2173
+ importTreeCsv,
2174
+ addTreeNode,
2175
+ updateTreeNode,
2176
+ removeTreeNode,
2177
+ applyPreset,
2178
+ transpose,
2179
+ select,
2180
+ drag,
2181
+ key,
2182
+ undo,
2183
+ redo
2184
+ ];
1735
2185
  return withChartPlayback({
1736
2186
  id: _nullishCoalesce(options.id, () => ( "chart")),
1737
2187
  namespace: options.namespace,
1738
2188
  title: "Chart editor",
1739
- description: "One chart: its spec, data and values, series and categories, trendlines and presets, CSV, Mermaid and OOXML import, rendering and colour checks.",
2189
+ description: "One chart: its spec, data and values, series and categories, trendlines, reference lines and bands, callouts, highlight, grouped data and presets, CSV, Mermaid and OOXML import, rendering and colour checks.",
1740
2190
  skill: "pixerate-chart",
1741
2191
  tools: () => {
1742
2192
  if (readOnlyReason()) return reads;
@@ -1810,12 +2260,12 @@ var ChartStream = (_class = class {
1810
2260
  if (format === "json") {
1811
2261
  const value = complete ? safeParse(text) : parsePartialChartJson(text);
1812
2262
  if (value !== void 0) {
1813
- const read = _chunkLL3H5XUHcjs.normalizeChartSpec.call(void 0, value);
2263
+ const read = _chunkR3P2M7HUcjs.normalizeChartSpec.call(void 0, value);
1814
2264
  spec = read.spec;
1815
2265
  issues = complete ? read.issues : [];
1816
2266
  }
1817
2267
  } else {
1818
- const read = _chunk3IHNXRUVcjs.chartFromMermaid.call(void 0, text, { partial: !complete });
2268
+ const read = _chunkGKNEJ6ENcjs.chartFromMermaid.call(void 0, text, { partial: !complete });
1819
2269
  if (read.family) {
1820
2270
  spec = read.spec;
1821
2271
  issues = complete ? read.issues : [];
@@ -1912,7 +2362,7 @@ function elements(root, localName) {
1912
2362
  }
1913
2363
  function relId(el, localName = "id") {
1914
2364
  for (const a of Array.from(el.attributes)) {
1915
- if (a.localName === localName && (_optionalChain([a, 'access', _107 => _107.namespaceURI, 'optionalAccess', _108 => _108.includes, 'call', _109 => _109("relationships")]) || a.prefix === "r")) return a.value;
2365
+ if (a.localName === localName && (_optionalChain([a, 'access', _115 => _115.namespaceURI, 'optionalAccess', _116 => _116.includes, 'call', _117 => _117("relationships")]) || a.prefix === "r")) return a.value;
1916
2366
  }
1917
2367
  return void 0;
1918
2368
  }
@@ -1931,17 +2381,17 @@ async function readRels(r, partPath) {
1931
2381
  const id = rel.getAttribute("Id");
1932
2382
  if (!id) continue;
1933
2383
  const target = _nullishCoalesce(rel.getAttribute("Target"), () => ( ""));
1934
- const external = _optionalChain([rel, 'access', _110 => _110.getAttribute, 'call', _111 => _111("TargetMode"), 'optionalAccess', _112 => _112.toLowerCase, 'call', _113 => _113()]) === "external";
2384
+ const external = _optionalChain([rel, 'access', _118 => _118.getAttribute, 'call', _119 => _119("TargetMode"), 'optionalAccess', _120 => _120.toLowerCase, 'call', _121 => _121()]) === "external";
1935
2385
  rels.set(id, { type: _nullishCoalesce(rel.getAttribute("Type"), () => ( "")), target: external ? target : resolvePartPath(dirname(partPath), target), external });
1936
2386
  }
1937
2387
  return rels;
1938
2388
  }
1939
- var isChartRef = (el) => el.localName === "chart" && (el.namespaceURI === _chunkNA4UVVJ4cjs.CHART_OOXML_NS || el.namespaceURI === STRICT_CHART_NS || el.namespaceURI === CHARTEX_NS);
2389
+ var isChartRef = (el) => el.localName === "chart" && (el.namespaceURI === _chunkYGG7WDWTcjs.CHART_OOXML_NS || el.namespaceURI === STRICT_CHART_NS || el.namespaceURI === CHARTEX_NS);
1940
2390
  function frameName(ref) {
1941
2391
  for (let el = ref.parentElement; el; el = el.parentElement) {
1942
2392
  if (el.localName === "graphicFrame") {
1943
2393
  const nv = elements(el, "cNvPr")[0];
1944
- return _optionalChain([nv, 'optionalAccess', _114 => _114.getAttribute, 'call', _115 => _115("name")]) || void 0;
2394
+ return _optionalChain([nv, 'optionalAccess', _122 => _122.getAttribute, 'call', _123 => _123("name")]) || void 0;
1945
2395
  }
1946
2396
  }
1947
2397
  return void 0;
@@ -1955,7 +2405,7 @@ async function chartsInPart(r, root, rels, place) {
1955
2405
  const entry = r.zip.get(rel.target);
1956
2406
  if (!entry) continue;
1957
2407
  r.seen.add(rel.target);
1958
- const read = _chunkNA4UVVJ4cjs.chartFromOoxml.call(void 0, await r.zip.readText(entry), { DOMParser: r.Parser });
2408
+ const read = _chunkYGG7WDWTcjs.chartFromOoxml.call(void 0, await r.zip.readText(entry), { DOMParser: r.Parser });
1959
2409
  const name = frameName(ref);
1960
2410
  r.charts.push({
1961
2411
  id: `chart-${r.charts.length + 1}`,
@@ -1977,8 +2427,8 @@ function columnName(index) {
1977
2427
  return name;
1978
2428
  }
1979
2429
  function anchorCell(marker) {
1980
- const col = Number(_optionalChain([firstChild, 'call', _116 => _116(marker, "col"), 'optionalAccess', _117 => _117.textContent]));
1981
- const row = Number(_optionalChain([firstChild, 'call', _118 => _118(marker, "row"), 'optionalAccess', _119 => _119.textContent]));
2430
+ const col = Number(_optionalChain([firstChild, 'call', _124 => _124(marker, "col"), 'optionalAccess', _125 => _125.textContent]));
2431
+ const row = Number(_optionalChain([firstChild, 'call', _126 => _126(marker, "row"), 'optionalAccess', _127 => _127.textContent]));
1982
2432
  return Number.isInteger(col) && Number.isInteger(row) && col >= 0 && row >= 0 ? `${columnName(col)}${row + 1}` : void 0;
1983
2433
  }
1984
2434
  function drawingPlace(ref) {
@@ -2141,7 +2591,7 @@ function createOfficeChartToolProvider(options = {}) {
2141
2591
  description: "Lists the Office files the user opened that charts can be read from. Returns their names and sizes in bytes.",
2142
2592
  inputSchema: { type: "object", properties: {}, additionalProperties: false },
2143
2593
  annotations: { title: "List open files", ...READ2 },
2144
- handler: () => ({ files: (_nullishCoalesce(_optionalChain([options, 'access', _120 => _120.files, 'optionalCall', _121 => _121()]), () => ( []))).map((f) => ({ name: f.name, bytes: f.data.byteLength })) })
2594
+ handler: () => ({ files: (_nullishCoalesce(_optionalChain([options, 'access', _128 => _128.files, 'optionalCall', _129 => _129()]), () => ( []))).map((f) => ({ name: f.name, bytes: f.data.byteLength })) })
2145
2595
  };
2146
2596
  const listCharts = {
2147
2597
  name: "list_file_charts",
@@ -2387,4 +2837,29 @@ function createChartEditorDocument(controller) {
2387
2837
 
2388
2838
 
2389
2839
 
2390
- exports.CHART_AXIS_KINDS = _chunkLL3H5XUHcjs.CHART_AXIS_KINDS; exports.CHART_AXIS_SCALES = _chunkLL3H5XUHcjs.CHART_AXIS_SCALES; exports.CHART_COLOR_SCHEMES = _chunk3IHNXRUVcjs.CHART_COLOR_SCHEMES; exports.CHART_CURVES = _chunkLL3H5XUHcjs.CHART_CURVES; exports.CHART_DATE_STEPS = _chunkHDGBM7EAcjs.CHART_DATE_STEPS; exports.CHART_ERROR_BAR_DIRECTIONS = _chunkLL3H5XUHcjs.CHART_ERROR_BAR_DIRECTIONS; exports.CHART_ERROR_BAR_LABELS = _chunkLL3H5XUHcjs.CHART_ERROR_BAR_LABELS; exports.CHART_ERROR_BAR_TYPES = _chunkLL3H5XUHcjs.CHART_ERROR_BAR_TYPES; exports.CHART_LABEL_POSITIONS = _chunkLL3H5XUHcjs.CHART_LABEL_POSITIONS; exports.CHART_LAYOUT_PRESETS = _chunk3IHNXRUVcjs.CHART_LAYOUT_PRESETS; exports.CHART_LEGEND_POSITIONS = _chunkLL3H5XUHcjs.CHART_LEGEND_POSITIONS; exports.CHART_MARKERS = _chunkLL3H5XUHcjs.CHART_MARKERS; exports.CHART_MERMAID_META_PREFIX = _chunk3IHNXRUVcjs.CHART_MERMAID_META_PREFIX; exports.CHART_NUMBER_STYLES = _chunkLL3H5XUHcjs.CHART_NUMBER_STYLES; exports.CHART_OOXML_CONTENT_TYPE = _chunkNA4UVVJ4cjs.CHART_OOXML_CONTENT_TYPE; exports.CHART_OOXML_NS = _chunkNA4UVVJ4cjs.CHART_OOXML_NS; exports.CHART_OOXML_RELATIONSHIP = _chunkNA4UVVJ4cjs.CHART_OOXML_RELATIONSHIP; exports.CHART_ORIENTATIONS = _chunkLL3H5XUHcjs.CHART_ORIENTATIONS; exports.CHART_PALETTE_SHADES = _chunkLL3H5XUHcjs.CHART_PALETTE_SHADES; exports.CHART_PRESENCE_COLORS = CHART_PRESENCE_COLORS; exports.CHART_RADAR_GRATICULES = _chunkLL3H5XUHcjs.CHART_RADAR_GRATICULES; exports.CHART_RASTER_MAX_SIZE = CHART_RASTER_MAX_SIZE; exports.CHART_SERIES_TYPES = _chunkLL3H5XUHcjs.CHART_SERIES_TYPES; exports.CHART_STACKINGS = _chunkLL3H5XUHcjs.CHART_STACKINGS; exports.CHART_TRENDLINE_TYPES = _chunkLL3H5XUHcjs.CHART_TRENDLINE_TYPES; exports.CHART_TYPES = _chunkLL3H5XUHcjs.CHART_TYPES; exports.CHART_TYPE_LABELS = _chunkLL3H5XUHcjs.CHART_TYPE_LABELS; exports.CSS_VARIABLE_CHART_THEME = _chunkLL3H5XUHcjs.CSS_VARIABLE_CHART_THEME; exports.ChartController = _chunk3IHNXRUVcjs.ChartController; exports.ChartDirector = ChartDirector; exports.ChartPresence = ChartPresence; exports.ChartStream = ChartStream; exports.DEFAULT_CHART_PALETTE = _chunkLL3H5XUHcjs.DEFAULT_CHART_PALETTE; exports.DEFAULT_CHART_THEME = _chunkLL3H5XUHcjs.DEFAULT_CHART_THEME; exports.MAX_CHART_DATA_LABELS = _chunkHDGBM7EAcjs.MAX_CHART_DATA_LABELS; exports.MAX_CHART_LINE_POINTS = _chunkHDGBM7EAcjs.MAX_CHART_LINE_POINTS; exports.MAX_CHART_MARKERS = _chunkHDGBM7EAcjs.MAX_CHART_MARKERS; exports.OfficeChartsError = OfficeChartsError; exports.RENDER_CHART_INSTRUCTIONS = RENDER_CHART_INSTRUCTIONS; exports.analyzeChartTable = analyzeChartTable; exports.blendChartScenes = blendChartScenes; exports.canDragChartPoint = canDragChartPoint; exports.chartBoxStats = _chunkHDGBM7EAcjs.chartBoxStats; exports.chartClientToScene = chartClientToScene; exports.chartColorDistance = _chunkLL3H5XUHcjs.chartColorDistance; exports.chartColorInputValue = _chunkLL3H5XUHcjs.chartColorInputValue; exports.chartColorsByCategory = _chunkLL3H5XUHcjs.chartColorsByCategory; exports.chartContrastRatio = _chunkLL3H5XUHcjs.chartContrastRatio; exports.chartDataFromTable = _chunkLL3H5XUHcjs.chartDataFromTable; exports.chartDataToTable = _chunkLL3H5XUHcjs.chartDataToTable; exports.chartDateLabels = _chunkHDGBM7EAcjs.chartDateLabels; exports.chartDateToSerial = _chunkHDGBM7EAcjs.chartDateToSerial; exports.chartErrorAmounts = _chunkLL3H5XUHcjs.chartErrorAmounts; exports.chartErrorBarsOfType = _chunkLL3H5XUHcjs.chartErrorBarsOfType; exports.chartFamily = _chunkLL3H5XUHcjs.chartFamily; exports.chartFileName = chartFileName; exports.chartFormatToCode = _chunkNA4UVVJ4cjs.chartFormatToCode; exports.chartFromMermaid = _chunk3IHNXRUVcjs.chartFromMermaid; exports.chartFromOoxml = _chunkNA4UVVJ4cjs.chartFromOoxml; exports.chartFromTable = chartFromTable; exports.chartHistogram = _chunkHDGBM7EAcjs.chartHistogram; exports.chartHitTest = chartHitTest; exports.chartLuminance = _chunkLL3H5XUHcjs.chartLuminance; exports.chartMermaidFamily = _chunk3IHNXRUVcjs.chartMermaidFamily; exports.chartMovingAverage = _chunkHDGBM7EAcjs.chartMovingAverage; exports.chartPointAnchor = chartPointAnchor; exports.chartPointColor = _chunkLL3H5XUHcjs.chartPointColor; exports.chartPointRef = chartPointRef; exports.chartPresetPatch = _chunk3IHNXRUVcjs.chartPresetPatch; exports.chartQuantile = _chunkHDGBM7EAcjs.chartQuantile; exports.chartRasterSize = chartRasterSize; exports.chartRgbToHex = _chunkLL3H5XUHcjs.chartRgbToHex; exports.chartRgbToOklab = _chunkLL3H5XUHcjs.chartRgbToOklab; exports.chartScaleFromPixel = _chunkHDGBM7EAcjs.chartScaleFromPixel; exports.chartScaleToPixel = _chunkHDGBM7EAcjs.chartScaleToPixel; exports.chartSceneToDomSpec = _chunk3IHNXRUVcjs.chartSceneToDomSpec; exports.chartSceneToSvg = _chunk3IHNXRUVcjs.chartSceneToSvg; exports.chartSerialToDate = _chunkHDGBM7EAcjs.chartSerialToDate; exports.chartSeriesColor = _chunkLL3H5XUHcjs.chartSeriesColor; exports.chartSeriesType = _chunkLL3H5XUHcjs.chartSeriesType; exports.chartSliceColor = _chunkLL3H5XUHcjs.chartSliceColor; exports.chartSquarify = _chunkHDGBM7EAcjs.chartSquarify; exports.chartSupportsTrendlines = _chunkHDGBM7EAcjs.chartSupportsTrendlines; exports.chartTextBaseline = _chunk3IHNXRUVcjs.chartTextBaseline; exports.chartTextOn = _chunkLL3H5XUHcjs.chartTextOn; exports.chartTextTransform = _chunk3IHNXRUVcjs.chartTextTransform; exports.chartToMermaid = _chunk3IHNXRUVcjs.chartToMermaid; exports.chartToOoxml = _chunkNA4UVVJ4cjs.chartToOoxml; exports.chartToSvg = _chunk3IHNXRUVcjs.chartToSvg; exports.chartTrendlineName = _chunkHDGBM7EAcjs.chartTrendlineName; exports.chartValueAtPoint = _chunkHDGBM7EAcjs.chartValueAtPoint; exports.chartXAtPoint = _chunkHDGBM7EAcjs.chartXAtPoint; exports.checkChartColors = _chunkLL3H5XUHcjs.checkChartColors; exports.cloneChartSeries = _chunkLL3H5XUHcjs.cloneChartSeries; exports.cloneChartSpec = _chunkLL3H5XUHcjs.cloneChartSpec; exports.compileChartFormatCode = _chunkHDGBM7EAcjs.compileChartFormatCode; exports.contrastingTextColor = _chunkHDGBM7EAcjs.contrastingTextColor; exports.createChartCommands = createChartCommands; exports.createChartController = _chunk3IHNXRUVcjs.createChartController; exports.createChartEditorDocument = createChartEditorDocument; exports.createChartRasterizer = createChartRasterizer; exports.createChartSpec = _chunkLL3H5XUHcjs.createChartSpec; exports.createChartToolProvider = createChartToolProvider; exports.createInstantChartClock = createInstantChartClock; exports.createOfficeChartToolProvider = createOfficeChartToolProvider; exports.cyclePaletteColor = _chunkLL3H5XUHcjs.cyclePaletteColor; exports.decimateChartPoints = _chunkHDGBM7EAcjs.decimateChartPoints; exports.defaultChartAxis = _chunkLL3H5XUHcjs.defaultChartAxis; exports.defaultChartErrorBarValue = _chunkLL3H5XUHcjs.defaultChartErrorBarValue; exports.describeChart = _chunk3IHNXRUVcjs.describeChart; exports.describeChartErrorBars = _chunkLL3H5XUHcjs.describeChartErrorBars; exports.describeChartSelection = describeChartSelection; exports.describeOfficeChartPlace = describeOfficeChartPlace; exports.downloadChartPng = downloadChartPng; exports.easeChartTween = easeChartTween; exports.estimateChartTextWidth = _chunkHDGBM7EAcjs.estimateChartTextWidth; exports.extractDocxCharts = extractDocxCharts; exports.extractOfficeCharts = extractOfficeCharts; exports.extractPptxCharts = extractPptxCharts; exports.extractXlsxCharts = extractXlsxCharts; exports.findMermaidCharts = _chunk3IHNXRUVcjs.findMermaidCharts; exports.fitChartTrendline = _chunkHDGBM7EAcjs.fitChartTrendline; exports.formatChartAmountList = _chunkLL3H5XUHcjs.formatChartAmountList; exports.formatChartDate = _chunkHDGBM7EAcjs.formatChartDate; exports.formatChartNumber = _chunkHDGBM7EAcjs.formatChartNumber; exports.formatChartValueWithCode = _chunkHDGBM7EAcjs.formatChartValueWithCode; exports.handleChartKey = handleChartKey; exports.isCartesianChart = _chunkLL3H5XUHcjs.isCartesianChart; exports.isXyChart = _chunkLL3H5XUHcjs.isXyChart; exports.layoutChart = _chunkHDGBM7EAcjs.layoutChart; exports.layoutSparkline = _chunk3IHNXRUVcjs.layoutSparkline; exports.linearMap = _chunkHDGBM7EAcjs.linearMap; exports.locateChartPoint = locateChartPoint; exports.monochromeChartPalette = _chunk3IHNXRUVcjs.monochromeChartPalette; exports.niceLogScale = _chunkHDGBM7EAcjs.niceLogScale; exports.niceScale = _chunkHDGBM7EAcjs.niceScale; exports.niceStep = _chunkHDGBM7EAcjs.niceStep; exports.normalizeChartAxis = _chunkLL3H5XUHcjs.normalizeChartAxis; exports.normalizeChartErrorBars = _chunkLL3H5XUHcjs.normalizeChartErrorBars; exports.normalizeChartSpec = _chunkLL3H5XUHcjs.normalizeChartSpec; exports.normalizeChartTrendline = _chunkLL3H5XUHcjs.normalizeChartTrendline; exports.normalizeChartValues = _chunkLL3H5XUHcjs.normalizeChartValues; exports.parseChartAmountList = _chunkLL3H5XUHcjs.parseChartAmountList; exports.parseChartColor = _chunkLL3H5XUHcjs.parseChartColor; exports.parseChartDate = _chunkHDGBM7EAcjs.parseChartDate; exports.parseChartValue = _chunkLL3H5XUHcjs.parseChartValue; exports.parsePartialChartJson = parsePartialChartJson; exports.planChartCommand = planChartCommand; exports.planChartToolPlayback = planChartToolPlayback; exports.rasterizeChartSvg = rasterizeChartSvg; exports.realChartClock = realChartClock; exports.recommendChartTypes = recommendChartTypes; exports.recommendForShape = recommendForShape; exports.resolveChartSvgPaints = resolveChartSvgPaints; exports.sameChartSelection = _chunkHDGBM7EAcjs.sameChartSelection; exports.shadeChartColor = _chunkLL3H5XUHcjs.shadeChartColor; exports.simulateChartVision = _chunkLL3H5XUHcjs.simulateChartVision; exports.snapChartDragValue = snapChartDragValue; exports.snapChartValue = _chunkHDGBM7EAcjs.snapChartValue; exports.sparklineToSvg = _chunk3IHNXRUVcjs.sparklineToSvg; exports.startChartPointDrag = startChartPointDrag; exports.stepDecimals = _chunkHDGBM7EAcjs.stepDecimals; exports.summarizeChart = _chunk3IHNXRUVcjs.summarizeChart; exports.summarizeChartSeries = _chunkHDGBM7EAcjs.summarizeChartSeries; exports.trendNumberText = _chunkHDGBM7EAcjs.trendNumberText; exports.uniqueChartSeriesId = _chunkLL3H5XUHcjs.uniqueChartSeriesId; exports.withChartPlayback = withChartPlayback;
2840
+
2841
+
2842
+
2843
+
2844
+
2845
+
2846
+
2847
+
2848
+
2849
+
2850
+
2851
+
2852
+
2853
+
2854
+
2855
+
2856
+
2857
+
2858
+
2859
+
2860
+
2861
+
2862
+
2863
+
2864
+
2865
+ exports.CHART_AXIS_KINDS = _chunkR3P2M7HUcjs.CHART_AXIS_KINDS; exports.CHART_AXIS_SCALES = _chunkR3P2M7HUcjs.CHART_AXIS_SCALES; exports.CHART_COLOR_SCHEMES = _chunkGKNEJ6ENcjs.CHART_COLOR_SCHEMES; exports.CHART_CURVES = _chunkR3P2M7HUcjs.CHART_CURVES; exports.CHART_DATE_STEPS = _chunkSBQVEBSUcjs.CHART_DATE_STEPS; exports.CHART_ERROR_BAR_DIRECTIONS = _chunkR3P2M7HUcjs.CHART_ERROR_BAR_DIRECTIONS; exports.CHART_ERROR_BAR_LABELS = _chunkR3P2M7HUcjs.CHART_ERROR_BAR_LABELS; exports.CHART_ERROR_BAR_TYPES = _chunkR3P2M7HUcjs.CHART_ERROR_BAR_TYPES; exports.CHART_LABEL_POSITIONS = _chunkR3P2M7HUcjs.CHART_LABEL_POSITIONS; exports.CHART_LAYOUT_PRESETS = _chunkGKNEJ6ENcjs.CHART_LAYOUT_PRESETS; exports.CHART_LEGEND_POSITIONS = _chunkR3P2M7HUcjs.CHART_LEGEND_POSITIONS; exports.CHART_LIKERT_NEUTRALS = _chunkR3P2M7HUcjs.CHART_LIKERT_NEUTRALS; exports.CHART_LIKERT_SORTS = _chunkR3P2M7HUcjs.CHART_LIKERT_SORTS; exports.CHART_MARKERS = _chunkR3P2M7HUcjs.CHART_MARKERS; exports.CHART_MERMAID_META_PREFIX = _chunkGKNEJ6ENcjs.CHART_MERMAID_META_PREFIX; exports.CHART_NUMBER_STYLES = _chunkR3P2M7HUcjs.CHART_NUMBER_STYLES; exports.CHART_OOXML_CONTENT_TYPE = _chunkYGG7WDWTcjs.CHART_OOXML_CONTENT_TYPE; exports.CHART_OOXML_NS = _chunkYGG7WDWTcjs.CHART_OOXML_NS; exports.CHART_OOXML_RELATIONSHIP = _chunkYGG7WDWTcjs.CHART_OOXML_RELATIONSHIP; exports.CHART_ORIENTATIONS = _chunkR3P2M7HUcjs.CHART_ORIENTATIONS; exports.CHART_PALETTE_SHADES = _chunkR3P2M7HUcjs.CHART_PALETTE_SHADES; exports.CHART_PRESENCE_COLORS = CHART_PRESENCE_COLORS; exports.CHART_RADAR_GRATICULES = _chunkR3P2M7HUcjs.CHART_RADAR_GRATICULES; exports.CHART_RASTER_MAX_SIZE = CHART_RASTER_MAX_SIZE; exports.CHART_REFERENCE_AXES = _chunkR3P2M7HUcjs.CHART_REFERENCE_AXES; exports.CHART_SERIES_TYPES = _chunkR3P2M7HUcjs.CHART_SERIES_TYPES; exports.CHART_STACKINGS = _chunkR3P2M7HUcjs.CHART_STACKINGS; exports.CHART_TRENDLINE_TYPES = _chunkR3P2M7HUcjs.CHART_TRENDLINE_TYPES; exports.CHART_TYPES = _chunkR3P2M7HUcjs.CHART_TYPES; exports.CHART_TYPE_LABELS = _chunkR3P2M7HUcjs.CHART_TYPE_LABELS; exports.CSS_VARIABLE_CHART_THEME = _chunkR3P2M7HUcjs.CSS_VARIABLE_CHART_THEME; exports.ChartController = _chunkGKNEJ6ENcjs.ChartController; exports.ChartDirector = ChartDirector; exports.ChartPresence = ChartPresence; exports.ChartStream = ChartStream; exports.DEFAULT_CHART_PALETTE = _chunkR3P2M7HUcjs.DEFAULT_CHART_PALETTE; exports.DEFAULT_CHART_THEME = _chunkR3P2M7HUcjs.DEFAULT_CHART_THEME; exports.MAX_CHART_DATA_LABELS = _chunkSBQVEBSUcjs.MAX_CHART_DATA_LABELS; exports.MAX_CHART_LINE_POINTS = _chunkSBQVEBSUcjs.MAX_CHART_LINE_POINTS; exports.MAX_CHART_MARKERS = _chunkSBQVEBSUcjs.MAX_CHART_MARKERS; exports.MAX_CHART_TREE_DEPTH = _chunkR3P2M7HUcjs.MAX_CHART_TREE_DEPTH; exports.MAX_CHART_TREE_NODES = _chunkR3P2M7HUcjs.MAX_CHART_TREE_NODES; exports.OfficeChartsError = OfficeChartsError; exports.RENDER_CHART_INSTRUCTIONS = RENDER_CHART_INSTRUCTIONS; exports.addChartTreeRow = _chunkR3P2M7HUcjs.addChartTreeRow; exports.analyzeChartTable = analyzeChartTable; exports.blendChartScenes = blendChartScenes; exports.canDragChartPoint = canDragChartPoint; exports.chartBoxStats = _chunkSBQVEBSUcjs.chartBoxStats; exports.chartClientToScene = chartClientToScene; exports.chartColorDistance = _chunkR3P2M7HUcjs.chartColorDistance; exports.chartColorInputValue = _chunkR3P2M7HUcjs.chartColorInputValue; exports.chartColorsByCategory = _chunkR3P2M7HUcjs.chartColorsByCategory; exports.chartContrastRatio = _chunkR3P2M7HUcjs.chartContrastRatio; exports.chartDataFromTable = _chunkR3P2M7HUcjs.chartDataFromTable; exports.chartDataToTable = _chunkR3P2M7HUcjs.chartDataToTable; exports.chartDateLabels = _chunkSBQVEBSUcjs.chartDateLabels; exports.chartDateToSerial = _chunkSBQVEBSUcjs.chartDateToSerial; exports.chartErrorAmounts = _chunkR3P2M7HUcjs.chartErrorAmounts; exports.chartErrorBarsOfType = _chunkR3P2M7HUcjs.chartErrorBarsOfType; exports.chartFamily = _chunkR3P2M7HUcjs.chartFamily; exports.chartFileName = chartFileName; exports.chartFormatToCode = _chunkYGG7WDWTcjs.chartFormatToCode; exports.chartFromMermaid = _chunkGKNEJ6ENcjs.chartFromMermaid; exports.chartFromOoxml = _chunkYGG7WDWTcjs.chartFromOoxml; exports.chartFromTable = chartFromTable; exports.chartHistogram = _chunkSBQVEBSUcjs.chartHistogram; exports.chartHitTest = chartHitTest; exports.chartLikertColor = _chunkR3P2M7HUcjs.chartLikertColor; exports.chartLuminance = _chunkR3P2M7HUcjs.chartLuminance; exports.chartMermaidFamily = _chunkGKNEJ6ENcjs.chartMermaidFamily; exports.chartMovingAverage = _chunkSBQVEBSUcjs.chartMovingAverage; exports.chartPointAnchor = chartPointAnchor; exports.chartPointColor = _chunkR3P2M7HUcjs.chartPointColor; exports.chartPointRef = chartPointRef; exports.chartPresetPatch = _chunkGKNEJ6ENcjs.chartPresetPatch; exports.chartQuantile = _chunkSBQVEBSUcjs.chartQuantile; exports.chartRasterSize = chartRasterSize; exports.chartRgbToHex = _chunkR3P2M7HUcjs.chartRgbToHex; exports.chartRgbToOklab = _chunkR3P2M7HUcjs.chartRgbToOklab; exports.chartScaleFromPixel = _chunkSBQVEBSUcjs.chartScaleFromPixel; exports.chartScaleToPixel = _chunkSBQVEBSUcjs.chartScaleToPixel; exports.chartSceneToDomSpec = _chunkGKNEJ6ENcjs.chartSceneToDomSpec; exports.chartSceneToSvg = _chunkGKNEJ6ENcjs.chartSceneToSvg; exports.chartSerialToDate = _chunkSBQVEBSUcjs.chartSerialToDate; exports.chartSeriesColor = _chunkR3P2M7HUcjs.chartSeriesColor; exports.chartSeriesType = _chunkR3P2M7HUcjs.chartSeriesType; exports.chartSliceColor = _chunkR3P2M7HUcjs.chartSliceColor; exports.chartSpecColorsByCategory = _chunkR3P2M7HUcjs.chartSpecColorsByCategory; exports.chartSquarify = _chunkSBQVEBSUcjs.chartSquarify; exports.chartSupportsTrendlines = _chunkSBQVEBSUcjs.chartSupportsTrendlines; exports.chartTextBaseline = _chunkGKNEJ6ENcjs.chartTextBaseline; exports.chartTextOn = _chunkR3P2M7HUcjs.chartTextOn; exports.chartTextTransform = _chunkGKNEJ6ENcjs.chartTextTransform; exports.chartToMermaid = _chunkGKNEJ6ENcjs.chartToMermaid; exports.chartToOoxml = _chunkYGG7WDWTcjs.chartToOoxml; exports.chartToSvg = _chunkGKNEJ6ENcjs.chartToSvg; exports.chartTreeColumnLabels = _chunkR3P2M7HUcjs.chartTreeColumnLabels; exports.chartTreeDepth = _chunkR3P2M7HUcjs.chartTreeDepth; exports.chartTreeFromRows = _chunkR3P2M7HUcjs.chartTreeFromRows; exports.chartTreeFromSeries = _chunkR3P2M7HUcjs.chartTreeFromSeries; exports.chartTreeFromTable = _chunkR3P2M7HUcjs.chartTreeFromTable; exports.chartTreeToRows = _chunkR3P2M7HUcjs.chartTreeToRows; exports.chartTreeTotal = _chunkR3P2M7HUcjs.chartTreeTotal; exports.chartTrendlineName = _chunkSBQVEBSUcjs.chartTrendlineName; exports.chartValueAtPoint = _chunkSBQVEBSUcjs.chartValueAtPoint; exports.chartVariesColors = _chunkR3P2M7HUcjs.chartVariesColors; exports.chartXAtPoint = _chunkSBQVEBSUcjs.chartXAtPoint; exports.checkChartColors = _chunkR3P2M7HUcjs.checkChartColors; exports.cloneChartSeries = _chunkR3P2M7HUcjs.cloneChartSeries; exports.cloneChartSpec = _chunkR3P2M7HUcjs.cloneChartSpec; exports.cloneChartTree = _chunkR3P2M7HUcjs.cloneChartTree; exports.compileChartFormatCode = _chunkSBQVEBSUcjs.compileChartFormatCode; exports.contrastingTextColor = _chunkSBQVEBSUcjs.contrastingTextColor; exports.createChartCommands = createChartCommands; exports.createChartController = _chunkGKNEJ6ENcjs.createChartController; exports.createChartEditorDocument = createChartEditorDocument; exports.createChartRasterizer = createChartRasterizer; exports.createChartSpec = _chunkR3P2M7HUcjs.createChartSpec; exports.createChartToolProvider = createChartToolProvider; exports.createInstantChartClock = createInstantChartClock; exports.createOfficeChartToolProvider = createOfficeChartToolProvider; exports.cyclePaletteColor = _chunkR3P2M7HUcjs.cyclePaletteColor; exports.decimateChartPoints = _chunkSBQVEBSUcjs.decimateChartPoints; exports.defaultChartAxis = _chunkR3P2M7HUcjs.defaultChartAxis; exports.defaultChartErrorBarValue = _chunkR3P2M7HUcjs.defaultChartErrorBarValue; exports.describeChart = _chunkGKNEJ6ENcjs.describeChart; exports.describeChartErrorBars = _chunkR3P2M7HUcjs.describeChartErrorBars; exports.describeChartSelection = describeChartSelection; exports.describeOfficeChartPlace = describeOfficeChartPlace; exports.downloadChartPng = downloadChartPng; exports.easeChartTween = easeChartTween; exports.estimateChartTextWidth = _chunkSBQVEBSUcjs.estimateChartTextWidth; exports.extractDocxCharts = extractDocxCharts; exports.extractOfficeCharts = extractOfficeCharts; exports.extractPptxCharts = extractPptxCharts; exports.extractXlsxCharts = extractXlsxCharts; exports.findChartTreeNode = _chunkR3P2M7HUcjs.findChartTreeNode; exports.findMermaidCharts = _chunkGKNEJ6ENcjs.findMermaidCharts; exports.fitChartTrendline = _chunkSBQVEBSUcjs.fitChartTrendline; exports.formatChartAmountList = _chunkR3P2M7HUcjs.formatChartAmountList; exports.formatChartDate = _chunkSBQVEBSUcjs.formatChartDate; exports.formatChartNumber = _chunkSBQVEBSUcjs.formatChartNumber; exports.formatChartValueWithCode = _chunkSBQVEBSUcjs.formatChartValueWithCode; exports.handleChartKey = handleChartKey; exports.isCartesianChart = _chunkR3P2M7HUcjs.isCartesianChart; exports.isXyChart = _chunkR3P2M7HUcjs.isXyChart; exports.layoutChart = _chunkSBQVEBSUcjs.layoutChart; exports.layoutSparkline = _chunkGKNEJ6ENcjs.layoutSparkline; exports.linearMap = _chunkSBQVEBSUcjs.linearMap; exports.locateChartPoint = locateChartPoint; exports.monochromeChartPalette = _chunkGKNEJ6ENcjs.monochromeChartPalette; exports.niceLogScale = _chunkSBQVEBSUcjs.niceLogScale; exports.niceScale = _chunkSBQVEBSUcjs.niceScale; exports.niceStep = _chunkSBQVEBSUcjs.niceStep; exports.normalizeChartAxis = _chunkR3P2M7HUcjs.normalizeChartAxis; exports.normalizeChartErrorBars = _chunkR3P2M7HUcjs.normalizeChartErrorBars; exports.normalizeChartReferenceBand = _chunkR3P2M7HUcjs.normalizeChartReferenceBand; exports.normalizeChartReferenceLine = _chunkR3P2M7HUcjs.normalizeChartReferenceLine; exports.normalizeChartSpec = _chunkR3P2M7HUcjs.normalizeChartSpec; exports.normalizeChartTree = _chunkR3P2M7HUcjs.normalizeChartTree; exports.normalizeChartTrendline = _chunkR3P2M7HUcjs.normalizeChartTrendline; exports.normalizeChartValues = _chunkR3P2M7HUcjs.normalizeChartValues; exports.parseChartAmountList = _chunkR3P2M7HUcjs.parseChartAmountList; exports.parseChartColor = _chunkR3P2M7HUcjs.parseChartColor; exports.parseChartDate = _chunkSBQVEBSUcjs.parseChartDate; exports.parseChartValue = _chunkR3P2M7HUcjs.parseChartValue; exports.parsePartialChartJson = parsePartialChartJson; exports.planChartCommand = planChartCommand; exports.planChartToolPlayback = planChartToolPlayback; exports.rasterizeChartSvg = rasterizeChartSvg; exports.realChartClock = realChartClock; exports.recommendChartTypes = recommendChartTypes; exports.recommendForShape = recommendForShape; exports.removeChartTreeRow = _chunkR3P2M7HUcjs.removeChartTreeRow; exports.resolveChartSvgPaints = resolveChartSvgPaints; exports.sameChartSelection = _chunkSBQVEBSUcjs.sameChartSelection; exports.setChartTreeRowName = _chunkR3P2M7HUcjs.setChartTreeRowName; exports.setChartTreeRowValue = _chunkR3P2M7HUcjs.setChartTreeRowValue; exports.shadeChartColor = _chunkR3P2M7HUcjs.shadeChartColor; exports.simulateChartVision = _chunkR3P2M7HUcjs.simulateChartVision; exports.snapChartDragValue = snapChartDragValue; exports.snapChartValue = _chunkSBQVEBSUcjs.snapChartValue; exports.sparklineToSvg = _chunkGKNEJ6ENcjs.sparklineToSvg; exports.startChartPointDrag = startChartPointDrag; exports.stepDecimals = _chunkSBQVEBSUcjs.stepDecimals; exports.suggestChartReferences = _chunkSBQVEBSUcjs.suggestChartReferences; exports.summarizeChart = _chunkGKNEJ6ENcjs.summarizeChart; exports.summarizeChartSeries = _chunkSBQVEBSUcjs.summarizeChartSeries; exports.trendNumberText = _chunkSBQVEBSUcjs.trendNumberText; exports.uniqueChartSeriesId = _chunkR3P2M7HUcjs.uniqueChartSeriesId; exports.withChartPlayback = withChartPlayback;