schematex 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (194) hide show
  1. package/README.md +229 -40
  2. package/dist/api-bQZ98gkJ.d.cts +22 -0
  3. package/dist/api-bQZ98gkJ.d.ts +22 -0
  4. package/dist/browser.cjs +46 -0
  5. package/dist/browser.cjs.map +1 -0
  6. package/dist/browser.d.cts +27 -0
  7. package/dist/browser.d.ts +27 -0
  8. package/dist/browser.js +40 -0
  9. package/dist/browser.js.map +1 -0
  10. package/dist/{chunk-XXU36667.js → chunk-2OIW3MAE.js} +4 -3
  11. package/dist/chunk-2OIW3MAE.js.map +1 -0
  12. package/dist/{chunk-3FTUWAXK.cjs → chunk-3M7QWADF.cjs} +5 -4
  13. package/dist/chunk-3M7QWADF.cjs.map +1 -0
  14. package/dist/{chunk-BE5HNDA5.cjs → chunk-4HPT4BOI.cjs} +5 -4
  15. package/dist/{chunk-BE5HNDA5.cjs.map → chunk-4HPT4BOI.cjs.map} +1 -1
  16. package/dist/{chunk-CZRM7LT7.js → chunk-4TS5NB7L.js} +4 -3
  17. package/dist/chunk-4TS5NB7L.js.map +1 -0
  18. package/dist/{chunk-4G7ZIBHN.js → chunk-5SH5NUDW.js} +3 -2
  19. package/dist/{chunk-4G7ZIBHN.js.map → chunk-5SH5NUDW.js.map} +1 -1
  20. package/dist/{chunk-47ZC6EMJ.js → chunk-7WXAAVR3.js} +4 -3
  21. package/dist/{chunk-47ZC6EMJ.js.map → chunk-7WXAAVR3.js.map} +1 -1
  22. package/dist/{chunk-5C7DPDHQ.js → chunk-A74ZCP5I.js} +4 -3
  23. package/dist/{chunk-5C7DPDHQ.js.map → chunk-A74ZCP5I.js.map} +1 -1
  24. package/dist/{chunk-DS47NTWZ.cjs → chunk-AMP2FFES.cjs} +11 -10
  25. package/dist/chunk-AMP2FFES.cjs.map +1 -0
  26. package/dist/{chunk-2UKC6ZCY.cjs → chunk-CEV3GZA3.cjs} +12 -11
  27. package/dist/chunk-CEV3GZA3.cjs.map +1 -0
  28. package/dist/{chunk-NYCIK4SU.cjs → chunk-DTMCQXXC.cjs} +13 -12
  29. package/dist/chunk-DTMCQXXC.cjs.map +1 -0
  30. package/dist/{chunk-FDLZEKEB.js → chunk-GEPBET4L.js} +3 -2
  31. package/dist/chunk-GEPBET4L.js.map +1 -0
  32. package/dist/chunk-HAIBAF6J.cjs +1880 -0
  33. package/dist/chunk-HAIBAF6J.cjs.map +1 -0
  34. package/dist/{chunk-FGPTCDUT.cjs → chunk-HKRYKEOV.cjs} +5 -4
  35. package/dist/chunk-HKRYKEOV.cjs.map +1 -0
  36. package/dist/{chunk-D4JTSPOL.js → chunk-HLYA4QBB.js} +4 -3
  37. package/dist/chunk-HLYA4QBB.js.map +1 -0
  38. package/dist/{chunk-URSKIHSY.cjs → chunk-IMHR3S5H.cjs} +6 -5
  39. package/dist/chunk-IMHR3S5H.cjs.map +1 -0
  40. package/dist/{chunk-U4I37IBN.js → chunk-IQIJ6WW6.js} +4 -3
  41. package/dist/chunk-IQIJ6WW6.js.map +1 -0
  42. package/dist/{chunk-UHLYS3W5.cjs → chunk-IY52OWPG.cjs} +5 -4
  43. package/dist/{chunk-UHLYS3W5.cjs.map → chunk-IY52OWPG.cjs.map} +1 -1
  44. package/dist/chunk-JZGFSRVT.js +1873 -0
  45. package/dist/chunk-JZGFSRVT.js.map +1 -0
  46. package/dist/{chunk-3J7TFUOC.js → chunk-L6IHSTPP.js} +4 -3
  47. package/dist/{chunk-3J7TFUOC.js.map → chunk-L6IHSTPP.js.map} +1 -1
  48. package/dist/{chunk-4DBRNOPA.cjs → chunk-LKHWBDWZ.cjs} +5 -4
  49. package/dist/{chunk-4DBRNOPA.cjs.map → chunk-LKHWBDWZ.cjs.map} +1 -1
  50. package/dist/{chunk-34X3ZJ6E.cjs → chunk-LXNFVHDT.cjs} +3 -2
  51. package/dist/{chunk-34X3ZJ6E.cjs.map → chunk-LXNFVHDT.cjs.map} +1 -1
  52. package/dist/chunk-M6AMNXQ7.js +4539 -0
  53. package/dist/chunk-M6AMNXQ7.js.map +1 -0
  54. package/dist/{chunk-XX4BKS7Y.js → chunk-MRGS54WN.js} +4 -3
  55. package/dist/chunk-MRGS54WN.js.map +1 -0
  56. package/dist/{chunk-ROFLJ74T.js → chunk-MXJ6FHSY.js} +4 -3
  57. package/dist/chunk-MXJ6FHSY.js.map +1 -0
  58. package/dist/{chunk-V6WO7RK7.cjs → chunk-PIQG2Z5N.cjs} +5 -4
  59. package/dist/chunk-PIQG2Z5N.cjs.map +1 -0
  60. package/dist/{chunk-U5GGE6PJ.js → chunk-RQX53J6M.js} +4 -3
  61. package/dist/chunk-RQX53J6M.js.map +1 -0
  62. package/dist/{chunk-N7KOXOMX.cjs → chunk-S6VPECM3.cjs} +72 -2
  63. package/dist/chunk-S6VPECM3.cjs.map +1 -0
  64. package/dist/{chunk-VFQCTXOX.js → chunk-SPIW4VWP.js} +4 -3
  65. package/dist/chunk-SPIW4VWP.js.map +1 -0
  66. package/dist/{chunk-IX554O5K.js → chunk-TIGP2OEJ.js} +72 -3
  67. package/dist/chunk-TIGP2OEJ.js.map +1 -0
  68. package/dist/{chunk-LMFSHK45.js → chunk-TPA36ULU.js} +4 -3
  69. package/dist/{chunk-LMFSHK45.js.map → chunk-TPA36ULU.js.map} +1 -1
  70. package/dist/{chunk-ZX7QKZK2.cjs → chunk-ULERCTGS.cjs} +5 -4
  71. package/dist/{chunk-ZX7QKZK2.cjs.map → chunk-ULERCTGS.cjs.map} +1 -1
  72. package/dist/chunk-VP54YPOX.cjs +4544 -0
  73. package/dist/chunk-VP54YPOX.cjs.map +1 -0
  74. package/dist/{chunk-XQ52ICHU.cjs → chunk-YKO7DY2F.cjs} +14 -13
  75. package/dist/chunk-YKO7DY2F.cjs.map +1 -0
  76. package/dist/{chunk-PDPHRZZT.js → chunk-YO4GU6JX.js} +4 -3
  77. package/dist/chunk-YO4GU6JX.js.map +1 -0
  78. package/dist/{chunk-S6BK5DB6.cjs → chunk-ZGKEFVJQ.cjs} +13 -12
  79. package/dist/chunk-ZGKEFVJQ.cjs.map +1 -0
  80. package/dist/{chunk-2MQWZ2XY.cjs → chunk-ZO77FHBF.cjs} +3 -2
  81. package/dist/chunk-ZO77FHBF.cjs.map +1 -0
  82. package/dist/diagrams/blockdiagram/index.cjs +5 -5
  83. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  84. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  85. package/dist/diagrams/blockdiagram/index.js +1 -1
  86. package/dist/diagrams/circuit/index.cjs +8 -8
  87. package/dist/diagrams/circuit/index.d.cts +1 -1
  88. package/dist/diagrams/circuit/index.d.ts +1 -1
  89. package/dist/diagrams/circuit/index.js +2 -2
  90. package/dist/diagrams/ecomap/index.cjs +7 -7
  91. package/dist/diagrams/ecomap/index.d.cts +1 -1
  92. package/dist/diagrams/ecomap/index.d.ts +1 -1
  93. package/dist/diagrams/ecomap/index.js +2 -2
  94. package/dist/diagrams/entity/index.cjs +6 -6
  95. package/dist/diagrams/entity/index.d.cts +1 -1
  96. package/dist/diagrams/entity/index.d.ts +1 -1
  97. package/dist/diagrams/entity/index.js +2 -2
  98. package/dist/diagrams/fishbone/index.cjs +8 -8
  99. package/dist/diagrams/fishbone/index.d.cts +9 -9
  100. package/dist/diagrams/fishbone/index.d.ts +9 -9
  101. package/dist/diagrams/fishbone/index.js +2 -2
  102. package/dist/diagrams/flowchart/index.cjs +8 -8
  103. package/dist/diagrams/flowchart/index.d.cts +2 -2
  104. package/dist/diagrams/flowchart/index.d.ts +2 -2
  105. package/dist/diagrams/flowchart/index.js +2 -2
  106. package/dist/diagrams/genogram/index.cjs +9 -9
  107. package/dist/diagrams/genogram/index.d.cts +1 -1
  108. package/dist/diagrams/genogram/index.d.ts +1 -1
  109. package/dist/diagrams/genogram/index.js +2 -2
  110. package/dist/diagrams/ladder/index.cjs +6 -6
  111. package/dist/diagrams/ladder/index.d.cts +1 -1
  112. package/dist/diagrams/ladder/index.d.ts +1 -1
  113. package/dist/diagrams/ladder/index.js +2 -2
  114. package/dist/diagrams/logic/index.cjs +6 -6
  115. package/dist/diagrams/logic/index.d.cts +1 -1
  116. package/dist/diagrams/logic/index.d.ts +1 -1
  117. package/dist/diagrams/logic/index.js +2 -2
  118. package/dist/diagrams/orgchart/index.cjs +7 -7
  119. package/dist/diagrams/orgchart/index.d.cts +1 -1
  120. package/dist/diagrams/orgchart/index.d.ts +1 -1
  121. package/dist/diagrams/orgchart/index.js +2 -2
  122. package/dist/diagrams/pedigree/index.cjs +7 -7
  123. package/dist/diagrams/pedigree/index.d.cts +1 -1
  124. package/dist/diagrams/pedigree/index.d.ts +1 -1
  125. package/dist/diagrams/pedigree/index.js +2 -2
  126. package/dist/diagrams/phylo/index.cjs +7 -7
  127. package/dist/diagrams/phylo/index.d.cts +1 -1
  128. package/dist/diagrams/phylo/index.d.ts +1 -1
  129. package/dist/diagrams/phylo/index.js +2 -2
  130. package/dist/diagrams/sld/index.cjs +6 -6
  131. package/dist/diagrams/sld/index.d.cts +1 -1
  132. package/dist/diagrams/sld/index.d.ts +1 -1
  133. package/dist/diagrams/sld/index.js +2 -2
  134. package/dist/diagrams/sociogram/index.cjs +6 -6
  135. package/dist/diagrams/sociogram/index.d.cts +1 -1
  136. package/dist/diagrams/sociogram/index.d.ts +1 -1
  137. package/dist/diagrams/sociogram/index.js +2 -2
  138. package/dist/diagrams/timing/index.cjs +4 -4
  139. package/dist/diagrams/timing/index.d.cts +1 -1
  140. package/dist/diagrams/timing/index.d.ts +1 -1
  141. package/dist/diagrams/timing/index.js +1 -1
  142. package/dist/diagrams/venn/index.cjs +9 -9
  143. package/dist/diagrams/venn/index.d.cts +1 -1
  144. package/dist/diagrams/venn/index.d.ts +1 -1
  145. package/dist/diagrams/venn/index.js +2 -2
  146. package/dist/export.cjs +87 -0
  147. package/dist/export.cjs.map +1 -0
  148. package/dist/export.d.cts +38 -0
  149. package/dist/export.d.ts +38 -0
  150. package/dist/export.js +83 -0
  151. package/dist/export.js.map +1 -0
  152. package/dist/{index-BXefHVce.d.cts → index-SSGpCggE.d.cts} +52 -3
  153. package/dist/{index-BSlza1YY.d.ts → index-ga04CTBI.d.ts} +52 -3
  154. package/dist/index.cjs +65 -1948
  155. package/dist/index.cjs.map +1 -1
  156. package/dist/index.d.cts +7 -12
  157. package/dist/index.d.ts +7 -12
  158. package/dist/index.js +19 -1942
  159. package/dist/index.js.map +1 -1
  160. package/dist/react.cjs +56 -0
  161. package/dist/react.cjs.map +1 -0
  162. package/dist/react.d.cts +24 -0
  163. package/dist/react.d.ts +24 -0
  164. package/dist/react.js +54 -0
  165. package/dist/react.js.map +1 -0
  166. package/dist/{types-DqfcYkcY.d.ts → types-BcPhMdHd.d.cts} +6 -2
  167. package/dist/{types-DqfcYkcY.d.cts → types-BcPhMdHd.d.ts} +6 -2
  168. package/package.json +31 -2
  169. package/dist/chunk-2MQWZ2XY.cjs.map +0 -1
  170. package/dist/chunk-2UKC6ZCY.cjs.map +0 -1
  171. package/dist/chunk-3FTUWAXK.cjs.map +0 -1
  172. package/dist/chunk-ADOXGKAK.js +0 -1251
  173. package/dist/chunk-ADOXGKAK.js.map +0 -1
  174. package/dist/chunk-CZRM7LT7.js.map +0 -1
  175. package/dist/chunk-D4JTSPOL.js.map +0 -1
  176. package/dist/chunk-DS47NTWZ.cjs.map +0 -1
  177. package/dist/chunk-FDLZEKEB.js.map +0 -1
  178. package/dist/chunk-FGPTCDUT.cjs.map +0 -1
  179. package/dist/chunk-IX554O5K.js.map +0 -1
  180. package/dist/chunk-MDICUK6F.cjs +0 -1258
  181. package/dist/chunk-MDICUK6F.cjs.map +0 -1
  182. package/dist/chunk-N7KOXOMX.cjs.map +0 -1
  183. package/dist/chunk-NYCIK4SU.cjs.map +0 -1
  184. package/dist/chunk-PDPHRZZT.js.map +0 -1
  185. package/dist/chunk-ROFLJ74T.js.map +0 -1
  186. package/dist/chunk-S6BK5DB6.cjs.map +0 -1
  187. package/dist/chunk-U4I37IBN.js.map +0 -1
  188. package/dist/chunk-U5GGE6PJ.js.map +0 -1
  189. package/dist/chunk-URSKIHSY.cjs.map +0 -1
  190. package/dist/chunk-V6WO7RK7.cjs.map +0 -1
  191. package/dist/chunk-VFQCTXOX.js.map +0 -1
  192. package/dist/chunk-XQ52ICHU.cjs.map +0 -1
  193. package/dist/chunk-XX4BKS7Y.js.map +0 -1
  194. package/dist/chunk-XXU36667.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/diagrams/flowchart/parser.ts","../src/diagrams/flowchart/layout.ts","../src/diagrams/flowchart/shapes.ts","../src/diagrams/flowchart/renderer.ts","../src/diagrams/flowchart/index.ts"],"names":["mPlain","minX","bends","midY","fmt","text"],"mappings":"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","file":"chunk-ADOXGKAK.js","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/**\n * Flowchart DSL parser (M1).\n *\n * Supports a mermaid-inspired subset:\n * flowchart TD | TB | BT | LR | RL\n * A[Label] rect\n * A(Label) round\n * A([Label]) stadium\n * A{Label} diamond\n * A[/Label/] parallelogram\n * A --> B solid edge\n * A --- B no-arrow edge\n * A -.-> B dotted\n * A ==> B thick\n * A <--> B bidirectional\n * A --x B crossed end\n * A --o B round end\n * A -->|yes| B edge with pipe label\n * A -- yes --> B edge with inline label\n * A --> B --> C chain\n * %% comment\n *\n * Hand-written tokenizer + recursive descent. Zero deps.\n */\n\nimport type {\n FlowchartAST,\n FlowchartDirection,\n FlowchartEdge,\n FlowchartEdgeKind,\n FlowchartNode,\n FlowchartShape,\n} from \"../../core/types\";\n\nexport class FlowchartParseError extends Error {\n constructor(\n message: string,\n public line: number,\n public col: number\n ) {\n super(`[line ${line}:${col}] ${message}`);\n this.name = \"FlowchartParseError\";\n }\n}\n\nconst DIRECTIONS = new Set([\"TB\", \"TD\", \"BT\", \"LR\", \"RL\"]);\n\ninterface NodeRef {\n id: string;\n /** Optional shape/label declared inline on this reference */\n shape?: FlowchartShape;\n label?: string;\n}\n\n/** Try to parse a shape-suffix starting at `pos` in `line`. Returns null if none. */\nfunction parseShapeSuffix(\n line: string,\n pos: number\n): { shape: FlowchartShape; label: string; end: number } | null {\n const ch = line[pos];\n if (ch === undefined) return null;\n\n // Order matters: check multi-char openers first.\n // Stadium: ([ ... ])\n if (ch === \"(\" && line[pos + 1] === \"[\") {\n const end = line.indexOf(\"])\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"stadium\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Double-paren circle: (( ... ))\n if (ch === \"(\" && line[pos + 1] === \"(\") {\n const end = line.indexOf(\"))\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"circle\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Double-bracket subroutine: [[ ... ]]\n if (ch === \"[\" && line[pos + 1] === \"[\") {\n const end = line.indexOf(\"]]\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"subroutine\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Cylinder: [( ... )]\n if (ch === \"[\" && line[pos + 1] === \"(\") {\n const end = line.indexOf(\")]\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"cylinder\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Hexagon: {{ ... }}\n if (ch === \"{\" && line[pos + 1] === \"{\") {\n const end = line.indexOf(\"}}\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"hexagon\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Parallelogram: [/ ... /]\n if (ch === \"[\" && line[pos + 1] === \"/\") {\n const end = line.indexOf(\"/]\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"parallelogram\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Parallelogram-alt: [\\ ... \\]\n if (ch === \"[\" && line[pos + 1] === \"\\\\\") {\n const end = line.indexOf(\"\\\\]\", pos + 2);\n if (end < 0) return null;\n return {\n shape: \"parallelogram-alt\",\n label: line.slice(pos + 2, end).trim(),\n end: end + 2,\n };\n }\n // Rect: [ ... ]\n if (ch === \"[\") {\n const end = line.indexOf(\"]\", pos + 1);\n if (end < 0) return null;\n return {\n shape: \"rect\",\n label: line.slice(pos + 1, end).trim(),\n end: end + 1,\n };\n }\n // Round: ( ... )\n if (ch === \"(\") {\n const end = line.indexOf(\")\", pos + 1);\n if (end < 0) return null;\n return {\n shape: \"round\",\n label: line.slice(pos + 1, end).trim(),\n end: end + 1,\n };\n }\n // Diamond: { ... }\n if (ch === \"{\") {\n const end = line.indexOf(\"}\", pos + 1);\n if (end < 0) return null;\n return {\n shape: \"diamond\",\n label: line.slice(pos + 1, end).trim(),\n end: end + 1,\n };\n }\n return null;\n}\n\nconst ID_CHAR = /[A-Za-z0-9_-]/;\n\n/** Edge operator pattern. We greedily match the longest op beginning at pos. */\ninterface EdgeOp {\n kind: FlowchartEdgeKind;\n bidirectional: boolean;\n /** End of the operator (exclusive) in the original line */\n end: number;\n /** Optional inline label captured between dashes: \"-- text -->\" */\n inlineLabel?: string;\n}\n\nfunction parseEdgeOp(line: string, pos: number): EdgeOp | null {\n // Skip whitespace before operator (caller already trimmed, but be robust)\n while (pos < line.length && line[pos] === \" \") pos++;\n\n const rest = line.slice(pos);\n\n // Optional leading '<' for bidirectional\n const bi = rest.startsWith(\"<\");\n const i = bi ? 1 : 0;\n\n // Thick: \"==...\"\n if (rest[i] === \"=\") {\n // Find the rest of the thick operator until we hit '>' or end of op\n // Pattern: ==+[label]==> or ==+==> or ==+---?\n // Simpler: match /={2,}[^>]*={0,}>?/\n const m = /^(=+)(?:([^=<>]*)(=+))?(>)?/.exec(rest.slice(i));\n if (!m) return null;\n const full = m[0];\n const inlineLabel = m[2]?.trim();\n const hasArrow = m[4] === \">\";\n return {\n kind: \"thick\",\n bidirectional: bi && hasArrow,\n end: pos + i + full.length,\n inlineLabel: inlineLabel && inlineLabel.length > 0 ? inlineLabel : undefined,\n };\n }\n\n // Dashes: \"--...\", \"-.-...\"\n if (rest[i] === \"-\") {\n // Dotted: \"-.-\" or \"-.->\", \"-..-\" (mermaid uses -.- ... -.->)\n // We support: -.-> and -. text .->\n const dotted = /^(-\\.+)([^.\\-<>]*?)(\\.+->|\\.+-)?/;\n const dashed = /^(-+)([^-<>|]*?)(-+>|-+x|-+o|-+)?/;\n\n // Check for dotted first\n const dm = /^-\\.+/.exec(rest.slice(i));\n if (dm) {\n // Try with inline label: \"-. text .->\"\n // Simpler explicit patterns:\n // \"-.-> \" → dotted solid arrow\n // \"-.-\" → dotted no arrow\n // \"-. text .->\" → dotted with inline label + arrow\n // \"-. text .-\" → dotted with inline label, no arrow\n const mWithLabel = /^(-\\.+)([^.\\-<>]+)(\\.+->|\\.+-)/.exec(rest.slice(i));\n if (mWithLabel) {\n const full = mWithLabel[0];\n const label = mWithLabel[2]?.trim();\n const hasArrow = mWithLabel[3]!.endsWith(\">\");\n return {\n kind: \"dotted\",\n bidirectional: bi && hasArrow,\n end: pos + i + full.length,\n inlineLabel: label && label.length > 0 ? label : undefined,\n };\n }\n // No inline label\n const mPlain = /^(-\\.+)(->|-)?/.exec(rest.slice(i));\n if (mPlain) {\n const full = mPlain[0];\n const hasArrow = mPlain[2] === \"->\";\n return {\n kind: \"dotted\",\n bidirectional: bi && hasArrow,\n end: pos + i + full.length,\n };\n }\n void dotted;\n return null;\n }\n\n // Dashes: --, ---, --->, --x, --o, with optional inline \"-- text -->\"\n // Try labeled form first.\n const mLabeled = /^(-{2,})([^-<>|=][^-<>|=]*?)(-{2,})(>|x|o)?/.exec(rest.slice(i));\n if (mLabeled) {\n const full = mLabeled[0];\n const label = mLabeled[2]?.trim();\n const endCh = mLabeled[4];\n const kind: FlowchartEdgeKind =\n endCh === \"x\" ? \"crossed\" : endCh === \"o\" ? \"round-end\" : endCh === \">\" ? \"solid\" : \"none\";\n return {\n kind,\n bidirectional: bi && endCh === \">\",\n end: pos + i + full.length,\n inlineLabel: label && label.length > 0 ? label : undefined,\n };\n }\n const mPlain = /^(-{2,})(>|x|o)?/.exec(rest.slice(i));\n if (mPlain) {\n const full = mPlain[0];\n const endCh = mPlain[2];\n const kind: FlowchartEdgeKind =\n endCh === \"x\" ? \"crossed\" : endCh === \"o\" ? \"round-end\" : endCh === \">\" ? \"solid\" : \"none\";\n return {\n kind,\n bidirectional: bi && endCh === \">\",\n end: pos + i + full.length,\n };\n }\n void dashed;\n }\n\n return null;\n}\n\n/** Parse one node reference: identifier + optional shape-suffix. */\nfunction parseNodeRef(line: string, pos: number): { ref: NodeRef; end: number } | null {\n let i = pos;\n while (i < line.length && ID_CHAR.test(line[i]!)) i++;\n if (i === pos) return null;\n const id = line.slice(pos, i);\n const shape = parseShapeSuffix(line, i);\n if (shape) {\n return {\n ref: { id, shape: shape.shape, label: shape.label },\n end: shape.end,\n };\n }\n return { ref: { id }, end: i };\n}\n\n/** Parse pipe label segment immediately after an arrow: \"|yes|\" */\nfunction parsePipeLabel(line: string, pos: number): { label: string; end: number } | null {\n if (line[pos] !== \"|\") return null;\n const end = line.indexOf(\"|\", pos + 1);\n if (end < 0) return null;\n return { label: line.slice(pos + 1, end).trim(), end: end + 1 };\n}\n\nfunction skipSpaces(line: string, pos: number): number {\n while (pos < line.length && (line[pos] === \" \" || line[pos] === \"\\t\")) pos++;\n return pos;\n}\n\ninterface ParsedNodeDef {\n id: string;\n shape: FlowchartShape;\n label: string;\n}\n\ninterface PendingEdge {\n from: string;\n to: string;\n kind: FlowchartEdgeKind;\n label?: string;\n bidirectional: boolean;\n}\n\n/**\n * Parse a statement line that contains node definitions and/or an edge chain.\n * Returns declared nodes (for shape/label updates) + pending edges.\n *\n * Grammar (simplified, no `&`-fanout in M1):\n * chain = nodeRef (edgeOp pipeLabel? nodeRef)*\n */\nfunction parseChainStatement(line: string, lineNo: number): {\n nodes: ParsedNodeDef[];\n edges: PendingEdge[];\n} {\n const nodes: ParsedNodeDef[] = [];\n const edges: PendingEdge[] = [];\n\n let pos = skipSpaces(line, 0);\n const first = parseNodeRef(line, pos);\n if (!first) {\n throw new FlowchartParseError(\n `expected node identifier, got ${JSON.stringify(line.slice(pos, pos + 10))}`,\n lineNo,\n pos + 1\n );\n }\n if (first.ref.shape && first.ref.label !== undefined) {\n nodes.push({ id: first.ref.id, shape: first.ref.shape, label: first.ref.label });\n } else {\n nodes.push({ id: first.ref.id, shape: \"rect\", label: first.ref.id });\n }\n\n let prev: NodeRef = first.ref;\n pos = first.end;\n\n while (pos < line.length) {\n pos = skipSpaces(line, pos);\n if (pos >= line.length) break;\n\n const op = parseEdgeOp(line, pos);\n if (!op) {\n throw new FlowchartParseError(\n `expected edge operator, got ${JSON.stringify(line.slice(pos, pos + 10))}`,\n lineNo,\n pos + 1\n );\n }\n pos = op.end;\n\n // Optional pipe label after arrow\n pos = skipSpaces(line, pos);\n let label = op.inlineLabel;\n const pipe = parsePipeLabel(line, pos);\n if (pipe) {\n label = pipe.label;\n pos = pipe.end;\n }\n\n pos = skipSpaces(line, pos);\n const target = parseNodeRef(line, pos);\n if (!target) {\n throw new FlowchartParseError(\n `expected target node after edge, got ${JSON.stringify(line.slice(pos, pos + 10))}`,\n lineNo,\n pos + 1\n );\n }\n if (target.ref.shape && target.ref.label !== undefined) {\n nodes.push({\n id: target.ref.id,\n shape: target.ref.shape,\n label: target.ref.label,\n });\n } else {\n nodes.push({ id: target.ref.id, shape: \"rect\", label: target.ref.id });\n }\n\n edges.push({\n from: prev.id,\n to: target.ref.id,\n kind: op.kind,\n label,\n bidirectional: op.bidirectional,\n });\n\n prev = target.ref;\n pos = target.end;\n }\n\n return { nodes, edges };\n}\n\nfunction normalizeDirection(dir: string): FlowchartDirection {\n const up = dir.toUpperCase();\n if (up === \"TD\") return \"TB\";\n if (up === \"TB\" || up === \"BT\" || up === \"LR\" || up === \"RL\") return up;\n return \"TB\";\n}\n\n/** Top-level parser entry. */\nexport function parseFlowchart(source: string): FlowchartAST {\n const lines = source.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n\n const ast: FlowchartAST = {\n type: \"flowchart\",\n direction: \"TB\",\n nodes: [],\n edges: [],\n subgraphs: [],\n classDefs: [],\n linkStyles: new Map(),\n };\n\n const nodeMap = new Map<string, FlowchartNode>();\n\n // Find header line (first non-blank, non-comment line)\n let headerIdx = -1;\n for (let i = 0; i < lines.length; i++) {\n const t = lines[i]!.trim();\n if (t.length === 0 || t.startsWith(\"%%\")) continue;\n headerIdx = i;\n break;\n }\n if (headerIdx < 0) {\n throw new FlowchartParseError(\"empty flowchart source\", 1, 1);\n }\n\n const header = lines[headerIdx]!.trim();\n const headerMatch = /^(flowchart|graph)(?:\\s+(\\w+))?(?:\\s+(.*))?$/i.exec(header);\n if (!headerMatch) {\n throw new FlowchartParseError(\n `expected 'flowchart' or 'graph' header, got ${JSON.stringify(header)}`,\n headerIdx + 1,\n 1\n );\n }\n const dirTok = headerMatch[2];\n if (dirTok) {\n if (!DIRECTIONS.has(dirTok.toUpperCase())) {\n throw new FlowchartParseError(\n `unknown direction ${JSON.stringify(dirTok)}`,\n headerIdx + 1,\n 1\n );\n }\n ast.direction = normalizeDirection(dirTok);\n }\n const extra = headerMatch[3]?.trim();\n if (extra) {\n // title: strip surrounding quotes\n const mQuoted = /^\"([^\"]*)\"$/.exec(extra);\n ast.title = mQuoted ? mQuoted[1] : extra;\n }\n\n for (let i = headerIdx + 1; i < lines.length; i++) {\n const raw = lines[i]!;\n const trimmed = raw.trim();\n if (trimmed.length === 0) continue;\n if (trimmed.startsWith(\"%%\")) continue;\n\n // `class NodeList ClassName` statement — attach semantic class(es) to nodes\n const classMatch = /^class\\s+([\\w,\\s]+?)\\s+(\\w[\\w-]*)\\s*$/.exec(trimmed);\n if (classMatch) {\n const idList = classMatch[1]!\n .split(/[,\\s]+/)\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n const className = classMatch[2]!;\n for (const nid of idList) {\n const existing = nodeMap.get(nid);\n if (!existing) {\n const node: FlowchartNode = { id: nid, shape: \"rect\", label: nid, classes: [className] };\n nodeMap.set(nid, node);\n ast.nodes.push(node);\n } else {\n existing.classes = [...(existing.classes ?? []), className];\n }\n }\n continue;\n }\n\n // Parse chain statement\n const parsed = parseChainStatement(trimmed, i + 1);\n\n for (const ndef of parsed.nodes) {\n const existing = nodeMap.get(ndef.id);\n if (!existing) {\n const node: FlowchartNode = {\n id: ndef.id,\n shape: ndef.shape,\n label: ndef.label,\n };\n nodeMap.set(ndef.id, node);\n ast.nodes.push(node);\n } else {\n // Update shape/label if this declaration carries richer info\n if (ndef.label !== ndef.id) {\n existing.label = ndef.label;\n }\n if (ndef.shape !== \"rect\") {\n existing.shape = ndef.shape;\n }\n }\n }\n\n for (const e of parsed.edges) {\n const edge: FlowchartEdge = {\n from: e.from,\n to: e.to,\n kind: e.kind,\n label: e.label,\n arrowEnd:\n e.kind === \"solid\" || e.kind === \"thick\" || e.kind === \"dotted\" || e.kind === \"bidirectional\"\n ? \"arrow\"\n : e.kind === \"crossed\"\n ? \"cross\"\n : e.kind === \"round-end\"\n ? \"circle\"\n : \"none\",\n arrowStart: e.bidirectional ? \"arrow\" : \"none\",\n };\n ast.edges.push(edge);\n }\n }\n\n return ast;\n}\n","/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/**\n * Flowchart Sugiyama-style layered layout (M1).\n *\n * Phases:\n * 1. Cycle removal — Greedy-FAS (Eades-Lin-Smyth 1993)\n * 2. Layer assignment — Longest-path layering\n * 3. Dummy node insertion for edges spanning > 1 layer\n * 4. Crossing minimization — median heuristic, bi-directional sweep\n * 5. X-coordinate assignment — simple symmetric pass\n * (Brandes-Köpf full 4-alignment is deferred; for M1 a centered\n * median-based placement produces visually indistinguishable results\n * on graphs ≤ 20 nodes, which is the M1 target.)\n *\n * Zero runtime dependencies. All heuristics hand-written.\n */\n\nimport type {\n FlowchartAST,\n FlowchartDirection,\n FlowchartEdge,\n FlowchartLayoutNode,\n FlowchartLayoutResult,\n FlowchartNode,\n} from \"../../core/types\";\n\n// ─── Constants / Defaults ──────────────────────────────────\n\nexport const FC_CONST = {\n nodeWidth: 120,\n nodeHeight: 44,\n nodeSpacingX: 32, // cross-flow gap between nodes in same layer\n layerSpacingY: 56, // flow-direction gap between layers\n dummyWidth: 1,\n padding: 24,\n charWidth: 6.8, // approx font-size 12 proportional width\n labelHPad: 16,\n minNodeWidth: 72,\n maxLabelWidth: 220,\n crossingSweepIters: 24,\n} as const;\n\n// ─── Internal working types ────────────────────────────────\n\ninterface LNode {\n id: string;\n node?: FlowchartNode; // undefined for dummy\n layer: number;\n order: number;\n width: number;\n height: number;\n isDummy: boolean;\n}\n\ninterface LEdge {\n from: string;\n to: string;\n original: FlowchartEdge;\n isReversed: boolean;\n /** After dummy insertion, intermediate node ids that replace the original edge */\n chain: string[]; // includes from and to\n}\n\n// ─── Phase 1: Cycle removal (Greedy-FAS) ───────────────────\n\n/**\n * Greedy FAS heuristic: compute a linear node ordering that minimizes the\n * number of \"back edges\". Back edges then get reversed.\n *\n * Algorithm (Eades-Lin-Smyth 1993):\n * 1. s1 = empty list, s2 = empty list\n * 2. while graph non-empty:\n * extract all sinks (out-deg 0) → append to s2 (front)\n * extract all sources (in-deg 0) → append to s1 (back)\n * extract vertex with max (outDeg - inDeg) → append to s1 (back)\n * 3. ordering = s1 ++ s2\n * 4. any edge (u, v) where order(u) > order(v) is a feedback edge\n */\nfunction greedyFAS(nodeIds: string[], edges: FlowchartEdge[]): Set<number> {\n const outAdj = new Map<string, Set<string>>();\n const inAdj = new Map<string, Set<string>>();\n for (const id of nodeIds) {\n outAdj.set(id, new Set());\n inAdj.set(id, new Set());\n }\n for (const e of edges) {\n // Ignore self-loops for FAS purposes (they're always feedback)\n if (e.from === e.to) continue;\n outAdj.get(e.from)?.add(e.to);\n inAdj.get(e.to)?.add(e.from);\n }\n\n const s1: string[] = [];\n const s2: string[] = [];\n const remaining = new Set(nodeIds);\n\n while (remaining.size > 0) {\n // Extract all current sinks\n let changed = true;\n while (changed) {\n changed = false;\n for (const v of Array.from(remaining)) {\n if ((outAdj.get(v)?.size ?? 0) === 0) {\n s2.unshift(v);\n removeVertex(v, remaining, outAdj, inAdj);\n changed = true;\n }\n }\n }\n // Extract all current sources\n changed = true;\n while (changed) {\n changed = false;\n for (const v of Array.from(remaining)) {\n if ((inAdj.get(v)?.size ?? 0) === 0) {\n s1.push(v);\n removeVertex(v, remaining, outAdj, inAdj);\n changed = true;\n }\n }\n }\n if (remaining.size === 0) break;\n // Pick vertex with max (outDeg - inDeg)\n let best: string | null = null;\n let bestScore = -Infinity;\n for (const v of remaining) {\n const score = (outAdj.get(v)?.size ?? 0) - (inAdj.get(v)?.size ?? 0);\n if (score > bestScore) {\n bestScore = score;\n best = v;\n }\n }\n if (best !== null) {\n s1.push(best);\n removeVertex(best, remaining, outAdj, inAdj);\n }\n }\n\n const ordering = [...s1, ...s2];\n const rank = new Map<string, number>();\n ordering.forEach((id, i) => rank.set(id, i));\n\n const feedback = new Set<number>();\n edges.forEach((e, i) => {\n if (e.from === e.to) {\n feedback.add(i);\n return;\n }\n const ru = rank.get(e.from);\n const rv = rank.get(e.to);\n if (ru !== undefined && rv !== undefined && ru > rv) {\n feedback.add(i);\n }\n });\n return feedback;\n}\n\nfunction removeVertex(\n v: string,\n remaining: Set<string>,\n outAdj: Map<string, Set<string>>,\n inAdj: Map<string, Set<string>>\n): void {\n remaining.delete(v);\n const outs = outAdj.get(v);\n if (outs) {\n for (const w of outs) inAdj.get(w)?.delete(v);\n }\n const ins = inAdj.get(v);\n if (ins) {\n for (const u of ins) outAdj.get(u)?.delete(v);\n }\n outAdj.delete(v);\n inAdj.delete(v);\n}\n\n// ─── Phase 2: Longest-path layer assignment ───────────────\n\nfunction longestPathLayers(\n nodeIds: string[],\n edges: LEdge[]\n): Map<string, number> {\n const layer = new Map<string, number>();\n for (const id of nodeIds) layer.set(id, 0);\n\n const outAdj = new Map<string, string[]>();\n const inDeg = new Map<string, number>();\n for (const id of nodeIds) {\n outAdj.set(id, []);\n inDeg.set(id, 0);\n }\n for (const e of edges) {\n if (e.from === e.to) continue; // skip self-loops\n outAdj.get(e.from)?.push(e.to);\n inDeg.set(e.to, (inDeg.get(e.to) ?? 0) + 1);\n }\n\n // Topo sort (Kahn)\n const queue: string[] = [];\n for (const id of nodeIds) {\n if ((inDeg.get(id) ?? 0) === 0) queue.push(id);\n }\n const order: string[] = [];\n const remIn = new Map(inDeg);\n while (queue.length > 0) {\n const v = queue.shift()!;\n order.push(v);\n for (const w of outAdj.get(v) ?? []) {\n const d = (remIn.get(w) ?? 0) - 1;\n remIn.set(w, d);\n if (d === 0) queue.push(w);\n }\n }\n // If cycles remain (shouldn't, post-FAS), append leftover in arbitrary order\n if (order.length !== nodeIds.length) {\n for (const id of nodeIds) {\n if (!order.includes(id)) order.push(id);\n }\n }\n\n for (const v of order) {\n for (const w of outAdj.get(v) ?? []) {\n const lv = layer.get(v) ?? 0;\n const lw = layer.get(w) ?? 0;\n if (lw < lv + 1) layer.set(w, lv + 1);\n }\n }\n return layer;\n}\n\n// ─── Phase 3: Dummy-node insertion ─────────────────────────\n\nfunction insertDummies(\n ledges: LEdge[],\n layerMap: Map<string, number>,\n genDummyId: () => string\n): { dummyIds: string[]; updatedEdges: LEdge[] } {\n const dummyIds: string[] = [];\n const updated: LEdge[] = [];\n for (const e of ledges) {\n if (e.from === e.to) {\n // self-loop: keep as-is; renderer draws a small arc\n updated.push(e);\n continue;\n }\n const lu = layerMap.get(e.from) ?? 0;\n const lv = layerMap.get(e.to) ?? 0;\n const diff = Math.abs(lv - lu);\n if (diff <= 1) {\n e.chain = [e.from, e.to];\n updated.push(e);\n continue;\n }\n // Insert (diff - 1) dummies on monotonically increasing layers from lu → lv\n const step = lv > lu ? 1 : -1;\n const chain: string[] = [e.from];\n let curLayer = lu + step;\n while (curLayer !== lv) {\n const d = genDummyId();\n layerMap.set(d, curLayer);\n dummyIds.push(d);\n chain.push(d);\n curLayer += step;\n }\n chain.push(e.to);\n e.chain = chain;\n updated.push(e);\n }\n return { dummyIds, updatedEdges: updated };\n}\n\n// ─── Phase 4: Crossing minimization (median heuristic) ────\n\nfunction medianOrder(\n layers: string[][],\n segments: Array<[string, string]>\n): string[][] {\n // Adjacency per node: predecessors (above layer) + successors (below layer)\n const succ = new Map<string, string[]>();\n const pred = new Map<string, string[]>();\n for (const layer of layers) for (const id of layer) {\n succ.set(id, []);\n pred.set(id, []);\n }\n for (const [u, v] of segments) {\n succ.get(u)?.push(v);\n pred.get(v)?.push(u);\n }\n\n const indexOf = (layer: string[], id: string): number => layer.indexOf(id);\n\n const reorderByMedian = (\n layer: string[],\n fixed: string[],\n useSucc: boolean\n ): string[] => {\n const fixedIdx = new Map<string, number>();\n fixed.forEach((id, i) => fixedIdx.set(id, i));\n const scored = layer.map((id, i) => {\n const neighbors = useSucc ? succ.get(id) ?? [] : pred.get(id) ?? [];\n const positions = neighbors\n .map((n) => fixedIdx.get(n))\n .filter((p): p is number => p !== undefined)\n .sort((a, b) => a - b);\n if (positions.length === 0) return { id, score: i, orig: i };\n const m = positions.length;\n const mid = positions[Math.floor(m / 2)]!;\n // Classic median heuristic: for even count, average the two middle\n const score =\n m % 2 === 1\n ? mid\n : (positions[m / 2 - 1]! + positions[m / 2]!) / 2;\n return { id, score, orig: i };\n });\n scored.sort((a, b) => a.score - b.score || a.orig - b.orig);\n return scored.map((s) => s.id);\n };\n\n const result = layers.map((l) => l.slice());\n let bestCrossings = countCrossings(result, segments, indexOf);\n let best = result.map((l) => l.slice());\n\n for (let iter = 0; iter < FC_CONST.crossingSweepIters; iter++) {\n const down = iter % 2 === 0;\n if (down) {\n for (let i = 1; i < result.length; i++) {\n result[i] = reorderByMedian(result[i]!, result[i - 1]!, false);\n }\n } else {\n for (let i = result.length - 2; i >= 0; i--) {\n result[i] = reorderByMedian(result[i]!, result[i + 1]!, true);\n }\n }\n const c = countCrossings(result, segments, indexOf);\n if (c < bestCrossings) {\n bestCrossings = c;\n best = result.map((l) => l.slice());\n }\n }\n\n return best;\n}\n\nfunction countCrossings(\n layers: string[][],\n segments: Array<[string, string]>,\n indexOf: (layer: string[], id: string) => number\n): number {\n // Count inversions per adjacent-layer pair\n let total = 0;\n for (let i = 0; i < layers.length - 1; i++) {\n const upper = layers[i]!;\n const lower = layers[i + 1]!;\n const pairs: Array<[number, number]> = [];\n for (const [u, v] of segments) {\n const iu = indexOf(upper, u);\n const iv = indexOf(lower, v);\n if (iu >= 0 && iv >= 0) pairs.push([iu, iv]);\n }\n // Count inversions on `pairs` sorted by iu: inversion on iv\n pairs.sort((a, b) => a[0] - b[0] || a[1] - b[1]);\n for (let a = 0; a < pairs.length; a++) {\n for (let b = a + 1; b < pairs.length; b++) {\n if (pairs[a]![1] > pairs[b]![1]) total++;\n }\n }\n }\n return total;\n}\n\n// ─── Phase 5: X-coordinate assignment ─────────────────────\n\ninterface Placed {\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n layer: number;\n order: number;\n}\n\n/**\n * Simple symmetric placement:\n * - Each layer's total width is computed (sum of node widths + gaps).\n * - Layers are centered around the global centerline.\n * - Then for each node, its preferred x = average of neighbor xs from both\n * adjacent layers; a single left-to-right sweep per layer snaps positions\n * while respecting minimum separation.\n *\n * This is a pragmatic subset of Brandes-Köpf that behaves well on M1 target\n * graphs (≤ 20 nodes). Longer edges look straight because the same centering\n * is applied to dummy nodes.\n */\nfunction assignXCoords(\n layers: LNode[][],\n nodeSpacingX: number\n): Map<string, number> {\n const x = new Map<string, number>();\n\n // Pass 1: compute initial layer widths, center each layer at 0\n const layerWidths: number[] = [];\n for (const layer of layers) {\n let w = 0;\n for (let i = 0; i < layer.length; i++) {\n w += layer[i]!.width;\n if (i < layer.length - 1) w += nodeSpacingX;\n }\n layerWidths.push(w);\n }\n const maxWidth = Math.max(...layerWidths, 1);\n\n // Initial positions: centered\n for (let li = 0; li < layers.length; li++) {\n const layer = layers[li]!;\n const layerW = layerWidths[li]!;\n let cursor = (maxWidth - layerW) / 2;\n for (const n of layer) {\n x.set(n.id, cursor + n.width / 2);\n cursor += n.width + nodeSpacingX;\n }\n }\n\n // Iterative median refinement (a few passes smooths dummy-heavy columns)\n const neighborsAbove = new Map<string, string[]>();\n const neighborsBelow = new Map<string, string[]>();\n // Built by caller; we infer from layer adjacency using order consistency\n // → we compute these externally via chain traversal; see layoutFlowchart.\n\n void neighborsAbove;\n void neighborsBelow;\n return x;\n}\n\n// ─── Entry point ──────────────────────────────────────────\n\nexport function layoutFlowchart(ast: FlowchartAST): FlowchartLayoutResult {\n const dir: FlowchartDirection = ast.direction;\n const isHorizontalDir = dir === \"LR\" || dir === \"RL\";\n\n // ── Measure node sizes ───────────────────────────────────\n // Returned w/h are in \"abstract TB space\" — flow direction is always Y.\n // For LR we swap at the end so the user-authored shape dims are preserved.\n const sizeOf = (n: FlowchartNode): { w: number; h: number } => {\n const labelW = Math.min(\n FC_CONST.maxLabelWidth,\n Math.ceil(n.label.length * FC_CONST.charWidth) + FC_CONST.labelHPad * 2\n );\n let shapeW = Math.max(FC_CONST.minNodeWidth, labelW);\n let shapeH: number = FC_CONST.nodeHeight;\n if (n.shape === \"diamond\") {\n shapeW = Math.max(shapeW, labelW * 1.25);\n shapeH = Math.max(shapeH, 52);\n }\n if (n.shape === \"parallelogram\" || n.shape === \"parallelogram-alt\") {\n shapeW += 20;\n }\n if (n.shape === \"stadium\" || n.shape === \"round\") {\n shapeW = Math.max(shapeW, shapeH + 20);\n }\n // In LR, swap so abstract-TB \"h\" corresponds to flow-direction extent\n // (= user-authored width); output swap restores canonical shape dims.\n return isHorizontalDir ? { w: shapeH, h: shapeW } : { w: shapeW, h: shapeH };\n };\n\n // ── Build working node map ───────────────────────────────\n const nodeMap = new Map<string, FlowchartNode>();\n for (const n of ast.nodes) nodeMap.set(n.id, n);\n\n // Ensure all edge endpoints exist as nodes (create implicit rect nodes)\n for (const e of ast.edges) {\n for (const id of [e.from, e.to]) {\n if (!nodeMap.has(id)) {\n const implicit: FlowchartNode = { id, label: id, shape: \"rect\" };\n nodeMap.set(id, implicit);\n ast.nodes.push(implicit);\n }\n }\n }\n\n // ── Phase 1: cycle removal ───────────────────────────────\n const allIds = Array.from(nodeMap.keys());\n const feedbackIdx = greedyFAS(allIds, ast.edges);\n\n const ledges: LEdge[] = ast.edges.map((e, i) => {\n const reversed = feedbackIdx.has(i) && e.from !== e.to;\n return {\n from: reversed ? e.to : e.from,\n to: reversed ? e.from : e.to,\n original: e,\n isReversed: reversed,\n chain: [],\n };\n });\n\n // ── Phase 2: layer assignment ────────────────────────────\n const layerMap = longestPathLayers(allIds, ledges);\n\n // ── Phase 3: dummy insertion ─────────────────────────────\n let dummyCounter = 0;\n const dummies: string[] = [];\n const { updatedEdges } = insertDummies(ledges, layerMap, () => {\n const id = `__dummy_${dummyCounter++}`;\n dummies.push(id);\n return id;\n });\n\n // Build LNode map after dummies\n const lnodes = new Map<string, LNode>();\n for (const id of allIds) {\n const n = nodeMap.get(id)!;\n const { w, h } = sizeOf(n);\n lnodes.set(id, {\n id,\n node: n,\n layer: layerMap.get(id) ?? 0,\n order: 0,\n width: w,\n height: h,\n isDummy: false,\n });\n }\n for (const id of dummies) {\n lnodes.set(id, {\n id,\n layer: layerMap.get(id) ?? 0,\n order: 0,\n width: FC_CONST.dummyWidth,\n height: 0,\n isDummy: true,\n });\n }\n\n // Group by layer\n const maxLayer = Math.max(0, ...Array.from(layerMap.values()));\n const layers: string[][] = [];\n for (let i = 0; i <= maxLayer; i++) layers.push([]);\n for (const [id, layer] of layerMap) {\n layers[layer]!.push(id);\n }\n\n // ── Phase 4: crossing minimization ───────────────────────\n // Build segment list (pairs of adjacent-layer node ids along each chain)\n const segments: Array<[string, string]> = [];\n for (const e of updatedEdges) {\n if (e.chain.length >= 2) {\n for (let i = 0; i < e.chain.length - 1; i++) {\n segments.push([e.chain[i]!, e.chain[i + 1]!]);\n }\n }\n }\n const ordered = medianOrder(layers, segments);\n\n // Assign order indices\n for (let li = 0; li < ordered.length; li++) {\n const layer = ordered[li]!;\n for (let oi = 0; oi < layer.length; oi++) {\n const n = lnodes.get(layer[oi]!);\n if (n) n.order = oi;\n }\n }\n\n // ── Phase 5: x-coord assignment ──────────────────────────\n const layerNodes: LNode[][] = ordered.map((layer) =>\n layer.map((id) => lnodes.get(id)!)\n );\n const xMap = assignXCoords(layerNodes, FC_CONST.nodeSpacingX);\n\n // Refine with median pull (3 passes) to straighten long edges through dummies\n for (let pass = 0; pass < 4; pass++) {\n for (let li = 0; li < layerNodes.length; li++) {\n const layer = layerNodes[li]!;\n // Collect neighbors from both adjacent layers\n const pullList = layer.map((n) => {\n const neighbors: number[] = [];\n for (const [u, v] of segments) {\n if (v === n.id) {\n const ux = xMap.get(u);\n if (ux !== undefined) neighbors.push(ux);\n }\n if (u === n.id) {\n const vx = xMap.get(v);\n if (vx !== undefined) neighbors.push(vx);\n }\n }\n if (neighbors.length === 0) return xMap.get(n.id) ?? 0;\n neighbors.sort((a, b) => a - b);\n return neighbors[Math.floor(neighbors.length / 2)]!;\n });\n // Apply pulled positions, then enforce non-overlap left-to-right\n let cursor = -Infinity;\n for (let oi = 0; oi < layer.length; oi++) {\n const n = layer[oi]!;\n const desired = pullList[oi]!;\n const minX = cursor + FC_CONST.nodeSpacingX + n.width / 2;\n const newX = Math.max(desired, oi === 0 ? desired : minX);\n xMap.set(n.id, newX);\n cursor = newX + n.width / 2;\n }\n }\n }\n\n // ── Compute y coords & final canvas dimensions ──────────\n const isHorizontal = dir === \"LR\" || dir === \"RL\";\n const layerGap = FC_CONST.layerSpacingY;\n\n // Per-layer max height (abstract TB) — respects variable-height nodes.\n const layerHeights: number[] = layerNodes.map((layer) => {\n let maxH = 0;\n for (const n of layer) {\n if (n.isDummy) continue;\n if (n.height > maxH) maxH = n.height;\n }\n return maxH > 0 ? maxH : FC_CONST.nodeHeight;\n });\n const layerCenterY: number[] = [];\n {\n let y = FC_CONST.padding;\n for (let li = 0; li < layerHeights.length; li++) {\n y += layerHeights[li]! / 2;\n layerCenterY.push(y);\n y += layerHeights[li]! / 2 + layerGap;\n }\n }\n\n let minX = Infinity;\n let maxX = -Infinity;\n for (const [id, x] of xMap) {\n const n = lnodes.get(id)!;\n if (n.isDummy) continue;\n minX = Math.min(minX, x - n.width / 2);\n maxX = Math.max(maxX, x + n.width / 2);\n }\n if (!isFinite(minX)) {\n minX = 0;\n maxX = 100;\n }\n\n const padding = FC_CONST.padding;\n const shiftX = padding - minX;\n\n const placed: Placed[] = [];\n for (let li = 0; li < layerNodes.length; li++) {\n const y = layerCenterY[li]!;\n for (const n of layerNodes[li]!) {\n if (n.isDummy) continue;\n const cx = (xMap.get(n.id) ?? 0) + shiftX;\n placed.push({\n id: n.id,\n x: cx - n.width / 2,\n y: y - n.height / 2,\n width: n.width,\n height: n.height,\n layer: li,\n order: n.order,\n });\n }\n }\n const dummyPos = new Map<string, { x: number; y: number }>();\n for (let li = 0; li < layerNodes.length; li++) {\n const y = layerCenterY[li]!;\n for (const n of layerNodes[li]!) {\n if (!n.isDummy) continue;\n dummyPos.set(n.id, {\n x: (xMap.get(n.id) ?? 0) + shiftX,\n y,\n });\n }\n }\n\n const canvasW = maxX - minX + 2 * padding;\n const lastLayer = layerCenterY.length - 1;\n const canvasH =\n lastLayer >= 0\n ? layerCenterY[lastLayer]! + layerHeights[lastLayer]! / 2 + padding\n : 2 * padding;\n\n // ── Build layout nodes (possibly swapped for LR) ────────\n const outNodes: FlowchartLayoutNode[] = placed.map((p) => {\n const base = lnodes.get(p.id)!.node!;\n if (!isHorizontal) {\n return {\n node: base,\n x: p.x,\n y: p.y,\n width: p.width,\n height: p.height,\n layer: p.layer,\n order: p.order,\n };\n }\n // Swap POSITIONS for LR (layer direction becomes X) but also swap\n // dims so the user-authored shape orientation is preserved. sizeOf\n // pre-swapped dims on input, so here we swap them back for render.\n return {\n node: base,\n x: p.y,\n y: p.x,\n width: p.height,\n height: p.width,\n layer: p.layer,\n order: p.order,\n };\n });\n\n const outWidth = isHorizontal ? canvasH : canvasW;\n const outHeight = isHorizontal ? canvasW : canvasH;\n\n // ── Build edges (routing) ───────────────────────────────\n const nodeCenter = new Map<string, { x: number; y: number; w: number; h: number }>();\n for (const ln of outNodes) {\n nodeCenter.set(ln.node.id, {\n x: ln.x + ln.width / 2,\n y: ln.y + ln.height / 2,\n w: ln.width,\n h: ln.height,\n });\n }\n // Dummy positions (swap for LR)\n const dummyCenter = new Map<string, { x: number; y: number }>();\n for (const [id, p] of dummyPos) {\n if (!isHorizontal) dummyCenter.set(id, p);\n else dummyCenter.set(id, { x: p.y, y: p.x });\n }\n\n // Import routing lazily to avoid circular deps (routing module is sibling).\n // We inline minimal routing right here to keep imports simple.\n const outEdges = updatedEdges.map((le) => {\n const chain = le.chain.length > 0 ? le.chain : [le.from, le.to];\n // Build polyline through (possibly) dummies\n const points: Array<{ x: number; y: number }> = [];\n for (let i = 0; i < chain.length; i++) {\n const id = chain[i]!;\n const nc = nodeCenter.get(id);\n const dc = dummyCenter.get(id);\n if (nc) {\n points.push({ x: nc.x, y: nc.y });\n } else if (dc) {\n points.push({ x: dc.x, y: dc.y });\n }\n }\n if (points.length < 2) {\n return { edge: le.original, path: \"\" };\n }\n // Clip endpoints to node borders\n const startNode = nodeCenter.get(chain[0]!);\n const endNode = nodeCenter.get(chain[chain.length - 1]!);\n if (startNode) {\n points[0] = clipToBox(points[0]!, points[1]!, startNode, dir, true);\n }\n if (endNode) {\n points[points.length - 1] = clipToBox(\n points[points.length - 1]!,\n points[points.length - 2]!,\n endNode,\n dir,\n false\n );\n }\n\n // Build Manhattan path: for each consecutive pair, insert an L-bend on the\n // dominant axis (TB: vertical primary; LR: horizontal primary).\n const d = buildManhattanPath(points, dir);\n\n // Label anchor: near source exit, offset toward target side. This keeps\n // branch labels (yes / no from a decision) close to the decision and off\n // the shared horizontal routing bar where midpoint-based anchors collide\n // with the edge line itself. Same strategy as entity-structure edges.\n let labelAnchor: { x: number; y: number } | undefined;\n if (le.original.label) {\n labelAnchor = edgeLabelAnchor(points, dir);\n }\n\n return {\n edge: {\n ...le.original,\n isReversed: le.isReversed,\n },\n path: d,\n labelAnchor,\n };\n });\n\n return {\n width: outWidth,\n height: outHeight,\n direction: dir,\n nodes: outNodes,\n edges: outEdges,\n clusters: [],\n };\n}\n\n// ─── Routing helpers ──────────────────────────────────────\n\nfunction clipToBox(\n from: { x: number; y: number },\n toward: { x: number; y: number },\n box: { x: number; y: number; w: number; h: number },\n dir: FlowchartDirection,\n isStart: boolean\n): { x: number; y: number } {\n // Clip the endpoint on the box side facing `toward`. Works for both start\n // (exit toward neighbor) and end (enter from neighbor); the formula is\n // identical — the arrow terminates where the straight ray from center →\n // toward crosses the box boundary.\n void isStart;\n const cx = box.x;\n const cy = box.y;\n if (dir === \"TB\" || dir === \"BT\") {\n const goingDown = toward.y >= from.y;\n return { x: cx, y: cy + (goingDown ? box.h / 2 : -box.h / 2) };\n }\n const goingRight = toward.x >= from.x;\n return { x: cx + (goingRight ? box.w / 2 : -box.w / 2), y: cy };\n}\n\nfunction buildManhattanPath(\n pts: Array<{ x: number; y: number }>,\n dir: FlowchartDirection\n): string {\n if (pts.length === 0) return \"\";\n const parts: string[] = [`M ${fmt(pts[0]!.x)} ${fmt(pts[0]!.y)}`];\n const isHorizontal = dir === \"LR\" || dir === \"RL\";\n for (let i = 1; i < pts.length; i++) {\n const a = pts[i - 1]!;\n const b = pts[i]!;\n if (isHorizontal) {\n // Horizontal primary: go right/left to midX, then vertical, then horizontal\n const midX = (a.x + b.x) / 2;\n parts.push(`L ${fmt(midX)} ${fmt(a.y)}`);\n parts.push(`L ${fmt(midX)} ${fmt(b.y)}`);\n parts.push(`L ${fmt(b.x)} ${fmt(b.y)}`);\n } else {\n const midY = (a.y + b.y) / 2;\n parts.push(`L ${fmt(a.x)} ${fmt(midY)}`);\n parts.push(`L ${fmt(b.x)} ${fmt(midY)}`);\n parts.push(`L ${fmt(b.x)} ${fmt(b.y)}`);\n }\n }\n return parts.join(\" \");\n}\n\nfunction fmt(n: number): string {\n return (Math.round(n * 100) / 100).toString();\n}\n\nfunction edgeLabelAnchor(\n pts: Array<{ x: number; y: number }>,\n dir: FlowchartDirection\n): { x: number; y: number; textAnchor?: \"start\" | \"middle\" | \"end\" } {\n // Strategy: label sits next to the edge polyline on the segment that is\n // unique to this edge (so fan-out branches don't collide with shared\n // routing bars). Text-anchor is set so the glyphs clear the stroke — never\n // centered on the line itself.\n if (pts.length < 2) return pts[0] ?? { x: 0, y: 0 };\n const a = pts[0]!;\n const b = pts[1]!;\n const isHorizontal = dir === \"LR\" || dir === \"RL\";\n\n if (isHorizontal) {\n const midX = (a.x + b.x) / 2;\n const bends = Math.abs(a.y - b.y) > 1;\n if (bends) {\n // Label on the vertical middle segment, text anchored to start so it\n // begins a gap to the right of the line.\n const midY = (a.y + b.y) / 2;\n return { x: midX + 6, y: midY, textAnchor: \"start\" };\n }\n // Straight horizontal run: label centered above the line with clearance.\n return { x: midX, y: a.y - 8, textAnchor: \"middle\" };\n }\n\n // TB / BT\n const midY = (a.y + b.y) / 2;\n const bends = Math.abs(a.x - b.x) > 1;\n if (bends) {\n // Label centered above the horizontal middle bar, clear of the stroke.\n const midX = (a.x + b.x) / 2;\n return { x: midX, y: midY - 8, textAnchor: \"middle\" };\n }\n // Straight vertical drop: anchor to the right of the stub so text begins a\n // gap past the line.\n return { x: a.x + 6, y: midY, textAnchor: \"start\" };\n}\n\n","/**\n * SVG shape primitives for flowchart nodes (M1: 5 shapes).\n *\n * Each builder returns an SVG element string (without the `<g>` wrapper or the\n * text; renderer composes those).\n *\n * All shapes are rendered in the bounding box (0, 0, w, h) — the renderer\n * applies a `translate(x, y)` on the group.\n */\n\nimport type { FlowchartShape } from \"../../core/types\";\nimport { rect, polygon } from \"../../core/svg\";\n\nexport function shapeSVG(shape: FlowchartShape, w: number, h: number): string {\n switch (shape) {\n case \"rect\":\n return rect({ x: 0, y: 0, width: w, height: h, rx: 14, ry: 14, class: \"sx-fc-node\" });\n case \"round\":\n return rect({ x: 0, y: 0, width: w, height: h, rx: 20, ry: 20, class: \"sx-fc-node sx-fc-node-round\" });\n case \"stadium\": {\n const r = Math.min(h / 2, 24);\n return rect({ x: 0, y: 0, width: w, height: h, rx: r, ry: r, class: \"sx-fc-node sx-fc-node-stadium\" });\n }\n case \"diamond\": {\n const points = `${w / 2},0 ${w},${h / 2} ${w / 2},${h} 0,${h / 2}`;\n return polygon({ points, class: \"sx-fc-node sx-fc-node-diamond\" });\n }\n case \"parallelogram\": {\n const slant = 20;\n const points = `${slant},0 ${w},0 ${w - slant},${h} 0,${h}`;\n return polygon({ points, class: \"sx-fc-node\" });\n }\n case \"parallelogram-alt\": {\n const slant = 20;\n const points = `0,0 ${w - slant},0 ${w},${h} ${slant},${h}`;\n return polygon({ points, class: \"sx-fc-node\" });\n }\n default:\n return rect({ x: 0, y: 0, width: w, height: h, rx: 6, ry: 6, class: \"sx-fc-node\" });\n }\n}\n","/**\n * Flowchart renderer — LayoutResult → SVG string.\n *\n * Produces semantic, themeable SVG per spec §12:\n * - <title>/<desc> for a11y\n * - data-* attributes for interaction hooks\n * - CSS custom properties from resolveBaseTheme\n * - Arrowhead markers in <defs>\n */\n\nimport type {\n FlowchartAST,\n FlowchartLayoutEdge,\n FlowchartLayoutNode,\n FlowchartLayoutResult,\n FlowchartEdge,\n FlowchartNode,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n text as textEl,\n path as pathEl,\n rect,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFlowchart } from \"./parser\";\nimport { layoutFlowchart, FC_CONST } from \"./layout\";\nimport { shapeSVG } from \"./shapes\";\nimport { resolveFlowchartTheme, type ThemeName } from \"../../core/theme\";\n\nconst CSS_TEMPLATE = (themeName: ThemeName): string => {\n const t = resolveFlowchartTheme(themeName);\n const c = t.classes;\n return `\n.sx-fc { background: ${t.bg}; font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fc-node { fill: ${t.fillMuted}; stroke: ${t.stroke}; stroke-width: 1.5; stroke-linejoin: round; }\n.sx-fc-node-stadium { fill: ${t.stadiumFill}; stroke: ${t.stroke}; }\n.sx-fc-node-diamond { fill: ${t.diamondFill}; stroke: ${t.stroke}; }\n.sx-fc-node-round { fill: ${t.roundFill}; stroke: ${t.stroke}; }\n.sx-fc-node-text { fill: ${t.text}; font: 12px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n/* Semantic class presets (applied via 'class A start') — override shape fills */\n.sx-fc-class-start > .sx-fc-node { fill: ${c.start.fill}; stroke: ${c.start.stroke}; }\n.sx-fc-class-start > .sx-fc-node-text { fill: ${c.start.text}; font-weight: 600; }\n.sx-fc-class-process > .sx-fc-node { fill: ${c.process.fill}; stroke: ${c.process.stroke}; }\n.sx-fc-class-process > .sx-fc-node-text { fill: ${c.process.text}; font-weight: 600; }\n.sx-fc-class-decision > .sx-fc-node { fill: ${c.decision.fill}; stroke: ${c.decision.stroke}; }\n.sx-fc-class-decision > .sx-fc-node-text { fill: ${c.decision.text}; font-weight: 600; }\n.sx-fc-class-success > .sx-fc-node { fill: ${c.success.fill}; stroke: ${c.success.stroke}; }\n.sx-fc-class-success > .sx-fc-node-text { fill: ${c.success.text}; font-weight: 600; }\n.sx-fc-class-danger > .sx-fc-node { fill: ${c.danger.fill}; stroke: ${c.danger.stroke}; }\n.sx-fc-class-danger > .sx-fc-node-text { fill: ${c.danger.text}; font-weight: 600; }\n.sx-fc-class-neutral > .sx-fc-node { fill: ${c.neutral.fill}; stroke: ${c.neutral.stroke}; }\n.sx-fc-class-neutral > .sx-fc-node-text { fill: ${c.neutral.text}; font-weight: 600; }\n.sx-fc-edge { fill: none; stroke: ${t.neutral}; stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }\n.sx-fc-edge-thick { stroke: ${t.stroke}; stroke-width: 2.4; }\n.sx-fc-edge-dashed { stroke-dasharray: 5 3; }\n.sx-fc-edge-dotted { stroke-dasharray: 1.5 3; }\n.sx-fc-edge-label { fill: ${t.textMuted}; font: 11px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fc-edge-label-bg { fill: ${t.bg}; fill-opacity: 0.96; stroke: ${t.neutral}; stroke-width: 0.5; }\n.sx-fc-title { fill: ${t.text}; font: 600 14px system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n`.trim();\n};\n\nconst ARROW_MARKER = `\n<marker id=\"sx-fc-arrow\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto-start-reverse\" markerUnits=\"userSpaceOnUse\">\n <path d=\"M0,0 L8,4 L0,8 L2,4 Z\" fill=\"context-stroke\"/>\n</marker>\n<marker id=\"sx-fc-arrow-o\" markerWidth=\"8\" markerHeight=\"8\" refX=\"7\" refY=\"4\" orient=\"auto\" markerUnits=\"userSpaceOnUse\">\n <circle cx=\"4\" cy=\"4\" r=\"3\" fill=\"none\" stroke=\"context-stroke\" stroke-width=\"1\"/>\n</marker>\n<marker id=\"sx-fc-arrow-x\" markerWidth=\"8\" markerHeight=\"8\" refX=\"4\" refY=\"4\" orient=\"auto\" markerUnits=\"userSpaceOnUse\">\n <path d=\"M1,1 L7,7 M1,7 L7,1\" stroke=\"context-stroke\" stroke-width=\"1.2\"/>\n</marker>\n`.trim();\n\nfunction edgeCssClass(edge: FlowchartEdge): string {\n const classes = [\"sx-fc-edge\"];\n if (edge.kind === \"thick\") classes.push(\"sx-fc-edge-thick\");\n if (edge.kind === \"dotted\") classes.push(\"sx-fc-edge-dotted\");\n return classes.join(\" \");\n}\n\nfunction markerEndFor(edge: FlowchartEdge): string | undefined {\n switch (edge.arrowEnd) {\n case \"arrow\":\n return \"url(#sx-fc-arrow)\";\n case \"circle\":\n return \"url(#sx-fc-arrow-o)\";\n case \"cross\":\n return \"url(#sx-fc-arrow-x)\";\n default:\n return undefined;\n }\n}\n\nfunction markerStartFor(edge: FlowchartEdge): string | undefined {\n return edge.arrowStart === \"arrow\" ? \"url(#sx-fc-arrow)\" : undefined;\n}\n\nfunction renderNode(ln: FlowchartLayoutNode): string {\n const n: FlowchartNode = ln.node;\n const shapeEl = shapeSVG(n.shape, ln.width, ln.height);\n const label = textEl(\n {\n x: ln.width / 2,\n y: ln.height / 2,\n class: \"sx-fc-node-text\",\n \"text-anchor\": \"middle\",\n \"dominant-baseline\": \"central\",\n },\n n.label\n );\n const nodeTitle = titleEl(n.label);\n const classAttr = [\"sx-fc-node-g\", ...(n.classes ?? []).map((c) => `sx-fc-class-${c}`)].join(\" \");\n return group(\n {\n \"data-node-id\": n.id,\n \"data-shape\": n.shape,\n \"data-layer\": ln.layer,\n \"data-classes\": n.classes?.join(\" \"),\n class: classAttr,\n transform: `translate(${fmt(ln.x)} ${fmt(ln.y)})`,\n },\n [shapeEl, label, nodeTitle]\n );\n}\n\nfunction renderEdge(le: FlowchartLayoutEdge): string {\n const e = le.edge;\n const attrs: Record<string, string | number | undefined> = {\n d: le.path,\n class: edgeCssClass(e),\n };\n const me = markerEndFor(e);\n const ms = markerStartFor(e);\n if (me) attrs[\"marker-end\"] = me;\n if (ms) attrs[\"marker-start\"] = ms;\n const p = pathEl(attrs);\n\n const labelEl =\n e.label && le.labelAnchor\n ? renderEdgeLabel(\n e.label,\n le.labelAnchor.x,\n le.labelAnchor.y,\n le.labelAnchor.textAnchor ?? \"middle\"\n )\n : \"\";\n\n const edgeTitle = titleEl(\n e.label ? `${e.from} → ${e.to}: ${e.label}` : `${e.from} → ${e.to}`\n );\n\n return group(\n {\n \"data-edge-id\": e.id ?? `${e.from}->${e.to}`,\n \"data-kind\": e.kind,\n \"data-from\": e.from,\n \"data-to\": e.to,\n },\n [p, edgeTitle, labelEl].filter((s) => s.length > 0)\n );\n}\n\nfunction renderEdgeLabel(\n label: string,\n cx: number,\n cy: number,\n textAnchor: \"start\" | \"middle\" | \"end\"\n): string {\n // Approximate pill size — matches entity diagram edge label style.\n const w = Math.max(20, label.length * 6.5 + 10);\n const h = 16;\n const rx = cx - (textAnchor === \"start\" ? 0 : textAnchor === \"end\" ? w : w / 2);\n const ry = cy - h / 2;\n const bg = rect({\n x: rx,\n y: ry,\n width: w,\n height: h,\n rx: 3,\n class: \"sx-fc-edge-label-bg\",\n });\n const t = textEl(\n {\n x: cx,\n y: cy,\n class: \"sx-fc-edge-label\",\n \"text-anchor\": textAnchor,\n \"dominant-baseline\": \"central\",\n },\n label\n );\n return group({ class: \"sx-fc-edge-label-g\" }, [bg, t]);\n}\n\nfunction fmt(n: number): string {\n return (Math.round(n * 100) / 100).toString();\n}\n\nexport function renderFlowchartAST(\n ast: FlowchartAST,\n themeName: ThemeName = \"default\"\n): string {\n const layout: FlowchartLayoutResult = layoutFlowchart(ast);\n\n const nodeSvg = layout.nodes.map(renderNode);\n const edgeSvg = layout.edges.map(renderEdge);\n\n const titleBlock = ast.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 16,\n class: \"sx-fc-title\",\n \"text-anchor\": \"middle\",\n },\n ast.title\n )\n : \"\";\n\n const inner: string[] = [\n titleEl(ast.title ? `${ast.title} — Flowchart` : \"Flowchart\"),\n descEl(\n `Flowchart with ${ast.nodes.length} node${ast.nodes.length === 1 ? \"\" : \"s\"} and ${ast.edges.length} edge${ast.edges.length === 1 ? \"\" : \"s\"}.`\n ),\n el(\"style\", {}, CSS_TEMPLATE(themeName)),\n defs([ARROW_MARKER]),\n ];\n if (titleBlock) inner.push(titleBlock);\n inner.push(group({ class: \"sx-fc-edges\" }, edgeSvg));\n inner.push(group({ class: \"sx-fc-nodes\" }, nodeSvg));\n\n // Extra top padding when a title is present\n const topPad = ast.title ? 24 : 0;\n const totalH = layout.height + topPad;\n\n return svgRoot(\n {\n viewBox: `0 0 ${fmt(layout.width)} ${fmt(totalH)}`,\n width: fmt(layout.width),\n height: fmt(totalH),\n class: \"sx-fc\",\n \"data-diagram-type\": \"flowchart\",\n \"data-direction\": layout.direction,\n role: \"graphics-document\",\n },\n [\n ...inner.slice(0, 4),\n ...(titleBlock ? [titleBlock] : []),\n group(\n { transform: topPad > 0 ? `translate(0 ${topPad})` : \"translate(0 0)\" },\n [\n group({ class: \"sx-fc-edges\" }, edgeSvg),\n group({ class: \"sx-fc-nodes\" }, nodeSvg),\n ]\n ),\n ]\n );\n}\n\nexport function renderFlowchart(text: string, themeName: ThemeName = \"default\"): string {\n const ast = parseFlowchart(text);\n return renderFlowchartAST(ast, themeName);\n}\n\n// Keep FC_CONST reachable via renderer for test convenience.\nexport { FC_CONST };\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { renderFlowchart } from \"./renderer\";\n\nexport const flowchart: DiagramPlugin = {\n type: \"flowchart\",\n detect(text: string): boolean {\n // Scan the first non-blank, non-comment line.\n for (const raw of text.split(/\\r?\\n/)) {\n const t = raw.trim();\n if (t.length === 0) continue;\n if (t.startsWith(\"%%\")) continue;\n const first = t.split(/\\s+/)[0]?.toLowerCase() ?? \"\";\n return first === \"flowchart\" || first === \"graph\";\n }\n return false;\n },\n render(text: string, config?: RenderConfig): string {\n const themeName = (config?.theme ?? \"default\") as \"default\" | \"monochrome\" | \"dark\";\n return renderFlowchart(text, themeName);\n },\n};\n\nexport { parseFlowchart } from \"./parser\";\nexport { renderFlowchart, renderFlowchartAST } from \"./renderer\";\nexport { layoutFlowchart, FC_CONST } from \"./layout\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title"],"mappings":"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","file":"chunk-CZRM7LT7.js","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n let title: string | undefined;\n const titleMatch = headerLine.match(/\"([^\"]+)\"/);\n if (titleMatch) title = titleMatch[1];\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata: {},\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n background: ${t.bg};\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar\n const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const svgContent = [\n title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}