@elixpo/lixsketch 5.6.4 → 5.6.6
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/mcp/index.js +5 -1
- package/dist/mcp/index.js.map +2 -2
- package/dist/mcp/stdio.js +5 -1
- package/dist/mcp/stdio.js.map +2 -2
- package/dist/react/{AIRenderer-SRF7LU5K.js → AIRenderer-R5M2CIDO.js} +13 -6
- package/dist/react/AIRenderer-R5M2CIDO.js.map +7 -0
- package/dist/react/Circle-HMM5PKJ2.js +10 -0
- package/dist/react/{CopyPaste-YUDZ6DHY.js → CopyPaste-P6G35CXO.js} +11 -10
- package/dist/react/{CopyPaste-YUDZ6DHY.js.map → CopyPaste-P6G35CXO.js.map} +1 -1
- package/dist/react/{EventDispatcher-7LAK7GQ7.js → EventDispatcher-M5B4EWHJ.js} +216 -63
- package/dist/react/EventDispatcher-M5B4EWHJ.js.map +7 -0
- package/dist/react/Frame-QEUEYITT.js +11 -0
- package/dist/react/{FreehandStroke-U6GYZOM4.js → FreehandStroke-WXIJKD5I.js} +2 -2
- package/dist/react/{GraphEngine-MM6ALA2N.js → GraphEngine-XH3RPYO4.js} +9 -2
- package/dist/react/GraphEngine-XH3RPYO4.js.map +7 -0
- package/dist/react/IconShape-NHJE4YBY.js +10 -0
- package/dist/react/ImageShape-33VCMSDP.js +10 -0
- package/dist/react/Line-A6FE232Q.js +10 -0
- package/dist/react/{LixScriptParser-JYWJX375.js → LixScriptParser-YS3ZOTGS.js} +6 -2
- package/dist/react/LixScriptParser-YS3ZOTGS.js.map +7 -0
- package/dist/react/{MermaidFlowchartRenderer-PQEC4TMI.js → MermaidFlowchartRenderer-EL3Q2MNW.js} +6 -2
- package/dist/react/MermaidFlowchartRenderer-EL3Q2MNW.js.map +7 -0
- package/dist/react/MermaidSequenceParser-DBYXW23P.js +8 -0
- package/dist/react/{MermaidSequenceRenderer-KCUHO7UI.js → MermaidSequenceRenderer-K4KHHEVC.js} +10 -3
- package/dist/react/MermaidSequenceRenderer-K4KHHEVC.js.map +7 -0
- package/dist/react/{MermaidStructuredRenderer-W7UKN7BM.js → MermaidStructuredRenderer-6LN3WISP.js} +7 -2
- package/dist/react/MermaidStructuredRenderer-6LN3WISP.js.map +7 -0
- package/dist/react/Rectangle-4U4CD2ER.js +10 -0
- package/dist/react/{SceneSerializer-SG6SJN5X.js → SceneSerializer-JEYTYXZQ.js} +120 -46
- package/dist/react/SceneSerializer-JEYTYXZQ.js.map +7 -0
- package/dist/react/{Selection-2TSH3J6P.js → Selection-23MOLHEI.js} +4 -4
- package/dist/react/{SketchEngine-UD2XV2KT.js → SketchEngine-OPJON7TD.js} +26 -26
- package/dist/react/{UndoRedo-IN4SXDG6.js → UndoRedo-QVNRI5OB.js} +8 -2
- package/dist/react/{arrowTool-OYDWJGQK.js → arrowTool-VH3PJPDM.js} +3 -3
- package/dist/react/{chunk-LSHZYN77.js → chunk-2DZHO67H.js} +2 -2
- package/dist/react/{chunk-XOWNCYE4.js → chunk-5NHJJJBZ.js} +3 -3
- package/dist/react/chunk-6AIFXYV6.js +31 -0
- package/dist/react/chunk-6AIFXYV6.js.map +7 -0
- package/dist/react/{chunk-K5RY4EV7.js → chunk-6GPWSPJF.js} +9 -5
- package/dist/react/{chunk-K5RY4EV7.js.map → chunk-6GPWSPJF.js.map} +2 -2
- package/dist/react/{chunk-ASBC5G35.js → chunk-B6CYUZC4.js} +2 -2
- package/dist/react/{chunk-OP56XPWF.js → chunk-DNFPTVIP.js} +2 -2
- package/dist/react/{chunk-XYUFEIZR.js → chunk-DWEFPKDO.js} +2 -2
- package/dist/react/{chunk-GQUZPON4.js → chunk-F56XUE5S.js} +4 -4
- package/dist/react/{chunk-7CM5XQDN.js → chunk-G3DJQY65.js} +20 -36
- package/dist/react/chunk-G3DJQY65.js.map +7 -0
- package/dist/react/{chunk-LJR7EVW2.js → chunk-JEGLUNBC.js} +3 -3
- package/dist/react/{chunk-6GPEWDRB.js → chunk-M7GAB24F.js} +52 -6
- package/dist/react/chunk-M7GAB24F.js.map +7 -0
- package/dist/react/{chunk-VQVEPJSA.js → chunk-MHV5P6TS.js} +2 -1
- package/dist/react/chunk-MHV5P6TS.js.map +7 -0
- package/dist/react/{chunk-PXFPPO3R.js → chunk-NH3NVSWT.js} +18 -2
- package/dist/react/chunk-NH3NVSWT.js.map +7 -0
- package/dist/react/{chunk-XFL4R5ZF.js → chunk-OK4ROGMM.js} +16 -35
- package/dist/react/chunk-OK4ROGMM.js.map +7 -0
- package/dist/react/{chunk-APTOPAOY.js → chunk-SSFEN5CY.js} +3 -3
- package/dist/react/{chunk-RGMDWLRJ.js → chunk-UEL2G6D2.js} +3 -3
- package/dist/react/{chunk-M6TMN76K.js → chunk-ULPIHUVC.js} +3 -3
- package/dist/react/{chunk-FETTJLCV.js → chunk-VZPH7OAM.js} +14 -22
- package/dist/react/chunk-VZPH7OAM.js.map +7 -0
- package/dist/react/{chunk-TKXKJNTX.js → chunk-W7XUY4GR.js} +16 -19
- package/dist/react/chunk-W7XUY4GR.js.map +7 -0
- package/dist/react/{chunk-EOURRJ55.js → chunk-XSE4HQ2D.js} +2 -2
- package/dist/react/{chunk-K5BG5MHY.js → chunk-ZNZAICWY.js} +36 -60
- package/dist/react/chunk-ZNZAICWY.js.map +7 -0
- package/dist/react/{circleTool-LDKGZALF.js → circleTool-2UODOBCV.js} +4 -4
- package/dist/react/{codeTool-4YZO5W7J.js → codeTool-F4RV7SAI.js} +4 -4
- package/dist/react/{frameTool-MXNJEXQQ.js → frameTool-NTGA5BI6.js} +4 -4
- package/dist/react/{freehandTool-26D3FOOX.js → freehandTool-L55EUB5C.js} +4 -4
- package/dist/react/{iconTool-46O5VEUX.js → iconTool-KQQBLGR3.js} +4 -4
- package/dist/react/{imageTool-P2RWZRHO.js → imageTool-LDJ45AD7.js} +4 -4
- package/dist/react/index.js +148 -37
- package/dist/react/index.js.map +4 -4
- package/dist/react/{lineTool-ZMR27U5L.js → lineTool-CSAFD7PW.js} +4 -4
- package/dist/react/{rectangleTool-EJKK6UTX.js → rectangleTool-YPD2SIIZ.js} +4 -4
- package/dist/react/{textTool-S4XXZHZH.js → textTool-VQHMWEFJ.js} +5 -5
- package/package.json +5 -2
- package/src/core/AIRenderer.js +8 -2
- package/src/core/CanvasSpace.js +28 -0
- package/src/core/GraphRenderer.js +8 -3
- package/src/core/LixScriptParser.js +7 -1
- package/src/core/MermaidFlowchartRenderer.js +5 -1
- package/src/core/MermaidSequenceParser.js +1 -0
- package/src/core/MermaidSequenceRenderer.js +8 -3
- package/src/core/MermaidStructuredRenderer.js +6 -1
- package/src/core/SceneSerializer.js +121 -38
- package/src/core/Selection.js +12 -2
- package/src/core/UndoRedo.js +59 -5
- package/src/react/components/AppMenu.jsx +20 -19
- package/src/react/components/canvas/CanvasRulers.jsx +8 -13
- package/src/react/components/canvas/SVGCanvas.jsx +2 -1
- package/src/react/components/canvas/rulerUnits.js +28 -0
- package/src/react/components/sidebars/PaintBucketSidebar.jsx +1 -1
- package/src/react/store/useSketchStore.js +24 -3
- package/src/react/store/useUIStore.js +24 -1
- package/src/react/utils/canvasBackgrounds.js +29 -0
- package/src/shapes/Circle.js +12 -19
- package/src/shapes/Frame.js +38 -69
- package/src/shapes/FreehandStroke.js +24 -1
- package/src/shapes/Rectangle.js +10 -22
- package/src/tools/circleTool.js +3 -27
- package/src/tools/paintBucketTool.js +72 -15
- package/src/tools/rectangleTool.js +7 -23
- package/src/tools/shapeRecognition.js +270 -0
- package/src/tools/shapeRecognitionTool.js +36 -183
- package/dist/react/AIRenderer-SRF7LU5K.js.map +0 -7
- package/dist/react/Circle-6POZCUZD.js +0 -9
- package/dist/react/EventDispatcher-7LAK7GQ7.js.map +0 -7
- package/dist/react/Frame-7D2MXCFF.js +0 -11
- package/dist/react/GraphEngine-MM6ALA2N.js.map +0 -7
- package/dist/react/IconShape-ZADX7Y33.js +0 -10
- package/dist/react/ImageShape-UJQN2HI7.js +0 -10
- package/dist/react/Line-APEULMHE.js +0 -10
- package/dist/react/LixScriptParser-JYWJX375.js.map +0 -7
- package/dist/react/MermaidFlowchartRenderer-PQEC4TMI.js.map +0 -7
- package/dist/react/MermaidSequenceParser-UKG2NSZY.js +0 -8
- package/dist/react/MermaidSequenceRenderer-KCUHO7UI.js.map +0 -7
- package/dist/react/MermaidStructuredRenderer-W7UKN7BM.js.map +0 -7
- package/dist/react/Rectangle-S7XUKWYD.js +0 -9
- package/dist/react/SceneSerializer-SG6SJN5X.js.map +0 -7
- package/dist/react/chunk-6GPEWDRB.js.map +0 -7
- package/dist/react/chunk-7CM5XQDN.js.map +0 -7
- package/dist/react/chunk-FETTJLCV.js.map +0 -7
- package/dist/react/chunk-K5BG5MHY.js.map +0 -7
- package/dist/react/chunk-PXFPPO3R.js.map +0 -7
- package/dist/react/chunk-TKXKJNTX.js.map +0 -7
- package/dist/react/chunk-VQVEPJSA.js.map +0 -7
- package/dist/react/chunk-XFL4R5ZF.js.map +0 -7
- /package/dist/react/{Circle-6POZCUZD.js.map → Circle-HMM5PKJ2.js.map} +0 -0
- /package/dist/react/{Frame-7D2MXCFF.js.map → Frame-QEUEYITT.js.map} +0 -0
- /package/dist/react/{FreehandStroke-U6GYZOM4.js.map → FreehandStroke-WXIJKD5I.js.map} +0 -0
- /package/dist/react/{IconShape-ZADX7Y33.js.map → IconShape-NHJE4YBY.js.map} +0 -0
- /package/dist/react/{ImageShape-UJQN2HI7.js.map → ImageShape-33VCMSDP.js.map} +0 -0
- /package/dist/react/{Line-APEULMHE.js.map → Line-A6FE232Q.js.map} +0 -0
- /package/dist/react/{MermaidSequenceParser-UKG2NSZY.js.map → MermaidSequenceParser-DBYXW23P.js.map} +0 -0
- /package/dist/react/{Rectangle-S7XUKWYD.js.map → Rectangle-4U4CD2ER.js.map} +0 -0
- /package/dist/react/{Selection-2TSH3J6P.js.map → Selection-23MOLHEI.js.map} +0 -0
- /package/dist/react/{SketchEngine-UD2XV2KT.js.map → SketchEngine-OPJON7TD.js.map} +0 -0
- /package/dist/react/{UndoRedo-IN4SXDG6.js.map → UndoRedo-QVNRI5OB.js.map} +0 -0
- /package/dist/react/{arrowTool-OYDWJGQK.js.map → arrowTool-VH3PJPDM.js.map} +0 -0
- /package/dist/react/{chunk-LSHZYN77.js.map → chunk-2DZHO67H.js.map} +0 -0
- /package/dist/react/{chunk-XOWNCYE4.js.map → chunk-5NHJJJBZ.js.map} +0 -0
- /package/dist/react/{chunk-ASBC5G35.js.map → chunk-B6CYUZC4.js.map} +0 -0
- /package/dist/react/{chunk-OP56XPWF.js.map → chunk-DNFPTVIP.js.map} +0 -0
- /package/dist/react/{chunk-XYUFEIZR.js.map → chunk-DWEFPKDO.js.map} +0 -0
- /package/dist/react/{chunk-GQUZPON4.js.map → chunk-F56XUE5S.js.map} +0 -0
- /package/dist/react/{chunk-LJR7EVW2.js.map → chunk-JEGLUNBC.js.map} +0 -0
- /package/dist/react/{chunk-APTOPAOY.js.map → chunk-SSFEN5CY.js.map} +0 -0
- /package/dist/react/{chunk-RGMDWLRJ.js.map → chunk-UEL2G6D2.js.map} +0 -0
- /package/dist/react/{chunk-M6TMN76K.js.map → chunk-ULPIHUVC.js.map} +0 -0
- /package/dist/react/{chunk-EOURRJ55.js.map → chunk-XSE4HQ2D.js.map} +0 -0
- /package/dist/react/{circleTool-LDKGZALF.js.map → circleTool-2UODOBCV.js.map} +0 -0
- /package/dist/react/{codeTool-4YZO5W7J.js.map → codeTool-F4RV7SAI.js.map} +0 -0
- /package/dist/react/{frameTool-MXNJEXQQ.js.map → frameTool-NTGA5BI6.js.map} +0 -0
- /package/dist/react/{freehandTool-26D3FOOX.js.map → freehandTool-L55EUB5C.js.map} +0 -0
- /package/dist/react/{iconTool-46O5VEUX.js.map → iconTool-KQQBLGR3.js.map} +0 -0
- /package/dist/react/{imageTool-P2RWZRHO.js.map → imageTool-LDJ45AD7.js.map} +0 -0
- /package/dist/react/{lineTool-ZMR27U5L.js.map → lineTool-CSAFD7PW.js.map} +0 -0
- /package/dist/react/{rectangleTool-EJKK6UTX.js.map → rectangleTool-YPD2SIIZ.js.map} +0 -0
- /package/dist/react/{textTool-S4XXZHZH.js.map → textTool-VQHMWEFJ.js.map} +0 -0
|
@@ -4,40 +4,57 @@ import {
|
|
|
4
4
|
} from "./chunk-MB7VS6MK.js";
|
|
5
5
|
import {
|
|
6
6
|
ImageShape
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-B6CYUZC4.js";
|
|
8
8
|
import {
|
|
9
9
|
IconShape
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-XSE4HQ2D.js";
|
|
11
11
|
import {
|
|
12
12
|
Frame
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-ZNZAICWY.js";
|
|
14
14
|
import {
|
|
15
15
|
FreehandStroke
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-NH3NVSWT.js";
|
|
17
17
|
import {
|
|
18
18
|
normalizeWebEmbedUrl
|
|
19
19
|
} from "./chunk-QZI4UIE5.js";
|
|
20
20
|
import {
|
|
21
21
|
Rectangle
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-VZPH7OAM.js";
|
|
23
23
|
import {
|
|
24
24
|
Circle
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-W7XUY4GR.js";
|
|
26
|
+
import "./chunk-6AIFXYV6.js";
|
|
26
27
|
import "./chunk-PAKA6HUX.js";
|
|
27
28
|
import {
|
|
28
29
|
Arrow
|
|
29
30
|
} from "./chunk-BT2EIJD4.js";
|
|
30
31
|
import {
|
|
31
32
|
Line
|
|
32
|
-
} from "./chunk-
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import
|
|
33
|
+
} from "./chunk-DNFPTVIP.js";
|
|
34
|
+
import "./chunk-DWEFPKDO.js";
|
|
35
|
+
import {
|
|
36
|
+
clearUndoHistory,
|
|
37
|
+
pushCanvasResetAction
|
|
38
|
+
} from "./chunk-M7GAB24F.js";
|
|
35
39
|
import {
|
|
36
40
|
TextShape
|
|
37
41
|
} from "./chunk-PGT3TJOW.js";
|
|
38
42
|
|
|
39
43
|
// src/core/SceneSerializer.js
|
|
40
44
|
var FORMAT_VERSION = 1;
|
|
45
|
+
var GZIP_MAGIC = [31, 139];
|
|
46
|
+
var SUPPORTED_SHAPE_TYPES = /* @__PURE__ */ new Set([
|
|
47
|
+
"rectangle",
|
|
48
|
+
"circle",
|
|
49
|
+
"line",
|
|
50
|
+
"arrow",
|
|
51
|
+
"freehandStroke",
|
|
52
|
+
"frame",
|
|
53
|
+
"text",
|
|
54
|
+
"code",
|
|
55
|
+
"image",
|
|
56
|
+
"icon"
|
|
57
|
+
]);
|
|
41
58
|
var _sessionID = null;
|
|
42
59
|
function getSessionID() {
|
|
43
60
|
if (!_sessionID) {
|
|
@@ -382,8 +399,9 @@ function saveScene(workspaceName = "Untitled") {
|
|
|
382
399
|
return scene;
|
|
383
400
|
}
|
|
384
401
|
function loadScene(sceneData) {
|
|
385
|
-
|
|
386
|
-
|
|
402
|
+
const validation = validateScene(sceneData);
|
|
403
|
+
if (!validation.valid) {
|
|
404
|
+
console.error("[SceneSerializer] Invalid scene:", validation.error);
|
|
387
405
|
return false;
|
|
388
406
|
}
|
|
389
407
|
const svgEl = window.svg;
|
|
@@ -473,6 +491,14 @@ function loadScene(sceneData) {
|
|
|
473
491
|
}
|
|
474
492
|
}
|
|
475
493
|
}
|
|
494
|
+
const restoredInSceneOrder = sceneData.shapes.map((data) => data.shapeID && idMap.get(data.shapeID)).filter(Boolean);
|
|
495
|
+
const restoredSet = new Set(restoredInSceneOrder);
|
|
496
|
+
window.shapes.splice(
|
|
497
|
+
0,
|
|
498
|
+
window.shapes.length,
|
|
499
|
+
...restoredInSceneOrder,
|
|
500
|
+
...window.shapes.filter((shape) => !restoredSet.has(shape))
|
|
501
|
+
);
|
|
476
502
|
for (const data of frameData) {
|
|
477
503
|
const frame = idMap.get(data.shapeID);
|
|
478
504
|
if (!frame) continue;
|
|
@@ -524,24 +550,61 @@ function loadScene(sceneData) {
|
|
|
524
550
|
}
|
|
525
551
|
return true;
|
|
526
552
|
}
|
|
527
|
-
function
|
|
553
|
+
function sceneFileTimestamp(date = /* @__PURE__ */ new Date()) {
|
|
554
|
+
const iso = date.toISOString();
|
|
555
|
+
return `${iso.slice(0, 10).replace(/-/g, "")}-${iso.slice(11, 19).replace(/:/g, "")}`;
|
|
556
|
+
}
|
|
557
|
+
function safeWorkspaceFileName(workspaceName) {
|
|
558
|
+
const safe = String(workspaceName || "Untitled").trim().replace(/[^a-zA-Z0-9_-]+/g, "_").replace(/^_+|_+$/g, "");
|
|
559
|
+
return safe || "Untitled";
|
|
560
|
+
}
|
|
561
|
+
async function encodeSceneFile(scene) {
|
|
562
|
+
const json = JSON.stringify(scene);
|
|
563
|
+
if (typeof CompressionStream === "undefined") {
|
|
564
|
+
return new Blob([json], { type: "application/json" });
|
|
565
|
+
}
|
|
566
|
+
const compressed = new Blob([json]).stream().pipeThrough(new CompressionStream("gzip"));
|
|
567
|
+
const buffer = await new Response(compressed).arrayBuffer();
|
|
568
|
+
return new Blob([buffer], { type: "application/vnd.lixsketch.scene+gzip" });
|
|
569
|
+
}
|
|
570
|
+
async function decodeSceneFile(buffer) {
|
|
571
|
+
const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
572
|
+
const isGzip = bytes[0] === GZIP_MAGIC[0] && bytes[1] === GZIP_MAGIC[1];
|
|
573
|
+
if (!isGzip) return new TextDecoder().decode(bytes);
|
|
574
|
+
if (typeof DecompressionStream === "undefined") {
|
|
575
|
+
throw new Error("This browser cannot open compressed .lixjson files.");
|
|
576
|
+
}
|
|
577
|
+
const decompressed = new Blob([bytes]).stream().pipeThrough(new DecompressionStream("gzip"));
|
|
578
|
+
return new Response(decompressed).text();
|
|
579
|
+
}
|
|
580
|
+
async function downloadScene(workspaceName = "Untitled") {
|
|
528
581
|
const scene = saveScene(workspaceName);
|
|
529
|
-
const
|
|
530
|
-
const blob = new Blob([json], { type: "application/json" });
|
|
582
|
+
const blob = await encodeSceneFile(scene);
|
|
531
583
|
const url = URL.createObjectURL(blob);
|
|
584
|
+
const fileName = `${safeWorkspaceFileName(workspaceName)}-${sceneFileTimestamp()}.lixjson`;
|
|
532
585
|
const a = document.createElement("a");
|
|
533
586
|
a.href = url;
|
|
534
|
-
a.download =
|
|
587
|
+
a.download = fileName;
|
|
535
588
|
document.body.appendChild(a);
|
|
536
589
|
a.click();
|
|
537
590
|
document.body.removeChild(a);
|
|
538
|
-
URL.revokeObjectURL(url);
|
|
591
|
+
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
592
|
+
return { fileName, sizeBytes: blob.size, compressed: blob.type.includes("gzip") };
|
|
539
593
|
}
|
|
540
594
|
function validateScene(data) {
|
|
541
595
|
if (!data || typeof data !== "object") return { valid: false, error: "Not a valid JSON object" };
|
|
542
596
|
if (data.format !== "lixsketch") return { valid: false, error: "Not a LixSketch scene file (missing format field)" };
|
|
543
597
|
if (!data.version || data.version > FORMAT_VERSION) return { valid: false, error: `Unsupported version: ${data.version}` };
|
|
544
598
|
if (!Array.isArray(data.shapes)) return { valid: false, error: "Invalid scene: missing shapes array" };
|
|
599
|
+
for (let index = 0; index < data.shapes.length; index += 1) {
|
|
600
|
+
const shape = data.shapes[index];
|
|
601
|
+
if (!shape || typeof shape !== "object" || Array.isArray(shape)) {
|
|
602
|
+
return { valid: false, error: `Invalid shape at index ${index}` };
|
|
603
|
+
}
|
|
604
|
+
if (!SUPPORTED_SHAPE_TYPES.has(shape.type)) {
|
|
605
|
+
return { valid: false, error: `Unsupported shape type at index ${index}: ${String(shape.type)}` };
|
|
606
|
+
}
|
|
607
|
+
}
|
|
545
608
|
return {
|
|
546
609
|
valid: true,
|
|
547
610
|
name: data.name || "Untitled",
|
|
@@ -555,28 +618,25 @@ function uploadScene() {
|
|
|
555
618
|
const input = document.createElement("input");
|
|
556
619
|
input.type = "file";
|
|
557
620
|
input.accept = ".lixjson,.json";
|
|
558
|
-
input.onchange = (e) => {
|
|
621
|
+
input.onchange = async (e) => {
|
|
559
622
|
const file = e.target.files[0];
|
|
560
623
|
if (!file) return resolve(false);
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
return;
|
|
570
|
-
}
|
|
571
|
-
resetSessionID();
|
|
572
|
-
const result = loadScene(data);
|
|
573
|
-
resolve({ success: result, validation });
|
|
574
|
-
} catch (err) {
|
|
575
|
-
console.error("[SceneSerializer] Failed to parse file:", err);
|
|
576
|
-
resolve({ success: false, error: "Failed to parse JSON file" });
|
|
624
|
+
try {
|
|
625
|
+
const json = await decodeSceneFile(await file.arrayBuffer());
|
|
626
|
+
const data = JSON.parse(json);
|
|
627
|
+
const validation = validateScene(data);
|
|
628
|
+
if (!validation.valid) {
|
|
629
|
+
console.error("[SceneSerializer] Invalid file:", validation.error);
|
|
630
|
+
resolve({ success: false, error: validation.error });
|
|
631
|
+
return;
|
|
577
632
|
}
|
|
578
|
-
|
|
579
|
-
|
|
633
|
+
resetSessionID();
|
|
634
|
+
const result = loadScene(data);
|
|
635
|
+
resolve({ success: result, validation });
|
|
636
|
+
} catch (err) {
|
|
637
|
+
console.error("[SceneSerializer] Failed to parse file:", err);
|
|
638
|
+
resolve({ success: false, error: err.message || "Failed to parse .lixjson file" });
|
|
639
|
+
}
|
|
580
640
|
};
|
|
581
641
|
input.click();
|
|
582
642
|
});
|
|
@@ -677,10 +737,11 @@ function exportAsPDF() {
|
|
|
677
737
|
printWindow.focus();
|
|
678
738
|
setTimeout(() => printWindow.print(), 500);
|
|
679
739
|
}
|
|
680
|
-
function resetCanvas() {
|
|
740
|
+
function resetCanvas({ undoable = true, clearStorage = true, clearHistory = true, workspaceName = "Untitled" } = {}) {
|
|
681
741
|
const svgEl = window.svg;
|
|
682
742
|
if (!svgEl) return;
|
|
683
743
|
const existingShapes = window.shapes || [];
|
|
744
|
+
const resetSnapshot = undoable && existingShapes.length > 0 ? saveScene(workspaceName) : null;
|
|
684
745
|
existingShapes.forEach((shape) => {
|
|
685
746
|
if (shape.shapeName === "frame") {
|
|
686
747
|
if (shape.clipGroup && shape.clipGroup.parentNode) {
|
|
@@ -712,15 +773,26 @@ function resetCanvas() {
|
|
|
712
773
|
if (typeof window.disableAllSideBars === "function") {
|
|
713
774
|
window.disableAllSideBars();
|
|
714
775
|
}
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
776
|
+
if (clearStorage) {
|
|
777
|
+
try {
|
|
778
|
+
localStorage.removeItem("lixsketch-autosave");
|
|
779
|
+
localStorage.removeItem("lixsketch-autosave-meta");
|
|
780
|
+
const sid = window.__sessionID;
|
|
781
|
+
if (sid) {
|
|
782
|
+
localStorage.removeItem(`lixsketch-autosave-${sid}`);
|
|
783
|
+
localStorage.removeItem(`lixsketch-autosave-meta-${sid}`);
|
|
784
|
+
}
|
|
785
|
+
} catch (_) {
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
if (resetSnapshot) {
|
|
789
|
+
pushCanvasResetAction(
|
|
790
|
+
resetSnapshot,
|
|
791
|
+
(snapshot) => loadScene(snapshot),
|
|
792
|
+
() => resetCanvas({ undoable: false, clearStorage: true, clearHistory: false, workspaceName })
|
|
793
|
+
);
|
|
794
|
+
} else if (clearHistory) {
|
|
795
|
+
clearUndoHistory();
|
|
724
796
|
}
|
|
725
797
|
console.log("[SceneSerializer] Canvas reset");
|
|
726
798
|
if (typeof window.__collabSceneChanged === "function") {
|
|
@@ -779,7 +851,9 @@ function initSceneSerializer() {
|
|
|
779
851
|
export {
|
|
780
852
|
copyAsPNG,
|
|
781
853
|
copyAsSVG,
|
|
854
|
+
decodeSceneFile,
|
|
782
855
|
downloadScene,
|
|
856
|
+
encodeSceneFile,
|
|
783
857
|
exportAsPDF,
|
|
784
858
|
exportAsPNG,
|
|
785
859
|
findTextOnCanvas,
|
|
@@ -792,4 +866,4 @@ export {
|
|
|
792
866
|
uploadScene,
|
|
793
867
|
validateScene
|
|
794
868
|
};
|
|
795
|
-
//# sourceMappingURL=SceneSerializer-
|
|
869
|
+
//# sourceMappingURL=SceneSerializer-JEYTYXZQ.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/SceneSerializer.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\n/**\n * SceneSerializer - Save and load .lixsketch scene files\n *\n * Format: JSON with metadata + serialized shapes array\n * File extension: .lixsketch (actually JSON)\n */\n\nimport { Rectangle } from '../shapes/Rectangle.js';\nimport { Circle } from '../shapes/Circle.js';\nimport { Line } from '../shapes/Line.js';\nimport { Arrow } from '../shapes/Arrow.js';\nimport { FreehandStroke } from '../shapes/FreehandStroke.js';\nimport { Frame } from '../shapes/Frame.js';\nimport { normalizeWebEmbedUrl } from './WebEmbedPolicy.js';\nimport { TextShape } from '../shapes/TextShape.js';\nimport { CodeShape } from '../shapes/CodeShape.js';\nimport { ImageShape } from '../shapes/ImageShape.js';\nimport { IconShape } from '../shapes/IconShape.js';\nimport { clearUndoHistory, pushCanvasResetAction } from './UndoRedo.js';\n\nconst FORMAT_VERSION = 1;\nconst GZIP_MAGIC = [0x1f, 0x8b];\nconst SUPPORTED_SHAPE_TYPES = new Set([\n 'rectangle', 'circle', 'line', 'arrow', 'freehandStroke',\n 'frame', 'text', 'code', 'image', 'icon',\n]);\n\n// Generate a unique session ID for each scene\nlet _sessionID = null;\nexport function getSessionID() {\n if (!_sessionID) {\n _sessionID = `lx-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n return _sessionID;\n}\nexport function resetSessionID() {\n _sessionID = null;\n}\n\nfunction cloneOptions(options) {\n return JSON.parse(JSON.stringify(options));\n}\n\nfunction restoreDocBlockLinks(shape, data) {\n const ids = [...new Set((Array.isArray(data.docBlockIds)\n ? data.docBlockIds\n : (data.docBlockId ? [data.docBlockId] : [])).filter(Boolean))];\n shape.docBlockIds = ids;\n delete shape.docBlockId;\n if (ids.length) {\n (shape.group || shape.element)?.setAttribute('data-doc-block-ids', JSON.stringify(ids));\n }\n}\n\n// ============================================================\n// SERIALIZE a single shape to plain data\n// ============================================================\nfunction serializeShape(shape) {\n const base = {\n shapeID: shape.shapeID,\n // Optional many-to-many connections to BlockNote document blocks.\n // Stored with the encrypted scene so navigation survives restore.\n docBlockIds: [...new Set((Array.isArray(shape.docBlockIds)\n ? shape.docBlockIds\n : (shape.docBlockId ? [shape.docBlockId] : [])).filter(Boolean))],\n parentFrame: shape.parentFrame ? shape.parentFrame.shapeID : null,\n // Group membership \u2014 null when the shape isn't part of a group.\n // All shapes sharing a non-null groupId move/resize/rotate as a\n // unit (see Selection.handleMultiSelectionMouseDown).\n groupId: shape.groupId || null,\n };\n\n switch (shape.shapeName) {\n case 'rectangle':\n return {\n ...base,\n type: 'rectangle',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'circle':\n return {\n ...base,\n type: 'circle',\n x: shape.x, y: shape.y,\n rx: shape.rx, ry: shape.ry,\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'line':\n return {\n ...base,\n type: 'line',\n startPoint: { x: shape.startPoint.x, y: shape.startPoint.y },\n endPoint: { x: shape.endPoint.x, y: shape.endPoint.y },\n controlPoint: shape.controlPoint ? { x: shape.controlPoint.x, y: shape.controlPoint.y } : null,\n isCurved: shape.isCurved || false,\n options: cloneOptions(shape.options),\n };\n\n case 'arrow': {\n const data = {\n ...base,\n type: 'arrow',\n startPoint: { x: shape.startPoint.x, y: shape.startPoint.y },\n endPoint: { x: shape.endPoint.x, y: shape.endPoint.y },\n options: cloneOptions(shape.options),\n arrowOutlineStyle: shape.arrowOutlineStyle,\n arrowHeadStyle: shape.arrowHeadStyle,\n arrowCurved: shape.arrowCurved,\n arrowCurveAmount: shape.arrowCurveAmount,\n };\n if (shape.controlPoint1) data.controlPoint1 = { x: shape.controlPoint1.x, y: shape.controlPoint1.y };\n if (shape.controlPoint2) data.controlPoint2 = { x: shape.controlPoint2.x, y: shape.controlPoint2.y };\n // Serialize attachments by shapeID\n if (shape.startAttachment) data.startAttachmentID = shape.startAttachment.shapeID;\n if (shape.endAttachment) data.endAttachmentID = shape.endAttachment.shapeID;\n return data;\n }\n\n case 'freehandStroke':\n return {\n ...base,\n type: 'freehandStroke',\n points: JSON.parse(JSON.stringify(shape.points)),\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'frame':\n return {\n ...base,\n type: 'frame',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n frameName: shape.frameName,\n fillStyle: shape.fillStyle || 'transparent',\n fillColor: shape.fillColor || '#1e1e28',\n gridSize: shape.gridSize || 20,\n gridColor: shape.gridColor || 'rgba(255,255,255,0.06)',\n frameType: shape._frameType || null,\n webEmbedURL: shape._frameType === 'web-embed' ? shape._webEmbedURL : null,\n options: cloneOptions(shape.options),\n // Issue #24 bug #10: filter out null / undefined / shapeID-less\n // children. A stale reference would serialize as `null` and the\n // load path would skip it (logging a misleading \"missing shape\"\n // warning) \u2014 but also previously skewed the order tracking.\n containedShapeIDs: shape.containedShapes\n ? Array.from(shape.containedShapes)\n .filter(s => s && s.shapeID)\n .map(s => s.shapeID)\n : [],\n };\n\n case 'text': {\n const group = shape.group;\n return {\n ...base,\n type: 'text',\n x: shape.x, y: shape.y,\n rotation: shape.rotation,\n groupHTML: group.cloneNode(true).outerHTML,\n };\n }\n\n case 'code': {\n const group = shape.group;\n return {\n ...base,\n type: 'code',\n x: shape.x, y: shape.y,\n rotation: shape.rotation,\n groupHTML: group.cloneNode(true).outerHTML,\n };\n }\n\n case 'image': {\n const el = shape.element;\n return {\n ...base,\n type: 'image',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n href: el.getAttribute('href') || el.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || '',\n sizeBytes: Number(el.__fileSize || el.getAttribute('data-file-size')) || 0,\n cloudinaryId: el.getAttribute('data-cloudinary-id') || null,\n storageProvider: el.getAttribute('data-storage-provider') || 'platform_cloudinary',\n storageCloudName: el.getAttribute('data-storage-cloud-name') || null,\n aiGenerated: el.getAttribute('data-ai-generated') === 'true',\n aiModel: el.getAttribute('data-ai-model') || null,\n frameType: shape._frameType || null,\n graphData: shape._frameType === 'graph' && shape._graphData\n ? cloneOptions(shape._graphData)\n : null,\n };\n }\n\n case 'icon': {\n const el = shape.element;\n return {\n ...base,\n type: 'icon',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n elementHTML: el.cloneNode(true).outerHTML,\n viewboxWidth: parseFloat(el.getAttribute('data-viewbox-width')) || 24,\n viewboxHeight: parseFloat(el.getAttribute('data-viewbox-height')) || 24,\n };\n }\n\n default:\n console.warn('[SceneSerializer] Unknown shape type:', shape.shapeName);\n return null;\n }\n}\n\n// ============================================================\n// DESERIALIZE: Create a shape from saved data\n// ============================================================\nfunction deserializeShape(data) {\n const svgEl = window.svg;\n if (!svgEl) return null;\n const ns = 'http://www.w3.org/2000/svg';\n\n switch (data.type) {\n case 'rectangle': {\n const shape = new Rectangle(data.x, data.y, data.width, data.height, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'circle': {\n const shape = new Circle(data.x, data.y, data.rx, data.ry, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'line': {\n const shape = new Line(data.startPoint, data.endPoint, data.options || {});\n if (data.controlPoint) shape.controlPoint = data.controlPoint;\n if (data.isCurved) shape.isCurved = data.isCurved;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'arrow': {\n const shape = new Arrow(data.startPoint, data.endPoint, data.options || {});\n if (data.controlPoint1) shape.controlPoint1 = data.controlPoint1;\n if (data.controlPoint2) shape.controlPoint2 = data.controlPoint2;\n if (data.arrowOutlineStyle) shape.arrowOutlineStyle = data.arrowOutlineStyle;\n if (data.arrowHeadStyle) shape.arrowHeadStyle = data.arrowHeadStyle;\n if (data.arrowCurved) shape.arrowCurved = data.arrowCurved;\n if (data.arrowCurveAmount) shape.arrowCurveAmount = data.arrowCurveAmount;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'freehandStroke': {\n const shape = new FreehandStroke(data.points, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'frame': {\n const frameOpts = { ...(data.options || {}), frameName: data.frameName || 'Frame' };\n if (data.fillStyle) frameOpts.fillStyle = data.fillStyle;\n if (data.fillColor) frameOpts.fillColor = data.fillColor;\n if (data.gridSize) frameOpts.gridSize = data.gridSize;\n if (data.gridColor) frameOpts.gridColor = data.gridColor;\n const embedURL = data.frameType === 'web-embed' ? normalizeWebEmbedUrl(data.webEmbedURL) : null;\n if (embedURL) { frameOpts.frameType = 'web-embed'; frameOpts.webEmbedURL = embedURL; }\n const shape = new Frame(data.x, data.y, data.width, data.height, frameOpts);\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n shape.draw();\n return shape;\n }\n\n case 'text': {\n if (!data.groupHTML) return null;\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.groupHTML}</svg>`, 'image/svg+xml');\n const group = doc.querySelector('g');\n if (!group) return null;\n const imported = svgEl.ownerDocument.importNode(group, true);\n svgEl.appendChild(imported);\n const shape = new TextShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'code': {\n if (!data.groupHTML) return null;\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.groupHTML}</svg>`, 'image/svg+xml');\n const group = doc.querySelector('g');\n if (!group) return null;\n const imported = svgEl.ownerDocument.importNode(group, true);\n svgEl.appendChild(imported);\n const shape = new CodeShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'image': {\n const imgEl = document.createElementNS(ns, 'image');\n imgEl.setAttribute('x', data.x);\n imgEl.setAttribute('y', data.y);\n imgEl.setAttribute('width', data.width);\n imgEl.setAttribute('height', data.height);\n imgEl.setAttribute('href', data.href);\n imgEl.setAttribute('preserveAspectRatio', 'none');\n if (data.sizeBytes) {\n imgEl.__fileSize = Number(data.sizeBytes) || 0;\n imgEl.setAttribute('data-file-size', String(imgEl.__fileSize));\n window.__roomImageBytesUsed = (window.__roomImageBytesUsed || 0) + imgEl.__fileSize;\n }\n if (data.cloudinaryId) imgEl.setAttribute('data-cloudinary-id', data.cloudinaryId);\n if (data.storageProvider) imgEl.setAttribute('data-storage-provider', data.storageProvider);\n if (data.storageCloudName) imgEl.setAttribute('data-storage-cloud-name', data.storageCloudName);\n if (data.aiGenerated) imgEl.setAttribute('data-ai-generated', 'true');\n if (data.aiModel) imgEl.setAttribute('data-ai-model', data.aiModel);\n svgEl.appendChild(imgEl);\n const shape = new ImageShape(imgEl);\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n if (data.frameType === 'graph' && data.graphData) {\n if (typeof window.__hydrateGraphShape === 'function') {\n window.__hydrateGraphShape(shape, data.graphData);\n } else {\n shape._frameType = 'graph';\n shape._graphData = cloneOptions(data.graphData);\n shape.element.setAttribute('data-graph-shape', 'true');\n }\n }\n return shape;\n }\n\n case 'icon': {\n if (!data.elementHTML) return null;\n const parser = new DOMParser();\n // Wrap in <svg> so the parser treats the <g> as a valid child, not a document root\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.elementHTML}</svg>`, 'image/svg+xml');\n const iconGroup = doc.querySelector('g');\n if (!iconGroup) return null;\n const imported = svgEl.ownerDocument.importNode(iconGroup, true);\n svgEl.appendChild(imported);\n const shape = new IconShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n default:\n console.warn('[SceneSerializer] Unknown type:', data.type);\n return null;\n }\n}\n\n// ============================================================\n// SAVE: Serialize entire scene to .lixsketch JSON\n// ============================================================\nexport function saveScene(workspaceName = 'Untitled') {\n const allShapes = window.shapes || [];\n const serialized = [];\n\n // Issue #24 bug #10: rebuild containment from each shape's own\n // `parentFrame` ref before serialising. The `containedShapes` array\n // on the frame side drifts over time (eraser, partial deletes, drag\n // out + drag back, etc.), and a missing entry there means the child\n // gets serialised as a top-level shape and the frame restores empty.\n // Each shape knows its own parent, so we trust THAT and override the\n // frame's array at save time.\n const childrenByFrame = new Map();\n for (const s of allShapes) {\n if (s && s.parentFrame && s.shapeID && s !== s.parentFrame) {\n const arr = childrenByFrame.get(s.parentFrame.shapeID) || [];\n arr.push(s.shapeID);\n childrenByFrame.set(s.parentFrame.shapeID, arr);\n }\n }\n\n for (const shape of allShapes) {\n const data = serializeShape(shape);\n if (!data) continue;\n if (data.type === 'frame' && shape.shapeID && childrenByFrame.has(shape.shapeID)) {\n const merged = new Set(data.containedShapeIDs || []);\n for (const id of childrenByFrame.get(shape.shapeID)) merged.add(id);\n data.containedShapeIDs = Array.from(merged);\n }\n serialized.push(data);\n }\n\n const scene = {\n format: 'lixsketch',\n version: FORMAT_VERSION,\n sessionID: getSessionID(),\n name: workspaceName,\n createdAt: new Date().toISOString(),\n viewport: window.currentViewBox ? { ...window.currentViewBox } : null,\n zoom: window.currentZoom || 1,\n shapes: serialized,\n };\n\n return scene;\n}\n\n// ============================================================\n// LOAD: Deserialize .lixsketch JSON and recreate scene\n// ============================================================\nexport function loadScene(sceneData) {\n const validation = validateScene(sceneData);\n if (!validation.valid) {\n console.error('[SceneSerializer] Invalid scene:', validation.error);\n return false;\n }\n\n // Clear current scene\n const svgEl = window.svg;\n if (!svgEl) return false;\n window.__roomImageBytesUsed = 0;\n\n // Remove all existing shape DOM elements\n const existingShapes = window.shapes || [];\n existingShapes.forEach(shape => {\n // For frames, clean up clipGroup and clipPath too\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n });\n\n // Clear arrays IN PLACE \u2014 tool modules hold direct references to these\n // arrays from import-time, so replacing them breaks interactivity.\n if (window.shapes) window.shapes.length = 0; else window.shapes = [];\n window.currentShape = null;\n if (window.historyStack) window.historyStack.length = 0; else window.historyStack = [];\n if (window.redoStack) window.redoStack.length = 0; else window.redoStack = [];\n\n // Build ID -> shape map for frame containment and arrow attachments\n const idMap = new Map();\n\n // First pass: create all shapes (frames first to allow containment)\n const frameData = sceneData.shapes.filter(s => s.type === 'frame');\n const otherData = sceneData.shapes.filter(s => s.type !== 'frame');\n\n // Create frames first\n for (const data of frameData) {\n const shape = deserializeShape(data);\n if (shape) {\n // Restore group membership if present.\n if (data.groupId) shape.groupId = data.groupId;\n restoreDocBlockLinks(shape, data);\n window.shapes.push(shape);\n if (data.shapeID) idMap.set(data.shapeID, shape);\n }\n }\n\n // Create all other shapes\n for (const data of otherData) {\n const shape = deserializeShape(data);\n if (shape) {\n if (data.groupId) shape.groupId = data.groupId;\n restoreDocBlockLinks(shape, data);\n window.shapes.push(shape);\n if (data.shapeID) idMap.set(data.shapeID, shape);\n }\n }\n\n // Second pass: restore frame containment\n for (const data of frameData) {\n const frame = idMap.get(data.shapeID);\n if (frame && data.containedShapeIDs && data.containedShapeIDs.length > 0) {\n for (const childID of data.containedShapeIDs) {\n const child = idMap.get(childID);\n if (!child) {\n console.warn(`[SceneSerializer] Frame \"${data.frameName}\" references missing shape: ${childID}`);\n continue;\n }\n try {\n if (typeof frame.addShapeToFrame === 'function') {\n frame.addShapeToFrame(child);\n } else {\n // Fallback: manually set containment\n frame.containedShapes.push(child);\n child.parentFrame = frame;\n }\n } catch (err) {\n console.warn(`[SceneSerializer] Failed to restore containment for ${childID} in frame ${data.shapeID}:`, err);\n // Fallback: at least set the reference\n if (!frame.containedShapes.includes(child)) {\n frame.containedShapes.push(child);\n }\n child.parentFrame = frame;\n }\n }\n }\n }\n\n // Third pass: restore arrow attachments\n for (const data of sceneData.shapes) {\n if (data.type === 'arrow') {\n const arrow = idMap.get(data.shapeID);\n if (!arrow) continue;\n if (data.startAttachmentID) {\n const target = idMap.get(data.startAttachmentID);\n if (target && arrow.setStartAttachment) arrow.setStartAttachment(target);\n }\n if (data.endAttachmentID) {\n const target = idMap.get(data.endAttachmentID);\n if (target && arrow.setEndAttachment) arrow.setEndAttachment(target);\n }\n }\n }\n\n // Shape-array order is the scene's z-order. Frames are constructed first\n // so their clip groups exist before children are attached, but that is an\n // implementation detail and must not change the saved stacking order.\n const restoredInSceneOrder = sceneData.shapes\n .map(data => data.shapeID && idMap.get(data.shapeID))\n .filter(Boolean);\n const restoredSet = new Set(restoredInSceneOrder);\n window.shapes.splice(\n 0,\n window.shapes.length,\n ...restoredInSceneOrder,\n ...window.shapes.filter(shape => !restoredSet.has(shape)),\n );\n\n // \u2500\u2500 Fourth pass: frame containment reconciliation (issue #24 bug #10) \u2500\u2500\n //\n // The pass above attaches each child via `frame.addShapeToFrame(child)`,\n // which is supposed to move the child's <g> into the frame's clipGroup.\n // In practice LixScript-rendered scenes were reloading with empty\n // frames \u2014 children present in the shapes array, frame box drawn, but\n // the children's <g> elements stranded at the svg root (so visually\n // they look orphaned). The cause varies (transient `isBeingMovedByFrame`\n // flag carried over from save time, ordering glitches when nested\n // frames are restored, etc.). Rather than chase the source, repair the\n // DOM state here from the authoritative `containedShapes` array.\n for (const data of frameData) {\n const frame = idMap.get(data.shapeID);\n if (!frame) continue;\n\n // Clear stale flags that suppress DOM mutation inside addShapeToFrame.\n delete frame.isBeingMovedByFrame;\n delete frame.isDraggedOutTemporarily;\n\n // Ensure the frame's own clipGroup is direct child of svg \u2014 sub-frames\n // that didn't get re-parented yet are handled in the next loop.\n if (frame.clipGroup && frame.clipGroup.parentNode !== svgEl) {\n svgEl.appendChild(frame.clipGroup);\n }\n\n for (const child of frame.containedShapes || []) {\n if (!child) continue;\n delete child.isBeingMovedByFrame;\n delete child.isDraggedOutTemporarily;\n\n const el = child.group || child.element;\n if (el && el.parentNode !== frame.clipGroup) {\n if (el.parentNode) el.parentNode.removeChild(el);\n frame.clipGroup.appendChild(el);\n }\n // Sub-frames also carry their own clipGroup \u2014 nest it.\n if (child.shapeName === 'frame' && child.clipGroup\n && child.clipGroup.parentNode !== frame.clipGroup) {\n if (child.clipGroup.parentNode) child.clipGroup.parentNode.removeChild(child.clipGroup);\n frame.clipGroup.appendChild(child.clipGroup);\n }\n // Authoritative parent ref \u2014 `addShapeToFrame` should already\n // have set this but the no-op early return when the child was\n // already in containedShapes skips it.\n child.parentFrame = frame;\n }\n\n // Force the clip rect + visual to match. Some saved frames came\n // through with a stale clipRect from before the resize that lost\n // the children visually.\n if (typeof frame.updateClipPath === 'function') frame.updateClipPath();\n if (typeof frame.draw === 'function') {\n try { frame.draw(); } catch (err) { console.warn('[SceneSerializer] frame redraw failed:', err); }\n }\n }\n\n // Restore viewport\n if (sceneData.viewport && svgEl) {\n const vb = sceneData.viewport;\n window.currentViewBox = { ...vb };\n svgEl.setAttribute('viewBox', `${vb.x} ${vb.y} ${vb.width} ${vb.height}`);\n }\n if (sceneData.zoom) {\n window.currentZoom = sceneData.zoom;\n }\n\n console.log(`[SceneSerializer] Loaded ${window.shapes.length} shapes from \"${sceneData.name}\"`);\n window.dispatchEvent(new CustomEvent('lix-doc-canvas-links-changed'));\n\n // Re-sync tool flags so shapes are interactable after restore\n if (window.__sketchEngine && typeof window.__sketchEngine.setActiveTool === 'function') {\n const store = window.__sketchStoreApi;\n const currentTool = store ? store.getState().activeTool : 'select';\n window.__sketchEngine.setActiveTool(currentTool);\n } else {\n // Fallback: ensure selection tool is active\n window.isSelectionToolActive = true;\n }\n\n return true;\n}\n\n// ============================================================\n// DOWNLOAD: Trigger browser download of an optimized .lixjson file\n// ============================================================\nfunction sceneFileTimestamp(date = new Date()) {\n const iso = date.toISOString();\n return `${iso.slice(0, 10).replace(/-/g, '')}-${iso.slice(11, 19).replace(/:/g, '')}`;\n}\n\nfunction safeWorkspaceFileName(workspaceName) {\n const safe = String(workspaceName || 'Untitled')\n .trim()\n .replace(/[^a-zA-Z0-9_-]+/g, '_')\n .replace(/^_+|_+$/g, '');\n return safe || 'Untitled';\n}\n\nexport async function encodeSceneFile(scene) {\n const json = JSON.stringify(scene);\n if (typeof CompressionStream === 'undefined') {\n return new Blob([json], { type: 'application/json' });\n }\n\n const compressed = new Blob([json])\n .stream()\n .pipeThrough(new CompressionStream('gzip'));\n const buffer = await new Response(compressed).arrayBuffer();\n return new Blob([buffer], { type: 'application/vnd.lixsketch.scene+gzip' });\n}\n\nexport async function decodeSceneFile(buffer) {\n const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);\n const isGzip = bytes[0] === GZIP_MAGIC[0] && bytes[1] === GZIP_MAGIC[1];\n if (!isGzip) return new TextDecoder().decode(bytes);\n if (typeof DecompressionStream === 'undefined') {\n throw new Error('This browser cannot open compressed .lixjson files.');\n }\n\n const decompressed = new Blob([bytes])\n .stream()\n .pipeThrough(new DecompressionStream('gzip'));\n return new Response(decompressed).text();\n}\n\nexport async function downloadScene(workspaceName = 'Untitled') {\n const scene = saveScene(workspaceName);\n const blob = await encodeSceneFile(scene);\n const url = URL.createObjectURL(blob);\n const fileName = `${safeWorkspaceFileName(workspaceName)}-${sceneFileTimestamp()}.lixjson`;\n\n const a = document.createElement('a');\n a.href = url;\n a.download = fileName;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n return { fileName, sizeBytes: blob.size, compressed: blob.type.includes('gzip') };\n}\n\n// ============================================================\n// UPLOAD: Open file picker and load .lixsketch file\n// ============================================================\n// Validate scene JSON structure before loading\nexport function validateScene(data) {\n if (!data || typeof data !== 'object') return { valid: false, error: 'Not a valid JSON object' };\n if (data.format !== 'lixsketch') return { valid: false, error: 'Not a LixSketch scene file (missing format field)' };\n if (!data.version || data.version > FORMAT_VERSION) return { valid: false, error: `Unsupported version: ${data.version}` };\n if (!Array.isArray(data.shapes)) return { valid: false, error: 'Invalid scene: missing shapes array' };\n for (let index = 0; index < data.shapes.length; index += 1) {\n const shape = data.shapes[index];\n if (!shape || typeof shape !== 'object' || Array.isArray(shape)) {\n return { valid: false, error: `Invalid shape at index ${index}` };\n }\n if (!SUPPORTED_SHAPE_TYPES.has(shape.type)) {\n return { valid: false, error: `Unsupported shape type at index ${index}: ${String(shape.type)}` };\n }\n }\n return {\n valid: true,\n name: data.name || 'Untitled',\n shapeCount: data.shapes.length,\n sessionID: data.sessionID || null,\n createdAt: data.createdAt || null,\n };\n}\n\nexport function uploadScene() {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.lixjson,.json';\n input.onchange = async (e) => {\n const file = e.target.files[0];\n if (!file) return resolve(false);\n\n try {\n const json = await decodeSceneFile(await file.arrayBuffer());\n const data = JSON.parse(json);\n const validation = validateScene(data);\n if (!validation.valid) {\n console.error('[SceneSerializer] Invalid file:', validation.error);\n resolve({ success: false, error: validation.error });\n return;\n }\n resetSessionID(); // New session for loaded scene\n const result = loadScene(data);\n resolve({ success: result, validation });\n } catch (err) {\n console.error('[SceneSerializer] Failed to parse file:', err);\n resolve({ success: false, error: err.message || 'Failed to parse .lixjson file' });\n }\n };\n input.click();\n });\n}\n\n// ============================================================\n// EXPORT as PNG\n// ============================================================\nexport function exportAsPNG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n // Remove selection UI elements\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const canvas = document.createElement('canvas');\n const vb = svgEl.viewBox.baseVal;\n canvas.width = vb.width * 2; // 2x for retina\n canvas.height = vb.height * 2;\n const ctx = canvas.getContext('2d');\n ctx.scale(2, 2);\n\n const img = new Image();\n const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n // Draw dark background\n ctx.fillStyle = '#121212';\n ctx.fillRect(0, 0, vb.width, vb.height);\n ctx.drawImage(img, 0, 0, vb.width, vb.height);\n URL.revokeObjectURL(url);\n\n canvas.toBlob(blob => {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = 'lixsketch-export.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 'image/png');\n };\n img.src = url;\n}\n\n// ============================================================\n// COPY to clipboard as PNG\n// ============================================================\nexport function copyAsPNG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const canvas = document.createElement('canvas');\n const vb = svgEl.viewBox.baseVal;\n canvas.width = vb.width * 2;\n canvas.height = vb.height * 2;\n const ctx = canvas.getContext('2d');\n ctx.scale(2, 2);\n\n const img = new Image();\n const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n ctx.fillStyle = '#121212';\n ctx.fillRect(0, 0, vb.width, vb.height);\n ctx.drawImage(img, 0, 0, vb.width, vb.height);\n URL.revokeObjectURL(url);\n\n canvas.toBlob(blob => {\n if (!blob) return;\n navigator.clipboard.write([\n new ClipboardItem({ 'image/png': blob })\n ]).catch(err => console.warn('[SceneSerializer] Clipboard write failed:', err));\n }, 'image/png');\n };\n img.src = url;\n}\n\n// ============================================================\n// COPY to clipboard as SVG\n// ============================================================\nexport function copyAsSVG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n navigator.clipboard.writeText(svgData)\n .catch(err => console.warn('[SceneSerializer] Clipboard write failed:', err));\n}\n\n// ============================================================\n// EXPORT as PDF (uses browser print)\n// ============================================================\nexport function exportAsPDF() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const printWindow = window.open('', '_blank');\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head><title>LixSketch Export</title>\n <style>\n body { margin: 0; background: #121212; display: flex; align-items: center; justify-content: center; min-height: 100vh; }\n svg { max-width: 100vw; max-height: 100vh; }\n @media print { body { background: white; } }\n </style>\n </head>\n <body>${svgData}</body>\n </html>\n `);\n printWindow.document.close();\n printWindow.focus();\n setTimeout(() => printWindow.print(), 500);\n}\n\n// ============================================================\n// RESET: Clear the entire canvas\n// ============================================================\nexport function resetCanvas({ undoable = true, clearStorage = true, clearHistory = true, workspaceName = 'Untitled' } = {}) {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n // Remove all shape DOM elements + frame clipGroups/clipPaths\n const existingShapes = window.shapes || [];\n const resetSnapshot = undoable && existingShapes.length > 0\n ? saveScene(workspaceName)\n : null;\n existingShapes.forEach(shape => {\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n });\n\n // Remove selection UI\n svgEl.querySelectorAll(\n '.selection-outline, .resize-anchor, .rotation-anchor, [data-selection]'\n ).forEach(el => el.remove());\n\n // Clear arrays IN PLACE (same reason as loadScene)\n if (window.shapes) window.shapes.length = 0; else window.shapes = [];\n window.currentShape = null;\n if (window.historyStack) window.historyStack.length = 0; else window.historyStack = [];\n if (window.redoStack) window.redoStack.length = 0; else window.redoStack = [];\n\n if (typeof window.clearAllSelections === 'function') {\n window.clearAllSelections();\n }\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n\n if (clearStorage) {\n // Clear auto-save (both legacy and session-scoped keys)\n try {\n localStorage.removeItem('lixsketch-autosave');\n localStorage.removeItem('lixsketch-autosave-meta');\n const sid = window.__sessionID;\n if (sid) {\n localStorage.removeItem(`lixsketch-autosave-${sid}`);\n localStorage.removeItem(`lixsketch-autosave-meta-${sid}`);\n }\n } catch (_) {}\n }\n\n if (resetSnapshot) {\n pushCanvasResetAction(\n resetSnapshot,\n (snapshot) => loadScene(snapshot),\n () => resetCanvas({ undoable: false, clearStorage: true, clearHistory: false, workspaceName }),\n );\n } else if (clearHistory) {\n clearUndoHistory();\n }\n\n console.log('[SceneSerializer] Canvas reset');\n if (typeof window.__collabSceneChanged === 'function') {\n window.__collabSceneChanged();\n }\n}\n\n// ============================================================\n// FIND: Search for text content on the canvas\n// ============================================================\nexport function findTextOnCanvas(query) {\n const allShapes = window.shapes || [];\n if (!query || query.trim() === '') return [];\n\n const lowerQuery = query.toLowerCase();\n const results = [];\n\n for (const shape of allShapes) {\n let textContent = '';\n\n if (shape.shapeName === 'text' || shape.shapeName === 'code') {\n const group = shape.group;\n if (group) {\n // Get all text content from SVG text/tspan elements\n const textEls = group.querySelectorAll('text, tspan');\n textEls.forEach(el => {\n if (el.textContent) textContent += el.textContent + ' ';\n });\n // Also check foreignObject content\n const foreignEls = group.querySelectorAll('foreignObject *');\n foreignEls.forEach(el => {\n if (el.textContent) textContent += el.textContent + ' ';\n });\n }\n } else if (shape.shapeName === 'frame') {\n textContent = shape.frameName || '';\n }\n\n textContent = textContent.trim();\n if (textContent && textContent.toLowerCase().includes(lowerQuery)) {\n results.push({\n shape,\n text: textContent,\n type: shape.shapeName,\n x: shape.x || 0,\n y: shape.y || 0,\n });\n }\n }\n\n return results;\n}\n\n// ============================================================\n// Initialize bridge for React components\n// ============================================================\nexport function initSceneSerializer() {\n window.__sceneSerializer = {\n save: saveScene,\n load: loadScene,\n download: downloadScene,\n upload: uploadScene,\n exportPNG: exportAsPNG,\n exportPDF: exportAsPDF,\n copyAsPNG,\n copyAsSVG,\n resetCanvas,\n findText: findTextOnCanvas,\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -14,10 +14,10 @@ import {
|
|
|
14
14
|
removeMultiSelectionControls,
|
|
15
15
|
removeMultiSelectionRect,
|
|
16
16
|
selectShapesInRect
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-6GPWSPJF.js";
|
|
18
18
|
import "./chunk-PAKA6HUX.js";
|
|
19
|
-
import "./chunk-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-DWEFPKDO.js";
|
|
20
|
+
import "./chunk-M7GAB24F.js";
|
|
21
21
|
export {
|
|
22
22
|
cancelActiveMultiSelectionDrag,
|
|
23
23
|
clearAllSelections,
|
|
@@ -34,4 +34,4 @@ export {
|
|
|
34
34
|
removeMultiSelectionRect,
|
|
35
35
|
selectShapesInRect
|
|
36
36
|
};
|
|
37
|
-
//# sourceMappingURL=Selection-
|
|
37
|
+
//# sourceMappingURL=Selection-23MOLHEI.js.map
|
|
@@ -165,16 +165,16 @@ var SketchEngine = class {
|
|
|
165
165
|
{ Frame },
|
|
166
166
|
{ FreehandStroke }
|
|
167
167
|
] = await Promise.all([
|
|
168
|
-
import("./Rectangle-
|
|
169
|
-
import("./Circle-
|
|
168
|
+
import("./Rectangle-4U4CD2ER.js"),
|
|
169
|
+
import("./Circle-HMM5PKJ2.js"),
|
|
170
170
|
import("./Arrow-EF7ALH2Y.js"),
|
|
171
|
-
import("./Line-
|
|
171
|
+
import("./Line-A6FE232Q.js"),
|
|
172
172
|
import("./TextShape-DY77FFI2.js"),
|
|
173
173
|
import("./CodeShape-TE74XP5V.js"),
|
|
174
|
-
import("./ImageShape-
|
|
175
|
-
import("./IconShape-
|
|
176
|
-
import("./Frame-
|
|
177
|
-
import("./FreehandStroke-
|
|
174
|
+
import("./ImageShape-33VCMSDP.js"),
|
|
175
|
+
import("./IconShape-NHJE4YBY.js"),
|
|
176
|
+
import("./Frame-QEUEYITT.js"),
|
|
177
|
+
import("./FreehandStroke-WXIJKD5I.js")
|
|
178
178
|
]);
|
|
179
179
|
window.Rectangle = Rectangle;
|
|
180
180
|
window.Circle = Circle;
|
|
@@ -210,16 +210,16 @@ var SketchEngine = class {
|
|
|
210
210
|
frameTool,
|
|
211
211
|
freehandTool
|
|
212
212
|
] = await Promise.all([
|
|
213
|
-
import("./rectangleTool-
|
|
214
|
-
import("./circleTool-
|
|
215
|
-
import("./arrowTool-
|
|
216
|
-
import("./lineTool-
|
|
217
|
-
import("./textTool-
|
|
218
|
-
import("./codeTool-
|
|
219
|
-
import("./imageTool-
|
|
220
|
-
import("./iconTool-
|
|
221
|
-
import("./frameTool-
|
|
222
|
-
import("./freehandTool-
|
|
213
|
+
import("./rectangleTool-YPD2SIIZ.js"),
|
|
214
|
+
import("./circleTool-2UODOBCV.js"),
|
|
215
|
+
import("./arrowTool-VH3PJPDM.js"),
|
|
216
|
+
import("./lineTool-CSAFD7PW.js"),
|
|
217
|
+
import("./textTool-VQHMWEFJ.js"),
|
|
218
|
+
import("./codeTool-F4RV7SAI.js"),
|
|
219
|
+
import("./imageTool-LDJ45AD7.js"),
|
|
220
|
+
import("./iconTool-KQQBLGR3.js"),
|
|
221
|
+
import("./frameTool-NTGA5BI6.js"),
|
|
222
|
+
import("./freehandTool-L55EUB5C.js")
|
|
223
223
|
]);
|
|
224
224
|
this._modules.tools = {
|
|
225
225
|
rectangleTool,
|
|
@@ -243,11 +243,11 @@ var SketchEngine = class {
|
|
|
243
243
|
resizeShapes,
|
|
244
244
|
resizeCode
|
|
245
245
|
] = await Promise.all([
|
|
246
|
-
import("./EventDispatcher-
|
|
247
|
-
import("./UndoRedo-
|
|
248
|
-
import("./Selection-
|
|
246
|
+
import("./EventDispatcher-M5B4EWHJ.js"),
|
|
247
|
+
import("./UndoRedo-QVNRI5OB.js"),
|
|
248
|
+
import("./Selection-23MOLHEI.js"),
|
|
249
249
|
import("./ZoomPan-RR7KUYZT.js"),
|
|
250
|
-
import("./CopyPaste-
|
|
250
|
+
import("./CopyPaste-P6G35CXO.js"),
|
|
251
251
|
import("./EraserTrail-PA6IQLQN.js"),
|
|
252
252
|
import("./ResizeShapes-LKEQTITP.js"),
|
|
253
253
|
import("./ResizeCode-WAMDTKSW.js")
|
|
@@ -266,7 +266,7 @@ var SketchEngine = class {
|
|
|
266
266
|
eventDispatcher.initEventDispatcher(this.svg);
|
|
267
267
|
}
|
|
268
268
|
window.__sketchInteractionReady = true;
|
|
269
|
-
const sceneSerializer = await import("./SceneSerializer-
|
|
269
|
+
const sceneSerializer = await import("./SceneSerializer-JEYTYXZQ.js");
|
|
270
270
|
if (sceneSerializer.initSceneSerializer) sceneSerializer.initSceneSerializer();
|
|
271
271
|
await Promise.all([
|
|
272
272
|
import("./eraserTool-2GS2LQCS.js"),
|
|
@@ -279,13 +279,13 @@ var SketchEngine = class {
|
|
|
279
279
|
if (selection.multiSelection) window.multiSelection = selection.multiSelection;
|
|
280
280
|
if (selection.clearAllSelections) window.clearAllSelections = selection.clearAllSelections;
|
|
281
281
|
if (copyPaste.initCopyPaste) copyPaste.initCopyPaste();
|
|
282
|
-
const aiRenderer = await import("./AIRenderer-
|
|
282
|
+
const aiRenderer = await import("./AIRenderer-R5M2CIDO.js");
|
|
283
283
|
if (aiRenderer.initAIRenderer) aiRenderer.initAIRenderer();
|
|
284
|
-
const graphEngine = await import("./GraphEngine-
|
|
284
|
+
const graphEngine = await import("./GraphEngine-XH3RPYO4.js");
|
|
285
285
|
if (graphEngine.initGraphEngine) graphEngine.initGraphEngine();
|
|
286
286
|
const layerOrder = await import("./LayerOrder-XCHF4MSS.js");
|
|
287
287
|
if (layerOrder.initLayerOrder) layerOrder.initLayerOrder();
|
|
288
|
-
const lixScript = await import("./LixScriptParser-
|
|
288
|
+
const lixScript = await import("./LixScriptParser-YS3ZOTGS.js");
|
|
289
289
|
if (lixScript.initLixScriptBridge) lixScript.initLixScriptBridge();
|
|
290
290
|
this.scene = window.__sceneSerializer || {
|
|
291
291
|
save: sceneSerializer.saveScene,
|
|
@@ -441,4 +441,4 @@ export {
|
|
|
441
441
|
SketchEngine,
|
|
442
442
|
SketchEngine_default as default
|
|
443
443
|
};
|
|
444
|
-
//# sourceMappingURL=SketchEngine-
|
|
444
|
+
//# sourceMappingURL=SketchEngine-OPJON7TD.js.map
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
|
+
clearUndoHistory,
|
|
3
4
|
getCurrentSelectedElement,
|
|
5
|
+
invalidateCanvasResetUndo,
|
|
6
|
+
pushCanvasResetAction,
|
|
4
7
|
pushCreateAction,
|
|
5
8
|
pushCreateActionWithAttachments,
|
|
6
9
|
pushDeleteAction,
|
|
@@ -12,9 +15,12 @@ import {
|
|
|
12
15
|
setTextReferences,
|
|
13
16
|
undo,
|
|
14
17
|
updateSelectedElement
|
|
15
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-M7GAB24F.js";
|
|
16
19
|
export {
|
|
20
|
+
clearUndoHistory,
|
|
17
21
|
getCurrentSelectedElement,
|
|
22
|
+
invalidateCanvasResetUndo,
|
|
23
|
+
pushCanvasResetAction,
|
|
18
24
|
pushCreateAction,
|
|
19
25
|
pushCreateActionWithAttachments,
|
|
20
26
|
pushDeleteAction,
|
|
@@ -27,4 +33,4 @@ export {
|
|
|
27
33
|
undo,
|
|
28
34
|
updateSelectedElement
|
|
29
35
|
};
|
|
30
|
-
//# sourceMappingURL=UndoRedo-
|
|
36
|
+
//# sourceMappingURL=UndoRedo-QVNRI5OB.js.map
|
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
handleMouseMove,
|
|
6
6
|
handleMouseUp,
|
|
7
7
|
updateAttachedArrows
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-DWEFPKDO.js";
|
|
9
|
+
import "./chunk-M7GAB24F.js";
|
|
10
10
|
export {
|
|
11
11
|
cleanupAttachments,
|
|
12
12
|
handleMouseDown as handleMouseDownArrow,
|
|
@@ -14,4 +14,4 @@ export {
|
|
|
14
14
|
handleMouseUp as handleMouseUpArrow,
|
|
15
15
|
updateAttachedArrows
|
|
16
16
|
};
|
|
17
|
-
//# sourceMappingURL=arrowTool-
|
|
17
|
+
//# sourceMappingURL=arrowTool-VH3PJPDM.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
pushDeleteAction,
|
|
5
5
|
pushFrameAttachmentAction,
|
|
6
6
|
pushTransformAction
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-M7GAB24F.js";
|
|
8
8
|
|
|
9
9
|
// src/tools/frameTool.js
|
|
10
10
|
var currentFrame = null;
|
|
@@ -241,4 +241,4 @@ export {
|
|
|
241
241
|
handleMouseMove,
|
|
242
242
|
handleMouseUp
|
|
243
243
|
};
|
|
244
|
-
//# sourceMappingURL=chunk-
|
|
244
|
+
//# sourceMappingURL=chunk-2DZHO67H.js.map
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
calculateSnap,
|
|
4
4
|
clearSnapGuides,
|
|
5
5
|
updateAttachedArrows
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-DWEFPKDO.js";
|
|
7
7
|
import {
|
|
8
8
|
pushCreateAction,
|
|
9
9
|
pushDeleteAction,
|
|
10
10
|
pushFrameAttachmentAction,
|
|
11
11
|
pushOptionsChangeAction,
|
|
12
12
|
pushTransformAction
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-M7GAB24F.js";
|
|
14
14
|
|
|
15
15
|
// src/tools/freehandTool.js
|
|
16
16
|
function getThemeStroke() {
|
|
@@ -561,4 +561,4 @@ export {
|
|
|
561
561
|
handleMouseMove,
|
|
562
562
|
handleMouseUp
|
|
563
563
|
};
|
|
564
|
-
//# sourceMappingURL=chunk-
|
|
564
|
+
//# sourceMappingURL=chunk-5NHJJJBZ.js.map
|