@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
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/core/UndoRedo.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n// Undo/Redo system - copied from undoAndRedo.js\n\n// Stacks for undo/redo\nconst undoStack = [];\nconst redoStack = [];\n\n// Import references to text-related variables and functions\nlet selectedElement = null;\nlet updateSelectionFeedback = null;\nlet svg = null;\n\nfunction notifyCollaboration() {\n if (typeof window !== 'undefined' && typeof window.__collabSceneChanged === 'function') {\n window.__collabSceneChanged();\n }\n}\n\n// Function to set references from other modules\nexport function setTextReferences(element, updateFn, svgElement) {\n selectedElement = element;\n updateSelectionFeedback = updateFn;\n svg = svgElement;\n}\n\n// Function to get current selectedElement (called from other modules)\nexport function getCurrentSelectedElement() {\n return selectedElement;\n}\n\n// Function to update selectedElement reference (called from other modules)\nexport function updateSelectedElement(element) {\n selectedElement = element;\n}\n\n// Call this after creating a new shape (e.g., Rectangle)\nexport function pushCreateAction(shape, meta = null) {\n const action = {\n type: 'create',\n shape: shape\n };\n if (meta?.frameCreation && shape?.shapeName === 'frame') {\n action.frameCreation = true;\n action.containedShapes = [...(meta.containedShapes || shape.containedShapes || [])];\n action.shapeIndex = Array.isArray(shapes) ? shapes.indexOf(shape) : -1;\n }\n undoStack.push(action);\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushDeleteAction(shape, meta = null) {\n // Issue #24 bug #7: when the deleted shape is a frame, the caller may\n // pass `meta.childSnapshot` \u2014 the contained shape REFERENCES at the\n // time of delete. The undo branch uses this to re-attach the children\n // when the frame is restored, instead of leaving an empty box.\n const action = { type: 'delete', shape };\n if (meta && meta.childSnapshot) action.childSnapshot = meta.childSnapshot;\n undoStack.push(action);\n\n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\n// Enhanced delete action to clean up attached arrows\nexport function pushDeleteActionWithAttachments(shape) {\n let affectedArrows = [];\n \n // If deleting a text element, find all attached arrows\n if (shape.type === 'text' || shape.shapeName === 'text') {\n affectedArrows = shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }));\n }\n \n undoStack.push({\n type: 'delete',\n shape: shape,\n affectedArrows: affectedArrows\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushFrameAttachmentAction(frame, shape, action, oldFrame = null) {\n undoStack.push({\n type: 'frameAttachment',\n frame: frame,\n shape: shape,\n action: action, // 'attach' or 'detach'\n oldFrame: oldFrame, // Previous frame if shape was moved between frames\n // Store shape position for potential restoration\n shapeState: {\n x: shape.x,\n y: shape.y,\n width: shape.width || 0,\n height: shape.height || 0,\n rotation: shape.rotation || 0\n }\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushCreateActionWithAttachments(shape) {\n undoStack.push({\n type: 'create',\n shape: shape,\n // Store any arrows that might need to reattach when this is undone\n potentialAttachments: []\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushTransformAction(shape, oldPos, newPos) {\n if (shape.shapeName === 'frame') {\n // Handle frame transformation with contained shapes\n const containedShapesStates = shape.containedShapes.map(containedShape => ({\n shape: containedShape,\n oldState: {\n x: containedShape.x - (newPos.x - oldPos.x),\n y: containedShape.y - (newPos.y - oldPos.y),\n width: containedShape.width || 0,\n height: containedShape.height || 0,\n rotation: containedShape.rotation || 0\n },\n newState: {\n x: containedShape.x,\n y: containedShape.y,\n width: containedShape.width || 0,\n height: containedShape.height || 0,\n rotation: containedShape.rotation || 0\n }\n }));\n\n undoStack.push({\n type: 'frameTransform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation,\n frameName: oldPos.frameName || shape.frameName\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation,\n frameName: newPos.frameName || shape.frameName\n },\n containedShapes: containedShapesStates\n });\n } else if (shape.type === 'text') {\n // Enhanced text handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n rotation: oldPos.rotation,\n fontSize: oldPos.fontSize\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n rotation: newPos.rotation,\n fontSize: newPos.fontSize\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.type === 'image') {\n // Enhanced image handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.shapeName === 'circle') {\n // Enhanced circle handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n rx: oldPos.rx,\n ry: oldPos.ry,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n rx: newPos.rx,\n ry: newPos.ry,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } else if (shape.shapeName === \"rectangle\") {\n // Enhanced rectangle handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: { \n x: oldPos.x, \n y: oldPos.y, \n width: oldPos.width, \n height: oldPos.height, \n rotation: oldPos.rotation\n },\n newPos: { \n x: newPos.x, \n y: newPos.y, \n width: newPos.width, \n height: newPos.height, \n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n } \n else if (shape.shapeName === 'line') {\n // Enhanced line handling with curve support\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n startPoint: { x: oldPos.startPoint.x, y: oldPos.startPoint.y },\n endPoint: { x: oldPos.endPoint.x, y: oldPos.endPoint.y },\n controlPoint: oldPos.controlPoint ? { x: oldPos.controlPoint.x, y: oldPos.controlPoint.y } : null,\n isCurved: oldPos.isCurved || false\n },\n newPos: {\n startPoint: { x: newPos.startPoint.x, y: newPos.startPoint.y },\n endPoint: { x: newPos.endPoint.x, y: newPos.endPoint.y },\n controlPoint: newPos.controlPoint ? { x: newPos.controlPoint.x, y: newPos.controlPoint.y } : null,\n isCurved: newPos.isCurved || false\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n }\n });\n }\n else if (shape.shapeName === 'arrow') {\n // Handle arrow transform with attachment state\n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n startPoint: { x: oldPos.startPoint.x, y: oldPos.startPoint.y },\n endPoint: { x: oldPos.endPoint.x, y: oldPos.endPoint.y },\n controlPoint1: oldPos.controlPoint1 ? { x: oldPos.controlPoint1.x, y: oldPos.controlPoint1.y } : null,\n controlPoint2: oldPos.controlPoint2 ? { x: oldPos.controlPoint2.x, y: oldPos.controlPoint2.y } : null,\n attachments: oldPos.attachments || shape.getAttachmentState()\n },\n newPos: {\n startPoint: { x: newPos.startPoint.x, y: newPos.startPoint.y },\n endPoint: { x: newPos.endPoint.x, y: newPos.endPoint.y },\n controlPoint1: newPos.controlPoint1 ? { x: newPos.controlPoint1.x, y: newPos.controlPoint1.y } : null,\n controlPoint2: newPos.controlPoint2 ? { x: newPos.controlPoint2.x, y: newPos.controlPoint2.y } : null,\n attachments: newPos.attachments || shape.getAttachmentState()\n }\n });\n } \n else if (shape.type === 'icon') {\n // Enhanced icon handling - also track frame attachment changes\n const currentFrame = shape.parentFrame || null;\n \n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n x: oldPos.x,\n y: oldPos.y,\n width: oldPos.width,\n height: oldPos.height,\n rotation: oldPos.rotation\n },\n newPos: {\n x: newPos.x,\n y: newPos.y,\n width: newPos.width,\n height: newPos.height,\n rotation: newPos.rotation\n },\n // Track frame attachment state\n frameAttachment: {\n oldFrame: oldPos.parentFrame || null,\n newFrame: currentFrame\n },\n // Store affected arrows with their attachment states\n affectedArrows: shapes.filter(s => s.shapeName === 'arrow' && \n (s.attachedToStart?.shape === shape || s.attachedToEnd?.shape === shape))\n .map(arrow => ({\n arrow: arrow,\n oldAttachments: arrow.getAttachmentState(),\n oldPoints: {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n }\n }))\n });\n}\n else if (shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform\n undoStack.push({\n type: 'transform',\n shape: shape,\n oldPos: {\n points: JSON.parse(JSON.stringify(oldPos.points)),\n rotation: oldPos.rotation\n },\n newPos: {\n points: JSON.parse(JSON.stringify(newPos.points)),\n rotation: newPos.rotation\n }\n });\n }\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\nexport function pushOptionsChangeAction(shape, oldOptions, newOptions = null) {\n undoStack.push({\n type: 'optionsChange',\n shape: shape,\n oldOptions: oldOptions,\n newOptions: newOptions\n });\n \n // Clear redo stack when new action is performed\n redoStack.length = 0;\n notifyCollaboration();\n}\n\n// Issue #34 bug #4: refresh the multi-selection outline + handles so it\n// follows the reverted geometry. Without this the selection rect stays\n// pinned to the pre-undo coordinates and the user sees a ghost rect\n// floating away from the shapes it claims to wrap.\nfunction refreshSelectionAfterAction() {\n const ms = (typeof window !== 'undefined') ? window.multiSelection : null;\n if (!ms) return;\n if (typeof ms.updateControls !== 'function') return;\n if (!ms.selectedShapes || ms.selectedShapes.size === 0) return;\n try { ms.updateControls(); } catch (err) { console.warn('[UndoRedo] selection refresh failed:', err); }\n}\n\nexport function undo() {\n if (undoStack.length === 0) return;\n const action = undoStack.pop();\n try {\n if (action.type === 'frameTransform') {\n // Handle frame transformation undo\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.width = action.oldPos.width;\n action.shape.height = action.oldPos.height;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.frameName = action.oldPos.frameName;\n \n // Restore contained shapes to their old positions\n action.containedShapes.forEach(shapeData => {\n const shape = shapeData.shape;\n shape.x = shapeData.oldState.x;\n shape.y = shapeData.oldState.y;\n shape.width = shapeData.oldState.width;\n shape.height = shapeData.oldState.height;\n shape.rotation = shapeData.oldState.rotation;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n });\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n action.shape.updateClipPath();\n \n redoStack.push(action);\n return;\n }\n \n if (action.type === 'frameAttachment') {\n // Handle frame attachment/detachment undo WITHOUT calling the methods that track undo\n if (action.action === 'attach') {\n // Undo attach: manually remove shape from frame\n const frameIndex = action.frame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frame.containedShapes.splice(frameIndex, 1);\n action.shape.parentFrame = null;\n \n // Move shape back to main SVG\n if (action.shape.group && action.shape.group.parentNode === action.frame.clipGroup) {\n action.frame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n \n // If shape was moved from another frame, restore it there\n if (action.oldFrame) {\n action.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.oldFrame;\n \n // Move to old frame's clipped group\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else if (action.action === 'detach') {\n // Undo detach: manually add shape back to frame\n if (!action.frame.containedShapes.includes(action.shape)) {\n action.frame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frame;\n \n // Move to frame's clipped group\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frame.clipGroup.appendChild(action.shape.group);\n }\n }\n }\n \n // Restore shape state\n action.shape.x = action.shapeState.x;\n action.shape.y = action.shapeState.y;\n action.shape.width = action.shapeState.width;\n action.shape.height = action.shapeState.height;\n action.shape.rotation = action.shapeState.rotation;\n \n if (typeof action.shape.draw === 'function') {\n action.shape.draw();\n }\n \n redoStack.push(action);\n return;\n }\n\n // Handle mode conversion undo (code \u2194 text)\n if (action.type === 'create' && action.shape.type === 'modeConvert') {\n // Undo: remove the new shape, restore the old shape\n const newShape = action.shape.newShape;\n const newElement = action.shape.newElement;\n const oldShape = action.shape.oldShape;\n const oldElement = action.shape.oldElement;\n\n // Remove new shape from DOM and shapes array\n if (newElement && newElement.parentNode) {\n newElement.parentNode.removeChild(newElement);\n }\n const newIdx = shapes.indexOf(newShape);\n if (newIdx !== -1) shapes.splice(newIdx, 1);\n\n // Restore old shape to DOM and shapes array\n if (svg && oldElement) {\n svg.appendChild(oldElement);\n }\n if (oldShape) {\n shapes.push(oldShape);\n }\n\n redoStack.push(action);\n return;\n }\n\n if (action.type === 'create') {\n if (action.frameCreation && action.shape.shapeName === 'frame') {\n // Treat a manually-created frame and its initial membership as one\n // atomic action. Children remain on the canvas when the frame is\n // undone and are clipped back into it on redo.\n for (const child of action.containedShapes || []) {\n if (child?.parentFrame === action.shape) action.shape.removeShapeFromFrame(child);\n }\n if (currentShape === action.shape) {\n action.shape.removeSelection?.();\n currentShape = null;\n }\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n action.shape.group?.remove();\n action.shape.clipGroup?.remove();\n action.shape.clipPath?.remove();\n } else\n if (action.shape.type === 'text') {\n // Handle text creation undo\n if (action.shape.element && action.shape.element.parentNode) {\n action.shape.element.parentNode.removeChild(action.shape.element);\n } else if (action.shape.parentNode) {\n action.shape.parentNode.removeChild(action.shape);\n }\n\n // Remove from shapes array\n const idx = shapes.indexOf(action.shape.element || action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Clean up any arrow attachments to this text\n if (typeof cleanupAttachments === 'function') {\n cleanupAttachments(action.shape.element || action.shape);\n }\n } else if (action.shape.type === 'image') {\n // Handle image creation undo\n action.shape.remove();\n } else if (action.shape.type === 'icon') {\n // Handle icon creation undo - call the remove method\n action.shape.remove();\n } else {\n // Handle other shape creation undo\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n if (action.shape.group && action.shape.group.parentNode) {\n action.shape.group.parentNode.removeChild(action.shape.group);\n }\n \n // Handle frame cleanup\n if (action.shape.shapeName === 'frame') {\n action.shape.destroy();\n }\n }\n redoStack.push(action);\n return;\n}\n \n if (action.type === 'delete') {\n if (action.shape.type === 'text') {\n // Handle text deletion undo\n if (svg) {\n svg.appendChild(action.shape.element || action.shape);\n // Add back to shapes array\n shapes.push(action.shape.element || action.shape);\n }\n \n // Restore arrow attachments if any existed\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore the old attachment state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n });\n }\n } else if (action.shape.type === 'image') {\n // Handle image deletion undo\n action.shape.restore();\n } else {\n // Handle other shape deletion undo\n shapes.push(action.shape);\n if (svg) {\n svg.appendChild(action.shape.group);\n }\n\n // Issue #24 bug #7: rehydrate frame state. The delete path\n // orphaned the frame (removed <g>, clipGroup, clipPath from\n // DOM) but kept the JS object intact. Re-attach clipGroup +\n // clipPath, then re-parent every child from the snapshot via\n // addShapeToFrame. Skip children that were subsequently\n // deleted (they'll get re-added when their own delete action\n // is undone in turn).\n if (action.shape.shapeName === 'frame' && svg) {\n if (action.shape.clipGroup && !action.shape.clipGroup.parentNode) {\n svg.appendChild(action.shape.clipGroup);\n }\n if (action.shape.clipPath && !action.shape.clipPath.parentNode) {\n const defs = svg.querySelector('defs');\n if (defs) defs.appendChild(action.shape.clipPath);\n else svg.insertBefore(action.shape.clipPath, svg.firstChild);\n }\n if (action.childSnapshot && Array.isArray(action.childSnapshot)) {\n for (const child of action.childSnapshot) {\n if (!child) continue;\n if (shapes.indexOf(child) === -1) continue;\n if (typeof action.shape.addShapeToFrame === 'function') {\n action.shape.addShapeToFrame(child);\n }\n }\n }\n }\n }\n redoStack.push(action);\n return;\n }\n \n if (action.type === 'transform') {\n // Handle frame attachment changes first\n if (action.frameAttachment) {\n // Use manual frame operations to avoid undo recursion\n if (action.frameAttachment.newFrame) {\n const frameIndex = action.frameAttachment.newFrame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frameAttachment.newFrame.containedShapes.splice(frameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.newFrame.clipGroup) {\n action.frameAttachment.newFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n if (action.frameAttachment.oldFrame) {\n if (!action.frameAttachment.oldFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.oldFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n if (action.shape.type === 'text') {\n // Enhanced text transform undo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement && action.oldPos.fontSize !== undefined) {\n textElement.setAttribute('font-size', action.oldPos.fontSize + 'px');\n }\n \n // Restore position and rotation\n const centerX = textElement ? textElement.getBBox().x + textElement.getBBox().width / 2 : 0;\n const centerY = textElement ? textElement.getBBox().y + textElement.getBBox().height / 2 : 0;\n \n (action.shape.element || action.shape).setAttribute('transform', \n `translate(${action.oldPos.x}, ${action.oldPos.y}) rotate(${action.oldPos.rotation}, ${centerX}, ${centerY})`\n );\n \n (action.shape.element || action.shape).setAttribute('data-x', action.oldPos.x);\n (action.shape.element || action.shape).setAttribute('data-y', action.oldPos.y);\n \n // Update attached arrows after text undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n } else if (action.shape.type === 'image') {\n // Enhanced image transform undo\n action.shape.restore(action.oldPos);\n \n // Update attached arrows after image undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n } else if (action.shape.shapeName === 'circle') {\n // Enhanced circle transform undo\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.rx = action.oldPos.rx;\n action.shape.ry = action.oldPos.ry;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after circle undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n } else if (action.shape.shapeName === 'line') {\n // Enhanced line transform undo with curve support\n action.shape.startPoint = { x: action.oldPos.startPoint.x, y: action.oldPos.startPoint.y };\n action.shape.endPoint = { x: action.oldPos.endPoint.x, y: action.oldPos.endPoint.y };\n \n // Restore curve state\n action.shape.isCurved = action.oldPos.isCurved || false;\n if (action.oldPos.controlPoint) {\n action.shape.controlPoint = { x: action.oldPos.controlPoint.x, y: action.oldPos.controlPoint.y };\n } else {\n action.shape.controlPoint = null;\n }\n \n // Handle frame attachment changes\n if (action.frameAttachment) {\n // Remove from new frame if it exists\n if (action.frameAttachment.newFrame) {\n const frameIndex = action.frameAttachment.newFrame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frameAttachment.newFrame.containedShapes.splice(frameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.newFrame.clipGroup) {\n action.frameAttachment.newFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add back to old frame if it exists\n if (action.frameAttachment.oldFrame) {\n if (!action.frameAttachment.oldFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.oldFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.oldFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.oldFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n }\n else if (action.shape.shapeName === 'arrow') {\n // Enhanced arrow transform undo with attachment restoration\n action.shape.startPoint = { x: action.oldPos.startPoint.x, y: action.oldPos.startPoint.y };\n action.shape.endPoint = { x: action.oldPos.endPoint.x, y: action.oldPos.endPoint.y };\n action.shape.controlPoint1 = action.oldPos.controlPoint1 ? \n { x: action.oldPos.controlPoint1.x, y: action.oldPos.controlPoint1.y } : null;\n action.shape.controlPoint2 = action.oldPos.controlPoint2 ? \n { x: action.oldPos.controlPoint2.x, y: action.oldPos.controlPoint2.y } : null;\n \n // Restore attachment state\n if (action.oldPos.attachments) {\n action.shape.restoreAttachmentState(action.oldPos.attachments);\n } else {\n // Clear attachments if none existed before\n action.shape.attachedToStart = null;\n action.shape.attachedToEnd = null;\n }\n \n action.shape.isSelected = false;\n action.shape.draw();\n \n\n \n } \n else if (action.shape.type === 'icon') {\n \n action.shape.restore(action.oldPos);\n \n // Update attached arrows after icon undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to old state\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n \n // Store current state for redo\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n }\n else if (action.shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform undo\n action.shape.points = JSON.parse(JSON.stringify(action.oldPos.points));\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n } else if (action.shape.shapeName === \"rectangle\") {\n action.shape.x = action.oldPos.x;\n action.shape.y = action.oldPos.y;\n action.shape.height = action.oldPos.height;\n action.shape.width = action.oldPos.width;\n action.shape.rotation = action.oldPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after rectangle undo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n arrow.restoreAttachmentState(arrowData.oldAttachments);\n arrowData.newPoints = {\n startPoint: { ...arrow.startPoint },\n endPoint: { ...arrow.endPoint }\n };\n arrowData.newAttachments = arrow.getAttachmentState();\n });\n }\n }\n redoStack.push(action);\n return;\n }\n \n if (action.type === 'optionsChange') {\n if (!action.newOptions && action.shape?.options) {\n action.newOptions = action.shape.shapeName === 'arrow'\n ? {\n ...action.shape.options,\n arrowOutlineStyle: action.shape.arrowOutlineStyle,\n arrowHeadStyle: action.shape.arrowHeadStyle,\n arrowCurved: action.shape.arrowCurved,\n arrowCurveAmount: action.shape.arrowCurveAmount,\n }\n : { ...action.shape.options };\n }\n if (action.shape.type === 'text') {\n // Handle text options change undo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement) {\n if (action.oldOptions.color) textElement.setAttribute('fill', action.oldOptions.color);\n if (action.oldOptions.font) textElement.setAttribute('font-family', action.oldOptions.font);\n if (action.oldOptions.size) textElement.setAttribute('font-size', action.oldOptions.size);\n if (action.oldOptions.align) textElement.setAttribute('text-anchor', action.oldOptions.align);\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n }\n } else if (action.shape.shapeName === 'arrow') {\n // Handle arrow options change undo\n action.shape.options = { ...action.oldOptions };\n action.shape.arrowOutlineStyle = action.oldOptions.arrowOutlineStyle;\n action.shape.arrowHeadStyle = action.oldOptions.arrowHeadStyle;\n action.shape.arrowCurved = action.oldOptions.arrowCurved;\n action.shape.arrowCurveAmount = action.oldOptions.arrowCurveAmount;\n action.shape.draw();\n } else {\n // Handle other shape options change undo\n action.shape.options = action.oldOptions;\n action.shape.draw();\n }\n redoStack.push(action);\n return;\n }\n } finally {\n refreshSelectionAfterAction();\n notifyCollaboration();\n }\n}\n\nexport function redo() {\n if (redoStack.length === 0) return;\n const action = redoStack.pop();\n try {\n if (action.type === 'frameTransform') {\n // Handle frame transformation redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.width = action.newPos.width;\n action.shape.height = action.newPos.height;\n action.shape.rotation = action.newPos.rotation;\n action.shape.frameName = action.newPos.frameName;\n \n // Restore contained shapes to their new positions\n action.containedShapes.forEach(shapeData => {\n const shape = shapeData.shape;\n shape.x = shapeData.newState.x;\n shape.y = shapeData.newState.y;\n shape.width = shapeData.newState.width;\n shape.height = shapeData.newState.height;\n shape.rotation = shapeData.newState.rotation;\n \n if (typeof shape.draw === 'function') {\n shape.draw();\n }\n });\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n action.shape.updateClipPath();\n \n undoStack.push(action);\n return;\n }\n\n \n if (action.type === 'frameAttachment') {\n // Handle frame attachment/detachment redo WITHOUT calling the methods that track undo\n if (action.action === 'attach') {\n // Redo attach: manually add shape to frame\n if (action.oldFrame) {\n // Remove from old frame\n const oldFrameIndex = action.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.oldFrame.clipGroup) {\n action.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add to new frame\n if (!action.frame.containedShapes.includes(action.shape)) {\n action.frame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frame;\n \n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else if (action.action === 'detach') {\n // Redo detach: manually remove shape from frame\n const frameIndex = action.frame.containedShapes.indexOf(action.shape);\n if (frameIndex > -1) {\n action.frame.containedShapes.splice(frameIndex, 1);\n action.shape.parentFrame = null;\n \n if (action.shape.group && action.shape.group.parentNode === action.frame.clipGroup) {\n action.frame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n if (typeof action.shape.draw === 'function') {\n action.shape.draw();\n }\n \n undoStack.push(action);\n return;\n }\n\n // Handle mode conversion redo (code \u2194 text)\n if (action.type === 'create' && action.shape.type === 'modeConvert') {\n // Redo: remove the old shape, restore the new shape\n const newShape = action.shape.newShape;\n const newElement = action.shape.newElement;\n const oldShape = action.shape.oldShape;\n const oldElement = action.shape.oldElement;\n\n // Remove old shape from DOM and shapes array\n if (oldElement && oldElement.parentNode) {\n oldElement.parentNode.removeChild(oldElement);\n }\n const oldIdx = shapes.indexOf(oldShape);\n if (oldIdx !== -1) shapes.splice(oldIdx, 1);\n\n // Restore new shape to DOM and shapes array\n if (svg && newElement) {\n svg.appendChild(newElement);\n }\n if (newShape) {\n shapes.push(newShape);\n }\n\n undoStack.push(action);\n return;\n }\n\n if (action.type === 'create') {\n if (action.frameCreation && action.shape.shapeName === 'frame') {\n const frame = action.shape;\n let defs = svg?.querySelector('defs');\n if (!defs && svg) {\n defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n svg.appendChild(defs);\n }\n if (defs && frame.clipPath && !frame.clipPath.parentNode) defs.appendChild(frame.clipPath);\n if (svg && frame.group && !frame.group.parentNode) svg.appendChild(frame.group);\n if (svg && frame.clipGroup && !frame.clipGroup.parentNode) svg.appendChild(frame.clipGroup);\n if (shapes.indexOf(frame) === -1) {\n const index = action.shapeIndex >= 0 ? Math.min(action.shapeIndex, shapes.length) : shapes.length;\n shapes.splice(index, 0, frame);\n }\n frame.containedShapes = [];\n frame.draw();\n frame.updateClipPath();\n for (const child of action.containedShapes || []) {\n if (child && shapes.includes(child)) frame.addShapeToFrame(child);\n }\n } else\n if (action.shape.type === 'text') {\n // Handle text creation redo\n if (svg) {\n svg.appendChild(action.shape.element || action.shape);\n // Add back to shapes array\n shapes.push(action.shape.element || action.shape);\n }\n }\n else if (action.shape.type === 'image') {\n // Handle image creation redo\n action.shape.restore();\n } else if (action.shape.type === 'icon') {\n // Handle icon creation redo - append the group, not the shape object\n if (svg && action.shape.group) {\n svg.appendChild(action.shape.group);\n }\n // Add back to shapes array\n if (shapes.indexOf(action.shape) === -1) {\n shapes.push(action.shape);\n }\n } else {\n // Handle other shape creation redo\n shapes.push(action.shape);\n if (svg) {\n svg.appendChild(action.shape.group);\n }\n }\n undoStack.push(action);\n return;\n}\n \n if (action.type === 'delete') {\n if (action.shape.type === 'text') {\n // Handle text deletion redo\n if ((action.shape.element || action.shape).parentNode) {\n (action.shape.element || action.shape).parentNode.removeChild(action.shape.element || action.shape);\n }\n // Remove from shapes array\n const idx = shapes.indexOf(action.shape.element || action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n \n // Clean up arrow attachments again\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Detach from the deleted text\n if (arrow.attachedToStart && arrow.attachedToStart.shape === (action.shape.element || action.shape)) {\n arrow.detachFromShape(true);\n }\n if (arrow.attachedToEnd && arrow.attachedToEnd.shape === (action.shape.element || action.shape)) {\n arrow.detachFromShape(false);\n }\n arrow.draw();\n });\n }\n }\n else if (action.shape.type === 'image') {\n // Handle image deletion redo\n action.shape.remove();\n } else {\n // Handle other shape deletion redo\n const idx = shapes.indexOf(action.shape);\n if (idx !== -1) shapes.splice(idx, 1);\n\n // Issue #24 bug #7: for a regular frame, re-orphan instead of\n // destroy() \u2014 releases children visually, detaches the frame's\n // own DOM bits, but keeps the JS object and child references\n // intact so a subsequent undo can rehydrate again.\n if (action.shape.shapeName === 'frame' && !action.shape._diagramType && action.childSnapshot) {\n for (const child of action.childSnapshot) {\n if (!child) continue;\n const el = child.group || child.element;\n if (el && svg) {\n if (action.shape.clipGroup && el.parentNode === action.shape.clipGroup) {\n action.shape.clipGroup.removeChild(el);\n }\n if (el.parentNode !== svg) svg.appendChild(el);\n }\n child.parentFrame = null;\n delete child.isBeingMovedByFrame;\n }\n action.shape.containedShapes = [];\n if (action.shape.group && action.shape.group.parentNode) action.shape.group.parentNode.removeChild(action.shape.group);\n if (action.shape.clipGroup && action.shape.clipGroup.parentNode) action.shape.clipGroup.parentNode.removeChild(action.shape.clipGroup);\n if (action.shape.clipPath && action.shape.clipPath.parentNode) action.shape.clipPath.parentNode.removeChild(action.shape.clipPath);\n } else {\n if (action.shape.group && action.shape.group.parentNode) {\n action.shape.group.parentNode.removeChild(action.shape.group);\n }\n // Diagram frame OR no snapshot \u2192 fall back to destroy().\n if (action.shape.shapeName === 'frame' && typeof action.shape.destroy === 'function') {\n action.shape.destroy();\n }\n }\n }\n undoStack.push(action);\n return;\n }\n \n if (action.type === 'transform') {\n // Handle frame attachment changes first\n if (action.frameAttachment) {\n // Use manual frame operations to avoid undo recursion\n if (action.frameAttachment.oldFrame) {\n const oldFrameIndex = action.frameAttachment.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.frameAttachment.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.oldFrame.clipGroup) {\n action.frameAttachment.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n if (action.frameAttachment.newFrame) {\n if (!action.frameAttachment.newFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.newFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.newFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.newFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n if (action.shape.type === 'text') {\n // Enhanced text transform redo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement && action.newPos.fontSize !== undefined) {\n textElement.setAttribute('font-size', action.newPos.fontSize + 'px');\n }\n \n // Restore position and rotation\n const centerX = textElement ? textElement.getBBox().x + textElement.getBBox().width / 2 : 0;\n const centerY = textElement ? textElement.getBBox().y + textElement.getBBox().height / 2 : 0;\n \n (action.shape.element || action.shape).setAttribute('transform', \n `translate(${action.newPos.x}, ${action.newPos.y}) rotate(${action.newPos.rotation}, ${centerX}, ${centerY})`\n );\n \n (action.shape.element || action.shape).setAttribute('data-x', action.newPos.x);\n (action.shape.element || action.shape).setAttribute('data-y', action.newPos.y);\n \n // Update attached arrows after text redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current text position\n arrow.updateAttachments();\n }\n });\n }\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n } else if (action.shape.type === 'image') {\n // Enhanced image transform redo\n action.shape.restore(action.newPos);\n \n // Update attached arrows after image redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current image position\n arrow.updateAttachments();\n }\n });\n }\n } else if (action.shape.shapeName === 'circle') {\n // Enhanced circle transform redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.rx = action.newPos.rx;\n action.shape.ry = action.newPos.ry;\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after circle redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current circle position\n arrow.updateAttachments();\n }\n });\n }\n } else if (action.shape.shapeName === 'line') {\n // Enhanced line transform redo with curve support\n action.shape.startPoint = { x: action.newPos.startPoint.x, y: action.newPos.startPoint.y };\n action.shape.endPoint = { x: action.newPos.endPoint.x, y: action.newPos.endPoint.y };\n \n // Restore curve state\n action.shape.isCurved = action.newPos.isCurved || false;\n if (action.newPos.controlPoint) {\n action.shape.controlPoint = { x: action.newPos.controlPoint.x, y: action.newPos.controlPoint.y };\n } else {\n action.shape.controlPoint = null;\n }\n \n // Handle frame attachment changes\n if (action.frameAttachment) {\n // Remove from old frame if it exists\n if (action.frameAttachment.oldFrame) {\n const oldFrameIndex = action.frameAttachment.oldFrame.containedShapes.indexOf(action.shape);\n if (oldFrameIndex > -1) {\n action.frameAttachment.oldFrame.containedShapes.splice(oldFrameIndex, 1);\n if (action.shape.group && action.shape.group.parentNode === action.frameAttachment.oldFrame.clipGroup) {\n action.frameAttachment.oldFrame.clipGroup.removeChild(action.shape.group);\n svg.appendChild(action.shape.group);\n }\n }\n }\n \n // Add to new frame if it exists\n if (action.frameAttachment.newFrame) {\n if (!action.frameAttachment.newFrame.containedShapes.includes(action.shape)) {\n action.frameAttachment.newFrame.containedShapes.push(action.shape);\n action.shape.parentFrame = action.frameAttachment.newFrame;\n if (action.shape.group && action.shape.group.parentNode === svg) {\n svg.removeChild(action.shape.group);\n action.frameAttachment.newFrame.clipGroup.appendChild(action.shape.group);\n }\n }\n } else {\n action.shape.parentFrame = null;\n }\n }\n \n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n }\n else if (action.shape.shapeName === 'arrow') {\n // Enhanced arrow transform redo with attachment restoration\n action.shape.startPoint = { x: action.newPos.startPoint.x, y: action.newPos.startPoint.y };\n action.shape.endPoint = { x: action.newPos.endPoint.x, y: action.newPos.endPoint.y };\n action.shape.controlPoint1 = action.newPos.controlPoint1 ? \n { x: action.newPos.controlPoint1.x, y: action.newPos.controlPoint1.y } : null;\n action.shape.controlPoint2 = action.newPos.controlPoint2 ? \n { x: action.newPos.controlPoint2.x, y: action.newPos.controlPoint2.y } : null;\n \n // Restore attachment state\n if (action.newPos.attachments) {\n action.shape.restoreAttachmentState(action.newPos.attachments);\n } else {\n // Clear attachments if none should exist\n action.shape.attachedToStart = null;\n action.shape.attachedToEnd = null;\n }\n \n action.shape.isSelected = false;\n action.shape.draw();\n \n } \n else if (action.shape.type === 'icon') {\n action.shape.restore(action.newPos);\n \n // Update attached arrows after icon redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current icon position\n arrow.updateAttachments();\n }\n });\n }\n }\n else if (action.shape.shapeName === 'freehandStroke') {\n // Handle freehand stroke transform redo\n action.shape.points = JSON.parse(JSON.stringify(action.newPos.points));\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n } else if (action.shape.shapeName === \"rectangle\") {\n // Enhanced rectangle transform redo\n action.shape.x = action.newPos.x;\n action.shape.y = action.newPos.y;\n action.shape.height = action.newPos.height;\n action.shape.width = action.newPos.width;\n action.shape.rotation = action.newPos.rotation;\n action.shape.isSelected = false;\n if (typeof action.shape.removeSelection === 'function') action.shape.removeSelection();\n action.shape.draw();\n\n // Update attached arrows after rectangle redo\n if (action.affectedArrows) {\n action.affectedArrows.forEach(arrowData => {\n const arrow = arrowData.arrow;\n // Restore arrow attachments to new state\n if (arrowData.newAttachments) {\n arrow.restoreAttachmentState(arrowData.newAttachments);\n } else {\n // If no new attachments stored, recalculate based on current rectangle position\n arrow.updateAttachments();\n }\n });\n }\n }\n undoStack.push(action);\n return;\n }\n \n if (action.type === 'optionsChange') {\n if (action.shape.type === 'text') {\n // Handle text options change redo\n const textElement = (action.shape.element || action.shape).querySelector('text');\n if (textElement) {\n if (action.newOptions.color) textElement.setAttribute('fill', action.newOptions.color);\n if (action.newOptions.font) textElement.setAttribute('font-family', action.newOptions.font);\n if (action.newOptions.size) textElement.setAttribute('font-size', action.newOptions.size);\n if (action.newOptions.align) textElement.setAttribute('text-anchor', action.newOptions.align);\n \n // Update feedback if selected\n if (selectedElement === (action.shape.element || action.shape) && updateSelectionFeedback) {\n setTimeout(updateSelectionFeedback, 0);\n }\n }\n } else if (action.shape.shapeName === 'arrow') {\n action.shape.options = { ...action.newOptions };\n action.shape.arrowOutlineStyle = action.newOptions.arrowOutlineStyle;\n action.shape.arrowHeadStyle = action.newOptions.arrowHeadStyle;\n action.shape.arrowCurved = action.newOptions.arrowCurved;\n action.shape.arrowCurveAmount = action.newOptions.arrowCurveAmount;\n action.shape.draw();\n } else {\n action.shape.options = { ...action.newOptions };\n action.shape.draw();\n }\n undoStack.push(action);\n return;\n }\n } finally {\n refreshSelectionAfterAction();\n notifyCollaboration();\n }\n}\n\n// Optional: Keyboard shortcuts\ndocument.addEventListener('keydown', (e) => {\n if ((e.ctrlKey || e.metaKey) && e.key === 'z') {\n e.preventDefault();\n undo();\n }\n if ((e.ctrlKey || e.metaKey) && (e.key === 'y' || (e.shiftKey && e.key === 'z'))) {\n e.preventDefault();\n redo();\n }\n});\n\n// Attach to buttons\ndocument.getElementById('undo')?.addEventListener('click', undo);\ndocument.getElementById('redo')?.addEventListener('click', redo);\n\n// Expose globally for plain scripts\nwindow.pushCreateAction = pushCreateAction;\nwindow.pushDeleteAction = pushDeleteAction;\nwindow.pushDeleteActionWithAttachments = pushDeleteActionWithAttachments;\nwindow.pushTransformAction = pushTransformAction;\nwindow.pushOptionsChangeAction = pushOptionsChangeAction;\nwindow.pushCreateActionWithAttachments = pushCreateActionWithAttachments;\nwindow.undo = undo;\nwindow.redo = redo;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -2,13 +2,13 @@
2
2
  import {
3
3
  calculateSnap,
4
4
  clearSnapGuides
5
- } from "./chunk-YF3TK7SC.js";
5
+ } from "./chunk-XYUFEIZR.js";
6
6
  import {
7
7
  pushCreateAction,
8
8
  pushFrameAttachmentAction,
9
9
  pushOptionsChangeAction,
10
10
  pushTransformAction
11
- } from "./chunk-U3TB4KRS.js";
11
+ } from "./chunk-6GPEWDRB.js";
12
12
 
13
13
  // src/tools/rectangleTool.js
14
14
  var isDrawingSquare = false;
@@ -516,4 +516,4 @@ export {
516
516
  handleMouseMoveRect,
517
517
  handleMouseUpRect
518
518
  };
519
- //# sourceMappingURL=chunk-4BLMNGTR.js.map
519
+ //# sourceMappingURL=chunk-7CM5XQDN.js.map
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  cleanupAttachments,
7
7
  updateAttachedArrows
8
- } from "./chunk-YF3TK7SC.js";
8
+ } from "./chunk-XYUFEIZR.js";
9
9
  import {
10
10
  pushCreateAction,
11
11
  pushDeleteAction,
12
12
  pushFrameAttachmentAction,
13
13
  pushTransformAction
14
- } from "./chunk-U3TB4KRS.js";
14
+ } from "./chunk-6GPEWDRB.js";
15
15
 
16
16
  // src/tools/iconTool.js
17
17
  var isDraggingIcon = false;
@@ -961,4 +961,4 @@ export {
961
961
  startDrag,
962
962
  stopDrag
963
963
  };
964
- //# sourceMappingURL=chunk-XFQECTTF.js.map
964
+ //# sourceMappingURL=chunk-APTOPAOY.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  updateAttachedArrows
4
- } from "./chunk-YF3TK7SC.js";
4
+ } from "./chunk-XYUFEIZR.js";
5
5
 
6
6
  // src/shapes/ImageShape.js
7
7
  var isDragging = false;
@@ -27,6 +27,8 @@ var ImageShape = class {
27
27
  }
28
28
  this.group.appendChild(this.element);
29
29
  this._aiBadge = null;
30
+ this._aiBadgeBackground = null;
31
+ this._aiBadgeLabel = null;
30
32
  this._aiBadgeObserver = null;
31
33
  if (this.isAIGenerated) this.showAIBadge();
32
34
  svg.appendChild(this.group);
@@ -36,8 +38,17 @@ var ImageShape = class {
36
38
  const ns = "http://www.w3.org/2000/svg";
37
39
  const badge = document.createElementNS(ns, "g");
38
40
  badge.setAttribute("class", "ai-image-badge");
39
- badge.setAttribute("aria-label", "AI generated image");
40
- badge.style.pointerEvents = "none";
41
+ badge.setAttribute("aria-label", "This is synthetic media generated by AI.");
42
+ badge.style.pointerEvents = "all";
43
+ badge.style.cursor = "help";
44
+ const title = document.createElementNS(ns, "title");
45
+ title.textContent = "This is synthetic media generated by AI.";
46
+ badge.appendChild(title);
47
+ badge.addEventListener("pointerenter", () => {
48
+ if (typeof window.__showToast === "function") {
49
+ window.__showToast("This is synthetic media generated by AI.", { duration: 2200 });
50
+ }
51
+ });
41
52
  const background = document.createElementNS(ns, "rect");
42
53
  background.setAttribute("width", "32");
43
54
  background.setAttribute("height", "18");
@@ -58,6 +69,8 @@ var ImageShape = class {
58
69
  badge.appendChild(label);
59
70
  this.group.appendChild(badge);
60
71
  this._aiBadge = badge;
72
+ this._aiBadgeBackground = background;
73
+ this._aiBadgeLabel = label;
61
74
  this.updateAIBadgePosition();
62
75
  if (typeof MutationObserver !== "undefined") {
63
76
  this._aiBadgeObserver = new MutationObserver(() => this.updateAIBadgePosition());
@@ -69,12 +82,38 @@ var ImageShape = class {
69
82
  }
70
83
  updateAIBadgePosition() {
71
84
  if (!this._aiBadge) return;
72
- const x = Number.isFinite(this.x) ? this.x + 6 : 6;
73
- const y = Number.isFinite(this.y) ? this.y + 6 : 6;
74
- this._aiBadge.setAttribute("transform", `translate(${x}, ${y})`);
85
+ const imageWidth = Number.isFinite(this.width) ? Math.abs(this.width) : 32;
86
+ const imageHeight = Number.isFinite(this.height) ? Math.abs(this.height) : 18;
87
+ const inset = Math.max(1, Math.min(6, imageWidth * 0.12, imageHeight * 0.12));
88
+ const x = Number.isFinite(this.x) ? this.x + inset : inset;
89
+ const y = Number.isFinite(this.y) ? this.y + inset : inset;
90
+ const availableScale = Math.min(
91
+ 1,
92
+ Math.max(0, imageWidth - inset * 2) / 32,
93
+ Math.max(0, imageHeight - inset * 2) / 18
94
+ );
95
+ const useDot = availableScale <= 0.75;
96
+ let badgeTransform;
97
+ if (useDot) {
98
+ const dotSize = Math.max(2, Math.min(8, imageWidth * 0.28, imageHeight * 0.28));
99
+ this._aiBadge.setAttribute("data-variant", "dot");
100
+ this._aiBadgeBackground?.setAttribute("width", String(dotSize));
101
+ this._aiBadgeBackground?.setAttribute("height", String(dotSize));
102
+ this._aiBadgeBackground?.setAttribute("rx", String(dotSize / 2));
103
+ this._aiBadgeLabel?.setAttribute("display", "none");
104
+ badgeTransform = `translate(${x}, ${y})`;
105
+ } else {
106
+ this._aiBadge.setAttribute("data-variant", "label");
107
+ this._aiBadgeBackground?.setAttribute("width", "32");
108
+ this._aiBadgeBackground?.setAttribute("height", "18");
109
+ this._aiBadgeBackground?.setAttribute("rx", "6");
110
+ this._aiBadgeLabel?.removeAttribute("display");
111
+ badgeTransform = `translate(${x}, ${y}) scale(${availableScale})`;
112
+ }
113
+ this._aiBadge.setAttribute("transform", badgeTransform);
75
114
  const imageTransform = this.element.getAttribute("transform");
76
115
  if (imageTransform) {
77
- this._aiBadge.setAttribute("transform", `${imageTransform} translate(${x}, ${y})`);
116
+ this._aiBadge.setAttribute("transform", `${imageTransform} ${badgeTransform}`);
78
117
  }
79
118
  }
80
119
  showUploadIndicator() {
@@ -273,4 +312,4 @@ var ImageShape = class {
273
312
  export {
274
313
  ImageShape
275
314
  };
276
- //# sourceMappingURL=chunk-EDSKEM6E.js.map
315
+ //# sourceMappingURL=chunk-ASBC5G35.js.map
@@ -0,0 +1,7 @@
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._aiBadgeBackground = null;\n this._aiBadgeLabel = 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', 'This is synthetic media generated by AI.');\n badge.style.pointerEvents = 'all';\n badge.style.cursor = 'help';\n\n const title = document.createElementNS(ns, 'title');\n title.textContent = 'This is synthetic media generated by AI.';\n badge.appendChild(title);\n\n badge.addEventListener('pointerenter', () => {\n if (typeof window.__showToast === 'function') {\n window.__showToast('This is synthetic media generated by AI.', { duration: 2200 });\n }\n });\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._aiBadgeBackground = background;\n this._aiBadgeLabel = label;\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 imageWidth = Number.isFinite(this.width) ? Math.abs(this.width) : 32;\n const imageHeight = Number.isFinite(this.height) ? Math.abs(this.height) : 18;\n const inset = Math.max(1, Math.min(6, imageWidth * 0.12, imageHeight * 0.12));\n const x = Number.isFinite(this.x) ? this.x + inset : inset;\n const y = Number.isFinite(this.y) ? this.y + inset : inset;\n const availableScale = Math.min(\n 1,\n Math.max(0, imageWidth - inset * 2) / 32,\n Math.max(0, imageHeight - inset * 2) / 18,\n );\n const useDot = availableScale <= 0.75;\n let badgeTransform;\n\n if (useDot) {\n const dotSize = Math.max(2, Math.min(8, imageWidth * 0.28, imageHeight * 0.28));\n this._aiBadge.setAttribute('data-variant', 'dot');\n this._aiBadgeBackground?.setAttribute('width', String(dotSize));\n this._aiBadgeBackground?.setAttribute('height', String(dotSize));\n this._aiBadgeBackground?.setAttribute('rx', String(dotSize / 2));\n this._aiBadgeLabel?.setAttribute('display', 'none');\n badgeTransform = `translate(${x}, ${y})`;\n } else {\n this._aiBadge.setAttribute('data-variant', 'label');\n this._aiBadgeBackground?.setAttribute('width', '32');\n this._aiBadgeBackground?.setAttribute('height', '18');\n this._aiBadgeBackground?.setAttribute('rx', '6');\n this._aiBadgeLabel?.removeAttribute('display');\n badgeTransform = `translate(${x}, ${y}) scale(${availableScale})`;\n }\n\n this._aiBadge.setAttribute('transform', badgeTransform);\n const imageTransform = this.element.getAttribute('transform');\n if (imageTransform) {\n this._aiBadge.setAttribute('transform', `${imageTransform} ${badgeTransform}`);\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
+ }
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  cleanupAttachments,
4
4
  updateAttachedArrows
5
- } from "./chunk-YF3TK7SC.js";
5
+ } from "./chunk-XYUFEIZR.js";
6
6
 
7
7
  // src/shapes/IconShape.js
8
8
  var isDragging = false;
@@ -220,4 +220,4 @@ var IconShape = class {
220
220
  export {
221
221
  IconShape
222
222
  };
223
- //# sourceMappingURL=chunk-4TAS67SL.js.map
223
+ //# sourceMappingURL=chunk-EOURRJ55.js.map
@@ -10,14 +10,14 @@ import {
10
10
  setCodeLanguage,
11
11
  updateCodeBackground,
12
12
  wrapCodeElement
13
- } from "./chunk-HFQZYCHJ.js";
13
+ } from "./chunk-M6TMN76K.js";
14
14
  import {
15
15
  registerRotationAnchor
16
16
  } from "./chunk-PAKA6HUX.js";
17
17
  import {
18
18
  cleanupAttachments,
19
19
  updateAttachedArrows
20
- } from "./chunk-YF3TK7SC.js";
20
+ } from "./chunk-XYUFEIZR.js";
21
21
  import {
22
22
  pushCreateAction,
23
23
  pushDeleteActionWithAttachments,
@@ -26,7 +26,7 @@ import {
26
26
  pushTransformAction,
27
27
  setTextReferences,
28
28
  updateSelectedElement
29
- } from "./chunk-U3TB4KRS.js";
29
+ } from "./chunk-6GPEWDRB.js";
30
30
 
31
31
  // src/tools/textTool.js
32
32
  function getThemeStroke() {
@@ -1516,4 +1516,4 @@ export {
1516
1516
  handleTextMouseUp,
1517
1517
  updateCodeToggleForShape
1518
1518
  };
1519
- //# sourceMappingURL=chunk-ETAAQUUV.js.map
1519
+ //# sourceMappingURL=chunk-GQUZPON4.js.map
@@ -22,6 +22,10 @@ var Frame = class {
22
22
  this.height = height;
23
23
  this.rotation = options.rotation || 0;
24
24
  this.frameName = options.frameName || "Frame";
25
+ this._frameType = options.frameType || null;
26
+ this._webEmbedURL = options.webEmbedURL || null;
27
+ this._webEmbedForeignObject = null;
28
+ this._webEmbedElement = null;
25
29
  this.fillStyle = options.fillStyle || "transparent";
26
30
  this.fillColor = options.fillColor || "#1e1e28";
27
31
  this.gridSize = options.gridSize || 20;
@@ -60,9 +64,9 @@ var Frame = class {
60
64
  this.updateClipPath();
61
65
  }
62
66
  draw() {
63
- while (this.group.firstChild) {
64
- this.group.removeChild(this.group.firstChild);
65
- }
67
+ Array.from(this.group.children).forEach((child) => {
68
+ if (child !== this._webEmbedForeignObject) this.group.removeChild(child);
69
+ });
66
70
  this.anchors = [];
67
71
  let defs = svg.querySelector("defs");
68
72
  if (!defs) {
@@ -117,6 +121,10 @@ var Frame = class {
117
121
  }
118
122
  this.element = frameRect;
119
123
  this.group.appendChild(this.element);
124
+ if (this._frameType === "web-embed" && this._webEmbedURL) {
125
+ this._updateWebEmbed();
126
+ this.group.appendChild(this.element);
127
+ }
120
128
  this.addFrameLabel();
121
129
  if (this._frameImageURL) {
122
130
  this.setImageFromURL(this._frameImageURL, this._frameImageFit || "cover");
@@ -157,7 +165,42 @@ var Frame = class {
157
165
  this.clipRect.removeAttribute("transform");
158
166
  }
159
167
  }
168
+ setWebEmbedURL(url) {
169
+ this._webEmbedURL = url;
170
+ this._frameType = "web-embed";
171
+ this._updateWebEmbed();
172
+ }
173
+ _updateWebEmbed() {
174
+ if (!this._webEmbedURL) return;
175
+ if (!this._webEmbedForeignObject) {
176
+ const foreign = document.createElementNS("http://www.w3.org/2000/svg", "foreignObject");
177
+ const host = document.createElementNS("http://www.w3.org/1999/xhtml", "div");
178
+ const embed = document.createElementNS("http://www.w3.org/1999/xhtml", "embed");
179
+ host.style.cssText = "width:100%;height:100%;overflow:hidden;background:#fff;border-radius:4px";
180
+ embed.setAttribute("type", "text/html");
181
+ embed.setAttribute("width", "100%");
182
+ embed.setAttribute("height", "100%");
183
+ embed.setAttribute("src", this._webEmbedURL);
184
+ embed.setAttribute("title", this.frameName || "Web embed");
185
+ host.appendChild(embed);
186
+ foreign.appendChild(host);
187
+ this._webEmbedForeignObject = foreign;
188
+ this._webEmbedElement = embed;
189
+ this.group.insertBefore(foreign, this.element || null);
190
+ } else if (this._webEmbedElement?.getAttribute("src") !== this._webEmbedURL) {
191
+ this._webEmbedElement.setAttribute("src", this._webEmbedURL);
192
+ }
193
+ const inset = 2;
194
+ this._webEmbedForeignObject.setAttribute("x", this.x + inset);
195
+ this._webEmbedForeignObject.setAttribute("y", this.y + inset);
196
+ this._webEmbedForeignObject.setAttribute("width", Math.max(0, this.width - inset * 2));
197
+ this._webEmbedForeignObject.setAttribute("height", Math.max(0, this.height - inset * 2));
198
+ if (this.rotation) {
199
+ this._webEmbedForeignObject.setAttribute("transform", `rotate(${this.rotation}, ${this.x + this.width / 2}, ${this.y + this.height / 2})`);
200
+ } else this._webEmbedForeignObject.removeAttribute("transform");
201
+ }
160
202
  addShapeToFrame(shape) {
203
+ if (this._frameType === "web-embed") return;
161
204
  if (shape && !this.containedShapes.includes(shape)) {
162
205
  const oldFrame = shape.parentFrame;
163
206
  if (typeof shapes !== "undefined" && Array.isArray(shapes)) {
@@ -207,7 +250,7 @@ var Frame = class {
207
250
  }
208
251
  // Check if a shape overlaps with this frame
209
252
  isShapeInFrame(shape) {
210
- if (!shape || shape === this) return false;
253
+ if (this._frameType === "web-embed" || !shape || shape === this) return false;
211
254
  const shapeX = shape.x || 0;
212
255
  const shapeY = shape.y || 0;
213
256
  const shapeWidth = shape.width || 0;
@@ -217,6 +260,7 @@ var Frame = class {
217
260
  return shapeCenterX >= this.x && shapeCenterX <= this.x + this.width && shapeCenterY >= this.y && shapeCenterY <= this.y + this.height;
218
261
  }
219
262
  updateContainedShapes(applyClipping = true) {
263
+ if (this._frameType === "web-embed") return;
220
264
  if (typeof shapes === "undefined" || !Array.isArray(shapes)) return;
221
265
  shapes.forEach((shape) => {
222
266
  if (shape !== this) {
@@ -1251,4 +1295,4 @@ var Frame = class {
1251
1295
  export {
1252
1296
  Frame
1253
1297
  };
1254
- //# sourceMappingURL=chunk-KVAQPCUH.js.map
1298
+ //# sourceMappingURL=chunk-K5BG5MHY.js.map