@elixpo/lixsketch 5.5.23 → 5.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +85 -6
  2. package/dist/mcp/index.js +585 -0
  3. package/dist/mcp/index.js.map +7 -0
  4. package/dist/mcp/node.js +184 -0
  5. package/dist/mcp/node.js.map +7 -0
  6. package/dist/mcp/stdio.js +723 -0
  7. package/dist/mcp/stdio.js.map +7 -0
  8. package/dist/react/{CopyPaste-5OWPTCQ5.js → CopyPaste-YUDZ6DHY.js} +7 -7
  9. package/dist/react/EventDispatcher-7LAK7GQ7.js +1097 -0
  10. package/dist/react/EventDispatcher-7LAK7GQ7.js.map +7 -0
  11. package/dist/react/Frame-7D2MXCFF.js +11 -0
  12. package/dist/react/IconShape-ZADX7Y33.js +10 -0
  13. package/dist/react/ImageShape-UJQN2HI7.js +10 -0
  14. package/dist/react/Line-APEULMHE.js +10 -0
  15. package/dist/react/{SceneSerializer-RDISX4X7.js → SceneSerializer-SG6SJN5X.js} +17 -7
  16. package/dist/react/SceneSerializer-SG6SJN5X.js.map +7 -0
  17. package/dist/react/{Selection-ZL3G6IAO.js → Selection-2TSH3J6P.js} +6 -4
  18. package/dist/react/{SketchEngine-OB6ZW3B6.js → SketchEngine-UD2XV2KT.js} +50 -23
  19. package/dist/react/{SketchEngine-OB6ZW3B6.js.map → SketchEngine-UD2XV2KT.js.map} +2 -2
  20. package/dist/react/{UndoRedo-NL7KLR5B.js → UndoRedo-IN4SXDG6.js} +2 -2
  21. package/dist/react/{ZoomPan-FAWA5OPS.js → ZoomPan-RR7KUYZT.js} +34 -1
  22. package/dist/react/{ZoomPan-FAWA5OPS.js.map → ZoomPan-RR7KUYZT.js.map} +2 -2
  23. package/dist/react/{arrowTool-CNVGM6RX.js → arrowTool-OYDWJGQK.js} +3 -3
  24. package/dist/react/{chunk-U3TB4KRS.js → chunk-6GPEWDRB.js} +19 -12
  25. package/dist/react/chunk-6GPEWDRB.js.map +7 -0
  26. package/dist/react/{chunk-4BLMNGTR.js → chunk-7CM5XQDN.js} +3 -3
  27. package/dist/react/{chunk-XFQECTTF.js → chunk-APTOPAOY.js} +3 -3
  28. package/dist/react/{chunk-EDSKEM6E.js → chunk-ASBC5G35.js} +47 -8
  29. package/dist/react/chunk-ASBC5G35.js.map +7 -0
  30. package/dist/react/{chunk-4TAS67SL.js → chunk-EOURRJ55.js} +2 -2
  31. package/dist/react/{chunk-ETAAQUUV.js → chunk-GQUZPON4.js} +4 -4
  32. package/dist/react/{chunk-KVAQPCUH.js → chunk-K5BG5MHY.js} +49 -5
  33. package/dist/react/chunk-K5BG5MHY.js.map +7 -0
  34. package/dist/react/{chunk-AH4PWNEB.js → chunk-K5RY4EV7.js} +23 -3
  35. package/dist/react/chunk-K5RY4EV7.js.map +7 -0
  36. package/dist/react/{chunk-GC3KTQDA.js → chunk-LJR7EVW2.js} +3 -3
  37. package/dist/react/{chunk-SZD7DKYJ.js → chunk-LSHZYN77.js} +2 -2
  38. package/dist/react/{chunk-HFQZYCHJ.js → chunk-M6TMN76K.js} +3 -3
  39. package/dist/react/{chunk-V2QTYSBK.js → chunk-OP56XPWF.js} +2 -2
  40. package/dist/react/chunk-QZI4UIE5.js +48 -0
  41. package/dist/react/chunk-QZI4UIE5.js.map +7 -0
  42. package/dist/react/{chunk-ILGAFR56.js → chunk-RGMDWLRJ.js} +3 -3
  43. package/dist/react/{chunk-OFGJJKPH.js → chunk-XFL4R5ZF.js} +3 -3
  44. package/dist/react/{chunk-GPIYXREE.js → chunk-XOWNCYE4.js} +3 -3
  45. package/dist/react/{chunk-YF3TK7SC.js → chunk-XYUFEIZR.js} +2 -2
  46. package/dist/react/{circleTool-KICNRQCI.js → circleTool-LDKGZALF.js} +4 -4
  47. package/dist/react/{codeTool-NCQ73R6M.js → codeTool-4YZO5W7J.js} +4 -4
  48. package/dist/react/{frameTool-Y6KB67DO.js → frameTool-MXNJEXQQ.js} +4 -4
  49. package/dist/react/{freehandTool-MMULHCQ7.js → freehandTool-26D3FOOX.js} +4 -4
  50. package/dist/react/{iconTool-LSW2DYGB.js → iconTool-46O5VEUX.js} +4 -4
  51. package/dist/react/{imageTool-2DSR32RX.js → imageTool-P2RWZRHO.js} +4 -4
  52. package/dist/react/index.js +848 -614
  53. package/dist/react/index.js.map +4 -4
  54. package/dist/react/{lineTool-N5I7IGT7.js → lineTool-ZMR27U5L.js} +4 -4
  55. package/dist/react/{rectangleTool-YUT7ZK2E.js → rectangleTool-EJKK6UTX.js} +4 -4
  56. package/dist/react/{textTool-JMTX7OVT.js → textTool-S4XXZHZH.js} +5 -5
  57. package/package.json +7 -1
  58. package/src/EngineShortcuts.js +22 -0
  59. package/src/SketchEngine.js +27 -0
  60. package/src/core/EventDispatcher.js +35 -4
  61. package/src/core/SceneSerializer.js +5 -0
  62. package/src/core/Selection.js +26 -0
  63. package/src/core/UndoRedo.js +20 -16
  64. package/src/core/WebEmbedPolicy.js +41 -0
  65. package/src/core/ZoomPan.js +36 -0
  66. package/src/index.js +4 -0
  67. package/src/mcp/fileStore.js +70 -0
  68. package/src/mcp/index.js +5 -0
  69. package/src/mcp/node.js +2 -0
  70. package/src/mcp/preview.js +39 -0
  71. package/src/mcp/scene.js +275 -0
  72. package/src/mcp/server.js +195 -0
  73. package/src/mcp/stdio.js +41 -0
  74. package/src/mcp/stdioTransport.js +46 -0
  75. package/src/mcp/store.js +23 -0
  76. package/src/mcp/templates.js +51 -0
  77. package/src/react/LixSketchCanvas.jsx +4 -0
  78. package/src/react/components/Toolbar.jsx +84 -7
  79. package/src/react/components/modals/CommandPalette.jsx +8 -0
  80. package/src/react/components/modals/WebEmbedModal.jsx +40 -0
  81. package/src/react/components/sidebars/PaintBucketSidebar.jsx +49 -0
  82. package/src/react/components/sidebars/PaintbrushSidebar.jsx +1 -1
  83. package/src/react/store/useSketchStore.js +13 -0
  84. package/src/react/toolsEnum.js +4 -0
  85. package/src/shapes/Frame.js +47 -4
  86. package/src/shapes/ImageShape.js +49 -6
  87. package/src/tools/lassoTool.js +84 -0
  88. package/src/tools/paintBucketTool.js +50 -0
  89. package/src/tools/shapeRecognitionTool.js +431 -0
  90. package/src/tools/webEmbedTool.js +61 -0
  91. package/dist/react/EventDispatcher-GKNO2KSL.js +0 -464
  92. package/dist/react/EventDispatcher-GKNO2KSL.js.map +0 -7
  93. package/dist/react/Frame-RLSMJJSK.js +0 -11
  94. package/dist/react/IconShape-7OPXAKLK.js +0 -10
  95. package/dist/react/ImageShape-T7UEHP4A.js +0 -10
  96. package/dist/react/Line-WWQFBNX5.js +0 -10
  97. package/dist/react/SceneSerializer-RDISX4X7.js.map +0 -7
  98. package/dist/react/chunk-AH4PWNEB.js.map +0 -7
  99. package/dist/react/chunk-EDSKEM6E.js.map +0 -7
  100. package/dist/react/chunk-KVAQPCUH.js.map +0 -7
  101. package/dist/react/chunk-U3TB4KRS.js.map +0 -7
  102. /package/dist/react/{CopyPaste-5OWPTCQ5.js.map → CopyPaste-YUDZ6DHY.js.map} +0 -0
  103. /package/dist/react/{Frame-RLSMJJSK.js.map → Frame-7D2MXCFF.js.map} +0 -0
  104. /package/dist/react/{IconShape-7OPXAKLK.js.map → IconShape-ZADX7Y33.js.map} +0 -0
  105. /package/dist/react/{ImageShape-T7UEHP4A.js.map → ImageShape-UJQN2HI7.js.map} +0 -0
  106. /package/dist/react/{Line-WWQFBNX5.js.map → Line-APEULMHE.js.map} +0 -0
  107. /package/dist/react/{Selection-ZL3G6IAO.js.map → Selection-2TSH3J6P.js.map} +0 -0
  108. /package/dist/react/{UndoRedo-NL7KLR5B.js.map → UndoRedo-IN4SXDG6.js.map} +0 -0
  109. /package/dist/react/{arrowTool-CNVGM6RX.js.map → arrowTool-OYDWJGQK.js.map} +0 -0
  110. /package/dist/react/{chunk-4BLMNGTR.js.map → chunk-7CM5XQDN.js.map} +0 -0
  111. /package/dist/react/{chunk-XFQECTTF.js.map → chunk-APTOPAOY.js.map} +0 -0
  112. /package/dist/react/{chunk-4TAS67SL.js.map → chunk-EOURRJ55.js.map} +0 -0
  113. /package/dist/react/{chunk-ETAAQUUV.js.map → chunk-GQUZPON4.js.map} +0 -0
  114. /package/dist/react/{chunk-GC3KTQDA.js.map → chunk-LJR7EVW2.js.map} +0 -0
  115. /package/dist/react/{chunk-SZD7DKYJ.js.map → chunk-LSHZYN77.js.map} +0 -0
  116. /package/dist/react/{chunk-HFQZYCHJ.js.map → chunk-M6TMN76K.js.map} +0 -0
  117. /package/dist/react/{chunk-V2QTYSBK.js.map → chunk-OP56XPWF.js.map} +0 -0
  118. /package/dist/react/{chunk-ILGAFR56.js.map → chunk-RGMDWLRJ.js.map} +0 -0
  119. /package/dist/react/{chunk-OFGJJKPH.js.map → chunk-XFL4R5ZF.js.map} +0 -0
  120. /package/dist/react/{chunk-GPIYXREE.js.map → chunk-XOWNCYE4.js.map} +0 -0
  121. /package/dist/react/{chunk-YF3TK7SC.js.map → chunk-XYUFEIZR.js.map} +0 -0
  122. /package/dist/react/{circleTool-KICNRQCI.js.map → circleTool-LDKGZALF.js.map} +0 -0
  123. /package/dist/react/{codeTool-NCQ73R6M.js.map → codeTool-4YZO5W7J.js.map} +0 -0
  124. /package/dist/react/{frameTool-Y6KB67DO.js.map → frameTool-MXNJEXQQ.js.map} +0 -0
  125. /package/dist/react/{freehandTool-MMULHCQ7.js.map → freehandTool-26D3FOOX.js.map} +0 -0
  126. /package/dist/react/{iconTool-LSW2DYGB.js.map → iconTool-46O5VEUX.js.map} +0 -0
  127. /package/dist/react/{imageTool-2DSR32RX.js.map → imageTool-P2RWZRHO.js.map} +0 -0
  128. /package/dist/react/{lineTool-N5I7IGT7.js.map → lineTool-ZMR27U5L.js.map} +0 -0
  129. /package/dist/react/{rectangleTool-YUT7ZK2E.js.map → rectangleTool-EJKK6UTX.js.map} +0 -0
  130. /package/dist/react/{textTool-JMTX7OVT.js.map → textTool-S4XXZHZH.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/SceneSerializer.js"],
4
- "sourcesContent": ["/* eslint-disable */\n/**\n * SceneSerializer - Save and load .lixsketch scene files\n *\n * Format: JSON with metadata + serialized shapes array\n * File extension: .lixsketch (actually JSON)\n */\n\nimport { Rectangle } from '../shapes/Rectangle.js';\nimport { Circle } from '../shapes/Circle.js';\nimport { Line } from '../shapes/Line.js';\nimport { Arrow } from '../shapes/Arrow.js';\nimport { FreehandStroke } from '../shapes/FreehandStroke.js';\nimport { Frame } from '../shapes/Frame.js';\nimport { TextShape } from '../shapes/TextShape.js';\nimport { CodeShape } from '../shapes/CodeShape.js';\nimport { ImageShape } from '../shapes/ImageShape.js';\nimport { IconShape } from '../shapes/IconShape.js';\n\nconst FORMAT_VERSION = 1;\n\n// Generate a unique session ID for each scene\nlet _sessionID = null;\nexport function getSessionID() {\n if (!_sessionID) {\n _sessionID = `lx-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n return _sessionID;\n}\nexport function resetSessionID() {\n _sessionID = null;\n}\n\nfunction cloneOptions(options) {\n return JSON.parse(JSON.stringify(options));\n}\n\nfunction restoreDocBlockLinks(shape, data) {\n const ids = [...new Set((Array.isArray(data.docBlockIds)\n ? data.docBlockIds\n : (data.docBlockId ? [data.docBlockId] : [])).filter(Boolean))];\n shape.docBlockIds = ids;\n delete shape.docBlockId;\n if (ids.length) {\n (shape.group || shape.element)?.setAttribute('data-doc-block-ids', JSON.stringify(ids));\n }\n}\n\n// ============================================================\n// SERIALIZE a single shape to plain data\n// ============================================================\nfunction serializeShape(shape) {\n const base = {\n shapeID: shape.shapeID,\n // Optional many-to-many connections to BlockNote document blocks.\n // Stored with the encrypted scene so navigation survives restore.\n docBlockIds: [...new Set((Array.isArray(shape.docBlockIds)\n ? shape.docBlockIds\n : (shape.docBlockId ? [shape.docBlockId] : [])).filter(Boolean))],\n parentFrame: shape.parentFrame ? shape.parentFrame.shapeID : null,\n // Group membership \u2014 null when the shape isn't part of a group.\n // All shapes sharing a non-null groupId move/resize/rotate as a\n // unit (see Selection.handleMultiSelectionMouseDown).\n groupId: shape.groupId || null,\n };\n\n switch (shape.shapeName) {\n case 'rectangle':\n return {\n ...base,\n type: 'rectangle',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'circle':\n return {\n ...base,\n type: 'circle',\n x: shape.x, y: shape.y,\n rx: shape.rx, ry: shape.ry,\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'line':\n return {\n ...base,\n type: 'line',\n startPoint: { x: shape.startPoint.x, y: shape.startPoint.y },\n endPoint: { x: shape.endPoint.x, y: shape.endPoint.y },\n controlPoint: shape.controlPoint ? { x: shape.controlPoint.x, y: shape.controlPoint.y } : null,\n isCurved: shape.isCurved || false,\n options: cloneOptions(shape.options),\n };\n\n case 'arrow': {\n const data = {\n ...base,\n type: 'arrow',\n startPoint: { x: shape.startPoint.x, y: shape.startPoint.y },\n endPoint: { x: shape.endPoint.x, y: shape.endPoint.y },\n options: cloneOptions(shape.options),\n arrowOutlineStyle: shape.arrowOutlineStyle,\n arrowHeadStyle: shape.arrowHeadStyle,\n arrowCurved: shape.arrowCurved,\n arrowCurveAmount: shape.arrowCurveAmount,\n };\n if (shape.controlPoint1) data.controlPoint1 = { x: shape.controlPoint1.x, y: shape.controlPoint1.y };\n if (shape.controlPoint2) data.controlPoint2 = { x: shape.controlPoint2.x, y: shape.controlPoint2.y };\n // Serialize attachments by shapeID\n if (shape.startAttachment) data.startAttachmentID = shape.startAttachment.shapeID;\n if (shape.endAttachment) data.endAttachmentID = shape.endAttachment.shapeID;\n return data;\n }\n\n case 'freehandStroke':\n return {\n ...base,\n type: 'freehandStroke',\n points: JSON.parse(JSON.stringify(shape.points)),\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'frame':\n return {\n ...base,\n type: 'frame',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n frameName: shape.frameName,\n fillStyle: shape.fillStyle || 'transparent',\n fillColor: shape.fillColor || '#1e1e28',\n gridSize: shape.gridSize || 20,\n gridColor: shape.gridColor || 'rgba(255,255,255,0.06)',\n options: cloneOptions(shape.options),\n // Issue #24 bug #10: filter out null / undefined / shapeID-less\n // children. A stale reference would serialize as `null` and the\n // load path would skip it (logging a misleading \"missing shape\"\n // warning) \u2014 but also previously skewed the order tracking.\n containedShapeIDs: shape.containedShapes\n ? Array.from(shape.containedShapes)\n .filter(s => s && s.shapeID)\n .map(s => s.shapeID)\n : [],\n };\n\n case 'text': {\n const group = shape.group;\n return {\n ...base,\n type: 'text',\n x: shape.x, y: shape.y,\n rotation: shape.rotation,\n groupHTML: group.cloneNode(true).outerHTML,\n };\n }\n\n case 'code': {\n const group = shape.group;\n return {\n ...base,\n type: 'code',\n x: shape.x, y: shape.y,\n rotation: shape.rotation,\n groupHTML: group.cloneNode(true).outerHTML,\n };\n }\n\n case 'image': {\n const el = shape.element;\n return {\n ...base,\n type: 'image',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n href: el.getAttribute('href') || el.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || '',\n sizeBytes: Number(el.__fileSize || el.getAttribute('data-file-size')) || 0,\n cloudinaryId: el.getAttribute('data-cloudinary-id') || null,\n storageProvider: el.getAttribute('data-storage-provider') || 'platform_cloudinary',\n storageCloudName: el.getAttribute('data-storage-cloud-name') || null,\n aiGenerated: el.getAttribute('data-ai-generated') === 'true',\n aiModel: el.getAttribute('data-ai-model') || null,\n frameType: shape._frameType || null,\n graphData: shape._frameType === 'graph' && shape._graphData\n ? cloneOptions(shape._graphData)\n : null,\n };\n }\n\n case 'icon': {\n const el = shape.element;\n return {\n ...base,\n type: 'icon',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n elementHTML: el.cloneNode(true).outerHTML,\n viewboxWidth: parseFloat(el.getAttribute('data-viewbox-width')) || 24,\n viewboxHeight: parseFloat(el.getAttribute('data-viewbox-height')) || 24,\n };\n }\n\n default:\n console.warn('[SceneSerializer] Unknown shape type:', shape.shapeName);\n return null;\n }\n}\n\n// ============================================================\n// DESERIALIZE: Create a shape from saved data\n// ============================================================\nfunction deserializeShape(data) {\n const svgEl = window.svg;\n if (!svgEl) return null;\n const ns = 'http://www.w3.org/2000/svg';\n\n switch (data.type) {\n case 'rectangle': {\n const shape = new Rectangle(data.x, data.y, data.width, data.height, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'circle': {\n const shape = new Circle(data.x, data.y, data.rx, data.ry, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'line': {\n const shape = new Line(data.startPoint, data.endPoint, data.options || {});\n if (data.controlPoint) shape.controlPoint = data.controlPoint;\n if (data.isCurved) shape.isCurved = data.isCurved;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'arrow': {\n const shape = new Arrow(data.startPoint, data.endPoint, data.options || {});\n if (data.controlPoint1) shape.controlPoint1 = data.controlPoint1;\n if (data.controlPoint2) shape.controlPoint2 = data.controlPoint2;\n if (data.arrowOutlineStyle) shape.arrowOutlineStyle = data.arrowOutlineStyle;\n if (data.arrowHeadStyle) shape.arrowHeadStyle = data.arrowHeadStyle;\n if (data.arrowCurved) shape.arrowCurved = data.arrowCurved;\n if (data.arrowCurveAmount) shape.arrowCurveAmount = data.arrowCurveAmount;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'freehandStroke': {\n const shape = new FreehandStroke(data.points, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'frame': {\n const frameOpts = { ...(data.options || {}), frameName: data.frameName || 'Frame' };\n if (data.fillStyle) frameOpts.fillStyle = data.fillStyle;\n if (data.fillColor) frameOpts.fillColor = data.fillColor;\n if (data.gridSize) frameOpts.gridSize = data.gridSize;\n if (data.gridColor) frameOpts.gridColor = data.gridColor;\n const shape = new Frame(data.x, data.y, data.width, data.height, frameOpts);\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n shape.draw();\n return shape;\n }\n\n case 'text': {\n if (!data.groupHTML) return null;\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.groupHTML}</svg>`, 'image/svg+xml');\n const group = doc.querySelector('g');\n if (!group) return null;\n const imported = svgEl.ownerDocument.importNode(group, true);\n svgEl.appendChild(imported);\n const shape = new TextShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'code': {\n if (!data.groupHTML) return null;\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.groupHTML}</svg>`, 'image/svg+xml');\n const group = doc.querySelector('g');\n if (!group) return null;\n const imported = svgEl.ownerDocument.importNode(group, true);\n svgEl.appendChild(imported);\n const shape = new CodeShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'image': {\n const imgEl = document.createElementNS(ns, 'image');\n imgEl.setAttribute('x', data.x);\n imgEl.setAttribute('y', data.y);\n imgEl.setAttribute('width', data.width);\n imgEl.setAttribute('height', data.height);\n imgEl.setAttribute('href', data.href);\n imgEl.setAttribute('preserveAspectRatio', 'none');\n if (data.sizeBytes) {\n imgEl.__fileSize = Number(data.sizeBytes) || 0;\n imgEl.setAttribute('data-file-size', String(imgEl.__fileSize));\n window.__roomImageBytesUsed = (window.__roomImageBytesUsed || 0) + imgEl.__fileSize;\n }\n if (data.cloudinaryId) imgEl.setAttribute('data-cloudinary-id', data.cloudinaryId);\n if (data.storageProvider) imgEl.setAttribute('data-storage-provider', data.storageProvider);\n if (data.storageCloudName) imgEl.setAttribute('data-storage-cloud-name', data.storageCloudName);\n if (data.aiGenerated) imgEl.setAttribute('data-ai-generated', 'true');\n if (data.aiModel) imgEl.setAttribute('data-ai-model', data.aiModel);\n svgEl.appendChild(imgEl);\n const shape = new ImageShape(imgEl);\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n if (data.frameType === 'graph' && data.graphData) {\n if (typeof window.__hydrateGraphShape === 'function') {\n window.__hydrateGraphShape(shape, data.graphData);\n } else {\n shape._frameType = 'graph';\n shape._graphData = cloneOptions(data.graphData);\n shape.element.setAttribute('data-graph-shape', 'true');\n }\n }\n return shape;\n }\n\n case 'icon': {\n if (!data.elementHTML) return null;\n const parser = new DOMParser();\n // Wrap in <svg> so the parser treats the <g> as a valid child, not a document root\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.elementHTML}</svg>`, 'image/svg+xml');\n const iconGroup = doc.querySelector('g');\n if (!iconGroup) return null;\n const imported = svgEl.ownerDocument.importNode(iconGroup, true);\n svgEl.appendChild(imported);\n const shape = new IconShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n default:\n console.warn('[SceneSerializer] Unknown type:', data.type);\n return null;\n }\n}\n\n// ============================================================\n// SAVE: Serialize entire scene to .lixsketch JSON\n// ============================================================\nexport function saveScene(workspaceName = 'Untitled') {\n const allShapes = window.shapes || [];\n const serialized = [];\n\n // Issue #24 bug #10: rebuild containment from each shape's own\n // `parentFrame` ref before serialising. The `containedShapes` array\n // on the frame side drifts over time (eraser, partial deletes, drag\n // out + drag back, etc.), and a missing entry there means the child\n // gets serialised as a top-level shape and the frame restores empty.\n // Each shape knows its own parent, so we trust THAT and override the\n // frame's array at save time.\n const childrenByFrame = new Map();\n for (const s of allShapes) {\n if (s && s.parentFrame && s.shapeID && s !== s.parentFrame) {\n const arr = childrenByFrame.get(s.parentFrame.shapeID) || [];\n arr.push(s.shapeID);\n childrenByFrame.set(s.parentFrame.shapeID, arr);\n }\n }\n\n for (const shape of allShapes) {\n const data = serializeShape(shape);\n if (!data) continue;\n if (data.type === 'frame' && shape.shapeID && childrenByFrame.has(shape.shapeID)) {\n const merged = new Set(data.containedShapeIDs || []);\n for (const id of childrenByFrame.get(shape.shapeID)) merged.add(id);\n data.containedShapeIDs = Array.from(merged);\n }\n serialized.push(data);\n }\n\n const scene = {\n format: 'lixsketch',\n version: FORMAT_VERSION,\n sessionID: getSessionID(),\n name: workspaceName,\n createdAt: new Date().toISOString(),\n viewport: window.currentViewBox ? { ...window.currentViewBox } : null,\n zoom: window.currentZoom || 1,\n shapes: serialized,\n };\n\n return scene;\n}\n\n// ============================================================\n// LOAD: Deserialize .lixsketch JSON and recreate scene\n// ============================================================\nexport function loadScene(sceneData) {\n if (!sceneData || sceneData.format !== 'lixsketch') {\n console.error('[SceneSerializer] Invalid scene format');\n return false;\n }\n\n // Clear current scene\n const svgEl = window.svg;\n if (!svgEl) return false;\n window.__roomImageBytesUsed = 0;\n\n // Remove all existing shape DOM elements\n const existingShapes = window.shapes || [];\n existingShapes.forEach(shape => {\n // For frames, clean up clipGroup and clipPath too\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n });\n\n // Clear arrays IN PLACE \u2014 tool modules hold direct references to these\n // arrays from import-time, so replacing them breaks interactivity.\n if (window.shapes) window.shapes.length = 0; else window.shapes = [];\n window.currentShape = null;\n if (window.historyStack) window.historyStack.length = 0; else window.historyStack = [];\n if (window.redoStack) window.redoStack.length = 0; else window.redoStack = [];\n\n // Build ID -> shape map for frame containment and arrow attachments\n const idMap = new Map();\n\n // First pass: create all shapes (frames first to allow containment)\n const frameData = sceneData.shapes.filter(s => s.type === 'frame');\n const otherData = sceneData.shapes.filter(s => s.type !== 'frame');\n\n // Create frames first\n for (const data of frameData) {\n const shape = deserializeShape(data);\n if (shape) {\n // Restore group membership if present.\n if (data.groupId) shape.groupId = data.groupId;\n restoreDocBlockLinks(shape, data);\n window.shapes.push(shape);\n if (data.shapeID) idMap.set(data.shapeID, shape);\n }\n }\n\n // Create all other shapes\n for (const data of otherData) {\n const shape = deserializeShape(data);\n if (shape) {\n if (data.groupId) shape.groupId = data.groupId;\n restoreDocBlockLinks(shape, data);\n window.shapes.push(shape);\n if (data.shapeID) idMap.set(data.shapeID, shape);\n }\n }\n\n // Second pass: restore frame containment\n for (const data of frameData) {\n const frame = idMap.get(data.shapeID);\n if (frame && data.containedShapeIDs && data.containedShapeIDs.length > 0) {\n for (const childID of data.containedShapeIDs) {\n const child = idMap.get(childID);\n if (!child) {\n console.warn(`[SceneSerializer] Frame \"${data.frameName}\" references missing shape: ${childID}`);\n continue;\n }\n try {\n if (typeof frame.addShapeToFrame === 'function') {\n frame.addShapeToFrame(child);\n } else {\n // Fallback: manually set containment\n frame.containedShapes.push(child);\n child.parentFrame = frame;\n }\n } catch (err) {\n console.warn(`[SceneSerializer] Failed to restore containment for ${childID} in frame ${data.shapeID}:`, err);\n // Fallback: at least set the reference\n if (!frame.containedShapes.includes(child)) {\n frame.containedShapes.push(child);\n }\n child.parentFrame = frame;\n }\n }\n }\n }\n\n // Third pass: restore arrow attachments\n for (const data of sceneData.shapes) {\n if (data.type === 'arrow') {\n const arrow = idMap.get(data.shapeID);\n if (!arrow) continue;\n if (data.startAttachmentID) {\n const target = idMap.get(data.startAttachmentID);\n if (target && arrow.setStartAttachment) arrow.setStartAttachment(target);\n }\n if (data.endAttachmentID) {\n const target = idMap.get(data.endAttachmentID);\n if (target && arrow.setEndAttachment) arrow.setEndAttachment(target);\n }\n }\n }\n\n // \u2500\u2500 Fourth pass: frame containment reconciliation (issue #24 bug #10) \u2500\u2500\n //\n // The pass above attaches each child via `frame.addShapeToFrame(child)`,\n // which is supposed to move the child's <g> into the frame's clipGroup.\n // In practice LixScript-rendered scenes were reloading with empty\n // frames \u2014 children present in the shapes array, frame box drawn, but\n // the children's <g> elements stranded at the svg root (so visually\n // they look orphaned). The cause varies (transient `isBeingMovedByFrame`\n // flag carried over from save time, ordering glitches when nested\n // frames are restored, etc.). Rather than chase the source, repair the\n // DOM state here from the authoritative `containedShapes` array.\n for (const data of frameData) {\n const frame = idMap.get(data.shapeID);\n if (!frame) continue;\n\n // Clear stale flags that suppress DOM mutation inside addShapeToFrame.\n delete frame.isBeingMovedByFrame;\n delete frame.isDraggedOutTemporarily;\n\n // Ensure the frame's own clipGroup is direct child of svg \u2014 sub-frames\n // that didn't get re-parented yet are handled in the next loop.\n if (frame.clipGroup && frame.clipGroup.parentNode !== svgEl) {\n svgEl.appendChild(frame.clipGroup);\n }\n\n for (const child of frame.containedShapes || []) {\n if (!child) continue;\n delete child.isBeingMovedByFrame;\n delete child.isDraggedOutTemporarily;\n\n const el = child.group || child.element;\n if (el && el.parentNode !== frame.clipGroup) {\n if (el.parentNode) el.parentNode.removeChild(el);\n frame.clipGroup.appendChild(el);\n }\n // Sub-frames also carry their own clipGroup \u2014 nest it.\n if (child.shapeName === 'frame' && child.clipGroup\n && child.clipGroup.parentNode !== frame.clipGroup) {\n if (child.clipGroup.parentNode) child.clipGroup.parentNode.removeChild(child.clipGroup);\n frame.clipGroup.appendChild(child.clipGroup);\n }\n // Authoritative parent ref \u2014 `addShapeToFrame` should already\n // have set this but the no-op early return when the child was\n // already in containedShapes skips it.\n child.parentFrame = frame;\n }\n\n // Force the clip rect + visual to match. Some saved frames came\n // through with a stale clipRect from before the resize that lost\n // the children visually.\n if (typeof frame.updateClipPath === 'function') frame.updateClipPath();\n if (typeof frame.draw === 'function') {\n try { frame.draw(); } catch (err) { console.warn('[SceneSerializer] frame redraw failed:', err); }\n }\n }\n\n // Restore viewport\n if (sceneData.viewport && svgEl) {\n const vb = sceneData.viewport;\n window.currentViewBox = { ...vb };\n svgEl.setAttribute('viewBox', `${vb.x} ${vb.y} ${vb.width} ${vb.height}`);\n }\n if (sceneData.zoom) {\n window.currentZoom = sceneData.zoom;\n }\n\n console.log(`[SceneSerializer] Loaded ${window.shapes.length} shapes from \"${sceneData.name}\"`);\n window.dispatchEvent(new CustomEvent('lix-doc-canvas-links-changed'));\n\n // Re-sync tool flags so shapes are interactable after restore\n if (window.__sketchEngine && typeof window.__sketchEngine.setActiveTool === 'function') {\n const store = window.__sketchStoreApi;\n const currentTool = store ? store.getState().activeTool : 'select';\n window.__sketchEngine.setActiveTool(currentTool);\n } else {\n // Fallback: ensure selection tool is active\n window.isSelectionToolActive = true;\n }\n\n return true;\n}\n\n// ============================================================\n// DOWNLOAD: Trigger browser download of .lixsketch file\n// ============================================================\nexport function downloadScene(workspaceName = 'Untitled') {\n const scene = saveScene(workspaceName);\n const json = JSON.stringify(scene, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = `${workspaceName.replace(/[^a-zA-Z0-9_-]/g, '_')}.lixjson`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// ============================================================\n// UPLOAD: Open file picker and load .lixsketch file\n// ============================================================\n// Validate scene JSON structure before loading\nexport function validateScene(data) {\n if (!data || typeof data !== 'object') return { valid: false, error: 'Not a valid JSON object' };\n if (data.format !== 'lixsketch') return { valid: false, error: 'Not a LixSketch scene file (missing format field)' };\n if (!data.version || data.version > FORMAT_VERSION) return { valid: false, error: `Unsupported version: ${data.version}` };\n if (!Array.isArray(data.shapes)) return { valid: false, error: 'Invalid scene: missing shapes array' };\n return {\n valid: true,\n name: data.name || 'Untitled',\n shapeCount: data.shapes.length,\n sessionID: data.sessionID || null,\n createdAt: data.createdAt || null,\n };\n}\n\nexport function uploadScene() {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.lixjson,.json';\n input.onchange = (e) => {\n const file = e.target.files[0];\n if (!file) return resolve(false);\n\n const reader = new FileReader();\n reader.onload = (ev) => {\n try {\n const data = JSON.parse(ev.target.result);\n const validation = validateScene(data);\n if (!validation.valid) {\n console.error('[SceneSerializer] Invalid file:', validation.error);\n resolve({ success: false, error: validation.error });\n return;\n }\n resetSessionID(); // New session for loaded scene\n const result = loadScene(data);\n resolve({ success: result, validation });\n } catch (err) {\n console.error('[SceneSerializer] Failed to parse file:', err);\n resolve({ success: false, error: 'Failed to parse JSON file' });\n }\n };\n reader.readAsText(file);\n };\n input.click();\n });\n}\n\n// ============================================================\n// EXPORT as PNG\n// ============================================================\nexport function exportAsPNG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n // Remove selection UI elements\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const canvas = document.createElement('canvas');\n const vb = svgEl.viewBox.baseVal;\n canvas.width = vb.width * 2; // 2x for retina\n canvas.height = vb.height * 2;\n const ctx = canvas.getContext('2d');\n ctx.scale(2, 2);\n\n const img = new Image();\n const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n // Draw dark background\n ctx.fillStyle = '#121212';\n ctx.fillRect(0, 0, vb.width, vb.height);\n ctx.drawImage(img, 0, 0, vb.width, vb.height);\n URL.revokeObjectURL(url);\n\n canvas.toBlob(blob => {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = 'lixsketch-export.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 'image/png');\n };\n img.src = url;\n}\n\n// ============================================================\n// COPY to clipboard as PNG\n// ============================================================\nexport function copyAsPNG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const canvas = document.createElement('canvas');\n const vb = svgEl.viewBox.baseVal;\n canvas.width = vb.width * 2;\n canvas.height = vb.height * 2;\n const ctx = canvas.getContext('2d');\n ctx.scale(2, 2);\n\n const img = new Image();\n const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n ctx.fillStyle = '#121212';\n ctx.fillRect(0, 0, vb.width, vb.height);\n ctx.drawImage(img, 0, 0, vb.width, vb.height);\n URL.revokeObjectURL(url);\n\n canvas.toBlob(blob => {\n if (!blob) return;\n navigator.clipboard.write([\n new ClipboardItem({ 'image/png': blob })\n ]).catch(err => console.warn('[SceneSerializer] Clipboard write failed:', err));\n }, 'image/png');\n };\n img.src = url;\n}\n\n// ============================================================\n// COPY to clipboard as SVG\n// ============================================================\nexport function copyAsSVG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n navigator.clipboard.writeText(svgData)\n .catch(err => console.warn('[SceneSerializer] Clipboard write failed:', err));\n}\n\n// ============================================================\n// EXPORT as PDF (uses browser print)\n// ============================================================\nexport function exportAsPDF() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const printWindow = window.open('', '_blank');\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head><title>LixSketch Export</title>\n <style>\n body { margin: 0; background: #121212; display: flex; align-items: center; justify-content: center; min-height: 100vh; }\n svg { max-width: 100vw; max-height: 100vh; }\n @media print { body { background: white; } }\n </style>\n </head>\n <body>${svgData}</body>\n </html>\n `);\n printWindow.document.close();\n printWindow.focus();\n setTimeout(() => printWindow.print(), 500);\n}\n\n// ============================================================\n// RESET: Clear the entire canvas\n// ============================================================\nexport function resetCanvas() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n // Remove all shape DOM elements + frame clipGroups/clipPaths\n const existingShapes = window.shapes || [];\n existingShapes.forEach(shape => {\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n });\n\n // Remove selection UI\n svgEl.querySelectorAll(\n '.selection-outline, .resize-anchor, .rotation-anchor, [data-selection]'\n ).forEach(el => el.remove());\n\n // Clear arrays IN PLACE (same reason as loadScene)\n if (window.shapes) window.shapes.length = 0; else window.shapes = [];\n window.currentShape = null;\n if (window.historyStack) window.historyStack.length = 0; else window.historyStack = [];\n if (window.redoStack) window.redoStack.length = 0; else window.redoStack = [];\n\n if (typeof window.clearAllSelections === 'function') {\n window.clearAllSelections();\n }\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n\n // Clear auto-save (both legacy and session-scoped keys)\n try {\n localStorage.removeItem('lixsketch-autosave');\n localStorage.removeItem('lixsketch-autosave-meta');\n const sid = window.__sessionID;\n if (sid) {\n localStorage.removeItem(`lixsketch-autosave-${sid}`);\n localStorage.removeItem(`lixsketch-autosave-meta-${sid}`);\n }\n } catch (_) {}\n\n console.log('[SceneSerializer] Canvas reset');\n if (typeof window.__collabSceneChanged === 'function') {\n window.__collabSceneChanged();\n }\n}\n\n// ============================================================\n// FIND: Search for text content on the canvas\n// ============================================================\nexport function findTextOnCanvas(query) {\n const allShapes = window.shapes || [];\n if (!query || query.trim() === '') return [];\n\n const lowerQuery = query.toLowerCase();\n const results = [];\n\n for (const shape of allShapes) {\n let textContent = '';\n\n if (shape.shapeName === 'text' || shape.shapeName === 'code') {\n const group = shape.group;\n if (group) {\n // Get all text content from SVG text/tspan elements\n const textEls = group.querySelectorAll('text, tspan');\n textEls.forEach(el => {\n if (el.textContent) textContent += el.textContent + ' ';\n });\n // Also check foreignObject content\n const foreignEls = group.querySelectorAll('foreignObject *');\n foreignEls.forEach(el => {\n if (el.textContent) textContent += el.textContent + ' ';\n });\n }\n } else if (shape.shapeName === 'frame') {\n textContent = shape.frameName || '';\n }\n\n textContent = textContent.trim();\n if (textContent && textContent.toLowerCase().includes(lowerQuery)) {\n results.push({\n shape,\n text: textContent,\n type: shape.shapeName,\n x: shape.x || 0,\n y: shape.y || 0,\n });\n }\n }\n\n return results;\n}\n\n// ============================================================\n// Initialize bridge for React components\n// ============================================================\nexport function initSceneSerializer() {\n window.__sceneSerializer = {\n save: saveScene,\n load: loadScene,\n download: downloadScene,\n upload: uploadScene,\n exportPNG: exportAsPNG,\n exportPDF: exportAsPDF,\n copyAsPNG,\n copyAsSVG,\n resetCanvas,\n findText: findTextOnCanvas,\n };\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
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,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/shapes/ImageShape.js"],
4
- "sourcesContent": ["/* eslint-disable */\n// ImageShape class - extracted from imageTool.js\n// Depends on globals: svg, shapes, currentShape\n\nimport { updateAttachedArrows as updateArrowsForShape } from \"../tools/arrowTool.js\";\nlet isDragging = false;\nlet hoveredFrameImage = null;\nfunction selectImage() {} // stub - image selection handled by imageTool\n\nclass ImageShape {\n constructor(element) {\n this.element = element;\n this.shapeName = 'image';\n this.type = 'image';\n this.shapeID = element.shapeID || `image-${String(Date.now()).slice(0, 8)}-${Math.floor(Math.random() * 10000)}`;\n this.isAIGenerated = element.getAttribute('data-ai-generated') === 'true';\n this.aiModel = element.getAttribute('data-ai-model') || null;\n\n // Frame attachment properties\n this.parentFrame = null;\n\n // Upload pipeline state\n this.uploadStatus = 'pending'; // 'pending' | 'uploading' | 'done' | 'failed'\n this.uploadAbortController = null;\n this._uploadIndicator = null;\n\n // Update element attributes\n this.element.setAttribute('type', 'image');\n this.element.shapeID = this.shapeID;\n\n // Create a group wrapper for the image to work with frames properly\n this.group = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n this.group.setAttribute('id', this.shapeID);\n\n // Move the image element into the group\n if (this.element.parentNode) {\n this.element.parentNode.removeChild(this.element);\n }\n this.group.appendChild(this.element);\n this._aiBadge = null;\n this._aiBadgeObserver = null;\n if (this.isAIGenerated) this.showAIBadge();\n svg.appendChild(this.group);\n }\n\n showAIBadge() {\n if (this._aiBadge) return;\n const ns = 'http://www.w3.org/2000/svg';\n const badge = document.createElementNS(ns, 'g');\n badge.setAttribute('class', 'ai-image-badge');\n badge.setAttribute('aria-label', 'AI generated image');\n badge.style.pointerEvents = 'none';\n\n const background = document.createElementNS(ns, 'rect');\n background.setAttribute('width', '32');\n background.setAttribute('height', '18');\n background.setAttribute('rx', '6');\n background.setAttribute('fill', '#7c5ce0');\n background.setAttribute('stroke', 'rgba(255,255,255,0.72)');\n background.setAttribute('stroke-width', '1');\n badge.appendChild(background);\n\n const label = document.createElementNS(ns, 'text');\n label.textContent = '\u2726 AI';\n label.setAttribute('x', '16');\n label.setAttribute('y', '12.5');\n label.setAttribute('fill', '#ffffff');\n label.setAttribute('font-family', 'system-ui, sans-serif');\n label.setAttribute('font-size', '9');\n label.setAttribute('font-weight', '700');\n label.setAttribute('text-anchor', 'middle');\n badge.appendChild(label);\n\n this.group.appendChild(badge);\n this._aiBadge = badge;\n this.updateAIBadgePosition();\n\n if (typeof MutationObserver !== 'undefined') {\n this._aiBadgeObserver = new MutationObserver(() => this.updateAIBadgePosition());\n this._aiBadgeObserver.observe(this.element, {\n attributes: true,\n attributeFilter: ['x', 'y', 'width', 'height', 'transform'],\n });\n }\n }\n\n updateAIBadgePosition() {\n if (!this._aiBadge) return;\n const x = Number.isFinite(this.x) ? this.x + 6 : 6;\n const y = Number.isFinite(this.y) ? this.y + 6 : 6;\n this._aiBadge.setAttribute('transform', `translate(${x}, ${y})`);\n const imageTransform = this.element.getAttribute('transform');\n if (imageTransform) {\n this._aiBadge.setAttribute('transform', `${imageTransform} translate(${x}, ${y})`);\n }\n }\n\n showUploadIndicator() {\n if (this._uploadIndicator) return;\n const g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g.setAttribute('class', 'upload-indicator');\n\n const x = this.x + 6;\n const y = this.y + 6;\n\n // Background circle\n const bg = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n bg.setAttribute('cx', x + 10);\n bg.setAttribute('cy', y + 10);\n bg.setAttribute('r', 12);\n bg.setAttribute('fill', 'rgba(0,0,0,0.7)');\n g.appendChild(bg);\n\n // Caution/loading icon (\u26A1 style triangle)\n const icon = document.createElementNS('http://www.w3.org/2000/svg', 'polygon');\n icon.setAttribute('points', `${x+10},${y+3} ${x+17},${y+16} ${x+3},${y+16}`);\n icon.setAttribute('fill', 'none');\n icon.setAttribute('stroke', '#FBBF24');\n icon.setAttribute('stroke-width', '1.5');\n icon.setAttribute('stroke-linejoin', 'round');\n g.appendChild(icon);\n\n // Exclamation mark inside\n const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n line.setAttribute('x1', x + 10);\n line.setAttribute('y1', y + 8);\n line.setAttribute('x2', x + 10);\n line.setAttribute('y2', y + 12);\n line.setAttribute('stroke', '#FBBF24');\n line.setAttribute('stroke-width', '1.5');\n line.setAttribute('stroke-linecap', 'round');\n g.appendChild(line);\n\n const dot = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n dot.setAttribute('cx', x + 10);\n dot.setAttribute('cy', y + 14.5);\n dot.setAttribute('r', 0.8);\n dot.setAttribute('fill', '#FBBF24');\n g.appendChild(dot);\n\n // Pulsing animation\n const animate = document.createElementNS('http://www.w3.org/2000/svg', 'animate');\n animate.setAttribute('attributeName', 'opacity');\n animate.setAttribute('values', '1;0.4;1');\n animate.setAttribute('dur', '1.5s');\n animate.setAttribute('repeatCount', 'indefinite');\n g.appendChild(animate);\n\n // Apply same transform as image (rotation)\n const transform = this.element.getAttribute('transform');\n if (transform) g.setAttribute('transform', transform);\n\n g.style.pointerEvents = 'none';\n this.group.appendChild(g);\n this._uploadIndicator = g;\n }\n\n removeUploadIndicator() {\n if (this._uploadIndicator && this._uploadIndicator.parentNode) {\n this._uploadIndicator.parentNode.removeChild(this._uploadIndicator);\n }\n this._uploadIndicator = null;\n }\n\n updateUploadIndicatorPosition() {\n if (!this._uploadIndicator) return;\n const x = this.x + 6;\n const y = this.y + 6;\n\n const bg = this._uploadIndicator.querySelector('circle');\n if (bg) { bg.setAttribute('cx', x + 10); bg.setAttribute('cy', y + 10); }\n\n const icon = this._uploadIndicator.querySelector('polygon');\n if (icon) icon.setAttribute('points', `${x+10},${y+3} ${x+17},${y+16} ${x+3},${y+16}`);\n\n const line = this._uploadIndicator.querySelector('line');\n if (line) {\n line.setAttribute('x1', x + 10); line.setAttribute('y1', y + 8);\n line.setAttribute('x2', x + 10); line.setAttribute('y2', y + 12);\n }\n\n const dots = this._uploadIndicator.querySelectorAll('circle');\n if (dots[1]) { dots[1].setAttribute('cx', x + 10); dots[1].setAttribute('cy', y + 14.5); }\n\n const transform = this.element.getAttribute('transform');\n if (transform) this._uploadIndicator.setAttribute('transform', transform);\n }\n \n // Position and dimension properties for frame compatibility\n get x() {\n return parseFloat(this.element.getAttribute('x'));\n }\n \n set x(value) {\n this.element.setAttribute('x', value);\n this.element.setAttribute('data-shape-x', value);\n }\n \n get y() {\n return parseFloat(this.element.getAttribute('y'));\n }\n \n set y(value) {\n this.element.setAttribute('y', value);\n this.element.setAttribute('data-shape-y', value);\n }\n \n get width() {\n return parseFloat(this.element.getAttribute('width'));\n }\n \n set width(value) {\n this.element.setAttribute('width', value);\n this.element.setAttribute('data-shape-width', value);\n }\n \n get height() {\n return parseFloat(this.element.getAttribute('height'));\n }\n \n set height(value) {\n this.element.setAttribute('height', value);\n this.element.setAttribute('data-shape-height', value);\n }\n \n get rotation() {\n const transform = this.element.getAttribute('transform');\n if (transform) {\n const rotateMatch = transform.match(/rotate\\(([^,]+)/);\n if (rotateMatch) {\n return parseFloat(rotateMatch[1]);\n }\n }\n return 0;\n }\n \n set rotation(value) {\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n this.element.setAttribute('transform', `rotate(${value}, ${centerX}, ${centerY})`);\n this.element.setAttribute('data-shape-rotation', value);\n }\n\n move(dx, dy) {\n this.x += dx;\n this.y += dy;\n\n // Update transform for rotation\n const centerX = this.x + this.width / 2;\n const centerY = this.y + this.height / 2;\n this.element.setAttribute('transform', `rotate(${this.rotation}, ${centerX}, ${centerY})`);\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 (isDragging && !this.isBeingMovedByFrame) {\n this.updateFrameContainment();\n }\n\n this.updateAttachedArrows();\n }\n\n updateAttachedArrows() {\n updateArrowsForShape(this);\n }\n\n updateFrameContainment() {\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 if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n shapes.forEach(shape => {\n if (shape.shapeName === 'frame' && shape.isShapeInFrame(this)) {\n targetFrame = shape;\n }\n });\n }\n \n // If we have a parent frame and we're being dragged, temporarily remove clipping\n if (this.parentFrame && isDragging) {\n this.parentFrame.temporarilyRemoveFromFrame(this);\n }\n \n // Update frame highlighting\n if (hoveredFrameImage && hoveredFrameImage !== targetFrame) {\n hoveredFrameImage.removeHighlight();\n }\n \n if (targetFrame && targetFrame !== hoveredFrameImage) {\n targetFrame.highlightFrame();\n }\n \n hoveredFrameImage = targetFrame;\n }\n\n contains(x, y) {\n const imgX = this.x;\n const imgY = this.y;\n const imgWidth = this.width;\n const imgHeight = this.height;\n \n // Simple bounding box check (could be enhanced for rotation)\n return x >= imgX && x <= imgX + imgWidth && y >= imgY && y <= imgY + imgHeight;\n }\n\n // Add draw method for consistency with other shapes\n draw() {\n this.updateAIBadgePosition();\n }\n\n remove() {\n if (this.group?.parentNode) this.group.parentNode.removeChild(this.group);\n if (typeof shapes !== 'undefined' && Array.isArray(shapes)) {\n const index = shapes.indexOf(this);\n if (index !== -1) shapes.splice(index, 1);\n }\n }\n\n restore() {\n if (svg && this.group && !this.group.parentNode) svg.appendChild(this.group);\n if (typeof shapes !== 'undefined' && Array.isArray(shapes) && !shapes.includes(this)) shapes.push(this);\n this.updateAIBadgePosition();\n }\n\n // Add methods for frame compatibility\n removeSelection() {\n // Remove selection outlines from SVG\n svg.querySelectorAll(\".selection-outline\").forEach(el => el.remove());\n // Remove resize/rotation anchors if present\n svg.querySelectorAll(\".resize-anchor, .rotation-anchor\").forEach(el => el.remove());\n }\n\n selectShape() {\n // Image interaction state lives in imageTool. Use its bridge so\n // programmatically-created images (graphs, restored scenes, paste)\n // receive the same drag/resize controls as pointer-selected images.\n if (typeof window.__selectImageElement === 'function') {\n window.__selectImageElement(this.element, { force: true });\n }\n }\n}\n\nexport { ImageShape };\n"],
5
- "mappings": "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",
6
- "names": []
7
- }