@elixpo/lixsketch 5.4.6 → 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.
- package/dist/react/AIRenderer-M4LMJ66J.js +1105 -0
- package/dist/react/AIRenderer-M4LMJ66J.js.map +7 -0
- package/dist/react/Arrow-BJDAXPMH.js +8 -0
- package/dist/react/Arrow-BJDAXPMH.js.map +7 -0
- package/dist/react/Circle-KPG7TKIX.js +8 -0
- package/dist/react/Circle-KPG7TKIX.js.map +7 -0
- package/dist/react/CodeShape-K4DIZAIV.js +8 -0
- package/dist/react/CodeShape-K4DIZAIV.js.map +7 -0
- package/dist/react/CopyPaste-4CKJRHJ3.js +569 -0
- package/dist/react/CopyPaste-4CKJRHJ3.js.map +7 -0
- package/dist/react/EraserTrail-PA6IQLQN.js +20 -0
- package/dist/react/EraserTrail-PA6IQLQN.js.map +7 -0
- package/dist/react/EventDispatcher-SRFH6LQZ.js +463 -0
- package/dist/react/EventDispatcher-SRFH6LQZ.js.map +7 -0
- package/dist/react/Frame-6UR5XPAX.js +10 -0
- package/dist/react/Frame-6UR5XPAX.js.map +7 -0
- package/dist/react/FreehandStroke-CK24NUT3.js +8 -0
- package/dist/react/FreehandStroke-CK24NUT3.js.map +7 -0
- package/dist/react/GraphEngine-QE5B2PMR.js +340 -0
- package/dist/react/GraphEngine-QE5B2PMR.js.map +7 -0
- package/dist/react/GraphMathParser-2WMTY4IE.js +10 -0
- package/dist/react/GraphMathParser-2WMTY4IE.js.map +7 -0
- package/dist/react/IconShape-KMIA6T2H.js +10 -0
- package/dist/react/IconShape-KMIA6T2H.js.map +7 -0
- package/dist/react/ImageShape-CHHGBXUQ.js +10 -0
- package/dist/react/ImageShape-CHHGBXUQ.js.map +7 -0
- package/dist/react/LayerOrder-XCHF4MSS.js +66 -0
- package/dist/react/LayerOrder-XCHF4MSS.js.map +7 -0
- package/dist/react/Line-2KOQEEGA.js +10 -0
- package/dist/react/Line-2KOQEEGA.js.map +7 -0
- package/dist/react/LixScriptParser-JYWJX375.js +1033 -0
- package/dist/react/LixScriptParser-JYWJX375.js.map +7 -0
- package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js +412 -0
- package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js.map +7 -0
- package/dist/react/MermaidSequenceParser-UKG2NSZY.js +8 -0
- package/dist/react/MermaidSequenceParser-UKG2NSZY.js.map +7 -0
- package/dist/react/MermaidSequenceRenderer-HPLHY5II.js +387 -0
- package/dist/react/MermaidSequenceRenderer-HPLHY5II.js.map +7 -0
- package/dist/react/Rectangle-6FE7RN6W.js +8 -0
- package/dist/react/Rectangle-6FE7RN6W.js.map +7 -0
- package/dist/react/ResizeCode-WAMDTKSW.js +2 -0
- package/dist/react/ResizeCode-WAMDTKSW.js.map +7 -0
- package/dist/react/ResizeShapes-LKEQTITP.js +250 -0
- package/dist/react/ResizeShapes-LKEQTITP.js.map +7 -0
- package/dist/react/SceneSerializer-4U4B24JM.js +739 -0
- package/dist/react/SceneSerializer-4U4B24JM.js.map +7 -0
- package/dist/react/Selection-VVUHY5YJ.js +34 -0
- package/dist/react/Selection-VVUHY5YJ.js.map +7 -0
- package/dist/react/SketchEngine-YA4RG3KX.js +413 -0
- package/dist/react/SketchEngine-YA4RG3KX.js.map +7 -0
- package/dist/react/TextShape-54ZJ66E3.js +8 -0
- package/dist/react/TextShape-54ZJ66E3.js.map +7 -0
- package/dist/react/UndoRedo-M2JZUBKN.js +30 -0
- package/dist/react/UndoRedo-M2JZUBKN.js.map +7 -0
- package/dist/react/ZoomPan-U3TXC5AJ.js +186 -0
- package/dist/react/ZoomPan-U3TXC5AJ.js.map +7 -0
- package/dist/react/arrowTool-CWEMIRXK.js +17 -0
- package/dist/react/arrowTool-CWEMIRXK.js.map +7 -0
- package/dist/react/boxicons-5JNJQPUP.woff +0 -0
- package/dist/react/boxicons-6NVWQSCQ.eot +0 -0
- package/dist/react/boxicons-AQ5N6WP7.woff2 +0 -0
- package/dist/react/boxicons-GDR4JU3X.ttf +0 -0
- package/dist/react/boxicons-NNFHLMOR.svg +1660 -0
- package/dist/react/chunk-2OQXI7QB.js +564 -0
- package/dist/react/chunk-2OQXI7QB.js.map +7 -0
- package/dist/react/chunk-5OUBTHHO.js +187 -0
- package/dist/react/chunk-5OUBTHHO.js.map +7 -0
- package/dist/react/chunk-6PFXZKL2.js +628 -0
- package/dist/react/chunk-6PFXZKL2.js.map +7 -0
- package/dist/react/chunk-6SFNWGGZ.js +453 -0
- package/dist/react/chunk-6SFNWGGZ.js.map +7 -0
- package/dist/react/chunk-7TZSIR6V.js +210 -0
- package/dist/react/chunk-7TZSIR6V.js.map +7 -0
- package/dist/react/chunk-AJAZC37E.js +662 -0
- package/dist/react/chunk-AJAZC37E.js.map +7 -0
- package/dist/react/chunk-BU4D2WYQ.js +1213 -0
- package/dist/react/chunk-BU4D2WYQ.js.map +7 -0
- package/dist/react/chunk-BZE4CEBG.js +747 -0
- package/dist/react/chunk-BZE4CEBG.js.map +7 -0
- package/dist/react/chunk-CB2RANCB.js +212 -0
- package/dist/react/chunk-CB2RANCB.js.map +7 -0
- package/dist/react/chunk-DNAG7ML6.js +128 -0
- package/dist/react/chunk-DNAG7ML6.js.map +7 -0
- package/dist/react/chunk-HZWLPXFN.js +198 -0
- package/dist/react/chunk-HZWLPXFN.js.map +7 -0
- package/dist/react/chunk-I6HCCIXB.js +572 -0
- package/dist/react/chunk-I6HCCIXB.js.map +7 -0
- package/dist/react/chunk-IZ5OGWGW.js +235 -0
- package/dist/react/chunk-IZ5OGWGW.js.map +7 -0
- package/dist/react/chunk-JJCJNLNN.js +1490 -0
- package/dist/react/chunk-JJCJNLNN.js.map +7 -0
- package/dist/react/chunk-JQ3IRFDP.js +222 -0
- package/dist/react/chunk-JQ3IRFDP.js.map +7 -0
- package/dist/react/chunk-L5OARZJ7.js +1134 -0
- package/dist/react/chunk-L5OARZJ7.js.map +7 -0
- package/dist/react/chunk-LHRTXNVE.js +1600 -0
- package/dist/react/chunk-LHRTXNVE.js.map +7 -0
- package/dist/react/chunk-Q2GA4MBZ.js +1653 -0
- package/dist/react/chunk-Q2GA4MBZ.js.map +7 -0
- package/dist/react/chunk-QNSE5BAY.js +519 -0
- package/dist/react/chunk-QNSE5BAY.js.map +7 -0
- package/dist/react/chunk-QXFBG7OM.js +191 -0
- package/dist/react/chunk-QXFBG7OM.js.map +7 -0
- package/dist/react/chunk-T6ZVV5ZO.js +714 -0
- package/dist/react/chunk-T6ZVV5ZO.js.map +7 -0
- package/dist/react/chunk-URB6MY46.js +974 -0
- package/dist/react/chunk-URB6MY46.js.map +7 -0
- package/dist/react/chunk-VN62KLOC.js +931 -0
- package/dist/react/chunk-VN62KLOC.js.map +7 -0
- package/dist/react/chunk-VQVEPJSA.js +158 -0
- package/dist/react/chunk-VQVEPJSA.js.map +7 -0
- package/dist/react/chunk-XISEAGBV.js +1632 -0
- package/dist/react/chunk-XISEAGBV.js.map +7 -0
- package/dist/react/chunk-YKJUBFHE.js +575 -0
- package/dist/react/chunk-YKJUBFHE.js.map +7 -0
- package/dist/react/circleTool-NUATSEI2.js +14 -0
- package/dist/react/circleTool-NUATSEI2.js.map +7 -0
- package/dist/react/codeTool-MHCB2FNB.js +38 -0
- package/dist/react/codeTool-MHCB2FNB.js.map +7 -0
- package/dist/react/eraserTool-2GS2LQCS.js +103 -0
- package/dist/react/eraserTool-2GS2LQCS.js.map +7 -0
- package/dist/react/frameTool-PWVKKXSP.js +14 -0
- package/dist/react/frameTool-PWVKKXSP.js.map +7 -0
- package/dist/react/freehandTool-SLYGASVP.js +14 -0
- package/dist/react/freehandTool-SLYGASVP.js.map +7 -0
- package/dist/react/iconTool-GPZ7O7NH.js +18 -0
- package/dist/react/iconTool-GPZ7O7NH.js.map +7 -0
- package/dist/react/imageTool-D5R4XGEU.js +15 -0
- package/dist/react/imageTool-D5R4XGEU.js.map +7 -0
- package/dist/react/index.js +5342 -0
- package/dist/react/index.js.map +7 -0
- package/dist/react/laserTool-XVMV63AV.js +239 -0
- package/dist/react/laserTool-XVMV63AV.js.map +7 -0
- package/dist/react/lineTool-WNI5EMZ5.js +14 -0
- package/dist/react/lineTool-WNI5EMZ5.js.map +7 -0
- package/dist/react/lixCode-OJMVUXXI.ttf +0 -0
- package/dist/react/lixDefault-JEAPAUJL.ttf +0 -0
- package/dist/react/lixFancy-BPXYM5CQ.ttf +0 -0
- package/dist/react/lixFont-CPKEUDVM.woff2 +0 -0
- package/dist/react/rectangleTool-U7DZ6ZTA.js +14 -0
- package/dist/react/rectangleTool-U7DZ6ZTA.js.map +7 -0
- package/dist/react/styles.css +6627 -0
- package/dist/react/textTool-M7S6F3VC.js +21 -0
- package/dist/react/textTool-M7S6F3VC.js.map +7 -0
- package/package.json +39 -5
- package/src/EngineShortcuts.js +83 -27
- package/src/core/AIRenderer.js +30 -18
- package/src/core/CopyPaste.js +22 -3
- package/src/core/GraphEngine.js +64 -41
- package/src/core/MermaidFlowchartRenderer.js +153 -88
- package/src/core/MermaidSequenceRenderer.js +168 -93
- package/src/core/SceneSerializer.js +86 -2
- package/src/core/Selection.js +119 -19
- package/src/core/UndoRedo.js +82 -15
- package/src/core/ZoomPan.js +15 -5
- package/src/index.js +25 -1
- package/src/react/LixSketchCanvas.jsx +347 -0
- package/src/react/components/AppMenu.jsx +475 -0
- package/src/react/components/Footer.jsx +85 -0
- package/src/react/components/Toolbar.jsx +140 -0
- package/src/react/components/canvas/CanvasLoadingOverlay.jsx +76 -0
- package/src/react/components/canvas/ContextMenu.jsx +466 -0
- package/src/react/components/canvas/FindBar.jsx +177 -0
- package/src/react/components/canvas/ImageSourcePicker.jsx +133 -0
- package/src/react/components/canvas/MultiSelectActions.jsx +120 -0
- package/src/react/components/canvas/SVGCanvas.jsx +145 -0
- package/src/react/components/canvas/SaveStatusIndicator.jsx +29 -0
- package/src/react/components/modals/CanvasPropertiesModal.jsx +358 -0
- package/src/react/components/modals/CommandPalette.jsx +307 -0
- package/src/react/components/modals/ExportImageModal.jsx +287 -0
- package/src/react/components/modals/GraphModal.jsx +174 -0
- package/src/react/components/modals/HelpModal.jsx +208 -0
- package/src/react/components/modals/LixScriptModal.jsx +130 -0
- package/src/react/components/modals/ShortcutsModal.jsx +125 -0
- package/src/react/components/sidebars/ArrowSidebar.jsx +173 -0
- package/src/react/components/sidebars/CircleSidebar.jsx +134 -0
- package/src/react/components/sidebars/FrameSidebar.jsx +263 -0
- package/src/react/components/sidebars/IconSidebar.jsx +279 -0
- package/src/react/components/sidebars/ImageSidebar.jsx +69 -0
- package/src/react/components/sidebars/LineSidebar.jsx +109 -0
- package/src/react/components/sidebars/PaintbrushSidebar.jsx +119 -0
- package/src/react/components/sidebars/RectangleSidebar.jsx +165 -0
- package/src/react/components/sidebars/ShapeSidebar.jsx +130 -0
- package/src/react/components/sidebars/TextSidebar.jsx +174 -0
- package/src/react/hooks/inertStores.js +58 -0
- package/src/react/hooks/useSketchEngine.js +76 -0
- package/src/react/hooks/useTranslation.js +92 -0
- package/src/react/index.js +41 -0
- package/src/react/store/useSketchStore.js +234 -0
- package/src/react/store/useUIStore.js +196 -0
- package/src/react/styles/arrowSidebar.css +263 -0
- package/src/react/styles/canvasStroke.css +47 -0
- package/src/react/styles/canvasTools.css +769 -0
- package/src/react/styles/circleSidebar.css +206 -0
- package/src/react/styles/fonts/fonts.css +29 -0
- package/src/react/styles/fonts/lixCode.ttf +0 -0
- package/src/react/styles/fonts/lixDefault.ttf +0 -0
- package/src/react/styles/fonts/lixDocs.ttf +0 -0
- package/src/react/styles/fonts/lixFancy.ttf +0 -0
- package/src/react/styles/fonts/lixFont.woff2 +0 -0
- package/src/react/styles/lineSidebar.css +207 -0
- package/src/react/styles/paintbrushSidebar.css +247 -0
- package/src/react/styles/squareSidebar.css +206 -0
- package/src/react/styles/writeText.css +149 -0
- package/src/react/styles.css +175 -0
- package/src/react/toolsEnum.js +20 -0
- package/src/react/utils/toast.js +18 -0
- package/src/shapes/Frame.js +7 -1
- package/src/shapes/Line.js +11 -5
- package/src/tools/arrowTool.js +30 -4
- package/src/tools/circleTool.js +33 -9
- package/src/tools/codeTool.js +5 -3
- package/src/tools/frameTool.js +47 -7
- package/src/tools/freehandTool.js +12 -4
- package/src/tools/iconTool.js +7 -1
- package/src/tools/imageTool.js +56 -22
- package/src/tools/lineTool.js +27 -3
- package/src/tools/rectangleTool.js +45 -8
- package/src/tools/textTool.js +23 -6
- package/src/utils/allowedImageTypes.js +53 -0
|
@@ -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
|
|
Binary file
|
|
Binary file
|
|
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
|