@elixpo/lixsketch 5.6.11 → 5.6.12

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 (55) hide show
  1. package/dist/react/Arrow-YIOAH45F.js +9 -0
  2. package/dist/react/{Circle-5WL5HZA5.js → Circle-BZANVNWQ.js} +3 -3
  3. package/dist/react/{CopyPaste-V7AY56H3.js → CopyPaste-IY5TF5Z2.js} +6 -6
  4. package/dist/react/{EraserTrail-PA6IQLQN.js → EraserTrail-F3ZJNWNL.js} +2 -2
  5. package/dist/react/{Line-YONPLUYT.js → Line-7IGMPC5Q.js} +3 -3
  6. package/dist/react/{Rectangle-7KMA3SC6.js → Rectangle-G3MPA72T.js} +3 -3
  7. package/dist/react/{SceneSerializer-7O72LEZP.js → SceneSerializer-X5GJFI2E.js} +6 -6
  8. package/dist/react/{SketchEngine-VTWURP2K.js → SketchEngine-6UBUCW5L.js} +10 -10
  9. package/dist/react/{chunk-TCWCC4Z4.js → chunk-3ROBBYUS.js} +30 -12
  10. package/dist/react/chunk-3ROBBYUS.js.map +7 -0
  11. package/dist/react/{chunk-JYBJXTLM.js → chunk-6DJ2UFEY.js} +4 -3
  12. package/dist/react/chunk-6DJ2UFEY.js.map +7 -0
  13. package/dist/react/chunk-6KNC7RDT.js +59 -0
  14. package/dist/react/chunk-6KNC7RDT.js.map +7 -0
  15. package/dist/react/{chunk-5OUBTHHO.js → chunk-PK7MU63Q.js} +33 -12
  16. package/dist/react/chunk-PK7MU63Q.js.map +7 -0
  17. package/dist/react/{chunk-WCA3FGWE.js → chunk-YXJMIL6G.js} +4 -3
  18. package/dist/react/chunk-YXJMIL6G.js.map +7 -0
  19. package/dist/react/{chunk-VJDNKJBX.js → chunk-ZTSW4DOB.js} +4 -3
  20. package/dist/react/chunk-ZTSW4DOB.js.map +7 -0
  21. package/dist/react/{eraserTool-2GS2LQCS.js → eraserTool-P6WR35AE.js} +11 -5
  22. package/dist/react/eraserTool-P6WR35AE.js.map +7 -0
  23. package/dist/react/index.js +41 -8
  24. package/dist/react/index.js.map +3 -3
  25. package/dist/react/{laserTool-XVMV63AV.js → laserTool-L3MNCPTS.js} +15 -8
  26. package/dist/react/laserTool-L3MNCPTS.js.map +7 -0
  27. package/package.json +1 -1
  28. package/src/core/EraserTrail.js +36 -11
  29. package/src/core/ShapeLabelLayout.js +42 -0
  30. package/src/react/components/sidebars/ShapeSidebar.jsx +28 -4
  31. package/src/react/store/useSketchStore.js +5 -1
  32. package/src/shapes/Arrow.js +2 -1
  33. package/src/shapes/Circle.js +2 -1
  34. package/src/shapes/Line.js +2 -1
  35. package/src/shapes/Rectangle.js +32 -10
  36. package/src/tools/eraserTool.js +9 -3
  37. package/src/tools/laserTool.js +14 -8
  38. package/dist/react/Arrow-QMR77LGQ.js +0 -9
  39. package/dist/react/chunk-5OUBTHHO.js.map +0 -7
  40. package/dist/react/chunk-JYBJXTLM.js.map +0 -7
  41. package/dist/react/chunk-M7OYYJC6.js +0 -17
  42. package/dist/react/chunk-M7OYYJC6.js.map +0 -7
  43. package/dist/react/chunk-TCWCC4Z4.js.map +0 -7
  44. package/dist/react/chunk-VJDNKJBX.js.map +0 -7
  45. package/dist/react/chunk-WCA3FGWE.js.map +0 -7
  46. package/dist/react/eraserTool-2GS2LQCS.js.map +0 -7
  47. package/dist/react/laserTool-XVMV63AV.js.map +0 -7
  48. /package/dist/react/{Arrow-QMR77LGQ.js.map → Arrow-YIOAH45F.js.map} +0 -0
  49. /package/dist/react/{Circle-5WL5HZA5.js.map → Circle-BZANVNWQ.js.map} +0 -0
  50. /package/dist/react/{CopyPaste-V7AY56H3.js.map → CopyPaste-IY5TF5Z2.js.map} +0 -0
  51. /package/dist/react/{EraserTrail-PA6IQLQN.js.map → EraserTrail-F3ZJNWNL.js.map} +0 -0
  52. /package/dist/react/{Line-YONPLUYT.js.map → Line-7IGMPC5Q.js.map} +0 -0
  53. /package/dist/react/{Rectangle-7KMA3SC6.js.map → Rectangle-G3MPA72T.js.map} +0 -0
  54. /package/dist/react/{SceneSerializer-7O72LEZP.js.map → SceneSerializer-X5GJFI2E.js.map} +0 -0
  55. /package/dist/react/{SketchEngine-VTWURP2K.js.map → SketchEngine-6UBUCW5L.js.map} +0 -0
@@ -0,0 +1,59 @@
1
+ "use client";
2
+
3
+ // src/core/ShapeLabelLayout.js
4
+ var DEFAULT_SHAPE_LABEL_FONT_SIZE = 18;
5
+ function fallbackWidth(text, fontSize) {
6
+ return [...text].reduce((width, character) => {
7
+ if (/\s/.test(character)) return width + fontSize * 0.34;
8
+ if (/[ilI1.,'`]/.test(character)) return width + fontSize * 0.32;
9
+ if (/[MW@#%]/.test(character)) return width + fontSize * 0.88;
10
+ return width + fontSize * 0.59;
11
+ }, 0);
12
+ }
13
+ function browserTextWidth(text, fontSize) {
14
+ if (typeof document === "undefined") return null;
15
+ try {
16
+ const canvas = browserTextWidth.canvas || (browserTextWidth.canvas = document.createElement("canvas"));
17
+ const context = canvas.getContext?.("2d");
18
+ if (!context) return null;
19
+ context.font = `${fontSize}px lixFont, sans-serif`;
20
+ return context.measureText(text).width;
21
+ } catch {
22
+ return null;
23
+ }
24
+ }
25
+ function measureShapeLabel(label, fontSize = DEFAULT_SHAPE_LABEL_FONT_SIZE) {
26
+ const lines = String(label ?? "").replace(/\r\n?/g, "\n").split("\n");
27
+ const safeLines = lines.length ? lines : [""];
28
+ const widths = safeLines.map((line) => browserTextWidth(line, fontSize) ?? fallbackWidth(line, fontSize));
29
+ const lineHeight = fontSize * 1.3;
30
+ const contentWidth = Math.max(0, ...widths);
31
+ const contentHeight = Math.max(lineHeight, safeLines.length * lineHeight);
32
+ return {
33
+ lines: safeLines,
34
+ widths,
35
+ lineHeight,
36
+ contentWidth,
37
+ contentHeight,
38
+ requiredWidth: Math.ceil(contentWidth + 32),
39
+ requiredHeight: Math.ceil(contentHeight + 24)
40
+ };
41
+ }
42
+
43
+ // src/utils/themeColors.js
44
+ var LEGACY_LABEL_COLORS = /* @__PURE__ */ new Set(["#e0e0e0", "#e8e3f3"]);
45
+ function getThemeForeground() {
46
+ if (typeof document === "undefined") return "#ffffff";
47
+ return document.body?.classList.contains("theme-dark") ? "#ffffff" : "#000000";
48
+ }
49
+ function resolveThemeLabelColor(color) {
50
+ if (!color) return getThemeForeground();
51
+ return LEGACY_LABEL_COLORS.has(String(color).trim().toLowerCase()) ? getThemeForeground() : color;
52
+ }
53
+
54
+ export {
55
+ DEFAULT_SHAPE_LABEL_FONT_SIZE,
56
+ measureShapeLabel,
57
+ resolveThemeLabelColor
58
+ };
59
+ //# sourceMappingURL=chunk-6KNC7RDT.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/ShapeLabelLayout.js", "../../src/utils/themeColors.js"],
4
+ "sourcesContent": ["export const DEFAULT_SHAPE_LABEL_FONT_SIZE = 18;\n\nfunction fallbackWidth(text, fontSize) {\n return [...text].reduce((width, character) => {\n if (/\\s/.test(character)) return width + fontSize * 0.34;\n if (/[ilI1.,'`]/.test(character)) return width + fontSize * 0.32;\n if (/[MW@#%]/.test(character)) return width + fontSize * 0.88;\n return width + fontSize * 0.59;\n }, 0);\n}\n\nfunction browserTextWidth(text, fontSize) {\n if (typeof document === 'undefined') return null;\n try {\n const canvas = browserTextWidth.canvas || (browserTextWidth.canvas = document.createElement('canvas'));\n const context = canvas.getContext?.('2d');\n if (!context) return null;\n context.font = `${fontSize}px lixFont, sans-serif`;\n return context.measureText(text).width;\n } catch {\n return null;\n }\n}\n\nexport function measureShapeLabel(label, fontSize = DEFAULT_SHAPE_LABEL_FONT_SIZE) {\n const lines = String(label ?? '').replace(/\\r\\n?/g, '\\n').split('\\n');\n const safeLines = lines.length ? lines : [''];\n const widths = safeLines.map((line) => browserTextWidth(line, fontSize) ?? fallbackWidth(line, fontSize));\n const lineHeight = fontSize * 1.3;\n const contentWidth = Math.max(0, ...widths);\n const contentHeight = Math.max(lineHeight, safeLines.length * lineHeight);\n\n return {\n lines: safeLines,\n widths,\n lineHeight,\n contentWidth,\n contentHeight,\n requiredWidth: Math.ceil(contentWidth + 32),\n requiredHeight: Math.ceil(contentHeight + 24),\n };\n}\n", "const LEGACY_LABEL_COLORS = new Set(['#e0e0e0', '#e8e3f3'])\n\nexport function getThemeForeground() {\n if (typeof document === 'undefined') return '#ffffff'\n return document.body?.classList.contains('theme-dark') ? '#ffffff' : '#000000'\n}\n\nexport function resolveThemeLabelColor(color) {\n if (!color) return getThemeForeground()\n return LEGACY_LABEL_COLORS.has(String(color).trim().toLowerCase())\n ? getThemeForeground()\n : color\n}\n"],
5
+ "mappings": ";;;AAAO,IAAM,gCAAgC;AAE7C,SAAS,cAAc,MAAM,UAAU;AACnC,SAAO,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,OAAO,cAAc;AAC1C,QAAI,KAAK,KAAK,SAAS,EAAG,QAAO,QAAQ,WAAW;AACpD,QAAI,aAAa,KAAK,SAAS,EAAG,QAAO,QAAQ,WAAW;AAC5D,QAAI,UAAU,KAAK,SAAS,EAAG,QAAO,QAAQ,WAAW;AACzD,WAAO,QAAQ,WAAW;AAAA,EAC9B,GAAG,CAAC;AACR;AAEA,SAAS,iBAAiB,MAAM,UAAU;AACtC,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,MAAI;AACA,UAAM,SAAS,iBAAiB,WAAW,iBAAiB,SAAS,SAAS,cAAc,QAAQ;AACpG,UAAM,UAAU,OAAO,aAAa,IAAI;AACxC,QAAI,CAAC,QAAS,QAAO;AACrB,YAAQ,OAAO,GAAG,QAAQ;AAC1B,WAAO,QAAQ,YAAY,IAAI,EAAE;AAAA,EACrC,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEO,SAAS,kBAAkB,OAAO,WAAW,+BAA+B;AAC/E,QAAM,QAAQ,OAAO,SAAS,EAAE,EAAE,QAAQ,UAAU,IAAI,EAAE,MAAM,IAAI;AACpE,QAAM,YAAY,MAAM,SAAS,QAAQ,CAAC,EAAE;AAC5C,QAAM,SAAS,UAAU,IAAI,CAAC,SAAS,iBAAiB,MAAM,QAAQ,KAAK,cAAc,MAAM,QAAQ,CAAC;AACxG,QAAM,aAAa,WAAW;AAC9B,QAAM,eAAe,KAAK,IAAI,GAAG,GAAG,MAAM;AAC1C,QAAM,gBAAgB,KAAK,IAAI,YAAY,UAAU,SAAS,UAAU;AAExE,SAAO;AAAA,IACH,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,eAAe,KAAK,KAAK,eAAe,EAAE;AAAA,IAC1C,gBAAgB,KAAK,KAAK,gBAAgB,EAAE;AAAA,EAChD;AACJ;;;ACzCA,IAAM,sBAAsB,oBAAI,IAAI,CAAC,WAAW,SAAS,CAAC;AAEnD,SAAS,qBAAqB;AACnC,MAAI,OAAO,aAAa,YAAa,QAAO;AAC5C,SAAO,SAAS,MAAM,UAAU,SAAS,YAAY,IAAI,YAAY;AACvE;AAEO,SAAS,uBAAuB,OAAO;AAC5C,MAAI,CAAC,MAAO,QAAO,mBAAmB;AACtC,SAAO,oBAAoB,IAAI,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,IAC7D,mBAAmB,IACnB;AACN;",
6
+ "names": []
7
+ }
@@ -6,13 +6,18 @@ var eraserPath = null;
6
6
  var eraserGlow = null;
7
7
  var eraserPoints = [];
8
8
  var targetedElements = /* @__PURE__ */ new Set();
9
- var MAX_TRAIL_LENGTH = 16;
10
- var FADE_DURATION = 200;
11
- var MIN_POINT_DISTANCE = 1.5;
12
- var SMOOTHING_WINDOW = 3;
9
+ var MAX_TRAIL_LENGTH = 28;
10
+ var FADE_DURATION = 320;
11
+ var MIN_POINT_DISTANCE = 1;
12
+ var SMOOTHING_WINDOW = 5;
13
13
  var fadeAnimationId = null;
14
14
  var fadeStartTime = null;
15
15
  var fadeInitialPoints = null;
16
+ var renderAnimationId = null;
17
+ function trailPalette() {
18
+ const isLight = document.documentElement.dataset.canvasTheme === "light" || document.body?.classList.contains("theme-light");
19
+ return isLight ? { core: "49, 40, 63", glow: "124, 89, 195" } : { core: "245, 239, 251", glow: "199, 164, 255" };
20
+ }
16
21
  function getIsErasing() {
17
22
  return isErasing;
18
23
  }
@@ -83,6 +88,10 @@ function safeRemove(el) {
83
88
  }
84
89
  }
85
90
  function cleanupTrail() {
91
+ if (renderAnimationId) {
92
+ cancelAnimationFrame(renderAnimationId);
93
+ renderAnimationId = null;
94
+ }
86
95
  if (fadeAnimationId) {
87
96
  cancelAnimationFrame(fadeAnimationId);
88
97
  fadeAnimationId = null;
@@ -99,7 +108,8 @@ function createEraserTrail(x, y) {
99
108
  cleanupTrail();
100
109
  eraserGlow = document.createElementNS("http://www.w3.org/2000/svg", "path");
101
110
  eraserGlow.setAttribute("fill", "none");
102
- eraserGlow.setAttribute("stroke", "rgba(80, 80, 80, 0.15)");
111
+ const palette = trailPalette();
112
+ eraserGlow.setAttribute("stroke", `rgba(${palette.glow}, 0.20)`);
103
113
  eraserGlow.setAttribute("stroke-width", 14 / currentZoom);
104
114
  eraserGlow.setAttribute("stroke-linecap", "round");
105
115
  eraserGlow.setAttribute("stroke-linejoin", "round");
@@ -107,7 +117,7 @@ function createEraserTrail(x, y) {
107
117
  svg.appendChild(eraserGlow);
108
118
  eraserPath = document.createElementNS("http://www.w3.org/2000/svg", "path");
109
119
  eraserPath.setAttribute("fill", "none");
110
- eraserPath.setAttribute("stroke", "rgba(53, 53, 53, 0.5)");
120
+ eraserPath.setAttribute("stroke", `rgba(${palette.core}, 0.62)`);
111
121
  eraserPath.setAttribute("stroke-width", 5 / currentZoom);
112
122
  eraserPath.setAttribute("stroke-linecap", "round");
113
123
  eraserPath.setAttribute("stroke-linejoin", "round");
@@ -128,21 +138,27 @@ function updateEraserTrail(x, y) {
128
138
  if (eraserPoints.length > MAX_TRAIL_LENGTH) {
129
139
  eraserPoints.shift();
130
140
  }
131
- renderTrail(eraserPoints, 1);
141
+ if (!renderAnimationId) {
142
+ renderAnimationId = requestAnimationFrame(() => {
143
+ renderAnimationId = null;
144
+ renderTrail(eraserPoints, 1);
145
+ });
146
+ }
132
147
  }
133
148
  function renderTrail(points, opacityMul) {
134
149
  if (!eraserPath || points.length < 2) return;
135
150
  const pathD = buildSmoothPath(points);
136
151
  const coreW = Math.max(1.5 / currentZoom, 5 / currentZoom * opacityMul);
137
152
  const glowW = Math.max(3 / currentZoom, 14 / currentZoom * opacityMul);
138
- const coreOpacity = 0.5 * opacityMul;
139
- const glowOpacity = 0.15 * opacityMul;
153
+ const coreOpacity = 0.62 * opacityMul;
154
+ const glowOpacity = 0.2 * opacityMul;
155
+ const palette = trailPalette();
140
156
  eraserPath.setAttribute("d", pathD);
141
- eraserPath.setAttribute("stroke", `rgba(53, 53, 53, ${coreOpacity})`);
157
+ eraserPath.setAttribute("stroke", `rgba(${palette.core}, ${coreOpacity})`);
142
158
  eraserPath.setAttribute("stroke-width", coreW);
143
159
  if (eraserGlow) {
144
160
  eraserGlow.setAttribute("d", pathD);
145
- eraserGlow.setAttribute("stroke", `rgba(80, 80, 80, ${glowOpacity})`);
161
+ eraserGlow.setAttribute("stroke", `rgba(${palette.glow}, ${glowOpacity})`);
146
162
  eraserGlow.setAttribute("stroke-width", glowW);
147
163
  }
148
164
  }
@@ -151,6 +167,11 @@ function fadeOutEraserTrail() {
151
167
  cleanupTrail();
152
168
  return;
153
169
  }
170
+ if (renderAnimationId) {
171
+ cancelAnimationFrame(renderAnimationId);
172
+ renderAnimationId = null;
173
+ renderTrail(eraserPoints, 1);
174
+ }
154
175
  if (fadeAnimationId) {
155
176
  cancelAnimationFrame(fadeAnimationId);
156
177
  }
@@ -184,4 +205,4 @@ export {
184
205
  fadeOutEraserTrail,
185
206
  forceCleanupEraserTrail
186
207
  };
187
- //# sourceMappingURL=chunk-5OUBTHHO.js.map
208
+ //# sourceMappingURL=chunk-PK7MU63Q.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/EraserTrail.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n// Eraser trail visualization - smooth trail with fade\n// Depends on globals: svg, currentZoom\n\nlet isErasing = false;\nlet eraserPath = null;\nlet eraserGlow = null;\nlet eraserPoints = [];\nlet targetedElements = new Set();\n\nconst MAX_TRAIL_LENGTH = 28;\nconst FADE_DURATION = 320;\nconst MIN_POINT_DISTANCE = 1;\nconst SMOOTHING_WINDOW = 5;\n\nlet fadeAnimationId = null;\nlet fadeStartTime = null;\nlet fadeInitialPoints = null;\nlet renderAnimationId = null;\n\nfunction trailPalette() {\n const isLight = document.documentElement.dataset.canvasTheme === 'light' || document.body?.classList.contains('theme-light');\n return isLight\n ? { core: '49, 40, 63', glow: '124, 89, 195' }\n : { core: '245, 239, 251', glow: '199, 164, 255' };\n}\n\n// Getter/setter for isErasing so eraserTool can share state\nfunction getIsErasing() { return isErasing; }\nfunction setIsErasing(val) { isErasing = val; }\nfunction getTargetedElements() { return targetedElements; }\n\n// --- Convert screen coordinates to SVG viewBox coordinates ---\nfunction screenToSVGEraser(clientX, clientY) {\n const CTM = svg.getScreenCTM();\n if (!CTM) return { x: 0, y: 0 };\n try {\n const inv = CTM.inverse();\n return {\n x: (clientX - CTM.e) * inv.a + (clientY - CTM.f) * inv.c,\n y: (clientX - CTM.e) * inv.b + (clientY - CTM.f) * inv.d\n };\n } catch (e) {\n return {\n x: (clientX - CTM.e) / CTM.a,\n y: (clientY - CTM.f) / CTM.d\n };\n }\n}\n\n// Smooth points using moving average to remove micro-jitter\nfunction smoothPoints(points) {\n if (points.length <= 2) return points;\n const half = Math.floor(SMOOTHING_WINDOW / 2);\n const result = [points[0]];\n for (let i = 1; i < points.length - 1; i++) {\n let sx = 0, sy = 0, count = 0;\n for (let j = Math.max(0, i - half); j <= Math.min(points.length - 1, i + half); j++) {\n sx += points[j].x;\n sy += points[j].y;\n count++;\n }\n result.push({ x: sx / count, y: sy / count });\n }\n result.push(points[points.length - 1]);\n return result;\n}\n\n// Build smooth SVG path using Catmull-Rom \u2192 cubic bezier\nfunction buildSmoothPath(rawPoints) {\n if (rawPoints.length === 0) return '';\n if (rawPoints.length === 1) return `M ${rawPoints[0].x} ${rawPoints[0].y}`;\n\n const points = smoothPoints(rawPoints);\n\n let d = `M ${points[0].x} ${points[0].y}`;\n\n if (points.length === 2) {\n d += ` L ${points[1].x} ${points[1].y}`;\n return d;\n }\n\n const tension = 0.4;\n for (let i = 0; i < points.length - 1; i++) {\n const p0 = points[i === 0 ? 0 : i - 1];\n const p1 = points[i];\n const p2 = points[i + 1];\n const p3 = points[i + 2] || p2;\n\n const cp1x = p1.x + (p2.x - p0.x) * tension / 3;\n const cp1y = p1.y + (p2.y - p0.y) * tension / 3;\n const cp2x = p2.x - (p3.x - p1.x) * tension / 3;\n const cp2y = p2.y - (p3.y - p1.y) * tension / 3;\n\n d += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;\n }\n return d;\n}\n\n// Safely remove an SVG element\nfunction safeRemove(el) {\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n}\n\n// Remove all trail elements and reset state\nfunction cleanupTrail() {\n if (renderAnimationId) {\n cancelAnimationFrame(renderAnimationId);\n renderAnimationId = null;\n }\n if (fadeAnimationId) {\n cancelAnimationFrame(fadeAnimationId);\n fadeAnimationId = null;\n }\n fadeStartTime = null;\n fadeInitialPoints = null;\n safeRemove(eraserPath);\n safeRemove(eraserGlow);\n eraserPath = null;\n eraserGlow = null;\n eraserPoints = [];\n}\n\n// --- Create the eraser trail ---\nfunction createEraserTrail(x, y) {\n // Clean up any leftover trail first\n cleanupTrail();\n\n // Outer glow\n eraserGlow = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n eraserGlow.setAttribute(\"fill\", \"none\");\n const palette = trailPalette();\n eraserGlow.setAttribute(\"stroke\", `rgba(${palette.glow}, 0.20)`);\n eraserGlow.setAttribute(\"stroke-width\", 14 / currentZoom);\n eraserGlow.setAttribute(\"stroke-linecap\", \"round\");\n eraserGlow.setAttribute(\"stroke-linejoin\", \"round\");\n eraserGlow.style.pointerEvents = \"none\";\n svg.appendChild(eraserGlow);\n\n // Core path\n eraserPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n eraserPath.setAttribute(\"fill\", \"none\");\n eraserPath.setAttribute(\"stroke\", `rgba(${palette.core}, 0.62)`);\n eraserPath.setAttribute(\"stroke-width\", 5 / currentZoom);\n eraserPath.setAttribute(\"stroke-linecap\", \"round\");\n eraserPath.setAttribute(\"stroke-linejoin\", \"round\");\n eraserPath.style.pointerEvents = \"none\";\n svg.appendChild(eraserPath);\n\n const svgPt = screenToSVGEraser(x, y);\n eraserPoints = [svgPt];\n}\n\n// --- Update the eraser trail with new point ---\nfunction updateEraserTrail(x, y) {\n if (!eraserPath) return;\n\n const svgPt = screenToSVGEraser(x, y);\n const last = eraserPoints[eraserPoints.length - 1];\n\n if (last) {\n const dist = Math.hypot(last.x - svgPt.x, last.y - svgPt.y);\n if (dist < MIN_POINT_DISTANCE / currentZoom) return;\n }\n\n eraserPoints.push(svgPt);\n\n if (eraserPoints.length > MAX_TRAIL_LENGTH) {\n eraserPoints.shift();\n }\n\n if (!renderAnimationId) {\n renderAnimationId = requestAnimationFrame(() => {\n renderAnimationId = null;\n renderTrail(eraserPoints, 1.0);\n });\n }\n}\n\n// Render the trail with given points and opacity multiplier\nfunction renderTrail(points, opacityMul) {\n if (!eraserPath || points.length < 2) return;\n\n const pathD = buildSmoothPath(points);\n const coreW = Math.max(1.5 / currentZoom, (5 / currentZoom) * opacityMul);\n const glowW = Math.max(3 / currentZoom, (14 / currentZoom) * opacityMul);\n const coreOpacity = 0.62 * opacityMul;\n const glowOpacity = 0.20 * opacityMul;\n const palette = trailPalette();\n\n eraserPath.setAttribute(\"d\", pathD);\n eraserPath.setAttribute(\"stroke\", `rgba(${palette.core}, ${coreOpacity})`);\n eraserPath.setAttribute(\"stroke-width\", coreW);\n\n if (eraserGlow) {\n eraserGlow.setAttribute(\"d\", pathD);\n eraserGlow.setAttribute(\"stroke\", `rgba(${palette.glow}, ${glowOpacity})`);\n eraserGlow.setAttribute(\"stroke-width\", glowW);\n }\n}\n\n// --- Fade out the eraser trail using rAF ---\nfunction fadeOutEraserTrail() {\n if (!eraserPath) {\n cleanupTrail();\n return;\n }\n\n if (renderAnimationId) {\n cancelAnimationFrame(renderAnimationId);\n renderAnimationId = null;\n renderTrail(eraserPoints, 1.0);\n }\n\n // Cancel any existing fade\n if (fadeAnimationId) {\n cancelAnimationFrame(fadeAnimationId);\n }\n\n fadeStartTime = performance.now();\n fadeInitialPoints = [...eraserPoints];\n\n function fadeStep() {\n const now = performance.now();\n const elapsed = now - fadeStartTime;\n const progress = Math.min(1, elapsed / FADE_DURATION);\n\n // Cubic ease out for smooth fade\n const opacity = 1 - progress * progress * progress;\n\n if (opacity <= 0.01 || progress >= 1) {\n cleanupTrail();\n return;\n }\n\n renderTrail(fadeInitialPoints, opacity);\n fadeAnimationId = requestAnimationFrame(fadeStep);\n }\n\n fadeAnimationId = requestAnimationFrame(fadeStep);\n}\n\n// Failsafe: force cleanup any lingering trails (called on tool switch, etc.)\nfunction forceCleanupEraserTrail() {\n cleanupTrail();\n isErasing = false;\n}\n\nexport {\n createEraserTrail,\n updateEraserTrail,\n fadeOutEraserTrail,\n forceCleanupEraserTrail,\n getIsErasing,\n setIsErasing,\n getTargetedElements\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1,7 +1,8 @@
1
1
  "use client";
2
2
  import {
3
+ DEFAULT_SHAPE_LABEL_FONT_SIZE,
3
4
  resolveThemeLabelColor
4
- } from "./chunk-M7OYYJC6.js";
5
+ } from "./chunk-6KNC7RDT.js";
5
6
 
6
7
  // src/shapes/Arrow.js
7
8
  var isDragging = false;
@@ -49,7 +50,7 @@ var Arrow = class _Arrow {
49
50
  this.label = options.label || "";
50
51
  this.labelElement = null;
51
52
  this.labelColor = resolveThemeLabelColor(options.labelColor);
52
- this.labelFontSize = options.labelFontSize || 12;
53
+ this.labelFontSize = options.labelFontSize || DEFAULT_SHAPE_LABEL_FONT_SIZE;
53
54
  this.labelBg = options.labelBg !== false;
54
55
  this.labelOffsetY = options.labelOffsetY || 0;
55
56
  this._isEditingLabel = false;
@@ -1651,4 +1652,4 @@ var Arrow = class _Arrow {
1651
1652
  export {
1652
1653
  Arrow
1653
1654
  };
1654
- //# sourceMappingURL=chunk-WCA3FGWE.js.map
1655
+ //# sourceMappingURL=chunk-YXJMIL6G.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/shapes/Arrow.js"],
4
+ "sourcesContent": ["/* eslint-disable */\nimport { resolveThemeLabelColor } from '../utils/themeColors.js';\n// Arrow shape class - extracted from drawArrow.js\n// Depends on globals: svg, shapes, rough, currentShape, currentZoom\nimport { DEFAULT_SHAPE_LABEL_FONT_SIZE } from '../core/ShapeLabelLayout.js';\n\nlet isDragging = false;\nlet hoveredFrameArrow = null;\nlet dragOldPosArrow = null;\n\nfunction getSVGCoordsFromMouse(e) {\n const viewBox = svg.viewBox.baseVal;\n const rect = svg.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n const svgX = viewBox.x + (mouseX / rect.width) * viewBox.width;\n const svgY = viewBox.y + (mouseY / rect.height) * viewBox.height;\n return { x: svgX, y: svgY };\n}\n\nclass Arrow {\n constructor(startPoint, endPoint, options = {}) {\n this.startPoint = startPoint;\n this.endPoint = endPoint;\n this.options = {\n stroke: options.stroke || \"#fff\",\n strokeWidth: options.strokeWidth || 2,\n strokeDasharray: options.arrowOutlineStyle === \"dashed\" ? \"10,10\" : (options.arrowOutlineStyle === \"dotted\" ? \"2,8\" : \"\"),\n fill: 'none',\n ...options\n };\n this.arrowOutlineStyle = options.arrowOutlineStyle || \"solid\";\n this.arrowHeadStyle = options.arrowHeadStyle || \"default\";\n this.arrowHeadLength = parseFloat(options.arrowHeadLength || 15);\n this.arrowHeadAngleDeg = parseFloat(options.arrowHeadAngleDeg || 30);\n this.arrowCurved = options.arrowCurved !== undefined ? options.arrowCurved : \"straight\";\n this.arrowCurveAmount = options.arrowCurveAmount || 50;\n\n // Control points for curved arrows\n this.controlPoint1 = options.controlPoint1 || null;\n this.controlPoint2 = options.controlPoint2 || null;\n\n\n this.attachedToStart = null;\n this.attachedToEnd = null;\n this.parentFrame = null;\n this.element = null;\n this.elbowX = options.elbowX !== undefined ? options.elbowX : null;\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.isSelected = false;\n this.anchors = [];\n this.shapeName = \"arrow\";\n this.shapeID = `arrow-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n this.group.setAttribute('id', this.shapeID);\n\n // Embedded label support\n this.label = options.label || '';\n this.labelElement = null;\n this.labelColor = resolveThemeLabelColor(options.labelColor);\n this.labelFontSize = options.labelFontSize || DEFAULT_SHAPE_LABEL_FONT_SIZE;\n this.labelBg = options.labelBg !== false; // labelBg:false \u2192 no knockout rect behind label\n this.labelOffsetY = options.labelOffsetY || 0; // shift label along the perpendicular of the line, e.g. lift it clear of the stroke\n this._isEditingLabel = false;\n this._hitArea = null;\n this._labelBg = null;\n\n // Initialize control points if curved\n if (this.arrowCurved === \"curved\" && !this.controlPoint1 && !this.controlPoint2) {\n this.initializeCurveControlPoints();\n }\n\n svg.appendChild(this.group);\n this._setupLabelDblClick();\n this.draw();\n }\n\n get x() {\n return Math.min(this.startPoint.x, this.endPoint.x);\n }\n\n set x(value) {\n const currentX = this.x;\n const dx = value - currentX;\n this.startPoint.x += dx;\n this.endPoint.x += dx;\n if (this.controlPoint1) this.controlPoint1.x += dx;\n if (this.controlPoint2) this.controlPoint2.x += dx;\n }\n\n get y() {\n return Math.min(this.startPoint.y, this.endPoint.y);\n }\n\n set y(value) {\n const currentY = this.y;\n const dy = value - currentY;\n this.startPoint.y += dy;\n this.endPoint.y += dy;\n if (this.controlPoint1) this.controlPoint1.y += dy;\n if (this.controlPoint2) this.controlPoint2.y += dy;\n }\n\n get width() {\n return Math.abs(this.endPoint.x - this.startPoint.x);\n }\n\n set width(value) {\n const centerX = (this.startPoint.x + this.endPoint.x) / 2;\n const halfWidth = value / 2;\n this.startPoint.x = centerX - halfWidth;\n this.endPoint.x = centerX + halfWidth;\n }\n\n get height() {\n return Math.abs(this.endPoint.y - this.startPoint.y);\n }\n\n set height(value) {\n const centerY = (this.startPoint.y + this.endPoint.y) / 2;\n const halfHeight = value / 2;\n this.startPoint.y = centerY - halfHeight;\n this.endPoint.y = centerY + halfHeight;\n }\n\n initializeCurveControlPoints() {\n const dx = this.endPoint.x - this.startPoint.x;\n const dy = this.endPoint.y - this.startPoint.y;\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (distance === 0 || isNaN(distance)) {\n this.controlPoint1 = { x: this.startPoint.x + 20, y: this.startPoint.y };\n this.controlPoint2 = { x: this.endPoint.x - 20, y: this.endPoint.y };\n return;\n }\n\n const perpX = -dy / distance;\n const perpY = dx / distance;\n const curveOffset = this.arrowCurveAmount;\n\n const t1 = 0.33;\n const point1X = this.startPoint.x + t1 * dx;\n const point1Y = this.startPoint.y + t1 * dy;\n this.controlPoint1 = {\n x: point1X + perpX * curveOffset,\n y: point1Y + perpY * curveOffset\n };\n\n const t2 = 0.67;\n const point2X = this.startPoint.x + t2 * dx;\n const point2Y = this.startPoint.y + t2 * dy;\n this.controlPoint2 = {\n x: point2X - perpX * curveOffset,\n y: point2Y - perpY * curveOffset\n };\n }\n\n _buildElbowPath(elbowX, shortenEnd) {\n const x1 = this.startPoint.x, y1 = this.startPoint.y;\n const x2 = this.endPoint.x, y2 = this.endPoint.y;\n const r = Math.min(\n Math.abs(this.arrowCurveAmount),\n Math.abs(elbowX - x1) / 2,\n Math.abs(x2 - elbowX) / 2,\n Math.abs(y2 - y1) / 2\n );\n const dx = elbowX >= x1 ? 1 : -1;\n const ex = x2 >= elbowX ? 1 : -1;\n const dy = y2 >= y1 ? 1 : -1;\n let endX = x2;\n if (shortenEnd) {\n endX = x2 - ex * (this.arrowHeadLength * 0.3);\n }\n if (r > 2 && Math.abs(elbowX - x1) > r * 2 && Math.abs(x2 - elbowX) > r * 2 && Math.abs(y2 - y1) > r * 2) {\n return `M ${x1} ${y1}` +\n ` H ${elbowX - dx * r}` +\n ` Q ${elbowX} ${y1} ${elbowX} ${y1 + dy * r}` +\n ` V ${y2 - dy * r}` +\n ` Q ${elbowX} ${y2} ${elbowX + ex * r} ${y2}` +\n ` H ${endX}`;\n }\n return `M ${x1} ${y1} H ${elbowX} V ${y2} H ${endX}`;\n }\n\n selectArrow() {\n this.isSelected = true;\n disableAllSideBars();\n arrowSideBar.classList.remove(\"hidden\");\n if (window.__showSidebarForShape) window.__showSidebarForShape('arrow');\n this.updateSidebar();\n this.draw();\n }\n\n removeSelection() {\n this.anchors.forEach(anchor => {\n if (anchor.parentNode === this.group) {\n this.group.removeChild(anchor);\n }\n });\n this.anchors = [];\n this.isSelected = false;\n }\n\n attachToShape(isStartPoint, shape, attachment) {\n if (isStartPoint) {\n this.attachedToStart = {\n shape: shape,\n side: attachment.side,\n offset: attachment.offset\n };\n this.startPoint = attachment.point;\n } else {\n this.attachedToEnd = {\n shape: shape,\n side: attachment.side,\n offset: attachment.offset\n };\n this.endPoint = attachment.point;\n }\n\n // Update control points if curved\n if (this.arrowCurved === \"curved\") {\n this.initializeCurveControlPoints();\n }\n\n this.draw();\n }\n\n draw() {\n // Clean up existing arrowhead element before redraw\n if (this._arrowHeadEl) {\n this._arrowHeadEl.remove();\n this._arrowHeadEl = null;\n }\n\n const childrenToRemove = [];\n const anchorSet = this._skipAnchors ? new Set(this.anchors) : null;\n for (let i = 0; i < this.group.children.length; i++) {\n const child = this.group.children[i];\n if (child !== this.labelElement && child !== this._hitArea && child !== this._labelBg) {\n if (anchorSet && anchorSet.has(child)) continue;\n childrenToRemove.push(child);\n }\n }\n childrenToRemove.forEach(child => this.group.removeChild(child));\n if (!this._skipAnchors) this.anchors = [];\n\n let pathData;\n let arrowEndPoint = this.endPoint;\n\n const elbowX = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n if (isNaN(this.controlPoint1.x) || isNaN(this.controlPoint1.y) ||\n isNaN(this.controlPoint2.x) || isNaN(this.controlPoint2.y)) {\n this.initializeCurveControlPoints();\n }\n\n pathData = `M ${this.startPoint.x} ${this.startPoint.y} ` +\n `C ${this.controlPoint1.x} ${this.controlPoint1.y}, ` +\n `${this.controlPoint2.x} ${this.controlPoint2.y}, ` +\n `${this.endPoint.x} ${this.endPoint.y}`;\n\n // Shorten curve endpoint so arrowhead sits cleanly at the tip\n const t = 0.95;\n const tangent = this.getCubicBezierTangent(t);\n const curveAngle = Math.atan2(tangent.y, tangent.x);\n\n if (this.arrowHeadStyle && this.arrowHeadStyle !== 'none') {\n arrowEndPoint = {\n x: this.endPoint.x - (this.arrowHeadLength * 0.3) * Math.cos(curveAngle),\n y: this.endPoint.y - (this.arrowHeadLength * 0.3) * Math.sin(curveAngle)\n };\n\n pathData = `M ${this.startPoint.x} ${this.startPoint.y} ` +\n `C ${this.controlPoint1.x} ${this.controlPoint1.y}, ` +\n `${this.controlPoint2.x} ${this.controlPoint2.y}, ` +\n `${arrowEndPoint.x} ${arrowEndPoint.y}`;\n }\n } else if (this.arrowCurved === \"elbow\") {\n pathData = this._buildElbowPath(elbowX, false);\n } else {\n pathData = `M ${this.startPoint.x} ${this.startPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`;\n }\n\n // Render arrowhead\n const headAngle = this._getArrowAngle(elbowX);\n if (this.arrowHeadStyle === \"default\") {\n const pts = this._getArrowHeadPoints(headAngle);\n pathData += ` M ${pts.x3} ${pts.y3} L ${this.endPoint.x} ${this.endPoint.y} L ${pts.x4} ${pts.y4}`;\n } else {\n this._renderArrowHead(headAngle);\n }\n\n const arrowPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n arrowPath.setAttribute(\"d\", pathData);\n arrowPath.setAttribute(\"stroke\", this.options.stroke);\n arrowPath.setAttribute(\"stroke-width\", this.options.strokeWidth);\n arrowPath.setAttribute(\"fill\", this.options.fill);\n\n if (this.options.strokeDasharray) {\n arrowPath.setAttribute(\"stroke-dasharray\", this.options.strokeDasharray);\n } else {\n arrowPath.removeAttribute(\"stroke-dasharray\");\n }\n\n arrowPath.setAttribute(\"stroke-linecap\", \"round\");\n arrowPath.setAttribute(\"stroke-linejoin\", \"round\");\n arrowPath.classList.add(\"arrow-path\");\n\n this.element = arrowPath;\n this.group.appendChild(this.element);\n\n // Hit area - thicker invisible path for dblclick detection\n {\n let hitPathData;\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n hitPathData = `M ${this.startPoint.x} ${this.startPoint.y} C ${this.controlPoint1.x} ${this.controlPoint1.y}, ${this.controlPoint2.x} ${this.controlPoint2.y}, ${this.endPoint.x} ${this.endPoint.y}`;\n } else if (this.arrowCurved === \"elbow\") {\n const ex = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n hitPathData = `M ${this.startPoint.x} ${this.startPoint.y} L ${ex} ${this.startPoint.y} L ${ex} ${this.endPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`;\n } else {\n hitPathData = `M ${this.startPoint.x} ${this.startPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`;\n }\n if (!this._hitArea) {\n this._hitArea = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n this._hitArea.setAttribute('fill', 'none');\n this._hitArea.setAttribute('stroke', 'transparent');\n this._hitArea.setAttribute('stroke-width', '20');\n this._hitArea.setAttribute('style', 'pointer-events: stroke;');\n this.group.appendChild(this._hitArea);\n }\n this._hitArea.setAttribute('d', hitPathData);\n }\n\n // Update embedded label at midpoint\n this._updateLabelElement();\n\n if (this.isSelected) {\n if (this._skipAnchors) {\n this.updateSelectionControls();\n } else {\n this.addAnchors();\n this.addAttachmentIndicators();\n }\n }\n }\n\n _buildFullPathData() {\n let pathData;\n const elbowX = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n if (isNaN(this.controlPoint1.x) || isNaN(this.controlPoint1.y) ||\n isNaN(this.controlPoint2.x) || isNaN(this.controlPoint2.y)) {\n this.initializeCurveControlPoints();\n }\n pathData = `M ${this.startPoint.x} ${this.startPoint.y} ` +\n `C ${this.controlPoint1.x} ${this.controlPoint1.y}, ` +\n `${this.controlPoint2.x} ${this.controlPoint2.y}, ` +\n `${this.endPoint.x} ${this.endPoint.y}`;\n\n if (this.arrowHeadStyle && this.arrowHeadStyle !== 'none') {\n const t = 0.95;\n const tangent = this.getCubicBezierTangent(t);\n const angle = Math.atan2(tangent.y, tangent.x);\n const arrowEndPoint = {\n x: this.endPoint.x - (this.arrowHeadLength * 0.3) * Math.cos(angle),\n y: this.endPoint.y - (this.arrowHeadLength * 0.3) * Math.sin(angle)\n };\n pathData = `M ${this.startPoint.x} ${this.startPoint.y} ` +\n `C ${this.controlPoint1.x} ${this.controlPoint1.y}, ` +\n `${this.controlPoint2.x} ${this.controlPoint2.y}, ` +\n `${arrowEndPoint.x} ${arrowEndPoint.y}`;\n }\n } else if (this.arrowCurved === \"elbow\") {\n pathData = this._buildElbowPath(elbowX, false);\n } else {\n pathData = `M ${this.startPoint.x} ${this.startPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`;\n }\n\n // Only include arrowhead in path string for default style\n if (this.arrowHeadStyle === \"default\") {\n const angle = this._getArrowAngle(elbowX);\n const pts = this._getArrowHeadPoints(angle);\n pathData += ` M ${pts.x3} ${pts.y3} L ${this.endPoint.x} ${this.endPoint.y} L ${pts.x4} ${pts.y4}`;\n }\n return pathData;\n }\n\n _updatePathElement() {\n if (!this.element) return;\n this.element.setAttribute(\"d\", this._buildFullPathData());\n this._updateArrowHead();\n }\n\n _updateHitArea() {\n if (!this._hitArea) return;\n let hitPathData;\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n hitPathData = `M ${this.startPoint.x} ${this.startPoint.y} C ${this.controlPoint1.x} ${this.controlPoint1.y}, ${this.controlPoint2.x} ${this.controlPoint2.y}, ${this.endPoint.x} ${this.endPoint.y}`;\n } else if (this.arrowCurved === \"elbow\") {\n const ex = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n hitPathData = `M ${this.startPoint.x} ${this.startPoint.y} L ${ex} ${this.startPoint.y} L ${ex} ${this.endPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`;\n } else {\n hitPathData = `M ${this.startPoint.x} ${this.startPoint.y} L ${this.endPoint.x} ${this.endPoint.y}`;\n }\n this._hitArea.setAttribute('d', hitPathData);\n }\n\n _getMidpoint() {\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n const p = this.getCubicBezierPoint(0.5);\n return { x: p.x, y: p.y };\n }\n if (this.arrowCurved === \"elbow\") {\n const ex = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n return { x: ex, y: (this.startPoint.y + this.endPoint.y) / 2 };\n }\n return {\n x: (this.startPoint.x + this.endPoint.x) / 2,\n y: (this.startPoint.y + this.endPoint.y) / 2\n };\n }\n\n _updateAnchorPositions() {\n if (!this.anchors || this.anchors.length === 0) return;\n\n const anchorSize = 5 / currentZoom;\n let anchorPositions = [this.startPoint, this.endPoint];\n\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n const midOnCurve = this.getCubicBezierPoint(0.5);\n anchorPositions.push(midOnCurve);\n } else if (this.arrowCurved === \"elbow\") {\n const elbowXVal = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n anchorPositions.push({ x: elbowXVal, y: midY });\n } else {\n // straight \u2014 offset end anchor past arrowhead\n const arrowAngle = Math.atan2(this.endPoint.y - this.startPoint.y, this.endPoint.x - this.startPoint.x);\n const arrowHeadClearance = this.arrowHeadLength + anchorSize - 10;\n anchorPositions[1] = {\n x: this.endPoint.x + arrowHeadClearance * Math.cos(arrowAngle),\n y: this.endPoint.y + arrowHeadClearance * Math.sin(arrowAngle)\n };\n }\n\n anchorPositions.forEach((point, index) => {\n if (this.anchors[index]) {\n this.anchors[index].setAttribute('cx', point.x);\n this.anchors[index].setAttribute('cy', point.y);\n }\n });\n }\n\n _updateLabelElement() {\n if (!this.label) {\n if (this.labelElement && this.labelElement.parentNode === this.group) {\n this.group.removeChild(this.labelElement);\n this.labelElement = null;\n }\n if (this._labelBg && this._labelBg.parentNode === this.group) {\n this.group.removeChild(this._labelBg);\n this._labelBg = null;\n }\n return;\n }\n\n if (!this.labelElement) {\n this.labelElement = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n this.labelElement.setAttribute('class', 'shape-label');\n this.labelElement.setAttribute('pointer-events', 'none');\n }\n\n const mid = this._getMidpoint();\n let lx = mid.x, ly = mid.y;\n if (this.labelOffsetY) {\n // Offset perpendicular to the line direction so the label lifts\n // clear of the stroke instead of sitting centered on top of it.\n const dx = this.endPoint.x - this.startPoint.x;\n const dy = this.endPoint.y - this.startPoint.y;\n const len = Math.sqrt(dx * dx + dy * dy) || 1;\n lx += (-dy / len) * this.labelOffsetY;\n ly += (dx / len) * this.labelOffsetY;\n }\n this.labelElement.setAttribute('x', lx);\n this.labelElement.setAttribute('y', ly);\n this.labelElement.setAttribute('text-anchor', 'middle');\n this.labelElement.setAttribute('dominant-baseline', 'central');\n this.labelElement.setAttribute('fill', this.labelColor);\n this.labelElement.setAttribute('font-size', this.labelFontSize);\n this.labelElement.setAttribute('font-family', 'lixFont, sans-serif');\n this.labelElement.textContent = this.label;\n\n if (!this.labelBg) {\n if (this._labelBg && this._labelBg.parentNode === this.group) {\n this.group.removeChild(this._labelBg);\n this._labelBg = null;\n }\n if (this.labelElement.parentNode === this.group) this.group.removeChild(this.labelElement);\n this.group.appendChild(this.labelElement);\n return;\n }\n\n // Background knockout rect - hides the arrow behind the text\n const canvasBg = window.getComputedStyle(svg).backgroundColor || '#000';\n if (!this._labelBg) {\n this._labelBg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n this._labelBg.setAttribute('pointer-events', 'none');\n }\n this._labelBg.setAttribute('fill', canvasBg);\n const hPadding = 4;\n const vPadding = 1;\n const charWidth = this.labelFontSize * 0.6;\n const bgW = this.label.length * charWidth + hPadding * 2;\n const bgH = this.labelFontSize + vPadding * 2;\n this._labelBg.setAttribute('x', lx - bgW / 2);\n this._labelBg.setAttribute('y', ly - bgH / 2);\n this._labelBg.setAttribute('width', bgW);\n this._labelBg.setAttribute('height', bgH);\n this._labelBg.setAttribute('rx', 2);\n\n // Re-append bg then text at end so they render ON TOP of the arrow path\n if (this._labelBg.parentNode === this.group) this.group.removeChild(this._labelBg);\n if (this.labelElement.parentNode === this.group) this.group.removeChild(this.labelElement);\n this.group.appendChild(this._labelBg);\n this.group.appendChild(this.labelElement);\n }\n\n _setupLabelDblClick() {\n this.group.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.startLabelEdit();\n });\n }\n\n startLabelEdit() {\n if (this._isEditingLabel) return;\n this._isEditingLabel = true;\n\n if (this.labelElement) {\n this.labelElement.setAttribute('visibility', 'hidden');\n }\n if (this._labelBg) {\n this._labelBg.setAttribute('visibility', 'hidden');\n }\n\n // Get midpoint in screen coords via CTM\n const mid = this._getMidpoint();\n const ctm = this.group.getScreenCTM();\n if (!ctm) { this._isEditingLabel = false; return; }\n\n const pt = svg.createSVGPoint();\n pt.x = mid.x; pt.y = mid.y;\n const screenMid = pt.matrixTransform(ctm);\n\n const editW = 160;\n const editH = 28;\n\n // Create HTML overlay centered on the midpoint\n const overlay = document.createElement('div');\n overlay.className = 'shape-label-editor';\n overlay.style.cssText = `\n position: fixed; z-index: 10000;\n left: ${screenMid.x - editW / 2}px; top: ${screenMid.y - editH / 2}px;\n width: ${editW}px; height: ${editH}px;\n display: flex; align-items: center; justify-content: center;\n pointer-events: auto;\n `;\n\n const canvasBg = window.getComputedStyle(svg).backgroundColor || '#000';\n const input = document.createElement('div');\n input.setAttribute('contenteditable', 'true');\n input.style.cssText = `\n width: 100%; height: 100%;\n background: ${canvasBg}; border: none;\n outline: none; padding: 2px 6px;\n color: ${this.labelColor}; font-size: ${this.labelFontSize}px;\n font-family: lixFont, sans-serif; text-align: center;\n display: flex; align-items: center; justify-content: center;\n white-space: pre-wrap; word-break: break-word;\n cursor: text;\n `;\n if (this.label) {\n input.textContent = this.label;\n } else {\n input.innerHTML = '&nbsp;';\n }\n\n overlay.appendChild(input);\n document.body.appendChild(overlay);\n\n setTimeout(() => {\n input.focus();\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(input);\n sel.removeAllRanges();\n sel.addRange(range);\n }, 10);\n\n const finishEdit = () => {\n const newText = input.textContent.trim().replace(/\\u00A0/g, '');\n this.label = newText;\n this._isEditingLabel = false;\n if (overlay.parentNode) overlay.parentNode.removeChild(overlay);\n if (this.labelElement) this.labelElement.removeAttribute('visibility');\n if (this._labelBg) this._labelBg.removeAttribute('visibility');\n this.draw();\n };\n\n input.addEventListener('blur', finishEdit);\n input.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); input.blur(); }\n if (e.key === 'Escape') { input.textContent = this.label; input.blur(); }\n });\n input.addEventListener('pointerdown', (e) => e.stopPropagation());\n input.addEventListener('pointermove', (e) => e.stopPropagation());\n input.addEventListener('pointerup', (e) => e.stopPropagation());\n }\n\n setLabel(text, color, fontSize) {\n this.label = text || '';\n if (color) this.labelColor = color;\n if (fontSize) this.labelFontSize = fontSize;\n this.draw();\n }\n\n getCubicBezierPoint(t) {\n if (!this.controlPoint1 || !this.controlPoint2) return this.startPoint;\n\n const mt = 1 - t;\n const mt2 = mt * mt;\n const mt3 = mt2 * mt;\n const t2 = t * t;\n const t3 = t2 * t;\n\n return {\n x: mt3 * this.startPoint.x + 3 * mt2 * t * this.controlPoint1.x +\n 3 * mt * t2 * this.controlPoint2.x + t3 * this.endPoint.x,\n y: mt3 * this.startPoint.y + 3 * mt2 * t * this.controlPoint1.y +\n 3 * mt * t2 * this.controlPoint2.y + t3 * this.endPoint.y\n };\n }\n\n getCubicBezierTangent(t) {\n if (!this.controlPoint1 || !this.controlPoint2) {\n return { x: this.endPoint.x - this.startPoint.x, y: this.endPoint.y - this.startPoint.y };\n }\n\n const mt = 1 - t;\n const mt2 = mt * mt;\n const t2 = t * t;\n\n return {\n x: 3 * mt2 * (this.controlPoint1.x - this.startPoint.x) +\n 6 * mt * t * (this.controlPoint2.x - this.controlPoint1.x) +\n 3 * t2 * (this.endPoint.x - this.controlPoint2.x),\n y: 3 * mt2 * (this.controlPoint1.y - this.startPoint.y) +\n 6 * mt * t * (this.controlPoint2.y - this.controlPoint1.y) +\n 3 * t2 * (this.endPoint.y - this.controlPoint2.y)\n };\n }\n\n _getArrowAngle(elbowX) {\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n const tangent = this.getCubicBezierTangent(1.0);\n return Math.atan2(tangent.y, tangent.x);\n } else if (this.arrowCurved === \"elbow\") {\n const ex = elbowX !== undefined ? elbowX : (this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2);\n return Math.atan2(0, this.endPoint.x - ex);\n } else {\n const dx = this.endPoint.x - this.startPoint.x;\n const dy = this.endPoint.y - this.startPoint.y;\n return Math.atan2(dy, dx);\n }\n }\n\n _getArrowHeadPoints(angle) {\n const rad = (this.arrowHeadAngleDeg * Math.PI) / 180;\n return {\n x3: this.endPoint.x - this.arrowHeadLength * Math.cos(angle - rad),\n y3: this.endPoint.y - this.arrowHeadLength * Math.sin(angle - rad),\n x4: this.endPoint.x - this.arrowHeadLength * Math.cos(angle + rad),\n y4: this.endPoint.y - this.arrowHeadLength * Math.sin(angle + rad)\n };\n }\n\n _renderArrowHead(angle) {\n if (this._arrowHeadEl) {\n this._arrowHeadEl.remove();\n this._arrowHeadEl = null;\n }\n\n const style = this.arrowHeadStyle;\n if (!style || style === 'default') return; // default is handled inline in pathData\n\n const pts = this._getArrowHeadPoints(angle);\n const tip = this.endPoint;\n let el;\n\n if (style === 'square') {\n const size = this.arrowHeadLength * 0.7;\n const perpX = -Math.sin(angle), perpY = Math.cos(angle);\n const backX = -Math.cos(angle), backY = -Math.sin(angle);\n const p1x = tip.x + perpX * size / 2, p1y = tip.y + perpY * size / 2;\n const p2x = tip.x - perpX * size / 2, p2y = tip.y - perpY * size / 2;\n const p3x = p2x + backX * size, p3y = p2y + backY * size;\n const p4x = p1x + backX * size, p4y = p1y + backY * size;\n el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n el.setAttribute(\"points\", `${p1x},${p1y} ${p2x},${p2y} ${p3x},${p3y} ${p4x},${p4y}`);\n el.setAttribute(\"fill\", \"none\");\n } else {\n // outline or solid - triangle\n el = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polygon\");\n el.setAttribute(\"points\", `${pts.x3},${pts.y3} ${tip.x},${tip.y} ${pts.x4},${pts.y4}`);\n el.setAttribute(\"fill\", style === 'solid' ? this.options.stroke : \"none\");\n }\n\n el.setAttribute(\"stroke\", this.options.stroke);\n el.setAttribute(\"stroke-width\", this.options.strokeWidth);\n el.setAttribute(\"stroke-linejoin\", \"round\");\n el.classList.add(\"arrow-head\");\n this._arrowHeadEl = el;\n this.group.appendChild(el);\n }\n\n _updateArrowHead() {\n if (!this._arrowHeadEl) return;\n const style = this.arrowHeadStyle;\n if (style === 'default' || !style) return;\n\n const elbowX = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n const angle = this._getArrowAngle(elbowX);\n const pts = this._getArrowHeadPoints(angle);\n const tip = this.endPoint;\n\n if (style === 'square') {\n const size = this.arrowHeadLength * 0.7;\n const perpX = -Math.sin(angle), perpY = Math.cos(angle);\n const backX = -Math.cos(angle), backY = -Math.sin(angle);\n const p1x = tip.x + perpX * size / 2, p1y = tip.y + perpY * size / 2;\n const p2x = tip.x - perpX * size / 2, p2y = tip.y - perpY * size / 2;\n const p3x = p2x + backX * size, p3y = p2y + backY * size;\n const p4x = p1x + backX * size, p4y = p1y + backY * size;\n this._arrowHeadEl.setAttribute(\"points\", `${p1x},${p1y} ${p2x},${p2y} ${p3x},${p3y} ${p4x},${p4y}`);\n } else {\n this._arrowHeadEl.setAttribute(\"points\", `${pts.x3},${pts.y3} ${tip.x},${tip.y} ${pts.x4},${pts.y4}`);\n }\n }\n\n updateSelectionControls() {\n if (!this.anchors || this.anchors.length === 0) return;\n\n const anchorSize = 5 / currentZoom;\n\n let anchorPositions = [this.startPoint, this.endPoint];\n\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n const midOnCurve = this.getCubicBezierPoint(0.5);\n anchorPositions.push(midOnCurve);\n } else if (this.arrowCurved === \"elbow\") {\n const elbowXVal = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n anchorPositions.push({ x: elbowXVal, y: midY });\n } else {\n // straight \u2014 offset end anchor past arrowhead\n const arrowAngle = Math.atan2(this.endPoint.y - this.startPoint.y, this.endPoint.x - this.startPoint.x);\n const arrowHeadClearance = this.arrowHeadLength + anchorSize - 10;\n anchorPositions[1] = {\n x: this.endPoint.x + arrowHeadClearance * Math.cos(arrowAngle),\n y: this.endPoint.y + arrowHeadClearance * Math.sin(arrowAngle)\n };\n }\n\n anchorPositions.forEach((point, index) => {\n if (this.anchors[index]) {\n this.anchors[index].setAttribute(\"cx\", point.x);\n this.anchors[index].setAttribute(\"cy\", point.y);\n this.anchors[index].setAttribute(\"r\", anchorSize);\n }\n });\n }\n\n addAnchors() {\n const anchorSize = 5 / currentZoom;\n const anchorStrokeWidth = 2;\n\n let anchorPositions = [this.startPoint, this.endPoint];\n\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n // Show a single on-curve anchor at t=0.5 for intuitive dragging\n const midOnCurve = this.getCubicBezierPoint(0.5);\n anchorPositions.push(midOnCurve);\n } else if (this.arrowCurved === \"elbow\") {\n const elbowXVal = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n const midY = (this.startPoint.y + this.endPoint.y) / 2;\n anchorPositions.push({ x: elbowXVal, y: midY });\n } else {\n // straight \u2014 offset end anchor past arrowhead\n const arrowAngle = Math.atan2(this.endPoint.y - this.startPoint.y, this.endPoint.x - this.startPoint.x);\n const arrowHeadClearance = this.arrowHeadLength + anchorSize - 10;\n anchorPositions[1] = {\n x: this.endPoint.x + arrowHeadClearance * Math.cos(arrowAngle),\n y: this.endPoint.y + arrowHeadClearance * Math.sin(arrowAngle)\n };\n }\n\n // Show sidebar\n disableAllSideBars();\n arrowSideBar.classList.remove(\"hidden\");\n if (window.__showSidebarForShape) window.__showSidebarForShape('arrow');\n this.updateSidebar();\n\n anchorPositions.forEach((point, index) => {\n const anchor = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n anchor.setAttribute(\"cx\", point.x);\n anchor.setAttribute(\"cy\", point.y);\n anchor.setAttribute(\"r\", anchorSize);\n\n if (this.arrowCurved && index >= 2) {\n anchor.setAttribute(\"fill\", \"#121212\");\n anchor.setAttribute(\"stroke\", \"#5B57D1\");\n } else {\n anchor.setAttribute(\"fill\", \"#121212\");\n anchor.setAttribute(\"stroke\", \"#5B57D1\");\n }\n\n anchor.setAttribute(\"stroke-width\", anchorStrokeWidth);\n anchor.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n anchor.setAttribute(\"class\", \"anchor arrow-anchor\");\n anchor.setAttribute(\"data-index\", index);\n anchor.style.cursor = \"grab\";\n anchor.style.pointerEvents = \"all\";\n anchor.addEventListener('pointerdown', (e) => this.startAnchorDrag(e, index));\n\n this.group.appendChild(anchor);\n this.anchors[index] = anchor;\n });\n }\n\n addAttachmentIndicators() {\n if (this.attachedToStart) {\n const attachPoint = this.calculateAttachedPoint(this.attachedToStart);\n const indicator = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n indicator.setAttribute(\"cx\", attachPoint.x);\n indicator.setAttribute(\"cy\", attachPoint.y);\n indicator.setAttribute(\"r\", 4);\n indicator.setAttribute(\"fill\", \"#5B57D1\");\n indicator.setAttribute(\"stroke\", \"#121212\");\n indicator.setAttribute(\"stroke-width\", 1);\n indicator.setAttribute(\"class\", \"attachment-indicator\");\n this.group.appendChild(indicator);\n }\n\n if (this.attachedToEnd) {\n const attachPoint = this.calculateAttachedPoint(this.attachedToEnd);\n const indicator = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n indicator.setAttribute(\"cx\", attachPoint.x);\n indicator.setAttribute(\"cy\", attachPoint.y);\n indicator.setAttribute(\"r\", 4);\n indicator.setAttribute(\"fill\", \"#5B57D1\");\n indicator.setAttribute(\"stroke\", \"#121212\");\n indicator.setAttribute(\"stroke-width\", 1);\n indicator.setAttribute(\"class\", \"attachment-indicator\");\n this.group.appendChild(indicator);\n }\n }\n\n getAttachmentState() {\n return {\n attachedToStart: this.attachedToStart ? {\n shapeId: this.attachedToStart.shape.shapeID,\n side: this.attachedToStart.side,\n offset: { ...this.attachedToStart.offset }\n } : null,\n attachedToEnd: this.attachedToEnd ? {\n shapeId: this.attachedToEnd.shape.shapeID,\n side: this.attachedToEnd.side,\n offset: { ...this.attachedToEnd.offset }\n } : null\n };\n }\n\n restoreAttachmentState(attachmentState) {\n this.attachedToStart = null;\n this.attachedToEnd = null;\n\n if (attachmentState.attachedToStart) {\n const shape = shapes.find(s => s.shapeID === attachmentState.attachedToStart.shapeId);\n if (shape) {\n this.attachedToStart = {\n shape: shape,\n side: attachmentState.attachedToStart.side,\n offset: { ...attachmentState.attachedToStart.offset }\n };\n this.startPoint = this.calculateAttachedPoint(this.attachedToStart);\n }\n }\n\n if (attachmentState.attachedToEnd) {\n const shape = shapes.find(s => s.shapeID === attachmentState.attachedToEnd.shapeId);\n if (shape) {\n this.attachedToEnd = {\n shape: shape,\n side: attachmentState.attachedToEnd.side,\n offset: { ...attachmentState.attachedToEnd.offset }\n };\n this.endPoint = this.calculateAttachedPoint(this.attachedToEnd);\n }\n }\n\n if (this.arrowCurved === \"curved\") {\n this.initializeCurveControlPoints();\n }\n\n this.draw();\n }\n\n static getEllipsePerimeterPoint(circle, angle) {\n // Calculate point on ellipse perimeter at given angle\n const cosAngle = Math.cos(angle);\n const sinAngle = Math.sin(angle);\n\n const a = circle.rx;\n const b = circle.ry;\n\n const t = Math.atan2(a * sinAngle, b * cosAngle);\n\n return {\n x: circle.x + a * Math.cos(t),\n y: circle.y + b * Math.sin(t)\n };\n }\n\n\n static findNearbyShape(point, tolerance = 20) {\n for (let shape of shapes) {\n // Can't attach to other arrows or lines\n if (shape.shapeName === 'arrow' || shape.shapeName === 'line') continue;\n\n let attachment = null;\n\n switch (shape.shapeName) {\n case 'rectangle':\n attachment = Arrow.getRectangleAttachmentPoint(point, shape, tolerance);\n break;\n case 'circle':\n attachment = Arrow.getCircleAttachmentPoint(point, shape, tolerance);\n break;\n case 'frame':\n attachment = Arrow.getFrameAttachmentPoint(point, shape, tolerance);\n break;\n case 'text':\n case 'code':\n // Text and code shapes wrap a group element\n if (shape.group) {\n attachment = Arrow.getTextAttachmentPoint(point, shape.group, tolerance);\n }\n break;\n case 'image':\n // Image shapes wrap an element\n if (shape.element) {\n attachment = Arrow.getImageAttachmentPoint(point, shape.element, tolerance);\n }\n break;\n case 'icon':\n if (shape.element) {\n attachment = Arrow.getIconAttachmentPoint(point, shape.element, tolerance);\n }\n break;\n case 'freehandStroke':\n attachment = Arrow.getBoundingBoxAttachmentPoint(point, shape, tolerance);\n break;\n case 'line':\n attachment = Arrow.getLineAttachmentPoint(point, shape, tolerance);\n break;\n }\n\n if (attachment) {\n return { shape, attachment };\n }\n }\n return null;\n}\n\n static getBoundingBoxAttachmentPoint(point, shape, tolerance = 20) {\n const bounds = shape.boundingBox || { x: shape.x, y: shape.y, width: shape.width, height: shape.height };\n if (!bounds || bounds.width === 0 || bounds.height === 0) return null;\n\n const sides = [\n { name: 'top', start: { x: bounds.x, y: bounds.y }, end: { x: bounds.x + bounds.width, y: bounds.y } },\n { name: 'right', start: { x: bounds.x + bounds.width, y: bounds.y }, end: { x: bounds.x + bounds.width, y: bounds.y + bounds.height } },\n { name: 'bottom', start: { x: bounds.x + bounds.width, y: bounds.y + bounds.height }, end: { x: bounds.x, y: bounds.y + bounds.height } },\n { name: 'left', start: { x: bounds.x, y: bounds.y + bounds.height }, end: { x: bounds.x, y: bounds.y } }\n ];\n\n let closestSide = null;\n let minDistance = tolerance;\n let attachPoint = null;\n\n sides.forEach(side => {\n const distance = Arrow.pointToLineSegmentDistance(point, side.start, side.end);\n if (distance < minDistance) {\n minDistance = distance;\n closestSide = side.name;\n attachPoint = Arrow.closestPointOnLineSegment(point, side.start, side.end);\n }\n });\n\n if (closestSide && attachPoint) {\n const offset = {\n x: attachPoint.x - bounds.x,\n y: attachPoint.y - bounds.y,\n side: closestSide\n };\n return { side: closestSide, point: attachPoint, offset };\n }\n return null;\n }\n\n static getLineAttachmentPoint(point, line, tolerance = 20) {\n const start = line.startPoint;\n const end = line.endPoint;\n if (!start || !end) return null;\n\n const distance = Arrow.pointToLineSegmentDistance(point, start, end);\n if (distance >= tolerance) return null;\n\n const attachPoint = Arrow.closestPointOnLineSegment(point, start, end);\n // Store as a parametric t value along the line\n const dx = end.x - start.x;\n const dy = end.y - start.y;\n const lenSq = dx * dx + dy * dy;\n const t = lenSq > 0 ? ((attachPoint.x - start.x) * dx + (attachPoint.y - start.y) * dy) / lenSq : 0;\n\n return {\n side: 'line',\n point: attachPoint,\n offset: { t: Math.max(0, Math.min(1, t)), side: 'line' }\n };\n }\n\nstatic getIconAttachmentPoint(point, iconElement, tolerance = 20) {\n // Check if it's an SVG icon element (group)\n if (!iconElement || (iconElement.tagName !== 'g' && (!iconElement.getAttribute || iconElement.getAttribute('type') !== 'icon'))) {\n console.warn('Invalid icon element for attachment:', iconElement);\n return null;\n }\n\n // Get icon position and dimensions from data attributes\n const iconX = parseFloat(iconElement.getAttribute('data-shape-x') || iconElement.getAttribute('x'));\n const iconY = parseFloat(iconElement.getAttribute('data-shape-y') || iconElement.getAttribute('y'));\n const iconWidth = parseFloat(iconElement.getAttribute('data-shape-width') || iconElement.getAttribute('width'));\n const iconHeight = parseFloat(iconElement.getAttribute('data-shape-height') || iconElement.getAttribute('height'));\n\n // Get rotation from data attribute or transform attribute\n let rotation = 0;\n const dataRotation = iconElement.getAttribute('data-shape-rotation');\n if (dataRotation) {\n rotation = parseFloat(dataRotation) * Math.PI / 180; // Convert to radians\n } else {\n const transform = iconElement.getAttribute('transform');\n if (transform) {\n const rotateMatch = transform.match(/rotate\\(([^,]+)/);\n if (rotateMatch) {\n rotation = parseFloat(rotateMatch[1]) * Math.PI / 180; // Convert to radians\n }\n }\n }\n\n const centerX = iconX + iconWidth / 2;\n const centerY = iconY + iconHeight / 2;\n\n // Transform the bounding box corners to world coordinates\n const corners = [\n { x: iconX, y: iconY }, // top-left\n { x: iconX + iconWidth, y: iconY }, // top-right\n { x: iconX + iconWidth, y: iconY + iconHeight }, // bottom-right\n { x: iconX, y: iconY + iconHeight } // bottom-left\n ];\n\n // Apply rotation to corners\n const transformedCorners = corners.map(corner => {\n if (rotation === 0) return corner;\n\n const dx = corner.x - centerX;\n const dy = corner.y - centerY;\n\n return {\n x: centerX + dx * Math.cos(rotation) - dy * Math.sin(rotation),\n y: centerY + dx * Math.sin(rotation) + dy * Math.cos(rotation)\n };\n });\n\n // Calculate sides of the transformed rectangle\n const sides = [\n { name: 'top', start: transformedCorners[0], end: transformedCorners[1] },\n { name: 'right', start: transformedCorners[1], end: transformedCorners[2] },\n { name: 'bottom', start: transformedCorners[2], end: transformedCorners[3] },\n { name: 'left', start: transformedCorners[3], end: transformedCorners[0] }\n ];\n\n let closestSide = null;\n let minDistance = tolerance;\n let attachPoint = null;\n\n sides.forEach(side => {\n const distance = Arrow.pointToLineSegmentDistance(point, side.start, side.end);\n if (distance < minDistance) {\n minDistance = distance;\n closestSide = side.name;\n\n // Calculate the closest point on the line segment\n attachPoint = Arrow.closestPointOnLineSegment(point, side.start, side.end);\n }\n });\n\n if (closestSide && attachPoint) {\n // Calculate offset relative to the original icon rectangle\n // Transform the attach point back to local coordinates\n let localPoint = attachPoint;\n if (rotation !== 0) {\n const dx = attachPoint.x - centerX;\n const dy = attachPoint.y - centerY;\n\n localPoint = {\n x: centerX + dx * Math.cos(-rotation) - dy * Math.sin(-rotation),\n y: centerY + dx * Math.sin(-rotation) + dy * Math.cos(-rotation)\n };\n }\n\n // Calculate offset relative to the icon rectangle\n const offset = {\n x: localPoint.x - iconX,\n y: localPoint.y - iconY,\n side: closestSide\n };\n\n return { side: closestSide, point: attachPoint, offset };\n }\n\n return null;\n}\n\n\n static getImageAttachmentPoint(point, imageElement, tolerance = 20) {\n // Check if it's an SVG image element\n if (!imageElement || (imageElement.tagName !== 'image' && (!imageElement.getAttribute || imageElement.getAttribute('type') !== 'image'))) {\n console.warn('Invalid image element for attachment:', imageElement);\n return null;\n }\n\n // Get image position and dimensions from data attributes\n const imgX = parseFloat(imageElement.getAttribute('data-shape-x') || imageElement.getAttribute('x'));\n const imgY = parseFloat(imageElement.getAttribute('data-shape-y') || imageElement.getAttribute('y'));\n const imgWidth = parseFloat(imageElement.getAttribute('data-shape-width') || imageElement.getAttribute('width'));\n const imgHeight = parseFloat(imageElement.getAttribute('data-shape-height') || imageElement.getAttribute('height'));\n\n // Get rotation from data attribute or transform attribute\n let rotation = 0;\n const dataRotation = imageElement.getAttribute('data-shape-rotation');\n if (dataRotation) {\n rotation = parseFloat(dataRotation) * Math.PI / 180; // Convert to radians\n } else {\n const transform = imageElement.getAttribute('transform');\n if (transform) {\n const rotateMatch = transform.match(/rotate\\(([^,]+)/);\n if (rotateMatch) {\n rotation = parseFloat(rotateMatch[1]) * Math.PI / 180; // Convert to radians\n }\n }\n }\n\n const centerX = imgX + imgWidth / 2;\n const centerY = imgY + imgHeight / 2;\n\n // Transform the bounding box corners to world coordinates\n const corners = [\n { x: imgX, y: imgY }, // top-left\n { x: imgX + imgWidth, y: imgY }, // top-right\n { x: imgX + imgWidth, y: imgY + imgHeight }, // bottom-right\n { x: imgX, y: imgY + imgHeight } // bottom-left\n ];\n\n // Apply rotation to corners\n const transformedCorners = corners.map(corner => {\n if (rotation === 0) return corner;\n\n const dx = corner.x - centerX;\n const dy = corner.y - centerY;\n\n return {\n x: centerX + dx * Math.cos(rotation) - dy * Math.sin(rotation),\n y: centerY + dx * Math.sin(rotation) + dy * Math.cos(rotation)\n };\n });\n\n // Calculate sides of the transformed rectangle\n const sides = [\n { name: 'top', start: transformedCorners[0], end: transformedCorners[1] },\n { name: 'right', start: transformedCorners[1], end: transformedCorners[2] },\n { name: 'bottom', start: transformedCorners[2], end: transformedCorners[3] },\n { name: 'left', start: transformedCorners[3], end: transformedCorners[0] }\n ];\n\n let closestSide = null;\n let minDistance = tolerance;\n let attachPoint = null;\n\n sides.forEach(side => {\n const distance = Arrow.pointToLineSegmentDistance(point, side.start, side.end);\n if (distance < minDistance) {\n minDistance = distance;\n closestSide = side.name;\n\n // Calculate the closest point on the line segment\n attachPoint = Arrow.closestPointOnLineSegment(point, side.start, side.end);\n }\n });\n\n if (closestSide && attachPoint) {\n // Calculate offset relative to the original image rectangle\n // Transform the attach point back to local coordinates\n let localPoint = attachPoint;\n if (rotation !== 0) {\n const dx = attachPoint.x - centerX;\n const dy = attachPoint.y - centerY;\n\n localPoint = {\n x: centerX + dx * Math.cos(-rotation) - dy * Math.sin(-rotation),\n y: centerY + dx * Math.sin(-rotation) + dy * Math.cos(-rotation)\n };\n }\n\n // Calculate offset relative to the image rectangle\n const offset = {\n x: localPoint.x - imgX,\n y: localPoint.y - imgY,\n side: closestSide\n };\n\n return { side: closestSide, point: attachPoint, offset };\n }\n\n return null;\n}\n\nstatic getFrameAttachmentPoint(point, frame, tolerance = 20) {\n const rect = {\n left: frame.x,\n right: frame.x + frame.width,\n top: frame.y,\n bottom: frame.y + frame.height\n };\n\n const distances = {\n top: Math.abs(point.y - rect.top),\n bottom: Math.abs(point.y - rect.bottom),\n left: Math.abs(point.x - rect.left),\n right: Math.abs(point.x - rect.right)\n };\n\n let closestSide = null;\n let minDistance = tolerance;\n\n for (let side in distances) {\n if (distances[side] < minDistance) {\n if ((side === 'top' || side === 'bottom') &&\n point.x >= rect.left - tolerance && point.x <= rect.right + tolerance) {\n closestSide = side;\n minDistance = distances[side];\n } else if ((side === 'left' || side === 'right') &&\n point.y >= rect.top - tolerance && point.y <= rect.bottom + tolerance) {\n closestSide = side;\n minDistance = distances[side];\n }\n }\n }\n\n if (closestSide) {\n let attachPoint, offset;\n\n switch (closestSide) {\n case 'top':\n attachPoint = { x: Math.max(rect.left, Math.min(rect.right, point.x)), y: rect.top };\n offset = { x: attachPoint.x - frame.x, y: 0 };\n break;\n case 'bottom':\n attachPoint = { x: Math.max(rect.left, Math.min(rect.right, point.x)), y: rect.bottom };\n offset = { x: attachPoint.x - frame.x, y: frame.height };\n break;\n case 'left':\n attachPoint = { x: rect.left, y: Math.max(rect.top, Math.min(rect.bottom, point.y)) };\n offset = { x: 0, y: attachPoint.y - frame.y };\n break;\n case 'right':\n attachPoint = { x: rect.right, y: Math.max(rect.top, Math.min(rect.bottom, point.y)) };\n offset = { x: frame.width, y: attachPoint.y - frame.y };\n break;\n }\n\n return { side: closestSide, point: attachPoint, offset };\n }\n\n return null;\n}\n\n static getRectangleAttachmentPoint(point, rectangle, tolerance = 20) {\n const rect = {\n left: rectangle.x,\n right: rectangle.x + rectangle.width,\n top: rectangle.y,\n bottom: rectangle.y + rectangle.height\n };\n\n const distances = {\n top: Math.abs(point.y - rect.top),\n bottom: Math.abs(point.y - rect.bottom),\n left: Math.abs(point.x - rect.left),\n right: Math.abs(point.x - rect.right)\n };\n\n let closestSide = null;\n let minDistance = tolerance;\n\n for (let side in distances) {\n if (distances[side] < minDistance) {\n if ((side === 'top' || side === 'bottom') &&\n point.x >= rect.left - tolerance && point.x <= rect.right + tolerance) {\n closestSide = side;\n minDistance = distances[side];\n } else if ((side === 'left' || side === 'right') &&\n point.y >= rect.top - tolerance && point.y <= rect.bottom + tolerance) {\n closestSide = side;\n minDistance = distances[side];\n }\n }\n }\n\n if (closestSide) {\n let attachPoint, offset;\n\n switch (closestSide) {\n case 'top':\n attachPoint = { x: Math.max(rect.left, Math.min(rect.right, point.x)), y: rect.top };\n offset = { x: attachPoint.x - rectangle.x, y: 0 };\n break;\n case 'bottom':\n attachPoint = { x: Math.max(rect.left, Math.min(rect.right, point.x)), y: rect.bottom };\n offset = { x: attachPoint.x - rectangle.x, y: rectangle.height };\n break;\n case 'left':\n attachPoint = { x: rect.left, y: Math.max(rect.top, Math.min(rect.bottom, point.y)) };\n offset = { x: 0, y: attachPoint.y - rectangle.y };\n break;\n case 'right':\n attachPoint = { x: rect.right, y: Math.max(rect.top, Math.min(rect.bottom, point.y)) };\n offset = { x: rectangle.width, y: attachPoint.y - rectangle.y };\n break;\n }\n\n return { side: closestSide, point: attachPoint, offset };\n }\n\n return null;\n }\n\n static getCircleAttachmentPoint(point, circle, tolerance = 20) {\n // Calculate distance from point to circle center\n const dx = point.x - circle.x;\n const dy = point.y - circle.y;\n const distanceToCenter = Math.sqrt(dx * dx + dy * dy);\n\n const averageRadius = (circle.rx + circle.ry) / 2;\n const distanceToPerimeter = Math.abs(distanceToCenter - averageRadius);\n\n if (distanceToPerimeter <= tolerance) {\n\n const angle = Math.atan2(dy, dx);\n\n\n const attachPoint = this.getEllipsePerimeterPoint(circle, angle);\n\n\n const offset = {\n angle: angle,\n radiusRatioX: (attachPoint.x - circle.x) / circle.rx,\n radiusRatioY: (attachPoint.y - circle.y) / circle.ry\n };\n\n return {\n side: 'perimeter',\n point: attachPoint,\n offset: offset\n };\n }\n\n return null;\n }\n\n static getTextAttachmentPoint(point, textGroup, tolerance = 20) {\n if (!textGroup) return null;\n // Accept groups with type='text' or type='code'\n const groupType = textGroup.getAttribute ? textGroup.getAttribute('type') : textGroup.type;\n if (groupType !== 'text' && groupType !== 'code') return null;\n\n const textElement = textGroup.querySelector('text');\n if (!textElement) return null;\n\n // Get the text bounding box\n const bbox = textElement.getBBox();\n\n // Get the group's transform\n const groupTransform = textGroup.transform.baseVal.consolidate();\n const matrix = groupTransform ? groupTransform.matrix : { e: 0, f: 0, a: 1, b: 0, c: 0, d: 1 };\n\n // Transform the bounding box corners to world coordinates\n const corners = [\n { x: bbox.x, y: bbox.y }, // top-left\n { x: bbox.x + bbox.width, y: bbox.y }, // top-right\n { x: bbox.x + bbox.width, y: bbox.y + bbox.height }, // bottom-right\n { x: bbox.x, y: bbox.y + bbox.height } // bottom-left\n ];\n\n // Transform corners using the group's transform matrix\n const transformedCorners = corners.map(corner => ({\n x: corner.x * matrix.a + corner.y * matrix.c + matrix.e,\n y: corner.x * matrix.b + corner.y * matrix.d + matrix.f\n }));\n\n // Calculate sides of the transformed rectangle\n const sides = [\n { name: 'top', start: transformedCorners[0], end: transformedCorners[1] },\n { name: 'right', start: transformedCorners[1], end: transformedCorners[2] },\n { name: 'bottom', start: transformedCorners[2], end: transformedCorners[3] },\n { name: 'left', start: transformedCorners[3], end: transformedCorners[0] }\n ];\n\n let closestSide = null;\n let minDistance = tolerance;\n let attachPoint = null;\n\n sides.forEach(side => {\n const distance = Arrow.pointToLineSegmentDistance(point, side.start, side.end);\n if (distance < minDistance) {\n minDistance = distance;\n closestSide = side.name;\n\n // Calculate the closest point on the line segment\n attachPoint = Arrow.closestPointOnLineSegment(point, side.start, side.end);\n }\n });\n\n if (closestSide && attachPoint) {\n // Calculate offset relative to the original bounding box\n // Transform the attach point back to local coordinates\n const det = matrix.a * matrix.d - matrix.b * matrix.c;\n if (det === 0) return null;\n\n const invMatrix = {\n a: matrix.d / det,\n b: -matrix.b / det,\n c: -matrix.c / det,\n d: matrix.a / det,\n e: (matrix.c * matrix.f - matrix.d * matrix.e) / det,\n f: (matrix.b * matrix.e - matrix.a * matrix.f) / det\n };\n\n const localPoint = {\n x: attachPoint.x * invMatrix.a + attachPoint.y * invMatrix.c + invMatrix.e,\n y: attachPoint.x * invMatrix.b + attachPoint.y * invMatrix.d + invMatrix.f\n };\n\n // Calculate offset relative to the bounding box\n const offset = {\n x: localPoint.x - bbox.x,\n y: localPoint.y - bbox.y,\n side: closestSide\n };\n\n return { side: closestSide, point: attachPoint, offset };\n }\n\n return null;\n }\n\n static pointToLineSegmentDistance(point, lineStart, lineEnd) {\n const A = point.x - lineStart.x;\n const B = point.y - lineStart.y;\n const C = lineEnd.x - lineStart.x;\n const D = lineEnd.y - lineStart.y;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n\n if (lenSq === 0) {\n // Line segment is a point\n return Math.sqrt(A * A + B * B);\n }\n\n let param = dot / lenSq;\n param = Math.max(0, Math.min(1, param)); // Clamp to [0,1]\n\n const xx = lineStart.x + param * C;\n const yy = lineStart.y + param * D;\n\n const dx = point.x - xx;\n const dy = point.y - yy;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n static closestPointOnLineSegment(point, lineStart, lineEnd) {\n const A = point.x - lineStart.x;\n const B = point.y - lineStart.y;\n const C = lineEnd.x - lineStart.x;\n const D = lineEnd.y - lineStart.y;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n\n if (lenSq === 0) {\n return { x: lineStart.x, y: lineStart.y };\n }\n\n let param = dot / lenSq;\n param = Math.max(0, Math.min(1, param));\n\n return {\n x: lineStart.x + param * C,\n y: lineStart.y + param * D\n };\n }\n\n calculateAttachedPoint(attachment) {\n const shape = attachment.shape;\n const side = attachment.side;\n const offset = attachment.offset;\n\n if (shape.shapeName === 'rectangle') {\n return Arrow._calcRectAttachedPoint(shape.x, shape.y, shape.width, shape.height, shape.rotation, side, offset);\n }\n\n if (shape.shapeName === 'circle') {\n if (side === 'perimeter') {\n return Arrow.getEllipsePerimeterPoint(shape, offset.angle);\n }\n }\n\n if (shape.shapeName === 'text' || shape.shapeName === 'code') {\n // Text/code shapes use their group's transform\n const groupEl = shape.group;\n if (!groupEl) return { x: shape.x || 0, y: shape.y || 0 };\n const textElement = groupEl.querySelector('text') || groupEl.querySelector('foreignObject');\n if (!textElement) return { x: shape.x || 0, y: shape.y || 0 };\n\n const bbox = textElement.getBBox();\n const groupTransform = groupEl.transform.baseVal.consolidate();\n const matrix = groupTransform ? groupTransform.matrix : { e: 0, f: 0, a: 1, b: 0, c: 0, d: 1 };\n\n let localPoint = { x: bbox.x + offset.x, y: bbox.y + offset.y };\n return {\n x: localPoint.x * matrix.a + localPoint.y * matrix.c + matrix.e,\n y: localPoint.x * matrix.b + localPoint.y * matrix.d + matrix.f\n };\n }\n\n if (shape.shapeName === 'image') {\n return Arrow._calcRectAttachedPoint(shape.x, shape.y, shape.width, shape.height, shape.rotation, side, offset);\n }\n\n if (shape.shapeName === 'icon') {\n return Arrow._calcRectAttachedPoint(shape.x, shape.y, shape.width, shape.height, shape.rotation, side, offset);\n }\n\n if (shape.shapeName === 'frame') {\n return Arrow._calcRectAttachedPoint(shape.x, shape.y, shape.width, shape.height, 0, side, offset);\n }\n\n if (shape.shapeName === 'freehandStroke') {\n const bounds = shape.boundingBox || { x: shape.x, y: shape.y, width: shape.width, height: shape.height };\n return Arrow._calcRectAttachedPoint(bounds.x, bounds.y, bounds.width, bounds.height, 0, side, offset);\n }\n\n if (shape.shapeName === 'line') {\n if (side === 'line' && offset.t !== undefined) {\n const t = offset.t;\n return {\n x: shape.startPoint.x + t * (shape.endPoint.x - shape.startPoint.x),\n y: shape.startPoint.y + t * (shape.endPoint.y - shape.startPoint.y)\n };\n }\n }\n\n return { x: shape.x || 0, y: shape.y || 0 };\n}\n\n static _calcRectAttachedPoint(rx, ry, rw, rh, rotation, side, offset) {\n let localPoint;\n switch (side) {\n case 'top':\n localPoint = { x: rx + offset.x, y: ry };\n break;\n case 'bottom':\n localPoint = { x: rx + offset.x, y: ry + rh };\n break;\n case 'left':\n localPoint = { x: rx, y: ry + offset.y };\n break;\n case 'right':\n localPoint = { x: rx + rw, y: ry + offset.y };\n break;\n default:\n localPoint = { x: rx + offset.x, y: ry + offset.y };\n }\n\n if (rotation) {\n const rad = rotation * Math.PI / 180;\n const cx = rx + rw / 2;\n const cy = ry + rh / 2;\n const dx = localPoint.x - cx;\n const dy = localPoint.y - cy;\n return {\n x: cx + dx * Math.cos(rad) - dy * Math.sin(rad),\n y: cy + dx * Math.sin(rad) + dy * Math.cos(rad)\n };\n }\n return localPoint;\n }\n\n detachFromShape(isStartPoint) {\n if (isStartPoint) {\n this.attachedToStart = null;\n } else {\n this.attachedToEnd = null;\n }\n }\n\n updateAttachments() {\n let needsRedraw = false;\n\n if (this.attachedToStart && this.attachedToStart.shape) {\n const newPoint = this.calculateAttachedPoint(this.attachedToStart);\n if (newPoint.x !== this.startPoint.x || newPoint.y !== this.startPoint.y) {\n this.startPoint = newPoint;\n needsRedraw = true;\n }\n }\n\n if (this.attachedToEnd && this.attachedToEnd.shape) {\n const newPoint = this.calculateAttachedPoint(this.attachedToEnd);\n if (newPoint.x !== this.endPoint.x || newPoint.y !== this.endPoint.y) {\n this.endPoint = newPoint;\n needsRedraw = true;\n }\n }\n\n if (needsRedraw) {\n if (this.arrowCurved) {\n this.initializeCurveControlPoints();\n }\n this.draw();\n }\n }\n\n move(dx, dy) {\n if (!this.attachedToStart) {\n this.startPoint.x += dx;\n this.startPoint.y += dy;\n }\n if (!this.attachedToEnd) {\n this.endPoint.x += dx;\n this.endPoint.y += dy;\n }\n\n if (this.controlPoint1 && (!this.attachedToStart && !this.attachedToEnd)) {\n this.controlPoint1.x += dx;\n this.controlPoint1.y += dy;\n }\n if (this.controlPoint2 && (!this.attachedToStart && !this.attachedToEnd)) {\n this.controlPoint2.x += dx;\n this.controlPoint2.y += dy;\n }\n\n // Lightweight update \u2014 rebuild the path element without full draw/anchor rebuild\n this._updatePathElement();\n this._updateHitArea();\n this._updateLabelElement();\n this._updateAnchorPositions();\n\n // Only update frame containment if we're actively dragging the shape itself\n // and not being moved by a parent frame\n if (isDragging && !this.isBeingMovedByFrame) {\n this.updateFrameContainment();\n }\n}\n\nupdateFrameContainment() {\n // Don't update if we're being moved by a frame\n if (this.isBeingMovedByFrame) return;\n \n let targetFrame = null;\n \n // Find which frame this shape is over\n shapes.forEach(shape => {\n if (shape.shapeName === 'frame' && shape.isShapeInFrame(this)) {\n targetFrame = shape;\n }\n });\n \n // If we have a parent frame and we're being dragged, temporarily remove clipping\n if (this.parentFrame && isDragging) {\n this.parentFrame.temporarilyRemoveFromFrame(this);\n }\n \n // Update frame highlighting\n if (hoveredFrameArrow && hoveredFrameArrow !== targetFrame) {\n hoveredFrameArrow.removeHighlight();\n }\n \n if (targetFrame && targetFrame !== hoveredFrameArrow) {\n targetFrame.highlightFrame();\n }\n \n hoveredFrameArrow = targetFrame;\n}\n\n isNearAnchor(x, y) {\n const anchorSize = 10 / currentZoom;\n\n for (let i = 0; i < this.anchors.length; i++) {\n const anchor = this.anchors[i];\n if (anchor) {\n const anchorX = parseFloat(anchor.getAttribute('cx'));\n const anchorY = parseFloat(anchor.getAttribute('cy'));\n const distance = Math.sqrt(Math.pow(x - anchorX, 2) + Math.pow(y - anchorY, 2));\n if (distance <= anchorSize) {\n return { type: 'anchor', index: i };\n }\n }\n }\n\n return null;\n }\n\n startAnchorDrag(e, index) {\n e.stopPropagation();\n e.preventDefault();\n\n // Store initial state including attachments\n dragOldPosArrow = {\n startPoint: { x: this.startPoint.x, y: this.startPoint.y },\n endPoint: { x: this.endPoint.x, y: this.endPoint.y },\n controlPoint1: this.controlPoint1 ? { x: this.controlPoint1.x, y: this.controlPoint1.y } : null,\n controlPoint2: this.controlPoint2 ? { x: this.controlPoint2.x, y: this.controlPoint2.y } : null,\n attachments: this.getAttachmentState()\n };\n\n const onPointerMove = (event) => {\n const { x, y } = getSVGCoordsFromMouse(event);\n\n // Check for potential attachment when dragging start or end anchors\n if (index === 0 || index === 1) {\n const nearbyShape = Arrow.findNearbyShape({ x, y });\n if (nearbyShape) {\n // Show preview while dragging\n const existingPreview = svg.querySelector('.attachment-preview');\n if (existingPreview) existingPreview.remove();\n\n const preview = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n preview.setAttribute(\"cx\", nearbyShape.attachment.point.x);\n preview.setAttribute(\"cy\", nearbyShape.attachment.point.y);\n preview.setAttribute(\"r\", 6);\n preview.setAttribute(\"fill\", \"none\");\n preview.setAttribute(\"stroke\", \"#5B57D1\");\n preview.setAttribute(\"stroke-width\", 2);\n preview.setAttribute(\"class\", \"attachment-preview\");\n preview.setAttribute(\"opacity\", \"0.7\");\n svg.appendChild(preview);\n\n // Snap to attachment point\n this.updatePosition(index, nearbyShape.attachment.point.x, nearbyShape.attachment.point.y);\n } else {\n\n const existingPreview = svg.querySelector('.attachment-preview');\n if (existingPreview) existingPreview.remove();\n\n this.updatePosition(index, x, y);\n }\n } else {\n this.updatePosition(index, x, y);\n }\n };\n\n const onPointerUp = () => {\n\n const existingPreview = svg.querySelector('.attachment-preview');\n if (existingPreview) existingPreview.remove();\n\n if (index === 0) {\n // Check for start point attachment\n const startAttachment = Arrow.findNearbyShape(this.startPoint);\n if (startAttachment) {\n\n if (this.attachedToStart && this.attachedToStart.shape !== startAttachment.shape) {\n this.detachFromShape(true);\n }\n this.attachToShape(true, startAttachment.shape, startAttachment.attachment);\n } else {\n // Detach if moved away from shape\n if (this.attachedToStart) {\n this.detachFromShape(true);\n }\n }\n } else if (index === 1) {\n // Check for end point attachment\n const endAttachment = Arrow.findNearbyShape(this.endPoint);\n if (endAttachment) {\n // Detach if previously attached to different shape\n if (this.attachedToEnd && this.attachedToEnd.shape !== endAttachment.shape) {\n this.detachFromShape(false);\n }\n this.attachToShape(false, endAttachment.shape, endAttachment.attachment);\n } else {\n // Detach if moved away from shape\n if (this.attachedToEnd) {\n this.detachFromShape(false);\n }\n }\n }\n\n if (dragOldPosArrow) {\n const newPos = {\n startPoint: { x: this.startPoint.x, y: this.startPoint.y },\n endPoint: { x: this.endPoint.x, y: this.endPoint.y },\n controlPoint1: this.controlPoint1 ? { x: this.controlPoint1.x, y: this.controlPoint1.y } : null,\n controlPoint2: this.controlPoint2 ? { x: this.controlPoint2.x, y: this.controlPoint2.y } : null,\n attachments: this.getAttachmentState()\n };\n\n // Check if anything actually changed (position or attachments)\n const stateChanged =\n dragOldPosArrow.startPoint.x !== newPos.startPoint.x ||\n dragOldPosArrow.startPoint.y !== newPos.startPoint.y ||\n dragOldPosArrow.endPoint.x !== newPos.endPoint.x ||\n dragOldPosArrow.endPoint.y !== newPos.endPoint.y ||\n JSON.stringify(dragOldPosArrow.attachments) !== JSON.stringify(newPos.attachments);\n\n if (stateChanged) {\n pushTransformAction(this, dragOldPosArrow, newPos);\n }\n dragOldPosArrow = null;\n }\n\n svg.removeEventListener('pointermove', onPointerMove);\n svg.removeEventListener('pointerup', onPointerUp);\n };\n\n svg.addEventListener('pointermove', onPointerMove);\n svg.addEventListener('pointerup', onPointerUp);\n }\n\n updatePosition(anchorIndex, newViewBoxX, newViewBoxY) {\n if (anchorIndex === 0) {\n this.startPoint.x = newViewBoxX;\n this.startPoint.y = newViewBoxY;\n } else if (anchorIndex === 1) {\n this.endPoint.x = newViewBoxX;\n this.endPoint.y = newViewBoxY;\n } else if (anchorIndex === 2 && this.arrowCurved === \"elbow\") {\n this.elbowX = newViewBoxX;\n } else if (anchorIndex === 2 && this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n // On-curve midpoint anchor dragged \u2014 inversely compute control points\n // B(0.5) = 0.125*P0 + 0.375*CP1 + 0.375*CP2 + 0.125*P3\n // Keep curve symmetric: offset both control points equally from the line\n const dx = this.endPoint.x - this.startPoint.x;\n const dy = this.endPoint.y - this.startPoint.y;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n const perpX = -dy / dist;\n const perpY = dx / dist;\n\n // Desired midpoint offset from line midpoint\n const lineMidX = (this.startPoint.x + this.endPoint.x) / 2;\n const lineMidY = (this.startPoint.y + this.endPoint.y) / 2;\n const offsetX = newViewBoxX - lineMidX;\n const offsetY = newViewBoxY - lineMidY;\n // Project offset onto perpendicular to get curve amount\n const curveAmount = offsetX * perpX + offsetY * perpY;\n\n // Recompute control points with this curve amount\n const t1 = 0.33, t2 = 0.67;\n this.controlPoint1 = {\n x: this.startPoint.x + t1 * dx + perpX * curveAmount * (4 / 3),\n y: this.startPoint.y + t1 * dy + perpY * curveAmount * (4 / 3)\n };\n this.controlPoint2 = {\n x: this.startPoint.x + t2 * dx + perpX * curveAmount * (4 / 3),\n y: this.startPoint.y + t2 * dy + perpY * curveAmount * (4 / 3)\n };\n }\n this.draw();\n }\n\n contains(viewBoxX, viewBoxY) {\n const tolerance = Math.max(5, this.options.strokeWidth * 2) / currentZoom;\n\n if (this.arrowCurved === \"curved\" && this.controlPoint1 && this.controlPoint2) {\n return this.pointToCubicBezierDistance(viewBoxX, viewBoxY) <= tolerance;\n } else if (this.arrowCurved === \"elbow\") {\n const ex = this.elbowX !== null ? this.elbowX : (this.startPoint.x + this.endPoint.x) / 2;\n const d1 = this.pointToLineDistance(viewBoxX, viewBoxY, this.startPoint.x, this.startPoint.y, ex, this.startPoint.y);\n const d2 = this.pointToLineDistance(viewBoxX, viewBoxY, ex, this.startPoint.y, ex, this.endPoint.y);\n const d3 = this.pointToLineDistance(viewBoxX, viewBoxY, ex, this.endPoint.y, this.endPoint.x, this.endPoint.y);\n return Math.min(d1, d2, d3) <= tolerance;\n } else {\n return this.pointToLineDistance(viewBoxX, viewBoxY, this.startPoint.x, this.startPoint.y, this.endPoint.x, this.endPoint.y) <= tolerance;\n }\n }\n\n pointToCubicBezierDistance(x, y) {\n let minDistance = Infinity;\n const steps = 100;\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const point = this.getCubicBezierPoint(t);\n const distance = Math.sqrt(Math.pow(x - point.x, 2) + Math.pow(y - point.y, 2));\n minDistance = Math.min(minDistance, distance);\n }\n\n return minDistance;\n }\n\n pointToLineDistance(x, y, x1, y1, x2, y2) {\n const A = x - x1;\n const B = y - y1;\n const C = x2 - x1;\n const D = y2 - y1;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n\n if (lenSq !== 0) {\n param = dot / lenSq;\n }\n\n let xx, yy;\n\n if (param < 0) {\n xx = x1;\n yy = y1;\n } else if (param > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + param * C;\n yy = y1 + param * D;\n }\n\n const dx = x - xx;\n const dy = y - yy;\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n updateStyle(newOptions) {\n if (newOptions.arrowOutlineStyle !== undefined) {\n this.arrowOutlineStyle = newOptions.arrowOutlineStyle;\n const style = this.arrowOutlineStyle;\n this.options.strokeDasharray = style === \"dashed\" ? \"10,10\" : (style === \"dotted\" ? \"2,8\" : \"\");\n }\n if (newOptions.arrowHeadStyle !== undefined) {\n this.arrowHeadStyle = newOptions.arrowHeadStyle;\n }\n if (newOptions.arrowCurved !== undefined) {\n const wasCurved = this.arrowCurved;\n this.arrowCurved = newOptions.arrowCurved;\n\n if (this.arrowCurved === \"curved\" && wasCurved !== \"curved\") {\n this.initializeCurveControlPoints();\n } else if (this.arrowCurved !== \"curved\") {\n this.controlPoint1 = null;\n this.controlPoint2 = null;\n }\n if (this.arrowCurved !== \"elbow\") {\n this.elbowX = null;\n }\n }\n if (newOptions.elbowX !== undefined) {\n this.elbowX = newOptions.elbowX;\n }\n if (newOptions.stroke !== undefined) {\n this.options.stroke = newOptions.stroke;\n }\n if (newOptions.strokeWidth !== undefined) {\n this.options.strokeWidth = parseFloat(newOptions.strokeWidth);\n }\n if (newOptions.arrowCurveAmount !== undefined) {\n this.arrowCurveAmount = newOptions.arrowCurveAmount;\n if (this.arrowCurved) {\n this.initializeCurveControlPoints();\n }\n }\n\n Object.keys(newOptions).forEach(key => newOptions[key] === undefined && delete newOptions[key]);\n this.options = { ...this.options, ...newOptions };\n\n if (this.arrowOutlineStyle === 'solid' && this.options.strokeDasharray) {\n delete this.options.strokeDasharray;\n }\n\n this.draw();\n }\n\n updateSidebar() {\n // No-op: React sidebar handles UI updates via Zustand store\n }\n\n destroy() {\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n const index = shapes.indexOf(this);\n if (index > -1) {\n shapes.splice(index, 1);\n }\n if (currentShape === this) {\n currentShape = null;\n }\n }\n}\n\nexport { Arrow };\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -7,8 +7,9 @@ import {
7
7
  registerRotationAnchor
8
8
  } from "./chunk-MS4TIQ6Z.js";
9
9
  import {
10
+ DEFAULT_SHAPE_LABEL_FONT_SIZE,
10
11
  resolveThemeLabelColor
11
- } from "./chunk-M7OYYJC6.js";
12
+ } from "./chunk-6KNC7RDT.js";
12
13
 
13
14
  // src/shapes/Circle.js
14
15
  var rc = rough.svg(svg);
@@ -54,7 +55,7 @@ var Circle = class {
54
55
  this.label = options.label || "";
55
56
  this.labelElement = null;
56
57
  this.labelColor = resolveThemeLabelColor(options.labelColor);
57
- this.labelFontSize = options.labelFontSize || 14;
58
+ this.labelFontSize = options.labelFontSize || DEFAULT_SHAPE_LABEL_FONT_SIZE;
58
59
  this._isEditingLabel = false;
59
60
  this._hitArea = null;
60
61
  this._labelBg = null;
@@ -709,4 +710,4 @@ var Circle = class {
709
710
  export {
710
711
  Circle
711
712
  };
712
- //# sourceMappingURL=chunk-VJDNKJBX.js.map
713
+ //# sourceMappingURL=chunk-ZTSW4DOB.js.map