@elixpo/lixsketch 5.4.7 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +5342 -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 +475 -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,239 @@
1
+ "use client";
2
+
3
+ // src/tools/laserTool.js
4
+ var lazerCursor = `data:image/svg+xml;base64,${btoa('<svg viewBox="0 0 24 24" stroke-width="1" width="28" height="28" xmlns="http://www.w3.org/2000/svg"><path d="M6.164 11.755a5.314 5.314 0 0 1-4.932-5.298 5.314 5.314 0 0 1 5.311-5.311 5.314 5.314 0 0 1 5.307 5.113l8.773 8.773a3.322 3.322 0 0 1 0 4.696l-.895.895a3.322 3.322 0 0 1-4.696 0l-8.868-8.868Z" style="fill:#fff"/><path stroke="#1b1b1f" fill="#fff" d="m7.868 11.113 7.773 7.774a2.359 2.359 0 0 0 1.667.691 2.368 2.368 0 0 0 2.357-2.358c0-.625-.248-1.225-.69-1.667L11.201 7.78 9.558 9.469l-1.69 1.643v.001Zm10.273 3.606-3.333 3.333m-3.25-6.583 2 2m-7-7 3 3M3.664 3.625l1 1M2.529 6.922l1.407-.144m5.735-2.932-1.118.866M4.285 9.823l.758-1.194m1.863-6.207-.13 1.408"/></svg>')}`;
5
+ var isDrawing = false;
6
+ var lasers = [];
7
+ var fadingLasers = [];
8
+ var fadeOutDuration = 1200;
9
+ var baseLaserOpacity = 0.85;
10
+ var baseLaserWidth = 3.5;
11
+ var glowWidth = 10;
12
+ var minDistanceThreshold = 1;
13
+ var smoothingWindow = 4;
14
+ var drawingAnimationId = null;
15
+ var fadingAnimationId = null;
16
+ function screenToViewBoxPoint(x, y) {
17
+ const CTM = svg.getScreenCTM();
18
+ if (!CTM) return null;
19
+ try {
20
+ const inverseCTM = CTM.inverse();
21
+ return {
22
+ x: (x - CTM.e) * inverseCTM.a + (y - CTM.f) * inverseCTM.c,
23
+ y: (x - CTM.e) * inverseCTM.b + (y - CTM.f) * inverseCTM.d
24
+ };
25
+ } catch (e) {
26
+ return {
27
+ x: (x - CTM.e) / CTM.a,
28
+ y: (y - CTM.f) / CTM.d
29
+ };
30
+ }
31
+ }
32
+ function distance(p1, p2) {
33
+ const dx = p1.x - p2.x;
34
+ const dy = p1.y - p2.y;
35
+ return Math.sqrt(dx * dx + dy * dy);
36
+ }
37
+ function smoothPoints(points) {
38
+ if (points.length <= 2) return points;
39
+ const result = [points[0]];
40
+ const half = Math.floor(smoothingWindow / 2);
41
+ for (let i = 1; i < points.length - 1; i++) {
42
+ let sx = 0, sy = 0, count = 0;
43
+ for (let j = Math.max(0, i - half); j <= Math.min(points.length - 1, i + half); j++) {
44
+ sx += points[j].x;
45
+ sy += points[j].y;
46
+ count++;
47
+ }
48
+ result.push({ x: sx / count, y: sy / count, timestamp: points[i].timestamp });
49
+ }
50
+ result.push(points[points.length - 1]);
51
+ return result;
52
+ }
53
+ function buildSmoothPath(rawPoints) {
54
+ if (rawPoints.length === 0) return "";
55
+ if (rawPoints.length === 1) return `M ${rawPoints[0].x} ${rawPoints[0].y}`;
56
+ const points = smoothPoints(rawPoints);
57
+ let d = `M ${points[0].x} ${points[0].y}`;
58
+ if (points.length === 2) {
59
+ d += ` L ${points[1].x} ${points[1].y}`;
60
+ return d;
61
+ }
62
+ const tension = 0.5;
63
+ for (let i = 0; i < points.length - 1; i++) {
64
+ const p0 = points[i === 0 ? 0 : i - 1];
65
+ const p1 = points[i];
66
+ const p2 = points[i + 1];
67
+ const p3 = points[i + 2] || p2;
68
+ const cp1x = p1.x + (p2.x - p0.x) * tension / 3;
69
+ const cp1y = p1.y + (p2.y - p0.y) * tension / 3;
70
+ const cp2x = p2.x - (p3.x - p1.x) * tension / 3;
71
+ const cp2y = p2.y - (p3.y - p1.y) * tension / 3;
72
+ d += ` C ${cp1x} ${cp1y}, ${cp2x} ${cp2y}, ${p2.x} ${p2.y}`;
73
+ }
74
+ return d;
75
+ }
76
+ function createLaserGroup(id) {
77
+ const group = document.createElementNS("http://www.w3.org/2000/svg", "g");
78
+ group.setAttribute("id", id);
79
+ group.style.pointerEvents = "none";
80
+ const glowPath = document.createElementNS("http://www.w3.org/2000/svg", "path");
81
+ glowPath.setAttribute("fill", "none");
82
+ glowPath.setAttribute("stroke-linecap", "round");
83
+ glowPath.setAttribute("stroke-linejoin", "round");
84
+ glowPath.classList.add("laser-glow");
85
+ group.appendChild(glowPath);
86
+ const corePath = document.createElementNS("http://www.w3.org/2000/svg", "path");
87
+ corePath.setAttribute("fill", "none");
88
+ corePath.setAttribute("stroke-linecap", "round");
89
+ corePath.setAttribute("stroke-linejoin", "round");
90
+ corePath.classList.add("laser-core");
91
+ group.appendChild(corePath);
92
+ svg.insertBefore(group, svg.firstChild);
93
+ return group;
94
+ }
95
+ function updateLaserAppearance(laser, isFinalFade = false) {
96
+ let laserGroup = document.getElementById(laser.id);
97
+ const currentTime = performance.now();
98
+ let points = isFinalFade ? laser.initialPoints : [...laser.points];
99
+ if (!isFinalFade) {
100
+ points = points.filter((p) => currentTime - p.timestamp < fadeOutDuration);
101
+ laser.points = points;
102
+ }
103
+ if (points.length === 0) {
104
+ if (laserGroup) laserGroup.remove();
105
+ if (isFinalFade) fadingLasers = fadingLasers.filter((l) => l.id !== laser.id);
106
+ else lasers = lasers.filter((l) => l.id !== laser.id);
107
+ return;
108
+ }
109
+ if (!laserGroup) {
110
+ laserGroup = createLaserGroup(laser.id);
111
+ }
112
+ const glowPath = laserGroup.querySelector(".laser-glow");
113
+ const corePath = laserGroup.querySelector(".laser-core");
114
+ const oldestAge = currentTime - points[0].timestamp;
115
+ const newestAge = currentTime - points[points.length - 1].timestamp;
116
+ const avgAge = (oldestAge + newestAge) / 2;
117
+ const ageProgress = Math.min(1, avgAge / fadeOutDuration);
118
+ const easedFade = 1 - ageProgress * ageProgress;
119
+ let opacity = baseLaserOpacity * easedFade;
120
+ let coreW = baseLaserWidth / currentZoom;
121
+ let glowW = glowWidth / currentZoom;
122
+ if (isFinalFade) {
123
+ opacity *= laser.fadeProgress;
124
+ coreW *= laser.fadeProgress;
125
+ glowW *= laser.fadeProgress;
126
+ }
127
+ opacity = Math.max(0.02, opacity);
128
+ coreW = Math.max(0.5 / currentZoom, coreW);
129
+ glowW = Math.max(1 / currentZoom, glowW);
130
+ const pathD = buildSmoothPath(points);
131
+ glowPath.setAttribute("d", pathD);
132
+ glowPath.setAttribute("stroke", `rgba(255, 50, 50, ${opacity * 0.25})`);
133
+ glowPath.setAttribute("stroke-width", glowW);
134
+ corePath.setAttribute("d", pathD);
135
+ corePath.setAttribute("stroke", `rgba(255, 50, 50, ${opacity})`);
136
+ corePath.setAttribute("stroke-width", coreW);
137
+ }
138
+ function addPointToCurrentLaser(screenX, screenY) {
139
+ const currentLaser = lasers[lasers.length - 1];
140
+ if (!currentLaser) return;
141
+ const svgPoint = screenToViewBoxPoint(screenX, screenY);
142
+ if (!svgPoint) return;
143
+ const lastPt = currentLaser.points[currentLaser.points.length - 1];
144
+ const adjustedThreshold = minDistanceThreshold / currentZoom;
145
+ if (!lastPt || distance(svgPoint, lastPt) >= adjustedThreshold) {
146
+ currentLaser.points.push({ x: svgPoint.x, y: svgPoint.y, timestamp: performance.now() });
147
+ }
148
+ }
149
+ function drawingLoop() {
150
+ if (!isDrawing) {
151
+ drawingAnimationId = null;
152
+ return;
153
+ }
154
+ const currentLaser = lasers[lasers.length - 1];
155
+ if (currentLaser) {
156
+ updateLaserAppearance(currentLaser, false);
157
+ }
158
+ drawingAnimationId = requestAnimationFrame(drawingLoop);
159
+ }
160
+ function fadingLasersLoop() {
161
+ if (fadingLasers.length === 0) {
162
+ fadingAnimationId = null;
163
+ return;
164
+ }
165
+ const currentTime = performance.now();
166
+ for (let i = fadingLasers.length - 1; i >= 0; i--) {
167
+ const laser = fadingLasers[i];
168
+ const elapsed = currentTime - laser.fadeStartTime;
169
+ const rawProgress = Math.min(1, elapsed / fadeOutDuration);
170
+ laser.fadeProgress = 1 - rawProgress * rawProgress * rawProgress;
171
+ updateLaserAppearance(laser, true);
172
+ if (laser.fadeProgress <= 0.01) {
173
+ const laserGroup = document.getElementById(laser.id);
174
+ if (laserGroup) laserGroup.remove();
175
+ fadingLasers.splice(i, 1);
176
+ }
177
+ }
178
+ fadingAnimationId = requestAnimationFrame(fadingLasersLoop);
179
+ }
180
+ function fadeLaserTrail(laser) {
181
+ lasers = lasers.filter((l) => l.id !== laser.id);
182
+ laser.fadeStartTime = performance.now();
183
+ laser.initialPoints = [...laser.points];
184
+ laser.fadeProgress = 1;
185
+ fadingLasers.push(laser);
186
+ if (!fadingAnimationId) {
187
+ fadingAnimationId = requestAnimationFrame(fadingLasersLoop);
188
+ }
189
+ }
190
+ svg.addEventListener("mousedown", (e) => {
191
+ if (!isLaserToolActive) return;
192
+ if (e.target !== svg) {
193
+ const isUIElement = e.target.closest(".selection-box, .resize-handle");
194
+ if (isUIElement) return;
195
+ }
196
+ let screenPoint = { x: e.clientX, y: e.clientY };
197
+ let startSvgPoint = screenToViewBoxPoint(screenPoint.x, screenPoint.y);
198
+ if (!startSvgPoint) return;
199
+ if (isDrawing && lasers.length > 0) {
200
+ fadeLaserTrail(lasers[lasers.length - 1]);
201
+ }
202
+ isDrawing = true;
203
+ const laserId = "laserGroup_" + Date.now() + "_" + Math.random().toString(16).slice(2);
204
+ const newLaser = {
205
+ id: laserId,
206
+ points: [{ x: startSvgPoint.x, y: startSvgPoint.y, timestamp: performance.now() }]
207
+ };
208
+ lasers.push(newLaser);
209
+ if (!drawingAnimationId) {
210
+ drawingAnimationId = requestAnimationFrame(drawingLoop);
211
+ }
212
+ });
213
+ svg.addEventListener("mousemove", (e) => {
214
+ if (isLaserToolActive) {
215
+ svg.style.cursor = `url(${lazerCursor}) 0 0, auto`;
216
+ }
217
+ if (!isDrawing) return;
218
+ addPointToCurrentLaser(e.clientX, e.clientY);
219
+ });
220
+ svg.addEventListener("mouseup", (e) => {
221
+ if (!isDrawing) return;
222
+ isDrawing = false;
223
+ if (lasers.length > 0) {
224
+ fadeLaserTrail(lasers[lasers.length - 1]);
225
+ }
226
+ if (isLaserToolActive) {
227
+ svg.style.cursor = `url(${lazerCursor}) 0 0, auto`;
228
+ } else {
229
+ svg.style.cursor = "default";
230
+ }
231
+ });
232
+ svg.addEventListener("mouseleave", (e) => {
233
+ if (!isDrawing) return;
234
+ isDrawing = false;
235
+ if (lasers.length > 0) {
236
+ fadeLaserTrail(lasers[lasers.length - 1]);
237
+ }
238
+ });
239
+ //# sourceMappingURL=laserTool-XVMV63AV.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/tools/laserTool.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n// Laser tool - smooth laser pointer with fade trail\n// Depends on globals: svg, currentZoom, isLaserToolActive\n\nconst lazerCursor = `data:image/svg+xml;base64,${btoa('<svg viewBox=\"0 0 24 24\" stroke-width=\"1\" width=\"28\" height=\"28\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M6.164 11.755a5.314 5.314 0 0 1-4.932-5.298 5.314 5.314 0 0 1 5.311-5.311 5.314 5.314 0 0 1 5.307 5.113l8.773 8.773a3.322 3.322 0 0 1 0 4.696l-.895.895a3.322 3.322 0 0 1-4.696 0l-8.868-8.868Z\" style=\"fill:#fff\"/><path stroke=\"#1b1b1f\" fill=\"#fff\" d=\"m7.868 11.113 7.773 7.774a2.359 2.359 0 0 0 1.667.691 2.368 2.368 0 0 0 2.357-2.358c0-.625-.248-1.225-.69-1.667L11.201 7.78 9.558 9.469l-1.69 1.643v.001Zm10.273 3.606-3.333 3.333m-3.25-6.583 2 2m-7-7 3 3M3.664 3.625l1 1M2.529 6.922l1.407-.144m5.735-2.932-1.118.866M4.285 9.823l.758-1.194m1.863-6.207-.13 1.408\"/></svg>')}`;\n\nlet isDrawing = false;\nlet lasers = [];\nlet fadingLasers = [];\n\nconst fadeOutDuration = 1200;\nconst baseLaserOpacity = 0.85;\nconst baseLaserWidth = 3.5;\nconst glowWidth = 10;\nconst minDistanceThreshold = 1;\nconst smoothingWindow = 4; // points to average for smoothing\n\nlet drawingAnimationId = null;\nlet fadingAnimationId = null;\n\nfunction screenToViewBoxPoint(x, y) {\n const CTM = svg.getScreenCTM();\n if (!CTM) return null;\n try {\n const inverseCTM = CTM.inverse();\n return {\n x: (x - CTM.e) * inverseCTM.a + (y - CTM.f) * inverseCTM.c,\n y: (x - CTM.e) * inverseCTM.b + (y - CTM.f) * inverseCTM.d\n };\n } catch (e) {\n return {\n x: (x - CTM.e) / CTM.a,\n y: (y - CTM.f) / CTM.d\n };\n }\n}\n\nfunction distance(p1, p2) {\n const dx = p1.x - p2.x;\n const dy = p1.y - p2.y;\n return Math.sqrt(dx * dx + dy * dy);\n}\n\n// Smooth points using a moving average to eliminate micro-jitter\nfunction smoothPoints(points) {\n if (points.length <= 2) return points;\n const result = [points[0]]; // keep first point\n const half = Math.floor(smoothingWindow / 2);\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, timestamp: points[i].timestamp });\n }\n result.push(points[points.length - 1]); // keep last point\n return result;\n}\n\n// Build a smooth SVG path using Catmull-Rom \u2192 cubic bezier conversion\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 // Catmull-Rom to cubic bezier with tension=0.5 for rounder curves\n const tension = 0.5;\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// Create SVG group with glow + core path elements\nfunction createLaserGroup(id) {\n const group = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n group.setAttribute(\"id\", id);\n group.style.pointerEvents = \"none\";\n\n // Outer glow\n const glowPath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n glowPath.setAttribute(\"fill\", \"none\");\n glowPath.setAttribute(\"stroke-linecap\", \"round\");\n glowPath.setAttribute(\"stroke-linejoin\", \"round\");\n glowPath.classList.add(\"laser-glow\");\n group.appendChild(glowPath);\n\n // Core line\n const corePath = document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n corePath.setAttribute(\"fill\", \"none\");\n corePath.setAttribute(\"stroke-linecap\", \"round\");\n corePath.setAttribute(\"stroke-linejoin\", \"round\");\n corePath.classList.add(\"laser-core\");\n group.appendChild(corePath);\n\n svg.insertBefore(group, svg.firstChild);\n return group;\n}\n\nfunction updateLaserAppearance(laser, isFinalFade = false) {\n let laserGroup = document.getElementById(laser.id);\n\n const currentTime = performance.now();\n let points = isFinalFade ? laser.initialPoints : [...laser.points];\n\n if (!isFinalFade) {\n points = points.filter(p => (currentTime - p.timestamp) < fadeOutDuration);\n laser.points = points;\n }\n\n if (points.length === 0) {\n if (laserGroup) laserGroup.remove();\n if (isFinalFade) fadingLasers = fadingLasers.filter(l => l.id !== laser.id);\n else lasers = lasers.filter(l => l.id !== laser.id);\n return;\n }\n\n if (!laserGroup) {\n laserGroup = createLaserGroup(laser.id);\n }\n\n const glowPath = laserGroup.querySelector('.laser-glow');\n const corePath = laserGroup.querySelector('.laser-core');\n\n // Compute overall opacity from age + fade\n const oldestAge = currentTime - points[0].timestamp;\n const newestAge = currentTime - points[points.length - 1].timestamp;\n const avgAge = (oldestAge + newestAge) / 2;\n const ageProgress = Math.min(1, avgAge / fadeOutDuration);\n const easedFade = 1 - ageProgress * ageProgress; // quadratic ease\n\n let opacity = baseLaserOpacity * easedFade;\n let coreW = baseLaserWidth / currentZoom;\n let glowW = glowWidth / currentZoom;\n\n if (isFinalFade) {\n opacity *= laser.fadeProgress;\n coreW *= laser.fadeProgress;\n glowW *= laser.fadeProgress;\n }\n\n opacity = Math.max(0.02, opacity);\n coreW = Math.max(0.5 / currentZoom, coreW);\n glowW = Math.max(1 / currentZoom, glowW);\n\n const pathD = buildSmoothPath(points);\n\n // Update glow\n glowPath.setAttribute(\"d\", pathD);\n glowPath.setAttribute(\"stroke\", `rgba(255, 50, 50, ${opacity * 0.25})`);\n glowPath.setAttribute(\"stroke-width\", glowW);\n\n // Update core\n corePath.setAttribute(\"d\", pathD);\n corePath.setAttribute(\"stroke\", `rgba(255, 50, 50, ${opacity})`);\n corePath.setAttribute(\"stroke-width\", coreW);\n}\n\n\n// Add a point directly from mousemove (high frequency capture)\nfunction addPointToCurrentLaser(screenX, screenY) {\n const currentLaser = lasers[lasers.length - 1];\n if (!currentLaser) return;\n\n const svgPoint = screenToViewBoxPoint(screenX, screenY);\n if (!svgPoint) return;\n\n const lastPt = currentLaser.points[currentLaser.points.length - 1];\n const adjustedThreshold = minDistanceThreshold / currentZoom;\n if (!lastPt || distance(svgPoint, lastPt) >= adjustedThreshold) {\n currentLaser.points.push({ x: svgPoint.x, y: svgPoint.y, timestamp: performance.now() });\n }\n}\n\nfunction drawingLoop() {\n if (!isDrawing) {\n drawingAnimationId = null;\n return;\n }\n\n const currentLaser = lasers[lasers.length - 1];\n if (currentLaser) {\n updateLaserAppearance(currentLaser, false);\n }\n drawingAnimationId = requestAnimationFrame(drawingLoop);\n}\n\n\nfunction fadingLasersLoop() {\n if (fadingLasers.length === 0) {\n fadingAnimationId = null;\n return;\n }\n\n const currentTime = performance.now();\n\n for (let i = fadingLasers.length - 1; i >= 0; i--) {\n const laser = fadingLasers[i];\n const elapsed = currentTime - laser.fadeStartTime;\n const rawProgress = Math.min(1, elapsed / fadeOutDuration);\n laser.fadeProgress = 1 - rawProgress * rawProgress * rawProgress; // cubic ease out\n\n updateLaserAppearance(laser, true);\n\n if (laser.fadeProgress <= 0.01) {\n const laserGroup = document.getElementById(laser.id);\n if (laserGroup) laserGroup.remove();\n fadingLasers.splice(i, 1);\n }\n }\n\n fadingAnimationId = requestAnimationFrame(fadingLasersLoop);\n}\n\n\nfunction fadeLaserTrail(laser) {\n lasers = lasers.filter(l => l.id !== laser.id);\n\n laser.fadeStartTime = performance.now();\n laser.initialPoints = [...laser.points];\n laser.fadeProgress = 1;\n\n fadingLasers.push(laser);\n\n if (!fadingAnimationId) {\n fadingAnimationId = requestAnimationFrame(fadingLasersLoop);\n }\n}\n\n\nsvg.addEventListener(\"mousedown\", (e) => {\n if (!isLaserToolActive) return;\n\n if (e.target !== svg) {\n const isUIElement = e.target.closest('.selection-box, .resize-handle');\n if (isUIElement) return;\n }\n\n let screenPoint = { x: e.clientX, y: e.clientY };\n let startSvgPoint = screenToViewBoxPoint(screenPoint.x, screenPoint.y);\n if (!startSvgPoint) return;\n\n // If a drawing is already in progress, trigger its fade-out\n if (isDrawing && lasers.length > 0) {\n fadeLaserTrail(lasers[lasers.length - 1]);\n }\n\n isDrawing = true;\n\n const laserId = \"laserGroup_\" + Date.now() + \"_\" + Math.random().toString(16).slice(2);\n const newLaser = {\n id: laserId,\n points: [{ x: startSvgPoint.x, y: startSvgPoint.y, timestamp: performance.now() }],\n };\n lasers.push(newLaser);\n\n if (!drawingAnimationId) {\n drawingAnimationId = requestAnimationFrame(drawingLoop);\n }\n});\n\nsvg.addEventListener(\"mousemove\", (e) => {\n if (isLaserToolActive) {\n svg.style.cursor = `url(${lazerCursor}) 0 0, auto`;\n }\n\n if (!isDrawing) return;\n\n addPointToCurrentLaser(e.clientX, e.clientY);\n});\n\nsvg.addEventListener(\"mouseup\", (e) => {\n if (!isDrawing) return;\n\n isDrawing = false;\n\n if (lasers.length > 0) {\n fadeLaserTrail(lasers[lasers.length - 1]);\n }\n\n if (isLaserToolActive) {\n svg.style.cursor = `url(${lazerCursor}) 0 0, auto`;\n } else {\n svg.style.cursor = 'default';\n }\n});\n\nsvg.addEventListener(\"mouseleave\", (e) => {\n if (!isDrawing) return;\n\n isDrawing = false;\n\n if (lasers.length > 0) {\n fadeLaserTrail(lasers[lasers.length - 1]);\n }\n\n});\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDown,
4
+ handleMouseMove,
5
+ handleMouseUp
6
+ } from "./chunk-6SFNWGGZ.js";
7
+ import "./chunk-BZE4CEBG.js";
8
+ import "./chunk-L5OARZJ7.js";
9
+ export {
10
+ handleMouseDown as handleMouseDownLine,
11
+ handleMouseMove as handleMouseMoveLine,
12
+ handleMouseUp as handleMouseUpLine
13
+ };
14
+ //# sourceMappingURL=lineTool-WNI5EMZ5.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
Binary file
Binary file
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ handleMouseDownRect,
4
+ handleMouseMoveRect,
5
+ handleMouseUpRect
6
+ } from "./chunk-QNSE5BAY.js";
7
+ import "./chunk-BZE4CEBG.js";
8
+ import "./chunk-L5OARZJ7.js";
9
+ export {
10
+ handleMouseDownRect,
11
+ handleMouseMoveRect,
12
+ handleMouseUpRect
13
+ };
14
+ //# sourceMappingURL=rectangleTool-U7DZ6ZTA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }