@elixpo/lixsketch 5.6.5 → 5.6.6

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 (160) hide show
  1. package/dist/mcp/index.js +5 -1
  2. package/dist/mcp/index.js.map +2 -2
  3. package/dist/mcp/stdio.js +5 -1
  4. package/dist/mcp/stdio.js.map +2 -2
  5. package/dist/react/{AIRenderer-SRF7LU5K.js → AIRenderer-R5M2CIDO.js} +13 -6
  6. package/dist/react/AIRenderer-R5M2CIDO.js.map +7 -0
  7. package/dist/react/Circle-HMM5PKJ2.js +10 -0
  8. package/dist/react/{CopyPaste-YUDZ6DHY.js → CopyPaste-P6G35CXO.js} +11 -10
  9. package/dist/react/{CopyPaste-YUDZ6DHY.js.map → CopyPaste-P6G35CXO.js.map} +1 -1
  10. package/dist/react/{EventDispatcher-7LAK7GQ7.js → EventDispatcher-M5B4EWHJ.js} +216 -63
  11. package/dist/react/EventDispatcher-M5B4EWHJ.js.map +7 -0
  12. package/dist/react/Frame-QEUEYITT.js +11 -0
  13. package/dist/react/{FreehandStroke-U6GYZOM4.js → FreehandStroke-WXIJKD5I.js} +2 -2
  14. package/dist/react/{GraphEngine-MM6ALA2N.js → GraphEngine-XH3RPYO4.js} +9 -2
  15. package/dist/react/GraphEngine-XH3RPYO4.js.map +7 -0
  16. package/dist/react/IconShape-NHJE4YBY.js +10 -0
  17. package/dist/react/ImageShape-33VCMSDP.js +10 -0
  18. package/dist/react/Line-A6FE232Q.js +10 -0
  19. package/dist/react/{LixScriptParser-JYWJX375.js → LixScriptParser-YS3ZOTGS.js} +6 -2
  20. package/dist/react/LixScriptParser-YS3ZOTGS.js.map +7 -0
  21. package/dist/react/{MermaidFlowchartRenderer-PQEC4TMI.js → MermaidFlowchartRenderer-EL3Q2MNW.js} +6 -2
  22. package/dist/react/MermaidFlowchartRenderer-EL3Q2MNW.js.map +7 -0
  23. package/dist/react/MermaidSequenceParser-DBYXW23P.js +8 -0
  24. package/dist/react/{MermaidSequenceRenderer-KCUHO7UI.js → MermaidSequenceRenderer-K4KHHEVC.js} +10 -3
  25. package/dist/react/MermaidSequenceRenderer-K4KHHEVC.js.map +7 -0
  26. package/dist/react/{MermaidStructuredRenderer-W7UKN7BM.js → MermaidStructuredRenderer-6LN3WISP.js} +7 -2
  27. package/dist/react/MermaidStructuredRenderer-6LN3WISP.js.map +7 -0
  28. package/dist/react/Rectangle-4U4CD2ER.js +10 -0
  29. package/dist/react/{SceneSerializer-SG6SJN5X.js → SceneSerializer-JEYTYXZQ.js} +120 -46
  30. package/dist/react/SceneSerializer-JEYTYXZQ.js.map +7 -0
  31. package/dist/react/{Selection-2TSH3J6P.js → Selection-23MOLHEI.js} +4 -4
  32. package/dist/react/{SketchEngine-UD2XV2KT.js → SketchEngine-OPJON7TD.js} +26 -26
  33. package/dist/react/{UndoRedo-IN4SXDG6.js → UndoRedo-QVNRI5OB.js} +8 -2
  34. package/dist/react/{arrowTool-OYDWJGQK.js → arrowTool-VH3PJPDM.js} +3 -3
  35. package/dist/react/{chunk-LSHZYN77.js → chunk-2DZHO67H.js} +2 -2
  36. package/dist/react/{chunk-XOWNCYE4.js → chunk-5NHJJJBZ.js} +3 -3
  37. package/dist/react/chunk-6AIFXYV6.js +31 -0
  38. package/dist/react/chunk-6AIFXYV6.js.map +7 -0
  39. package/dist/react/{chunk-K5RY4EV7.js → chunk-6GPWSPJF.js} +9 -5
  40. package/dist/react/{chunk-K5RY4EV7.js.map → chunk-6GPWSPJF.js.map} +2 -2
  41. package/dist/react/{chunk-ASBC5G35.js → chunk-B6CYUZC4.js} +2 -2
  42. package/dist/react/{chunk-OP56XPWF.js → chunk-DNFPTVIP.js} +2 -2
  43. package/dist/react/{chunk-XYUFEIZR.js → chunk-DWEFPKDO.js} +2 -2
  44. package/dist/react/{chunk-GQUZPON4.js → chunk-F56XUE5S.js} +4 -4
  45. package/dist/react/{chunk-7CM5XQDN.js → chunk-G3DJQY65.js} +20 -36
  46. package/dist/react/chunk-G3DJQY65.js.map +7 -0
  47. package/dist/react/{chunk-LJR7EVW2.js → chunk-JEGLUNBC.js} +3 -3
  48. package/dist/react/{chunk-6GPEWDRB.js → chunk-M7GAB24F.js} +52 -6
  49. package/dist/react/chunk-M7GAB24F.js.map +7 -0
  50. package/dist/react/{chunk-VQVEPJSA.js → chunk-MHV5P6TS.js} +2 -1
  51. package/dist/react/chunk-MHV5P6TS.js.map +7 -0
  52. package/dist/react/{chunk-PXFPPO3R.js → chunk-NH3NVSWT.js} +18 -2
  53. package/dist/react/chunk-NH3NVSWT.js.map +7 -0
  54. package/dist/react/{chunk-XFL4R5ZF.js → chunk-OK4ROGMM.js} +16 -35
  55. package/dist/react/chunk-OK4ROGMM.js.map +7 -0
  56. package/dist/react/{chunk-APTOPAOY.js → chunk-SSFEN5CY.js} +3 -3
  57. package/dist/react/{chunk-RGMDWLRJ.js → chunk-UEL2G6D2.js} +3 -3
  58. package/dist/react/{chunk-M6TMN76K.js → chunk-ULPIHUVC.js} +3 -3
  59. package/dist/react/{chunk-FETTJLCV.js → chunk-VZPH7OAM.js} +14 -22
  60. package/dist/react/chunk-VZPH7OAM.js.map +7 -0
  61. package/dist/react/{chunk-TKXKJNTX.js → chunk-W7XUY4GR.js} +16 -19
  62. package/dist/react/chunk-W7XUY4GR.js.map +7 -0
  63. package/dist/react/{chunk-EOURRJ55.js → chunk-XSE4HQ2D.js} +2 -2
  64. package/dist/react/{chunk-K5BG5MHY.js → chunk-ZNZAICWY.js} +36 -60
  65. package/dist/react/chunk-ZNZAICWY.js.map +7 -0
  66. package/dist/react/{circleTool-LDKGZALF.js → circleTool-2UODOBCV.js} +4 -4
  67. package/dist/react/{codeTool-4YZO5W7J.js → codeTool-F4RV7SAI.js} +4 -4
  68. package/dist/react/{frameTool-MXNJEXQQ.js → frameTool-NTGA5BI6.js} +4 -4
  69. package/dist/react/{freehandTool-26D3FOOX.js → freehandTool-L55EUB5C.js} +4 -4
  70. package/dist/react/{iconTool-46O5VEUX.js → iconTool-KQQBLGR3.js} +4 -4
  71. package/dist/react/{imageTool-P2RWZRHO.js → imageTool-LDJ45AD7.js} +4 -4
  72. package/dist/react/index.js +148 -37
  73. package/dist/react/index.js.map +4 -4
  74. package/dist/react/{lineTool-ZMR27U5L.js → lineTool-CSAFD7PW.js} +4 -4
  75. package/dist/react/{rectangleTool-EJKK6UTX.js → rectangleTool-YPD2SIIZ.js} +4 -4
  76. package/dist/react/{textTool-S4XXZHZH.js → textTool-VQHMWEFJ.js} +5 -5
  77. package/package.json +5 -2
  78. package/src/core/AIRenderer.js +8 -2
  79. package/src/core/CanvasSpace.js +28 -0
  80. package/src/core/GraphRenderer.js +8 -3
  81. package/src/core/LixScriptParser.js +7 -1
  82. package/src/core/MermaidFlowchartRenderer.js +5 -1
  83. package/src/core/MermaidSequenceParser.js +1 -0
  84. package/src/core/MermaidSequenceRenderer.js +8 -3
  85. package/src/core/MermaidStructuredRenderer.js +6 -1
  86. package/src/core/SceneSerializer.js +121 -38
  87. package/src/core/Selection.js +12 -2
  88. package/src/core/UndoRedo.js +59 -5
  89. package/src/react/components/AppMenu.jsx +20 -19
  90. package/src/react/components/canvas/CanvasRulers.jsx +8 -13
  91. package/src/react/components/canvas/SVGCanvas.jsx +2 -1
  92. package/src/react/components/canvas/rulerUnits.js +28 -0
  93. package/src/react/components/sidebars/PaintBucketSidebar.jsx +1 -1
  94. package/src/react/store/useSketchStore.js +24 -3
  95. package/src/react/store/useUIStore.js +24 -1
  96. package/src/react/utils/canvasBackgrounds.js +29 -0
  97. package/src/shapes/Circle.js +12 -19
  98. package/src/shapes/Frame.js +38 -69
  99. package/src/shapes/FreehandStroke.js +24 -1
  100. package/src/shapes/Rectangle.js +10 -22
  101. package/src/tools/circleTool.js +3 -27
  102. package/src/tools/paintBucketTool.js +72 -15
  103. package/src/tools/rectangleTool.js +7 -23
  104. package/src/tools/shapeRecognition.js +270 -0
  105. package/src/tools/shapeRecognitionTool.js +36 -183
  106. package/dist/react/AIRenderer-SRF7LU5K.js.map +0 -7
  107. package/dist/react/Circle-6POZCUZD.js +0 -9
  108. package/dist/react/EventDispatcher-7LAK7GQ7.js.map +0 -7
  109. package/dist/react/Frame-7D2MXCFF.js +0 -11
  110. package/dist/react/GraphEngine-MM6ALA2N.js.map +0 -7
  111. package/dist/react/IconShape-ZADX7Y33.js +0 -10
  112. package/dist/react/ImageShape-UJQN2HI7.js +0 -10
  113. package/dist/react/Line-APEULMHE.js +0 -10
  114. package/dist/react/LixScriptParser-JYWJX375.js.map +0 -7
  115. package/dist/react/MermaidFlowchartRenderer-PQEC4TMI.js.map +0 -7
  116. package/dist/react/MermaidSequenceParser-UKG2NSZY.js +0 -8
  117. package/dist/react/MermaidSequenceRenderer-KCUHO7UI.js.map +0 -7
  118. package/dist/react/MermaidStructuredRenderer-W7UKN7BM.js.map +0 -7
  119. package/dist/react/Rectangle-S7XUKWYD.js +0 -9
  120. package/dist/react/SceneSerializer-SG6SJN5X.js.map +0 -7
  121. package/dist/react/chunk-6GPEWDRB.js.map +0 -7
  122. package/dist/react/chunk-7CM5XQDN.js.map +0 -7
  123. package/dist/react/chunk-FETTJLCV.js.map +0 -7
  124. package/dist/react/chunk-K5BG5MHY.js.map +0 -7
  125. package/dist/react/chunk-PXFPPO3R.js.map +0 -7
  126. package/dist/react/chunk-TKXKJNTX.js.map +0 -7
  127. package/dist/react/chunk-VQVEPJSA.js.map +0 -7
  128. package/dist/react/chunk-XFL4R5ZF.js.map +0 -7
  129. /package/dist/react/{Circle-6POZCUZD.js.map → Circle-HMM5PKJ2.js.map} +0 -0
  130. /package/dist/react/{Frame-7D2MXCFF.js.map → Frame-QEUEYITT.js.map} +0 -0
  131. /package/dist/react/{FreehandStroke-U6GYZOM4.js.map → FreehandStroke-WXIJKD5I.js.map} +0 -0
  132. /package/dist/react/{IconShape-ZADX7Y33.js.map → IconShape-NHJE4YBY.js.map} +0 -0
  133. /package/dist/react/{ImageShape-UJQN2HI7.js.map → ImageShape-33VCMSDP.js.map} +0 -0
  134. /package/dist/react/{Line-APEULMHE.js.map → Line-A6FE232Q.js.map} +0 -0
  135. /package/dist/react/{MermaidSequenceParser-UKG2NSZY.js.map → MermaidSequenceParser-DBYXW23P.js.map} +0 -0
  136. /package/dist/react/{Rectangle-S7XUKWYD.js.map → Rectangle-4U4CD2ER.js.map} +0 -0
  137. /package/dist/react/{Selection-2TSH3J6P.js.map → Selection-23MOLHEI.js.map} +0 -0
  138. /package/dist/react/{SketchEngine-UD2XV2KT.js.map → SketchEngine-OPJON7TD.js.map} +0 -0
  139. /package/dist/react/{UndoRedo-IN4SXDG6.js.map → UndoRedo-QVNRI5OB.js.map} +0 -0
  140. /package/dist/react/{arrowTool-OYDWJGQK.js.map → arrowTool-VH3PJPDM.js.map} +0 -0
  141. /package/dist/react/{chunk-LSHZYN77.js.map → chunk-2DZHO67H.js.map} +0 -0
  142. /package/dist/react/{chunk-XOWNCYE4.js.map → chunk-5NHJJJBZ.js.map} +0 -0
  143. /package/dist/react/{chunk-ASBC5G35.js.map → chunk-B6CYUZC4.js.map} +0 -0
  144. /package/dist/react/{chunk-OP56XPWF.js.map → chunk-DNFPTVIP.js.map} +0 -0
  145. /package/dist/react/{chunk-XYUFEIZR.js.map → chunk-DWEFPKDO.js.map} +0 -0
  146. /package/dist/react/{chunk-GQUZPON4.js.map → chunk-F56XUE5S.js.map} +0 -0
  147. /package/dist/react/{chunk-LJR7EVW2.js.map → chunk-JEGLUNBC.js.map} +0 -0
  148. /package/dist/react/{chunk-APTOPAOY.js.map → chunk-SSFEN5CY.js.map} +0 -0
  149. /package/dist/react/{chunk-RGMDWLRJ.js.map → chunk-UEL2G6D2.js.map} +0 -0
  150. /package/dist/react/{chunk-M6TMN76K.js.map → chunk-ULPIHUVC.js.map} +0 -0
  151. /package/dist/react/{chunk-EOURRJ55.js.map → chunk-XSE4HQ2D.js.map} +0 -0
  152. /package/dist/react/{circleTool-LDKGZALF.js.map → circleTool-2UODOBCV.js.map} +0 -0
  153. /package/dist/react/{codeTool-4YZO5W7J.js.map → codeTool-F4RV7SAI.js.map} +0 -0
  154. /package/dist/react/{frameTool-MXNJEXQQ.js.map → frameTool-NTGA5BI6.js.map} +0 -0
  155. /package/dist/react/{freehandTool-26D3FOOX.js.map → freehandTool-L55EUB5C.js.map} +0 -0
  156. /package/dist/react/{iconTool-46O5VEUX.js.map → iconTool-KQQBLGR3.js.map} +0 -0
  157. /package/dist/react/{imageTool-P2RWZRHO.js.map → imageTool-LDJ45AD7.js.map} +0 -0
  158. /package/dist/react/{lineTool-ZMR27U5L.js.map → lineTool-CSAFD7PW.js.map} +0 -0
  159. /package/dist/react/{rectangleTool-EJKK6UTX.js.map → rectangleTool-YPD2SIIZ.js.map} +0 -0
  160. /package/dist/react/{textTool-S4XXZHZH.js.map → textTool-VQHMWEFJ.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/MermaidFlowchartRenderer.js"],
4
- "sourcesContent": ["/* eslint-disable */\n/**\n * MermaidFlowchartRenderer - Renders parsed flowchart diagrams as high-quality SVG.\n *\n * One renderer for both preview and canvas \u2014 ensures they always match.\n * Supports: rectangle [], rounded rectangle (), circle (()), diamond/rhombus {},\n * directed/undirected edges with labels, subgraphs, all directions (TD/TB/LR/RL/BT).\n *\n * Dark theme matching the app aesthetic.\n */\n\n// Layout constants\nconst NODE_W = 150;\nconst NODE_H = 50;\nconst H_SPACING = 200;\nconst V_SPACING = 120;\nconst SIDE_MARGIN = 50;\nconst TOP_MARGIN = 40;\nconst FONT_FAMILY = 'lixFont, sans-serif';\n\n// Issue #38 follow-up: theme-aware stroke / fill. Resolved at draw time\n// so a single render call uses whichever palette is active.\nfunction isThemeDark() {\n if (typeof document === 'undefined') return true;\n return !!(document.body && document.body.classList.contains('theme-dark'));\n}\nfunction nodeStrokeColor() { return isThemeDark() ? '#fff' : '#1a1a2e'; }\nfunction edgeStrokeColor() { return isThemeDark() ? '#888' : '#444'; }\n\nconst DARK_THEME = {\n bg: '#1e1e28',\n nodeBg: 'transparent',\n nodeStroke: '#9090c0',\n nodeText: '#e0e0e0',\n edgeStroke: '#888',\n edgeText: '#a0a0b0',\n subgraphBg: 'rgba(80,80,120,0.08)',\n subgraphBorder: '#555',\n subgraphLabel: '#888',\n};\n\nconst LIGHT_THEME = {\n bg: '#fbfaf6',\n nodeBg: '#f5f2ea',\n nodeStroke: '#6e746c',\n nodeText: '#343832',\n edgeStroke: '#6e746c',\n edgeText: '#4f554e',\n subgraphBg: 'rgba(117, 135, 119, 0.06)',\n subgraphBorder: '#aaa99f',\n subgraphLabel: '#666b64',\n};\n\nfunction previewTheme() { return isThemeDark() ? DARK_THEME : LIGHT_THEME; }\n\nfunction escapeXml(str) {\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction measureText(text, fontSize) {\n return text.length * fontSize * 0.55;\n}\n\n/**\n * Render a parsed flowchart diagram to SVG markup.\n *\n * @param {Object} diagram - Parsed from parseMermaid()\n * @param {Object} opts - { width?, height?, fitToContent? }\n * @returns {string} SVG markup string\n */\nexport function renderFlowchartSVG(diagram, opts = {}) {\n if (!diagram || !diagram.nodes || diagram.nodes.length === 0) return '';\n\n const THEME = previewTheme();\n\n const nodes = diagram.nodes;\n const edges = diagram.edges || [];\n const subgraphs = diagram.subgraphs || [];\n const direction = diagram.direction || 'TD';\n\n // Compute bounds of laid-out nodes\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n nodes.forEach(n => {\n const nw = n.width || NODE_W;\n const nh = n.height || NODE_H;\n minX = Math.min(minX, n.x);\n minY = Math.min(minY, n.y);\n maxX = Math.max(maxX, n.x + nw);\n maxY = Math.max(maxY, n.y + nh);\n });\n\n const dw = maxX - minX || 1;\n const dh = maxY - minY || 1;\n\n // If fitToContent or explicit size, scale to fit\n const targetW = opts.width || dw + SIDE_MARGIN * 2;\n const targetH = opts.height || dh + TOP_MARGIN * 2;\n\n let scale, offX, offY;\n if (opts.width || opts.height) {\n const pad = 40;\n scale = Math.min(\n (targetW - pad * 2) / dw,\n (targetH - pad * 2) / dh,\n 1.8\n );\n offX = (targetW - dw * scale) / 2 - minX * scale;\n offY = (targetH - dh * scale) / 2 - minY * scale;\n } else {\n scale = 1;\n offX = SIDE_MARGIN - minX;\n offY = TOP_MARGIN - minY;\n }\n\n const totalWidth = opts.width || Math.round(dw * scale + SIDE_MARGIN * 2);\n const totalHeight = opts.height || Math.round(dh * scale + TOP_MARGIN * 2);\n\n // Build node lookup for edge rendering\n const nodeById = new Map();\n nodes.forEach(n => {\n const nw = (n.width || NODE_W) * scale;\n const nh = (n.height || NODE_H) * scale;\n const nx = n.x * scale + offX;\n const ny = n.y * scale + offY;\n nodeById.set(n.id, {\n x: nx, y: ny, w: nw, h: nh,\n cx: nx + nw / 2, cy: ny + nh / 2,\n type: n.type, label: n.label,\n fill: n.fill, stroke: n.stroke, strokeWidth: n.strokeWidth,\n });\n });\n\n let svg = '';\n const defs = [];\n\n // Arrow markers (normal, dotted, thick)\n defs.push(`<marker id=\"fc-arrow\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <path d=\"M1,1 L9,3.5 L1,6\" fill=\"none\" stroke=\"${THEME.edgeStroke}\" stroke-width=\"1.5\" stroke-linejoin=\"round\" />\n </marker>`);\n defs.push(`<marker id=\"fc-arrow-thick\" markerWidth=\"12\" markerHeight=\"9\" refX=\"11\" refY=\"4.5\" orient=\"auto\">\n <path d=\"M1,1 L11,4.5 L1,8\" fill=\"none\" stroke=\"${THEME.edgeStroke}\" stroke-width=\"2\" stroke-linejoin=\"round\" />\n </marker>`);\n\n // Background\n svg += `<rect x=\"0\" y=\"0\" width=\"${totalWidth}\" height=\"${totalHeight}\" fill=\"${THEME.bg}\" rx=\"8\" />`;\n\n // --- Subgraphs (rendered first, behind everything) ---\n for (const sg of subgraphs) {\n if (!sg.nodes || sg.nodes.length === 0) continue;\n\n let sgMinX = Infinity, sgMinY = Infinity, sgMaxX = -Infinity, sgMaxY = -Infinity;\n let hasNodes = false;\n for (const nid of sg.nodes) {\n const nd = nodeById.get(nid);\n if (!nd) continue;\n hasNodes = true;\n sgMinX = Math.min(sgMinX, nd.x);\n sgMinY = Math.min(sgMinY, nd.y);\n sgMaxX = Math.max(sgMaxX, nd.x + nd.w);\n sgMaxY = Math.max(sgMaxY, nd.y + nd.h);\n }\n if (!hasNodes) continue;\n\n const sgPad = 20 * scale;\n const sgX = sgMinX - sgPad;\n const sgY = sgMinY - sgPad - 16 * scale;\n const sgW = (sgMaxX - sgMinX) + sgPad * 2;\n const sgH = (sgMaxY - sgMinY) + sgPad * 2 + 16 * scale;\n\n svg += `<g data-fc-type=\"subgraph\" data-fc-id=\"${escapeXml(sg.id)}\">`;\n svg += `<rect x=\"${sgX}\" y=\"${sgY}\" width=\"${sgW}\" height=\"${sgH}\" rx=\"6\" fill=\"${THEME.subgraphBg}\" stroke=\"${THEME.subgraphBorder}\" stroke-width=\"1\" stroke-dasharray=\"4 2\" />`;\n if (sg.label) {\n svg += `<text x=\"${sgX + 8}\" y=\"${sgY + 14}\" fill=\"${THEME.subgraphLabel}\" font-size=\"${Math.max(9, 11 * scale)}\" font-family=\"${FONT_FAMILY}\">${escapeXml(sg.label)}</text>`;\n }\n svg += `</g>`;\n }\n\n // --- Edges ---\n edges.forEach(e => {\n const f = nodeById.get(e.from);\n const t = nodeById.get(e.to);\n if (!f || !t) return;\n\n const directed = e.directed !== false;\n const edgeStyle = e.style || 'normal';\n let strokeW, dashArr, markerRef;\n if (edgeStyle === 'thick') {\n strokeW = 3;\n dashArr = '';\n markerRef = directed ? ' marker-end=\"url(#fc-arrow-thick)\"' : '';\n } else if (edgeStyle === 'dotted') {\n strokeW = 1.5;\n dashArr = ' stroke-dasharray=\"5 3\"';\n markerRef = directed ? ' marker-end=\"url(#fc-arrow)\"' : '';\n } else {\n strokeW = 1.5;\n dashArr = '';\n markerRef = directed ? ' marker-end=\"url(#fc-arrow)\"' : '';\n }\n const eStroke = e.stroke || THEME.edgeStroke;\n\n // Compute connection points\n const sp = getEdgePoint(f, t);\n const ep = getEdgePoint(t, f);\n\n // Determine if we should curve\n const dx = t.cx - f.cx;\n const dy = t.cy - f.cy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n let mx = (sp.x + ep.x) / 2;\n let my = (sp.y + ep.y) / 2;\n\n svg += `<g data-fc-type=\"edge\" data-fc-from=\"${escapeXml(e.from)}\" data-fc-to=\"${escapeXml(e.to)}\">`;\n\n if (dist > 0 && Math.abs(dy) > 15 && Math.abs(dx) > 15) {\n // Curved edge\n const perpX = -dy / dist;\n const perpY = dx / dist;\n const curveAmt = dist * 0.12;\n const cpx = mx + perpX * curveAmt;\n const cpy = my + perpY * curveAmt;\n mx = 0.25 * sp.x + 0.5 * cpx + 0.25 * ep.x;\n my = 0.25 * sp.y + 0.5 * cpy + 0.25 * ep.y;\n svg += `<path d=\"M ${sp.x} ${sp.y} Q ${cpx} ${cpy} ${ep.x} ${ep.y}\" fill=\"none\" stroke=\"${eStroke}\" stroke-width=\"${strokeW}\"${dashArr}${markerRef} />`;\n } else {\n svg += `<line x1=\"${sp.x}\" y1=\"${sp.y}\" x2=\"${ep.x}\" y2=\"${ep.y}\" stroke=\"${eStroke}\" stroke-width=\"${strokeW}\"${dashArr}${markerRef} />`;\n }\n\n // Edge label (supports multi-line via \\n)\n if (e.label) {\n const labelFontSize = Math.max(8, 10 * scale);\n const labelLines = e.label.split('\\n');\n const maxLineW = Math.max(...labelLines.map(l => measureText(l, labelFontSize)));\n const labelW = maxLineW + 12;\n const labelH = labelLines.length * (labelFontSize + 3) + 6;\n svg += `<rect x=\"${mx - labelW / 2}\" y=\"${my - labelH / 2}\" width=\"${labelW}\" height=\"${labelH}\" rx=\"3\" fill=\"${THEME.bg}\" opacity=\"0.85\" />`;\n if (labelLines.length === 1) {\n svg += `<text x=\"${mx}\" y=\"${my + 1}\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"${THEME.edgeText}\" font-size=\"${labelFontSize}\" font-family=\"${FONT_FAMILY}\">${escapeXml(e.label)}</text>`;\n } else {\n const startY = my - ((labelLines.length - 1) * (labelFontSize + 3)) / 2;\n svg += `<text x=\"${mx}\" text-anchor=\"middle\" fill=\"${THEME.edgeText}\" font-size=\"${labelFontSize}\" font-family=\"${FONT_FAMILY}\">`;\n labelLines.forEach((ln, idx) => {\n svg += `<tspan x=\"${mx}\" dy=\"${idx === 0 ? 0 : labelFontSize + 3}\" y=\"${idx === 0 ? startY : ''}\">${escapeXml(ln)}</tspan>`;\n });\n svg += `</text>`;\n }\n }\n\n svg += `</g>`;\n });\n\n // --- Nodes ---\n nodes.forEach(n => {\n const d = nodeById.get(n.id);\n if (!d) return;\n\n const nStroke = n.stroke || THEME.nodeStroke;\n const nFill = n.fill || THEME.nodeBg;\n const nStrokeWidth = n.strokeWidth || 1.8;\n const fontSize = Math.max(9, Math.min(13, 12 * scale));\n\n svg += `<g data-fc-type=\"node\" data-fc-id=\"${escapeXml(n.id)}\">`;\n\n if (n.type === 'circle') {\n const r = Math.min(d.w, d.h) / 2;\n svg += `<circle cx=\"${d.cx}\" cy=\"${d.cy}\" r=\"${r}\" fill=\"${nFill}\" stroke=\"${nStroke}\" stroke-width=\"${nStrokeWidth}\" />`;\n } else if (n.type === 'diamond') {\n const hw = d.w / 2 * 0.85;\n const hh = d.h / 2 * 0.85;\n svg += `<polygon points=\"${d.cx},${d.cy - hh} ${d.cx + hw},${d.cy} ${d.cx},${d.cy + hh} ${d.cx - hw},${d.cy}\" fill=\"${nFill}\" stroke=\"${nStroke}\" stroke-width=\"${nStrokeWidth}\" />`;\n } else if (n.type === 'asymmetric') {\n // Flag/asymmetric shape: pointed left, flat right\n const notchX = d.x + 15 * scale;\n svg += `<polygon points=\"${d.x},${d.y} ${d.x + d.w},${d.y} ${d.x + d.w},${d.y + d.h} ${d.x},${d.y + d.h} ${notchX},${d.cy}\" fill=\"${nFill}\" stroke=\"${nStroke}\" stroke-width=\"${nStrokeWidth}\" />`;\n } else if (n.type === 'roundrect') {\n svg += `<rect x=\"${d.x}\" y=\"${d.y}\" width=\"${d.w}\" height=\"${d.h}\" rx=\"${12 * scale}\" fill=\"${nFill}\" stroke=\"${nStroke}\" stroke-width=\"${nStrokeWidth}\" />`;\n } else {\n svg += `<rect x=\"${d.x}\" y=\"${d.y}\" width=\"${d.w}\" height=\"${d.h}\" rx=\"${3 * scale}\" fill=\"${nFill}\" stroke=\"${nStroke}\" stroke-width=\"${nStrokeWidth}\" />`;\n }\n\n // Node label (supports multi-line via \\n)\n if (n.label) {\n const hasSolidFill = nFill && nFill !== 'transparent' && nFill !== 'none';\n const labelFill = n.labelColor || (hasSolidFill ? getContrastColor(nFill) : THEME.nodeText);\n\n const labelLines = n.label.split('\\n');\n if (labelLines.length === 1) {\n svg += `<text x=\"${d.cx}\" y=\"${d.cy}\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"${labelFill}\" font-size=\"${fontSize}\" font-family=\"${FONT_FAMILY}\" font-weight=\"500\">${escapeXml(n.label)}</text>`;\n } else {\n const lineH = fontSize + 3;\n const startY = d.cy - ((labelLines.length - 1) * lineH) / 2;\n svg += `<text text-anchor=\"middle\" fill=\"${labelFill}\" font-size=\"${fontSize}\" font-family=\"${FONT_FAMILY}\" font-weight=\"500\">`;\n labelLines.forEach((ln, idx) => {\n svg += `<tspan x=\"${d.cx}\" y=\"${startY + idx * lineH}\">${escapeXml(ln)}</tspan>`;\n });\n svg += `</text>`;\n }\n }\n\n svg += `</g>`;\n });\n\n // Build final SVG\n const defsStr = defs.length > 0 ? `<defs>${defs.join('')}</defs>` : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalWidth}\" height=\"${totalHeight}\" viewBox=\"0 0 ${totalWidth} ${totalHeight}\">${defsStr}${svg}</svg>`;\n}\n\n/**\n * Get the connection point on a node's boundary toward another node.\n */\nfunction getEdgePoint(node, target) {\n const dx = target.cx - node.cx;\n const dy = target.cy - node.cy;\n\n if (node.type === 'circle') {\n const r = Math.min(node.w, node.h) / 2;\n const dist = Math.sqrt(dx * dx + dy * dy) || 1;\n return { x: node.cx + (dx / dist) * r, y: node.cy + (dy / dist) * r };\n }\n\n if (node.type === 'diamond') {\n // Diamond edge intersection\n const hw = node.w / 2 * 0.85;\n const hh = node.h / 2 * 0.85;\n const adx = Math.abs(dx) || 0.001;\n const ady = Math.abs(dy) || 0.001;\n const t = Math.min(hw / adx, hh / ady);\n return { x: node.cx + dx * t * 0.95, y: node.cy + dy * t * 0.95 };\n }\n\n // Rectangle / rounded rect / asymmetric - exit from edges\n const hw = node.w / 2;\n const hh = node.h / 2;\n\n if (Math.abs(dx) < 0.001 || Math.abs(dy) * hw > Math.abs(dx) * hh) {\n if (dy > 0) return { x: node.cx, y: node.y + node.h };\n return { x: node.cx, y: node.y };\n }\n if (dx > 0) return { x: node.x + node.w, y: node.cy };\n return { x: node.x, y: node.cy };\n}\n\nfunction parseColor(hex) {\n if (!hex || hex === 'transparent' || hex === 'none') return null;\n let c = hex.replace('#', '');\n // Support 3-char shorthand (#9f6 \u2192 #99ff66)\n if (c.length === 3) c = c[0] + c[0] + c[1] + c[1] + c[2] + c[2];\n if (c.length < 6) return null;\n return {\n r: parseInt(c.substring(0, 2), 16),\n g: parseInt(c.substring(2, 4), 16),\n b: parseInt(c.substring(4, 6), 16),\n };\n}\n\nfunction getLuminance(hex) {\n const rgb = parseColor(hex);\n if (!rgb) return 0;\n return 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n}\n\nfunction getContrastColor(bgHex) {\n // Pick dark or light text based on background luminance\n return getLuminance(bgHex) > 140 ? '#1a1a2e' : '#f0f0f0';\n}\n\n/**\n * Generate preview SVG for the modal.\n */\nexport function renderFlowchartPreviewSVG(diagram) {\n return renderFlowchartSVG(diagram, { width: 600, height: 450 });\n}\n\n/**\n * Render a flowchart diagram onto the canvas as a real engine `Frame`\n * containing independent shapes \u2014 Rectangle nodes (with embedded labels)\n * joined by Arrow edges. Each child is fully independent for click /\n * drag / resize / colour-change, exactly like a user-drawn shape; the\n * Frame's `_diagramType` marker means deleting it pulls every child with\n * it (so the diagram behaves as one logical unit when you're done with\n * it) \u2014 see Frame.destroy().\n *\n * Issue #34 bug #3 (follow-up to #22 phase 5): drops the shared `groupId`\n * glue that made selecting one shape select the whole diagram; the Frame\n * is the explicit container instead.\n */\nexport function renderFlowchartOnCanvas(diagram) {\n if (!diagram || !diagram.nodes || diagram.nodes.length === 0) return false;\n if (!window.svg || !window.Rectangle || !window.Frame) {\n console.error('[FlowchartRenderer] Engine not initialized');\n return false;\n }\n\n const nodes = diagram.nodes;\n const edges = diagram.edges || [];\n\n // Diagram bounds (in the renderer's natural coordinate space)\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n nodes.forEach((n) => {\n const nw = n.width || 140;\n const nh = n.height || 60;\n minX = Math.min(minX, n.x);\n minY = Math.min(minY, n.y);\n maxX = Math.max(maxX, n.x + nw);\n maxY = Math.max(maxY, n.y + nh);\n });\n const dw = (maxX - minX) || 1;\n const dh = (maxY - minY) || 1;\n\n // Center on the current viewport\n const vb = window.currentViewBox || { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const vcx = vb.x + vb.width / 2;\n const vcy = vb.y + vb.height / 2;\n const ox = vcx - dw / 2 - minX;\n const oy = vcy - dh / 2 - minY;\n\n // \u2500\u2500 Wrapper frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Created up-front so we can call addShapeToFrame as each child is\n // built. _diagramType marks it so Frame.destroy() takes the children\n // along on delete (issue #34 bug #3).\n //\n // PADDING bumped from 40 \u2192 90 so edge labels, rotated diamond nodes,\n // and arrow heads near the diagram boundary stay inside the frame\n // instead of getting clipped at the corners.\n const PADDING = 90;\n const frameTitle = diagram.title || 'Mermaid diagram';\n const frame = new window.Frame(\n vcx - dw / 2 - PADDING,\n vcy - dh / 2 - PADDING,\n dw + PADDING * 2,\n dh + PADDING * 2,\n {\n stroke: '#888',\n strokeWidth: 1,\n fill: 'transparent',\n opacity: 0.7,\n frameName: frameTitle,\n }\n );\n frame._diagramType = 'mermaid-flowchart';\n window.shapes.push(frame);\n if (window.pushCreateAction) window.pushCreateAction(frame);\n\n const nodeMap = new Map(); // id \u2192 shape\n\n // \u2500\u2500 Nodes \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const n of nodes) {\n const nw = n.width || 140;\n const nh = n.height || 60;\n const nx = n.x + ox;\n const ny = n.y + oy;\n const cx = nx + nw / 2;\n const cy = ny + nh / 2;\n\n const opts = {\n stroke: n.stroke || nodeStrokeColor(),\n strokeWidth: n.strokeWidth ?? 1.5,\n fill: n.fill || 'transparent',\n fillStyle: n.fill && n.fill !== 'transparent' ? 'solid' : 'none',\n roughness: 1,\n label: n.label || '',\n labelColor: n.labelColor || (n.fill && n.fill !== 'transparent' ? getContrastColor(n.fill) : nodeStrokeColor()),\n };\n\n let shape = null;\n try {\n if (n.type === 'circle' && window.Circle) {\n shape = new window.Circle(cx, cy, nw / 2, nh / 2, opts);\n } else if (n.type === 'diamond') {\n const sz = Math.max(nw, nh) * 0.75;\n shape = new window.Rectangle(cx - sz / 2, cy - sz / 2, sz, sz, opts);\n shape.rotation = 45;\n if (typeof shape.draw === 'function') shape.draw();\n } else if (n.type === 'roundrect') {\n shape = new window.Rectangle(nx, ny, nw, nh, { ...opts, cornerRadius: Math.min(nw, nh) * 0.2 });\n } else {\n shape = new window.Rectangle(nx, ny, nw, nh, opts);\n }\n } catch (err) {\n console.warn('[FlowchartRenderer] Node creation failed:', n.id, err);\n continue;\n }\n if (!shape) continue;\n\n window.shapes.push(shape);\n if (window.pushCreateAction) window.pushCreateAction(shape);\n frame.addShapeToFrame(shape);\n\n nodeMap.set(n.id, { shape, x: nx, y: ny, width: nw, height: nh, centerX: cx, centerY: cy });\n }\n\n // \u2500\u2500 Edges \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const e of edges) {\n const fromNode = nodeMap.get(e.from);\n const toNode = nodeMap.get(e.to);\n if (!fromNode || !toNode) continue;\n\n // Connect from the source center to the target center \u2014 autoAttach\n // will snap each endpoint to the appropriate edge of the shape.\n const sp = { x: fromNode.centerX, y: fromNode.centerY };\n const ep = { x: toNode.centerX, y: toNode.centerY };\n\n const directed = e.directed !== false;\n const style = e.style || 'normal';\n const isThick = style === 'thick';\n const isDotted = style === 'dotted';\n\n const opts = {\n stroke: e.stroke || edgeStrokeColor(),\n strokeWidth: isThick ? 3 : 1.5,\n roughness: 1,\n strokeDasharray: isDotted ? '5 3' : '',\n label: e.label || '',\n labelColor: e.labelColor || edgeStrokeColor(),\n };\n\n let connector = null;\n try {\n if (directed && window.Arrow) {\n connector = new window.Arrow(sp, ep, opts);\n } else if (window.Line) {\n connector = new window.Line(sp, ep, opts);\n } else if (window.Arrow) {\n connector = new window.Arrow(sp, ep, opts);\n }\n } catch (err) {\n console.warn('[FlowchartRenderer] Edge creation failed:', e, err);\n continue;\n }\n if (!connector) continue;\n\n window.shapes.push(connector);\n if (window.pushCreateAction) window.pushCreateAction(connector);\n frame.addShapeToFrame(connector);\n\n // Wire arrow endpoints into the source/target shapes so moving a\n // node drags its connections along. window.__autoAttach is set up\n // by AIRenderer.initAIRenderer() during engine init.\n if (directed && connector.shapeName === 'arrow' && typeof window.__autoAttach === 'function') {\n try {\n window.__autoAttach(connector, fromNode.shape, true, sp);\n window.__autoAttach(connector, toNode.shape, false, ep);\n } catch (err) {\n console.warn('[FlowchartRenderer] autoAttach failed:', err);\n }\n }\n }\n\n // Select the first node so the user has feedback that something\n // landed. Selecting a child (not the frame) reinforces the\n // \"independent shapes inside a frame\" model.\n const first = nodeMap.values().next().value;\n if (first) {\n window.currentShape = first.shape;\n if (typeof first.shape.selectShape === 'function') first.shape.selectShape();\n }\n\n return true;\n}\n"],
5
- "mappings": "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",
6
- "names": ["hw", "hh"]
7
- }
@@ -1,8 +0,0 @@
1
- "use client";
2
- import {
3
- parseSequenceDiagram
4
- } from "./chunk-VQVEPJSA.js";
5
- export {
6
- parseSequenceDiagram
7
- };
8
- //# sourceMappingURL=MermaidSequenceParser-UKG2NSZY.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/MermaidSequenceRenderer.js"],
4
- "sourcesContent": ["/* eslint-disable */\n/**\n * MermaidSequenceRenderer - Renders parsed sequence diagrams as high-quality SVG.\n *\n * One renderer for both preview and canvas \u2014 ensures they always match.\n * The canvas renderer inserts the SVG into a frame; elements inside are\n * individually editable (each participant box, message label, note, etc.\n * is its own SVG group with data attributes for the editor).\n *\n * Design follows the reference image: dark theme, clean lines,\n * participant boxes at top and bottom, dashed lifelines, arrow styles.\n */\n\nimport { parseSequenceDiagram } from './MermaidSequenceParser.js';\n\n// Layout constants\nconst PARTICIPANT_W = 100;\nconst PARTICIPANT_H = 36;\nconst PARTICIPANT_GAP = 140;\nconst MSG_ROW_HEIGHT = 50;\nconst NOTE_PAD = 10;\nconst NOTE_MAX_W = 160;\nconst TOP_MARGIN = 30;\nconst BOTTOM_MARGIN = 30;\nconst SIDE_MARGIN = 40;\nconst FONT_FAMILY = 'lixFont, sans-serif';\nconst CODE_FONT = 'lixCode, monospace';\n\n// Issue #38 follow-up: theme-aware palette. The on-canvas renderer reads\n// `themeColors()` at draw time so a single render call gets whichever\n// palette is active. The dark THEME object below is kept for the SVG-\n// string preview path (`renderSequenceSVG`), which is rendered inside\n// the modal's preview pane.\nfunction themeColors() {\n const isDark = typeof document !== 'undefined'\n && document.body\n && document.body.classList.contains('theme-dark');\n if (isDark) return DARK_THEME;\n return {\n bg: '#fbfaf6',\n participantBg: '#ffffff',\n participantBorder: '#9c9c9c',\n participantText: '#38384e',\n lifeline: '#b0b0b8',\n messageLine: '#62627a',\n messageDash: '#888',\n messageText: '#38384e',\n noteBg: '#fffce0',\n noteBorder: '#c0b870',\n noteText: '#5e5230',\n blockBg: 'rgba(80,80,120,0.08)',\n blockBorder: '#9c9c9c',\n blockLabel: '#62627a',\n crossColor: '#c2483a',\n };\n}\n\n// Theme colors (dark theme \u2014 preview/SVG-string path).\nconst DARK_THEME = {\n bg: '#1e1e28',\n participantBg: '#232329',\n participantBorder: '#555',\n participantText: '#e8e8ee',\n lifeline: '#444',\n messageLine: '#888',\n messageDash: '#666',\n messageText: '#e0e0e0',\n noteBg: '#3a3520',\n noteBorder: '#665e30',\n noteText: '#d4c870',\n blockBg: 'rgba(80,80,120,0.12)',\n blockBorder: '#555',\n blockLabel: '#a0a0b0',\n crossColor: '#e74c3c',\n};\n\nfunction escapeXml(str) {\n return String(str)\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n/**\n * Measure approximate text width (since we can't use DOM measurement in pure SVG generation).\n * Uses a rough character-width heuristic.\n */\nfunction measureText(text, fontSize) {\n const avgCharWidth = fontSize * 0.55;\n return text.length * avgCharWidth;\n}\n\n/**\n * Word-wrap text into lines that fit within maxWidth.\n */\nfunction wrapText(text, fontSize, maxWidth) {\n // Handle <br/> tags\n const segments = text.split(/<br\\s*\\/?>/i);\n const lines = [];\n for (const segment of segments) {\n const words = segment.split(/\\s+/);\n let currentLine = '';\n for (const word of words) {\n const testLine = currentLine ? currentLine + ' ' + word : word;\n if (measureText(testLine, fontSize) > maxWidth && currentLine) {\n lines.push(currentLine);\n currentLine = word;\n } else {\n currentLine = testLine;\n }\n }\n if (currentLine) lines.push(currentLine);\n }\n return lines.length > 0 ? lines : [''];\n}\n\n/**\n * Render a parsed sequence diagram to SVG markup.\n *\n * @param {Object} diagram - Parsed from parseSequenceDiagram()\n * @param {Object} opts - { width?, fitToContent? }\n * @returns {string} SVG markup string\n */\nexport function renderSequenceSVG(diagram, opts = {}) {\n if (!diagram || diagram.type !== 'sequenceDiagram') return '';\n\n const THEME = themeColors();\n\n const participants = diagram.participants;\n const messages = diagram.messages;\n const notes = diagram.notes;\n const blocks = diagram.blocks || [];\n\n const pCount = participants.length;\n if (pCount === 0) return '';\n\n // Build participant index map\n const pIndex = new Map();\n participants.forEach((p, i) => pIndex.set(p.name, i));\n\n // Calculate total width\n const contentWidth = (pCount - 1) * PARTICIPANT_GAP + PARTICIPANT_W;\n const totalWidth = opts.width || Math.max(contentWidth + SIDE_MARGIN * 2, 400);\n const startX = (totalWidth - contentWidth) / 2;\n\n // Participant X centers\n const pCenters = participants.map((_, i) => startX + i * PARTICIPANT_GAP + PARTICIPANT_W / 2);\n\n // Pre-calculate note heights to account for row expansion\n const noteAtMsg = new Map(); // msgIndex -> [{note, height}]\n for (const note of notes) {\n const fontSize = 11;\n const lines = wrapText(note.text, fontSize, NOTE_MAX_W - NOTE_PAD * 2);\n const h = lines.length * (fontSize + 4) + NOTE_PAD * 2;\n if (!noteAtMsg.has(note.atMessage)) noteAtMsg.set(note.atMessage, []);\n noteAtMsg.get(note.atMessage).push({ ...note, lines, height: h });\n }\n\n // Calculate message Y positions (accounting for notes that expand rows)\n const topBoxBottom = TOP_MARGIN + PARTICIPANT_H;\n let currentY = topBoxBottom + 30; // gap after top participant boxes\n\n const msgYPositions = [];\n for (let mi = 0; mi < messages.length; mi++) {\n // Check if notes appear before this message\n const notesBefore = noteAtMsg.get(mi);\n if (notesBefore) {\n const maxNoteH = Math.max(...notesBefore.map(n => n.height));\n currentY += maxNoteH + 10;\n }\n msgYPositions.push(currentY);\n currentY += MSG_ROW_HEIGHT;\n }\n\n // Notes after last message\n const notesAfterLast = noteAtMsg.get(messages.length);\n if (notesAfterLast) {\n const maxNoteH = Math.max(...notesAfterLast.map(n => n.height));\n currentY += maxNoteH + 10;\n }\n\n const bottomBoxTop = currentY + 20;\n const totalHeight = bottomBoxTop + PARTICIPANT_H + BOTTOM_MARGIN;\n\n // Start building SVG\n let svg = '';\n const defs = [];\n\n // Arrow markers\n defs.push(`<marker id=\"seq-arrow-open\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polyline points=\"1,1 9,3.5 1,6\" fill=\"none\" stroke=\"${THEME.messageLine}\" stroke-width=\"1.5\" stroke-linejoin=\"round\" />\n </marker>`);\n defs.push(`<marker id=\"seq-arrow-filled\" markerWidth=\"10\" markerHeight=\"7\" refX=\"9\" refY=\"3.5\" orient=\"auto\">\n <polygon points=\"1,1 9,3.5 1,6\" fill=\"${THEME.messageLine}\" stroke=\"none\" />\n </marker>`);\n\n // Background\n svg += `<rect x=\"0\" y=\"0\" width=\"${totalWidth}\" height=\"${totalHeight}\" fill=\"${THEME.bg}\" rx=\"8\" />`;\n\n // Title\n if (diagram.title) {\n svg += `<text x=\"${totalWidth / 2}\" y=\"${TOP_MARGIN - 8}\" text-anchor=\"middle\" fill=\"${THEME.participantText}\" font-size=\"14\" font-family=\"${FONT_FAMILY}\" font-weight=\"600\">${escapeXml(diagram.title)}</text>`;\n }\n\n // --- Lifelines (dashed vertical lines) ---\n for (let pi = 0; pi < pCount; pi++) {\n const cx = pCenters[pi];\n svg += `<line x1=\"${cx}\" y1=\"${topBoxBottom}\" x2=\"${cx}\" y2=\"${bottomBoxTop}\" stroke=\"${THEME.lifeline}\" stroke-width=\"1\" stroke-dasharray=\"6 4\" />`;\n }\n\n // --- Participant boxes (top) ---\n for (let pi = 0; pi < pCount; pi++) {\n const cx = pCenters[pi];\n const bx = cx - PARTICIPANT_W / 2;\n const by = TOP_MARGIN;\n svg += `<g data-seq-type=\"participant\" data-seq-id=\"${escapeXml(participants[pi].name)}\" data-seq-pos=\"top\">`;\n svg += `<rect x=\"${bx}\" y=\"${by}\" width=\"${PARTICIPANT_W}\" height=\"${PARTICIPANT_H}\" rx=\"4\" fill=\"${THEME.participantBg}\" stroke=\"${THEME.participantBorder}\" stroke-width=\"1.5\" />`;\n svg += `<text x=\"${cx}\" y=\"${by + PARTICIPANT_H / 2 + 1}\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"${THEME.participantText}\" font-size=\"13\" font-family=\"${FONT_FAMILY}\">${escapeXml(participants[pi].name)}</text>`;\n svg += `</g>`;\n }\n\n // --- Participant boxes (bottom) ---\n for (let pi = 0; pi < pCount; pi++) {\n const cx = pCenters[pi];\n const bx = cx - PARTICIPANT_W / 2;\n const by = bottomBoxTop;\n svg += `<g data-seq-type=\"participant\" data-seq-id=\"${escapeXml(participants[pi].name)}\" data-seq-pos=\"bottom\">`;\n svg += `<rect x=\"${bx}\" y=\"${by}\" width=\"${PARTICIPANT_W}\" height=\"${PARTICIPANT_H}\" rx=\"4\" fill=\"${THEME.participantBg}\" stroke=\"${THEME.participantBorder}\" stroke-width=\"1.5\" />`;\n svg += `<text x=\"${cx}\" y=\"${by + PARTICIPANT_H / 2 + 1}\" text-anchor=\"middle\" dominant-baseline=\"central\" fill=\"${THEME.participantText}\" font-size=\"13\" font-family=\"${FONT_FAMILY}\">${escapeXml(participants[pi].name)}</text>`;\n svg += `</g>`;\n }\n\n // --- Blocks (alt/loop/opt etc.) ---\n for (const block of blocks) {\n const startY = block.startMsg < msgYPositions.length\n ? msgYPositions[block.startMsg] - 20\n : topBoxBottom + 20;\n const endY = block.endMsg <= msgYPositions.length\n ? (block.endMsg < msgYPositions.length ? msgYPositions[block.endMsg] - 10 : currentY)\n : currentY;\n\n const blockX = startX - 15;\n const blockW = contentWidth + 30;\n\n svg += `<g data-seq-type=\"block\" data-block-type=\"${block.type}\">`;\n svg += `<rect x=\"${blockX}\" y=\"${startY}\" width=\"${blockW}\" height=\"${endY - startY}\" rx=\"4\" fill=\"${THEME.blockBg}\" stroke=\"${THEME.blockBorder}\" stroke-width=\"1\" stroke-dasharray=\"4 2\" />`;\n // Type label in top-left corner\n svg += `<rect x=\"${blockX}\" y=\"${startY}\" width=\"${measureText(block.type, 10) + 12}\" height=\"18\" rx=\"3\" fill=\"${THEME.blockBorder}\" />`;\n svg += `<text x=\"${blockX + 6}\" y=\"${startY + 12}\" fill=\"${THEME.bg}\" font-size=\"10\" font-family=\"${FONT_FAMILY}\" font-weight=\"600\">${escapeXml(block.type)}</text>`;\n // Condition label\n if (block.label) {\n svg += `<text x=\"${blockX + measureText(block.type, 10) + 20}\" y=\"${startY + 12}\" fill=\"${THEME.blockLabel}\" font-size=\"10\" font-family=\"${FONT_FAMILY}\" font-style=\"italic\">[${escapeXml(block.label)}]</text>`;\n }\n\n // Section dividers (else sections)\n for (let si = 1; si < block.sections.length; si++) {\n const section = block.sections[si];\n const secY = section.startMsg < msgYPositions.length\n ? msgYPositions[section.startMsg] - 15\n : endY - 10;\n svg += `<line x1=\"${blockX}\" y1=\"${secY}\" x2=\"${blockX + blockW}\" y2=\"${secY}\" stroke=\"${THEME.blockBorder}\" stroke-width=\"1\" stroke-dasharray=\"4 2\" />`;\n if (section.label) {\n svg += `<text x=\"${blockX + 8}\" y=\"${secY + 13}\" fill=\"${THEME.blockLabel}\" font-size=\"10\" font-family=\"${FONT_FAMILY}\" font-style=\"italic\">[${escapeXml(section.label)}]</text>`;\n }\n }\n svg += `</g>`;\n }\n\n // --- Messages ---\n for (let mi = 0; mi < messages.length; mi++) {\n const msg = messages[mi];\n const y = msgYPositions[mi];\n const fromIdx = pIndex.get(msg.from);\n const toIdx = pIndex.get(msg.to);\n if (fromIdx === undefined || toIdx === undefined) continue;\n\n const fromX = pCenters[fromIdx];\n const toX = pCenters[toIdx];\n const isSelf = fromIdx === toIdx;\n\n svg += `<g data-seq-type=\"message\" data-seq-idx=\"${mi}\">`;\n\n if (isSelf) {\n // Self-message: loop arrow to the right\n const loopW = 40;\n const loopH = 25;\n const dash = msg.solid ? '' : ` stroke-dasharray=\"6 3\"`;\n svg += `<path d=\"M ${fromX} ${y} L ${fromX + loopW} ${y} L ${fromX + loopW} ${y + loopH} L ${fromX + 4} ${y + loopH}\" fill=\"none\" stroke=\"${THEME.messageLine}\" stroke-width=\"1.5\"${dash} marker-end=\"url(#seq-arrow-open)\" />`;\n if (msg.text) {\n svg += `<text x=\"${fromX + loopW + 6}\" y=\"${y + loopH / 2 + 1}\" dominant-baseline=\"central\" fill=\"${THEME.messageText}\" font-size=\"12\" font-family=\"${FONT_FAMILY}\">${escapeXml(msg.text)}</text>`;\n }\n } else {\n const isLeft = toX < fromX;\n const lineEndX = isLeft ? toX + 4 : toX - 4;\n const dash = msg.solid ? '' : ` stroke-dasharray=\"6 3\"`;\n\n // Arrow line\n const markerId = msg.arrowHead === 'filled' ? 'seq-arrow-filled' : 'seq-arrow-open';\n\n if (msg.cross) {\n // Cross at end (lost message)\n svg += `<line x1=\"${fromX}\" y1=\"${y}\" x2=\"${lineEndX}\" y2=\"${y}\" stroke=\"${THEME.messageLine}\" stroke-width=\"1.5\"${dash} />`;\n // X mark\n const xSize = 6;\n svg += `<line x1=\"${toX - xSize}\" y1=\"${y - xSize}\" x2=\"${toX + xSize}\" y2=\"${y + xSize}\" stroke=\"${THEME.crossColor}\" stroke-width=\"2\" />`;\n svg += `<line x1=\"${toX + xSize}\" y1=\"${y - xSize}\" x2=\"${toX - xSize}\" y2=\"${y + xSize}\" stroke=\"${THEME.crossColor}\" stroke-width=\"2\" />`;\n } else {\n svg += `<line x1=\"${fromX}\" y1=\"${y}\" x2=\"${lineEndX}\" y2=\"${y}\" stroke=\"${THEME.messageLine}\" stroke-width=\"1.5\"${dash} marker-end=\"url(#${markerId})\" />`;\n }\n\n // Message text (centered above the line)\n if (msg.text) {\n const midX = (fromX + toX) / 2;\n const textContent = msg.number ? `${msg.number}. ${msg.text}` : msg.text;\n svg += `<text x=\"${midX}\" y=\"${y - 8}\" text-anchor=\"middle\" fill=\"${THEME.messageText}\" font-size=\"12\" font-family=\"${FONT_FAMILY}\">${escapeXml(textContent)}</text>`;\n }\n }\n\n svg += `</g>`;\n }\n\n // --- Notes ---\n for (const [msgIdx, noteGroup] of noteAtMsg.entries()) {\n const baseY = msgIdx < msgYPositions.length\n ? msgYPositions[msgIdx] - 15\n : (msgIdx > 0 ? msgYPositions[msgIdx - 1] + MSG_ROW_HEIGHT - 15 : topBoxBottom + 30);\n\n for (const note of noteGroup) {\n const targetIdxs = note.targets.map(t => pIndex.get(t)).filter(i => i !== undefined);\n if (targetIdxs.length === 0) continue;\n\n const fontSize = 11;\n const lineH = fontSize + 4;\n const noteH = note.lines.length * lineH + NOTE_PAD * 2;\n const noteW = Math.min(\n NOTE_MAX_W,\n Math.max(...note.lines.map(l => measureText(l, fontSize))) + NOTE_PAD * 2 + 10\n );\n\n let noteX;\n if (note.position === 'left of') {\n const px = pCenters[targetIdxs[0]];\n noteX = px - PARTICIPANT_W / 2 - noteW - 8;\n } else if (note.position === 'right of') {\n const px = pCenters[targetIdxs[0]];\n noteX = px + PARTICIPANT_W / 2 + 8;\n } else {\n // 'over' - center between targets\n if (targetIdxs.length >= 2) {\n const minP = Math.min(...targetIdxs);\n const maxP = Math.max(...targetIdxs);\n const center = (pCenters[minP] + pCenters[maxP]) / 2;\n noteX = center - noteW / 2;\n } else {\n noteX = pCenters[targetIdxs[0]] - noteW / 2;\n }\n }\n\n const noteY = baseY - noteH;\n\n svg += `<g data-seq-type=\"note\">`;\n svg += `<rect x=\"${noteX}\" y=\"${noteY}\" width=\"${noteW}\" height=\"${noteH}\" rx=\"3\" fill=\"${THEME.noteBg}\" stroke=\"${THEME.noteBorder}\" stroke-width=\"1\" />`;\n // Render wrapped text lines\n note.lines.forEach((line, li) => {\n svg += `<text x=\"${noteX + NOTE_PAD}\" y=\"${noteY + NOTE_PAD + li * lineH + fontSize}\" fill=\"${THEME.noteText}\" font-size=\"${fontSize}\" font-family=\"${FONT_FAMILY}\">${escapeXml(line)}</text>`;\n });\n svg += `</g>`;\n }\n }\n\n // Build final SVG\n const defsStr = defs.length > 0 ? `<defs>${defs.join('')}</defs>` : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${totalWidth}\" height=\"${totalHeight}\" viewBox=\"0 0 ${totalWidth} ${totalHeight}\">${defsStr}${svg}</svg>`;\n}\n\n/**\n * Generate preview SVG for the modal (fixed width).\n */\nexport function renderSequencePreviewSVG(diagram) {\n return renderSequenceSVG(diagram, { width: 620 });\n}\n\n/**\n * Parse raw mermaid source and render sequence SVG.\n * Returns SVG string or empty string if not a sequence diagram.\n */\nexport function parseAndRenderSequence(src) {\n const diagram = parseSequenceDiagram(src);\n if (!diagram) return '';\n return renderSequenceSVG(diagram);\n}\n\n/**\n * Render a sequence diagram onto the canvas as a real engine `Frame`\n * containing independent shapes \u2014 top + bottom participant boxes,\n * dashed lifelines, and a real Arrow (or Line for `--x`/`-x`) per\n * message. Each child is fully independent for click / drag / resize;\n * the Frame's `_diagramType` marker makes Frame.destroy() pull the\n * children along on delete, so the diagram still behaves as one\n * logical unit when discarded.\n *\n * Issue #34 bug #3 (follow-up to #24 per-actor split): drops the shared\n * `groupId` glue so clicking one shape selects only that shape.\n *\n * Notes and block frames are ordinary labelled rectangles. Self messages\n * use three line segments plus an arrow, keeping every visible component\n * editable with the same primitives users draw manually.\n */\nexport function renderSequenceOnCanvas(diagram) {\n if (!diagram || diagram.type !== 'sequenceDiagram') return false;\n if (!window.svg || !window.Rectangle || !window.Line || !window.Arrow) {\n console.error('[SequenceRenderer] Engine not initialized (Rectangle / Line / Arrow missing)');\n return false;\n }\n\n const participants = diagram.participants || [];\n const messages = diagram.messages || [];\n const notes = diagram.notes || [];\n const blocks = diagram.blocks || [];\n if (participants.length === 0) return false;\n\n // Mirror the layout math from renderSequenceSVG so the canvas layout\n // matches the modal preview.\n const pCount = participants.length;\n const contentWidth = (pCount - 1) * PARTICIPANT_GAP + PARTICIPANT_W;\n const totalWidth = Math.max(contentWidth + SIDE_MARGIN * 2, 400);\n const startX = (totalWidth - contentWidth) / 2;\n const pCenters = participants.map((_, i) => startX + i * PARTICIPANT_GAP + PARTICIPANT_W / 2);\n\n const topBoxBottom = TOP_MARGIN + PARTICIPANT_H;\n const noteAtMsg = new Map();\n notes.forEach((note) => {\n const lines = wrapText(note.text, 11, NOTE_MAX_W - NOTE_PAD * 2);\n const height = lines.length * 15 + NOTE_PAD * 2;\n if (!noteAtMsg.has(note.atMessage)) noteAtMsg.set(note.atMessage, []);\n noteAtMsg.get(note.atMessage).push({ ...note, lines, height });\n });\n const msgYPositions = [];\n let currentY = topBoxBottom + 30;\n for (let mi = 0; mi < messages.length; mi++) {\n const before = noteAtMsg.get(mi);\n if (before?.length) currentY += Math.max(...before.map(note => note.height)) + 10;\n msgYPositions.push(currentY);\n currentY += MSG_ROW_HEIGHT;\n }\n const trailingNotes = noteAtMsg.get(messages.length);\n if (trailingNotes?.length) currentY += Math.max(...trailingNotes.map(note => note.height)) + 10;\n const bottomBoxTop = currentY + 20;\n const totalHeight = bottomBoxTop + PARTICIPANT_H + BOTTOM_MARGIN;\n\n // Centre the diagram on the current viewport so the user sees it\n // right where they invoked the renderer.\n const vb = window.currentViewBox || { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n const ox = vb.x + vb.width / 2 - totalWidth / 2;\n const oy = vb.y + vb.height / 2 - totalHeight / 2;\n\n // \u2500\u2500 Wrapper frame \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n // Issue #34 bug #3: drop the shared groupId glue. Each child is\n // independent for click / drag / resize. The Frame's `_diagramType`\n // marker makes Frame.destroy() pull the children along on delete,\n // so the diagram still behaves as one logical unit when discarded.\n if (!window.Frame) {\n console.error('[SequenceRenderer] window.Frame missing \u2014 cannot wrap diagram');\n return false;\n }\n // Padding bumped 24 \u2192 60 so participant labels + message text near\n // the frame's edges stay inside on the new wider light canvas.\n const PADDING = 60;\n const TK = themeColors();\n const frameTitle = diagram.title || 'Sequence diagram';\n const frame = new window.Frame(\n ox - PADDING,\n oy - PADDING,\n totalWidth + PADDING * 2,\n totalHeight + PADDING * 2,\n {\n stroke: TK.blockBorder,\n strokeWidth: 1,\n fill: 'transparent',\n opacity: 0.7,\n frameName: frameTitle,\n }\n );\n frame._diagramType = 'mermaid-sequence';\n window.shapes.push(frame);\n if (window.pushCreateAction) window.pushCreateAction(frame);\n\n const created = [];\n\n // \u2500\u2500 Participants: top box + lifeline (and bottom box) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n const pIndex = new Map();\n for (let pi = 0; pi < pCount; pi++) {\n const p = participants[pi];\n pIndex.set(p.name, pi);\n const cx = pCenters[pi] + ox;\n const bx = cx - PARTICIPANT_W / 2;\n\n try {\n // Top participant box\n const topBox = new window.Rectangle(bx, TOP_MARGIN + oy, PARTICIPANT_W, PARTICIPANT_H, {\n stroke: TK.participantBorder,\n strokeWidth: 1.5,\n fill: TK.participantBg,\n fillStyle: 'solid',\n roughness: 1,\n label: p.name,\n labelColor: TK.participantText,\n });\n window.shapes.push(topBox);\n if (window.pushCreateAction) window.pushCreateAction(topBox);\n frame.addShapeToFrame(topBox);\n created.push(topBox);\n\n // Lifeline (dashed vertical line spanning the diagram height)\n const lifeline = new window.Line(\n { x: cx, y: topBoxBottom + oy },\n { x: cx, y: bottomBoxTop + oy },\n {\n stroke: TK.lifeline,\n strokeWidth: 1,\n strokeDasharray: '6 4',\n roughness: 0,\n }\n );\n window.shapes.push(lifeline);\n if (window.pushCreateAction) window.pushCreateAction(lifeline);\n frame.addShapeToFrame(lifeline);\n created.push(lifeline);\n\n // Bottom participant box (mirrors top \u2014 Mermaid convention)\n const bottomBox = new window.Rectangle(bx, bottomBoxTop + oy, PARTICIPANT_W, PARTICIPANT_H, {\n stroke: TK.participantBorder,\n strokeWidth: 1.5,\n fill: TK.participantBg,\n fillStyle: 'solid',\n roughness: 1,\n label: p.name,\n labelColor: TK.participantText,\n });\n window.shapes.push(bottomBox);\n if (window.pushCreateAction) window.pushCreateAction(bottomBox);\n frame.addShapeToFrame(bottomBox);\n created.push(bottomBox);\n } catch (err) {\n console.warn('[SequenceRenderer] Participant creation failed:', p.name, err);\n }\n }\n\n // \u2500\u2500 Blocks: editable containers behind message rows \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const block of blocks) {\n const startY = block.startMsg < msgYPositions.length ? msgYPositions[block.startMsg] - 22 : topBoxBottom + 15;\n const endY = block.endMsg < msgYPositions.length ? msgYPositions[block.endMsg] - 8 : currentY;\n try {\n const blockShape = new window.Rectangle(\n startX - 18 + ox,\n startY + oy,\n contentWidth + 36,\n Math.max(36, endY - startY),\n {\n stroke: TK.blockBorder,\n strokeWidth: 1,\n strokeDasharray: '5 3',\n fill: 'transparent',\n fillStyle: 'none',\n roughness: .5,\n label: [block.type, block.label].filter(Boolean).join(': '),\n labelColor: TK.blockLabel,\n labelFontSize: 10,\n }\n );\n window.shapes.push(blockShape);\n if (window.pushCreateAction) window.pushCreateAction(blockShape);\n frame.addShapeToFrame(blockShape);\n created.push(blockShape);\n } catch (err) {\n console.warn('[SequenceRenderer] Block creation failed:', block, err);\n }\n }\n\n // \u2500\u2500 Messages: arrow (or line for --x style) per row \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (let mi = 0; mi < messages.length; mi++) {\n const m = messages[mi];\n const fromI = pIndex.get(m.from);\n const toI = pIndex.get(m.to);\n if (fromI == null || toI == null) continue;\n\n const fromCx = pCenters[fromI] + ox;\n const toCx = pCenters[toI] + ox;\n const y = msgYPositions[mi] + oy;\n\n const labelText = m.number ? `${m.number}. ${m.text}` : m.text;\n\n // Solid vs dashed (sync vs async response). `cross` style (-x)\n // would render as a line with an X at the head \u2014 fall back to a\n // line for that, arrow otherwise.\n const isCross = !!m.cross && m.arrowHead === 'cross';\n const opts = {\n stroke: TK.messageLine,\n strokeWidth: 1.5,\n roughness: 0,\n strokeDasharray: m.solid ? '' : '6 4',\n label: labelText || '',\n labelColor: TK.messageText,\n };\n\n try {\n const sp = { x: fromCx, y };\n const ep = { x: toCx, y };\n if (fromI === toI) {\n const loopWidth = 46;\n const loopHeight = 28;\n const a = { x: fromCx, y };\n const b = { x: fromCx + loopWidth, y };\n const c = { x: fromCx + loopWidth, y: y + loopHeight };\n const d = { x: fromCx + 5, y: y + loopHeight };\n const segments = [\n new window.Line(a, b, opts),\n new window.Line(b, c, opts),\n new window.Arrow(c, d, opts),\n ];\n segments.forEach((segment) => {\n window.shapes.push(segment);\n if (window.pushCreateAction) window.pushCreateAction(segment);\n frame.addShapeToFrame(segment);\n created.push(segment);\n });\n continue;\n }\n const connector = isCross\n ? new window.Line(sp, ep, opts)\n : new window.Arrow(sp, ep, opts);\n window.shapes.push(connector);\n if (window.pushCreateAction) window.pushCreateAction(connector);\n frame.addShapeToFrame(connector);\n created.push(connector);\n } catch (err) {\n console.warn('[SequenceRenderer] Message creation failed:', m, err);\n }\n }\n\n\n // \u2500\u2500 Notes: one independently editable rectangle per note \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n for (const [messageIndex, noteGroup] of noteAtMsg.entries()) {\n const baseY = messageIndex < msgYPositions.length\n ? msgYPositions[messageIndex] - 15\n : (messageIndex > 0 ? msgYPositions[messageIndex - 1] + MSG_ROW_HEIGHT - 15 : topBoxBottom + 30);\n noteGroup.forEach((note, noteIndex) => {\n const indexes = note.targets.map(target => pIndex.get(target)).filter(index => index !== undefined);\n if (!indexes.length) return;\n const noteWidth = NOTE_MAX_W;\n let centerX = pCenters[indexes[0]];\n if (note.position === 'over' && indexes.length > 1) {\n centerX = (pCenters[Math.min(...indexes)] + pCenters[Math.max(...indexes)]) / 2;\n } else if (note.position === 'left of') {\n centerX -= PARTICIPANT_W / 2 + noteWidth / 2 + 8;\n } else if (note.position === 'right of') {\n centerX += PARTICIPANT_W / 2 + noteWidth / 2 + 8;\n }\n try {\n const noteShape = new window.Rectangle(\n centerX - noteWidth / 2 + ox,\n baseY - note.height - noteIndex * (note.height + 6) + oy,\n noteWidth,\n note.height,\n {\n stroke: TK.noteBorder,\n strokeWidth: 1,\n fill: TK.noteBg,\n fillStyle: 'solid',\n roughness: .7,\n label: note.text,\n labelColor: TK.noteText,\n labelFontSize: 11,\n }\n );\n window.shapes.push(noteShape);\n if (window.pushCreateAction) window.pushCreateAction(noteShape);\n frame.addShapeToFrame(noteShape);\n created.push(noteShape);\n } catch (err) {\n console.warn('[SequenceRenderer] Note creation failed:', note, err);\n }\n });\n }\n\n // Auto-select the first node so the user has feedback that the\n // diagram landed. Selecting a child (not the frame) reinforces the\n // \"independent shapes inside a frame\" model from issue #34 bug #3.\n const first = created[0];\n if (first) {\n window.currentShape = first;\n if (typeof first.selectShape === 'function') first.selectShape();\n }\n\n console.log(`[SequenceRenderer] Done: ${pCount} participants, ${messages.length} messages`);\n return true;\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/MermaidStructuredRenderer.js"],
4
- "sourcesContent": ["/* eslint-disable */\n/**\n * Native renderers for Mermaid ER and chart diagrams.\n *\n * Preview is SVG, while canvas placement deliberately creates ordinary\n * LixSketch shapes. That keeps entities, attributes, relationships, bars,\n * points, and legend items independently selectable and editable.\n */\n\nconst NS = 'http://www.w3.org/2000/svg';\nconst PALETTE = [\n { fill: '#8b7abb', stroke: '#665793' },\n { fill: '#a992cf', stroke: '#7762a6' },\n { fill: '#c2addc', stroke: '#8974aa' },\n { fill: '#7765a6', stroke: '#584883' },\n { fill: '#9d83c1', stroke: '#725b9a' },\n { fill: '#d1c3e7', stroke: '#927daf' },\n];\n\nfunction escapeXml(value) {\n return String(value ?? '')\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\nfunction contrastText(fill) {\n const raw = String(fill || '').replace('#', '');\n const hex = raw.length === 3 ? raw.split('').map(char => char + char).join('') : raw;\n if (!/^[0-9a-f]{6}$/i.test(hex)) return theme().text;\n const red = parseInt(hex.slice(0, 2), 16);\n const green = parseInt(hex.slice(2, 4), 16);\n const blue = parseInt(hex.slice(4, 6), 16);\n const luminance = .299 * red + .587 * green + .114 * blue;\n return luminance > 145 ? '#34304a' : '#ffffff';\n}\n\nfunction isDark() {\n return typeof document !== 'undefined' && document.body?.classList.contains('theme-dark');\n}\n\nfunction theme() {\n return isDark()\n ? { bg: '#20232a', text: '#f0eee8', line: '#aaa89f', frame: '#77766f', panel: '#292d34' }\n : { bg: '#fbfaf6', text: '#343832', line: '#6e746c', frame: '#b9b7ac', panel: '#f5f2ea' };\n}\n\nfunction sourceLines(src) {\n return src.split('\\n').map(line => line.trim()).filter(line => line && !line.startsWith('%%'));\n}\n\nexport function detectStructuredMermaid(src) {\n const header = sourceLines(src)[0]?.toLowerCase() || '';\n if (header === 'erdiagram') return 'er';\n if (/^pie(?:\\s|$)/.test(header) || /^xychart(?:-beta)?(?:\\s|$)/.test(header)) return 'chart';\n return null;\n}\n\n// ---------------------------------------------------------------------\n// Entity relationship diagrams\n// ---------------------------------------------------------------------\n\nexport function parseERDiagram(src) {\n const lines = sourceLines(src);\n if (lines[0]?.toLowerCase() !== 'erdiagram') return null;\n\n const entityMap = new Map();\n const relationships = [];\n let current = null;\n\n const ensureEntity = (name) => {\n if (!entityMap.has(name)) entityMap.set(name, { name, attributes: [] });\n return entityMap.get(name);\n };\n\n for (let index = 1; index < lines.length; index++) {\n const line = lines[index];\n const entityStart = line.match(/^([\\w-]+)\\s*\\{$/);\n if (entityStart) {\n current = ensureEntity(entityStart[1]);\n continue;\n }\n if (line === '}') {\n current = null;\n continue;\n }\n if (current) {\n const attribute = line.match(/^(\\S+)\\s+(\\S+)(?:\\s+(.+))?$/);\n if (attribute) {\n current.attributes.push({\n type: attribute[1],\n name: attribute[2],\n key: attribute[3] || '',\n });\n }\n continue;\n }\n\n // CUSTOMER ||--o{ ORDER : places\n const relation = line.match(/^([\\w-]+)\\s+([|o}{.]+)(?:--|\\.\\.)([|o}{.]+)\\s+([\\w-]+)\\s*:\\s*(.+)$/);\n if (relation) {\n ensureEntity(relation[1]);\n ensureEntity(relation[4]);\n relationships.push({\n from: relation[1],\n fromCardinality: relation[2],\n toCardinality: relation[3],\n to: relation[4],\n label: relation[5],\n });\n }\n }\n\n if (entityMap.size === 0) return null;\n return { type: 'erDiagram', title: 'Entity relationship diagram', entities: [...entityMap.values()], relationships };\n}\n\nfunction layoutER(diagram) {\n const width = 230;\n const headerHeight = 44;\n const rowHeight = 30;\n const columns = Math.max(1, Math.ceil(Math.sqrt(diagram.entities.length)));\n return diagram.entities.map((entity, index) => ({\n ...entity,\n x: 60 + (index % columns) * 330,\n y: 55 + Math.floor(index / columns) * 270,\n width,\n headerHeight,\n rowHeight,\n height: headerHeight + Math.max(1, entity.attributes.length) * rowHeight,\n color: PALETTE[index % PALETTE.length],\n }));\n}\n\nexport function renderERPreviewSVG(diagram) {\n if (!diagram?.entities?.length) return '';\n const TK = theme();\n const entities = layoutER(diagram);\n const byName = new Map(entities.map(entity => [entity.name, entity]));\n const maxX = Math.max(...entities.map(entity => entity.x + entity.width)) + 60;\n const maxY = Math.max(...entities.map(entity => entity.y + entity.height)) + 55;\n let content = `<rect width=\"${maxX}\" height=\"${maxY}\" rx=\"10\" fill=\"${TK.bg}\"/>`;\n content += `<defs><marker id=\"er-arrow\" markerWidth=\"9\" markerHeight=\"7\" refX=\"8\" refY=\"3.5\" orient=\"auto\"><path d=\"M1 1 L8 3.5 L1 6\" fill=\"none\" stroke=\"${TK.line}\" stroke-width=\"1.4\"/></marker></defs>`;\n\n for (const relation of diagram.relationships) {\n const from = byName.get(relation.from);\n const to = byName.get(relation.to);\n if (!from || !to) continue;\n const x1 = from.x + from.width / 2;\n const y1 = from.y + from.height / 2;\n const x2 = to.x + to.width / 2;\n const y2 = to.y + to.height / 2;\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n content += `<line x1=\"${x1}\" y1=\"${y1}\" x2=\"${x2}\" y2=\"${y2}\" stroke=\"${TK.line}\" stroke-width=\"1.6\" marker-end=\"url(#er-arrow)\"/>`;\n content += `<text x=\"${mx}\" y=\"${my - 8}\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"12\" font-family=\"lixFont\">${escapeXml(`${relation.fromCardinality} ${relation.label} ${relation.toCardinality}`)}</text>`;\n }\n\n for (const entity of entities) {\n content += `<g><rect x=\"${entity.x}\" y=\"${entity.y}\" width=\"${entity.width}\" height=\"${entity.height}\" rx=\"8\" fill=\"${TK.panel}\" stroke=\"${entity.color.stroke}\" stroke-width=\"1.5\"/>`;\n content += `<rect x=\"${entity.x}\" y=\"${entity.y}\" width=\"${entity.width}\" height=\"${entity.headerHeight}\" rx=\"8\" fill=\"${entity.color.fill}\" stroke=\"${entity.color.stroke}\" stroke-width=\"1.5\"/>`;\n content += `<text x=\"${entity.x + entity.width / 2}\" y=\"${entity.y + 27}\" text-anchor=\"middle\" fill=\"${contrastText(entity.color.fill)}\" font-size=\"14\" font-weight=\"600\" font-family=\"lixFont\">${escapeXml(entity.name)}</text>`;\n const attributes = entity.attributes.length ? entity.attributes : [{ type: '', name: 'No attributes', key: '' }];\n attributes.forEach((attribute, row) => {\n const y = entity.y + entity.headerHeight + row * entity.rowHeight;\n content += `<line x1=\"${entity.x}\" y1=\"${y}\" x2=\"${entity.x + entity.width}\" y2=\"${y}\" stroke=\"${TK.frame}\" stroke-width=\"0.8\"/>`;\n content += `<text x=\"${entity.x + 10}\" y=\"${y + 20}\" fill=\"${TK.text}\" font-size=\"11\" font-family=\"lixCode\">${escapeXml([attribute.type, attribute.name, attribute.key].filter(Boolean).join(' '))}</text>`;\n });\n content += '</g>';\n }\n return `<svg xmlns=\"${NS}\" width=\"600\" height=\"450\" viewBox=\"0 0 ${maxX} ${maxY}\">${content}</svg>`;\n}\n\n// ---------------------------------------------------------------------\n// Pie and XY charts\n// ---------------------------------------------------------------------\n\nfunction numberList(value) {\n return value.replace(/^\\[|\\]$/g, '').split(',').map(item => Number(item.trim())).filter(Number.isFinite);\n}\n\nexport function parseChartDiagram(src) {\n const lines = sourceLines(src);\n const header = lines[0]?.toLowerCase() || '';\n if (/^pie(?:\\s|$)/.test(header)) {\n let title = lines[0].replace(/^pie(?:\\s+showData)?\\s*/i, '').replace(/^title\\s+/i, '').trim() || 'Pie chart';\n const values = [];\n for (let index = 1; index < lines.length; index++) {\n const titleMatch = lines[index].match(/^title\\s+(.+)$/i);\n if (titleMatch) { title = titleMatch[1]; continue; }\n const item = lines[index].match(/^\"?(.+?)\"?\\s*:\\s*(-?\\d+(?:\\.\\d+)?)$/);\n if (item) values.push({ label: item[1], value: Number(item[2]) });\n }\n return values.length ? { type: 'chart', kind: 'pie', title, categories: values.map(v => v.label), series: [{ name: title, values: values.map(v => v.value) }] } : null;\n }\n if (!/^xychart(?:-beta)?(?:\\s|$)/.test(header)) return null;\n let title = 'Chart';\n let categories = [];\n const series = [];\n for (let index = 1; index < lines.length; index++) {\n const titleMatch = lines[index].match(/^title\\s+\"?(.+?)\"?$/i);\n const axisMatch = lines[index].match(/^x-axis(?:\\s+\".*?\")?\\s+(\\[.+\\])/i);\n const seriesMatch = lines[index].match(/^(bar|line)(?:\\s+\"?([^\"\\[]+)\"?)?\\s+(\\[.+\\])$/i);\n if (titleMatch) title = titleMatch[1];\n else if (axisMatch) categories = axisMatch[1].replace(/^\\[|\\]$/g, '').split(',').map(v => v.trim().replace(/^\"|\"$/g, ''));\n else if (seriesMatch) series.push({ kind: seriesMatch[1].toLowerCase(), name: seriesMatch[2]?.trim() || seriesMatch[1], values: numberList(seriesMatch[3]) });\n }\n const maxItems = Math.max(0, ...series.map(item => item.values.length));\n if (!categories.length) categories = Array.from({ length: maxItems }, (_, index) => String(index + 1));\n return series.length ? { type: 'chart', kind: 'xy', title, categories, series } : null;\n}\n\n// Mermaid permits bar and line declarations in one xychart. LixSketch keeps a\n// bar chart visually bar-only: when at least one bar series exists, line\n// series (and their point markers) are omitted consistently from preview and\n// canvas placement. A chart made only from line declarations remains a line\n// chart.\nfunction renderedSeries(chart) {\n if (chart?.kind !== 'xy') return chart?.series || [];\n const bars = chart.series.filter(series => series.kind === 'bar');\n return bars.length ? bars : chart.series.filter(series => series.kind === 'line');\n}\n\nexport function renderChartPreviewSVG(chart) {\n if (!chart?.series?.length) return '';\n const TK = theme();\n const width = 720;\n const height = 450;\n\n if (chart.kind === 'pie') {\n const values = chart.series[0].values.map(value => Math.max(0, value));\n const total = values.reduce((sum, value) => sum + value, 0);\n if (total <= 0) return '';\n const cx = 255;\n const cy = 235;\n const radius = 145;\n let startAngle = -Math.PI / 2;\n let content = `<rect width=\"${width}\" height=\"${height}\" rx=\"10\" fill=\"${TK.bg}\"/><text x=\"${width / 2}\" y=\"32\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"18\" font-family=\"lixFont\">${escapeXml(chart.title)}</text>`;\n\n values.forEach((value, index) => {\n const endAngle = startAngle + value / total * Math.PI * 2;\n const x1 = cx + Math.cos(startAngle) * radius;\n const y1 = cy + Math.sin(startAngle) * radius;\n const x2 = cx + Math.cos(endAngle) * radius;\n const y2 = cy + Math.sin(endAngle) * radius;\n const largeArc = endAngle - startAngle > Math.PI ? 1 : 0;\n const color = PALETTE[index % PALETTE.length];\n content += `<path d=\"M ${cx} ${cy} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2} Z\" fill=\"${color.fill}\" stroke=\"${TK.bg}\" stroke-width=\"3\"/>`;\n const percent = Math.round(value / total * 100);\n const legendY = 125 + index * 42;\n content += `<rect x=\"460\" y=\"${legendY - 14}\" width=\"18\" height=\"18\" rx=\"4\" fill=\"${color.fill}\" stroke=\"${color.stroke}\"/><text x=\"488\" y=\"${legendY}\" fill=\"${TK.text}\" font-size=\"12\" font-family=\"lixFont\">${escapeXml(chart.categories[index] || index + 1)} \u2014 ${value} (${percent}%)</text>`;\n startAngle = endAngle;\n });\n return `<svg xmlns=\"${NS}\" width=\"600\" height=\"450\" viewBox=\"0 0 ${width} ${height}\">${content}</svg>`;\n }\n\n const left = 70;\n const top = 60;\n const plotWidth = 580;\n const plotHeight = 300;\n const seriesToRender = renderedSeries(chart);\n const values = seriesToRender.flatMap(series => series.values);\n const maximum = Math.max(1, ...values.map(Math.abs));\n const categoryCount = Math.max(1, chart.categories.length);\n const slot = plotWidth / categoryCount;\n let content = `<rect width=\"${width}\" height=\"${height}\" rx=\"10\" fill=\"${TK.bg}\"/><text x=\"${width / 2}\" y=\"32\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"18\" font-family=\"lixFont\">${escapeXml(chart.title)}</text>`;\n content += `<line x1=\"${left}\" y1=\"${top}\" x2=\"${left}\" y2=\"${top + plotHeight}\" stroke=\"${TK.line}\"/><line x1=\"${left}\" y1=\"${top + plotHeight}\" x2=\"${left + plotWidth}\" y2=\"${top + plotHeight}\" stroke=\"${TK.line}\"/>`;\n\n chart.categories.forEach((category, index) => {\n content += `<text x=\"${left + slot * (index + .5)}\" y=\"${top + plotHeight + 24}\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"11\" font-family=\"lixFont\">${escapeXml(category)}</text>`;\n });\n\n seriesToRender.forEach((series, seriesIndex) => {\n const color = PALETTE[seriesIndex % PALETTE.length];\n if (series.kind === 'line') {\n const points = series.values.map((value, index) => `${left + slot * (index + .5)},${top + plotHeight - Math.abs(value) / maximum * plotHeight}`).join(' ');\n content += `<polyline points=\"${points}\" fill=\"none\" stroke=\"${color.stroke}\" stroke-width=\"3\"/>`;\n series.values.forEach((value, index) => content += `<circle cx=\"${left + slot * (index + .5)}\" cy=\"${top + plotHeight - Math.abs(value) / maximum * plotHeight}\" r=\"5\" fill=\"${color.fill}\" stroke=\"${color.stroke}\" stroke-width=\"2\"/>`);\n } else {\n const barWidth = Math.max(12, slot * .7 / seriesToRender.length);\n series.values.forEach((value, index) => {\n const barHeight = Math.abs(value) / maximum * plotHeight;\n const x = left + slot * index + slot * .15 + seriesIndex * barWidth;\n content += `<rect x=\"${x}\" y=\"${top + plotHeight - barHeight}\" width=\"${barWidth}\" height=\"${barHeight}\" rx=\"4\" fill=\"${color.fill}\" stroke=\"${color.stroke}\" stroke-width=\"1.5\"/><text x=\"${x + barWidth / 2}\" y=\"${top + plotHeight - barHeight - 7}\" text-anchor=\"middle\" fill=\"${TK.text}\" font-size=\"10\" font-family=\"lixFont\">${value}</text>`;\n });\n }\n });\n return `<svg xmlns=\"${NS}\" width=\"600\" height=\"450\" viewBox=\"0 0 ${width} ${height}\">${content}</svg>`;\n}\n\n// ---------------------------------------------------------------------\n// Native canvas placement helpers\n// ---------------------------------------------------------------------\n\nfunction push(shape, frame) {\n if (!shape) return null;\n window.shapes.push(shape);\n if (window.pushCreateAction) window.pushCreateAction(shape);\n if (frame?.addShapeToFrame) frame.addShapeToFrame(shape);\n return shape;\n}\n\nfunction pushText(text, x, y, fontSize, fill, frame, textAnchor = 'start') {\n if (!window.TextShape || !window.svg) return null;\n const group = document.createElementNS(NS, 'g');\n group.setAttribute('data-type', 'text-group');\n group.setAttribute('transform', `translate(${x}, ${y})`);\n group.setAttribute('data-x', x);\n group.setAttribute('data-y', y);\n\n const element = document.createElementNS(NS, 'text');\n element.setAttribute('x', 0);\n element.setAttribute('y', 0);\n element.setAttribute('dominant-baseline', 'central');\n element.setAttribute('text-anchor', textAnchor);\n element.setAttribute('fill', fill);\n element.setAttribute('font-size', fontSize);\n element.setAttribute('font-family', 'lixFont, sans-serif');\n element.setAttribute('data-initial-font', 'lixFont');\n element.setAttribute('data-initial-color', fill);\n element.setAttribute('data-initial-size', `${fontSize}px`);\n element.textContent = text;\n group.appendChild(element);\n window.svg.appendChild(group);\n return push(new window.TextShape(group), frame);\n}\n\nfunction canvasOrigin(width, height) {\n const vb = window.currentViewBox || { x: 0, y: 0, width: window.innerWidth, height: window.innerHeight };\n return { x: vb.x + vb.width / 2 - width / 2, y: vb.y + vb.height / 2 - height / 2 };\n}\n\nfunction createFrame(x, y, width, height, name, type) {\n const TK = theme();\n const frame = new window.Frame(x - 45, y - 45, width + 90, height + 90, {\n stroke: TK.frame, strokeWidth: 1, fill: 'transparent', opacity: .75,\n frameName: name, labelColor: TK.text,\n });\n frame._diagramType = type;\n push(frame);\n return frame;\n}\n\nfunction selectOnlyFrame(frame) {\n if (!frame) return;\n if (window.multiSelection?.clearSelection) window.multiSelection.clearSelection();\n if (window.currentShape && window.currentShape !== frame && typeof window.currentShape.removeSelection === 'function') {\n window.currentShape.removeSelection();\n }\n if (window.__deselectTextElement) window.__deselectTextElement();\n window.currentShape = frame;\n if (typeof frame.selectFrame === 'function') frame.selectFrame();\n}\n\nexport function renderEROnCanvas(diagram) {\n if (!diagram?.entities?.length || !window.Rectangle || !window.Arrow || !window.Frame) return false;\n const TK = theme();\n const entities = layoutER(diagram);\n const width = Math.max(...entities.map(entity => entity.x + entity.width)) + 40;\n const height = Math.max(...entities.map(entity => entity.y + entity.height)) + 40;\n const origin = canvasOrigin(width, height);\n const frame = createFrame(origin.x, origin.y, width, height, diagram.title, 'mermaid-er');\n const entityShapes = new Map();\n let first = null;\n\n for (const entity of entities) {\n const x = origin.x + entity.x;\n const y = origin.y + entity.y;\n const header = push(new window.Rectangle(x, y, entity.width, entity.headerHeight, {\n stroke: entity.color.stroke, strokeWidth: 1.5, fill: entity.color.fill, fillStyle: 'solid', roughness: 0, fillWeight: 0.5,\n label: entity.name, labelColor: contrastText(entity.color.fill), labelFontSize: 15, labelBg: false,\n }), frame);\n if (!first) first = header;\n entityShapes.set(entity.name, { shape: header, x, y, width: entity.width, height: entity.headerHeight });\n const attributes = entity.attributes.length ? entity.attributes : [{ type: '', name: 'No attributes', key: '' }];\n attributes.forEach((attribute, row) => push(new window.Rectangle(\n x, y + entity.headerHeight + row * entity.rowHeight, entity.width, entity.rowHeight,\n { stroke: TK.frame, strokeWidth: 1, fill: TK.panel, fillStyle: 'solid', roughness: 0, fillWeight: 0.5,\n label: [attribute.type, attribute.name, attribute.key].filter(Boolean).join(' '), labelColor: TK.text, labelFontSize: 11, labelBg: false }\n ), frame));\n }\n\n for (const relation of diagram.relationships) {\n const from = entityShapes.get(relation.from);\n const to = entityShapes.get(relation.to);\n if (!from || !to) continue;\n const fromCenter = { x: from.x + from.width / 2, y: from.y + from.height / 2 };\n const toCenter = { x: to.x + to.width / 2, y: to.y + to.height / 2 };\n // Anchor the arrow at the actual box boundary (not the box center) so\n // it terminates at the entity edge instead of drawing through \u2014 and\n // over \u2014 the header label, and so autoAttach's nearest-side check\n // (which compares against this point) resolves to the side actually\n // facing the other entity rather than whichever side happens to be\n // closest to the geometric center on a short, wide header box.\n const start = rectBoundaryPoint(from, toCenter);\n const end = rectBoundaryPoint(to, fromCenter);\n const arrow = push(new window.Arrow(start, end, {\n stroke: TK.line, strokeWidth: 1.5, roughness: 0,\n label: `${relation.fromCardinality} ${relation.label} ${relation.toCardinality}`,\n labelColor: TK.text, labelBg: false, labelOffsetY: -12,\n }), frame);\n if (arrow && window.__autoAttach) {\n window.__autoAttach(arrow, from.shape, true, start);\n window.__autoAttach(arrow, to.shape, false, end);\n }\n }\n if (first?.selectShape) { window.currentShape = first; first.selectShape(); }\n return true;\n}\n\n// Intersection of the line from `box`'s center toward `target` with box's\n// own rectangular boundary. Used to anchor ER relationship arrows exactly\n// at the entity edge instead of the entity center.\nfunction rectBoundaryPoint(box, target) {\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n const dx = target.x - cx;\n const dy = target.y - cy;\n const hw = box.width / 2;\n const hh = box.height / 2;\n if (dx === 0 && dy === 0) return { x: cx, y: cy };\n const scale = 1 / Math.max(Math.abs(dx) / hw, Math.abs(dy) / hh);\n return { x: cx + dx * scale, y: cy + dy * scale };\n}\n\nexport function renderChartOnCanvas(chart) {\n if (!chart?.series?.length || !window.Rectangle || !window.Circle || !window.Line || !window.FreehandStroke || !window.Frame) return false;\n if (chart.kind === 'pie') return renderPieOnCanvas(chart);\n const TK = theme();\n const width = 720;\n const height = 450;\n const origin = canvasOrigin(width, height);\n const frame = createFrame(origin.x, origin.y, width, height, chart.title, 'mermaid-chart');\n const left = origin.x + 70;\n const top = origin.y + 65;\n const plotWidth = 580;\n const plotHeight = 300;\n const seriesToRender = renderedSeries(chart);\n const values = seriesToRender.flatMap(series => series.values);\n const maximum = Math.max(1, ...values.map(Math.abs));\n const slot = plotWidth / Math.max(1, chart.categories.length);\n push(new window.Line({ x: left, y: top }, { x: left, y: top + plotHeight }, { stroke: TK.line, strokeWidth: 1.5, roughness: 0 }), frame);\n push(new window.Line({ x: left, y: top + plotHeight }, { x: left + plotWidth, y: top + plotHeight }, { stroke: TK.line, strokeWidth: 1.5, roughness: 0 }), frame);\n\n // Match the preview layout: categories live below the axis and values sit\n // above bars. Embedding both strings in the rectangle used to add an\n // opaque canvas-coloured label pill through the middle of every bar,\n // visually splitting it and changing the perceived series colour.\n chart.categories.forEach((category, index) => pushText(\n category,\n left + slot * (index + .5),\n top + plotHeight + 24,\n 11,\n TK.text,\n frame,\n 'middle',\n ));\n\n seriesToRender.forEach((series, seriesIndex) => {\n const color = PALETTE[seriesIndex % PALETTE.length];\n if (series.kind === 'line') {\n const linePoints = series.values.map((value, index) => {\n const point = { x: left + slot * (index + .5), y: top + plotHeight - Math.abs(value) / maximum * plotHeight };\n push(new window.Circle(point.x, point.y, 8, 8, {\n stroke: color.stroke, strokeWidth: 2, fill: color.fill,\n fillStyle: 'solid', roughness: 0, disableMultiStroke: true,\n }), frame);\n return [point.x, point.y, .5];\n });\n if (linePoints.length > 1) {\n push(new window.FreehandStroke(linePoints, {\n stroke: color.stroke,\n strokeWidth: 3,\n thinning: 0,\n roughness: 0,\n strokeStyle: 'solid',\n }), frame);\n }\n } else {\n const barWidth = Math.max(18, slot * .7 / seriesToRender.length);\n series.values.forEach((value, index) => {\n const barHeight = Math.max(8, Math.abs(value) / maximum * plotHeight);\n const x = left + slot * index + slot * .15 + seriesIndex * barWidth;\n push(new window.Rectangle(x, top + plotHeight - barHeight, barWidth, barHeight, {\n stroke: color.stroke, strokeWidth: 1.5, fill: color.fill,\n fillStyle: 'solid', roughness: 0, disableMultiStroke: true,\n disableMultiStrokeFill: true, preserveVertices: true,\n }), frame);\n pushText(String(value), x + barWidth / 2, top + plotHeight - barHeight - 7, 10, TK.text, frame, 'middle');\n });\n }\n });\n selectOnlyFrame(frame);\n return true;\n}\n\nfunction renderPieOnCanvas(chart) {\n if (!window.FreehandStroke || !window.TextShape) return false;\n const width = 720;\n const height = 450;\n const origin = canvasOrigin(width, height);\n const frame = createFrame(origin.x, origin.y, width, height, chart.title, 'mermaid-pie');\n const values = chart.series[0].values.map(value => Math.max(0, value));\n const total = values.reduce((sum, value) => sum + value, 0);\n if (total <= 0) return false;\n\n const cx = origin.x + 255;\n const cy = origin.y + 235;\n const radius = 145;\n let startAngle = -Math.PI / 2;\n\n values.forEach((value, index) => {\n const sweep = value / total * Math.PI * 2;\n const endAngle = startAngle + sweep;\n const steps = Math.max(6, Math.ceil(sweep / (Math.PI / 60)));\n const points = [[cx, cy, .5]];\n for (let step = 0; step <= steps; step++) {\n const angle = startAngle + sweep * (step / steps);\n points.push([\n cx + Math.cos(angle) * radius,\n cy + Math.sin(angle) * radius,\n .5,\n ]);\n }\n const color = PALETTE[index % PALETTE.length];\n push(new window.FreehandStroke(points, {\n stroke: color.fill,\n strokeWidth: 3,\n outlineStroke: theme().bg,\n outlineWidth: 3,\n closedFill: true,\n roughness: 0,\n strokeStyle: 'solid',\n }), frame);\n const percent = Math.round(value / total * 100);\n const legendY = origin.y + 125 + index * 42;\n push(new window.Rectangle(origin.x + 460, legendY - 14, 18, 18, {\n stroke: color.stroke,\n strokeWidth: 1,\n fill: color.fill,\n fillStyle: 'solid',\n roughness: .5,\n }), frame);\n pushText(\n `${chart.categories[index] || index + 1} \u2014 ${value} (${percent}%)`,\n origin.x + 488,\n legendY,\n 12,\n theme().text,\n frame,\n );\n startAngle = endAngle;\n });\n\n selectOnlyFrame(frame);\n return true;\n}\n"],
5
- "mappings": "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",
6
- "names": ["title", "values", "content"]
7
- }
@@ -1,9 +0,0 @@
1
- "use client";
2
- import {
3
- Rectangle
4
- } from "./chunk-FETTJLCV.js";
5
- import "./chunk-PAKA6HUX.js";
6
- export {
7
- Rectangle
8
- };
9
- //# sourceMappingURL=Rectangle-S7XUKWYD.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/core/SceneSerializer.js"],
4
- "sourcesContent": ["/* eslint-disable */\n/**\n * SceneSerializer - Save and load .lixsketch scene files\n *\n * Format: JSON with metadata + serialized shapes array\n * File extension: .lixsketch (actually JSON)\n */\n\nimport { Rectangle } from '../shapes/Rectangle.js';\nimport { Circle } from '../shapes/Circle.js';\nimport { Line } from '../shapes/Line.js';\nimport { Arrow } from '../shapes/Arrow.js';\nimport { FreehandStroke } from '../shapes/FreehandStroke.js';\nimport { Frame } from '../shapes/Frame.js';\nimport { normalizeWebEmbedUrl } from './WebEmbedPolicy.js';\nimport { TextShape } from '../shapes/TextShape.js';\nimport { CodeShape } from '../shapes/CodeShape.js';\nimport { ImageShape } from '../shapes/ImageShape.js';\nimport { IconShape } from '../shapes/IconShape.js';\n\nconst FORMAT_VERSION = 1;\n\n// Generate a unique session ID for each scene\nlet _sessionID = null;\nexport function getSessionID() {\n if (!_sessionID) {\n _sessionID = `lx-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n return _sessionID;\n}\nexport function resetSessionID() {\n _sessionID = null;\n}\n\nfunction cloneOptions(options) {\n return JSON.parse(JSON.stringify(options));\n}\n\nfunction restoreDocBlockLinks(shape, data) {\n const ids = [...new Set((Array.isArray(data.docBlockIds)\n ? data.docBlockIds\n : (data.docBlockId ? [data.docBlockId] : [])).filter(Boolean))];\n shape.docBlockIds = ids;\n delete shape.docBlockId;\n if (ids.length) {\n (shape.group || shape.element)?.setAttribute('data-doc-block-ids', JSON.stringify(ids));\n }\n}\n\n// ============================================================\n// SERIALIZE a single shape to plain data\n// ============================================================\nfunction serializeShape(shape) {\n const base = {\n shapeID: shape.shapeID,\n // Optional many-to-many connections to BlockNote document blocks.\n // Stored with the encrypted scene so navigation survives restore.\n docBlockIds: [...new Set((Array.isArray(shape.docBlockIds)\n ? shape.docBlockIds\n : (shape.docBlockId ? [shape.docBlockId] : [])).filter(Boolean))],\n parentFrame: shape.parentFrame ? shape.parentFrame.shapeID : null,\n // Group membership \u2014 null when the shape isn't part of a group.\n // All shapes sharing a non-null groupId move/resize/rotate as a\n // unit (see Selection.handleMultiSelectionMouseDown).\n groupId: shape.groupId || null,\n };\n\n switch (shape.shapeName) {\n case 'rectangle':\n return {\n ...base,\n type: 'rectangle',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'circle':\n return {\n ...base,\n type: 'circle',\n x: shape.x, y: shape.y,\n rx: shape.rx, ry: shape.ry,\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'line':\n return {\n ...base,\n type: 'line',\n startPoint: { x: shape.startPoint.x, y: shape.startPoint.y },\n endPoint: { x: shape.endPoint.x, y: shape.endPoint.y },\n controlPoint: shape.controlPoint ? { x: shape.controlPoint.x, y: shape.controlPoint.y } : null,\n isCurved: shape.isCurved || false,\n options: cloneOptions(shape.options),\n };\n\n case 'arrow': {\n const data = {\n ...base,\n type: 'arrow',\n startPoint: { x: shape.startPoint.x, y: shape.startPoint.y },\n endPoint: { x: shape.endPoint.x, y: shape.endPoint.y },\n options: cloneOptions(shape.options),\n arrowOutlineStyle: shape.arrowOutlineStyle,\n arrowHeadStyle: shape.arrowHeadStyle,\n arrowCurved: shape.arrowCurved,\n arrowCurveAmount: shape.arrowCurveAmount,\n };\n if (shape.controlPoint1) data.controlPoint1 = { x: shape.controlPoint1.x, y: shape.controlPoint1.y };\n if (shape.controlPoint2) data.controlPoint2 = { x: shape.controlPoint2.x, y: shape.controlPoint2.y };\n // Serialize attachments by shapeID\n if (shape.startAttachment) data.startAttachmentID = shape.startAttachment.shapeID;\n if (shape.endAttachment) data.endAttachmentID = shape.endAttachment.shapeID;\n return data;\n }\n\n case 'freehandStroke':\n return {\n ...base,\n type: 'freehandStroke',\n points: JSON.parse(JSON.stringify(shape.points)),\n rotation: shape.rotation,\n options: cloneOptions(shape.options),\n };\n\n case 'frame':\n return {\n ...base,\n type: 'frame',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n frameName: shape.frameName,\n fillStyle: shape.fillStyle || 'transparent',\n fillColor: shape.fillColor || '#1e1e28',\n gridSize: shape.gridSize || 20,\n gridColor: shape.gridColor || 'rgba(255,255,255,0.06)',\n frameType: shape._frameType || null,\n webEmbedURL: shape._frameType === 'web-embed' ? shape._webEmbedURL : null,\n options: cloneOptions(shape.options),\n // Issue #24 bug #10: filter out null / undefined / shapeID-less\n // children. A stale reference would serialize as `null` and the\n // load path would skip it (logging a misleading \"missing shape\"\n // warning) \u2014 but also previously skewed the order tracking.\n containedShapeIDs: shape.containedShapes\n ? Array.from(shape.containedShapes)\n .filter(s => s && s.shapeID)\n .map(s => s.shapeID)\n : [],\n };\n\n case 'text': {\n const group = shape.group;\n return {\n ...base,\n type: 'text',\n x: shape.x, y: shape.y,\n rotation: shape.rotation,\n groupHTML: group.cloneNode(true).outerHTML,\n };\n }\n\n case 'code': {\n const group = shape.group;\n return {\n ...base,\n type: 'code',\n x: shape.x, y: shape.y,\n rotation: shape.rotation,\n groupHTML: group.cloneNode(true).outerHTML,\n };\n }\n\n case 'image': {\n const el = shape.element;\n return {\n ...base,\n type: 'image',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n href: el.getAttribute('href') || el.getAttributeNS('http://www.w3.org/1999/xlink', 'href') || '',\n sizeBytes: Number(el.__fileSize || el.getAttribute('data-file-size')) || 0,\n cloudinaryId: el.getAttribute('data-cloudinary-id') || null,\n storageProvider: el.getAttribute('data-storage-provider') || 'platform_cloudinary',\n storageCloudName: el.getAttribute('data-storage-cloud-name') || null,\n aiGenerated: el.getAttribute('data-ai-generated') === 'true',\n aiModel: el.getAttribute('data-ai-model') || null,\n frameType: shape._frameType || null,\n graphData: shape._frameType === 'graph' && shape._graphData\n ? cloneOptions(shape._graphData)\n : null,\n };\n }\n\n case 'icon': {\n const el = shape.element;\n return {\n ...base,\n type: 'icon',\n x: shape.x, y: shape.y,\n width: shape.width, height: shape.height,\n rotation: shape.rotation,\n elementHTML: el.cloneNode(true).outerHTML,\n viewboxWidth: parseFloat(el.getAttribute('data-viewbox-width')) || 24,\n viewboxHeight: parseFloat(el.getAttribute('data-viewbox-height')) || 24,\n };\n }\n\n default:\n console.warn('[SceneSerializer] Unknown shape type:', shape.shapeName);\n return null;\n }\n}\n\n// ============================================================\n// DESERIALIZE: Create a shape from saved data\n// ============================================================\nfunction deserializeShape(data) {\n const svgEl = window.svg;\n if (!svgEl) return null;\n const ns = 'http://www.w3.org/2000/svg';\n\n switch (data.type) {\n case 'rectangle': {\n const shape = new Rectangle(data.x, data.y, data.width, data.height, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'circle': {\n const shape = new Circle(data.x, data.y, data.rx, data.ry, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'line': {\n const shape = new Line(data.startPoint, data.endPoint, data.options || {});\n if (data.controlPoint) shape.controlPoint = data.controlPoint;\n if (data.isCurved) shape.isCurved = data.isCurved;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'arrow': {\n const shape = new Arrow(data.startPoint, data.endPoint, data.options || {});\n if (data.controlPoint1) shape.controlPoint1 = data.controlPoint1;\n if (data.controlPoint2) shape.controlPoint2 = data.controlPoint2;\n if (data.arrowOutlineStyle) shape.arrowOutlineStyle = data.arrowOutlineStyle;\n if (data.arrowHeadStyle) shape.arrowHeadStyle = data.arrowHeadStyle;\n if (data.arrowCurved) shape.arrowCurved = data.arrowCurved;\n if (data.arrowCurveAmount) shape.arrowCurveAmount = data.arrowCurveAmount;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'freehandStroke': {\n const shape = new FreehandStroke(data.points, data.options || {});\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'frame': {\n const frameOpts = { ...(data.options || {}), frameName: data.frameName || 'Frame' };\n if (data.fillStyle) frameOpts.fillStyle = data.fillStyle;\n if (data.fillColor) frameOpts.fillColor = data.fillColor;\n if (data.gridSize) frameOpts.gridSize = data.gridSize;\n if (data.gridColor) frameOpts.gridColor = data.gridColor;\n const embedURL = data.frameType === 'web-embed' ? normalizeWebEmbedUrl(data.webEmbedURL) : null;\n if (embedURL) { frameOpts.frameType = 'web-embed'; frameOpts.webEmbedURL = embedURL; }\n const shape = new Frame(data.x, data.y, data.width, data.height, frameOpts);\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n shape.draw();\n return shape;\n }\n\n case 'text': {\n if (!data.groupHTML) return null;\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.groupHTML}</svg>`, 'image/svg+xml');\n const group = doc.querySelector('g');\n if (!group) return null;\n const imported = svgEl.ownerDocument.importNode(group, true);\n svgEl.appendChild(imported);\n const shape = new TextShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'code': {\n if (!data.groupHTML) return null;\n const parser = new DOMParser();\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.groupHTML}</svg>`, 'image/svg+xml');\n const group = doc.querySelector('g');\n if (!group) return null;\n const imported = svgEl.ownerDocument.importNode(group, true);\n svgEl.appendChild(imported);\n const shape = new CodeShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n case 'image': {\n const imgEl = document.createElementNS(ns, 'image');\n imgEl.setAttribute('x', data.x);\n imgEl.setAttribute('y', data.y);\n imgEl.setAttribute('width', data.width);\n imgEl.setAttribute('height', data.height);\n imgEl.setAttribute('href', data.href);\n imgEl.setAttribute('preserveAspectRatio', 'none');\n if (data.sizeBytes) {\n imgEl.__fileSize = Number(data.sizeBytes) || 0;\n imgEl.setAttribute('data-file-size', String(imgEl.__fileSize));\n window.__roomImageBytesUsed = (window.__roomImageBytesUsed || 0) + imgEl.__fileSize;\n }\n if (data.cloudinaryId) imgEl.setAttribute('data-cloudinary-id', data.cloudinaryId);\n if (data.storageProvider) imgEl.setAttribute('data-storage-provider', data.storageProvider);\n if (data.storageCloudName) imgEl.setAttribute('data-storage-cloud-name', data.storageCloudName);\n if (data.aiGenerated) imgEl.setAttribute('data-ai-generated', 'true');\n if (data.aiModel) imgEl.setAttribute('data-ai-model', data.aiModel);\n svgEl.appendChild(imgEl);\n const shape = new ImageShape(imgEl);\n if (data.rotation) shape.rotation = data.rotation;\n if (data.shapeID) shape.shapeID = data.shapeID;\n if (data.frameType === 'graph' && data.graphData) {\n if (typeof window.__hydrateGraphShape === 'function') {\n window.__hydrateGraphShape(shape, data.graphData);\n } else {\n shape._frameType = 'graph';\n shape._graphData = cloneOptions(data.graphData);\n shape.element.setAttribute('data-graph-shape', 'true');\n }\n }\n return shape;\n }\n\n case 'icon': {\n if (!data.elementHTML) return null;\n const parser = new DOMParser();\n // Wrap in <svg> so the parser treats the <g> as a valid child, not a document root\n const doc = parser.parseFromString(`<svg xmlns=\"${ns}\">${data.elementHTML}</svg>`, 'image/svg+xml');\n const iconGroup = doc.querySelector('g');\n if (!iconGroup) return null;\n const imported = svgEl.ownerDocument.importNode(iconGroup, true);\n svgEl.appendChild(imported);\n const shape = new IconShape(imported);\n if (data.shapeID) shape.shapeID = data.shapeID;\n return shape;\n }\n\n default:\n console.warn('[SceneSerializer] Unknown type:', data.type);\n return null;\n }\n}\n\n// ============================================================\n// SAVE: Serialize entire scene to .lixsketch JSON\n// ============================================================\nexport function saveScene(workspaceName = 'Untitled') {\n const allShapes = window.shapes || [];\n const serialized = [];\n\n // Issue #24 bug #10: rebuild containment from each shape's own\n // `parentFrame` ref before serialising. The `containedShapes` array\n // on the frame side drifts over time (eraser, partial deletes, drag\n // out + drag back, etc.), and a missing entry there means the child\n // gets serialised as a top-level shape and the frame restores empty.\n // Each shape knows its own parent, so we trust THAT and override the\n // frame's array at save time.\n const childrenByFrame = new Map();\n for (const s of allShapes) {\n if (s && s.parentFrame && s.shapeID && s !== s.parentFrame) {\n const arr = childrenByFrame.get(s.parentFrame.shapeID) || [];\n arr.push(s.shapeID);\n childrenByFrame.set(s.parentFrame.shapeID, arr);\n }\n }\n\n for (const shape of allShapes) {\n const data = serializeShape(shape);\n if (!data) continue;\n if (data.type === 'frame' && shape.shapeID && childrenByFrame.has(shape.shapeID)) {\n const merged = new Set(data.containedShapeIDs || []);\n for (const id of childrenByFrame.get(shape.shapeID)) merged.add(id);\n data.containedShapeIDs = Array.from(merged);\n }\n serialized.push(data);\n }\n\n const scene = {\n format: 'lixsketch',\n version: FORMAT_VERSION,\n sessionID: getSessionID(),\n name: workspaceName,\n createdAt: new Date().toISOString(),\n viewport: window.currentViewBox ? { ...window.currentViewBox } : null,\n zoom: window.currentZoom || 1,\n shapes: serialized,\n };\n\n return scene;\n}\n\n// ============================================================\n// LOAD: Deserialize .lixsketch JSON and recreate scene\n// ============================================================\nexport function loadScene(sceneData) {\n if (!sceneData || sceneData.format !== 'lixsketch') {\n console.error('[SceneSerializer] Invalid scene format');\n return false;\n }\n\n // Clear current scene\n const svgEl = window.svg;\n if (!svgEl) return false;\n window.__roomImageBytesUsed = 0;\n\n // Remove all existing shape DOM elements\n const existingShapes = window.shapes || [];\n existingShapes.forEach(shape => {\n // For frames, clean up clipGroup and clipPath too\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n });\n\n // Clear arrays IN PLACE \u2014 tool modules hold direct references to these\n // arrays from import-time, so replacing them breaks interactivity.\n if (window.shapes) window.shapes.length = 0; else window.shapes = [];\n window.currentShape = null;\n if (window.historyStack) window.historyStack.length = 0; else window.historyStack = [];\n if (window.redoStack) window.redoStack.length = 0; else window.redoStack = [];\n\n // Build ID -> shape map for frame containment and arrow attachments\n const idMap = new Map();\n\n // First pass: create all shapes (frames first to allow containment)\n const frameData = sceneData.shapes.filter(s => s.type === 'frame');\n const otherData = sceneData.shapes.filter(s => s.type !== 'frame');\n\n // Create frames first\n for (const data of frameData) {\n const shape = deserializeShape(data);\n if (shape) {\n // Restore group membership if present.\n if (data.groupId) shape.groupId = data.groupId;\n restoreDocBlockLinks(shape, data);\n window.shapes.push(shape);\n if (data.shapeID) idMap.set(data.shapeID, shape);\n }\n }\n\n // Create all other shapes\n for (const data of otherData) {\n const shape = deserializeShape(data);\n if (shape) {\n if (data.groupId) shape.groupId = data.groupId;\n restoreDocBlockLinks(shape, data);\n window.shapes.push(shape);\n if (data.shapeID) idMap.set(data.shapeID, shape);\n }\n }\n\n // Second pass: restore frame containment\n for (const data of frameData) {\n const frame = idMap.get(data.shapeID);\n if (frame && data.containedShapeIDs && data.containedShapeIDs.length > 0) {\n for (const childID of data.containedShapeIDs) {\n const child = idMap.get(childID);\n if (!child) {\n console.warn(`[SceneSerializer] Frame \"${data.frameName}\" references missing shape: ${childID}`);\n continue;\n }\n try {\n if (typeof frame.addShapeToFrame === 'function') {\n frame.addShapeToFrame(child);\n } else {\n // Fallback: manually set containment\n frame.containedShapes.push(child);\n child.parentFrame = frame;\n }\n } catch (err) {\n console.warn(`[SceneSerializer] Failed to restore containment for ${childID} in frame ${data.shapeID}:`, err);\n // Fallback: at least set the reference\n if (!frame.containedShapes.includes(child)) {\n frame.containedShapes.push(child);\n }\n child.parentFrame = frame;\n }\n }\n }\n }\n\n // Third pass: restore arrow attachments\n for (const data of sceneData.shapes) {\n if (data.type === 'arrow') {\n const arrow = idMap.get(data.shapeID);\n if (!arrow) continue;\n if (data.startAttachmentID) {\n const target = idMap.get(data.startAttachmentID);\n if (target && arrow.setStartAttachment) arrow.setStartAttachment(target);\n }\n if (data.endAttachmentID) {\n const target = idMap.get(data.endAttachmentID);\n if (target && arrow.setEndAttachment) arrow.setEndAttachment(target);\n }\n }\n }\n\n // \u2500\u2500 Fourth pass: frame containment reconciliation (issue #24 bug #10) \u2500\u2500\n //\n // The pass above attaches each child via `frame.addShapeToFrame(child)`,\n // which is supposed to move the child's <g> into the frame's clipGroup.\n // In practice LixScript-rendered scenes were reloading with empty\n // frames \u2014 children present in the shapes array, frame box drawn, but\n // the children's <g> elements stranded at the svg root (so visually\n // they look orphaned). The cause varies (transient `isBeingMovedByFrame`\n // flag carried over from save time, ordering glitches when nested\n // frames are restored, etc.). Rather than chase the source, repair the\n // DOM state here from the authoritative `containedShapes` array.\n for (const data of frameData) {\n const frame = idMap.get(data.shapeID);\n if (!frame) continue;\n\n // Clear stale flags that suppress DOM mutation inside addShapeToFrame.\n delete frame.isBeingMovedByFrame;\n delete frame.isDraggedOutTemporarily;\n\n // Ensure the frame's own clipGroup is direct child of svg \u2014 sub-frames\n // that didn't get re-parented yet are handled in the next loop.\n if (frame.clipGroup && frame.clipGroup.parentNode !== svgEl) {\n svgEl.appendChild(frame.clipGroup);\n }\n\n for (const child of frame.containedShapes || []) {\n if (!child) continue;\n delete child.isBeingMovedByFrame;\n delete child.isDraggedOutTemporarily;\n\n const el = child.group || child.element;\n if (el && el.parentNode !== frame.clipGroup) {\n if (el.parentNode) el.parentNode.removeChild(el);\n frame.clipGroup.appendChild(el);\n }\n // Sub-frames also carry their own clipGroup \u2014 nest it.\n if (child.shapeName === 'frame' && child.clipGroup\n && child.clipGroup.parentNode !== frame.clipGroup) {\n if (child.clipGroup.parentNode) child.clipGroup.parentNode.removeChild(child.clipGroup);\n frame.clipGroup.appendChild(child.clipGroup);\n }\n // Authoritative parent ref \u2014 `addShapeToFrame` should already\n // have set this but the no-op early return when the child was\n // already in containedShapes skips it.\n child.parentFrame = frame;\n }\n\n // Force the clip rect + visual to match. Some saved frames came\n // through with a stale clipRect from before the resize that lost\n // the children visually.\n if (typeof frame.updateClipPath === 'function') frame.updateClipPath();\n if (typeof frame.draw === 'function') {\n try { frame.draw(); } catch (err) { console.warn('[SceneSerializer] frame redraw failed:', err); }\n }\n }\n\n // Restore viewport\n if (sceneData.viewport && svgEl) {\n const vb = sceneData.viewport;\n window.currentViewBox = { ...vb };\n svgEl.setAttribute('viewBox', `${vb.x} ${vb.y} ${vb.width} ${vb.height}`);\n }\n if (sceneData.zoom) {\n window.currentZoom = sceneData.zoom;\n }\n\n console.log(`[SceneSerializer] Loaded ${window.shapes.length} shapes from \"${sceneData.name}\"`);\n window.dispatchEvent(new CustomEvent('lix-doc-canvas-links-changed'));\n\n // Re-sync tool flags so shapes are interactable after restore\n if (window.__sketchEngine && typeof window.__sketchEngine.setActiveTool === 'function') {\n const store = window.__sketchStoreApi;\n const currentTool = store ? store.getState().activeTool : 'select';\n window.__sketchEngine.setActiveTool(currentTool);\n } else {\n // Fallback: ensure selection tool is active\n window.isSelectionToolActive = true;\n }\n\n return true;\n}\n\n// ============================================================\n// DOWNLOAD: Trigger browser download of .lixsketch file\n// ============================================================\nexport function downloadScene(workspaceName = 'Untitled') {\n const scene = saveScene(workspaceName);\n const json = JSON.stringify(scene, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const url = URL.createObjectURL(blob);\n\n const a = document.createElement('a');\n a.href = url;\n a.download = `${workspaceName.replace(/[^a-zA-Z0-9_-]/g, '_')}.lixjson`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// ============================================================\n// UPLOAD: Open file picker and load .lixsketch file\n// ============================================================\n// Validate scene JSON structure before loading\nexport function validateScene(data) {\n if (!data || typeof data !== 'object') return { valid: false, error: 'Not a valid JSON object' };\n if (data.format !== 'lixsketch') return { valid: false, error: 'Not a LixSketch scene file (missing format field)' };\n if (!data.version || data.version > FORMAT_VERSION) return { valid: false, error: `Unsupported version: ${data.version}` };\n if (!Array.isArray(data.shapes)) return { valid: false, error: 'Invalid scene: missing shapes array' };\n return {\n valid: true,\n name: data.name || 'Untitled',\n shapeCount: data.shapes.length,\n sessionID: data.sessionID || null,\n createdAt: data.createdAt || null,\n };\n}\n\nexport function uploadScene() {\n return new Promise((resolve, reject) => {\n const input = document.createElement('input');\n input.type = 'file';\n input.accept = '.lixjson,.json';\n input.onchange = (e) => {\n const file = e.target.files[0];\n if (!file) return resolve(false);\n\n const reader = new FileReader();\n reader.onload = (ev) => {\n try {\n const data = JSON.parse(ev.target.result);\n const validation = validateScene(data);\n if (!validation.valid) {\n console.error('[SceneSerializer] Invalid file:', validation.error);\n resolve({ success: false, error: validation.error });\n return;\n }\n resetSessionID(); // New session for loaded scene\n const result = loadScene(data);\n resolve({ success: result, validation });\n } catch (err) {\n console.error('[SceneSerializer] Failed to parse file:', err);\n resolve({ success: false, error: 'Failed to parse JSON file' });\n }\n };\n reader.readAsText(file);\n };\n input.click();\n });\n}\n\n// ============================================================\n// EXPORT as PNG\n// ============================================================\nexport function exportAsPNG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n // Remove selection UI elements\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const canvas = document.createElement('canvas');\n const vb = svgEl.viewBox.baseVal;\n canvas.width = vb.width * 2; // 2x for retina\n canvas.height = vb.height * 2;\n const ctx = canvas.getContext('2d');\n ctx.scale(2, 2);\n\n const img = new Image();\n const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n // Draw dark background\n ctx.fillStyle = '#121212';\n ctx.fillRect(0, 0, vb.width, vb.height);\n ctx.drawImage(img, 0, 0, vb.width, vb.height);\n URL.revokeObjectURL(url);\n\n canvas.toBlob(blob => {\n const a = document.createElement('a');\n a.href = URL.createObjectURL(blob);\n a.download = 'lixsketch-export.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n }, 'image/png');\n };\n img.src = url;\n}\n\n// ============================================================\n// COPY to clipboard as PNG\n// ============================================================\nexport function copyAsPNG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const canvas = document.createElement('canvas');\n const vb = svgEl.viewBox.baseVal;\n canvas.width = vb.width * 2;\n canvas.height = vb.height * 2;\n const ctx = canvas.getContext('2d');\n ctx.scale(2, 2);\n\n const img = new Image();\n const svgBlob = new Blob([svgData], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(svgBlob);\n\n img.onload = () => {\n ctx.fillStyle = '#121212';\n ctx.fillRect(0, 0, vb.width, vb.height);\n ctx.drawImage(img, 0, 0, vb.width, vb.height);\n URL.revokeObjectURL(url);\n\n canvas.toBlob(blob => {\n if (!blob) return;\n navigator.clipboard.write([\n new ClipboardItem({ 'image/png': blob })\n ]).catch(err => console.warn('[SceneSerializer] Clipboard write failed:', err));\n }, 'image/png');\n };\n img.src = url;\n}\n\n// ============================================================\n// COPY to clipboard as SVG\n// ============================================================\nexport function copyAsSVG() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n navigator.clipboard.writeText(svgData)\n .catch(err => console.warn('[SceneSerializer] Clipboard write failed:', err));\n}\n\n// ============================================================\n// EXPORT as PDF (uses browser print)\n// ============================================================\nexport function exportAsPDF() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n const clone = svgEl.cloneNode(true);\n const selectionEls = clone.querySelectorAll('[data-selection], .selection-handle, .resize-handle, .rotation-handle');\n selectionEls.forEach(el => el.remove());\n\n const svgData = new XMLSerializer().serializeToString(clone);\n const printWindow = window.open('', '_blank');\n printWindow.document.write(`\n <!DOCTYPE html>\n <html>\n <head><title>LixSketch Export</title>\n <style>\n body { margin: 0; background: #121212; display: flex; align-items: center; justify-content: center; min-height: 100vh; }\n svg { max-width: 100vw; max-height: 100vh; }\n @media print { body { background: white; } }\n </style>\n </head>\n <body>${svgData}</body>\n </html>\n `);\n printWindow.document.close();\n printWindow.focus();\n setTimeout(() => printWindow.print(), 500);\n}\n\n// ============================================================\n// RESET: Clear the entire canvas\n// ============================================================\nexport function resetCanvas() {\n const svgEl = window.svg;\n if (!svgEl) return;\n\n // Remove all shape DOM elements + frame clipGroups/clipPaths\n const existingShapes = window.shapes || [];\n existingShapes.forEach(shape => {\n if (shape.shapeName === 'frame') {\n if (shape.clipGroup && shape.clipGroup.parentNode) {\n shape.clipGroup.parentNode.removeChild(shape.clipGroup);\n }\n if (shape.clipPath && shape.clipPath.parentNode) {\n shape.clipPath.parentNode.removeChild(shape.clipPath);\n }\n }\n if (shape.group && shape.group.parentNode) {\n shape.group.parentNode.removeChild(shape.group);\n } else if (shape.element && shape.element.parentNode) {\n shape.element.parentNode.removeChild(shape.element);\n }\n });\n\n // Remove selection UI\n svgEl.querySelectorAll(\n '.selection-outline, .resize-anchor, .rotation-anchor, [data-selection]'\n ).forEach(el => el.remove());\n\n // Clear arrays IN PLACE (same reason as loadScene)\n if (window.shapes) window.shapes.length = 0; else window.shapes = [];\n window.currentShape = null;\n if (window.historyStack) window.historyStack.length = 0; else window.historyStack = [];\n if (window.redoStack) window.redoStack.length = 0; else window.redoStack = [];\n\n if (typeof window.clearAllSelections === 'function') {\n window.clearAllSelections();\n }\n if (typeof window.disableAllSideBars === 'function') {\n window.disableAllSideBars();\n }\n\n // Clear auto-save (both legacy and session-scoped keys)\n try {\n localStorage.removeItem('lixsketch-autosave');\n localStorage.removeItem('lixsketch-autosave-meta');\n const sid = window.__sessionID;\n if (sid) {\n localStorage.removeItem(`lixsketch-autosave-${sid}`);\n localStorage.removeItem(`lixsketch-autosave-meta-${sid}`);\n }\n } catch (_) {}\n\n console.log('[SceneSerializer] Canvas reset');\n if (typeof window.__collabSceneChanged === 'function') {\n window.__collabSceneChanged();\n }\n}\n\n// ============================================================\n// FIND: Search for text content on the canvas\n// ============================================================\nexport function findTextOnCanvas(query) {\n const allShapes = window.shapes || [];\n if (!query || query.trim() === '') return [];\n\n const lowerQuery = query.toLowerCase();\n const results = [];\n\n for (const shape of allShapes) {\n let textContent = '';\n\n if (shape.shapeName === 'text' || shape.shapeName === 'code') {\n const group = shape.group;\n if (group) {\n // Get all text content from SVG text/tspan elements\n const textEls = group.querySelectorAll('text, tspan');\n textEls.forEach(el => {\n if (el.textContent) textContent += el.textContent + ' ';\n });\n // Also check foreignObject content\n const foreignEls = group.querySelectorAll('foreignObject *');\n foreignEls.forEach(el => {\n if (el.textContent) textContent += el.textContent + ' ';\n });\n }\n } else if (shape.shapeName === 'frame') {\n textContent = shape.frameName || '';\n }\n\n textContent = textContent.trim();\n if (textContent && textContent.toLowerCase().includes(lowerQuery)) {\n results.push({\n shape,\n text: textContent,\n type: shape.shapeName,\n x: shape.x || 0,\n y: shape.y || 0,\n });\n }\n }\n\n return results;\n}\n\n// ============================================================\n// Initialize bridge for React components\n// ============================================================\nexport function initSceneSerializer() {\n window.__sceneSerializer = {\n save: saveScene,\n load: loadScene,\n download: downloadScene,\n upload: uploadScene,\n exportPNG: exportAsPNG,\n exportPDF: exportAsPDF,\n copyAsPNG,\n copyAsSVG,\n resetCanvas,\n findText: findTextOnCanvas,\n };\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }