stickyflow 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/dist/binding/index.cjs +9 -9
  3. package/dist/binding/index.d.cts +4 -4
  4. package/dist/binding/index.d.ts +4 -4
  5. package/dist/binding/index.js +3 -3
  6. package/dist/{chunk-TECWZVIM.cjs → chunk-4KBU4CFU.cjs} +23 -23
  7. package/dist/{chunk-TECWZVIM.cjs.map → chunk-4KBU4CFU.cjs.map} +1 -1
  8. package/dist/{chunk-EGUPN56K.js → chunk-BFQWCOEC.js} +3 -3
  9. package/dist/{chunk-EGUPN56K.js.map → chunk-BFQWCOEC.js.map} +1 -1
  10. package/dist/{chunk-VPNOVRWP.js → chunk-DGAVCN4D.js} +262 -15
  11. package/dist/chunk-DGAVCN4D.js.map +1 -0
  12. package/dist/{chunk-5PJ55GPG.cjs → chunk-EHH6ZDK6.cjs} +1076 -713
  13. package/dist/chunk-EHH6ZDK6.cjs.map +1 -0
  14. package/dist/{chunk-HRU6VOEC.js → chunk-G6IW2IX3.js} +44 -7
  15. package/dist/chunk-G6IW2IX3.js.map +1 -0
  16. package/dist/{chunk-SDOHUNBW.js → chunk-TQIYK5OA.js} +435 -72
  17. package/dist/chunk-TQIYK5OA.js.map +1 -0
  18. package/dist/{chunk-L7CEX5JV.js → chunk-UD6IG2PG.js} +4 -4
  19. package/dist/{chunk-L7CEX5JV.js.map → chunk-UD6IG2PG.js.map} +1 -1
  20. package/dist/{chunk-LSEMXRB5.cjs → chunk-UHKFJBY5.cjs} +44 -7
  21. package/dist/chunk-UHKFJBY5.cjs.map +1 -0
  22. package/dist/{chunk-KRSX4UZ7.cjs → chunk-VYQ6N5SI.cjs} +293 -46
  23. package/dist/chunk-VYQ6N5SI.cjs.map +1 -0
  24. package/dist/{chunk-SCD3AHMY.cjs → chunk-WZA3DJJH.cjs} +15 -15
  25. package/dist/{chunk-SCD3AHMY.cjs.map → chunk-WZA3DJJH.cjs.map} +1 -1
  26. package/dist/index.cjs +36 -36
  27. package/dist/index.d.cts +5 -5
  28. package/dist/index.d.ts +5 -5
  29. package/dist/index.js +5 -5
  30. package/dist/interaction/index.cjs +308 -256
  31. package/dist/interaction/index.cjs.map +1 -1
  32. package/dist/interaction/index.d.cts +5 -4
  33. package/dist/interaction/index.d.ts +5 -4
  34. package/dist/interaction/index.js +74 -23
  35. package/dist/interaction/index.js.map +1 -1
  36. package/dist/{render-DU4lYbRl.d.cts → render-BDO4S5uF.d.cts} +16 -0
  37. package/dist/{render-DU4lYbRl.d.ts → render-BDO4S5uF.d.ts} +16 -0
  38. package/dist/{runtime-Bkv7QW7H.d.cts → runtime-C-C5v9po.d.cts} +2 -2
  39. package/dist/{runtime-DJ4K4_HZ.d.ts → runtime-lCAfU-1Q.d.ts} +2 -2
  40. package/dist/{runtimeTypes-C1shzoyr.d.ts → runtimeTypes-B7p6b1Bi.d.cts} +2 -2
  41. package/dist/{runtimeTypes-BvJBZLkr.d.cts → runtimeTypes-BDA_CfWh.d.ts} +2 -2
  42. package/dist/stickyflow-diagram.global.js +197 -44
  43. package/dist/stickyflow-diagram.global.js.map +1 -1
  44. package/dist/{types-B5jrEEcF.d.cts → types-CZJzycKw.d.cts} +1 -1
  45. package/dist/{types-B7IkZ0w4.d.ts → types-Dp8JVZLB.d.ts} +1 -1
  46. package/dist/viewer/index.cjs +9 -9
  47. package/dist/viewer/index.d.cts +4 -4
  48. package/dist/viewer/index.d.ts +4 -4
  49. package/dist/viewer/index.js +4 -4
  50. package/dist/web-component/index.cjs +6 -6
  51. package/dist/web-component/index.d.cts +2 -2
  52. package/dist/web-component/index.d.ts +2 -2
  53. package/dist/web-component/index.js +4 -4
  54. package/package.json +1 -1
  55. package/dist/chunk-5PJ55GPG.cjs.map +0 -1
  56. package/dist/chunk-HRU6VOEC.js.map +0 -1
  57. package/dist/chunk-KRSX4UZ7.cjs.map +0 -1
  58. package/dist/chunk-LSEMXRB5.cjs.map +0 -1
  59. package/dist/chunk-SDOHUNBW.js.map +0 -1
  60. package/dist/chunk-VPNOVRWP.js.map +0 -1
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunkSCD3AHMY_cjs = require('../chunk-SCD3AHMY.cjs');
4
- var chunkLSEMXRB5_cjs = require('../chunk-LSEMXRB5.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", chunkLSEMXRB5_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 = `${chunkLSEMXRB5_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, chunkLSEMXRB5_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, chunkLSEMXRB5_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 = chunkLSEMXRB5_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", chunkLSEMXRB5_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 = chunkLSEMXRB5_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 = chunkLSEMXRB5_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 + chunkLSEMXRB5_cjs.BAR_LABEL.gap + size.width / 2 : label.placement === "inside" ? end - chunkLSEMXRB5_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", chunkLSEMXRB5_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 = chunkLSEMXRB5_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(chunkSCD3AHMY_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(chunkSCD3AHMY_cjs.findOwnerNode(svg, target.owner.id, chunkSCD3AHMY_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 && !chunkSCD3AHMY_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 = chunkSCD3AHMY_cjs.resolveOwner(mark);
302
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(mark);
303
303
  if (owner?.role !== "chart") {
304
304
  return null;
305
305
  }
@@ -458,8 +458,8 @@ function bindChartValueDrag(viewer, emitter) {
458
458
 
459
459
  // src/runtime/interaction/colorEdit/color.ts
460
460
  function normalizeHex(value) {
461
- const channels = chunkLSEMXRB5_cjs.parseHexRgb(value);
462
- return channels && chunkLSEMXRB5_cjs.rgbToHex(...channels);
461
+ const channels = chunkUHKFJBY5_cjs.parseHexRgb(value);
462
+ return channels && chunkUHKFJBY5_cjs.rgbToHex(...channels);
463
463
  }
464
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;
465
465
  var HEX_WITH_ALPHA = /^#([0-9a-f]{6})([0-9a-f]{2})$/i;
@@ -498,14 +498,14 @@ function clampChannel(value) {
498
498
  return Math.max(0, Math.min(255, Math.round(value)));
499
499
  }
500
500
  function hexToRgb(hex) {
501
- const [r, g, b] = chunkLSEMXRB5_cjs.parseHexRgb(hex) ?? [0, 0, 0];
501
+ const [r, g, b] = chunkUHKFJBY5_cjs.parseHexRgb(hex) ?? [0, 0, 0];
502
502
  return { r, g, b };
503
503
  }
504
504
  function rgbToHex2(rgb) {
505
- return chunkLSEMXRB5_cjs.rgbToHex(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
505
+ return chunkUHKFJBY5_cjs.rgbToHex(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
506
506
  }
507
507
  function hsvToRgb2(hsv) {
508
- const { r, g, b } = chunkLSEMXRB5_cjs.hsvToRgb(
508
+ const { r, g, b } = chunkUHKFJBY5_cjs.hsvToRgb(
509
509
  (hsv.h % 360 + 360) % 360,
510
510
  Math.max(0, Math.min(1, hsv.s)),
511
511
  Math.max(0, Math.min(1, hsv.v))
@@ -513,7 +513,7 @@ function hsvToRgb2(hsv) {
513
513
  return { r, g, b };
514
514
  }
515
515
  function rgbToHsv2(rgb) {
516
- return chunkLSEMXRB5_cjs.rgbToHsv(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
516
+ return chunkUHKFJBY5_cjs.rgbToHsv(clampChannel(rgb.r), clampChannel(rgb.g), clampChannel(rgb.b));
517
517
  }
518
518
  function hexToHsv(hex) {
519
519
  return rgbToHsv2(hexToRgb(hex));
@@ -836,6 +836,14 @@ function trackDrag(node, onMove, onEnd) {
836
836
  var CHANNELS = ["r", "g", "b"];
837
837
  var GAP_BELOW_ANCHOR = 6;
838
838
  var VIEWPORT_MARGIN = 8;
839
+ function buildEyedropper(parent) {
840
+ const button = el("button", "sf-cp-eyedropper", parent);
841
+ button.type = "button";
842
+ button.title = "Pick a color from the screen";
843
+ button.setAttribute("aria-label", "Pick a color from the screen");
844
+ button.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M2 22l1-1h3l9-9"/><path d="M3 21v-3l9-9"/><path d="M15 6l3.4-3.4a2.1 2.1 0 1 1 3 3L18 9l.4.4a2.1 2.1 0 1 1-3 3l-3.8-3.8a2.1 2.1 0 1 1 3-3l.4.4z"/></svg>';
845
+ return button;
846
+ }
839
847
  function buildSolidControls(root) {
840
848
  const area = el("div", "sf-cp-area", root);
841
849
  const matrix = el("div", "sf-cp-matrix", area);
@@ -859,6 +867,7 @@ function buildSolidControls(root) {
859
867
  const hexInput = el("input", "sf-cp-text", hexRow);
860
868
  hexInput.type = "text";
861
869
  hexInput.spellcheck = false;
870
+ const eyedropper = "EyeDropper" in window ? buildEyedropper(hexRow) : void 0;
862
871
  return {
863
872
  matrix,
864
873
  matrixCursor,
@@ -869,7 +878,8 @@ function buildSolidControls(root) {
869
878
  alphaRow,
870
879
  alphaRange,
871
880
  alphaNumber,
872
- hexInput
881
+ hexInput,
882
+ eyedropper
873
883
  };
874
884
  }
875
885
  function buildGradientControls(root, lockStops) {
@@ -1006,6 +1016,20 @@ function bindAngle(picker) {
1006
1016
  angleNumber.addEventListener("input", (event) => applyAngle(picker, read(event)));
1007
1017
  angleNumber.addEventListener("change", () => commit(picker));
1008
1018
  }
1019
+ function bindEyedropper(picker) {
1020
+ const { eyedropper } = picker.view;
1021
+ eyedropper?.addEventListener("click", async () => {
1022
+ const Dropper = window.EyeDropper;
1023
+ try {
1024
+ const hex = normalizeHex((await new Dropper().open()).sRGBHex);
1025
+ if (hex) {
1026
+ applyHex(picker, hex);
1027
+ commit(picker);
1028
+ }
1029
+ } catch {
1030
+ }
1031
+ });
1032
+ }
1009
1033
  function bindPickerEvents(picker) {
1010
1034
  const { view } = picker;
1011
1035
  const disposers = bindAreas(picker);
@@ -1017,6 +1041,7 @@ function bindPickerEvents(picker) {
1017
1041
  }
1018
1042
  bindAlpha(picker);
1019
1043
  bindHex(picker);
1044
+ bindEyedropper(picker);
1020
1045
  bindAngle(picker);
1021
1046
  return disposers;
1022
1047
  }
@@ -1314,6 +1339,25 @@ var FIELDS_CSS = `
1314
1339
  }
1315
1340
 
1316
1341
  .sf-cp-number,
1342
+ .sf-cp-eyedropper {
1343
+ flex: none;
1344
+ display: grid;
1345
+ place-items: center;
1346
+ width: 24px;
1347
+ height: 24px;
1348
+ margin-left: auto;
1349
+ padding: 0;
1350
+ border: 1px solid var(--sf-cp-field-border);
1351
+ border-radius: 6px;
1352
+ background: var(--sf-cp-field-bg);
1353
+ color: var(--sf-cp-fg);
1354
+ cursor: pointer;
1355
+ }
1356
+
1357
+ .sf-cp-eyedropper:hover {
1358
+ background: var(--sf-cp-hover);
1359
+ }
1360
+
1317
1361
  .sf-cp-text {
1318
1362
  flex: none;
1319
1363
  width: 52px;
@@ -1709,7 +1753,7 @@ var ColorEditSession = class {
1709
1753
  const hasOverride = target.node.getAttribute("data-sf-color-override") === "true";
1710
1754
  this.#open = openColorPopover({
1711
1755
  seed: seedFrom(fill, readGradientValue(this.#svg, fill)),
1712
- anchor: chunkSCD3AHMY_cjs.screenRectOf(target.node),
1756
+ anchor: chunkWZA3DJJH_cjs.screenRectOf(target.node),
1713
1757
  theme: resolveTheme(this.#theme),
1714
1758
  allowGradient: !target.solidOnly,
1715
1759
  onCommit: (color) => {
@@ -1791,7 +1835,7 @@ function resolveTarget(event, selector, pathOf, rules) {
1791
1835
  return null;
1792
1836
  }
1793
1837
  const path = pathOf(node);
1794
- const owner = chunkSCD3AHMY_cjs.resolveOwner(node);
1838
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
1795
1839
  if (!path || !owner || !isEditablePath(path, rules) || requiresPriorSelection(node, owner)) {
1796
1840
  return null;
1797
1841
  }
@@ -1813,7 +1857,7 @@ function resolveZoneGradientTarget(event) {
1813
1857
  if (!node) {
1814
1858
  return null;
1815
1859
  }
1816
- const owner = chunkSCD3AHMY_cjs.resolveOwner(node);
1860
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
1817
1861
  if (!owner) {
1818
1862
  return null;
1819
1863
  }
@@ -1849,7 +1893,7 @@ var ZoneGradientSession = class {
1849
1893
  const beforeStops = sortStops(gradient.stops);
1850
1894
  this.#open = openColorPopover({
1851
1895
  seed: seedFrom(fill, gradient),
1852
- anchor: chunkSCD3AHMY_cjs.screenRectOf(target.node),
1896
+ anchor: chunkWZA3DJJH_cjs.screenRectOf(target.node),
1853
1897
  theme: resolveTheme(this.#theme),
1854
1898
  allowGradient: true,
1855
1899
  lockStops: true,
@@ -1922,15 +1966,15 @@ function bindDeleteSelection(viewer, emitter) {
1922
1966
  }
1923
1967
 
1924
1968
  // src/runtime/interaction/events.ts
1925
- var Emitter2 = class extends chunkSCD3AHMY_cjs.Emitter {
1969
+ var Emitter2 = class extends chunkWZA3DJJH_cjs.Emitter {
1926
1970
  };
1927
1971
 
1928
1972
  // src/runtime/interaction/linkPreview/geometry.ts
1929
1973
  function anchorPoint(bounds, side, other) {
1930
1974
  if (side) {
1931
- return chunkLSEMXRB5_cjs.pointAtPort(bounds, { side, offset: 0.5 });
1975
+ return chunkUHKFJBY5_cjs.pointAtPort(bounds, { side, offset: 0.5 });
1932
1976
  }
1933
- return chunkLSEMXRB5_cjs.edgePointToward(bounds, other);
1977
+ return chunkUHKFJBY5_cjs.edgePointToward(bounds, other);
1934
1978
  }
1935
1979
  function polylinePathData(points) {
1936
1980
  if (points.length < 4) {
@@ -1947,7 +1991,7 @@ function previewPathData(points, segments, pathType, strokeWidth) {
1947
1991
  return `M ${points[0]} ${points[1]} C ${points[2]} ${points[3]} ${points[4]} ${points[5]} ${points[6]} ${points[7]}`;
1948
1992
  }
1949
1993
  if (pathType === "orthogonal" && segments.length > 0) {
1950
- return chunkLSEMXRB5_cjs.roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));
1994
+ return chunkUHKFJBY5_cjs.roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));
1951
1995
  }
1952
1996
  return polylinePathData(points);
1953
1997
  }
@@ -1967,8 +2011,8 @@ function previewLink(fromSide, toSide) {
1967
2011
  function routePreviewLink(fromBounds, toBounds, fromSide, toSide, pathType) {
1968
2012
  const from = anchorPoint(fromBounds, fromSide, toBounds);
1969
2013
  const to = anchorPoint(toBounds, toSide, fromBounds);
1970
- const { points, segments } = chunkLSEMXRB5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);
1971
- return { points, segments, midpoint: chunkLSEMXRB5_cjs.getLineMidpoint(points, pathType, from, to) };
2014
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);
2015
+ return { points, segments, midpoint: chunkUHKFJBY5_cjs.getLineMidpoint(points, pathType, from, to) };
1972
2016
  }
1973
2017
 
1974
2018
  // src/runtime/interaction/linkPreview/discovery.ts
@@ -2000,7 +2044,7 @@ function resolveOppositeEndpoint(svg, path, canvasObjectId) {
2000
2044
  if (!otherId) {
2001
2045
  return null;
2002
2046
  }
2003
- const otherPrimary = chunkSCD3AHMY_cjs.findOwnerNode(svg, otherId, chunkSCD3AHMY_cjs.isPrimary);
2047
+ const otherPrimary = chunkWZA3DJJH_cjs.findOwnerNode(svg, otherId, chunkWZA3DJJH_cjs.isPrimary);
2004
2048
  return otherPrimary ? { draggedIsFrom, bounds: otherPrimary.getBBox() } : null;
2005
2049
  }
2006
2050
  function captureLiveLinkLabel(svg, draft, draggedBounds) {
@@ -2047,8 +2091,8 @@ function resolveOtherFacePoint(svg, path, canvasObjectId) {
2047
2091
  if (!otherId || !face || !otherFace) {
2048
2092
  return null;
2049
2093
  }
2050
- const otherPrimary = chunkSCD3AHMY_cjs.findOwnerNode(svg, otherId, chunkSCD3AHMY_cjs.isPrimary);
2051
- const otherGeometry = otherPrimary && chunkSCD3AHMY_cjs.isometricGeometryOf(otherPrimary);
2094
+ const otherPrimary = chunkWZA3DJJH_cjs.findOwnerNode(svg, otherId, chunkWZA3DJJH_cjs.isPrimary);
2095
+ const otherGeometry = otherPrimary && chunkWZA3DJJH_cjs.isometricGeometryOf(otherPrimary);
2052
2096
  if (!otherGeometry?.bounds) {
2053
2097
  return null;
2054
2098
  }
@@ -2059,7 +2103,7 @@ function resolveOtherFacePoint(svg, path, canvasObjectId) {
2059
2103
  height: otherGeometry.height,
2060
2104
  depth: otherGeometry.depth
2061
2105
  };
2062
- return { otherPoint: chunkLSEMXRB5_cjs.isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };
2106
+ return { otherPoint: chunkUHKFJBY5_cjs.isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };
2063
2107
  }
2064
2108
  function findLiveFaceLinks(svg, canvasObjectId) {
2065
2109
  const escapedId = CSS.escape(canvasObjectId);
@@ -2078,7 +2122,7 @@ function findLiveFaceLinks(svg, canvasObjectId) {
2078
2122
 
2079
2123
  // src/runtime/interaction/linkPreview/faceUpdate.ts
2080
2124
  function updateLiveFaceLink(link, liveObject) {
2081
- const draggedPoint = chunkLSEMXRB5_cjs.isometricFaceCenter(liveObject, link.face);
2125
+ const draggedPoint = chunkUHKFJBY5_cjs.isometricFaceCenter(liveObject, link.face);
2082
2126
  const from = link.draggedIsFrom ? draggedPoint : link.otherPoint;
2083
2127
  const to = link.draggedIsFrom ? link.otherPoint : draggedPoint;
2084
2128
  link.path.setAttribute("d", `M ${from.x} ${from.y} L ${to.x} ${to.y}`);
@@ -2102,7 +2146,7 @@ function updateLabelGap(link, points) {
2102
2146
  if (!link.labelGapSize) {
2103
2147
  return;
2104
2148
  }
2105
- const gap = chunkLSEMXRB5_cjs.labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);
2149
+ const gap = chunkUHKFJBY5_cjs.labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);
2106
2150
  if (gap) {
2107
2151
  link.path.setAttribute("stroke-dasharray", `${gap.dashBefore} ${gap.gapLength} 1000000`);
2108
2152
  } else {
@@ -2148,11 +2192,11 @@ function readIsometricSnapStep(svg) {
2148
2192
  return step > 0 ? step : null;
2149
2193
  }
2150
2194
  function nearestIsometricLatticePoint(point, step) {
2151
- const u = point.x / (chunkLSEMXRB5_cjs.AXIS_COS * step);
2152
- const v = point.y / (chunkLSEMXRB5_cjs.AXIS_SIN * step);
2195
+ const u = point.x / (chunkUHKFJBY5_cjs.AXIS_COS * step);
2196
+ const v = point.y / (chunkUHKFJBY5_cjs.AXIS_SIN * step);
2153
2197
  const i = Math.round((u + v) / 2);
2154
2198
  const j = Math.round((u - v) / 2);
2155
- return { x: (i + j) * chunkLSEMXRB5_cjs.AXIS_COS * step, y: (i - j) * chunkLSEMXRB5_cjs.AXIS_SIN * step };
2199
+ return { x: (i + j) * chunkUHKFJBY5_cjs.AXIS_COS * step, y: (i - j) * chunkUHKFJBY5_cjs.AXIS_SIN * step };
2156
2200
  }
2157
2201
  function snapToStep(value, step, min) {
2158
2202
  return Math.max(min, Math.round(value / step) * step);
@@ -2165,21 +2209,21 @@ var LABEL_FONT_SIZE = 12;
2165
2209
  var LABEL_LINE_HEIGHT = 1.2;
2166
2210
  var LABEL_BASELINE_OFFSET = -LABEL_GAP - LABEL_HEIGHT + (LABEL_HEIGHT - LABEL_FONT_SIZE * LABEL_LINE_HEIGHT) / 2 + LABEL_FONT_SIZE;
2167
2211
  function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2168
- const faces = chunkLSEMXRB5_cjs.isometricFaces(object);
2169
- nodes.top?.setAttribute("d", chunkLSEMXRB5_cjs.roundedPolygonPath(faces.top, 0));
2170
- nodes.front?.setAttribute("d", chunkLSEMXRB5_cjs.roundedPolygonPath(faces.front, 0));
2171
- nodes.side?.setAttribute("d", chunkLSEMXRB5_cjs.roundedPolygonPath(faces.right, 0));
2212
+ const faces = chunkUHKFJBY5_cjs.isometricFaces(object);
2213
+ nodes.top?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.top, 0));
2214
+ nodes.front?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.front, 0));
2215
+ nodes.side?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.right, 0));
2172
2216
  const silhouette = [faces.top[0], faces.top[1], faces.right[2], faces.front[2], faces.front[3], faces.top[3]];
2173
- const hullPath = chunkLSEMXRB5_cjs.roundedPolygonPath(silhouette, cornerRadius);
2217
+ const hullPath = chunkUHKFJBY5_cjs.roundedPolygonPath(silhouette, cornerRadius);
2174
2218
  nodes.hull?.setAttribute("d", hullPath);
2175
2219
  if (overlay.halo) {
2176
- chunkSCD3AHMY_cjs.updateHalo(overlay.halo, hullPath);
2220
+ chunkWZA3DJJH_cjs.updateHalo(overlay.halo, hullPath);
2177
2221
  }
2178
- const placements = chunkSCD3AHMY_cjs.axisArrowPlacements(object);
2222
+ const placements = chunkWZA3DJJH_cjs.axisArrowPlacements(object);
2179
2223
  Object.keys(placements).forEach((axis) => {
2180
2224
  const group = overlay.arrows[axis];
2181
2225
  if (group) {
2182
- chunkSCD3AHMY_cjs.updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);
2226
+ chunkWZA3DJJH_cjs.updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);
2183
2227
  }
2184
2228
  });
2185
2229
  nodes.seams?.setAttribute(
@@ -2197,9 +2241,9 @@ function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2197
2241
  x: footprintCenter.x + (point.x - footprintCenter.x) * shadowSpread,
2198
2242
  y: footprintCenter.y + (point.y - footprintCenter.y) * shadowSpread
2199
2243
  }));
2200
- nodes.groundShadow.setAttribute("d", chunkLSEMXRB5_cjs.roundedPolygonPath(footprint, 0));
2244
+ nodes.groundShadow.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(footprint, 0));
2201
2245
  }
2202
- const anchor = chunkLSEMXRB5_cjs.isometricTopFaceCenter(object);
2246
+ const anchor = chunkUHKFJBY5_cjs.isometricTopFaceCenter(object);
2203
2247
  if (nodes.labelGuide) {
2204
2248
  nodes.labelGuide.setAttribute("d", `M ${anchor.x} ${anchor.y - LABEL_GAP} L ${anchor.x} ${anchor.y}`);
2205
2249
  }
@@ -2215,7 +2259,7 @@ function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2215
2259
  // src/runtime/interaction/isometricAxisResize/state.ts
2216
2260
  var AXES = ["width", "height", "depth"];
2217
2261
  function collectNodes(svg, ownerId) {
2218
- const all = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, ownerId);
2262
+ const all = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, ownerId);
2219
2263
  const bySuffix = (suffix) => all.find((el2) => el2.id.endsWith(suffix)) ?? null;
2220
2264
  return {
2221
2265
  top: bySuffix("-top"),
@@ -2243,14 +2287,14 @@ function findResizeHandle(event) {
2243
2287
  return { captureTarget, axis: handleAttr.slice(4), overlay, ownerId };
2244
2288
  }
2245
2289
  function overlayPartsOf(overlay) {
2246
- const overlayHalo = overlay.querySelector(`[${chunkSCD3AHMY_cjs.ISO_HALO_ATTR}]`) ?? null;
2290
+ const overlayHalo = overlay.querySelector(`[${chunkWZA3DJJH_cjs.ISO_HALO_ATTR}]`) ?? null;
2247
2291
  const overlayArrows = Object.fromEntries(
2248
2292
  AXES.map((axis) => [
2249
2293
  axis,
2250
2294
  overlay.querySelector(`[data-sf-resize-handle="iso-${axis}"]`) ?? null
2251
2295
  ])
2252
2296
  );
2253
- const overlayDuplicateBubbles = overlay.querySelector(`[${chunkSCD3AHMY_cjs.ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
2297
+ const overlayDuplicateBubbles = overlay.querySelector(`[${chunkWZA3DJJH_cjs.ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
2254
2298
  if (overlayDuplicateBubbles) {
2255
2299
  overlayDuplicateBubbles.style.display = "none";
2256
2300
  }
@@ -2262,16 +2306,16 @@ function createIsometricAxisDragState(svg, event) {
2262
2306
  return null;
2263
2307
  }
2264
2308
  const { captureTarget, axis, overlay, ownerId } = handle;
2265
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, ownerId, chunkSCD3AHMY_cjs.isPrimary);
2266
- const owner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
2309
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
2310
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
2267
2311
  if (!primary || owner?.role !== "isometric") {
2268
2312
  return null;
2269
2313
  }
2270
- const startUser = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
2314
+ const startUser = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
2271
2315
  if (!startUser) {
2272
2316
  return null;
2273
2317
  }
2274
- const geometry = chunkSCD3AHMY_cjs.isometricGeometryOf(primary);
2318
+ const geometry = chunkWZA3DJJH_cjs.isometricGeometryOf(primary);
2275
2319
  const bounds = geometry?.bounds ?? primary.getBBox();
2276
2320
  const nodes = collectNodes(svg, ownerId);
2277
2321
  [nodes.top, nodes.front, nodes.side].forEach((node) => {
@@ -2291,7 +2335,7 @@ function createIsometricAxisDragState(svg, event) {
2291
2335
  pointerId: event.pointerId,
2292
2336
  startUser,
2293
2337
  start,
2294
- cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(chunkLSEMXRB5_cjs.CORNER_RADIUS_ATTR)) ?? 0,
2338
+ cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR)) ?? 0,
2295
2339
  nodes,
2296
2340
  ...overlayPartsOf(overlay),
2297
2341
  liveFaceLinks: findLiveFaceLinks(svg, ownerId),
@@ -2308,15 +2352,15 @@ function nextGeometry(drag, point, step) {
2308
2352
  const dx = point.x - drag.startUser.x;
2309
2353
  const dy = point.y - drag.startUser.y;
2310
2354
  if (axis === "width") {
2311
- const delta2 = dx * chunkLSEMXRB5_cjs.AXIS_COS + dy * chunkLSEMXRB5_cjs.AXIS_SIN;
2355
+ const delta2 = dx * chunkUHKFJBY5_cjs.AXIS_COS + dy * chunkUHKFJBY5_cjs.AXIS_SIN;
2312
2356
  return { ...start, width: length(start.width + delta2, MIN_SIZE) };
2313
2357
  }
2314
2358
  if (axis === "height") {
2315
2359
  return { ...start, height: length(start.height + dy, MIN_SIZE) };
2316
2360
  }
2317
- const delta = -dx * chunkLSEMXRB5_cjs.AXIS_COS + dy * chunkLSEMXRB5_cjs.AXIS_SIN;
2361
+ const delta = -dx * chunkUHKFJBY5_cjs.AXIS_COS + dy * chunkUHKFJBY5_cjs.AXIS_SIN;
2318
2362
  const depth = length(start.depth + delta, 0);
2319
- const x = start.x + (start.depth - depth) * chunkLSEMXRB5_cjs.AXIS_COS;
2363
+ const x = start.x + (start.depth - depth) * chunkUHKFJBY5_cjs.AXIS_COS;
2320
2364
  return { ...start, x, depth };
2321
2365
  }
2322
2366
  var IsometricAxisResizeSession = class {
@@ -2328,7 +2372,7 @@ var IsometricAxisResizeSession = class {
2328
2372
  this.#emitter = emitter;
2329
2373
  }
2330
2374
  pointerDown = (event) => {
2331
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
2375
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2332
2376
  return;
2333
2377
  }
2334
2378
  this.#drag = createIsometricAxisDragState(this.#svg, event);
@@ -2338,7 +2382,7 @@ var IsometricAxisResizeSession = class {
2338
2382
  if (!drag || event.pointerId !== drag.pointerId) {
2339
2383
  return;
2340
2384
  }
2341
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
2385
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
2342
2386
  if (!point) {
2343
2387
  return;
2344
2388
  }
@@ -2436,7 +2480,7 @@ function findLabelMark(event) {
2436
2480
  );
2437
2481
  }
2438
2482
  function isLabelPointer(event) {
2439
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
2483
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
2440
2484
  }
2441
2485
  function findHull(svg, ownerId) {
2442
2486
  return svg.querySelector(`[data-sf-id="${CSS.escape(ownerId)}"][data-sf-primary="true"]`);
@@ -2452,21 +2496,21 @@ function resolveIsometricLabelDrag(svg, event) {
2452
2496
  if (!clicked) {
2453
2497
  return null;
2454
2498
  }
2455
- const owner = chunkSCD3AHMY_cjs.resolveOwner(clicked);
2499
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(clicked);
2456
2500
  if (owner?.role !== "isometric") {
2457
2501
  return null;
2458
2502
  }
2459
2503
  const hull = findHull(svg, owner.id);
2460
- const geometry = hull ? chunkSCD3AHMY_cjs.isometricGeometryOf(hull) : null;
2504
+ const geometry = hull ? chunkWZA3DJJH_cjs.isometricGeometryOf(hull) : null;
2461
2505
  if (!geometry?.bounds) {
2462
2506
  return null;
2463
2507
  }
2464
- const start = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
2508
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
2465
2509
  if (!start) {
2466
2510
  return null;
2467
2511
  }
2468
2512
  const anchorX = geometry.bounds.x + geometry.bounds.width / 2;
2469
- const anchorY = geometry.bounds.y + geometry.bounds.width * (chunkLSEMXRB5_cjs.AXIS_SIN / chunkLSEMXRB5_cjs.AXIS_COS) / 2;
2513
+ const anchorY = geometry.bounds.y + geometry.bounds.width * (chunkUHKFJBY5_cjs.AXIS_SIN / chunkUHKFJBY5_cjs.AXIS_COS) / 2;
2470
2514
  const text = findBySuffix(svg, `-${owner.id}-label`);
2471
2515
  if (!text) {
2472
2516
  return null;
@@ -2518,7 +2562,7 @@ var IsometricLabelDragSession = class {
2518
2562
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
2519
2563
  return;
2520
2564
  }
2521
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
2565
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
2522
2566
  if (!point) {
2523
2567
  return;
2524
2568
  }
@@ -2593,7 +2637,7 @@ function isIsometricDirection(value) {
2593
2637
  function bindIsometricQuickDuplicate(viewer, emitter) {
2594
2638
  const svg = viewer.svg;
2595
2639
  const onPointerDown = (event) => {
2596
- if (event.button !== 0 || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
2640
+ if (event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2597
2641
  return;
2598
2642
  }
2599
2643
  const bubble = event.target?.closest("[data-sf-quick-duplicate]");
@@ -2604,7 +2648,7 @@ function bindIsometricQuickDuplicate(viewer, emitter) {
2604
2648
  const overlay = bubble.closest("[data-sf-selection-overlay]");
2605
2649
  const sourceId = overlay?.getAttribute("data-sf-selection-overlay");
2606
2650
  const primary = sourceId ? svg.querySelector(`[data-sf-id="${CSS.escape(sourceId)}"][data-sf-primary="true"]`) : null;
2607
- const owner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
2651
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
2608
2652
  if (!owner) {
2609
2653
  return;
2610
2654
  }
@@ -2659,7 +2703,7 @@ function updateEndpointPreview(drag, draggedPoint, draggedSide) {
2659
2703
  const toPoint = drag.end === "to" ? draggedPoint : drag.fixedPoint;
2660
2704
  const fromSide = drag.end === "from" ? draggedSide : drag.fixedSide;
2661
2705
  const toSide = drag.end === "to" ? draggedSide : drag.fixedSide;
2662
- const { points, segments } = chunkLSEMXRB5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);
2706
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);
2663
2707
  drag.path.setAttribute("d", previewPathData(points, segments, drag.pathType, drag.strokeWidth));
2664
2708
  }
2665
2709
 
@@ -2681,7 +2725,7 @@ var LinkGhost = class {
2681
2725
  constructor(svg, path) {
2682
2726
  this.#svg = svg;
2683
2727
  this.#path = path;
2684
- this.#anchors = svg.ownerDocument.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "g");
2728
+ this.#anchors = svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "g");
2685
2729
  this.#anchors.setAttribute("data-sf-link-target", "");
2686
2730
  this.#anchors.setAttribute("pointer-events", "none");
2687
2731
  }
@@ -2691,7 +2735,7 @@ var LinkGhost = class {
2691
2735
  for (const name of RESTORED_ATTRIBUTES) {
2692
2736
  this.#saved.set(name, this.#path.getAttribute(name));
2693
2737
  }
2694
- const dash = GHOST_DASH_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
2738
+ const dash = GHOST_DASH_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
2695
2739
  this.#path.setAttribute("stroke-dasharray", `${dash} ${dash}`);
2696
2740
  this.#path.setAttribute("stroke-linecap", "round");
2697
2741
  this.#path.setAttribute("opacity", GHOST_OPACITY);
@@ -2720,7 +2764,7 @@ var LinkGhost = class {
2720
2764
  if (!bounds) {
2721
2765
  return;
2722
2766
  }
2723
- const unit = 1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
2767
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
2724
2768
  const centers = [
2725
2769
  [bounds.x + bounds.width / 2, bounds.y],
2726
2770
  [bounds.x + bounds.width, bounds.y + bounds.height / 2],
@@ -2728,7 +2772,7 @@ var LinkGhost = class {
2728
2772
  [bounds.x, bounds.y + bounds.height / 2]
2729
2773
  ];
2730
2774
  for (const [cx, cy] of centers) {
2731
- const dot = this.#svg.ownerDocument.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "circle");
2775
+ const dot = this.#svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "circle");
2732
2776
  dot.setAttribute("cx", String(cx));
2733
2777
  dot.setAttribute("cy", String(cy));
2734
2778
  dot.setAttribute("r", String(ANCHOR_RADIUS_PX * unit));
@@ -2748,7 +2792,7 @@ function collectEndpointCandidates(svg) {
2748
2792
  if (element2.getAttribute("data-sf-role") === "link") {
2749
2793
  continue;
2750
2794
  }
2751
- const owner = chunkSCD3AHMY_cjs.resolveOwner(element2);
2795
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
2752
2796
  if (owner) {
2753
2797
  candidates.push({ owner, bounds: element2.getBBox() });
2754
2798
  }
@@ -2825,7 +2869,7 @@ function inferFixedSide(svg, reference, fixedPrimary) {
2825
2869
  if (reference.declaredSide) {
2826
2870
  return reference.declaredSide;
2827
2871
  }
2828
- const draggedPrimary = reference.draggedId ? chunkSCD3AHMY_cjs.findOwnerNode(svg, reference.draggedId, chunkSCD3AHMY_cjs.isPrimary) : null;
2872
+ const draggedPrimary = reference.draggedId ? chunkWZA3DJJH_cjs.findOwnerNode(svg, reference.draggedId, chunkWZA3DJJH_cjs.isPrimary) : null;
2829
2873
  if (!draggedPrimary) {
2830
2874
  return "right";
2831
2875
  }
@@ -2833,7 +2877,7 @@ function inferFixedSide(svg, reference, fixedPrimary) {
2833
2877
  }
2834
2878
  function resolveFixedEndpoint(svg, path, draggedEnd) {
2835
2879
  const reference = fixedEndpointReference(path, draggedEnd);
2836
- const fixedPrimary = reference.fixedId ? chunkSCD3AHMY_cjs.findOwnerNode(svg, reference.fixedId, chunkSCD3AHMY_cjs.isPrimary) : null;
2880
+ const fixedPrimary = reference.fixedId ? chunkWZA3DJJH_cjs.findOwnerNode(svg, reference.fixedId, chunkWZA3DJJH_cjs.isPrimary) : null;
2837
2881
  if (!fixedPrimary) {
2838
2882
  return null;
2839
2883
  }
@@ -2852,8 +2896,8 @@ function selectLinkEndpoint(svg, event) {
2852
2896
  if (!target || !end || !linkId) {
2853
2897
  return null;
2854
2898
  }
2855
- const path = chunkSCD3AHMY_cjs.findOwnerNode(svg, linkId, chunkSCD3AHMY_cjs.isPrimary);
2856
- const linkOwner = path && chunkSCD3AHMY_cjs.resolveOwner(path);
2899
+ const path = chunkWZA3DJJH_cjs.findOwnerNode(svg, linkId, chunkWZA3DJJH_cjs.isPrimary);
2900
+ const linkOwner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
2857
2901
  if (!path || !linkOwner) {
2858
2902
  return null;
2859
2903
  }
@@ -2895,8 +2939,8 @@ function nearestPort(bounds, point) {
2895
2939
  let nearest = { side: "right", offset: 0.5 };
2896
2940
  let nearestDistance = Infinity;
2897
2941
  for (const side of SIDES2) {
2898
- const offset = Math.max(0, Math.min(1, chunkLSEMXRB5_cjs.relativeOffsetOnRectangleSide(bounds, side, point)));
2899
- const candidate = chunkLSEMXRB5_cjs.pointAtPort(bounds, { side, offset });
2942
+ const offset = Math.max(0, Math.min(1, chunkUHKFJBY5_cjs.relativeOffsetOnRectangleSide(bounds, side, point)));
2943
+ const candidate = chunkUHKFJBY5_cjs.pointAtPort(bounds, { side, offset });
2900
2944
  const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);
2901
2945
  if (distance < nearestDistance) {
2902
2946
  nearestDistance = distance;
@@ -2955,7 +2999,7 @@ function resolveLinkTarget(candidates, fixedPoint, point, unitsPerPx) {
2955
2999
  }
2956
3000
  const port = snapPort(candidate.bounds, point, unitsPerPx);
2957
3001
  return {
2958
- point: chunkLSEMXRB5_cjs.pointAtPort(candidate.bounds, port),
3002
+ point: chunkUHKFJBY5_cjs.pointAtPort(candidate.bounds, port),
2959
3003
  side: port.side,
2960
3004
  hit: { owner: candidate.owner, side: port.side, offset: port.offset },
2961
3005
  bounds: candidate.bounds
@@ -2979,7 +3023,7 @@ var LinkEndpointSession = class {
2979
3023
  this.#emitter = emitter;
2980
3024
  }
2981
3025
  pointerDown = (event) => {
2982
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
3026
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2983
3027
  return;
2984
3028
  }
2985
3029
  this.#drag = createLinkEndpointDragState(this.#svg, event);
@@ -2993,7 +3037,7 @@ var LinkEndpointSession = class {
2993
3037
  return;
2994
3038
  }
2995
3039
  drag.moved = true;
2996
- const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg));
3040
+ const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg));
2997
3041
  updateEndpointPreview(drag, target.point, target.side);
2998
3042
  drag.ghost.show(target.hit !== null, target.bounds);
2999
3043
  };
@@ -3107,7 +3151,7 @@ var LinkSegmentSession = class {
3107
3151
  this.#emitter = emitter;
3108
3152
  }
3109
3153
  pointerDown = (event) => {
3110
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
3154
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3111
3155
  return;
3112
3156
  }
3113
3157
  const target = event.target;
@@ -3117,12 +3161,12 @@ var LinkSegmentSession = class {
3117
3161
  if (!handle || !overlay || !linkId) {
3118
3162
  return;
3119
3163
  }
3120
- const path = chunkSCD3AHMY_cjs.findOwnerNode(this.#svg, linkId, chunkSCD3AHMY_cjs.isPrimary);
3121
- const owner = path && chunkSCD3AHMY_cjs.resolveOwner(path);
3164
+ const path = chunkWZA3DJJH_cjs.findOwnerNode(this.#svg, linkId, chunkWZA3DJJH_cjs.isPrimary);
3165
+ const owner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
3122
3166
  const index = Number(handle.getAttribute("data-sf-link-segment"));
3123
3167
  const segments = path ? parseSegments(path) : [];
3124
3168
  const segment = segments[index];
3125
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
3169
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
3126
3170
  if (!path || !owner || !segment || !point) {
3127
3171
  return;
3128
3172
  }
@@ -3130,7 +3174,7 @@ var LinkSegmentSession = class {
3130
3174
  const guide = document.createElementNS(SVG_NAMESPACE2, "line");
3131
3175
  guide.setAttribute("stroke", GUIDE_COLOR);
3132
3176
  guide.setAttribute("stroke-dasharray", "4 4");
3133
- guide.setAttribute("stroke-width", String(1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg)));
3177
+ guide.setAttribute("stroke-width", String(1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg)));
3134
3178
  guide.setAttribute("visibility", "hidden");
3135
3179
  overlay.appendChild(guide);
3136
3180
  handle.setPointerCapture?.(event.pointerId);
@@ -3165,7 +3209,7 @@ var LinkSegmentSession = class {
3165
3209
  return;
3166
3210
  }
3167
3211
  drag.moved = true;
3168
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
3212
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
3169
3213
  if (!point) {
3170
3214
  return;
3171
3215
  }
@@ -3191,8 +3235,8 @@ var LinkSegmentSession = class {
3191
3235
  doubleClick = (event) => {
3192
3236
  const handle = event.target?.closest("[data-sf-link-segment]");
3193
3237
  const linkId = handle?.closest("[data-sf-selection-overlay]")?.getAttribute("data-sf-selection-overlay");
3194
- const path = linkId ? chunkSCD3AHMY_cjs.findOwnerNode(this.#svg, linkId, chunkSCD3AHMY_cjs.isPrimary) : null;
3195
- const owner = path && chunkSCD3AHMY_cjs.resolveOwner(path);
3238
+ const path = linkId ? chunkWZA3DJJH_cjs.findOwnerNode(this.#svg, linkId, chunkWZA3DJJH_cjs.isPrimary) : null;
3239
+ const owner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
3196
3240
  if (!handle || !owner) {
3197
3241
  return;
3198
3242
  }
@@ -3215,7 +3259,7 @@ var LinkSegmentSession = class {
3215
3259
  if (isSnapDisabled(this.#svg)) {
3216
3260
  return { value: raw, snapped: null };
3217
3261
  }
3218
- const threshold = SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
3262
+ const threshold = SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
3219
3263
  let best = null;
3220
3264
  for (const candidate of [drag.base, ...drag.candidates]) {
3221
3265
  const closer = best === null || Math.abs(candidate - raw) < Math.abs(best - raw);
@@ -3228,7 +3272,7 @@ var LinkSegmentSession = class {
3228
3272
  #preview(drag, snapped) {
3229
3273
  const next = movedSegments(drag, drag.value);
3230
3274
  const strokeWidth = Number(drag.path.getAttribute("stroke-width")) || 2;
3231
- const data = chunkLSEMXRB5_cjs.roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));
3275
+ const data = chunkUHKFJBY5_cjs.roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));
3232
3276
  drag.path.setAttribute("d", data);
3233
3277
  drag.overlay.querySelector("path")?.setAttribute("d", data);
3234
3278
  const segment = next[drag.index];
@@ -3402,8 +3446,8 @@ function nearestCandidates(bounds, candidates, limit = 50) {
3402
3446
 
3403
3447
  // src/runtime/interaction/snapping/isometricDiagonal.ts
3404
3448
  var AXES2 = [
3405
- { x: chunkLSEMXRB5_cjs.AXIS_COS, y: chunkLSEMXRB5_cjs.AXIS_SIN },
3406
- { x: -chunkLSEMXRB5_cjs.AXIS_COS, y: chunkLSEMXRB5_cjs.AXIS_SIN }
3449
+ { x: chunkUHKFJBY5_cjs.AXIS_COS, y: chunkUHKFJBY5_cjs.AXIS_SIN },
3450
+ { x: -chunkUHKFJBY5_cjs.AXIS_COS, y: chunkUHKFJBY5_cjs.AXIS_SIN }
3407
3451
  ];
3408
3452
  var GUIDE_OVERHANG = 40;
3409
3453
  function snapIsometricDiagonal(apex, rawDx, rawDy, candidates, threshold) {
@@ -3471,13 +3515,13 @@ function isometricApexOf(svg, drag, declared = false) {
3471
3515
  if (lead.owner.role !== "isometric") {
3472
3516
  return null;
3473
3517
  }
3474
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, lead.owner.id, chunkSCD3AHMY_cjs.isPrimary);
3475
- const geometry = primary && chunkSCD3AHMY_cjs.isometricGeometryOf(primary);
3518
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, lead.owner.id, chunkWZA3DJJH_cjs.isPrimary);
3519
+ const geometry = primary && chunkWZA3DJJH_cjs.isometricGeometryOf(primary);
3476
3520
  if (!geometry) {
3477
3521
  return null;
3478
3522
  }
3479
3523
  const frame = declared && geometry.bounds ? geometry.bounds : lead.draggedBounds;
3480
- return { x: frame.x + geometry.depth * chunkLSEMXRB5_cjs.AXIS_COS, y: frame.y };
3524
+ return { x: frame.x + geometry.depth * chunkUHKFJBY5_cjs.AXIS_COS, y: frame.y };
3481
3525
  }
3482
3526
  function snapIsometricGrid(svg, drag, rawDx, rawDy) {
3483
3527
  const step = readIsometricSnapStep(svg);
@@ -3494,8 +3538,8 @@ function snapIsometricMove(svg, drag, rawDx, rawDy) {
3494
3538
  return null;
3495
3539
  }
3496
3540
  const excludedIds = new Set(drag.canvasObjects.map((canvasObject) => canvasObject.owner.id));
3497
- const candidates = chunkSCD3AHMY_cjs.findIsometricApexCandidates(svg, excludedIds);
3498
- const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / chunkSCD3AHMY_cjs.pxPerUnit(svg));
3541
+ const candidates = chunkWZA3DJJH_cjs.findIsometricApexCandidates(svg, excludedIds);
3542
+ const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg));
3499
3543
  return snap ? { dx: snap.dx, dy: snap.dy, guides: [snap.guide] } : null;
3500
3544
  }
3501
3545
  function snapMove(svg, drag, rawDx, rawDy) {
@@ -3512,9 +3556,9 @@ function snapMove(svg, drag, rawDx, rawDy) {
3512
3556
  }
3513
3557
  const leadBounds = offsetBounds(drag.canvasObjects[0].draggedBounds, rawDx, rawDy);
3514
3558
  const excludedIds = new Set(drag.canvasObjects.map((canvasObject) => canvasObject.owner.id));
3515
- const candidates = nearestCandidates(leadBounds, chunkSCD3AHMY_cjs.findSnapCandidateBounds(svg, excludedIds));
3559
+ const candidates = nearestCandidates(leadBounds, chunkWZA3DJJH_cjs.findSnapCandidateBounds(svg, excludedIds));
3516
3560
  const snap = computeSnap(leadBounds, candidates, {
3517
- threshold: snapDistancePx(svg) / chunkSCD3AHMY_cjs.pxPerUnit(svg),
3561
+ threshold: snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg),
3518
3562
  activeX: MOVE_ACTIVE_POINTS,
3519
3563
  activeY: MOVE_ACTIVE_POINTS,
3520
3564
  guideOverhang: GUIDE_OVERHANG2
@@ -3575,7 +3619,7 @@ function isCompositeOwner(owner) {
3575
3619
  return owner !== null && owner !== void 0 && COMPOSITE_ROLES.has(owner.role);
3576
3620
  }
3577
3621
  function hasDerivedHeight(owner) {
3578
- return owner !== null && owner !== void 0 && chunkSCD3AHMY_cjs.DERIVED_HEIGHT_ROLES.has(owner.role);
3622
+ return owner !== null && owner !== void 0 && chunkWZA3DJJH_cjs.DERIVED_HEIGHT_ROLES.has(owner.role);
3579
3623
  }
3580
3624
 
3581
3625
  // src/runtime/interaction/move/canvasObjectCapture.ts
@@ -3596,7 +3640,7 @@ function parentContainerBounds(svg, primary, groupIds) {
3596
3640
  if (!parentId || groupIds.has(parentId)) {
3597
3641
  return void 0;
3598
3642
  }
3599
- const container = chunkSCD3AHMY_cjs.findOwnerNode(svg, parentId, chunkSCD3AHMY_cjs.isPrimary);
3643
+ const container = chunkWZA3DJJH_cjs.findOwnerNode(svg, parentId, chunkWZA3DJJH_cjs.isPrimary);
3600
3644
  if (!container) {
3601
3645
  return void 0;
3602
3646
  }
@@ -3604,14 +3648,14 @@ function parentContainerBounds(svg, primary, groupIds) {
3604
3648
  return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };
3605
3649
  }
3606
3650
  function captureCanvasObject(svg, owner, groupIds) {
3607
- const nodes = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, owner.id);
3608
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isPrimary);
3651
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, owner.id);
3652
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary);
3609
3653
  if (!nodes.length || !primary) {
3610
3654
  return null;
3611
3655
  }
3612
3656
  const overlays = [...svg.querySelectorAll(`[data-sf-selection-overlay="${CSS.escape(owner.id)}"]`)];
3613
3657
  const draggedBounds = primary.getBBox();
3614
- const isometricGeometry = owner.role === "isometric" ? chunkSCD3AHMY_cjs.isometricGeometryOf(primary) : null;
3658
+ const isometricGeometry = owner.role === "isometric" ? chunkWZA3DJJH_cjs.isometricGeometryOf(primary) : null;
3615
3659
  const isometricSize = isometricGeometry ? { width: isometricGeometry.width, height: isometricGeometry.height, depth: isometricGeometry.depth } : void 0;
3616
3660
  return {
3617
3661
  owner,
@@ -3653,7 +3697,7 @@ function captureInternalLinks(svg, groupIds) {
3653
3697
  if (!linkId || !belongsToMoveGroup(path, groupIds)) {
3654
3698
  continue;
3655
3699
  }
3656
- const nodes = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, linkId);
3700
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, linkId);
3657
3701
  if (nodes.length) {
3658
3702
  links.push({ nodes, baseTransforms: nodes.map((node) => node.getAttribute("transform")) });
3659
3703
  }
@@ -3687,7 +3731,7 @@ function containedChildren(viewer, owner) {
3687
3731
  return [];
3688
3732
  }
3689
3733
  const nodes = viewer.svg.querySelectorAll(`[data-sf-parent-frame="${CSS.escape(owner.id)}"]`);
3690
- return [...nodes].map((node) => chunkSCD3AHMY_cjs.resolveOwner(node)).filter((ref) => ref !== null);
3734
+ return [...nodes].map((node) => chunkWZA3DJJH_cjs.resolveOwner(node)).filter((ref) => ref !== null);
3691
3735
  }
3692
3736
  function selectedMoveGroup(viewer, owner) {
3693
3737
  const selection = viewer.getSelection();
@@ -3704,7 +3748,7 @@ function isChartInteractiveMark(target) {
3704
3748
  }
3705
3749
  function createMoveDragState(viewer, event, startUser) {
3706
3750
  const target = event.target;
3707
- const owner = chunkSCD3AHMY_cjs.resolveOwner(target);
3751
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(target);
3708
3752
  if (!hasMovableGeometry(owner) || isChartInteractiveMark(target)) {
3709
3753
  return null;
3710
3754
  }
@@ -3738,7 +3782,7 @@ var MoveSession = class {
3738
3782
  this.#emitter = emitter;
3739
3783
  }
3740
3784
  pointerDown = (event) => {
3741
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
3785
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3742
3786
  return;
3743
3787
  }
3744
3788
  this.#drag = createMoveDragState(this.#viewer, event, movePointerPosition(this.#svg, event));
@@ -3756,7 +3800,7 @@ var MoveSession = class {
3756
3800
  const delta = snapMove(this.#svg, drag, rawDelta.dx, rawDelta.dy);
3757
3801
  const clamped = clampMoveDelta(drag.canvasObjects, delta.dx, delta.dy);
3758
3802
  applyMovePreview(drag, clamped.dx, clamped.dy);
3759
- chunkSCD3AHMY_cjs.updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);
3803
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);
3760
3804
  };
3761
3805
  pointerUp = (event) => {
3762
3806
  const drag = this.#drag;
@@ -3765,7 +3809,7 @@ var MoveSession = class {
3765
3809
  }
3766
3810
  this.#drag = null;
3767
3811
  event.target.releasePointerCapture?.(drag.pointerId);
3768
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
3812
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
3769
3813
  emitMoveCompletion(this.#svg, this.#emitter, drag, event);
3770
3814
  };
3771
3815
  cancel() {
@@ -3911,9 +3955,9 @@ var START_POINT_RADIUS_PX = 6;
3911
3955
  var POINT_STROKE_WIDTH_PX = 1.5;
3912
3956
  function createPathDrawPreview(svg) {
3913
3957
  const document2 = svg.ownerDocument;
3914
- const group = document2.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "g");
3958
+ const group = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "g");
3915
3959
  group.setAttribute("pointer-events", "none");
3916
- const line = document2.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "path");
3960
+ const line = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "path");
3917
3961
  line.setAttribute("fill", "none");
3918
3962
  line.setAttribute("stroke", PREVIEW_COLOR);
3919
3963
  line.setAttribute("stroke-linecap", "round");
@@ -3923,8 +3967,8 @@ function createPathDrawPreview(svg) {
3923
3967
  }
3924
3968
  function pointMarker(svg, point, highlighted) {
3925
3969
  const document2 = svg.ownerDocument;
3926
- const unit = 1 / chunkSCD3AHMY_cjs.pxPerUnit(svg);
3927
- const circle = document2.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "circle");
3970
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(svg);
3971
+ const circle = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "circle");
3928
3972
  circle.setAttribute("cx", String(point.x));
3929
3973
  circle.setAttribute("cy", String(point.y));
3930
3974
  circle.setAttribute("r", String((highlighted ? START_POINT_RADIUS_PX : POINT_RADIUS_PX) * unit));
@@ -3938,11 +3982,11 @@ function updatePathDrawPreview(svg, state) {
3938
3982
  if (!previewLine || !previewGroup) {
3939
3983
  return;
3940
3984
  }
3941
- const unit = 1 / chunkSCD3AHMY_cjs.pxPerUnit(svg);
3985
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(svg);
3942
3986
  previewLine.setAttribute("stroke-width", String(LINE_WIDTH_PX * unit));
3943
3987
  previewLine.setAttribute("stroke-dasharray", `${DASH_PX * unit} ${GAP_PX * unit}`);
3944
3988
  const live = state.cursor ? [...state.points, state.cursor] : state.points;
3945
- previewLine.setAttribute("d", chunkLSEMXRB5_cjs.freeformPathData({ points: live, tension: state.tension, closed: false }));
3989
+ previewLine.setAttribute("d", chunkUHKFJBY5_cjs.freeformPathData({ points: live, tension: state.tension, closed: false }));
3946
3990
  while (previewGroup.childNodes.length > 1) {
3947
3991
  previewGroup.lastChild?.remove();
3948
3992
  }
@@ -4002,12 +4046,12 @@ var PathDrawSession = class {
4002
4046
  }
4003
4047
  }
4004
4048
  pointerDown = (event) => {
4005
- if (!this.#state.active || event.button !== 0 || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
4049
+ if (!this.#state.active || event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4006
4050
  return;
4007
4051
  }
4008
4052
  event.stopPropagation();
4009
4053
  event.preventDefault();
4010
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4054
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4011
4055
  if (!point) {
4012
4056
  return;
4013
4057
  }
@@ -4026,14 +4070,14 @@ var PathDrawSession = class {
4026
4070
  this.#state.cursor = resolved.point;
4027
4071
  this.#state.willClose = false;
4028
4072
  updatePathDrawPreview(this.#svg, this.#state);
4029
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4073
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4030
4074
  };
4031
4075
  pointerMove = (event) => {
4032
4076
  if (!this.#state.active) {
4033
4077
  return;
4034
4078
  }
4035
4079
  event.stopPropagation();
4036
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4080
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4037
4081
  if (!point) {
4038
4082
  return;
4039
4083
  }
@@ -4042,9 +4086,9 @@ var PathDrawSession = class {
4042
4086
  this.#state.willClose = resolved.willClose;
4043
4087
  updatePathDrawPreview(this.#svg, this.#state);
4044
4088
  if (resolved.guide) {
4045
- chunkSCD3AHMY_cjs.updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR2);
4089
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR2);
4046
4090
  } else {
4047
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4091
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4048
4092
  }
4049
4093
  };
4050
4094
  pointerUp = (event) => {
@@ -4079,10 +4123,10 @@ var PathDrawSession = class {
4079
4123
  } else if (event.key === "Backspace" && this.#state.points.length > 0) {
4080
4124
  event.preventDefault();
4081
4125
  this.#state.points = this.#state.points.slice(0, -1);
4082
- const closeSnapUnits = CLOSE_SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
4126
+ const closeSnapUnits = CLOSE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4083
4127
  this.#state.willClose = this.#state.cursor ? isCloseToStart(this.#state.points, this.#state.cursor, closeSnapUnits) : false;
4084
4128
  updatePathDrawPreview(this.#svg, this.#state);
4085
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4129
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4086
4130
  }
4087
4131
  };
4088
4132
  keyUp = (event) => {
@@ -4091,7 +4135,7 @@ var PathDrawSession = class {
4091
4135
  }
4092
4136
  };
4093
4137
  #resolvePoint(raw) {
4094
- const closeSnapUnits = CLOSE_SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
4138
+ const closeSnapUnits = CLOSE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4095
4139
  if (isCloseToStart(this.#state.points, raw, closeSnapUnits)) {
4096
4140
  return { point: this.#state.points[0], willClose: true, guide: null };
4097
4141
  }
@@ -4101,7 +4145,7 @@ var PathDrawSession = class {
4101
4145
  return { point: raw, willClose: false, guide: null };
4102
4146
  }
4103
4147
  const angleSnapped = snapTo45Degrees(last, raw);
4104
- const guideSnapUnits = GUIDE_SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
4148
+ const guideSnapUnits = GUIDE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4105
4149
  const { point, guide } = snapToSessionGuides(last, angleSnapped, points.slice(0, -1), raw, guideSnapUnits);
4106
4150
  return { point, willClose: false, guide };
4107
4151
  }
@@ -4115,7 +4159,7 @@ var PathDrawSession = class {
4115
4159
  }
4116
4160
  #reset(callExit) {
4117
4161
  this.#state.previewGroup?.remove();
4118
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4162
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4119
4163
  const exit = this.#state.onExit;
4120
4164
  this.#state = createIdlePathDrawState();
4121
4165
  this.#shiftHeld = false;
@@ -4158,7 +4202,7 @@ function applyPathReshapePreview(drag, point) {
4158
4202
  const points = drag.points.map(
4159
4203
  (existing, index) => index === drag.pointIndex ? [point.x, point.y] : existing
4160
4204
  );
4161
- const d = chunkLSEMXRB5_cjs.freeformPathData({
4205
+ const d = chunkUHKFJBY5_cjs.freeformPathData({
4162
4206
  points: points.map(([x, y]) => ({ x, y })),
4163
4207
  tension: drag.tension,
4164
4208
  closed: drag.closed
@@ -4166,22 +4210,22 @@ function applyPathReshapePreview(drag, point) {
4166
4210
  drag.pathNode.setAttribute("d", d);
4167
4211
  drag.handle.setAttribute("cx", String(point.x));
4168
4212
  drag.handle.setAttribute("cy", String(point.y));
4169
- drag.overlay?.querySelector(`[${chunkSCD3AHMY_cjs.PATH_HALO_ATTR}]`)?.setAttribute("d", d);
4213
+ drag.overlay?.querySelector(`[${chunkWZA3DJJH_cjs.PATH_HALO_ATTR}]`)?.setAttribute("d", d);
4170
4214
  return points;
4171
4215
  }
4172
4216
 
4173
4217
  // src/runtime/interaction/pathReshape/target.ts
4174
4218
  function resolvePathReshapeTarget(svg, event) {
4175
- const handle = event.target?.closest?.(`[${chunkLSEMXRB5_cjs.PATH_POINT_INDEX_ATTR}]`) ?? null;
4176
- const indexAttr = handle?.getAttribute(chunkLSEMXRB5_cjs.PATH_POINT_INDEX_ATTR) ?? null;
4219
+ const handle = event.target?.closest?.(`[${chunkUHKFJBY5_cjs.PATH_POINT_INDEX_ATTR}]`) ?? null;
4220
+ const indexAttr = handle?.getAttribute(chunkUHKFJBY5_cjs.PATH_POINT_INDEX_ATTR) ?? null;
4177
4221
  const pointIndex = indexAttr !== null ? Number(indexAttr) : Number.NaN;
4178
4222
  const ownerId = handle?.closest("[data-sf-selection-overlay]")?.getAttribute("data-sf-selection-overlay");
4179
4223
  if (!handle || !Number.isInteger(pointIndex) || !ownerId) {
4180
4224
  return null;
4181
4225
  }
4182
- const pathNode = chunkSCD3AHMY_cjs.findOwnerNode(svg, ownerId, chunkSCD3AHMY_cjs.isPrimary);
4183
- const owner = pathNode && chunkSCD3AHMY_cjs.resolveOwner(pathNode);
4184
- const geometry = pathNode && chunkSCD3AHMY_cjs.pathGeometryOf(pathNode);
4226
+ const pathNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
4227
+ const owner = pathNode && chunkWZA3DJJH_cjs.resolveOwner(pathNode);
4228
+ const geometry = pathNode && chunkWZA3DJJH_cjs.pathGeometryOf(pathNode);
4185
4229
  if (!pathNode || !owner || !geometry || pointIndex < 0 || pointIndex >= geometry.points.length) {
4186
4230
  return null;
4187
4231
  }
@@ -4224,7 +4268,7 @@ var PathReshapeSession = class {
4224
4268
  this.#emitter = emitter;
4225
4269
  }
4226
4270
  pointerDown = (event) => {
4227
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
4271
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4228
4272
  return;
4229
4273
  }
4230
4274
  this.#drag = createPathReshapeDragState(this.#svg, event);
@@ -4235,7 +4279,7 @@ var PathReshapeSession = class {
4235
4279
  return;
4236
4280
  }
4237
4281
  drag.moved = true;
4238
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4282
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4239
4283
  if (point) {
4240
4284
  applyPathReshapePreview(drag, point);
4241
4285
  }
@@ -4250,7 +4294,7 @@ var PathReshapeSession = class {
4250
4294
  if (!drag.moved) {
4251
4295
  return;
4252
4296
  }
4253
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event) ?? {
4297
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event) ?? {
4254
4298
  x: drag.points[drag.pointIndex][0],
4255
4299
  y: drag.points[drag.pointIndex][1]
4256
4300
  };
@@ -4291,7 +4335,7 @@ function updatePieLabelDragPreview(drag, dx, dy) {
4291
4335
  }
4292
4336
  const from = { x: drag.tickStartX, y: drag.tickStartY };
4293
4337
  const to = { x: drag.restX + dx, y: drag.restY + dy };
4294
- const clipped = chunkLSEMXRB5_cjs.clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);
4338
+ const clipped = chunkUHKFJBY5_cjs.clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);
4295
4339
  drag.tickElement.setAttribute("d", `M ${from.x} ${from.y} L ${clipped.x} ${clipped.y}`);
4296
4340
  drag.tickElement.setAttribute("stroke", PREVIEW_TICK_COLOR);
4297
4341
  drag.tickElement.setAttribute("stroke-width", PREVIEW_TICK_STROKE_WIDTH);
@@ -4317,7 +4361,7 @@ function restoreAttribute(element2, name, value) {
4317
4361
 
4318
4362
  // src/runtime/interaction/pieGeometry.ts
4319
4363
  function readPieGeometry(svg, ownerId) {
4320
- const raw = chunkSCD3AHMY_cjs.findOwnerNode(svg, ownerId, chunkSCD3AHMY_cjs.isPrimary)?.getAttribute("data-sf-pie-geometry");
4364
+ const raw = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary)?.getAttribute("data-sf-pie-geometry");
4321
4365
  if (!raw) {
4322
4366
  return null;
4323
4367
  }
@@ -4336,7 +4380,7 @@ function findLabelMark2(event) {
4336
4380
  return event.target?.closest?.(selector);
4337
4381
  }
4338
4382
  function isLabelPointer2(event) {
4339
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
4383
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
4340
4384
  }
4341
4385
  function findLabelSiblings(svg, ownerId, seriesId, mark) {
4342
4386
  const selector = `[data-sf-id="${CSS.escape(ownerId)}"][data-sf-series="${CSS.escape(seriesId)}"][data-sf-mark="${mark}"]`;
@@ -4368,7 +4412,7 @@ function resolvePieLabelDrag(svg, event) {
4368
4412
  if (!clicked) {
4369
4413
  return null;
4370
4414
  }
4371
- const owner = chunkSCD3AHMY_cjs.resolveOwner(clicked);
4415
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(clicked);
4372
4416
  if (owner?.role !== "chart") {
4373
4417
  return null;
4374
4418
  }
@@ -4387,7 +4431,7 @@ function resolvePieLabelDrag(svg, event) {
4387
4431
  const wedgeRadius = clicked.getAttribute("data-sf-pie-wedge-radius");
4388
4432
  const explicitRadius = wedgeRadius === null ? Number.NaN : Number(wedgeRadius);
4389
4433
  const outerRadius = Number.isFinite(explicitRadius) ? explicitRadius : geometry.outerRadius;
4390
- const start = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
4434
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
4391
4435
  if (!start) {
4392
4436
  return null;
4393
4437
  }
@@ -4409,13 +4453,13 @@ function resolvePieLabelDrag(svg, event) {
4409
4453
  outerRadius,
4410
4454
  anchorX: geometry.centerX + outerRadius * Math.cos(midAngle),
4411
4455
  anchorY: geometry.centerY + outerRadius * Math.sin(midAngle),
4412
- tickStartX: geometry.centerX + (outerRadius + chunkLSEMXRB5_cjs.LEADER_INSET) * Math.cos(midAngle),
4413
- tickStartY: geometry.centerY + (outerRadius + chunkLSEMXRB5_cjs.LEADER_INSET) * Math.sin(midAngle),
4456
+ tickStartX: geometry.centerX + (outerRadius + chunkUHKFJBY5_cjs.LEADER_INSET) * Math.cos(midAngle),
4457
+ tickStartY: geometry.centerY + (outerRadius + chunkUHKFJBY5_cjs.LEADER_INSET) * Math.sin(midAngle),
4414
4458
  restX,
4415
4459
  restY,
4416
4460
  startX: start.x,
4417
4461
  startY: start.y,
4418
- halfWidth: chunkLSEMXRB5_cjs.LABEL_WIDTH / 2,
4462
+ halfWidth: chunkUHKFJBY5_cjs.LABEL_WIDTH / 2,
4419
4463
  halfHeight: fontSize * 1.2,
4420
4464
  moved: false,
4421
4465
  lastDx: 0,
@@ -4451,7 +4495,7 @@ var PieLabelDragSession = class {
4451
4495
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
4452
4496
  return;
4453
4497
  }
4454
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4498
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4455
4499
  if (!point) {
4456
4500
  return;
4457
4501
  }
@@ -4483,8 +4527,8 @@ var PieLabelDragSession = class {
4483
4527
  if (!drag.moved) {
4484
4528
  return;
4485
4529
  }
4486
- const pathX = chunkLSEMXRB5_cjs.seriesLabelOffsetXProp(drag.seriesId);
4487
- const pathY = chunkLSEMXRB5_cjs.seriesLabelOffsetYProp(drag.seriesId);
4530
+ const pathX = chunkUHKFJBY5_cjs.seriesLabelOffsetXProp(drag.seriesId);
4531
+ const pathY = chunkUHKFJBY5_cjs.seriesLabelOffsetYProp(drag.seriesId);
4488
4532
  if (!pathX || !pathY) {
4489
4533
  return;
4490
4534
  }
@@ -4546,7 +4590,7 @@ function siblingNodes(svg, owner, path) {
4546
4590
  });
4547
4591
  }
4548
4592
  function resolvePropertyDrag(svg, event, rules) {
4549
- if (event.button !== 0 || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
4593
+ if (event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4550
4594
  return null;
4551
4595
  }
4552
4596
  const node = event.target?.closest?.('[data-sf-prop-kind="value"]');
@@ -4554,11 +4598,11 @@ function resolvePropertyDrag(svg, event, rules) {
4554
4598
  return null;
4555
4599
  }
4556
4600
  const path = node.getAttribute("data-sf-prop");
4557
- const owner = chunkSCD3AHMY_cjs.resolveOwner(node);
4601
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
4558
4602
  if (!path || owner?.role !== "chart" || !isEditablePath(path, rules)) {
4559
4603
  return null;
4560
4604
  }
4561
- const scale = parseValueScale(chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isPrimary));
4605
+ const scale = parseValueScale(chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary));
4562
4606
  if (!scale) {
4563
4607
  return null;
4564
4608
  }
@@ -4827,7 +4871,7 @@ function resolvePropertyTarget(event, rules) {
4827
4871
  return null;
4828
4872
  }
4829
4873
  const path = hit.getAttribute("data-sf-prop");
4830
- const owner = chunkSCD3AHMY_cjs.resolveOwner(hit);
4874
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(hit);
4831
4875
  if (!path || !owner || !isEditablePath(path, rules)) {
4832
4876
  return null;
4833
4877
  }
@@ -4866,7 +4910,7 @@ var PropertyEditingSession = class {
4866
4910
  begin(target) {
4867
4911
  this.cancel();
4868
4912
  const { node } = target;
4869
- const rect = chunkSCD3AHMY_cjs.screenRectOf(node);
4913
+ const rect = chunkWZA3DJJH_cjs.screenRectOf(node);
4870
4914
  const fontSize = Number.parseFloat(node.getAttribute("font-size") || "12");
4871
4915
  const originalText = node.textContent ?? "";
4872
4916
  const anchor = node.getAttribute("text-anchor");
@@ -4956,15 +5000,15 @@ function crossedDuplicateDragThreshold(drag, event) {
4956
5000
  var PREVIEW_STROKE_PX = 2;
4957
5001
  var NEW_LINK_PATH_TYPE = "orthogonal";
4958
5002
  function createDuplicatePreviewPath(svg) {
4959
- const path = svg.ownerDocument.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "path");
5003
+ const path = svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "path");
4960
5004
  path.setAttribute("fill", "none");
4961
- path.setAttribute("stroke-width", String(PREVIEW_STROKE_PX / chunkSCD3AHMY_cjs.pxPerUnit(svg)));
5005
+ path.setAttribute("stroke-width", String(PREVIEW_STROKE_PX / chunkWZA3DJJH_cjs.pxPerUnit(svg)));
4962
5006
  path.style.pointerEvents = "none";
4963
5007
  return path;
4964
5008
  }
4965
5009
  function updateDuplicatePreview(drag, toPoint, toSide) {
4966
5010
  const link = previewLink(drag.direction, toSide);
4967
- const { points, segments } = chunkLSEMXRB5_cjs.calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
5011
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
4968
5012
  drag.previewPath.setAttribute("d", previewPathData(points, segments, NEW_LINK_PATH_TYPE, 2));
4969
5013
  }
4970
5014
 
@@ -4975,7 +5019,7 @@ function duplicateCandidates(svg, sourceId) {
4975
5019
  if (element2.getAttribute("data-sf-role") === "link") {
4976
5020
  continue;
4977
5021
  }
4978
- const owner = chunkSCD3AHMY_cjs.resolveOwner(element2);
5022
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
4979
5023
  if (owner && owner.id !== sourceId) {
4980
5024
  candidates.push({ owner, bounds: element2.getBBox() });
4981
5025
  }
@@ -4989,8 +5033,8 @@ function createQuickDuplicateDragState(svg, event, previewPath) {
4989
5033
  if (!bubble || !direction || direction.startsWith("iso-") || !sourceId) {
4990
5034
  return null;
4991
5035
  }
4992
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, sourceId, chunkSCD3AHMY_cjs.isPrimary);
4993
- const sourceOwner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
5036
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, sourceId, chunkWZA3DJJH_cjs.isPrimary);
5037
+ const sourceOwner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
4994
5038
  if (!primary || !sourceOwner) {
4995
5039
  return null;
4996
5040
  }
@@ -4998,7 +5042,7 @@ function createQuickDuplicateDragState(svg, event, previewPath) {
4998
5042
  return {
4999
5043
  sourceOwner,
5000
5044
  direction,
5001
- fixedPoint: chunkLSEMXRB5_cjs.pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),
5045
+ fixedPoint: chunkUHKFJBY5_cjs.pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),
5002
5046
  previewPath,
5003
5047
  ghost: new LinkGhost(svg, previewPath),
5004
5048
  candidates: duplicateCandidates(svg, sourceId),
@@ -5026,7 +5070,7 @@ var QuickDuplicateSession = class {
5026
5070
  this.#emitter = emitter;
5027
5071
  }
5028
5072
  pointerDown = (event) => {
5029
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
5073
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
5030
5074
  return;
5031
5075
  }
5032
5076
  this.#drag = createQuickDuplicateDragState(this.#svg, event, createDuplicatePreviewPath(this.#svg));
@@ -5040,7 +5084,7 @@ var QuickDuplicateSession = class {
5040
5084
  return;
5041
5085
  }
5042
5086
  this.beginPreview(drag);
5043
- const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg));
5087
+ const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg));
5044
5088
  updateDuplicatePreview(drag, target.point, target.side);
5045
5089
  drag.ghost.show(target.hit !== null, target.bounds);
5046
5090
  };
@@ -5098,14 +5142,14 @@ function seriesShapes(svg, ownerId, series) {
5098
5142
  return [...svg.querySelectorAll(selector)];
5099
5143
  }
5100
5144
  function updateRadarVertexDragPreview(svg, drag, value) {
5101
- const point = chunkLSEMXRB5_cjs.radarVertexPoint(drag.frame, drag.index, value);
5145
+ const point = chunkUHKFJBY5_cjs.radarVertexPoint(drag.frame, drag.index, value);
5102
5146
  drag.element.setAttribute("cx", String(point.x));
5103
5147
  drag.element.setAttribute("cy", String(point.y));
5104
5148
  const points = seriesVertices(svg, drag.owner.id, drag.series).map((vertex) => ({
5105
5149
  x: Number(vertex.getAttribute("cx")),
5106
5150
  y: Number(vertex.getAttribute("cy"))
5107
5151
  }));
5108
- const path = chunkLSEMXRB5_cjs.radarSeriesPath(points, drag.frame.curved, drag.frame.tension);
5152
+ const path = chunkUHKFJBY5_cjs.radarSeriesPath(points, drag.frame.curved, drag.frame.tension);
5109
5153
  for (const shape of seriesShapes(svg, drag.owner.id, drag.series)) {
5110
5154
  shape.setAttribute("d", path);
5111
5155
  }
@@ -5160,7 +5204,7 @@ function findVertex(event) {
5160
5204
  return event.target?.closest?.('[data-sf-mark="radar-vertex"]');
5161
5205
  }
5162
5206
  function isVertexPointer(event) {
5163
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
5207
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
5164
5208
  }
5165
5209
  function resolveRadarVertexDrag(svg, event) {
5166
5210
  if (!isVertexPointer(event)) {
@@ -5170,7 +5214,7 @@ function resolveRadarVertexDrag(svg, event) {
5170
5214
  if (!element2) {
5171
5215
  return null;
5172
5216
  }
5173
- const owner = chunkSCD3AHMY_cjs.resolveOwner(element2);
5217
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
5174
5218
  if (owner?.role !== "chart") {
5175
5219
  return null;
5176
5220
  }
@@ -5179,7 +5223,7 @@ function resolveRadarVertexDrag(svg, event) {
5179
5223
  if (!series || !Number.isInteger(index) || index < 0) {
5180
5224
  return null;
5181
5225
  }
5182
- const frame = parseRadarFrame(chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isPrimary));
5226
+ const frame = parseRadarFrame(chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary));
5183
5227
  if (!frame || index >= frame.count) {
5184
5228
  return null;
5185
5229
  }
@@ -5189,11 +5233,11 @@ function resolveRadarVertexDrag(svg, event) {
5189
5233
 
5190
5234
  // src/runtime/interaction/radarVertexDrag/session.ts
5191
5235
  function valueFrom(svg, event, drag) {
5192
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
5236
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
5193
5237
  if (!point) {
5194
5238
  return null;
5195
5239
  }
5196
- return chunkLSEMXRB5_cjs.radarValueAtPoint(drag.frame, drag.index, point.x, point.y);
5240
+ return chunkUHKFJBY5_cjs.radarValueAtPoint(drag.frame, drag.index, point.x, point.y);
5197
5241
  }
5198
5242
  var RadarVertexDragSession = class {
5199
5243
  #svg;
@@ -5225,7 +5269,7 @@ var RadarVertexDragSession = class {
5225
5269
  if (!this.#readout) {
5226
5270
  this.#readout = createValueReadout(this.#svg);
5227
5271
  }
5228
- const vertex = chunkLSEMXRB5_cjs.radarVertexPoint(this.#drag.frame, this.#drag.index, value);
5272
+ const vertex = chunkUHKFJBY5_cjs.radarVertexPoint(this.#drag.frame, this.#drag.index, value);
5229
5273
  positionRadarReadout(this.#readout, vertex, this.#drag.frame.centerY, value);
5230
5274
  }
5231
5275
  cancel() {
@@ -5316,7 +5360,7 @@ function captureTextFit(text) {
5316
5360
  fontSize,
5317
5361
  lineHeight,
5318
5362
  padding: Math.max(8, text.strokeWidth * 2),
5319
- longestWord: Math.max(0, ...words.map((word) => chunkLSEMXRB5_cjs.estimateTextWidth(word, fontSize, bold)))
5363
+ longestWord: Math.max(0, ...words.map((word) => chunkUHKFJBY5_cjs.estimateTextWidth(word, fontSize, bold)))
5320
5364
  };
5321
5365
  }
5322
5366
  var COMMIT_PRECISION = 10;
@@ -5327,7 +5371,7 @@ function minWidthForText(fit) {
5327
5371
  return roundUpForCommit(fit.longestWord + fit.padding * 2);
5328
5372
  }
5329
5373
  function minHeightForText(fit, width) {
5330
- const lines = chunkLSEMXRB5_cjs.wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);
5374
+ const lines = chunkUHKFJBY5_cjs.wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);
5331
5375
  return roundUpForCommit(lines.length * fit.fontSize * fit.lineHeight + fit.padding * 2);
5332
5376
  }
5333
5377
 
@@ -5461,7 +5505,7 @@ function applyRectBounds(rect, kind, bounds) {
5461
5505
  rect.setAttribute("width", String(bounds.width));
5462
5506
  rect.setAttribute("height", String(bounds.height));
5463
5507
  if (kind === "pill") {
5464
- rect.setAttribute("rx", String(chunkLSEMXRB5_cjs.pillCornerRadius(bounds.width, bounds.height)));
5508
+ rect.setAttribute("rx", String(chunkUHKFJBY5_cjs.pillCornerRadius(bounds.width, bounds.height)));
5465
5509
  }
5466
5510
  }
5467
5511
  function applyEllipseBounds(ellipse, bounds) {
@@ -5471,7 +5515,7 @@ function applyEllipseBounds(ellipse, bounds) {
5471
5515
  ellipse.setAttribute("ry", String(bounds.height / 2));
5472
5516
  }
5473
5517
  function applySymbolBounds(path, bounds) {
5474
- const raw = path.getAttribute(chunkLSEMXRB5_cjs.SYMBOL_POINTS_ATTR);
5518
+ const raw = path.getAttribute(chunkUHKFJBY5_cjs.SYMBOL_POINTS_ATTR);
5475
5519
  if (!raw) {
5476
5520
  return false;
5477
5521
  }
@@ -5479,22 +5523,22 @@ function applySymbolBounds(path, bounds) {
5479
5523
  x: bounds.x + x * bounds.width,
5480
5524
  y: bounds.y + y * bounds.height
5481
5525
  }));
5482
- const tension = Number(path.getAttribute(chunkLSEMXRB5_cjs.SYMBOL_TENSION_ATTR)) || 0;
5483
- path.setAttribute("d", chunkLSEMXRB5_cjs.freeformPathData({ points, tension, closed: true }));
5526
+ const tension = Number(path.getAttribute(chunkUHKFJBY5_cjs.SYMBOL_TENSION_ATTR)) || 0;
5527
+ path.setAttribute("d", chunkUHKFJBY5_cjs.freeformPathData({ points, tension, closed: true }));
5484
5528
  return true;
5485
5529
  }
5486
5530
  function applyPathBounds(path, kind, bounds) {
5487
5531
  if (kind === "symbol" && applySymbolBounds(path, bounds)) {
5488
5532
  return;
5489
5533
  }
5490
- const pathData = chunkLSEMXRB5_cjs.localShapePath(kind, bounds.x, bounds.y, bounds.width, bounds.height);
5534
+ const pathData = chunkUHKFJBY5_cjs.localShapePath(kind, bounds.x, bounds.y, bounds.width, bounds.height);
5491
5535
  if (pathData) {
5492
5536
  path.setAttribute("d", pathData);
5493
5537
  }
5494
5538
  }
5495
5539
  function applyFrameBoundaryBounds(path, bounds) {
5496
- const cornerRadius = Number(path.getAttribute(chunkLSEMXRB5_cjs.CORNER_RADIUS_ATTR) ?? 0);
5497
- const squareCorner = path.getAttribute(chunkLSEMXRB5_cjs.SQUARE_CORNER_ATTR);
5540
+ const cornerRadius = Number(path.getAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR) ?? 0);
5541
+ const squareCorner = path.getAttribute(chunkUHKFJBY5_cjs.SQUARE_CORNER_ATTR);
5498
5542
  const radii = {
5499
5543
  topLeft: cornerRadius,
5500
5544
  topRight: cornerRadius,
@@ -5504,7 +5548,7 @@ function applyFrameBoundaryBounds(path, bounds) {
5504
5548
  if (squareCorner) {
5505
5549
  radii[squareCorner] = 0;
5506
5550
  }
5507
- path.setAttribute("d", chunkLSEMXRB5_cjs.cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));
5551
+ path.setAttribute("d", chunkUHKFJBY5_cjs.cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));
5508
5552
  }
5509
5553
  function applySingleNodeBounds(primary, kind, bounds) {
5510
5554
  const tag = primary.tagName.toLowerCase();
@@ -5514,7 +5558,7 @@ function applySingleNodeBounds(primary, kind, bounds) {
5514
5558
  applyEllipseBounds(primary, bounds);
5515
5559
  } else if (tag === "foreignobject") {
5516
5560
  applyRectBounds(primary, null, bounds);
5517
- } else if (tag === "path" && primary.hasAttribute(chunkLSEMXRB5_cjs.CORNER_RADIUS_ATTR)) {
5561
+ } else if (tag === "path" && primary.hasAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR)) {
5518
5562
  applyFrameBoundaryBounds(primary, bounds);
5519
5563
  } else if (tag === "path" && kind) {
5520
5564
  applyPathBounds(primary, kind, bounds);
@@ -5553,7 +5597,7 @@ function updateSelectionRing(overlay, bounds) {
5553
5597
  }
5554
5598
  function updateSelectionOverlay(overlay, bounds) {
5555
5599
  updateSelectionRing(overlay, bounds);
5556
- for (const [centerX, centerY, name] of chunkSCD3AHMY_cjs.resizeHandlePositions(bounds)) {
5600
+ for (const [centerX, centerY, name] of chunkWZA3DJJH_cjs.resizeHandlePositions(bounds)) {
5557
5601
  const handle = overlay.querySelector(`[data-sf-resize-handle="${name}"]`);
5558
5602
  if (!handle) {
5559
5603
  continue;
@@ -5570,7 +5614,7 @@ function replaceTextLines(textElement, lines, x, lineHeight) {
5570
5614
  textElement.removeChild(textElement.firstChild);
5571
5615
  }
5572
5616
  lines.forEach((line, index) => {
5573
- const tspan = document.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "tspan");
5617
+ const tspan = document.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "tspan");
5574
5618
  tspan.setAttribute("x", String(x));
5575
5619
  if (index > 0) {
5576
5620
  tspan.setAttribute("dy", `${lineHeight}px`);
@@ -5590,7 +5634,7 @@ function applyLiveText(textElement, rawText, bounds, strokeWidth) {
5590
5634
  const height = Math.max(0, bounds.height - padding * 2);
5591
5635
  const boxX = bounds.x + padding;
5592
5636
  const boxY = bounds.y + padding;
5593
- const lines = chunkLSEMXRB5_cjs.wrapText(rawText, width, fontSize);
5637
+ const lines = chunkUHKFJBY5_cjs.wrapText(rawText, width, fontSize);
5594
5638
  const linePixels = fontSize * lineHeight;
5595
5639
  const contentHeight = lines.length * linePixels;
5596
5640
  const firstY = verticalAlign === "top" ? boxY + fontSize : verticalAlign === "bottom" ? boxY + height - contentHeight + fontSize : boxY + (height - contentHeight) / 2 + fontSize;
@@ -5603,7 +5647,7 @@ function applyLiveText(textElement, rawText, bounds, strokeWidth) {
5603
5647
 
5604
5648
  // src/runtime/interaction/resize/preview.ts
5605
5649
  function textBoundsFor(kind, bounds) {
5606
- return kind === "person" ? chunkLSEMXRB5_cjs.personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;
5650
+ return kind === "person" ? chunkUHKFJBY5_cjs.personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;
5607
5651
  }
5608
5652
  function applyGeometryPreview(drag, bounds) {
5609
5653
  if (drag.isComposite) {
@@ -5611,6 +5655,10 @@ function applyGeometryPreview(drag, bounds) {
5611
5655
  return;
5612
5656
  }
5613
5657
  drag.geometryNodes.forEach((node, index) => {
5658
+ if (node.tagName.toLowerCase() === "image") {
5659
+ applyCompositeScale([node], drag.startBounds, bounds, [drag.baseTransforms[index]]);
5660
+ return;
5661
+ }
5614
5662
  applySingleNodeBounds(node, drag.kind, applyInset(bounds, drag.insets[index] ?? NO_INSET));
5615
5663
  });
5616
5664
  }
@@ -5623,7 +5671,7 @@ function applyResizePreview(drag, bounds) {
5623
5671
  applyLiveText(drag.text.el, drag.text.rawText, textBoundsFor(drag.kind, bounds), drag.text.strokeWidth);
5624
5672
  }
5625
5673
  if (drag.bubbles) {
5626
- chunkSCD3AHMY_cjs.updateQuickDuplicateBubbles(drag.bubbles, bounds);
5674
+ chunkWZA3DJJH_cjs.updateQuickDuplicateBubbles(drag.bubbles, bounds);
5627
5675
  }
5628
5676
  updateLiveLinks(drag.liveLinks, bounds);
5629
5677
  }
@@ -5644,9 +5692,9 @@ function snapResize(svg, drag, pointer) {
5644
5692
  };
5645
5693
  }
5646
5694
  const axes = HANDLE_AXES[drag.handle];
5647
- const candidates = nearestCandidates(proposed, chunkSCD3AHMY_cjs.findSnapCandidateBounds(svg, /* @__PURE__ */ new Set([drag.owner.id])));
5695
+ const candidates = nearestCandidates(proposed, chunkWZA3DJJH_cjs.findSnapCandidateBounds(svg, /* @__PURE__ */ new Set([drag.owner.id])));
5648
5696
  const snap = computeSnap(proposed, candidates, {
5649
- threshold: snapDistancePx(svg) / chunkSCD3AHMY_cjs.pxPerUnit(svg),
5697
+ threshold: snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg),
5650
5698
  activeX: resizeActivePoints(axes.x),
5651
5699
  activeY: resizeActivePoints(axes.y),
5652
5700
  guideOverhang: GUIDE_OVERHANG3
@@ -5687,13 +5735,13 @@ function selectResizeTarget(svg, event) {
5687
5735
  if (!ownerId) {
5688
5736
  return null;
5689
5737
  }
5690
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, ownerId, chunkSCD3AHMY_cjs.isPrimary);
5691
- const owner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
5738
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
5739
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
5692
5740
  if (!primary || !hasEditableGeometry(owner)) {
5693
5741
  return null;
5694
5742
  }
5695
- const nodes = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, ownerId);
5696
- const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter((node) => !chunkSCD3AHMY_cjs.isTextLabel(node));
5743
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, ownerId);
5744
+ const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter((node) => !chunkWZA3DJJH_cjs.isTextLabel(node));
5697
5745
  if (!geometryNodes.length) {
5698
5746
  return null;
5699
5747
  }
@@ -5711,7 +5759,7 @@ function selectResizeTarget(svg, event) {
5711
5759
 
5712
5760
  // src/runtime/interaction/resize/textCapture.ts
5713
5761
  function captureResizeText(nodes, primary) {
5714
- const textElement = nodes.find(chunkSCD3AHMY_cjs.isTextLabel);
5762
+ const textElement = nodes.find(chunkWZA3DJJH_cjs.isTextLabel);
5715
5763
  const rawText = primary.getAttribute("aria-label");
5716
5764
  if (!textElement || !rawText) {
5717
5765
  return null;
@@ -5729,7 +5777,7 @@ function createResizeDragState(svg, event) {
5729
5777
  if (!selection) {
5730
5778
  return null;
5731
5779
  }
5732
- const startBounds = chunkSCD3AHMY_cjs.symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();
5780
+ const startBounds = chunkWZA3DJJH_cjs.symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();
5733
5781
  const composite = isCompositeOwner(selection.owner);
5734
5782
  const isContainer = CONTAINER_ROLES.has(selection.owner.role);
5735
5783
  selection.captureTarget.setPointerCapture?.(event.pointerId);
@@ -5742,7 +5790,7 @@ function createResizeDragState(svg, event) {
5742
5790
  isComposite: composite,
5743
5791
  geometryNodes: selection.geometryNodes,
5744
5792
  insets: selection.geometryNodes.map(
5745
- (node) => node === selection.primary ? NO_INSET : insetWithin(startBounds, chunkSCD3AHMY_cjs.symbolDeclaredBounds(node) ?? node.getBBox())
5793
+ (node) => node === selection.primary ? NO_INSET : insetWithin(startBounds, chunkWZA3DJJH_cjs.symbolDeclaredBounds(node) ?? node.getBBox())
5746
5794
  ),
5747
5795
  baseTransforms: selection.geometryNodes.map((node) => node.getAttribute("transform")),
5748
5796
  overlay: selection.overlay,
@@ -5768,7 +5816,7 @@ var ResizeSession = class {
5768
5816
  this.#emitter = emitter;
5769
5817
  }
5770
5818
  pointerDown = (event) => {
5771
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
5819
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
5772
5820
  return;
5773
5821
  }
5774
5822
  this.#drag = createResizeDragState(this.#svg, event);
@@ -5783,7 +5831,7 @@ var ResizeSession = class {
5783
5831
  const bounds = keepsProportions(drag, event.shiftKey) ? lockAspect(snapped.bounds, drag.startBounds, drag.handle) : snapped.bounds;
5784
5832
  const { guides } = snapped;
5785
5833
  applyResizePreview(drag, clampResizeToChildren(bounds, drag.childrenBounds));
5786
- chunkSCD3AHMY_cjs.updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);
5834
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);
5787
5835
  };
5788
5836
  pointerUp = (event) => {
5789
5837
  const drag = this.#drag;
@@ -5792,7 +5840,7 @@ var ResizeSession = class {
5792
5840
  }
5793
5841
  this.#drag = null;
5794
5842
  event.target?.releasePointerCapture?.(drag.pointerId);
5795
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
5843
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
5796
5844
  if (!drag.moved) {
5797
5845
  return;
5798
5846
  }
@@ -5831,7 +5879,7 @@ function resolveSankeyNodeLabelTarget(event) {
5831
5879
  if (!labelElement) {
5832
5880
  return null;
5833
5881
  }
5834
- const owner = chunkSCD3AHMY_cjs.resolveOwner(labelElement);
5882
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(labelElement);
5835
5883
  if (owner?.role !== "chart") {
5836
5884
  return null;
5837
5885
  }
@@ -5842,7 +5890,7 @@ function resolveSankeyNodeLabelTarget(event) {
5842
5890
  return { owner, nodeId, labelElement };
5843
5891
  }
5844
5892
  function createSankeyNodeLabelEditor(target, emitter, onClose) {
5845
- const rect = chunkSCD3AHMY_cjs.screenRectOf(target.labelElement);
5893
+ const rect = chunkWZA3DJJH_cjs.screenRectOf(target.labelElement);
5846
5894
  if (rect.width <= 0 && rect.height <= 0) {
5847
5895
  return null;
5848
5896
  }
@@ -5899,7 +5947,7 @@ function clearSankeyNodeDragPreview(drag) {
5899
5947
  // src/runtime/interaction/sankeyNode/target.ts
5900
5948
  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$/;
5901
5949
  function isNodePointer(event) {
5902
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
5950
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
5903
5951
  }
5904
5952
  function findNodeRect(event) {
5905
5953
  return event.target?.closest?.('[data-sf-mark="sankey-node"]');
@@ -5957,7 +6005,7 @@ function resolveSankeyNodeDrag(svg, event) {
5957
6005
  if (!rect) {
5958
6006
  return null;
5959
6007
  }
5960
- const owner = chunkSCD3AHMY_cjs.resolveOwner(rect);
6008
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(rect);
5961
6009
  if (owner?.role !== "chart") {
5962
6010
  return null;
5963
6011
  }
@@ -5965,7 +6013,7 @@ function resolveSankeyNodeDrag(svg, event) {
5965
6013
  if (!nodeId) {
5966
6014
  return null;
5967
6015
  }
5968
- const start = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
6016
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
5969
6017
  if (!start) {
5970
6018
  return null;
5971
6019
  }
@@ -6011,7 +6059,7 @@ var SankeyNodeDragSession = class {
6011
6059
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
6012
6060
  return;
6013
6061
  }
6014
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
6062
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
6015
6063
  if (!point) {
6016
6064
  return;
6017
6065
  }
@@ -6025,7 +6073,7 @@ var SankeyNodeDragSession = class {
6025
6073
  const leadBounds = offsetBounds(drag.originalBounds, rawDx, rawDy);
6026
6074
  const candidates = nearestCandidates(leadBounds, drag.siblingBounds);
6027
6075
  const snap = computeSnap(leadBounds, candidates, {
6028
- threshold: SNAP_THRESHOLD_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg),
6076
+ threshold: SNAP_THRESHOLD_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg),
6029
6077
  activeX: MOVE_ACTIVE_POINTS,
6030
6078
  activeY: MOVE_ACTIVE_POINTS,
6031
6079
  guideOverhang: GUIDE_OVERHANG4
@@ -6035,7 +6083,7 @@ var SankeyNodeDragSession = class {
6035
6083
  drag.lastDx = dx;
6036
6084
  drag.lastDy = dy;
6037
6085
  updateSankeyNodeDragPreview(drag, dx, dy);
6038
- chunkSCD3AHMY_cjs.updateAlignmentGuides(
6086
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(
6039
6087
  this.#svg,
6040
6088
  [snap.x.guide, snap.y.guide].filter((guide) => guide !== null),
6041
6089
  GUIDE_COLOR3
@@ -6046,7 +6094,7 @@ var SankeyNodeDragSession = class {
6046
6094
  clearSankeyNodeDragPreview(this.#drag);
6047
6095
  }
6048
6096
  this.#drag = null;
6049
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
6097
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
6050
6098
  }
6051
6099
  finish(event) {
6052
6100
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
@@ -6056,7 +6104,7 @@ var SankeyNodeDragSession = class {
6056
6104
  this.#drag = null;
6057
6105
  event.target?.releasePointerCapture?.(drag.pointerId);
6058
6106
  clearSankeyNodeDragPreview(drag);
6059
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
6107
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
6060
6108
  if (!drag.moved) {
6061
6109
  return;
6062
6110
  }
@@ -6112,7 +6160,7 @@ function bindSankeyNode(viewer, emitter) {
6112
6160
  var FALLBACK_WIDTH = 120;
6113
6161
  var FALLBACK_HEIGHT = 28;
6114
6162
  function centeredLabelRect(primaryNode) {
6115
- const primaryRect = chunkSCD3AHMY_cjs.screenRectOf(primaryNode);
6163
+ const primaryRect = chunkWZA3DJJH_cjs.screenRectOf(primaryNode);
6116
6164
  return {
6117
6165
  left: primaryRect.left + (primaryRect.width - FALLBACK_WIDTH) / 2,
6118
6166
  top: primaryRect.top + (primaryRect.height - FALLBACK_HEIGHT) / 2,
@@ -6122,10 +6170,10 @@ function centeredLabelRect(primaryNode) {
6122
6170
  }
6123
6171
  function resolveTextEditRect(owner, textNode, primaryNode) {
6124
6172
  if (owner.role === "shape") {
6125
- return primaryNode ? chunkSCD3AHMY_cjs.screenRectOf(primaryNode) : null;
6173
+ return primaryNode ? chunkWZA3DJJH_cjs.screenRectOf(primaryNode) : null;
6126
6174
  }
6127
6175
  if (textNode) {
6128
- return chunkSCD3AHMY_cjs.screenRectOf(textNode);
6176
+ return chunkWZA3DJJH_cjs.screenRectOf(textNode);
6129
6177
  }
6130
6178
  return primaryNode ? centeredLabelRect(primaryNode) : null;
6131
6179
  }
@@ -6145,8 +6193,8 @@ function textAlign(owner, textNode) {
6145
6193
  return anchor === "end" ? "right" : "left";
6146
6194
  }
6147
6195
  function createActiveTextEditor(svg, owner, emitter, onClose) {
6148
- const textNode = chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isTextLabel);
6149
- const primaryNode = chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isPrimary);
6196
+ const textNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isTextLabel);
6197
+ const primaryNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary);
6150
6198
  const rect = resolveTextEditRect(owner, textNode, primaryNode);
6151
6199
  if (!rect) {
6152
6200
  return null;
@@ -6192,7 +6240,7 @@ function isFrameTitle(target) {
6192
6240
  }
6193
6241
  function resolveEditableTextOwner(event) {
6194
6242
  const target = event.target;
6195
- const owner = chunkSCD3AHMY_cjs.resolveOwner(target);
6243
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(target);
6196
6244
  if (!owner) {
6197
6245
  return null;
6198
6246
  }
@@ -6333,7 +6381,7 @@ function applyToken(target, lines, token) {
6333
6381
  function maskSource(lines) {
6334
6382
  let tokens;
6335
6383
  try {
6336
- tokens = chunkLSEMXRB5_cjs.tokenizeSource(lines.join("\n"));
6384
+ tokens = chunkUHKFJBY5_cjs.tokenizeSource(lines.join("\n"));
6337
6385
  } catch {
6338
6386
  return null;
6339
6387
  }
@@ -6365,7 +6413,7 @@ function braceDelta(masked) {
6365
6413
  }
6366
6414
 
6367
6415
  // src/runtime/interaction/sflPatch/scan/blocks.ts
6368
- 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/;
6416
+ 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/;
6369
6417
  var VALID_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;
6370
6418
  function blockEndIn(masked, startLine) {
6371
6419
  let depth = 0;
@@ -6632,6 +6680,9 @@ function canvasObjectBlockKind(kind) {
6632
6680
  if (kind === "text") {
6633
6681
  return "Text";
6634
6682
  }
6683
+ if (kind === "image") {
6684
+ return "Image";
6685
+ }
6635
6686
  if (kind === "isometric") {
6636
6687
  return "Isometric";
6637
6688
  }
@@ -6666,7 +6717,7 @@ function resolveCanvasObjectInsertionTarget(sfl, lines, parentId) {
6666
6717
  const modelRange = findFirstBlockOfKind(lines, "Model");
6667
6718
  return modelRange ? { range: modelRange, origin: { x: 0, y: 0 } } : null;
6668
6719
  }
6669
- const parent = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects.find((canvasObject) => canvasObject.id === parentId);
6720
+ const parent = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects.find((canvasObject) => canvasObject.id === parentId);
6670
6721
  if (!parent) {
6671
6722
  return null;
6672
6723
  }
@@ -7192,33 +7243,33 @@ function movePathPoints(lines, range, dx, dy) {
7192
7243
  );
7193
7244
  replacePropertyValue(lines, span, shifted);
7194
7245
  }
7195
- function applyMoveChange(sfl, event) {
7196
- const state = chunkLSEMXRB5_cjs.sflToCanvasState(sfl);
7197
- const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7198
- if (!canvasObject) {
7199
- return sfl;
7200
- }
7201
- const parent = canvasObject.parentFrameId ? state.canvasObjects.find((candidate) => candidate.id === canvasObject.parentFrameId) : void 0;
7202
- const originX = parent?.x ?? 0;
7203
- const originY = parent?.y ?? 0;
7246
+ function applyMoveChanges(sfl, events) {
7247
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7204
7248
  const lines = sfl.split("\n");
7205
- const range = findOwnerBlock(lines, event.owner.id);
7206
- if (!range) {
7207
- return sfl;
7208
- }
7209
- if (event.owner.role === "path") {
7210
- movePathPoints(lines, range, event.dx, event.dy);
7211
- return lines.join("\n");
7249
+ for (const event of events) {
7250
+ const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7251
+ const range = canvasObject ? findOwnerBlock(lines, event.owner.id) : null;
7252
+ if (!canvasObject || !range) {
7253
+ continue;
7254
+ }
7255
+ if (event.owner.role === "path") {
7256
+ movePathPoints(lines, range, event.dx, event.dy);
7257
+ continue;
7258
+ }
7259
+ const parent = canvasObject.parentFrameId ? state.canvasObjects.find((candidate) => candidate.id === canvasObject.parentFrameId) : void 0;
7260
+ setOrInsertLayoutTuples(lines, range, [
7261
+ ["position", canvasObject.x - (parent?.x ?? 0) + event.dx, canvasObject.y - (parent?.y ?? 0) + event.dy]
7262
+ ]);
7212
7263
  }
7213
- setOrInsertLayoutTuples(lines, range, [
7214
- ["position", canvasObject.x - originX + event.dx, canvasObject.y - originY + event.dy]
7215
- ]);
7216
7264
  return lines.join("\n");
7217
7265
  }
7266
+ function applyMoveChange(sfl, event) {
7267
+ return applyMoveChanges(sfl, [event]);
7268
+ }
7218
7269
 
7219
7270
  // src/runtime/interaction/sflPatch/changes/pathPointChange.ts
7220
7271
  function applyPathPointChange(sfl, event) {
7221
- const canvasObjects = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects;
7272
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7222
7273
  const canvasObject = canvasObjects.find((candidate) => candidate.id === event.owner.id);
7223
7274
  if (!canvasObject) {
7224
7275
  return sfl;
@@ -7372,7 +7423,7 @@ function resolveConnectionInsertionTarget(sfl, lines, options) {
7372
7423
  if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {
7373
7424
  return null;
7374
7425
  }
7375
- const canvasObjects = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects;
7426
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7376
7427
  const hasSource = canvasObjects.some((canvasObject) => canvasObject.id === options.fromId);
7377
7428
  const hasTarget = canvasObjects.some((canvasObject) => canvasObject.id === options.toId);
7378
7429
  if (!hasSource || !hasTarget) {
@@ -7436,13 +7487,13 @@ function isometricOffset(direction, object, gap) {
7436
7487
  const { depth } = object.isometric;
7437
7488
  switch (direction) {
7438
7489
  case "iso-width-pos":
7439
- return { dx: (width + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: (width + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7490
+ return { dx: (width + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: (width + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7440
7491
  case "iso-width-neg":
7441
- return { dx: -(width + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: -(width + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7492
+ return { dx: -(width + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: -(width + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7442
7493
  case "iso-depth-pos":
7443
- return { dx: -(depth + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: (depth + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7494
+ return { dx: -(depth + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: (depth + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7444
7495
  case "iso-depth-neg":
7445
- return { dx: (depth + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: -(depth + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7496
+ return { dx: (depth + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: -(depth + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7446
7497
  case "iso-height-pos":
7447
7498
  return { dx: 0, dy: height + gap };
7448
7499
  case "iso-height-neg":
@@ -7505,7 +7556,7 @@ function resolveLinkInsertionTarget(sfl, lines, options) {
7505
7556
  if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {
7506
7557
  return null;
7507
7558
  }
7508
- const canvasObjects = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects;
7559
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7509
7560
  const hasSource = canvasObjects.some((canvasObject) => canvasObject.id === options.fromId);
7510
7561
  const hasTarget = canvasObjects.some((canvasObject) => canvasObject.id === options.toId);
7511
7562
  if (!hasSource || !hasTarget) {
@@ -7591,21 +7642,21 @@ function duplicateShape(sfl, input) {
7591
7642
 
7592
7643
  // src/runtime/interaction/sflPatch/changes/quickDuplicateChange.ts
7593
7644
  function applyQuickDuplicateChange(sfl, event, options) {
7594
- const state = chunkLSEMXRB5_cjs.sflToCanvasState(sfl);
7645
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7595
7646
  const object = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7596
7647
  if (!object) {
7597
7648
  return sfl;
7598
7649
  }
7599
7650
  const { direction } = event;
7600
7651
  if (isIsometricDirection2(direction)) {
7601
- return chunkLSEMXRB5_cjs.isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;
7652
+ return chunkUHKFJBY5_cjs.isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;
7602
7653
  }
7603
- return chunkLSEMXRB5_cjs.isIsometricObject(object) ? sfl : duplicateShape(sfl, { object, links: state.links, side: direction, options });
7654
+ return chunkUHKFJBY5_cjs.isIsometricObject(object) ? sfl : duplicateShape(sfl, { object, links: state.links, side: direction, options });
7604
7655
  }
7605
7656
 
7606
7657
  // src/runtime/interaction/sflPatch/changes/resizeChange.ts
7607
7658
  function applyResizeChange(sfl, event) {
7608
- const state = chunkLSEMXRB5_cjs.sflToCanvasState(sfl);
7659
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7609
7660
  const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7610
7661
  const parent = canvasObject?.parentFrameId ? state.canvasObjects.find((candidate) => candidate.id === canvasObject.parentFrameId) : void 0;
7611
7662
  const originX = parent?.x ?? 0;
@@ -7795,6 +7846,7 @@ exports.applyChartValueChange = applyChartValueChange;
7795
7846
  exports.applyLinkReconnectChange = applyLinkReconnectChange;
7796
7847
  exports.applyLinkSegmentChange = applyLinkSegmentChange;
7797
7848
  exports.applyMoveChange = applyMoveChange;
7849
+ exports.applyMoveChanges = applyMoveChanges;
7798
7850
  exports.applyPathPointChange = applyPathPointChange;
7799
7851
  exports.applyPropertyChange = applyPropertyChange;
7800
7852
  exports.applyQuickDuplicateChange = applyQuickDuplicateChange;