stickyflow 0.9.3 → 0.11.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 (66) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +1 -1
  3. package/dist/binding/index.cjs +9 -9
  4. package/dist/binding/index.d.cts +4 -4
  5. package/dist/binding/index.d.ts +4 -4
  6. package/dist/binding/index.js +3 -3
  7. package/dist/{chunk-EURX7QT3.cjs → chunk-5G3BEXQU.cjs} +1300 -891
  8. package/dist/chunk-5G3BEXQU.cjs.map +1 -0
  9. package/dist/{chunk-AAP24GBG.js → chunk-BFQWCOEC.js} +3 -3
  10. package/dist/chunk-BFQWCOEC.js.map +1 -0
  11. package/dist/{chunk-3EOG34QN.cjs → chunk-F24JURN2.cjs} +561 -258
  12. package/dist/chunk-F24JURN2.cjs.map +1 -0
  13. package/dist/{chunk-2GKXPZRL.cjs → chunk-FXGXUWSI.cjs} +23 -23
  14. package/dist/chunk-FXGXUWSI.cjs.map +1 -0
  15. package/dist/{chunk-Q6FBISNP.js → chunk-G6IW2IX3.js} +601 -350
  16. package/dist/chunk-G6IW2IX3.js.map +1 -0
  17. package/dist/{chunk-G2N3KJYJ.js → chunk-Q6QLU6YQ.js} +662 -253
  18. package/dist/chunk-Q6QLU6YQ.js.map +1 -0
  19. package/dist/{chunk-C3LVKPWQ.js → chunk-RQYZNW2I.js} +532 -229
  20. package/dist/chunk-RQYZNW2I.js.map +1 -0
  21. package/dist/{chunk-XNNNIOJU.js → chunk-UB2ANTWF.js} +5 -5
  22. package/dist/{chunk-XNNNIOJU.js.map → chunk-UB2ANTWF.js.map} +1 -1
  23. package/dist/{chunk-C25NWWIH.cjs → chunk-UHKFJBY5.cjs} +605 -350
  24. package/dist/chunk-UHKFJBY5.cjs.map +1 -0
  25. package/dist/{chunk-MR32IJQO.cjs → chunk-WZA3DJJH.cjs} +15 -15
  26. package/dist/chunk-WZA3DJJH.cjs.map +1 -0
  27. package/dist/index.cjs +36 -36
  28. package/dist/index.d.cts +35 -30
  29. package/dist/index.d.ts +35 -30
  30. package/dist/index.js +5 -5
  31. package/dist/interaction/index.cjs +319 -352
  32. package/dist/interaction/index.cjs.map +1 -1
  33. package/dist/interaction/index.d.cts +3 -3
  34. package/dist/interaction/index.d.ts +3 -3
  35. package/dist/interaction/index.js +94 -127
  36. package/dist/interaction/index.js.map +1 -1
  37. package/dist/{render-DU4lYbRl.d.ts → render-BDO4S5uF.d.cts} +16 -0
  38. package/dist/{render-DU4lYbRl.d.cts → render-BDO4S5uF.d.ts} +16 -0
  39. package/dist/{runtime-DG8X3Fwf.d.cts → runtime-C-C5v9po.d.cts} +2 -2
  40. package/dist/{runtime-kqD1RS17.d.ts → runtime-lCAfU-1Q.d.ts} +2 -2
  41. package/dist/{runtimeTypes-vRaHOIHi.d.ts → runtimeTypes-B7p6b1Bi.d.cts} +2 -2
  42. package/dist/{runtimeTypes-CvjlBZds.d.cts → runtimeTypes-BDA_CfWh.d.ts} +2 -2
  43. package/dist/stickyflow-diagram.global.js +197 -44
  44. package/dist/stickyflow-diagram.global.js.map +1 -1
  45. package/dist/{types-B5jrEEcF.d.cts → types-CZJzycKw.d.cts} +1 -1
  46. package/dist/{types-B7IkZ0w4.d.ts → types-Dp8JVZLB.d.ts} +1 -1
  47. package/dist/viewer/index.cjs +9 -9
  48. package/dist/viewer/index.d.cts +4 -4
  49. package/dist/viewer/index.d.ts +4 -4
  50. package/dist/viewer/index.js +4 -4
  51. package/dist/web-component/index.cjs +6 -6
  52. package/dist/web-component/index.cjs.map +1 -1
  53. package/dist/web-component/index.d.cts +2 -2
  54. package/dist/web-component/index.d.ts +2 -2
  55. package/dist/web-component/index.js +4 -4
  56. package/dist/web-component/index.js.map +1 -1
  57. package/package.json +1 -1
  58. package/dist/chunk-2GKXPZRL.cjs.map +0 -1
  59. package/dist/chunk-3EOG34QN.cjs.map +0 -1
  60. package/dist/chunk-AAP24GBG.js.map +0 -1
  61. package/dist/chunk-C25NWWIH.cjs.map +0 -1
  62. package/dist/chunk-C3LVKPWQ.js.map +0 -1
  63. package/dist/chunk-EURX7QT3.cjs.map +0 -1
  64. package/dist/chunk-G2N3KJYJ.js.map +0 -1
  65. package/dist/chunk-MR32IJQO.cjs.map +0 -1
  66. package/dist/chunk-Q6FBISNP.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkMR32IJQO_cjs = require('../chunk-MR32IJQO.cjs');
4
- var chunkC25NWWIH_cjs = require('../chunk-C25NWWIH.cjs');
3
+ var chunkWZA3DJJH_cjs = require('../chunk-WZA3DJJH.cjs');
4
+ var chunkUHKFJBY5_cjs = require('../chunk-UHKFJBY5.cjs');
5
5
 
6
6
  // src/runtime/interaction/chartValue/coordinates.ts
7
7
  function pointerUserY(svg, event) {
@@ -70,13 +70,13 @@ function updateConnectedLine(svg, drag) {
70
70
  }));
71
71
  const line = findConnectedLine(svg, drag.owner.id, drag.series);
72
72
  if (line) {
73
- line.setAttribute("d", chunkC25NWWIH_cjs.linePathData(points, drag.lineTension));
73
+ line.setAttribute("d", chunkUHKFJBY5_cjs.linePathData(points, drag.lineTension));
74
74
  }
75
75
  const area = findConnectedLineArea(svg, drag.owner.id, drag.series);
76
76
  if (area && points.length > 1) {
77
77
  const first = points[0];
78
78
  const last = points[points.length - 1];
79
- const d = `${chunkC25NWWIH_cjs.linePathData(points, drag.lineTension)} L ${last.x} ${drag.baseY} L ${first.x} ${drag.baseY} Z`;
79
+ const d = `${chunkUHKFJBY5_cjs.linePathData(points, drag.lineTension)} L ${last.x} ${drag.baseY} L ${first.x} ${drag.baseY} Z`;
80
80
  area.setAttribute("d", d);
81
81
  }
82
82
  }
@@ -90,14 +90,14 @@ function setBarPath(svg, drag, d) {
90
90
  function updateChartValuePreview(svg, drag, value) {
91
91
  if (drag.isBar && drag.scale.horizontal) {
92
92
  const width = Math.max(0, pixelForValue(value, drag.scale) - drag.barX);
93
- setBarPath(svg, drag, chunkC25NWWIH_cjs.roundedBarPath(drag.barX, drag.barTop, width, drag.barHeight, drag.barRadius));
93
+ setBarPath(svg, drag, chunkUHKFJBY5_cjs.roundedBarPath(drag.barX, drag.barTop, width, drag.barHeight, drag.barRadius));
94
94
  return;
95
95
  }
96
96
  const y = pixelForValue(value, drag.scale);
97
97
  if (drag.isBar) {
98
98
  const top = Math.min(y, drag.baseY);
99
99
  const height = Math.max(0, Math.abs(drag.baseY - y));
100
- setBarPath(svg, drag, chunkC25NWWIH_cjs.barShapePath(drag.barX, top, drag.barWidth, height, drag.barRadius));
100
+ setBarPath(svg, drag, chunkUHKFJBY5_cjs.barShapePath(drag.barX, top, drag.barWidth, height, drag.barRadius));
101
101
  return;
102
102
  }
103
103
  drag.element.setAttribute("cy", String(y));
@@ -120,24 +120,24 @@ function labelShift(placement, origin, top, height) {
120
120
  }
121
121
  function resizePill(pill, text, label, dy) {
122
122
  const fontSize = parseFloat(text.getAttribute("font-size") ?? "12");
123
- const size = chunkC25NWWIH_cjs.barLabelSize(label, fontSize, true);
123
+ const size = chunkUHKFJBY5_cjs.barLabelSize(label, fontSize, true);
124
124
  const stored = pill.dataset.sfPillY ?? (pill.getAttribute("d") ?? "").split(/\s+/)[2];
125
125
  pill.dataset.sfPillY = stored;
126
126
  const centerX = Number(text.getAttribute("x"));
127
- pill.setAttribute("d", chunkC25NWWIH_cjs.pillPath(centerX - size.width / 2, Number(stored), size.width, size.height));
127
+ pill.setAttribute("d", chunkUHKFJBY5_cjs.pillPath(centerX - size.width / 2, Number(stored), size.width, size.height));
128
128
  pill.setAttribute("transform", `translate(0 ${dy})`);
129
129
  }
130
130
  function updateHorizontalBarLabel(label, drag, origin, value) {
131
- const content = chunkC25NWWIH_cjs.formatBarLabel(value, label.template);
131
+ const content = chunkUHKFJBY5_cjs.formatBarLabel(value, label.template);
132
132
  (label.text.querySelector("tspan") ?? label.text).textContent = content;
133
133
  if (label.placement === "axis") {
134
134
  return true;
135
135
  }
136
136
  const fontSize = parseFloat(label.text.getAttribute("font-size") ?? "12");
137
- const size = chunkC25NWWIH_cjs.barLabelSize(content, fontSize, label.pill !== null);
137
+ const size = chunkUHKFJBY5_cjs.barLabelSize(content, fontSize, label.pill !== null);
138
138
  const width = Math.max(0, pixelForValue(value, drag.scale) - origin.left);
139
139
  const end = origin.left + width;
140
- const center = label.placement === "outside" ? end + chunkC25NWWIH_cjs.BAR_LABEL.gap + size.width / 2 : label.placement === "inside" ? end - chunkC25NWWIH_cjs.BAR_LABEL.gap - size.width / 2 : origin.left + width / 2;
140
+ const center = label.placement === "outside" ? end + chunkUHKFJBY5_cjs.BAR_LABEL.gap + size.width / 2 : label.placement === "inside" ? end - chunkUHKFJBY5_cjs.BAR_LABEL.gap - size.width / 2 : origin.left + width / 2;
141
141
  const stored = label.text.dataset.sfLabelX ?? label.text.getAttribute("x") ?? "0";
142
142
  label.text.dataset.sfLabelX = stored;
143
143
  label.text.setAttribute("transform", `translate(${center - Number(stored)} 0)`);
@@ -145,7 +145,7 @@ function updateHorizontalBarLabel(label, drag, origin, value) {
145
145
  const pillY = label.pill.dataset.sfPillY ?? (label.pill.getAttribute("d") ?? "").split(/\s+/)[2];
146
146
  label.pill.dataset.sfPillY = pillY;
147
147
  label.pill.removeAttribute("transform");
148
- label.pill.setAttribute("d", chunkC25NWWIH_cjs.pillPath(center - size.width / 2, Number(pillY), size.width, size.height));
148
+ label.pill.setAttribute("d", chunkUHKFJBY5_cjs.pillPath(center - size.width / 2, Number(pillY), size.width, size.height));
149
149
  }
150
150
  return true;
151
151
  }
@@ -161,7 +161,7 @@ function updateBarLabel(svg, drag, origin, value) {
161
161
  const top = Math.min(y, drag.baseY);
162
162
  const height = Math.abs(drag.baseY - y);
163
163
  const dy = labelShift(label.placement, origin, top, height);
164
- const content = chunkC25NWWIH_cjs.formatBarLabel(value, label.template);
164
+ const content = chunkUHKFJBY5_cjs.formatBarLabel(value, label.template);
165
165
  (label.text.querySelector("tspan") ?? label.text).textContent = content;
166
166
  label.text.setAttribute("transform", `translate(0 ${dy})`);
167
167
  if (label.pill) {
@@ -177,7 +177,7 @@ var HEIGHT = 18;
177
177
  var GAP = 8;
178
178
  var BACKGROUND = "rgba(15, 23, 42, 0.9)";
179
179
  function element(svg, tag) {
180
- return svg.ownerDocument.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, tag);
180
+ return svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, tag);
181
181
  }
182
182
  function createValueReadout(svg) {
183
183
  const group = element(svg, "g");
@@ -273,7 +273,7 @@ function resolveChartValueDrag(svg, event) {
273
273
  if (!target) {
274
274
  return null;
275
275
  }
276
- const scale = parseValueScale(chunkMR32IJQO_cjs.findOwnerNode(svg, target.owner.id, chunkMR32IJQO_cjs.isPrimary));
276
+ const scale = parseValueScale(chunkWZA3DJJH_cjs.findOwnerNode(svg, target.owner.id, chunkWZA3DJJH_cjs.isPrimary));
277
277
  const geometry = scale ? resolveChartValueGeometry(svg, target, scale) : null;
278
278
  if (!scale || !geometry) {
279
279
  return null;
@@ -293,13 +293,13 @@ function createChartValueDragState(target, scale, geometry, pointerId) {
293
293
  };
294
294
  }
295
295
  function isChartValuePointer(event) {
296
- return event.button === 0 && !chunkMR32IJQO_cjs.isCameraGesture(event);
296
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
297
297
  }
298
298
  function findChartValueMark(event) {
299
299
  return event.target?.closest?.("[data-sf-value-index]");
300
300
  }
301
301
  function readChartValueTarget(mark) {
302
- const owner = chunkMR32IJQO_cjs.resolveOwner(mark);
302
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(mark);
303
303
  if (owner?.role !== "chart") {
304
304
  return null;
305
305
  }
@@ -457,16 +457,9 @@ function bindChartValueDrag(viewer, emitter) {
457
457
  }
458
458
 
459
459
  // src/runtime/interaction/colorEdit/color.ts
460
- var HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;
461
460
  function normalizeHex(value) {
462
- const raw = value.trim();
463
- const withHash = raw.startsWith("#") ? raw : `#${raw}`;
464
- if (!HEX.test(withHash)) {
465
- return null;
466
- }
467
- const body = withHash.slice(1);
468
- const full = body.length === 3 ? body.split("").map((char) => char + char).join("") : body;
469
- return `#${full.toLowerCase()}`;
461
+ const channels = chunkUHKFJBY5_cjs.parseHexRgb(value);
462
+ return channels && chunkUHKFJBY5_cjs.rgbToHex(...channels);
470
463
  }
471
464
  var COLOR_FUNCTION = /^rgba?\(\s*(\d{1,3})\s*[, ]\s*(\d{1,3})\s*[, ]\s*(\d{1,3})\s*(?:[,/]\s*(\d*\.?\d+)(%?)\s*)?\)$/i;
472
465
  var HEX_WITH_ALPHA = /^#([0-9a-f]{6})([0-9a-f]{2})$/i;
@@ -476,7 +469,7 @@ function parseColorAlpha(value) {
476
469
  if (fn) {
477
470
  const alpha = fn[4] === void 0 ? 1 : Number(fn[4]) / (fn[5] ? 100 : 1);
478
471
  return {
479
- hex: rgbToHex({ r: Number(fn[1]), g: Number(fn[2]), b: Number(fn[3]) }),
472
+ hex: rgbToHex2({ r: Number(fn[1]), g: Number(fn[2]), b: Number(fn[3]) }),
480
473
  alpha: Math.max(0, Math.min(1, alpha))
481
474
  };
482
475
  }
@@ -505,63 +498,28 @@ function clampChannel(value) {
505
498
  return Math.max(0, Math.min(255, Math.round(value)));
506
499
  }
507
500
  function hexToRgb(hex) {
508
- const normalized = normalizeHex(hex) ?? "#000000";
509
- return {
510
- r: Number.parseInt(normalized.slice(1, 3), 16),
511
- g: Number.parseInt(normalized.slice(3, 5), 16),
512
- b: Number.parseInt(normalized.slice(5, 7), 16)
513
- };
514
- }
515
- function rgbToHex(rgb) {
516
- const channel = (value) => clampChannel(value).toString(16).padStart(2, "0");
517
- return `#${channel(rgb.r)}${channel(rgb.g)}${channel(rgb.b)}`;
518
- }
519
- function hsvToRgb(hsv) {
520
- const h = (hsv.h % 360 + 360) % 360;
521
- const s = Math.max(0, Math.min(1, hsv.s));
522
- const v = Math.max(0, Math.min(1, hsv.v));
523
- const c = v * s;
524
- const x = c * (1 - Math.abs(h / 60 % 2 - 1));
525
- const m = v - c;
526
- const sector = Math.floor(h / 60);
527
- const table = [
528
- [c, x, 0],
529
- [x, c, 0],
530
- [0, c, x],
531
- [0, x, c],
532
- [x, 0, c],
533
- [c, 0, x]
534
- ];
535
- const [r, g, b] = table[sector] ?? table[0];
536
- return { r: Math.round((r + m) * 255), g: Math.round((g + m) * 255), b: Math.round((b + m) * 255) };
537
- }
538
- function rgbToHsv(rgb) {
539
- const r = clampChannel(rgb.r) / 255;
540
- const g = clampChannel(rgb.g) / 255;
541
- const b = clampChannel(rgb.b) / 255;
542
- const max = Math.max(r, g, b);
543
- const min = Math.min(r, g, b);
544
- const delta = max - min;
545
- let h = 0;
546
- if (delta !== 0) {
547
- if (max === r) {
548
- h = 60 * ((g - b) / delta % 6);
549
- } else if (max === g) {
550
- h = 60 * ((b - r) / delta + 2);
551
- } else {
552
- h = 60 * ((r - g) / delta + 4);
553
- }
554
- }
555
- if (h < 0) {
556
- h += 360;
557
- }
558
- return { h, s: max === 0 ? 0 : delta / max, v: max };
501
+ const [r, g, b] = chunkUHKFJBY5_cjs.parseHexRgb(hex) ?? [0, 0, 0];
502
+ return { r, g, b };
503
+ }
504
+ function rgbToHex2(rgb) {
505
+ return chunkUHKFJBY5_cjs.rgbToHex(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
506
+ }
507
+ function hsvToRgb2(hsv) {
508
+ const { r, g, b } = chunkUHKFJBY5_cjs.hsvToRgb(
509
+ (hsv.h % 360 + 360) % 360,
510
+ Math.max(0, Math.min(1, hsv.s)),
511
+ Math.max(0, Math.min(1, hsv.v))
512
+ );
513
+ return { r, g, b };
514
+ }
515
+ function rgbToHsv2(rgb) {
516
+ return chunkUHKFJBY5_cjs.rgbToHsv(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
559
517
  }
560
518
  function hexToHsv(hex) {
561
- return rgbToHsv(hexToRgb(hex));
519
+ return rgbToHsv2(hexToRgb(hex));
562
520
  }
563
521
  function hsvToHex(hsv) {
564
- return rgbToHex(hsvToRgb(hsv));
522
+ return rgbToHex2(hsvToRgb2(hsv));
565
523
  }
566
524
 
567
525
  // src/runtime/interaction/colorEdit/gradientValue.ts
@@ -1002,9 +960,9 @@ function bindChannel(picker, channel) {
1002
960
  return;
1003
961
  }
1004
962
  const next = { ...hexToRgb(activeHex(picker)), [channel]: value };
1005
- const nextHsv = rgbToHsv(next);
963
+ const nextHsv = rgbToHsv2(next);
1006
964
  picker.state.hsv = nextHsv.s === 0 ? { ...nextHsv, h: picker.state.hsv.h } : nextHsv;
1007
- setActiveColor(picker, rgbToHex(next));
965
+ setActiveColor(picker, rgbToHex2(next));
1008
966
  picker.render();
1009
967
  };
1010
968
  const read = (event) => event.target.value;
@@ -1751,7 +1709,7 @@ var ColorEditSession = class {
1751
1709
  const hasOverride = target.node.getAttribute("data-sf-color-override") === "true";
1752
1710
  this.#open = openColorPopover({
1753
1711
  seed: seedFrom(fill, readGradientValue(this.#svg, fill)),
1754
- anchor: chunkMR32IJQO_cjs.screenRectOf(target.node),
1712
+ anchor: chunkWZA3DJJH_cjs.screenRectOf(target.node),
1755
1713
  theme: resolveTheme(this.#theme),
1756
1714
  allowGradient: !target.solidOnly,
1757
1715
  onCommit: (color) => {
@@ -1833,7 +1791,7 @@ function resolveTarget(event, selector, pathOf, rules) {
1833
1791
  return null;
1834
1792
  }
1835
1793
  const path = pathOf(node);
1836
- const owner = chunkMR32IJQO_cjs.resolveOwner(node);
1794
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
1837
1795
  if (!path || !owner || !isEditablePath(path, rules) || requiresPriorSelection(node, owner)) {
1838
1796
  return null;
1839
1797
  }
@@ -1855,7 +1813,7 @@ function resolveZoneGradientTarget(event) {
1855
1813
  if (!node) {
1856
1814
  return null;
1857
1815
  }
1858
- const owner = chunkMR32IJQO_cjs.resolveOwner(node);
1816
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
1859
1817
  if (!owner) {
1860
1818
  return null;
1861
1819
  }
@@ -1891,7 +1849,7 @@ var ZoneGradientSession = class {
1891
1849
  const beforeStops = sortStops(gradient.stops);
1892
1850
  this.#open = openColorPopover({
1893
1851
  seed: seedFrom(fill, gradient),
1894
- anchor: chunkMR32IJQO_cjs.screenRectOf(target.node),
1852
+ anchor: chunkWZA3DJJH_cjs.screenRectOf(target.node),
1895
1853
  theme: resolveTheme(this.#theme),
1896
1854
  allowGradient: true,
1897
1855
  lockStops: true,
@@ -1964,15 +1922,15 @@ function bindDeleteSelection(viewer, emitter) {
1964
1922
  }
1965
1923
 
1966
1924
  // src/runtime/interaction/events.ts
1967
- var Emitter2 = class extends chunkMR32IJQO_cjs.Emitter {
1925
+ var Emitter2 = class extends chunkWZA3DJJH_cjs.Emitter {
1968
1926
  };
1969
1927
 
1970
1928
  // src/runtime/interaction/linkPreview/geometry.ts
1971
1929
  function anchorPoint(bounds, side, other) {
1972
1930
  if (side) {
1973
- return chunkC25NWWIH_cjs.pointAtPort(bounds, { side, offset: 0.5 });
1931
+ return chunkUHKFJBY5_cjs.pointAtPort(bounds, { side, offset: 0.5 });
1974
1932
  }
1975
- return chunkC25NWWIH_cjs.edgePointToward(bounds, other);
1933
+ return chunkUHKFJBY5_cjs.edgePointToward(bounds, other);
1976
1934
  }
1977
1935
  function polylinePathData(points) {
1978
1936
  if (points.length < 4) {
@@ -1989,7 +1947,7 @@ function previewPathData(points, segments, pathType, strokeWidth) {
1989
1947
  return `M ${points[0]} ${points[1]} C ${points[2]} ${points[3]} ${points[4]} ${points[5]} ${points[6]} ${points[7]}`;
1990
1948
  }
1991
1949
  if (pathType === "orthogonal" && segments.length > 0) {
1992
- return chunkC25NWWIH_cjs.roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));
1950
+ return chunkUHKFJBY5_cjs.roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));
1993
1951
  }
1994
1952
  return polylinePathData(points);
1995
1953
  }
@@ -2009,8 +1967,8 @@ function previewLink(fromSide, toSide) {
2009
1967
  function routePreviewLink(fromBounds, toBounds, fromSide, toSide, pathType) {
2010
1968
  const from = anchorPoint(fromBounds, fromSide, toBounds);
2011
1969
  const to = anchorPoint(toBounds, toSide, fromBounds);
2012
- const { points, segments } = chunkC25NWWIH_cjs.calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);
2013
- return { points, segments, midpoint: chunkC25NWWIH_cjs.getLineMidpoint(points, pathType, from, to) };
1970
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);
1971
+ return { points, segments, midpoint: chunkUHKFJBY5_cjs.getLineMidpoint(points, pathType, from, to) };
2014
1972
  }
2015
1973
 
2016
1974
  // src/runtime/interaction/linkPreview/discovery.ts
@@ -2042,7 +2000,7 @@ function resolveOppositeEndpoint(svg, path, canvasObjectId) {
2042
2000
  if (!otherId) {
2043
2001
  return null;
2044
2002
  }
2045
- const otherPrimary = chunkMR32IJQO_cjs.findOwnerNode(svg, otherId, chunkMR32IJQO_cjs.isPrimary);
2003
+ const otherPrimary = chunkWZA3DJJH_cjs.findOwnerNode(svg, otherId, chunkWZA3DJJH_cjs.isPrimary);
2046
2004
  return otherPrimary ? { draggedIsFrom, bounds: otherPrimary.getBBox() } : null;
2047
2005
  }
2048
2006
  function captureLiveLinkLabel(svg, draft, draggedBounds) {
@@ -2089,8 +2047,8 @@ function resolveOtherFacePoint(svg, path, canvasObjectId) {
2089
2047
  if (!otherId || !face || !otherFace) {
2090
2048
  return null;
2091
2049
  }
2092
- const otherPrimary = chunkMR32IJQO_cjs.findOwnerNode(svg, otherId, chunkMR32IJQO_cjs.isPrimary);
2093
- const otherGeometry = otherPrimary && chunkMR32IJQO_cjs.isometricGeometryOf(otherPrimary);
2050
+ const otherPrimary = chunkWZA3DJJH_cjs.findOwnerNode(svg, otherId, chunkWZA3DJJH_cjs.isPrimary);
2051
+ const otherGeometry = otherPrimary && chunkWZA3DJJH_cjs.isometricGeometryOf(otherPrimary);
2094
2052
  if (!otherGeometry?.bounds) {
2095
2053
  return null;
2096
2054
  }
@@ -2101,7 +2059,7 @@ function resolveOtherFacePoint(svg, path, canvasObjectId) {
2101
2059
  height: otherGeometry.height,
2102
2060
  depth: otherGeometry.depth
2103
2061
  };
2104
- return { otherPoint: chunkC25NWWIH_cjs.isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };
2062
+ return { otherPoint: chunkUHKFJBY5_cjs.isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };
2105
2063
  }
2106
2064
  function findLiveFaceLinks(svg, canvasObjectId) {
2107
2065
  const escapedId = CSS.escape(canvasObjectId);
@@ -2120,7 +2078,7 @@ function findLiveFaceLinks(svg, canvasObjectId) {
2120
2078
 
2121
2079
  // src/runtime/interaction/linkPreview/faceUpdate.ts
2122
2080
  function updateLiveFaceLink(link, liveObject) {
2123
- const draggedPoint = chunkC25NWWIH_cjs.isometricFaceCenter(liveObject, link.face);
2081
+ const draggedPoint = chunkUHKFJBY5_cjs.isometricFaceCenter(liveObject, link.face);
2124
2082
  const from = link.draggedIsFrom ? draggedPoint : link.otherPoint;
2125
2083
  const to = link.draggedIsFrom ? link.otherPoint : draggedPoint;
2126
2084
  link.path.setAttribute("d", `M ${from.x} ${from.y} L ${to.x} ${to.y}`);
@@ -2144,7 +2102,7 @@ function updateLabelGap(link, points) {
2144
2102
  if (!link.labelGapSize) {
2145
2103
  return;
2146
2104
  }
2147
- const gap = chunkC25NWWIH_cjs.labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);
2105
+ const gap = chunkUHKFJBY5_cjs.labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);
2148
2106
  if (gap) {
2149
2107
  link.path.setAttribute("stroke-dasharray", `${gap.dashBefore} ${gap.gapLength} 1000000`);
2150
2108
  } else {
@@ -2190,11 +2148,11 @@ function readIsometricSnapStep(svg) {
2190
2148
  return step > 0 ? step : null;
2191
2149
  }
2192
2150
  function nearestIsometricLatticePoint(point, step) {
2193
- const u = point.x / (chunkC25NWWIH_cjs.AXIS_COS * step);
2194
- const v = point.y / (chunkC25NWWIH_cjs.AXIS_SIN * step);
2151
+ const u = point.x / (chunkUHKFJBY5_cjs.AXIS_COS * step);
2152
+ const v = point.y / (chunkUHKFJBY5_cjs.AXIS_SIN * step);
2195
2153
  const i = Math.round((u + v) / 2);
2196
2154
  const j = Math.round((u - v) / 2);
2197
- return { x: (i + j) * chunkC25NWWIH_cjs.AXIS_COS * step, y: (i - j) * chunkC25NWWIH_cjs.AXIS_SIN * step };
2155
+ return { x: (i + j) * chunkUHKFJBY5_cjs.AXIS_COS * step, y: (i - j) * chunkUHKFJBY5_cjs.AXIS_SIN * step };
2198
2156
  }
2199
2157
  function snapToStep(value, step, min) {
2200
2158
  return Math.max(min, Math.round(value / step) * step);
@@ -2207,21 +2165,21 @@ var LABEL_FONT_SIZE = 12;
2207
2165
  var LABEL_LINE_HEIGHT = 1.2;
2208
2166
  var LABEL_BASELINE_OFFSET = -LABEL_GAP - LABEL_HEIGHT + (LABEL_HEIGHT - LABEL_FONT_SIZE * LABEL_LINE_HEIGHT) / 2 + LABEL_FONT_SIZE;
2209
2167
  function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2210
- const faces = chunkC25NWWIH_cjs.isometricFaces(object);
2211
- nodes.top?.setAttribute("d", chunkC25NWWIH_cjs.roundedPolygonPath(faces.top, 0));
2212
- nodes.front?.setAttribute("d", chunkC25NWWIH_cjs.roundedPolygonPath(faces.front, 0));
2213
- nodes.side?.setAttribute("d", chunkC25NWWIH_cjs.roundedPolygonPath(faces.right, 0));
2168
+ const faces = chunkUHKFJBY5_cjs.isometricFaces(object);
2169
+ nodes.top?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.top, 0));
2170
+ nodes.front?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.front, 0));
2171
+ nodes.side?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.right, 0));
2214
2172
  const silhouette = [faces.top[0], faces.top[1], faces.right[2], faces.front[2], faces.front[3], faces.top[3]];
2215
- const hullPath = chunkC25NWWIH_cjs.roundedPolygonPath(silhouette, cornerRadius);
2173
+ const hullPath = chunkUHKFJBY5_cjs.roundedPolygonPath(silhouette, cornerRadius);
2216
2174
  nodes.hull?.setAttribute("d", hullPath);
2217
2175
  if (overlay.halo) {
2218
- chunkMR32IJQO_cjs.updateHalo(overlay.halo, hullPath);
2176
+ chunkWZA3DJJH_cjs.updateHalo(overlay.halo, hullPath);
2219
2177
  }
2220
- const placements = chunkMR32IJQO_cjs.axisArrowPlacements(object);
2178
+ const placements = chunkWZA3DJJH_cjs.axisArrowPlacements(object);
2221
2179
  Object.keys(placements).forEach((axis) => {
2222
2180
  const group = overlay.arrows[axis];
2223
2181
  if (group) {
2224
- chunkMR32IJQO_cjs.updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);
2182
+ chunkWZA3DJJH_cjs.updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);
2225
2183
  }
2226
2184
  });
2227
2185
  nodes.seams?.setAttribute(
@@ -2239,9 +2197,9 @@ function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2239
2197
  x: footprintCenter.x + (point.x - footprintCenter.x) * shadowSpread,
2240
2198
  y: footprintCenter.y + (point.y - footprintCenter.y) * shadowSpread
2241
2199
  }));
2242
- nodes.groundShadow.setAttribute("d", chunkC25NWWIH_cjs.roundedPolygonPath(footprint, 0));
2200
+ nodes.groundShadow.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(footprint, 0));
2243
2201
  }
2244
- const anchor = chunkC25NWWIH_cjs.isometricTopFaceCenter(object);
2202
+ const anchor = chunkUHKFJBY5_cjs.isometricTopFaceCenter(object);
2245
2203
  if (nodes.labelGuide) {
2246
2204
  nodes.labelGuide.setAttribute("d", `M ${anchor.x} ${anchor.y - LABEL_GAP} L ${anchor.x} ${anchor.y}`);
2247
2205
  }
@@ -2257,7 +2215,7 @@ function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2257
2215
  // src/runtime/interaction/isometricAxisResize/state.ts
2258
2216
  var AXES = ["width", "height", "depth"];
2259
2217
  function collectNodes(svg, ownerId) {
2260
- const all = chunkMR32IJQO_cjs.findAllOwnerNodes(svg, ownerId);
2218
+ const all = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, ownerId);
2261
2219
  const bySuffix = (suffix) => all.find((el2) => el2.id.endsWith(suffix)) ?? null;
2262
2220
  return {
2263
2221
  top: bySuffix("-top"),
@@ -2270,46 +2228,56 @@ function collectNodes(svg, ownerId) {
2270
2228
  labelGuide: bySuffix("-label-guide")
2271
2229
  };
2272
2230
  }
2273
- function createIsometricAxisDragState(svg, event) {
2231
+ function findResizeHandle(event) {
2274
2232
  const target = event.target;
2275
2233
  const captureTarget = target?.closest?.("[data-sf-resize-handle]");
2276
2234
  const handleAttr = captureTarget?.getAttribute("data-sf-resize-handle");
2277
2235
  if (!captureTarget || !handleAttr?.startsWith("iso-")) {
2278
2236
  return null;
2279
2237
  }
2280
- const axis = handleAttr.slice(4);
2281
2238
  const overlay = captureTarget.closest("[data-sf-selection-overlay]");
2282
2239
  const ownerId = overlay?.getAttribute("data-sf-selection-overlay");
2283
- if (!ownerId) {
2240
+ if (!overlay || !ownerId) {
2241
+ return null;
2242
+ }
2243
+ return { captureTarget, axis: handleAttr.slice(4), overlay, ownerId };
2244
+ }
2245
+ function overlayPartsOf(overlay) {
2246
+ const overlayHalo = overlay.querySelector(`[${chunkWZA3DJJH_cjs.ISO_HALO_ATTR}]`) ?? null;
2247
+ const overlayArrows = Object.fromEntries(
2248
+ AXES.map((axis) => [
2249
+ axis,
2250
+ overlay.querySelector(`[data-sf-resize-handle="iso-${axis}"]`) ?? null
2251
+ ])
2252
+ );
2253
+ const overlayDuplicateBubbles = overlay.querySelector(`[${chunkWZA3DJJH_cjs.ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
2254
+ if (overlayDuplicateBubbles) {
2255
+ overlayDuplicateBubbles.style.display = "none";
2256
+ }
2257
+ return { overlayHalo, overlayArrows, overlayDuplicateBubbles };
2258
+ }
2259
+ function createIsometricAxisDragState(svg, event) {
2260
+ const handle = findResizeHandle(event);
2261
+ if (!handle) {
2284
2262
  return null;
2285
2263
  }
2286
- const primary = chunkMR32IJQO_cjs.findOwnerNode(svg, ownerId, chunkMR32IJQO_cjs.isPrimary);
2287
- const owner = primary && chunkMR32IJQO_cjs.resolveOwner(primary);
2264
+ const { captureTarget, axis, overlay, ownerId } = handle;
2265
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
2266
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
2288
2267
  if (!primary || owner?.role !== "isometric") {
2289
2268
  return null;
2290
2269
  }
2291
- const startUser = chunkMR32IJQO_cjs.pointerUserPoint(svg, event);
2270
+ const startUser = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
2292
2271
  if (!startUser) {
2293
2272
  return null;
2294
2273
  }
2295
- const geometry = chunkMR32IJQO_cjs.isometricGeometryOf(primary);
2274
+ const geometry = chunkWZA3DJJH_cjs.isometricGeometryOf(primary);
2296
2275
  const bounds = geometry?.bounds ?? primary.getBBox();
2297
2276
  const nodes = collectNodes(svg, ownerId);
2298
2277
  [nodes.top, nodes.front, nodes.side].forEach((node) => {
2299
2278
  node?.removeAttribute("clip-path");
2300
2279
  });
2301
2280
  captureTarget.setPointerCapture?.(event.pointerId);
2302
- const overlayHalo = overlay?.querySelector(`[${chunkMR32IJQO_cjs.ISO_HALO_ATTR}]`) ?? null;
2303
- const overlayArrows = Object.fromEntries(
2304
- AXES.map((axis2) => [
2305
- axis2,
2306
- overlay?.querySelector(`[data-sf-resize-handle="iso-${axis2}"]`) ?? null
2307
- ])
2308
- );
2309
- const overlayDuplicateBubbles = overlay?.querySelector(`[${chunkMR32IJQO_cjs.ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
2310
- if (overlayDuplicateBubbles) {
2311
- overlayDuplicateBubbles.style.display = "none";
2312
- }
2313
2281
  const start = {
2314
2282
  x: bounds.x,
2315
2283
  y: bounds.y,
@@ -2323,11 +2291,9 @@ function createIsometricAxisDragState(svg, event) {
2323
2291
  pointerId: event.pointerId,
2324
2292
  startUser,
2325
2293
  start,
2326
- cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(chunkC25NWWIH_cjs.CORNER_RADIUS_ATTR)) ?? 0,
2294
+ cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR)) ?? 0,
2327
2295
  nodes,
2328
- overlayHalo,
2329
- overlayArrows,
2330
- overlayDuplicateBubbles,
2296
+ ...overlayPartsOf(overlay),
2331
2297
  liveFaceLinks: findLiveFaceLinks(svg, ownerId),
2332
2298
  moved: false,
2333
2299
  current: start
@@ -2342,15 +2308,15 @@ function nextGeometry(drag, point, step) {
2342
2308
  const dx = point.x - drag.startUser.x;
2343
2309
  const dy = point.y - drag.startUser.y;
2344
2310
  if (axis === "width") {
2345
- const delta2 = dx * chunkC25NWWIH_cjs.AXIS_COS + dy * chunkC25NWWIH_cjs.AXIS_SIN;
2311
+ const delta2 = dx * chunkUHKFJBY5_cjs.AXIS_COS + dy * chunkUHKFJBY5_cjs.AXIS_SIN;
2346
2312
  return { ...start, width: length(start.width + delta2, MIN_SIZE) };
2347
2313
  }
2348
2314
  if (axis === "height") {
2349
2315
  return { ...start, height: length(start.height + dy, MIN_SIZE) };
2350
2316
  }
2351
- const delta = -dx * chunkC25NWWIH_cjs.AXIS_COS + dy * chunkC25NWWIH_cjs.AXIS_SIN;
2317
+ const delta = -dx * chunkUHKFJBY5_cjs.AXIS_COS + dy * chunkUHKFJBY5_cjs.AXIS_SIN;
2352
2318
  const depth = length(start.depth + delta, 0);
2353
- const x = start.x + (start.depth - depth) * chunkC25NWWIH_cjs.AXIS_COS;
2319
+ const x = start.x + (start.depth - depth) * chunkUHKFJBY5_cjs.AXIS_COS;
2354
2320
  return { ...start, x, depth };
2355
2321
  }
2356
2322
  var IsometricAxisResizeSession = class {
@@ -2362,7 +2328,7 @@ var IsometricAxisResizeSession = class {
2362
2328
  this.#emitter = emitter;
2363
2329
  }
2364
2330
  pointerDown = (event) => {
2365
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
2331
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2366
2332
  return;
2367
2333
  }
2368
2334
  this.#drag = createIsometricAxisDragState(this.#svg, event);
@@ -2372,7 +2338,7 @@ var IsometricAxisResizeSession = class {
2372
2338
  if (!drag || event.pointerId !== drag.pointerId) {
2373
2339
  return;
2374
2340
  }
2375
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
2341
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
2376
2342
  if (!point) {
2377
2343
  return;
2378
2344
  }
@@ -2470,7 +2436,7 @@ function findLabelMark(event) {
2470
2436
  );
2471
2437
  }
2472
2438
  function isLabelPointer(event) {
2473
- return event.button === 0 && !chunkMR32IJQO_cjs.isCameraGesture(event);
2439
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
2474
2440
  }
2475
2441
  function findHull(svg, ownerId) {
2476
2442
  return svg.querySelector(`[data-sf-id="${CSS.escape(ownerId)}"][data-sf-primary="true"]`);
@@ -2486,21 +2452,21 @@ function resolveIsometricLabelDrag(svg, event) {
2486
2452
  if (!clicked) {
2487
2453
  return null;
2488
2454
  }
2489
- const owner = chunkMR32IJQO_cjs.resolveOwner(clicked);
2455
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(clicked);
2490
2456
  if (owner?.role !== "isometric") {
2491
2457
  return null;
2492
2458
  }
2493
2459
  const hull = findHull(svg, owner.id);
2494
- const geometry = hull ? chunkMR32IJQO_cjs.isometricGeometryOf(hull) : null;
2460
+ const geometry = hull ? chunkWZA3DJJH_cjs.isometricGeometryOf(hull) : null;
2495
2461
  if (!geometry?.bounds) {
2496
2462
  return null;
2497
2463
  }
2498
- const start = chunkMR32IJQO_cjs.pointerUserPoint(svg, event);
2464
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
2499
2465
  if (!start) {
2500
2466
  return null;
2501
2467
  }
2502
2468
  const anchorX = geometry.bounds.x + geometry.bounds.width / 2;
2503
- const anchorY = geometry.bounds.y + geometry.bounds.width * (chunkC25NWWIH_cjs.AXIS_SIN / chunkC25NWWIH_cjs.AXIS_COS) / 2;
2469
+ const anchorY = geometry.bounds.y + geometry.bounds.width * (chunkUHKFJBY5_cjs.AXIS_SIN / chunkUHKFJBY5_cjs.AXIS_COS) / 2;
2504
2470
  const text = findBySuffix(svg, `-${owner.id}-label`);
2505
2471
  if (!text) {
2506
2472
  return null;
@@ -2552,7 +2518,7 @@ var IsometricLabelDragSession = class {
2552
2518
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
2553
2519
  return;
2554
2520
  }
2555
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
2521
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
2556
2522
  if (!point) {
2557
2523
  return;
2558
2524
  }
@@ -2627,7 +2593,7 @@ function isIsometricDirection(value) {
2627
2593
  function bindIsometricQuickDuplicate(viewer, emitter) {
2628
2594
  const svg = viewer.svg;
2629
2595
  const onPointerDown = (event) => {
2630
- if (event.button !== 0 || chunkMR32IJQO_cjs.isCameraGesture(event)) {
2596
+ if (event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2631
2597
  return;
2632
2598
  }
2633
2599
  const bubble = event.target?.closest("[data-sf-quick-duplicate]");
@@ -2638,7 +2604,7 @@ function bindIsometricQuickDuplicate(viewer, emitter) {
2638
2604
  const overlay = bubble.closest("[data-sf-selection-overlay]");
2639
2605
  const sourceId = overlay?.getAttribute("data-sf-selection-overlay");
2640
2606
  const primary = sourceId ? svg.querySelector(`[data-sf-id="${CSS.escape(sourceId)}"][data-sf-primary="true"]`) : null;
2641
- const owner = primary && chunkMR32IJQO_cjs.resolveOwner(primary);
2607
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
2642
2608
  if (!owner) {
2643
2609
  return;
2644
2610
  }
@@ -2688,25 +2654,12 @@ function crossedEndpointDragThreshold(drag, event) {
2688
2654
  }
2689
2655
 
2690
2656
  // src/runtime/interaction/linkEndpoint/preview.ts
2691
- function previewLink2(fromSide, toSide) {
2692
- return {
2693
- id: "preview",
2694
- fromId: "",
2695
- toId: "",
2696
- layerGroup: "",
2697
- orderKey: "",
2698
- isVisible: true,
2699
- isLocked: false,
2700
- fromPoint: { kind: "side", side: fromSide, offset: 0.5 },
2701
- toPoint: { kind: "side", side: toSide, offset: 0.5 }
2702
- };
2703
- }
2704
2657
  function updateEndpointPreview(drag, draggedPoint, draggedSide) {
2705
2658
  const fromPoint = drag.end === "from" ? draggedPoint : drag.fixedPoint;
2706
2659
  const toPoint = drag.end === "to" ? draggedPoint : drag.fixedPoint;
2707
2660
  const fromSide = drag.end === "from" ? draggedSide : drag.fixedSide;
2708
2661
  const toSide = drag.end === "to" ? draggedSide : drag.fixedSide;
2709
- const { points, segments } = chunkC25NWWIH_cjs.calculateLinkRoute(previewLink2(fromSide, toSide), fromPoint, toPoint, drag.pathType);
2662
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);
2710
2663
  drag.path.setAttribute("d", previewPathData(points, segments, drag.pathType, drag.strokeWidth));
2711
2664
  }
2712
2665
 
@@ -2728,7 +2681,7 @@ var LinkGhost = class {
2728
2681
  constructor(svg, path) {
2729
2682
  this.#svg = svg;
2730
2683
  this.#path = path;
2731
- this.#anchors = svg.ownerDocument.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "g");
2684
+ this.#anchors = svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "g");
2732
2685
  this.#anchors.setAttribute("data-sf-link-target", "");
2733
2686
  this.#anchors.setAttribute("pointer-events", "none");
2734
2687
  }
@@ -2738,7 +2691,7 @@ var LinkGhost = class {
2738
2691
  for (const name of RESTORED_ATTRIBUTES) {
2739
2692
  this.#saved.set(name, this.#path.getAttribute(name));
2740
2693
  }
2741
- const dash = GHOST_DASH_PX / chunkMR32IJQO_cjs.pxPerUnit(this.#svg);
2694
+ const dash = GHOST_DASH_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
2742
2695
  this.#path.setAttribute("stroke-dasharray", `${dash} ${dash}`);
2743
2696
  this.#path.setAttribute("stroke-linecap", "round");
2744
2697
  this.#path.setAttribute("opacity", GHOST_OPACITY);
@@ -2767,7 +2720,7 @@ var LinkGhost = class {
2767
2720
  if (!bounds) {
2768
2721
  return;
2769
2722
  }
2770
- const unit = 1 / chunkMR32IJQO_cjs.pxPerUnit(this.#svg);
2723
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
2771
2724
  const centers = [
2772
2725
  [bounds.x + bounds.width / 2, bounds.y],
2773
2726
  [bounds.x + bounds.width, bounds.y + bounds.height / 2],
@@ -2775,7 +2728,7 @@ var LinkGhost = class {
2775
2728
  [bounds.x, bounds.y + bounds.height / 2]
2776
2729
  ];
2777
2730
  for (const [cx, cy] of centers) {
2778
- const dot = this.#svg.ownerDocument.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "circle");
2731
+ const dot = this.#svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "circle");
2779
2732
  dot.setAttribute("cx", String(cx));
2780
2733
  dot.setAttribute("cy", String(cy));
2781
2734
  dot.setAttribute("r", String(ANCHOR_RADIUS_PX * unit));
@@ -2795,7 +2748,7 @@ function collectEndpointCandidates(svg) {
2795
2748
  if (element2.getAttribute("data-sf-role") === "link") {
2796
2749
  continue;
2797
2750
  }
2798
- const owner = chunkMR32IJQO_cjs.resolveOwner(element2);
2751
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
2799
2752
  if (owner) {
2800
2753
  candidates.push({ owner, bounds: element2.getBBox() });
2801
2754
  }
@@ -2872,7 +2825,7 @@ function inferFixedSide(svg, reference, fixedPrimary) {
2872
2825
  if (reference.declaredSide) {
2873
2826
  return reference.declaredSide;
2874
2827
  }
2875
- const draggedPrimary = reference.draggedId ? chunkMR32IJQO_cjs.findOwnerNode(svg, reference.draggedId, chunkMR32IJQO_cjs.isPrimary) : null;
2828
+ const draggedPrimary = reference.draggedId ? chunkWZA3DJJH_cjs.findOwnerNode(svg, reference.draggedId, chunkWZA3DJJH_cjs.isPrimary) : null;
2876
2829
  if (!draggedPrimary) {
2877
2830
  return "right";
2878
2831
  }
@@ -2880,7 +2833,7 @@ function inferFixedSide(svg, reference, fixedPrimary) {
2880
2833
  }
2881
2834
  function resolveFixedEndpoint(svg, path, draggedEnd) {
2882
2835
  const reference = fixedEndpointReference(path, draggedEnd);
2883
- const fixedPrimary = reference.fixedId ? chunkMR32IJQO_cjs.findOwnerNode(svg, reference.fixedId, chunkMR32IJQO_cjs.isPrimary) : null;
2836
+ const fixedPrimary = reference.fixedId ? chunkWZA3DJJH_cjs.findOwnerNode(svg, reference.fixedId, chunkWZA3DJJH_cjs.isPrimary) : null;
2884
2837
  if (!fixedPrimary) {
2885
2838
  return null;
2886
2839
  }
@@ -2899,8 +2852,8 @@ function selectLinkEndpoint(svg, event) {
2899
2852
  if (!target || !end || !linkId) {
2900
2853
  return null;
2901
2854
  }
2902
- const path = chunkMR32IJQO_cjs.findOwnerNode(svg, linkId, chunkMR32IJQO_cjs.isPrimary);
2903
- const linkOwner = path && chunkMR32IJQO_cjs.resolveOwner(path);
2855
+ const path = chunkWZA3DJJH_cjs.findOwnerNode(svg, linkId, chunkWZA3DJJH_cjs.isPrimary);
2856
+ const linkOwner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
2904
2857
  if (!path || !linkOwner) {
2905
2858
  return null;
2906
2859
  }
@@ -2942,8 +2895,8 @@ function nearestPort(bounds, point) {
2942
2895
  let nearest = { side: "right", offset: 0.5 };
2943
2896
  let nearestDistance = Infinity;
2944
2897
  for (const side of SIDES2) {
2945
- const offset = Math.max(0, Math.min(1, chunkC25NWWIH_cjs.relativeOffsetOnRectangleSide(bounds, side, point)));
2946
- const candidate = chunkC25NWWIH_cjs.pointAtPort(bounds, { side, offset });
2898
+ const offset = Math.max(0, Math.min(1, chunkUHKFJBY5_cjs.relativeOffsetOnRectangleSide(bounds, side, point)));
2899
+ const candidate = chunkUHKFJBY5_cjs.pointAtPort(bounds, { side, offset });
2947
2900
  const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);
2948
2901
  if (distance < nearestDistance) {
2949
2902
  nearestDistance = distance;
@@ -3002,7 +2955,7 @@ function resolveLinkTarget(candidates, fixedPoint, point, unitsPerPx) {
3002
2955
  }
3003
2956
  const port = snapPort(candidate.bounds, point, unitsPerPx);
3004
2957
  return {
3005
- point: chunkC25NWWIH_cjs.pointAtPort(candidate.bounds, port),
2958
+ point: chunkUHKFJBY5_cjs.pointAtPort(candidate.bounds, port),
3006
2959
  side: port.side,
3007
2960
  hit: { owner: candidate.owner, side: port.side, offset: port.offset },
3008
2961
  bounds: candidate.bounds
@@ -3026,7 +2979,7 @@ var LinkEndpointSession = class {
3026
2979
  this.#emitter = emitter;
3027
2980
  }
3028
2981
  pointerDown = (event) => {
3029
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
2982
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3030
2983
  return;
3031
2984
  }
3032
2985
  this.#drag = createLinkEndpointDragState(this.#svg, event);
@@ -3040,7 +2993,7 @@ var LinkEndpointSession = class {
3040
2993
  return;
3041
2994
  }
3042
2995
  drag.moved = true;
3043
- const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / chunkMR32IJQO_cjs.pxPerUnit(this.#svg));
2996
+ const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg));
3044
2997
  updateEndpointPreview(drag, target.point, target.side);
3045
2998
  drag.ghost.show(target.hit !== null, target.bounds);
3046
2999
  };
@@ -3154,7 +3107,7 @@ var LinkSegmentSession = class {
3154
3107
  this.#emitter = emitter;
3155
3108
  }
3156
3109
  pointerDown = (event) => {
3157
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
3110
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3158
3111
  return;
3159
3112
  }
3160
3113
  const target = event.target;
@@ -3164,12 +3117,12 @@ var LinkSegmentSession = class {
3164
3117
  if (!handle || !overlay || !linkId) {
3165
3118
  return;
3166
3119
  }
3167
- const path = chunkMR32IJQO_cjs.findOwnerNode(this.#svg, linkId, chunkMR32IJQO_cjs.isPrimary);
3168
- const owner = path && chunkMR32IJQO_cjs.resolveOwner(path);
3120
+ const path = chunkWZA3DJJH_cjs.findOwnerNode(this.#svg, linkId, chunkWZA3DJJH_cjs.isPrimary);
3121
+ const owner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
3169
3122
  const index = Number(handle.getAttribute("data-sf-link-segment"));
3170
3123
  const segments = path ? parseSegments(path) : [];
3171
3124
  const segment = segments[index];
3172
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
3125
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
3173
3126
  if (!path || !owner || !segment || !point) {
3174
3127
  return;
3175
3128
  }
@@ -3177,7 +3130,7 @@ var LinkSegmentSession = class {
3177
3130
  const guide = document.createElementNS(SVG_NAMESPACE2, "line");
3178
3131
  guide.setAttribute("stroke", GUIDE_COLOR);
3179
3132
  guide.setAttribute("stroke-dasharray", "4 4");
3180
- guide.setAttribute("stroke-width", String(1 / chunkMR32IJQO_cjs.pxPerUnit(this.#svg)));
3133
+ guide.setAttribute("stroke-width", String(1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg)));
3181
3134
  guide.setAttribute("visibility", "hidden");
3182
3135
  overlay.appendChild(guide);
3183
3136
  handle.setPointerCapture?.(event.pointerId);
@@ -3212,7 +3165,7 @@ var LinkSegmentSession = class {
3212
3165
  return;
3213
3166
  }
3214
3167
  drag.moved = true;
3215
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
3168
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
3216
3169
  if (!point) {
3217
3170
  return;
3218
3171
  }
@@ -3238,8 +3191,8 @@ var LinkSegmentSession = class {
3238
3191
  doubleClick = (event) => {
3239
3192
  const handle = event.target?.closest("[data-sf-link-segment]");
3240
3193
  const linkId = handle?.closest("[data-sf-selection-overlay]")?.getAttribute("data-sf-selection-overlay");
3241
- const path = linkId ? chunkMR32IJQO_cjs.findOwnerNode(this.#svg, linkId, chunkMR32IJQO_cjs.isPrimary) : null;
3242
- const owner = path && chunkMR32IJQO_cjs.resolveOwner(path);
3194
+ const path = linkId ? chunkWZA3DJJH_cjs.findOwnerNode(this.#svg, linkId, chunkWZA3DJJH_cjs.isPrimary) : null;
3195
+ const owner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
3243
3196
  if (!handle || !owner) {
3244
3197
  return;
3245
3198
  }
@@ -3262,7 +3215,7 @@ var LinkSegmentSession = class {
3262
3215
  if (isSnapDisabled(this.#svg)) {
3263
3216
  return { value: raw, snapped: null };
3264
3217
  }
3265
- const threshold = SNAP_PX / chunkMR32IJQO_cjs.pxPerUnit(this.#svg);
3218
+ const threshold = SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
3266
3219
  let best = null;
3267
3220
  for (const candidate of [drag.base, ...drag.candidates]) {
3268
3221
  const closer = best === null || Math.abs(candidate - raw) < Math.abs(best - raw);
@@ -3275,7 +3228,7 @@ var LinkSegmentSession = class {
3275
3228
  #preview(drag, snapped) {
3276
3229
  const next = movedSegments(drag, drag.value);
3277
3230
  const strokeWidth = Number(drag.path.getAttribute("stroke-width")) || 2;
3278
- const data = chunkC25NWWIH_cjs.roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));
3231
+ const data = chunkUHKFJBY5_cjs.roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));
3279
3232
  drag.path.setAttribute("d", data);
3280
3233
  drag.overlay.querySelector("path")?.setAttribute("d", data);
3281
3234
  const segment = next[drag.index];
@@ -3449,8 +3402,8 @@ function nearestCandidates(bounds, candidates, limit = 50) {
3449
3402
 
3450
3403
  // src/runtime/interaction/snapping/isometricDiagonal.ts
3451
3404
  var AXES2 = [
3452
- { x: chunkC25NWWIH_cjs.AXIS_COS, y: chunkC25NWWIH_cjs.AXIS_SIN },
3453
- { x: -chunkC25NWWIH_cjs.AXIS_COS, y: chunkC25NWWIH_cjs.AXIS_SIN }
3405
+ { x: chunkUHKFJBY5_cjs.AXIS_COS, y: chunkUHKFJBY5_cjs.AXIS_SIN },
3406
+ { x: -chunkUHKFJBY5_cjs.AXIS_COS, y: chunkUHKFJBY5_cjs.AXIS_SIN }
3454
3407
  ];
3455
3408
  var GUIDE_OVERHANG = 40;
3456
3409
  function snapIsometricDiagonal(apex, rawDx, rawDy, candidates, threshold) {
@@ -3518,13 +3471,13 @@ function isometricApexOf(svg, drag, declared = false) {
3518
3471
  if (lead.owner.role !== "isometric") {
3519
3472
  return null;
3520
3473
  }
3521
- const primary = chunkMR32IJQO_cjs.findOwnerNode(svg, lead.owner.id, chunkMR32IJQO_cjs.isPrimary);
3522
- const geometry = primary && chunkMR32IJQO_cjs.isometricGeometryOf(primary);
3474
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, lead.owner.id, chunkWZA3DJJH_cjs.isPrimary);
3475
+ const geometry = primary && chunkWZA3DJJH_cjs.isometricGeometryOf(primary);
3523
3476
  if (!geometry) {
3524
3477
  return null;
3525
3478
  }
3526
3479
  const frame = declared && geometry.bounds ? geometry.bounds : lead.draggedBounds;
3527
- return { x: frame.x + geometry.depth * chunkC25NWWIH_cjs.AXIS_COS, y: frame.y };
3480
+ return { x: frame.x + geometry.depth * chunkUHKFJBY5_cjs.AXIS_COS, y: frame.y };
3528
3481
  }
3529
3482
  function snapIsometricGrid(svg, drag, rawDx, rawDy) {
3530
3483
  const step = readIsometricSnapStep(svg);
@@ -3541,8 +3494,8 @@ function snapIsometricMove(svg, drag, rawDx, rawDy) {
3541
3494
  return null;
3542
3495
  }
3543
3496
  const excludedIds = new Set(drag.canvasObjects.map((canvasObject) => canvasObject.owner.id));
3544
- const candidates = chunkMR32IJQO_cjs.findIsometricApexCandidates(svg, excludedIds);
3545
- const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / chunkMR32IJQO_cjs.pxPerUnit(svg));
3497
+ const candidates = chunkWZA3DJJH_cjs.findIsometricApexCandidates(svg, excludedIds);
3498
+ const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg));
3546
3499
  return snap ? { dx: snap.dx, dy: snap.dy, guides: [snap.guide] } : null;
3547
3500
  }
3548
3501
  function snapMove(svg, drag, rawDx, rawDy) {
@@ -3559,9 +3512,9 @@ function snapMove(svg, drag, rawDx, rawDy) {
3559
3512
  }
3560
3513
  const leadBounds = offsetBounds(drag.canvasObjects[0].draggedBounds, rawDx, rawDy);
3561
3514
  const excludedIds = new Set(drag.canvasObjects.map((canvasObject) => canvasObject.owner.id));
3562
- const candidates = nearestCandidates(leadBounds, chunkMR32IJQO_cjs.findSnapCandidateBounds(svg, excludedIds));
3515
+ const candidates = nearestCandidates(leadBounds, chunkWZA3DJJH_cjs.findSnapCandidateBounds(svg, excludedIds));
3563
3516
  const snap = computeSnap(leadBounds, candidates, {
3564
- threshold: snapDistancePx(svg) / chunkMR32IJQO_cjs.pxPerUnit(svg),
3517
+ threshold: snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg),
3565
3518
  activeX: MOVE_ACTIVE_POINTS,
3566
3519
  activeY: MOVE_ACTIVE_POINTS,
3567
3520
  guideOverhang: GUIDE_OVERHANG2
@@ -3622,7 +3575,7 @@ function isCompositeOwner(owner) {
3622
3575
  return owner !== null && owner !== void 0 && COMPOSITE_ROLES.has(owner.role);
3623
3576
  }
3624
3577
  function hasDerivedHeight(owner) {
3625
- return owner !== null && owner !== void 0 && chunkMR32IJQO_cjs.DERIVED_HEIGHT_ROLES.has(owner.role);
3578
+ return owner !== null && owner !== void 0 && chunkWZA3DJJH_cjs.DERIVED_HEIGHT_ROLES.has(owner.role);
3626
3579
  }
3627
3580
 
3628
3581
  // src/runtime/interaction/move/canvasObjectCapture.ts
@@ -3643,7 +3596,7 @@ function parentContainerBounds(svg, primary, groupIds) {
3643
3596
  if (!parentId || groupIds.has(parentId)) {
3644
3597
  return void 0;
3645
3598
  }
3646
- const container = chunkMR32IJQO_cjs.findOwnerNode(svg, parentId, chunkMR32IJQO_cjs.isPrimary);
3599
+ const container = chunkWZA3DJJH_cjs.findOwnerNode(svg, parentId, chunkWZA3DJJH_cjs.isPrimary);
3647
3600
  if (!container) {
3648
3601
  return void 0;
3649
3602
  }
@@ -3651,14 +3604,14 @@ function parentContainerBounds(svg, primary, groupIds) {
3651
3604
  return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };
3652
3605
  }
3653
3606
  function captureCanvasObject(svg, owner, groupIds) {
3654
- const nodes = chunkMR32IJQO_cjs.findAllOwnerNodes(svg, owner.id);
3655
- const primary = chunkMR32IJQO_cjs.findOwnerNode(svg, owner.id, chunkMR32IJQO_cjs.isPrimary);
3607
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, owner.id);
3608
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary);
3656
3609
  if (!nodes.length || !primary) {
3657
3610
  return null;
3658
3611
  }
3659
3612
  const overlays = [...svg.querySelectorAll(`[data-sf-selection-overlay="${CSS.escape(owner.id)}"]`)];
3660
3613
  const draggedBounds = primary.getBBox();
3661
- const isometricGeometry = owner.role === "isometric" ? chunkMR32IJQO_cjs.isometricGeometryOf(primary) : null;
3614
+ const isometricGeometry = owner.role === "isometric" ? chunkWZA3DJJH_cjs.isometricGeometryOf(primary) : null;
3662
3615
  const isometricSize = isometricGeometry ? { width: isometricGeometry.width, height: isometricGeometry.height, depth: isometricGeometry.depth } : void 0;
3663
3616
  return {
3664
3617
  owner,
@@ -3700,7 +3653,7 @@ function captureInternalLinks(svg, groupIds) {
3700
3653
  if (!linkId || !belongsToMoveGroup(path, groupIds)) {
3701
3654
  continue;
3702
3655
  }
3703
- const nodes = chunkMR32IJQO_cjs.findAllOwnerNodes(svg, linkId);
3656
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, linkId);
3704
3657
  if (nodes.length) {
3705
3658
  links.push({ nodes, baseTransforms: nodes.map((node) => node.getAttribute("transform")) });
3706
3659
  }
@@ -3734,7 +3687,7 @@ function containedChildren(viewer, owner) {
3734
3687
  return [];
3735
3688
  }
3736
3689
  const nodes = viewer.svg.querySelectorAll(`[data-sf-parent-frame="${CSS.escape(owner.id)}"]`);
3737
- return [...nodes].map((node) => chunkMR32IJQO_cjs.resolveOwner(node)).filter((ref) => ref !== null);
3690
+ return [...nodes].map((node) => chunkWZA3DJJH_cjs.resolveOwner(node)).filter((ref) => ref !== null);
3738
3691
  }
3739
3692
  function selectedMoveGroup(viewer, owner) {
3740
3693
  const selection = viewer.getSelection();
@@ -3751,7 +3704,7 @@ function isChartInteractiveMark(target) {
3751
3704
  }
3752
3705
  function createMoveDragState(viewer, event, startUser) {
3753
3706
  const target = event.target;
3754
- const owner = chunkMR32IJQO_cjs.resolveOwner(target);
3707
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(target);
3755
3708
  if (!hasMovableGeometry(owner) || isChartInteractiveMark(target)) {
3756
3709
  return null;
3757
3710
  }
@@ -3785,7 +3738,7 @@ var MoveSession = class {
3785
3738
  this.#emitter = emitter;
3786
3739
  }
3787
3740
  pointerDown = (event) => {
3788
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
3741
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3789
3742
  return;
3790
3743
  }
3791
3744
  this.#drag = createMoveDragState(this.#viewer, event, movePointerPosition(this.#svg, event));
@@ -3803,7 +3756,7 @@ var MoveSession = class {
3803
3756
  const delta = snapMove(this.#svg, drag, rawDelta.dx, rawDelta.dy);
3804
3757
  const clamped = clampMoveDelta(drag.canvasObjects, delta.dx, delta.dy);
3805
3758
  applyMovePreview(drag, clamped.dx, clamped.dy);
3806
- chunkMR32IJQO_cjs.updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);
3759
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);
3807
3760
  };
3808
3761
  pointerUp = (event) => {
3809
3762
  const drag = this.#drag;
@@ -3812,7 +3765,7 @@ var MoveSession = class {
3812
3765
  }
3813
3766
  this.#drag = null;
3814
3767
  event.target.releasePointerCapture?.(drag.pointerId);
3815
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
3768
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
3816
3769
  emitMoveCompletion(this.#svg, this.#emitter, drag, event);
3817
3770
  };
3818
3771
  cancel() {
@@ -3958,9 +3911,9 @@ var START_POINT_RADIUS_PX = 6;
3958
3911
  var POINT_STROKE_WIDTH_PX = 1.5;
3959
3912
  function createPathDrawPreview(svg) {
3960
3913
  const document2 = svg.ownerDocument;
3961
- const group = document2.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "g");
3914
+ const group = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "g");
3962
3915
  group.setAttribute("pointer-events", "none");
3963
- const line = document2.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "path");
3916
+ const line = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "path");
3964
3917
  line.setAttribute("fill", "none");
3965
3918
  line.setAttribute("stroke", PREVIEW_COLOR);
3966
3919
  line.setAttribute("stroke-linecap", "round");
@@ -3970,8 +3923,8 @@ function createPathDrawPreview(svg) {
3970
3923
  }
3971
3924
  function pointMarker(svg, point, highlighted) {
3972
3925
  const document2 = svg.ownerDocument;
3973
- const unit = 1 / chunkMR32IJQO_cjs.pxPerUnit(svg);
3974
- const circle = document2.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "circle");
3926
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(svg);
3927
+ const circle = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "circle");
3975
3928
  circle.setAttribute("cx", String(point.x));
3976
3929
  circle.setAttribute("cy", String(point.y));
3977
3930
  circle.setAttribute("r", String((highlighted ? START_POINT_RADIUS_PX : POINT_RADIUS_PX) * unit));
@@ -3985,11 +3938,11 @@ function updatePathDrawPreview(svg, state) {
3985
3938
  if (!previewLine || !previewGroup) {
3986
3939
  return;
3987
3940
  }
3988
- const unit = 1 / chunkMR32IJQO_cjs.pxPerUnit(svg);
3941
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(svg);
3989
3942
  previewLine.setAttribute("stroke-width", String(LINE_WIDTH_PX * unit));
3990
3943
  previewLine.setAttribute("stroke-dasharray", `${DASH_PX * unit} ${GAP_PX * unit}`);
3991
3944
  const live = state.cursor ? [...state.points, state.cursor] : state.points;
3992
- previewLine.setAttribute("d", chunkC25NWWIH_cjs.freeformPathData({ points: live, tension: state.tension, closed: false }));
3945
+ previewLine.setAttribute("d", chunkUHKFJBY5_cjs.freeformPathData({ points: live, tension: state.tension, closed: false }));
3993
3946
  while (previewGroup.childNodes.length > 1) {
3994
3947
  previewGroup.lastChild?.remove();
3995
3948
  }
@@ -4049,12 +4002,12 @@ var PathDrawSession = class {
4049
4002
  }
4050
4003
  }
4051
4004
  pointerDown = (event) => {
4052
- if (!this.#state.active || event.button !== 0 || chunkMR32IJQO_cjs.isCameraGesture(event)) {
4005
+ if (!this.#state.active || event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4053
4006
  return;
4054
4007
  }
4055
4008
  event.stopPropagation();
4056
4009
  event.preventDefault();
4057
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
4010
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4058
4011
  if (!point) {
4059
4012
  return;
4060
4013
  }
@@ -4073,14 +4026,14 @@ var PathDrawSession = class {
4073
4026
  this.#state.cursor = resolved.point;
4074
4027
  this.#state.willClose = false;
4075
4028
  updatePathDrawPreview(this.#svg, this.#state);
4076
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
4029
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4077
4030
  };
4078
4031
  pointerMove = (event) => {
4079
4032
  if (!this.#state.active) {
4080
4033
  return;
4081
4034
  }
4082
4035
  event.stopPropagation();
4083
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
4036
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4084
4037
  if (!point) {
4085
4038
  return;
4086
4039
  }
@@ -4089,9 +4042,9 @@ var PathDrawSession = class {
4089
4042
  this.#state.willClose = resolved.willClose;
4090
4043
  updatePathDrawPreview(this.#svg, this.#state);
4091
4044
  if (resolved.guide) {
4092
- chunkMR32IJQO_cjs.updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR2);
4045
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR2);
4093
4046
  } else {
4094
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
4047
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4095
4048
  }
4096
4049
  };
4097
4050
  pointerUp = (event) => {
@@ -4126,10 +4079,10 @@ var PathDrawSession = class {
4126
4079
  } else if (event.key === "Backspace" && this.#state.points.length > 0) {
4127
4080
  event.preventDefault();
4128
4081
  this.#state.points = this.#state.points.slice(0, -1);
4129
- const closeSnapUnits = CLOSE_SNAP_PX / chunkMR32IJQO_cjs.pxPerUnit(this.#svg);
4082
+ const closeSnapUnits = CLOSE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4130
4083
  this.#state.willClose = this.#state.cursor ? isCloseToStart(this.#state.points, this.#state.cursor, closeSnapUnits) : false;
4131
4084
  updatePathDrawPreview(this.#svg, this.#state);
4132
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
4085
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4133
4086
  }
4134
4087
  };
4135
4088
  keyUp = (event) => {
@@ -4138,7 +4091,7 @@ var PathDrawSession = class {
4138
4091
  }
4139
4092
  };
4140
4093
  #resolvePoint(raw) {
4141
- const closeSnapUnits = CLOSE_SNAP_PX / chunkMR32IJQO_cjs.pxPerUnit(this.#svg);
4094
+ const closeSnapUnits = CLOSE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4142
4095
  if (isCloseToStart(this.#state.points, raw, closeSnapUnits)) {
4143
4096
  return { point: this.#state.points[0], willClose: true, guide: null };
4144
4097
  }
@@ -4148,7 +4101,7 @@ var PathDrawSession = class {
4148
4101
  return { point: raw, willClose: false, guide: null };
4149
4102
  }
4150
4103
  const angleSnapped = snapTo45Degrees(last, raw);
4151
- const guideSnapUnits = GUIDE_SNAP_PX / chunkMR32IJQO_cjs.pxPerUnit(this.#svg);
4104
+ const guideSnapUnits = GUIDE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4152
4105
  const { point, guide } = snapToSessionGuides(last, angleSnapped, points.slice(0, -1), raw, guideSnapUnits);
4153
4106
  return { point, willClose: false, guide };
4154
4107
  }
@@ -4162,7 +4115,7 @@ var PathDrawSession = class {
4162
4115
  }
4163
4116
  #reset(callExit) {
4164
4117
  this.#state.previewGroup?.remove();
4165
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
4118
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4166
4119
  const exit = this.#state.onExit;
4167
4120
  this.#state = createIdlePathDrawState();
4168
4121
  this.#shiftHeld = false;
@@ -4205,7 +4158,7 @@ function applyPathReshapePreview(drag, point) {
4205
4158
  const points = drag.points.map(
4206
4159
  (existing, index) => index === drag.pointIndex ? [point.x, point.y] : existing
4207
4160
  );
4208
- const d = chunkC25NWWIH_cjs.freeformPathData({
4161
+ const d = chunkUHKFJBY5_cjs.freeformPathData({
4209
4162
  points: points.map(([x, y]) => ({ x, y })),
4210
4163
  tension: drag.tension,
4211
4164
  closed: drag.closed
@@ -4213,22 +4166,22 @@ function applyPathReshapePreview(drag, point) {
4213
4166
  drag.pathNode.setAttribute("d", d);
4214
4167
  drag.handle.setAttribute("cx", String(point.x));
4215
4168
  drag.handle.setAttribute("cy", String(point.y));
4216
- drag.overlay?.querySelector(`[${chunkMR32IJQO_cjs.PATH_HALO_ATTR}]`)?.setAttribute("d", d);
4169
+ drag.overlay?.querySelector(`[${chunkWZA3DJJH_cjs.PATH_HALO_ATTR}]`)?.setAttribute("d", d);
4217
4170
  return points;
4218
4171
  }
4219
4172
 
4220
4173
  // src/runtime/interaction/pathReshape/target.ts
4221
4174
  function resolvePathReshapeTarget(svg, event) {
4222
- const handle = event.target?.closest?.(`[${chunkC25NWWIH_cjs.PATH_POINT_INDEX_ATTR}]`) ?? null;
4223
- const indexAttr = handle?.getAttribute(chunkC25NWWIH_cjs.PATH_POINT_INDEX_ATTR) ?? null;
4175
+ const handle = event.target?.closest?.(`[${chunkUHKFJBY5_cjs.PATH_POINT_INDEX_ATTR}]`) ?? null;
4176
+ const indexAttr = handle?.getAttribute(chunkUHKFJBY5_cjs.PATH_POINT_INDEX_ATTR) ?? null;
4224
4177
  const pointIndex = indexAttr !== null ? Number(indexAttr) : Number.NaN;
4225
4178
  const ownerId = handle?.closest("[data-sf-selection-overlay]")?.getAttribute("data-sf-selection-overlay");
4226
4179
  if (!handle || !Number.isInteger(pointIndex) || !ownerId) {
4227
4180
  return null;
4228
4181
  }
4229
- const pathNode = chunkMR32IJQO_cjs.findOwnerNode(svg, ownerId, chunkMR32IJQO_cjs.isPrimary);
4230
- const owner = pathNode && chunkMR32IJQO_cjs.resolveOwner(pathNode);
4231
- const geometry = pathNode && chunkMR32IJQO_cjs.pathGeometryOf(pathNode);
4182
+ const pathNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
4183
+ const owner = pathNode && chunkWZA3DJJH_cjs.resolveOwner(pathNode);
4184
+ const geometry = pathNode && chunkWZA3DJJH_cjs.pathGeometryOf(pathNode);
4232
4185
  if (!pathNode || !owner || !geometry || pointIndex < 0 || pointIndex >= geometry.points.length) {
4233
4186
  return null;
4234
4187
  }
@@ -4271,7 +4224,7 @@ var PathReshapeSession = class {
4271
4224
  this.#emitter = emitter;
4272
4225
  }
4273
4226
  pointerDown = (event) => {
4274
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
4227
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4275
4228
  return;
4276
4229
  }
4277
4230
  this.#drag = createPathReshapeDragState(this.#svg, event);
@@ -4282,7 +4235,7 @@ var PathReshapeSession = class {
4282
4235
  return;
4283
4236
  }
4284
4237
  drag.moved = true;
4285
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
4238
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4286
4239
  if (point) {
4287
4240
  applyPathReshapePreview(drag, point);
4288
4241
  }
@@ -4297,7 +4250,7 @@ var PathReshapeSession = class {
4297
4250
  if (!drag.moved) {
4298
4251
  return;
4299
4252
  }
4300
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event) ?? {
4253
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event) ?? {
4301
4254
  x: drag.points[drag.pointIndex][0],
4302
4255
  y: drag.points[drag.pointIndex][1]
4303
4256
  };
@@ -4338,7 +4291,7 @@ function updatePieLabelDragPreview(drag, dx, dy) {
4338
4291
  }
4339
4292
  const from = { x: drag.tickStartX, y: drag.tickStartY };
4340
4293
  const to = { x: drag.restX + dx, y: drag.restY + dy };
4341
- const clipped = chunkC25NWWIH_cjs.clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);
4294
+ const clipped = chunkUHKFJBY5_cjs.clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);
4342
4295
  drag.tickElement.setAttribute("d", `M ${from.x} ${from.y} L ${clipped.x} ${clipped.y}`);
4343
4296
  drag.tickElement.setAttribute("stroke", PREVIEW_TICK_COLOR);
4344
4297
  drag.tickElement.setAttribute("stroke-width", PREVIEW_TICK_STROKE_WIDTH);
@@ -4364,7 +4317,7 @@ function restoreAttribute(element2, name, value) {
4364
4317
 
4365
4318
  // src/runtime/interaction/pieGeometry.ts
4366
4319
  function readPieGeometry(svg, ownerId) {
4367
- const raw = chunkMR32IJQO_cjs.findOwnerNode(svg, ownerId, chunkMR32IJQO_cjs.isPrimary)?.getAttribute("data-sf-pie-geometry");
4320
+ const raw = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary)?.getAttribute("data-sf-pie-geometry");
4368
4321
  if (!raw) {
4369
4322
  return null;
4370
4323
  }
@@ -4383,7 +4336,7 @@ function findLabelMark2(event) {
4383
4336
  return event.target?.closest?.(selector);
4384
4337
  }
4385
4338
  function isLabelPointer2(event) {
4386
- return event.button === 0 && !chunkMR32IJQO_cjs.isCameraGesture(event);
4339
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
4387
4340
  }
4388
4341
  function findLabelSiblings(svg, ownerId, seriesId, mark) {
4389
4342
  const selector = `[data-sf-id="${CSS.escape(ownerId)}"][data-sf-series="${CSS.escape(seriesId)}"][data-sf-mark="${mark}"]`;
@@ -4415,7 +4368,7 @@ function resolvePieLabelDrag(svg, event) {
4415
4368
  if (!clicked) {
4416
4369
  return null;
4417
4370
  }
4418
- const owner = chunkMR32IJQO_cjs.resolveOwner(clicked);
4371
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(clicked);
4419
4372
  if (owner?.role !== "chart") {
4420
4373
  return null;
4421
4374
  }
@@ -4434,7 +4387,7 @@ function resolvePieLabelDrag(svg, event) {
4434
4387
  const wedgeRadius = clicked.getAttribute("data-sf-pie-wedge-radius");
4435
4388
  const explicitRadius = wedgeRadius === null ? Number.NaN : Number(wedgeRadius);
4436
4389
  const outerRadius = Number.isFinite(explicitRadius) ? explicitRadius : geometry.outerRadius;
4437
- const start = chunkMR32IJQO_cjs.pointerUserPoint(svg, event);
4390
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
4438
4391
  if (!start) {
4439
4392
  return null;
4440
4393
  }
@@ -4456,13 +4409,13 @@ function resolvePieLabelDrag(svg, event) {
4456
4409
  outerRadius,
4457
4410
  anchorX: geometry.centerX + outerRadius * Math.cos(midAngle),
4458
4411
  anchorY: geometry.centerY + outerRadius * Math.sin(midAngle),
4459
- tickStartX: geometry.centerX + (outerRadius + chunkC25NWWIH_cjs.LEADER_INSET) * Math.cos(midAngle),
4460
- tickStartY: geometry.centerY + (outerRadius + chunkC25NWWIH_cjs.LEADER_INSET) * Math.sin(midAngle),
4412
+ tickStartX: geometry.centerX + (outerRadius + chunkUHKFJBY5_cjs.LEADER_INSET) * Math.cos(midAngle),
4413
+ tickStartY: geometry.centerY + (outerRadius + chunkUHKFJBY5_cjs.LEADER_INSET) * Math.sin(midAngle),
4461
4414
  restX,
4462
4415
  restY,
4463
4416
  startX: start.x,
4464
4417
  startY: start.y,
4465
- halfWidth: chunkC25NWWIH_cjs.LABEL_WIDTH / 2,
4418
+ halfWidth: chunkUHKFJBY5_cjs.LABEL_WIDTH / 2,
4466
4419
  halfHeight: fontSize * 1.2,
4467
4420
  moved: false,
4468
4421
  lastDx: 0,
@@ -4498,7 +4451,7 @@ var PieLabelDragSession = class {
4498
4451
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
4499
4452
  return;
4500
4453
  }
4501
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
4454
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4502
4455
  if (!point) {
4503
4456
  return;
4504
4457
  }
@@ -4530,8 +4483,8 @@ var PieLabelDragSession = class {
4530
4483
  if (!drag.moved) {
4531
4484
  return;
4532
4485
  }
4533
- const pathX = chunkC25NWWIH_cjs.seriesLabelOffsetXProp(drag.seriesId);
4534
- const pathY = chunkC25NWWIH_cjs.seriesLabelOffsetYProp(drag.seriesId);
4486
+ const pathX = chunkUHKFJBY5_cjs.seriesLabelOffsetXProp(drag.seriesId);
4487
+ const pathY = chunkUHKFJBY5_cjs.seriesLabelOffsetYProp(drag.seriesId);
4535
4488
  if (!pathX || !pathY) {
4536
4489
  return;
4537
4490
  }
@@ -4593,7 +4546,7 @@ function siblingNodes(svg, owner, path) {
4593
4546
  });
4594
4547
  }
4595
4548
  function resolvePropertyDrag(svg, event, rules) {
4596
- if (event.button !== 0 || chunkMR32IJQO_cjs.isCameraGesture(event)) {
4549
+ if (event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4597
4550
  return null;
4598
4551
  }
4599
4552
  const node = event.target?.closest?.('[data-sf-prop-kind="value"]');
@@ -4601,11 +4554,11 @@ function resolvePropertyDrag(svg, event, rules) {
4601
4554
  return null;
4602
4555
  }
4603
4556
  const path = node.getAttribute("data-sf-prop");
4604
- const owner = chunkMR32IJQO_cjs.resolveOwner(node);
4557
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
4605
4558
  if (!path || owner?.role !== "chart" || !isEditablePath(path, rules)) {
4606
4559
  return null;
4607
4560
  }
4608
- const scale = parseValueScale(chunkMR32IJQO_cjs.findOwnerNode(svg, owner.id, chunkMR32IJQO_cjs.isPrimary));
4561
+ const scale = parseValueScale(chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary));
4609
4562
  if (!scale) {
4610
4563
  return null;
4611
4564
  }
@@ -4874,7 +4827,7 @@ function resolvePropertyTarget(event, rules) {
4874
4827
  return null;
4875
4828
  }
4876
4829
  const path = hit.getAttribute("data-sf-prop");
4877
- const owner = chunkMR32IJQO_cjs.resolveOwner(hit);
4830
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(hit);
4878
4831
  if (!path || !owner || !isEditablePath(path, rules)) {
4879
4832
  return null;
4880
4833
  }
@@ -4913,7 +4866,7 @@ var PropertyEditingSession = class {
4913
4866
  begin(target) {
4914
4867
  this.cancel();
4915
4868
  const { node } = target;
4916
- const rect = chunkMR32IJQO_cjs.screenRectOf(node);
4869
+ const rect = chunkWZA3DJJH_cjs.screenRectOf(node);
4917
4870
  const fontSize = Number.parseFloat(node.getAttribute("font-size") || "12");
4918
4871
  const originalText = node.textContent ?? "";
4919
4872
  const anchor = node.getAttribute("text-anchor");
@@ -5003,28 +4956,15 @@ function crossedDuplicateDragThreshold(drag, event) {
5003
4956
  var PREVIEW_STROKE_PX = 2;
5004
4957
  var NEW_LINK_PATH_TYPE = "orthogonal";
5005
4958
  function createDuplicatePreviewPath(svg) {
5006
- const path = svg.ownerDocument.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "path");
4959
+ const path = svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "path");
5007
4960
  path.setAttribute("fill", "none");
5008
- path.setAttribute("stroke-width", String(PREVIEW_STROKE_PX / chunkMR32IJQO_cjs.pxPerUnit(svg)));
4961
+ path.setAttribute("stroke-width", String(PREVIEW_STROKE_PX / chunkWZA3DJJH_cjs.pxPerUnit(svg)));
5009
4962
  path.style.pointerEvents = "none";
5010
4963
  return path;
5011
4964
  }
5012
- function previewLink3(fromSide, toSide) {
5013
- return {
5014
- id: "preview",
5015
- fromId: "",
5016
- toId: "",
5017
- layerGroup: "",
5018
- orderKey: "",
5019
- isVisible: true,
5020
- isLocked: false,
5021
- fromPoint: { kind: "side", side: fromSide, offset: 0.5 },
5022
- toPoint: { kind: "side", side: toSide, offset: 0.5 }
5023
- };
5024
- }
5025
4965
  function updateDuplicatePreview(drag, toPoint, toSide) {
5026
- const link = previewLink3(drag.direction, toSide);
5027
- const { points, segments } = chunkC25NWWIH_cjs.calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
4966
+ const link = previewLink(drag.direction, toSide);
4967
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
5028
4968
  drag.previewPath.setAttribute("d", previewPathData(points, segments, NEW_LINK_PATH_TYPE, 2));
5029
4969
  }
5030
4970
 
@@ -5035,7 +4975,7 @@ function duplicateCandidates(svg, sourceId) {
5035
4975
  if (element2.getAttribute("data-sf-role") === "link") {
5036
4976
  continue;
5037
4977
  }
5038
- const owner = chunkMR32IJQO_cjs.resolveOwner(element2);
4978
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
5039
4979
  if (owner && owner.id !== sourceId) {
5040
4980
  candidates.push({ owner, bounds: element2.getBBox() });
5041
4981
  }
@@ -5049,8 +4989,8 @@ function createQuickDuplicateDragState(svg, event, previewPath) {
5049
4989
  if (!bubble || !direction || direction.startsWith("iso-") || !sourceId) {
5050
4990
  return null;
5051
4991
  }
5052
- const primary = chunkMR32IJQO_cjs.findOwnerNode(svg, sourceId, chunkMR32IJQO_cjs.isPrimary);
5053
- const sourceOwner = primary && chunkMR32IJQO_cjs.resolveOwner(primary);
4992
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, sourceId, chunkWZA3DJJH_cjs.isPrimary);
4993
+ const sourceOwner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
5054
4994
  if (!primary || !sourceOwner) {
5055
4995
  return null;
5056
4996
  }
@@ -5058,7 +4998,7 @@ function createQuickDuplicateDragState(svg, event, previewPath) {
5058
4998
  return {
5059
4999
  sourceOwner,
5060
5000
  direction,
5061
- fixedPoint: chunkC25NWWIH_cjs.pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),
5001
+ fixedPoint: chunkUHKFJBY5_cjs.pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),
5062
5002
  previewPath,
5063
5003
  ghost: new LinkGhost(svg, previewPath),
5064
5004
  candidates: duplicateCandidates(svg, sourceId),
@@ -5086,7 +5026,7 @@ var QuickDuplicateSession = class {
5086
5026
  this.#emitter = emitter;
5087
5027
  }
5088
5028
  pointerDown = (event) => {
5089
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
5029
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
5090
5030
  return;
5091
5031
  }
5092
5032
  this.#drag = createQuickDuplicateDragState(this.#svg, event, createDuplicatePreviewPath(this.#svg));
@@ -5100,7 +5040,7 @@ var QuickDuplicateSession = class {
5100
5040
  return;
5101
5041
  }
5102
5042
  this.beginPreview(drag);
5103
- const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / chunkMR32IJQO_cjs.pxPerUnit(this.#svg));
5043
+ const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg));
5104
5044
  updateDuplicatePreview(drag, target.point, target.side);
5105
5045
  drag.ghost.show(target.hit !== null, target.bounds);
5106
5046
  };
@@ -5158,14 +5098,14 @@ function seriesShapes(svg, ownerId, series) {
5158
5098
  return [...svg.querySelectorAll(selector)];
5159
5099
  }
5160
5100
  function updateRadarVertexDragPreview(svg, drag, value) {
5161
- const point = chunkC25NWWIH_cjs.radarVertexPoint(drag.frame, drag.index, value);
5101
+ const point = chunkUHKFJBY5_cjs.radarVertexPoint(drag.frame, drag.index, value);
5162
5102
  drag.element.setAttribute("cx", String(point.x));
5163
5103
  drag.element.setAttribute("cy", String(point.y));
5164
5104
  const points = seriesVertices(svg, drag.owner.id, drag.series).map((vertex) => ({
5165
5105
  x: Number(vertex.getAttribute("cx")),
5166
5106
  y: Number(vertex.getAttribute("cy"))
5167
5107
  }));
5168
- const path = chunkC25NWWIH_cjs.radarSeriesPath(points, drag.frame.curved, drag.frame.tension);
5108
+ const path = chunkUHKFJBY5_cjs.radarSeriesPath(points, drag.frame.curved, drag.frame.tension);
5169
5109
  for (const shape of seriesShapes(svg, drag.owner.id, drag.series)) {
5170
5110
  shape.setAttribute("d", path);
5171
5111
  }
@@ -5220,7 +5160,7 @@ function findVertex(event) {
5220
5160
  return event.target?.closest?.('[data-sf-mark="radar-vertex"]');
5221
5161
  }
5222
5162
  function isVertexPointer(event) {
5223
- return event.button === 0 && !chunkMR32IJQO_cjs.isCameraGesture(event);
5163
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
5224
5164
  }
5225
5165
  function resolveRadarVertexDrag(svg, event) {
5226
5166
  if (!isVertexPointer(event)) {
@@ -5230,7 +5170,7 @@ function resolveRadarVertexDrag(svg, event) {
5230
5170
  if (!element2) {
5231
5171
  return null;
5232
5172
  }
5233
- const owner = chunkMR32IJQO_cjs.resolveOwner(element2);
5173
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
5234
5174
  if (owner?.role !== "chart") {
5235
5175
  return null;
5236
5176
  }
@@ -5239,7 +5179,7 @@ function resolveRadarVertexDrag(svg, event) {
5239
5179
  if (!series || !Number.isInteger(index) || index < 0) {
5240
5180
  return null;
5241
5181
  }
5242
- const frame = parseRadarFrame(chunkMR32IJQO_cjs.findOwnerNode(svg, owner.id, chunkMR32IJQO_cjs.isPrimary));
5182
+ const frame = parseRadarFrame(chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary));
5243
5183
  if (!frame || index >= frame.count) {
5244
5184
  return null;
5245
5185
  }
@@ -5249,11 +5189,11 @@ function resolveRadarVertexDrag(svg, event) {
5249
5189
 
5250
5190
  // src/runtime/interaction/radarVertexDrag/session.ts
5251
5191
  function valueFrom(svg, event, drag) {
5252
- const point = chunkMR32IJQO_cjs.pointerUserPoint(svg, event);
5192
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
5253
5193
  if (!point) {
5254
5194
  return null;
5255
5195
  }
5256
- return chunkC25NWWIH_cjs.radarValueAtPoint(drag.frame, drag.index, point.x, point.y);
5196
+ return chunkUHKFJBY5_cjs.radarValueAtPoint(drag.frame, drag.index, point.x, point.y);
5257
5197
  }
5258
5198
  var RadarVertexDragSession = class {
5259
5199
  #svg;
@@ -5285,7 +5225,7 @@ var RadarVertexDragSession = class {
5285
5225
  if (!this.#readout) {
5286
5226
  this.#readout = createValueReadout(this.#svg);
5287
5227
  }
5288
- const vertex = chunkC25NWWIH_cjs.radarVertexPoint(this.#drag.frame, this.#drag.index, value);
5228
+ const vertex = chunkUHKFJBY5_cjs.radarVertexPoint(this.#drag.frame, this.#drag.index, value);
5289
5229
  positionRadarReadout(this.#readout, vertex, this.#drag.frame.centerY, value);
5290
5230
  }
5291
5231
  cancel() {
@@ -5376,7 +5316,7 @@ function captureTextFit(text) {
5376
5316
  fontSize,
5377
5317
  lineHeight,
5378
5318
  padding: Math.max(8, text.strokeWidth * 2),
5379
- longestWord: Math.max(0, ...words.map((word) => chunkC25NWWIH_cjs.estimateTextWidth(word, fontSize, bold)))
5319
+ longestWord: Math.max(0, ...words.map((word) => chunkUHKFJBY5_cjs.estimateTextWidth(word, fontSize, bold)))
5380
5320
  };
5381
5321
  }
5382
5322
  var COMMIT_PRECISION = 10;
@@ -5387,7 +5327,7 @@ function minWidthForText(fit) {
5387
5327
  return roundUpForCommit(fit.longestWord + fit.padding * 2);
5388
5328
  }
5389
5329
  function minHeightForText(fit, width) {
5390
- const lines = chunkC25NWWIH_cjs.wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);
5330
+ const lines = chunkUHKFJBY5_cjs.wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);
5391
5331
  return roundUpForCommit(lines.length * fit.fontSize * fit.lineHeight + fit.padding * 2);
5392
5332
  }
5393
5333
 
@@ -5521,7 +5461,7 @@ function applyRectBounds(rect, kind, bounds) {
5521
5461
  rect.setAttribute("width", String(bounds.width));
5522
5462
  rect.setAttribute("height", String(bounds.height));
5523
5463
  if (kind === "pill") {
5524
- rect.setAttribute("rx", String(chunkC25NWWIH_cjs.pillCornerRadius(bounds.width, bounds.height)));
5464
+ rect.setAttribute("rx", String(chunkUHKFJBY5_cjs.pillCornerRadius(bounds.width, bounds.height)));
5525
5465
  }
5526
5466
  }
5527
5467
  function applyEllipseBounds(ellipse, bounds) {
@@ -5531,7 +5471,7 @@ function applyEllipseBounds(ellipse, bounds) {
5531
5471
  ellipse.setAttribute("ry", String(bounds.height / 2));
5532
5472
  }
5533
5473
  function applySymbolBounds(path, bounds) {
5534
- const raw = path.getAttribute(chunkC25NWWIH_cjs.SYMBOL_POINTS_ATTR);
5474
+ const raw = path.getAttribute(chunkUHKFJBY5_cjs.SYMBOL_POINTS_ATTR);
5535
5475
  if (!raw) {
5536
5476
  return false;
5537
5477
  }
@@ -5539,22 +5479,22 @@ function applySymbolBounds(path, bounds) {
5539
5479
  x: bounds.x + x * bounds.width,
5540
5480
  y: bounds.y + y * bounds.height
5541
5481
  }));
5542
- const tension = Number(path.getAttribute(chunkC25NWWIH_cjs.SYMBOL_TENSION_ATTR)) || 0;
5543
- path.setAttribute("d", chunkC25NWWIH_cjs.freeformPathData({ points, tension, closed: true }));
5482
+ const tension = Number(path.getAttribute(chunkUHKFJBY5_cjs.SYMBOL_TENSION_ATTR)) || 0;
5483
+ path.setAttribute("d", chunkUHKFJBY5_cjs.freeformPathData({ points, tension, closed: true }));
5544
5484
  return true;
5545
5485
  }
5546
5486
  function applyPathBounds(path, kind, bounds) {
5547
5487
  if (kind === "symbol" && applySymbolBounds(path, bounds)) {
5548
5488
  return;
5549
5489
  }
5550
- const pathData = chunkC25NWWIH_cjs.localShapePath(kind, bounds.x, bounds.y, bounds.width, bounds.height);
5490
+ const pathData = chunkUHKFJBY5_cjs.localShapePath(kind, bounds.x, bounds.y, bounds.width, bounds.height);
5551
5491
  if (pathData) {
5552
5492
  path.setAttribute("d", pathData);
5553
5493
  }
5554
5494
  }
5555
5495
  function applyFrameBoundaryBounds(path, bounds) {
5556
- const cornerRadius = Number(path.getAttribute(chunkC25NWWIH_cjs.CORNER_RADIUS_ATTR) ?? 0);
5557
- const squareCorner = path.getAttribute(chunkC25NWWIH_cjs.SQUARE_CORNER_ATTR);
5496
+ const cornerRadius = Number(path.getAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR) ?? 0);
5497
+ const squareCorner = path.getAttribute(chunkUHKFJBY5_cjs.SQUARE_CORNER_ATTR);
5558
5498
  const radii = {
5559
5499
  topLeft: cornerRadius,
5560
5500
  topRight: cornerRadius,
@@ -5564,7 +5504,7 @@ function applyFrameBoundaryBounds(path, bounds) {
5564
5504
  if (squareCorner) {
5565
5505
  radii[squareCorner] = 0;
5566
5506
  }
5567
- path.setAttribute("d", chunkC25NWWIH_cjs.cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));
5507
+ path.setAttribute("d", chunkUHKFJBY5_cjs.cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));
5568
5508
  }
5569
5509
  function applySingleNodeBounds(primary, kind, bounds) {
5570
5510
  const tag = primary.tagName.toLowerCase();
@@ -5574,7 +5514,7 @@ function applySingleNodeBounds(primary, kind, bounds) {
5574
5514
  applyEllipseBounds(primary, bounds);
5575
5515
  } else if (tag === "foreignobject") {
5576
5516
  applyRectBounds(primary, null, bounds);
5577
- } else if (tag === "path" && primary.hasAttribute(chunkC25NWWIH_cjs.CORNER_RADIUS_ATTR)) {
5517
+ } else if (tag === "path" && primary.hasAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR)) {
5578
5518
  applyFrameBoundaryBounds(primary, bounds);
5579
5519
  } else if (tag === "path" && kind) {
5580
5520
  applyPathBounds(primary, kind, bounds);
@@ -5613,7 +5553,7 @@ function updateSelectionRing(overlay, bounds) {
5613
5553
  }
5614
5554
  function updateSelectionOverlay(overlay, bounds) {
5615
5555
  updateSelectionRing(overlay, bounds);
5616
- for (const [centerX, centerY, name] of chunkMR32IJQO_cjs.resizeHandlePositions(bounds)) {
5556
+ for (const [centerX, centerY, name] of chunkWZA3DJJH_cjs.resizeHandlePositions(bounds)) {
5617
5557
  const handle = overlay.querySelector(`[data-sf-resize-handle="${name}"]`);
5618
5558
  if (!handle) {
5619
5559
  continue;
@@ -5630,7 +5570,7 @@ function replaceTextLines(textElement, lines, x, lineHeight) {
5630
5570
  textElement.removeChild(textElement.firstChild);
5631
5571
  }
5632
5572
  lines.forEach((line, index) => {
5633
- const tspan = document.createElementNS(chunkMR32IJQO_cjs.SVG_NAMESPACE, "tspan");
5573
+ const tspan = document.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "tspan");
5634
5574
  tspan.setAttribute("x", String(x));
5635
5575
  if (index > 0) {
5636
5576
  tspan.setAttribute("dy", `${lineHeight}px`);
@@ -5650,7 +5590,7 @@ function applyLiveText(textElement, rawText, bounds, strokeWidth) {
5650
5590
  const height = Math.max(0, bounds.height - padding * 2);
5651
5591
  const boxX = bounds.x + padding;
5652
5592
  const boxY = bounds.y + padding;
5653
- const lines = chunkC25NWWIH_cjs.wrapText(rawText, width, fontSize);
5593
+ const lines = chunkUHKFJBY5_cjs.wrapText(rawText, width, fontSize);
5654
5594
  const linePixels = fontSize * lineHeight;
5655
5595
  const contentHeight = lines.length * linePixels;
5656
5596
  const firstY = verticalAlign === "top" ? boxY + fontSize : verticalAlign === "bottom" ? boxY + height - contentHeight + fontSize : boxY + (height - contentHeight) / 2 + fontSize;
@@ -5663,7 +5603,7 @@ function applyLiveText(textElement, rawText, bounds, strokeWidth) {
5663
5603
 
5664
5604
  // src/runtime/interaction/resize/preview.ts
5665
5605
  function textBoundsFor(kind, bounds) {
5666
- return kind === "person" ? chunkC25NWWIH_cjs.personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;
5606
+ return kind === "person" ? chunkUHKFJBY5_cjs.personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;
5667
5607
  }
5668
5608
  function applyGeometryPreview(drag, bounds) {
5669
5609
  if (drag.isComposite) {
@@ -5683,7 +5623,7 @@ function applyResizePreview(drag, bounds) {
5683
5623
  applyLiveText(drag.text.el, drag.text.rawText, textBoundsFor(drag.kind, bounds), drag.text.strokeWidth);
5684
5624
  }
5685
5625
  if (drag.bubbles) {
5686
- chunkMR32IJQO_cjs.updateQuickDuplicateBubbles(drag.bubbles, bounds);
5626
+ chunkWZA3DJJH_cjs.updateQuickDuplicateBubbles(drag.bubbles, bounds);
5687
5627
  }
5688
5628
  updateLiveLinks(drag.liveLinks, bounds);
5689
5629
  }
@@ -5704,9 +5644,9 @@ function snapResize(svg, drag, pointer) {
5704
5644
  };
5705
5645
  }
5706
5646
  const axes = HANDLE_AXES[drag.handle];
5707
- const candidates = nearestCandidates(proposed, chunkMR32IJQO_cjs.findSnapCandidateBounds(svg, /* @__PURE__ */ new Set([drag.owner.id])));
5647
+ const candidates = nearestCandidates(proposed, chunkWZA3DJJH_cjs.findSnapCandidateBounds(svg, /* @__PURE__ */ new Set([drag.owner.id])));
5708
5648
  const snap = computeSnap(proposed, candidates, {
5709
- threshold: snapDistancePx(svg) / chunkMR32IJQO_cjs.pxPerUnit(svg),
5649
+ threshold: snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg),
5710
5650
  activeX: resizeActivePoints(axes.x),
5711
5651
  activeY: resizeActivePoints(axes.y),
5712
5652
  guideOverhang: GUIDE_OVERHANG3
@@ -5747,13 +5687,13 @@ function selectResizeTarget(svg, event) {
5747
5687
  if (!ownerId) {
5748
5688
  return null;
5749
5689
  }
5750
- const primary = chunkMR32IJQO_cjs.findOwnerNode(svg, ownerId, chunkMR32IJQO_cjs.isPrimary);
5751
- const owner = primary && chunkMR32IJQO_cjs.resolveOwner(primary);
5690
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
5691
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
5752
5692
  if (!primary || !hasEditableGeometry(owner)) {
5753
5693
  return null;
5754
5694
  }
5755
- const nodes = chunkMR32IJQO_cjs.findAllOwnerNodes(svg, ownerId);
5756
- const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter((node) => !chunkMR32IJQO_cjs.isTextLabel(node));
5695
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, ownerId);
5696
+ const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter((node) => !chunkWZA3DJJH_cjs.isTextLabel(node));
5757
5697
  if (!geometryNodes.length) {
5758
5698
  return null;
5759
5699
  }
@@ -5771,7 +5711,7 @@ function selectResizeTarget(svg, event) {
5771
5711
 
5772
5712
  // src/runtime/interaction/resize/textCapture.ts
5773
5713
  function captureResizeText(nodes, primary) {
5774
- const textElement = nodes.find(chunkMR32IJQO_cjs.isTextLabel);
5714
+ const textElement = nodes.find(chunkWZA3DJJH_cjs.isTextLabel);
5775
5715
  const rawText = primary.getAttribute("aria-label");
5776
5716
  if (!textElement || !rawText) {
5777
5717
  return null;
@@ -5789,7 +5729,7 @@ function createResizeDragState(svg, event) {
5789
5729
  if (!selection) {
5790
5730
  return null;
5791
5731
  }
5792
- const startBounds = chunkMR32IJQO_cjs.symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();
5732
+ const startBounds = chunkWZA3DJJH_cjs.symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();
5793
5733
  const composite = isCompositeOwner(selection.owner);
5794
5734
  const isContainer = CONTAINER_ROLES.has(selection.owner.role);
5795
5735
  selection.captureTarget.setPointerCapture?.(event.pointerId);
@@ -5802,7 +5742,7 @@ function createResizeDragState(svg, event) {
5802
5742
  isComposite: composite,
5803
5743
  geometryNodes: selection.geometryNodes,
5804
5744
  insets: selection.geometryNodes.map(
5805
- (node) => node === selection.primary ? NO_INSET : insetWithin(startBounds, chunkMR32IJQO_cjs.symbolDeclaredBounds(node) ?? node.getBBox())
5745
+ (node) => node === selection.primary ? NO_INSET : insetWithin(startBounds, chunkWZA3DJJH_cjs.symbolDeclaredBounds(node) ?? node.getBBox())
5806
5746
  ),
5807
5747
  baseTransforms: selection.geometryNodes.map((node) => node.getAttribute("transform")),
5808
5748
  overlay: selection.overlay,
@@ -5828,7 +5768,7 @@ var ResizeSession = class {
5828
5768
  this.#emitter = emitter;
5829
5769
  }
5830
5770
  pointerDown = (event) => {
5831
- if (event.button !== 0 || this.#drag || chunkMR32IJQO_cjs.isCameraGesture(event)) {
5771
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
5832
5772
  return;
5833
5773
  }
5834
5774
  this.#drag = createResizeDragState(this.#svg, event);
@@ -5843,7 +5783,7 @@ var ResizeSession = class {
5843
5783
  const bounds = keepsProportions(drag, event.shiftKey) ? lockAspect(snapped.bounds, drag.startBounds, drag.handle) : snapped.bounds;
5844
5784
  const { guides } = snapped;
5845
5785
  applyResizePreview(drag, clampResizeToChildren(bounds, drag.childrenBounds));
5846
- chunkMR32IJQO_cjs.updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);
5786
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);
5847
5787
  };
5848
5788
  pointerUp = (event) => {
5849
5789
  const drag = this.#drag;
@@ -5852,7 +5792,7 @@ var ResizeSession = class {
5852
5792
  }
5853
5793
  this.#drag = null;
5854
5794
  event.target?.releasePointerCapture?.(drag.pointerId);
5855
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
5795
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
5856
5796
  if (!drag.moved) {
5857
5797
  return;
5858
5798
  }
@@ -5891,7 +5831,7 @@ function resolveSankeyNodeLabelTarget(event) {
5891
5831
  if (!labelElement) {
5892
5832
  return null;
5893
5833
  }
5894
- const owner = chunkMR32IJQO_cjs.resolveOwner(labelElement);
5834
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(labelElement);
5895
5835
  if (owner?.role !== "chart") {
5896
5836
  return null;
5897
5837
  }
@@ -5902,7 +5842,7 @@ function resolveSankeyNodeLabelTarget(event) {
5902
5842
  return { owner, nodeId, labelElement };
5903
5843
  }
5904
5844
  function createSankeyNodeLabelEditor(target, emitter, onClose) {
5905
- const rect = chunkMR32IJQO_cjs.screenRectOf(target.labelElement);
5845
+ const rect = chunkWZA3DJJH_cjs.screenRectOf(target.labelElement);
5906
5846
  if (rect.width <= 0 && rect.height <= 0) {
5907
5847
  return null;
5908
5848
  }
@@ -5959,7 +5899,7 @@ function clearSankeyNodeDragPreview(drag) {
5959
5899
  // src/runtime/interaction/sankeyNode/target.ts
5960
5900
  var RIBBON_PATH = /^M\s+(-?[\d.]+)\s+(-?[\d.]+)\s+C\s+-?[\d.]+\s+-?[\d.]+\s+-?[\d.]+\s+(-?[\d.]+)\s+(-?[\d.]+)\s+-?[\d.]+\s+L\s+-?[\d.]+\s+(-?[\d.]+)\s+C\s+-?[\d.]+\s+-?[\d.]+\s+-?[\d.]+\s+(-?[\d.]+)\s+-?[\d.]+\s+-?[\d.]+\s+Z$/;
5961
5901
  function isNodePointer(event) {
5962
- return event.button === 0 && !chunkMR32IJQO_cjs.isCameraGesture(event);
5902
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
5963
5903
  }
5964
5904
  function findNodeRect(event) {
5965
5905
  return event.target?.closest?.('[data-sf-mark="sankey-node"]');
@@ -6017,7 +5957,7 @@ function resolveSankeyNodeDrag(svg, event) {
6017
5957
  if (!rect) {
6018
5958
  return null;
6019
5959
  }
6020
- const owner = chunkMR32IJQO_cjs.resolveOwner(rect);
5960
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(rect);
6021
5961
  if (owner?.role !== "chart") {
6022
5962
  return null;
6023
5963
  }
@@ -6025,7 +5965,7 @@ function resolveSankeyNodeDrag(svg, event) {
6025
5965
  if (!nodeId) {
6026
5966
  return null;
6027
5967
  }
6028
- const start = chunkMR32IJQO_cjs.pointerUserPoint(svg, event);
5968
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
6029
5969
  if (!start) {
6030
5970
  return null;
6031
5971
  }
@@ -6071,7 +6011,7 @@ var SankeyNodeDragSession = class {
6071
6011
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
6072
6012
  return;
6073
6013
  }
6074
- const point = chunkMR32IJQO_cjs.pointerUserPoint(this.#svg, event);
6014
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
6075
6015
  if (!point) {
6076
6016
  return;
6077
6017
  }
@@ -6085,7 +6025,7 @@ var SankeyNodeDragSession = class {
6085
6025
  const leadBounds = offsetBounds(drag.originalBounds, rawDx, rawDy);
6086
6026
  const candidates = nearestCandidates(leadBounds, drag.siblingBounds);
6087
6027
  const snap = computeSnap(leadBounds, candidates, {
6088
- threshold: SNAP_THRESHOLD_PX / chunkMR32IJQO_cjs.pxPerUnit(this.#svg),
6028
+ threshold: SNAP_THRESHOLD_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg),
6089
6029
  activeX: MOVE_ACTIVE_POINTS,
6090
6030
  activeY: MOVE_ACTIVE_POINTS,
6091
6031
  guideOverhang: GUIDE_OVERHANG4
@@ -6095,7 +6035,7 @@ var SankeyNodeDragSession = class {
6095
6035
  drag.lastDx = dx;
6096
6036
  drag.lastDy = dy;
6097
6037
  updateSankeyNodeDragPreview(drag, dx, dy);
6098
- chunkMR32IJQO_cjs.updateAlignmentGuides(
6038
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(
6099
6039
  this.#svg,
6100
6040
  [snap.x.guide, snap.y.guide].filter((guide) => guide !== null),
6101
6041
  GUIDE_COLOR3
@@ -6106,7 +6046,7 @@ var SankeyNodeDragSession = class {
6106
6046
  clearSankeyNodeDragPreview(this.#drag);
6107
6047
  }
6108
6048
  this.#drag = null;
6109
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
6049
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
6110
6050
  }
6111
6051
  finish(event) {
6112
6052
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
@@ -6116,7 +6056,7 @@ var SankeyNodeDragSession = class {
6116
6056
  this.#drag = null;
6117
6057
  event.target?.releasePointerCapture?.(drag.pointerId);
6118
6058
  clearSankeyNodeDragPreview(drag);
6119
- chunkMR32IJQO_cjs.clearAlignmentGuides(this.#svg);
6059
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
6120
6060
  if (!drag.moved) {
6121
6061
  return;
6122
6062
  }
@@ -6172,7 +6112,7 @@ function bindSankeyNode(viewer, emitter) {
6172
6112
  var FALLBACK_WIDTH = 120;
6173
6113
  var FALLBACK_HEIGHT = 28;
6174
6114
  function centeredLabelRect(primaryNode) {
6175
- const primaryRect = chunkMR32IJQO_cjs.screenRectOf(primaryNode);
6115
+ const primaryRect = chunkWZA3DJJH_cjs.screenRectOf(primaryNode);
6176
6116
  return {
6177
6117
  left: primaryRect.left + (primaryRect.width - FALLBACK_WIDTH) / 2,
6178
6118
  top: primaryRect.top + (primaryRect.height - FALLBACK_HEIGHT) / 2,
@@ -6182,10 +6122,10 @@ function centeredLabelRect(primaryNode) {
6182
6122
  }
6183
6123
  function resolveTextEditRect(owner, textNode, primaryNode) {
6184
6124
  if (owner.role === "shape") {
6185
- return primaryNode ? chunkMR32IJQO_cjs.screenRectOf(primaryNode) : null;
6125
+ return primaryNode ? chunkWZA3DJJH_cjs.screenRectOf(primaryNode) : null;
6186
6126
  }
6187
6127
  if (textNode) {
6188
- return chunkMR32IJQO_cjs.screenRectOf(textNode);
6128
+ return chunkWZA3DJJH_cjs.screenRectOf(textNode);
6189
6129
  }
6190
6130
  return primaryNode ? centeredLabelRect(primaryNode) : null;
6191
6131
  }
@@ -6205,8 +6145,8 @@ function textAlign(owner, textNode) {
6205
6145
  return anchor === "end" ? "right" : "left";
6206
6146
  }
6207
6147
  function createActiveTextEditor(svg, owner, emitter, onClose) {
6208
- const textNode = chunkMR32IJQO_cjs.findOwnerNode(svg, owner.id, chunkMR32IJQO_cjs.isTextLabel);
6209
- const primaryNode = chunkMR32IJQO_cjs.findOwnerNode(svg, owner.id, chunkMR32IJQO_cjs.isPrimary);
6148
+ const textNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isTextLabel);
6149
+ const primaryNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary);
6210
6150
  const rect = resolveTextEditRect(owner, textNode, primaryNode);
6211
6151
  if (!rect) {
6212
6152
  return null;
@@ -6252,7 +6192,7 @@ function isFrameTitle(target) {
6252
6192
  }
6253
6193
  function resolveEditableTextOwner(event) {
6254
6194
  const target = event.target;
6255
- const owner = chunkMR32IJQO_cjs.resolveOwner(target);
6195
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(target);
6256
6196
  if (!owner) {
6257
6197
  return null;
6258
6198
  }
@@ -6393,7 +6333,7 @@ function applyToken(target, lines, token) {
6393
6333
  function maskSource(lines) {
6394
6334
  let tokens;
6395
6335
  try {
6396
- tokens = chunkC25NWWIH_cjs.tokenizeSource(lines.join("\n"));
6336
+ tokens = chunkUHKFJBY5_cjs.tokenizeSource(lines.join("\n"));
6397
6337
  } catch {
6398
6338
  return null;
6399
6339
  }
@@ -6425,7 +6365,7 @@ function braceDelta(masked) {
6425
6365
  }
6426
6366
 
6427
6367
  // src/runtime/interaction/sflPatch/scan/blocks.ts
6428
- var OWNER_HEADER = /^\s*(Entity|Shape|Text|Container|Chart|Path|Link|Isometric|Widget|Component|Connection|Shader)\s+([A-Za-z_][A-Za-z0-9_]*)\b/;
6368
+ var OWNER_HEADER = /^\s*(Entity|Shape|Text|Image|Container|Chart|Path|Link|Isometric|Widget|Component|Connection|Shader)\s+([A-Za-z_][A-Za-z0-9_]*)\b/;
6429
6369
  var VALID_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;
6430
6370
  function blockEndIn(masked, startLine) {
6431
6371
  let depth = 0;
@@ -6692,6 +6632,9 @@ function canvasObjectBlockKind(kind) {
6692
6632
  if (kind === "text") {
6693
6633
  return "Text";
6694
6634
  }
6635
+ if (kind === "image") {
6636
+ return "Image";
6637
+ }
6695
6638
  if (kind === "isometric") {
6696
6639
  return "Isometric";
6697
6640
  }
@@ -6726,7 +6669,7 @@ function resolveCanvasObjectInsertionTarget(sfl, lines, parentId) {
6726
6669
  const modelRange = findFirstBlockOfKind(lines, "Model");
6727
6670
  return modelRange ? { range: modelRange, origin: { x: 0, y: 0 } } : null;
6728
6671
  }
6729
- const parent = chunkC25NWWIH_cjs.sflToCanvasState(sfl).canvasObjects.find((canvasObject) => canvasObject.id === parentId);
6672
+ const parent = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects.find((canvasObject) => canvasObject.id === parentId);
6730
6673
  if (!parent) {
6731
6674
  return null;
6732
6675
  }
@@ -6810,18 +6753,7 @@ function findReferencingLinkRanges(lines, canvasObjectId) {
6810
6753
  return ranges;
6811
6754
  }
6812
6755
 
6813
- // src/runtime/interaction/sflPatch/canvasObjectPatch/removalRanges.ts
6814
- function containsRange(container, candidate) {
6815
- const sameRange = container.start === candidate.start && container.end === candidate.end;
6816
- return !sameRange && container.start <= candidate.start && container.end >= candidate.end;
6817
- }
6818
- function outermostRemovalRanges(ranges) {
6819
- return ranges.filter(
6820
- (candidate) => !ranges.some((container) => container !== candidate && containsRange(container, candidate))
6821
- );
6822
- }
6823
-
6824
- // src/runtime/interaction/sflPatch/canvasObjectPatch/repeatCell.ts
6756
+ // src/runtime/interaction/sflPatch/canvasObjectPatch/madeBlocks.ts
6825
6757
  var REPEAT_HEADER = /^(\s*)Repeat\s+[A-Za-z_]\w*\s*\{\s*$/;
6826
6758
  var TEMPLATE_HEADER = /^\s*[A-Z]\w*\s+([A-Za-z_]\w*)\b[^{]*\{/;
6827
6759
  var PROPERTY = /^\s*[A-Za-z_]\w*\s*:/;
@@ -6848,7 +6780,7 @@ function excludeRepeatCell(lines, id) {
6848
6780
  const template = masked[i].match(TEMPLATE_HEADER);
6849
6781
  if (template) {
6850
6782
  seenTemplate = true;
6851
- const made = id.match(new RegExp(`^${escaped(template[1])}_(\\d+)(?:_(\\d+))?$`));
6783
+ const made = id.match(new RegExp(`^${escaped(template[1])}_(\\d+)(?:_(\\d+))?(?:_[A-Za-z]\\w*)?$`));
6852
6784
  if (made) {
6853
6785
  cell = { col: Number(made[1]), row: made[2] === void 0 ? 0 : Number(made[2]) };
6854
6786
  }
@@ -6877,13 +6809,48 @@ function excludeRepeatCell(lines, id) {
6877
6809
  }
6878
6810
  return null;
6879
6811
  }
6812
+ var USE_HEADER = /^\s*Use\s+([A-Za-z_]\w*)\s*:/;
6813
+ function findUseBlock(lines, id) {
6814
+ const masked = maskLines(lines);
6815
+ if (masked === null) {
6816
+ return null;
6817
+ }
6818
+ let found = null;
6819
+ for (let start = 0; start < masked.length; start++) {
6820
+ const header = masked[start].match(USE_HEADER);
6821
+ if (header && id.startsWith(`${header[1]}_`) && (found === null || header[1].length > found.length)) {
6822
+ found = { start, end: blockEndLine(lines, start), length: header[1].length };
6823
+ }
6824
+ }
6825
+ return found && { start: found.start, end: found.end };
6826
+ }
6827
+
6828
+ // src/runtime/interaction/sflPatch/canvasObjectPatch/removalRanges.ts
6829
+ function containsRange(container, candidate) {
6830
+ const sameRange = container.start === candidate.start && container.end === candidate.end;
6831
+ return !sameRange && container.start <= candidate.start && container.end >= candidate.end;
6832
+ }
6833
+ function outermostRemovalRanges(ranges) {
6834
+ return ranges.filter(
6835
+ (candidate) => !ranges.some((container) => container !== candidate && containsRange(container, candidate))
6836
+ );
6837
+ }
6880
6838
 
6881
6839
  // src/runtime/interaction/sflPatch/canvasObjectPatch/remove.ts
6882
6840
  function removeCanvasObject(sfl, id, options = {}) {
6883
6841
  const lines = sfl.split("\n");
6884
6842
  const canvasObjectRange = findOwnerBlock(lines, id);
6885
6843
  if (!canvasObjectRange) {
6886
- return excludeRepeatCell(lines, id)?.join("\n") ?? sfl;
6844
+ const cell = excludeRepeatCell(lines, id);
6845
+ if (cell) {
6846
+ return cell.join("\n");
6847
+ }
6848
+ const use = findUseBlock(lines, id);
6849
+ if (use) {
6850
+ lines.splice(use.start, use.end - use.start + 1);
6851
+ return lines.join("\n");
6852
+ }
6853
+ return sfl;
6887
6854
  }
6888
6855
  const ranges = [canvasObjectRange];
6889
6856
  if (options.alsoRemoveLinks ?? true) {
@@ -7229,7 +7196,7 @@ function movePathPoints(lines, range, dx, dy) {
7229
7196
  replacePropertyValue(lines, span, shifted);
7230
7197
  }
7231
7198
  function applyMoveChange(sfl, event) {
7232
- const state = chunkC25NWWIH_cjs.sflToCanvasState(sfl);
7199
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7233
7200
  const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7234
7201
  if (!canvasObject) {
7235
7202
  return sfl;
@@ -7254,7 +7221,7 @@ function applyMoveChange(sfl, event) {
7254
7221
 
7255
7222
  // src/runtime/interaction/sflPatch/changes/pathPointChange.ts
7256
7223
  function applyPathPointChange(sfl, event) {
7257
- const canvasObjects = chunkC25NWWIH_cjs.sflToCanvasState(sfl).canvasObjects;
7224
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7258
7225
  const canvasObject = canvasObjects.find((candidate) => candidate.id === event.owner.id);
7259
7226
  if (!canvasObject) {
7260
7227
  return sfl;
@@ -7408,7 +7375,7 @@ function resolveConnectionInsertionTarget(sfl, lines, options) {
7408
7375
  if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {
7409
7376
  return null;
7410
7377
  }
7411
- const canvasObjects = chunkC25NWWIH_cjs.sflToCanvasState(sfl).canvasObjects;
7378
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7412
7379
  const hasSource = canvasObjects.some((canvasObject) => canvasObject.id === options.fromId);
7413
7380
  const hasTarget = canvasObjects.some((canvasObject) => canvasObject.id === options.toId);
7414
7381
  if (!hasSource || !hasTarget) {
@@ -7472,13 +7439,13 @@ function isometricOffset(direction, object, gap) {
7472
7439
  const { depth } = object.isometric;
7473
7440
  switch (direction) {
7474
7441
  case "iso-width-pos":
7475
- return { dx: (width + gap) * chunkC25NWWIH_cjs.AXIS_COS, dy: (width + gap) * chunkC25NWWIH_cjs.AXIS_SIN };
7442
+ return { dx: (width + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: (width + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7476
7443
  case "iso-width-neg":
7477
- return { dx: -(width + gap) * chunkC25NWWIH_cjs.AXIS_COS, dy: -(width + gap) * chunkC25NWWIH_cjs.AXIS_SIN };
7444
+ return { dx: -(width + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: -(width + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7478
7445
  case "iso-depth-pos":
7479
- return { dx: -(depth + gap) * chunkC25NWWIH_cjs.AXIS_COS, dy: (depth + gap) * chunkC25NWWIH_cjs.AXIS_SIN };
7446
+ return { dx: -(depth + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: (depth + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7480
7447
  case "iso-depth-neg":
7481
- return { dx: (depth + gap) * chunkC25NWWIH_cjs.AXIS_COS, dy: -(depth + gap) * chunkC25NWWIH_cjs.AXIS_SIN };
7448
+ return { dx: (depth + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: -(depth + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7482
7449
  case "iso-height-pos":
7483
7450
  return { dx: 0, dy: height + gap };
7484
7451
  case "iso-height-neg":
@@ -7541,7 +7508,7 @@ function resolveLinkInsertionTarget(sfl, lines, options) {
7541
7508
  if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {
7542
7509
  return null;
7543
7510
  }
7544
- const canvasObjects = chunkC25NWWIH_cjs.sflToCanvasState(sfl).canvasObjects;
7511
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7545
7512
  const hasSource = canvasObjects.some((canvasObject) => canvasObject.id === options.fromId);
7546
7513
  const hasTarget = canvasObjects.some((canvasObject) => canvasObject.id === options.toId);
7547
7514
  if (!hasSource || !hasTarget) {
@@ -7627,21 +7594,21 @@ function duplicateShape(sfl, input) {
7627
7594
 
7628
7595
  // src/runtime/interaction/sflPatch/changes/quickDuplicateChange.ts
7629
7596
  function applyQuickDuplicateChange(sfl, event, options) {
7630
- const state = chunkC25NWWIH_cjs.sflToCanvasState(sfl);
7597
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7631
7598
  const object = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7632
7599
  if (!object) {
7633
7600
  return sfl;
7634
7601
  }
7635
7602
  const { direction } = event;
7636
7603
  if (isIsometricDirection2(direction)) {
7637
- return chunkC25NWWIH_cjs.isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;
7604
+ return chunkUHKFJBY5_cjs.isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;
7638
7605
  }
7639
- return chunkC25NWWIH_cjs.isIsometricObject(object) ? sfl : duplicateShape(sfl, { object, links: state.links, side: direction, options });
7606
+ return chunkUHKFJBY5_cjs.isIsometricObject(object) ? sfl : duplicateShape(sfl, { object, links: state.links, side: direction, options });
7640
7607
  }
7641
7608
 
7642
7609
  // src/runtime/interaction/sflPatch/changes/resizeChange.ts
7643
7610
  function applyResizeChange(sfl, event) {
7644
- const state = chunkC25NWWIH_cjs.sflToCanvasState(sfl);
7611
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7645
7612
  const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7646
7613
  const parent = canvasObject?.parentFrameId ? state.canvasObjects.find((candidate) => candidate.id === canvasObject.parentFrameId) : void 0;
7647
7614
  const originX = parent?.x ?? 0;