stickyflow 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/CHANGELOG.md +14 -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-5PJ55GPG.cjs → chunk-5G3BEXQU.cjs} +1069 -713
  7. package/dist/chunk-5G3BEXQU.cjs.map +1 -0
  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-KRSX4UZ7.cjs → chunk-F24JURN2.cjs} +293 -46
  11. package/dist/chunk-F24JURN2.cjs.map +1 -0
  12. package/dist/{chunk-TECWZVIM.cjs → chunk-FXGXUWSI.cjs} +23 -23
  13. package/dist/{chunk-TECWZVIM.cjs.map → chunk-FXGXUWSI.cjs.map} +1 -1
  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-Q6QLU6YQ.js} +428 -72
  17. package/dist/chunk-Q6QLU6YQ.js.map +1 -0
  18. package/dist/{chunk-VPNOVRWP.js → chunk-RQYZNW2I.js} +262 -15
  19. package/dist/chunk-RQYZNW2I.js.map +1 -0
  20. package/dist/{chunk-L7CEX5JV.js → chunk-UB2ANTWF.js} +4 -4
  21. package/dist/{chunk-L7CEX5JV.js.map → chunk-UB2ANTWF.js.map} +1 -1
  22. package/dist/{chunk-LSEMXRB5.cjs → chunk-UHKFJBY5.cjs} +44 -7
  23. package/dist/chunk-UHKFJBY5.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 +240 -237
  31. package/dist/interaction/index.cjs.map +1 -1
  32. package/dist/interaction/index.d.cts +3 -3
  33. package/dist/interaction/index.d.ts +3 -3
  34. package/dist/interaction/index.js +6 -3
  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));
@@ -1709,7 +1709,7 @@ var ColorEditSession = class {
1709
1709
  const hasOverride = target.node.getAttribute("data-sf-color-override") === "true";
1710
1710
  this.#open = openColorPopover({
1711
1711
  seed: seedFrom(fill, readGradientValue(this.#svg, fill)),
1712
- anchor: chunkSCD3AHMY_cjs.screenRectOf(target.node),
1712
+ anchor: chunkWZA3DJJH_cjs.screenRectOf(target.node),
1713
1713
  theme: resolveTheme(this.#theme),
1714
1714
  allowGradient: !target.solidOnly,
1715
1715
  onCommit: (color) => {
@@ -1791,7 +1791,7 @@ function resolveTarget(event, selector, pathOf, rules) {
1791
1791
  return null;
1792
1792
  }
1793
1793
  const path = pathOf(node);
1794
- const owner = chunkSCD3AHMY_cjs.resolveOwner(node);
1794
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
1795
1795
  if (!path || !owner || !isEditablePath(path, rules) || requiresPriorSelection(node, owner)) {
1796
1796
  return null;
1797
1797
  }
@@ -1813,7 +1813,7 @@ function resolveZoneGradientTarget(event) {
1813
1813
  if (!node) {
1814
1814
  return null;
1815
1815
  }
1816
- const owner = chunkSCD3AHMY_cjs.resolveOwner(node);
1816
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
1817
1817
  if (!owner) {
1818
1818
  return null;
1819
1819
  }
@@ -1849,7 +1849,7 @@ var ZoneGradientSession = class {
1849
1849
  const beforeStops = sortStops(gradient.stops);
1850
1850
  this.#open = openColorPopover({
1851
1851
  seed: seedFrom(fill, gradient),
1852
- anchor: chunkSCD3AHMY_cjs.screenRectOf(target.node),
1852
+ anchor: chunkWZA3DJJH_cjs.screenRectOf(target.node),
1853
1853
  theme: resolveTheme(this.#theme),
1854
1854
  allowGradient: true,
1855
1855
  lockStops: true,
@@ -1922,15 +1922,15 @@ function bindDeleteSelection(viewer, emitter) {
1922
1922
  }
1923
1923
 
1924
1924
  // src/runtime/interaction/events.ts
1925
- var Emitter2 = class extends chunkSCD3AHMY_cjs.Emitter {
1925
+ var Emitter2 = class extends chunkWZA3DJJH_cjs.Emitter {
1926
1926
  };
1927
1927
 
1928
1928
  // src/runtime/interaction/linkPreview/geometry.ts
1929
1929
  function anchorPoint(bounds, side, other) {
1930
1930
  if (side) {
1931
- return chunkLSEMXRB5_cjs.pointAtPort(bounds, { side, offset: 0.5 });
1931
+ return chunkUHKFJBY5_cjs.pointAtPort(bounds, { side, offset: 0.5 });
1932
1932
  }
1933
- return chunkLSEMXRB5_cjs.edgePointToward(bounds, other);
1933
+ return chunkUHKFJBY5_cjs.edgePointToward(bounds, other);
1934
1934
  }
1935
1935
  function polylinePathData(points) {
1936
1936
  if (points.length < 4) {
@@ -1947,7 +1947,7 @@ function previewPathData(points, segments, pathType, strokeWidth) {
1947
1947
  return `M ${points[0]} ${points[1]} C ${points[2]} ${points[3]} ${points[4]} ${points[5]} ${points[6]} ${points[7]}`;
1948
1948
  }
1949
1949
  if (pathType === "orthogonal" && segments.length > 0) {
1950
- return chunkLSEMXRB5_cjs.roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));
1950
+ return chunkUHKFJBY5_cjs.roundedOrthogonalPathData(segments, Math.max(16, strokeWidth * 4));
1951
1951
  }
1952
1952
  return polylinePathData(points);
1953
1953
  }
@@ -1967,8 +1967,8 @@ function previewLink(fromSide, toSide) {
1967
1967
  function routePreviewLink(fromBounds, toBounds, fromSide, toSide, pathType) {
1968
1968
  const from = anchorPoint(fromBounds, fromSide, toBounds);
1969
1969
  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) };
1970
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), from, to, pathType);
1971
+ return { points, segments, midpoint: chunkUHKFJBY5_cjs.getLineMidpoint(points, pathType, from, to) };
1972
1972
  }
1973
1973
 
1974
1974
  // src/runtime/interaction/linkPreview/discovery.ts
@@ -2000,7 +2000,7 @@ function resolveOppositeEndpoint(svg, path, canvasObjectId) {
2000
2000
  if (!otherId) {
2001
2001
  return null;
2002
2002
  }
2003
- const otherPrimary = chunkSCD3AHMY_cjs.findOwnerNode(svg, otherId, chunkSCD3AHMY_cjs.isPrimary);
2003
+ const otherPrimary = chunkWZA3DJJH_cjs.findOwnerNode(svg, otherId, chunkWZA3DJJH_cjs.isPrimary);
2004
2004
  return otherPrimary ? { draggedIsFrom, bounds: otherPrimary.getBBox() } : null;
2005
2005
  }
2006
2006
  function captureLiveLinkLabel(svg, draft, draggedBounds) {
@@ -2047,8 +2047,8 @@ function resolveOtherFacePoint(svg, path, canvasObjectId) {
2047
2047
  if (!otherId || !face || !otherFace) {
2048
2048
  return null;
2049
2049
  }
2050
- const otherPrimary = chunkSCD3AHMY_cjs.findOwnerNode(svg, otherId, chunkSCD3AHMY_cjs.isPrimary);
2051
- const otherGeometry = otherPrimary && chunkSCD3AHMY_cjs.isometricGeometryOf(otherPrimary);
2050
+ const otherPrimary = chunkWZA3DJJH_cjs.findOwnerNode(svg, otherId, chunkWZA3DJJH_cjs.isPrimary);
2051
+ const otherGeometry = otherPrimary && chunkWZA3DJJH_cjs.isometricGeometryOf(otherPrimary);
2052
2052
  if (!otherGeometry?.bounds) {
2053
2053
  return null;
2054
2054
  }
@@ -2059,7 +2059,7 @@ function resolveOtherFacePoint(svg, path, canvasObjectId) {
2059
2059
  height: otherGeometry.height,
2060
2060
  depth: otherGeometry.depth
2061
2061
  };
2062
- return { otherPoint: chunkLSEMXRB5_cjs.isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };
2062
+ return { otherPoint: chunkUHKFJBY5_cjs.isometricFaceCenter(otherObject, otherFace), draggedIsFrom, face };
2063
2063
  }
2064
2064
  function findLiveFaceLinks(svg, canvasObjectId) {
2065
2065
  const escapedId = CSS.escape(canvasObjectId);
@@ -2078,7 +2078,7 @@ function findLiveFaceLinks(svg, canvasObjectId) {
2078
2078
 
2079
2079
  // src/runtime/interaction/linkPreview/faceUpdate.ts
2080
2080
  function updateLiveFaceLink(link, liveObject) {
2081
- const draggedPoint = chunkLSEMXRB5_cjs.isometricFaceCenter(liveObject, link.face);
2081
+ const draggedPoint = chunkUHKFJBY5_cjs.isometricFaceCenter(liveObject, link.face);
2082
2082
  const from = link.draggedIsFrom ? draggedPoint : link.otherPoint;
2083
2083
  const to = link.draggedIsFrom ? link.otherPoint : draggedPoint;
2084
2084
  link.path.setAttribute("d", `M ${from.x} ${from.y} L ${to.x} ${to.y}`);
@@ -2102,7 +2102,7 @@ function updateLabelGap(link, points) {
2102
2102
  if (!link.labelGapSize) {
2103
2103
  return;
2104
2104
  }
2105
- const gap = chunkLSEMXRB5_cjs.labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);
2105
+ const gap = chunkUHKFJBY5_cjs.labelGapDash(points, link.pathType, link.labelGapSize.width, link.labelGapSize.height);
2106
2106
  if (gap) {
2107
2107
  link.path.setAttribute("stroke-dasharray", `${gap.dashBefore} ${gap.gapLength} 1000000`);
2108
2108
  } else {
@@ -2148,11 +2148,11 @@ function readIsometricSnapStep(svg) {
2148
2148
  return step > 0 ? step : null;
2149
2149
  }
2150
2150
  function nearestIsometricLatticePoint(point, step) {
2151
- const u = point.x / (chunkLSEMXRB5_cjs.AXIS_COS * step);
2152
- const v = point.y / (chunkLSEMXRB5_cjs.AXIS_SIN * step);
2151
+ const u = point.x / (chunkUHKFJBY5_cjs.AXIS_COS * step);
2152
+ const v = point.y / (chunkUHKFJBY5_cjs.AXIS_SIN * step);
2153
2153
  const i = Math.round((u + v) / 2);
2154
2154
  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 };
2155
+ return { x: (i + j) * chunkUHKFJBY5_cjs.AXIS_COS * step, y: (i - j) * chunkUHKFJBY5_cjs.AXIS_SIN * step };
2156
2156
  }
2157
2157
  function snapToStep(value, step, min) {
2158
2158
  return Math.max(min, Math.round(value / step) * step);
@@ -2165,21 +2165,21 @@ var LABEL_FONT_SIZE = 12;
2165
2165
  var LABEL_LINE_HEIGHT = 1.2;
2166
2166
  var LABEL_BASELINE_OFFSET = -LABEL_GAP - LABEL_HEIGHT + (LABEL_HEIGHT - LABEL_FONT_SIZE * LABEL_LINE_HEIGHT) / 2 + LABEL_FONT_SIZE;
2167
2167
  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));
2168
+ const faces = chunkUHKFJBY5_cjs.isometricFaces(object);
2169
+ nodes.top?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.top, 0));
2170
+ nodes.front?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.front, 0));
2171
+ nodes.side?.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(faces.right, 0));
2172
2172
  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);
2173
+ const hullPath = chunkUHKFJBY5_cjs.roundedPolygonPath(silhouette, cornerRadius);
2174
2174
  nodes.hull?.setAttribute("d", hullPath);
2175
2175
  if (overlay.halo) {
2176
- chunkSCD3AHMY_cjs.updateHalo(overlay.halo, hullPath);
2176
+ chunkWZA3DJJH_cjs.updateHalo(overlay.halo, hullPath);
2177
2177
  }
2178
- const placements = chunkSCD3AHMY_cjs.axisArrowPlacements(object);
2178
+ const placements = chunkWZA3DJJH_cjs.axisArrowPlacements(object);
2179
2179
  Object.keys(placements).forEach((axis) => {
2180
2180
  const group = overlay.arrows[axis];
2181
2181
  if (group) {
2182
- chunkSCD3AHMY_cjs.updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);
2182
+ chunkWZA3DJJH_cjs.updateAxisArrowGroup(group, placements[axis].origin, placements[axis].direction, svg);
2183
2183
  }
2184
2184
  });
2185
2185
  nodes.seams?.setAttribute(
@@ -2197,9 +2197,9 @@ function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2197
2197
  x: footprintCenter.x + (point.x - footprintCenter.x) * shadowSpread,
2198
2198
  y: footprintCenter.y + (point.y - footprintCenter.y) * shadowSpread
2199
2199
  }));
2200
- nodes.groundShadow.setAttribute("d", chunkLSEMXRB5_cjs.roundedPolygonPath(footprint, 0));
2200
+ nodes.groundShadow.setAttribute("d", chunkUHKFJBY5_cjs.roundedPolygonPath(footprint, 0));
2201
2201
  }
2202
- const anchor = chunkLSEMXRB5_cjs.isometricTopFaceCenter(object);
2202
+ const anchor = chunkUHKFJBY5_cjs.isometricTopFaceCenter(object);
2203
2203
  if (nodes.labelGuide) {
2204
2204
  nodes.labelGuide.setAttribute("d", `M ${anchor.x} ${anchor.y - LABEL_GAP} L ${anchor.x} ${anchor.y}`);
2205
2205
  }
@@ -2215,7 +2215,7 @@ function applyIsometricAxisPreview(nodes, object, cornerRadius, overlay, svg) {
2215
2215
  // src/runtime/interaction/isometricAxisResize/state.ts
2216
2216
  var AXES = ["width", "height", "depth"];
2217
2217
  function collectNodes(svg, ownerId) {
2218
- const all = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, ownerId);
2218
+ const all = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, ownerId);
2219
2219
  const bySuffix = (suffix) => all.find((el2) => el2.id.endsWith(suffix)) ?? null;
2220
2220
  return {
2221
2221
  top: bySuffix("-top"),
@@ -2243,14 +2243,14 @@ function findResizeHandle(event) {
2243
2243
  return { captureTarget, axis: handleAttr.slice(4), overlay, ownerId };
2244
2244
  }
2245
2245
  function overlayPartsOf(overlay) {
2246
- const overlayHalo = overlay.querySelector(`[${chunkSCD3AHMY_cjs.ISO_HALO_ATTR}]`) ?? null;
2246
+ const overlayHalo = overlay.querySelector(`[${chunkWZA3DJJH_cjs.ISO_HALO_ATTR}]`) ?? null;
2247
2247
  const overlayArrows = Object.fromEntries(
2248
2248
  AXES.map((axis) => [
2249
2249
  axis,
2250
2250
  overlay.querySelector(`[data-sf-resize-handle="iso-${axis}"]`) ?? null
2251
2251
  ])
2252
2252
  );
2253
- const overlayDuplicateBubbles = overlay.querySelector(`[${chunkSCD3AHMY_cjs.ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
2253
+ const overlayDuplicateBubbles = overlay.querySelector(`[${chunkWZA3DJJH_cjs.ISO_DUPLICATE_BUBBLES_ATTR}]`) ?? null;
2254
2254
  if (overlayDuplicateBubbles) {
2255
2255
  overlayDuplicateBubbles.style.display = "none";
2256
2256
  }
@@ -2262,16 +2262,16 @@ function createIsometricAxisDragState(svg, event) {
2262
2262
  return null;
2263
2263
  }
2264
2264
  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);
2265
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
2266
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
2267
2267
  if (!primary || owner?.role !== "isometric") {
2268
2268
  return null;
2269
2269
  }
2270
- const startUser = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
2270
+ const startUser = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
2271
2271
  if (!startUser) {
2272
2272
  return null;
2273
2273
  }
2274
- const geometry = chunkSCD3AHMY_cjs.isometricGeometryOf(primary);
2274
+ const geometry = chunkWZA3DJJH_cjs.isometricGeometryOf(primary);
2275
2275
  const bounds = geometry?.bounds ?? primary.getBBox();
2276
2276
  const nodes = collectNodes(svg, ownerId);
2277
2277
  [nodes.top, nodes.front, nodes.side].forEach((node) => {
@@ -2291,7 +2291,7 @@ function createIsometricAxisDragState(svg, event) {
2291
2291
  pointerId: event.pointerId,
2292
2292
  startUser,
2293
2293
  start,
2294
- cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(chunkLSEMXRB5_cjs.CORNER_RADIUS_ATTR)) ?? 0,
2294
+ cornerRadius: geometry?.cornerRadius ?? Number(primary.getAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR)) ?? 0,
2295
2295
  nodes,
2296
2296
  ...overlayPartsOf(overlay),
2297
2297
  liveFaceLinks: findLiveFaceLinks(svg, ownerId),
@@ -2308,15 +2308,15 @@ function nextGeometry(drag, point, step) {
2308
2308
  const dx = point.x - drag.startUser.x;
2309
2309
  const dy = point.y - drag.startUser.y;
2310
2310
  if (axis === "width") {
2311
- const delta2 = dx * chunkLSEMXRB5_cjs.AXIS_COS + dy * chunkLSEMXRB5_cjs.AXIS_SIN;
2311
+ const delta2 = dx * chunkUHKFJBY5_cjs.AXIS_COS + dy * chunkUHKFJBY5_cjs.AXIS_SIN;
2312
2312
  return { ...start, width: length(start.width + delta2, MIN_SIZE) };
2313
2313
  }
2314
2314
  if (axis === "height") {
2315
2315
  return { ...start, height: length(start.height + dy, MIN_SIZE) };
2316
2316
  }
2317
- const delta = -dx * chunkLSEMXRB5_cjs.AXIS_COS + dy * chunkLSEMXRB5_cjs.AXIS_SIN;
2317
+ const delta = -dx * chunkUHKFJBY5_cjs.AXIS_COS + dy * chunkUHKFJBY5_cjs.AXIS_SIN;
2318
2318
  const depth = length(start.depth + delta, 0);
2319
- const x = start.x + (start.depth - depth) * chunkLSEMXRB5_cjs.AXIS_COS;
2319
+ const x = start.x + (start.depth - depth) * chunkUHKFJBY5_cjs.AXIS_COS;
2320
2320
  return { ...start, x, depth };
2321
2321
  }
2322
2322
  var IsometricAxisResizeSession = class {
@@ -2328,7 +2328,7 @@ var IsometricAxisResizeSession = class {
2328
2328
  this.#emitter = emitter;
2329
2329
  }
2330
2330
  pointerDown = (event) => {
2331
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
2331
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2332
2332
  return;
2333
2333
  }
2334
2334
  this.#drag = createIsometricAxisDragState(this.#svg, event);
@@ -2338,7 +2338,7 @@ var IsometricAxisResizeSession = class {
2338
2338
  if (!drag || event.pointerId !== drag.pointerId) {
2339
2339
  return;
2340
2340
  }
2341
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
2341
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
2342
2342
  if (!point) {
2343
2343
  return;
2344
2344
  }
@@ -2436,7 +2436,7 @@ function findLabelMark(event) {
2436
2436
  );
2437
2437
  }
2438
2438
  function isLabelPointer(event) {
2439
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
2439
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
2440
2440
  }
2441
2441
  function findHull(svg, ownerId) {
2442
2442
  return svg.querySelector(`[data-sf-id="${CSS.escape(ownerId)}"][data-sf-primary="true"]`);
@@ -2452,21 +2452,21 @@ function resolveIsometricLabelDrag(svg, event) {
2452
2452
  if (!clicked) {
2453
2453
  return null;
2454
2454
  }
2455
- const owner = chunkSCD3AHMY_cjs.resolveOwner(clicked);
2455
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(clicked);
2456
2456
  if (owner?.role !== "isometric") {
2457
2457
  return null;
2458
2458
  }
2459
2459
  const hull = findHull(svg, owner.id);
2460
- const geometry = hull ? chunkSCD3AHMY_cjs.isometricGeometryOf(hull) : null;
2460
+ const geometry = hull ? chunkWZA3DJJH_cjs.isometricGeometryOf(hull) : null;
2461
2461
  if (!geometry?.bounds) {
2462
2462
  return null;
2463
2463
  }
2464
- const start = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
2464
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
2465
2465
  if (!start) {
2466
2466
  return null;
2467
2467
  }
2468
2468
  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;
2469
+ const anchorY = geometry.bounds.y + geometry.bounds.width * (chunkUHKFJBY5_cjs.AXIS_SIN / chunkUHKFJBY5_cjs.AXIS_COS) / 2;
2470
2470
  const text = findBySuffix(svg, `-${owner.id}-label`);
2471
2471
  if (!text) {
2472
2472
  return null;
@@ -2518,7 +2518,7 @@ var IsometricLabelDragSession = class {
2518
2518
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
2519
2519
  return;
2520
2520
  }
2521
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
2521
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
2522
2522
  if (!point) {
2523
2523
  return;
2524
2524
  }
@@ -2593,7 +2593,7 @@ function isIsometricDirection(value) {
2593
2593
  function bindIsometricQuickDuplicate(viewer, emitter) {
2594
2594
  const svg = viewer.svg;
2595
2595
  const onPointerDown = (event) => {
2596
- if (event.button !== 0 || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
2596
+ if (event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2597
2597
  return;
2598
2598
  }
2599
2599
  const bubble = event.target?.closest("[data-sf-quick-duplicate]");
@@ -2604,7 +2604,7 @@ function bindIsometricQuickDuplicate(viewer, emitter) {
2604
2604
  const overlay = bubble.closest("[data-sf-selection-overlay]");
2605
2605
  const sourceId = overlay?.getAttribute("data-sf-selection-overlay");
2606
2606
  const primary = sourceId ? svg.querySelector(`[data-sf-id="${CSS.escape(sourceId)}"][data-sf-primary="true"]`) : null;
2607
- const owner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
2607
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
2608
2608
  if (!owner) {
2609
2609
  return;
2610
2610
  }
@@ -2659,7 +2659,7 @@ function updateEndpointPreview(drag, draggedPoint, draggedSide) {
2659
2659
  const toPoint = drag.end === "to" ? draggedPoint : drag.fixedPoint;
2660
2660
  const fromSide = drag.end === "from" ? draggedSide : drag.fixedSide;
2661
2661
  const toSide = drag.end === "to" ? draggedSide : drag.fixedSide;
2662
- const { points, segments } = chunkLSEMXRB5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);
2662
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(previewLink(fromSide, toSide), fromPoint, toPoint, drag.pathType);
2663
2663
  drag.path.setAttribute("d", previewPathData(points, segments, drag.pathType, drag.strokeWidth));
2664
2664
  }
2665
2665
 
@@ -2681,7 +2681,7 @@ var LinkGhost = class {
2681
2681
  constructor(svg, path) {
2682
2682
  this.#svg = svg;
2683
2683
  this.#path = path;
2684
- this.#anchors = svg.ownerDocument.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "g");
2684
+ this.#anchors = svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "g");
2685
2685
  this.#anchors.setAttribute("data-sf-link-target", "");
2686
2686
  this.#anchors.setAttribute("pointer-events", "none");
2687
2687
  }
@@ -2691,7 +2691,7 @@ var LinkGhost = class {
2691
2691
  for (const name of RESTORED_ATTRIBUTES) {
2692
2692
  this.#saved.set(name, this.#path.getAttribute(name));
2693
2693
  }
2694
- const dash = GHOST_DASH_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
2694
+ const dash = GHOST_DASH_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
2695
2695
  this.#path.setAttribute("stroke-dasharray", `${dash} ${dash}`);
2696
2696
  this.#path.setAttribute("stroke-linecap", "round");
2697
2697
  this.#path.setAttribute("opacity", GHOST_OPACITY);
@@ -2720,7 +2720,7 @@ var LinkGhost = class {
2720
2720
  if (!bounds) {
2721
2721
  return;
2722
2722
  }
2723
- const unit = 1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
2723
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
2724
2724
  const centers = [
2725
2725
  [bounds.x + bounds.width / 2, bounds.y],
2726
2726
  [bounds.x + bounds.width, bounds.y + bounds.height / 2],
@@ -2728,7 +2728,7 @@ var LinkGhost = class {
2728
2728
  [bounds.x, bounds.y + bounds.height / 2]
2729
2729
  ];
2730
2730
  for (const [cx, cy] of centers) {
2731
- const dot = this.#svg.ownerDocument.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "circle");
2731
+ const dot = this.#svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "circle");
2732
2732
  dot.setAttribute("cx", String(cx));
2733
2733
  dot.setAttribute("cy", String(cy));
2734
2734
  dot.setAttribute("r", String(ANCHOR_RADIUS_PX * unit));
@@ -2748,7 +2748,7 @@ function collectEndpointCandidates(svg) {
2748
2748
  if (element2.getAttribute("data-sf-role") === "link") {
2749
2749
  continue;
2750
2750
  }
2751
- const owner = chunkSCD3AHMY_cjs.resolveOwner(element2);
2751
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
2752
2752
  if (owner) {
2753
2753
  candidates.push({ owner, bounds: element2.getBBox() });
2754
2754
  }
@@ -2825,7 +2825,7 @@ function inferFixedSide(svg, reference, fixedPrimary) {
2825
2825
  if (reference.declaredSide) {
2826
2826
  return reference.declaredSide;
2827
2827
  }
2828
- const draggedPrimary = reference.draggedId ? chunkSCD3AHMY_cjs.findOwnerNode(svg, reference.draggedId, chunkSCD3AHMY_cjs.isPrimary) : null;
2828
+ const draggedPrimary = reference.draggedId ? chunkWZA3DJJH_cjs.findOwnerNode(svg, reference.draggedId, chunkWZA3DJJH_cjs.isPrimary) : null;
2829
2829
  if (!draggedPrimary) {
2830
2830
  return "right";
2831
2831
  }
@@ -2833,7 +2833,7 @@ function inferFixedSide(svg, reference, fixedPrimary) {
2833
2833
  }
2834
2834
  function resolveFixedEndpoint(svg, path, draggedEnd) {
2835
2835
  const reference = fixedEndpointReference(path, draggedEnd);
2836
- const fixedPrimary = reference.fixedId ? chunkSCD3AHMY_cjs.findOwnerNode(svg, reference.fixedId, chunkSCD3AHMY_cjs.isPrimary) : null;
2836
+ const fixedPrimary = reference.fixedId ? chunkWZA3DJJH_cjs.findOwnerNode(svg, reference.fixedId, chunkWZA3DJJH_cjs.isPrimary) : null;
2837
2837
  if (!fixedPrimary) {
2838
2838
  return null;
2839
2839
  }
@@ -2852,8 +2852,8 @@ function selectLinkEndpoint(svg, event) {
2852
2852
  if (!target || !end || !linkId) {
2853
2853
  return null;
2854
2854
  }
2855
- const path = chunkSCD3AHMY_cjs.findOwnerNode(svg, linkId, chunkSCD3AHMY_cjs.isPrimary);
2856
- const linkOwner = path && chunkSCD3AHMY_cjs.resolveOwner(path);
2855
+ const path = chunkWZA3DJJH_cjs.findOwnerNode(svg, linkId, chunkWZA3DJJH_cjs.isPrimary);
2856
+ const linkOwner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
2857
2857
  if (!path || !linkOwner) {
2858
2858
  return null;
2859
2859
  }
@@ -2895,8 +2895,8 @@ function nearestPort(bounds, point) {
2895
2895
  let nearest = { side: "right", offset: 0.5 };
2896
2896
  let nearestDistance = Infinity;
2897
2897
  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 });
2898
+ const offset = Math.max(0, Math.min(1, chunkUHKFJBY5_cjs.relativeOffsetOnRectangleSide(bounds, side, point)));
2899
+ const candidate = chunkUHKFJBY5_cjs.pointAtPort(bounds, { side, offset });
2900
2900
  const distance = Math.hypot(candidate.x - point.x, candidate.y - point.y);
2901
2901
  if (distance < nearestDistance) {
2902
2902
  nearestDistance = distance;
@@ -2955,7 +2955,7 @@ function resolveLinkTarget(candidates, fixedPoint, point, unitsPerPx) {
2955
2955
  }
2956
2956
  const port = snapPort(candidate.bounds, point, unitsPerPx);
2957
2957
  return {
2958
- point: chunkLSEMXRB5_cjs.pointAtPort(candidate.bounds, port),
2958
+ point: chunkUHKFJBY5_cjs.pointAtPort(candidate.bounds, port),
2959
2959
  side: port.side,
2960
2960
  hit: { owner: candidate.owner, side: port.side, offset: port.offset },
2961
2961
  bounds: candidate.bounds
@@ -2979,7 +2979,7 @@ var LinkEndpointSession = class {
2979
2979
  this.#emitter = emitter;
2980
2980
  }
2981
2981
  pointerDown = (event) => {
2982
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
2982
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
2983
2983
  return;
2984
2984
  }
2985
2985
  this.#drag = createLinkEndpointDragState(this.#svg, event);
@@ -2993,7 +2993,7 @@ var LinkEndpointSession = class {
2993
2993
  return;
2994
2994
  }
2995
2995
  drag.moved = true;
2996
- const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg));
2996
+ const target = resolveEndpointTarget(drag, endpointPointerPosition(this.#svg, event), 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg));
2997
2997
  updateEndpointPreview(drag, target.point, target.side);
2998
2998
  drag.ghost.show(target.hit !== null, target.bounds);
2999
2999
  };
@@ -3107,7 +3107,7 @@ var LinkSegmentSession = class {
3107
3107
  this.#emitter = emitter;
3108
3108
  }
3109
3109
  pointerDown = (event) => {
3110
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
3110
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3111
3111
  return;
3112
3112
  }
3113
3113
  const target = event.target;
@@ -3117,12 +3117,12 @@ var LinkSegmentSession = class {
3117
3117
  if (!handle || !overlay || !linkId) {
3118
3118
  return;
3119
3119
  }
3120
- const path = chunkSCD3AHMY_cjs.findOwnerNode(this.#svg, linkId, chunkSCD3AHMY_cjs.isPrimary);
3121
- const owner = path && chunkSCD3AHMY_cjs.resolveOwner(path);
3120
+ const path = chunkWZA3DJJH_cjs.findOwnerNode(this.#svg, linkId, chunkWZA3DJJH_cjs.isPrimary);
3121
+ const owner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
3122
3122
  const index = Number(handle.getAttribute("data-sf-link-segment"));
3123
3123
  const segments = path ? parseSegments(path) : [];
3124
3124
  const segment = segments[index];
3125
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
3125
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
3126
3126
  if (!path || !owner || !segment || !point) {
3127
3127
  return;
3128
3128
  }
@@ -3130,7 +3130,7 @@ var LinkSegmentSession = class {
3130
3130
  const guide = document.createElementNS(SVG_NAMESPACE2, "line");
3131
3131
  guide.setAttribute("stroke", GUIDE_COLOR);
3132
3132
  guide.setAttribute("stroke-dasharray", "4 4");
3133
- guide.setAttribute("stroke-width", String(1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg)));
3133
+ guide.setAttribute("stroke-width", String(1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg)));
3134
3134
  guide.setAttribute("visibility", "hidden");
3135
3135
  overlay.appendChild(guide);
3136
3136
  handle.setPointerCapture?.(event.pointerId);
@@ -3165,7 +3165,7 @@ var LinkSegmentSession = class {
3165
3165
  return;
3166
3166
  }
3167
3167
  drag.moved = true;
3168
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
3168
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
3169
3169
  if (!point) {
3170
3170
  return;
3171
3171
  }
@@ -3191,8 +3191,8 @@ var LinkSegmentSession = class {
3191
3191
  doubleClick = (event) => {
3192
3192
  const handle = event.target?.closest("[data-sf-link-segment]");
3193
3193
  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);
3194
+ const path = linkId ? chunkWZA3DJJH_cjs.findOwnerNode(this.#svg, linkId, chunkWZA3DJJH_cjs.isPrimary) : null;
3195
+ const owner = path && chunkWZA3DJJH_cjs.resolveOwner(path);
3196
3196
  if (!handle || !owner) {
3197
3197
  return;
3198
3198
  }
@@ -3215,7 +3215,7 @@ var LinkSegmentSession = class {
3215
3215
  if (isSnapDisabled(this.#svg)) {
3216
3216
  return { value: raw, snapped: null };
3217
3217
  }
3218
- const threshold = SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
3218
+ const threshold = SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
3219
3219
  let best = null;
3220
3220
  for (const candidate of [drag.base, ...drag.candidates]) {
3221
3221
  const closer = best === null || Math.abs(candidate - raw) < Math.abs(best - raw);
@@ -3228,7 +3228,7 @@ var LinkSegmentSession = class {
3228
3228
  #preview(drag, snapped) {
3229
3229
  const next = movedSegments(drag, drag.value);
3230
3230
  const strokeWidth = Number(drag.path.getAttribute("stroke-width")) || 2;
3231
- const data = chunkLSEMXRB5_cjs.roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));
3231
+ const data = chunkUHKFJBY5_cjs.roundedOrthogonalPathData(pathSegments(next), Math.max(16, strokeWidth * 4));
3232
3232
  drag.path.setAttribute("d", data);
3233
3233
  drag.overlay.querySelector("path")?.setAttribute("d", data);
3234
3234
  const segment = next[drag.index];
@@ -3402,8 +3402,8 @@ function nearestCandidates(bounds, candidates, limit = 50) {
3402
3402
 
3403
3403
  // src/runtime/interaction/snapping/isometricDiagonal.ts
3404
3404
  var AXES2 = [
3405
- { x: chunkLSEMXRB5_cjs.AXIS_COS, y: chunkLSEMXRB5_cjs.AXIS_SIN },
3406
- { x: -chunkLSEMXRB5_cjs.AXIS_COS, y: chunkLSEMXRB5_cjs.AXIS_SIN }
3405
+ { x: chunkUHKFJBY5_cjs.AXIS_COS, y: chunkUHKFJBY5_cjs.AXIS_SIN },
3406
+ { x: -chunkUHKFJBY5_cjs.AXIS_COS, y: chunkUHKFJBY5_cjs.AXIS_SIN }
3407
3407
  ];
3408
3408
  var GUIDE_OVERHANG = 40;
3409
3409
  function snapIsometricDiagonal(apex, rawDx, rawDy, candidates, threshold) {
@@ -3471,13 +3471,13 @@ function isometricApexOf(svg, drag, declared = false) {
3471
3471
  if (lead.owner.role !== "isometric") {
3472
3472
  return null;
3473
3473
  }
3474
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, lead.owner.id, chunkSCD3AHMY_cjs.isPrimary);
3475
- const geometry = primary && chunkSCD3AHMY_cjs.isometricGeometryOf(primary);
3474
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, lead.owner.id, chunkWZA3DJJH_cjs.isPrimary);
3475
+ const geometry = primary && chunkWZA3DJJH_cjs.isometricGeometryOf(primary);
3476
3476
  if (!geometry) {
3477
3477
  return null;
3478
3478
  }
3479
3479
  const frame = declared && geometry.bounds ? geometry.bounds : lead.draggedBounds;
3480
- return { x: frame.x + geometry.depth * chunkLSEMXRB5_cjs.AXIS_COS, y: frame.y };
3480
+ return { x: frame.x + geometry.depth * chunkUHKFJBY5_cjs.AXIS_COS, y: frame.y };
3481
3481
  }
3482
3482
  function snapIsometricGrid(svg, drag, rawDx, rawDy) {
3483
3483
  const step = readIsometricSnapStep(svg);
@@ -3494,8 +3494,8 @@ function snapIsometricMove(svg, drag, rawDx, rawDy) {
3494
3494
  return null;
3495
3495
  }
3496
3496
  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));
3497
+ const candidates = chunkWZA3DJJH_cjs.findIsometricApexCandidates(svg, excludedIds);
3498
+ const snap = snapIsometricDiagonal(apex, rawDx, rawDy, candidates, snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg));
3499
3499
  return snap ? { dx: snap.dx, dy: snap.dy, guides: [snap.guide] } : null;
3500
3500
  }
3501
3501
  function snapMove(svg, drag, rawDx, rawDy) {
@@ -3512,9 +3512,9 @@ function snapMove(svg, drag, rawDx, rawDy) {
3512
3512
  }
3513
3513
  const leadBounds = offsetBounds(drag.canvasObjects[0].draggedBounds, rawDx, rawDy);
3514
3514
  const excludedIds = new Set(drag.canvasObjects.map((canvasObject) => canvasObject.owner.id));
3515
- const candidates = nearestCandidates(leadBounds, chunkSCD3AHMY_cjs.findSnapCandidateBounds(svg, excludedIds));
3515
+ const candidates = nearestCandidates(leadBounds, chunkWZA3DJJH_cjs.findSnapCandidateBounds(svg, excludedIds));
3516
3516
  const snap = computeSnap(leadBounds, candidates, {
3517
- threshold: snapDistancePx(svg) / chunkSCD3AHMY_cjs.pxPerUnit(svg),
3517
+ threshold: snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg),
3518
3518
  activeX: MOVE_ACTIVE_POINTS,
3519
3519
  activeY: MOVE_ACTIVE_POINTS,
3520
3520
  guideOverhang: GUIDE_OVERHANG2
@@ -3575,7 +3575,7 @@ function isCompositeOwner(owner) {
3575
3575
  return owner !== null && owner !== void 0 && COMPOSITE_ROLES.has(owner.role);
3576
3576
  }
3577
3577
  function hasDerivedHeight(owner) {
3578
- return owner !== null && owner !== void 0 && chunkSCD3AHMY_cjs.DERIVED_HEIGHT_ROLES.has(owner.role);
3578
+ return owner !== null && owner !== void 0 && chunkWZA3DJJH_cjs.DERIVED_HEIGHT_ROLES.has(owner.role);
3579
3579
  }
3580
3580
 
3581
3581
  // src/runtime/interaction/move/canvasObjectCapture.ts
@@ -3596,7 +3596,7 @@ function parentContainerBounds(svg, primary, groupIds) {
3596
3596
  if (!parentId || groupIds.has(parentId)) {
3597
3597
  return void 0;
3598
3598
  }
3599
- const container = chunkSCD3AHMY_cjs.findOwnerNode(svg, parentId, chunkSCD3AHMY_cjs.isPrimary);
3599
+ const container = chunkWZA3DJJH_cjs.findOwnerNode(svg, parentId, chunkWZA3DJJH_cjs.isPrimary);
3600
3600
  if (!container) {
3601
3601
  return void 0;
3602
3602
  }
@@ -3604,14 +3604,14 @@ function parentContainerBounds(svg, primary, groupIds) {
3604
3604
  return { x: bbox.x, y: bbox.y, width: bbox.width, height: bbox.height };
3605
3605
  }
3606
3606
  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);
3607
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, owner.id);
3608
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary);
3609
3609
  if (!nodes.length || !primary) {
3610
3610
  return null;
3611
3611
  }
3612
3612
  const overlays = [...svg.querySelectorAll(`[data-sf-selection-overlay="${CSS.escape(owner.id)}"]`)];
3613
3613
  const draggedBounds = primary.getBBox();
3614
- const isometricGeometry = owner.role === "isometric" ? chunkSCD3AHMY_cjs.isometricGeometryOf(primary) : null;
3614
+ const isometricGeometry = owner.role === "isometric" ? chunkWZA3DJJH_cjs.isometricGeometryOf(primary) : null;
3615
3615
  const isometricSize = isometricGeometry ? { width: isometricGeometry.width, height: isometricGeometry.height, depth: isometricGeometry.depth } : void 0;
3616
3616
  return {
3617
3617
  owner,
@@ -3653,7 +3653,7 @@ function captureInternalLinks(svg, groupIds) {
3653
3653
  if (!linkId || !belongsToMoveGroup(path, groupIds)) {
3654
3654
  continue;
3655
3655
  }
3656
- const nodes = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, linkId);
3656
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, linkId);
3657
3657
  if (nodes.length) {
3658
3658
  links.push({ nodes, baseTransforms: nodes.map((node) => node.getAttribute("transform")) });
3659
3659
  }
@@ -3687,7 +3687,7 @@ function containedChildren(viewer, owner) {
3687
3687
  return [];
3688
3688
  }
3689
3689
  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);
3690
+ return [...nodes].map((node) => chunkWZA3DJJH_cjs.resolveOwner(node)).filter((ref) => ref !== null);
3691
3691
  }
3692
3692
  function selectedMoveGroup(viewer, owner) {
3693
3693
  const selection = viewer.getSelection();
@@ -3704,7 +3704,7 @@ function isChartInteractiveMark(target) {
3704
3704
  }
3705
3705
  function createMoveDragState(viewer, event, startUser) {
3706
3706
  const target = event.target;
3707
- const owner = chunkSCD3AHMY_cjs.resolveOwner(target);
3707
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(target);
3708
3708
  if (!hasMovableGeometry(owner) || isChartInteractiveMark(target)) {
3709
3709
  return null;
3710
3710
  }
@@ -3738,7 +3738,7 @@ var MoveSession = class {
3738
3738
  this.#emitter = emitter;
3739
3739
  }
3740
3740
  pointerDown = (event) => {
3741
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
3741
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
3742
3742
  return;
3743
3743
  }
3744
3744
  this.#drag = createMoveDragState(this.#viewer, event, movePointerPosition(this.#svg, event));
@@ -3756,7 +3756,7 @@ var MoveSession = class {
3756
3756
  const delta = snapMove(this.#svg, drag, rawDelta.dx, rawDelta.dy);
3757
3757
  const clamped = clampMoveDelta(drag.canvasObjects, delta.dx, delta.dy);
3758
3758
  applyMovePreview(drag, clamped.dx, clamped.dy);
3759
- chunkSCD3AHMY_cjs.updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);
3759
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, delta.guides, MOVE_GUIDE_COLOR);
3760
3760
  };
3761
3761
  pointerUp = (event) => {
3762
3762
  const drag = this.#drag;
@@ -3765,7 +3765,7 @@ var MoveSession = class {
3765
3765
  }
3766
3766
  this.#drag = null;
3767
3767
  event.target.releasePointerCapture?.(drag.pointerId);
3768
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
3768
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
3769
3769
  emitMoveCompletion(this.#svg, this.#emitter, drag, event);
3770
3770
  };
3771
3771
  cancel() {
@@ -3911,9 +3911,9 @@ var START_POINT_RADIUS_PX = 6;
3911
3911
  var POINT_STROKE_WIDTH_PX = 1.5;
3912
3912
  function createPathDrawPreview(svg) {
3913
3913
  const document2 = svg.ownerDocument;
3914
- const group = document2.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "g");
3914
+ const group = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "g");
3915
3915
  group.setAttribute("pointer-events", "none");
3916
- const line = document2.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "path");
3916
+ const line = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "path");
3917
3917
  line.setAttribute("fill", "none");
3918
3918
  line.setAttribute("stroke", PREVIEW_COLOR);
3919
3919
  line.setAttribute("stroke-linecap", "round");
@@ -3923,8 +3923,8 @@ function createPathDrawPreview(svg) {
3923
3923
  }
3924
3924
  function pointMarker(svg, point, highlighted) {
3925
3925
  const document2 = svg.ownerDocument;
3926
- const unit = 1 / chunkSCD3AHMY_cjs.pxPerUnit(svg);
3927
- const circle = document2.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "circle");
3926
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(svg);
3927
+ const circle = document2.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "circle");
3928
3928
  circle.setAttribute("cx", String(point.x));
3929
3929
  circle.setAttribute("cy", String(point.y));
3930
3930
  circle.setAttribute("r", String((highlighted ? START_POINT_RADIUS_PX : POINT_RADIUS_PX) * unit));
@@ -3938,11 +3938,11 @@ function updatePathDrawPreview(svg, state) {
3938
3938
  if (!previewLine || !previewGroup) {
3939
3939
  return;
3940
3940
  }
3941
- const unit = 1 / chunkSCD3AHMY_cjs.pxPerUnit(svg);
3941
+ const unit = 1 / chunkWZA3DJJH_cjs.pxPerUnit(svg);
3942
3942
  previewLine.setAttribute("stroke-width", String(LINE_WIDTH_PX * unit));
3943
3943
  previewLine.setAttribute("stroke-dasharray", `${DASH_PX * unit} ${GAP_PX * unit}`);
3944
3944
  const live = state.cursor ? [...state.points, state.cursor] : state.points;
3945
- previewLine.setAttribute("d", chunkLSEMXRB5_cjs.freeformPathData({ points: live, tension: state.tension, closed: false }));
3945
+ previewLine.setAttribute("d", chunkUHKFJBY5_cjs.freeformPathData({ points: live, tension: state.tension, closed: false }));
3946
3946
  while (previewGroup.childNodes.length > 1) {
3947
3947
  previewGroup.lastChild?.remove();
3948
3948
  }
@@ -4002,12 +4002,12 @@ var PathDrawSession = class {
4002
4002
  }
4003
4003
  }
4004
4004
  pointerDown = (event) => {
4005
- if (!this.#state.active || event.button !== 0 || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
4005
+ if (!this.#state.active || event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4006
4006
  return;
4007
4007
  }
4008
4008
  event.stopPropagation();
4009
4009
  event.preventDefault();
4010
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4010
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4011
4011
  if (!point) {
4012
4012
  return;
4013
4013
  }
@@ -4026,14 +4026,14 @@ var PathDrawSession = class {
4026
4026
  this.#state.cursor = resolved.point;
4027
4027
  this.#state.willClose = false;
4028
4028
  updatePathDrawPreview(this.#svg, this.#state);
4029
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4029
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4030
4030
  };
4031
4031
  pointerMove = (event) => {
4032
4032
  if (!this.#state.active) {
4033
4033
  return;
4034
4034
  }
4035
4035
  event.stopPropagation();
4036
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4036
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4037
4037
  if (!point) {
4038
4038
  return;
4039
4039
  }
@@ -4042,9 +4042,9 @@ var PathDrawSession = class {
4042
4042
  this.#state.willClose = resolved.willClose;
4043
4043
  updatePathDrawPreview(this.#svg, this.#state);
4044
4044
  if (resolved.guide) {
4045
- chunkSCD3AHMY_cjs.updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR2);
4045
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, [resolved.guide], GUIDE_COLOR2);
4046
4046
  } else {
4047
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4047
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4048
4048
  }
4049
4049
  };
4050
4050
  pointerUp = (event) => {
@@ -4079,10 +4079,10 @@ var PathDrawSession = class {
4079
4079
  } else if (event.key === "Backspace" && this.#state.points.length > 0) {
4080
4080
  event.preventDefault();
4081
4081
  this.#state.points = this.#state.points.slice(0, -1);
4082
- const closeSnapUnits = CLOSE_SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
4082
+ const closeSnapUnits = CLOSE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4083
4083
  this.#state.willClose = this.#state.cursor ? isCloseToStart(this.#state.points, this.#state.cursor, closeSnapUnits) : false;
4084
4084
  updatePathDrawPreview(this.#svg, this.#state);
4085
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4085
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4086
4086
  }
4087
4087
  };
4088
4088
  keyUp = (event) => {
@@ -4091,7 +4091,7 @@ var PathDrawSession = class {
4091
4091
  }
4092
4092
  };
4093
4093
  #resolvePoint(raw) {
4094
- const closeSnapUnits = CLOSE_SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
4094
+ const closeSnapUnits = CLOSE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4095
4095
  if (isCloseToStart(this.#state.points, raw, closeSnapUnits)) {
4096
4096
  return { point: this.#state.points[0], willClose: true, guide: null };
4097
4097
  }
@@ -4101,7 +4101,7 @@ var PathDrawSession = class {
4101
4101
  return { point: raw, willClose: false, guide: null };
4102
4102
  }
4103
4103
  const angleSnapped = snapTo45Degrees(last, raw);
4104
- const guideSnapUnits = GUIDE_SNAP_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg);
4104
+ const guideSnapUnits = GUIDE_SNAP_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg);
4105
4105
  const { point, guide } = snapToSessionGuides(last, angleSnapped, points.slice(0, -1), raw, guideSnapUnits);
4106
4106
  return { point, willClose: false, guide };
4107
4107
  }
@@ -4115,7 +4115,7 @@ var PathDrawSession = class {
4115
4115
  }
4116
4116
  #reset(callExit) {
4117
4117
  this.#state.previewGroup?.remove();
4118
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
4118
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
4119
4119
  const exit = this.#state.onExit;
4120
4120
  this.#state = createIdlePathDrawState();
4121
4121
  this.#shiftHeld = false;
@@ -4158,7 +4158,7 @@ function applyPathReshapePreview(drag, point) {
4158
4158
  const points = drag.points.map(
4159
4159
  (existing, index) => index === drag.pointIndex ? [point.x, point.y] : existing
4160
4160
  );
4161
- const d = chunkLSEMXRB5_cjs.freeformPathData({
4161
+ const d = chunkUHKFJBY5_cjs.freeformPathData({
4162
4162
  points: points.map(([x, y]) => ({ x, y })),
4163
4163
  tension: drag.tension,
4164
4164
  closed: drag.closed
@@ -4166,22 +4166,22 @@ function applyPathReshapePreview(drag, point) {
4166
4166
  drag.pathNode.setAttribute("d", d);
4167
4167
  drag.handle.setAttribute("cx", String(point.x));
4168
4168
  drag.handle.setAttribute("cy", String(point.y));
4169
- drag.overlay?.querySelector(`[${chunkSCD3AHMY_cjs.PATH_HALO_ATTR}]`)?.setAttribute("d", d);
4169
+ drag.overlay?.querySelector(`[${chunkWZA3DJJH_cjs.PATH_HALO_ATTR}]`)?.setAttribute("d", d);
4170
4170
  return points;
4171
4171
  }
4172
4172
 
4173
4173
  // src/runtime/interaction/pathReshape/target.ts
4174
4174
  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;
4175
+ const handle = event.target?.closest?.(`[${chunkUHKFJBY5_cjs.PATH_POINT_INDEX_ATTR}]`) ?? null;
4176
+ const indexAttr = handle?.getAttribute(chunkUHKFJBY5_cjs.PATH_POINT_INDEX_ATTR) ?? null;
4177
4177
  const pointIndex = indexAttr !== null ? Number(indexAttr) : Number.NaN;
4178
4178
  const ownerId = handle?.closest("[data-sf-selection-overlay]")?.getAttribute("data-sf-selection-overlay");
4179
4179
  if (!handle || !Number.isInteger(pointIndex) || !ownerId) {
4180
4180
  return null;
4181
4181
  }
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);
4182
+ const pathNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
4183
+ const owner = pathNode && chunkWZA3DJJH_cjs.resolveOwner(pathNode);
4184
+ const geometry = pathNode && chunkWZA3DJJH_cjs.pathGeometryOf(pathNode);
4185
4185
  if (!pathNode || !owner || !geometry || pointIndex < 0 || pointIndex >= geometry.points.length) {
4186
4186
  return null;
4187
4187
  }
@@ -4224,7 +4224,7 @@ var PathReshapeSession = class {
4224
4224
  this.#emitter = emitter;
4225
4225
  }
4226
4226
  pointerDown = (event) => {
4227
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
4227
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4228
4228
  return;
4229
4229
  }
4230
4230
  this.#drag = createPathReshapeDragState(this.#svg, event);
@@ -4235,7 +4235,7 @@ var PathReshapeSession = class {
4235
4235
  return;
4236
4236
  }
4237
4237
  drag.moved = true;
4238
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4238
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4239
4239
  if (point) {
4240
4240
  applyPathReshapePreview(drag, point);
4241
4241
  }
@@ -4250,7 +4250,7 @@ var PathReshapeSession = class {
4250
4250
  if (!drag.moved) {
4251
4251
  return;
4252
4252
  }
4253
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event) ?? {
4253
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event) ?? {
4254
4254
  x: drag.points[drag.pointIndex][0],
4255
4255
  y: drag.points[drag.pointIndex][1]
4256
4256
  };
@@ -4291,7 +4291,7 @@ function updatePieLabelDragPreview(drag, dx, dy) {
4291
4291
  }
4292
4292
  const from = { x: drag.tickStartX, y: drag.tickStartY };
4293
4293
  const to = { x: drag.restX + dx, y: drag.restY + dy };
4294
- const clipped = chunkLSEMXRB5_cjs.clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);
4294
+ const clipped = chunkUHKFJBY5_cjs.clipSegmentToRect(from, to, drag.halfWidth, drag.halfHeight);
4295
4295
  drag.tickElement.setAttribute("d", `M ${from.x} ${from.y} L ${clipped.x} ${clipped.y}`);
4296
4296
  drag.tickElement.setAttribute("stroke", PREVIEW_TICK_COLOR);
4297
4297
  drag.tickElement.setAttribute("stroke-width", PREVIEW_TICK_STROKE_WIDTH);
@@ -4317,7 +4317,7 @@ function restoreAttribute(element2, name, value) {
4317
4317
 
4318
4318
  // src/runtime/interaction/pieGeometry.ts
4319
4319
  function readPieGeometry(svg, ownerId) {
4320
- const raw = chunkSCD3AHMY_cjs.findOwnerNode(svg, ownerId, chunkSCD3AHMY_cjs.isPrimary)?.getAttribute("data-sf-pie-geometry");
4320
+ const raw = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary)?.getAttribute("data-sf-pie-geometry");
4321
4321
  if (!raw) {
4322
4322
  return null;
4323
4323
  }
@@ -4336,7 +4336,7 @@ function findLabelMark2(event) {
4336
4336
  return event.target?.closest?.(selector);
4337
4337
  }
4338
4338
  function isLabelPointer2(event) {
4339
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
4339
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
4340
4340
  }
4341
4341
  function findLabelSiblings(svg, ownerId, seriesId, mark) {
4342
4342
  const selector = `[data-sf-id="${CSS.escape(ownerId)}"][data-sf-series="${CSS.escape(seriesId)}"][data-sf-mark="${mark}"]`;
@@ -4368,7 +4368,7 @@ function resolvePieLabelDrag(svg, event) {
4368
4368
  if (!clicked) {
4369
4369
  return null;
4370
4370
  }
4371
- const owner = chunkSCD3AHMY_cjs.resolveOwner(clicked);
4371
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(clicked);
4372
4372
  if (owner?.role !== "chart") {
4373
4373
  return null;
4374
4374
  }
@@ -4387,7 +4387,7 @@ function resolvePieLabelDrag(svg, event) {
4387
4387
  const wedgeRadius = clicked.getAttribute("data-sf-pie-wedge-radius");
4388
4388
  const explicitRadius = wedgeRadius === null ? Number.NaN : Number(wedgeRadius);
4389
4389
  const outerRadius = Number.isFinite(explicitRadius) ? explicitRadius : geometry.outerRadius;
4390
- const start = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
4390
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
4391
4391
  if (!start) {
4392
4392
  return null;
4393
4393
  }
@@ -4409,13 +4409,13 @@ function resolvePieLabelDrag(svg, event) {
4409
4409
  outerRadius,
4410
4410
  anchorX: geometry.centerX + outerRadius * Math.cos(midAngle),
4411
4411
  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),
4412
+ tickStartX: geometry.centerX + (outerRadius + chunkUHKFJBY5_cjs.LEADER_INSET) * Math.cos(midAngle),
4413
+ tickStartY: geometry.centerY + (outerRadius + chunkUHKFJBY5_cjs.LEADER_INSET) * Math.sin(midAngle),
4414
4414
  restX,
4415
4415
  restY,
4416
4416
  startX: start.x,
4417
4417
  startY: start.y,
4418
- halfWidth: chunkLSEMXRB5_cjs.LABEL_WIDTH / 2,
4418
+ halfWidth: chunkUHKFJBY5_cjs.LABEL_WIDTH / 2,
4419
4419
  halfHeight: fontSize * 1.2,
4420
4420
  moved: false,
4421
4421
  lastDx: 0,
@@ -4451,7 +4451,7 @@ var PieLabelDragSession = class {
4451
4451
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
4452
4452
  return;
4453
4453
  }
4454
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
4454
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
4455
4455
  if (!point) {
4456
4456
  return;
4457
4457
  }
@@ -4483,8 +4483,8 @@ var PieLabelDragSession = class {
4483
4483
  if (!drag.moved) {
4484
4484
  return;
4485
4485
  }
4486
- const pathX = chunkLSEMXRB5_cjs.seriesLabelOffsetXProp(drag.seriesId);
4487
- const pathY = chunkLSEMXRB5_cjs.seriesLabelOffsetYProp(drag.seriesId);
4486
+ const pathX = chunkUHKFJBY5_cjs.seriesLabelOffsetXProp(drag.seriesId);
4487
+ const pathY = chunkUHKFJBY5_cjs.seriesLabelOffsetYProp(drag.seriesId);
4488
4488
  if (!pathX || !pathY) {
4489
4489
  return;
4490
4490
  }
@@ -4546,7 +4546,7 @@ function siblingNodes(svg, owner, path) {
4546
4546
  });
4547
4547
  }
4548
4548
  function resolvePropertyDrag(svg, event, rules) {
4549
- if (event.button !== 0 || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
4549
+ if (event.button !== 0 || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
4550
4550
  return null;
4551
4551
  }
4552
4552
  const node = event.target?.closest?.('[data-sf-prop-kind="value"]');
@@ -4554,11 +4554,11 @@ function resolvePropertyDrag(svg, event, rules) {
4554
4554
  return null;
4555
4555
  }
4556
4556
  const path = node.getAttribute("data-sf-prop");
4557
- const owner = chunkSCD3AHMY_cjs.resolveOwner(node);
4557
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(node);
4558
4558
  if (!path || owner?.role !== "chart" || !isEditablePath(path, rules)) {
4559
4559
  return null;
4560
4560
  }
4561
- const scale = parseValueScale(chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isPrimary));
4561
+ const scale = parseValueScale(chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary));
4562
4562
  if (!scale) {
4563
4563
  return null;
4564
4564
  }
@@ -4827,7 +4827,7 @@ function resolvePropertyTarget(event, rules) {
4827
4827
  return null;
4828
4828
  }
4829
4829
  const path = hit.getAttribute("data-sf-prop");
4830
- const owner = chunkSCD3AHMY_cjs.resolveOwner(hit);
4830
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(hit);
4831
4831
  if (!path || !owner || !isEditablePath(path, rules)) {
4832
4832
  return null;
4833
4833
  }
@@ -4866,7 +4866,7 @@ var PropertyEditingSession = class {
4866
4866
  begin(target) {
4867
4867
  this.cancel();
4868
4868
  const { node } = target;
4869
- const rect = chunkSCD3AHMY_cjs.screenRectOf(node);
4869
+ const rect = chunkWZA3DJJH_cjs.screenRectOf(node);
4870
4870
  const fontSize = Number.parseFloat(node.getAttribute("font-size") || "12");
4871
4871
  const originalText = node.textContent ?? "";
4872
4872
  const anchor = node.getAttribute("text-anchor");
@@ -4956,15 +4956,15 @@ function crossedDuplicateDragThreshold(drag, event) {
4956
4956
  var PREVIEW_STROKE_PX = 2;
4957
4957
  var NEW_LINK_PATH_TYPE = "orthogonal";
4958
4958
  function createDuplicatePreviewPath(svg) {
4959
- const path = svg.ownerDocument.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "path");
4959
+ const path = svg.ownerDocument.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "path");
4960
4960
  path.setAttribute("fill", "none");
4961
- path.setAttribute("stroke-width", String(PREVIEW_STROKE_PX / chunkSCD3AHMY_cjs.pxPerUnit(svg)));
4961
+ path.setAttribute("stroke-width", String(PREVIEW_STROKE_PX / chunkWZA3DJJH_cjs.pxPerUnit(svg)));
4962
4962
  path.style.pointerEvents = "none";
4963
4963
  return path;
4964
4964
  }
4965
4965
  function updateDuplicatePreview(drag, toPoint, toSide) {
4966
4966
  const link = previewLink(drag.direction, toSide);
4967
- const { points, segments } = chunkLSEMXRB5_cjs.calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
4967
+ const { points, segments } = chunkUHKFJBY5_cjs.calculateLinkRoute(link, drag.fixedPoint, toPoint, NEW_LINK_PATH_TYPE);
4968
4968
  drag.previewPath.setAttribute("d", previewPathData(points, segments, NEW_LINK_PATH_TYPE, 2));
4969
4969
  }
4970
4970
 
@@ -4975,7 +4975,7 @@ function duplicateCandidates(svg, sourceId) {
4975
4975
  if (element2.getAttribute("data-sf-role") === "link") {
4976
4976
  continue;
4977
4977
  }
4978
- const owner = chunkSCD3AHMY_cjs.resolveOwner(element2);
4978
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
4979
4979
  if (owner && owner.id !== sourceId) {
4980
4980
  candidates.push({ owner, bounds: element2.getBBox() });
4981
4981
  }
@@ -4989,8 +4989,8 @@ function createQuickDuplicateDragState(svg, event, previewPath) {
4989
4989
  if (!bubble || !direction || direction.startsWith("iso-") || !sourceId) {
4990
4990
  return null;
4991
4991
  }
4992
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, sourceId, chunkSCD3AHMY_cjs.isPrimary);
4993
- const sourceOwner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
4992
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, sourceId, chunkWZA3DJJH_cjs.isPrimary);
4993
+ const sourceOwner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
4994
4994
  if (!primary || !sourceOwner) {
4995
4995
  return null;
4996
4996
  }
@@ -4998,7 +4998,7 @@ function createQuickDuplicateDragState(svg, event, previewPath) {
4998
4998
  return {
4999
4999
  sourceOwner,
5000
5000
  direction,
5001
- fixedPoint: chunkLSEMXRB5_cjs.pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),
5001
+ fixedPoint: chunkUHKFJBY5_cjs.pointAtPort(primary.getBBox(), { side: direction, offset: 0.5 }),
5002
5002
  previewPath,
5003
5003
  ghost: new LinkGhost(svg, previewPath),
5004
5004
  candidates: duplicateCandidates(svg, sourceId),
@@ -5026,7 +5026,7 @@ var QuickDuplicateSession = class {
5026
5026
  this.#emitter = emitter;
5027
5027
  }
5028
5028
  pointerDown = (event) => {
5029
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
5029
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
5030
5030
  return;
5031
5031
  }
5032
5032
  this.#drag = createQuickDuplicateDragState(this.#svg, event, createDuplicatePreviewPath(this.#svg));
@@ -5040,7 +5040,7 @@ var QuickDuplicateSession = class {
5040
5040
  return;
5041
5041
  }
5042
5042
  this.beginPreview(drag);
5043
- const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg));
5043
+ const target = resolveDuplicateTarget(drag, duplicatePointerPosition(this.#svg, event), 1 / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg));
5044
5044
  updateDuplicatePreview(drag, target.point, target.side);
5045
5045
  drag.ghost.show(target.hit !== null, target.bounds);
5046
5046
  };
@@ -5098,14 +5098,14 @@ function seriesShapes(svg, ownerId, series) {
5098
5098
  return [...svg.querySelectorAll(selector)];
5099
5099
  }
5100
5100
  function updateRadarVertexDragPreview(svg, drag, value) {
5101
- const point = chunkLSEMXRB5_cjs.radarVertexPoint(drag.frame, drag.index, value);
5101
+ const point = chunkUHKFJBY5_cjs.radarVertexPoint(drag.frame, drag.index, value);
5102
5102
  drag.element.setAttribute("cx", String(point.x));
5103
5103
  drag.element.setAttribute("cy", String(point.y));
5104
5104
  const points = seriesVertices(svg, drag.owner.id, drag.series).map((vertex) => ({
5105
5105
  x: Number(vertex.getAttribute("cx")),
5106
5106
  y: Number(vertex.getAttribute("cy"))
5107
5107
  }));
5108
- const path = chunkLSEMXRB5_cjs.radarSeriesPath(points, drag.frame.curved, drag.frame.tension);
5108
+ const path = chunkUHKFJBY5_cjs.radarSeriesPath(points, drag.frame.curved, drag.frame.tension);
5109
5109
  for (const shape of seriesShapes(svg, drag.owner.id, drag.series)) {
5110
5110
  shape.setAttribute("d", path);
5111
5111
  }
@@ -5160,7 +5160,7 @@ function findVertex(event) {
5160
5160
  return event.target?.closest?.('[data-sf-mark="radar-vertex"]');
5161
5161
  }
5162
5162
  function isVertexPointer(event) {
5163
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
5163
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
5164
5164
  }
5165
5165
  function resolveRadarVertexDrag(svg, event) {
5166
5166
  if (!isVertexPointer(event)) {
@@ -5170,7 +5170,7 @@ function resolveRadarVertexDrag(svg, event) {
5170
5170
  if (!element2) {
5171
5171
  return null;
5172
5172
  }
5173
- const owner = chunkSCD3AHMY_cjs.resolveOwner(element2);
5173
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(element2);
5174
5174
  if (owner?.role !== "chart") {
5175
5175
  return null;
5176
5176
  }
@@ -5179,7 +5179,7 @@ function resolveRadarVertexDrag(svg, event) {
5179
5179
  if (!series || !Number.isInteger(index) || index < 0) {
5180
5180
  return null;
5181
5181
  }
5182
- const frame = parseRadarFrame(chunkSCD3AHMY_cjs.findOwnerNode(svg, owner.id, chunkSCD3AHMY_cjs.isPrimary));
5182
+ const frame = parseRadarFrame(chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary));
5183
5183
  if (!frame || index >= frame.count) {
5184
5184
  return null;
5185
5185
  }
@@ -5189,11 +5189,11 @@ function resolveRadarVertexDrag(svg, event) {
5189
5189
 
5190
5190
  // src/runtime/interaction/radarVertexDrag/session.ts
5191
5191
  function valueFrom(svg, event, drag) {
5192
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
5192
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
5193
5193
  if (!point) {
5194
5194
  return null;
5195
5195
  }
5196
- return chunkLSEMXRB5_cjs.radarValueAtPoint(drag.frame, drag.index, point.x, point.y);
5196
+ return chunkUHKFJBY5_cjs.radarValueAtPoint(drag.frame, drag.index, point.x, point.y);
5197
5197
  }
5198
5198
  var RadarVertexDragSession = class {
5199
5199
  #svg;
@@ -5225,7 +5225,7 @@ var RadarVertexDragSession = class {
5225
5225
  if (!this.#readout) {
5226
5226
  this.#readout = createValueReadout(this.#svg);
5227
5227
  }
5228
- const vertex = chunkLSEMXRB5_cjs.radarVertexPoint(this.#drag.frame, this.#drag.index, value);
5228
+ const vertex = chunkUHKFJBY5_cjs.radarVertexPoint(this.#drag.frame, this.#drag.index, value);
5229
5229
  positionRadarReadout(this.#readout, vertex, this.#drag.frame.centerY, value);
5230
5230
  }
5231
5231
  cancel() {
@@ -5316,7 +5316,7 @@ function captureTextFit(text) {
5316
5316
  fontSize,
5317
5317
  lineHeight,
5318
5318
  padding: Math.max(8, text.strokeWidth * 2),
5319
- longestWord: Math.max(0, ...words.map((word) => chunkLSEMXRB5_cjs.estimateTextWidth(word, fontSize, bold)))
5319
+ longestWord: Math.max(0, ...words.map((word) => chunkUHKFJBY5_cjs.estimateTextWidth(word, fontSize, bold)))
5320
5320
  };
5321
5321
  }
5322
5322
  var COMMIT_PRECISION = 10;
@@ -5327,7 +5327,7 @@ function minWidthForText(fit) {
5327
5327
  return roundUpForCommit(fit.longestWord + fit.padding * 2);
5328
5328
  }
5329
5329
  function minHeightForText(fit, width) {
5330
- const lines = chunkLSEMXRB5_cjs.wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);
5330
+ const lines = chunkUHKFJBY5_cjs.wrapText(fit.rawText, Math.max(0, width - fit.padding * 2), fit.fontSize);
5331
5331
  return roundUpForCommit(lines.length * fit.fontSize * fit.lineHeight + fit.padding * 2);
5332
5332
  }
5333
5333
 
@@ -5461,7 +5461,7 @@ function applyRectBounds(rect, kind, bounds) {
5461
5461
  rect.setAttribute("width", String(bounds.width));
5462
5462
  rect.setAttribute("height", String(bounds.height));
5463
5463
  if (kind === "pill") {
5464
- rect.setAttribute("rx", String(chunkLSEMXRB5_cjs.pillCornerRadius(bounds.width, bounds.height)));
5464
+ rect.setAttribute("rx", String(chunkUHKFJBY5_cjs.pillCornerRadius(bounds.width, bounds.height)));
5465
5465
  }
5466
5466
  }
5467
5467
  function applyEllipseBounds(ellipse, bounds) {
@@ -5471,7 +5471,7 @@ function applyEllipseBounds(ellipse, bounds) {
5471
5471
  ellipse.setAttribute("ry", String(bounds.height / 2));
5472
5472
  }
5473
5473
  function applySymbolBounds(path, bounds) {
5474
- const raw = path.getAttribute(chunkLSEMXRB5_cjs.SYMBOL_POINTS_ATTR);
5474
+ const raw = path.getAttribute(chunkUHKFJBY5_cjs.SYMBOL_POINTS_ATTR);
5475
5475
  if (!raw) {
5476
5476
  return false;
5477
5477
  }
@@ -5479,22 +5479,22 @@ function applySymbolBounds(path, bounds) {
5479
5479
  x: bounds.x + x * bounds.width,
5480
5480
  y: bounds.y + y * bounds.height
5481
5481
  }));
5482
- const tension = Number(path.getAttribute(chunkLSEMXRB5_cjs.SYMBOL_TENSION_ATTR)) || 0;
5483
- path.setAttribute("d", chunkLSEMXRB5_cjs.freeformPathData({ points, tension, closed: true }));
5482
+ const tension = Number(path.getAttribute(chunkUHKFJBY5_cjs.SYMBOL_TENSION_ATTR)) || 0;
5483
+ path.setAttribute("d", chunkUHKFJBY5_cjs.freeformPathData({ points, tension, closed: true }));
5484
5484
  return true;
5485
5485
  }
5486
5486
  function applyPathBounds(path, kind, bounds) {
5487
5487
  if (kind === "symbol" && applySymbolBounds(path, bounds)) {
5488
5488
  return;
5489
5489
  }
5490
- const pathData = chunkLSEMXRB5_cjs.localShapePath(kind, bounds.x, bounds.y, bounds.width, bounds.height);
5490
+ const pathData = chunkUHKFJBY5_cjs.localShapePath(kind, bounds.x, bounds.y, bounds.width, bounds.height);
5491
5491
  if (pathData) {
5492
5492
  path.setAttribute("d", pathData);
5493
5493
  }
5494
5494
  }
5495
5495
  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);
5496
+ const cornerRadius = Number(path.getAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR) ?? 0);
5497
+ const squareCorner = path.getAttribute(chunkUHKFJBY5_cjs.SQUARE_CORNER_ATTR);
5498
5498
  const radii = {
5499
5499
  topLeft: cornerRadius,
5500
5500
  topRight: cornerRadius,
@@ -5504,7 +5504,7 @@ function applyFrameBoundaryBounds(path, bounds) {
5504
5504
  if (squareCorner) {
5505
5505
  radii[squareCorner] = 0;
5506
5506
  }
5507
- path.setAttribute("d", chunkLSEMXRB5_cjs.cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));
5507
+ path.setAttribute("d", chunkUHKFJBY5_cjs.cornersRoundedRectPath(bounds.x, bounds.y, bounds.width, bounds.height, radii));
5508
5508
  }
5509
5509
  function applySingleNodeBounds(primary, kind, bounds) {
5510
5510
  const tag = primary.tagName.toLowerCase();
@@ -5514,7 +5514,7 @@ function applySingleNodeBounds(primary, kind, bounds) {
5514
5514
  applyEllipseBounds(primary, bounds);
5515
5515
  } else if (tag === "foreignobject") {
5516
5516
  applyRectBounds(primary, null, bounds);
5517
- } else if (tag === "path" && primary.hasAttribute(chunkLSEMXRB5_cjs.CORNER_RADIUS_ATTR)) {
5517
+ } else if (tag === "path" && primary.hasAttribute(chunkUHKFJBY5_cjs.CORNER_RADIUS_ATTR)) {
5518
5518
  applyFrameBoundaryBounds(primary, bounds);
5519
5519
  } else if (tag === "path" && kind) {
5520
5520
  applyPathBounds(primary, kind, bounds);
@@ -5553,7 +5553,7 @@ function updateSelectionRing(overlay, bounds) {
5553
5553
  }
5554
5554
  function updateSelectionOverlay(overlay, bounds) {
5555
5555
  updateSelectionRing(overlay, bounds);
5556
- for (const [centerX, centerY, name] of chunkSCD3AHMY_cjs.resizeHandlePositions(bounds)) {
5556
+ for (const [centerX, centerY, name] of chunkWZA3DJJH_cjs.resizeHandlePositions(bounds)) {
5557
5557
  const handle = overlay.querySelector(`[data-sf-resize-handle="${name}"]`);
5558
5558
  if (!handle) {
5559
5559
  continue;
@@ -5570,7 +5570,7 @@ function replaceTextLines(textElement, lines, x, lineHeight) {
5570
5570
  textElement.removeChild(textElement.firstChild);
5571
5571
  }
5572
5572
  lines.forEach((line, index) => {
5573
- const tspan = document.createElementNS(chunkSCD3AHMY_cjs.SVG_NAMESPACE, "tspan");
5573
+ const tspan = document.createElementNS(chunkWZA3DJJH_cjs.SVG_NAMESPACE, "tspan");
5574
5574
  tspan.setAttribute("x", String(x));
5575
5575
  if (index > 0) {
5576
5576
  tspan.setAttribute("dy", `${lineHeight}px`);
@@ -5590,7 +5590,7 @@ function applyLiveText(textElement, rawText, bounds, strokeWidth) {
5590
5590
  const height = Math.max(0, bounds.height - padding * 2);
5591
5591
  const boxX = bounds.x + padding;
5592
5592
  const boxY = bounds.y + padding;
5593
- const lines = chunkLSEMXRB5_cjs.wrapText(rawText, width, fontSize);
5593
+ const lines = chunkUHKFJBY5_cjs.wrapText(rawText, width, fontSize);
5594
5594
  const linePixels = fontSize * lineHeight;
5595
5595
  const contentHeight = lines.length * linePixels;
5596
5596
  const firstY = verticalAlign === "top" ? boxY + fontSize : verticalAlign === "bottom" ? boxY + height - contentHeight + fontSize : boxY + (height - contentHeight) / 2 + fontSize;
@@ -5603,7 +5603,7 @@ function applyLiveText(textElement, rawText, bounds, strokeWidth) {
5603
5603
 
5604
5604
  // src/runtime/interaction/resize/preview.ts
5605
5605
  function textBoundsFor(kind, bounds) {
5606
- return kind === "person" ? chunkLSEMXRB5_cjs.personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;
5606
+ return kind === "person" ? chunkUHKFJBY5_cjs.personLabelArea(bounds.x, bounds.y, bounds.width, bounds.height) : bounds;
5607
5607
  }
5608
5608
  function applyGeometryPreview(drag, bounds) {
5609
5609
  if (drag.isComposite) {
@@ -5623,7 +5623,7 @@ function applyResizePreview(drag, bounds) {
5623
5623
  applyLiveText(drag.text.el, drag.text.rawText, textBoundsFor(drag.kind, bounds), drag.text.strokeWidth);
5624
5624
  }
5625
5625
  if (drag.bubbles) {
5626
- chunkSCD3AHMY_cjs.updateQuickDuplicateBubbles(drag.bubbles, bounds);
5626
+ chunkWZA3DJJH_cjs.updateQuickDuplicateBubbles(drag.bubbles, bounds);
5627
5627
  }
5628
5628
  updateLiveLinks(drag.liveLinks, bounds);
5629
5629
  }
@@ -5644,9 +5644,9 @@ function snapResize(svg, drag, pointer) {
5644
5644
  };
5645
5645
  }
5646
5646
  const axes = HANDLE_AXES[drag.handle];
5647
- const candidates = nearestCandidates(proposed, chunkSCD3AHMY_cjs.findSnapCandidateBounds(svg, /* @__PURE__ */ new Set([drag.owner.id])));
5647
+ const candidates = nearestCandidates(proposed, chunkWZA3DJJH_cjs.findSnapCandidateBounds(svg, /* @__PURE__ */ new Set([drag.owner.id])));
5648
5648
  const snap = computeSnap(proposed, candidates, {
5649
- threshold: snapDistancePx(svg) / chunkSCD3AHMY_cjs.pxPerUnit(svg),
5649
+ threshold: snapDistancePx(svg) / chunkWZA3DJJH_cjs.pxPerUnit(svg),
5650
5650
  activeX: resizeActivePoints(axes.x),
5651
5651
  activeY: resizeActivePoints(axes.y),
5652
5652
  guideOverhang: GUIDE_OVERHANG3
@@ -5687,13 +5687,13 @@ function selectResizeTarget(svg, event) {
5687
5687
  if (!ownerId) {
5688
5688
  return null;
5689
5689
  }
5690
- const primary = chunkSCD3AHMY_cjs.findOwnerNode(svg, ownerId, chunkSCD3AHMY_cjs.isPrimary);
5691
- const owner = primary && chunkSCD3AHMY_cjs.resolveOwner(primary);
5690
+ const primary = chunkWZA3DJJH_cjs.findOwnerNode(svg, ownerId, chunkWZA3DJJH_cjs.isPrimary);
5691
+ const owner = primary && chunkWZA3DJJH_cjs.resolveOwner(primary);
5692
5692
  if (!primary || !hasEditableGeometry(owner)) {
5693
5693
  return null;
5694
5694
  }
5695
- const nodes = chunkSCD3AHMY_cjs.findAllOwnerNodes(svg, ownerId);
5696
- const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter((node) => !chunkSCD3AHMY_cjs.isTextLabel(node));
5695
+ const nodes = chunkWZA3DJJH_cjs.findAllOwnerNodes(svg, ownerId);
5696
+ const geometryNodes = isCompositeOwner(owner) ? nodes : nodes.filter((node) => !chunkWZA3DJJH_cjs.isTextLabel(node));
5697
5697
  if (!geometryNodes.length) {
5698
5698
  return null;
5699
5699
  }
@@ -5711,7 +5711,7 @@ function selectResizeTarget(svg, event) {
5711
5711
 
5712
5712
  // src/runtime/interaction/resize/textCapture.ts
5713
5713
  function captureResizeText(nodes, primary) {
5714
- const textElement = nodes.find(chunkSCD3AHMY_cjs.isTextLabel);
5714
+ const textElement = nodes.find(chunkWZA3DJJH_cjs.isTextLabel);
5715
5715
  const rawText = primary.getAttribute("aria-label");
5716
5716
  if (!textElement || !rawText) {
5717
5717
  return null;
@@ -5729,7 +5729,7 @@ function createResizeDragState(svg, event) {
5729
5729
  if (!selection) {
5730
5730
  return null;
5731
5731
  }
5732
- const startBounds = chunkSCD3AHMY_cjs.symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();
5732
+ const startBounds = chunkWZA3DJJH_cjs.symbolDeclaredBounds(selection.primary) ?? selection.primary.getBBox();
5733
5733
  const composite = isCompositeOwner(selection.owner);
5734
5734
  const isContainer = CONTAINER_ROLES.has(selection.owner.role);
5735
5735
  selection.captureTarget.setPointerCapture?.(event.pointerId);
@@ -5742,7 +5742,7 @@ function createResizeDragState(svg, event) {
5742
5742
  isComposite: composite,
5743
5743
  geometryNodes: selection.geometryNodes,
5744
5744
  insets: selection.geometryNodes.map(
5745
- (node) => node === selection.primary ? NO_INSET : insetWithin(startBounds, chunkSCD3AHMY_cjs.symbolDeclaredBounds(node) ?? node.getBBox())
5745
+ (node) => node === selection.primary ? NO_INSET : insetWithin(startBounds, chunkWZA3DJJH_cjs.symbolDeclaredBounds(node) ?? node.getBBox())
5746
5746
  ),
5747
5747
  baseTransforms: selection.geometryNodes.map((node) => node.getAttribute("transform")),
5748
5748
  overlay: selection.overlay,
@@ -5768,7 +5768,7 @@ var ResizeSession = class {
5768
5768
  this.#emitter = emitter;
5769
5769
  }
5770
5770
  pointerDown = (event) => {
5771
- if (event.button !== 0 || this.#drag || chunkSCD3AHMY_cjs.isCameraGesture(event)) {
5771
+ if (event.button !== 0 || this.#drag || chunkWZA3DJJH_cjs.isCameraGesture(event)) {
5772
5772
  return;
5773
5773
  }
5774
5774
  this.#drag = createResizeDragState(this.#svg, event);
@@ -5783,7 +5783,7 @@ var ResizeSession = class {
5783
5783
  const bounds = keepsProportions(drag, event.shiftKey) ? lockAspect(snapped.bounds, drag.startBounds, drag.handle) : snapped.bounds;
5784
5784
  const { guides } = snapped;
5785
5785
  applyResizePreview(drag, clampResizeToChildren(bounds, drag.childrenBounds));
5786
- chunkSCD3AHMY_cjs.updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);
5786
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(this.#svg, guides, RESIZE_GUIDE_COLOR);
5787
5787
  };
5788
5788
  pointerUp = (event) => {
5789
5789
  const drag = this.#drag;
@@ -5792,7 +5792,7 @@ var ResizeSession = class {
5792
5792
  }
5793
5793
  this.#drag = null;
5794
5794
  event.target?.releasePointerCapture?.(drag.pointerId);
5795
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
5795
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
5796
5796
  if (!drag.moved) {
5797
5797
  return;
5798
5798
  }
@@ -5831,7 +5831,7 @@ function resolveSankeyNodeLabelTarget(event) {
5831
5831
  if (!labelElement) {
5832
5832
  return null;
5833
5833
  }
5834
- const owner = chunkSCD3AHMY_cjs.resolveOwner(labelElement);
5834
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(labelElement);
5835
5835
  if (owner?.role !== "chart") {
5836
5836
  return null;
5837
5837
  }
@@ -5842,7 +5842,7 @@ function resolveSankeyNodeLabelTarget(event) {
5842
5842
  return { owner, nodeId, labelElement };
5843
5843
  }
5844
5844
  function createSankeyNodeLabelEditor(target, emitter, onClose) {
5845
- const rect = chunkSCD3AHMY_cjs.screenRectOf(target.labelElement);
5845
+ const rect = chunkWZA3DJJH_cjs.screenRectOf(target.labelElement);
5846
5846
  if (rect.width <= 0 && rect.height <= 0) {
5847
5847
  return null;
5848
5848
  }
@@ -5899,7 +5899,7 @@ function clearSankeyNodeDragPreview(drag) {
5899
5899
  // src/runtime/interaction/sankeyNode/target.ts
5900
5900
  var RIBBON_PATH = /^M\s+(-?[\d.]+)\s+(-?[\d.]+)\s+C\s+-?[\d.]+\s+-?[\d.]+\s+-?[\d.]+\s+(-?[\d.]+)\s+(-?[\d.]+)\s+-?[\d.]+\s+L\s+-?[\d.]+\s+(-?[\d.]+)\s+C\s+-?[\d.]+\s+-?[\d.]+\s+-?[\d.]+\s+(-?[\d.]+)\s+-?[\d.]+\s+-?[\d.]+\s+Z$/;
5901
5901
  function isNodePointer(event) {
5902
- return event.button === 0 && !chunkSCD3AHMY_cjs.isCameraGesture(event);
5902
+ return event.button === 0 && !chunkWZA3DJJH_cjs.isCameraGesture(event);
5903
5903
  }
5904
5904
  function findNodeRect(event) {
5905
5905
  return event.target?.closest?.('[data-sf-mark="sankey-node"]');
@@ -5957,7 +5957,7 @@ function resolveSankeyNodeDrag(svg, event) {
5957
5957
  if (!rect) {
5958
5958
  return null;
5959
5959
  }
5960
- const owner = chunkSCD3AHMY_cjs.resolveOwner(rect);
5960
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(rect);
5961
5961
  if (owner?.role !== "chart") {
5962
5962
  return null;
5963
5963
  }
@@ -5965,7 +5965,7 @@ function resolveSankeyNodeDrag(svg, event) {
5965
5965
  if (!nodeId) {
5966
5966
  return null;
5967
5967
  }
5968
- const start = chunkSCD3AHMY_cjs.pointerUserPoint(svg, event);
5968
+ const start = chunkWZA3DJJH_cjs.pointerUserPoint(svg, event);
5969
5969
  if (!start) {
5970
5970
  return null;
5971
5971
  }
@@ -6011,7 +6011,7 @@ var SankeyNodeDragSession = class {
6011
6011
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
6012
6012
  return;
6013
6013
  }
6014
- const point = chunkSCD3AHMY_cjs.pointerUserPoint(this.#svg, event);
6014
+ const point = chunkWZA3DJJH_cjs.pointerUserPoint(this.#svg, event);
6015
6015
  if (!point) {
6016
6016
  return;
6017
6017
  }
@@ -6025,7 +6025,7 @@ var SankeyNodeDragSession = class {
6025
6025
  const leadBounds = offsetBounds(drag.originalBounds, rawDx, rawDy);
6026
6026
  const candidates = nearestCandidates(leadBounds, drag.siblingBounds);
6027
6027
  const snap = computeSnap(leadBounds, candidates, {
6028
- threshold: SNAP_THRESHOLD_PX / chunkSCD3AHMY_cjs.pxPerUnit(this.#svg),
6028
+ threshold: SNAP_THRESHOLD_PX / chunkWZA3DJJH_cjs.pxPerUnit(this.#svg),
6029
6029
  activeX: MOVE_ACTIVE_POINTS,
6030
6030
  activeY: MOVE_ACTIVE_POINTS,
6031
6031
  guideOverhang: GUIDE_OVERHANG4
@@ -6035,7 +6035,7 @@ var SankeyNodeDragSession = class {
6035
6035
  drag.lastDx = dx;
6036
6036
  drag.lastDy = dy;
6037
6037
  updateSankeyNodeDragPreview(drag, dx, dy);
6038
- chunkSCD3AHMY_cjs.updateAlignmentGuides(
6038
+ chunkWZA3DJJH_cjs.updateAlignmentGuides(
6039
6039
  this.#svg,
6040
6040
  [snap.x.guide, snap.y.guide].filter((guide) => guide !== null),
6041
6041
  GUIDE_COLOR3
@@ -6046,7 +6046,7 @@ var SankeyNodeDragSession = class {
6046
6046
  clearSankeyNodeDragPreview(this.#drag);
6047
6047
  }
6048
6048
  this.#drag = null;
6049
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
6049
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
6050
6050
  }
6051
6051
  finish(event) {
6052
6052
  if (!this.#drag || event.pointerId !== this.#drag.pointerId) {
@@ -6056,7 +6056,7 @@ var SankeyNodeDragSession = class {
6056
6056
  this.#drag = null;
6057
6057
  event.target?.releasePointerCapture?.(drag.pointerId);
6058
6058
  clearSankeyNodeDragPreview(drag);
6059
- chunkSCD3AHMY_cjs.clearAlignmentGuides(this.#svg);
6059
+ chunkWZA3DJJH_cjs.clearAlignmentGuides(this.#svg);
6060
6060
  if (!drag.moved) {
6061
6061
  return;
6062
6062
  }
@@ -6112,7 +6112,7 @@ function bindSankeyNode(viewer, emitter) {
6112
6112
  var FALLBACK_WIDTH = 120;
6113
6113
  var FALLBACK_HEIGHT = 28;
6114
6114
  function centeredLabelRect(primaryNode) {
6115
- const primaryRect = chunkSCD3AHMY_cjs.screenRectOf(primaryNode);
6115
+ const primaryRect = chunkWZA3DJJH_cjs.screenRectOf(primaryNode);
6116
6116
  return {
6117
6117
  left: primaryRect.left + (primaryRect.width - FALLBACK_WIDTH) / 2,
6118
6118
  top: primaryRect.top + (primaryRect.height - FALLBACK_HEIGHT) / 2,
@@ -6122,10 +6122,10 @@ function centeredLabelRect(primaryNode) {
6122
6122
  }
6123
6123
  function resolveTextEditRect(owner, textNode, primaryNode) {
6124
6124
  if (owner.role === "shape") {
6125
- return primaryNode ? chunkSCD3AHMY_cjs.screenRectOf(primaryNode) : null;
6125
+ return primaryNode ? chunkWZA3DJJH_cjs.screenRectOf(primaryNode) : null;
6126
6126
  }
6127
6127
  if (textNode) {
6128
- return chunkSCD3AHMY_cjs.screenRectOf(textNode);
6128
+ return chunkWZA3DJJH_cjs.screenRectOf(textNode);
6129
6129
  }
6130
6130
  return primaryNode ? centeredLabelRect(primaryNode) : null;
6131
6131
  }
@@ -6145,8 +6145,8 @@ function textAlign(owner, textNode) {
6145
6145
  return anchor === "end" ? "right" : "left";
6146
6146
  }
6147
6147
  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);
6148
+ const textNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isTextLabel);
6149
+ const primaryNode = chunkWZA3DJJH_cjs.findOwnerNode(svg, owner.id, chunkWZA3DJJH_cjs.isPrimary);
6150
6150
  const rect = resolveTextEditRect(owner, textNode, primaryNode);
6151
6151
  if (!rect) {
6152
6152
  return null;
@@ -6192,7 +6192,7 @@ function isFrameTitle(target) {
6192
6192
  }
6193
6193
  function resolveEditableTextOwner(event) {
6194
6194
  const target = event.target;
6195
- const owner = chunkSCD3AHMY_cjs.resolveOwner(target);
6195
+ const owner = chunkWZA3DJJH_cjs.resolveOwner(target);
6196
6196
  if (!owner) {
6197
6197
  return null;
6198
6198
  }
@@ -6333,7 +6333,7 @@ function applyToken(target, lines, token) {
6333
6333
  function maskSource(lines) {
6334
6334
  let tokens;
6335
6335
  try {
6336
- tokens = chunkLSEMXRB5_cjs.tokenizeSource(lines.join("\n"));
6336
+ tokens = chunkUHKFJBY5_cjs.tokenizeSource(lines.join("\n"));
6337
6337
  } catch {
6338
6338
  return null;
6339
6339
  }
@@ -6365,7 +6365,7 @@ function braceDelta(masked) {
6365
6365
  }
6366
6366
 
6367
6367
  // 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/;
6368
+ var OWNER_HEADER = /^\s*(Entity|Shape|Text|Image|Container|Chart|Path|Link|Isometric|Widget|Component|Connection|Shader)\s+([A-Za-z_][A-Za-z0-9_]*)\b/;
6369
6369
  var VALID_IDENT = /^[A-Za-z_][A-Za-z0-9_]*$/;
6370
6370
  function blockEndIn(masked, startLine) {
6371
6371
  let depth = 0;
@@ -6632,6 +6632,9 @@ function canvasObjectBlockKind(kind) {
6632
6632
  if (kind === "text") {
6633
6633
  return "Text";
6634
6634
  }
6635
+ if (kind === "image") {
6636
+ return "Image";
6637
+ }
6635
6638
  if (kind === "isometric") {
6636
6639
  return "Isometric";
6637
6640
  }
@@ -6666,7 +6669,7 @@ function resolveCanvasObjectInsertionTarget(sfl, lines, parentId) {
6666
6669
  const modelRange = findFirstBlockOfKind(lines, "Model");
6667
6670
  return modelRange ? { range: modelRange, origin: { x: 0, y: 0 } } : null;
6668
6671
  }
6669
- const parent = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects.find((canvasObject) => canvasObject.id === parentId);
6672
+ const parent = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects.find((canvasObject) => canvasObject.id === parentId);
6670
6673
  if (!parent) {
6671
6674
  return null;
6672
6675
  }
@@ -7193,7 +7196,7 @@ function movePathPoints(lines, range, dx, dy) {
7193
7196
  replacePropertyValue(lines, span, shifted);
7194
7197
  }
7195
7198
  function applyMoveChange(sfl, event) {
7196
- const state = chunkLSEMXRB5_cjs.sflToCanvasState(sfl);
7199
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7197
7200
  const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7198
7201
  if (!canvasObject) {
7199
7202
  return sfl;
@@ -7218,7 +7221,7 @@ function applyMoveChange(sfl, event) {
7218
7221
 
7219
7222
  // src/runtime/interaction/sflPatch/changes/pathPointChange.ts
7220
7223
  function applyPathPointChange(sfl, event) {
7221
- const canvasObjects = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects;
7224
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7222
7225
  const canvasObject = canvasObjects.find((candidate) => candidate.id === event.owner.id);
7223
7226
  if (!canvasObject) {
7224
7227
  return sfl;
@@ -7372,7 +7375,7 @@ function resolveConnectionInsertionTarget(sfl, lines, options) {
7372
7375
  if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {
7373
7376
  return null;
7374
7377
  }
7375
- const canvasObjects = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects;
7378
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7376
7379
  const hasSource = canvasObjects.some((canvasObject) => canvasObject.id === options.fromId);
7377
7380
  const hasTarget = canvasObjects.some((canvasObject) => canvasObject.id === options.toId);
7378
7381
  if (!hasSource || !hasTarget) {
@@ -7436,13 +7439,13 @@ function isometricOffset(direction, object, gap) {
7436
7439
  const { depth } = object.isometric;
7437
7440
  switch (direction) {
7438
7441
  case "iso-width-pos":
7439
- return { dx: (width + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: (width + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7442
+ return { dx: (width + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: (width + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7440
7443
  case "iso-width-neg":
7441
- return { dx: -(width + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: -(width + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7444
+ return { dx: -(width + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: -(width + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7442
7445
  case "iso-depth-pos":
7443
- return { dx: -(depth + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: (depth + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7446
+ return { dx: -(depth + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: (depth + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7444
7447
  case "iso-depth-neg":
7445
- return { dx: (depth + gap) * chunkLSEMXRB5_cjs.AXIS_COS, dy: -(depth + gap) * chunkLSEMXRB5_cjs.AXIS_SIN };
7448
+ return { dx: (depth + gap) * chunkUHKFJBY5_cjs.AXIS_COS, dy: -(depth + gap) * chunkUHKFJBY5_cjs.AXIS_SIN };
7446
7449
  case "iso-height-pos":
7447
7450
  return { dx: 0, dy: height + gap };
7448
7451
  case "iso-height-neg":
@@ -7505,7 +7508,7 @@ function resolveLinkInsertionTarget(sfl, lines, options) {
7505
7508
  if (!VALID_IDENT.test(options.id) || nameExists(lines, options.id)) {
7506
7509
  return null;
7507
7510
  }
7508
- const canvasObjects = chunkLSEMXRB5_cjs.sflToCanvasState(sfl).canvasObjects;
7511
+ const canvasObjects = chunkUHKFJBY5_cjs.sflToCanvasState(sfl).canvasObjects;
7509
7512
  const hasSource = canvasObjects.some((canvasObject) => canvasObject.id === options.fromId);
7510
7513
  const hasTarget = canvasObjects.some((canvasObject) => canvasObject.id === options.toId);
7511
7514
  if (!hasSource || !hasTarget) {
@@ -7591,21 +7594,21 @@ function duplicateShape(sfl, input) {
7591
7594
 
7592
7595
  // src/runtime/interaction/sflPatch/changes/quickDuplicateChange.ts
7593
7596
  function applyQuickDuplicateChange(sfl, event, options) {
7594
- const state = chunkLSEMXRB5_cjs.sflToCanvasState(sfl);
7597
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7595
7598
  const object = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7596
7599
  if (!object) {
7597
7600
  return sfl;
7598
7601
  }
7599
7602
  const { direction } = event;
7600
7603
  if (isIsometricDirection2(direction)) {
7601
- return chunkLSEMXRB5_cjs.isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;
7604
+ return chunkUHKFJBY5_cjs.isIsometricObject(object) ? duplicateIsometricObject(sfl, object, direction, options) : sfl;
7602
7605
  }
7603
- return chunkLSEMXRB5_cjs.isIsometricObject(object) ? sfl : duplicateShape(sfl, { object, links: state.links, side: direction, options });
7606
+ return chunkUHKFJBY5_cjs.isIsometricObject(object) ? sfl : duplicateShape(sfl, { object, links: state.links, side: direction, options });
7604
7607
  }
7605
7608
 
7606
7609
  // src/runtime/interaction/sflPatch/changes/resizeChange.ts
7607
7610
  function applyResizeChange(sfl, event) {
7608
- const state = chunkLSEMXRB5_cjs.sflToCanvasState(sfl);
7611
+ const state = chunkUHKFJBY5_cjs.sflToCanvasState(sfl);
7609
7612
  const canvasObject = state.canvasObjects.find((candidate) => candidate.id === event.owner.id);
7610
7613
  const parent = canvasObject?.parentFrameId ? state.canvasObjects.find((candidate) => candidate.id === canvasObject.parentFrameId) : void 0;
7611
7614
  const originX = parent?.x ?? 0;