@elixpo/lixsketch 5.5.18 → 5.5.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react/{AIRenderer-HI7TYROT.js → AIRenderer-SRF7LU5K.js} +13 -4
- package/dist/react/AIRenderer-SRF7LU5K.js.map +7 -0
- package/dist/react/Circle-6POZCUZD.js +9 -0
- package/dist/react/{CopyPaste-C2SHB7QD.js → CopyPaste-KJZ34MIP.js} +12 -11
- package/dist/react/{CopyPaste-C2SHB7QD.js.map → CopyPaste-KJZ34MIP.js.map} +1 -1
- package/dist/react/{EventDispatcher-ZCKWAHIX.js → EventDispatcher-XDRQS7BD.js} +14 -13
- package/dist/react/{EventDispatcher-ZCKWAHIX.js.map → EventDispatcher-XDRQS7BD.js.map} +1 -1
- package/dist/react/Frame-QLBAVLGW.js +11 -0
- package/dist/react/FreehandStroke-U6GYZOM4.js +9 -0
- package/dist/react/IconShape-32EYI2MA.js +10 -0
- package/dist/react/ImageShape-MYP2DVVH.js +10 -0
- package/dist/react/Line-FCCF2BOB.js +10 -0
- package/dist/react/{MermaidFlowchartRenderer-4YEMAYQC.js → MermaidFlowchartRenderer-PQEC4TMI.js} +3 -9
- package/dist/react/{MermaidFlowchartRenderer-4YEMAYQC.js.map → MermaidFlowchartRenderer-PQEC4TMI.js.map} +2 -2
- package/dist/react/{MermaidStructuredRenderer-H42SKKN2.js → MermaidStructuredRenderer-W7UKN7BM.js} +34 -18
- package/dist/react/MermaidStructuredRenderer-W7UKN7BM.js.map +7 -0
- package/dist/react/Rectangle-S7XUKWYD.js +9 -0
- package/dist/react/{SceneSerializer-IQGUAK45.js → SceneSerializer-VY3HY4PF.js} +29 -11
- package/dist/react/SceneSerializer-VY3HY4PF.js.map +7 -0
- package/dist/react/{Selection-XLRY6VYO.js → Selection-U2AR6NQS.js} +5 -4
- package/dist/react/{SketchEngine-RFEF27MN.js → SketchEngine-ZFYUTKET.js} +26 -26
- package/dist/react/TextShape-DY77FFI2.js +8 -0
- package/dist/react/{UndoRedo-M2JZUBKN.js → UndoRedo-BZ6W4QTV.js} +2 -2
- package/dist/react/{ZoomPan-NYPDJBD5.js → ZoomPan-FAWA5OPS.js} +5 -1
- package/dist/react/ZoomPan-FAWA5OPS.js.map +7 -0
- package/dist/react/{arrowTool-CWEMIRXK.js → arrowTool-LKFSZKXC.js} +3 -3
- package/dist/react/{chunk-X6AHYG5J.js → chunk-2I3GH65Z.js} +7 -3
- package/dist/react/chunk-2I3GH65Z.js.map +7 -0
- package/dist/react/{chunk-2OQXI7QB.js → chunk-2V7G2PLX.js} +3 -3
- package/dist/react/{chunk-IZ5OGWGW.js → chunk-6G3ITAS5.js} +2 -2
- package/dist/react/{chunk-LHRTXNVE.js → chunk-73VLPCBC.js} +8 -4
- package/dist/react/chunk-73VLPCBC.js.map +7 -0
- package/dist/react/{chunk-2AYTBFV5.js → chunk-75G7XSZU.js} +11 -2
- package/dist/react/chunk-75G7XSZU.js.map +7 -0
- package/dist/react/{chunk-IW2NRHNK.js → chunk-7VBI7S7T.js} +12 -3
- package/dist/react/chunk-7VBI7S7T.js.map +7 -0
- package/dist/react/{chunk-JQ3IRFDP.js → chunk-C62SXFBL.js} +2 -2
- package/dist/react/{chunk-6SFNWGGZ.js → chunk-C72OHQLE.js} +3 -3
- package/dist/react/{chunk-XCJOF6BM.js → chunk-FETTJLCV.js} +5 -1
- package/dist/react/chunk-FETTJLCV.js.map +7 -0
- package/dist/react/{chunk-QNSE5BAY.js → chunk-JOPQ27YH.js} +3 -3
- package/dist/react/{chunk-L5OARZJ7.js → chunk-MYYBFZD3.js} +15 -1
- package/dist/react/chunk-MYYBFZD3.js.map +7 -0
- package/dist/react/{chunk-BZE4CEBG.js → chunk-O64N5JPO.js} +2 -2
- package/dist/react/chunk-PAKA6HUX.js +59 -0
- package/dist/react/chunk-PAKA6HUX.js.map +7 -0
- package/dist/react/{chunk-62W6XTCZ.js → chunk-PGT3TJOW.js} +4 -2
- package/dist/react/{chunk-62W6XTCZ.js.map → chunk-PGT3TJOW.js.map} +2 -2
- package/dist/react/{chunk-HKYUJUD7.js → chunk-PXFPPO3R.js} +5 -1
- package/dist/react/chunk-PXFPPO3R.js.map +7 -0
- package/dist/react/{chunk-7DC26DDU.js → chunk-R5QXEVZ5.js} +7 -3
- package/dist/react/chunk-R5QXEVZ5.js.map +7 -0
- package/dist/react/{chunk-CB2RANCB.js → chunk-RFHMFWVR.js} +2 -2
- package/dist/react/{chunk-5QIT2WBE.js → chunk-SBSM3GQD.js} +23 -17
- package/dist/react/chunk-SBSM3GQD.js.map +7 -0
- package/dist/react/{chunk-N7NZLF6P.js → chunk-TKXKJNTX.js} +5 -1
- package/dist/react/chunk-TKXKJNTX.js.map +7 -0
- package/dist/react/{chunk-6PFXZKL2.js → chunk-UQBT7F4K.js} +2 -2
- package/dist/react/{chunk-I6HCCIXB.js → chunk-WEWMB35W.js} +3 -3
- package/dist/react/{circleTool-NUATSEI2.js → circleTool-RDOIMKKV.js} +4 -4
- package/dist/react/{codeTool-MHCB2FNB.js → codeTool-VBDB2ES6.js} +5 -4
- package/dist/react/{frameTool-PWVKKXSP.js → frameTool-Z5ZDCX6H.js} +4 -4
- package/dist/react/{freehandTool-SLYGASVP.js → freehandTool-AAQCTMVM.js} +4 -4
- package/dist/react/{iconTool-YD4GRXAP.js → iconTool-5WNDHI5T.js} +5 -4
- package/dist/react/{imageTool-WJVV4WI3.js → imageTool-ECPMT3BL.js} +5 -4
- package/dist/react/index.js +1282 -1295
- package/dist/react/index.js.map +4 -4
- package/dist/react/{lineTool-WNI5EMZ5.js → lineTool-XLOOZE3E.js} +4 -4
- package/dist/react/{rectangleTool-U7DZ6ZTA.js → rectangleTool-AEYDDJCA.js} +4 -4
- package/dist/react/{textTool-HY5NMM7H.js → textTool-5IJKTWVQ.js} +6 -5
- package/package.json +1 -1
- package/src/EngineShortcuts.js +28 -0
- package/src/core/AIRenderer.js +20 -8
- package/src/core/MermaidFlowchartRenderer.js +2 -9
- package/src/core/MermaidStructuredRenderer.js +44 -13
- package/src/core/SceneSerializer.js +22 -0
- package/src/core/ScreenSpaceControls.js +60 -0
- package/src/core/Selection.js +7 -0
- package/src/core/UndoRedo.js +22 -3
- package/src/core/ZoomPan.js +3 -0
- package/src/react/LixSketchCanvas.jsx +15 -19
- package/src/react/components/AppMenu.jsx +220 -198
- package/src/react/components/Footer.jsx +7 -7
- package/src/react/components/Toolbar.jsx +1 -1
- package/src/react/components/canvas/CanvasRulers.jsx +150 -0
- package/src/react/components/canvas/SVGCanvas.jsx +13 -0
- package/src/react/components/modals/CommandPalette.jsx +84 -29
- package/src/react/components/sidebars/IconSidebar.jsx +20 -9
- package/src/react/store/useSketchStore.js +38 -1
- package/src/react/store/useUIStore.js +10 -9
- package/src/shapes/Circle.js +2 -0
- package/src/shapes/Frame.js +8 -1
- package/src/shapes/FreehandStroke.js +2 -0
- package/src/shapes/Rectangle.js +2 -0
- package/src/shapes/TextShape.js +7 -1
- package/src/tools/codeTool.js +3 -2
- package/src/tools/iconTool.js +3 -1
- package/src/tools/imageTool.js +3 -1
- package/src/tools/textTool.js +27 -17
- package/dist/react/AIRenderer-HI7TYROT.js.map +0 -7
- package/dist/react/Circle-QQMKCKFR.js +0 -8
- package/dist/react/Frame-WPQZQLNT.js +0 -10
- package/dist/react/FreehandStroke-BOWDNAVC.js +0 -8
- package/dist/react/IconShape-KMIA6T2H.js +0 -10
- package/dist/react/ImageShape-CHHGBXUQ.js +0 -10
- package/dist/react/Line-2KOQEEGA.js +0 -10
- package/dist/react/MermaidStructuredRenderer-H42SKKN2.js.map +0 -7
- package/dist/react/Rectangle-MZ6ZB6KM.js +0 -8
- package/dist/react/SceneSerializer-IQGUAK45.js.map +0 -7
- package/dist/react/TextShape-QRDG4P7F.js +0 -8
- package/dist/react/ZoomPan-NYPDJBD5.js.map +0 -7
- package/dist/react/chunk-2AYTBFV5.js.map +0 -7
- package/dist/react/chunk-5QIT2WBE.js.map +0 -7
- package/dist/react/chunk-7DC26DDU.js.map +0 -7
- package/dist/react/chunk-HKYUJUD7.js.map +0 -7
- package/dist/react/chunk-IW2NRHNK.js.map +0 -7
- package/dist/react/chunk-L5OARZJ7.js.map +0 -7
- package/dist/react/chunk-LHRTXNVE.js.map +0 -7
- package/dist/react/chunk-N7NZLF6P.js.map +0 -7
- package/dist/react/chunk-X6AHYG5J.js.map +0 -7
- package/dist/react/chunk-XCJOF6BM.js.map +0 -7
- package/src/react/components/modals/HelpModal.jsx +0 -208
- package/src/react/components/modals/ShortcutsModal.jsx +0 -125
- /package/dist/react/{Circle-QQMKCKFR.js.map → Circle-6POZCUZD.js.map} +0 -0
- /package/dist/react/{Frame-WPQZQLNT.js.map → Frame-QLBAVLGW.js.map} +0 -0
- /package/dist/react/{FreehandStroke-BOWDNAVC.js.map → FreehandStroke-U6GYZOM4.js.map} +0 -0
- /package/dist/react/{IconShape-KMIA6T2H.js.map → IconShape-32EYI2MA.js.map} +0 -0
- /package/dist/react/{ImageShape-CHHGBXUQ.js.map → ImageShape-MYP2DVVH.js.map} +0 -0
- /package/dist/react/{Line-2KOQEEGA.js.map → Line-FCCF2BOB.js.map} +0 -0
- /package/dist/react/{Rectangle-MZ6ZB6KM.js.map → Rectangle-S7XUKWYD.js.map} +0 -0
- /package/dist/react/{Selection-XLRY6VYO.js.map → Selection-U2AR6NQS.js.map} +0 -0
- /package/dist/react/{SketchEngine-RFEF27MN.js.map → SketchEngine-ZFYUTKET.js.map} +0 -0
- /package/dist/react/{TextShape-QRDG4P7F.js.map → TextShape-DY77FFI2.js.map} +0 -0
- /package/dist/react/{UndoRedo-M2JZUBKN.js.map → UndoRedo-BZ6W4QTV.js.map} +0 -0
- /package/dist/react/{arrowTool-CWEMIRXK.js.map → arrowTool-LKFSZKXC.js.map} +0 -0
- /package/dist/react/{chunk-2OQXI7QB.js.map → chunk-2V7G2PLX.js.map} +0 -0
- /package/dist/react/{chunk-IZ5OGWGW.js.map → chunk-6G3ITAS5.js.map} +0 -0
- /package/dist/react/{chunk-JQ3IRFDP.js.map → chunk-C62SXFBL.js.map} +0 -0
- /package/dist/react/{chunk-6SFNWGGZ.js.map → chunk-C72OHQLE.js.map} +0 -0
- /package/dist/react/{chunk-QNSE5BAY.js.map → chunk-JOPQ27YH.js.map} +0 -0
- /package/dist/react/{chunk-BZE4CEBG.js.map → chunk-O64N5JPO.js.map} +0 -0
- /package/dist/react/{chunk-CB2RANCB.js.map → chunk-RFHMFWVR.js.map} +0 -0
- /package/dist/react/{chunk-6PFXZKL2.js.map → chunk-UQBT7F4K.js.map} +0 -0
- /package/dist/react/{chunk-I6HCCIXB.js.map → chunk-WEWMB35W.js.map} +0 -0
- /package/dist/react/{circleTool-NUATSEI2.js.map → circleTool-RDOIMKKV.js.map} +0 -0
- /package/dist/react/{codeTool-MHCB2FNB.js.map → codeTool-VBDB2ES6.js.map} +0 -0
- /package/dist/react/{frameTool-PWVKKXSP.js.map → frameTool-Z5ZDCX6H.js.map} +0 -0
- /package/dist/react/{freehandTool-SLYGASVP.js.map → freehandTool-AAQCTMVM.js.map} +0 -0
- /package/dist/react/{iconTool-YD4GRXAP.js.map → iconTool-5WNDHI5T.js.map} +0 -0
- /package/dist/react/{imageTool-WJVV4WI3.js.map → imageTool-ECPMT3BL.js.map} +0 -0
- /package/dist/react/{lineTool-WNI5EMZ5.js.map → lineTool-XLOOZE3E.js.map} +0 -0
- /package/dist/react/{rectangleTool-U7DZ6ZTA.js.map → rectangleTool-AEYDDJCA.js.map} +0 -0
- /package/dist/react/{textTool-HY5NMM7H.js.map → textTool-5IJKTWVQ.js.map} +0 -0
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import {
|
|
3
|
+
registerRotationAnchor
|
|
4
|
+
} from "./chunk-PAKA6HUX.js";
|
|
2
5
|
import {
|
|
3
6
|
cleanupAttachments,
|
|
4
7
|
updateAttachedArrows
|
|
5
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-O64N5JPO.js";
|
|
6
9
|
import {
|
|
7
10
|
pushCreateAction,
|
|
8
11
|
pushDeleteAction,
|
|
9
12
|
pushFrameAttachmentAction,
|
|
10
13
|
pushTransformAction
|
|
11
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-MYYBFZD3.js";
|
|
12
15
|
|
|
13
16
|
// src/tools/iconTool.js
|
|
14
17
|
var isDraggingIcon = false;
|
|
@@ -515,6 +518,7 @@ function addRotationAnchor(x, y, width, height, centerX, centerY, iconWidth, rot
|
|
|
515
518
|
rotationAnchor.setAttribute("style", "pointer-events: all; cursor: grab;");
|
|
516
519
|
rotationAnchor.setAttribute("transform", `rotate(${rotation}, ${centerX}, ${centerY})`);
|
|
517
520
|
svg.appendChild(rotationAnchor);
|
|
521
|
+
registerRotationAnchor(rotationAnchor, { radius: 5, edgeY: y });
|
|
518
522
|
rotationAnchor.addEventListener("pointerdown", startRotation);
|
|
519
523
|
rotationAnchor.addEventListener("pointerup", stopRotation);
|
|
520
524
|
rotationAnchor.addEventListener("mouseover", function() {
|
|
@@ -932,4 +936,4 @@ export {
|
|
|
932
936
|
startDrag,
|
|
933
937
|
stopDrag
|
|
934
938
|
};
|
|
935
|
-
//# sourceMappingURL=chunk-
|
|
939
|
+
//# sourceMappingURL=chunk-2I3GH65Z.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/tools/iconTool.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\n// Icon tool event handlers - extracted from icons.js\nimport { pushCreateAction, pushDeleteAction, pushTransformAction, pushFrameAttachmentAction } from '../core/UndoRedo.js';\nimport { updateAttachedArrows as updateArrowsForShape, cleanupAttachments } from './arrowTool.js';\nimport { registerRotationAnchor } from '../core/ScreenSpaceControls.js';\n\n\nlet isDraggingIcon = false;\nlet iconToPlace = null;\nlet iconX = 0;\nlet iconY = 0;\nlet scaleFactor = 0.2;\nlet currentIconElement = null;\n\nlet selectedIcon = null;\nlet originalX, originalY, originalWidth, originalHeight;\nlet currentAnchor = null;\nlet isDragging = false;\nlet isRotatingIcon = false;\nlet dragOffsetX, dragOffsetY;\nlet startRotationMouseAngle = null;\nlet startIconRotation = null;\nlet iconRotation = 0;\nlet aspect_ratio_lock = true;\nconst minIconSize = 25;\nconst miniatureSize = 40;\nconst placedIconSize = 40;\nlet draggedShapeInitialFrameIcon = null;\nlet hoveredFrameIcon = null;\nlet _pendingDragChecker = null; // module-level ref so cancelDragPrep can remove it\n\nconst iconSearchInput = document.getElementById('iconSearchInput') || document.createElement('input');\nlet searchTimeout = null;\n\n\nfunction getSVGElement() {\n return document.getElementById('freehand-canvas');\n}\n\n\nfunction removeSelection() {\n const svg = getSVGElement();\n if (!svg) return;\n\n // Remove ALL selection outlines (prevents orphaned ghost elements)\n svg.querySelectorAll(\".selection-outline\").forEach(el => el.remove());\n\n removeResizeAnchors();\n removeRotationAnchor();\n\n if (selectedIcon) {\n selectedIcon.removeEventListener('pointerdown', startDrag);\n selectedIcon.removeEventListener('pointerup', stopDrag);\n selectedIcon.removeEventListener('pointerleave', stopDrag);\n }\n}\n\nfunction wrapIconElement(element) {\n const iconShape = new IconShape(element);\n return iconShape;\n}\n\ndocument.getElementById(\"importIcon\")?.addEventListener('click', () => {\n \n\n const iconContainer = document.getElementById('iconsToolBar');\n if (iconContainer) {\n if(iconContainer.classList.contains('hidden')) {\n iconContainer.classList.remove('hidden');\n iconSearchInput.focus();\n }\n else \n {\n iconContainer.classList.add('hidden');\n }\n \n }\n});\n\nfunction getSVGCoordsFromMouse(e) {\n const svg = getSVGElement();\n const viewBox = svg.viewBox.baseVal;\n const rect = svg.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n const svgX = viewBox.x + (mouseX / rect.width) * viewBox.width;\n const svgY = viewBox.y + (mouseY / rect.height) * viewBox.height;\n return { x: svgX, y: svgY };\n}\n\nconst handleMouseMoveIcon = (e) => {\n if (!isDraggingIcon || !iconToPlace || !isIconToolActive) return;\n\n const { x, y } = getSVGCoordsFromMouse(e);\n iconX = x;\n iconY = y;\n\n drawMiniatureIcon();\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(frame => {\n if (frame.shapeName === 'frame') {\n const tempIconBounds = {\n x: iconX - 50,\n y: iconY - 50,\n width: 100,\n height: 100\n };\n\n if (frame.isShapeInFrame(tempIconBounds)) {\n frame.highlightFrame();\n hoveredFrameIcon = frame;\n if (window.__iconShapeState) window.__iconShapeState.hoveredFrameIcon = frame;\n } else if (hoveredFrameIcon === frame) {\n frame.removeHighlight();\n hoveredFrameIcon = null;\n if (window.__iconShapeState) window.__iconShapeState.hoveredFrameIcon = null;\n }\n }\n });\n }\n};\n\nconst drawMiniatureIcon = () => {\n if (!isDraggingIcon || !iconToPlace || !isIconToolActive) return;\n\n const svg = getSVGElement();\n if (!svg) {\n console.error('SVG element not found for miniature icon');\n return;\n }\n\n if (currentIconElement) {\n svg.removeChild(currentIconElement);\n currentIconElement = null;\n }\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = iconToPlace;\n const svgElement = tempDiv.querySelector('svg');\n\n if (svgElement) {\n const iconGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n\n const viewBox = svgElement.getAttribute('viewBox');\n let vbWidth = 24, vbHeight = 24;\n\n if (viewBox) {\n const [, , widthStr, heightStr] = viewBox.split(/\\s+/);\n vbWidth = parseFloat(widthStr) || 24;\n vbHeight = parseFloat(heightStr) || 24;\n } else {\n const width = svgElement.getAttribute('width');\n const height = svgElement.getAttribute('height');\n if (width && height) {\n vbWidth = parseFloat(width) || 24;\n vbHeight = parseFloat(height) || 24;\n }\n }\n\n const scale = miniatureSize / Math.max(vbWidth, vbHeight);\n iconGroup.setAttribute(\"transform\", `translate(${iconX - miniatureSize / 2}, ${iconY - miniatureSize / 2}) scale(${scale})`);\n\n const allChildren = svgElement.children;\n for (let i = 0; i < allChildren.length; i++) {\n const clonedChild = allChildren[i].cloneNode(true);\n \n const applyGrayStyle = (element) => {\n if (element.nodeType === 1) {\n element.setAttribute('fill', '#666');\n element.setAttribute('stroke', '#666');\n \n for (let j = 0; j < element.children.length; j++) {\n applyGrayStyle(element.children[j]);\n }\n }\n };\n \n applyGrayStyle(clonedChild);\n iconGroup.appendChild(clonedChild);\n }\n\n iconGroup.setAttribute(\"style\", \"pointer-events: none; opacity: 0.7;\");\n iconGroup.setAttribute(\"class\", \"miniature-icon\");\n\n currentIconElement = iconGroup;\n svg.appendChild(currentIconElement);\n }\n};\n\nconst handleMouseDownIcon = async (e) => {\n if (!e.target) return;\n if (isSelectionToolActive) {\n const clickedIcon = e.target.closest('[type=\"icon\"]');\n if (clickedIcon) {\n e.preventDefault();\n e.stopPropagation();\n\n if (selectedIcon === clickedIcon) {\n originalX = parseFloat(selectedIcon.getAttribute('x')) || 0;\n originalY = parseFloat(selectedIcon.getAttribute('y')) || 0;\n originalWidth = parseFloat(selectedIcon.getAttribute('width')) || placedIconSize;\n originalHeight = parseFloat(selectedIcon.getAttribute('height')) || placedIconSize;\n\n const { x, y } = getSVGCoordsFromMouse(e);\n dragOffsetX = x - originalX;\n dragOffsetY = y - originalY;\n\n const initialMouseX = x;\n const initialMouseY = y;\n\n // Threshold in screen pixels converted to SVG units, so zoom doesn't affect sensitivity\n const svgEl = getSVGElement();\n const svgRect2 = svgEl ? svgEl.getBoundingClientRect() : { width: 1536 };\n const svgViewW = svgEl ? svgEl.viewBox.baseVal.width : 1536;\n const dragThreshold = 12 * (svgViewW / svgRect2.width); // ~12 screen pixels\n\n function checkDragStartWithThreshold(moveEvent) {\n const { x: currentX, y: currentY } = getSVGCoordsFromMouse(moveEvent);\n const deltaX = Math.abs(currentX - initialMouseX);\n const deltaY = Math.abs(currentY - initialMouseY);\n\n if (deltaX > dragThreshold || deltaY > dragThreshold) {\n document.removeEventListener('pointermove', checkDragStartWithThreshold);\n document.removeEventListener('pointerup', cancelDragPrep);\n window.removeEventListener('pointerup', cancelDragPrep);\n\n const svg = getSVGElement();\n if (svg) svg.removeEventListener('pointerup', cancelDragPrep);\n\n startDrag(moveEvent);\n }\n }\n\n _pendingDragChecker = checkDragStartWithThreshold;\n document.addEventListener('pointermove', checkDragStartWithThreshold);\n document.addEventListener('pointerup', cancelDragPrep);\n window.addEventListener('pointerup', cancelDragPrep);\n\n const svg = getSVGElement();\n if (svg) svg.addEventListener('pointerup', cancelDragPrep);\n\n return;\n } else {\n selectIcon(e);\n return;\n }\n }\n\n // Clicked on empty canvas while an icon is selected \u2014 deselect it\n if (selectedIcon) {\n removeSelection();\n selectedIcon = null;\n if (currentShape && currentShape.shapeName === 'icon') {\n currentShape = null;\n }\n }\n return;\n }\n\n if (!isDraggingIcon || !iconToPlace || !isIconToolActive) {\n return;\n }\n\n let placedIconShape = null;\n\n try {\n const svg = getSVGElement();\n if (!svg) {\n throw new Error('SVG element not found');\n }\n\n if (currentIconElement) {\n svg.removeChild(currentIconElement);\n currentIconElement = null;\n }\n\n const { x: placedX, y: placedY } = getSVGCoordsFromMouse(e);\n\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = iconToPlace;\n const originalSvgElement = tempDiv.querySelector('svg');\n\n if (!originalSvgElement) {\n throw new Error('Invalid SVG content');\n }\n\n const finalIconGroup = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n const finalX = placedX - placedIconSize / 2;\n const finalY = placedY - placedIconSize / 2;\n\n const viewBox = originalSvgElement.getAttribute('viewBox');\n let vbWidth = 24, vbHeight = 24;\n\n if (viewBox) {\n const [, , widthStr, heightStr] = viewBox.split(/\\s+/);\n vbWidth = parseFloat(widthStr) || 24;\n vbHeight = parseFloat(heightStr) || 24;\n } else {\n const width = originalSvgElement.getAttribute('width');\n const height = originalSvgElement.getAttribute('height');\n if (width && height) {\n vbWidth = parseFloat(width) || 24;\n vbHeight = parseFloat(height) || 24;\n }\n }\n\n const scale = placedIconSize / Math.max(vbWidth, vbHeight);\n const localCenterX = placedIconSize / 2 / scale;\n const localCenterY = placedIconSize / 2 / scale;\n finalIconGroup.setAttribute('transform', `translate(${finalX}, ${finalY}) scale(${scale}) rotate(0, ${localCenterX}, ${localCenterY})`);\n finalIconGroup.setAttribute('data-viewbox-width', vbWidth);\n finalIconGroup.setAttribute('data-viewbox-height', vbHeight);\n\n const backgroundRect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n backgroundRect.setAttribute('x', 0);\n backgroundRect.setAttribute('y', 0);\n backgroundRect.setAttribute('width', vbWidth);\n backgroundRect.setAttribute('height', vbHeight);\n backgroundRect.setAttribute('fill', 'transparent');\n backgroundRect.setAttribute('stroke', 'none');\n backgroundRect.setAttribute('style', 'pointer-events: all; cursor: pointer;');\n finalIconGroup.appendChild(backgroundRect);\n\n const allChildren = originalSvgElement.children;\n for (let i = 0; i < allChildren.length; i++) {\n const clonedChild = allChildren[i].cloneNode(true);\n\n // Apply white fill/stroke so icons are visible on dark canvas\n const applyWhiteStyle = (element) => {\n if (element.nodeType === 1) {\n const fill = element.getAttribute('fill');\n const stroke = element.getAttribute('stroke');\n // Replace black/dark fills with white; leave 'none'/'transparent' alone\n if (!fill || fill === '#000' || fill === '#000000' || fill === 'black' || fill === 'currentColor') {\n element.setAttribute('fill', '#ffffff');\n }\n if (stroke === '#000' || stroke === '#000000' || stroke === 'black' || stroke === 'currentColor') {\n element.setAttribute('stroke', '#ffffff');\n }\n for (let j = 0; j < element.children.length; j++) {\n applyWhiteStyle(element.children[j]);\n }\n }\n };\n applyWhiteStyle(clonedChild);\n\n finalIconGroup.appendChild(clonedChild);\n }\n\n finalIconGroup.setAttribute('x', finalX);\n finalIconGroup.setAttribute('y', finalY);\n finalIconGroup.setAttribute('width', placedIconSize);\n finalIconGroup.setAttribute('height', placedIconSize);\n finalIconGroup.setAttribute('type', 'icon');\n finalIconGroup.setAttribute('data-shape-x', finalX);\n finalIconGroup.setAttribute('data-shape-y', finalY);\n finalIconGroup.setAttribute('data-shape-width', placedIconSize);\n finalIconGroup.setAttribute('data-shape-height', placedIconSize);\n finalIconGroup.setAttribute('data-shape-rotation', 0);\n finalIconGroup.shapeID = `icon-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n finalIconGroup.setAttribute('id', finalIconGroup.shapeID);\n finalIconGroup.setAttribute('style', 'cursor: pointer; pointer-events: all;');\n\n svg.appendChild(finalIconGroup);\n\n const iconShape = wrapIconElement(finalIconGroup);\n placedIconShape = iconShape;\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n // Prevent duplicates \u2014 check if this element is already tracked\n const alreadyExists = shapes.some(s => s.shapeName === 'icon' && s.element === finalIconGroup);\n if (!alreadyExists) {\n shapes.push(iconShape);\n }\n }\n\n const finalFrame = hoveredFrameIcon;\n if (finalFrame) {\n finalFrame.addShapeToFrame(iconShape);\n pushFrameAttachmentAction(finalFrame, iconShape, 'attach', null);\n }\n\n pushCreateAction(iconShape);\n\n // mousedown handles selection; click listener removed to avoid double-selection conflicts\n\n if (hoveredFrameIcon) {\n hoveredFrameIcon.removeHighlight();\n hoveredFrameIcon = null;\n if (window.__iconShapeState) window.__iconShapeState.hoveredFrameIcon = null;\n }\n\n console.log('Icon placed successfully:', finalIconGroup);\n\n } catch (error) {\n console.error(\"Error placing icon:\", error);\n isDraggingIcon = false;\n iconToPlace = null;\n } finally {\n isDraggingIcon = false;\n iconToPlace = null;\n document.body.style.cursor = 'default';\n }\n\n // Select the placed icon but stay in icon tool so the sidebar remains open\n if (placedIconShape) {\n currentShape = placedIconShape;\n currentShape.isSelected = true;\n requestAnimationFrame(() => {\n placedIconShape.selectShape();\n });\n }\n};\n\nconst handleMouseUpIcon = (e) => {\n if (!e.target) return;\n // Deselection on empty-canvas click is handled by handleMouseDownIcon.\n // We intentionally do NOT deselect on mouseup \u2014 after a drag the cursor\n // often ends up on the background, and that shouldn't kill the selection.\n\n if (hoveredFrameIcon) {\n hoveredFrameIcon.removeHighlight();\n hoveredFrameIcon = null;\n }\n};\n\nfunction addSelectionOutline() {\n if (!selectedIcon) return;\n\n const svg = getSVGElement();\n if (!svg) return;\n\n // Use stored SVG-space data attributes \u2014 reliable even immediately after DOM insertion\n const x = parseFloat(selectedIcon.getAttribute('data-shape-x')) || 0;\n const y = parseFloat(selectedIcon.getAttribute('data-shape-y')) || 0;\n const width = parseFloat(selectedIcon.getAttribute('data-shape-width')) || 40;\n const height = parseFloat(selectedIcon.getAttribute('data-shape-height')) || 40;\n const rotation = parseFloat(selectedIcon.getAttribute('data-shape-rotation')) || 0;\n\n const centerX = x + width / 2;\n const centerY = y + height / 2;\n\n const zoom = window.currentZoom || 1;\n const selectionPadding = 8 / zoom;\n const expandedX = x - selectionPadding;\n const expandedY = y - selectionPadding;\n const expandedWidth = width + 2 * selectionPadding;\n const expandedHeight = height + 2 * selectionPadding;\n\n removeSelection();\n\n const outline = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n outline.setAttribute(\"x\", expandedX);\n outline.setAttribute(\"y\", expandedY);\n outline.setAttribute(\"width\", expandedWidth);\n outline.setAttribute(\"height\", expandedHeight);\n outline.setAttribute(\"fill\", \"none\");\n outline.setAttribute(\"stroke\", \"#5B57D1\");\n outline.setAttribute(\"stroke-width\", 1.5);\n outline.setAttribute(\"stroke-dasharray\", \"4 3\");\n outline.setAttribute(\"style\", \"pointer-events: none;\");\n outline.setAttribute(\"class\", \"selection-outline\");\n if (rotation !== 0) {\n outline.setAttribute(\"transform\", `rotate(${rotation}, ${centerX}, ${centerY})`);\n }\n\n svg.appendChild(outline);\n\n addResizeAnchors(expandedX, expandedY, expandedWidth, expandedHeight, centerX, centerY, width, rotation);\n addRotationAnchor(expandedX, expandedY, expandedWidth, expandedHeight, centerX, centerY, width, rotation);\n}\n\nfunction checkDragStart(event) {\n document.removeEventListener('pointermove', checkDragStart);\n document.removeEventListener('pointerup', cancelDragPrep);\n startDrag(event);\n}\nfunction cancelDragPrep(event) {\n if (_pendingDragChecker) {\n document.removeEventListener('pointermove', _pendingDragChecker);\n _pendingDragChecker = null;\n }\n document.removeEventListener('pointerup', cancelDragPrep);\n window.removeEventListener('pointerup', cancelDragPrep);\n\n const svg = getSVGElement();\n if (svg) {\n svg.removeEventListener('pointerup', cancelDragPrep);\n }\n}\n\nfunction startDrag(event) {\n console.log(\"start dragging icon\");\n if (!isSelectionToolActive || !selectedIcon) return;\n \n isDragging = true;\n if (window.__iconShapeState) window.__iconShapeState.isDragging = true;\n\n let iconShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n iconShape = shapes.find(shape => shape.shapeName === 'icon' && shape.element === selectedIcon);\n }\n\n if (iconShape) {\n draggedShapeInitialFrameIcon = iconShape.parentFrame || null;\n\n if (iconShape.parentFrame) {\n iconShape.parentFrame.temporarilyRemoveFromFrame(iconShape);\n }\n }\n\n document.addEventListener('pointermove', dragIcon);\n document.addEventListener('pointerup', stopDrag);\n \n window.addEventListener('pointerup', stopDrag);\n \n const svg = getSVGElement();\n if (svg) {\n svg.addEventListener('pointerup', stopDrag);\n }\n \n document.addEventListener('dragstart', preventDefaultDrag);\n document.addEventListener('selectstart', preventDefaultDrag);\n}\n\nfunction preventDefaultDrag(e) {\n e.preventDefault();\n return false;\n}\n\nfunction selectIcon(event) {\n if (!isSelectionToolActive) return;\n\n event.stopPropagation();\n\n let targetIcon = event.target.closest ? event.target.closest('[type=\"icon\"]') : null;\n if (!targetIcon) {\n let current = event.target;\n while (current && current !== document) {\n if (current.getAttribute && current.getAttribute('type') === 'icon') {\n targetIcon = current;\n break;\n }\n current = current.parentElement;\n }\n }\n\n // Always clean up previous selection before applying new one\n if (selectedIcon) {\n removeSelection();\n }\n\n selectedIcon = targetIcon;\n\n if (!selectedIcon) {\n console.warn('Could not find icon to select');\n return;\n }\n\n const transform = selectedIcon.getAttribute('transform');\n if (transform) {\n const rotateMatch = transform.match(/rotate\\(([^,\\s]+)/);\n if (rotateMatch) {\n iconRotation = parseFloat(rotateMatch[1]);\n }\n } else {\n iconRotation = 0;\n }\n\n addSelectionOutline();\n\n originalX = parseFloat(selectedIcon.getAttribute('x')) || 0;\n originalY = parseFloat(selectedIcon.getAttribute('y')) || 0;\n originalWidth = parseFloat(selectedIcon.getAttribute('width')) || placedIconSize;\n originalHeight = parseFloat(selectedIcon.getAttribute('height')) || placedIconSize;\n\n // Set currentShape so EventDispatcher routes subsequent events to icon handler\n const iconShape = (typeof shapes !== 'undefined' && Array.isArray(shapes))\n ? shapes.find(s => s.shapeName === 'icon' && s.element === selectedIcon)\n : null;\n if (iconShape) {\n currentShape = iconShape;\n currentShape.isSelected = true;\n if (window.__showSidebarForShape) window.__showSidebarForShape('icon');\n }\n}\n\nfunction addResizeAnchors(x, y, width, height, centerX, centerY, iconWidth, rotation) {\n const svg = getSVGElement();\n if (!svg) return;\n\n const zoom = window.currentZoom || 1;\n const anchorSize = 10 / zoom;\n const anchorStrokeWidth = 2 / zoom;\n\n const positions = [\n { x: x, y: y, cursor: \"nw-resize\" },\n { x: x + width, y: y, cursor: \"ne-resize\" },\n { x: x, y: y + height, cursor: \"sw-resize\" },\n { x: x + width, y: y + height, cursor: \"se-resize\" }\n ];\n\n positions.forEach((pos) => {\n const anchor = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n anchor.setAttribute(\"x\", pos.x - anchorSize / 2);\n anchor.setAttribute(\"y\", pos.y - anchorSize / 2);\n anchor.setAttribute(\"width\", anchorSize);\n anchor.setAttribute(\"height\", anchorSize);\n anchor.setAttribute(\"fill\", \"#121212\");\n anchor.setAttribute(\"stroke\", \"#5B57D1\");\n anchor.setAttribute(\"stroke-width\", anchorStrokeWidth);\n anchor.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n anchor.setAttribute(\"class\", \"resize-anchor\");\n anchor.setAttribute(\"transform\", `rotate(${rotation}, ${centerX}, ${centerY})`);\n anchor.style.cursor = pos.cursor;\n\n svg.appendChild(anchor);\n\n anchor.addEventListener('pointerdown', startResize);\n anchor.addEventListener('pointerup', stopResize);\n });\n}\n\nfunction addRotationAnchor(x, y, width, height, centerX, centerY, iconWidth, rotation) {\n const svg = getSVGElement();\n if (!svg) return;\n\n const zoom = window.currentZoom || 1;\n const anchorRadius = 5 / zoom;\n const anchorStrokeWidth = 2 / zoom;\n const rotationDistance = 30 / zoom;\n\n const rotationAnchorX = x + width / 2;\n const rotationAnchorY = y - rotationDistance;\n\n const rotationAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n rotationAnchor.setAttribute('cx', rotationAnchorX);\n rotationAnchor.setAttribute('cy', rotationAnchorY);\n rotationAnchor.setAttribute('r', anchorRadius);\n rotationAnchor.setAttribute('class', 'rotation-anchor');\n rotationAnchor.setAttribute('fill', '#121212');\n rotationAnchor.setAttribute('stroke', '#5B57D1');\n rotationAnchor.setAttribute('stroke-width', anchorStrokeWidth);\n rotationAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n rotationAnchor.setAttribute('style', 'pointer-events: all; cursor: grab;');\n rotationAnchor.setAttribute('transform', `rotate(${rotation}, ${centerX}, ${centerY})`);\n\n svg.appendChild(rotationAnchor);\n registerRotationAnchor(rotationAnchor, { radius: 5, edgeY: y });\n\n rotationAnchor.addEventListener('pointerdown', startRotation);\n rotationAnchor.addEventListener('pointerup', stopRotation);\n\n rotationAnchor.addEventListener('mouseover', function() {\n if (!isRotatingIcon && !isDragging) {\n rotationAnchor.style.cursor = 'grab';\n }\n });\n\n rotationAnchor.addEventListener('mouseout', function() {\n if (!isRotatingIcon && !isDragging) {\n rotationAnchor.style.cursor = 'default';\n }\n });\n}\n\nfunction removeRotationAnchor() {\n const svg = getSVGElement();\n if (!svg) return;\n\n svg.querySelectorAll(\".rotation-anchor\").forEach(el => el.remove());\n}\n\nfunction removeResizeAnchors() {\n const svg = getSVGElement();\n if (!svg) return;\n\n const anchors = svg.querySelectorAll(\".resize-anchor\");\n anchors.forEach(anchor => svg.removeChild(anchor));\n}\n\nfunction startResize(event) {\n event.preventDefault();\n event.stopPropagation();\n\n currentAnchor = event.target;\n\n originalX = parseFloat(selectedIcon.getAttribute('x')) || 0;\n originalY = parseFloat(selectedIcon.getAttribute('y')) || 0;\n originalWidth = parseFloat(selectedIcon.getAttribute('width')) || 100;\n originalHeight = parseFloat(selectedIcon.getAttribute('height')) || 100;\n\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(event);\n currentAnchor.startMouseX = mouseX;\n currentAnchor.startMouseY = mouseY;\n\n currentAnchor.iconRotation = iconRotation;\n\n const svg = getSVGElement();\n if (svg) {\n svg.addEventListener('pointermove', resizeIcon);\n }\n document.addEventListener('pointerup', stopResize);\n}\n\nfunction stopResize(event) {\n stopInteracting();\n document.removeEventListener('pointerup', stopResize);\n}\n\nfunction resizeIcon(event) {\n if (!selectedIcon || !currentAnchor) return;\n\n const { x: currentMouseX, y: currentMouseY } = getSVGCoordsFromMouse(event);\n\n const rotation = currentAnchor.iconRotation || 0;\n const rotationRad = (rotation * Math.PI) / 180;\n\n const rawDeltaX = currentMouseX - currentAnchor.startMouseX;\n const rawDeltaY = currentMouseY - currentAnchor.startMouseY;\n\n // Rotate delta to local (unrotated) space\n const deltaX = rawDeltaX * Math.cos(-rotationRad) - rawDeltaY * Math.sin(-rotationRad);\n const deltaY = rawDeltaX * Math.sin(-rotationRad) + rawDeltaY * Math.cos(-rotationRad);\n\n let newWidth = originalWidth;\n let newHeight = originalHeight;\n let newX = originalX;\n let newY = originalY;\n\n // Track which corner is fixed (relative to original rect)\n let fixedRelX, fixedRelY;\n\n switch (currentAnchor.style.cursor) {\n case \"nw-resize\":\n newWidth = Math.max(minIconSize, originalWidth - deltaX);\n newHeight = Math.max(minIconSize, originalHeight - deltaY);\n if (aspect_ratio_lock) {\n const scale = Math.min(newWidth / originalWidth, newHeight / originalHeight);\n newWidth = originalWidth * scale;\n newHeight = originalHeight * scale;\n }\n newX = originalX + (originalWidth - newWidth);\n newY = originalY + (originalHeight - newHeight);\n fixedRelX = originalWidth; fixedRelY = originalHeight;\n break;\n case \"ne-resize\":\n newWidth = Math.max(minIconSize, originalWidth + deltaX);\n newHeight = Math.max(minIconSize, originalHeight - deltaY);\n if (aspect_ratio_lock) {\n const scale = Math.max(newWidth / originalWidth, newHeight / originalHeight);\n newWidth = originalWidth * scale;\n newHeight = originalHeight * scale;\n }\n newX = originalX;\n newY = originalY + (originalHeight - newHeight);\n fixedRelX = 0; fixedRelY = originalHeight;\n break;\n case \"sw-resize\":\n newWidth = Math.max(minIconSize, originalWidth - deltaX);\n newHeight = Math.max(minIconSize, originalHeight + deltaY);\n if (aspect_ratio_lock) {\n const scale = Math.max(newWidth / originalWidth, newHeight / originalHeight);\n newWidth = originalWidth * scale;\n newHeight = originalHeight * scale;\n }\n newX = originalX + (originalWidth - newWidth);\n newY = originalY;\n fixedRelX = originalWidth; fixedRelY = 0;\n break;\n case \"se-resize\":\n newWidth = Math.max(minIconSize, originalWidth + deltaX);\n newHeight = Math.max(minIconSize, originalHeight + deltaY);\n if (aspect_ratio_lock) {\n const scale = Math.max(newWidth / originalWidth, newHeight / originalHeight);\n newWidth = originalWidth * scale;\n newHeight = originalHeight * scale;\n }\n newX = originalX;\n newY = originalY;\n fixedRelX = 0; fixedRelY = 0;\n break;\n }\n\n // Compensate for rotation center shift when rotated\n if (rotation !== 0) {\n const cosR = Math.cos(rotationRad);\n const sinR = Math.sin(rotationRad);\n\n // Compute rotated world position of the fixed corner in the original rect\n const oldCX = originalX + originalWidth / 2;\n const oldCY = originalY + originalHeight / 2;\n const odx = (originalX + fixedRelX) - oldCX;\n const ody = (originalY + fixedRelY) - oldCY;\n const fixedWorldX = oldCX + odx * cosR - ody * sinR;\n const fixedWorldY = oldCY + odx * sinR + ody * cosR;\n\n // Determine where the fixed corner sits in the new rect\n const fixedNewRelX = fixedRelX === 0 ? 0 : newWidth;\n const fixedNewRelY = fixedRelY === 0 ? 0 : newHeight;\n\n // Solve for new origin so the fixed corner stays in place\n const ncx = newWidth / 2;\n const ncy = newHeight / 2;\n const ndx = fixedNewRelX - ncx;\n const ndy = fixedNewRelY - ncy;\n const rotX = ncx + ndx * cosR - ndy * sinR;\n const rotY = ncy + ndx * sinR + ndy * cosR;\n\n newX = fixedWorldX - rotX;\n newY = fixedWorldY - rotY;\n }\n\n selectedIcon.setAttribute('width', newWidth);\n selectedIcon.setAttribute('height', newHeight);\n selectedIcon.setAttribute('x', newX);\n selectedIcon.setAttribute('y', newY);\n\n selectedIcon.setAttribute('data-shape-x', newX);\n selectedIcon.setAttribute('data-shape-y', newY);\n selectedIcon.setAttribute('data-shape-width', newWidth);\n selectedIcon.setAttribute('data-shape-height', newHeight);\n\n const vbWidth = parseFloat(selectedIcon.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(selectedIcon.getAttribute('data-viewbox-height')) || 24;\n const iconScale = newWidth / Math.max(vbWidth, vbHeight);\n const localCenterX = newWidth / 2 / iconScale;\n const localCenterY = newHeight / 2 / iconScale;\n selectedIcon.setAttribute('transform', `translate(${newX}, ${newY}) scale(${iconScale}) rotate(${iconRotation}, ${localCenterX}, ${localCenterY})`);\n\n updateArrowsForShape(selectedIcon);\n\n addSelectionOutline();\n}\n\nfunction dragIcon(event) {\n if (!isDragging || !selectedIcon) return;\n\n const { x, y } = getSVGCoordsFromMouse(event);\n let newX = x - dragOffsetX;\n let newY = y - dragOffsetY;\n\n selectedIcon.setAttribute('x', newX);\n selectedIcon.setAttribute('y', newY);\n\n selectedIcon.setAttribute('data-shape-x', newX);\n selectedIcon.setAttribute('data-shape-y', newY);\n\n const width = parseFloat(selectedIcon.getAttribute('width')) || 100;\n const height = parseFloat(selectedIcon.getAttribute('height')) || 100;\n const vbWidth = parseFloat(selectedIcon.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(selectedIcon.getAttribute('data-viewbox-height')) || 24;\n const scale = width / Math.max(vbWidth, vbHeight);\n const localCenterX = width / 2 / scale;\n const localCenterY = height / 2 / scale;\n \n selectedIcon.setAttribute('transform', `translate(${newX}, ${newY}) scale(${scale}) rotate(${iconRotation}, ${localCenterX}, ${localCenterY})`);\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const iconShape = shapes.find(shape => shape.shapeName === 'icon' && shape.element === selectedIcon);\n if (iconShape) {\n iconShape.x = newX;\n iconShape.y = newY;\n iconShape.updateFrameContainment();\n }\n }\n\n updateArrowsForShape(selectedIcon);\n\n removeSelection();\n addSelectionOutline();\n}\n\nfunction stopDrag(event) {\n if (!isDragging) return;\n \n console.log(\"stop dragging icon\");\n isDragging = false;\n if (window.__iconShapeState) window.__iconShapeState.isDragging = false;\n\n document.removeEventListener('pointermove', dragIcon);\n document.removeEventListener('pointerup', stopDrag);\n window.removeEventListener('pointerup', stopDrag);\n \n const svg = getSVGElement();\n if (svg) {\n svg.removeEventListener('pointerup', stopDrag);\n }\n \n document.removeEventListener('dragstart', preventDefaultDrag);\n document.removeEventListener('selectstart', preventDefaultDrag);\n \n stopInteracting();\n}\n\nfunction startRotation(event) {\n event.preventDefault();\n event.stopPropagation();\n\n if (!selectedIcon) return;\n\n isRotatingIcon = true;\n console.log(selectedIcon)\n const iconX = parseFloat(selectedIcon.getAttribute('x'));\n const iconY = parseFloat(selectedIcon.getAttribute('y'));\n const iconWidth = parseFloat(selectedIcon.getAttribute('width'));\n const iconHeight = parseFloat(selectedIcon.getAttribute('height'));\n\n const centerX = iconX + iconWidth / 2;\n const centerY = iconY + iconHeight / 2;\n\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(event);\n\n startRotationMouseAngle = Math.atan2(mouseY - centerY, mouseX - centerX) * 180 / Math.PI;\n console.log('Start rotation mouse angle:', startRotationMouseAngle);\n startIconRotation = iconRotation;\n\n const svg = getSVGElement();\n if (svg) {\n svg.addEventListener('pointermove', rotateIcon);\n svg.style.cursor = 'grabbing';\n }\n document.addEventListener('pointerup', stopRotation);\n}\n\nfunction rotateIcon(event) {\n if (!isRotatingIcon || !selectedIcon) return;\n\n const iconX = parseFloat(selectedIcon.getAttribute('x')) || 0;\n const iconY = parseFloat(selectedIcon.getAttribute('y')) || 0;\n const iconWidth = parseFloat(selectedIcon.getAttribute('width')) || 100;\n const iconHeight = parseFloat(selectedIcon.getAttribute('height')) || 100;\n\n const centerX = iconX + iconWidth / 2;\n const centerY = iconY + iconHeight / 2;\n\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(event);\n\n const currentMouseAngle = Math.atan2(mouseY - centerY, mouseX - centerX) * 180 / Math.PI;\n const angleDiff = currentMouseAngle - startRotationMouseAngle;\n\n iconRotation = startIconRotation + angleDiff;\n iconRotation = iconRotation % 360;\n if (iconRotation < 0) iconRotation += 360;\n\n const vbWidth = parseFloat(selectedIcon.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(selectedIcon.getAttribute('data-viewbox-height')) || 24;\n const scale = iconWidth / Math.max(vbWidth, vbHeight);\n const localCenterX = iconWidth / 2 / scale;\n const localCenterY = iconHeight / 2 / scale;\n\n selectedIcon.setAttribute('transform', `translate(${iconX}, ${iconY}) scale(${scale}) rotate(${iconRotation}, ${localCenterX}, ${localCenterY})`);\n\n selectedIcon.setAttribute('data-shape-rotation', iconRotation);\n\n updateArrowsForShape(selectedIcon);\n\n removeSelection();\n addSelectionOutline();\n}\n\nfunction stopRotation(event) {\n if (!isRotatingIcon) return;\n stopInteracting();\n isRotatingIcon = false;\n startRotationMouseAngle = null;\n startIconRotation = null;\n\n const svg = getSVGElement();\n if (svg) {\n svg.removeEventListener('pointermove', rotateIcon);\n svg.style.cursor = 'default';\n }\n document.removeEventListener('pointerup', stopRotation);\n}\n\nfunction stopInteracting() {\n if (selectedIcon && (isDragging || isRotatingIcon || currentAnchor)) {\n const newPos = {\n x: parseFloat(selectedIcon.getAttribute('x')) || 0,\n y: parseFloat(selectedIcon.getAttribute('y')) || 0,\n width: parseFloat(selectedIcon.getAttribute('width')) || 100,\n height: parseFloat(selectedIcon.getAttribute('height')) || 100,\n rotation: iconRotation\n };\n\n let originalRotation = iconRotation;\n if (isRotatingIcon && startIconRotation !== null) {\n originalRotation = startIconRotation;\n }\n\n const oldPos = {\n x: originalX,\n y: originalY,\n width: originalWidth,\n height: originalHeight,\n rotation: originalRotation\n };\n\n let iconShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n iconShape = shapes.find(shape => shape.shapeName === 'icon' && shape.element === selectedIcon);\n if (iconShape) {\n iconShape.x = newPos.x;\n iconShape.y = newPos.y;\n iconShape.width = newPos.width;\n iconShape.height = newPos.height;\n iconShape.rotation = newPos.rotation;\n }\n }\n\n const oldPosWithFrame = {\n ...oldPos,\n parentFrame: draggedShapeInitialFrameIcon\n };\n // Issue #34 bug #2: for drag, hoveredFrameIcon tracks the actual\n // destination \u2014 currentShape.parentFrame is still the OLD frame.\n // Resize / rotate don't track hover, so fall back to whatever the\n // shape itself reports (parent doesn't change for those gestures).\n const newPosWithFrame = {\n ...newPos,\n parentFrame: isDragging\n ? (hoveredFrameIcon || null)\n : (iconShape ? iconShape.parentFrame : null),\n };\n\n const stateChanged = newPos.x !== oldPos.x || newPos.y !== oldPos.y ||\n newPos.width !== oldPos.width || newPos.height !== oldPos.height ||\n newPos.rotation !== oldPos.rotation;\n const frameChanged = oldPosWithFrame.parentFrame !== newPosWithFrame.parentFrame;\n\n if ((stateChanged || frameChanged) && iconShape) {\n pushTransformAction(iconShape, oldPosWithFrame, newPosWithFrame);\n }\n\n if (isDragging && iconShape) {\n const finalFrame = hoveredFrameIcon;\n\n if (draggedShapeInitialFrameIcon !== finalFrame) {\n if (draggedShapeInitialFrameIcon) {\n draggedShapeInitialFrameIcon.removeShapeFromFrame(iconShape);\n }\n\n if (finalFrame) {\n finalFrame.addShapeToFrame(iconShape);\n }\n\n if (frameChanged) {\n pushFrameAttachmentAction(finalFrame || draggedShapeInitialFrameIcon, iconShape,\n finalFrame ? 'attach' : 'detach', draggedShapeInitialFrameIcon);\n }\n } else if (draggedShapeInitialFrameIcon) {\n draggedShapeInitialFrameIcon.restoreToFrame(iconShape);\n }\n }\n\n draggedShapeInitialFrameIcon = null;\n }\n\n if (hoveredFrameIcon) {\n hoveredFrameIcon.removeHighlight();\n hoveredFrameIcon = null;\n if (window.__iconShapeState) window.__iconShapeState.hoveredFrameIcon = null;\n }\n\n isDragging = false;\n if (window.__iconShapeState) window.__iconShapeState.isDragging = false;\n isRotatingIcon = false;\n\n const svg = getSVGElement();\n if (svg) {\n svg.removeEventListener('pointermove', dragIcon);\n svg.removeEventListener('pointermove', resizeIcon);\n svg.removeEventListener('pointermove', rotateIcon);\n }\n \n document.removeEventListener('pointermove', dragIcon);\n document.removeEventListener('pointermove', resizeIcon);\n document.removeEventListener('pointermove', rotateIcon);\n \n currentAnchor = null;\n startRotationMouseAngle = null;\n startIconRotation = null;\n\n if (selectedIcon) {\n originalX = parseFloat(selectedIcon.getAttribute('x')) || 0;\n originalY = parseFloat(selectedIcon.getAttribute('y')) || 0;\n originalWidth = parseFloat(selectedIcon.getAttribute('width')) || 100;\n originalHeight = parseFloat(selectedIcon.getAttribute('height')) || 100;\n\n selectedIcon.setAttribute('data-shape-x', originalX);\n selectedIcon.setAttribute('data-shape-y', originalY);\n selectedIcon.setAttribute('data-shape-width', originalWidth);\n selectedIcon.setAttribute('data-shape-height', originalHeight);\n selectedIcon.setAttribute('data-shape-rotation', iconRotation);\n\n updateArrowsForShape(selectedIcon);\n }\n}\n\nfunction deleteCurrentIcon() {\n if (selectedIcon) {\n let iconShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n iconShape = shapes.find(shape => shape.shapeName === 'icon' && shape.element === selectedIcon);\n if (iconShape) {\n const idx = shapes.indexOf(iconShape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n if (iconShape.group && iconShape.group.parentNode) {\n iconShape.group.parentNode.removeChild(iconShape.group);\n }\n }\n }\n\n if (!iconShape && selectedIcon.parentNode) {\n selectedIcon.parentNode.removeChild(selectedIcon);\n }\n\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(selectedIcon);\n }\n\n if (iconShape) {\n pushDeleteAction(iconShape);\n }\n\n removeSelection();\n selectedIcon = null;\n }\n}\n\ndocument.addEventListener('keydown', (e) => {\n if (e.key === 'Delete' && selectedIcon) {\n deleteCurrentIcon();\n }\n});\n\nasync function fetchIconsFromServer() {\n try {\n const apiUrl = \"/api/icons/feed?offset=0&limit=20\";\n \n const response = await fetch(apiUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const data = await response.json();\n return data.results;\n } catch (error) {\n console.error('Failed to fetch icons from server:', error);\n return null;\n }\n}\n\nasync function renderIconsFromServer() {\n const icons = await fetchIconsFromServer();\n if (icons) {\n document.getElementById(\"iconsContainer\").innerHTML = '';\n\n for (const icon of icons) {\n try {\n const response = await fetch(`/api/icons/serve?name=${encodeURIComponent(icon.filename)}`);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const svgContent = await response.text();\n\n const normalizedSVG = normalizeSVGSize(svgContent);\n\n // Use normalizedSVG for display, not original svgContent\n let svgIcon = `<div class=\"icons\" data-url=\"${icon.filename}\" data-svg=\"${encodeURIComponent(normalizedSVG)}\">\n ${normalizedSVG}\n </div>`;\n document.getElementById(\"iconsContainer\").innerHTML += svgIcon;\n } catch (error) {\n console.error('Failed to render icon:', icon.filename, error);\n }\n }\n\n addIconClickListeners();\n }\n}\n\nasync function searchAndRenderIcons(query) {\n try {\n const apiUrl = `/api/icons/search?q=${encodeURIComponent(query)}`;\n \n const response = await fetch(apiUrl);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n const searchResults = await response.json();\n\n document.getElementById(\"iconsContainer\").innerHTML = '';\n\n for (const icon of searchResults) {\n try {\n const svgResponse = await fetch(`/api/icons/serve?name=${encodeURIComponent(icon.filename)}`);\n if (!svgResponse.ok) {\n throw new Error(`HTTP error! status: ${svgResponse.status}`);\n }\n const svgContent = await svgResponse.text();\n\n const normalizedSVG = normalizeSVGSize(svgContent);\n\n // Use normalizedSVG for display, not original svgContent\n let svgIcon = `<div class=\"icons\" data-url=\"${icon.filename}\">\n ${normalizedSVG}\n </div>`;\n document.getElementById(\"iconsContainer\").innerHTML += svgIcon;\n } catch (error) {\n console.error('Failed to render search result:', icon.filename, error);\n }\n }\n\n addIconClickListeners();\n\n } catch (error) {\n console.error('Failed to search icons:', error);\n }\n}\n\nfunction normalizeSVGSize(svgContent, fillColor = '#fff', strokeColor = null) {\n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = svgContent;\n const svgElement = tempDiv.querySelector('svg');\n \n if (svgElement) {\n const originalViewBox = svgElement.getAttribute('viewBox');\n \n svgElement.setAttribute('width', '35');\n svgElement.setAttribute('height', '35');\n \n if (!originalViewBox) {\n const width = svgElement.getAttribute('width') || '24';\n const height = svgElement.getAttribute('height') || '24';\n const numWidth = parseFloat(width);\n const numHeight = parseFloat(height);\n \n if (!isNaN(numWidth) && !isNaN(numHeight)) {\n svgElement.setAttribute('viewBox', `0 0 ${numWidth} ${numHeight}`);\n }\n }\n \n // Apply custom styling with more selective logic\n const applyCustomStyling = (element) => {\n if (element.nodeType === 1) {\n const tagName = element.tagName.toLowerCase();\n \n // Only apply to shape elements, not container elements like 'g'\n if (['path', 'circle', 'rect', 'polygon', 'ellipse', 'polyline', 'line'].includes(tagName)) {\n const currentFill = element.getAttribute('fill');\n const currentStroke = element.getAttribute('stroke');\n \n // Check if parent <g> has explicit colors - if so, don't override\n let parentG = element.parentElement;\n let hasParentColor = false;\n \n while (parentG && parentG.tagName.toLowerCase() === 'g') {\n if (parentG.getAttribute('fill') || parentG.getAttribute('stroke')) {\n hasParentColor = true;\n break;\n }\n parentG = parentG.parentElement;\n }\n \n // Only apply white fill if:\n // 1. Element doesn't have explicit 'none' fill\n // 2. Element doesn't already have a specific color (other than black/default)\n // 3. Parent <g> doesn't have explicit colors\n if (!hasParentColor && currentFill !== 'none') {\n // Only override if it's black, default, or unset\n if (!currentFill || currentFill === '#000' || currentFill === '#000000' || currentFill === 'black' || currentFill === 'currentColor') {\n element.setAttribute('fill', fillColor);\n }\n }\n \n // Handle stroke similarly\n if (strokeColor && !hasParentColor) {\n if (currentStroke && currentStroke !== 'none') {\n if (!currentStroke || currentStroke === '#000' || currentStroke === '#000000' || currentStroke === 'black' || currentStroke === 'currentColor') {\n element.setAttribute('stroke', strokeColor);\n }\n }\n }\n }\n \n // Recursively process children\n for (let i = 0; i < element.children.length; i++) {\n applyCustomStyling(element.children[i]);\n }\n }\n };\n \n applyCustomStyling(svgElement);\n \n return svgElement.outerHTML;\n }\n\n return svgContent;\n}\n\nfunction addIconClickListeners() {\n const iconElements = document.querySelectorAll('#iconsContainer .icons');\n iconElements.forEach(iconElement => {\n iconElement.addEventListener('click', (e) => {\n const filename = iconElement.getAttribute('data-url') || 'unknown';\n handleIconClick(e, filename);\n });\n });\n}\n\n// Legacy category/search listeners disabled \u2014 React IconSidebar handles all icon UI\n\nfunction handleIconClick(event, filename) {\n event.stopPropagation();\n\n const iconElement = event.currentTarget;\n const svgElement = iconElement.querySelector('svg');\n\n if (svgElement) {\n iconToPlace = svgElement.outerHTML;\n isDraggingIcon = true;\n isIconToolActive = true;\n\n console.log('Icon selected and ready to place:', filename);\n\n const iconContainer = document.getElementById('iconsToolBar');\n if (iconContainer) {\n iconContainer.classList.add('hidden');\n }\n\n document.body.style.cursor = 'crosshair';\n }\n}\n\n\n\n// Clean up any lingering miniature icon or drag state (called on tool switch)\nfunction cleanupIconTool() {\n if (currentIconElement) {\n const svg = getSVGElement();\n if (svg && currentIconElement.parentNode === svg) {\n svg.removeChild(currentIconElement);\n }\n currentIconElement = null;\n }\n isDraggingIcon = false;\n iconToPlace = null;\n document.body.style.cursor = 'default';\n}\nwindow.__cleanupIconTool = cleanupIconTool;\n\n// Bridge for React sidebar to trigger icon placement\nwindow.prepareIconPlacement = function(svgContent) {\n iconToPlace = svgContent;\n isDraggingIcon = true;\n window.isIconToolActive = true;\n document.body.style.cursor = 'crosshair';\n};\n\n// Bridge for IconShape to call selectIcon and removeSelection\nwindow.__iconToolSelectIcon = selectIcon;\nwindow.__iconToolRemoveSelection = removeSelection;\n\n// Legacy icon rendering disabled \u2014 React IconSidebar handles icon UI\n\nexport { handleMouseDownIcon, handleMouseMoveIcon, handleMouseUpIcon, startDrag, stopDrag}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["svg", "iconX", "iconY"]
|
|
7
|
+
}
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
calculateSnap,
|
|
4
4
|
clearSnapGuides,
|
|
5
5
|
updateAttachedArrows
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-O64N5JPO.js";
|
|
7
7
|
import {
|
|
8
8
|
pushCreateAction,
|
|
9
9
|
pushDeleteAction,
|
|
10
10
|
pushFrameAttachmentAction,
|
|
11
11
|
pushOptionsChangeAction,
|
|
12
12
|
pushTransformAction
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-MYYBFZD3.js";
|
|
14
14
|
|
|
15
15
|
// src/tools/freehandTool.js
|
|
16
16
|
function getThemeStroke() {
|
|
@@ -561,4 +561,4 @@ export {
|
|
|
561
561
|
handleMouseMove,
|
|
562
562
|
handleMouseUp
|
|
563
563
|
};
|
|
564
|
-
//# sourceMappingURL=chunk-
|
|
564
|
+
//# sourceMappingURL=chunk-2V7G2PLX.js.map
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
pushCreateAction,
|
|
4
4
|
pushDeleteAction,
|
|
5
5
|
pushTransformAction
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-MYYBFZD3.js";
|
|
7
7
|
|
|
8
8
|
// src/tools/frameTool.js
|
|
9
9
|
var currentFrame = null;
|
|
@@ -232,4 +232,4 @@ export {
|
|
|
232
232
|
handleMouseMove,
|
|
233
233
|
handleMouseUp
|
|
234
234
|
};
|
|
235
|
-
//# sourceMappingURL=chunk-
|
|
235
|
+
//# sourceMappingURL=chunk-6G3ITAS5.js.map
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import {
|
|
3
|
+
registerRotationAnchor
|
|
4
|
+
} from "./chunk-PAKA6HUX.js";
|
|
2
5
|
import {
|
|
3
6
|
cleanupAttachments,
|
|
4
7
|
updateAttachedArrows
|
|
5
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-O64N5JPO.js";
|
|
6
9
|
import {
|
|
7
10
|
pushCreateAction,
|
|
8
11
|
pushDeleteActionWithAttachments,
|
|
@@ -11,7 +14,7 @@ import {
|
|
|
11
14
|
pushTransformAction,
|
|
12
15
|
setTextReferences,
|
|
13
16
|
updateSelectedElement
|
|
14
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-MYYBFZD3.js";
|
|
15
18
|
|
|
16
19
|
// src/tools/codeTool.js
|
|
17
20
|
function getThemeStroke() {
|
|
@@ -756,6 +759,7 @@ function createCodeSelectionFeedback(groupElement) {
|
|
|
756
759
|
rotationAnchor.style.cursor = "grab";
|
|
757
760
|
rotationAnchor.setAttribute("pointer-events", "all");
|
|
758
761
|
groupElement.appendChild(rotationAnchor);
|
|
762
|
+
registerRotationAnchor(rotationAnchor, { radius: 8, edgeY: selY });
|
|
759
763
|
codeResizeHandles.rotate = rotationAnchor;
|
|
760
764
|
rotationAnchor.addEventListener("pointerdown", (e) => {
|
|
761
765
|
if (window.isSelectionToolActive) {
|
|
@@ -816,7 +820,7 @@ function updateCodeSelectionFeedback() {
|
|
|
816
820
|
});
|
|
817
821
|
const rotationAnchor = codeResizeHandles.rotate;
|
|
818
822
|
if (rotationAnchor) {
|
|
819
|
-
const rotationAnchorPos = { x: selX + selWidth / 2, y: selY - 30 };
|
|
823
|
+
const rotationAnchorPos = { x: selX + selWidth / 2, y: selY - 30 / zoom };
|
|
820
824
|
rotationAnchor.setAttribute("cx", rotationAnchorPos.x);
|
|
821
825
|
rotationAnchor.setAttribute("cy", rotationAnchorPos.y);
|
|
822
826
|
}
|
|
@@ -1597,4 +1601,4 @@ export {
|
|
|
1597
1601
|
getCodeLanguage,
|
|
1598
1602
|
getSelectedCodeBlock
|
|
1599
1603
|
};
|
|
1600
|
-
//# sourceMappingURL=chunk-
|
|
1604
|
+
//# sourceMappingURL=chunk-73VLPCBC.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/tools/codeTool.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\n// Code tool event handlers - extracted from writeCode.js\nimport {\n pushCreateAction,\n pushDeleteActionWithAttachments,\n pushTransformAction,\n pushOptionsChangeAction,\n pushFrameAttachmentAction,\n setTextReferences,\n updateSelectedElement\n} from '../core/UndoRedo.js';\nimport { cleanupAttachments, updateAttachedArrows } from './arrowTool.js';\nimport { registerRotationAnchor } from '../core/ScreenSpaceControls.js';\n\nfunction getThemeStroke() { if (typeof document === \"undefined\") return \"#fff\"; return document.body && document.body.classList.contains(\"theme-dark\") ? \"#fff\" : \"#1a1a2e\"; }\n\nlet codeTextSize = \"25px\";\nlet codeTextFont = \"lixCode\";\nlet codeTextColor = null;\nlet codeTextAlign = \"left\";\nlet codeLanguage = \"auto\";\n\nlet codeTextColorOptions = document.querySelectorAll(\".textColorSpan\");\nlet codeTextFontOptions = document.querySelectorAll(\".textFontSpan\");\nlet codeTextSizeOptions = document.querySelectorAll(\".textSizeSpan\");\nlet codeTextAlignOptions = document.querySelectorAll(\".textAlignSpan\"); \n\nlet selectedCodeBlock = null;\nlet codeSelectionBox = null;\nlet codeResizeHandles = {};\nlet codeDragOffsetX, codeDragOffsetY;\nlet isCodeDragging = false;\nlet isCodeResizing = false;\nlet currentCodeResizeHandle = null;\nlet startCodeBBox = null;\nlet startCodeFontSize = null;\nlet startCodePoint = null;\nlet isCodeRotating = false;\nlet codeRotationStartAngle = 0;\nlet codeRotationStartTransform = null;\nlet initialCodeHandlePosRelGroup = null;\nlet initialCodeGroupTx = 0;\nlet initialCodeGroupTy = 0;\n\n\n// Frame attachment variables for code blocks\nlet draggedCodeInitialFrame = null;\nlet hoveredCodeFrame = null;\n\n\nsetTextReferences(selectedCodeBlock, updateCodeSelectionFeedback, svg);\n\n\n// Convert group element to our CodeShape class\nfunction wrapCodeElement(groupElement) {\n const codeShape = new CodeShape(groupElement);\n // Double-click to edit code block (works with any tool)\n groupElement.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n const codeElement = groupElement.querySelector('text');\n if (codeElement) {\n makeCodeEditable(codeElement, groupElement, e);\n }\n });\n return codeShape;\n}\n\nfunction getSVGCoordinates(event, element = svg) {\n if (!svg || !svg.createSVGPoint) {\n console.error(\"SVG element or createSVGPoint method not available.\");\n return { x: 0, y: 0 };\n }\n let pt = svg.createSVGPoint();\n pt.x = event.clientX;\n pt.y = event.clientY;\n\n try {\n let screenCTM = (element && typeof element.getScreenCTM === 'function' && element.getScreenCTM()) || svg.getScreenCTM();\n if (!screenCTM) {\n console.error(\"Could not get Screen CTM.\");\n return { x: event.clientX, y: event.clientY };\n }\n let svgPoint = pt.matrixTransform(screenCTM.inverse());\n return {\n x: svgPoint.x,\n y: svgPoint.y,\n };\n } catch (error) {\n console.error(\"Error getting SVG coordinates:\", error);\n return { x: event.clientX, y: event.clientY };\n }\n}\n\n\nfunction addCodeBlock(event) {\n let { x, y } = getSVGCoordinates(event);\n\n let gElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"g\");\n gElement.setAttribute(\"data-type\", \"code-group\");\n gElement.setAttribute(\"transform\", `translate(${x}, ${y})`);\n\n // Create background rectangle for code block\n let backgroundRect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n backgroundRect.setAttribute(\"class\", \"code-background\");\n backgroundRect.setAttribute(\"x\", -10); // Padding\n backgroundRect.setAttribute(\"y\", -10); // Padding\n backgroundRect.setAttribute(\"width\", 300); // Initial width\n backgroundRect.setAttribute(\"height\", 60); // Initial height\n backgroundRect.setAttribute(\"fill\", \"#161b22\"); // GitHub dark background\n backgroundRect.setAttribute(\"stroke\", \"#30363d\");\n backgroundRect.setAttribute(\"stroke-width\", \"1\");\n backgroundRect.setAttribute(\"rx\", \"6\"); // Rounded corners\n backgroundRect.setAttribute(\"ry\", \"6\");\n gElement.appendChild(backgroundRect);\n\n // Create SVG text element\n let codeElement = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n let textAlignElement = \"start\";\n if (codeTextAlign === \"center\") textAlignElement = \"middle\";\n else if (codeTextAlign === \"right\") textAlignElement = \"end\";\n\n codeElement.setAttribute(\"x\", 0);\n codeElement.setAttribute(\"y\", 0);\n codeElement.setAttribute(\"fill\", codeTextColor ?? getThemeStroke());\n codeElement.setAttribute(\"font-size\", codeTextSize);\n codeElement.setAttribute(\"font-family\", codeTextFont);\n codeElement.setAttribute(\"text-anchor\", textAlignElement);\n codeElement.setAttribute(\"cursor\", \"text\");\n codeElement.setAttribute(\"white-space\", \"pre\");\n codeElement.setAttribute(\"dominant-baseline\", \"hanging\");\n codeElement.textContent = \"\";\n\n gElement.setAttribute(\"data-x\", x);\n gElement.setAttribute(\"data-y\", y);\n codeElement.setAttribute(\"data-initial-size\", codeTextSize);\n codeElement.setAttribute(\"data-initial-font\", codeTextFont);\n codeElement.setAttribute(\"data-initial-color\", codeTextColor ?? getThemeStroke());\n codeElement.setAttribute(\"data-initial-align\", codeTextAlign);\n codeElement.setAttribute(\"data-language\", codeLanguage);\n codeElement.setAttribute(\"data-type\", \"code\");\n gElement.appendChild(codeElement);\n svg.appendChild(gElement);\n \n // Attach ID to both group and code element\n const shapeID = `code-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n gElement.setAttribute('id', shapeID);\n codeElement.setAttribute('id', `${shapeID}-code`);\n \n // Create CodeShape wrapper for frame functionality\n const codeShape = wrapCodeElement(gElement);\n \n // Add to shapes array for arrow attachment and frame functionality\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.push(codeShape);\n }\n \n pushCreateAction({\n type: 'code',\n element: codeShape,\n shapeName: 'code'\n });\n\n makeCodeEditable(codeElement, gElement);\n}\n\n// Function to update highlight.js on content change\nfunction updateSyntaxHighlighting(editor) {\n if (window.hljs) {\n window.hljs.highlightElement(editor);\n }\n}\n\nfunction adjustCodeEditorSize(editor) {\n const foreignObject = editor.closest('foreignObject');\n const codeContainer = editor.closest('.svg-code-container');\n if (!foreignObject || !codeContainer) return;\n\n const svgRect = svg.getBoundingClientRect();\n\n // Allow textarea to expand freely\n editor.style.overflow = 'visible';\n editor.style.height = 'auto';\n editor.style.width = 'auto';\n editor.style.whiteSpace = 'pre'; // No wrapping\n\n // Calculate content size\n let minContentWidth = editor.scrollWidth + (parseFloat(codeContainer.style.paddingLeft) || 0) + (parseFloat(codeContainer.style.paddingRight) || 0);\n let minContentHeight = editor.scrollHeight + (parseFloat(codeContainer.style.paddingTop) || 0) + (parseFloat(codeContainer.style.paddingBottom) || 0);\n\n // Clamp to SVG bounds\n const editorRect = editor.getBoundingClientRect();\n const maxWidth = svgRect.width - (editorRect.left - svgRect.left);\n const maxHeight = svgRect.height - (editorRect.top - svgRect.top);\n\n let newWidth = Math.min(Math.max(minContentWidth, 50), maxWidth);\n let newHeight = Math.min(Math.max(minContentHeight, 30), maxHeight);\n\n foreignObject.setAttribute('width', newWidth);\n foreignObject.setAttribute('height', newHeight);\n\n editor.style.width = `${newWidth - (parseFloat(codeContainer.style.paddingLeft) || 0) - (parseFloat(codeContainer.style.paddingRight) || 0)}px`;\n editor.style.height = `${newHeight - (parseFloat(codeContainer.style.paddingTop) || 0) - (parseFloat(codeContainer.style.paddingBottom) || 0)}px`;\n\n // Overflow only if content exceeds container\n if (editor.scrollHeight > editor.clientHeight || editor.scrollWidth > editor.clientWidth) {\n editor.style.overflow = 'auto';\n } else {\n editor.style.overflow = 'hidden';\n }\n\n if (selectedCodeBlock && selectedCodeBlock.contains(foreignObject)) {\n updateCodeSelectionFeedback();\n }\n}\n\n\nfunction makeCodeEditable(codeElement, groupElement, clickEvent = null) {\n\n if (document.querySelector(\".svg-code-editor\")) {\n return;\n }\n\n if (selectedCodeBlock) {\n deselectCodeBlock();\n }\n\n // Hide the selection feedback for the element being edited\n removeCodeSelectionFeedback();\n\n // Create a container div for the code editor\n let editorContainer = document.createElement(\"div\");\n editorContainer.className = \"svg-code-container\";\n editorContainer.style.position = \"absolute\";\n editorContainer.style.zIndex = \"10000\";\n editorContainer.style.backgroundColor = \"#161b22\";\n editorContainer.style.border = \"1px solid #30363d\";\n editorContainer.style.borderRadius = \"6px\";\n editorContainer.style.padding = \"12px\";\n editorContainer.style.fontFamily = \"monospace\";\n editorContainer.style.overflow = \"hidden\";\n editorContainer.style.minWidth = \"200px\";\n editorContainer.style.minHeight = \"40px\";\n\n // Create the actual code editor\n let input = document.createElement(\"div\");\n input.className = \"svg-code-editor\";\n input.contentEditable = true;\n input.style.outline = \"none\";\n input.style.minHeight = \"30px\";\n input.style.maxHeight = \"400px\";\n input.style.overflowY = \"auto\";\n input.style.whiteSpace = \"pre\";\n input.style.fontFamily = \"lixCode, Consolas, 'Courier New', monospace\";\n input.style.fontSize = codeElement.getAttribute(\"font-size\") || codeTextSize;\n input.style.color = \"#c9d1d9\";\n input.style.lineHeight = \"1.4\";\n input.style.tabSize = \"4\";\n input.style.background = \"transparent\";\n\n // FIXED: Use the improved text extraction\n let codeContent = extractTextFromCodeElement(codeElement);\n\n // Set initial content with plain text (no highlighting initially)\n input.textContent = codeContent;\n\n editorContainer.appendChild(input);\n\n // Position the editor\n const svgRect = svg.getBoundingClientRect();\n let left = svgRect.left, top = svgRect.top;\n if (clickEvent) {\n left += clickEvent.clientX - svgRect.left;\n top += clickEvent.clientY - svgRect.top;\n } else {\n // fallback to code block position if no click event\n let groupTransformMatrix = svg.createSVGMatrix();\n if (groupElement && groupElement.transform && groupElement.transform.baseVal) {\n const transformList = groupElement.transform.baseVal;\n if (transformList.numberOfItems > 0) {\n const consolidatedTransform = transformList.consolidate();\n if (consolidatedTransform) {\n groupTransformMatrix = consolidatedTransform.matrix;\n }\n }\n }\n const codeBBox = codeElement.getBBox();\n let pt = svg.createSVGPoint();\n pt.x = codeBBox.x - 8;\n pt.y = codeBBox.y - 8;\n let screenPt = pt.matrixTransform(groupTransformMatrix.multiply(svg.getScreenCTM()));\n left = screenPt.x + svgRect.left;\n top = screenPt.y + svgRect.top;\n }\n editorContainer.style.left = `${left}px`;\n editorContainer.style.top = `${top}px`;\n\n document.body.appendChild(editorContainer);\n\n // Auto-resize function\n const adjustSize = () => {\n const maxWidth = svgRect.width - (left - svgRect.left);\n const maxHeight = svgRect.height - (top - svgRect.top);\n\n let newWidth = Math.max(300, Math.min(input.scrollWidth + 20, maxWidth));\n let newHeight = Math.max(40, Math.min(input.scrollHeight + 20, maxHeight));\n\n editorContainer.style.width = newWidth + 'px';\n editorContainer.style.height = newHeight + 'px';\n\n if (input.scrollHeight > input.clientHeight) {\n input.style.overflowY = 'auto';\n } else {\n input.style.overflowY = 'hidden';\n }\n };\n\n adjustSize();\n\n setTimeout(() => {\n input.focus();\n // Select all content\n const range = document.createRange();\n range.selectNodeContents(input);\n const selection = window.getSelection();\n selection.removeAllRanges();\n selection.addRange(range);\n\n // Apply initial syntax highlighting after focus\n applySyntaxHighlightingImproved(input);\n }, 50);\n\n // Input handling with duplicate prevention\n let highlightingTimeout = null;\n let isHighlighting = false;\n let lastContent = input.textContent;\n\n input.addEventListener('input', function(e) {\n if (isHighlighting) return;\n\n if (highlightingTimeout) {\n clearTimeout(highlightingTimeout);\n highlightingTimeout = null;\n }\n\n const currentContent = input.textContent || input.innerText || '';\n \n if (currentContent === lastContent) return;\n\n highlightingTimeout = setTimeout(() => {\n const contentAtTimeout = input.textContent || input.innerText || '';\n if (contentAtTimeout !== lastContent && !isHighlighting) {\n applySyntaxHighlightingImproved(input);\n lastContent = contentAtTimeout;\n adjustSize();\n }\n highlightingTimeout = null;\n }, 300);\n });\n\n // Handle special keys\n input.addEventListener(\"keydown\", function (e) {\n if (e.key === \"Tab\") {\n e.preventDefault();\n document.execCommand('insertText', false, '\\t');\n } else if (e.key === \"Enter\" && e.ctrlKey) {\n e.preventDefault();\n renderCodeFromEditor(input, codeElement, true);\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n renderCodeFromEditor(input, codeElement, true);\n }\n });\n\n // Store references\n input.originalCodeElement = codeElement;\n input.codeGroup = groupElement;\n input.isHighlighting = () => isHighlighting;\n input.setHighlighting = (state) => { isHighlighting = state; };\n input.clearHighlightTimeout = () => {\n if (highlightingTimeout) {\n clearTimeout(highlightingTimeout);\n highlightingTimeout = null;\n }\n };\n\n const handleClickOutside = (event) => {\n if (!editorContainer.contains(event.target)) {\n input.clearHighlightTimeout();\n renderCodeFromEditor(input, codeElement, true);\n document.removeEventListener('pointerdown', handleClickOutside, true);\n }\n };\n document.addEventListener('pointerdown', handleClickOutside, true);\n input.handleClickOutside = handleClickOutside;\n\n groupElement.style.display = \"none\";\n}\n\n\nfunction applySyntaxHighlightingImproved(editor) {\n if (!window.hljs) {\n return;\n }\n\n // Prevent multiple highlighting processes\n if (editor.isHighlighting && editor.isHighlighting()) {\n return;\n }\n\n // Set highlighting flag\n if (editor.setHighlighting) {\n editor.setHighlighting(true);\n }\n\n try {\n // Get current cursor position more reliably\n const selection = window.getSelection();\n let cursorOffset = 0;\n let cursorNode = null;\n let cursorNodeOffset = 0;\n \n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n cursorNode = range.startContainer;\n cursorNodeOffset = range.startOffset;\n \n // Calculate absolute cursor position\n cursorOffset = getCursorOffset(editor, cursorNode, cursorNodeOffset);\n }\n\n // Get the plain text content\n const code = editor.textContent || editor.innerText || '';\n \n // Only apply highlighting if content is not empty\n if (!code.trim()) {\n return;\n }\n \n // Auto-detect language and highlight\n const result = window.hljs.highlightAuto(code);\n \n // Only update if the content is actually different\n const newHTML = result.value;\n if (editor.innerHTML !== newHTML) {\n // Apply highlighted HTML\n editor.innerHTML = newHTML;\n\n // Restore cursor position more accurately\n restoreCursorPositionImproved(editor, cursorOffset);\n }\n\n // Add detected language info (optional)\n if (result.language) {\n editor.setAttribute('data-language', result.language);\n }\n } catch (error) {\n } finally {\n // Always clear the highlighting flag\n if (editor.setHighlighting) {\n editor.setHighlighting(false);\n }\n }\n}\n\n\nfunction restoreCursorPositionImproved(editor, targetOffset) {\n if (targetOffset < 0) return;\n \n try {\n const selection = window.getSelection();\n const range = document.createRange();\n \n let currentOffset = 0;\n let targetNode = null;\n let targetNodeOffset = 0;\n \n const walker = document.createTreeWalker(\n editor,\n NodeFilter.SHOW_TEXT,\n null,\n false\n );\n \n let node;\n while (node = walker.nextNode()) {\n const nodeLength = node.textContent.length;\n \n if (currentOffset + nodeLength >= targetOffset) {\n targetNode = node;\n targetNodeOffset = Math.max(0, Math.min(targetOffset - currentOffset, nodeLength));\n break;\n }\n \n currentOffset += nodeLength;\n }\n \n if (targetNode) {\n range.setStart(targetNode, targetNodeOffset);\n range.collapse(true);\n \n selection.removeAllRanges();\n selection.addRange(range);\n } else {\n // Fallback: place cursor at end\n range.selectNodeContents(editor);\n range.collapse(false);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n } catch (error) {\n // Final fallback: just focus the editor\n try {\n editor.focus();\n } catch (focusError) {\n }\n }\n}\n\n// FIXED: More accurate cursor offset calculation\nfunction getCursorOffset(container, node, offset) {\n let cursorOffset = 0;\n \n if (!node || !container.contains(node)) {\n return 0;\n }\n \n const walker = document.createTreeWalker(\n container,\n NodeFilter.SHOW_TEXT,\n null,\n false\n );\n \n let currentNode;\n while (currentNode = walker.nextNode()) {\n if (currentNode === node) {\n return cursorOffset + Math.max(0, Math.min(offset, currentNode.textContent.length));\n }\n cursorOffset += currentNode.textContent.length;\n }\n \n return cursorOffset;\n}\n\n\nfunction extractTextFromCodeElement(codeElement) {\n if (!codeElement) return \"\";\n \n let codeContent = \"\";\n const childNodes = codeElement.childNodes;\n \n // If there are no child nodes, return empty\n if (childNodes.length === 0) {\n return codeElement.textContent || \"\";\n }\n \n for (let i = 0; i < childNodes.length; i++) {\n const node = childNodes[i];\n \n if (node.nodeType === Node.TEXT_NODE) {\n // Direct text content\n codeContent += node.textContent;\n } else if (node.tagName === 'tspan') {\n // Handle tspan elements - get all text content from this tspan\n const tspanText = node.textContent || \"\";\n codeContent += tspanText;\n \n // Add newline after each tspan except the last one\n // This assumes each tspan represents a line\n if (i < childNodes.length - 1) {\n const nextNode = childNodes[i + 1];\n if (nextNode && nextNode.tagName === 'tspan') {\n codeContent += \"\\n\";\n }\n }\n }\n }\n \n // Clean up the content - replace non-breaking spaces and normalize\n return codeContent.replace(/\\u00A0/g, ' ').replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n}\n\n// FIXED: Improved renderCodeFromEditor function\nfunction renderCodeFromEditor(input, codeElement, deleteIfEmpty = false) {\n const editorContainer = input.closest('.svg-code-container');\n if (!editorContainer || !document.body.contains(editorContainer)) {\n return;\n }\n\n // Get plain text content from the contenteditable div\n // FIXED: Use textContent instead of innerHTML to avoid HTML artifacts\n const code = input.textContent || input.innerText || \"\";\n const gElement = input.codeGroup;\n\n // Clean up event listeners\n if (input.handleClickOutside) {\n document.removeEventListener('pointerdown', input.handleClickOutside, true);\n }\n\n // Clear any pending highlighting timeouts\n if (input.clearHighlightTimeout) {\n input.clearHighlightTimeout();\n }\n\n document.body.removeChild(editorContainer);\n\n if (!gElement || !codeElement) {\n return;\n }\n\n if (!gElement.parentNode) {\n if (selectedCodeBlock === gElement) {\n deselectCodeBlock();\n }\n return;\n }\n\n if (deleteIfEmpty && code.trim() === \"\") {\n // Find the CodeShape wrapper\n let codeShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n codeShape = shapes.find(shape => shape.shapeName === 'code' && shape.group === gElement);\n if (codeShape) {\n const idx = shapes.indexOf(codeShape);\n if (idx !== -1) shapes.splice(idx, 1);\n }\n }\n\n pushDeleteActionWithAttachments({\n type: 'code',\n element: codeShape || gElement,\n shapeName: 'code'\n });\n\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(gElement);\n }\n\n svg.removeChild(gElement);\n if (selectedCodeBlock === gElement) {\n selectedCodeBlock = null;\n removeCodeSelectionFeedback();\n }\n } else {\n // FIXED: Clear existing content completely before adding new content\n while (codeElement.firstChild) {\n codeElement.removeChild(codeElement.firstChild);\n }\n\n // Reset text content to empty to ensure clean slate\n codeElement.textContent = \"\";\n\n // Apply syntax highlighting and create SVG tspans\n const storedLang = codeElement.getAttribute(\"data-language\") || \"auto\";\n const highlightedCode = applySyntaxHighlightingToSVG(code, storedLang);\n createHighlightedSVGText(highlightedCode, codeElement);\n\n // Update background rectangle to fit content\n updateCodeBackground(gElement, codeElement);\n\n gElement.style.display = 'block';\n\n // Update attached arrows after code content change\n if (typeof updateAttachedArrows === 'function') {\n updateAttachedArrows(gElement);\n }\n\n if (selectedCodeBlock === gElement) {\n setTimeout(updateCodeSelectionFeedback, 0);\n }\n }\n\n // After rendering code, switch to selection tool and auto-select\n if (gElement.parentNode) {\n if (window.__sketchStoreApi) {\n window.__sketchStoreApi.setActiveTool('select', { afterDraw: true });\n } else {\n window.isSelectionToolActive = true;\n }\n selectCodeBlock(gElement);\n }\n}\n\n// FIXED: Improved createHighlightedSVGText function\nfunction createHighlightedSVGText(highlightResult, parentElement) {\n if (!highlightResult || !highlightResult.value) {\n return;\n }\n\n const lines = highlightResult.value.split('\\n');\n const x = parentElement.getAttribute(\"x\") || 0;\n\n lines.forEach((line, index) => {\n const tspan = document.createElementNS(\"http://www.w3.org/2000/svg\", \"tspan\");\n tspan.setAttribute(\"x\", x);\n tspan.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.2em\");\n \n if (line.trim()) {\n // Create highlighted tspans for non-empty lines\n createHighlightedTspans(line, tspan, x);\n \n // If no child tspans were created (plain text), set the text content\n if (tspan.childNodes.length === 0) {\n tspan.textContent = line;\n }\n } else {\n // Empty line - add a space to maintain line height\n tspan.textContent = \" \";\n }\n \n parentElement.appendChild(tspan);\n });\n}\n\n\n\n\n\n\nfunction applySyntaxHighlightingToSVG(code, language) {\n if (!window.hljs) {\n return { value: code, language: null };\n }\n\n const lang = language || codeLanguage;\n if (lang && lang !== \"auto\") {\n try {\n return window.hljs.highlight(code, { language: lang });\n } catch (e) {\n // fallback to auto-detect\n }\n }\n return window.hljs.highlightAuto(code);\n}\n\n\nfunction applySyntaxHighlighting(editor) {\n if (!window.hljs) {\n return;\n }\n\n // Get the plain text content\n const code = editor.textContent || editor.innerText;\n \n // Auto-detect language and highlight\n const result = window.hljs.highlightAuto(code);\n \n // Store cursor position\n const selection = window.getSelection();\n let cursorPos = 0;\n if (selection.rangeCount > 0) {\n const range = selection.getRangeAt(0);\n cursorPos = range.startOffset;\n }\n\n // Apply highlighted HTML\n editor.innerHTML = result.value;\n\n // Restore cursor position\n restoreCursorPosition(editor, cursorPos);\n\n // Add detected language info (optional)\n if (result.language) {\n editor.setAttribute('data-language', result.language);\n }\n}\n\nfunction restoreCursorPosition(editor, position) {\n try {\n const range = document.createRange();\n const sel = window.getSelection();\n \n let textNode = null;\n let currentPos = 0;\n \n // Find the text node at the desired position\n const walker = document.createTreeWalker(\n editor,\n NodeFilter.SHOW_TEXT,\n null,\n false\n );\n \n while (walker.nextNode()) {\n const node = walker.currentNode;\n const textLength = node.textContent.length;\n \n if (currentPos + textLength >= position) {\n textNode = node;\n break;\n }\n currentPos += textLength;\n }\n \n if (textNode) {\n range.setStart(textNode, Math.min(position - currentPos, textNode.textContent.length));\n range.collapse(true);\n sel.removeAllRanges();\n sel.addRange(range);\n }\n } catch (error) {\n }\n}\n\n\nfunction renderCode(input, codeElement, deleteIfEmpty = false) {\n if (!input || !document.body.contains(input)) {\n return;\n }\n\n const code = input.value || \"\";\n const gElement = input.codeGroup;\n\n if (input.handleClickOutside) {\n document.removeEventListener('pointerdown', input.handleClickOutside, true);\n }\n\n document.body.removeChild(input);\n\n if (!gElement || !codeElement) {\n return;\n }\n\n if (!gElement.parentNode) {\n if (selectedCodeBlock === gElement) {\n deselectCodeBlock();\n }\n return;\n }\n\n if (deleteIfEmpty && code.trim() === \"\") {\n // Find the CodeShape wrapper\n let codeShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n codeShape = shapes.find(shape => shape.shapeName === 'code' && shape.group === gElement);\n if (codeShape) {\n const idx = shapes.indexOf(codeShape);\n if (idx !== -1) shapes.splice(idx, 1);\n }\n }\n\n pushDeleteActionWithAttachments({\n type: 'code',\n element: codeShape || gElement,\n shapeName: 'code'\n });\n\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(gElement);\n }\n\n svg.removeChild(gElement);\n if (selectedCodeBlock === gElement) {\n selectedCodeBlock = null;\n removeCodeSelectionFeedback();\n }\n } else {\n // Clear existing content\n while (codeElement.firstChild) {\n codeElement.removeChild(codeElement.firstChild);\n }\n\n // Split into lines and create tspans with syntax highlighting\n const lines = code.split(\"\\n\");\n const x = codeElement.getAttribute(\"x\") || 0;\n\n lines.forEach((line, index) => {\n if (window.hljs && line.trim()) {\n // Get syntax highlighting for the line\n const result = window.hljs.highlightAuto(line);\n createHighlightedTspans(result.value, codeElement, x, index === 0 ? \"0\" : \"1.2em\");\n } else {\n // Create plain tspan for empty lines or when hljs is not available\n let tspan = document.createElementNS(\"http://www.w3.org/2000/svg\", \"tspan\");\n tspan.setAttribute(\"x\", x);\n tspan.setAttribute(\"dy\", index === 0 ? \"0\" : \"1.2em\");\n tspan.textContent = line.replace(/\\u00A0/g, ' ') || \" \";\n codeElement.appendChild(tspan);\n }\n });\n\n // Update background rectangle to fit content\n updateCodeBackground(gElement, codeElement);\n\n gElement.style.display = 'block';\n\n // Update attached arrows after code content change\n updateAttachedArrows(gElement);\n\n if (selectedCodeBlock === gElement) {\n setTimeout(updateCodeSelectionFeedback, 0);\n }\n }\n\n // After rendering code, switch to selection tool and auto-select\n if (gElement.parentNode) {\n if (window.__sketchStoreApi) {\n window.__sketchStoreApi.setActiveTool('select', { afterDraw: true });\n } else {\n window.isSelectionToolActive = true;\n }\n selectCodeBlock(gElement);\n }\n}\n\n\nfunction createHighlightedTspans(highlightedHtml, parentTspan, x) {\n if (!highlightedHtml || !parentTspan) return;\n \n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = highlightedHtml;\n \n // Process all nodes in the highlighted HTML\n processHighlightedNodes(tempDiv, parentTspan);\n}\n\n\n\nfunction processHighlightedNodes(node, parentTspan) {\n if (!node || !parentTspan) return;\n \n for (let child of node.childNodes) {\n if (child.nodeType === Node.TEXT_NODE) {\n // Direct text content - add to parent tspan\n if (child.textContent) {\n if (parentTspan.textContent) {\n parentTspan.textContent += child.textContent;\n } else {\n parentTspan.textContent = child.textContent;\n }\n }\n } else if (child.nodeType === Node.ELEMENT_NODE) {\n // Create a new nested tspan for styled content\n let styledTspan = document.createElementNS(\"http://www.w3.org/2000/svg\", \"tspan\");\n styledTspan.textContent = child.textContent || \"\";\n \n // Apply comprehensive syntax highlighting colors\n const className = child.className || '';\n applyHighlightColor(styledTspan, className);\n \n parentTspan.appendChild(styledTspan);\n }\n }\n}\n\n\n\nfunction applyHighlightColor(tspan, className) {\n // GitHub Dark Dimmed theme colors\n if (className.includes('hljs-keyword') || className.includes('hljs-built_in')) {\n tspan.setAttribute(\"fill\", \"#ff7b72\"); // Red (keywords)\n } else if (className.includes('hljs-string') || className.includes('hljs-template-string')) {\n tspan.setAttribute(\"fill\", \"#a5d6ff\"); // Light blue (strings)\n } else if (className.includes('hljs-comment')) {\n tspan.setAttribute(\"fill\", \"#8b949e\"); // Gray (comments)\n tspan.setAttribute(\"font-style\", \"italic\");\n } else if (className.includes('hljs-number') || className.includes('hljs-literal')) {\n tspan.setAttribute(\"fill\", \"#79c0ff\"); // Blue (numbers/literals)\n } else if (className.includes('hljs-function') || className.includes('hljs-title')) {\n tspan.setAttribute(\"fill\", \"#d2a8ff\"); // Purple (functions)\n } else if (className.includes('hljs-variable') || className.includes('hljs-name')) {\n tspan.setAttribute(\"fill\", \"#ffa657\"); // Orange (variables)\n } else if (className.includes('hljs-type') || className.includes('hljs-class')) {\n tspan.setAttribute(\"fill\", \"#f0883e\"); // Orange (types)\n } else if (className.includes('hljs-operator') || className.includes('hljs-punctuation')) {\n tspan.setAttribute(\"fill\", \"#c9d1d9\"); // Light gray (operators)\n } else if (className.includes('hljs-property') || className.includes('hljs-attribute')) {\n tspan.setAttribute(\"fill\", \"#79c0ff\"); // Blue (properties)\n } else if (className.includes('hljs-tag')) {\n tspan.setAttribute(\"fill\", \"#7ee787\"); // Green (HTML tags)\n } else if (className.includes('hljs-meta') || className.includes('hljs-doctag')) {\n tspan.setAttribute(\"fill\", \"#8b949e\"); // Gray (meta)\n } else if (className.includes('hljs-regexp')) {\n tspan.setAttribute(\"fill\", \"#a5d6ff\"); // Light blue (regex)\n } else {\n tspan.setAttribute(\"fill\", \"#c9d1d9\"); // GitHub default text color\n }\n}\n\n\nfunction createCodeSelectionFeedback(groupElement) {\n if (!groupElement) return;\n removeCodeSelectionFeedback();\n\n const backgroundRect = groupElement.querySelector('.code-background');\n if (!backgroundRect) {\n return;\n }\n\n // Use background rect dimensions for selection feedback\n const x = parseFloat(backgroundRect.getAttribute('x'));\n const y = parseFloat(backgroundRect.getAttribute('y'));\n const width = parseFloat(backgroundRect.getAttribute('width'));\n const height = parseFloat(backgroundRect.getAttribute('height'));\n\n const zoom = window.currentZoom || 1;\n const padding = 8 / zoom;\n const handleSize = 10 / zoom;\n const handleOffset = handleSize / 2;\n\n const selX = x - padding;\n const selY = y - padding;\n const selWidth = width + 2 * padding;\n const selHeight = height + 2 * padding;\n\n // Draw selection outline (polyline)\n const outlinePoints = [\n [selX, selY],\n [selX + selWidth, selY],\n [selX + selWidth, selY + selHeight],\n [selX, selY + selHeight],\n [selX, selY]\n ];\n const pointsAttr = outlinePoints.map(p => p.join(',')).join(' ');\n codeSelectionBox = document.createElementNS(\"http://www.w3.org/2000/svg\", \"polyline\");\n codeSelectionBox.setAttribute(\"class\", \"selection-box\");\n codeSelectionBox.setAttribute(\"points\", pointsAttr);\n codeSelectionBox.setAttribute(\"fill\", \"none\");\n codeSelectionBox.setAttribute(\"stroke\", \"#5B57D1\");\n codeSelectionBox.setAttribute(\"stroke-width\", \"1.5\");\n codeSelectionBox.setAttribute(\"stroke-dasharray\", \"4 2\");\n codeSelectionBox.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n codeSelectionBox.setAttribute(\"pointer-events\", \"none\");\n groupElement.appendChild(codeSelectionBox);\n\n // Add resize handles and rotation anchor (rest of the function remains the same)\n const handlesData = [\n { name: 'nw', x: selX, y: selY, cursor: 'nwse-resize' },\n { name: 'ne', x: selX + selWidth, y: selY, cursor: 'nesw-resize' },\n { name: 'sw', x: selX, y: selY + selHeight, cursor: 'nesw-resize' },\n { name: 'se', x: selX + selWidth, y: selY + selHeight, cursor: 'nwse-resize' }\n ];\n codeResizeHandles = {};\n handlesData.forEach(handle => {\n const handleRect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n handleRect.setAttribute(\"class\", `resize-handle resize-handle-${handle.name}`);\n handleRect.setAttribute(\"x\", handle.x - handleOffset);\n handleRect.setAttribute(\"y\", handle.y - handleOffset);\n handleRect.setAttribute(\"width\", handleSize);\n handleRect.setAttribute(\"height\", handleSize);\n handleRect.setAttribute(\"fill\", \"#121212\");\n handleRect.setAttribute(\"stroke\", \"#5B57D1\");\n handleRect.setAttribute(\"stroke-width\", 2);\n handleRect.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n handleRect.style.cursor = handle.cursor;\n handleRect.setAttribute(\"data-anchor\", handle.name);\n groupElement.appendChild(handleRect);\n codeResizeHandles[handle.name] = handleRect;\n\n handleRect.addEventListener('pointerdown', (e) => {\n if (window.isSelectionToolActive) {\n e.stopPropagation();\n startCodeResize(e, handle.name);\n }\n });\n });\n\n \n const rotationAnchorPos = { x: selX + selWidth / 2, y: selY - 30 };\n const rotationAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n rotationAnchor.setAttribute('cx', rotationAnchorPos.x);\n rotationAnchor.setAttribute('cy', rotationAnchorPos.y);\n rotationAnchor.setAttribute('r', 8);\n rotationAnchor.setAttribute('class', 'rotate-anchor');\n rotationAnchor.setAttribute('fill', '#121212');\n rotationAnchor.setAttribute('stroke', '#5B57D1');\n rotationAnchor.setAttribute('stroke-width', 2);\n rotationAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n rotationAnchor.style.cursor = 'grab';\n rotationAnchor.setAttribute('pointer-events', 'all');\n groupElement.appendChild(rotationAnchor);\n registerRotationAnchor(rotationAnchor, { radius: 8, edgeY: selY });\n\n codeResizeHandles.rotate = rotationAnchor;\n\n rotationAnchor.addEventListener('pointerdown', (e) => {\n if (window.isSelectionToolActive) {\n e.stopPropagation();\n startCodeRotation(e);\n }\n });\n}\n\n\nfunction updateCodeBackground(groupElement, codeElement) {\n const backgroundRect = groupElement.querySelector('.code-background');\n if (!backgroundRect || !codeElement) return;\n\n const textBBox = codeElement.getBBox();\n const padding = 10;\n\n // Update background dimensions to fit text content\n backgroundRect.setAttribute(\"x\", textBBox.x - padding);\n backgroundRect.setAttribute(\"y\", textBBox.y - padding);\n backgroundRect.setAttribute(\"width\", textBBox.width + (padding * 2));\n backgroundRect.setAttribute(\"height\", textBBox.height + (padding * 2));\n}\n\n\nfunction updateCodeSelectionFeedback() {\n if (!selectedCodeBlock || !codeSelectionBox) return;\n\n const codeElement = selectedCodeBlock.querySelector('text');\n if (!codeElement) return;\n\n // Temporarily set display to 'block' if it was hidden to get correct bbox\n const wasHidden = selectedCodeBlock.style.display === 'none';\n if (wasHidden) selectedCodeBlock.style.display = 'block';\n\n const bbox = codeElement.getBBox(); // Fix: use codeElement, not undefined foreignObject\n\n if (wasHidden) selectedCodeBlock.style.display = 'none';\n\n if (bbox.width === 0 && bbox.height === 0 && codeElement.textContent.trim() !== \"\") {\n }\n\n const zoom = window.currentZoom || 1;\n const padding = 8 / zoom;\n const handleSize = 10 / zoom;\n const handleOffset = handleSize / 2;\n\n const selX = bbox.x - padding;\n const selY = bbox.y - padding;\n const selWidth = Math.max(bbox.width + 2 * padding, handleSize);\n const selHeight = Math.max(bbox.height + 2 * padding, handleSize);\n\n const outlinePoints = [\n [selX, selY],\n [selX + selWidth, selY],\n [selX + selWidth, selY + selHeight],\n [selX, selY + selHeight],\n [selX, selY]\n ];\n\n const pointsAttr = outlinePoints.map(p => p.join(',')).join(' ');\n codeSelectionBox.setAttribute(\"points\", pointsAttr);\n\n const handlesData = [\n { name: 'nw', x: selX, y: selY },\n { name: 'ne', x: selX + selWidth, y: selY },\n { name: 'sw', x: selX, y: selY + selHeight },\n { name: 'se', x: selX + selWidth, y: selY + selHeight }\n ];\n\n handlesData.forEach(handle => {\n const handleRect = codeResizeHandles[handle.name];\n if (handleRect) {\n handleRect.setAttribute(\"x\", handle.x - handleOffset);\n handleRect.setAttribute(\"y\", handle.y - handleOffset);\n }\n });\n\n const rotationAnchor = codeResizeHandles.rotate;\n if (rotationAnchor) {\n const rotationAnchorPos = { x: selX + selWidth / 2, y: selY - 30 / zoom };\n rotationAnchor.setAttribute('cx', rotationAnchorPos.x);\n rotationAnchor.setAttribute('cy', rotationAnchorPos.y);\n }\n}\n\n\n\nfunction startCodeRotation(event) {\n if (!selectedCodeBlock || event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n\n isCodeRotating = true;\n isCodeDragging = false;\n isCodeResizing = false;\n\n const codeElement = selectedCodeBlock.querySelector('text'); // Fix: use text element instead of foreignObject\n if (!codeElement) return;\n\n const bbox = codeElement.getBBox();\n const centerX = bbox.x + bbox.width / 2;\n const centerY = bbox.y + bbox.height / 2;\n\n const mousePos = getSVGCoordinates(event);\n\n let centerPoint = svg.createSVGPoint();\n centerPoint.x = centerX;\n centerPoint.y = centerY;\n\n const groupTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (groupTransform) {\n centerPoint = centerPoint.matrixTransform(groupTransform.matrix);\n }\n\n codeRotationStartAngle = Math.atan2(mousePos.y - centerPoint.y, mousePos.x - centerPoint.x) * 180 / Math.PI;\n\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n codeRotationStartTransform = currentTransform ? currentTransform.matrix : svg.createSVGMatrix();\n\n svg.style.cursor = 'grabbing';\n\n window.addEventListener('pointermove', handleCodeMouseMove); // Fix: use window instead of svg\n window.addEventListener('pointerup', handleCodeMouseUp);\n}\n\n\nfunction removeCodeSelectionFeedback() {\n if (selectedCodeBlock) {\n selectedCodeBlock.querySelectorAll(\".selection-box, .resize-handle, .rotate-anchor\").forEach(el => el.remove());\n }\n codeSelectionBox = null;\n codeResizeHandles = {};\n}\n\nfunction selectCodeBlock(groupElement) {\n if (!groupElement || !groupElement.parentNode) return;\n if (groupElement === selectedCodeBlock) return;\n\n deselectCodeBlock();\n selectedCodeBlock = groupElement;\n selectedCodeBlock.classList.add(\"selected\");\n createCodeSelectionFeedback(selectedCodeBlock);\n updateSelectedElement(selectedCodeBlock);\n\n // Update code toggle to reflect code mode\n const toggleSpans = document.querySelectorAll(\".textCodeSpan\");\n toggleSpans.forEach(el => el.classList.remove(\"selected\"));\n toggleSpans.forEach(el => {\n if (el.getAttribute(\"data-id\") === \"true\") el.classList.add(\"selected\");\n });\n // Show the text/code property panel via React bridge (pass 'code' to set code mode)\n if (window.__showSidebarForShape) window.__showSidebarForShape('code');\n}\n\nfunction deselectCodeBlock() {\n const activeEditor = document.querySelector(\".svg-code-editor[contenteditable='true']\");\n if (activeEditor) {\n let groupElement = activeEditor.originalGroup;\n if (groupElement) {\n renderCode(activeEditor, true);\n } else if (document.body.contains(activeEditor)){\n activeEditor.remove();\n }\n }\n if (selectedCodeBlock) {\n removeCodeSelectionFeedback();\n selectedCodeBlock.classList.remove(\"selected\");\n selectedCodeBlock = null;\n updateSelectedElement(null);\n }\n if (isCodeRotating) {\n isCodeRotating = false;\n codeRotationStartAngle = 0;\n codeRotationStartTransform = null;\n svg.style.cursor = 'default';\n window.removeEventListener('pointermove', handleCodeMouseMove);\n window.removeEventListener('pointerup', handleCodeMouseUp);\n }\n}\n\n\nfunction startCodeDrag(event) {\n if (!selectedCodeBlock || event.button !== 0) return;\n\n if (event.target.closest('.resize-handle')) {\n return;\n }\n\n isCodeDragging = true;\n isCodeResizing = false;\n event.preventDefault();\n\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n const initialTranslateX = currentTransform ? currentTransform.matrix.e : 0;\n const initialTranslateY = currentTransform ? currentTransform.matrix.f : 0;\n\n startCodePoint = getSVGCoordinates(event);\n\n codeDragOffsetX = startCodePoint.x - initialTranslateX;\n codeDragOffsetY = startCodePoint.y - initialTranslateY;\n\n // Find the CodeShape wrapper for frame functionality\n let codeShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n codeShape = shapes.find(shape => shape.shapeName === 'code' && shape.group === selectedCodeBlock);\n }\n\n if (codeShape) {\n // Store initial frame state\n draggedCodeInitialFrame = codeShape.parentFrame || null;\n \n // Temporarily remove from frame clipping if dragging\n if (codeShape.parentFrame) {\n codeShape.parentFrame.temporarilyRemoveFromFrame(codeShape);\n }\n }\n\n svg.style.cursor = 'grabbing';\n\n window.addEventListener('pointermove', handleCodeMouseMove); // Fix: use window\n window.addEventListener('pointerup', handleCodeMouseUp); // Fix: use window\n}\n\nfunction startCodeResize(event, anchor) {\n if (!selectedCodeBlock || event.button !== 0) return;\n event.preventDefault();\n event.stopPropagation();\n\n isCodeResizing = true;\n isCodeDragging = false;\n currentCodeResizeHandle = anchor;\n\n \n const codeElement = selectedCodeBlock.querySelector('text');\n if (!codeElement) {\n isCodeResizing = false;\n return;\n }\n\n startCodeBBox = codeElement.getBBox();\n startCodeFontSize = parseFloat(codeElement.getAttribute(\"font-size\") || 25);\n if (isNaN(startCodeFontSize)) startCodeFontSize = 25;\n\n startCodePoint = getSVGCoordinates(event, selectedCodeBlock);\n\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n initialCodeGroupTx = currentTransform ? currentTransform.matrix.e : 0;\n initialCodeGroupTy = currentTransform ? currentTransform.matrix.f : 0;\n\n const padding = 3;\n const startX = startCodeBBox.x - padding;\n const startY = startCodeBBox.y - padding;\n const startWidth = startCodeBBox.width + 2 * padding;\n const startHeight = startCodeBBox.height + 2 * padding;\n\n let hx = startX;\n let hy = startY;\n if (anchor.includes('e')) { hx = startX + startWidth; }\n if (anchor.includes('s')) { hy = startY + startHeight; }\n initialCodeHandlePosRelGroup = { x: hx, y: hy };\n\n svg.style.cursor = codeResizeHandles[anchor]?.style.cursor || 'default';\n\n window.addEventListener('pointermove', handleCodeMouseMove); \n window.addEventListener('pointerup', handleCodeMouseUp); \n}\n\n\n\n\nconst handleCodeMouseMove = (event) => {\n if (!selectedCodeBlock) return;\n event.preventDefault();\n\n // Keep lastMousePos in screen coordinates for other functions\n const svgRect = svg.getBoundingClientRect();\n lastMousePos = {\n x: event.clientX - svgRect.left, \n y: event.clientY - svgRect.top\n };\n\n if (isCodeDragging) {\n const currentPoint = getSVGCoordinates(event);\n const newTranslateX = currentPoint.x - codeDragOffsetX;\n const newTranslateY = currentPoint.y - codeDragOffsetY;\n\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (currentTransform) {\n const matrix = currentTransform.matrix;\n const angle = Math.atan2(matrix.b, matrix.a) * 180 / Math.PI;\n\n const codeElement = selectedCodeBlock.querySelector('text');\n if (codeElement) {\n const bbox = codeElement.getBBox();\n const centerX = bbox.x + bbox.width / 2;\n const centerY = bbox.y + bbox.height / 2;\n\n selectedCodeBlock.setAttribute('transform',\n `translate(${newTranslateX}, ${newTranslateY}) rotate(${angle}, ${centerX}, ${centerY})`\n );\n } else {\n selectedCodeBlock.setAttribute('transform', `translate(${newTranslateX}, ${newTranslateY})`);\n }\n } else {\n selectedCodeBlock.setAttribute('transform', `translate(${newTranslateX}, ${newTranslateY})`);\n }\n\n // Update frame containment for CodeShape wrapper\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const codeShape = shapes.find(shape => shape.shapeName === 'code' && shape.group === selectedCodeBlock);\n if (codeShape) {\n codeShape.updateFrameContainment();\n }\n }\n\n // Update attached arrows during dragging\n updateAttachedArrows(selectedCodeBlock);\n\n } else if (isCodeResizing) {\n const codeElement = selectedCodeBlock.querySelector('text');\n if (!codeElement || !startCodeBBox || startCodeFontSize === null || !startCodePoint || !initialCodeHandlePosRelGroup) return;\n\n const currentPoint = getSVGCoordinates(event, selectedCodeBlock);\n\n const startX = startCodeBBox.x;\n const startY = startCodeBBox.y;\n const startWidth = startCodeBBox.width;\n const startHeight = startCodeBBox.height;\n\n let anchorX, anchorY;\n\n switch (currentCodeResizeHandle) {\n case 'nw':\n anchorX = startX + startWidth;\n anchorY = startY + startHeight;\n break;\n case 'ne':\n anchorX = startX;\n anchorY = startY + startHeight;\n break;\n case 'sw':\n anchorX = startX + startWidth;\n anchorY = startY;\n break;\n case 'se':\n anchorX = startX;\n anchorY = startY;\n break;\n }\n\n const newWidth = Math.abs(currentPoint.x - anchorX);\n const newHeight = Math.abs(currentPoint.y - anchorY);\n\n const chosenScale = newHeight / startHeight;\n\n const minScale = 0.1;\n const maxScale = 10.0;\n const clampedScale = Math.max(minScale, Math.min(chosenScale, maxScale));\n\n const newFontSize = startCodeFontSize * clampedScale;\n const minFontSize = 5;\n const finalFontSize = Math.max(newFontSize, minFontSize);\n\n codeElement.setAttribute(\"font-size\", `${finalFontSize}px`);\n\n const currentBBox = codeElement.getBBox();\n\n let newAnchorX, newAnchorY;\n\n switch (currentCodeResizeHandle) {\n case 'nw':\n newAnchorX = currentBBox.x + currentBBox.width;\n newAnchorY = currentBBox.y + currentBBox.height;\n break;\n case 'ne':\n newAnchorX = currentBBox.x;\n newAnchorY = currentBBox.y + currentBBox.height;\n break;\n case 'sw':\n newAnchorX = currentBBox.x + currentBBox.width;\n newAnchorY = currentBBox.y;\n break;\n case 'se':\n newAnchorX = currentBBox.x;\n newAnchorY = currentBBox.y;\n break;\n }\n\n const deltaX = anchorX - newAnchorX;\n const deltaY = anchorY - newAnchorY;\n\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (currentTransform) {\n const matrix = currentTransform.matrix;\n const angle = Math.atan2(matrix.b, matrix.a) * 180 / Math.PI;\n\n const newGroupTx = initialCodeGroupTx + deltaX;\n const newGroupTy = initialCodeGroupTy + deltaY;\n\n const centerX = currentBBox.x + currentBBox.width / 2;\n const centerY = currentBBox.y + currentBBox.height / 2;\n\n selectedCodeBlock.setAttribute('transform',\n `translate(${newGroupTx}, ${newGroupTy}) rotate(${angle}, ${centerX}, ${centerY})`\n );\n } else {\n const newGroupTx = initialCodeGroupTx + deltaX;\n const newGroupTy = initialCodeGroupTy + deltaY;\n selectedCodeBlock.setAttribute('transform', `translate(${newGroupTx}, ${newGroupTy})`);\n }\n\n // Update background to fit new text size\n updateCodeBackground(selectedCodeBlock, codeElement);\n\n // Update attached arrows during resizing\n updateAttachedArrows(selectedCodeBlock);\n\n clearTimeout(selectedCodeBlock.updateFeedbackTimeout);\n selectedCodeBlock.updateFeedbackTimeout = setTimeout(() => {\n updateCodeSelectionFeedback();\n delete selectedCodeBlock.updateFeedbackTimeout;\n }, 0);\n\n } else if (isCodeRotating) {\n const codeElement = selectedCodeBlock.querySelector('text');\n if (!codeElement) return;\n\n const bbox = codeElement.getBBox();\n const centerX = bbox.x + bbox.width / 2;\n const centerY = bbox.y + bbox.height / 2;\n\n const mousePos = getSVGCoordinates(event);\n\n let centerPoint = svg.createSVGPoint();\n centerPoint.x = centerX;\n centerPoint.y = centerY;\n\n const groupTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (groupTransform) {\n centerPoint = centerPoint.matrixTransform(groupTransform.matrix);\n }\n\n const currentAngle = Math.atan2(mousePos.y - centerPoint.y, mousePos.x - centerPoint.x) * 180 / Math.PI;\n\n const rotationDiff = currentAngle - codeRotationStartAngle;\n\n const newTransform = `translate(${codeRotationStartTransform.e}, ${codeRotationStartTransform.f}) rotate(${rotationDiff}, ${centerX}, ${centerY})`;\n selectedCodeBlock.setAttribute('transform', newTransform);\n\n // Update attached arrows during rotation\n updateAttachedArrows(selectedCodeBlock);\n\n updateCodeSelectionFeedback();\n }\n\n // Handle cursor changes for code tool\n if ((isCodeToolActive || (isTextToolActive && isTextInCodeMode)) && !isCodeDragging && !isCodeResizing && !isCodeRotating) {\n svg.style.cursor = 'text';\n \n // Frame highlighting logic for code tool\n const { x, y } = getSVGCoordinates(event);\n \n const tempCodeBounds = {\n x: x - 275, \n y: y - 30, \n width: 550,\n height: 60\n };\n \n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(frame => {\n if (frame.shapeName === 'frame') {\n if (frame.isShapeInFrame(tempCodeBounds)) {\n frame.highlightFrame();\n hoveredCodeFrame = frame;\n } else if (hoveredCodeFrame === frame) {\n frame.removeHighlight();\n hoveredCodeFrame = null;\n }\n }\n });\n }\n } else if (isSelectionToolActive && !isCodeDragging && !isCodeResizing && !isCodeRotating) {\n const targetGroup = event.target.closest('g[data-type=\"code-group\"]');\n if (targetGroup) {\n svg.style.cursor = 'move';\n } else {\n svg.style.cursor = 'default';\n }\n }\n};\n\n// Add this complete mouse up handler\nconst handleCodeMouseUp = (event) => {\n if (event.button !== 0) return;\n\n if (isCodeDragging && selectedCodeBlock) {\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (currentTransform) {\n const finalTranslateX = currentTransform.matrix.e;\n const finalTranslateY = currentTransform.matrix.f;\n\n const initialX = parseFloat(selectedCodeBlock.getAttribute(\"data-x\")) || 0;\n const initialY = parseFloat(selectedCodeBlock.getAttribute(\"data-y\")) || 0;\n\n // Find the CodeShape wrapper for frame tracking\n let codeShape = null;\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n codeShape = shapes.find(shape => shape.shapeName === 'code' && shape.group === selectedCodeBlock);\n }\n\n // Add frame information for undo tracking\n const oldPosWithFrame = {\n x: initialX,\n y: initialY,\n rotation: extractRotationFromTransform(selectedCodeBlock) || 0,\n parentFrame: draggedCodeInitialFrame\n };\n const newPosWithFrame = {\n x: finalTranslateX,\n y: finalTranslateY,\n rotation: extractRotationFromTransform(selectedCodeBlock) || 0,\n parentFrame: codeShape ? codeShape.parentFrame : null\n };\n\n const stateChanged = initialX !== finalTranslateX || initialY !== finalTranslateY;\n const frameChanged = oldPosWithFrame.parentFrame !== newPosWithFrame.parentFrame;\n\n if (stateChanged || frameChanged) {\n pushTransformAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n oldPosWithFrame,\n newPosWithFrame\n );\n }\n\n // Handle frame containment changes after drag\n if (codeShape) {\n const finalFrame = hoveredCodeFrame;\n \n // If shape moved to a different frame\n if (draggedCodeInitialFrame !== finalFrame) {\n // Remove from initial frame\n if (draggedCodeInitialFrame) {\n draggedCodeInitialFrame.removeShapeFromFrame(codeShape);\n }\n \n // Add to new frame\n if (finalFrame) {\n finalFrame.addShapeToFrame(codeShape);\n }\n \n // Track the frame change for undo\n if (frameChanged) {\n pushFrameAttachmentAction(finalFrame || draggedCodeInitialFrame, codeShape, \n finalFrame ? 'attach' : 'detach', draggedCodeInitialFrame);\n }\n } else if (draggedCodeInitialFrame) {\n // Shape stayed in same frame, restore clipping\n draggedCodeInitialFrame.restoreToFrame(codeShape);\n }\n }\n\n selectedCodeBlock.setAttribute(\"data-x\", finalTranslateX);\n selectedCodeBlock.setAttribute(\"data-y\", finalTranslateY);\n }\n\n draggedCodeInitialFrame = null;\n\n } else if (isCodeResizing && selectedCodeBlock) {\n const codeElement = selectedCodeBlock.querySelector('text');\n if (codeElement) {\n const finalFontSize = codeElement.getAttribute(\"font-size\");\n const initialFontSize = startCodeFontSize;\n\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (currentTransform && initialFontSize !== parseFloat(finalFontSize)) {\n const finalTranslateX = currentTransform.matrix.e;\n const finalTranslateY = currentTransform.matrix.f;\n\n pushTransformAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n {\n x: initialCodeGroupTx,\n y: initialCodeGroupTy,\n fontSize: initialFontSize,\n rotation: extractRotationFromTransform(selectedCodeBlock) || 0\n },\n {\n x: finalTranslateX,\n y: finalTranslateY,\n fontSize: parseFloat(finalFontSize),\n rotation: extractRotationFromTransform(selectedCodeBlock) || 0\n }\n );\n\n selectedCodeBlock.setAttribute(\"data-x\", finalTranslateX);\n selectedCodeBlock.setAttribute(\"data-y\", finalTranslateY);\n }\n\n clearTimeout(selectedCodeBlock.updateFeedbackTimeout);\n updateCodeSelectionFeedback();\n }\n } else if (isCodeRotating && selectedCodeBlock) {\n const currentTransform = selectedCodeBlock.transform.baseVal.consolidate();\n if (currentTransform && codeRotationStartTransform) {\n const initialRotation = Math.atan2(codeRotationStartTransform.b, codeRotationStartTransform.a) * 180 / Math.PI;\n const finalRotation = extractRotationFromTransform(selectedCodeBlock) || 0;\n\n if (Math.abs(initialRotation - finalRotation) > 1) {\n pushTransformAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n {\n x: codeRotationStartTransform.e,\n y: codeRotationStartTransform.f,\n rotation: initialRotation\n },\n {\n x: currentTransform.matrix.e,\n y: currentTransform.matrix.f,\n rotation: finalRotation\n }\n );\n }\n\n }\n updateCodeSelectionFeedback();\n }\n\n // Clear frame highlighting\n if (hoveredCodeFrame) {\n hoveredCodeFrame.removeHighlight();\n hoveredCodeFrame = null;\n }\n\n // Handle code deselection when clicking outside\n if (isSelectionToolActive) {\n const targetGroup = event.target.closest('g[data-type=\"code-group\"]');\n const isResizeHandle = event.target.closest('.resize-handle');\n const isRotateAnchor = event.target.closest('.rotate-anchor');\n \n // If we didn't click on code block or its controls, deselect\n if (!targetGroup && !isResizeHandle && !isRotateAnchor && selectedCodeBlock) {\n deselectCodeBlock();\n }\n }\n\n isCodeDragging = false;\n isCodeResizing = false;\n isCodeRotating = false;\n currentCodeResizeHandle = null;\n startCodePoint = null;\n startCodeBBox = null;\n startCodeFontSize = null;\n codeDragOffsetX = undefined;\n codeDragOffsetY = undefined;\n initialCodeHandlePosRelGroup = null;\n initialCodeGroupTx = 0;\n initialCodeGroupTy = 0;\n codeRotationStartAngle = 0;\n codeRotationStartTransform = null;\n\n svg.style.cursor = 'default';\n\n svg.removeEventListener('pointermove', handleCodeMouseMove);\n svg.removeEventListener('pointerup', handleCodeMouseUp);\n};\n\n\nfunction extractRotationFromTransform(element) {\n const currentTransform = element.transform.baseVal.consolidate();\n if (currentTransform) {\n const matrix = currentTransform.matrix;\n return Math.atan2(matrix.b, matrix.a) * 180 / Math.PI;\n }\n return 0;\n}\n\nconst handleCodeMouseDown = function (e) {\n if (!e.target) return;\n // Check for contenteditable code editor (new style)\n const activeContentEditor = document.querySelector(\".svg-code-editor[contenteditable='true']\");\n if (activeContentEditor) {\n const editorContainer = activeContentEditor.closest('.svg-code-container');\n if (editorContainer && editorContainer.contains(e.target)) {\n return;\n }\n let codeElement = activeContentEditor.originalCodeElement;\n if (codeElement) {\n renderCodeFromEditor(activeContentEditor, codeElement, true);\n } else if (editorContainer && document.body.contains(editorContainer)) {\n document.body.removeChild(editorContainer);\n }\n }\n // Check for textarea code editor (legacy style)\n const activeEditor = document.querySelector(\"textarea.svg-code-editor\");\n if (activeEditor && activeEditor.contains(e.target)) {\n return;\n }\n if (activeEditor && !activeEditor.contains(e.target)) {\n let codeElement = activeEditor.originalCodeElement;\n if (codeElement) {\n renderCode(activeEditor, codeElement, true);\n } else if (document.body.contains(activeEditor)){\n document.body.removeChild(activeEditor);\n }\n }\n\n const targetGroup = e.target.closest('g[data-type=\"code-group\"]');\n\n if (isSelectionToolActive && e.button === 0) {\n if (targetGroup) {\n if (e.target.closest('.resize-handle') || e.target.closest('.rotate-anchor')) {\n return; // Let resize/rotate handlers manage\n }\n \n // If clicking on the code block itself, select it and start drag\n if (targetGroup === selectedCodeBlock) {\n startCodeDrag(e);\n } else {\n selectCodeBlock(targetGroup);\n startCodeDrag(e);\n }\n } else {\n deselectCodeBlock();\n }\n\n } else if ((isCodeToolActive || isTextToolActive) && e.button === 0) {\n if (targetGroup) {\n const codeElement = targetGroup.querySelector('text');\n\n if (codeElement && (e.target.tagName === \"text\" || e.target.tagName === \"tspan\")) {\n makeCodeEditable(codeElement, targetGroup, e); // Pass click event for position\n e.stopPropagation();\n } else {\n deselectCodeBlock();\n addCodeBlock(e);\n }\n } else {\n deselectCodeBlock();\n addCodeBlock(e);\n }\n }\n};\n\n\n// updateAttachedArrows is imported from drawArrow.js\n\ncodeTextColorOptions.forEach((span) => {\n span.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n codeTextColorOptions.forEach((el) => el.classList.remove(\"selected\"));\n span.classList.add(\"selected\");\n\n const newColor = span.getAttribute(\"data-id\");\n const oldColor = codeTextColor;\n codeTextColor = newColor;\n\n if (selectedCodeBlock) {\n const codeEditor = selectedCodeBlock.querySelector('.svg-code-editor');\n if (codeEditor) {\n const currentColor = codeEditor.style.color;\n\n if (currentColor !== newColor) {\n pushOptionsChangeAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n {\n color: currentColor,\n font: codeEditor.style.fontFamily,\n size: codeEditor.style.fontSize,\n align: codeEditor.style.textAlign // Although mostly 'left'\n },\n {\n color: newColor,\n font: codeEditor.style.fontFamily,\n size: codeEditor.style.fontSize,\n align: codeEditor.style.textAlign\n }\n );\n }\n\n codeEditor.style.color = newColor;\n updateSyntaxHighlighting(codeEditor); // Re-highlight with new color\n }\n }\n });\n});\n\ncodeTextFontOptions.forEach((span) => {\n span.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n codeTextFontOptions.forEach((el) => el.classList.remove(\"selected\"));\n span.classList.add(\"selected\");\n\n const newFont = span.getAttribute(\"data-id\");\n const oldFont = codeTextFont;\n codeTextFont = newFont;\n\n if (selectedCodeBlock) {\n const codeEditor = selectedCodeBlock.querySelector('.svg-code-editor');\n if (codeEditor) {\n const currentFont = codeEditor.style.fontFamily;\n\n if (currentFont !== newFont) {\n pushOptionsChangeAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n {\n color: codeEditor.style.color,\n font: currentFont,\n size: codeEditor.style.fontSize,\n align: codeEditor.style.textAlign\n },\n {\n color: codeEditor.style.color,\n font: newFont,\n size: codeEditor.style.fontSize,\n align: codeEditor.style.textAlign\n }\n );\n }\n\n codeEditor.style.fontFamily = newFont;\n updateSyntaxHighlighting(codeEditor); // Re-highlight with new font\n setTimeout(updateCodeSelectionFeedback, 0);\n }\n }\n });\n});\n\ncodeTextSizeOptions.forEach((span) => {\n span.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n codeTextSizeOptions.forEach((el) => el.classList.remove(\"selected\"));\n span.classList.add(\"selected\");\n\n const newSize = span.getAttribute(\"data-id\") + \"px\";\n const oldSize = codeTextSize;\n codeTextSize = newSize;\n\n if (selectedCodeBlock) {\n const codeEditor = selectedCodeBlock.querySelector('.svg-code-editor');\n if (codeEditor) {\n const currentSize = codeEditor.style.fontSize;\n\n if (currentSize !== newSize) {\n pushOptionsChangeAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n {\n color: codeEditor.style.color,\n font: codeEditor.style.fontFamily,\n size: currentSize,\n align: codeEditor.style.textAlign\n },\n {\n color: codeEditor.style.color,\n font: codeEditor.style.fontFamily,\n size: newSize,\n align: codeEditor.style.textAlign\n }\n );\n }\n\n codeEditor.style.fontSize = newSize;\n adjustCodeEditorSize(codeEditor); // Adjust container size as font size changes\n updateSyntaxHighlighting(codeEditor); // Re-highlight with new size\n setTimeout(updateCodeSelectionFeedback, 0);\n }\n }\n });\n});\n\ncodeTextAlignOptions.forEach((span) => {\n span.addEventListener(\"click\", (event) => {\n event.stopPropagation();\n codeTextAlignOptions.forEach((el) => el.classList.remove(\"selected\"));\n span.classList.add(\"selected\");\n\n const newAlign = span.getAttribute(\"data-id\");\n const oldAlign = codeTextAlign;\n codeTextAlign = newAlign;\n\n if (selectedCodeBlock) {\n const codeEditor = selectedCodeBlock.querySelector('.svg-code-editor');\n if (codeEditor) {\n const currentAlign = codeEditor.style.textAlign;\n\n if (currentAlign !== newAlign) {\n pushOptionsChangeAction(\n {\n type: 'code',\n element: selectedCodeBlock,\n shapeName: 'code'\n },\n {\n color: codeEditor.style.color,\n font: codeEditor.style.fontFamily,\n size: codeEditor.style.fontSize,\n align: currentAlign\n },\n {\n color: codeEditor.style.color,\n font: codeEditor.style.fontFamily,\n size: codeEditor.style.fontSize,\n align: newAlign\n }\n );\n }\n // Code is typically left-aligned, but if user forces, apply it.\n // Note: Highlight.js might override some text-alignment styles on its own.\n codeEditor.style.textAlign = newAlign; \n setTimeout(updateCodeSelectionFeedback, 0);\n }\n }\n });\n});\n\n\n\nconst editorStyles = `\n.svg-code-container {\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);\n border-radius: 6px;\n}\n\n.svg-code-editor {\n scrollbar-width: thin;\n scrollbar-color: #484f58 #161b22;\n}\n\n.svg-code-editor::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n.svg-code-editor::-webkit-scrollbar-track {\n background: #161b22;\n border-radius: 6px;\n}\n\n.svg-code-editor::-webkit-scrollbar-thumb {\n background: #484f58;\n border-radius: 6px;\n}\n\n.svg-code-editor::-webkit-scrollbar-thumb:hover {\n background: #6e7681;\n}\n\n/* Language detection indicator */\n.svg-code-container::after {\n content: attr(data-language);\n position: absolute;\n top: -20px;\n right: 0;\n background: #007acc;\n color: white;\n padding: 2px 6px;\n border-radius: 3px;\n font-size: 10px;\n font-family: monospace;\n opacity: 0.8;\n}\n`;\n\n\nif (!document.getElementById('code-editor-styles')) {\n const styleSheet = document.createElement('style');\n styleSheet.id = 'code-editor-styles';\n styleSheet.textContent = editorStyles;\n document.head.appendChild(styleSheet);\n}\n\nfunction setCodeLanguage(lang) {\n codeLanguage = lang;\n // Update selected code block's language if one is selected\n if (selectedCodeBlock) {\n const codeElement = selectedCodeBlock.querySelector('text');\n if (codeElement) {\n codeElement.setAttribute(\"data-language\", lang);\n }\n }\n}\n\nfunction getCodeLanguage() {\n return codeLanguage;\n}\n\nfunction getSelectedCodeBlock() {\n return selectedCodeBlock;\n}\n\nexport {\n handleCodeMouseDown,\n handleCodeMouseMove,\n handleCodeMouseUp,\n addCodeBlock,\n wrapCodeElement,\n selectCodeBlock,\n deselectCodeBlock,\n makeCodeEditable,\n applySyntaxHighlightingToSVG,\n createHighlightedSVGText,\n updateCodeBackground,\n extractTextFromCodeElement,\n setCodeLanguage,\n getCodeLanguage,\n getSelectedCodeBlock\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|