@elixpo/lixsketch 5.4.7 → 5.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/dist/react/AIRenderer-M4LMJ66J.js +1105 -0
  2. package/dist/react/AIRenderer-M4LMJ66J.js.map +7 -0
  3. package/dist/react/Arrow-BJDAXPMH.js +8 -0
  4. package/dist/react/Arrow-BJDAXPMH.js.map +7 -0
  5. package/dist/react/Circle-KPG7TKIX.js +8 -0
  6. package/dist/react/Circle-KPG7TKIX.js.map +7 -0
  7. package/dist/react/CodeShape-K4DIZAIV.js +8 -0
  8. package/dist/react/CodeShape-K4DIZAIV.js.map +7 -0
  9. package/dist/react/CopyPaste-4CKJRHJ3.js +569 -0
  10. package/dist/react/CopyPaste-4CKJRHJ3.js.map +7 -0
  11. package/dist/react/EraserTrail-PA6IQLQN.js +20 -0
  12. package/dist/react/EraserTrail-PA6IQLQN.js.map +7 -0
  13. package/dist/react/EventDispatcher-SRFH6LQZ.js +463 -0
  14. package/dist/react/EventDispatcher-SRFH6LQZ.js.map +7 -0
  15. package/dist/react/Frame-6UR5XPAX.js +10 -0
  16. package/dist/react/Frame-6UR5XPAX.js.map +7 -0
  17. package/dist/react/FreehandStroke-CK24NUT3.js +8 -0
  18. package/dist/react/FreehandStroke-CK24NUT3.js.map +7 -0
  19. package/dist/react/GraphEngine-QE5B2PMR.js +340 -0
  20. package/dist/react/GraphEngine-QE5B2PMR.js.map +7 -0
  21. package/dist/react/GraphMathParser-2WMTY4IE.js +10 -0
  22. package/dist/react/GraphMathParser-2WMTY4IE.js.map +7 -0
  23. package/dist/react/IconShape-KMIA6T2H.js +10 -0
  24. package/dist/react/IconShape-KMIA6T2H.js.map +7 -0
  25. package/dist/react/ImageShape-CHHGBXUQ.js +10 -0
  26. package/dist/react/ImageShape-CHHGBXUQ.js.map +7 -0
  27. package/dist/react/LayerOrder-XCHF4MSS.js +66 -0
  28. package/dist/react/LayerOrder-XCHF4MSS.js.map +7 -0
  29. package/dist/react/Line-2KOQEEGA.js +10 -0
  30. package/dist/react/Line-2KOQEEGA.js.map +7 -0
  31. package/dist/react/LixScriptParser-JYWJX375.js +1033 -0
  32. package/dist/react/LixScriptParser-JYWJX375.js.map +7 -0
  33. package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js +412 -0
  34. package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js.map +7 -0
  35. package/dist/react/MermaidSequenceParser-UKG2NSZY.js +8 -0
  36. package/dist/react/MermaidSequenceParser-UKG2NSZY.js.map +7 -0
  37. package/dist/react/MermaidSequenceRenderer-HPLHY5II.js +387 -0
  38. package/dist/react/MermaidSequenceRenderer-HPLHY5II.js.map +7 -0
  39. package/dist/react/Rectangle-6FE7RN6W.js +8 -0
  40. package/dist/react/Rectangle-6FE7RN6W.js.map +7 -0
  41. package/dist/react/ResizeCode-WAMDTKSW.js +2 -0
  42. package/dist/react/ResizeCode-WAMDTKSW.js.map +7 -0
  43. package/dist/react/ResizeShapes-LKEQTITP.js +250 -0
  44. package/dist/react/ResizeShapes-LKEQTITP.js.map +7 -0
  45. package/dist/react/SceneSerializer-4U4B24JM.js +739 -0
  46. package/dist/react/SceneSerializer-4U4B24JM.js.map +7 -0
  47. package/dist/react/Selection-VVUHY5YJ.js +34 -0
  48. package/dist/react/Selection-VVUHY5YJ.js.map +7 -0
  49. package/dist/react/SketchEngine-YA4RG3KX.js +413 -0
  50. package/dist/react/SketchEngine-YA4RG3KX.js.map +7 -0
  51. package/dist/react/TextShape-54ZJ66E3.js +8 -0
  52. package/dist/react/TextShape-54ZJ66E3.js.map +7 -0
  53. package/dist/react/UndoRedo-M2JZUBKN.js +30 -0
  54. package/dist/react/UndoRedo-M2JZUBKN.js.map +7 -0
  55. package/dist/react/ZoomPan-U3TXC5AJ.js +186 -0
  56. package/dist/react/ZoomPan-U3TXC5AJ.js.map +7 -0
  57. package/dist/react/arrowTool-CWEMIRXK.js +17 -0
  58. package/dist/react/arrowTool-CWEMIRXK.js.map +7 -0
  59. package/dist/react/boxicons-5JNJQPUP.woff +0 -0
  60. package/dist/react/boxicons-6NVWQSCQ.eot +0 -0
  61. package/dist/react/boxicons-AQ5N6WP7.woff2 +0 -0
  62. package/dist/react/boxicons-GDR4JU3X.ttf +0 -0
  63. package/dist/react/boxicons-NNFHLMOR.svg +1660 -0
  64. package/dist/react/chunk-2OQXI7QB.js +564 -0
  65. package/dist/react/chunk-2OQXI7QB.js.map +7 -0
  66. package/dist/react/chunk-5OUBTHHO.js +187 -0
  67. package/dist/react/chunk-5OUBTHHO.js.map +7 -0
  68. package/dist/react/chunk-6PFXZKL2.js +628 -0
  69. package/dist/react/chunk-6PFXZKL2.js.map +7 -0
  70. package/dist/react/chunk-6SFNWGGZ.js +453 -0
  71. package/dist/react/chunk-6SFNWGGZ.js.map +7 -0
  72. package/dist/react/chunk-7TZSIR6V.js +210 -0
  73. package/dist/react/chunk-7TZSIR6V.js.map +7 -0
  74. package/dist/react/chunk-AJAZC37E.js +662 -0
  75. package/dist/react/chunk-AJAZC37E.js.map +7 -0
  76. package/dist/react/chunk-BU4D2WYQ.js +1213 -0
  77. package/dist/react/chunk-BU4D2WYQ.js.map +7 -0
  78. package/dist/react/chunk-BZE4CEBG.js +747 -0
  79. package/dist/react/chunk-BZE4CEBG.js.map +7 -0
  80. package/dist/react/chunk-CB2RANCB.js +212 -0
  81. package/dist/react/chunk-CB2RANCB.js.map +7 -0
  82. package/dist/react/chunk-DNAG7ML6.js +128 -0
  83. package/dist/react/chunk-DNAG7ML6.js.map +7 -0
  84. package/dist/react/chunk-HZWLPXFN.js +198 -0
  85. package/dist/react/chunk-HZWLPXFN.js.map +7 -0
  86. package/dist/react/chunk-I6HCCIXB.js +572 -0
  87. package/dist/react/chunk-I6HCCIXB.js.map +7 -0
  88. package/dist/react/chunk-IZ5OGWGW.js +235 -0
  89. package/dist/react/chunk-IZ5OGWGW.js.map +7 -0
  90. package/dist/react/chunk-JJCJNLNN.js +1490 -0
  91. package/dist/react/chunk-JJCJNLNN.js.map +7 -0
  92. package/dist/react/chunk-JQ3IRFDP.js +222 -0
  93. package/dist/react/chunk-JQ3IRFDP.js.map +7 -0
  94. package/dist/react/chunk-L5OARZJ7.js +1134 -0
  95. package/dist/react/chunk-L5OARZJ7.js.map +7 -0
  96. package/dist/react/chunk-LHRTXNVE.js +1600 -0
  97. package/dist/react/chunk-LHRTXNVE.js.map +7 -0
  98. package/dist/react/chunk-Q2GA4MBZ.js +1653 -0
  99. package/dist/react/chunk-Q2GA4MBZ.js.map +7 -0
  100. package/dist/react/chunk-QNSE5BAY.js +519 -0
  101. package/dist/react/chunk-QNSE5BAY.js.map +7 -0
  102. package/dist/react/chunk-QXFBG7OM.js +191 -0
  103. package/dist/react/chunk-QXFBG7OM.js.map +7 -0
  104. package/dist/react/chunk-T6ZVV5ZO.js +714 -0
  105. package/dist/react/chunk-T6ZVV5ZO.js.map +7 -0
  106. package/dist/react/chunk-URB6MY46.js +974 -0
  107. package/dist/react/chunk-URB6MY46.js.map +7 -0
  108. package/dist/react/chunk-VN62KLOC.js +931 -0
  109. package/dist/react/chunk-VN62KLOC.js.map +7 -0
  110. package/dist/react/chunk-VQVEPJSA.js +158 -0
  111. package/dist/react/chunk-VQVEPJSA.js.map +7 -0
  112. package/dist/react/chunk-XISEAGBV.js +1632 -0
  113. package/dist/react/chunk-XISEAGBV.js.map +7 -0
  114. package/dist/react/chunk-YKJUBFHE.js +575 -0
  115. package/dist/react/chunk-YKJUBFHE.js.map +7 -0
  116. package/dist/react/circleTool-NUATSEI2.js +14 -0
  117. package/dist/react/circleTool-NUATSEI2.js.map +7 -0
  118. package/dist/react/codeTool-MHCB2FNB.js +38 -0
  119. package/dist/react/codeTool-MHCB2FNB.js.map +7 -0
  120. package/dist/react/eraserTool-2GS2LQCS.js +103 -0
  121. package/dist/react/eraserTool-2GS2LQCS.js.map +7 -0
  122. package/dist/react/frameTool-PWVKKXSP.js +14 -0
  123. package/dist/react/frameTool-PWVKKXSP.js.map +7 -0
  124. package/dist/react/freehandTool-SLYGASVP.js +14 -0
  125. package/dist/react/freehandTool-SLYGASVP.js.map +7 -0
  126. package/dist/react/iconTool-GPZ7O7NH.js +18 -0
  127. package/dist/react/iconTool-GPZ7O7NH.js.map +7 -0
  128. package/dist/react/imageTool-D5R4XGEU.js +15 -0
  129. package/dist/react/imageTool-D5R4XGEU.js.map +7 -0
  130. package/dist/react/index.js +5349 -0
  131. package/dist/react/index.js.map +7 -0
  132. package/dist/react/laserTool-XVMV63AV.js +239 -0
  133. package/dist/react/laserTool-XVMV63AV.js.map +7 -0
  134. package/dist/react/lineTool-WNI5EMZ5.js +14 -0
  135. package/dist/react/lineTool-WNI5EMZ5.js.map +7 -0
  136. package/dist/react/lixCode-OJMVUXXI.ttf +0 -0
  137. package/dist/react/lixDefault-JEAPAUJL.ttf +0 -0
  138. package/dist/react/lixFancy-BPXYM5CQ.ttf +0 -0
  139. package/dist/react/lixFont-CPKEUDVM.woff2 +0 -0
  140. package/dist/react/rectangleTool-U7DZ6ZTA.js +14 -0
  141. package/dist/react/rectangleTool-U7DZ6ZTA.js.map +7 -0
  142. package/dist/react/styles.css +6627 -0
  143. package/dist/react/textTool-M7S6F3VC.js +21 -0
  144. package/dist/react/textTool-M7S6F3VC.js.map +7 -0
  145. package/package.json +39 -5
  146. package/src/EngineShortcuts.js +83 -27
  147. package/src/core/AIRenderer.js +30 -18
  148. package/src/core/GraphEngine.js +64 -41
  149. package/src/core/MermaidFlowchartRenderer.js +153 -88
  150. package/src/core/MermaidSequenceRenderer.js +168 -93
  151. package/src/core/SceneSerializer.js +86 -2
  152. package/src/core/Selection.js +119 -19
  153. package/src/core/UndoRedo.js +82 -15
  154. package/src/core/ZoomPan.js +15 -5
  155. package/src/index.js +14 -1
  156. package/src/react/LixSketchCanvas.jsx +347 -0
  157. package/src/react/components/AppMenu.jsx +482 -0
  158. package/src/react/components/Footer.jsx +85 -0
  159. package/src/react/components/Toolbar.jsx +140 -0
  160. package/src/react/components/canvas/CanvasLoadingOverlay.jsx +76 -0
  161. package/src/react/components/canvas/ContextMenu.jsx +466 -0
  162. package/src/react/components/canvas/FindBar.jsx +177 -0
  163. package/src/react/components/canvas/ImageSourcePicker.jsx +133 -0
  164. package/src/react/components/canvas/MultiSelectActions.jsx +120 -0
  165. package/src/react/components/canvas/SVGCanvas.jsx +145 -0
  166. package/src/react/components/canvas/SaveStatusIndicator.jsx +29 -0
  167. package/src/react/components/modals/CanvasPropertiesModal.jsx +358 -0
  168. package/src/react/components/modals/CommandPalette.jsx +307 -0
  169. package/src/react/components/modals/ExportImageModal.jsx +287 -0
  170. package/src/react/components/modals/GraphModal.jsx +174 -0
  171. package/src/react/components/modals/HelpModal.jsx +208 -0
  172. package/src/react/components/modals/LixScriptModal.jsx +130 -0
  173. package/src/react/components/modals/ShortcutsModal.jsx +125 -0
  174. package/src/react/components/sidebars/ArrowSidebar.jsx +173 -0
  175. package/src/react/components/sidebars/CircleSidebar.jsx +134 -0
  176. package/src/react/components/sidebars/FrameSidebar.jsx +263 -0
  177. package/src/react/components/sidebars/IconSidebar.jsx +279 -0
  178. package/src/react/components/sidebars/ImageSidebar.jsx +69 -0
  179. package/src/react/components/sidebars/LineSidebar.jsx +109 -0
  180. package/src/react/components/sidebars/PaintbrushSidebar.jsx +119 -0
  181. package/src/react/components/sidebars/RectangleSidebar.jsx +165 -0
  182. package/src/react/components/sidebars/ShapeSidebar.jsx +130 -0
  183. package/src/react/components/sidebars/TextSidebar.jsx +174 -0
  184. package/src/react/hooks/inertStores.js +58 -0
  185. package/src/react/hooks/useSketchEngine.js +76 -0
  186. package/src/react/hooks/useTranslation.js +92 -0
  187. package/src/react/index.js +41 -0
  188. package/src/react/store/useSketchStore.js +234 -0
  189. package/src/react/store/useUIStore.js +196 -0
  190. package/src/react/styles/arrowSidebar.css +263 -0
  191. package/src/react/styles/canvasStroke.css +47 -0
  192. package/src/react/styles/canvasTools.css +769 -0
  193. package/src/react/styles/circleSidebar.css +206 -0
  194. package/src/react/styles/fonts/fonts.css +29 -0
  195. package/src/react/styles/fonts/lixCode.ttf +0 -0
  196. package/src/react/styles/fonts/lixDefault.ttf +0 -0
  197. package/src/react/styles/fonts/lixDocs.ttf +0 -0
  198. package/src/react/styles/fonts/lixFancy.ttf +0 -0
  199. package/src/react/styles/fonts/lixFont.woff2 +0 -0
  200. package/src/react/styles/lineSidebar.css +207 -0
  201. package/src/react/styles/paintbrushSidebar.css +247 -0
  202. package/src/react/styles/squareSidebar.css +206 -0
  203. package/src/react/styles/writeText.css +149 -0
  204. package/src/react/styles.css +175 -0
  205. package/src/react/toolsEnum.js +20 -0
  206. package/src/react/utils/toast.js +18 -0
  207. package/src/shapes/Frame.js +7 -1
  208. package/src/shapes/Line.js +11 -5
  209. package/src/tools/arrowTool.js +30 -4
  210. package/src/tools/circleTool.js +33 -9
  211. package/src/tools/codeTool.js +5 -3
  212. package/src/tools/frameTool.js +47 -7
  213. package/src/tools/freehandTool.js +12 -4
  214. package/src/tools/iconTool.js +7 -1
  215. package/src/tools/imageTool.js +7 -1
  216. package/src/tools/lineTool.js +27 -3
  217. package/src/tools/rectangleTool.js +45 -8
  218. package/src/tools/textTool.js +23 -6
@@ -0,0 +1,187 @@
1
+ "use client";
2
+
3
+ // src/core/EraserTrail.js
4
+ var isErasing = false;
5
+ var eraserPath = null;
6
+ var eraserGlow = null;
7
+ var eraserPoints = [];
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;
13
+ var fadeAnimationId = null;
14
+ var fadeStartTime = null;
15
+ var fadeInitialPoints = null;
16
+ function getIsErasing() {
17
+ return isErasing;
18
+ }
19
+ function setIsErasing(val) {
20
+ isErasing = val;
21
+ }
22
+ function getTargetedElements() {
23
+ return targetedElements;
24
+ }
25
+ function screenToSVGEraser(clientX, clientY) {
26
+ const CTM = svg.getScreenCTM();
27
+ if (!CTM) return { x: 0, y: 0 };
28
+ try {
29
+ const inv = CTM.inverse();
30
+ return {
31
+ x: (clientX - CTM.e) * inv.a + (clientY - CTM.f) * inv.c,
32
+ y: (clientX - CTM.e) * inv.b + (clientY - CTM.f) * inv.d
33
+ };
34
+ } catch (e) {
35
+ return {
36
+ x: (clientX - CTM.e) / CTM.a,
37
+ y: (clientY - CTM.f) / CTM.d
38
+ };
39
+ }
40
+ }
41
+ function smoothPoints(points) {
42
+ if (points.length <= 2) return points;
43
+ const half = Math.floor(SMOOTHING_WINDOW / 2);
44
+ const result = [points[0]];
45
+ for (let i = 1; i < points.length - 1; i++) {
46
+ let sx = 0, sy = 0, count = 0;
47
+ for (let j = Math.max(0, i - half); j <= Math.min(points.length - 1, i + half); j++) {
48
+ sx += points[j].x;
49
+ sy += points[j].y;
50
+ count++;
51
+ }
52
+ result.push({ x: sx / count, y: sy / count });
53
+ }
54
+ result.push(points[points.length - 1]);
55
+ return result;
56
+ }
57
+ function buildSmoothPath(rawPoints) {
58
+ if (rawPoints.length === 0) return "";
59
+ if (rawPoints.length === 1) return `M ${rawPoints[0].x} ${rawPoints[0].y}`;
60
+ const points = smoothPoints(rawPoints);
61
+ let d = `M ${points[0].x} ${points[0].y}`;
62
+ if (points.length === 2) {
63
+ d += ` L ${points[1].x} ${points[1].y}`;
64
+ return d;
65
+ }
66
+ const tension = 0.4;
67
+ for (let i = 0; i < points.length - 1; i++) {
68
+ const p0 = points[i === 0 ? 0 : i - 1];
69
+ const p1 = points[i];
70
+ const p2 = points[i + 1];
71
+ const p3 = points[i + 2] || p2;
72
+ const cp1x = p1.x + (p2.x - p0.x) * tension / 3;
73
+ const cp1y = p1.y + (p2.y - p0.y) * tension / 3;
74
+ const cp2x = p2.x - (p3.x - p1.x) * tension / 3;
75
+ const cp2y = p2.y - (p3.y - p1.y) * tension / 3;
76
+ d += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;
77
+ }
78
+ return d;
79
+ }
80
+ function safeRemove(el) {
81
+ if (el && el.parentNode) {
82
+ el.parentNode.removeChild(el);
83
+ }
84
+ }
85
+ function cleanupTrail() {
86
+ if (fadeAnimationId) {
87
+ cancelAnimationFrame(fadeAnimationId);
88
+ fadeAnimationId = null;
89
+ }
90
+ fadeStartTime = null;
91
+ fadeInitialPoints = null;
92
+ safeRemove(eraserPath);
93
+ safeRemove(eraserGlow);
94
+ eraserPath = null;
95
+ eraserGlow = null;
96
+ eraserPoints = [];
97
+ }
98
+ function createEraserTrail(x, y) {
99
+ cleanupTrail();
100
+ eraserGlow = document.createElementNS("http://www.w3.org/2000/svg", "path");
101
+ eraserGlow.setAttribute("fill", "none");
102
+ eraserGlow.setAttribute("stroke", "rgba(80, 80, 80, 0.15)");
103
+ eraserGlow.setAttribute("stroke-width", 14 / currentZoom);
104
+ eraserGlow.setAttribute("stroke-linecap", "round");
105
+ eraserGlow.setAttribute("stroke-linejoin", "round");
106
+ eraserGlow.style.pointerEvents = "none";
107
+ svg.appendChild(eraserGlow);
108
+ eraserPath = document.createElementNS("http://www.w3.org/2000/svg", "path");
109
+ eraserPath.setAttribute("fill", "none");
110
+ eraserPath.setAttribute("stroke", "rgba(53, 53, 53, 0.5)");
111
+ eraserPath.setAttribute("stroke-width", 5 / currentZoom);
112
+ eraserPath.setAttribute("stroke-linecap", "round");
113
+ eraserPath.setAttribute("stroke-linejoin", "round");
114
+ eraserPath.style.pointerEvents = "none";
115
+ svg.appendChild(eraserPath);
116
+ const svgPt = screenToSVGEraser(x, y);
117
+ eraserPoints = [svgPt];
118
+ }
119
+ function updateEraserTrail(x, y) {
120
+ if (!eraserPath) return;
121
+ const svgPt = screenToSVGEraser(x, y);
122
+ const last = eraserPoints[eraserPoints.length - 1];
123
+ if (last) {
124
+ const dist = Math.hypot(last.x - svgPt.x, last.y - svgPt.y);
125
+ if (dist < MIN_POINT_DISTANCE / currentZoom) return;
126
+ }
127
+ eraserPoints.push(svgPt);
128
+ if (eraserPoints.length > MAX_TRAIL_LENGTH) {
129
+ eraserPoints.shift();
130
+ }
131
+ renderTrail(eraserPoints, 1);
132
+ }
133
+ function renderTrail(points, opacityMul) {
134
+ if (!eraserPath || points.length < 2) return;
135
+ const pathD = buildSmoothPath(points);
136
+ const coreW = Math.max(1.5 / currentZoom, 5 / currentZoom * opacityMul);
137
+ const glowW = Math.max(3 / currentZoom, 14 / currentZoom * opacityMul);
138
+ const coreOpacity = 0.5 * opacityMul;
139
+ const glowOpacity = 0.15 * opacityMul;
140
+ eraserPath.setAttribute("d", pathD);
141
+ eraserPath.setAttribute("stroke", `rgba(53, 53, 53, ${coreOpacity})`);
142
+ eraserPath.setAttribute("stroke-width", coreW);
143
+ if (eraserGlow) {
144
+ eraserGlow.setAttribute("d", pathD);
145
+ eraserGlow.setAttribute("stroke", `rgba(80, 80, 80, ${glowOpacity})`);
146
+ eraserGlow.setAttribute("stroke-width", glowW);
147
+ }
148
+ }
149
+ function fadeOutEraserTrail() {
150
+ if (!eraserPath) {
151
+ cleanupTrail();
152
+ return;
153
+ }
154
+ if (fadeAnimationId) {
155
+ cancelAnimationFrame(fadeAnimationId);
156
+ }
157
+ fadeStartTime = performance.now();
158
+ fadeInitialPoints = [...eraserPoints];
159
+ function fadeStep() {
160
+ const now = performance.now();
161
+ const elapsed = now - fadeStartTime;
162
+ const progress = Math.min(1, elapsed / FADE_DURATION);
163
+ const opacity = 1 - progress * progress * progress;
164
+ if (opacity <= 0.01 || progress >= 1) {
165
+ cleanupTrail();
166
+ return;
167
+ }
168
+ renderTrail(fadeInitialPoints, opacity);
169
+ fadeAnimationId = requestAnimationFrame(fadeStep);
170
+ }
171
+ fadeAnimationId = requestAnimationFrame(fadeStep);
172
+ }
173
+ function forceCleanupEraserTrail() {
174
+ cleanupTrail();
175
+ isErasing = false;
176
+ }
177
+
178
+ export {
179
+ getIsErasing,
180
+ setIsErasing,
181
+ getTargetedElements,
182
+ createEraserTrail,
183
+ updateEraserTrail,
184
+ fadeOutEraserTrail,
185
+ forceCleanupEraserTrail
186
+ };
187
+ //# sourceMappingURL=chunk-5OUBTHHO.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 = 16;\nconst FADE_DURATION = 200;\nconst MIN_POINT_DISTANCE = 1.5;\nconst SMOOTHING_WINDOW = 3;\n\nlet fadeAnimationId = null;\nlet fadeStartTime = null;\nlet fadeInitialPoints = null;\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 (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 eraserGlow.setAttribute(\"stroke\", \"rgba(80, 80, 80, 0.15)\");\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(53, 53, 53, 0.5)\");\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 renderTrail(eraserPoints, 1.0);\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.5 * opacityMul;\n const glowOpacity = 0.15 * opacityMul;\n\n eraserPath.setAttribute(\"d\", pathD);\n eraserPath.setAttribute(\"stroke\", `rgba(53, 53, 53, ${coreOpacity})`);\n eraserPath.setAttribute(\"stroke-width\", coreW);\n\n if (eraserGlow) {\n eraserGlow.setAttribute(\"d\", pathD);\n eraserGlow.setAttribute(\"stroke\", `rgba(80, 80, 80, ${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 // 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
+ }