@elixpo/lixsketch 5.4.7 → 5.5.0

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 (218) hide show
  1. package/dist/react/AIRenderer-M4LMJ66J.js +1105 -0
  2. package/dist/react/AIRenderer-M4LMJ66J.js.map +7 -0
  3. package/dist/react/Arrow-BJDAXPMH.js +8 -0
  4. package/dist/react/Arrow-BJDAXPMH.js.map +7 -0
  5. package/dist/react/Circle-KPG7TKIX.js +8 -0
  6. package/dist/react/Circle-KPG7TKIX.js.map +7 -0
  7. package/dist/react/CodeShape-K4DIZAIV.js +8 -0
  8. package/dist/react/CodeShape-K4DIZAIV.js.map +7 -0
  9. package/dist/react/CopyPaste-4CKJRHJ3.js +569 -0
  10. package/dist/react/CopyPaste-4CKJRHJ3.js.map +7 -0
  11. package/dist/react/EraserTrail-PA6IQLQN.js +20 -0
  12. package/dist/react/EraserTrail-PA6IQLQN.js.map +7 -0
  13. package/dist/react/EventDispatcher-SRFH6LQZ.js +463 -0
  14. package/dist/react/EventDispatcher-SRFH6LQZ.js.map +7 -0
  15. package/dist/react/Frame-6UR5XPAX.js +10 -0
  16. package/dist/react/Frame-6UR5XPAX.js.map +7 -0
  17. package/dist/react/FreehandStroke-CK24NUT3.js +8 -0
  18. package/dist/react/FreehandStroke-CK24NUT3.js.map +7 -0
  19. package/dist/react/GraphEngine-QE5B2PMR.js +340 -0
  20. package/dist/react/GraphEngine-QE5B2PMR.js.map +7 -0
  21. package/dist/react/GraphMathParser-2WMTY4IE.js +10 -0
  22. package/dist/react/GraphMathParser-2WMTY4IE.js.map +7 -0
  23. package/dist/react/IconShape-KMIA6T2H.js +10 -0
  24. package/dist/react/IconShape-KMIA6T2H.js.map +7 -0
  25. package/dist/react/ImageShape-CHHGBXUQ.js +10 -0
  26. package/dist/react/ImageShape-CHHGBXUQ.js.map +7 -0
  27. package/dist/react/LayerOrder-XCHF4MSS.js +66 -0
  28. package/dist/react/LayerOrder-XCHF4MSS.js.map +7 -0
  29. package/dist/react/Line-2KOQEEGA.js +10 -0
  30. package/dist/react/Line-2KOQEEGA.js.map +7 -0
  31. package/dist/react/LixScriptParser-JYWJX375.js +1033 -0
  32. package/dist/react/LixScriptParser-JYWJX375.js.map +7 -0
  33. package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js +412 -0
  34. package/dist/react/MermaidFlowchartRenderer-4QBAZ5MB.js.map +7 -0
  35. package/dist/react/MermaidSequenceParser-UKG2NSZY.js +8 -0
  36. package/dist/react/MermaidSequenceParser-UKG2NSZY.js.map +7 -0
  37. package/dist/react/MermaidSequenceRenderer-HPLHY5II.js +387 -0
  38. package/dist/react/MermaidSequenceRenderer-HPLHY5II.js.map +7 -0
  39. package/dist/react/Rectangle-6FE7RN6W.js +8 -0
  40. package/dist/react/Rectangle-6FE7RN6W.js.map +7 -0
  41. package/dist/react/ResizeCode-WAMDTKSW.js +2 -0
  42. package/dist/react/ResizeCode-WAMDTKSW.js.map +7 -0
  43. package/dist/react/ResizeShapes-LKEQTITP.js +250 -0
  44. package/dist/react/ResizeShapes-LKEQTITP.js.map +7 -0
  45. package/dist/react/SceneSerializer-4U4B24JM.js +739 -0
  46. package/dist/react/SceneSerializer-4U4B24JM.js.map +7 -0
  47. package/dist/react/Selection-VVUHY5YJ.js +34 -0
  48. package/dist/react/Selection-VVUHY5YJ.js.map +7 -0
  49. package/dist/react/SketchEngine-YA4RG3KX.js +413 -0
  50. package/dist/react/SketchEngine-YA4RG3KX.js.map +7 -0
  51. package/dist/react/TextShape-54ZJ66E3.js +8 -0
  52. package/dist/react/TextShape-54ZJ66E3.js.map +7 -0
  53. package/dist/react/UndoRedo-M2JZUBKN.js +30 -0
  54. package/dist/react/UndoRedo-M2JZUBKN.js.map +7 -0
  55. package/dist/react/ZoomPan-U3TXC5AJ.js +186 -0
  56. package/dist/react/ZoomPan-U3TXC5AJ.js.map +7 -0
  57. package/dist/react/arrowTool-CWEMIRXK.js +17 -0
  58. package/dist/react/arrowTool-CWEMIRXK.js.map +7 -0
  59. package/dist/react/boxicons-5JNJQPUP.woff +0 -0
  60. package/dist/react/boxicons-6NVWQSCQ.eot +0 -0
  61. package/dist/react/boxicons-AQ5N6WP7.woff2 +0 -0
  62. package/dist/react/boxicons-GDR4JU3X.ttf +0 -0
  63. package/dist/react/boxicons-NNFHLMOR.svg +1660 -0
  64. package/dist/react/chunk-2OQXI7QB.js +564 -0
  65. package/dist/react/chunk-2OQXI7QB.js.map +7 -0
  66. package/dist/react/chunk-5OUBTHHO.js +187 -0
  67. package/dist/react/chunk-5OUBTHHO.js.map +7 -0
  68. package/dist/react/chunk-6PFXZKL2.js +628 -0
  69. package/dist/react/chunk-6PFXZKL2.js.map +7 -0
  70. package/dist/react/chunk-6SFNWGGZ.js +453 -0
  71. package/dist/react/chunk-6SFNWGGZ.js.map +7 -0
  72. package/dist/react/chunk-7TZSIR6V.js +210 -0
  73. package/dist/react/chunk-7TZSIR6V.js.map +7 -0
  74. package/dist/react/chunk-AJAZC37E.js +662 -0
  75. package/dist/react/chunk-AJAZC37E.js.map +7 -0
  76. package/dist/react/chunk-BU4D2WYQ.js +1213 -0
  77. package/dist/react/chunk-BU4D2WYQ.js.map +7 -0
  78. package/dist/react/chunk-BZE4CEBG.js +747 -0
  79. package/dist/react/chunk-BZE4CEBG.js.map +7 -0
  80. package/dist/react/chunk-CB2RANCB.js +212 -0
  81. package/dist/react/chunk-CB2RANCB.js.map +7 -0
  82. package/dist/react/chunk-DNAG7ML6.js +128 -0
  83. package/dist/react/chunk-DNAG7ML6.js.map +7 -0
  84. package/dist/react/chunk-HZWLPXFN.js +198 -0
  85. package/dist/react/chunk-HZWLPXFN.js.map +7 -0
  86. package/dist/react/chunk-I6HCCIXB.js +572 -0
  87. package/dist/react/chunk-I6HCCIXB.js.map +7 -0
  88. package/dist/react/chunk-IZ5OGWGW.js +235 -0
  89. package/dist/react/chunk-IZ5OGWGW.js.map +7 -0
  90. package/dist/react/chunk-JJCJNLNN.js +1490 -0
  91. package/dist/react/chunk-JJCJNLNN.js.map +7 -0
  92. package/dist/react/chunk-JQ3IRFDP.js +222 -0
  93. package/dist/react/chunk-JQ3IRFDP.js.map +7 -0
  94. package/dist/react/chunk-L5OARZJ7.js +1134 -0
  95. package/dist/react/chunk-L5OARZJ7.js.map +7 -0
  96. package/dist/react/chunk-LHRTXNVE.js +1600 -0
  97. package/dist/react/chunk-LHRTXNVE.js.map +7 -0
  98. package/dist/react/chunk-Q2GA4MBZ.js +1653 -0
  99. package/dist/react/chunk-Q2GA4MBZ.js.map +7 -0
  100. package/dist/react/chunk-QNSE5BAY.js +519 -0
  101. package/dist/react/chunk-QNSE5BAY.js.map +7 -0
  102. package/dist/react/chunk-QXFBG7OM.js +191 -0
  103. package/dist/react/chunk-QXFBG7OM.js.map +7 -0
  104. package/dist/react/chunk-T6ZVV5ZO.js +714 -0
  105. package/dist/react/chunk-T6ZVV5ZO.js.map +7 -0
  106. package/dist/react/chunk-URB6MY46.js +974 -0
  107. package/dist/react/chunk-URB6MY46.js.map +7 -0
  108. package/dist/react/chunk-VN62KLOC.js +931 -0
  109. package/dist/react/chunk-VN62KLOC.js.map +7 -0
  110. package/dist/react/chunk-VQVEPJSA.js +158 -0
  111. package/dist/react/chunk-VQVEPJSA.js.map +7 -0
  112. package/dist/react/chunk-XISEAGBV.js +1632 -0
  113. package/dist/react/chunk-XISEAGBV.js.map +7 -0
  114. package/dist/react/chunk-YKJUBFHE.js +575 -0
  115. package/dist/react/chunk-YKJUBFHE.js.map +7 -0
  116. package/dist/react/circleTool-NUATSEI2.js +14 -0
  117. package/dist/react/circleTool-NUATSEI2.js.map +7 -0
  118. package/dist/react/codeTool-MHCB2FNB.js +38 -0
  119. package/dist/react/codeTool-MHCB2FNB.js.map +7 -0
  120. package/dist/react/eraserTool-2GS2LQCS.js +103 -0
  121. package/dist/react/eraserTool-2GS2LQCS.js.map +7 -0
  122. package/dist/react/frameTool-PWVKKXSP.js +14 -0
  123. package/dist/react/frameTool-PWVKKXSP.js.map +7 -0
  124. package/dist/react/freehandTool-SLYGASVP.js +14 -0
  125. package/dist/react/freehandTool-SLYGASVP.js.map +7 -0
  126. package/dist/react/iconTool-GPZ7O7NH.js +18 -0
  127. package/dist/react/iconTool-GPZ7O7NH.js.map +7 -0
  128. package/dist/react/imageTool-D5R4XGEU.js +15 -0
  129. package/dist/react/imageTool-D5R4XGEU.js.map +7 -0
  130. package/dist/react/index.js +5342 -0
  131. package/dist/react/index.js.map +7 -0
  132. package/dist/react/laserTool-XVMV63AV.js +239 -0
  133. package/dist/react/laserTool-XVMV63AV.js.map +7 -0
  134. package/dist/react/lineTool-WNI5EMZ5.js +14 -0
  135. package/dist/react/lineTool-WNI5EMZ5.js.map +7 -0
  136. package/dist/react/lixCode-OJMVUXXI.ttf +0 -0
  137. package/dist/react/lixDefault-JEAPAUJL.ttf +0 -0
  138. package/dist/react/lixFancy-BPXYM5CQ.ttf +0 -0
  139. package/dist/react/lixFont-CPKEUDVM.woff2 +0 -0
  140. package/dist/react/rectangleTool-U7DZ6ZTA.js +14 -0
  141. package/dist/react/rectangleTool-U7DZ6ZTA.js.map +7 -0
  142. package/dist/react/styles.css +6627 -0
  143. package/dist/react/textTool-M7S6F3VC.js +21 -0
  144. package/dist/react/textTool-M7S6F3VC.js.map +7 -0
  145. package/package.json +39 -5
  146. package/src/EngineShortcuts.js +83 -27
  147. package/src/core/AIRenderer.js +30 -18
  148. package/src/core/GraphEngine.js +64 -41
  149. package/src/core/MermaidFlowchartRenderer.js +153 -88
  150. package/src/core/MermaidSequenceRenderer.js +168 -93
  151. package/src/core/SceneSerializer.js +86 -2
  152. package/src/core/Selection.js +119 -19
  153. package/src/core/UndoRedo.js +82 -15
  154. package/src/core/ZoomPan.js +15 -5
  155. package/src/index.js +14 -1
  156. package/src/react/LixSketchCanvas.jsx +347 -0
  157. package/src/react/components/AppMenu.jsx +475 -0
  158. package/src/react/components/Footer.jsx +85 -0
  159. package/src/react/components/Toolbar.jsx +140 -0
  160. package/src/react/components/canvas/CanvasLoadingOverlay.jsx +76 -0
  161. package/src/react/components/canvas/ContextMenu.jsx +466 -0
  162. package/src/react/components/canvas/FindBar.jsx +177 -0
  163. package/src/react/components/canvas/ImageSourcePicker.jsx +133 -0
  164. package/src/react/components/canvas/MultiSelectActions.jsx +120 -0
  165. package/src/react/components/canvas/SVGCanvas.jsx +145 -0
  166. package/src/react/components/canvas/SaveStatusIndicator.jsx +29 -0
  167. package/src/react/components/modals/CanvasPropertiesModal.jsx +358 -0
  168. package/src/react/components/modals/CommandPalette.jsx +307 -0
  169. package/src/react/components/modals/ExportImageModal.jsx +287 -0
  170. package/src/react/components/modals/GraphModal.jsx +174 -0
  171. package/src/react/components/modals/HelpModal.jsx +208 -0
  172. package/src/react/components/modals/LixScriptModal.jsx +130 -0
  173. package/src/react/components/modals/ShortcutsModal.jsx +125 -0
  174. package/src/react/components/sidebars/ArrowSidebar.jsx +173 -0
  175. package/src/react/components/sidebars/CircleSidebar.jsx +134 -0
  176. package/src/react/components/sidebars/FrameSidebar.jsx +263 -0
  177. package/src/react/components/sidebars/IconSidebar.jsx +279 -0
  178. package/src/react/components/sidebars/ImageSidebar.jsx +69 -0
  179. package/src/react/components/sidebars/LineSidebar.jsx +109 -0
  180. package/src/react/components/sidebars/PaintbrushSidebar.jsx +119 -0
  181. package/src/react/components/sidebars/RectangleSidebar.jsx +165 -0
  182. package/src/react/components/sidebars/ShapeSidebar.jsx +130 -0
  183. package/src/react/components/sidebars/TextSidebar.jsx +174 -0
  184. package/src/react/hooks/inertStores.js +58 -0
  185. package/src/react/hooks/useSketchEngine.js +76 -0
  186. package/src/react/hooks/useTranslation.js +92 -0
  187. package/src/react/index.js +41 -0
  188. package/src/react/store/useSketchStore.js +234 -0
  189. package/src/react/store/useUIStore.js +196 -0
  190. package/src/react/styles/arrowSidebar.css +263 -0
  191. package/src/react/styles/canvasStroke.css +47 -0
  192. package/src/react/styles/canvasTools.css +769 -0
  193. package/src/react/styles/circleSidebar.css +206 -0
  194. package/src/react/styles/fonts/fonts.css +29 -0
  195. package/src/react/styles/fonts/lixCode.ttf +0 -0
  196. package/src/react/styles/fonts/lixDefault.ttf +0 -0
  197. package/src/react/styles/fonts/lixDocs.ttf +0 -0
  198. package/src/react/styles/fonts/lixFancy.ttf +0 -0
  199. package/src/react/styles/fonts/lixFont.woff2 +0 -0
  200. package/src/react/styles/lineSidebar.css +207 -0
  201. package/src/react/styles/paintbrushSidebar.css +247 -0
  202. package/src/react/styles/squareSidebar.css +206 -0
  203. package/src/react/styles/writeText.css +149 -0
  204. package/src/react/styles.css +175 -0
  205. package/src/react/toolsEnum.js +20 -0
  206. package/src/react/utils/toast.js +18 -0
  207. package/src/shapes/Frame.js +7 -1
  208. package/src/shapes/Line.js +11 -5
  209. package/src/tools/arrowTool.js +30 -4
  210. package/src/tools/circleTool.js +33 -9
  211. package/src/tools/codeTool.js +5 -3
  212. package/src/tools/frameTool.js +47 -7
  213. package/src/tools/freehandTool.js +12 -4
  214. package/src/tools/iconTool.js +7 -1
  215. package/src/tools/imageTool.js +7 -1
  216. package/src/tools/lineTool.js +27 -3
  217. package/src/tools/rectangleTool.js +45 -8
  218. package/src/tools/textTool.js +23 -6
@@ -0,0 +1,7 @@
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\n// ============================================================\n// SERIALIZE a single shape to plain data\n// ============================================================\nfunction serializeShape(shape) {\n const base = {\n shapeID: shape.shapeID,\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 };\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 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 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\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 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 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\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}\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
+ }
@@ -0,0 +1,34 @@
1
+ "use client";
2
+ import {
3
+ clearAllSelections,
4
+ createMultiSelectionControls,
5
+ handleMultiSelectionMouseDown,
6
+ handleMultiSelectionMouseMove,
7
+ handleMultiSelectionMouseUp,
8
+ isDraggingMultiSelection,
9
+ isMultiSelecting,
10
+ isPointInMultiSelection,
11
+ moveSelectedShapes,
12
+ multiSelection,
13
+ removeMultiSelectionControls,
14
+ removeMultiSelectionRect,
15
+ selectShapesInRect
16
+ } from "./chunk-Q2GA4MBZ.js";
17
+ import "./chunk-BZE4CEBG.js";
18
+ import "./chunk-L5OARZJ7.js";
19
+ export {
20
+ clearAllSelections,
21
+ createMultiSelectionControls,
22
+ handleMultiSelectionMouseDown,
23
+ handleMultiSelectionMouseMove,
24
+ handleMultiSelectionMouseUp,
25
+ isDraggingMultiSelection,
26
+ isMultiSelecting,
27
+ isPointInMultiSelection,
28
+ moveSelectedShapes,
29
+ multiSelection,
30
+ removeMultiSelectionControls,
31
+ removeMultiSelectionRect,
32
+ selectShapesInRect
33
+ };
34
+ //# sourceMappingURL=Selection-VVUHY5YJ.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,413 @@
1
+ "use client";
2
+
3
+ // src/SketchEngine.js
4
+ import rough from "roughjs";
5
+ var SketchEngine = class {
6
+ constructor(svgElement, options = {}) {
7
+ if (!svgElement || svgElement.tagName !== "svg") {
8
+ throw new Error("SketchEngine requires an SVG element");
9
+ }
10
+ this.svg = svgElement;
11
+ this.svg.style.touchAction = "none";
12
+ this.options = {
13
+ initialZoom: 1,
14
+ minZoom: 0.4,
15
+ maxZoom: 30,
16
+ ...options
17
+ };
18
+ this.onEvent = options.onEvent || (() => {
19
+ });
20
+ this.scene = null;
21
+ this.shapes = null;
22
+ this._modules = {};
23
+ this._initialized = false;
24
+ }
25
+ /**
26
+ * Emit an event to the consumer callback.
27
+ * @param {string} type - Event type (e.g. 'sidebar:select', 'zoom:change')
28
+ * @param {*} data - Event payload
29
+ */
30
+ emit(type, data) {
31
+ try {
32
+ this.onEvent(type, data);
33
+ } catch (e) {
34
+ console.warn("[SketchEngine] onEvent error:", e);
35
+ }
36
+ }
37
+ /**
38
+ * Set up all the global variables that the tool/shape modules depend on.
39
+ * Must be called BEFORE any module imports.
40
+ */
41
+ _initGlobals() {
42
+ window.svg = this.svg;
43
+ window.freehandCanvas = this.svg;
44
+ window.rough = rough;
45
+ window.roughCanvas = rough.svg(this.svg);
46
+ window.roughGenerator = window.roughCanvas.generator;
47
+ window.shapes = window.shapes || [];
48
+ window.currentShape = window.currentShape || null;
49
+ window.lastMousePos = window.lastMousePos || null;
50
+ window.currentZoom = this.options.initialZoom;
51
+ window.minScale = this.options.minZoom;
52
+ window.maxScale = this.options.maxZoom;
53
+ window.minZoom = this.options.minZoom;
54
+ window.maxZoom = this.options.maxZoom;
55
+ window.currentViewBox = window.currentViewBox || {
56
+ x: 0,
57
+ y: 0,
58
+ width: window.innerWidth,
59
+ height: window.innerHeight
60
+ };
61
+ window.isPaintToolActive = false;
62
+ window.isTextToolActive = false;
63
+ window.isCircleToolActive = false;
64
+ window.isSquareToolActive = false;
65
+ window.isLaserToolActive = false;
66
+ window.isEraserToolActive = false;
67
+ window.isImageToolActive = false;
68
+ window.isArrowToolActive = false;
69
+ window.isLineToolActive = false;
70
+ window.isSelectionToolActive = true;
71
+ window.isPanningToolActive = false;
72
+ window.isFrameToolActive = false;
73
+ window.isIconToolActive = false;
74
+ window.isCodeToolActive = false;
75
+ window.isTextInCodeMode = false;
76
+ window.isPanning = false;
77
+ window.panStart = null;
78
+ window.startCanvasX = 0;
79
+ window.startCanvasY = 0;
80
+ window.currentMatrix = new DOMMatrix();
81
+ window.currentTranslation = { x: 0, y: 0 };
82
+ window.ACTION_CREATE = "create";
83
+ window.ACTION_DELETE = "delete";
84
+ window.ACTION_MODIFY = "modify";
85
+ window.ACTION_PASTE = "paste";
86
+ window.historyStack = window.historyStack || [];
87
+ window.redoStack = window.redoStack || [];
88
+ const dummyEl = document.createElement("div");
89
+ dummyEl.classList.add("hidden");
90
+ window.paintBrushSideBar = document.getElementById("paintBrushToolBar") || dummyEl;
91
+ window.lineSideBar = document.getElementById("lineSideBar") || dummyEl;
92
+ window.squareSideBar = document.getElementById("squareSideBar") || dummyEl;
93
+ window.circleSideBar = document.getElementById("circleSideBar") || dummyEl;
94
+ window.arrowSideBar = document.getElementById("arrowSideBar") || dummyEl;
95
+ window.textSideBar = document.getElementById("textToolBar") || dummyEl;
96
+ window.frameSideBar = document.getElementById("frameSideBar") || dummyEl;
97
+ window.zoomInBtn = document.getElementById("zoomIn") || dummyEl;
98
+ window.zoomOutBtn = document.getElementById("zoomOut") || dummyEl;
99
+ window.zoomPercentSpan = document.getElementById("zoomPercent") || dummyEl;
100
+ window.container = document.querySelector(".container") || document.body;
101
+ const engine = this;
102
+ window.disableAllSideBars = function() {
103
+ [
104
+ window.paintBrushSideBar,
105
+ window.lineSideBar,
106
+ window.squareSideBar,
107
+ window.circleSideBar,
108
+ window.arrowSideBar,
109
+ window.textSideBar,
110
+ window.frameSideBar
111
+ ].forEach((el) => {
112
+ if (el) el.classList.add("hidden");
113
+ });
114
+ engine.emit("sidebar:clear");
115
+ if (window.__sketchStoreApi) {
116
+ window.__sketchStoreApi.clearSelectedShapeSidebar();
117
+ }
118
+ };
119
+ window.toolExtraPopup = window.toolExtraPopup || function() {
120
+ };
121
+ window.updateUndoRedoButtons = window.updateUndoRedoButtons || function() {
122
+ };
123
+ window.__showSidebarForShape = function(shapeName) {
124
+ const sidebarMap = {
125
+ "rectangle": "rectangle",
126
+ "circle": "circle",
127
+ "arrow": "arrow",
128
+ "line": "line",
129
+ "freehandStroke": "paintbrush",
130
+ "text": "text",
131
+ "code": "text",
132
+ "frame": "frame",
133
+ "image": "image"
134
+ };
135
+ const sidebar = sidebarMap[shapeName];
136
+ engine.emit("sidebar:select", { sidebar, shapeName });
137
+ if (sidebar && window.__sketchStoreApi) {
138
+ window.__sketchStoreApi.setSelectedShapeSidebar(sidebar);
139
+ }
140
+ window.__selectedShapeIsCode = shapeName === "code";
141
+ if (window.__onCodeModeChanged) window.__onCodeModeChanged(shapeName === "code");
142
+ };
143
+ }
144
+ /**
145
+ * Initialize engine: set globals first, then import modules.
146
+ */
147
+ async init() {
148
+ if (this._initialized) return;
149
+ this._initGlobals();
150
+ try {
151
+ const [
152
+ { Rectangle },
153
+ { Circle },
154
+ { Arrow },
155
+ { Line },
156
+ { TextShape },
157
+ { CodeShape },
158
+ { ImageShape },
159
+ { IconShape },
160
+ { Frame },
161
+ { FreehandStroke }
162
+ ] = await Promise.all([
163
+ import("./Rectangle-6FE7RN6W.js"),
164
+ import("./Circle-KPG7TKIX.js"),
165
+ import("./Arrow-BJDAXPMH.js"),
166
+ import("./Line-2KOQEEGA.js"),
167
+ import("./TextShape-54ZJ66E3.js"),
168
+ import("./CodeShape-K4DIZAIV.js"),
169
+ import("./ImageShape-CHHGBXUQ.js"),
170
+ import("./IconShape-KMIA6T2H.js"),
171
+ import("./Frame-6UR5XPAX.js"),
172
+ import("./FreehandStroke-CK24NUT3.js")
173
+ ]);
174
+ window.Rectangle = Rectangle;
175
+ window.Circle = Circle;
176
+ window.Arrow = Arrow;
177
+ window.Line = Line;
178
+ window.TextShape = TextShape;
179
+ window.CodeShape = CodeShape;
180
+ window.ImageShape = ImageShape;
181
+ window.IconShape = IconShape;
182
+ window.Frame = Frame;
183
+ window.FreehandStroke = FreehandStroke;
184
+ this._modules.shapes = {
185
+ Rectangle,
186
+ Circle,
187
+ Arrow,
188
+ Line,
189
+ TextShape,
190
+ CodeShape,
191
+ ImageShape,
192
+ IconShape,
193
+ Frame,
194
+ FreehandStroke
195
+ };
196
+ const [
197
+ rectangleTool,
198
+ circleTool,
199
+ arrowTool,
200
+ lineTool,
201
+ textTool,
202
+ codeTool,
203
+ imageTool,
204
+ iconTool,
205
+ frameTool,
206
+ freehandTool
207
+ ] = await Promise.all([
208
+ import("./rectangleTool-U7DZ6ZTA.js"),
209
+ import("./circleTool-NUATSEI2.js"),
210
+ import("./arrowTool-CWEMIRXK.js"),
211
+ import("./lineTool-WNI5EMZ5.js"),
212
+ import("./textTool-M7S6F3VC.js"),
213
+ import("./codeTool-MHCB2FNB.js"),
214
+ import("./imageTool-D5R4XGEU.js"),
215
+ import("./iconTool-GPZ7O7NH.js"),
216
+ import("./frameTool-PWVKKXSP.js"),
217
+ import("./freehandTool-SLYGASVP.js")
218
+ ]);
219
+ this._modules.tools = {
220
+ rectangleTool,
221
+ circleTool,
222
+ arrowTool,
223
+ lineTool,
224
+ textTool,
225
+ codeTool,
226
+ imageTool,
227
+ iconTool,
228
+ frameTool,
229
+ freehandTool
230
+ };
231
+ const [
232
+ eventDispatcher,
233
+ undoRedo,
234
+ selection,
235
+ zoomPan,
236
+ copyPaste,
237
+ eraserTrail,
238
+ resizeShapes,
239
+ resizeCode
240
+ ] = await Promise.all([
241
+ import("./EventDispatcher-SRFH6LQZ.js"),
242
+ import("./UndoRedo-M2JZUBKN.js"),
243
+ import("./Selection-VVUHY5YJ.js"),
244
+ import("./ZoomPan-U3TXC5AJ.js"),
245
+ import("./CopyPaste-4CKJRHJ3.js"),
246
+ import("./EraserTrail-PA6IQLQN.js"),
247
+ import("./ResizeShapes-LKEQTITP.js"),
248
+ import("./ResizeCode-WAMDTKSW.js")
249
+ ]);
250
+ this._modules.core = {
251
+ eventDispatcher,
252
+ undoRedo,
253
+ selection,
254
+ zoomPan,
255
+ copyPaste,
256
+ eraserTrail,
257
+ resizeShapes,
258
+ resizeCode
259
+ };
260
+ if (eventDispatcher.initEventDispatcher) {
261
+ eventDispatcher.initEventDispatcher(this.svg);
262
+ }
263
+ await Promise.all([
264
+ import("./eraserTool-2GS2LQCS.js"),
265
+ import("./laserTool-XVMV63AV.js")
266
+ ]);
267
+ if (undoRedo.undo) window.undo = undoRedo.undo;
268
+ if (undoRedo.redo) window.redo = undoRedo.redo;
269
+ if (undoRedo.pushCreateAction) window.pushCreateAction = undoRedo.pushCreateAction;
270
+ if (undoRedo.pushDeleteAction) window.pushDeleteAction = undoRedo.pushDeleteAction;
271
+ if (selection.multiSelection) window.multiSelection = selection.multiSelection;
272
+ if (selection.clearAllSelections) window.clearAllSelections = selection.clearAllSelections;
273
+ if (copyPaste.initCopyPaste) copyPaste.initCopyPaste();
274
+ const aiRenderer = await import("./AIRenderer-M4LMJ66J.js");
275
+ if (aiRenderer.initAIRenderer) aiRenderer.initAIRenderer();
276
+ const graphEngine = await import("./GraphEngine-QE5B2PMR.js");
277
+ if (graphEngine.initGraphEngine) graphEngine.initGraphEngine();
278
+ const sceneSerializer = await import("./SceneSerializer-4U4B24JM.js");
279
+ if (sceneSerializer.initSceneSerializer) sceneSerializer.initSceneSerializer();
280
+ const layerOrder = await import("./LayerOrder-XCHF4MSS.js");
281
+ if (layerOrder.initLayerOrder) layerOrder.initLayerOrder();
282
+ const lixScript = await import("./LixScriptParser-JYWJX375.js");
283
+ if (lixScript.initLixScriptBridge) lixScript.initLixScriptBridge();
284
+ this.scene = window.__sceneSerializer || {
285
+ save: sceneSerializer.saveScene,
286
+ load: sceneSerializer.loadScene,
287
+ download: sceneSerializer.downloadScene,
288
+ upload: sceneSerializer.uploadScene,
289
+ exportPNG: sceneSerializer.exportAsPNG,
290
+ exportPDF: sceneSerializer.exportAsPDF,
291
+ copyAsPNG: sceneSerializer.copyAsPNG,
292
+ copyAsSVG: sceneSerializer.copyAsSVG,
293
+ reset: sceneSerializer.resetCanvas,
294
+ findText: sceneSerializer.findTextOnCanvas
295
+ };
296
+ this.shapes = window.shapes;
297
+ this.undo = undoRedo.undo || (() => {
298
+ });
299
+ this.redo = undoRedo.redo || (() => {
300
+ });
301
+ this.lixscript = {
302
+ parse: lixScript.parseLixScript || (() => null),
303
+ execute: lixScript.executeLixScript || (lixScript.parseLixScript ? (code) => {
304
+ const parsed = lixScript.parseLixScript(code);
305
+ if (parsed && lixScript.resolveShapeRefs) lixScript.resolveShapeRefs(parsed);
306
+ return parsed;
307
+ } : () => null)
308
+ };
309
+ this._modules.sceneSerializer = sceneSerializer;
310
+ this._modules.lixScript = lixScript;
311
+ this._initialized = true;
312
+ console.log("[SketchEngine] Initialized successfully");
313
+ } catch (err) {
314
+ console.error("[SketchEngine] Initialization failed:", err);
315
+ throw err;
316
+ }
317
+ }
318
+ /**
319
+ * Sync tool flags from Zustand activeTool value.
320
+ */
321
+ setActiveTool(toolName) {
322
+ if (window.currentShape && typeof window.currentShape.removeSelection === "function") {
323
+ window.currentShape.removeSelection();
324
+ window.currentShape = null;
325
+ }
326
+ if (typeof window.clearAllSelections === "function") {
327
+ window.clearAllSelections();
328
+ }
329
+ if (typeof window.disableAllSideBars === "function") {
330
+ window.disableAllSideBars();
331
+ }
332
+ if (typeof window.forceCleanupEraserTrail === "function") {
333
+ window.forceCleanupEraserTrail();
334
+ }
335
+ if (typeof window.__cleanupIconTool === "function") {
336
+ window.__cleanupIconTool();
337
+ }
338
+ window.isPaintToolActive = false;
339
+ window.isSquareToolActive = false;
340
+ window.isCircleToolActive = false;
341
+ window.isArrowToolActive = false;
342
+ window.isTextToolActive = false;
343
+ window.isLaserToolActive = false;
344
+ window.isLineToolActive = false;
345
+ window.isEraserToolActive = false;
346
+ window.isSelectionToolActive = false;
347
+ window.isImageToolActive = false;
348
+ window.isPanningToolActive = false;
349
+ window.isFrameToolActive = false;
350
+ window.isIconToolActive = false;
351
+ window.isCodeToolActive = false;
352
+ const flagMap = {
353
+ select: "isSelectionToolActive",
354
+ pan: "isPanningToolActive",
355
+ rectangle: "isSquareToolActive",
356
+ circle: "isCircleToolActive",
357
+ line: "isLineToolActive",
358
+ arrow: "isArrowToolActive",
359
+ freehand: "isPaintToolActive",
360
+ text: "isTextToolActive",
361
+ code: "isCodeToolActive",
362
+ eraser: "isEraserToolActive",
363
+ laser: "isLaserToolActive",
364
+ image: "isImageToolActive",
365
+ frame: "isFrameToolActive",
366
+ icon: "isIconToolActive"
367
+ };
368
+ const flag = flagMap[toolName];
369
+ if (flag) window[flag] = true;
370
+ if (toolName === "text" && window.isTextInCodeMode) {
371
+ window.isCodeToolActive = true;
372
+ }
373
+ if (toolName === "image" && window.__showImageSourcePicker) {
374
+ window.__showImageSourcePicker();
375
+ }
376
+ const cursorMap = {
377
+ select: "default",
378
+ pan: "grab",
379
+ rectangle: "crosshair",
380
+ circle: "crosshair",
381
+ line: "crosshair",
382
+ arrow: "crosshair",
383
+ freehand: "crosshair",
384
+ text: "crosshair",
385
+ code: "crosshair",
386
+ eraser: "crosshair",
387
+ laser: "crosshair",
388
+ image: "crosshair",
389
+ frame: "crosshair",
390
+ icon: "crosshair"
391
+ };
392
+ if (this.svg) {
393
+ this.svg.style.cursor = cursorMap[toolName] || "default";
394
+ }
395
+ }
396
+ cleanup() {
397
+ if (this._modules.core?.eventDispatcher?.cleanupEventDispatcher) {
398
+ this._modules.core.eventDispatcher.cleanupEventDispatcher();
399
+ }
400
+ window.shapes = [];
401
+ window.currentShape = null;
402
+ window.lastMousePos = null;
403
+ this._modules = {};
404
+ this._initialized = false;
405
+ console.log("[SketchEngine] Cleaned up");
406
+ }
407
+ };
408
+ var SketchEngine_default = SketchEngine;
409
+ export {
410
+ SketchEngine,
411
+ SketchEngine_default as default
412
+ };
413
+ //# sourceMappingURL=SketchEngine-YA4RG3KX.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/SketchEngine.js"],
4
+ "sourcesContent": ["/* eslint-disable */\n/**\n * SketchEngine - Main engine entry point\n *\n * Initializes the SVG canvas, sets up global state (including RoughJS from npm),\n * then dynamically imports all tool and shape modules.\n *\n * IMPORTANT: All globals must be set BEFORE importing modules, because many\n * modules run code at the top level (e.g. `const rc = rough.svg(svg)`) that\n * depends on these globals existing.\n */\n\nimport rough from 'roughjs';\n\nclass SketchEngine {\n constructor(svgElement, options = {}) {\n if (!svgElement || svgElement.tagName !== 'svg') {\n throw new Error('SketchEngine requires an SVG element');\n }\n\n this.svg = svgElement;\n // Prevent default touch scrolling/gestures on the canvas to allow for custom pointer events\n this.svg.style.touchAction = 'none';\n\n this.options = {\n initialZoom: 1,\n minZoom: 0.4,\n maxZoom: 30,\n ...options\n };\n\n // Event callback for framework consumers (React, Vue, vanilla, VS Code, etc.)\n this.onEvent = options.onEvent || (() => {});\n\n // Public API surfaces (populated after init)\n this.scene = null;\n this.shapes = null;\n\n this._modules = {};\n this._initialized = false;\n }\n\n /**\n * Emit an event to the consumer callback.\n * @param {string} type - Event type (e.g. 'sidebar:select', 'zoom:change')\n * @param {*} data - Event payload\n */\n emit(type, data) {\n try { this.onEvent(type, data); } catch (e) { console.warn('[SketchEngine] onEvent error:', e); }\n }\n\n /**\n * Set up all the global variables that the tool/shape modules depend on.\n * Must be called BEFORE any module imports.\n */\n _initGlobals() {\n // Core SVG reference\n window.svg = this.svg;\n window.freehandCanvas = this.svg;\n\n // RoughJS from npm\n window.rough = rough;\n window.roughCanvas = rough.svg(this.svg);\n window.roughGenerator = window.roughCanvas.generator;\n\n // Shape storage\n window.shapes = window.shapes || [];\n window.currentShape = window.currentShape || null;\n window.lastMousePos = window.lastMousePos || null;\n\n // Zoom state\n window.currentZoom = this.options.initialZoom;\n window.minScale = this.options.minZoom;\n window.maxScale = this.options.maxZoom;\n window.minZoom = this.options.minZoom;\n window.maxZoom = this.options.maxZoom;\n\n // ViewBox state\n window.currentViewBox = window.currentViewBox || {\n x: 0, y: 0,\n width: window.innerWidth,\n height: window.innerHeight\n };\n\n // Tool activation flags\n window.isPaintToolActive = false;\n window.isTextToolActive = false;\n window.isCircleToolActive = false;\n window.isSquareToolActive = false;\n window.isLaserToolActive = false;\n window.isEraserToolActive = false;\n window.isImageToolActive = false;\n window.isArrowToolActive = false;\n window.isLineToolActive = false;\n window.isSelectionToolActive = true;\n window.isPanningToolActive = false;\n window.isFrameToolActive = false;\n window.isIconToolActive = false;\n window.isCodeToolActive = false;\n window.isTextInCodeMode = false;\n\n // Pan state\n window.isPanning = false;\n window.panStart = null;\n window.startCanvasX = 0;\n window.startCanvasY = 0;\n\n // Transform state\n window.currentMatrix = new DOMMatrix();\n window.currentTranslation = { x: 0, y: 0 };\n\n // Action type constants\n window.ACTION_CREATE = 'create';\n window.ACTION_DELETE = 'delete';\n window.ACTION_MODIFY = 'modify';\n window.ACTION_PASTE = 'paste';\n\n // History stacks\n window.historyStack = window.historyStack || [];\n window.redoStack = window.redoStack || [];\n\n // Sidebar element stubs \u2014 React sidebars handle UI, but legacy code\n // queries these at top level. Provide dummy elements so it doesn't crash.\n const dummyEl = document.createElement('div');\n dummyEl.classList.add('hidden');\n window.paintBrushSideBar = document.getElementById('paintBrushToolBar') || dummyEl;\n window.lineSideBar = document.getElementById('lineSideBar') || dummyEl;\n window.squareSideBar = document.getElementById('squareSideBar') || dummyEl;\n window.circleSideBar = document.getElementById('circleSideBar') || dummyEl;\n window.arrowSideBar = document.getElementById('arrowSideBar') || dummyEl;\n window.textSideBar = document.getElementById('textToolBar') || dummyEl;\n window.frameSideBar = document.getElementById('frameSideBar') || dummyEl;\n\n // Zoom control element refs\n window.zoomInBtn = document.getElementById('zoomIn') || dummyEl;\n window.zoomOutBtn = document.getElementById('zoomOut') || dummyEl;\n window.zoomPercentSpan = document.getElementById('zoomPercent') || dummyEl;\n\n // Container\n window.container = document.querySelector('.container') || document.body;\n\n // Sidebar control \u2014 bridge legacy code to consumer UI\n const engine = this;\n window.disableAllSideBars = function() {\n // Hide all legacy sidebar elements\n [window.paintBrushSideBar, window.lineSideBar, window.squareSideBar,\n window.circleSideBar, window.arrowSideBar, window.textSideBar, window.frameSideBar\n ].forEach(el => { if (el) el.classList.add('hidden'); });\n // Notify consumer via onEvent + legacy bridge\n engine.emit('sidebar:clear');\n if (window.__sketchStoreApi) {\n window.__sketchStoreApi.clearSelectedShapeSidebar();\n }\n };\n\n // toolExtraPopup \u2014 legacy UI function, no-op in React\n window.toolExtraPopup = window.toolExtraPopup || function() {};\n\n // updateUndoRedoButtons \u2014 legacy UI function, no-op in React\n window.updateUndoRedoButtons = window.updateUndoRedoButtons || function() {};\n\n // Bridge for shape selection -> consumer UI\n // Maps shape.shapeName to the sidebar key\n window.__showSidebarForShape = function(shapeName) {\n const sidebarMap = {\n 'rectangle': 'rectangle',\n 'circle': 'circle',\n 'arrow': 'arrow',\n 'line': 'line',\n 'freehandStroke': 'paintbrush',\n 'text': 'text',\n 'code': 'text',\n 'frame': 'frame',\n 'image': 'image',\n };\n const sidebar = sidebarMap[shapeName];\n // Emit to consumer callback\n engine.emit('sidebar:select', { sidebar, shapeName });\n // Legacy bridge for React\n if (sidebar && window.__sketchStoreApi) {\n window.__sketchStoreApi.setSelectedShapeSidebar(sidebar);\n }\n window.__selectedShapeIsCode = (shapeName === 'code');\n if (window.__onCodeModeChanged) window.__onCodeModeChanged(shapeName === 'code');\n };\n }\n\n /**\n * Initialize engine: set globals first, then import modules.\n */\n async init() {\n if (this._initialized) return;\n\n // CRITICAL: Set up ALL globals BEFORE importing modules\n this._initGlobals();\n\n try {\n // Import shape classes first\n const [\n { Rectangle },\n { Circle },\n { Arrow },\n { Line },\n { TextShape },\n { CodeShape },\n { ImageShape },\n { IconShape },\n { Frame },\n { FreehandStroke }\n ] = await Promise.all([\n import('./shapes/Rectangle.js'),\n import('./shapes/Circle.js'),\n import('./shapes/Arrow.js'),\n import('./shapes/Line.js'),\n import('./shapes/TextShape.js'),\n import('./shapes/CodeShape.js'),\n import('./shapes/ImageShape.js'),\n import('./shapes/IconShape.js'),\n import('./shapes/Frame.js'),\n import('./shapes/FreehandStroke.js')\n ]);\n\n // Expose shape classes globally\n window.Rectangle = Rectangle;\n window.Circle = Circle;\n window.Arrow = Arrow;\n window.Line = Line;\n window.TextShape = TextShape;\n window.CodeShape = CodeShape;\n window.ImageShape = ImageShape;\n window.IconShape = IconShape;\n window.Frame = Frame;\n window.FreehandStroke = FreehandStroke;\n\n this._modules.shapes = {\n Rectangle, Circle, Arrow, Line,\n TextShape, CodeShape, ImageShape, IconShape,\n Frame, FreehandStroke\n };\n\n // Import tool handlers (they run top-level code that reads globals)\n const [\n rectangleTool, circleTool, arrowTool, lineTool,\n textTool, codeTool, imageTool, iconTool,\n frameTool, freehandTool\n ] = await Promise.all([\n import('./tools/rectangleTool.js'),\n import('./tools/circleTool.js'),\n import('./tools/arrowTool.js'),\n import('./tools/lineTool.js'),\n import('./tools/textTool.js'),\n import('./tools/codeTool.js'),\n import('./tools/imageTool.js'),\n import('./tools/iconTool.js'),\n import('./tools/frameTool.js'),\n import('./tools/freehandTool.js')\n ]);\n\n this._modules.tools = {\n rectangleTool, circleTool, arrowTool, lineTool,\n textTool, codeTool, imageTool, iconTool,\n frameTool, freehandTool\n };\n\n // Import core modules (EventDispatcher attaches SVG listeners at top level)\n const [\n eventDispatcher, undoRedo, selection,\n zoomPan, copyPaste, eraserTrail,\n resizeShapes, resizeCode\n ] = await Promise.all([\n import('./core/EventDispatcher.js'),\n import('./core/UndoRedo.js'),\n import('./core/Selection.js'),\n import('./core/ZoomPan.js'),\n import('./core/CopyPaste.js'),\n import('./core/EraserTrail.js'),\n import('./core/ResizeShapes.js'),\n import('./core/ResizeCode.js')\n ]);\n\n this._modules.core = {\n eventDispatcher, undoRedo, selection,\n zoomPan, copyPaste, eraserTrail,\n resizeShapes, resizeCode\n };\n\n // Re-bind event listeners to the current SVG element\n if (eventDispatcher.initEventDispatcher) {\n eventDispatcher.initEventDispatcher(this.svg);\n }\n\n // Import standalone tools\n await Promise.all([\n import('./tools/eraserTool.js'),\n import('./tools/laserTool.js')\n ]);\n\n // Expose key functions globally\n if (undoRedo.undo) window.undo = undoRedo.undo;\n if (undoRedo.redo) window.redo = undoRedo.redo;\n if (undoRedo.pushCreateAction) window.pushCreateAction = undoRedo.pushCreateAction;\n if (undoRedo.pushDeleteAction) window.pushDeleteAction = undoRedo.pushDeleteAction;\n if (selection.multiSelection) window.multiSelection = selection.multiSelection;\n if (selection.clearAllSelections) window.clearAllSelections = selection.clearAllSelections;\n\n // Initialize centralized copy/paste system\n if (copyPaste.initCopyPaste) copyPaste.initCopyPaste();\n\n // Initialize AI renderer bridge\n const aiRenderer = await import('./core/AIRenderer.js');\n if (aiRenderer.initAIRenderer) aiRenderer.initAIRenderer();\n\n // Initialize graph engine bridge\n const graphEngine = await import('./core/GraphEngine.js');\n if (graphEngine.initGraphEngine) graphEngine.initGraphEngine();\n\n // Initialize scene serializer bridge\n const sceneSerializer = await import('./core/SceneSerializer.js');\n if (sceneSerializer.initSceneSerializer) sceneSerializer.initSceneSerializer();\n\n // Initialize layer ordering\n const layerOrder = await import('./core/LayerOrder.js');\n if (layerOrder.initLayerOrder) layerOrder.initLayerOrder();\n\n // Initialize LixScript programmatic diagram engine\n const lixScript = await import('./core/LixScriptParser.js');\n if (lixScript.initLixScriptBridge) lixScript.initLixScriptBridge();\n\n // \u2500\u2500 Public API surfaces \u2500\u2500\n\n // Scene operations (save, load, export, etc.)\n this.scene = window.__sceneSerializer || {\n save: sceneSerializer.saveScene,\n load: sceneSerializer.loadScene,\n download: sceneSerializer.downloadScene,\n upload: sceneSerializer.uploadScene,\n exportPNG: sceneSerializer.exportAsPNG,\n exportPDF: sceneSerializer.exportAsPDF,\n copyAsPNG: sceneSerializer.copyAsPNG,\n copyAsSVG: sceneSerializer.copyAsSVG,\n reset: sceneSerializer.resetCanvas,\n findText: sceneSerializer.findTextOnCanvas,\n };\n\n // Shape array reference\n this.shapes = window.shapes;\n\n // Undo/redo\n this.undo = undoRedo.undo || (() => {});\n this.redo = undoRedo.redo || (() => {});\n\n // LixScript execution\n this.lixscript = {\n parse: lixScript.parseLixScript || (() => null),\n execute: lixScript.executeLixScript || (lixScript.parseLixScript ? (code) => {\n const parsed = lixScript.parseLixScript(code);\n if (parsed && lixScript.resolveShapeRefs) lixScript.resolveShapeRefs(parsed);\n return parsed;\n } : (() => null)),\n };\n\n // Store module refs for advanced consumers\n this._modules.sceneSerializer = sceneSerializer;\n this._modules.lixScript = lixScript;\n\n this._initialized = true;\n console.log('[SketchEngine] Initialized successfully');\n } catch (err) {\n console.error('[SketchEngine] Initialization failed:', err);\n throw err;\n }\n }\n\n /**\n * Sync tool flags from Zustand activeTool value.\n */\n setActiveTool(toolName) {\n // Deselect current shape when switching tools\n if (window.currentShape && typeof window.currentShape.removeSelection === 'function') {\n window.currentShape.removeSelection();\n window.currentShape = null;\n }\n if (typeof window.clearAllSelections === 'function') {\n window.clearAllSelections();\n }\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n\n // Force cleanup eraser trail when switching tools\n if (typeof window.forceCleanupEraserTrail === 'function') {\n window.forceCleanupEraserTrail();\n }\n // Clean up any lingering icon miniature/drag state\n if (typeof window.__cleanupIconTool === 'function') {\n window.__cleanupIconTool();\n }\n\n window.isPaintToolActive = false;\n window.isSquareToolActive = false;\n window.isCircleToolActive = false;\n window.isArrowToolActive = false;\n window.isTextToolActive = false;\n window.isLaserToolActive = false;\n window.isLineToolActive = false;\n window.isEraserToolActive = false;\n window.isSelectionToolActive = false;\n window.isImageToolActive = false;\n window.isPanningToolActive = false;\n window.isFrameToolActive = false;\n window.isIconToolActive = false;\n window.isCodeToolActive = false;\n\n const flagMap = {\n select: 'isSelectionToolActive',\n pan: 'isPanningToolActive',\n rectangle: 'isSquareToolActive',\n circle: 'isCircleToolActive',\n line: 'isLineToolActive',\n arrow: 'isArrowToolActive',\n freehand: 'isPaintToolActive',\n text: 'isTextToolActive',\n code: 'isCodeToolActive',\n eraser: 'isEraserToolActive',\n laser: 'isLaserToolActive',\n image: 'isImageToolActive',\n frame: 'isFrameToolActive',\n icon: 'isIconToolActive',\n };\n\n const flag = flagMap[toolName];\n if (flag) window[flag] = true;\n\n if (toolName === 'text' && window.isTextInCodeMode) {\n window.isCodeToolActive = true;\n }\n\n // Show image source picker when image tool is activated\n if (toolName === 'image' && window.__showImageSourcePicker) {\n window.__showImageSourcePicker();\n }\n\n // Set appropriate cursor for the active tool\n const cursorMap = {\n select: 'default',\n pan: 'grab',\n rectangle: 'crosshair',\n circle: 'crosshair',\n line: 'crosshair',\n arrow: 'crosshair',\n freehand: 'crosshair',\n text: 'crosshair',\n code: 'crosshair',\n eraser: 'crosshair',\n laser: 'crosshair',\n image: 'crosshair',\n frame: 'crosshair',\n icon: 'crosshair',\n };\n if (this.svg) {\n this.svg.style.cursor = cursorMap[toolName] || 'default';\n }\n }\n\n cleanup() {\n // Remove event listeners from the SVG element\n if (this._modules.core?.eventDispatcher?.cleanupEventDispatcher) {\n this._modules.core.eventDispatcher.cleanupEventDispatcher();\n }\n window.shapes = [];\n window.currentShape = null;\n window.lastMousePos = null;\n this._modules = {};\n this._initialized = false;\n console.log('[SketchEngine] Cleaned up');\n }\n}\n\nexport { SketchEngine };\nexport default SketchEngine;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }