@elixpo/lixsketch 5.5.19 → 5.5.21
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/Circle-6POZCUZD.js +9 -0
- package/dist/react/{CopyPaste-JMIXWUUO.js → CopyPaste-FJN7K5LS.js} +43 -14
- package/dist/react/CopyPaste-FJN7K5LS.js.map +7 -0
- package/dist/react/{EventDispatcher-H5EA4KZN.js → EventDispatcher-O7HCQQNM.js} +14 -13
- package/dist/react/{EventDispatcher-H5EA4KZN.js.map → EventDispatcher-O7HCQQNM.js.map} +1 -1
- package/dist/react/Frame-RLSMJJSK.js +11 -0
- package/dist/react/FreehandStroke-U6GYZOM4.js +9 -0
- package/dist/react/{GraphEngine-KQXHNTZQ.js → GraphEngine-MM6ALA2N.js} +105 -148
- package/dist/react/{GraphEngine-KQXHNTZQ.js.map → GraphEngine-MM6ALA2N.js.map} +2 -2
- package/dist/react/IconShape-7OPXAKLK.js +10 -0
- package/dist/react/ImageShape-LRNJQCF3.js +10 -0
- package/dist/react/Line-WWQFBNX5.js +10 -0
- package/dist/react/Rectangle-S7XUKWYD.js +9 -0
- package/dist/react/{SceneSerializer-ARTKPZVR.js → SceneSerializer-GSJR7ZHC.js} +36 -11
- package/dist/react/SceneSerializer-GSJR7ZHC.js.map +7 -0
- package/dist/react/{Selection-YJNZRBON.js → Selection-ZL3G6IAO.js} +5 -4
- package/dist/react/{SketchEngine-ZGYBIZG7.js → SketchEngine-BFLHJPCG.js} +25 -25
- package/dist/react/{UndoRedo-BZ6W4QTV.js → UndoRedo-NL7KLR5B.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-LKFSZKXC.js → arrowTool-CNVGM6RX.js} +3 -3
- package/dist/react/{chunk-RFHMFWVR.js → chunk-2FMFOPGW.js} +5 -6
- package/dist/react/{chunk-RFHMFWVR.js.map → chunk-2FMFOPGW.js.map} +2 -2
- package/dist/react/{chunk-QYNTPZON.js → chunk-2THKDSWW.js} +9 -5
- package/dist/react/chunk-2THKDSWW.js.map +7 -0
- package/dist/react/{chunk-JOPQ27YH.js → chunk-4BLMNGTR.js} +3 -3
- package/dist/react/{chunk-C62SXFBL.js → chunk-4TAS67SL.js} +23 -22
- package/dist/react/chunk-4TAS67SL.js.map +7 -0
- package/dist/react/{chunk-FV3EPR4L.js → chunk-AH4PWNEB.js} +19 -11
- package/dist/react/chunk-AH4PWNEB.js.map +7 -0
- package/dist/react/{chunk-XCJOF6BM.js → chunk-FETTJLCV.js} +5 -1
- package/dist/react/chunk-FETTJLCV.js.map +7 -0
- package/dist/react/{chunk-JJTII2UQ.js → chunk-GC3KTQDA.js} +78 -15
- package/dist/react/chunk-GC3KTQDA.js.map +7 -0
- package/dist/react/{chunk-2V7G2PLX.js → chunk-GPIYXREE.js} +3 -3
- package/dist/react/{chunk-3VSGFP6U.js → chunk-HFQZYCHJ.js} +8 -4
- package/dist/react/chunk-HFQZYCHJ.js.map +7 -0
- package/dist/react/{chunk-C72OHQLE.js → chunk-ILGAFR56.js} +3 -3
- package/dist/react/{chunk-CF7AK4ES.js → chunk-KVAQPCUH.js} +26 -3
- package/dist/react/chunk-KVAQPCUH.js.map +7 -0
- package/dist/react/{chunk-WEWMB35W.js → chunk-OFGJJKPH.js} +3 -3
- package/dist/react/chunk-PAKA6HUX.js +59 -0
- package/dist/react/chunk-PAKA6HUX.js.map +7 -0
- package/dist/react/{chunk-HKYUJUD7.js → chunk-PXFPPO3R.js} +5 -1
- package/dist/react/chunk-PXFPPO3R.js.map +7 -0
- package/dist/react/{chunk-6G3ITAS5.js → chunk-SZD7DKYJ.js} +18 -9
- package/dist/react/chunk-SZD7DKYJ.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-MYYBFZD3.js → chunk-U3TB4KRS.js} +45 -6
- package/dist/react/chunk-U3TB4KRS.js.map +7 -0
- package/dist/react/{chunk-UQBT7F4K.js → chunk-V2QTYSBK.js} +2 -2
- package/dist/react/{chunk-73VA5ALZ.js → chunk-XFQECTTF.js} +48 -19
- package/dist/react/chunk-XFQECTTF.js.map +7 -0
- package/dist/react/{chunk-O64N5JPO.js → chunk-YF3TK7SC.js} +2 -2
- package/dist/react/{circleTool-RDOIMKKV.js → circleTool-KICNRQCI.js} +4 -4
- package/dist/react/{codeTool-O2Z7ZXGP.js → codeTool-NCQ73R6M.js} +5 -4
- package/dist/react/{frameTool-Z5ZDCX6H.js → frameTool-Y6KB67DO.js} +4 -4
- package/dist/react/{freehandTool-AAQCTMVM.js → freehandTool-MMULHCQ7.js} +4 -4
- package/dist/react/{iconTool-AUHRLOO2.js → iconTool-LSW2DYGB.js} +5 -4
- package/dist/react/{imageTool-DRKDCPUV.js → imageTool-2DSR32RX.js} +5 -4
- package/dist/react/index.js +141 -66
- package/dist/react/index.js.map +3 -3
- package/dist/react/{lineTool-XLOOZE3E.js → lineTool-N5I7IGT7.js} +4 -4
- package/dist/react/{rectangleTool-AEYDDJCA.js → rectangleTool-YUT7ZK2E.js} +4 -4
- package/dist/react/{textTool-UORBAAJE.js → textTool-IQOYPELP.js} +6 -5
- package/package.json +1 -1
- package/src/core/CopyPaste.js +34 -4
- package/src/core/GraphEngine.js +129 -185
- package/src/core/SceneSerializer.js +26 -0
- package/src/core/ScreenSpaceControls.js +60 -0
- package/src/core/Selection.js +19 -11
- package/src/core/UndoRedo.js +47 -3
- package/src/core/ZoomPan.js +3 -0
- package/src/react/components/canvas/MultiSelectActions.jsx +4 -1
- package/src/react/components/sidebars/IconSidebar.jsx +14 -23
- package/src/react/components/sidebars/ImageSidebar.jsx +47 -24
- package/src/react/store/useUIStore.js +71 -14
- package/src/shapes/Circle.js +2 -0
- package/src/shapes/Frame.js +26 -2
- package/src/shapes/FreehandStroke.js +2 -0
- package/src/shapes/IconShape.js +23 -25
- package/src/shapes/ImageShape.js +6 -2
- package/src/shapes/Rectangle.js +2 -0
- package/src/tools/codeTool.js +3 -2
- package/src/tools/frameTool.js +19 -9
- package/src/tools/iconTool.js +63 -26
- package/src/tools/imageTool.js +80 -14
- package/src/tools/textTool.js +3 -1
- package/dist/react/Circle-QQMKCKFR.js +0 -8
- package/dist/react/CopyPaste-JMIXWUUO.js.map +0 -7
- package/dist/react/Frame-VADA625S.js +0 -10
- package/dist/react/FreehandStroke-BOWDNAVC.js +0 -8
- package/dist/react/IconShape-32EYI2MA.js +0 -10
- package/dist/react/ImageShape-MYP2DVVH.js +0 -10
- package/dist/react/Line-FCCF2BOB.js +0 -10
- package/dist/react/Rectangle-MZ6ZB6KM.js +0 -8
- package/dist/react/SceneSerializer-ARTKPZVR.js.map +0 -7
- package/dist/react/ZoomPan-NYPDJBD5.js.map +0 -7
- package/dist/react/chunk-3VSGFP6U.js.map +0 -7
- package/dist/react/chunk-6G3ITAS5.js.map +0 -7
- package/dist/react/chunk-73VA5ALZ.js.map +0 -7
- package/dist/react/chunk-C62SXFBL.js.map +0 -7
- package/dist/react/chunk-CF7AK4ES.js.map +0 -7
- package/dist/react/chunk-FV3EPR4L.js.map +0 -7
- package/dist/react/chunk-HKYUJUD7.js.map +0 -7
- package/dist/react/chunk-JJTII2UQ.js.map +0 -7
- package/dist/react/chunk-MYYBFZD3.js.map +0 -7
- package/dist/react/chunk-N7NZLF6P.js.map +0 -7
- package/dist/react/chunk-QYNTPZON.js.map +0 -7
- package/dist/react/chunk-XCJOF6BM.js.map +0 -7
- /package/dist/react/{Circle-QQMKCKFR.js.map → Circle-6POZCUZD.js.map} +0 -0
- /package/dist/react/{Frame-VADA625S.js.map → Frame-RLSMJJSK.js.map} +0 -0
- /package/dist/react/{FreehandStroke-BOWDNAVC.js.map → FreehandStroke-U6GYZOM4.js.map} +0 -0
- /package/dist/react/{IconShape-32EYI2MA.js.map → IconShape-7OPXAKLK.js.map} +0 -0
- /package/dist/react/{ImageShape-MYP2DVVH.js.map → ImageShape-LRNJQCF3.js.map} +0 -0
- /package/dist/react/{Line-FCCF2BOB.js.map → Line-WWQFBNX5.js.map} +0 -0
- /package/dist/react/{Rectangle-MZ6ZB6KM.js.map → Rectangle-S7XUKWYD.js.map} +0 -0
- /package/dist/react/{Selection-YJNZRBON.js.map → Selection-ZL3G6IAO.js.map} +0 -0
- /package/dist/react/{SketchEngine-ZGYBIZG7.js.map → SketchEngine-BFLHJPCG.js.map} +0 -0
- /package/dist/react/{UndoRedo-BZ6W4QTV.js.map → UndoRedo-NL7KLR5B.js.map} +0 -0
- /package/dist/react/{arrowTool-LKFSZKXC.js.map → arrowTool-CNVGM6RX.js.map} +0 -0
- /package/dist/react/{chunk-JOPQ27YH.js.map → chunk-4BLMNGTR.js.map} +0 -0
- /package/dist/react/{chunk-2V7G2PLX.js.map → chunk-GPIYXREE.js.map} +0 -0
- /package/dist/react/{chunk-C72OHQLE.js.map → chunk-ILGAFR56.js.map} +0 -0
- /package/dist/react/{chunk-WEWMB35W.js.map → chunk-OFGJJKPH.js.map} +0 -0
- /package/dist/react/{chunk-UQBT7F4K.js.map → chunk-V2QTYSBK.js.map} +0 -0
- /package/dist/react/{chunk-O64N5JPO.js.map → chunk-YF3TK7SC.js.map} +0 -0
- /package/dist/react/{circleTool-RDOIMKKV.js.map → circleTool-KICNRQCI.js.map} +0 -0
- /package/dist/react/{codeTool-O2Z7ZXGP.js.map → codeTool-NCQ73R6M.js.map} +0 -0
- /package/dist/react/{frameTool-Z5ZDCX6H.js.map → frameTool-Y6KB67DO.js.map} +0 -0
- /package/dist/react/{freehandTool-AAQCTMVM.js.map → freehandTool-MMULHCQ7.js.map} +0 -0
- /package/dist/react/{iconTool-AUHRLOO2.js.map → iconTool-LSW2DYGB.js.map} +0 -0
- /package/dist/react/{imageTool-DRKDCPUV.js.map → imageTool-2DSR32RX.js.map} +0 -0
- /package/dist/react/{lineTool-XLOOZE3E.js.map → lineTool-N5I7IGT7.js.map} +0 -0
- /package/dist/react/{rectangleTool-AEYDDJCA.js.map → rectangleTool-YUT7ZK2E.js.map} +0 -0
- /package/dist/react/{textTool-UORBAAJE.js.map → textTool-IQOYPELP.js.map} +0 -0
|
@@ -1,7 +0,0 @@
|
|
|
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';\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\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}"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["svg", "iconX", "iconY"]
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/shapes/IconShape.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// IconShape class - extracted from icons.js\n// Depends on globals: svg, shapes\nimport { updateAttachedArrows as updateArrowsForShape, cleanupAttachments } from '../tools/arrowTool.js';\n\n// Module-level state shared with iconTool via window bridge\nlet isDragging = false;\nlet hoveredFrameIcon = null;\n\n// Expose setters so iconTool.js can sync these values\nwindow.__iconShapeState = {\n set isDragging(v) { isDragging = v; },\n get isDragging() { return isDragging; },\n set hoveredFrameIcon(v) { hoveredFrameIcon = v; },\n get hoveredFrameIcon() { return hoveredFrameIcon; },\n};\n\nfunction getSVGElement() {\n return document.getElementById('freehand-canvas');\n}\n\n// Delegate to iconTool's selectIcon via window bridge\nfunction selectIcon(event) {\n if (window.__iconToolSelectIcon) {\n window.__iconToolSelectIcon(event);\n }\n}\n\nclass IconShape {\n constructor(element) {\n this.element = element;\n this.shapeName = 'icon';\n this.shapeID = `icon-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n this.type = 'icon';\n\n this.parentFrame = null;\n this.isDraggedOutTemporarily = false;\n\n this.element.setAttribute('type', 'icon');\n this.element.shapeID = this.shapeID;\n\n this.group = this.element;\n this.group.setAttribute('id', this.shapeID);\n }\n\n get x() {\n return parseFloat(this.element.getAttribute('x')) || 0;\n }\n\n set x(value) {\n this.element.setAttribute('x', value);\n this.element.setAttribute('data-shape-x', value);\n }\n\n get y() {\n return parseFloat(this.element.getAttribute('y')) || 0;\n }\n\n set y(value) {\n this.element.setAttribute('y', value);\n this.element.setAttribute('data-shape-y', value);\n }\n\n get width() {\n return parseFloat(this.element.getAttribute('width')) || 100;\n }\n\n set width(value) {\n this.element.setAttribute('width', value);\n this.element.setAttribute('data-shape-width', value);\n }\n\n get height() {\n return parseFloat(this.element.getAttribute('height')) || 100;\n }\n\n set height(value) {\n this.element.setAttribute('height', value);\n this.element.setAttribute('data-shape-height', value);\n }\n\n get rotation() {\n const dataRotation = this.element.getAttribute('data-shape-rotation');\n if (dataRotation) {\n return parseFloat(dataRotation);\n }\n\n const transform = this.element.getAttribute('transform');\n if (transform) {\n const rotateMatch = transform.match(/rotate\\(([^,\\s]+)/);\n if (rotateMatch) {\n return parseFloat(rotateMatch[1]);\n }\n }\n return 0;\n }\n\n set rotation(value) {\n this.element.setAttribute('data-shape-rotation', value);\n\n const vbWidth = parseFloat(this.element.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(this.element.getAttribute('data-viewbox-height')) || 24;\n const scale = this.width / Math.max(vbWidth, vbHeight);\n const localCenterX = this.width / 2 / scale;\n const localCenterY = this.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${this.x}, ${this.y}) scale(${scale}) rotate(${value}, ${localCenterX}, ${localCenterY})`);\n }\n\n move(dx, dy) {\n this.x += dx;\n this.y += dy;\n\n const vbWidth = parseFloat(this.element.getAttribute('data-viewbox-width')) || 24;\n const vbHeight = parseFloat(this.element.getAttribute('data-viewbox-height')) || 24;\n const scale = this.width / Math.max(vbWidth, vbHeight);\n const localCenterX = this.width / 2 / scale;\n const localCenterY = this.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${this.x}, ${this.y}) scale(${scale}) rotate(${this.rotation}, ${localCenterX}, ${localCenterY})`);\n\n this.element.setAttribute('x', this.x);\n this.element.setAttribute('y', this.y);\n\n this.element.setAttribute('data-shape-x', this.x);\n this.element.setAttribute('data-shape-y', this.y);\n\n updateArrowsForShape(this);\n\n if (isDragging && !this.isBeingMovedByFrame) {\n this.updateFrameContainment();\n }\n }\n updateFrameContainment() {\n if (this.isBeingMovedByFrame) return;\n\n let targetFrame = null;\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(shape => {\n if (shape.shapeName === 'frame' && shape.isShapeInFrame(this)) {\n targetFrame = shape;\n }\n });\n }\n\n if (this.parentFrame && isDragging) {\n this.parentFrame.temporarilyRemoveFromFrame(this);\n }\n\n if (hoveredFrameIcon && hoveredFrameIcon !== targetFrame) {\n hoveredFrameIcon.removeHighlight();\n }\n\n if (targetFrame && targetFrame !== hoveredFrameIcon) {\n targetFrame.highlightFrame();\n }\n\n hoveredFrameIcon = targetFrame;\n }\n\n contains(x, y) {\n const iconX = this.x;\n const iconY = this.y;\n const iconWidth = this.width;\n const iconHeight = this.height;\n\n return x >= iconX && x <= iconX + iconWidth && y >= iconY && y <= iconY + iconHeight;\n }\n\n updateAttachedArrows() {\n updateArrowsForShape(this);\n }\n\n draw() {\n const scale = this.width / 24;\n const localCenterX = this.width / 2 / scale;\n const localCenterY = this.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${this.x}, ${this.y}) scale(${scale}) rotate(${this.rotation}, ${localCenterX}, ${localCenterY})`);\n\n this.element.setAttribute('data-shape-x', this.x);\n this.element.setAttribute('data-shape-y', this.y);\n this.element.setAttribute('data-shape-width', this.width);\n this.element.setAttribute('data-shape-height', this.height);\n this.element.setAttribute('data-shape-rotation', this.rotation);\n\n updateArrowsForShape(this);\n }\n\n removeSelection(params) {\n if (window.__iconToolRemoveSelection) {\n window.__iconToolRemoveSelection();\n }\n this.isSelected = false;\n }\n\n // Called by handleMultiSelectionMouseDown \u2014 same as selectShape\n addAnchors() {\n selectIcon({ target: this.element, stopPropagation: () => { } });\n }\n\n selectShape() {\n selectIcon({ target: this.element, stopPropagation: () => { } });\n }\n\n remove() {\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const idx = shapes.indexOf(this);\n if (idx !== -1) shapes.splice(idx, 1);\n }\n\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(this.element);\n }\n\n if (this.parentFrame) {\n this.parentFrame.removeShapeFromFrame(this);\n }\n\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n }\n restore(pos) {\n const svg = getSVGElement();\n\n if (!this.group.parentNode && svg) {\n svg.appendChild(this.group);\n }\n\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n if (shapes.indexOf(this) === -1) {\n shapes.push(this);\n }\n }\n\n this.x = pos.x;\n this.y = pos.y;\n this.width = pos.width;\n this.height = pos.height;\n this.rotation = pos.rotation;\n\n if (pos.parentFrame) {\n this.parentFrame = pos.parentFrame;\n pos.parentFrame.addShapeToFrame(this);\n }\n\n const scale = pos.width / 24;\n const localCenterX = pos.width / 2 / scale;\n const localCenterY = pos.height / 2 / scale;\n\n this.element.setAttribute('transform', `translate(${pos.x}, ${pos.y}) scale(${scale}) rotate(${pos.rotation}, ${localCenterX}, ${localCenterY})`);\n\n this.element.setAttribute('data-shape-x', pos.x);\n this.element.setAttribute('data-shape-y', pos.y);\n this.element.setAttribute('data-shape-width', pos.width);\n this.element.setAttribute('data-shape-height', pos.height);\n this.element.setAttribute('data-shape-rotation', pos.rotation);\n\n updateArrowsForShape(this);\n }\n}\n\nexport { IconShape };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/shapes/Frame.js"],
|
|
4
|
-
"sourcesContent": ["/* eslint-disable */\n// Frame shape class - extracted from frameHolder.js\n// Depends on globals: svg, shapes, currentShape, currentZoom\n\nimport { cleanupAttachments } from '../tools/arrowTool.js';\n\nfunction getSVGCoordsFromMouse(e) {\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\nlet dragOldPosFrame = null;\n\nclass Frame {\n constructor(x, y, width, height, options = {}) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n this.rotation = options.rotation || 0;\n this.frameName = options.frameName || \"Frame\";\n this.fillStyle = options.fillStyle || \"transparent\"; // 'transparent' | 'solid' | 'grid'\n this.fillColor = options.fillColor || \"#1e1e28\";\n this.gridSize = options.gridSize || 20;\n // Issue #38 follow-up: read the grid stroke from a CSS custom\n // property so the frame grid stays visible in both themes. The\n // var is defined in globals.css for both `body.canvas-mode`\n // (dark-on-light) and `body.canvas-mode.theme-dark` (light-on-dark).\n // The literal here is the dark-theme fallback for environments\n // (tests, embeds) without the canvas-mode CSS in scope.\n this.gridColor = options.gridColor || \"var(--lixsketch-grid-fine, rgba(255,255,255,0.06))\";\n this.options = {\n stroke: options.stroke || \"#555\",\n strokeWidth: options.strokeWidth || 1,\n fill: options.fill || \"transparent\",\n opacity: options.opacity || 1,\n ...options\n };\n\n this.element = null;\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.isSelected = false;\n this.anchors = [];\n this.shapeName = \"frame\";\n this.shapeID = `frame-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n this.group.setAttribute('id', this.shapeID);\n\n // Create clipping group for contained shapes\n this.clipGroup = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.clipPath = document.createElementNS('http://www.w3.org/2000/svg', 'clipPath');\n this.clipRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n \n // Set up clipping\n this.clipId = `clip-${this.shapeID}`;\n this.clipPath.setAttribute('id', this.clipId);\n this.clipPath.appendChild(this.clipRect);\n this.clipGroup.setAttribute('clip-path', `url(#${this.clipId})`);\n \n // Add clip path to defs\n let defs = svg.querySelector('defs');\n if (!defs) {\n defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n svg.appendChild(defs);\n }\n defs.appendChild(this.clipPath);\n\n // Array to hold shapes inside this frame\n this.containedShapes = [];\n\n svg.appendChild(this.group);\n svg.appendChild(this.clipGroup);\n this.draw();\n this.updateClipPath();\n }\n\n draw() {\n // Clear previous elements\n while (this.group.firstChild) {\n this.group.removeChild(this.group.firstChild);\n }\n this.anchors = [];\n\n // Ensure defs exists for grid pattern\n let defs = svg.querySelector('defs');\n if (!defs) {\n defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n svg.appendChild(defs);\n }\n\n // Determine fill based on fillStyle\n let fillValue = \"transparent\";\n if (this.fillStyle === 'solid') {\n fillValue = this.fillColor;\n } else if (this.fillStyle === 'grid') {\n // Create or update a grid pattern unique to this frame\n const patternId = `frame-grid-${this.shapeID}`;\n let pattern = defs.querySelector(`#${patternId}`);\n if (!pattern) {\n pattern = document.createElementNS('http://www.w3.org/2000/svg', 'pattern');\n pattern.setAttribute('id', patternId);\n pattern.setAttribute('patternUnits', 'userSpaceOnUse');\n defs.appendChild(pattern);\n }\n // Update pattern attributes\n pattern.setAttribute('x', this.x);\n pattern.setAttribute('y', this.y);\n pattern.setAttribute('width', this.gridSize);\n pattern.setAttribute('height', this.gridSize);\n // Clear and rebuild pattern content\n while (pattern.firstChild) pattern.removeChild(pattern.firstChild);\n // Background fill\n const bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n bgRect.setAttribute('width', this.gridSize);\n bgRect.setAttribute('height', this.gridSize);\n bgRect.setAttribute('fill', this.fillColor);\n pattern.appendChild(bgRect);\n // Grid lines\n const gridPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n gridPath.setAttribute('d', `M ${this.gridSize} 0 L 0 0 0 ${this.gridSize}`);\n gridPath.setAttribute('fill', 'none');\n gridPath.setAttribute('stroke', this.gridColor);\n gridPath.setAttribute('stroke-width', '0.5');\n pattern.appendChild(gridPath);\n fillValue = `url(#${patternId})`;\n }\n\n // Create the frame rectangle\n const frameRect = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n frameRect.setAttribute(\"x\", this.x);\n frameRect.setAttribute(\"y\", this.y);\n frameRect.setAttribute(\"width\", this.width);\n frameRect.setAttribute(\"height\", this.height);\n frameRect.setAttribute(\"stroke\", this.options.stroke);\n frameRect.setAttribute(\"stroke-width\", this.options.strokeWidth);\n frameRect.setAttribute(\"fill\", fillValue);\n frameRect.setAttribute(\"opacity\", this.options.opacity);\n frameRect.setAttribute(\"stroke-dasharray\", \"5,5\");\n frameRect.classList.add(\"frame-rect\");\n\n // Apply rotation\n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n frameRect.setAttribute(\"transform\", `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n\n this.element = frameRect;\n this.group.appendChild(this.element);\n\n // Add label\n this.addFrameLabel();\n\n // Re-attach frame image if present\n if (this._frameImageURL) {\n this.setImageFromURL(this._frameImageURL, this._frameImageFit || 'cover');\n }\n\n // Add selection anchors if selected\n if (this.isSelected) {\n this.addAnchors();\n }\n\n // Update clip path\n this.updateClipPath();\n }\n\n updateAttachedArrows() {\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(shape => {\n if (shape.shapeName === 'arrow') {\n let needsUpdate = false;\n \n // Check if arrow is attached to this frame\n if (shape.attachedToStart && shape.attachedToStart.shape === this) {\n needsUpdate = true;\n }\n if (shape.attachedToEnd && shape.attachedToEnd.shape === this) {\n needsUpdate = true;\n }\n \n if (needsUpdate) {\n shape.updateAttachments();\n }\n }\n });\n }\n }\n\n updateClipPath() {\n // Update the clipping rectangle to match frame dimensions\n this.clipRect.setAttribute(\"x\", this.x);\n this.clipRect.setAttribute(\"y\", this.y);\n this.clipRect.setAttribute(\"width\", this.width);\n this.clipRect.setAttribute(\"height\", this.height);\n \n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n this.clipRect.setAttribute(\"transform\", `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n } else {\n this.clipRect.removeAttribute(\"transform\");\n }\n }\n\n addShapeToFrame(shape) {\n if (shape && !this.containedShapes.includes(shape)) {\n const oldFrame = shape.parentFrame;\n\n // Remove from other frames first\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(otherFrame => {\n if (otherFrame.shapeName === 'frame' && otherFrame !== this) {\n otherFrame.removeShapeFromFrame(shape);\n }\n });\n }\n\n this.containedShapes.push(shape);\n shape.parentFrame = this;\n\n // Only move to clipped group if not currently being dragged\n const el = shape.group || shape.element;\n if (el && el.parentNode && !shape.isDraggedOutTemporarily) {\n el.parentNode.removeChild(el);\n this.clipGroup.appendChild(el);\n }\n\n // For sub-frames, also move their clipGroup into our clipGroup\n if (shape.shapeName === 'frame' && shape.clipGroup) {\n if (shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n this.clipGroup.appendChild(shape.clipGroup);\n }\n }\n}\n\n removeShapeFromFrame(shape) {\n const index = this.containedShapes.indexOf(shape);\n if (index > -1) {\n this.containedShapes.splice(index, 1);\n if (shape.parentFrame === this) {\n shape.parentFrame = null;\n }\n\n // Move shape's group/element back to main SVG if it's in the clipped group\n const el = shape.group || shape.element;\n if (el && el.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(el);\n svg.appendChild(el);\n }\n\n // For sub-frames, also move their clipGroup back to main SVG\n if (shape.shapeName === 'frame' && shape.clipGroup && shape.clipGroup.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(shape.clipGroup);\n svg.appendChild(shape.clipGroup);\n }\n\n delete shape.isDraggedOutTemporarily;\n }\n}\n\n // Check if a point is inside the frame bounds\n isPointInFrame(x, y) {\n // Simple bounding box check (can be enhanced for rotation)\n return x >= this.x && x <= this.x + this.width &&\n y >= this.y && y <= this.y + this.height;\n }\n\n // Check if a shape overlaps with this frame\n isShapeInFrame(shape) {\n if (!shape || shape === this) return false;\n \n const shapeX = shape.x || 0;\n const shapeY = shape.y || 0;\n const shapeWidth = shape.width || 0;\n const shapeHeight = shape.height || 0;\n \n // Check if the center of the shape is inside the frame (for better UX)\n const shapeCenterX = shapeX + shapeWidth / 2;\n const shapeCenterY = shapeY + shapeHeight / 2;\n \n return shapeCenterX >= this.x && shapeCenterX <= this.x + this.width &&\n shapeCenterY >= this.y && shapeCenterY <= this.y + this.height;\n}\n\nupdateContainedShapes(applyClipping = true) {\n // Check all shapes to see if they should be in this frame\n if (typeof shapes === 'undefined' || !Array.isArray(shapes)) return;\n shapes.forEach(shape => {\n if (shape !== this) {\n // Skip frames that are larger than or equal to this frame (prevent parent containing child loops)\n if (shape.shapeName === 'frame') {\n const shapeArea = (shape.width || 0) * (shape.height || 0);\n const thisArea = (this.width || 0) * (this.height || 0);\n if (shapeArea >= thisArea) return;\n }\n const isInFrame = this.isShapeInFrame(shape);\n const isAlreadyContained = this.containedShapes.includes(shape);\n\n if (isInFrame && !isAlreadyContained) {\n this.addShapeToFrame(shape);\n // Don't apply clipping if we're not supposed to\n if (!applyClipping) {\n const el = shape.group || shape.element;\n if (el && el.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(el);\n svg.appendChild(el);\n shape.isDraggedOutTemporarily = true;\n }\n }\n } else if (!isInFrame && isAlreadyContained) {\n this.removeShapeFromFrame(shape);\n }\n }\n });\n \n // Update clip path\n this.updateClipPath();\n}\n\nhighlightFrame() {\n if (this.element) {\n this.element.setAttribute('stroke', '#5B57D1');\n this.element.setAttribute('stroke-width', '3');\n this.element.setAttribute('opacity', '0.7');\n }\n}\n\n// Remove frame highlight\nremoveHighlight() {\n if (this.element) {\n this.element.setAttribute('stroke', this.options.stroke);\n this.element.setAttribute('stroke-width', this.options.strokeWidth);\n this.element.setAttribute('opacity', this.options.opacity);\n }\n}\n \n\nmove(dx, dy) {\n this.x += dx;\n this.y += dy;\n\n // Move all contained shapes with the frame\n this.containedShapes.forEach(shape => {\n if (shape) {\n // Mark shape as being moved by frame to prevent frame containment updates\n shape.isBeingMovedByFrame = true;\n\n // Use shape's own move method for proper handling of all shape types\n if (typeof shape.move === 'function') {\n shape.move(dx, dy);\n } else {\n shape.x += dx;\n shape.y += dy;\n }\n\n // Force redraw for shapes whose move() doesn't auto-redraw\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n\n // Update bounding box for freehand strokes\n if (typeof shape.updateBoundingBox === 'function') {\n shape.updateBoundingBox();\n }\n\n // Remove the flag after movement\n delete shape.isBeingMovedByFrame;\n }\n });\n\n // Update arrows attached to this frame\n this.updateAttachedArrows();\n\n this.draw();\n this.updateClipPath();\n}\n\n handleResizeLegacy(anchorIndex, currentPos, startPos, initialFrame) {\n // Legacy version - superseded by the handleResize below with contained shapes scaling\n const dx = currentPos.x - startPos.x;\n const dy = currentPos.y - startPos.y;\n\n switch (anchorIndex) {\n case 0: this.x = initialFrame.x + dx; this.y = initialFrame.y + dy; this.width = Math.max(10, initialFrame.width - dx); this.height = Math.max(10, initialFrame.height - dy); break;\n case 1: this.y = initialFrame.y + dy; this.height = Math.max(10, initialFrame.height - dy); break;\n case 2: this.y = initialFrame.y + dy; this.width = Math.max(10, initialFrame.width + dx); this.height = Math.max(10, initialFrame.height - dy); break;\n case 3: this.width = Math.max(10, initialFrame.width + dx); break;\n case 4: this.width = Math.max(10, initialFrame.width + dx); this.height = Math.max(10, initialFrame.height + dy); break;\n case 5: this.height = Math.max(10, initialFrame.height + dy); break;\n case 6: this.x = initialFrame.x + dx; this.width = Math.max(10, initialFrame.width - dx); this.height = Math.max(10, initialFrame.height + dy); break;\n case 7: this.x = initialFrame.x + dx; this.width = Math.max(10, initialFrame.width - dx); break;\n }\n this.updateAttachedArrows();\n this.updateContainedShapes();\n}\n destroy() {\n const isDiagramFrame = !!this._diagramType;\n\n [...this.containedShapes].forEach(shape => {\n if (isDiagramFrame) {\n // Diagram/graph frame: destroy contained shapes with the frame\n if (typeof window.cleanupAttachments === 'function') {\n window.cleanupAttachments(shape);\n }\n const el = shape.group || shape.element;\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n const idx = shapes.indexOf(shape);\n if (idx > -1) {\n shapes.splice(idx, 1);\n }\n } else {\n // Regular frame: release contained shapes back to canvas\n const el = shape.group || shape.element;\n if (el) {\n if (el.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(el);\n }\n svg.appendChild(el);\n }\n if (shape.shapeName === 'frame' && shape.clipGroup) {\n if (shape.clipGroup.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(shape.clipGroup);\n }\n svg.appendChild(shape.clipGroup);\n }\n }\n shape.parentFrame = null;\n delete shape.isBeingMovedByFrame;\n });\n this.containedShapes = [];\n\n // Remove clip path\n if (this.clipPath && this.clipPath.parentNode) {\n this.clipPath.parentNode.removeChild(this.clipPath);\n }\n\n // Remove groups (clipGroup should be empty now)\n if (this.clipGroup && this.clipGroup.parentNode) {\n this.clipGroup.parentNode.removeChild(this.clipGroup);\n }\n\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n\n const index = shapes.indexOf(this);\n if (index > -1) {\n shapes.splice(index, 1);\n }\n if (currentShape === this) {\n currentShape = null;\n }\n }\n\n addFrameLabel() {\n const labelText = document.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n labelText.setAttribute(\"x\", this.x + 5);\n labelText.setAttribute(\"y\", this.y - 10);\n labelText.setAttribute(\"font-size\", `${16 / currentZoom}px`);\n labelText.setAttribute(\"fill\", this.options.labelColor || this.options.stroke);\n labelText.setAttribute(\"font-family\", \"lixFont\");\n labelText.textContent = this.frameName || \"Frame\";\n labelText.style.cursor = \"pointer\";\n labelText.style.userSelect = \"none\";\n \n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n labelText.setAttribute(\"transform\", `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n \n // Add double-click event for renaming\n labelText.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n this.startLabelEdit(labelText);\n });\n \n this.group.appendChild(labelText);\n this.labelElement = labelText;\n}\n\nstartLabelEdit(labelElement) {\n // Create a foreignObject to hold an HTML input\n const foreignObject = document.createElementNS(\"http://www.w3.org/2000/svg\", \"foreignObject\");\n foreignObject.setAttribute(\"x\", this.x + 5);\n foreignObject.setAttribute(\"y\", this.y - 20);\n foreignObject.setAttribute(\"width\", Math.max(100, this.width - 10));\n foreignObject.setAttribute(\"height\", 20);\n \n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n foreignObject.setAttribute(\"transform\", `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n \n // Create input element\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = this.frameName || \"Frame\";\n const oldName = this.frameName; // Store old name for undo\n \n input.style.cssText = `\n position: absolute;\n width: 100%;\n height: 20px;\n border: 1px solid #5B57D1;\n background: transparent;\n color: ${this.options.stroke};\n font-family: \"lixFont\";\n font-size: ${15 / currentZoom}px;\n padding: 2px 10px;\n margin: 0;\n outline: none;\n border-radius: 2px;\n box-sizing: border-box;\n `;\n \n foreignObject.appendChild(input);\n this.group.appendChild(foreignObject);\n \n // Hide the original label\n labelElement.style.display = \"none\";\n \n // Focus and select the text\n setTimeout(() => {\n input.focus();\n input.select();\n }, 10);\n \n const finishEdit = () => {\n const newName = input.value.trim() || \"Frame\";\n \n // Track name change in undo system if it actually changed\n if (newName !== oldName) {\n pushTransformAction(this, \n { \n x: this.x, \n y: this.y, \n width: this.width, \n height: this.height, \n rotation: this.rotation,\n frameName: oldName \n },\n { \n x: this.x, \n y: this.y, \n width: this.width, \n height: this.height, \n rotation: this.rotation,\n frameName: newName \n }\n );\n }\n \n this.frameName = newName;\n \n // Remove the input\n this.group.removeChild(foreignObject);\n \n // Show and update the label\n labelElement.style.display = \"block\";\n labelElement.textContent = this.frameName;\n \n this.labelElement = labelElement;\n };\n \n // Handle input events\n input.addEventListener('blur', finishEdit);\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n finishEdit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n // Cancel edit - restore original name\n this.group.removeChild(foreignObject);\n labelElement.style.display = \"block\";\n }\n });\n \n // Prevent the input from interfering with other interactions\n input.addEventListener('pointerdown', (e) => e.stopPropagation());\n input.addEventListener('pointermove', (e) => e.stopPropagation());\n input.addEventListener('pointerup', (e) => e.stopPropagation());\n}\n selectFrame() {\n this.isSelected = true;\n this.draw();\n this._showSidebar();\n }\n\n _showSidebar() {\n // React sidebar bridge\n if (window.__showSidebarForShape) {\n window.__showSidebarForShape('frame');\n }\n\n const sidebar = document.getElementById('frameSideBar');\n const renameInput = document.getElementById('frameRenameInput');\n const resizeBtn = document.getElementById('frameResizeToFit');\n if (!sidebar) return;\n\n sidebar.classList.remove('hidden');\n\n if (renameInput) {\n renameInput.value = this.frameName || 'Frame';\n // Replace old listener by cloning\n const newInput = renameInput.cloneNode(true);\n renameInput.parentNode.replaceChild(newInput, renameInput);\n newInput.addEventListener('input', () => {\n const val = newInput.value.trim() || 'Frame';\n this.frameName = val;\n if (this.labelElement) this.labelElement.textContent = val;\n });\n newInput.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') newInput.blur();\n });\n newInput.addEventListener('pointerdown', (e) => e.stopPropagation());\n }\n\n if (resizeBtn) {\n const newBtn = resizeBtn.cloneNode(true);\n resizeBtn.parentNode.replaceChild(newBtn, resizeBtn);\n newBtn.addEventListener('click', () => this.resizeToFit());\n }\n }\n\n resizeToFit() {\n if (this.containedShapes.length === 0) return;\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n\n this.containedShapes.forEach(shape => {\n if (shape.shapeName === 'arrow' || shape.shapeName === 'line') {\n [shape.startPoint, shape.endPoint].filter(Boolean).forEach(p => {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x);\n maxY = Math.max(maxY, p.y);\n });\n } else if (typeof shape.x === 'number' && typeof shape.y === 'number') {\n const w = shape.width || 0;\n const h = shape.height || 0;\n minX = Math.min(minX, shape.x);\n minY = Math.min(minY, shape.y);\n maxX = Math.max(maxX, shape.x + w);\n maxY = Math.max(maxY, shape.y + h);\n }\n });\n\n if (!isFinite(minX)) return;\n\n const padding = 20;\n const oldState = { x: this.x, y: this.y, width: this.width, height: this.height, rotation: this.rotation };\n\n this.x = minX - padding;\n this.y = minY - padding;\n this.width = (maxX - minX) + padding * 2;\n this.height = (maxY - minY) + padding * 2;\n\n pushTransformAction(this, oldState, { x: this.x, y: this.y, width: this.width, height: this.height, rotation: this.rotation });\n this.draw();\n this.updateClipPath();\n this.updateContainedShapes();\n }\n\n removeSelection() {\n this.anchors.forEach(anchor => {\n if (anchor.parentNode) {\n anchor.parentNode.removeChild(anchor);\n }\n });\n this.anchors = [];\n this.isSelected = false;\n this.draw();\n const sidebar = document.getElementById('frameSideBar');\n if (sidebar) sidebar.classList.add('hidden');\n }\n\n addAnchors() {\n const anchorSize = 8 / currentZoom;\n const anchorStrokeWidth = 2 / currentZoom;\n\n // Calculate anchor positions (corners + midpoints + rotation handle)\n const anchorPositions = [\n { x: this.x, y: this.y, cursor: 'nw-resize', type: 'corner' }, // Top-left\n { x: this.x + this.width / 2, y: this.y, cursor: 'n-resize', type: 'edge' }, // Top-middle\n { x: this.x + this.width, y: this.y, cursor: 'ne-resize', type: 'corner' }, // Top-right\n { x: this.x + this.width, y: this.y + this.height / 2, cursor: 'e-resize', type: 'edge' }, // Right-middle\n { x: this.x + this.width, y: this.y + this.height, cursor: 'se-resize', type: 'corner' }, // Bottom-right\n { x: this.x + this.width / 2, y: this.y + this.height, cursor: 's-resize', type: 'edge' }, // Bottom-middle\n { x: this.x, y: this.y + this.height, cursor: 'sw-resize', type: 'corner' }, // Bottom-left\n { x: this.x, y: this.y + this.height / 2, cursor: 'w-resize', type: 'edge' }, // Left-middle\n ];\n\n // Add rotation handle\n const rotationHandleDistance = 30 / currentZoom;\n const rotationHandle = {\n x: this.x + this.width / 2,\n y: this.y - rotationHandleDistance,\n cursor: 'grab',\n type: 'rotation'\n };\n anchorPositions.push(rotationHandle);\n\n // Create selection outline first (behind anchors)\n const outline = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n outline.setAttribute('x', this.x);\n outline.setAttribute('y', this.y);\n outline.setAttribute('width', this.width);\n outline.setAttribute('height', this.height);\n outline.setAttribute('fill', 'none');\n outline.setAttribute('stroke', '#5B57D1');\n outline.setAttribute('stroke-width', 1.5);\n outline.setAttribute('vector-effect', 'non-scaling-stroke');\n outline.setAttribute('stroke-dasharray', '4 2');\n outline.setAttribute('style', 'pointer-events: none;');\n\n // Apply rotation to outline if needed\n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n outline.setAttribute('transform', `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n\n this.group.appendChild(outline);\n this.selectionOutline = outline;\n\n anchorPositions.forEach((position, index) => {\n let anchor;\n \n if (position.type === 'rotation') {\n // Create rotation handle (circle)\n anchor = document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n anchor.setAttribute(\"cx\", position.x);\n anchor.setAttribute(\"cy\", position.y);\n anchor.setAttribute(\"r\", 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\n // Add rotation line\n const rotationLine = document.createElementNS(\"http://www.w3.org/2000/svg\", \"line\");\n rotationLine.setAttribute(\"x1\", this.x + this.width / 2);\n rotationLine.setAttribute(\"y1\", this.y);\n rotationLine.setAttribute(\"x2\", position.x);\n rotationLine.setAttribute(\"y2\", position.y);\n rotationLine.setAttribute(\"stroke\", \"#5B57D1\"); \n rotationLine.setAttribute(\"stroke-width\", anchorStrokeWidth);\n rotationLine.setAttribute(\"vector-effect\", \"non-scaling-stroke\");\n\n // Apply rotation to rotation line if needed\n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n rotationLine.setAttribute('transform', `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n \n this.group.appendChild(rotationLine);\n } else {\n // Create resize handle (rectangle)\n anchor = document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n anchor.setAttribute(\"x\", position.x - anchorSize / 2);\n anchor.setAttribute(\"y\", position.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 }\n\n // Apply rotation to anchor if needed\n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n anchor.setAttribute('transform', `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n\n anchor.style.cursor = position.cursor;\n anchor.addEventListener('pointerdown', (e) => this.startAnchorDrag(e, index));\n \n this.anchors.push(anchor);\n this.group.appendChild(anchor);\n });\n }\n\n startAnchorDrag(e, index) {\n e.stopPropagation();\n e.preventDefault();\n\n // Store initial state for undo\n dragOldPosFrame = {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rotation: this.rotation\n };\n\n const startMousePos = getSVGCoordsFromMouse(e);\n const initialFrame = {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rotation: this.rotation\n };\n\n const onPointerMove = (event) => {\n const currentMousePos = getSVGCoordsFromMouse(event);\n \n if (index === 8) { // Rotation handle\n this.handleRotation(currentMousePos, initialFrame);\n } else {\n this.handleResize(index, currentMousePos, startMousePos, initialFrame);\n }\n \n this.draw();\n this.updateContainedShapes();\n };\n\n const onPointerUp = () => {\n if (dragOldPosFrame) {\n const newPos = {\n x: this.x,\n y: this.y,\n width: this.width,\n height: this.height,\n rotation: this.rotation\n };\n pushTransformAction(this, dragOldPosFrame, newPos);\n dragOldPosFrame = null;\n }\n \n svg.removeEventListener('pointermove', onPointerMove);\n svg.removeEventListener('pointerup', onPointerUp);\n svg.style.cursor = 'default';\n };\n\n svg.addEventListener('pointermove', onPointerMove);\n svg.addEventListener('pointerup', onPointerUp);\n }\n\n handleRotation(mousePos, initialFrame) {\n const centerX = initialFrame.x + initialFrame.width / 2;\n const centerY = initialFrame.y + initialFrame.height / 2;\n \n const angle = Math.atan2(mousePos.y - centerY, mousePos.x - centerX);\n const newRotation = (angle * 180 / Math.PI + 90) % 360;\n const angleDiff = newRotation - this.rotation;\n const angleRad = angleDiff * Math.PI / 180;\n const cosAngle = Math.cos(angleRad);\n const sinAngle = Math.sin(angleRad);\n \n // Store the rotation center for contained shapes\n const rotationCenter = { x: centerX, y: centerY };\n \n // Rotate all contained shapes around the frame's center\n this.containedShapes.forEach(shape => {\n if (!shape) return;\n \n // Mark shape as being moved by frame to prevent frame containment updates\n shape.isBeingMovedByFrame = true;\n \n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n case 'image':\n case 'icon':\n // Get shape's current center\n const shapeCenterX = shape.x + shape.width / 2;\n const shapeCenterY = shape.y + shape.height / 2;\n \n // Calculate relative position from rotation center\n const relativeX = shapeCenterX - rotationCenter.x;\n const relativeY = shapeCenterY - rotationCenter.y;\n \n // Apply rotation to get new center position\n const newCenterX = rotationCenter.x + (relativeX * cosAngle - relativeY * sinAngle);\n const newCenterY = rotationCenter.y + (relativeX * sinAngle + relativeY * cosAngle);\n \n // Update shape position\n shape.x = newCenterX - shape.width / 2;\n shape.y = newCenterY - shape.height / 2;\n shape.rotation = (shape.rotation || 0) + angleDiff;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n \n case 'circle':\n // Get circle's center\n const circleCenterX = shape.x;\n const circleCenterY = shape.y;\n \n // Calculate relative position from rotation center\n const relativeCircleX = circleCenterX - rotationCenter.x;\n const relativeCircleY = circleCenterY - rotationCenter.y;\n \n // Apply rotation\n const newCircleCenterX = rotationCenter.x + (relativeCircleX * cosAngle - relativeCircleY * sinAngle);\n const newCircleCenterY = rotationCenter.y + (relativeCircleX * sinAngle + relativeCircleY * cosAngle);\n \n shape.x = newCircleCenterX;\n shape.y = newCircleCenterY;\n shape.rotation = (shape.rotation || 0) + angleDiff;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n \n case 'line':\n case 'arrow':\n // Calculate relative positions for start and end points\n const relativeStartX = shape.startPoint.x - rotationCenter.x;\n const relativeStartY = shape.startPoint.y - rotationCenter.y;\n const relativeEndX = shape.endPoint.x - rotationCenter.x;\n const relativeEndY = shape.endPoint.y - rotationCenter.y;\n \n // Apply rotation to both points\n const newStartX = rotationCenter.x + (relativeStartX * cosAngle - relativeStartY * sinAngle);\n const newStartY = rotationCenter.y + (relativeStartX * sinAngle + relativeStartY * cosAngle);\n const newEndX = rotationCenter.x + (relativeEndX * cosAngle - relativeEndY * sinAngle);\n const newEndY = rotationCenter.y + (relativeEndX * sinAngle + relativeEndY * cosAngle);\n \n shape.startPoint.x = newStartX;\n shape.startPoint.y = newStartY;\n shape.endPoint.x = newEndX;\n shape.endPoint.y = newEndY;\n \n if (shape.shapeName === 'arrow' && shape.arrowCurved && typeof shape.initializeCurveControlPoints === 'function') {\n shape.initializeCurveControlPoints();\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n \n case 'text':\n case 'code':\n // Get text/code bounds for center calculation\n const textOrCodeEl = shape.group ? (shape.group.querySelector('text') || shape.group.querySelector('foreignObject')) : null;\n if (textOrCodeEl) {\n const bbox = textOrCodeEl.getBBox();\n const transform = shape.group.transform.baseVal.consolidate();\n const matrix = transform ? transform.matrix : { e: 0, f: 0 };\n\n const textCenterX = bbox.x + matrix.e + bbox.width / 2;\n const textCenterY = bbox.y + matrix.f + bbox.height / 2;\n\n // Calculate relative position\n const relativeTextX = textCenterX - rotationCenter.x;\n const relativeTextY = textCenterY - rotationCenter.y;\n\n // Apply rotation\n const newTextCenterX = rotationCenter.x + (relativeTextX * cosAngle - relativeTextY * sinAngle);\n const newTextCenterY = rotationCenter.y + (relativeTextX * sinAngle + relativeTextY * cosAngle);\n\n // Update position\n const newTransformX = newTextCenterX - bbox.width / 2;\n const newTransformY = newTextCenterY - bbox.height / 2;\n const newShapeRotation = (shape.rotation || 0) + angleDiff;\n\n const textCenterRelativeX = bbox.width / 2;\n const textCenterRelativeY = bbox.height / 2;\n\n shape.group.setAttribute('transform',\n `translate(${newTransformX}, ${newTransformY}) rotate(${newShapeRotation}, ${textCenterRelativeX}, ${textCenterRelativeY})`\n );\n\n shape.x = newTransformX;\n shape.y = newTransformY;\n shape.rotation = newShapeRotation;\n }\n break;\n \n case 'freehandStroke':\n if (shape.points && Array.isArray(shape.points)) {\n // Rotate each point in the stroke\n shape.points = shape.points.map(point => {\n if (!Array.isArray(point) || point.length < 2) return point;\n \n const relativePointX = point[0] - rotationCenter.x;\n const relativePointY = point[1] - rotationCenter.y;\n \n const newPointX = rotationCenter.x + (relativePointX * cosAngle - relativePointY * sinAngle);\n const newPointY = rotationCenter.y + (relativePointX * sinAngle + relativePointY * cosAngle);\n \n return [newPointX, newPointY, point[2] || 0.5];\n });\n \n if (typeof shape.updateBoundingBox === 'function') {\n shape.updateBoundingBox();\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n }\n break;\n }\n \n // Update arrows attached to the contained shape\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n \n // Remove the flag after rotation\n delete shape.isBeingMovedByFrame;\n });\n \n // Update the frame's rotation\n this.rotation = newRotation;\n \n // Update arrows attached to this frame\n this.updateAttachedArrows();\n }\n\n handleResize(anchorIndex, currentPos, startPos, initialFrame) {\n const rawDx = currentPos.x - startPos.x;\n const rawDy = currentPos.y - startPos.y;\n\n // Rotate delta to local (unrotated) space when frame is rotated\n const rad = (this.rotation || 0) * Math.PI / 180;\n const cosR = Math.cos(rad);\n const sinR = Math.sin(rad);\n const dx = rawDx * cosR + rawDy * sinR;\n const dy = -rawDx * sinR + rawDy * cosR;\n\n // Store old frame for scale calculation\n const oldX = this.x, oldY = this.y, oldW = this.width, oldH = this.height;\n\n // Compute new dimensions using local-space deltas\n let newW, newH;\n // Fixed corner relative to initial frame origin: (fixRelX, fixRelY)\n let fixRelX, fixRelY;\n\n switch (anchorIndex) {\n case 0: // Top-left\n newW = Math.max(10, initialFrame.width - dx);\n newH = Math.max(10, initialFrame.height - dy);\n fixRelX = initialFrame.width; fixRelY = initialFrame.height;\n break;\n case 1: // Top-middle\n newW = initialFrame.width;\n newH = Math.max(10, initialFrame.height - dy);\n fixRelX = 0; fixRelY = initialFrame.height;\n break;\n case 2: // Top-right\n newW = Math.max(10, initialFrame.width + dx);\n newH = Math.max(10, initialFrame.height - dy);\n fixRelX = 0; fixRelY = initialFrame.height;\n break;\n case 3: // Right-middle\n newW = Math.max(10, initialFrame.width + dx);\n newH = initialFrame.height;\n fixRelX = 0; fixRelY = 0;\n break;\n case 4: // Bottom-right\n newW = Math.max(10, initialFrame.width + dx);\n newH = Math.max(10, initialFrame.height + dy);\n fixRelX = 0; fixRelY = 0;\n break;\n case 5: // Bottom-middle\n newW = initialFrame.width;\n newH = Math.max(10, initialFrame.height + dy);\n fixRelX = 0; fixRelY = 0;\n break;\n case 6: // Bottom-left\n newW = Math.max(10, initialFrame.width - dx);\n newH = Math.max(10, initialFrame.height + dy);\n fixRelX = initialFrame.width; fixRelY = 0;\n break;\n case 7: // Left-middle\n newW = Math.max(10, initialFrame.width - dx);\n newH = initialFrame.height;\n fixRelX = initialFrame.width; fixRelY = 0;\n break;\n }\n\n // Compute new position using fixed-corner constraint\n if (this.rotation && this.rotation !== 0) {\n // Compute rotated world position of the fixed corner in the initial frame\n const iCX = initialFrame.x + initialFrame.width / 2;\n const iCY = initialFrame.y + initialFrame.height / 2;\n const odx = (initialFrame.x + fixRelX) - iCX;\n const ody = (initialFrame.y + fixRelY) - iCY;\n const fixedWorldX = iCX + odx * cosR - ody * sinR;\n const fixedWorldY = iCY + odx * sinR + ody * cosR;\n\n // Where the fixed corner sits in new rect (relative to new origin)\n const fixNewRelX = (fixRelX === 0) ? 0 : newW;\n const fixNewRelY = (fixRelY === 0) ? 0 : newH;\n\n // Solve for new origin\n const ncx = newW / 2;\n const ncy = newH / 2;\n const ndx = fixNewRelX - ncx;\n const ndy = fixNewRelY - ncy;\n const rotX = ncx + ndx * cosR - ndy * sinR;\n const rotY = ncy + ndx * sinR + ndy * cosR;\n\n this.x = fixedWorldX - rotX;\n this.y = fixedWorldY - rotY;\n } else {\n // No rotation - use simple axis-aligned position calculation\n switch (anchorIndex) {\n case 0: this.x = initialFrame.x + (initialFrame.width - newW); this.y = initialFrame.y + (initialFrame.height - newH); break;\n case 1: this.y = initialFrame.y + (initialFrame.height - newH); break;\n case 2: this.y = initialFrame.y + (initialFrame.height - newH); break;\n case 3: break;\n case 4: break;\n case 5: break;\n case 6: this.x = initialFrame.x + (initialFrame.width - newW); break;\n case 7: this.x = initialFrame.x + (initialFrame.width - newW); break;\n }\n }\n\n this.width = newW;\n this.height = newH;\n\n // Scale contained shapes proportionally so nothing falls out\n if (oldW > 0 && oldH > 0) {\n const scaleX = this.width / oldW;\n const scaleY = this.height / oldH;\n\n if (Math.abs(scaleX - 1) > 0.001 || Math.abs(scaleY - 1) > 0.001) {\n this.containedShapes.forEach(shape => {\n if (!shape) return;\n shape.isBeingMovedByFrame = true;\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'image':\n case 'icon':\n case 'code': {\n const relX = (shape.x - oldX) / oldW;\n const relY = (shape.y - oldY) / oldH;\n const relW = shape.width / oldW;\n const relH = shape.height / oldH;\n shape.x = this.x + relX * this.width;\n shape.y = this.y + relY * this.height;\n shape.width = relW * this.width;\n shape.height = relH * this.height;\n if (typeof shape.draw === 'function') shape.draw();\n break;\n }\n case 'circle': {\n const relCX = (shape.x - oldX) / oldW;\n const relCY = (shape.y - oldY) / oldH;\n shape.x = this.x + relCX * this.width;\n shape.y = this.y + relCY * this.height;\n shape.rx = (shape.rx / oldW) * this.width;\n shape.ry = (shape.ry / oldH) * this.height;\n shape.width = shape.rx * 2;\n shape.height = shape.ry * 2;\n if (typeof shape.draw === 'function') shape.draw();\n break;\n }\n case 'arrow':\n case 'line': {\n const relSX = (shape.startPoint.x - oldX) / oldW;\n const relSY = (shape.startPoint.y - oldY) / oldH;\n const relEX = (shape.endPoint.x - oldX) / oldW;\n const relEY = (shape.endPoint.y - oldY) / oldH;\n shape.startPoint.x = this.x + relSX * this.width;\n shape.startPoint.y = this.y + relSY * this.height;\n shape.endPoint.x = this.x + relEX * this.width;\n shape.endPoint.y = this.y + relEY * this.height;\n if (shape.controlPoint1) {\n const relC1X = (shape.controlPoint1.x - oldX) / oldW;\n const relC1Y = (shape.controlPoint1.y - oldY) / oldH;\n shape.controlPoint1.x = this.x + relC1X * this.width;\n shape.controlPoint1.y = this.y + relC1Y * this.height;\n }\n if (shape.controlPoint2) {\n const relC2X = (shape.controlPoint2.x - oldX) / oldW;\n const relC2Y = (shape.controlPoint2.y - oldY) / oldH;\n shape.controlPoint2.x = this.x + relC2X * this.width;\n shape.controlPoint2.y = this.y + relC2Y * this.height;\n }\n if (typeof shape.draw === 'function') shape.draw();\n break;\n }\n case 'text': {\n const tx = shape.x || 0;\n const ty = shape.y || 0;\n const relTX = (tx - oldX) / oldW;\n const relTY = (ty - oldY) / oldH;\n shape.x = this.x + relTX * this.width;\n shape.y = this.y + relTY * this.height;\n break;\n }\n case 'freehandStroke': {\n // Pie sectors are editable closed freehand polygons.\n // Scale their source points with the frame so their\n // geometry stays attached instead of being clipped\n // at its previous canvas coordinates.\n if (Array.isArray(shape.points)) {\n shape.points = shape.points.map(point => {\n if (!Array.isArray(point) || point.length < 2) return point;\n const relPX = (point[0] - oldX) / oldW;\n const relPY = (point[1] - oldY) / oldH;\n return [\n this.x + relPX * this.width,\n this.y + relPY * this.height,\n point[2] || 0.5\n ];\n });\n shape._moveOffsetX = 0;\n shape._moveOffsetY = 0;\n if (typeof shape.draw === 'function') shape.draw();\n }\n break;\n }\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n delete shape.isBeingMovedByFrame;\n });\n }\n }\n\n // Update contained shapes visibility\n this.updateContainedShapes();\n }\n \n temporarilyRemoveFromFrame(shape) {\n if (shape && shape.parentFrame === this) {\n // Move shape back to main SVG temporarily (without removing from containedShapes array)\n const el = shape.group || shape.element;\n if (el && el.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(el);\n svg.appendChild(el);\n }\n shape.isDraggedOutTemporarily = true;\n }\n}\n\n// Add a method to restore clipping for a shape after drag\nrestoreToFrame(shape) {\n if (shape && shape.parentFrame === this && shape.isDraggedOutTemporarily) {\n // Move shape back to clipped group\n const el = shape.group || shape.element;\n if (el && el.parentNode === svg) {\n svg.removeChild(el);\n this.clipGroup.appendChild(el);\n }\n delete shape.isDraggedOutTemporarily;\n }\n}\n\n\n contains(viewBoxX, viewBoxY) {\n // Simple point-in-rectangle test (without rotation for now)\n return viewBoxX >= this.x && viewBoxX <= this.x + this.width &&\n viewBoxY >= this.y && viewBoxY <= this.y + this.height;\n }\n\n // Arrow attachment support (similar to other shapes)\n getAttachmentPoint(point, tolerance = 20) {\n const rect = {\n left: this.x,\n right: this.x + this.width,\n top: this.y,\n bottom: this.y + this.height\n };\n\n const distances = {\n top: Math.abs(point.y - rect.top),\n bottom: Math.abs(point.y - rect.bottom),\n left: Math.abs(point.x - rect.left),\n right: Math.abs(point.x - rect.right)\n };\n\n let closestSide = null;\n let minDistance = tolerance;\n\n for (let side in distances) {\n if (distances[side] < minDistance &&\n ((side === 'top' || side === 'bottom') && point.x >= rect.left && point.x <= rect.right) ||\n ((side === 'left' || side === 'right') && point.y >= rect.top && point.y <= rect.bottom)) {\n minDistance = distances[side];\n closestSide = side;\n }\n }\n\n if (closestSide) {\n let attachPoint;\n const offset = { x: 0, y: 0 };\n\n switch (closestSide) {\n case 'top':\n attachPoint = { x: point.x, y: rect.top };\n offset.x = point.x - (rect.left + this.width / 2);\n break;\n case 'bottom':\n attachPoint = { x: point.x, y: rect.bottom };\n offset.x = point.x - (rect.left + this.width / 2);\n break;\n case 'left':\n attachPoint = { x: rect.left, y: point.y };\n offset.y = point.y - (rect.top + this.height / 2);\n break;\n case 'right':\n attachPoint = { x: rect.right, y: point.y };\n offset.y = point.y - (rect.top + this.height / 2);\n break;\n }\n\n return { point: attachPoint, side: closestSide, offset, shape: this };\n }\n\n return null;\n }\n\n updateStyle(newOptions) {\n Object.keys(newOptions).forEach(key => newOptions[key] === undefined && delete newOptions[key]);\n this.options = { ...this.options, ...newOptions };\n this.draw();\n }\n\n destroy() {\n const isDiagramFrame = !!this._diagramType;\n\n [...this.containedShapes].forEach(shape => {\n if (isDiagramFrame) {\n // Diagram/graph frame: destroy contained shapes with the frame\n if (typeof window.cleanupAttachments === 'function') {\n window.cleanupAttachments(shape);\n }\n const el = shape.group || shape.element;\n if (el && el.parentNode) {\n el.parentNode.removeChild(el);\n }\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n const idx = shapes.indexOf(shape);\n if (idx > -1) {\n shapes.splice(idx, 1);\n }\n } else {\n // Regular frame: release contained shapes back to canvas\n const el = shape.group || shape.element;\n if (el) {\n if (el.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(el);\n }\n svg.appendChild(el);\n }\n if (shape.shapeName === 'frame' && shape.clipGroup) {\n if (shape.clipGroup.parentNode === this.clipGroup) {\n this.clipGroup.removeChild(shape.clipGroup);\n }\n svg.appendChild(shape.clipGroup);\n }\n }\n shape.parentFrame = null;\n delete shape.isBeingMovedByFrame;\n });\n this.containedShapes = [];\n\n // Remove clip path\n if (this.clipPath && this.clipPath.parentNode) {\n this.clipPath.parentNode.removeChild(this.clipPath);\n }\n\n // Remove groups (clipGroup should be empty now)\n if (this.clipGroup && this.clipGroup.parentNode) {\n this.clipGroup.parentNode.removeChild(this.clipGroup);\n }\n\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n\n const index = shapes.indexOf(this);\n if (index > -1) {\n shapes.splice(index, 1);\n }\n if (currentShape === this) {\n currentShape = null;\n }\n }\n\n /**\n * Set a background image for this frame from a URL.\n * The image will fit/cover the frame dimensions.\n * @param {string} url - Image URL\n * @param {string} fit - 'cover' (default) | 'contain' | 'fill'\n */\n setImageFromURL(url, fit = 'cover') {\n if (!url) {\n // Remove existing frame image\n if (this._frameImage && this._frameImage.parentNode) {\n this._frameImage.parentNode.removeChild(this._frameImage);\n this._frameImage = null;\n }\n this._frameImageURL = null;\n return;\n }\n\n this._frameImageURL = url;\n this._frameImageFit = fit;\n\n if (!this._frameImage) {\n this._frameImage = document.createElementNS('http://www.w3.org/2000/svg', 'image');\n this._frameImage.setAttribute('pointer-events', 'none');\n }\n // Always update preserveAspectRatio when fit changes\n this._frameImage.setAttribute('preserveAspectRatio',\n fit === 'cover' ? 'xMidYMid slice' :\n fit === 'contain' ? 'xMidYMid meet' :\n fit === 'center' ? 'xMidYMid meet' : 'none'\n );\n\n this._frameImage.setAttribute('href', url);\n this._frameImage.setAttribute('x', this.x);\n this._frameImage.setAttribute('y', this.y);\n this._frameImage.setAttribute('width', this.width);\n this._frameImage.setAttribute('height', this.height);\n\n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n this._frameImage.setAttribute('transform', `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n }\n\n // Insert image right after the frame rect (below contained shapes)\n if (this._frameImage.parentNode === this.group) {\n this.group.removeChild(this._frameImage);\n }\n if (this.element && this.element.nextSibling) {\n this.group.insertBefore(this._frameImage, this.element.nextSibling);\n } else {\n this.group.appendChild(this._frameImage);\n }\n }\n\n /**\n * Update frame image position/size (called during move/resize)\n */\n _updateFrameImage() {\n if (!this._frameImage) return;\n this._frameImage.setAttribute('x', this.x);\n this._frameImage.setAttribute('y', this.y);\n this._frameImage.setAttribute('width', this.width);\n this._frameImage.setAttribute('height', this.height);\n\n if (this.rotation !== 0) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n this._frameImage.setAttribute('transform', `rotate(${this.rotation}, ${centerX}, ${centerY})`);\n } else {\n this._frameImage.removeAttribute('transform');\n }\n }\n}\n\nexport { Frame };\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|