schematex 0.1.1 → 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 +130 -15
  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-7FZSPKX3.cjs → chunk-IMHR3S5H.cjs} +6 -5
  39. package/dist/chunk-IMHR3S5H.cjs.map +1 -0
  40. package/dist/{chunk-HGHWCB6K.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 +1 -1
  100. package/dist/diagrams/fishbone/index.d.ts +1 -1
  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-7FZSPKX3.cjs.map +0 -1
  173. package/dist/chunk-ADOXGKAK.js +0 -1251
  174. package/dist/chunk-ADOXGKAK.js.map +0 -1
  175. package/dist/chunk-CZRM7LT7.js.map +0 -1
  176. package/dist/chunk-D4JTSPOL.js.map +0 -1
  177. package/dist/chunk-DS47NTWZ.cjs.map +0 -1
  178. package/dist/chunk-FDLZEKEB.js.map +0 -1
  179. package/dist/chunk-FGPTCDUT.cjs.map +0 -1
  180. package/dist/chunk-HGHWCB6K.js.map +0 -1
  181. package/dist/chunk-IX554O5K.js.map +0 -1
  182. package/dist/chunk-MDICUK6F.cjs +0 -1258
  183. package/dist/chunk-MDICUK6F.cjs.map +0 -1
  184. package/dist/chunk-N7KOXOMX.cjs.map +0 -1
  185. package/dist/chunk-NYCIK4SU.cjs.map +0 -1
  186. package/dist/chunk-PDPHRZZT.js.map +0 -1
  187. package/dist/chunk-ROFLJ74T.js.map +0 -1
  188. package/dist/chunk-S6BK5DB6.cjs.map +0 -1
  189. package/dist/chunk-U5GGE6PJ.js.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","rect","polygon","resolveFlowchartTheme","text","title","group","fmt","path","desc","el","defs","svgRoot"],"mappings":"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","file":"chunk-MDICUK6F.cjs","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/core/theme.ts"],"names":[],"mappings":"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","file":"chunk-N7KOXOMX.cjs","sourcesContent":["/**\n * Shared design-token system for all Schematex diagram renderers.\n *\n * Two-layer architecture:\n * 1. BaseTheme — universal tokens every diagram uses\n * 2. Semantic extensions — diagram-family tokens (PersonTokens, BiologyTokens, …)\n *\n * Three built-in presets: default, monochrome, dark.\n * All tokens are also exposed as CSS custom properties (--schematex-*)\n * so consumers can override them.\n */\n\n// ─── Theme Name ────────────────────────────────────────────\n\nexport type ThemeName = \"default\" | \"monochrome\" | \"dark\";\n\n// ─── Base Theme ────────────────────────────────────────────\n\nexport interface BaseTheme {\n bg: string;\n text: string;\n textMuted: string;\n stroke: string;\n fill: string;\n fillMuted: string;\n /** Emphasis / interactive / link color. Use for net labels, focus, selected. */\n accent: string;\n positive: string;\n negative: string;\n /** Mid-gray. Use for muted strokes, neutral-valence edges, dashed separators. */\n neutral: string;\n warn: string;\n /** Category palette — 8 distinguishable colors for ecomap systems, sociogram groups, etc. */\n palette: readonly string[];\n}\n\n// ─── Diagram-Family Semantic Extensions ────────────────────\n\nexport interface PersonTokens {\n maleFill: string;\n femaleFill: string;\n unknownFill: string;\n deceasedMark: string;\n conditionFill: string;\n}\n\nexport interface BiologyTokens {\n cladeColors: readonly string[];\n supportGood: string;\n supportMedium: string;\n supportWarn: string;\n supportBad: string;\n}\n\n/**\n * Tokens for set-theory diagrams (Venn / Euler). Paletteof set fills is\n * tuned slightly softer than BaseTheme to blend nicely under\n * `mix-blend-mode: multiply`.\n */\nexport interface VennTokens {\n vennSetColors: readonly string[];\n vennBlendMode: \"multiply\" | \"screen\" | \"none\";\n vennSetOpacity: number;\n vennSetStroke: string;\n vennLabelColor: string;\n vennCountColor: string;\n vennLeaderColor: string;\n}\n\n/**\n * Tokens for industrial / compliance diagrams (circuit, ladder, SLD, logic gate).\n * These diagrams must stay monochrome under IEEE 315 / IEC 61131-3 standards, so\n * `default` and `monochrome` resolve to pure black-on-white. `dark` is the only\n * variant that shifts — it inverts luminance (light-on-dark) for dark-mode UI.\n * No colorful variant is exposed by design.\n */\nexport interface IndustrialTokens {\n bg: string;\n stroke: string;\n strokeHeavy: string;\n text: string;\n textMuted: string;\n /** Reserved accent for net/bus labels (not for body lines). */\n accent: string;\n /** Fault/missing-symbol indicator. */\n error: string;\n}\n\n/**\n * Tokens for flowchart semantic node classes. Kept separate from BaseTheme so\n * the class-fill palette can be themed without touching structural tokens.\n */\nexport interface FlowchartClassPair {\n fill: string;\n stroke: string;\n text: string;\n}\n\nexport interface FlowchartTokens {\n stadiumFill: string;\n diamondFill: string;\n roundFill: string;\n classes: {\n start: FlowchartClassPair;\n process: FlowchartClassPair;\n decision: FlowchartClassPair;\n success: FlowchartClassPair;\n danger: FlowchartClassPair;\n neutral: FlowchartClassPair;\n };\n}\n\n/**\n * Tokens for knowledge / brainstorming diagrams (mindmap).\n * Pure color tokens — stroke widths live in mindmap-internal constants.\n */\nexport interface MindmapTokens {\n centralFill: string;\n branchPalette: readonly string[];\n}\n\n// ─── Resolved Theme ────────────────────────────────────────\n\nexport type ResolvedTheme<T = object> = BaseTheme & T;\n\n// ─── Built-in Presets ──────────────────────────────────────\n\n/**\n * Unified 8-color category palettes. Single source of truth for every\n * diagram family — ecomap systems, sociogram groups, phylo clades, fishbone\n * bones, Venn sets all cycle through the same colors per theme.\n * Default uses Tailwind 600; dark uses Catppuccin Mocha; mono uses greys.\n */\nconst DEFAULT_PALETTE = [\n \"#2563eb\", // blue-600\n \"#059669\", // emerald-600\n \"#d97706\", // amber-600\n \"#7c3aed\", // violet-600\n \"#dc2626\", // red-600\n \"#0891b2\", // cyan-600\n \"#db2777\", // pink-600\n \"#475569\", // slate-600\n] as const;\n\nconst MONOCHROME_PALETTE = [\n \"#1f2937\",\n \"#374151\",\n \"#4b5563\",\n \"#6b7280\",\n \"#9ca3af\",\n \"#7a7a7a\",\n \"#525252\",\n \"#262626\",\n] as const;\n\nconst DARK_PALETTE = [\n \"#89b4fa\", // blue\n \"#a6e3a1\", // green\n \"#fab387\", // peach\n \"#cba6f7\", // mauve\n \"#f38ba8\", // red\n \"#94e2d5\", // teal\n \"#f5c2e7\", // pink\n \"#89dceb\", // sky\n] as const;\n\nconst DEFAULT_THEME: BaseTheme = {\n bg: \"#ffffff\",\n text: \"#0f172a\",\n textMuted: \"#475569\",\n stroke: \"#334155\",\n fill: \"#ffffff\",\n fillMuted: \"#f1f5f9\",\n accent: \"#2563eb\",\n positive: \"#059669\",\n negative: \"#dc2626\",\n neutral: \"#94a3b8\",\n warn: \"#d97706\",\n palette: DEFAULT_PALETTE,\n};\n\nconst MONOCHROME_THEME: BaseTheme = {\n bg: \"#ffffff\",\n text: \"#000000\",\n textMuted: \"#555555\",\n stroke: \"#000000\",\n fill: \"#ffffff\",\n fillMuted: \"#f0f0f0\",\n accent: \"#000000\",\n positive: \"#000000\",\n negative: \"#000000\",\n neutral: \"#888888\",\n warn: \"#000000\",\n palette: MONOCHROME_PALETTE,\n};\n\nconst DARK_THEME: BaseTheme = {\n bg: \"#1e1e2e\",\n text: \"#cdd6f4\",\n textMuted: \"#7f849c\",\n stroke: \"#cdd6f4\",\n fill: \"#313244\",\n fillMuted: \"#45475a\",\n accent: \"#89b4fa\",\n positive: \"#a6e3a1\",\n negative: \"#f38ba8\",\n neutral: \"#6c7086\",\n warn: \"#fab387\",\n palette: DARK_PALETTE,\n};\n\nexport const BASE_THEMES: Record<ThemeName, BaseTheme> = {\n default: DEFAULT_THEME,\n monochrome: MONOCHROME_THEME,\n dark: DARK_THEME,\n};\n\n// ─── Person Tokens Per Theme ───────────────────────────────\n\nconst DEFAULT_PERSON: PersonTokens = {\n maleFill: \"#dbeafe\",\n femaleFill: \"#fce7f3\",\n unknownFill: \"#f5f5f5\",\n deceasedMark: \"#b71c1c\",\n conditionFill: \"#1565c0\",\n};\n\nconst MONOCHROME_PERSON: PersonTokens = {\n maleFill: \"#ffffff\",\n femaleFill: \"#ffffff\",\n unknownFill: \"#ffffff\",\n deceasedMark: \"#000000\",\n conditionFill: \"#000000\",\n};\n\nconst DARK_PERSON: PersonTokens = {\n maleFill: \"#1e3a5f\",\n femaleFill: \"#3e1f3e\",\n unknownFill: \"#45475a\",\n deceasedMark: \"#f38ba8\",\n conditionFill: \"#89b4fa\",\n};\n\nexport const PERSON_TOKENS: Record<ThemeName, PersonTokens> = {\n default: DEFAULT_PERSON,\n monochrome: MONOCHROME_PERSON,\n dark: DARK_PERSON,\n};\n\n// ─── Biology Tokens Per Theme ──────────────────────────────\n\nconst DEFAULT_BIOLOGY: BiologyTokens = {\n cladeColors: DEFAULT_PALETTE,\n supportGood: \"#059669\",\n supportMedium: \"#ca8a04\",\n supportWarn: \"#d97706\",\n supportBad: \"#dc2626\",\n};\n\nconst MONOCHROME_BIOLOGY: BiologyTokens = {\n cladeColors: MONOCHROME_PALETTE,\n supportGood: \"#000000\",\n supportMedium: \"#555555\",\n supportWarn: \"#888888\",\n supportBad: \"#aaaaaa\",\n};\n\nconst DARK_BIOLOGY: BiologyTokens = {\n cladeColors: DARK_PALETTE,\n supportGood: \"#a6e3a1\",\n supportMedium: \"#f9e2af\",\n supportWarn: \"#fab387\",\n supportBad: \"#f38ba8\",\n};\n\nexport const BIOLOGY_TOKENS: Record<ThemeName, BiologyTokens> = {\n default: DEFAULT_BIOLOGY,\n monochrome: MONOCHROME_BIOLOGY,\n dark: DARK_BIOLOGY,\n};\n\n// ─── Venn Tokens Per Theme ─────────────────────────────────\n\nconst DEFAULT_VENN: VennTokens = {\n vennSetColors: DEFAULT_PALETTE,\n vennBlendMode: \"multiply\",\n vennSetOpacity: 0.38,\n vennSetStroke: \"#94a3b8\",\n vennLabelColor: \"#0f172a\",\n vennCountColor: \"#0f172a\",\n vennLeaderColor: \"#64748b\",\n};\n\nconst MONOCHROME_VENN: VennTokens = {\n vennSetColors: [\"#999999\", \"#999999\", \"#999999\", \"#999999\", \"#999999\", \"#999999\", \"#999999\", \"#999999\"],\n vennBlendMode: \"none\",\n vennSetOpacity: 0.22,\n vennSetStroke: \"#000000\",\n vennLabelColor: \"#000000\",\n vennCountColor: \"#000000\",\n vennLeaderColor: \"#444444\",\n};\n\nconst DARK_VENN: VennTokens = {\n vennSetColors: DARK_PALETTE,\n vennBlendMode: \"screen\",\n vennSetOpacity: 0.55,\n vennSetStroke: \"#585b70\",\n vennLabelColor: \"#cdd6f4\",\n vennCountColor: \"#f9e2af\",\n vennLeaderColor: \"#7f849c\",\n};\n\nexport const VENN_TOKENS: Record<ThemeName, VennTokens> = {\n default: DEFAULT_VENN,\n monochrome: MONOCHROME_VENN,\n dark: DARK_VENN,\n};\n\n// ─── Mindmap Tokens Per Theme ──────────────────────────────\n\n// Kept as its own struct so the mindmap palette can diverge from BaseTheme\n// later if we want (e.g., a softer / more organic set of branch colors).\n// Today the values mirror BaseTheme.palette so mindmap visually belongs with\n// the rest of the diagram family.\n\nconst DEFAULT_MINDMAP: MindmapTokens = {\n centralFill: \"#0f172a\",\n branchPalette: DEFAULT_PALETTE,\n};\n\nconst MONOCHROME_MINDMAP: MindmapTokens = {\n centralFill: \"#000000\",\n branchPalette: [\"#000000\"],\n};\n\nconst DARK_MINDMAP: MindmapTokens = {\n centralFill: \"#cdd6f4\",\n branchPalette: DARK_PALETTE,\n};\n\nexport const MINDMAP_TOKENS: Record<ThemeName, MindmapTokens> = {\n default: DEFAULT_MINDMAP,\n monochrome: MONOCHROME_MINDMAP,\n dark: DARK_MINDMAP,\n};\n\n// ─── Industrial Tokens Per Theme ───────────────────────────\n\nconst DEFAULT_INDUSTRIAL: IndustrialTokens = {\n bg: \"#ffffff\",\n stroke: \"#222222\",\n strokeHeavy: \"#111111\",\n text: \"#111111\",\n textMuted: \"#555555\",\n accent: \"#1d4e89\",\n error: \"#cc0000\",\n};\n\nconst MONOCHROME_INDUSTRIAL: IndustrialTokens = {\n bg: \"#ffffff\",\n stroke: \"#000000\",\n strokeHeavy: \"#000000\",\n text: \"#000000\",\n textMuted: \"#333333\",\n accent: \"#000000\",\n error: \"#000000\",\n};\n\n// Dark = inverted luminance only. No colorful semantics — still compliance-grade.\nconst DARK_INDUSTRIAL: IndustrialTokens = {\n bg: \"#1e1e2e\",\n stroke: \"#cdd6f4\",\n strokeHeavy: \"#ffffff\",\n text: \"#cdd6f4\",\n textMuted: \"#9399b2\",\n accent: \"#89b4fa\",\n error: \"#f38ba8\",\n};\n\nexport const INDUSTRIAL_TOKENS: Record<ThemeName, IndustrialTokens> = {\n default: DEFAULT_INDUSTRIAL,\n monochrome: MONOCHROME_INDUSTRIAL,\n dark: DARK_INDUSTRIAL,\n};\n\nexport function resolveIndustrialTheme(name: string): ResolvedTheme<IndustrialTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...INDUSTRIAL_TOKENS[themeName] };\n}\n\n// ─── Flowchart Tokens Per Theme ────────────────────────────\n\nconst DEFAULT_FLOWCHART: FlowchartTokens = {\n stadiumFill: \"#dbeafe\",\n diamondFill: \"#fef3c7\",\n roundFill: \"#dcfce7\",\n classes: {\n start: { fill: \"#f0ece0\", stroke: \"#9a8b6a\", text: \"#5c4e2e\" },\n process: { fill: \"#e8e4ff\", stroke: \"#8b7dd8\", text: \"#4c3a8f\" },\n decision: { fill: \"#fde8c8\", stroke: \"#d4985c\", text: \"#8a5a1f\" },\n success: { fill: \"#d4f0e0\", stroke: \"#7bc19a\", text: \"#1e5a3a\" },\n danger: { fill: \"#fbe0dc\", stroke: \"#d89181\", text: \"#8a3525\" },\n neutral: { fill: \"#ececec\", stroke: \"#a0a0a0\", text: \"#555555\" },\n },\n};\n\nconst MONOCHROME_FLOWCHART: FlowchartTokens = {\n stadiumFill: \"#ffffff\",\n diamondFill: \"#ffffff\",\n roundFill: \"#ffffff\",\n classes: {\n start: { fill: \"#ffffff\", stroke: \"#000000\", text: \"#000000\" },\n process: { fill: \"#ffffff\", stroke: \"#000000\", text: \"#000000\" },\n decision: { fill: \"#ffffff\", stroke: \"#000000\", text: \"#000000\" },\n success: { fill: \"#ffffff\", stroke: \"#000000\", text: \"#000000\" },\n danger: { fill: \"#ffffff\", stroke: \"#000000\", text: \"#000000\" },\n neutral: { fill: \"#ffffff\", stroke: \"#000000\", text: \"#000000\" },\n },\n};\n\nconst DARK_FLOWCHART: FlowchartTokens = {\n stadiumFill: \"#1e3a5f\",\n diamondFill: \"#3a3a2a\",\n roundFill: \"#1f3a2a\",\n classes: {\n start: { fill: \"#3a3326\", stroke: \"#c9b88a\", text: \"#f5e7c7\" },\n process: { fill: \"#2e2a52\", stroke: \"#a89ee0\", text: \"#d9d2ff\" },\n decision: { fill: \"#3a2d1a\", stroke: \"#d4985c\", text: \"#f2d5a8\" },\n success: { fill: \"#1e3a2a\", stroke: \"#7bc19a\", text: \"#cdefd8\" },\n danger: { fill: \"#3a231f\", stroke: \"#d89181\", text: \"#f2d0c8\" },\n neutral: { fill: \"#313244\", stroke: \"#7f849c\", text: \"#cdd6f4\" },\n },\n};\n\nexport const FLOWCHART_TOKENS: Record<ThemeName, FlowchartTokens> = {\n default: DEFAULT_FLOWCHART,\n monochrome: MONOCHROME_FLOWCHART,\n dark: DARK_FLOWCHART,\n};\n\nexport function resolveFlowchartTheme(name: string): ResolvedTheme<FlowchartTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...FLOWCHART_TOKENS[themeName] };\n}\n\nexport function resolveMindmapTheme(name: string): ResolvedTheme<MindmapTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...MINDMAP_TOKENS[themeName] };\n}\n\n// ─── Theme Resolution ──────────────────────────────────────\n\nexport function resolveBaseTheme(name: string): BaseTheme {\n return BASE_THEMES[name as ThemeName] ?? BASE_THEMES[\"default\"];\n}\n\nexport function resolvePersonTheme(name: string): ResolvedTheme<PersonTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...PERSON_TOKENS[themeName] };\n}\n\nexport function resolveBiologyTheme(name: string): ResolvedTheme<BiologyTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...BIOLOGY_TOKENS[themeName] };\n}\n\n/**\n * Fishbone uses BaseTheme directly — its bone colors come from `theme.palette`.\n * Kept as a named resolver so callers don't have to know that.\n */\nexport function resolveFishboneTheme(name: string): BaseTheme {\n return resolveBaseTheme(name);\n}\n\nexport function resolveVennTheme(name: string): ResolvedTheme<VennTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...VENN_TOKENS[themeName] };\n}\n\n// ─── Genogram Theme Aliases ────────────────────────────────\n\nconst GENOGRAM_ALIASES: Record<string, ThemeName> = {\n clinical: \"monochrome\",\n colorful: \"default\",\n mono: \"monochrome\",\n bw: \"monochrome\",\n};\n\nexport function resolveGenogramTheme(name: string): ResolvedTheme<PersonTokens> {\n const resolved = GENOGRAM_ALIASES[name] ?? name;\n return resolvePersonTheme(resolved);\n}\n\n// ─── Font Sizes ────────────────────────────────────────────\n\n/**\n * Three-tier typography scale. Diagram-specific font sizes (e.g., 14px section\n * labels, 20px hero titles) live as local constants inside their renderer.\n */\nexport const FONT_SIZE = {\n title: 16,\n label: 12,\n small: 9,\n} as const;\n\n// ─── Stroke Widths ─────────────────────────────────────────\n\n/**\n * Three-tier stroke scale. Anything in between is a local constant in the\n * diagram that needs it.\n * thin — hairlines, ticks, secondary gridlines\n * normal — default body strokes (shapes, edges)\n * thick — emphasis (proband index, star node, center shape)\n */\nexport const STROKE_WIDTH = {\n thin: 1,\n normal: 2,\n thick: 3,\n} as const;\n\n// ─── Spacing ───────────────────────────────────────────────\n\nexport const SPACING = {\n labelGap: 4,\n tipLabelGap: 6,\n titleOffset: 30,\n} as const;\n\n// ─── Font Family ───────────────────────────────────────────\n\nexport const DEFAULT_FONT_FAMILY = \"system-ui, -apple-system, sans-serif\";\n\n// ─── CSS Custom Properties ─────────────────────────────────\n\nexport function cssCustomProperties(theme?: BaseTheme): string {\n const t = theme ?? BASE_THEMES[\"default\"];\n return `\n --schematex-bg: ${t.bg};\n --schematex-text: ${t.text};\n --schematex-text-muted: ${t.textMuted};\n --schematex-stroke: ${t.stroke};\n --schematex-fill: ${t.fill};\n --schematex-fill-muted: ${t.fillMuted};\n --schematex-accent: ${t.accent};\n --schematex-positive: ${t.positive};\n --schematex-negative: ${t.negative};\n --schematex-neutral: ${t.neutral};\n --schematex-warn: ${t.warn};\n --schematex-font-title: ${FONT_SIZE.title}px;\n --schematex-font-label: ${FONT_SIZE.label}px;\n --schematex-font-small: ${FONT_SIZE.small}px;\n --schematex-stroke-thin: ${STROKE_WIDTH.thin};\n --schematex-stroke-normal: ${STROKE_WIDTH.normal};\n --schematex-stroke-thick: ${STROKE_WIDTH.thick};`;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/diagrams/sociogram/parser.ts","../src/diagrams/sociogram/layout.ts","../src/diagrams/sociogram/renderer.ts","../src/diagrams/sociogram/index.ts"],"names":["line","text","clean","props","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","el","circle","polygon","resolveBaseTheme","title","desc","group","svgRoot"],"mappings":"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","file":"chunk-NYCIK4SU.cjs","sourcesContent":["export class SociogramParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SociogramParseError\";\n }\n}\n\n// ─── AST Types ──────────────────────────────────────────────\n\nexport type SociogramLayout = \"circular\" | \"force-directed\" | \"concentric\";\nexport type EdgeValence = \"positive\" | \"negative\" | \"neutral\";\nexport type EdgeDirection = \"one-way\" | \"mutual\" | \"undirected\";\nexport type NodeRole = \"star\" | \"isolate\" | \"bridge\" | \"neglectee\" | \"rejected\";\nexport type SizingMode = \"uniform\" | \"in-degree\" | \"betweenness\";\nexport type ColoringMode = \"default\" | \"group\" | \"role\";\n\nexport interface SociogramNode {\n id: string;\n label?: string;\n group?: string;\n role?: NodeRole;\n size?: \"small\" | \"medium\" | \"large\";\n properties?: Record<string, string>;\n}\n\nexport interface SociogramEdge {\n from: string;\n to: string;\n direction: EdgeDirection;\n valence: EdgeValence;\n weight: number;\n label?: string;\n}\n\nexport interface SociogramGroup {\n id: string;\n label?: string;\n color?: string;\n members: string[];\n}\n\nexport interface SociogramConfig {\n layout: SociogramLayout;\n sizing: SizingMode;\n coloring: ColoringMode;\n highlight: string[];\n}\n\nexport interface SociogramAST {\n type: \"sociogram\";\n title?: string;\n config: SociogramConfig;\n nodes: SociogramNode[];\n edges: SociogramEdge[];\n groups: SociogramGroup[];\n}\n\n// ─── Edge Operator Parsing ──────────────────────────────────\n\ninterface EdgeOp {\n direction: EdgeDirection;\n valence: EdgeValence;\n weight: number;\n}\n\nconst EDGE_OPS: [string, EdgeOp][] = [\n [\"<===>\", { direction: \"mutual\", valence: \"positive\", weight: 4 }],\n [\"===>\" , { direction: \"one-way\", valence: \"positive\", weight: 4 }],\n [\"<===\", { direction: \"one-way\", valence: \"positive\", weight: 4 }],\n [\"<==>\", { direction: \"mutual\", valence: \"positive\", weight: 3 }],\n [\"==>\" , { direction: \"one-way\", valence: \"positive\", weight: 3 }],\n [\"<==\", { direction: \"one-way\", valence: \"positive\", weight: 3 }],\n [\"===\", { direction: \"undirected\", valence: \"positive\", weight: 3 }],\n [\"<x->\", { direction: \"mutual\", valence: \"negative\", weight: 2 }],\n [\"-x>\", { direction: \"one-way\", valence: \"negative\", weight: 2 }],\n [\"<x-\", { direction: \"one-way\", valence: \"negative\", weight: 2 }],\n [\"-x-\", { direction: \"undirected\", valence: \"negative\", weight: 2 }],\n [\"<.->\", { direction: \"mutual\", valence: \"neutral\", weight: 2 }],\n [\".->\", { direction: \"one-way\", valence: \"neutral\", weight: 2 }], // part of -.>\n [\"-.-\", { direction: \"undirected\", valence: \"neutral\", weight: 2 }],\n [\"<->\", { direction: \"mutual\", valence: \"positive\", weight: 2 }],\n [\"->\", { direction: \"one-way\", valence: \"positive\", weight: 2 }],\n [\"<-\", { direction: \"one-way\", valence: \"positive\", weight: 2 }],\n [\"--\", { direction: \"undirected\", valence: \"positive\", weight: 2 }],\n];\n\nfunction findEdgeOp(line: string): { leftId: string; rightId: string; op: EdgeOp; rest: string } | null {\n for (const [opStr, op] of EDGE_OPS) {\n const idx = line.indexOf(` ${opStr} `);\n if (idx === -1) continue;\n\n const leftId = line.slice(0, idx).trim();\n const afterOp = line.slice(idx + opStr.length + 2).trim();\n\n if (!leftId || !/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(leftId)) continue;\n\n // Right side: ID [props]\n const rightMatch = afterOp.match(/^([a-zA-Z][a-zA-Z0-9_-]*)(.*)/);\n if (!rightMatch) continue;\n\n const rightId = rightMatch[1];\n const rest = rightMatch[2].trim();\n\n // Handle reverse direction\n if (opStr === \"<-\" || opStr === \"<==\" || opStr === \"<===\" || opStr === \"<x-\") {\n return { leftId: rightId, rightId: leftId, op: { ...op, direction: \"one-way\" }, rest };\n }\n\n return { leftId, rightId, op, rest };\n }\n\n // Try -.> which has the dot embedded\n const dashDotMatch = line.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\\s+-\\.>\\s+([a-zA-Z][a-zA-Z0-9_-]*)(.*)/);\n if (dashDotMatch) {\n return {\n leftId: dashDotMatch[1],\n rightId: dashDotMatch[2],\n op: { direction: \"one-way\", valence: \"neutral\", weight: 2 },\n rest: dashDotMatch[3].trim(),\n };\n }\n\n return null;\n}\n\n// ─── Property Parsing ───────────────────────────────────────\n\nfunction parseProperties(propsStr: string): Record<string, string> {\n const result: Record<string, string> = {};\n // Match key: \"value\" or key: value pairs\n const regex = /(\\w[\\w-]*):\\s*(?:\"([^\"]*)\"|([^\\s,\\]]+))/g;\n let match;\n while ((match = regex.exec(propsStr)) !== null) {\n result[match[1]] = match[2] ?? match[3];\n }\n return result;\n}\n\nfunction extractProps(line: string): { clean: string; props: Record<string, string> } {\n const bracketMatch = line.match(/\\[([^\\]]*)\\]/);\n if (!bracketMatch) return { clean: line, props: {} };\n const clean = line.slice(0, bracketMatch.index).trim();\n const props = parseProperties(bracketMatch[1]);\n return { clean, props };\n}\n\n// ─── Main Parser ────────────────────────────────────────────\n\nexport function parseSociogram(text: string): SociogramAST {\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\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"sociogram\")) {\n throw new SociogramParseError(\"Sociogram must start with 'sociogram'\");\n }\n lineIdx++;\n\n let titleStr: string | undefined;\n const titleMatch = headerLine.match(/\"([^\"]+)\"/);\n if (titleMatch) titleStr = titleMatch[1];\n\n const config: SociogramConfig = {\n layout: \"circular\",\n sizing: \"uniform\",\n coloring: \"default\",\n highlight: [\"stars\", \"isolates\"],\n };\n\n const nodes: SociogramNode[] = [];\n const edges: SociogramEdge[] = [];\n const groups: SociogramGroup[] = [];\n const nodeIds = new Set<string>();\n\n let currentGroup: SociogramGroup | null = null;\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 // Config line\n if (trimmed.startsWith(\"config:\")) {\n const configBody = trimmed.slice(7).trim();\n const eqIdx = configBody.indexOf(\"=\");\n if (eqIdx !== -1) {\n const key = configBody.slice(0, eqIdx).trim();\n const val = configBody.slice(eqIdx + 1).trim();\n switch (key) {\n case \"layout\":\n if ([\"circular\", \"force-directed\", \"concentric\"].includes(val)) {\n config.layout = val as SociogramLayout;\n }\n break;\n case \"sizing\":\n if ([\"uniform\", \"in-degree\", \"betweenness\"].includes(val)) {\n config.sizing = val as SizingMode;\n }\n break;\n case \"coloring\":\n if ([\"default\", \"group\", \"role\"].includes(val)) {\n config.coloring = val as ColoringMode;\n }\n break;\n case \"highlight\":\n config.highlight = val.split(\",\").map((s) => s.trim());\n break;\n }\n }\n continue;\n }\n\n // Group definition\n if (trimmed.startsWith(\"group \")) {\n const { clean, props } = extractProps(trimmed.slice(6).trim());\n const groupId = clean.split(/\\s/)[0];\n currentGroup = {\n id: groupId,\n label: props.label ?? groupId,\n color: props.color,\n members: [],\n };\n groups.push(currentGroup);\n continue;\n }\n\n // Check indentation for group members\n const indent = raw.search(/\\S/);\n if (currentGroup && indent >= 4) {\n const { clean, props } = extractProps(trimmed);\n const memberId = clean.split(/\\s/)[0];\n if (memberId && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(memberId)) {\n currentGroup.members.push(memberId);\n if (!nodeIds.has(memberId)) {\n nodeIds.add(memberId);\n nodes.push({\n id: memberId,\n label: props.label,\n group: currentGroup.id,\n role: props.role as NodeRole | undefined,\n size: props.size as \"small\" | \"medium\" | \"large\" | undefined,\n });\n }\n continue;\n }\n }\n\n if (indent < 4) {\n currentGroup = null;\n }\n\n // Try edge parsing\n const edgeResult = findEdgeOp(trimmed);\n if (edgeResult) {\n const { leftId, rightId, op, rest } = edgeResult;\n const edgeProps = extractProps(rest).props;\n\n // Auto-register nodes\n for (const id of [leftId, rightId]) {\n if (!nodeIds.has(id)) {\n nodeIds.add(id);\n nodes.push({ id });\n }\n }\n\n const weight = edgeProps.weight ? Number(edgeProps.weight) : op.weight;\n\n edges.push({\n from: leftId,\n to: rightId,\n direction: op.direction,\n valence: op.valence,\n weight,\n label: edgeProps.label,\n });\n continue;\n }\n\n // Node definition: ID [props]\n const { clean, props } = extractProps(trimmed);\n const nodeId = clean.split(/\\s/)[0];\n if (nodeId && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(nodeId) && !nodeIds.has(nodeId)) {\n nodeIds.add(nodeId);\n const node: SociogramNode = {\n id: nodeId,\n label: props.label,\n group: props.group,\n role: props.role as NodeRole | undefined,\n size: props.size as \"small\" | \"medium\" | \"large\" | undefined,\n };\n nodes.push(node);\n\n // Auto-add to group by group property\n if (props.group) {\n let grp = groups.find((g) => g.id === props.group);\n if (!grp) {\n grp = { id: props.group, members: [] };\n groups.push(grp);\n }\n grp.members.push(nodeId);\n }\n }\n }\n\n return {\n type: \"sociogram\",\n title: titleStr,\n config,\n nodes,\n edges,\n groups,\n };\n}\n","import type {\n SociogramAST,\n SociogramNode,\n SociogramEdge,\n NodeRole,\n} from \"./parser\";\n\nexport interface SociogramLayoutNode {\n node: SociogramNode;\n x: number;\n y: number;\n radius: number;\n computedRole?: NodeRole;\n}\n\nexport interface SociogramLayoutEdge {\n edge: SociogramEdge;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nexport interface SociogramLayoutResult {\n width: number;\n height: number;\n nodes: SociogramLayoutNode[];\n edges: SociogramLayoutEdge[];\n ast: SociogramAST;\n}\n\n// ─── Metrics ────────────────────────────────────────────────\n\nfunction computeInDegree(nodeId: string, edges: SociogramEdge[]): number {\n let count = 0;\n for (const e of edges) {\n if (e.to === nodeId) count++;\n if (e.direction === \"mutual\" && e.from === nodeId) count++;\n if (e.direction === \"undirected\" && e.from === nodeId) count++;\n }\n return count;\n}\n\nfunction computeOutDegree(nodeId: string, edges: SociogramEdge[]): number {\n let count = 0;\n for (const e of edges) {\n if (e.from === nodeId) count++;\n if (e.direction === \"mutual\" && e.to === nodeId) count++;\n if (e.direction === \"undirected\" && e.to === nodeId) count++;\n }\n return count;\n}\n\nfunction autoDetectRole(\n node: SociogramNode,\n inDeg: number,\n outDeg: number,\n meanIn: number,\n sdIn: number,\n rejectionCount: number\n): NodeRole | undefined {\n if (node.role) return node.role;\n if (inDeg === 0 && outDeg === 0) return \"isolate\";\n if (inDeg === 0 && outDeg > 0) return \"neglectee\";\n if (rejectionCount >= 2) return \"rejected\";\n if (sdIn > 0 && inDeg >= meanIn + 1.5 * sdIn) return \"star\";\n return undefined;\n}\n\n// ─── Node Radius ────────────────────────────────────────────\n\nconst BASE_RADIUS = 20;\n\nfunction computeNodeRadius(\n node: SociogramNode,\n inDeg: number,\n sizing: string\n): number {\n if (node.size === \"small\") return 14;\n if (node.size === \"large\") return 30;\n if (sizing === \"in-degree\") {\n return Math.min(40, Math.max(14, 14 + inDeg * 4));\n }\n return BASE_RADIUS;\n}\n\n// ─── Circular Layout ────────────────────────────────────────\n\nfunction layoutCircular(ast: SociogramAST): SociogramLayoutResult {\n const n = ast.nodes.length;\n const radius = Math.max(120, n * 22);\n const canvasSize = radius * 2 + 160;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n // Compute metrics\n const inDegrees = new Map<string, number>();\n const outDegrees = new Map<string, number>();\n const rejections = new Map<string, number>();\n\n for (const node of ast.nodes) {\n inDegrees.set(node.id, computeInDegree(node.id, ast.edges));\n outDegrees.set(node.id, computeOutDegree(node.id, ast.edges));\n rejections.set(node.id, 0);\n }\n\n for (const e of ast.edges) {\n if (e.valence === \"negative\") {\n rejections.set(e.to, (rejections.get(e.to) ?? 0) + 1);\n }\n }\n\n const inVals = Array.from(inDegrees.values());\n const meanIn = inVals.reduce((a, b) => a + b, 0) / (inVals.length || 1);\n const sdIn = Math.sqrt(\n inVals.reduce((sum, v) => sum + (v - meanIn) ** 2, 0) / (inVals.length || 1)\n );\n\n // Sort nodes: group members adjacent, then by id\n const sortedNodes = [...ast.nodes];\n if (ast.groups.length > 0) {\n const groupOrder = new Map<string, number>();\n ast.groups.forEach((g, i) => {\n for (const m of g.members) groupOrder.set(m, i);\n });\n sortedNodes.sort((a, b) => {\n const ga = groupOrder.get(a.id) ?? 999;\n const gb = groupOrder.get(b.id) ?? 999;\n if (ga !== gb) return ga - gb;\n return a.id.localeCompare(b.id);\n });\n }\n\n const angleStep = (2 * Math.PI) / n;\n const startAngle = -Math.PI / 2;\n\n const layoutNodes: SociogramLayoutNode[] = sortedNodes.map((node, i) => {\n const angle = startAngle + i * angleStep;\n const inDeg = inDegrees.get(node.id) ?? 0;\n const outDeg = outDegrees.get(node.id) ?? 0;\n const rej = rejections.get(node.id) ?? 0;\n const nodeRadius = computeNodeRadius(node, inDeg, ast.config.sizing);\n const computedRole = autoDetectRole(node, inDeg, outDeg, meanIn, sdIn, rej);\n\n return {\n node,\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle),\n radius: nodeRadius,\n computedRole,\n };\n });\n\n const layoutEdges = computeEdgePositions(layoutNodes, ast.edges);\n\n return {\n width: canvasSize,\n height: canvasSize,\n nodes: layoutNodes,\n edges: layoutEdges,\n ast,\n };\n}\n\n// ─── Force-Directed Layout ─────────────────────────────────\n\nfunction layoutForceDirected(ast: SociogramAST): SociogramLayoutResult {\n const n = ast.nodes.length;\n const canvasSize = n <= 8 ? 400 : n <= 20 ? 600 : n <= 40 ? 800 : 1000;\n const padding = 60;\n\n // Compute metrics\n const inDegrees = new Map<string, number>();\n const outDegrees = new Map<string, number>();\n const rejections = new Map<string, number>();\n\n for (const node of ast.nodes) {\n inDegrees.set(node.id, computeInDegree(node.id, ast.edges));\n outDegrees.set(node.id, computeOutDegree(node.id, ast.edges));\n rejections.set(node.id, 0);\n }\n\n for (const e of ast.edges) {\n if (e.valence === \"negative\") {\n rejections.set(e.to, (rejections.get(e.to) ?? 0) + 1);\n }\n }\n\n const inVals = Array.from(inDegrees.values());\n const meanIn = inVals.reduce((a, b) => a + b, 0) / (inVals.length || 1);\n const sdIn = Math.sqrt(\n inVals.reduce((sum, v) => sum + (v - meanIn) ** 2, 0) / (inVals.length || 1)\n );\n\n // Initialize positions in a circle\n const initRadius = canvasSize * 0.3;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n const positions: { x: number; y: number }[] = ast.nodes.map((_, i) => {\n const angle = (2 * Math.PI * i) / n - Math.PI / 2;\n return {\n x: cx + initRadius * Math.cos(angle),\n y: cy + initRadius * Math.sin(angle),\n };\n });\n\n // Build adjacency for edges\n const nodeIdx = new Map<string, number>();\n ast.nodes.forEach((node, i) => nodeIdx.set(node.id, i));\n\n // Fruchterman-Reingold\n const area = (canvasSize - 2 * padding) ** 2;\n const k = Math.sqrt(area / Math.max(n, 1));\n const maxIterations = 200;\n let temperature = canvasSize / 8;\n const coolingRate = 0.95;\n const minDist = 60;\n\n for (let iter = 0; iter < maxIterations; iter++) {\n const disp: { dx: number; dy: number }[] = positions.map(() => ({ dx: 0, dy: 0 }));\n\n // Repulsive forces between all pairs\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = positions[i].x - positions[j].x;\n const dy = positions[i].y - positions[j].y;\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1);\n const force = (k * k) / dist;\n const fx = (dx / dist) * force;\n const fy = (dy / dist) * force;\n disp[i].dx += fx;\n disp[i].dy += fy;\n disp[j].dx -= fx;\n disp[j].dy -= fy;\n }\n }\n\n // Attractive forces along edges\n for (const edge of ast.edges) {\n const i = nodeIdx.get(edge.from);\n const j = nodeIdx.get(edge.to);\n if (i === undefined || j === undefined) continue;\n const dx = positions[i].x - positions[j].x;\n const dy = positions[i].y - positions[j].y;\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1);\n const force = (dist * dist) / k;\n const fx = (dx / dist) * force;\n const fy = (dy / dist) * force;\n disp[i].dx -= fx;\n disp[i].dy -= fy;\n disp[j].dx += fx;\n disp[j].dy += fy;\n }\n\n // Apply displacements, clamp to temperature\n for (let i = 0; i < n; i++) {\n const mag = Math.sqrt(disp[i].dx ** 2 + disp[i].dy ** 2);\n if (mag > 0) {\n const scale = Math.min(mag, temperature) / mag;\n positions[i].x += disp[i].dx * scale;\n positions[i].y += disp[i].dy * scale;\n }\n // Keep within bounds\n positions[i].x = Math.max(padding, Math.min(canvasSize - padding, positions[i].x));\n positions[i].y = Math.max(padding, Math.min(canvasSize - padding, positions[i].y));\n }\n\n // Enforce minimum distance\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = positions[i].x - positions[j].x;\n const dy = positions[i].y - positions[j].y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < minDist && dist > 0) {\n const push = (minDist - dist) / 2;\n const nx = dx / dist;\n const ny = dy / dist;\n positions[i].x += nx * push;\n positions[i].y += ny * push;\n positions[j].x -= nx * push;\n positions[j].y -= ny * push;\n }\n }\n }\n\n temperature *= coolingRate;\n }\n\n const layoutNodes: SociogramLayoutNode[] = ast.nodes.map((node, i) => {\n const inDeg = inDegrees.get(node.id) ?? 0;\n const outDeg = outDegrees.get(node.id) ?? 0;\n const rej = rejections.get(node.id) ?? 0;\n const nodeRadius = computeNodeRadius(node, inDeg, ast.config.sizing);\n const computedRole = autoDetectRole(node, inDeg, outDeg, meanIn, sdIn, rej);\n return {\n node,\n x: positions[i].x,\n y: positions[i].y,\n radius: nodeRadius,\n computedRole,\n };\n });\n\n const layoutEdges = computeEdgePositions(layoutNodes, ast.edges);\n\n return {\n width: canvasSize,\n height: canvasSize,\n nodes: layoutNodes,\n edges: layoutEdges,\n ast,\n };\n}\n\n// ─── Edge Position Calculation ──────────────────────────────\n\nfunction computeEdgePositions(\n nodes: SociogramLayoutNode[],\n edges: SociogramEdge[]\n): SociogramLayoutEdge[] {\n const nodeMap = new Map<string, SociogramLayoutNode>();\n for (const n of nodes) nodeMap.set(n.node.id, n);\n\n return edges.map((edge) => {\n const fromNode = nodeMap.get(edge.from);\n const toNode = nodeMap.get(edge.to);\n if (!fromNode || !toNode) {\n return { edge, x1: 0, y1: 0, x2: 0, y2: 0 };\n }\n\n // Compute edge-to-edge (subtract radius from endpoints)\n const dx = toNode.x - fromNode.x;\n const dy = toNode.y - fromNode.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist === 0) return { edge, x1: fromNode.x, y1: fromNode.y, x2: toNode.x, y2: toNode.y };\n\n const nx = dx / dist;\n const ny = dy / dist;\n const markerGap = 10;\n\n return {\n edge,\n x1: fromNode.x + nx * (fromNode.radius + 2),\n y1: fromNode.y + ny * (fromNode.radius + 2),\n x2: toNode.x - nx * (toNode.radius + markerGap),\n y2: toNode.y - ny * (toNode.radius + markerGap),\n };\n });\n}\n\n// ─── Main Layout ────────────────────────────────────────────\n\nexport function layoutSociogram(ast: SociogramAST): SociogramLayoutResult {\n switch (ast.config.layout) {\n case \"force-directed\":\n return layoutForceDirected(ast);\n case \"circular\":\n default:\n return layoutCircular(ast);\n }\n}\n","import type { SociogramAST, NodeRole } from \"./parser\";\nimport type { SociogramLayoutResult, SociogramLayoutNode } from \"./layout\";\nimport {\n svgRoot,\n el,\n group,\n circle,\n line,\n text,\n title,\n desc,\n polygon,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBaseTheme, FONT_SIZE, STROKE_WIDTH, type BaseTheme } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst LABEL_GAP = 4;\nconst LABEL_FONT_SIZE = 11;\n\nfunction valenceColors(t: BaseTheme) {\n return { positive: t.positive, negative: t.negative, neutral: t.neutral };\n}\n\nfunction roleFills(t: BaseTheme) {\n return { star: t.warn, isolate: t.fillMuted, rejected: t.negative };\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: SociogramAST, t: BaseTheme): string {\n const vc = valenceColors(t);\n const rf = roleFills(t);\n const groupColors = ast.groups.map((g, i) => {\n const color = g.color ?? t.palette[i % t.palette.length];\n return `.schematex-sociogram-group-${g.id} { fill: ${color}; stroke: ${color}; }`;\n });\n\n return `\n.schematex-sociogram {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n background: ${t.bg};\n}\n.schematex-sociogram-node { fill: ${t.accent}; stroke: ${t.accent}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-sociogram-node-star { fill: ${rf.star}; stroke: ${t.warn}; stroke-width: ${STROKE_WIDTH.thick}; }\n.schematex-sociogram-node-isolate { fill: ${rf.isolate}; stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4 3; }\n.schematex-sociogram-node-neglectee { fill: ${t.fillMuted}; stroke: ${t.accent}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4 3; }\n.schematex-sociogram-node-rejected { fill: ${rf.rejected}; stroke: ${t.negative}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4 3; }\n.schematex-sociogram-edge { stroke-linecap: round; }\n.schematex-sociogram-edge-positive { stroke: ${vc.positive}; }\n.schematex-sociogram-edge-negative { stroke: ${vc.negative}; stroke-dasharray: 6 3; }\n.schematex-sociogram-edge-neutral { stroke: ${vc.neutral}; stroke-dasharray: 2 3; }\n.schematex-sociogram-label { font-size: ${LABEL_FONT_SIZE}px; fill: ${t.text}; text-anchor: middle; }\n.schematex-sociogram-edge-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; }\n.schematex-sociogram-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-sociogram-star-badge { font-size: 10px; fill: ${t.warn}; }\n.schematex-sociogram-group-label { font-size: 13px; font-weight: bold; fill-opacity: 0.7; text-anchor: middle; }\n${groupColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Defs (Arrow Markers) ───────────────────────────────────\n\nfunction buildDefs(t: BaseTheme): string {\n const vc = valenceColors(t);\n const markers = [\n { id: \"sociogram-arrow\", fill: vc.positive },\n { id: \"sociogram-arrow-negative\", fill: vc.negative },\n { id: \"sociogram-arrow-neutral\", fill: vc.neutral },\n ];\n\n const markerEls = markers.map((m) =>\n el(\n \"marker\",\n {\n id: m.id,\n viewBox: \"0 0 10 10\",\n refX: \"9\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto\",\n },\n el(\"path\", { d: \"M 0 0 L 10 5 L 0 10 z\", fill: m.fill })\n )\n );\n\n return el(\"defs\", {}, markerEls);\n}\n\n// ─── Edge Weight → Stroke Width ─────────────────────────────\n\nfunction edgeStrokeWidth(weight: number): number {\n if (weight <= 1) return 1;\n if (weight === 2) return 2;\n if (weight === 3) return 3.5;\n return 5;\n}\n\n// ─── Node Rendering ─────────────────────────────────────────\n\nfunction getNodeClass(role?: NodeRole): string {\n if (!role) return \"schematex-sociogram-node\";\n switch (role) {\n case \"star\": return \"schematex-sociogram-node schematex-sociogram-node-star\";\n case \"isolate\": return \"schematex-sociogram-node schematex-sociogram-node-isolate\";\n case \"neglectee\": return \"schematex-sociogram-node schematex-sociogram-node-neglectee\";\n case \"rejected\": return \"schematex-sociogram-node schematex-sociogram-node-rejected\";\n case \"bridge\": return \"schematex-sociogram-node\";\n default: return \"schematex-sociogram-node\";\n }\n}\n\nfunction getNodeFill(\n node: SociogramLayoutNode,\n ast: SociogramAST,\n t: BaseTheme\n): string | undefined {\n const role = node.computedRole ?? node.node.role;\n const rf = roleFills(t);\n\n if (ast.config.coloring === \"role\" && role) {\n return rf[role as keyof typeof rf];\n }\n\n if (ast.config.coloring === \"group\" && node.node.group) {\n const gIdx = ast.groups.findIndex((g) => g.id === node.node.group);\n if (gIdx >= 0) {\n return ast.groups[gIdx].color ?? t.palette[gIdx % t.palette.length];\n }\n }\n\n return undefined;\n}\n\nfunction renderNodes(\n layout: SociogramLayoutResult,\n t: BaseTheme\n): { nodeEls: string[]; labelEls: string[] } {\n const nodeEls: string[] = [];\n const labelEls: string[] = [];\n const { ast } = layout;\n\n for (const layoutNode of layout.nodes) {\n const { node, x, y, radius, computedRole } = layoutNode;\n const role = computedRole ?? node.role;\n const cls = getNodeClass(role);\n const fill = getNodeFill(layoutNode, ast, t);\n\n const attrs: Record<string, string | number | undefined> = {\n cx: x,\n cy: y,\n r: radius,\n class: cls,\n \"data-node-id\": node.id,\n };\n if (fill) attrs.fill = fill;\n\n nodeEls.push(circle(attrs));\n\n // Star badge\n if (role === \"star\") {\n const badgeX = x + radius * 0.6;\n const badgeY = y - radius * 0.6;\n const s = 6;\n const points = starPoints(badgeX, badgeY, s, s * 0.4, 5);\n nodeEls.push(\n polygon({\n points,\n fill: t.warn,\n class: \"schematex-sociogram-star-badge\",\n })\n );\n }\n\n // Label\n const label = node.label ?? node.id;\n labelEls.push(\n text(\n {\n x,\n y: y + radius + LABEL_GAP + LABEL_FONT_SIZE,\n class: \"schematex-sociogram-label\",\n \"data-node-id\": node.id,\n },\n label\n )\n );\n }\n\n return { nodeEls, labelEls };\n}\n\nfunction starPoints(\n cx: number,\n cy: number,\n outerR: number,\n innerR: number,\n points: number\n): string {\n const coords: string[] = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const r = i % 2 === 0 ? outerR : innerR;\n coords.push(`${cx + r * Math.cos(angle)},${cy + r * Math.sin(angle)}`);\n }\n return coords.join(\" \");\n}\n\n// ─── Edge Rendering ─────────────────────────────────────────\n\nfunction getMarkerUrl(valence: string, direction: string): {\n start?: string;\n end?: string;\n} {\n if (direction === \"undirected\") return {};\n\n const markerId =\n valence === \"negative\"\n ? \"sociogram-arrow-negative\"\n : valence === \"neutral\"\n ? \"sociogram-arrow-neutral\"\n : \"sociogram-arrow\";\n\n if (direction === \"mutual\") {\n return {\n start: `url(#${markerId})`,\n end: `url(#${markerId})`,\n };\n }\n\n return { end: `url(#${markerId})` };\n}\n\nfunction renderEdges(layout: SociogramLayoutResult): {\n edgeEls: string[];\n edgeLabelEls: string[];\n} {\n const edgeEls: string[] = [];\n const edgeLabelEls: string[] = [];\n\n for (const layoutEdge of layout.edges) {\n const { edge, x1, y1, x2, y2 } = layoutEdge;\n const valenceClass = `schematex-sociogram-edge-${edge.valence}`;\n const markers = getMarkerUrl(edge.valence, edge.direction);\n const sw = edgeStrokeWidth(edge.weight);\n\n const attrs: Record<string, string | number | undefined> = {\n x1,\n y1,\n x2,\n y2,\n class: `schematex-sociogram-edge ${valenceClass}`,\n \"stroke-width\": sw,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n };\n\n if (markers.end) attrs[\"marker-end\"] = markers.end;\n if (markers.start) attrs[\"marker-start\"] = markers.start;\n\n edgeEls.push(line(attrs));\n\n // Edge label\n if (edge.label) {\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n edgeLabelEls.push(\n text(\n { x: mx, y: my - 6, class: \"schematex-sociogram-edge-label\" },\n edge.label\n )\n );\n }\n }\n\n return { edgeEls, edgeLabelEls };\n}\n\n// ─── Group Background Labels ────────────────────────────────\n\nfunction renderGroupLabels(layout: SociogramLayoutResult, t: BaseTheme): string[] {\n const elements: string[] = [];\n const { ast } = layout;\n\n for (let gi = 0; gi < ast.groups.length; gi++) {\n const grp = ast.groups[gi];\n const memberNodes = layout.nodes.filter(\n (n) => n.node.group === grp.id\n );\n if (memberNodes.length === 0) continue;\n\n const color = grp.color ?? t.palette[gi % t.palette.length];\n const cx = memberNodes.reduce((s, n) => s + n.x, 0) / memberNodes.length;\n const minY = Math.min(...memberNodes.map((n) => n.y - n.radius));\n\n elements.push(\n text(\n {\n x: cx,\n y: minY - 14,\n class: \"schematex-sociogram-group-label\",\n fill: color,\n },\n grp.label ?? grp.id\n )\n );\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderSociogram(\n layout: SociogramLayoutResult,\n options: { theme?: string } = {}\n): string {\n const { ast } = layout;\n const t = resolveBaseTheme(options.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n const defsStr = buildDefs(t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalWidth = layout.width;\n const totalHeight = layout.height + titleOffset;\n\n const { edgeEls, edgeLabelEls } = renderEdges(layout);\n const { nodeEls, labelEls } = renderNodes(layout, t);\n const groupLabelEls = renderGroupLabels(layout, t);\n\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-sociogram-title\" },\n ast.title\n )\n : \"\";\n\n const transformY = titleOffset;\n const transform = transformY ? `translate(0,${transformY})` : undefined;\n\n const svgContent: string[] = [\n title(`Sociogram${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(\n `Sociogram with ${ast.nodes.length} members and ${ast.edges.length} connections`\n ),\n el(\"style\", {}, css),\n defsStr,\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n if (groupLabelEls.length > 0) {\n svgContent.push(\n group({ class: \"schematex-sociogram-groups\", transform }, groupLabelEls)\n );\n }\n\n svgContent.push(\n group({ class: \"schematex-sociogram-edges\", transform }, [\n ...edgeEls,\n ...edgeLabelEls,\n ])\n );\n\n svgContent.push(\n group({ class: \"schematex-sociogram-nodes\", transform }, nodeEls)\n );\n\n svgContent.push(\n group({ class: \"schematex-sociogram-labels\", transform }, labelEls)\n );\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-sociogram\",\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 { parseSociogram } from \"./parser\";\nimport { layoutSociogram } from \"./layout\";\nimport { renderSociogram } from \"./renderer\";\n\nexport const sociogram: DiagramPlugin = {\n type: \"sociogram\",\n\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"sociogram\");\n },\n\n render(text: string, config): string {\n const ast = parseSociogram(text);\n const layout = layoutSociogram(ast);\n return renderSociogram(layout, { theme: config?.theme });\n },\n};\n\nexport { parseSociogram } from \"./parser\";\nexport { layoutSociogram } from \"./layout\";\nexport { renderSociogram } from \"./renderer\";\n"]}