@elixpo/lixsketch 5.6.4 → 5.6.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mcp/index.js +5 -1
- package/dist/mcp/index.js.map +2 -2
- package/dist/mcp/stdio.js +5 -1
- package/dist/mcp/stdio.js.map +2 -2
- package/dist/react/{AIRenderer-SRF7LU5K.js → AIRenderer-R5M2CIDO.js} +13 -6
- package/dist/react/AIRenderer-R5M2CIDO.js.map +7 -0
- package/dist/react/Circle-HMM5PKJ2.js +10 -0
- package/dist/react/{CopyPaste-YUDZ6DHY.js → CopyPaste-P6G35CXO.js} +11 -10
- package/dist/react/{CopyPaste-YUDZ6DHY.js.map → CopyPaste-P6G35CXO.js.map} +1 -1
- package/dist/react/{EventDispatcher-7LAK7GQ7.js → EventDispatcher-M5B4EWHJ.js} +216 -63
- package/dist/react/EventDispatcher-M5B4EWHJ.js.map +7 -0
- package/dist/react/Frame-QEUEYITT.js +11 -0
- package/dist/react/{FreehandStroke-U6GYZOM4.js → FreehandStroke-WXIJKD5I.js} +2 -2
- package/dist/react/{GraphEngine-MM6ALA2N.js → GraphEngine-XH3RPYO4.js} +9 -2
- package/dist/react/GraphEngine-XH3RPYO4.js.map +7 -0
- package/dist/react/IconShape-NHJE4YBY.js +10 -0
- package/dist/react/ImageShape-33VCMSDP.js +10 -0
- package/dist/react/Line-A6FE232Q.js +10 -0
- package/dist/react/{LixScriptParser-JYWJX375.js → LixScriptParser-YS3ZOTGS.js} +6 -2
- package/dist/react/LixScriptParser-YS3ZOTGS.js.map +7 -0
- package/dist/react/{MermaidFlowchartRenderer-PQEC4TMI.js → MermaidFlowchartRenderer-EL3Q2MNW.js} +6 -2
- package/dist/react/MermaidFlowchartRenderer-EL3Q2MNW.js.map +7 -0
- package/dist/react/MermaidSequenceParser-DBYXW23P.js +8 -0
- package/dist/react/{MermaidSequenceRenderer-KCUHO7UI.js → MermaidSequenceRenderer-K4KHHEVC.js} +10 -3
- package/dist/react/MermaidSequenceRenderer-K4KHHEVC.js.map +7 -0
- package/dist/react/{MermaidStructuredRenderer-W7UKN7BM.js → MermaidStructuredRenderer-6LN3WISP.js} +7 -2
- package/dist/react/MermaidStructuredRenderer-6LN3WISP.js.map +7 -0
- package/dist/react/Rectangle-4U4CD2ER.js +10 -0
- package/dist/react/{SceneSerializer-SG6SJN5X.js → SceneSerializer-JEYTYXZQ.js} +120 -46
- package/dist/react/SceneSerializer-JEYTYXZQ.js.map +7 -0
- package/dist/react/{Selection-2TSH3J6P.js → Selection-23MOLHEI.js} +4 -4
- package/dist/react/{SketchEngine-UD2XV2KT.js → SketchEngine-OPJON7TD.js} +26 -26
- package/dist/react/{UndoRedo-IN4SXDG6.js → UndoRedo-QVNRI5OB.js} +8 -2
- package/dist/react/{arrowTool-OYDWJGQK.js → arrowTool-VH3PJPDM.js} +3 -3
- package/dist/react/{chunk-LSHZYN77.js → chunk-2DZHO67H.js} +2 -2
- package/dist/react/{chunk-XOWNCYE4.js → chunk-5NHJJJBZ.js} +3 -3
- package/dist/react/chunk-6AIFXYV6.js +31 -0
- package/dist/react/chunk-6AIFXYV6.js.map +7 -0
- package/dist/react/{chunk-K5RY4EV7.js → chunk-6GPWSPJF.js} +9 -5
- package/dist/react/{chunk-K5RY4EV7.js.map → chunk-6GPWSPJF.js.map} +2 -2
- package/dist/react/{chunk-ASBC5G35.js → chunk-B6CYUZC4.js} +2 -2
- package/dist/react/{chunk-OP56XPWF.js → chunk-DNFPTVIP.js} +2 -2
- package/dist/react/{chunk-XYUFEIZR.js → chunk-DWEFPKDO.js} +2 -2
- package/dist/react/{chunk-GQUZPON4.js → chunk-F56XUE5S.js} +4 -4
- package/dist/react/{chunk-7CM5XQDN.js → chunk-G3DJQY65.js} +20 -36
- package/dist/react/chunk-G3DJQY65.js.map +7 -0
- package/dist/react/{chunk-LJR7EVW2.js → chunk-JEGLUNBC.js} +3 -3
- package/dist/react/{chunk-6GPEWDRB.js → chunk-M7GAB24F.js} +52 -6
- package/dist/react/chunk-M7GAB24F.js.map +7 -0
- package/dist/react/{chunk-VQVEPJSA.js → chunk-MHV5P6TS.js} +2 -1
- package/dist/react/chunk-MHV5P6TS.js.map +7 -0
- package/dist/react/{chunk-PXFPPO3R.js → chunk-NH3NVSWT.js} +18 -2
- package/dist/react/chunk-NH3NVSWT.js.map +7 -0
- package/dist/react/{chunk-XFL4R5ZF.js → chunk-OK4ROGMM.js} +16 -35
- package/dist/react/chunk-OK4ROGMM.js.map +7 -0
- package/dist/react/{chunk-APTOPAOY.js → chunk-SSFEN5CY.js} +3 -3
- package/dist/react/{chunk-RGMDWLRJ.js → chunk-UEL2G6D2.js} +3 -3
- package/dist/react/{chunk-M6TMN76K.js → chunk-ULPIHUVC.js} +3 -3
- package/dist/react/{chunk-FETTJLCV.js → chunk-VZPH7OAM.js} +14 -22
- package/dist/react/chunk-VZPH7OAM.js.map +7 -0
- package/dist/react/{chunk-TKXKJNTX.js → chunk-W7XUY4GR.js} +16 -19
- package/dist/react/chunk-W7XUY4GR.js.map +7 -0
- package/dist/react/{chunk-EOURRJ55.js → chunk-XSE4HQ2D.js} +2 -2
- package/dist/react/{chunk-K5BG5MHY.js → chunk-ZNZAICWY.js} +36 -60
- package/dist/react/chunk-ZNZAICWY.js.map +7 -0
- package/dist/react/{circleTool-LDKGZALF.js → circleTool-2UODOBCV.js} +4 -4
- package/dist/react/{codeTool-4YZO5W7J.js → codeTool-F4RV7SAI.js} +4 -4
- package/dist/react/{frameTool-MXNJEXQQ.js → frameTool-NTGA5BI6.js} +4 -4
- package/dist/react/{freehandTool-26D3FOOX.js → freehandTool-L55EUB5C.js} +4 -4
- package/dist/react/{iconTool-46O5VEUX.js → iconTool-KQQBLGR3.js} +4 -4
- package/dist/react/{imageTool-P2RWZRHO.js → imageTool-LDJ45AD7.js} +4 -4
- package/dist/react/index.js +148 -37
- package/dist/react/index.js.map +4 -4
- package/dist/react/{lineTool-ZMR27U5L.js → lineTool-CSAFD7PW.js} +4 -4
- package/dist/react/{rectangleTool-EJKK6UTX.js → rectangleTool-YPD2SIIZ.js} +4 -4
- package/dist/react/{textTool-S4XXZHZH.js → textTool-VQHMWEFJ.js} +5 -5
- package/package.json +5 -2
- package/src/core/AIRenderer.js +8 -2
- package/src/core/CanvasSpace.js +28 -0
- package/src/core/GraphRenderer.js +8 -3
- package/src/core/LixScriptParser.js +7 -1
- package/src/core/MermaidFlowchartRenderer.js +5 -1
- package/src/core/MermaidSequenceParser.js +1 -0
- package/src/core/MermaidSequenceRenderer.js +8 -3
- package/src/core/MermaidStructuredRenderer.js +6 -1
- package/src/core/SceneSerializer.js +121 -38
- package/src/core/Selection.js +12 -2
- package/src/core/UndoRedo.js +59 -5
- package/src/react/components/AppMenu.jsx +20 -19
- package/src/react/components/canvas/CanvasRulers.jsx +8 -13
- package/src/react/components/canvas/SVGCanvas.jsx +2 -1
- package/src/react/components/canvas/rulerUnits.js +28 -0
- package/src/react/components/sidebars/PaintBucketSidebar.jsx +1 -1
- package/src/react/store/useSketchStore.js +24 -3
- package/src/react/store/useUIStore.js +24 -1
- package/src/react/utils/canvasBackgrounds.js +29 -0
- package/src/shapes/Circle.js +12 -19
- package/src/shapes/Frame.js +38 -69
- package/src/shapes/FreehandStroke.js +24 -1
- package/src/shapes/Rectangle.js +10 -22
- package/src/tools/circleTool.js +3 -27
- package/src/tools/paintBucketTool.js +72 -15
- package/src/tools/rectangleTool.js +7 -23
- package/src/tools/shapeRecognition.js +270 -0
- package/src/tools/shapeRecognitionTool.js +36 -183
- package/dist/react/AIRenderer-SRF7LU5K.js.map +0 -7
- package/dist/react/Circle-6POZCUZD.js +0 -9
- package/dist/react/EventDispatcher-7LAK7GQ7.js.map +0 -7
- package/dist/react/Frame-7D2MXCFF.js +0 -11
- package/dist/react/GraphEngine-MM6ALA2N.js.map +0 -7
- package/dist/react/IconShape-ZADX7Y33.js +0 -10
- package/dist/react/ImageShape-UJQN2HI7.js +0 -10
- package/dist/react/Line-APEULMHE.js +0 -10
- package/dist/react/LixScriptParser-JYWJX375.js.map +0 -7
- package/dist/react/MermaidFlowchartRenderer-PQEC4TMI.js.map +0 -7
- package/dist/react/MermaidSequenceParser-UKG2NSZY.js +0 -8
- package/dist/react/MermaidSequenceRenderer-KCUHO7UI.js.map +0 -7
- package/dist/react/MermaidStructuredRenderer-W7UKN7BM.js.map +0 -7
- package/dist/react/Rectangle-S7XUKWYD.js +0 -9
- package/dist/react/SceneSerializer-SG6SJN5X.js.map +0 -7
- package/dist/react/chunk-6GPEWDRB.js.map +0 -7
- package/dist/react/chunk-7CM5XQDN.js.map +0 -7
- package/dist/react/chunk-FETTJLCV.js.map +0 -7
- package/dist/react/chunk-K5BG5MHY.js.map +0 -7
- package/dist/react/chunk-PXFPPO3R.js.map +0 -7
- package/dist/react/chunk-TKXKJNTX.js.map +0 -7
- package/dist/react/chunk-VQVEPJSA.js.map +0 -7
- package/dist/react/chunk-XFL4R5ZF.js.map +0 -7
- /package/dist/react/{Circle-6POZCUZD.js.map → Circle-HMM5PKJ2.js.map} +0 -0
- /package/dist/react/{Frame-7D2MXCFF.js.map → Frame-QEUEYITT.js.map} +0 -0
- /package/dist/react/{FreehandStroke-U6GYZOM4.js.map → FreehandStroke-WXIJKD5I.js.map} +0 -0
- /package/dist/react/{IconShape-ZADX7Y33.js.map → IconShape-NHJE4YBY.js.map} +0 -0
- /package/dist/react/{ImageShape-UJQN2HI7.js.map → ImageShape-33VCMSDP.js.map} +0 -0
- /package/dist/react/{Line-APEULMHE.js.map → Line-A6FE232Q.js.map} +0 -0
- /package/dist/react/{MermaidSequenceParser-UKG2NSZY.js.map → MermaidSequenceParser-DBYXW23P.js.map} +0 -0
- /package/dist/react/{Rectangle-S7XUKWYD.js.map → Rectangle-4U4CD2ER.js.map} +0 -0
- /package/dist/react/{Selection-2TSH3J6P.js.map → Selection-23MOLHEI.js.map} +0 -0
- /package/dist/react/{SketchEngine-UD2XV2KT.js.map → SketchEngine-OPJON7TD.js.map} +0 -0
- /package/dist/react/{UndoRedo-IN4SXDG6.js.map → UndoRedo-QVNRI5OB.js.map} +0 -0
- /package/dist/react/{arrowTool-OYDWJGQK.js.map → arrowTool-VH3PJPDM.js.map} +0 -0
- /package/dist/react/{chunk-LSHZYN77.js.map → chunk-2DZHO67H.js.map} +0 -0
- /package/dist/react/{chunk-XOWNCYE4.js.map → chunk-5NHJJJBZ.js.map} +0 -0
- /package/dist/react/{chunk-ASBC5G35.js.map → chunk-B6CYUZC4.js.map} +0 -0
- /package/dist/react/{chunk-OP56XPWF.js.map → chunk-DNFPTVIP.js.map} +0 -0
- /package/dist/react/{chunk-XYUFEIZR.js.map → chunk-DWEFPKDO.js.map} +0 -0
- /package/dist/react/{chunk-GQUZPON4.js.map → chunk-F56XUE5S.js.map} +0 -0
- /package/dist/react/{chunk-LJR7EVW2.js.map → chunk-JEGLUNBC.js.map} +0 -0
- /package/dist/react/{chunk-APTOPAOY.js.map → chunk-SSFEN5CY.js.map} +0 -0
- /package/dist/react/{chunk-RGMDWLRJ.js.map → chunk-UEL2G6D2.js.map} +0 -0
- /package/dist/react/{chunk-M6TMN76K.js.map → chunk-ULPIHUVC.js.map} +0 -0
- /package/dist/react/{chunk-EOURRJ55.js.map → chunk-XSE4HQ2D.js.map} +0 -0
- /package/dist/react/{circleTool-LDKGZALF.js.map → circleTool-2UODOBCV.js.map} +0 -0
- /package/dist/react/{codeTool-4YZO5W7J.js.map → codeTool-F4RV7SAI.js.map} +0 -0
- /package/dist/react/{frameTool-MXNJEXQQ.js.map → frameTool-NTGA5BI6.js.map} +0 -0
- /package/dist/react/{freehandTool-26D3FOOX.js.map → freehandTool-L55EUB5C.js.map} +0 -0
- /package/dist/react/{iconTool-46O5VEUX.js.map → iconTool-KQQBLGR3.js.map} +0 -0
- /package/dist/react/{imageTool-P2RWZRHO.js.map → imageTool-LDJ45AD7.js.map} +0 -0
- /package/dist/react/{lineTool-ZMR27U5L.js.map → lineTool-CSAFD7PW.js.map} +0 -0
- /package/dist/react/{rectangleTool-EJKK6UTX.js.map → rectangleTool-YPD2SIIZ.js.map} +0 -0
- /package/dist/react/{textTool-S4XXZHZH.js.map → textTool-VQHMWEFJ.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/GraphRenderer.js", "../../src/core/GraphEngine.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n/**\n * GraphRenderer - Renders mathematical equations as SVG graphs.\n * Produces axes, grid, tick labels, and equation curves.\n */\n\nimport { parseExpression } from './GraphMathParser.js';\n\nconst GRAPH_COLORS = [\n '#4A90D9', '#E74C3C', '#2ECC71', '#F39C12', '#9B59B6',\n '#1ABC9C', '#E67E22', '#3498DB', '#E91E63', '#00BCD4',\n];\n\n// Issue #38 follow-up: theme-aware graph chrome. Light mode flips every\n// hardcoded `rgba(255,255,255,X)` token (designed for dark canvas) to a\n// matching `rgba(60,60,80,X)` so the grid, axes, plot border, and tick\n// labels stay readable on the warm off-white canvas. The equation\n// curves themselves keep their colours from GRAPH_COLORS.\nfunction graphThemeTokens() {\n const isDark = typeof document !== 'undefined'\n && document.body\n && document.body.classList.contains('theme-dark');\n if (isDark) {\n return {\n outerBg: '#0d1117',\n plotBg: '#111822',\n gridStroke:'rgba(255,255,255,0.06)',\n axisStroke:'rgba(255,255,255,0.25)',\n borderStroke:'rgba(255,255,255,0.1)',\n tickLabel: '#8b949e',\n };\n }\n return {\n outerBg: '#fbfaf6',\n plotBg: '#ffffff',\n gridStroke:'rgba(60,60,80,0.08)',\n axisStroke:'rgba(60,60,80,0.35)',\n borderStroke:'rgba(60,60,80,0.16)',\n tickLabel: '#62627a',\n };\n}\n\n/**\n * Calculate nice tick intervals for a given range.\n */\nfunction niceInterval(range) {\n const rough = range / 8;\n const mag = Math.pow(10, Math.floor(Math.log10(rough)));\n const residual = rough / mag;\n let nice;\n if (residual <= 1.5) nice = 1;\n else if (residual <= 3) nice = 2;\n else if (residual <= 7) nice = 5;\n else nice = 10;\n return nice * mag;\n}\n\n/**\n * Render graph as SVG markup string.\n * @param {Array} equations - [{expression: string, color: string}]\n * @param {Object} settings - {xMin, xMax, yMin, yMax, showGrid, width, height}\n * @returns {string} SVG markup\n */\nexport function renderGraphSVG(equations, settings) {\n const {\n xMin = -10, xMax = 10,\n yMin = -10, yMax = 10,\n showGrid = true,\n width = 600, height = 400,\n } = settings || {};\n\n const pad = { top: 20, right: 20, bottom: 35, left: 45 };\n const plotW = width - pad.left - pad.right;\n const plotH = height - pad.top - pad.bottom;\n const xRange = xMax - xMin || 1;\n const yRange = yMax - yMin || 1;\n\n // Coordinate transforms\n const toSvgX = (x) => pad.left + ((x - xMin) / xRange) * plotW;\n const toSvgY = (y) => pad.top + ((yMax - y) / yRange) * plotH;\n\n let svg = '';\n const tk = graphThemeTokens();\n\n // Background\n svg += `<rect x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\" fill=\"${tk.outerBg}\" rx=\"8\" />`;\n svg += `<rect x=\"${pad.left}\" y=\"${pad.top}\" width=\"${plotW}\" height=\"${plotH}\" fill=\"${tk.plotBg}\" />`;\n\n // Grid & ticks\n const xTick = niceInterval(xRange);\n const yTick = niceInterval(yRange);\n\n // Vertical grid lines + x labels\n const xStart = Math.ceil(xMin / xTick) * xTick;\n for (let x = xStart; x <= xMax; x += xTick) {\n const sx = toSvgX(x);\n if (sx < pad.left || sx > pad.left + plotW) continue;\n if (showGrid) {\n svg += `<line x1=\"${sx}\" y1=\"${pad.top}\" x2=\"${sx}\" y2=\"${pad.top + plotH}\" stroke=\"${tk.gridStroke}\" stroke-width=\"0.5\" />`;\n }\n const label = Math.abs(x) < 1e-10 ? '0' : (Number.isInteger(x) ? x : x.toFixed(1));\n svg += `<text x=\"${sx}\" y=\"${pad.top + plotH + 16}\" text-anchor=\"middle\" fill=\"${tk.tickLabel}\" font-size=\"10\" font-family=\"lixCode, monospace\">${label}</text>`;\n }\n\n // Horizontal grid lines + y labels\n const yStart = Math.ceil(yMin / yTick) * yTick;\n for (let y = yStart; y <= yMax; y += yTick) {\n const sy = toSvgY(y);\n if (sy < pad.top || sy > pad.top + plotH) continue;\n if (showGrid) {\n svg += `<line x1=\"${pad.left}\" y1=\"${sy}\" x2=\"${pad.left + plotW}\" y2=\"${sy}\" stroke=\"${tk.gridStroke}\" stroke-width=\"0.5\" />`;\n }\n const label = Math.abs(y) < 1e-10 ? '0' : (Number.isInteger(y) ? y : y.toFixed(1));\n svg += `<text x=\"${pad.left - 8}\" y=\"${sy + 3}\" text-anchor=\"end\" fill=\"${tk.tickLabel}\" font-size=\"10\" font-family=\"lixCode, monospace\">${label}</text>`;\n }\n\n // Axes\n if (xMin <= 0 && xMax >= 0) {\n const ax = toSvgX(0);\n svg += `<line x1=\"${ax}\" y1=\"${pad.top}\" x2=\"${ax}\" y2=\"${pad.top + plotH}\" stroke=\"${tk.axisStroke}\" stroke-width=\"1\" />`;\n }\n if (yMin <= 0 && yMax >= 0) {\n const ay = toSvgY(0);\n svg += `<line x1=\"${pad.left}\" y1=\"${ay}\" x2=\"${pad.left + plotW}\" y2=\"${ay}\" stroke=\"${tk.axisStroke}\" stroke-width=\"1\" />`;\n }\n\n // Plot border\n svg += `<rect x=\"${pad.left}\" y=\"${pad.top}\" width=\"${plotW}\" height=\"${plotH}\" fill=\"none\" stroke=\"${tk.borderStroke}\" stroke-width=\"1\" />`;\n\n // Equations\n const samplesPerPixel = 2;\n const totalSamples = plotW * samplesPerPixel;\n const dx = xRange / totalSamples;\n\n equations.forEach((eq, eqIdx) => {\n if (!eq.expression || !eq.expression.trim()) return;\n\n const fn = parseExpression(eq.expression);\n if (!fn) return;\n\n const color = eq.color || GRAPH_COLORS[eqIdx % GRAPH_COLORS.length];\n let pathData = '';\n let drawing = false;\n\n for (let i = 0; i <= totalSamples; i++) {\n const x = xMin + i * dx;\n let y;\n try { y = fn(x); } catch { y = NaN; }\n\n if (!isFinite(y) || isNaN(y) || y < yMin - yRange * 5 || y > yMax + yRange * 5) {\n drawing = false;\n continue;\n }\n\n // Clamp to plot area for rendering\n const clampedY = Math.max(yMin - yRange * 0.5, Math.min(yMax + yRange * 0.5, y));\n const sx = toSvgX(x);\n const sy = toSvgY(clampedY);\n\n if (!drawing) {\n pathData += `M ${sx.toFixed(1)} ${sy.toFixed(1)} `;\n drawing = true;\n } else {\n pathData += `L ${sx.toFixed(1)} ${sy.toFixed(1)} `;\n }\n }\n\n if (pathData) {\n svg += `<path d=\"${pathData.trim()}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`;\n }\n });\n\n // Clip path for plot area\n const clipId = 'graph-clip-' + Date.now();\n const defs = `<defs><clipPath id=\"${clipId}\"><rect x=\"${pad.left}\" y=\"${pad.top}\" width=\"${plotW}\" height=\"${plotH}\" /></clipPath></defs>`;\n\n // Re-wrap: curves should be clipped\n // Rebuild with clip group\n let curves = '';\n equations.forEach((eq, eqIdx) => {\n if (!eq.expression || !eq.expression.trim()) return;\n const fn = parseExpression(eq.expression);\n if (!fn) return;\n\n const color = eq.color || GRAPH_COLORS[eqIdx % GRAPH_COLORS.length];\n let pathData = '';\n let drawing = false;\n\n for (let i = 0; i <= totalSamples; i++) {\n const x = xMin + i * dx;\n let y;\n try { y = fn(x); } catch { y = NaN; }\n\n if (!isFinite(y) || isNaN(y)) { drawing = false; continue; }\n\n const sx = toSvgX(x);\n const sy = toSvgY(y);\n\n if (!drawing) {\n pathData += `M ${sx.toFixed(1)} ${sy.toFixed(1)} `;\n drawing = true;\n } else {\n pathData += `L ${sx.toFixed(1)} ${sy.toFixed(1)} `;\n }\n }\n\n if (pathData) {\n curves += `<path d=\"${pathData.trim()}\" fill=\"none\" stroke=\"${color}\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />`;\n }\n });\n\n // Equation legend\n let legendY = pad.top + 12;\n let legend = '';\n equations.forEach((eq, eqIdx) => {\n if (!eq.expression || !eq.expression.trim()) return;\n const color = eq.color || GRAPH_COLORS[eqIdx % GRAPH_COLORS.length];\n legend += `<circle cx=\"${pad.left + 12}\" cy=\"${legendY}\" r=\"4\" fill=\"${color}\" />`;\n legend += `<text x=\"${pad.left + 22}\" y=\"${legendY + 3}\" fill=\"${color}\" font-size=\"11\" font-family=\"lixCode, monospace\">${escapeXml(eq.expression)}</text>`;\n legendY += 18;\n });\n\n // Remove the non-clipped curves from svg (we added them above for building)\n // Rebuild cleanly\n let cleanSvg = '';\n cleanSvg += `<rect x=\"0\" y=\"0\" width=\"${width}\" height=\"${height}\" fill=\"${tk.outerBg}\" rx=\"8\" />`;\n cleanSvg += `<rect x=\"${pad.left}\" y=\"${pad.top}\" width=\"${plotW}\" height=\"${plotH}\" fill=\"${tk.plotBg}\" />`;\n\n // Grid + ticks (re-add)\n for (let x = xStart; x <= xMax; x += xTick) {\n const sx = toSvgX(x);\n if (sx < pad.left || sx > pad.left + plotW) continue;\n if (showGrid) {\n cleanSvg += `<line x1=\"${sx}\" y1=\"${pad.top}\" x2=\"${sx}\" y2=\"${pad.top + plotH}\" stroke=\"${tk.gridStroke}\" stroke-width=\"0.5\" />`;\n }\n const label = Math.abs(x) < 1e-10 ? '0' : (Number.isInteger(x) ? x : x.toFixed(1));\n cleanSvg += `<text x=\"${sx}\" y=\"${pad.top + plotH + 16}\" text-anchor=\"middle\" fill=\"${tk.tickLabel}\" font-size=\"10\" font-family=\"lixCode, monospace\">${label}</text>`;\n }\n for (let y = yStart; y <= yMax; y += yTick) {\n const sy = toSvgY(y);\n if (sy < pad.top || sy > pad.top + plotH) continue;\n if (showGrid) {\n cleanSvg += `<line x1=\"${pad.left}\" y1=\"${sy}\" x2=\"${pad.left + plotW}\" y2=\"${sy}\" stroke=\"${tk.gridStroke}\" stroke-width=\"0.5\" />`;\n }\n const label = Math.abs(y) < 1e-10 ? '0' : (Number.isInteger(y) ? y : y.toFixed(1));\n cleanSvg += `<text x=\"${pad.left - 8}\" y=\"${sy + 3}\" text-anchor=\"end\" fill=\"${tk.tickLabel}\" font-size=\"10\" font-family=\"lixCode, monospace\">${label}</text>`;\n }\n // Axes\n if (xMin <= 0 && xMax >= 0) {\n const ax = toSvgX(0);\n cleanSvg += `<line x1=\"${ax}\" y1=\"${pad.top}\" x2=\"${ax}\" y2=\"${pad.top + plotH}\" stroke=\"${tk.axisStroke}\" stroke-width=\"1\" />`;\n }\n if (yMin <= 0 && yMax >= 0) {\n const ay = toSvgY(0);\n cleanSvg += `<line x1=\"${pad.left}\" y1=\"${ay}\" x2=\"${pad.left + plotW}\" y2=\"${ay}\" stroke=\"${tk.axisStroke}\" stroke-width=\"1\" />`;\n }\n // Plot border\n cleanSvg += `<rect x=\"${pad.left}\" y=\"${pad.top}\" width=\"${plotW}\" height=\"${plotH}\" fill=\"none\" stroke=\"${tk.borderStroke}\" stroke-width=\"1\" />`;\n\n // Clipped curves\n cleanSvg += `<g clip-path=\"url(#${clipId})\">${curves}</g>`;\n\n // Legend\n cleanSvg += legend;\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${width}\" height=\"${height}\" viewBox=\"0 0 ${width} ${height}\">${defs}${cleanSvg}</svg>`;\n}\n\n/**\n * Generate a preview SVG for the modal.\n */\nexport function renderGraphPreviewSVG(equations, settings) {\n return renderGraphSVG(equations, {\n ...settings,\n width: 520,\n height: 380,\n });\n}\n\nfunction escapeXml(str) {\n return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"');\n}\n\nexport { GRAPH_COLORS };\n", "/* eslint-disable */\n/**\n * GraphEngine - bridge between graph rendering and the sketch canvas.\n *\n * Canvas graphs use ImageShape with an SVG data URL. This keeps the graph a\n * single crisp vector element while reusing the engine's established select,\n * translate, resize, rotate, copy/paste, and frame-containment behaviour.\n */\n\nimport { parseExpression, isValidExpression } from './GraphMathParser.js';\nimport { renderGraphSVG, renderGraphPreviewSVG, GRAPH_COLORS } from './GraphRenderer.js';\n\nconst NS = 'http://www.w3.org/2000/svg';\nconst GRAPH_WIDTH = 600;\nconst GRAPH_HEIGHT = 420;\nconst MAX_PLACED_SCREEN_WIDTH = 480;\nconst MAX_VIEWPORT_WIDTH_RATIO = 0.68;\nconst MAX_VIEWPORT_HEIGHT_RATIO = 0.58;\n\nfunction cloneGraphData(equations, settings) {\n return {\n equations: (equations || []).map((equation) => ({\n expression: equation.expression,\n color: equation.color,\n })),\n settings: { ...(settings || {}) },\n };\n}\n\nfunction graphSvgDataUrl(svgMarkup) {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svgMarkup)}`;\n}\n\nfunction refreshGraphImage(shape) {\n if (!shape?._graphData || !shape.element) return false;\n const svgMarkup = renderGraphSVG(shape._graphData.equations, {\n ...shape._graphData.settings,\n width: GRAPH_WIDTH,\n height: GRAPH_HEIGHT,\n });\n if (!svgMarkup) return false;\n const href = graphSvgDataUrl(svgMarkup);\n shape.element.setAttribute('href', href);\n shape.element.setAttribute('data-href', href);\n return true;\n}\n\n/** Attach graph behaviour to a regular ImageShape, including restored and\n * pasted graphs. The function is intentionally idempotent. */\nfunction hydrateGraphShape(shape, graphData) {\n if (!shape?.element || !graphData) return shape;\n shape._frameType = 'graph';\n shape._graphData = cloneGraphData(graphData.equations, graphData.settings);\n shape.uploadStatus = 'done';\n shape.element.setAttribute('data-graph-shape', 'true');\n shape.element.setAttribute('preserveAspectRatio', 'none');\n shape.element.style.cursor = 'move';\n shape._refreshGraphImage = () => refreshGraphImage(shape);\n shape.adaptToBackground = () => refreshGraphImage(shape);\n return shape;\n}\n\nfunction selectOnlyGraph(shape) {\n if (!shape) return;\n\n if (window.multiSelection?.selectedShapes?.size) {\n window.multiSelection.clearSelection();\n }\n if (window.currentShape && window.currentShape !== shape\n && typeof window.currentShape.removeSelection === 'function') {\n window.currentShape.removeSelection();\n }\n\n // Generated content always lands ready to manipulate. Use the store bridge\n // so the toolbar and legacy engine flags change together.\n window.__sketchStoreApi?.setActiveTool?.('select');\n window.currentShape = shape;\n shape.selectShape?.();\n}\n\nfunction placedGraphSize(viewBox) {\n const zoom = Math.max(0.001, Number(window.currentZoom) || 1);\n const byScreen = MAX_PLACED_SCREEN_WIDTH / zoom;\n const byViewportWidth = viewBox.width * MAX_VIEWPORT_WIDTH_RATIO;\n const byViewportHeight = viewBox.height * MAX_VIEWPORT_HEIGHT_RATIO * (GRAPH_WIDTH / GRAPH_HEIGHT);\n const width = Math.max(80 / zoom, Math.min(GRAPH_WIDTH, byScreen, byViewportWidth, byViewportHeight));\n return { width, height: width * (GRAPH_HEIGHT / GRAPH_WIDTH) };\n}\n\n/**\n * Place a graph as one editable vector-image shape, or update an existing\n * graph in place without losing its canvas position, size, or rotation.\n */\nfunction renderGraphOnCanvas(equations, settings, existingShape = null) {\n const validEquations = (equations || []).filter((equation) => equation?.expression?.trim());\n if (validEquations.length === 0) return false;\n if (!window.svg || !window.ImageShape) {\n console.error('[GraphEngine] Engine not initialized');\n return false;\n }\n\n const graphData = cloneGraphData(validEquations, settings);\n\n if (existingShape?._frameType === 'graph' && existingShape.element) {\n hydrateGraphShape(existingShape, graphData);\n if (!refreshGraphImage(existingShape)) return false;\n selectOnlyGraph(existingShape);\n window.__adaptCanvasContrast?.(\n window.getComputedStyle(window.svg).backgroundColor || '#15111f'\n );\n return true;\n }\n\n const viewBox = window.currentViewBox || {\n x: 0,\n y: 0,\n width: window.innerWidth,\n height: window.innerHeight,\n };\n const size = placedGraphSize(viewBox);\n const x = viewBox.x + (viewBox.width - size.width) / 2;\n const y = viewBox.y + (viewBox.height - size.height) / 2;\n\n try {\n const image = document.createElementNS(NS, 'image');\n image.setAttribute('x', x);\n image.setAttribute('y', y);\n image.setAttribute('width', size.width);\n image.setAttribute('height', size.height);\n image.setAttribute('data-shape-x', x);\n image.setAttribute('data-shape-y', y);\n image.setAttribute('data-shape-width', size.width);\n image.setAttribute('data-shape-height', size.height);\n\n const graphShape = hydrateGraphShape(new window.ImageShape(image), graphData);\n if (!refreshGraphImage(graphShape)) {\n graphShape.group?.remove();\n return false;\n }\n\n window.shapes.push(graphShape);\n window.pushCreateAction?.(graphShape);\n selectOnlyGraph(graphShape);\n window.__adaptCanvasContrast?.(\n window.getComputedStyle(window.svg).backgroundColor || '#15111f'\n );\n return true;\n } catch (error) {\n console.error('[GraphEngine] SVG insertion failed:', error);\n return false;\n }\n}\n\n/** Initialize graph bridges used by the modal and scene restoration. */\nexport function initGraphEngine() {\n window.__graphPreview = (equations, settings) => renderGraphPreviewSVG(equations, settings);\n window.__graphRenderer = renderGraphOnCanvas;\n window.__hydrateGraphShape = hydrateGraphShape;\n window.__graphParser = (expression) => Boolean(parseExpression(expression));\n window.__graphValidate = isValidExpression;\n window.__graphColors = GRAPH_COLORS;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/core/LixScriptParser.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n/**\n * LixScript \u2014 Programmatic diagram DSL for LixSketch\n *\n * Parses a text-based language into canvas shapes with full control over\n * properties, positions, connections, and grouping.\n *\n * Usage:\n * const result = parseLixScript(source)\n * if (result.errors.length) { ... }\n * renderLixScript(result)\n */\n\nconst NS = 'http://www.w3.org/2000/svg'\n\n// ============================================================\n// TOKENIZER\n// ============================================================\n\n/**\n * Tokenize a LixScript source string into a flat list of tokens.\n * Each token: { type, value, line }\n */\nfunction tokenize(source) {\n const tokens = []\n const lines = source.split('\\n')\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i]\n const lineNum = i + 1\n\n // Strip comments\n const commentIdx = raw.indexOf('//')\n const line = commentIdx !== -1 ? raw.slice(0, commentIdx) : raw\n const trimmed = line.trim()\n if (!trimmed) continue\n\n tokens.push({ type: 'LINE', value: trimmed, line: lineNum })\n }\n\n return tokens\n}\n\n// ============================================================\n// PARSER\n// ============================================================\n\n/**\n * Parse LixScript source into an AST.\n * Returns { variables, shapes, errors }\n */\nexport function parseLixScript(source) {\n const tokens = tokenize(source)\n const variables = {}\n const shapes = []\n const errors = []\n\n let i = 0\n\n while (i < tokens.length) {\n const token = tokens[i]\n const line = token.value\n const lineNum = token.line\n\n try {\n // Variable assignment: $name = value\n if (line.startsWith('$')) {\n const match = line.match(/^\\$(\\w+)\\s*=\\s*(.+)$/)\n if (match) {\n variables[match[1]] = match[2].trim()\n } else {\n errors.push({ line: lineNum, message: `Invalid variable syntax: ${line}` })\n }\n i++\n continue\n }\n\n // Shape declarations\n const shapeMatch = line.match(/^(rect|circle|ellipse|arrow|line|text|frame|freehand|image|icon)\\s+(\\w+)\\s+(.+)$/)\n if (shapeMatch) {\n const [, type, id, rest] = shapeMatch\n const shape = parseShapeDeclaration(type, id, rest, lineNum, errors, variables)\n\n // Check for property block { ... }\n if (rest.includes('{') && !rest.includes('}')) {\n // Multi-line property block \u2014 consume lines until closing }\n i++\n const props = []\n while (i < tokens.length && !tokens[i].value.startsWith('}')) {\n props.push(tokens[i].value)\n i++\n }\n if (i < tokens.length) i++ // skip closing }\n parseProperties(shape, props, variables, errors)\n } else if (rest.includes('{') && rest.includes('}')) {\n // Inline property block\n const blockMatch = rest.match(/\\{([^}]*)\\}/)\n if (blockMatch) {\n const props = blockMatch[1].split(/[,;]/).map(s => s.trim()).filter(Boolean)\n parseProperties(shape, props, variables, errors)\n }\n i++ // advance past this single line\n } else {\n // No property block\n i++\n }\n\n shapes.push(shape)\n continue\n }\n\n errors.push({ line: lineNum, message: `Unrecognized syntax: ${line}` })\n i++\n } catch (err) {\n errors.push({ line: lineNum, message: err.message })\n i++\n }\n }\n\n return { variables, shapes, errors }\n}\n\n/**\n * Parse the declaration part (after type and id) of a shape.\n */\nfunction parseShapeDeclaration(type, id, rest, lineNum, errors, variables) {\n const shape = { type, id, line: lineNum, props: {} }\n\n // Extract position: at X, Y or from ... to ...\n if (type === 'arrow' || type === 'line') {\n // from source[.side] to target[.side]\n // from X, Y to X, Y\n const connMatch = rest.match(/from\\s+(.+?)\\s+to\\s+(.+?)(?:\\s*\\{|$)/)\n if (connMatch) {\n shape.from = parsePointOrRef(connMatch[1].trim(), variables)\n shape.to = parsePointOrRef(connMatch[2].trim(), variables)\n } else {\n errors.push({ line: lineNum, message: `${type} requires 'from ... to ...' syntax` })\n }\n } else {\n // at X, Y\n const atMatch = rest.match(/at\\s+([\\w$.+\\-*\\s]+?),\\s*([\\w$.+\\-*\\s]+?)(?:\\s+size|\\s*\\{|$)/)\n if (atMatch) {\n shape.x = parseExpr(atMatch[1].trim(), variables)\n shape.y = parseExpr(atMatch[2].trim(), variables)\n } else if (type !== 'frame') {\n errors.push({ line: lineNum, message: `${type} requires 'at X, Y' syntax` })\n }\n\n // size WxH\n const sizeMatch = rest.match(/size\\s+([\\w$.+\\-*]+)\\s*x\\s*([\\w$.+\\-*]+)/)\n if (sizeMatch) {\n shape.width = parseExpr(sizeMatch[1].trim(), variables)\n shape.height = parseExpr(sizeMatch[2].trim(), variables)\n }\n }\n\n return shape\n}\n\n/**\n * Parse a point reference \u2014 either a coordinate pair \"X, Y\" or\n * a shape reference \"shapeId.side\" or \"shapeId.side + offset\"\n */\nfunction parsePointOrRef(str, variables) {\n // shapeId.side [+/- offset]\n const refMatch = str.match(/^(\\w+)\\.(\\w+)(?:\\s*([+-])\\s*([\\d.]+))?$/)\n if (refMatch) {\n return {\n ref: refMatch[1],\n side: refMatch[2],\n offset: refMatch[3] ? parseFloat((refMatch[3] === '-' ? '-' : '') + refMatch[4]) : 0,\n }\n }\n\n // X, Y coordinate pair\n const coordMatch = str.match(/^([\\d.]+)\\s*,?\\s*([\\d.]+)$/)\n if (coordMatch) {\n return { x: parseFloat(coordMatch[1]), y: parseFloat(coordMatch[2]) }\n }\n\n // Just a shape reference (center)\n if (/^\\w+$/.test(str)) {\n return { ref: str, side: 'center', offset: 0 }\n }\n\n return { x: 0, y: 0 }\n}\n\n/**\n * Parse a numeric expression, resolving variables.\n * Supports: numbers, $var, shapeId.prop, simple +/- arithmetic\n */\nfunction parseExpr(str, variables) {\n // Replace $variables\n let resolved = str.replace(/\\$(\\w+)/g, (_, name) => {\n return variables[name] !== undefined ? variables[name] : '0'\n })\n\n // If it's a simple number, return it\n const num = parseFloat(resolved)\n if (!isNaN(num) && String(num) === resolved.trim()) {\n return num\n }\n\n // If it contains a shape reference like shapeId.prop, return as deferred\n if (/\\w+\\.\\w+/.test(resolved)) {\n return { expr: resolved }\n }\n\n // Try simple arithmetic (A + B, A - B)\n const arithMatch = resolved.match(/^([\\d.]+)\\s*([+-])\\s*([\\d.]+)$/)\n if (arithMatch) {\n const a = parseFloat(arithMatch[1])\n const b = parseFloat(arithMatch[3])\n return arithMatch[2] === '+' ? a + b : a - b\n }\n\n return isNaN(num) ? 0 : num\n}\n\n/**\n * Parse property lines into shape.props\n */\nfunction parseProperties(shape, lines, variables, errors) {\n for (const line of lines) {\n const propMatch = line.match(/^(\\w+)\\s*:\\s*(.+)$/)\n if (!propMatch) continue\n\n let [, key, value] = propMatch\n value = value.trim()\n\n // Strip quotes from string values\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1)\n }\n\n // Resolve variables\n value = value.replace(/\\$(\\w+)/g, (_, name) => {\n return variables[name] !== undefined ? variables[name] : value\n })\n\n // Parse numeric values\n const num = parseFloat(value)\n if (!isNaN(num) && String(num) === value) {\n shape.props[key] = num\n } else if (value === 'true') {\n shape.props[key] = true\n } else if (value === 'false') {\n shape.props[key] = false\n } else {\n shape.props[key] = value\n }\n }\n}\n\n// ============================================================\n// RESOLVER \u2014 resolve deferred expressions & shape references\n// ============================================================\n\nexport function resolveShapeRefs(shapes) {\n const shapeMap = new Map()\n\n // Iteratively resolve deferred expressions until no more progress\n // This handles chained references like: A(absolute) \u2192 B(refs A) \u2192 C(refs B) \u2192 D(refs C)\n const MAX_PASSES = 10\n for (let pass = 0; pass < MAX_PASSES; pass++) {\n let progress = false\n\n // Collect all shapes with known (numeric) positions\n for (const s of shapes) {\n if (typeof s.x === 'number' && typeof s.y === 'number' && !shapeMap.has(s.id)) {\n shapeMap.set(s.id, s)\n progress = true\n }\n }\n\n // Try to resolve any remaining deferred expressions\n let anyUnresolved = false\n for (const s of shapes) {\n if (s.x && typeof s.x === 'object' && s.x.expr) {\n const resolved = resolveExpr(s.x.expr, shapeMap)\n if (typeof resolved === 'number' && !isNaN(resolved)) {\n s.x = resolved\n progress = true\n } else {\n anyUnresolved = true\n }\n }\n if (s.y && typeof s.y === 'object' && s.y.expr) {\n const resolved = resolveExpr(s.y.expr, shapeMap)\n if (typeof resolved === 'number' && !isNaN(resolved)) {\n s.y = resolved\n progress = true\n } else {\n anyUnresolved = true\n }\n }\n }\n\n if (!anyUnresolved || !progress) break\n }\n\n // Final fallback: force-resolve any remaining deferred expressions to 0\n for (const s of shapes) {\n if (s.x && typeof s.x === 'object' && s.x.expr) s.x = 0\n if (s.y && typeof s.y === 'object' && s.y.expr) s.y = 0\n }\n}\n\nfunction resolveExpr(expr, shapeMap) {\n // Match: shapeId.prop [+/- offset]\n const m = expr.match(/^(\\w+)\\.(\\w+)(?:\\s*([+-])\\s*([\\d.]+))?$/)\n if (!m) return NaN\n\n const [, ref, prop, op, offsetStr] = m\n const shape = shapeMap.get(ref)\n if (!shape) return NaN\n\n let val = 0\n switch (prop) {\n case 'x': val = shape.x || 0; break\n case 'y': val = shape.y || 0; break\n case 'right': val = (shape.x || 0) + (shape.width || 0); break\n case 'left': val = shape.x || 0; break\n case 'top': val = shape.y || 0; break\n case 'bottom': val = (shape.y || 0) + (shape.height || 0); break\n case 'centerX': val = (shape.x || 0) + (shape.width || 0) / 2; break\n case 'centerY': val = (shape.y || 0) + (shape.height || 0) / 2; break\n case 'width': val = shape.width || 0; break\n case 'height': val = shape.height || 0; break\n default: val = 0\n }\n\n const offset = offsetStr ? parseFloat(offsetStr) : 0\n return op === '-' ? val - offset : val + offset\n}\n\n// ============================================================\n// RENDERER \u2014 create actual canvas shapes from parsed AST\n// ============================================================\n\n/**\n * Render a parsed LixScript AST onto the canvas.\n * Returns { success, shapesCreated, errors }\n */\nexport function renderLixScript(parsed) {\n const { shapes: shapeDefs, errors } = parsed\n if (errors.length > 0) {\n return { success: false, shapesCreated: 0, errors }\n }\n\n // Resolve relative references\n resolveShapeRefs(shapeDefs)\n\n const svg = window.svg\n if (!svg) {\n return { success: false, shapesCreated: 0, errors: [{ line: 0, message: 'Canvas not initialized' }] }\n }\n\n const createdShapes = new Map() // id -> { instance, def }\n const renderErrors = []\n\n // Check if user defined a frame \u2014 if not, we auto-create one\n const userFrameDef = shapeDefs.find(s => s.type === 'frame')\n let frame = null\n let frameDef = userFrameDef\n\n if (userFrameDef) {\n // User-defined frame\n frame = createFrame(userFrameDef, renderErrors)\n if (frame) {\n createdShapes.set(userFrameDef.id, { instance: frame, def: userFrameDef })\n }\n }\n\n // Create non-connection shapes first (rect, circle, text)\n for (const def of shapeDefs) {\n if (def.type === 'frame') continue // already created\n if (def.type === 'arrow' || def.type === 'line') continue // deferred\n\n const instance = createShape(def, renderErrors)\n if (instance) {\n createdShapes.set(def.id, { instance, def })\n }\n }\n\n // Create connections (arrows, lines) \u2014 now that source/target shapes exist\n for (const def of shapeDefs) {\n if (def.type !== 'arrow' && def.type !== 'line') continue\n\n const instance = createConnection(def, createdShapes, renderErrors)\n if (instance) {\n createdShapes.set(def.id, { instance, def })\n }\n }\n\n // Auto-create wrapping frame if user didn't define one\n if (!frame && createdShapes.size > 0) {\n // Calculate bounds from all created shapes\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\n for (const [, { instance, def }] of createdShapes) {\n if (def.type === 'arrow' || def.type === 'line') {\n // Use the actual instance start/end coordinates\n const from = resolveConnectionPoint(def.from, createdShapes)\n const to = resolveConnectionPoint(def.to, createdShapes)\n if (from) { minX = Math.min(minX, from.x); minY = Math.min(minY, from.y); maxX = Math.max(maxX, from.x); maxY = Math.max(maxY, from.y) }\n if (to) { minX = Math.min(minX, to.x); minY = Math.min(minY, to.y); maxX = Math.max(maxX, to.x); maxY = Math.max(maxY, to.y) }\n } else if (def.type !== 'frame') {\n const x = def.x || 0\n const y = def.y || 0\n const w = def.width || 160\n const h = def.height || 60\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x + w)\n maxY = Math.max(maxY, y + h)\n }\n }\n\n if (isFinite(minX)) {\n const pad = 40\n const autoFrameDef = {\n type: 'frame',\n id: '_lixscript_auto_frame',\n line: 0,\n x: minX - pad,\n y: minY - pad,\n width: (maxX - minX) + pad * 2,\n height: (maxY - minY) + pad * 2,\n props: { name: 'LixScript' }\n }\n frameDef = autoFrameDef\n frame = createFrame(autoFrameDef, renderErrors)\n if (frame) {\n createdShapes.set(autoFrameDef.id, { instance: frame, def: autoFrameDef })\n }\n }\n }\n\n // Add all shapes to frame\n if (frame) {\n for (const [id, { instance, def }] of createdShapes) {\n if (def.type === 'frame') continue // don't add frame to itself\n if (shouldAddToFrame(def, frameDef)) {\n frame.addShapeToFrame(instance)\n }\n }\n }\n\n return {\n success: renderErrors.length === 0,\n shapesCreated: createdShapes.size,\n errors: renderErrors,\n }\n}\n\n/**\n * Check if a shape should be added to the frame based on 'contains' prop.\n */\nfunction shouldAddToFrame(shapeDef, frameDef) {\n if (!frameDef || !frameDef.props.contains) return true // add all by default\n const ids = frameDef.props.contains.split(',').map(s => s.trim())\n return ids.includes(shapeDef.id)\n}\n\n/**\n * Create a Frame instance.\n */\nfunction createFrame(def, errors) {\n const Frame = window.Frame\n if (!Frame) {\n errors.push({ line: def.line, message: 'Frame class not available' })\n return null\n }\n\n try {\n const x = def.x || 0\n const y = def.y || 0\n const w = def.width || 600\n const h = def.height || 400\n\n const frame = new Frame(x, y, w, h, {\n frameName: def.props.frameName || def.props.name || def.id,\n stroke: def.props.stroke || '#555',\n strokeWidth: def.props.strokeWidth || 1,\n fill: def.props.fill || 'transparent',\n fillStyle: def.props.fillStyle || 'transparent',\n fillColor: def.props.fillColor || '#1e1e28',\n opacity: def.props.opacity || 1,\n rotation: def.props.rotation || 0,\n })\n\n window.shapes.push(frame)\n if (window.pushCreateAction) window.pushCreateAction(frame)\n\n // Tag as scripted\n frame._frameType = 'lixscript'\n frame._lixscriptSource = true\n\n // Set image from URL if provided\n if (def.props.imageURL && typeof frame.setImageFromURL === 'function') {\n frame.setImageFromURL(def.props.imageURL, def.props.imageFit || 'cover')\n }\n\n return frame\n } catch (err) {\n errors.push({ line: def.line, message: `Frame creation failed: ${err.message}` })\n return null\n }\n}\n\n/**\n * Create a shape instance from a definition.\n */\nfunction createShape(def, errors) {\n try {\n switch (def.type) {\n case 'rect': return createRect(def, errors)\n case 'circle':\n case 'ellipse': return createCircle(def, errors)\n case 'text': return createText(def, errors)\n case 'freehand': return createFreehand(def, errors)\n case 'image': return createImage(def, errors)\n case 'icon': return createIcon(def, errors)\n default:\n errors.push({ line: def.line, message: `Unknown shape type: ${def.type}` })\n return null\n }\n } catch (err) {\n errors.push({ line: def.line, message: `Shape '${def.id}' failed: ${err.message}` })\n return null\n }\n}\n\n/**\n * Create an image shape from a LixScript definition.\n * Usage: image myImg at 100, 200 size 300x200 { src: \"https://...\" }\n */\nfunction createImage(def, errors) {\n const ImageShape = window.ImageShape\n if (!ImageShape) {\n errors.push({ line: def.line, message: 'ImageShape class not available' })\n return null\n }\n\n const src = def.props.src || def.props.href || def.props.url || ''\n if (!src) {\n errors.push({ line: def.line, message: `Image '${def.id}' requires a src property` })\n return null\n }\n\n const svgEl = document.getElementById('freehand-canvas')\n if (!svgEl) return null\n\n const x = def.x || 0\n const y = def.y || 0\n const w = def.width || 200\n const h = def.height || 200\n\n const imgEl = document.createElementNS('http://www.w3.org/2000/svg', 'image')\n imgEl.setAttribute('href', src)\n imgEl.setAttribute('x', x)\n imgEl.setAttribute('y', y)\n imgEl.setAttribute('width', w)\n imgEl.setAttribute('height', h)\n imgEl.setAttribute('data-shape-x', x)\n imgEl.setAttribute('data-shape-y', y)\n imgEl.setAttribute('data-shape-width', w)\n imgEl.setAttribute('data-shape-height', h)\n imgEl.setAttribute('type', 'image')\n imgEl.setAttribute('preserveAspectRatio', def.props.fit === 'contain' ? 'xMidYMid meet' : def.props.fit === 'cover' ? 'xMidYMid slice' : 'xMidYMid meet')\n\n svgEl.appendChild(imgEl)\n const shape = new ImageShape(imgEl)\n if (def.props.rotation) shape.rotation = parseFloat(def.props.rotation)\n shape.shapeID = def.id || shape.shapeID\n\n window.shapes.push(shape)\n if (window.pushCreateAction) window.pushCreateAction(shape)\n\n return shape\n}\n\n/**\n * Create an icon shape from a LixScript definition.\n * Usage: icon myIcon at 100, 200 size 48x48 { name: \"AWS_Lambda_64\" }\n * or: icon myIcon at 100, 200 size 48x48 { svg: \"<path d='...' />\" }\n */\nfunction createIcon(def, errors) {\n const IconShape = window.IconShape\n if (!IconShape) {\n errors.push({ line: def.line, message: 'IconShape class not available' })\n return null\n }\n\n const svgEl = document.getElementById('freehand-canvas')\n if (!svgEl) return null\n\n const x = def.x || 0\n const y = def.y || 0\n const size = def.width || 48\n const color = def.props.color || def.props.fill || '#ffffff'\n\n // Build the inner SVG content\n let innerSVG = ''\n if (def.props.svg) {\n // Inline SVG path(s)\n innerSVG = def.props.svg\n } else if (def.props.name) {\n // Named icon \u2014 use a simple placeholder circle+text until loaded\n // The AI should provide inline SVG paths for reliability\n innerSVG = `<circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"${color}\" stroke-width=\"1.5\"/><text x=\"12\" y=\"16\" text-anchor=\"middle\" fill=\"${color}\" font-size=\"10\" font-family=\"sans-serif\">${(def.props.name || '?').charAt(0)}</text>`\n } else {\n errors.push({ line: def.line, message: `Icon '${def.id}' requires a name or svg property` })\n return null\n }\n\n const vbWidth = parseFloat(def.props.viewBoxWidth) || 24\n const vbHeight = parseFloat(def.props.viewBoxHeight) || 24\n const scale = size / Math.max(vbWidth, vbHeight)\n const localCenterX = size / 2 / scale\n const localCenterY = size / 2 / scale\n const rotation = def.props.rotation || 0\n\n const iconGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g')\n iconGroup.setAttribute('transform', `translate(${x}, ${y}) scale(${scale}) rotate(${rotation}, ${localCenterX}, ${localCenterY})`)\n iconGroup.setAttribute('data-viewbox-width', vbWidth)\n iconGroup.setAttribute('data-viewbox-height', vbHeight)\n iconGroup.setAttribute('x', x)\n iconGroup.setAttribute('y', y)\n iconGroup.setAttribute('width', size)\n iconGroup.setAttribute('height', size)\n iconGroup.setAttribute('type', 'icon')\n iconGroup.setAttribute('data-shape-x', x)\n iconGroup.setAttribute('data-shape-y', y)\n iconGroup.setAttribute('data-shape-width', size)\n iconGroup.setAttribute('data-shape-height', size)\n iconGroup.setAttribute('data-shape-rotation', rotation)\n iconGroup.setAttribute('style', 'cursor: pointer; pointer-events: all;')\n\n // Transparent hit area\n const bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n bgRect.setAttribute('x', 0)\n bgRect.setAttribute('y', 0)\n bgRect.setAttribute('width', vbWidth)\n bgRect.setAttribute('height', vbHeight)\n bgRect.setAttribute('fill', 'transparent')\n bgRect.setAttribute('stroke', 'none')\n bgRect.setAttribute('style', 'pointer-events: all;')\n iconGroup.appendChild(bgRect)\n\n // Parse and insert SVG content\n const tempSvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n tempSvg.innerHTML = innerSVG\n while (tempSvg.firstChild) {\n const child = tempSvg.firstChild\n // Apply color to paths/circles/etc\n if (child.nodeType === 1) {\n const fill = child.getAttribute('fill')\n const stroke = child.getAttribute('stroke')\n if (!fill || fill === 'currentColor' || fill === '#000' || fill === '#000000' || fill === 'black') {\n child.setAttribute('fill', color)\n }\n if (stroke === 'currentColor' || stroke === '#000' || stroke === '#000000' || stroke === 'black') {\n child.setAttribute('stroke', color)\n }\n }\n iconGroup.appendChild(child)\n }\n\n svgEl.appendChild(iconGroup)\n const shape = new IconShape(iconGroup)\n shape.shapeID = def.id || shape.shapeID\n\n window.shapes.push(shape)\n if (window.pushCreateAction) window.pushCreateAction(shape)\n\n return shape\n}\n\nfunction createRect(def, errors) {\n const Rectangle = window.Rectangle\n if (!Rectangle) {\n errors.push({ line: def.line, message: 'Rectangle class not available' })\n return null\n }\n\n const x = def.x || 0\n const y = def.y || 0\n const w = def.width || 160\n const h = def.height || 60\n\n const rect = new Rectangle(x, y, w, h, {\n stroke: def.props.stroke || '#fff',\n strokeWidth: def.props.strokeWidth || 2,\n fill: def.props.fill || 'transparent',\n fillStyle: def.props.fillStyle || 'none',\n roughness: def.props.roughness !== undefined ? def.props.roughness : 1.5,\n strokeDasharray: resolveStrokeStyle(def.props.style),\n shadeColor: def.props.shadeColor || null,\n shadeOpacity: def.props.shadeOpacity !== undefined ? parseFloat(def.props.shadeOpacity) : 0.15,\n shadeDirection: def.props.shadeDirection || 'bottom',\n })\n\n if (def.props.rotation) rect.rotation = def.props.rotation\n if (def.props.label) {\n rect.setLabel(\n def.props.label,\n def.props.labelColor || '#e0e0e0',\n def.props.labelFontSize || 14\n )\n }\n\n window.shapes.push(rect)\n if (window.pushCreateAction) window.pushCreateAction(rect)\n return rect\n}\n\nfunction createCircle(def, errors) {\n const Circle = window.Circle\n if (!Circle) {\n errors.push({ line: def.line, message: 'Circle class not available' })\n return null\n }\n\n const x = def.x || 0\n const y = def.y || 0\n const w = def.width || 80\n const h = def.height || 80\n\n // Circle constructor uses (x, y, rx, ry) \u2014 center and radii\n const rx = w / 2\n const ry = h / 2\n\n const circle = new Circle(x + rx, y + ry, rx, ry, {\n stroke: def.props.stroke || '#fff',\n strokeWidth: def.props.strokeWidth || 2,\n fill: def.props.fill || 'transparent',\n fillStyle: def.props.fillStyle || 'none',\n roughness: def.props.roughness !== undefined ? def.props.roughness : 1.5,\n strokeDasharray: resolveStrokeStyle(def.props.style),\n shadeColor: def.props.shadeColor || null,\n shadeOpacity: def.props.shadeOpacity !== undefined ? parseFloat(def.props.shadeOpacity) : 0.15,\n shadeDirection: def.props.shadeDirection || 'bottom',\n })\n\n if (def.props.rotation) circle.rotation = def.props.rotation\n if (def.props.label) {\n circle.setLabel(\n def.props.label,\n def.props.labelColor || '#e0e0e0',\n def.props.labelFontSize || 14\n )\n }\n\n window.shapes.push(circle)\n if (window.pushCreateAction) window.pushCreateAction(circle)\n return circle\n}\n\nfunction createText(def, errors) {\n const TextShape = window.TextShape\n const svgEl = window.svg\n if (!TextShape || !svgEl) {\n errors.push({ line: def.line, message: 'TextShape class not available' })\n return null\n }\n\n const x = def.x || 0\n const y = def.y || 0\n const content = def.props.content || def.props.text || 'Text'\n const color = def.props.color || def.props.fill || '#fff'\n const fontSize = def.props.fontSize || 16\n\n const g = document.createElementNS(NS, 'g')\n g.setAttribute('data-type', 'text-group')\n g.setAttribute('transform', `translate(${x}, ${y})`)\n g.setAttribute('data-x', x)\n g.setAttribute('data-y', y)\n\n const t = document.createElementNS(NS, 'text')\n t.setAttribute('x', 0)\n t.setAttribute('y', 0)\n t.setAttribute('text-anchor', def.props.anchor || 'middle')\n t.setAttribute('dominant-baseline', 'central')\n t.setAttribute('fill', color)\n t.setAttribute('font-size', fontSize)\n t.setAttribute('font-family', def.props.fontFamily || 'lixFont, sans-serif')\n t.setAttribute('data-initial-font', def.props.fontFamily || 'lixFont')\n t.setAttribute('data-initial-color', color)\n t.setAttribute('data-initial-size', fontSize + 'px')\n t.textContent = content\n\n g.appendChild(t)\n svgEl.appendChild(g)\n\n const shape = new TextShape(g)\n window.shapes.push(shape)\n if (window.pushCreateAction) window.pushCreateAction(shape)\n return shape\n}\n\nfunction createFreehand(def, errors) {\n const FreehandStroke = window.FreehandStroke\n if (!FreehandStroke) {\n errors.push({ line: def.line, message: 'FreehandStroke class not available' })\n return null\n }\n\n // Points should be provided as a property: points: \"x1,y1;x2,y2;...\"\n const pointsStr = def.props.points || ''\n const points = pointsStr.split(';').map(p => {\n const [x, y, pressure] = p.split(',').map(Number)\n return [x || 0, y || 0, pressure || 0.5]\n }).filter(p => !isNaN(p[0]))\n\n if (points.length < 2) {\n errors.push({ line: def.line, message: 'Freehand requires at least 2 points' })\n return null\n }\n\n const stroke = new FreehandStroke(points, {\n stroke: def.props.stroke || def.props.color || '#fff',\n strokeWidth: def.props.strokeWidth || 3,\n thinning: def.props.thinning || 0.5,\n roughness: def.props.roughness || 'smooth',\n strokeStyle: def.props.style || 'solid',\n })\n\n window.shapes.push(stroke)\n if (window.pushCreateAction) window.pushCreateAction(stroke)\n return stroke\n}\n\n/**\n * Create a connection (arrow or line) between two points or shape references.\n */\nfunction createConnection(def, createdShapes, errors) {\n const from = resolveConnectionPoint(def.from, createdShapes)\n const to = resolveConnectionPoint(def.to, createdShapes)\n\n if (!from || !to) {\n errors.push({ line: def.line, message: `Cannot resolve connection endpoints for '${def.id}'` })\n return null\n }\n\n if (def.type === 'arrow') {\n return createArrow(def, from, to, createdShapes, errors)\n } else {\n return createLine(def, from, to, errors)\n }\n}\n\nfunction createArrow(def, from, to, createdShapes, errors) {\n const Arrow = window.Arrow\n if (!Arrow) {\n errors.push({ line: def.line, message: 'Arrow class not available' })\n return null\n }\n\n const curveMode = def.props.curve || 'straight'\n\n const arrow = new Arrow(\n { x: from.x, y: from.y },\n { x: to.x, y: to.y },\n {\n stroke: def.props.stroke || '#fff',\n strokeWidth: def.props.strokeWidth || 2,\n arrowOutlineStyle: def.props.style || 'solid',\n arrowHeadStyle: def.props.head || 'default',\n arrowHeadLength: def.props.headLength || 15,\n arrowCurved: curveMode,\n arrowCurveAmount: def.props.curveAmount || 50,\n }\n )\n\n if (def.props.label) {\n arrow.setLabel(\n def.props.label,\n def.props.labelColor || '#e0e0e0',\n def.props.labelFontSize || 12\n )\n }\n\n // Auto-attach to source/target shapes\n if (def.from && def.from.ref) {\n const sourceEntry = createdShapes.get(def.from.ref)\n if (sourceEntry) {\n autoAttach(arrow, sourceEntry.instance, true, from)\n }\n }\n if (def.to && def.to.ref) {\n const targetEntry = createdShapes.get(def.to.ref)\n if (targetEntry) {\n autoAttach(arrow, targetEntry.instance, false, to)\n }\n }\n\n window.shapes.push(arrow)\n if (window.pushCreateAction) window.pushCreateAction(arrow)\n return arrow\n}\n\nfunction createLine(def, from, to, errors) {\n const Line = window.Line\n if (!Line) {\n errors.push({ line: def.line, message: 'Line class not available' })\n return null\n }\n\n const line = new Line(\n { x: from.x, y: from.y },\n { x: to.x, y: to.y },\n {\n stroke: def.props.stroke || '#fff',\n strokeWidth: def.props.strokeWidth || 2,\n strokeDasharray: resolveStrokeStyle(def.props.style),\n }\n )\n\n if (def.props.curve === 'true' || def.props.curve === true) {\n line.isCurved = true\n line.initializeCurveControlPoint?.()\n line.draw()\n }\n\n if (def.props.label) {\n line.setLabel(\n def.props.label,\n def.props.labelColor || '#e0e0e0',\n def.props.labelFontSize || 12\n )\n }\n\n window.shapes.push(line)\n if (window.pushCreateAction) window.pushCreateAction(line)\n return line\n}\n\n// ============================================================\n// CONNECTION POINT RESOLUTION\n// ============================================================\n\n/**\n * Resolve a connection endpoint \u2014 either absolute coords or a shape reference.\n */\nfunction resolveConnectionPoint(pointDef, createdShapes) {\n if (!pointDef) return null\n\n // Absolute coordinates\n if (pointDef.x !== undefined && pointDef.y !== undefined) {\n return { x: pointDef.x, y: pointDef.y }\n }\n\n // Shape reference\n if (pointDef.ref) {\n const entry = createdShapes.get(pointDef.ref)\n if (!entry) return null\n\n const shape = entry.instance\n const def = entry.def\n const side = pointDef.side || 'center'\n const offset = pointDef.offset || 0\n\n // Get shape bounds\n const sx = shape.x !== undefined ? shape.x : (def.x || 0)\n const sy = shape.y !== undefined ? shape.y : (def.y || 0)\n const sw = shape.width || def.width || 0\n const sh = shape.height || def.height || 0\n\n // For circles, x/y is the center\n let cx, cy\n if (shape.shapeName === 'circle') {\n cx = sx\n cy = sy\n const rx = shape.rx || sw / 2\n const ry = shape.ry || sh / 2\n\n switch (side) {\n case 'top': return { x: cx + offset, y: cy - ry }\n case 'bottom': return { x: cx + offset, y: cy + ry }\n case 'left': return { x: cx - rx, y: cy + offset }\n case 'right': return { x: cx + rx, y: cy + offset }\n case 'center': return { x: cx + offset, y: cy }\n default: return { x: cx, y: cy }\n }\n }\n\n // For rectangles and other box shapes\n cx = sx + sw / 2\n cy = sy + sh / 2\n\n switch (side) {\n case 'top': return { x: cx + offset, y: sy }\n case 'bottom': return { x: cx + offset, y: sy + sh }\n case 'left': return { x: sx, y: cy + offset }\n case 'right': return { x: sx + sw, y: cy + offset }\n case 'center': return { x: cx + offset, y: cy }\n default: return { x: cx, y: cy }\n }\n }\n\n return null\n}\n\n/**\n * Auto-attach an arrow to a shape (sets attachedToStart or attachedToEnd).\n */\nfunction autoAttach(arrow, shape, isStart, connectionPoint) {\n if (!shape || !connectionPoint) return\n\n const sx = shape.x || 0\n const sy = shape.y || 0\n const sw = shape.width || 0\n const sh = shape.height || 0\n\n let cx, cy\n if (shape.shapeName === 'circle') {\n cx = sx\n cy = sy\n } else {\n cx = sx + sw / 2\n cy = sy + sh / 2\n }\n\n // Determine which side the connection point is on\n const dx = connectionPoint.x - cx\n const dy = connectionPoint.y - cy\n let side = 'bottom'\n\n if (Math.abs(dx) > Math.abs(dy)) {\n side = dx > 0 ? 'right' : 'left'\n } else {\n side = dy > 0 ? 'bottom' : 'top'\n }\n\n const attachment = { shape, side, offset: { x: 0, y: 0 } }\n\n if (isStart) {\n arrow.attachedToStart = attachment\n } else {\n arrow.attachedToEnd = attachment\n }\n}\n\n// ============================================================\n// PREVIEW \u2014 generate SVG preview without touching the canvas\n// ============================================================\n\n/**\n * Generate a preview SVG string from parsed LixScript.\n */\nexport function previewLixScript(parsed) {\n const { shapes: defs, errors } = parsed\n if (errors.length > 0) return ''\n\n resolveShapeRefs(defs)\n\n // Build a shape map for resolving arrow references in preview\n const shapeMap = new Map()\n for (const def of defs) {\n if (def.type !== 'arrow' && def.type !== 'line') {\n shapeMap.set(def.id, def)\n }\n }\n\n // Resolve arrow/line endpoints to coordinates for preview\n function resolvePreviewPoint(pointDef) {\n if (!pointDef) return { x: 0, y: 0 }\n if (pointDef.x !== undefined && pointDef.y !== undefined) return pointDef\n\n if (pointDef.ref) {\n const target = shapeMap.get(pointDef.ref)\n if (!target) return { x: 0, y: 0 }\n\n const side = pointDef.side || 'center'\n const offset = pointDef.offset || 0\n const tx = target.x || 0\n const ty = target.y || 0\n const tw = target.width || 160\n const th = target.height || 60\n\n // For circle, x/y is top-left of bounding box in our DSL\n const cx = tx + tw / 2\n const cy = ty + th / 2\n\n switch (side) {\n case 'top': return { x: cx + offset, y: ty }\n case 'bottom': return { x: cx + offset, y: ty + th }\n case 'left': return { x: tx, y: cy + offset }\n case 'right': return { x: tx + tw, y: cy + offset }\n case 'center': return { x: cx + offset, y: cy }\n default: return { x: cx, y: cy }\n }\n }\n return { x: 0, y: 0 }\n }\n\n // Calculate bounds\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity\n\n for (const def of defs) {\n if (def.type === 'arrow' || def.type === 'line') {\n const from = resolvePreviewPoint(def.from)\n const to = resolvePreviewPoint(def.to)\n minX = Math.min(minX, from.x, to.x)\n minY = Math.min(minY, from.y, to.y)\n maxX = Math.max(maxX, from.x, to.x)\n maxY = Math.max(maxY, from.y, to.y)\n } else if (def.type !== 'frame') {\n const x = def.x || 0\n const y = def.y || 0\n const w = def.width || 160\n const h = def.height || 60\n minX = Math.min(minX, x)\n minY = Math.min(minY, y)\n maxX = Math.max(maxX, x + w)\n maxY = Math.max(maxY, y + h)\n }\n }\n\n if (!isFinite(minX)) { minX = 0; minY = 0; maxX = 400; maxY = 300 }\n\n const pad = 40\n const vw = maxX - minX + pad * 2\n const vh = maxY - minY + pad * 2\n\n let svgContent = ''\n\n // Render each shape as simple SVG\n for (const def of defs) {\n const props = def.props || {}\n\n switch (def.type) {\n case 'rect':\n svgContent += `<rect x=\"${def.x || 0}\" y=\"${def.y || 0}\" width=\"${def.width || 160}\" height=\"${def.height || 60}\" stroke=\"${props.stroke || '#fff'}\" stroke-width=\"${props.strokeWidth || 2}\" fill=\"${props.fill || 'transparent'}\" rx=\"4\" />`\n if (props.label) {\n const cx = (def.x || 0) + (def.width || 160) / 2\n const cy = (def.y || 0) + (def.height || 60) / 2\n svgContent += `<text x=\"${cx}\" y=\"${cy}\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"${props.labelColor || '#e0e0e0'}\" font-size=\"${props.labelFontSize || 14}\" font-family=\"sans-serif\">${escapeXml(props.label)}</text>`\n }\n break\n\n case 'circle':\n case 'ellipse': {\n const rx = (def.width || 80) / 2\n const ry = (def.height || 80) / 2\n const cx = (def.x || 0) + rx\n const cy = (def.y || 0) + ry\n svgContent += `<ellipse cx=\"${cx}\" cy=\"${cy}\" rx=\"${rx}\" ry=\"${ry}\" stroke=\"${props.stroke || '#fff'}\" stroke-width=\"${props.strokeWidth || 2}\" fill=\"${props.fill || 'transparent'}\" />`\n if (props.label) {\n svgContent += `<text x=\"${cx}\" y=\"${cy}\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"${props.labelColor || '#e0e0e0'}\" font-size=\"${props.labelFontSize || 14}\" font-family=\"sans-serif\">${escapeXml(props.label)}</text>`\n }\n break\n }\n\n case 'text': {\n const content = props.content || props.text || 'Text'\n svgContent += `<text x=\"${def.x || 0}\" y=\"${def.y || 0}\" fill=\"${props.color || props.fill || '#fff'}\" font-size=\"${props.fontSize || 16}\" font-family=\"sans-serif\">${escapeXml(content)}</text>`\n break\n }\n\n case 'arrow': {\n const fromOrig = resolvePreviewPoint(def.from)\n const toOrig = resolvePreviewPoint(def.to)\n const stroke = props.stroke || '#fff'\n const sw = props.strokeWidth || 2\n const dash = props.style === 'dashed' ? ' stroke-dasharray=\"10,10\"' : props.style === 'dotted' ? ' stroke-dasharray=\"2,8\"' : ''\n const curve = props.curve || 'straight'\n const markerId = `ah-${def.id}`\n const headLen = 10 // arrowhead marker size\n\n // Pull back arrow endpoint so the tip lands at the shape edge, not inside it\n const to = shortenEndpoint(fromOrig, toOrig, headLen)\n const from = fromOrig\n\n // Per-arrow colored arrowhead marker \u2014 refX=0 so tip is at the shortened line end\n svgContent += `<defs><marker id=\"${markerId}\" markerWidth=\"10\" markerHeight=\"7\" refX=\"0\" refY=\"3.5\" orient=\"auto\"><polygon points=\"0 0, 10 3.5, 0 7\" fill=\"${stroke}\" /></marker></defs>`\n\n if (curve === 'curved') {\n // Compute a quadratic bezier control point perpendicular to the line\n const mx = (from.x + toOrig.x) / 2\n const my = (from.y + toOrig.y) / 2\n const dx = toOrig.x - from.x\n const dy = toOrig.y - from.y\n const dist = Math.sqrt(dx * dx + dy * dy) || 1\n const amt = props.curveAmount || Math.min(dist * 0.3, 80)\n // Perpendicular offset (always curve to the same side)\n const cpx = mx + (dy / dist) * amt\n const cpy = my - (dx / dist) * amt\n // Shorten the bezier endpoint\n const toShort = shortenEndpoint({ x: cpx, y: cpy }, toOrig, headLen)\n svgContent += `<path d=\"M${from.x},${from.y} Q${cpx},${cpy} ${toShort.x},${toShort.y}\" stroke=\"${stroke}\" stroke-width=\"${sw}\" fill=\"none\"${dash} marker-end=\"url(#${markerId})\" />`\n if (props.label) {\n // Label at the curve midpoint (t=0.5 on quadratic bezier)\n const lx = 0.25 * from.x + 0.5 * cpx + 0.25 * toOrig.x\n const ly = 0.25 * from.y + 0.5 * cpy + 0.25 * toOrig.y - 8\n svgContent += `<text x=\"${lx}\" y=\"${ly}\" text-anchor=\"middle\" fill=\"${props.labelColor || '#a0a0b0'}\" font-size=\"11\" font-family=\"sans-serif\">${escapeXml(props.label)}</text>`\n }\n } else if (curve === 'elbow') {\n // Simple elbow: go vertical then horizontal (or vice versa)\n const midY = from.y + (toOrig.y - from.y) / 2\n // Shorten the last segment endpoint\n const lastFrom = { x: toOrig.x, y: midY }\n const toShort = shortenEndpoint(lastFrom, toOrig, headLen)\n svgContent += `<path d=\"M${from.x},${from.y} L${from.x},${midY} L${toOrig.x},${midY} L${toShort.x},${toShort.y}\" stroke=\"${stroke}\" stroke-width=\"${sw}\" fill=\"none\"${dash} marker-end=\"url(#${markerId})\" />`\n if (props.label) {\n const lx = (from.x + toOrig.x) / 2\n const ly = midY - 8\n svgContent += `<text x=\"${lx}\" y=\"${ly}\" text-anchor=\"middle\" fill=\"${props.labelColor || '#a0a0b0'}\" font-size=\"11\" font-family=\"sans-serif\">${escapeXml(props.label)}</text>`\n }\n } else {\n svgContent += `<line x1=\"${from.x}\" y1=\"${from.y}\" x2=\"${to.x}\" y2=\"${to.y}\" stroke=\"${stroke}\" stroke-width=\"${sw}\"${dash} marker-end=\"url(#${markerId})\" />`\n if (props.label) {\n const lx = (from.x + toOrig.x) / 2\n const ly = (from.y + toOrig.y) / 2 - 10\n svgContent += `<text x=\"${lx}\" y=\"${ly}\" text-anchor=\"middle\" fill=\"${props.labelColor || '#a0a0b0'}\" font-size=\"11\" font-family=\"sans-serif\">${escapeXml(props.label)}</text>`\n }\n }\n break\n }\n\n case 'line': {\n const from = resolvePreviewPoint(def.from)\n const to = resolvePreviewPoint(def.to)\n const dash = props.style === 'dashed' ? ' stroke-dasharray=\"10,10\"' : props.style === 'dotted' ? ' stroke-dasharray=\"2,8\"' : ''\n svgContent += `<line x1=\"${from.x}\" y1=\"${from.y}\" x2=\"${to.x}\" y2=\"${to.y}\" stroke=\"${props.stroke || '#fff'}\" stroke-width=\"${props.strokeWidth || 2}\"${dash} />`\n break\n }\n\n case 'frame': {\n const frameName = props.name || def.id\n svgContent += `<rect x=\"${def.x || 0}\" y=\"${def.y || 0}\" width=\"${def.width || 600}\" height=\"${def.height || 400}\" stroke=\"${props.stroke || '#555'}\" stroke-width=\"1\" fill=\"transparent\" stroke-dasharray=\"8,4\" rx=\"8\" />`\n svgContent += `<text x=\"${(def.x || 0) + 10}\" y=\"${(def.y || 0) - 8}\" fill=\"#888\" font-size=\"12\" font-family=\"sans-serif\">${escapeXml(frameName)}</text>`\n break\n }\n }\n }\n\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"${minX - pad} ${minY - pad} ${vw} ${vh}\" width=\"100%\" height=\"100%\" style=\"background: transparent;\">\n ${svgContent}\n </svg>`\n}\n\n/**\n * Pull back an arrow endpoint so the arrowhead tip lands at the target edge,\n * rather than the line extending into the shape.\n */\nfunction shortenEndpoint(from, to, amount) {\n const dx = to.x - from.x\n const dy = to.y - from.y\n const dist = Math.sqrt(dx * dx + dy * dy)\n if (dist < amount * 2) return to // too short to shorten\n return {\n x: to.x - (dx / dist) * amount,\n y: to.y - (dy / dist) * amount,\n }\n}\n\nfunction escapeXml(str) {\n return String(str).replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n}\n\n// ============================================================\n// STROKE STYLE HELPERS\n// ============================================================\n\nfunction resolveStrokeStyle(style) {\n if (!style) return ''\n switch (style) {\n case 'dashed': return '10,10'\n case 'dotted': return '2,8'\n case 'solid':\n default: return ''\n }\n}\n\n// ============================================================\n// WINDOW BRIDGE \u2014 expose to canvas engine\n// ============================================================\n\nexport function initLixScriptBridge() {\n window.__lixscriptParse = parseLixScript\n window.__lixscriptRender = renderLixScript\n window.__lixscriptPreview = (source) => {\n const parsed = parseLixScript(source)\n return previewLixScript(parsed)\n }\n window.__lixscriptExecute = (source) => {\n const parsed = parseLixScript(source)\n if (parsed.errors.length > 0) {\n return { success: false, errors: parsed.errors, shapesCreated: 0 }\n }\n return renderLixScript(parsed)\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|