@elixpo/lixsketch 5.5.23 → 5.6.2
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/README.md +85 -6
- package/dist/mcp/index.js +585 -0
- package/dist/mcp/index.js.map +7 -0
- package/dist/mcp/node.js +184 -0
- package/dist/mcp/node.js.map +7 -0
- package/dist/mcp/stdio.js +723 -0
- package/dist/mcp/stdio.js.map +7 -0
- package/dist/react/{CopyPaste-5OWPTCQ5.js → CopyPaste-YUDZ6DHY.js} +7 -7
- package/dist/react/EventDispatcher-7LAK7GQ7.js +1097 -0
- package/dist/react/EventDispatcher-7LAK7GQ7.js.map +7 -0
- package/dist/react/Frame-7D2MXCFF.js +11 -0
- package/dist/react/IconShape-ZADX7Y33.js +10 -0
- package/dist/react/ImageShape-UJQN2HI7.js +10 -0
- package/dist/react/Line-APEULMHE.js +10 -0
- package/dist/react/{SceneSerializer-RDISX4X7.js → SceneSerializer-SG6SJN5X.js} +17 -7
- package/dist/react/SceneSerializer-SG6SJN5X.js.map +7 -0
- package/dist/react/{Selection-ZL3G6IAO.js → Selection-2TSH3J6P.js} +6 -4
- package/dist/react/{SketchEngine-OB6ZW3B6.js → SketchEngine-UD2XV2KT.js} +50 -23
- package/dist/react/{SketchEngine-OB6ZW3B6.js.map → SketchEngine-UD2XV2KT.js.map} +2 -2
- package/dist/react/{UndoRedo-NL7KLR5B.js → UndoRedo-IN4SXDG6.js} +2 -2
- package/dist/react/{ZoomPan-FAWA5OPS.js → ZoomPan-RR7KUYZT.js} +34 -1
- package/dist/react/{ZoomPan-FAWA5OPS.js.map → ZoomPan-RR7KUYZT.js.map} +2 -2
- package/dist/react/{arrowTool-CNVGM6RX.js → arrowTool-OYDWJGQK.js} +3 -3
- package/dist/react/{chunk-U3TB4KRS.js → chunk-6GPEWDRB.js} +19 -12
- package/dist/react/chunk-6GPEWDRB.js.map +7 -0
- package/dist/react/{chunk-4BLMNGTR.js → chunk-7CM5XQDN.js} +3 -3
- package/dist/react/{chunk-XFQECTTF.js → chunk-APTOPAOY.js} +3 -3
- package/dist/react/{chunk-EDSKEM6E.js → chunk-ASBC5G35.js} +47 -8
- package/dist/react/chunk-ASBC5G35.js.map +7 -0
- package/dist/react/{chunk-4TAS67SL.js → chunk-EOURRJ55.js} +2 -2
- package/dist/react/{chunk-ETAAQUUV.js → chunk-GQUZPON4.js} +4 -4
- package/dist/react/{chunk-KVAQPCUH.js → chunk-K5BG5MHY.js} +49 -5
- package/dist/react/chunk-K5BG5MHY.js.map +7 -0
- package/dist/react/{chunk-AH4PWNEB.js → chunk-K5RY4EV7.js} +23 -3
- package/dist/react/chunk-K5RY4EV7.js.map +7 -0
- package/dist/react/{chunk-GC3KTQDA.js → chunk-LJR7EVW2.js} +3 -3
- package/dist/react/{chunk-SZD7DKYJ.js → chunk-LSHZYN77.js} +2 -2
- package/dist/react/{chunk-HFQZYCHJ.js → chunk-M6TMN76K.js} +3 -3
- package/dist/react/{chunk-V2QTYSBK.js → chunk-OP56XPWF.js} +2 -2
- package/dist/react/chunk-QZI4UIE5.js +48 -0
- package/dist/react/chunk-QZI4UIE5.js.map +7 -0
- package/dist/react/{chunk-ILGAFR56.js → chunk-RGMDWLRJ.js} +3 -3
- package/dist/react/{chunk-OFGJJKPH.js → chunk-XFL4R5ZF.js} +3 -3
- package/dist/react/{chunk-GPIYXREE.js → chunk-XOWNCYE4.js} +3 -3
- package/dist/react/{chunk-YF3TK7SC.js → chunk-XYUFEIZR.js} +2 -2
- package/dist/react/{circleTool-KICNRQCI.js → circleTool-LDKGZALF.js} +4 -4
- package/dist/react/{codeTool-NCQ73R6M.js → codeTool-4YZO5W7J.js} +4 -4
- package/dist/react/{frameTool-Y6KB67DO.js → frameTool-MXNJEXQQ.js} +4 -4
- package/dist/react/{freehandTool-MMULHCQ7.js → freehandTool-26D3FOOX.js} +4 -4
- package/dist/react/{iconTool-LSW2DYGB.js → iconTool-46O5VEUX.js} +4 -4
- package/dist/react/{imageTool-2DSR32RX.js → imageTool-P2RWZRHO.js} +4 -4
- package/dist/react/index.js +848 -614
- package/dist/react/index.js.map +4 -4
- package/dist/react/{lineTool-N5I7IGT7.js → lineTool-ZMR27U5L.js} +4 -4
- package/dist/react/{rectangleTool-YUT7ZK2E.js → rectangleTool-EJKK6UTX.js} +4 -4
- package/dist/react/{textTool-JMTX7OVT.js → textTool-S4XXZHZH.js} +5 -5
- package/package.json +7 -1
- package/src/EngineShortcuts.js +22 -0
- package/src/SketchEngine.js +27 -0
- package/src/core/EventDispatcher.js +35 -4
- package/src/core/SceneSerializer.js +5 -0
- package/src/core/Selection.js +26 -0
- package/src/core/UndoRedo.js +20 -16
- package/src/core/WebEmbedPolicy.js +41 -0
- package/src/core/ZoomPan.js +36 -0
- package/src/index.js +4 -0
- package/src/mcp/fileStore.js +70 -0
- package/src/mcp/index.js +5 -0
- package/src/mcp/node.js +2 -0
- package/src/mcp/preview.js +39 -0
- package/src/mcp/scene.js +275 -0
- package/src/mcp/server.js +195 -0
- package/src/mcp/stdio.js +41 -0
- package/src/mcp/stdioTransport.js +46 -0
- package/src/mcp/store.js +23 -0
- package/src/mcp/templates.js +51 -0
- package/src/react/LixSketchCanvas.jsx +4 -0
- package/src/react/components/Toolbar.jsx +84 -7
- package/src/react/components/modals/CommandPalette.jsx +8 -0
- package/src/react/components/modals/WebEmbedModal.jsx +40 -0
- package/src/react/components/sidebars/PaintBucketSidebar.jsx +49 -0
- package/src/react/components/sidebars/PaintbrushSidebar.jsx +1 -1
- package/src/react/store/useSketchStore.js +13 -0
- package/src/react/toolsEnum.js +4 -0
- package/src/shapes/Frame.js +47 -4
- package/src/shapes/ImageShape.js +49 -6
- package/src/tools/lassoTool.js +84 -0
- package/src/tools/paintBucketTool.js +50 -0
- package/src/tools/shapeRecognitionTool.js +431 -0
- package/src/tools/webEmbedTool.js +61 -0
- package/dist/react/EventDispatcher-GKNO2KSL.js +0 -464
- package/dist/react/EventDispatcher-GKNO2KSL.js.map +0 -7
- package/dist/react/Frame-RLSMJJSK.js +0 -11
- package/dist/react/IconShape-7OPXAKLK.js +0 -10
- package/dist/react/ImageShape-T7UEHP4A.js +0 -10
- package/dist/react/Line-WWQFBNX5.js +0 -10
- package/dist/react/SceneSerializer-RDISX4X7.js.map +0 -7
- package/dist/react/chunk-AH4PWNEB.js.map +0 -7
- package/dist/react/chunk-EDSKEM6E.js.map +0 -7
- package/dist/react/chunk-KVAQPCUH.js.map +0 -7
- package/dist/react/chunk-U3TB4KRS.js.map +0 -7
- /package/dist/react/{CopyPaste-5OWPTCQ5.js.map → CopyPaste-YUDZ6DHY.js.map} +0 -0
- /package/dist/react/{Frame-RLSMJJSK.js.map → Frame-7D2MXCFF.js.map} +0 -0
- /package/dist/react/{IconShape-7OPXAKLK.js.map → IconShape-ZADX7Y33.js.map} +0 -0
- /package/dist/react/{ImageShape-T7UEHP4A.js.map → ImageShape-UJQN2HI7.js.map} +0 -0
- /package/dist/react/{Line-WWQFBNX5.js.map → Line-APEULMHE.js.map} +0 -0
- /package/dist/react/{Selection-ZL3G6IAO.js.map → Selection-2TSH3J6P.js.map} +0 -0
- /package/dist/react/{UndoRedo-NL7KLR5B.js.map → UndoRedo-IN4SXDG6.js.map} +0 -0
- /package/dist/react/{arrowTool-CNVGM6RX.js.map → arrowTool-OYDWJGQK.js.map} +0 -0
- /package/dist/react/{chunk-4BLMNGTR.js.map → chunk-7CM5XQDN.js.map} +0 -0
- /package/dist/react/{chunk-XFQECTTF.js.map → chunk-APTOPAOY.js.map} +0 -0
- /package/dist/react/{chunk-4TAS67SL.js.map → chunk-EOURRJ55.js.map} +0 -0
- /package/dist/react/{chunk-ETAAQUUV.js.map → chunk-GQUZPON4.js.map} +0 -0
- /package/dist/react/{chunk-GC3KTQDA.js.map → chunk-LJR7EVW2.js.map} +0 -0
- /package/dist/react/{chunk-SZD7DKYJ.js.map → chunk-LSHZYN77.js.map} +0 -0
- /package/dist/react/{chunk-HFQZYCHJ.js.map → chunk-M6TMN76K.js.map} +0 -0
- /package/dist/react/{chunk-V2QTYSBK.js.map → chunk-OP56XPWF.js.map} +0 -0
- /package/dist/react/{chunk-ILGAFR56.js.map → chunk-RGMDWLRJ.js.map} +0 -0
- /package/dist/react/{chunk-OFGJJKPH.js.map → chunk-XFL4R5ZF.js.map} +0 -0
- /package/dist/react/{chunk-GPIYXREE.js.map → chunk-XOWNCYE4.js.map} +0 -0
- /package/dist/react/{chunk-YF3TK7SC.js.map → chunk-XYUFEIZR.js.map} +0 -0
- /package/dist/react/{circleTool-KICNRQCI.js.map → circleTool-LDKGZALF.js.map} +0 -0
- /package/dist/react/{codeTool-NCQ73R6M.js.map → codeTool-4YZO5W7J.js.map} +0 -0
- /package/dist/react/{frameTool-Y6KB67DO.js.map → frameTool-MXNJEXQQ.js.map} +0 -0
- /package/dist/react/{freehandTool-MMULHCQ7.js.map → freehandTool-26D3FOOX.js.map} +0 -0
- /package/dist/react/{iconTool-LSW2DYGB.js.map → iconTool-46O5VEUX.js.map} +0 -0
- /package/dist/react/{imageTool-2DSR32RX.js.map → imageTool-P2RWZRHO.js.map} +0 -0
- /package/dist/react/{lineTool-N5I7IGT7.js.map → lineTool-ZMR27U5L.js.map} +0 -0
- /package/dist/react/{rectangleTool-YUT7ZK2E.js.map → rectangleTool-EJKK6UTX.js.map} +0 -0
- /package/dist/react/{textTool-JMTX7OVT.js.map → textTool-S4XXZHZH.js.map} +0 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/tools/shapeRecognitionTool.js", "../../src/tools/paintBucketTool.js", "../../src/tools/lassoTool.js", "../../src/tools/webEmbedTool.js", "../../src/core/EventDispatcher.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\nimport { pushCreateAction, pushFrameAttachmentAction } from '../core/UndoRedo.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst MAX_POINTS = 96;\nconst MIN_SCREEN_SAMPLE_PX = 4;\nconst MIN_SHAPE_SIZE = 8;\n\nlet drawing = false;\nlet points = [];\nlet previewPath = null;\nlet previewFrame = 0;\nlet latestPrediction = null;\n\nfunction getThemeStroke() {\n return document.body?.classList.contains('theme-dark') ? '#f7f4ff' : '#211a33';\n}\n\nfunction getSVGPoint(event) {\n const viewBox = svg.viewBox.baseVal;\n const rect = svg.getBoundingClientRect();\n return {\n x: viewBox.x + ((event.clientX - rect.left) / rect.width) * viewBox.width,\n y: viewBox.y + ((event.clientY - rect.top) / rect.height) * viewBox.height,\n pressure: event.pressure || 0.5,\n };\n}\n\nfunction distance(a, b) {\n return Math.hypot(b.x - a.x, b.y - a.y);\n}\n\nfunction orientedBounds(sample, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n let minU = Infinity;\n let maxU = -Infinity;\n let minV = Infinity;\n let maxV = -Infinity;\n for (const point of sample) {\n const u = point.x * cos + point.y * sin;\n const v = -point.x * sin + point.y * cos;\n minU = Math.min(minU, u);\n maxU = Math.max(maxU, u);\n minV = Math.min(minV, v);\n maxV = Math.max(maxV, v);\n }\n const centerU = (minU + maxU) / 2;\n const centerV = (minV + maxV) / 2;\n return {\n center: {\n x: centerU * cos - centerV * sin,\n y: centerU * sin + centerV * cos,\n },\n width: Math.max(MIN_SHAPE_SIZE, maxU - minU),\n height: Math.max(MIN_SHAPE_SIZE, maxV - minV),\n angle,\n minU,\n maxU,\n minV,\n maxV,\n };\n}\n\nfunction principalAngle(sample) {\n let meanX = 0;\n let meanY = 0;\n for (const point of sample) {\n meanX += point.x;\n meanY += point.y;\n }\n meanX /= sample.length;\n meanY /= sample.length;\n let xx = 0;\n let yy = 0;\n let xy = 0;\n for (const point of sample) {\n const dx = point.x - meanX;\n const dy = point.y - meanY;\n xx += dx * dx;\n yy += dy * dy;\n xy += dx * dy;\n }\n if (Math.abs(xx - yy) + Math.abs(xy) < 0.001) return 0;\n return Math.atan2(2 * xy, xx - yy) / 2;\n}\n\nfunction rectangleAngle(sample) {\n let x = 0;\n let y = 0;\n for (let index = 1; index < sample.length; index += 1) {\n const dx = sample[index].x - sample[index - 1].x;\n const dy = sample[index].y - sample[index - 1].y;\n const length = Math.hypot(dx, dy);\n if (length === 0) continue;\n const angle = Math.atan2(dy, dx) * 4;\n x += Math.cos(angle) * length;\n y += Math.sin(angle) * length;\n }\n return Math.atan2(y, x) / 4;\n}\n\nfunction closedShapePrediction(sample, pathLength) {\n const rectBounds = orientedBounds(sample, rectangleAngle(sample));\n const ellipseBounds = orientedBounds(sample, principalAngle(sample));\n let rectangleError = 0;\n let ellipseError = 0;\n\n const rectCos = Math.cos(rectBounds.angle);\n const rectSin = Math.sin(rectBounds.angle);\n const ellipseCos = Math.cos(ellipseBounds.angle);\n const ellipseSin = Math.sin(ellipseBounds.angle);\n const rectHalfW = rectBounds.width / 2;\n const rectHalfH = rectBounds.height / 2;\n const ellipseHalfW = ellipseBounds.width / 2;\n const ellipseHalfH = ellipseBounds.height / 2;\n\n for (const point of sample) {\n const rectDx = point.x - rectBounds.center.x;\n const rectDy = point.y - rectBounds.center.y;\n const rectU = Math.abs(rectDx * rectCos + rectDy * rectSin) / rectHalfW;\n const rectV = Math.abs(-rectDx * rectSin + rectDy * rectCos) / rectHalfH;\n rectangleError += Math.min(Math.abs(1 - rectU), Math.abs(1 - rectV));\n\n const ellipseDx = point.x - ellipseBounds.center.x;\n const ellipseDy = point.y - ellipseBounds.center.y;\n const ellipseU = (ellipseDx * ellipseCos + ellipseDy * ellipseSin) / ellipseHalfW;\n const ellipseV = (-ellipseDx * ellipseSin + ellipseDy * ellipseCos) / ellipseHalfH;\n ellipseError += Math.abs(1 - Math.hypot(ellipseU, ellipseV));\n }\n\n rectangleError /= sample.length;\n ellipseError /= sample.length;\n const rectangle = rectangleError <= ellipseError * 1.08;\n const bestError = rectangle ? rectangleError : ellipseError;\n if (bestError > 0.24) {\n return { type: 'freehand', points: sample.map((point) => ({ ...point })), pathLength };\n }\n const bounds = rectangle ? rectBounds : ellipseBounds;\n return {\n type: rectangle ? 'rectangle' : 'circle',\n ...bounds,\n pathLength,\n };\n}\n\nexport function predictDrawnShape(sample) {\n if (!Array.isArray(sample) || sample.length < 2) return null;\n const start = sample[0];\n let pathLength = 0;\n let farthestIndex = 1;\n let farthestDistance = 0;\n let minX = start.x;\n let maxX = start.x;\n let minY = start.y;\n let maxY = start.y;\n\n for (let index = 1; index < sample.length; index += 1) {\n pathLength += distance(sample[index - 1], sample[index]);\n const fromStart = distance(start, sample[index]);\n if (fromStart > farthestDistance) {\n farthestDistance = fromStart;\n farthestIndex = index;\n }\n minX = Math.min(minX, sample[index].x);\n maxX = Math.max(maxX, sample[index].x);\n minY = Math.min(minY, sample[index].y);\n maxY = Math.max(maxY, sample[index].y);\n }\n\n const diagonal = Math.max(MIN_SHAPE_SIZE, Math.hypot(maxX - minX, maxY - minY));\n const end = sample[sample.length - 1];\n const closed = sample.length >= 8 && distance(start, end) <= diagonal * 0.28 && pathLength >= diagonal * 2.05;\n if (closed) return closedShapePrediction(sample, pathLength);\n\n const tip = sample[farthestIndex];\n let afterTipLength = 0;\n for (let index = farthestIndex + 1; index < sample.length; index += 1) {\n afterTipLength += distance(sample[index - 1], sample[index]);\n }\n let shaftLength = 0;\n for (let index = 1; index <= farthestIndex; index += 1) {\n shaftLength += distance(sample[index - 1], sample[index]);\n }\n const arrow = farthestIndex >= Math.floor(sample.length * 0.45)\n && farthestIndex < sample.length - 2\n && afterTipLength >= diagonal * 0.18\n && distance(end, tip) <= diagonal * 0.48\n && farthestDistance / Math.max(shaftLength, 1) >= 0.86;\n\n const directDistance = distance(start, end);\n const line = !arrow && directDistance / Math.max(pathLength, 1) >= 0.92;\n\n if (!arrow && !line) {\n return { type: 'freehand', points: sample.map((point) => ({ ...point })), pathLength };\n }\n\n return {\n type: arrow ? 'arrow' : 'line',\n start: { ...start },\n end: arrow ? { ...tip } : { ...end },\n width: Math.max(MIN_SHAPE_SIZE, maxX - minX),\n height: Math.max(MIN_SHAPE_SIZE, maxY - minY),\n pathLength,\n };\n}\n\nfunction rotatedPoint(center, x, y, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return { x: center.x + x * cos - y * sin, y: center.y + x * sin + y * cos };\n}\n\nfunction pathForPrediction(prediction) {\n if (!prediction) return '';\n if (prediction.type === 'rectangle') {\n const halfW = prediction.width / 2;\n const halfH = prediction.height / 2;\n const corners = [\n rotatedPoint(prediction.center, -halfW, -halfH, prediction.angle),\n rotatedPoint(prediction.center, halfW, -halfH, prediction.angle),\n rotatedPoint(prediction.center, halfW, halfH, prediction.angle),\n rotatedPoint(prediction.center, -halfW, halfH, prediction.angle),\n ];\n return `M ${corners[0].x} ${corners[0].y} L ${corners[1].x} ${corners[1].y} L ${corners[2].x} ${corners[2].y} L ${corners[3].x} ${corners[3].y} Z`;\n }\n if (prediction.type === 'circle') {\n const rx = prediction.width / 2;\n const ry = prediction.height / 2;\n const start = rotatedPoint(prediction.center, rx, 0, prediction.angle);\n const opposite = rotatedPoint(prediction.center, -rx, 0, prediction.angle);\n const rotation = prediction.angle * 180 / Math.PI;\n return `M ${start.x} ${start.y} A ${rx} ${ry} ${rotation} 1 0 ${opposite.x} ${opposite.y} A ${rx} ${ry} ${rotation} 1 0 ${start.x} ${start.y}`;\n }\n if (prediction.type === 'freehand') {\n if (!prediction.points.length) return '';\n return prediction.points.reduce((path, point, index) => `${path}${index === 0 ? 'M' : ' L'} ${point.x} ${point.y}`, '');\n }\n const { start, end } = prediction;\n let path = `M ${start.x} ${start.y} L ${end.x} ${end.y}`;\n if (prediction.type === 'arrow') {\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n const head = Math.min(24 / (window.currentZoom || 1), distance(start, end) * 0.25);\n const left = rotatedPoint(end, -head, head * 0.55, angle);\n const right = rotatedPoint(end, -head, -head * 0.55, angle);\n path += ` M ${left.x} ${left.y} L ${end.x} ${end.y} L ${right.x} ${right.y}`;\n }\n return path;\n}\n\nfunction ensurePreview() {\n if (previewPath?.isConnected) return;\n previewPath = document.createElementNS(SVG_NS, 'path');\n previewPath.dataset.recognitionPreview = 'true';\n previewPath.setAttribute('fill', 'rgba(148, 148, 158, 0.06)');\n previewPath.setAttribute('stroke', '#9696a0');\n previewPath.setAttribute('stroke-width', '2');\n previewPath.setAttribute('stroke-dasharray', '5 7');\n previewPath.setAttribute('stroke-linecap', 'round');\n previewPath.setAttribute('stroke-linejoin', 'round');\n previewPath.setAttribute('vector-effect', 'non-scaling-stroke');\n previewPath.setAttribute('pointer-events', 'none');\n svg.appendChild(previewPath);\n}\n\nfunction renderPreview() {\n previewFrame = 0;\n if (!drawing) return;\n latestPrediction = predictDrawnShape(points);\n ensurePreview();\n previewPath.setAttribute('d', pathForPrediction(latestPrediction));\n previewPath.setAttribute('fill', latestPrediction?.type === 'rectangle' || latestPrediction?.type === 'circle'\n ? 'rgba(148, 148, 158, 0.06)'\n : 'none');\n}\n\nfunction schedulePreview() {\n if (!previewFrame) previewFrame = requestAnimationFrame(renderPreview);\n}\n\nfunction cleanupPreview() {\n if (previewFrame) cancelAnimationFrame(previewFrame);\n previewFrame = 0;\n previewPath?.remove();\n previewPath = null;\n}\n\nfunction currentStyle() {\n const settings = window.freehandToolSettings || {};\n const outline = settings.strokeStyle || 'solid';\n return {\n stroke: settings.strokeColor || getThemeStroke(),\n fill: 'transparent',\n fillStyle: 'none',\n strokeWidth: settings.strokeWidth || 2,\n strokeDasharray: outline === 'dashed' ? '10,10' : (outline === 'dotted' ? '2,8' : ''),\n outline,\n };\n}\n\nfunction attachToContainingFrame(shape) {\n for (let index = shapes.length - 1; index >= 0; index -= 1) {\n const frame = shapes[index];\n if (frame.shapeName !== 'frame' || typeof frame.isShapeInFrame !== 'function') continue;\n if (!frame.isShapeInFrame(shape)) continue;\n frame.addShapeToFrame(shape);\n pushFrameAttachmentAction(frame, shape, 'attach', null);\n break;\n }\n}\n\nfunction createPredictedShape(prediction) {\n if (!prediction) return null;\n const style = currentStyle();\n let shape = null;\n if (prediction.type === 'rectangle') {\n shape = new window.Rectangle(\n prediction.center.x - prediction.width / 2,\n prediction.center.y - prediction.height / 2,\n prediction.width,\n prediction.height,\n style,\n );\n shape.rotation = prediction.angle * 180 / Math.PI;\n shape.draw();\n } else if (prediction.type === 'circle') {\n shape = new window.Circle(\n prediction.center.x,\n prediction.center.y,\n prediction.width / 2,\n prediction.height / 2,\n style,\n );\n shape.rotation = prediction.angle * 180 / Math.PI;\n shape.draw();\n } else if (prediction.type === 'freehand') {\n const brush = window.freehandToolSettings || {};\n shape = new window.FreehandStroke(\n prediction.points.map((point) => [point.x, point.y, point.pressure || 0.5]),\n {\n stroke: style.stroke,\n strokeWidth: style.strokeWidth,\n strokeStyle: style.outline,\n thinning: brush.thinning ?? 0.5,\n roughness: brush.roughness || 'smooth',\n strokeOpacity: brush.opacity ?? 1,\n },\n );\n } else if (prediction.type === 'arrow') {\n shape = new window.Arrow(prediction.start, prediction.end, {\n stroke: style.stroke,\n strokeWidth: style.strokeWidth,\n arrowOutlineStyle: style.outline,\n arrowCurved: 'straight',\n });\n } else {\n shape = new window.Line(prediction.start, prediction.end, {\n stroke: style.stroke,\n strokeWidth: style.strokeWidth,\n strokeDasharray: style.strokeDasharray,\n roughness: 1.5,\n bowing: 1,\n });\n }\n shapes.push(shape);\n pushCreateAction(shape);\n attachToContainingFrame(shape);\n return shape;\n}\n\nexport function handleShapeRecognitionDown(event) {\n if (!window.isShapeRecognitionToolActive || event.button !== 0) return;\n drawing = true;\n points = [getSVGPoint(event)];\n latestPrediction = null;\n ensurePreview();\n schedulePreview();\n}\n\nexport function handleShapeRecognitionMove(event) {\n if (!drawing || !window.isShapeRecognitionToolActive) return;\n const point = getSVGPoint(event);\n const last = points[points.length - 1];\n const threshold = MIN_SCREEN_SAMPLE_PX / (window.currentZoom || 1);\n if (distance(last, point) < threshold) return;\n if (points.length < MAX_POINTS) {\n points.push(point);\n } else {\n // Preserve the first point and evenly discard older detail. Memory and\n // recognition time stay constant even during very long gestures.\n points = [points[0], ...points.slice(2).filter((_, index) => index % 2 === 0), point];\n }\n schedulePreview();\n}\n\nexport function handleShapeRecognitionUp(event) {\n if (!drawing) return;\n drawing = false;\n const rect = svg.getBoundingClientRect();\n if (event.clientX >= rect.left && event.clientX <= rect.right && event.clientY >= rect.top && event.clientY <= rect.bottom) {\n const point = getSVGPoint(event);\n if (distance(points[points.length - 1], point) > 0) points.push(point);\n }\n latestPrediction = predictDrawnShape(points);\n cleanupPreview();\n\n const prediction = latestPrediction;\n points = [];\n latestPrediction = null;\n if (!prediction || prediction.pathLength < MIN_SHAPE_SIZE) return;\n\n const shape = createPredictedShape(prediction);\n if (!shape) return;\n if (window.__sketchStoreApi) window.__sketchStoreApi.setActiveTool('select', { afterDraw: true });\n currentShape = shape;\n if (shape.shapeName === 'freehandStroke' && typeof shape.selectStroke === 'function') {\n shape.selectStroke();\n } else {\n shape.isSelected = true;\n if (typeof shape.addAnchors === 'function') shape.addAnchors();\n }\n}\n\nexport function cancelShapeRecognition() {\n drawing = false;\n points = [];\n latestPrediction = null;\n cleanupPreview();\n}\n\nwindow.__cancelShapeRecognition = cancelShapeRecognition;\n", "/* eslint-disable */\nimport { pushOptionsChangeAction } from '../core/UndoRedo.js';\n\nconst CLOSED_SHAPES = new Set(['rectangle', 'circle']);\n\nwindow.paintBucketSettings = window.paintBucketSettings || {\n fillColor: '#A98DEB',\n fillStyle: 'solid',\n};\n\nfunction getSVGPoint(event) {\n const viewBox = svg.viewBox.baseVal;\n const rect = svg.getBoundingClientRect();\n return {\n x: viewBox.x + ((event.clientX - rect.left) / rect.width) * viewBox.width,\n y: viewBox.y + ((event.clientY - rect.top) / rect.height) * viewBox.height,\n };\n}\n\nfunction findClosedShapeAt(x, y) {\n for (let index = shapes.length - 1; index >= 0; index -= 1) {\n const shape = shapes[index];\n if (!CLOSED_SHAPES.has(shape?.shapeName) || typeof shape.contains !== 'function') continue;\n if (shape.contains(x, y)) return shape;\n }\n return null;\n}\n\nexport function handlePaintBucketDown(event) {\n if (!window.isPaintBucketToolActive || event.button !== 0) return;\n const { x, y } = getSVGPoint(event);\n const shape = findClosedShapeAt(x, y);\n if (!shape) {\n window.dispatchEvent(new CustomEvent('lixsketch:bucket-miss'));\n return;\n }\n\n const settings = window.paintBucketSettings;\n const transparent = settings.fillStyle === 'none' || settings.fillStyle === 'transparent';\n const nextFill = transparent ? 'transparent' : settings.fillColor;\n const nextStyle = transparent ? 'none' : settings.fillStyle;\n if (shape.options.fill === nextFill && shape.options.fillStyle === nextStyle) return;\n\n const oldOptions = { ...shape.options };\n const newOptions = { ...shape.options, fill: nextFill, fillStyle: nextStyle };\n pushOptionsChangeAction(shape, oldOptions, newOptions);\n shape.options = newOptions;\n shape.draw();\n window.dispatchEvent(new CustomEvent('lixsketch:bucket-filled', { detail: { shapeID: shape.shapeID } }));\n}\n", "/* eslint-disable */\n\nimport { multiSelection } from '../core/Selection.js';\n\nconst MAX_POINTS = 192;\nconst MIN_SAMPLE_PX = 4;\nlet points = [];\nlet preview = null;\nlet drawing = false;\n\nfunction coords(e) {\n const vb = svg.viewBox.baseVal;\n const rect = svg.getBoundingClientRect();\n return { x: vb.x + ((e.clientX - rect.left) / rect.width) * vb.width, y: vb.y + ((e.clientY - rect.top) / rect.height) * vb.height };\n}\n\nfunction pointInPolygon(point, polygon) {\n let inside = false;\n for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n const a = polygon[i], b = polygon[j];\n if (((a.y > point.y) !== (b.y > point.y)) && point.x < ((b.x - a.x) * (point.y - a.y)) / ((b.y - a.y) || Number.EPSILON) + a.x) inside = !inside;\n }\n return inside;\n}\n\nfunction boundsPoints(shape) {\n if ((shape.shapeName === 'line' || shape.shapeName === 'arrow') && shape.startPoint && shape.endPoint) return [shape.startPoint, shape.endPoint];\n if (shape.shapeName === 'freehandStroke' && Array.isArray(shape.points)) {\n const step = Math.max(1, Math.ceil(shape.points.length / 16));\n return shape.points.filter((_, i) => i % step === 0).map((p) => ({ x: p[0], y: p[1] }));\n }\n let x = shape.x || 0, y = shape.y || 0, width = shape.width || 0, height = shape.height || 0;\n if (shape.shapeName === 'circle') { x = shape.x - shape.rx; y = shape.y - shape.ry; width = shape.rx * 2; height = shape.ry * 2; }\n if ((!width || !height) && shape.group?.getBBox) {\n try { const box = shape.group.getBBox(); x = box.x; y = box.y; width = box.width; height = box.height; } catch {}\n }\n const raw = [{ x, y }, { x: x + width, y }, { x: x + width, y: y + height }, { x, y: y + height }, { x: x + width / 2, y: y + height / 2 }];\n const rotation = Number(shape.rotation) || 0;\n if (!rotation) return raw;\n const cx = x + width / 2, cy = y + height / 2, angle = rotation * Math.PI / 180;\n return raw.map((p) => ({ x: cx + (p.x - cx) * Math.cos(angle) - (p.y - cy) * Math.sin(angle), y: cy + (p.x - cx) * Math.sin(angle) + (p.y - cy) * Math.cos(angle) }));\n}\n\nfunction cleanup() {\n preview?.remove(); preview = null; points = []; drawing = false;\n}\n\nexport function handleLassoDown(e) {\n if (!window.isLassoToolActive) return;\n cleanup(); multiSelection.clearSelection(); drawing = true; points = [coords(e)];\n preview = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n preview.setAttribute('fill', 'rgba(139, 118, 214, .10)'); preview.setAttribute('stroke', '#a78bfa');\n preview.setAttribute('stroke-dasharray', '5 4'); preview.setAttribute('vector-effect', 'non-scaling-stroke');\n preview.style.pointerEvents = 'none'; svg.appendChild(preview);\n}\n\nexport function handleLassoMove(e) {\n if (!drawing) return;\n const p = coords(e), last = points[points.length - 1];\n const min = MIN_SAMPLE_PX / (window.currentZoom || 1);\n if (Math.hypot(p.x - last.x, p.y - last.y) < min) return;\n if (points.length < MAX_POINTS) points.push(p); else points[points.length - 1] = p;\n preview?.setAttribute('d', `M ${points.map((v) => `${v.x} ${v.y}`).join(' L ')} Z`);\n}\n\nexport function handleLassoUp() {\n if (!drawing) return;\n const polygon = points.slice(); cleanup();\n // Switching tools clears selection state. Do that before applying the\n // lasso result so the newly selected shapes survive the tool transition.\n window.__sketchStoreApi?.setActiveTool('select', { afterDraw: true });\n if (polygon.length >= 3 && Array.isArray(window.shapes)) {\n const selected = window.shapes.filter((shape) => boundsPoints(shape).every((p) => pointInPolygon(p, polygon)));\n const filtered = selected.filter((shape) => !shape.parentFrame || !selected.includes(shape.parentFrame));\n // Apply the batch once; addShape() rebuilds controls per item and becomes\n // unnecessarily quadratic for a large lasso selection.\n filtered.forEach((shape) => { multiSelection.selectedShapes.add(shape); shape.isSelected = true; });\n if (filtered.length) multiSelection.updateControls();\n window.currentShape = filtered.length === 1 ? filtered[0] : null;\n }\n}\n\nexport function cancelLasso() { cleanup(); }\nwindow.__cancelLasso = cancelLasso;\n", "/* eslint-disable */\n\nimport { Frame } from '../shapes/Frame.js';\nimport { pushCreateAction } from '../core/UndoRedo.js';\nimport { normalizeWebEmbedUrl } from '../core/WebEmbedPolicy.js';\n\nlet frame = null, start = null;\nfunction coords(e) {\n const vb = svg.viewBox.baseVal, rect = svg.getBoundingClientRect();\n return { x: vb.x + ((e.clientX - rect.left) / rect.width) * vb.width, y: vb.y + ((e.clientY - rect.top) / rect.height) * vb.height };\n}\n\nexport function placeWebEmbed(urlValue) {\n const url = normalizeWebEmbedUrl(urlValue);\n if (!url || typeof svg === 'undefined') return null;\n\n // Complete the tool transition first because setActiveTool clears the\n // previous selection. The newly inserted frame should remain selected.\n window.__sketchStoreApi?.setActiveTool('select');\n const viewBox = svg.viewBox.baseVal;\n const width = Math.min(640, Math.max(320, viewBox.width * 0.56));\n const height = width * 9 / 16;\n const x = viewBox.x + (viewBox.width - width) / 2;\n const y = viewBox.y + (viewBox.height - height) / 2;\n const placedFrame = new Frame(x, y, width, height, {\n frameName: 'Web embed', frameType: 'web-embed', webEmbedURL: url,\n stroke: '#8b76d6', strokeWidth: 2,\n });\n shapes.push(placedFrame);\n pushCreateAction(placedFrame);\n currentShape = placedFrame;\n placedFrame.selectFrame();\n window.__pendingWebEmbedURL = null;\n return placedFrame;\n}\n\nexport function handleWebEmbedDown(e) {\n const url = normalizeWebEmbedUrl(window.__pendingWebEmbedURL);\n if (!window.isWebEmbedToolActive || !url) { window.__showWebEmbedModal?.(); return; }\n start = coords(e);\n frame = new Frame(start.x, start.y, 0, 0, { frameName: 'Web embed', frameType: 'web-embed', webEmbedURL: url, stroke: '#8b76d6', strokeWidth: 2 });\n shapes.push(frame); currentShape = frame;\n}\n\nexport function handleWebEmbedMove(e) {\n if (!frame || !start) return;\n const p = coords(e); frame.x = Math.min(start.x, p.x); frame.y = Math.min(start.y, p.y);\n frame.width = Math.abs(p.x - start.x); frame.height = Math.abs(p.y - start.y); frame.draw();\n}\n\nexport function handleWebEmbedUp() {\n if (!frame) return;\n if (frame.width < 40 || frame.height < 30) { frame.width = 560; frame.height = 315; }\n frame.draw(); pushCreateAction(frame);\n const placedFrame = frame;\n window.__pendingWebEmbedURL = null; frame = null; start = null;\n window.__sketchStoreApi?.setActiveTool('select', { afterDraw: true });\n currentShape = placedFrame; placedFrame.selectFrame();\n}\n\nwindow.__placeWebEmbed = placeWebEmbed;\n", "/* eslint-disable */\n// Event dispatcher - extracted from eventListeners.js\n// Central event routing for all tools\n\nimport { handleMouseDownRect, handleMouseMoveRect, handleMouseUpRect } from '../tools/rectangleTool.js';\nimport { handleMouseDownArrow, handleMouseMoveArrow, handleMouseUpArrow } from '../tools/arrowTool.js';\nimport { handleMouseDownCircle, handleMouseMoveCircle, handleMouseUpCircle } from '../tools/circleTool.js';\nimport { handleMouseUpImage, handleMouseDownImage, handleMouseMoveImage } from '../tools/imageTool.js';\nimport { handleMouseDownLine, handleMouseMoveLine, handleMouseUpLine } from '../tools/lineTool.js';\nimport { handleFreehandMouseDown, handleFreehandMouseMove, handleFreehandMouseUp } from '../tools/freehandTool.js';\nimport { handleTextMouseDown, handleTextMouseMove, handleTextMouseUp, enterEditMode } from '../tools/textTool.js';\nimport { handleMouseDownFrame, handleMouseMoveFrame, handleMouseUpFrame } from '../tools/frameTool.js';\nimport { handleMultiSelectionMouseDown, handleMultiSelectionMouseMove, handleMultiSelectionMouseUp, removeMultiSelectionRect, multiSelection, isMultiSelecting} from './Selection.js';\nimport { handleMouseDownIcon, handleMouseMoveIcon, handleMouseUpIcon } from '../tools/iconTool.js';\nimport { handleCodeMouseDown, handleCodeMouseMove, handleCodeMouseUp } from '../tools/codeTool.js';\nimport { handleShapeRecognitionDown, handleShapeRecognitionMove, handleShapeRecognitionUp } from '../tools/shapeRecognitionTool.js';\nimport { handlePaintBucketDown } from '../tools/paintBucketTool.js';\nimport { handleLassoDown, handleLassoMove, handleLassoUp } from '../tools/lassoTool.js';\nimport { handleWebEmbedDown, handleWebEmbedMove, handleWebEmbedUp } from '../tools/webEmbedTool.js';\n\n// === Auto-scroll when dragging near viewport edges ===\nconst EDGE_THRESHOLD = 40; // px from edge to start scrolling\nconst SCROLL_SPEED = 8; // base px per frame (scaled by zoom)\nlet _autoScrollRAF = null;\n\nfunction _autoScroll(e) {\n if (!(e.buttons & 1)) { _stopAutoScroll(); return; } // no primary button\n if (typeof currentViewBox === 'undefined' || typeof currentZoom === 'undefined') return;\n if (typeof isPanning !== 'undefined' && isPanning) return; // don't fight pan tool\n if (typeof isPanningToolActive !== 'undefined' && isPanningToolActive) return;\n\n const rect = svg.getBoundingClientRect();\n const mx = e.clientX - rect.left;\n const my = e.clientY - rect.top;\n\n let dx = 0, dy = 0;\n if (mx < EDGE_THRESHOLD) dx = -SCROLL_SPEED * (1 - mx / EDGE_THRESHOLD);\n else if (mx > rect.width - EDGE_THRESHOLD) dx = SCROLL_SPEED * (1 - (rect.width - mx) / EDGE_THRESHOLD);\n if (my < EDGE_THRESHOLD) dy = -SCROLL_SPEED * (1 - my / EDGE_THRESHOLD);\n else if (my > rect.height - EDGE_THRESHOLD) dy = SCROLL_SPEED * (1 - (rect.height - my) / EDGE_THRESHOLD);\n\n // Also scroll when cursor is outside the canvas entirely\n if (e.clientX < rect.left) dx = -SCROLL_SPEED;\n else if (e.clientX > rect.right) dx = SCROLL_SPEED;\n if (e.clientY < rect.top) dy = -SCROLL_SPEED;\n else if (e.clientY > rect.bottom) dy = SCROLL_SPEED;\n\n if (dx === 0 && dy === 0) { _stopAutoScroll(); return; }\n\n // Scale speed inversely with zoom so scrolling feels consistent\n const scale = 1 / currentZoom;\n currentViewBox.x += dx * scale;\n currentViewBox.y += dy * scale;\n svg.setAttribute('viewBox', `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`);\n if (typeof freehandCanvas !== 'undefined' && freehandCanvas !== svg) {\n freehandCanvas.setAttribute('viewBox', `${currentViewBox.x} ${currentViewBox.y} ${currentViewBox.width} ${currentViewBox.height}`);\n }\n}\n\nfunction _startAutoScroll() {\n if (_autoScrollRAF) return;\n const tick = () => {\n if (_lastDragEvent) _autoScroll(_lastDragEvent);\n _autoScrollRAF = requestAnimationFrame(tick);\n };\n _autoScrollRAF = requestAnimationFrame(tick);\n}\n\nfunction _stopAutoScroll() {\n if (_autoScrollRAF) {\n cancelAnimationFrame(_autoScrollRAF);\n _autoScrollRAF = null;\n }\n _lastDragEvent = null;\n}\n\nlet _lastDragEvent = null;\nlet _documentDragActive = false;\n\nfunction _onDocumentDragMove(e) {\n _lastDragEvent = e;\n // Clamp mouse coordinates to SVG bounds before forwarding to tool handlers,\n // so getSVGCoordsFromMouse doesn't produce extreme values when cursor is outside.\n const rect = svg.getBoundingClientRect();\n const clampedX = Math.max(rect.left, Math.min(rect.right, e.clientX));\n const clampedY = Math.max(rect.top, Math.min(rect.bottom, e.clientY));\n const clampedEvent = new PointerEvent(e.type, {\n clientX: clampedX,\n clientY: clampedY,\n buttons: e.buttons,\n button: e.button,\n ctrlKey: e.ctrlKey,\n shiftKey: e.shiftKey,\n altKey: e.altKey,\n metaKey: e.metaKey,\n });\n handleMainMouseMove(clampedEvent);\n}\n\nfunction _onDocumentDragUp(e) {\n _stopAutoScroll();\n document.removeEventListener('pointermove', _onDocumentDragMove);\n document.removeEventListener('pointerup', _onDocumentDragUp);\n _documentDragActive = false;\n // Finalize the operation\n handleMainMouseUp(e);\n}\n\nconst handleMainMouseDown = (e) => {\n if (!e.target) return;\n // Middle / right mouse buttons are reserved for panning and the\n // browser context menu; they should NOT trigger tool actions or the\n // multi-selection rectangle. Without this guard, middle-click-drag\n // simultaneously pans (handled in ZoomPan) and starts a selection\n // marquee.\n if (e.button === 1 || e.button === 2 || window.__spacePanActive) return;\n // Safety: remove any stray selection rectangle from a previous interrupted drag\n removeMultiSelectionRect();\n\n // For non-selection tools: deselect everything when clicking on empty canvas\n // (Selection tool handles its own deselection in handleMultiSelectionMouseDown)\n if (!isSelectionToolActive) {\n // Clear multi-selection for any tool switch\n if (multiSelection.selectedShapes.size > 0) {\n multiSelection.clearSelection();\n }\n // Deselect current individual shape when starting a new tool action\n if (currentShape && typeof currentShape.removeSelection === 'function') {\n currentShape.removeSelection();\n currentShape = null;\n }\n if (typeof disableAllSideBars === 'function') {\n disableAllSideBars();\n }\n }\n\n if (window.isLassoToolActive) {\n handleLassoDown(e);\n } else if (window.isWebEmbedToolActive) {\n handleWebEmbedDown(e);\n } else if (window.isShapeRecognitionToolActive) {\n handleShapeRecognitionDown(e);\n } else if (window.isPaintBucketToolActive) {\n handlePaintBucketDown(e);\n } else if (isSquareToolActive) {\n handleMouseDownRect(e);\n } else if (isArrowToolActive) {\n handleMouseDownArrow(e);\n } else if (isCircleToolActive) {\n handleMouseDownCircle(e);\n } else if (isImageToolActive) {\n handleMouseDownImage(e);\n } \n else if (isLineToolActive) {\n handleMouseDownLine(e);\n }\n else if (isPaintToolActive) {\n handleFreehandMouseDown(e);\n }\n else if (isTextToolActive) {\n // Text tool handles both text and code shapes based on target and mode\n const targetCodeGroup = e.target.closest('g[data-type=\"code-group\"]');\n const targetTextGroup = e.target.closest('g[data-type=\"text-group\"]');\n if (targetCodeGroup && !targetTextGroup) {\n handleCodeMouseDown(e);\n } else if (isTextInCodeMode && !targetTextGroup && !targetCodeGroup) {\n handleCodeMouseDown(e);\n } else {\n handleTextMouseDown(e);\n }\n }\n else if (isFrameToolActive) {\n handleMouseDownFrame(e);\n }\n else if (isIconToolActive) {\n handleMouseDownIcon(e);\n }\n else if (isSelectionToolActive) {\n // Try multi-selection first when selection tool is active\n if (handleMultiSelectionMouseDown(e)) {\n return; // Multi-selection handled the event\n }\n\n // Remember previous shape to detect deselection\n const prevShape = currentShape;\n let handled = false;\n\n // If multi-selection didn't handle it, proceed with shape-specific selection\n if (currentShape?.shapeName === 'rectangle') {\n handleMouseDownRect(e);\n handled = true;\n } else if (currentShape?.shapeName === 'arrow') {\n handleMouseDownArrow(e);\n handled = true;\n } else if (currentShape?.shapeName === 'circle') {\n handleMouseDownCircle(e);\n handled = true;\n } else if (currentShape?.shapeName === 'image') {\n handleMouseDownImage(e);\n handled = true;\n }\n else if (currentShape?.shapeName === 'line') {\n handleMouseDownLine(e);\n handled = true;\n }\n else if (currentShape?.shapeName === 'freehandStroke') {\n handleFreehandMouseDown(e);\n handled = true;\n }\n else if (currentShape?.shapeName === 'text') {\n handleTextMouseDown(e);\n handled = true;\n }\n else if (currentShape?.shapeName === 'frame') {\n handleMouseDownFrame(e);\n handled = true;\n }\n else if (currentShape?.shapeName === 'icon') {\n handleMouseDownIcon(e);\n handled = true;\n }\n else if( currentShape?.shapeName === 'code') {\n handleCodeMouseDown(e);\n handled = true;\n }\n\n // If the handler deselected (currentShape cleared) but didn't select something new,\n // fall through to try all handlers so clicking another shape type works\n if (handled && prevShape && !currentShape) {\n handled = false;\n }\n\n if (!handled) {\n const originalCurrentShape = currentShape;\n handleMouseDownRect(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleMouseDownCircle(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleMouseDownArrow(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleMouseDownImage(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleMouseDownLine(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleFreehandMouseDown(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleTextMouseDown(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleMouseDownFrame(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleMouseDownIcon(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n handleCodeMouseDown(e);\n if (currentShape && currentShape !== originalCurrentShape) return;\n if (currentShape === originalCurrentShape) {\n if (currentShape) {\n currentShape.removeSelection();\n currentShape = null;\n }\n }\n }\n }\n};\n\nconst handleMainMouseMove = (e) => {\n if (window.__spacePanPointerActive) return;\n // Auto-scroll when dragging near/past viewport edges (checked first so early returns don't skip it)\n if (e.buttons & 1) {\n _lastDragEvent = e;\n _startAutoScroll();\n } else {\n _stopAutoScroll();\n }\n\n if (window.isLassoToolActive) {\n handleLassoMove(e);\n } else if (window.isWebEmbedToolActive) {\n handleWebEmbedMove(e);\n } else if (window.isShapeRecognitionToolActive) {\n handleShapeRecognitionMove(e);\n } else if (window.isPaintBucketToolActive) {\n return;\n } else if (isSquareToolActive) {\n handleMouseMoveRect(e);\n } else if (isArrowToolActive) {\n handleMouseMoveArrow(e);\n } else if (isCircleToolActive) {\n handleMouseMoveCircle(e);\n } else if (isImageToolActive) {\n handleMouseMoveImage(e);\n } \n else if (isLineToolActive) {\n handleMouseMoveLine(e);\n }\n else if (isPaintToolActive) {\n handleFreehandMouseMove(e);\n }\n else if (isTextToolActive) {\n handleTextMouseMove(e);\n handleCodeMouseMove(e);\n }\n else if (isFrameToolActive) {\n handleMouseMoveFrame(e);\n }\n else if (isIconToolActive) {\n handleMouseMoveIcon(e);\n }\n else if (isSelectionToolActive) {\n // Handle multi-selection operations first - these take priority\n if (isMultiSelecting || multiSelection.isDragging || multiSelection.isResizing || multiSelection.isRotating) {\n if (handleMultiSelectionMouseMove(e)) {\n return; // Multi-selection handled the event\n }\n }\n \n // Shape-specific mouse move handling\n if (currentShape?.shapeName === 'rectangle') {\n handleMouseMoveRect(e);\n } else if (currentShape?.shapeName === 'arrow') {\n handleMouseMoveArrow(e);\n } else if (currentShape?.shapeName === 'circle') {\n handleMouseMoveCircle(e);\n } else if (currentShape?.shapeName === 'image') {\n handleMouseMoveImage(e);\n } \n else if (currentShape?.shapeName === 'line') {\n handleMouseMoveLine(e);\n }\n else if (currentShape?.shapeName === 'freehandStroke') {\n handleFreehandMouseMove(e);\n }\n else if (currentShape?.shapeName === 'text') {\n handleTextMouseMove(e);\n }\n else if (currentShape?.shapeName === 'frame') {\n handleMouseMoveFrame(e);\n }\n else if (currentShape?.shapeName === 'icon') {\n handleMouseMoveIcon(e);\n }\n else if (currentShape?.shapeName === 'code') {\n handleCodeMouseMove(e);\n }\n\n else {\n // Try multi-selection mouse move for cursor updates\n if (handleMultiSelectionMouseMove(e)) {\n return;\n }\n \n handleMouseMoveRect(e);\n handleMouseMoveArrow(e);\n handleMouseMoveCircle(e);\n handleMouseMoveImage(e);\n handleMouseMoveLine(e);\n handleFreehandMouseMove(e);\n handleTextMouseMove(e);\n handleMouseMoveFrame(e);\n handleMouseMoveIcon(e);\n handleCodeMouseMove(e);\n }\n }\n};\n\nconst handleMainMouseUp = (e) => {\n if (window.__spacePanPointerActive) return;\n _stopAutoScroll();\n if (window.isLassoToolActive) {\n handleLassoUp(e);\n } else if (window.isWebEmbedToolActive) {\n handleWebEmbedUp(e);\n } else if (window.isShapeRecognitionToolActive) {\n handleShapeRecognitionUp(e);\n } else if (window.isPaintBucketToolActive) {\n return;\n } else if (isSquareToolActive) {\n handleMouseUpRect(e);\n } else if (isArrowToolActive) {\n handleMouseUpArrow(e);\n } else if (isCircleToolActive) {\n handleMouseUpCircle(e);\n } else if (isImageToolActive) {\n handleMouseUpImage(e);\n } \n else if (isLineToolActive) { \n handleMouseUpLine(e);\n }\n else if (isPaintToolActive) {\n handleFreehandMouseUp(e);\n }\n else if (isTextToolActive) {\n handleTextMouseUp(e);\n handleCodeMouseUp(e);\n }\n else if (isFrameToolActive) {\n handleMouseUpFrame(e);\n }\n else if (isIconToolActive) {\n handleMouseUpIcon(e);\n }\n\n else if (isSelectionToolActive) {\n // Always try multi-selection cleanup first\n if (isMultiSelecting || multiSelection.isDragging || multiSelection.isResizing || multiSelection.isRotating) {\n handleMultiSelectionMouseUp(e);\n return;\n }\n\n // Shape-specific mouse up handling\n if (currentShape?.shapeName === 'rectangle') {\n handleMouseUpRect(e);\n } else if (currentShape?.shapeName === 'arrow') {\n handleMouseUpArrow(e);\n } else if (currentShape?.shapeName === 'circle') {\n handleMouseUpCircle(e);\n } else if (currentShape?.shapeName === 'image') {\n handleMouseUpImage(e);\n }\n else if (currentShape?.shapeName === 'line') {\n handleMouseUpLine(e);\n }\n else if (currentShape?.shapeName === 'freehandStroke') {\n handleFreehandMouseUp(e);\n }\n else if (currentShape?.shapeName === 'text') {\n handleTextMouseUp(e);\n }\n else if (currentShape?.shapeName === 'frame') {\n handleMouseUpFrame(e);\n }\n else if (currentShape?.shapeName === 'icon') {\n handleMouseUpIcon(e);\n }\n else if (currentShape?.shapeName === 'code') {\n handleCodeMouseUp(e);\n }\n\n else {\n handleMultiSelectionMouseUp(e);\n handleMouseUpRect(e);\n handleMouseUpArrow(e);\n handleMouseUpCircle(e);\n handleMouseUpImage(e);\n handleMouseUpLine(e);\n handleFreehandMouseUp(e);\n handleTextMouseUp(e);\n handleMouseUpFrame(e);\n handleMouseUpIcon(e);\n handleCodeMouseUp(e);\n }\n }\n};\n\nconst handleMainMouseLeave = (e) => {\n if (window.__spacePanPointerActive) return;\n // If the user is still holding the primary button (dragging outside the canvas),\n // keep auto-scrolling and don't finalize the operation yet.\n if (e.buttons & 1) {\n _lastDragEvent = e;\n _startAutoScroll();\n\n // Listen on document to continue receiving move events outside the SVG\n if (!_documentDragActive) {\n _documentDragActive = true;\n document.addEventListener('pointermove', _onDocumentDragMove);\n document.addEventListener('pointerup', _onDocumentDragUp);\n }\n return;\n }\n\n // Stop all active drawing tools when pointer leaves the canvas\n\n // Fire mouseUp for whichever tool is active to finalize/cancel the operation\n handleMainMouseUp(e);\n\n // Always clean up any stray selection rectangle when pointer leaves canvas\n removeMultiSelectionRect();\n\n // Eraser: force cleanup any lingering trail\n if (typeof window.forceCleanupEraserTrail === 'function') {\n window.forceCleanupEraserTrail();\n }\n\n // Laser: stop drawing and fade out active laser (globals from laserTool.js)\n if (typeof isDrawing !== 'undefined' && isDrawing) {\n isDrawing = false;\n if (typeof lasers !== 'undefined' && lasers.length > 0 && typeof fadeLaserTrail === 'function') {\n const lastLaser = lasers[lasers.length - 1];\n fadeLaserTrail(lastLaser);\n }\n }\n};\n\nlet _boundSvg = null;\n\nfunction _onMouseEnter(e) {\n // Cursor re-entered the SVG \u2014 stop document-level tracking, SVG handles events again\n if (_documentDragActive) {\n document.removeEventListener('pointermove', _onDocumentDragMove);\n document.removeEventListener('pointerup', _onDocumentDragUp);\n _documentDragActive = false;\n }\n}\n\nconst handleMainDblClick = (e) => {\n if (!e.target) return;\n // Double-click on a text group from any tool: enter text edit mode\n const targetTextGroup = e.target.closest('g[data-type=\"text-group\"]');\n if (targetTextGroup) {\n e.stopPropagation();\n enterEditMode(targetTextGroup);\n }\n};\n\nfunction initEventDispatcher(svgEl) {\n if (_boundSvg) cleanupEventDispatcher();\n const target = svgEl || svg;\n target.addEventListener('pointerdown', handleMainMouseDown);\n target.addEventListener('pointermove', handleMainMouseMove);\n target.addEventListener('pointerup', handleMainMouseUp);\n target.addEventListener('pointerleave', handleMainMouseLeave);\n target.addEventListener('pointerenter', _onMouseEnter);\n target.addEventListener('dblclick', handleMainDblClick);\n _boundSvg = target;\n}\n\nfunction cleanupEventDispatcher() {\n _stopAutoScroll();\n if (_documentDragActive) {\n document.removeEventListener('pointermove', _onDocumentDragMove);\n document.removeEventListener('pointerup', _onDocumentDragUp);\n _documentDragActive = false;\n }\n if (_boundSvg) {\n _boundSvg.removeEventListener('pointerdown', handleMainMouseDown);\n _boundSvg.removeEventListener('pointermove', handleMainMouseMove);\n _boundSvg.removeEventListener('pointerup', handleMainMouseUp);\n _boundSvg.removeEventListener('pointerleave', handleMainMouseLeave);\n _boundSvg.removeEventListener('pointerenter', _onMouseEnter);\n _boundSvg.removeEventListener('dblclick', handleMainDblClick);\n _boundSvg = null;\n }\n}\n\n// Auto-init if svg is already available (first load)\nif (typeof svg !== 'undefined' && svg) {\n initEventDispatcher(svg);\n}\n\nexport { handleMainMouseDown, handleMainMouseMove, handleMainMouseUp, handleMainMouseLeave, initEventDispatcher, cleanupEventDispatcher };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["start", "path", "frame", "getSVGPoint", "MAX_POINTS", "points", "drawing", "coords", "handleMouseDown", "handleMouseMove", "handleMouseUp"]
|
|
7
|
+
}
|
|
@@ -4,16 +4,19 @@ import {
|
|
|
4
4
|
} from "./chunk-MB7VS6MK.js";
|
|
5
5
|
import {
|
|
6
6
|
ImageShape
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-ASBC5G35.js";
|
|
8
8
|
import {
|
|
9
9
|
IconShape
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-EOURRJ55.js";
|
|
11
11
|
import {
|
|
12
12
|
Frame
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-K5BG5MHY.js";
|
|
14
14
|
import {
|
|
15
15
|
FreehandStroke
|
|
16
16
|
} from "./chunk-PXFPPO3R.js";
|
|
17
|
+
import {
|
|
18
|
+
normalizeWebEmbedUrl
|
|
19
|
+
} from "./chunk-QZI4UIE5.js";
|
|
17
20
|
import {
|
|
18
21
|
Rectangle
|
|
19
22
|
} from "./chunk-FETTJLCV.js";
|
|
@@ -26,9 +29,9 @@ import {
|
|
|
26
29
|
} from "./chunk-BT2EIJD4.js";
|
|
27
30
|
import {
|
|
28
31
|
Line
|
|
29
|
-
} from "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-
|
|
32
|
+
} from "./chunk-OP56XPWF.js";
|
|
33
|
+
import "./chunk-XYUFEIZR.js";
|
|
34
|
+
import "./chunk-6GPEWDRB.js";
|
|
32
35
|
import {
|
|
33
36
|
TextShape
|
|
34
37
|
} from "./chunk-PGT3TJOW.js";
|
|
@@ -141,6 +144,8 @@ function serializeShape(shape) {
|
|
|
141
144
|
fillColor: shape.fillColor || "#1e1e28",
|
|
142
145
|
gridSize: shape.gridSize || 20,
|
|
143
146
|
gridColor: shape.gridColor || "rgba(255,255,255,0.06)",
|
|
147
|
+
frameType: shape._frameType || null,
|
|
148
|
+
webEmbedURL: shape._frameType === "web-embed" ? shape._webEmbedURL : null,
|
|
144
149
|
options: cloneOptions(shape.options),
|
|
145
150
|
// Issue #24 bug #10: filter out null / undefined / shapeID-less
|
|
146
151
|
// children. A stale reference would serialize as `null` and the
|
|
@@ -258,6 +263,11 @@ function deserializeShape(data) {
|
|
|
258
263
|
if (data.fillColor) frameOpts.fillColor = data.fillColor;
|
|
259
264
|
if (data.gridSize) frameOpts.gridSize = data.gridSize;
|
|
260
265
|
if (data.gridColor) frameOpts.gridColor = data.gridColor;
|
|
266
|
+
const embedURL = data.frameType === "web-embed" ? normalizeWebEmbedUrl(data.webEmbedURL) : null;
|
|
267
|
+
if (embedURL) {
|
|
268
|
+
frameOpts.frameType = "web-embed";
|
|
269
|
+
frameOpts.webEmbedURL = embedURL;
|
|
270
|
+
}
|
|
261
271
|
const shape = new Frame(data.x, data.y, data.width, data.height, frameOpts);
|
|
262
272
|
if (data.rotation) shape.rotation = data.rotation;
|
|
263
273
|
if (data.shapeID) shape.shapeID = data.shapeID;
|
|
@@ -782,4 +792,4 @@ export {
|
|
|
782
792
|
uploadScene,
|
|
783
793
|
validateScene
|
|
784
794
|
};
|
|
785
|
-
//# sourceMappingURL=SceneSerializer-
|
|
795
|
+
//# sourceMappingURL=SceneSerializer-SG6SJN5X.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';\n\nconst FORMAT_VERSION = 1;\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 if (!sceneData || sceneData.format !== 'lixsketch') {\n console.error('[SceneSerializer] Invalid scene format');\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 // \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 .lixsketch file\n// ============================================================\nexport function downloadScene(workspaceName = 'Untitled') {\n const scene = saveScene(workspaceName);\n const json = JSON.stringify(scene, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = `${workspaceName.replace(/[^a-zA-Z0-9_-]/g, '_')}.lixjson`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\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 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 = (e) => {\n const file = e.target.files[0];\n if (!file) return resolve(false);\n\n const reader = new FileReader();\n reader.onload = (ev) => {\n try {\n const data = JSON.parse(ev.target.result);\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: 'Failed to parse JSON file' });\n }\n };\n reader.readAsText(file);\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() {\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 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 // 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 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
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
|
+
cancelActiveMultiSelectionDrag,
|
|
3
4
|
clearAllSelections,
|
|
4
5
|
createMultiSelectionControls,
|
|
5
6
|
handleMultiSelectionMouseDown,
|
|
@@ -13,11 +14,12 @@ import {
|
|
|
13
14
|
removeMultiSelectionControls,
|
|
14
15
|
removeMultiSelectionRect,
|
|
15
16
|
selectShapesInRect
|
|
16
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-K5RY4EV7.js";
|
|
17
18
|
import "./chunk-PAKA6HUX.js";
|
|
18
|
-
import "./chunk-
|
|
19
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-XYUFEIZR.js";
|
|
20
|
+
import "./chunk-6GPEWDRB.js";
|
|
20
21
|
export {
|
|
22
|
+
cancelActiveMultiSelectionDrag,
|
|
21
23
|
clearAllSelections,
|
|
22
24
|
createMultiSelectionControls,
|
|
23
25
|
handleMultiSelectionMouseDown,
|
|
@@ -32,4 +34,4 @@ export {
|
|
|
32
34
|
removeMultiSelectionRect,
|
|
33
35
|
selectShapesInRect
|
|
34
36
|
};
|
|
35
|
-
//# sourceMappingURL=Selection-
|
|
37
|
+
//# sourceMappingURL=Selection-2TSH3J6P.js.map
|
|
@@ -73,6 +73,10 @@ var SketchEngine = class {
|
|
|
73
73
|
window.isFrameToolActive = false;
|
|
74
74
|
window.isIconToolActive = false;
|
|
75
75
|
window.isCodeToolActive = false;
|
|
76
|
+
window.isShapeRecognitionToolActive = false;
|
|
77
|
+
window.isPaintBucketToolActive = false;
|
|
78
|
+
window.isLassoToolActive = false;
|
|
79
|
+
window.isWebEmbedToolActive = false;
|
|
76
80
|
window.isTextInCodeMode = false;
|
|
77
81
|
window.isPanning = false;
|
|
78
82
|
window.panStart = null;
|
|
@@ -164,12 +168,12 @@ var SketchEngine = class {
|
|
|
164
168
|
import("./Rectangle-S7XUKWYD.js"),
|
|
165
169
|
import("./Circle-6POZCUZD.js"),
|
|
166
170
|
import("./Arrow-EF7ALH2Y.js"),
|
|
167
|
-
import("./Line-
|
|
171
|
+
import("./Line-APEULMHE.js"),
|
|
168
172
|
import("./TextShape-DY77FFI2.js"),
|
|
169
173
|
import("./CodeShape-TE74XP5V.js"),
|
|
170
|
-
import("./ImageShape-
|
|
171
|
-
import("./IconShape-
|
|
172
|
-
import("./Frame-
|
|
174
|
+
import("./ImageShape-UJQN2HI7.js"),
|
|
175
|
+
import("./IconShape-ZADX7Y33.js"),
|
|
176
|
+
import("./Frame-7D2MXCFF.js"),
|
|
173
177
|
import("./FreehandStroke-U6GYZOM4.js")
|
|
174
178
|
]);
|
|
175
179
|
window.Rectangle = Rectangle;
|
|
@@ -206,16 +210,16 @@ var SketchEngine = class {
|
|
|
206
210
|
frameTool,
|
|
207
211
|
freehandTool
|
|
208
212
|
] = await Promise.all([
|
|
209
|
-
import("./rectangleTool-
|
|
210
|
-
import("./circleTool-
|
|
211
|
-
import("./arrowTool-
|
|
212
|
-
import("./lineTool-
|
|
213
|
-
import("./textTool-
|
|
214
|
-
import("./codeTool-
|
|
215
|
-
import("./imageTool-
|
|
216
|
-
import("./iconTool-
|
|
217
|
-
import("./frameTool-
|
|
218
|
-
import("./freehandTool-
|
|
213
|
+
import("./rectangleTool-EJKK6UTX.js"),
|
|
214
|
+
import("./circleTool-LDKGZALF.js"),
|
|
215
|
+
import("./arrowTool-OYDWJGQK.js"),
|
|
216
|
+
import("./lineTool-ZMR27U5L.js"),
|
|
217
|
+
import("./textTool-S4XXZHZH.js"),
|
|
218
|
+
import("./codeTool-4YZO5W7J.js"),
|
|
219
|
+
import("./imageTool-P2RWZRHO.js"),
|
|
220
|
+
import("./iconTool-46O5VEUX.js"),
|
|
221
|
+
import("./frameTool-MXNJEXQQ.js"),
|
|
222
|
+
import("./freehandTool-26D3FOOX.js")
|
|
219
223
|
]);
|
|
220
224
|
this._modules.tools = {
|
|
221
225
|
rectangleTool,
|
|
@@ -239,11 +243,11 @@ var SketchEngine = class {
|
|
|
239
243
|
resizeShapes,
|
|
240
244
|
resizeCode
|
|
241
245
|
] = await Promise.all([
|
|
242
|
-
import("./EventDispatcher-
|
|
243
|
-
import("./UndoRedo-
|
|
244
|
-
import("./Selection-
|
|
245
|
-
import("./ZoomPan-
|
|
246
|
-
import("./CopyPaste-
|
|
246
|
+
import("./EventDispatcher-7LAK7GQ7.js"),
|
|
247
|
+
import("./UndoRedo-IN4SXDG6.js"),
|
|
248
|
+
import("./Selection-2TSH3J6P.js"),
|
|
249
|
+
import("./ZoomPan-RR7KUYZT.js"),
|
|
250
|
+
import("./CopyPaste-YUDZ6DHY.js"),
|
|
247
251
|
import("./EraserTrail-PA6IQLQN.js"),
|
|
248
252
|
import("./ResizeShapes-LKEQTITP.js"),
|
|
249
253
|
import("./ResizeCode-WAMDTKSW.js")
|
|
@@ -262,7 +266,7 @@ var SketchEngine = class {
|
|
|
262
266
|
eventDispatcher.initEventDispatcher(this.svg);
|
|
263
267
|
}
|
|
264
268
|
window.__sketchInteractionReady = true;
|
|
265
|
-
const sceneSerializer = await import("./SceneSerializer-
|
|
269
|
+
const sceneSerializer = await import("./SceneSerializer-SG6SJN5X.js");
|
|
266
270
|
if (sceneSerializer.initSceneSerializer) sceneSerializer.initSceneSerializer();
|
|
267
271
|
await Promise.all([
|
|
268
272
|
import("./eraserTool-2GS2LQCS.js"),
|
|
@@ -337,6 +341,10 @@ var SketchEngine = class {
|
|
|
337
341
|
if (typeof window.__cleanupIconTool === "function") {
|
|
338
342
|
window.__cleanupIconTool();
|
|
339
343
|
}
|
|
344
|
+
if (typeof window.__cancelShapeRecognition === "function") {
|
|
345
|
+
window.__cancelShapeRecognition();
|
|
346
|
+
}
|
|
347
|
+
if (typeof window.__cancelLasso === "function") window.__cancelLasso();
|
|
340
348
|
window.isPaintToolActive = false;
|
|
341
349
|
window.isSquareToolActive = false;
|
|
342
350
|
window.isCircleToolActive = false;
|
|
@@ -351,6 +359,10 @@ var SketchEngine = class {
|
|
|
351
359
|
window.isFrameToolActive = false;
|
|
352
360
|
window.isIconToolActive = false;
|
|
353
361
|
window.isCodeToolActive = false;
|
|
362
|
+
window.isShapeRecognitionToolActive = false;
|
|
363
|
+
window.isPaintBucketToolActive = false;
|
|
364
|
+
window.isLassoToolActive = false;
|
|
365
|
+
window.isWebEmbedToolActive = false;
|
|
354
366
|
const flagMap = {
|
|
355
367
|
select: "isSelectionToolActive",
|
|
356
368
|
pan: "isPanningToolActive",
|
|
@@ -365,7 +377,11 @@ var SketchEngine = class {
|
|
|
365
377
|
laser: "isLaserToolActive",
|
|
366
378
|
image: "isImageToolActive",
|
|
367
379
|
frame: "isFrameToolActive",
|
|
368
|
-
icon: "isIconToolActive"
|
|
380
|
+
icon: "isIconToolActive",
|
|
381
|
+
"draw-shape": "isShapeRecognitionToolActive",
|
|
382
|
+
"paint-bucket": "isPaintBucketToolActive",
|
|
383
|
+
lasso: "isLassoToolActive",
|
|
384
|
+
"web-embed": "isWebEmbedToolActive"
|
|
369
385
|
};
|
|
370
386
|
const flag = flagMap[toolName];
|
|
371
387
|
if (flag) window[flag] = true;
|
|
@@ -375,6 +391,10 @@ var SketchEngine = class {
|
|
|
375
391
|
if (toolName === "image" && window.__showImageSourcePicker) {
|
|
376
392
|
window.__showImageSourcePicker();
|
|
377
393
|
}
|
|
394
|
+
if (toolName === "web-embed") {
|
|
395
|
+
window.__showWebEmbedModal?.();
|
|
396
|
+
window.dispatchEvent(new CustomEvent("lixsketch:open-web-embed"));
|
|
397
|
+
}
|
|
378
398
|
const cursorMap = {
|
|
379
399
|
select: "default",
|
|
380
400
|
pan: "grab",
|
|
@@ -389,13 +409,20 @@ var SketchEngine = class {
|
|
|
389
409
|
laser: "crosshair",
|
|
390
410
|
image: "crosshair",
|
|
391
411
|
frame: "crosshair",
|
|
392
|
-
icon: "crosshair"
|
|
412
|
+
icon: "crosshair",
|
|
413
|
+
"draw-shape": "crosshair",
|
|
414
|
+
"paint-bucket": "cell",
|
|
415
|
+
lasso: "crosshair",
|
|
416
|
+
"web-embed": "crosshair"
|
|
393
417
|
};
|
|
394
418
|
if (this.svg) {
|
|
395
419
|
this.svg.style.cursor = cursorMap[toolName] || "default";
|
|
396
420
|
}
|
|
397
421
|
}
|
|
398
422
|
cleanup() {
|
|
423
|
+
if (typeof window.__cancelShapeRecognition === "function") {
|
|
424
|
+
window.__cancelShapeRecognition();
|
|
425
|
+
}
|
|
399
426
|
if (this._modules.core?.eventDispatcher?.cleanupEventDispatcher) {
|
|
400
427
|
this._modules.core.eventDispatcher.cleanupEventDispatcher();
|
|
401
428
|
}
|
|
@@ -414,4 +441,4 @@ export {
|
|
|
414
441
|
SketchEngine,
|
|
415
442
|
SketchEngine_default as default
|
|
416
443
|
};
|
|
417
|
-
//# sourceMappingURL=SketchEngine-
|
|
444
|
+
//# sourceMappingURL=SketchEngine-UD2XV2KT.js.map
|