@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
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/core/Selection.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\n// Multi-selection system - copied from selection.js\n\nimport { cleanupAttachments } from '../tools/arrowTool.js';\nimport { pushCreateAction, pushTransformAction, pushFrameAttachmentAction, pushDeleteAction } from './UndoRedo.js';\nimport { calculateSnap, clearSnapGuides } from './SnapGuides.js';\nimport { registerRotationAnchor } from './ScreenSpaceControls.js';\n\nlet isMultiSelecting = false;\nlet multiSelectionStart = { x: 0, y: 0 };\nlet multiSelectionRect = null;\nlet isDraggingMultiSelection = false;\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\nfunction createMultiSelectionRect(startX, startY) {\n multiSelectionRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n multiSelectionRect.setAttribute('x', startX);\n multiSelectionRect.setAttribute('y', startY);\n multiSelectionRect.setAttribute('width', 0);\n multiSelectionRect.setAttribute('height', 0);\n multiSelectionRect.setAttribute('fill', 'rgba(91, 87, 209, 0.1)');\n multiSelectionRect.setAttribute('stroke', '#5B57D1');\n multiSelectionRect.setAttribute('stroke-width', 1);\n multiSelectionRect.setAttribute('stroke-dasharray', '4 2');\n multiSelectionRect.setAttribute('style', 'pointer-events: none;');\n svg.appendChild(multiSelectionRect);\n}\n\nfunction updateMultiSelectionRect(currentX, currentY) {\n if (!multiSelectionRect) return;\n\n const x = Math.min(multiSelectionStart.x, currentX);\n const y = Math.min(multiSelectionStart.y, currentY);\n const width = Math.abs(currentX - multiSelectionStart.x);\n const height = Math.abs(currentY - multiSelectionStart.y);\n\n multiSelectionRect.setAttribute('x', x);\n multiSelectionRect.setAttribute('y', y);\n multiSelectionRect.setAttribute('width', width);\n multiSelectionRect.setAttribute('height', height);\n}\n\nfunction removeMultiSelectionRect() {\n if (multiSelectionRect && multiSelectionRect.parentNode) {\n multiSelectionRect.parentNode.removeChild(multiSelectionRect);\n }\n multiSelectionRect = null;\n // Clean up any drag-select highlights\n clearDragSelectHighlights();\n}\n\n// Track elements highlighted during drag-select\nlet dragSelectHighlights = [];\n\nfunction highlightShapesInSelectionRect(currentX, currentY) {\n // Clear previous highlights\n clearDragSelectHighlights();\n\n if (!multiSelectionStart) return;\n\n const selBounds = {\n x: Math.min(multiSelectionStart.x, currentX),\n y: Math.min(multiSelectionStart.y, currentY),\n width: Math.abs(currentX - multiSelectionStart.x),\n height: Math.abs(currentY - multiSelectionStart.y)\n };\n\n // Minimum size check to avoid highlighting on click\n if (selBounds.width < 5 && selBounds.height < 5) return;\n\n if (typeof shapes !== 'undefined') {\n shapes.forEach(shape => {\n if (isShapeInSelectionRect(shape, selBounds)) {\n // Add a semi-transparent overlay to the shape's group\n if (shape.group && typeof shape.group.getBBox === 'function') {\n let bbox;\n try { bbox = shape.group.getBBox(); } catch { return; }\n const overlay = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n overlay.setAttribute('x', bbox.x - 2);\n overlay.setAttribute('y', bbox.y - 2);\n overlay.setAttribute('width', bbox.width + 4);\n overlay.setAttribute('height', bbox.height + 4);\n overlay.setAttribute('fill', 'rgba(91, 87, 209, 0.12)');\n overlay.setAttribute('stroke', '#5B57D1');\n overlay.setAttribute('stroke-width', '1');\n overlay.setAttribute('stroke-opacity', '0.4');\n overlay.setAttribute('rx', '3');\n overlay.setAttribute('style', 'pointer-events: none;');\n overlay.setAttribute('class', 'drag-select-highlight');\n shape.group.appendChild(overlay);\n dragSelectHighlights.push(overlay);\n }\n }\n });\n }\n}\n\nfunction clearDragSelectHighlights() {\n dragSelectHighlights.forEach(el => {\n if (el.parentNode) el.parentNode.removeChild(el);\n });\n dragSelectHighlights = [];\n}\n\nfunction isShapeInSelectionRect(shape, selectionBounds) {\n let shapeBounds;\n\n switch (shape.shapeName) {\n case 'rectangle':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n case 'circle':\n shapeBounds = {\n x: shape.x - shape.rx,\n y: shape.y - shape.ry,\n width: shape.rx * 2,\n height: shape.ry * 2\n };\n break;\n case 'line':\n shapeBounds = {\n x: Math.min(shape.startPoint.x, shape.endPoint.x),\n y: Math.min(shape.startPoint.y, shape.endPoint.y),\n width: Math.abs(shape.endPoint.x - shape.startPoint.x),\n height: Math.abs(shape.endPoint.y - shape.startPoint.y)\n };\n break;\n case 'arrow':\n const minX = Math.min(shape.startPoint.x, shape.endPoint.x);\n const minY = Math.min(shape.startPoint.y, shape.endPoint.y);\n const maxX = Math.max(shape.startPoint.x, shape.endPoint.x);\n const maxY = Math.max(shape.startPoint.y, shape.endPoint.y);\n shapeBounds = {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n break;\n case 'freehandStroke':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n case 'text':\n case 'code':\n const textOrCodeEl = shape.group ? shape.group.querySelector('text') : null;\n if (textOrCodeEl && shape.group.style.display !== 'none') {\n try {\n const bbox = textOrCodeEl.getBBox();\n const transform = shape.group.transform.baseVal.consolidate();\n const matrix = transform ? transform.matrix : { e: 0, f: 0 };\n shapeBounds = {\n x: bbox.x + matrix.e,\n y: bbox.y + matrix.f,\n width: bbox.width,\n height: bbox.height\n };\n } catch {\n shapeBounds = { x: 0, y: 0, width: 0, height: 0 };\n }\n } else {\n shapeBounds = { x: 0, y: 0, width: 0, height: 0 };\n }\n break;\n case 'image':\n if (shape.element) {\n shapeBounds = {\n x: parseFloat(shape.element.getAttribute('x')),\n y: parseFloat(shape.element.getAttribute('y')),\n width: parseFloat(shape.element.getAttribute('width')),\n height: parseFloat(shape.element.getAttribute('height'))\n };\n } else {\n shapeBounds = { x: shape.x, y: shape.y, width: shape.width, height: shape.height };\n }\n break;\n case 'frame':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n case 'icon':\n shapeBounds = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n break;\n default:\n shapeBounds = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0\n };\n }\n\n return !(selectionBounds.x > shapeBounds.x + shapeBounds.width ||\n selectionBounds.x + selectionBounds.width < shapeBounds.x ||\n selectionBounds.y > shapeBounds.y + shapeBounds.height ||\n selectionBounds.y + selectionBounds.height < shapeBounds.y);\n}\n\nclass MultiSelection {\n constructor() {\n this.selectedShapes = new Set();\n this.group = null;\n this.anchors = [];\n this.outline = null;\n this.rotationAnchor = null;\n this.rotationLine = null;\n this.selectionPadding = 12;\n this.bounds = null;\n this.initialPositions = new Map();\n\n this.isDragging = false;\n this.isResizing = false;\n this.isRotating = false;\n this.resizingAnchorIndex = null;\n this.dragStart = { x: 0, y: 0 };\n this.rotationCenter = { x: 0, y: 0 };\n this.startRotationMouseAngle = 0;\n this._undoSnapshots = new Map(); // Stores initial state for undo tracking\n this.initialRotation = 0;\n }\n\n // Capture current state of all selected shapes for undo\n _snapshotForUndo() {\n this._undoSnapshots.clear();\n this.selectedShapes.forEach(shape => {\n this._undoSnapshots.set(shape, this._captureShapeState(shape));\n });\n }\n\n _captureShapeState(shape) {\n switch (shape.shapeName) {\n case 'line':\n case 'arrow':\n return {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint },\n x: shape.x, y: shape.y,\n width: shape.width || 0, height: shape.height || 0,\n rotation: shape.rotation || 0\n };\n case 'circle':\n return { x: shape.x, y: shape.y, rx: shape.rx, ry: shape.ry, rotation: shape.rotation || 0, width: shape.width, height: shape.height };\n case 'freehandStroke':\n return { x: shape.x, y: shape.y, width: shape.width, height: shape.height, rotation: shape.rotation || 0, points: JSON.parse(JSON.stringify(shape.points)) };\n default:\n return { x: shape.x || 0, y: shape.y || 0, width: shape.width || 0, height: shape.height || 0, rotation: shape.rotation || 0 };\n }\n }\n\n // Push undo actions for all shapes that changed\n _pushUndoForAll() {\n this.selectedShapes.forEach(shape => {\n const oldState = this._undoSnapshots.get(shape);\n if (!oldState) return;\n const newState = this._captureShapeState(shape);\n // Check if anything actually changed\n const changed = Object.keys(oldState).some(key => {\n if (key === 'points' || key === 'startPoint' || key === 'endPoint') return JSON.stringify(oldState[key]) !== JSON.stringify(newState[key]);\n return oldState[key] !== newState[key];\n });\n if (changed) {\n pushTransformAction(shape, oldState, newState);\n }\n });\n this._undoSnapshots.clear();\n }\n\n addShape(shape) {\n this.selectedShapes.add(shape);\n shape.isSelected = true;\n this.updateControls();\n }\n\n removeShape(shape) {\n this.selectedShapes.delete(shape);\n shape.isSelected = false;\n if (this.selectedShapes.size === 0) {\n this.clearSelection();\n } else {\n this.updateControls();\n }\n }\n\n clearSelection() {\n this.selectedShapes.forEach(shape => {\n shape.isSelected = false;\n if (typeof shape.removeSelection === 'function') {\n shape.removeSelection();\n }\n });\n this.selectedShapes.clear();\n this.removeControls();\n if (typeof currentShape !== 'undefined') {\n currentShape = null;\n }\n if (typeof disableAllSideBars === 'function') {\n disableAllSideBars();\n }\n }\n\n selectShapesInRect(selectionBounds) {\n this.clearSelection();\n\n if (typeof shapes !== 'undefined') {\n shapes.forEach(shape => {\n if (isShapeInSelectionRect(shape, selectionBounds)) {\n this.addShape(shape);\n }\n });\n }\n\n if (this.selectedShapes.size === 1) {\n if (typeof currentShape !== 'undefined') {\n currentShape = Array.from(this.selectedShapes)[0];\n }\n } else {\n if (typeof currentShape !== 'undefined') {\n currentShape = null;\n }\n }\n }\n\n getBounds() {\n if (this.selectedShapes.size === 0) return null;\n\n let minX = Infinity, minY = Infinity;\n let maxX = -Infinity, maxY = -Infinity;\n\n this.selectedShapes.forEach(shape => {\n const shapeBounds = this.getShapeBounds(shape);\n minX = Math.min(minX, shapeBounds.x);\n minY = Math.min(minY, shapeBounds.y);\n maxX = Math.max(maxX, shapeBounds.x + shapeBounds.width);\n maxY = Math.max(maxY, shapeBounds.y + shapeBounds.height);\n });\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY\n };\n }\n\n getShapeBounds(shape) {\n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n return {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n case 'circle':\n return {\n x: shape.x - shape.rx,\n y: shape.y - shape.ry,\n width: shape.rx * 2,\n height: shape.ry * 2\n };\n case 'line':\n case 'arrow':\n return {\n x: Math.min(shape.startPoint.x, shape.endPoint.x),\n y: Math.min(shape.startPoint.y, shape.endPoint.y),\n width: Math.abs(shape.endPoint.x - shape.startPoint.x),\n height: Math.abs(shape.endPoint.y - shape.startPoint.y)\n };\n case 'freehandStroke':\n return {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n case 'text':\n const textElement = shape.group ? shape.group.querySelector('text') : null;\n if (textElement) {\n const bbox = textElement.getBBox();\n const transform = shape.group.transform.baseVal.consolidate();\n const matrix = transform ? transform.matrix : { e: 0, f: 0 };\n return {\n x: bbox.x + matrix.e,\n y: bbox.y + matrix.f,\n width: bbox.width,\n height: bbox.height\n };\n }\n return { x: 0, y: 0, width: 0, height: 0 };\n case 'image':\n if (shape.element) {\n return {\n x: parseFloat(shape.element.getAttribute('x')),\n y: parseFloat(shape.element.getAttribute('y')),\n width: parseFloat(shape.element.getAttribute('width')),\n height: parseFloat(shape.element.getAttribute('height'))\n };\n }\n return { x: shape.x, y: shape.y, width: shape.width, height: shape.height };\n case 'icon':\n return {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height\n };\n default:\n return {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0\n };\n }\n }\n\n updateControls() {\n this.removeControls();\n if (this.selectedShapes.size === 0) return;\n\n this.bounds = this.getBounds();\n if (!this.bounds) return;\n\n this.createControls();\n }\n\n createControls() {\n this.createRotatedControls(0);\n }\n\n createOutline(x, y, width, height) {\n const zoom = window.currentZoom || 1;\n const outlinePoints = [\n [x, y],\n [x + width, y],\n [x + width, y + height],\n [x, y + height],\n [x, y]\n ];\n\n this.outline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');\n this.outline.setAttribute('points', outlinePoints.map(p => p.join(',')).join(' '));\n this.outline.setAttribute('fill', 'none');\n this.outline.setAttribute('stroke', '#5B57D1');\n this.outline.setAttribute('stroke-width', 2);\n this.outline.setAttribute('stroke-dasharray', `${8 / zoom} ${4 / zoom}`);\n this.outline.setAttribute('vector-effect', 'non-scaling-stroke');\n this.outline.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(this.outline);\n }\n\n createResizeAnchors(x, y, width, height) {\n const zoom = window.currentZoom || 1;\n const anchorSize = 12 / zoom;\n const anchorPositions = [\n { x: x, y: y, index: 0 },\n { x: x + width, y: y, index: 1 },\n { x: x, y: y + height, index: 2 },\n { x: x + width, y: y + height, index: 3 },\n { x: x + width / 2, y: y, index: 4 },\n { x: x + width / 2, y: y + height, index: 5 },\n { x: x, y: y + height / 2, index: 6 },\n { x: x + width, y: y + height / 2, index: 7 }\n ];\n\n this.anchors = [];\n anchorPositions.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('class', 'multi-selection-anchor');\n anchor.setAttribute('data-index', pos.index);\n anchor.setAttribute('fill', '#121212');\n anchor.setAttribute('stroke', '#5B57D1');\n anchor.setAttribute('stroke-width', 2);\n anchor.setAttribute('vector-effect', 'non-scaling-stroke');\n anchor.setAttribute('style', 'pointer-events: all; cursor: pointer;');\n\n const cursors = ['nw-resize', 'ne-resize', 'sw-resize', 'se-resize', 'n-resize', 's-resize', 'w-resize', 'e-resize'];\n anchor.style.cursor = cursors[pos.index];\n\n anchor.addEventListener('pointerdown', (e) => this.startResize(e, pos.index));\n\n this.group.appendChild(anchor);\n this.anchors.push(anchor);\n });\n }\n\n createRotationAnchor(x, y, width, height) {\n const zoom = window.currentZoom || 1;\n const rotationAnchorPos = { x: x + width / 2, y: y - 30 / zoom };\n\n this.rotationAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n this.rotationAnchor.setAttribute('cx', rotationAnchorPos.x);\n this.rotationAnchor.setAttribute('cy', rotationAnchorPos.y);\n this.rotationAnchor.setAttribute('r', 8 / zoom);\n this.rotationAnchor.setAttribute('class', 'multi-selection-rotation-anchor');\n this.rotationAnchor.setAttribute('fill', '#121212');\n this.rotationAnchor.setAttribute('stroke', '#5B57D1');\n this.rotationAnchor.setAttribute('stroke-width', 2);\n this.rotationAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n this.rotationAnchor.setAttribute('style', 'pointer-events: all; cursor: grab;');\n\n this.rotationAnchor.addEventListener('pointerdown', (e) => this.startRotation(e));\n\n this.rotationLine = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n this.rotationLine.setAttribute('x1', rotationAnchorPos.x);\n this.rotationLine.setAttribute('y1', rotationAnchorPos.y);\n this.rotationLine.setAttribute('x2', x + width / 2);\n this.rotationLine.setAttribute('y2', y);\n this.rotationLine.setAttribute('stroke', '#5B57D1');\n this.rotationLine.setAttribute('stroke-width', 1);\n this.rotationLine.setAttribute('stroke-dasharray', `${3 / zoom} ${3 / zoom}`);\n this.rotationLine.setAttribute('vector-effect', 'non-scaling-stroke');\n this.rotationLine.setAttribute('style', 'pointer-events: none;');\n\n this.group.appendChild(this.rotationLine);\n this.group.appendChild(this.rotationAnchor);\n registerRotationAnchor(this.rotationAnchor, {\n radius: 8,\n edgeY: y,\n line: this.rotationLine,\n lineEnd: '1',\n });\n }\n\n removeControls() {\n if (this.group && this.group.parentNode) {\n this.group.parentNode.removeChild(this.group);\n }\n this.group = null;\n this.anchors = [];\n this.outline = null;\n this.rotationAnchor = null;\n this.rotationLine = null;\n }\n\n isPointInBounds(x, y) {\n if (!this.bounds) return false;\n\n const padding = this.selectionPadding;\n return x >= this.bounds.x - padding && x <= this.bounds.x + this.bounds.width + padding &&\n y >= this.bounds.y - padding && y <= this.bounds.y + this.bounds.height + padding;\n }\n\n move(dx, dy) {\n this.selectedShapes.forEach(shape => {\n // Skip shapes whose parent frame is also selected \u2014 the frame's move()\n // will already move them, so moving them independently causes double-move offset\n if (shape.parentFrame && this.selectedShapes.has(shape.parentFrame)) {\n return;\n }\n\n if (typeof shape.move === 'function') {\n shape.move(dx, dy);\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n });\n\n this.updateControls();\n}\n\n startRotation(e) {\n e.stopPropagation();\n e.preventDefault();\n\n this.isRotating = true;\n\n const currentBounds = this.getBounds();\n this.rotationCenter = {\n x: currentBounds.x + currentBounds.width / 2,\n y: currentBounds.y + currentBounds.height / 2\n };\n\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(e);\n this.startRotationMouseAngle = Math.atan2(mouseY - this.rotationCenter.y, mouseX - this.rotationCenter.x) * 180 / Math.PI;\n\n this.storeInitialPositions();\n\n // Snapshot for undo tracking\n this._snapshotForUndo();\n\n const onMouseMove = (event) => {\n if (this.isRotating) {\n this.handleRotation(event);\n }\n };\n\n const onMouseUp = () => {\n this.isRotating = false;\n this.initialPositions.clear();\n\n // Push undo for all rotated shapes\n this._pushUndoForAll();\n\n if (typeof svg !== 'undefined') {\n svg.removeEventListener('pointermove', onMouseMove);\n svg.removeEventListener('pointerup', onMouseUp);\n svg.style.cursor = 'default';\n }\n };\n\n if (typeof svg !== 'undefined') {\n svg.addEventListener('pointermove', onMouseMove);\n svg.addEventListener('pointerup', onMouseUp);\n svg.style.cursor = 'grabbing';\n }\n }\n\n storeInitialPositions() {\n this.initialPositions.clear();\n\n const initialBounds = this.getBounds();\n this.initialPositions.set('initialBounds', {\n x: initialBounds.x,\n y: initialBounds.y,\n width: initialBounds.width,\n height: initialBounds.height\n });\n\n this.selectedShapes.forEach(shape => {\n let shapeData;\n\n let shapeCenterX, shapeCenterY;\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n shapeCenterX = shape.x + shape.width / 2;\n shapeCenterY = shape.y + shape.height / 2;\n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n case 'icon':\n shapeCenterX = shape.x + shape.width / 2;\n shapeCenterY = shape.y + shape.height / 2;\n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n\n case 'circle':\n shapeCenterX = shape.x;\n shapeCenterY = shape.y;\n shapeData = {\n x: shape.x,\n y: shape.y,\n rx: shape.rx || 0,\n ry: shape.ry || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n\n case 'line':\n case 'arrow':\n shapeData = {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint },\n relativeStartX: shape.startPoint.x - this.rotationCenter.x,\n relativeStartY: shape.startPoint.y - this.rotationCenter.y,\n relativeEndX: shape.endPoint.x - this.rotationCenter.x,\n relativeEndY: shape.endPoint.y - this.rotationCenter.y\n };\n break;\n\n case 'freehandStroke':\n if (!shape.points || !Array.isArray(shape.points) || shape.points.length === 0) {\n console.warn('FreehandStroke has invalid points array');\n return;\n }\n\n const validPoints = shape.points.filter(point =>\n Array.isArray(point) &&\n point.length >= 2 &&\n typeof point[0] === 'number' &&\n typeof point[1] === 'number' &&\n !isNaN(point[0]) &&\n !isNaN(point[1])\n );\n\n if (validPoints.length === 0) {\n console.warn('FreehandStroke has no valid points');\n return;\n }\n\n if (typeof shape.updateBoundingBox === 'function') {\n shape.updateBoundingBox();\n }\n\n const boundingBox = this.getShapeBounds(shape);\n\n shapeData = {\n x: boundingBox.x || 0,\n y: boundingBox.y || 0,\n width: boundingBox.width || 0,\n height: boundingBox.height || 0,\n points: validPoints.map(point => [point[0], point[1], point[2] || 0.5]),\n relativePoints: validPoints.map(point => [\n point[0] - this.rotationCenter.x,\n point[1] - this.rotationCenter.y,\n point[2] || 0.5\n ]),\n boundingBox: { ...boundingBox }\n };\n break;\n\n case 'text':\n const textBounds = this.getShapeBounds(shape);\n shapeCenterX = textBounds.x + textBounds.width / 2;\n shapeCenterY = textBounds.y + textBounds.height / 2;\n\n const currentTransform = shape.group.transform.baseVal.consolidate();\n const currentX = currentTransform ? currentTransform.matrix.e : 0;\n const currentY = currentTransform ? currentTransform.matrix.f : 0;\n\n shapeData = {\n x: currentX,\n y: currentY,\n width: shape.width || textBounds.width,\n height: shape.height || textBounds.height,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y,\n visualBounds: textBounds,\n transformX: currentX,\n transformY: currentY\n };\n break;\n\n case 'image':\n shapeCenterX = shape.x + (shape.width || 0) / 2;\n shapeCenterY = shape.y + (shape.height || 0) / 2;\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n break;\n\n default:\n shapeCenterX = (shape.x || 0) + (shape.width || 0) / 2;\n shapeCenterY = (shape.y || 0) + (shape.height || 0) / 2;\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0,\n centerX: shapeCenterX,\n centerY: shapeCenterY,\n relativeX: shapeCenterX - this.rotationCenter.x,\n relativeY: shapeCenterY - this.rotationCenter.y\n };\n }\n\n if (shapeData) {\n this.initialPositions.set(shape, shapeData);\n }\n });\n }\n\n handleRotation(e) {\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(e);\n const currentMouseAngle = Math.atan2(mouseY - this.rotationCenter.y, mouseX - this.rotationCenter.x) * 180 / Math.PI;\n const angleDiff = currentMouseAngle - this.startRotationMouseAngle;\n const angleRad = angleDiff * Math.PI / 180;\n const cosAngle = Math.cos(angleRad);\n const sinAngle = Math.sin(angleRad);\n\n this.selectedShapes.forEach(shape => {\n const initialData = this.initialPositions.get(shape);\n if (!initialData) return;\n\n if (typeof shape.removeSelection === 'function') {\n shape.removeSelection();\n }\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'frame':\n case 'image':\n case 'icon':\n const newCenterX = this.rotationCenter.x + (initialData.relativeX * cosAngle - initialData.relativeY * sinAngle);\n const newCenterY = this.rotationCenter.y + (initialData.relativeX * sinAngle + initialData.relativeY * cosAngle);\n\n shape.x = newCenterX - initialData.width / 2;\n shape.y = newCenterY - initialData.height / 2;\n shape.rotation = (initialData.rotation || 0) + angleDiff;\n\n if (typeof shape.rotate === 'function') {\n shape.rotate(shape.rotation);\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'text':\n const newTextCenterX = this.rotationCenter.x + (initialData.relativeX * cosAngle - initialData.relativeY * sinAngle);\n const newTextCenterY = this.rotationCenter.y + (initialData.relativeX * sinAngle + initialData.relativeY * cosAngle);\n\n const textElement = shape.group.querySelector('text');\n if (textElement) {\n const initialBbox = initialData.visualBounds;\n\n const newTransformX = newTextCenterX - initialBbox.width / 2;\n const newTransformY = newTextCenterY - initialBbox.height / 2;\n\n const newRotation = (initialData.rotation || 0) + angleDiff;\n\n const textCenterX = initialBbox.width / 2;\n const textCenterY = initialBbox.height / 2;\n\n shape.group.setAttribute('transform',\n `translate(${newTransformX}, ${newTransformY}) rotate(${newRotation}, ${textCenterX}, ${textCenterY})`\n );\n\n shape.x = newTransformX;\n shape.y = newTransformY;\n shape.rotation = newRotation;\n }\n\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'circle':\n const newCircleCenterX = this.rotationCenter.x + (initialData.relativeX * cosAngle - initialData.relativeY * sinAngle);\n const newCircleCenterY = this.rotationCenter.y + (initialData.relativeX * sinAngle + initialData.relativeY * cosAngle);\n\n shape.x = newCircleCenterX;\n shape.y = newCircleCenterY;\n shape.rotation = (initialData.rotation || 0) + angleDiff;\n\n if (typeof shape.rotate === 'function') {\n shape.rotate(shape.rotation);\n }\n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n break;\n\n case 'line':\n case 'arrow':\n const newStartX = this.rotationCenter.x + (initialData.relativeStartX * cosAngle - initialData.relativeStartY * sinAngle);\n const newStartY = this.rotationCenter.y + (initialData.relativeStartX * sinAngle + initialData.relativeStartY * cosAngle);\n const newEndX = this.rotationCenter.x + (initialData.relativeEndX * cosAngle - initialData.relativeEndY * sinAngle);\n const newEndY = this.rotationCenter.y + (initialData.relativeEndX * sinAngle + initialData.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 'freehandStroke':\n if (!initialData.relativePoints || !Array.isArray(initialData.relativePoints)) {\n console.warn('FreehandStroke missing valid relativePoints');\n break;\n }\n\n const rotatedPoints = initialData.relativePoints.map(relPoint => {\n if (!Array.isArray(relPoint) || relPoint.length < 2 ||\n typeof relPoint[0] !== 'number' || typeof relPoint[1] !== 'number' ||\n isNaN(relPoint[0]) || isNaN(relPoint[1])) {\n console.warn('Invalid relative point:', relPoint);\n return [0, 0, 0.5];\n }\n\n const newX = this.rotationCenter.x + (relPoint[0] * cosAngle - relPoint[1] * sinAngle);\n const newY = this.rotationCenter.y + (relPoint[0] * sinAngle + relPoint[1] * cosAngle);\n\n if (isNaN(newX) || isNaN(newY)) {\n console.warn('Generated NaN coordinates:', { newX, newY, relPoint, rotationCenter: this.rotationCenter });\n return [0, 0, 0.5];\n }\n\n return [newX, newY, relPoint[2] || 0.5];\n });\n\n shape.points = rotatedPoints.filter(point =>\n Array.isArray(point) &&\n point.length >= 2 &&\n typeof point[0] === 'number' &&\n typeof point[1] === 'number' &&\n !isNaN(point[0]) &&\n !isNaN(point[1])\n );\n\n if (shape.points.length === 0) {\n console.warn('No valid points after rotation');\n shape.points = [[0, 0, 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 break;\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n });\n\n this.updateControlsAfterRotation();\n }\n\n updateControlsAfterRotation() {\n this.removeControls();\n if (this.selectedShapes.size === 0) return;\n\n this.bounds = this.getBounds();\n\n if (!this.bounds) {\n return;\n }\n\n this.createControls();\n }\n\n\ncreateRotatedControls(angleDiff = 0) {\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.group.setAttribute('id', 'multi-selection-controls');\n\n if (angleDiff !== 0) {\n const centerX = this.bounds.x + this.bounds.width / 2;\n const centerY = this.bounds.y + this.bounds.height / 2;\n this.group.setAttribute('transform', `rotate(${angleDiff} ${centerX} ${centerY})`);\n }\n\n if (typeof svg !== 'undefined') {\n svg.appendChild(this.group);\n }\n\n // Draw faint individual outlines for each selected shape\n if (this.selectedShapes.size > 1) {\n this.selectedShapes.forEach(shape => {\n const b = this.getShapeBounds(shape);\n if (!b || b.width === 0 && b.height === 0) return;\n const rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', b.x - 3);\n rect.setAttribute('y', b.y - 3);\n rect.setAttribute('width', b.width + 6);\n rect.setAttribute('height', b.height + 6);\n rect.setAttribute('fill', 'none');\n rect.setAttribute('stroke', '#5B57D1');\n rect.setAttribute('stroke-width', 1);\n rect.setAttribute('stroke-opacity', 0.35);\n rect.setAttribute('stroke-dasharray', '4 3');\n rect.setAttribute('rx', 3);\n rect.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(rect);\n });\n }\n\n const expandedX = this.bounds.x - this.selectionPadding;\n const expandedY = this.bounds.y - this.selectionPadding;\n const expandedWidth = this.bounds.width + 2 * this.selectionPadding;\n const expandedHeight = this.bounds.height + 2 * this.selectionPadding;\n\n this.createOutline(expandedX, expandedY, expandedWidth, expandedHeight);\n this.createResizeAnchors(expandedX, expandedY, expandedWidth, expandedHeight);\n this.createRotationAnchor(expandedX, expandedY, expandedWidth, expandedHeight);\n}\n\n startResize(e, anchorIndex) {\n e.stopPropagation();\n e.preventDefault();\n\n this.isResizing = true;\n this.resizingAnchorIndex = anchorIndex;\n\n // Snapshot for undo tracking\n this._snapshotForUndo();\n\n this.initialPositions.clear();\n const initialBounds = this.getBounds();\n\n this.selectedShapes.forEach(shape => {\n let shapeData;\n shape.removeSelection();\n switch (shape.shapeName) {\n case 'rectangle':\n case 'icon': \n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rotation: shape.rotation\n };\n break;\n case 'circle':\n shapeData = {\n x: shape.x,\n y: shape.y,\n rx: shape.rx,\n ry: shape.ry,\n rotation: shape.rotation\n };\n break;\n case 'line':\n case 'arrow':\n shapeData = {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint }\n };\n break;\n default:\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0\n };\n }\n this.initialPositions.set(shape, shapeData);\n });\n\n this.initialPositions.set('bounds', initialBounds);\n\n const onMouseMove = (event) => {\n if (this.isResizing) {\n this.handleResize(event);\n }\n };\n\n const onMouseUp = () => {\n this.isResizing = false;\n this.resizingAnchorIndex = null;\n this.initialPositions.clear();\n\n // Push undo for all resized shapes\n this._pushUndoForAll();\n\n if (typeof svg !== 'undefined') {\n svg.removeEventListener('pointermove', onMouseMove);\n svg.removeEventListener('pointerup', onMouseUp);\n svg.style.cursor = 'default';\n }\n };\n\n if (typeof svg !== 'undefined') {\n svg.addEventListener('pointermove', onMouseMove);\n svg.addEventListener('pointerup', onMouseUp);\n }\n }\n\n handleResize(e) {\n const { x: mouseX, y: mouseY } = getSVGCoordsFromMouse(e);\n const initialBounds = this.initialPositions.get('bounds');\n if (!initialBounds) return;\n\n let scaleX = 1, scaleY = 1;\n let newBounds = { ...initialBounds };\n\n switch (this.resizingAnchorIndex) {\n case 0:\n scaleX = (initialBounds.x + initialBounds.width - mouseX) / initialBounds.width;\n scaleY = (initialBounds.y + initialBounds.height - mouseY) / initialBounds.height;\n newBounds.x = mouseX;\n newBounds.y = mouseY;\n newBounds.width = initialBounds.x + initialBounds.width - mouseX;\n newBounds.height = initialBounds.y + initialBounds.height - mouseY;\n break;\n case 1:\n scaleX = (mouseX - initialBounds.x) / initialBounds.width;\n scaleY = (initialBounds.y + initialBounds.height - mouseY) / initialBounds.height;\n newBounds.y = mouseY;\n newBounds.width = mouseX - initialBounds.x;\n newBounds.height = initialBounds.y + initialBounds.height - mouseY;\n break;\n case 2:\n scaleX = (initialBounds.x + initialBounds.width - mouseX) / initialBounds.width;\n scaleY = (mouseY - initialBounds.y) / initialBounds.height;\n newBounds.x = mouseX;\n newBounds.width = initialBounds.x + initialBounds.width - mouseX;\n newBounds.height = mouseY - initialBounds.y;\n break;\n case 3:\n scaleX = (mouseX - initialBounds.x) / initialBounds.width;\n scaleY = (mouseY - initialBounds.y) / initialBounds.height;\n newBounds.width = mouseX - initialBounds.x;\n newBounds.height = mouseY - initialBounds.y;\n break;\n case 4:\n scaleY = (initialBounds.y + initialBounds.height - mouseY) / initialBounds.height;\n newBounds.y = mouseY;\n newBounds.height = initialBounds.y + initialBounds.height - mouseY;\n break;\n case 5:\n scaleY = (mouseY - initialBounds.y) / initialBounds.height;\n newBounds.height = mouseY - initialBounds.y;\n break;\n case 6:\n scaleX = (initialBounds.x + initialBounds.width - mouseX) / initialBounds.width;\n newBounds.x = mouseX;\n newBounds.width = initialBounds.x + initialBounds.width - mouseX;\n break;\n case 7:\n scaleX = (mouseX - initialBounds.x) / initialBounds.width;\n newBounds.width = mouseX - initialBounds.x;\n break;\n }\n\n scaleX = Math.max(0.1, Math.abs(scaleX));\n scaleY = Math.max(0.1, Math.abs(scaleY));\n\n this.selectedShapes.forEach(shape => {\n const initialData = this.initialPositions.get(shape);\n if (!initialData) return;\n\n switch (shape.shapeName) {\n case 'rectangle':\n case 'icon':\n const relX = (initialData.x - initialBounds.x) / initialBounds.width;\n const relY = (initialData.y - initialBounds.y) / initialBounds.height;\n const relW = initialData.width / initialBounds.width;\n const relH = initialData.height / initialBounds.height;\n\n shape.x = newBounds.x + relX * newBounds.width;\n shape.y = newBounds.y + relY * newBounds.height;\n shape.width = relW * newBounds.width;\n shape.height = relH * newBounds.height;\n shape._skipAnchors = true;\n shape.draw();\n shape._skipAnchors = false;\n break;\n\n case 'circle':\n const relXCircle = (initialData.x - initialBounds.x) / initialBounds.width;\n const relYCircle = (initialData.y - initialBounds.y) / initialBounds.height;\n\n shape.x = newBounds.x + relXCircle * newBounds.width;\n shape.y = newBounds.y + relYCircle * newBounds.height;\n shape.rx = initialData.rx * scaleX;\n shape.ry = initialData.ry * scaleY;\n shape._skipAnchors = true;\n shape.draw();\n shape._skipAnchors = false;\n break;\n\n case 'line':\n case 'arrow':\n const relStartX = (initialData.startPoint.x - initialBounds.x) / initialBounds.width;\n const relStartY = (initialData.startPoint.y - initialBounds.y) / initialBounds.height;\n const relEndX = (initialData.endPoint.x - initialBounds.x) / initialBounds.width;\n const relEndY = (initialData.endPoint.y - initialBounds.y) / initialBounds.height;\n\n shape.startPoint.x = newBounds.x + relStartX * newBounds.width;\n shape.startPoint.y = newBounds.y + relStartY * newBounds.height;\n shape.endPoint.x = newBounds.x + relEndX * newBounds.width;\n shape.endPoint.y = newBounds.y + relEndY * newBounds.height;\n\n if (shape.shapeName === 'arrow' && shape.arrowCurved) {\n if (typeof shape.initializeCurveControlPoints === 'function') {\n shape.initializeCurveControlPoints();\n }\n }\n shape.draw();\n break;\n\n default:\n const relXDefault = (initialData.x - initialBounds.x) / initialBounds.width;\n const relYDefault = (initialData.y - initialBounds.y) / initialBounds.height;\n const relWDefault = initialData.width / initialBounds.width;\n const relHDefault = initialData.height / initialBounds.height;\n\n shape.x = newBounds.x + relXDefault * newBounds.width;\n shape.y = newBounds.y + relYDefault * newBounds.height;\n if (shape.width !== undefined) shape.width = relWDefault * newBounds.width;\n if (shape.height !== undefined) shape.height = relHDefault * newBounds.height;\n\n if (typeof shape.draw === 'function') {\n shape._skipAnchors = true;\n shape.draw();\n shape._skipAnchors = false;\n }\n }\n\n if (typeof shape.updateAttachedArrows === 'function') {\n shape.updateAttachedArrows();\n }\n });\n\n this.updateControls();\n }\n\n startDrag(e) {\n this.isDragging = true;\n isDraggingMultiSelection = true;\n const { x, y } = getSVGCoordsFromMouse(e);\n this.dragStart = { x, y };\n\n // Snapshot for undo tracking\n this._snapshotForUndo();\n\n this.initialPositions.clear();\n this.selectedShapes.forEach(shape => {\n let shapeData;\n shape.removeSelection();\n switch (shape.shapeName) {\n case 'rectangle':\n case 'icon':\n shapeData = {\n x: shape.x,\n y: shape.y,\n width: shape.width,\n height: shape.height,\n rotation: shape.rotation\n };\n break;\n case 'circle':\n shapeData = {\n x: shape.x,\n y: shape.y,\n rx: shape.rx,\n ry: shape.ry,\n rotation: shape.rotation\n };\n break;\n case 'line':\n case 'arrow':\n shapeData = {\n startPoint: { ...shape.startPoint },\n endPoint: { ...shape.endPoint }\n };\n break;\n default:\n shapeData = {\n x: shape.x || 0,\n y: shape.y || 0,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0\n };\n }\n this.initialPositions.set(shape, shapeData);\n });\n\n if (typeof svg !== 'undefined') {\n svg.style.cursor = 'move';\n }\n }\n\n handleDrag(e) {\n if (!this.isDragging) return;\n isDraggingMultiSelection = true;\n const { x, y } = getSVGCoordsFromMouse(e);\n let dx = x - this.dragStart.x;\n let dy = y - this.dragStart.y;\n\n // Shift-constrain: lock to horizontal or vertical axis\n if (e.shiftKey) {\n if (Math.abs(dx) > Math.abs(dy)) {\n dy = 0;\n } else {\n dx = 0;\n }\n }\n\n this.move(dx, dy);\n\n // Snap guides for multi-selection\n if (window.__sketchStoreApi && window.__sketchStoreApi.getState().snapToObjects) {\n const bounds = this.getBounds();\n if (bounds) {\n // Create a virtual shape representing the multi-selection bounding box\n const virtualShape = {\n shapeName: 'rectangle',\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n };\n const snap = calculateSnap(virtualShape, e.shiftKey, e.clientX, e.clientY);\n if (snap.dx || snap.dy) {\n this.move(snap.dx, snap.dy);\n }\n }\n } else {\n clearSnapGuides();\n }\n\n this.dragStart = { x: x, y: y };\n }\n\n endDrag() {\n if (!this.isDragging) return;\n isDraggingMultiSelection = false;\n this.isDragging = false;\n\n // Clear snap guides on drag end\n clearSnapGuides();\n\n // Finalize freehand stroke moves (bake transform offset into points)\n this.selectedShapes.forEach(shape => {\n if (typeof shape.finalizeMove === 'function') {\n shape.finalizeMove();\n }\n // Restore isSelected flag (startDrag's removeSelection clears it)\n shape.isSelected = true;\n });\n\n // Re-parent any selected shape that now sits inside a different frame\n // (Issue #22, bug #9). The per-tool drag handlers (rectangleTool, etc.)\n // do this for single-shape drags, but a multi-selection drag bypassed\n // them and left the shape geometrically inside the frame yet logically\n // outside its child list.\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n this.selectedShapes.forEach(shape => {\n if (!shape || shape.shapeName === 'frame') return;\n // Find the deepest frame whose bounds contain the shape after the drag.\n let target = null;\n for (let i = shapes.length - 1; i >= 0; i--) {\n const f = shapes[i];\n if (f.shapeName !== 'frame') continue;\n if (this.selectedShapes.has(f)) continue; // moving with us \u2014 skip\n if (typeof f.isShapeInFrame === 'function' && f.isShapeInFrame(shape)) {\n target = f;\n break;\n }\n }\n const current = shape.parentFrame || null;\n if (target === current) return;\n if (current && typeof current.removeShapeFromFrame === 'function') {\n current.removeShapeFromFrame(shape);\n }\n if (target && typeof target.addShapeToFrame === 'function') {\n target.addShapeToFrame(shape);\n if (typeof pushFrameAttachmentAction === 'function') {\n pushFrameAttachmentAction(target, shape, 'attach', current);\n }\n } else if (current && typeof pushFrameAttachmentAction === 'function') {\n pushFrameAttachmentAction(current, shape, 'detach', current);\n }\n });\n }\n\n this.initialPositions.clear();\n\n // Push undo for all moved shapes\n this._pushUndoForAll();\n\n // Refresh bounds and controls after finalizeMove may have changed positions\n this.updateControls();\n\n if (typeof svg !== 'undefined') {\n svg.style.cursor = 'default';\n }\n }\n}\n\nconst multiSelection = new MultiSelection();\n\nfunction selectShapesInRect(selectionBounds) {\n multiSelection.selectShapesInRect(selectionBounds);\n}\n\nfunction clearAllSelections() {\n multiSelection.clearSelection();\n}\n\nfunction getMultiSelectionBounds() {\n return multiSelection.getBounds();\n}\n\nfunction createMultiSelectionControls() {\n multiSelection.updateControls();\n}\n\nfunction removeMultiSelectionControls() {\n multiSelection.removeControls();\n}\n\nfunction isPointInMultiSelection(x, y) {\n return multiSelection.isPointInBounds(x, y);\n}\n\nfunction moveSelectedShapes(dx, dy) {\n multiSelection.move(dx, dy);\n}\n\nfunction handleMultiSelectionMouseDown(e) {\n if (!e.target) return false;\n const { x, y } = getSVGCoordsFromMouse(e);\n\n // Only handle multi-selection operations if we have multiple shapes selected\n if (multiSelection.selectedShapes.size > 1) {\n const anchor = e.target.closest('.multi-selection-anchor');\n if (anchor) {\n const anchorIndex = parseInt(anchor.getAttribute('data-index'));\n multiSelection.startResize(e, anchorIndex);\n return true;\n }\n\n if (e.target.closest('.multi-selection-rotation-anchor')) {\n multiSelection.startRotation(e);\n return true;\n }\n\n // Check if clicking on any shape that's part of the selection\n let clickedOnSelectedShape = null;\n for (const shape of multiSelection.selectedShapes) {\n if (shape.contains && shape.contains(x, y)) {\n clickedOnSelectedShape = shape;\n break;\n }\n }\n if (clickedOnSelectedShape) {\n // Ctrl+Click: toggle shape out of multi-selection\n if (e.ctrlKey || e.metaKey) {\n multiSelection.removeShape(clickedOnSelectedShape);\n return true;\n }\n multiSelection.startDrag(e);\n return true;\n }\n\n // Click is within the multi-selection bounding box but not directly on a shape \u2014\n // still start dragging the group (prevents accidental deselection)\n if (multiSelection.isPointInBounds(x, y)) {\n multiSelection.startDrag(e);\n return true;\n }\n\n // Click is outside the selection bounds \u2014 fall through to deselect / start new selection\n }\n\n // Check if clicking on individual shape anchors - let them handle it\n if (e.target.closest('.anchor') || e.target.closest('.rotate-anchor') || e.target.closest('.rotation-anchor')) {\n return false; // Let individual shape handlers manage their own anchors\n }\n\n // Check if clicking on any shape \u2014 prioritise non-frame shapes so that\n // shapes inside frames (text, icons, etc.) can still be selected/interacted with.\n let clickedOnShape = false;\n let clickedShape = null;\n if (typeof shapes !== 'undefined') {\n // Prefer the actual SVG event target. This remains exact regardless\n // of pan/zoom and also covers shapes whose visual bounds come from a\n // foreignObject or imported SVG rather than simple geometry.\n for (let i = shapes.length - 1; i >= 0; i--) {\n const shape = shapes[i];\n const element = shape?.group || shape?.element;\n if (element && (element === e.target || element.contains?.(e.target))) {\n clickedOnShape = true;\n clickedShape = shape;\n break;\n }\n }\n\n let fallbackFrame = null;\n for (let i = shapes.length - 1; !clickedOnShape && i >= 0; i--) {\n const shape = shapes[i];\n if (shape.contains && shape.contains(x, y)) {\n if (shape.shapeName === 'frame') {\n // Pick the smallest (most specific/innermost) frame\n if (!fallbackFrame) {\n fallbackFrame = shape;\n } else {\n const area = (shape.width || 0) * (shape.height || 0);\n const existingArea = (fallbackFrame.width || 0) * (fallbackFrame.height || 0);\n if (area < existingArea) {\n fallbackFrame = shape;\n }\n }\n } else {\n clickedOnShape = true;\n clickedShape = shape;\n break;\n }\n }\n }\n // If no non-frame shape was found, use the smallest frame\n if (!clickedOnShape && fallbackFrame) {\n clickedOnShape = true;\n clickedShape = fallbackFrame;\n }\n }\n\n // If clicking on a shape\n if (clickedOnShape && clickedShape) {\n // Ctrl+click: toggle shape in/out of multi-selection\n if (e.ctrlKey || e.metaKey) {\n if (multiSelection.selectedShapes.has(clickedShape)) {\n multiSelection.removeShape(clickedShape);\n } else {\n // If there's a current individually-selected shape, add it to multi-selection first\n if (currentShape && currentShape !== clickedShape && !multiSelection.selectedShapes.has(currentShape)) {\n multiSelection.addShape(currentShape);\n if (typeof currentShape.removeSelection === 'function') currentShape.removeSelection();\n }\n multiSelection.addShape(clickedShape);\n }\n currentShape = null;\n return true;\n }\n\n // If the clicked shape is part of the multi-selection, start dragging instead of clearing\n if (multiSelection.selectedShapes.size > 1 && multiSelection.selectedShapes.has(clickedShape)) {\n multiSelection.startDrag(e);\n return true;\n }\n\n // If it's the same shape that's already selected, let individual handlers manage it\n if (currentShape === clickedShape) {\n // Clear any other multi-selected shapes so only this one remains selected\n if (multiSelection.selectedShapes.size > 0) {\n multiSelection.clearSelection();\n }\n return false; // Let individual shape handlers manage their own interactions\n }\n\n // Normal click (no Ctrl): deselect everything and select only the clicked shape\n if (currentShape && typeof currentShape.removeSelection === 'function') {\n currentShape.removeSelection();\n }\n\n // Clear multi-selection\n multiSelection.clearSelection();\n\n // \u2500\u2500 Group expansion \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // If the clicked shape is part of a group, select ALL of its\n // group-mates as a multi-selection instead of single-selecting.\n // Subsequent drag/resize/rotate then operates on the whole group\n // via the existing multi-selection plumbing.\n if (clickedShape.groupId && typeof shapes !== 'undefined') {\n const mates = shapes.filter(s => s.groupId === clickedShape.groupId);\n if (mates.length > 1) {\n for (const m of mates) multiSelection.addShape(m);\n currentShape = null;\n multiSelection.startDrag(e);\n return true;\n }\n }\n\n // Set new current shape\n currentShape = clickedShape;\n\n // Trigger the shape's own selection handling\n if (typeof clickedShape.addAnchors === 'function') {\n clickedShape.addAnchors();\n clickedShape.isSelected = true;\n } else if (typeof clickedShape.createSelection === 'function') {\n clickedShape.createSelection();\n clickedShape.isSelected = true;\n } else if (typeof clickedShape.selectShape === 'function') {\n clickedShape.selectShape();\n clickedShape.isSelected = true;\n } else if (typeof clickedShape.selectFrame === 'function') {\n clickedShape.selectFrame();\n }\n\n // Update sidebar if function exists\n if (typeof clickedShape.updateSidebar === 'function') {\n clickedShape.updateSidebar();\n }\n\n return false; // Let individual handlers also process for drag setup\n }\n\n // If not clicking on a shape, deselect everything and start multi-selection\n if (!clickedOnShape) {\n // Deselect current individual shape\n if (typeof currentShape !== 'undefined' && currentShape && typeof currentShape.removeSelection === 'function') {\n currentShape.removeSelection();\n currentShape = null;\n }\n // Also deselect any active text editor (textTool's selectedElement)\n if (window.__deselectTextElement) {\n window.__deselectTextElement();\n }\n if (typeof disableAllSideBars === 'function') {\n disableAllSideBars();\n }\n \n multiSelectionStart = { x, y };\n isMultiSelecting = true;\n // Prevent native text selection during drag-select\n if (typeof svg !== 'undefined') {\n svg.style.userSelect = 'none';\n svg.style.webkitUserSelect = 'none';\n }\n document.body.style.userSelect = 'none';\n document.body.style.webkitUserSelect = 'none';\n createMultiSelectionRect(x, y);\n clearAllSelections();\n return true;\n }\n\n return false;\n}\n\nfunction handleMultiSelectionMouseMove(e) {\n const { x, y } = getSVGCoordsFromMouse(e);\n\n if (multiSelection.isDragging) {\n multiSelection.handleDrag(e);\n return true;\n }\n\n if (multiSelection.isResizing) {\n multiSelection.handleResize(e);\n return true;\n }\n\n if (multiSelection.isRotating) {\n multiSelection.handleRotation(e);\n return true;\n }\n\n if (isMultiSelecting) {\n updateMultiSelectionRect(x, y);\n // Live highlight shapes that fall within the selection rectangle\n highlightShapesInSelectionRect(x, y);\n return true;\n }\n\n if (multiSelection.selectedShapes.size > 1 && multiSelection.isPointInBounds(x, y)) {\n if (typeof svg !== 'undefined') {\n svg.style.cursor = 'move';\n }\n return true;\n }\n\n // Show move cursor when hovering over any shape in selection mode\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const overShape = shapes.some(shape => {\n if (typeof shape.contains === 'function') {\n return shape.contains(x, y);\n }\n return false;\n });\n if (overShape && typeof svg !== 'undefined') {\n svg.style.cursor = 'move';\n return false;\n }\n }\n\n if (typeof svg !== 'undefined' && svg.style.cursor === 'move') {\n svg.style.cursor = 'default';\n }\n\n return false;\n}\n\nfunction handleMultiSelectionMouseUp(e) {\n if (multiSelection.isDragging) {\n multiSelection.endDrag();\n return true;\n }\n\n if (multiSelection.isResizing) {\n multiSelection.isResizing = false;\n multiSelection.resizingAnchorIndex = null;\n multiSelection.initialPositions.clear();\n multiSelection._pushUndoForAll();\n multiSelection.updateControls();\n return true;\n }\n\n if (multiSelection.isRotating) {\n multiSelection.isRotating = false;\n multiSelection.initialPositions.clear();\n multiSelection._pushUndoForAll();\n return true;\n }\n\n if (isMultiSelecting) {\n const { x, y } = getSVGCoordsFromMouse(e);\n\n const selectionBounds = {\n x: Math.min(multiSelectionStart.x, x),\n y: Math.min(multiSelectionStart.y, y),\n width: Math.abs(x - multiSelectionStart.x),\n height: Math.abs(y - multiSelectionStart.y)\n };\n\n if (selectionBounds.width > 5 && selectionBounds.height > 5) {\n let shapesInBounds = [];\n if (typeof shapes !== 'undefined') {\n shapes.forEach(shape => {\n if (isShapeInSelectionRect(shape, selectionBounds)) {\n shapesInBounds.push(shape);\n }\n });\n }\n\n if (shapesInBounds.length === 1) {\n const selectedShape = shapesInBounds[0];\n multiSelection.clearSelection();\n\n if (typeof currentShape !== 'undefined') {\n currentShape = selectedShape;\n }\n\n if (typeof selectedShape.addAnchors === 'function') {\n selectedShape.addAnchors();\n selectedShape.isSelected = true;\n } else if (typeof selectedShape.createSelection === 'function') {\n selectedShape.createSelection();\n selectedShape.isSelected = true;\n } else if (typeof selectedShape.selectShape === 'function') {\n selectedShape.selectShape();\n selectedShape.isSelected = true;\n }\n\n if (typeof selectedShape.updateSidebar === 'function') {\n selectedShape.updateSidebar();\n }\n } else if (shapesInBounds.length > 1) {\n multiSelection.selectShapesInRect(selectionBounds);\n }\n }\n\n removeMultiSelectionRect();\n isMultiSelecting = false;\n isDraggingMultiSelection = false;\n // Restore text selection after drag-select\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n if (typeof svg !== 'undefined') {\n svg.style.userSelect = '';\n svg.style.webkitUserSelect = '';\n }\n return true;\n }\n\n // Safety cleanup - always reset flags on mouse up\n isMultiSelecting = false;\n isDraggingMultiSelection = false;\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n if (typeof svg !== 'undefined') {\n svg.style.userSelect = '';\n svg.style.webkitUserSelect = '';\n }\n return false;\n}\n\n\n// Safety net: clean up selection rect if mouse is released outside the SVG\nwindow.addEventListener('pointerup', () => {\n if (isMultiSelecting) {\n removeMultiSelectionRect();\n isMultiSelecting = false;\n isDraggingMultiSelection = false;\n document.body.style.userSelect = '';\n document.body.style.webkitUserSelect = '';\n }\n});\n\n// Delete key support for multi-selection\ndocument.addEventListener('keydown', (e) => {\n if ((e.key === 'Delete' || e.key === 'Backspace') && multiSelection.selectedShapes.size > 0) {\n // Don't delete if user is typing in an input\n const tag = e.target.tagName.toLowerCase();\n if (tag === 'input' || tag === 'textarea' || e.target.isContentEditable) return;\n e.preventDefault();\n deleteSelectedShapes();\n }\n});\n\nfunction deleteSelectedShapes() {\n if (multiSelection.selectedShapes.size === 0) return;\n\n const shapesToDelete = Array.from(multiSelection.selectedShapes);\n multiSelection.clearSelection();\n\n // Issue #24 bug #3: when deleting a (regular, non-diagram) frame, its\n // children are released back to the canvas \u2014 capture them here so we\n // can re-select them and drop the user into the pointer tool. Diagram\n // frames destroy their children together, so we skip those.\n const releasedChildren = [];\n\n shapesToDelete.forEach(shape => {\n const isFrame = shape.shapeName === 'frame';\n const isDiagramFrame = isFrame && !!shape._diagramType;\n\n // Issue #24 bug #7: for a regular (non-diagram) frame, we don't\n // want destroy() \u2014 it empties containedShapes and tears down the\n // clipGroup, leaving nothing for undo to rehydrate. Instead:\n // 1. snapshot the children references (for the undo action),\n // 2. release each child visually back to the svg root,\n // 3. detach the frame's <g>, clipGroup, clipPath from DOM.\n // The frame JS object stays alive in the undo action's `shape`\n // reference; on undo, the UndoRedo branch re-appends clipGroup +\n // clipPath and re-attaches each child via addShapeToFrame.\n let childSnapshot = null;\n if (isFrame && !isDiagramFrame) {\n childSnapshot = [...(shape.containedShapes || [])];\n for (const child of childSnapshot) {\n if (!child || child === shape) continue;\n const el = child.group || child.element;\n if (el) {\n if (shape.clipGroup && el.parentNode === shape.clipGroup) {\n shape.clipGroup.removeChild(el);\n }\n if (window.svg && el.parentNode !== window.svg) window.svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n releasedChildren.push(child);\n }\n\n // Clear containedShapes \u2014 undo will repopulate via\n // addShapeToFrame, which short-circuits on an existing entry.\n shape.containedShapes = [];\n\n // Detach the frame's own DOM bits \u2014 but keep the JS object\n // and its clipGroup/clipPath references intact for undo.\n if (shape.group && shape.group.parentNode) shape.group.parentNode.removeChild(shape.group);\n if (shape.clipGroup && shape.clipGroup.parentNode) shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n if (shape.clipPath && shape.clipPath.parentNode) shape.clipPath.parentNode.removeChild(shape.clipPath);\n } else {\n // Non-frame OR diagram frame: standard delete path.\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n if (shape.parentFrame && typeof shape.parentFrame.removeShapeFromFrame === 'function') {\n shape.parentFrame.removeShapeFromFrame(shape);\n }\n cleanupAttachments(shape);\n if (isDiagramFrame && typeof shape.destroy === 'function') {\n shape.destroy();\n }\n }\n\n // Remove from shapes array\n const idx = shapes.indexOf(shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Issue #24 bug #7: record the delete on the undo stack. Without\n // this the user can't undo a multi-selection delete at all \u2014\n // the action just disappears. For frames we attach the child\n // snapshot so undo can re-attach them.\n try {\n if (childSnapshot) {\n pushDeleteAction(shape, { childSnapshot });\n } else {\n pushDeleteAction(shape);\n }\n } catch (err) {\n console.warn('[deleteSelectedShapes] pushDeleteAction failed:', err);\n }\n });\n\n // Bug #3 follow-through: auto-select the released children and switch\n // to the pointer tool so the user can immediately keep manipulating\n // them. Skip if nothing was released (no frames deleted).\n if (releasedChildren.length > 0) {\n for (const child of releasedChildren) {\n if (shapes.indexOf(child) === -1) continue;\n multiSelection.addShape(child);\n }\n if (window.__sketchStoreApi && typeof window.__sketchStoreApi.setActiveTool === 'function') {\n window.__sketchStoreApi.setActiveTool('select');\n }\n }\n}\n\n/**\n * Create a frame around all currently multi-selected shapes.\n */\nfunction frameSelectedShapes() {\n if (multiSelection.selectedShapes.size < 2) return;\n\n const shapesToFrame = Array.from(multiSelection.selectedShapes);\n // Frames cannot be nested through the Frame it action, and objects that\n // already belong to a frame must first be detached explicitly.\n if (shapesToFrame.some(shape => shape?.shapeName === 'frame' || shape?.parentFrame)) return;\n\n const bounds = multiSelection.getBounds();\n if (!bounds) return;\n\n const padding = 20;\n const fx = bounds.x - padding;\n const fy = bounds.y - padding;\n const fw = bounds.width + padding * 2;\n const fh = bounds.height + padding * 2;\n\n // Import Frame class dynamically (it's on window from SketchEngine init)\n const FrameClass = window.Frame;\n if (!FrameClass) {\n console.warn('[Selection] Frame class not available');\n return;\n }\n\n const frame = new FrameClass(fx, fy, fw, fh);\n shapes.push(frame);\n\n // Add each selected shape into the frame\n multiSelection.clearSelection();\n\n for (const shape of shapesToFrame) {\n frame.addShapeToFrame(shape);\n }\n\n // Reorder DOM: frame group should be behind the contained shapes\n const frameEl = frame.group;\n if (frameEl && frameEl.parentNode) {\n // Move frame before its first contained shape in the shapes array\n const frameIdx = shapes.indexOf(frame);\n if (frameIdx > 0) {\n shapes.splice(frameIdx, 1);\n // Find earliest contained shape index\n let earliest = shapes.length;\n for (const s of shapesToFrame) {\n const idx = shapes.indexOf(s);\n if (idx >= 0 && idx < earliest) earliest = idx;\n }\n shapes.splice(earliest, 0, frame);\n }\n }\n\n // Record after reordering so redo restores the same hit-test/layer index.\n pushCreateAction(frame, {\n frameCreation: true,\n containedShapes: shapesToFrame\n });\n\n // Select the new frame\n if (typeof frame.selectFrame === 'function') {\n frame.selectFrame();\n }\n currentShape = frame;\n}\n\n// Expose for plain scripts (sketchGeneric.js is not a module)\nwindow.clearAllSelections = clearAllSelections;\nwindow.multiSelection = multiSelection;\nwindow.deleteSelectedShapes = deleteSelectedShapes;\nwindow.frameSelectedShapes = frameSelectedShapes;\n\nexport {\n handleMultiSelectionMouseDown,\n handleMultiSelectionMouseMove,\n handleMultiSelectionMouseUp,\n clearAllSelections,\n selectShapesInRect,\n createMultiSelectionControls,\n removeMultiSelectionControls,\n removeMultiSelectionRect,\n isPointInMultiSelection,\n moveSelectedShapes,\n multiSelection,\n isDraggingMultiSelection,\n isMultiSelecting\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
+
import {
|
|
3
|
+
registerRotationAnchor
|
|
4
|
+
} from "./chunk-PAKA6HUX.js";
|
|
2
5
|
|
|
3
6
|
// src/shapes/Rectangle.js
|
|
4
7
|
var rc = rough.svg(svg);
|
|
@@ -457,6 +460,7 @@ var Rectangle = class {
|
|
|
457
460
|
this.rotationAnchor.setAttribute("vector-effect", "non-scaling-stroke");
|
|
458
461
|
this.rotationAnchor.setAttribute("style", "pointer-events: all;");
|
|
459
462
|
this.group.appendChild(this.rotationAnchor);
|
|
463
|
+
registerRotationAnchor(this.rotationAnchor, { radius: 8, edgeY: expandedY });
|
|
460
464
|
this.rotationAnchor.addEventListener("mouseover", function() {
|
|
461
465
|
if (!isResizingShapeSquare && !isDraggingShapeSquare && !isRotatingShapeSquare) {
|
|
462
466
|
svg.style.cursor = "grab";
|
|
@@ -724,4 +728,4 @@ var Rectangle = class {
|
|
|
724
728
|
export {
|
|
725
729
|
Rectangle
|
|
726
730
|
};
|
|
727
|
-
//# sourceMappingURL=chunk-
|
|
731
|
+
//# sourceMappingURL=chunk-FETTJLCV.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/shapes/Rectangle.js"],
|
|
4
|
+
"sourcesContent": ["/* eslint-disable */\nimport { registerRotationAnchor } from '../core/ScreenSpaceControls.js';\n// Rectangle shape class - extracted from drawSquare.js\n// Depends on globals: svg, shapes, rough, currentShape, currentZoom, rc\n\n// Create local rc from globals; tool-state vars default to false\nconst rc = rough.svg(svg);\nlet isDraggingShapeSquare = false;\nlet isResizingShapeSquare = false;\nlet isRotatingShapeSquare = false;\nlet hoveredFrame = null;\nconst SquarecolorOptions = document.querySelectorAll(\".squareStrokeSpan\");\nconst backgroundColorOptionsSquare = document.querySelectorAll(\".squareBackgroundSpan\");\nconst fillStyleOptions = document.querySelectorAll(\".squareFillStyleSpan\");\nconst squareStrokeThicknessValue = document.querySelectorAll(\".squareStrokeThickSpan\");\nconst squareOutlineStyleValue = document.querySelectorAll(\".squareOutlineStyle\");\n// Depends on globals: squareStrokecolor, squareBackgroundColor, squareFillStyleValue, squareStrokeThicknes, squareOutlineStyle\n// Depends on globals: isDraggingShapeSquare, isResizingShapeSquare, isRotatingShapeSquare\n// Depends on globals: squareSideBar, disableAllSideBars\n// Depends on DOM query: SquarecolorOptions, backgroundColorOptionsSquare, fillStyleOptions, squareStrokeThicknessValue, squareOutlineStyleValue\n\nclass Rectangle {\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.options = {\n roughness: 1.5,\n stroke: \"#fff\",\n strokeWidth: 2,\n fill: \"transparent\",\n fillStyle: \"none\",\n strokeDasharray: \"\",\n ...options\n };\n this.element = null;\n this.isSelected = false;\n this.rotation = 0;\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.anchors = [];\n this.rotationAnchor = null;\n this.selectionPadding = 8;\n this.selectionOutline = null;\n this.shapeName = 'rectangle';\n this.shapeID = `rectangle-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n this.group.setAttribute('id', this.shapeID);\n\n // Embedded label support\n this.label = options.label || '';\n this.labelElement = null;\n this.labelColor = options.labelColor || '#e0e0e0';\n this.labelFontSize = options.labelFontSize || 14;\n this.labelBg = options.labelBg !== false; // set labelBg:false to render plain text with no pill backdrop\n this._isEditingLabel = false;\n this._hitArea = null;\n this._labelBg = null;\n\n // Shading / gradient support for research paper style diagrams\n this.shadeColor = options.shadeColor || null;\n this.shadeOpacity = options.shadeOpacity !== undefined ? options.shadeOpacity : 0.15;\n this.shadeDirection = options.shadeDirection || 'bottom'; // 'top' | 'bottom' | 'left' | 'right'\n this._shadeRect = null;\n this._shadeGradient = null;\n\n if (!this.group.parentNode) {\n svg.appendChild(this.group);\n }\n this._lastDrawn = {\n width: null,\n height: null,\n options: null\n };\n this.isBeingDrawn = false;\n this._setupLabelDblClick();\n this.draw();\n }\n draw() {\n const childrenToRemove = [];\n const preserveSet = this._skipAnchors ? new Set([...this.anchors, this.selectionOutline, this.rotationAnchor].filter(Boolean)) : null;\n for (let i = 0; i < this.group.children.length; i++) {\n const child = this.group.children[i];\n if (child !== this.element && child !== this.labelElement && child !== this._hitArea && child !== this._labelBg && child !== this._shadeRect) {\n if (preserveSet && preserveSet.has(child)) continue;\n childrenToRemove.push(child);\n }\n }\n childrenToRemove.forEach(child => this.group.removeChild(child));\n\n const optionsString = JSON.stringify(this.options);\n const isInitialDraw = this.element === null;\n const optionsChanged = optionsString !== this._lastDrawn.options;\n const sizeChanged = this.width !== this._lastDrawn.width || this.height !== this._lastDrawn.height;\n\n // Only regenerate rough element if it's not being actively drawn OR if options changed OR initial draw\n if (isInitialDraw || optionsChanged || (!this.isBeingDrawn && sizeChanged)) {\n if (this.element && this.element.parentNode === this.group) {\n this.group.removeChild(this.element);\n }\n const roughRect = rc.rectangle(0, 0, this.width, this.height, this.options);\n this.element = roughRect;\n this.group.appendChild(roughRect);\n\n // Cache the values\n this._lastDrawn.width = this.width;\n this._lastDrawn.height = this.height;\n this._lastDrawn.options = optionsString;\n }\n\n // Hit area for dblclick detection (transparent rect that captures pointer events)\n if (!this._hitArea) {\n this._hitArea = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n this._hitArea.setAttribute('fill', 'transparent');\n this._hitArea.setAttribute('stroke', 'none');\n this._hitArea.setAttribute('style', 'pointer-events: all;');\n this.group.insertBefore(this._hitArea, this.group.firstChild);\n }\n this._hitArea.setAttribute('x', 0);\n this._hitArea.setAttribute('y', 0);\n this._hitArea.setAttribute('width', this.width);\n this._hitArea.setAttribute('height', this.height);\n\n // Shading / gradient overlay\n this._updateShade();\n\n // Update embedded label\n this._updateLabelElement();\n\n const rotateCenterX = this.width / 2;\n const rotateCenterY = this.height / 2;\n this.group.setAttribute('transform', `translate(${this.x}, ${this.y}) rotate(${this.rotation}, ${rotateCenterX}, ${rotateCenterY})`);\n\n if (this.isSelected) {\n if (this._skipAnchors) {\n this.updateSelectionControls();\n } else {\n this.addAnchors();\n }\n }\n if (!this.group.parentNode) {\n this.updateAttachedArrows();\n svg.appendChild(this.group);\n }\n }\n\n _updateShade() {\n if (!this.shadeColor) {\n if (this._shadeRect && this._shadeRect.parentNode === this.group) {\n this.group.removeChild(this._shadeRect);\n this._shadeRect = null;\n }\n if (this._shadeGradient && this._shadeGradient.parentNode) {\n this._shadeGradient.parentNode.removeChild(this._shadeGradient);\n this._shadeGradient = null;\n }\n return;\n }\n\n // Create or update gradient in SVG 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\n const gradId = `shade-${this.shapeID}`;\n if (!this._shadeGradient) {\n this._shadeGradient = document.createElementNS('http://www.w3.org/2000/svg', 'linearGradient');\n this._shadeGradient.setAttribute('id', gradId);\n defs.appendChild(this._shadeGradient);\n }\n\n // Direction mapping\n const dirs = {\n top: { x1: '0%', y1: '0%', x2: '0%', y2: '100%' },\n bottom: { x1: '0%', y1: '100%', x2: '0%', y2: '0%' },\n left: { x1: '0%', y1: '0%', x2: '100%', y2: '0%' },\n right: { x1: '100%', y1: '0%', x2: '0%', y2: '0%' },\n };\n const d = dirs[this.shadeDirection] || dirs.bottom;\n this._shadeGradient.setAttribute('x1', d.x1);\n this._shadeGradient.setAttribute('y1', d.y1);\n this._shadeGradient.setAttribute('x2', d.x2);\n this._shadeGradient.setAttribute('y2', d.y2);\n\n // Rebuild stops\n while (this._shadeGradient.firstChild) this._shadeGradient.removeChild(this._shadeGradient.firstChild);\n const stop1 = document.createElementNS('http://www.w3.org/2000/svg', 'stop');\n stop1.setAttribute('offset', '0%');\n stop1.setAttribute('stop-color', this.shadeColor);\n stop1.setAttribute('stop-opacity', this.shadeOpacity);\n const stop2 = document.createElementNS('http://www.w3.org/2000/svg', 'stop');\n stop2.setAttribute('offset', '100%');\n stop2.setAttribute('stop-color', this.shadeColor);\n stop2.setAttribute('stop-opacity', '0');\n this._shadeGradient.appendChild(stop1);\n this._shadeGradient.appendChild(stop2);\n\n // Create or update shade rect\n if (!this._shadeRect) {\n this._shadeRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n this._shadeRect.setAttribute('pointer-events', 'none');\n }\n this._shadeRect.setAttribute('x', 0);\n this._shadeRect.setAttribute('y', 0);\n this._shadeRect.setAttribute('width', this.width);\n this._shadeRect.setAttribute('height', this.height);\n this._shadeRect.setAttribute('fill', `url(#${gradId})`);\n this._shadeRect.setAttribute('rx', 2);\n\n // Insert after rough element\n if (this._shadeRect.parentNode === this.group) this.group.removeChild(this._shadeRect);\n if (this.element && this.element.nextSibling) {\n this.group.insertBefore(this._shadeRect, this.element.nextSibling);\n } else {\n this.group.appendChild(this._shadeRect);\n }\n }\n\n _updateLabelElement() {\n if (!this.label) {\n // Remove label element if label is empty\n if (this.labelElement && this.labelElement.parentNode === this.group) {\n this.group.removeChild(this.labelElement);\n this.labelElement = null;\n }\n if (this._labelBg && this._labelBg.parentNode === this.group) {\n this.group.removeChild(this._labelBg);\n this._labelBg = null;\n }\n return;\n }\n\n if (!this.labelElement) {\n this.labelElement = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n this.labelElement.setAttribute('class', 'shape-label');\n this.labelElement.setAttribute('pointer-events', 'none');\n }\n\n // Position at center of rectangle\n this.labelElement.setAttribute('x', this.width / 2);\n this.labelElement.setAttribute('y', this.height / 2);\n this.labelElement.setAttribute('text-anchor', 'middle');\n this.labelElement.setAttribute('dominant-baseline', 'central');\n this.labelElement.setAttribute('fill', this.labelColor);\n this.labelElement.setAttribute('font-size', this.labelFontSize);\n this.labelElement.setAttribute('font-family', 'lixFont, sans-serif');\n this.labelElement.textContent = this.label;\n\n // Background padding rect behind text (like arrows have) \u2014 skippable\n // via labelBg:false for dense multi-row content (e.g. mermaid ER\n // attribute rows) where a pill backdrop looks out of place and\n // doesn't match the SVG preview.\n if (!this.labelBg) {\n if (this._labelBg && this._labelBg.parentNode === this.group) {\n this.group.removeChild(this._labelBg);\n this._labelBg = null;\n }\n if (this.labelElement.parentNode === this.group) this.group.removeChild(this.labelElement);\n this.group.appendChild(this.labelElement);\n return;\n }\n const canvasBg = window.getComputedStyle(svg).backgroundColor || '#000';\n if (!this._labelBg) {\n this._labelBg = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n this._labelBg.setAttribute('pointer-events', 'none');\n }\n this._labelBg.setAttribute('fill', canvasBg);\n const hPadding = 6;\n const vPadding = 2;\n const charWidth = this.labelFontSize * 0.6;\n const bgW = this.label.length * charWidth + hPadding * 2;\n const bgH = this.labelFontSize + vPadding * 2;\n this._labelBg.setAttribute('x', this.width / 2 - bgW / 2);\n this._labelBg.setAttribute('y', this.height / 2 - bgH / 2);\n this._labelBg.setAttribute('width', bgW);\n this._labelBg.setAttribute('height', bgH);\n this._labelBg.setAttribute('rx', 3);\n\n // Re-append bg then text on top\n if (this._labelBg.parentNode === this.group) this.group.removeChild(this._labelBg);\n if (this.labelElement.parentNode === this.group) this.group.removeChild(this.labelElement);\n this.group.appendChild(this._labelBg);\n this.group.appendChild(this.labelElement);\n }\n\n _setupLabelDblClick() {\n this.group.addEventListener('dblclick', (e) => {\n e.stopPropagation();\n e.preventDefault();\n this.startLabelEdit();\n });\n }\n\n startLabelEdit() {\n if (this._isEditingLabel) return;\n this._isEditingLabel = true;\n\n // Hide label element during editing\n if (this.labelElement) {\n this.labelElement.setAttribute('visibility', 'hidden');\n }\n\n // Get shape's screen position via CTM\n const ctm = this.group.getScreenCTM();\n if (!ctm) { this._isEditingLabel = false; return; }\n\n // Map the shape corners to screen coords\n const pt1 = svg.createSVGPoint();\n pt1.x = 0; pt1.y = 0;\n const screenTL = pt1.matrixTransform(ctm);\n const pt2 = svg.createSVGPoint();\n pt2.x = this.width; pt2.y = this.height;\n const screenBR = pt2.matrixTransform(ctm);\n\n const screenW = Math.abs(screenBR.x - screenTL.x);\n const screenH = Math.abs(screenBR.y - screenTL.y);\n const screenX = Math.min(screenTL.x, screenBR.x);\n const screenY = Math.min(screenTL.y, screenBR.y);\n\n // Create HTML overlay\n const overlay = document.createElement('div');\n overlay.className = 'shape-label-editor';\n overlay.style.cssText = `\n position: fixed; z-index: 10000;\n left: ${screenX}px; top: ${screenY}px;\n width: ${screenW}px; height: ${screenH}px;\n display: flex; align-items: center; justify-content: center;\n pointer-events: auto;\n `;\n\n const canvasBg = window.getComputedStyle(svg).backgroundColor || '#000';\n const input = document.createElement('div');\n input.setAttribute('contenteditable', 'true');\n input.style.cssText = `\n max-width: ${screenW - 8}px; min-width: 30px; min-height: 20px;\n background: ${canvasBg}; border: none;\n outline: none; padding: 2px 6px;\n color: ${this.labelColor}; font-size: ${Math.max(12, this.labelFontSize * (screenW / Math.max(this.width, 1)))}px;\n font-family: lixFont, sans-serif; text-align: center;\n white-space: pre-wrap; word-break: break-word;\n cursor: text;\n `;\n if (this.label) {\n input.textContent = this.label;\n } else {\n input.innerHTML = ' ';\n }\n\n overlay.appendChild(input);\n document.body.appendChild(overlay);\n\n // Focus and select all text\n setTimeout(() => {\n input.focus();\n const sel = window.getSelection();\n const range = document.createRange();\n range.selectNodeContents(input);\n sel.removeAllRanges();\n sel.addRange(range);\n }, 10);\n\n const finishEdit = () => {\n const newText = input.textContent.trim().replace(/\\u00A0/g, '');\n this.label = newText;\n this._isEditingLabel = false;\n\n if (overlay.parentNode) overlay.parentNode.removeChild(overlay);\n if (this.labelElement) this.labelElement.setAttribute('visibility', 'visible');\n this.draw();\n };\n\n input.addEventListener('blur', finishEdit);\n input.addEventListener('keydown', (e) => {\n e.stopPropagation();\n if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); input.blur(); }\n if (e.key === 'Escape') { input.textContent = this.label; input.blur(); }\n });\n input.addEventListener('pointerdown', (e) => e.stopPropagation());\n input.addEventListener('pointermove', (e) => e.stopPropagation());\n input.addEventListener('pointerup', (e) => e.stopPropagation());\n }\n\n setLabel(text, color, fontSize) {\n this.label = text || '';\n if (color) this.labelColor = color;\n if (fontSize) this.labelFontSize = fontSize;\n this.draw();\n }\n\n setDrawingState(isDrawing) {\n this.isBeingDrawn = isDrawing;\n }\n\n getRotatedCursor(direction, angle) {\n const directions = ['ns', 'nesw', 'ew', 'nwse'];\n angle = angle % 360;\n if (angle < 0) angle += 360;\n\n const baseDirectionMap = {\n '0': 'nwse', '1': 'nesw', \n '2': 'nesw', '3': 'nwse', \n '4': 'ns', '5': 'ns', \n '6': 'ew', '7': 'ew' \n };\n const baseDirection = baseDirectionMap[direction];\n let effectiveAngle = angle; \n if (baseDirection === 'nesw') {\n effectiveAngle += 45;\n } else if (baseDirection === 'ew') {\n effectiveAngle += 90;\n } else if (baseDirection === 'nwse') {\n effectiveAngle += 135;\n }\n effectiveAngle = effectiveAngle % 360;\n if (effectiveAngle < 0) effectiveAngle += 360;\n const index = Math.round(effectiveAngle / 45) % 4; \n let finalIndex;\n if (effectiveAngle >= 337.5 || effectiveAngle < 22.5) finalIndex = 0; \n else if (effectiveAngle >= 22.5 && effectiveAngle < 67.5) finalIndex = 1; \n else if (effectiveAngle >= 67.5 && effectiveAngle < 112.5) finalIndex = 2; \n else if (effectiveAngle >= 112.5 && effectiveAngle < 157.5) finalIndex = 3;\n else if (effectiveAngle >= 157.5 && effectiveAngle < 202.5) finalIndex = 0; \n else if (effectiveAngle >= 202.5 && effectiveAngle < 247.5) finalIndex = 1; \n else if (effectiveAngle >= 247.5 && effectiveAngle < 292.5) finalIndex = 2; \n else if (effectiveAngle >= 292.5 && effectiveAngle < 337.5) finalIndex = 3; \n else finalIndex = 0; \n return directions[finalIndex];\n }\n addAnchors() {\n const zoom = window.currentZoom || 1;\n const anchorSize = 10 / zoom;\n const anchorStrokeWidth = 2;\n const self = this;\n const expandedX = -this.selectionPadding; \n const expandedY = -this.selectionPadding; \n const expandedWidth = this.width + 2 * this.selectionPadding;\n const expandedHeight = this.height + 2 * this.selectionPadding;\n\n const positions = [\n { x: expandedX, y: expandedY }, \n { x: expandedX + expandedWidth, y: expandedY }, \n { x: expandedX, y: expandedY + expandedHeight }, \n { x: expandedX + expandedWidth, y: expandedY + expandedHeight }, \n { x: expandedX + expandedWidth / 2, y: expandedY }, \n { x: expandedX + expandedWidth / 2, y: expandedY + expandedHeight }, \n { x: expandedX, y: expandedHeight / 2 + expandedY }, \n { x: expandedX + expandedWidth, y: expandedHeight / 2 + expandedY } \n ];\n\n const outlinePoints = [\n [positions[0].x, positions[0].y],\n [positions[1].x, positions[1].y],\n [positions[3].x, positions[3].y],\n [positions[2].x, positions[2].y],\n [positions[0].x, positions[0].y]\n ];\n\n this.anchors.forEach(anchor => {\n if (anchor.parentNode === this.group) {\n this.group.removeChild(anchor);\n }\n });\n if (this.rotationAnchor && this.rotationAnchor.parentNode === this.group) {\n this.group.removeChild(this.rotationAnchor);\n }\n if (this.selectionOutline && this.selectionOutline.parentNode === this.group) {\n this.group.removeChild(this.selectionOutline);\n }\n\n this.anchors = [];\n const anchorDirections = {\n 0: 'nwse', \n 1: 'nesw', \n 2: 'nesw', \n 3: 'nwse', \n 4: 'ns', \n 5: 'ns', \n 6: 'ew', \n 7: 'ew' \n };\n\n positions.forEach((pos, i) => {\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('class', 'anchor');\n anchor.setAttribute('data-index', i);\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('style', 'pointer-events: all;');\n\n anchor.addEventListener('mouseover', function () {\n const index = this.getAttribute('data-index');\n const baseDirection = anchorDirections[index];\n const rotatedCursor = self.getRotatedCursor(index, self.rotation); \n svg.style.cursor = rotatedCursor + '-resize';\n });\n\n anchor.addEventListener('mouseout', function () {\n if (!isResizingShapeSquare && !isDraggingShapeSquare && !isRotatingShapeSquare) {\n svg.style.cursor = 'default';\n }\n });\n\n this.group.appendChild(anchor);\n this.anchors[i] = anchor;\n });\n const rotationAnchorPos = { x: expandedX + expandedWidth / 2, y: expandedY - 30 / zoom };\n this.rotationAnchor = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n this.rotationAnchor.setAttribute('cx', rotationAnchorPos.x);\n this.rotationAnchor.setAttribute('cy', rotationAnchorPos.y);\n this.rotationAnchor.setAttribute('r', 8 / zoom);\n this.rotationAnchor.setAttribute('class', 'rotate-anchor');\n this.rotationAnchor.setAttribute('fill', '#121212');\n this.rotationAnchor.setAttribute('stroke', '#5B57D1');\n this.rotationAnchor.setAttribute('stroke-width', anchorStrokeWidth);\n this.rotationAnchor.setAttribute('vector-effect', 'non-scaling-stroke');\n this.rotationAnchor.setAttribute('style', 'pointer-events: all;');\n this.group.appendChild(this.rotationAnchor);\n registerRotationAnchor(this.rotationAnchor, { radius: 8, edgeY: expandedY });\n\n this.rotationAnchor.addEventListener('mouseover', function () {\n if (!isResizingShapeSquare && !isDraggingShapeSquare && !isRotatingShapeSquare) {\n svg.style.cursor = 'grab';\n }\n });\n this.rotationAnchor.addEventListener('mouseout', function () {\n if (!isResizingShapeSquare && !isDraggingShapeSquare && !isRotatingShapeSquare) {\n svg.style.cursor = 'default';\n }\n });\n\n const pointsAttr = outlinePoints.map(p => p.join(',')).join(' ');\n const outline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');\n outline.setAttribute('points', pointsAttr);\n outline.setAttribute('fill', 'none');\n outline.setAttribute('stroke', '#5B57D1');\n outline.setAttribute('stroke-width', 1.5);\n outline.setAttribute('stroke-dasharray', '4 2');\n outline.setAttribute('vector-effect', 'non-scaling-stroke');\n outline.setAttribute('style', 'pointer-events: none;');\n this.group.appendChild(outline);\n this.selectionOutline = outline;\n\n // Show relevant sidebar\n disableAllSideBars();\n squareSideBar.classList.remove(\"hidden\");\n if (window.__showSidebarForShape) window.__showSidebarForShape('rectangle');\n this.updateSidebar();\n }\n\n updateSelectionControls() {\n if (!this.selectionOutline || this.anchors.length === 0) return;\n\n const zoom = window.currentZoom || 1;\n const anchorSize = 10 / zoom;\n const expandedX = -this.selectionPadding;\n const expandedY = -this.selectionPadding;\n const expandedWidth = this.width + 2 * this.selectionPadding;\n const expandedHeight = this.height + 2 * this.selectionPadding;\n\n const positions = [\n { x: expandedX, y: expandedY },\n { x: expandedX + expandedWidth, y: expandedY },\n { x: expandedX, y: expandedY + expandedHeight },\n { x: expandedX + expandedWidth, y: expandedY + expandedHeight },\n { x: expandedX + expandedWidth / 2, y: expandedY },\n { x: expandedX + expandedWidth / 2, y: expandedY + expandedHeight },\n { x: expandedX, y: expandedHeight / 2 + expandedY },\n { x: expandedX + expandedWidth, y: expandedHeight / 2 + expandedY }\n ];\n\n // Update anchor positions\n positions.forEach((pos, i) => {\n if (this.anchors[i]) {\n this.anchors[i].setAttribute('x', pos.x - anchorSize / 2);\n this.anchors[i].setAttribute('y', pos.y - anchorSize / 2);\n }\n });\n\n // Update outline\n const outlinePoints = [\n [positions[0].x, positions[0].y],\n [positions[1].x, positions[1].y],\n [positions[3].x, positions[3].y],\n [positions[2].x, positions[2].y],\n [positions[0].x, positions[0].y]\n ];\n this.selectionOutline.setAttribute('points', outlinePoints.map(p => p.join(',')).join(' '));\n\n // Update rotation anchor\n if (this.rotationAnchor) {\n this.rotationAnchor.setAttribute('cx', expandedX + expandedWidth / 2);\n this.rotationAnchor.setAttribute('cy', expandedY - 30 / zoom);\n }\n }\n\n removeSelection() {\n // Remove selection elements (anchors, outline, rotation anchor) from the group\n this.anchors.forEach(anchor => {\n if (anchor.parentNode === this.group) {\n this.group.removeChild(anchor);\n }\n });\n if (this.rotationAnchor && this.rotationAnchor.parentNode === this.group) {\n this.group.removeChild(this.rotationAnchor);\n }\n if (this.selectionOutline && this.selectionOutline.parentNode === this.group) {\n this.group.removeChild(this.selectionOutline);\n }\n this.anchors = [];\n this.rotationAnchor = null;\n this.selectionOutline = null;\n this.isSelected = false;\n }\n\n contains(x, y) {\n if (!this.element) return false;\n // x/y are already canvas (viewBox) coordinates. getCTM() operates in\n // viewport coordinates and made hit testing drift after pan/zoom.\n const centerX = this.width / 2;\n const centerY = this.height / 2;\n const angle = -(this.rotation || 0) * Math.PI / 180;\n const translatedX = x - this.x;\n const translatedY = y - this.y;\n const dx = translatedX - centerX;\n const dy = translatedY - centerY;\n const localX = dx * Math.cos(angle) - dy * Math.sin(angle) + centerX;\n const localY = dx * Math.sin(angle) + dy * Math.cos(angle) + centerY;\n const tolerance = 5;\n return localX >= -tolerance && localX <= this.width + tolerance &&\n localY >= -tolerance && localY <= this.height + tolerance;\n }\n\n // Helper to check if a point is near an anchor\n isNearAnchor(x, y) {\n if (!this.isSelected) return null;\n const buffer = 10; \n const anchorSize = 10; \n\n // Iterate through anchors\n for (let i = 0; i < this.anchors.length; i++) {\n const anchor = this.anchors[i];\n const anchorLocalX = parseFloat(anchor.getAttribute('x')) + anchorSize / 2;\n const anchorLocalY = parseFloat(anchor.getAttribute('y')) + anchorSize / 2;\n const svgPoint = svg.createSVGPoint();\n svgPoint.x = anchorLocalX;\n svgPoint.y = anchorLocalY;\n const transformedPoint = svgPoint.matrixTransform(this.group.getCTM());\n const anchorLeft = transformedPoint.x - anchorSize/2 - buffer;\n const anchorRight = transformedPoint.x + anchorSize/2 + buffer;\n const anchorTop = transformedPoint.y - anchorSize/2 - buffer;\n const anchorBottom = transformedPoint.y + anchorSize/2 + buffer;\n if (x >= anchorLeft && x <= anchorRight && y >= anchorTop && y <= anchorBottom) {\n return { type: 'resize', index: i };\n }\n }\n\n // Check rotation anchor\n if (this.rotationAnchor) {\n const rotateAnchorLocalX = parseFloat(this.rotationAnchor.getAttribute('cx'));\n const rotateAnchorLocalY = parseFloat(this.rotationAnchor.getAttribute('cy'));\n const svgPoint = svg.createSVGPoint();\n svgPoint.x = rotateAnchorLocalX;\n svgPoint.y = rotateAnchorLocalY;\n const transformedPoint = svgPoint.matrixTransform(this.group.getCTM());\n const rotateAnchorRadius = parseFloat(this.rotationAnchor.getAttribute('r'));\n const distSq = (x - transformedPoint.x)**2 + (y - transformedPoint.y)**2;\n if (distSq <= (rotateAnchorRadius + buffer)**2) {\n return { type: 'rotate' };\n }\n }\n\n return null;\n }\n\n\nmove(dx, dy) {\n this.x += dx;\n this.y += dy;\n\n // Fast path: just update the transform \u2014 no need to rebuild RoughJS element\n const rotateCenterX = this.width / 2;\n const rotateCenterY = this.height / 2;\n this.group.setAttribute('transform', `translate(${this.x}, ${this.y}) rotate(${this.rotation}, ${rotateCenterX}, ${rotateCenterY})`);\n\n this.updateAttachedArrows();\n\n // Only update frame containment if we're actively dragging the shape itself\n // and not being moved by a parent frame\n if (isDraggingShapeSquare && !this.isBeingMovedByFrame) {\n this.updateFrameContainment();\n }\n}\n\nupdateFrameContainment() {\n // Don't update if we're being moved by a frame\n if (this.isBeingMovedByFrame) return;\n \n let targetFrame = null;\n \n // Find which frame this shape is over\n shapes.forEach(shape => {\n if (shape.shapeName === 'frame' && shape.isShapeInFrame(this)) {\n targetFrame = shape;\n }\n });\n \n // If we have a parent frame and we're being dragged, temporarily remove clipping\n if (this.parentFrame && isDraggingShapeSquare) {\n this.parentFrame.temporarilyRemoveFromFrame(this);\n }\n \n // Update frame highlighting\n if (hoveredFrame && hoveredFrame !== targetFrame) {\n hoveredFrame.removeHighlight();\n }\n \n if (targetFrame && targetFrame !== hoveredFrame) {\n targetFrame.highlightFrame();\n }\n \n hoveredFrame = targetFrame;\n}\n\n updatePosition(anchorIndex, newMouseX, newMouseY) {\n const CTM = this.group.getCTM();\n if (!CTM) return;\n const inverseCTM = CTM.inverse();\n const svgPoint = svg.createSVGPoint();\n svgPoint.x = newMouseX;\n svgPoint.y = newMouseY;\n const localMouse = svgPoint.matrixTransform(inverseCTM);\n\n const oldW = this.width;\n const oldH = this.height;\n\n // Determine fixed point in old local coords and compute raw new dimensions\n let fixedOldX, fixedOldY, rawW, rawH;\n switch (anchorIndex) {\n case 0: fixedOldX = oldW; fixedOldY = oldH; rawW = oldW - localMouse.x; rawH = oldH - localMouse.y; break;\n case 1: fixedOldX = 0; fixedOldY = oldH; rawW = localMouse.x; rawH = oldH - localMouse.y; break;\n case 2: fixedOldX = oldW; fixedOldY = 0; rawW = oldW - localMouse.x; rawH = localMouse.y; break;\n case 3: fixedOldX = 0; fixedOldY = 0; rawW = localMouse.x; rawH = localMouse.y; break;\n case 4: fixedOldX = 0; fixedOldY = oldH; rawW = oldW; rawH = oldH - localMouse.y; break;\n case 5: fixedOldX = 0; fixedOldY = 0; rawW = oldW; rawH = localMouse.y; break;\n case 6: fixedOldX = oldW; fixedOldY = 0; rawW = oldW - localMouse.x; rawH = oldH; break;\n case 7: fixedOldX = 0; fixedOldY = 0; rawW = localMouse.x; rawH = oldH; break;\n }\n\n // Get world position of the fixed point using current CTM\n const fp = svg.createSVGPoint();\n fp.x = fixedOldX;\n fp.y = fixedOldY;\n const fixedWorld = fp.matrixTransform(CTM);\n\n // Handle negative dimensions (dragged past opposite edge)\n const newW = Math.abs(rawW);\n const newH = Math.abs(rawH);\n\n // Fixed point in new local coords (flips if dimension went negative)\n const fixedNewX = fixedOldX === 0 ? (rawW >= 0 ? 0 : newW) : (rawW >= 0 ? newW : 0);\n const fixedNewY = fixedOldY === 0 ? (rawH >= 0 ? 0 : newH) : (rawH >= 0 ? newH : 0);\n\n // Solve for new x, y so the fixed corner stays in place\n // Transform: translate(x, y) rotate(\u03B8, newW/2, newH/2)\n const rad = this.rotation * Math.PI / 180;\n const cosR = Math.cos(rad);\n const sinR = Math.sin(rad);\n const ncx = newW / 2;\n const ncy = newH / 2;\n const dx = fixedNewX - ncx;\n const dy = fixedNewY - ncy;\n const rotX = ncx + dx * cosR - dy * sinR;\n const rotY = ncy + dx * sinR + dy * cosR;\n\n this.x = fixedWorld.x - rotX;\n this.y = fixedWorld.y - rotY;\n this.width = newW;\n this.height = newH;\n\n this.updateAttachedArrows();\n }\n\n updateAttachedArrows() {\n shapes.forEach(shape => {\n if (shape && shape.shapeName === 'arrow' && typeof shape.updateAttachments === 'function') {\n \n if ((shape.attachedToStart && shape.attachedToStart.shape === this) ||\n (shape.attachedToEnd && shape.attachedToEnd.shape === this)) {\n shape.updateAttachments();\n }\n }\n });\n } \n\n rotate(angle) {\n angle = angle % 360;\n if (angle < 0) angle += 360;\n this.rotation = angle;\n }\n\n // Method to update the sidebar based on the shape's current options\n // No-op: React sidebar handles UI updates via Zustand store\n updateSidebar() {}\n}\n\nexport { Rectangle };\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|