schematex 0.5.2 → 0.6.1

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 (182) hide show
  1. package/README.md +75 -1
  2. package/dist/ai/ai-sdk.cjs +23 -23
  3. package/dist/ai/ai-sdk.d.cts +4 -4
  4. package/dist/ai/ai-sdk.d.ts +4 -4
  5. package/dist/ai/ai-sdk.js +18 -18
  6. package/dist/ai/index.cjs +35 -27
  7. package/dist/ai/index.d.cts +4 -4
  8. package/dist/ai/index.d.ts +4 -4
  9. package/dist/ai/index.js +18 -18
  10. package/dist/{api-Cr_MxttI.d.ts → api-BEJTXyBA.d.cts} +3 -40
  11. package/dist/{api-C5SECOxZ.d.cts → api-DFrSR3lw.d.ts} +3 -40
  12. package/dist/browser.cjs +24 -24
  13. package/dist/browser.d.cts +3 -3
  14. package/dist/browser.d.ts +3 -3
  15. package/dist/browser.js +18 -18
  16. package/dist/{chunk-N7W5KZK7.cjs → chunk-2L4YXZAZ.cjs} +4 -4
  17. package/dist/{chunk-N7W5KZK7.cjs.map → chunk-2L4YXZAZ.cjs.map} +1 -1
  18. package/dist/{chunk-ZYRCPSBU.js → chunk-3IE7KZY4.js} +4 -4
  19. package/dist/{chunk-ZYRCPSBU.js.map → chunk-3IE7KZY4.js.map} +1 -1
  20. package/dist/{chunk-ZX74KJPM.js → chunk-3VB5AT4R.js} +3 -3
  21. package/dist/{chunk-ZX74KJPM.js.map → chunk-3VB5AT4R.js.map} +1 -1
  22. package/dist/{chunk-S2KJRHDZ.cjs → chunk-4UFR2LB6.cjs} +13 -13
  23. package/dist/{chunk-S2KJRHDZ.cjs.map → chunk-4UFR2LB6.cjs.map} +1 -1
  24. package/dist/{chunk-4QPDZJAL.cjs → chunk-4XR7X7XW.cjs} +11569 -9045
  25. package/dist/chunk-4XR7X7XW.cjs.map +1 -0
  26. package/dist/{chunk-6OSUNBZY.js → chunk-522WB2EH.js} +135 -7
  27. package/dist/chunk-522WB2EH.js.map +1 -0
  28. package/dist/{chunk-QTNPMIO2.cjs → chunk-6JI6FWLZ.cjs} +341 -35
  29. package/dist/chunk-6JI6FWLZ.cjs.map +1 -0
  30. package/dist/{chunk-UFTYX73U.js → chunk-7F76AWOI.js} +339 -35
  31. package/dist/chunk-7F76AWOI.js.map +1 -0
  32. package/dist/{chunk-BW4KGTV7.cjs → chunk-C5C5EF3W.cjs} +4 -4
  33. package/dist/{chunk-BW4KGTV7.cjs.map → chunk-C5C5EF3W.cjs.map} +1 -1
  34. package/dist/{chunk-VJGMEGMR.js → chunk-DOK7LKLO.js} +125 -13
  35. package/dist/chunk-DOK7LKLO.js.map +1 -0
  36. package/dist/{chunk-L3CTXXVZ.js → chunk-FBS3PACU.js} +3 -3
  37. package/dist/{chunk-L3CTXXVZ.js.map → chunk-FBS3PACU.js.map} +1 -1
  38. package/dist/{chunk-QUKVGHN4.cjs → chunk-FKJBXGWP.cjs} +4 -4
  39. package/dist/{chunk-QUKVGHN4.cjs.map → chunk-FKJBXGWP.cjs.map} +1 -1
  40. package/dist/{chunk-SZK376QB.js → chunk-H4MT5TJP.js} +3 -3
  41. package/dist/{chunk-SZK376QB.js.map → chunk-H4MT5TJP.js.map} +1 -1
  42. package/dist/{chunk-3M6T7KB4.js → chunk-HAZALB7U.js} +3 -3
  43. package/dist/{chunk-3M6T7KB4.js.map → chunk-HAZALB7U.js.map} +1 -1
  44. package/dist/{chunk-VFZOPRQP.cjs → chunk-HWVBHU3O.cjs} +5 -5
  45. package/dist/{chunk-VFZOPRQP.cjs.map → chunk-HWVBHU3O.cjs.map} +1 -1
  46. package/dist/{chunk-OK5ZS3LU.js → chunk-I2GQYOZ5.js} +11586 -9069
  47. package/dist/chunk-I2GQYOZ5.js.map +1 -0
  48. package/dist/{chunk-D7EHZFK4.cjs → chunk-L7POWM5B.cjs} +138 -2
  49. package/dist/chunk-L7POWM5B.cjs.map +1 -0
  50. package/dist/{chunk-2VNMKOUO.js → chunk-LRI4RH2N.js} +135 -3
  51. package/dist/chunk-LRI4RH2N.js.map +1 -0
  52. package/dist/{chunk-EPKIJEH7.js → chunk-MFAMNFPA.js} +63 -6
  53. package/dist/chunk-MFAMNFPA.js.map +1 -0
  54. package/dist/{chunk-VDSYMSUY.js → chunk-MVIEIKOI.js} +3 -3
  55. package/dist/{chunk-VDSYMSUY.js.map → chunk-MVIEIKOI.js.map} +1 -1
  56. package/dist/{chunk-ZL5RB4UV.js → chunk-N5B242WY.js} +3 -3
  57. package/dist/{chunk-ZL5RB4UV.js.map → chunk-N5B242WY.js.map} +1 -1
  58. package/dist/{chunk-VKPCR7BG.js → chunk-OTSVMKII.js} +883 -12
  59. package/dist/chunk-OTSVMKII.js.map +1 -0
  60. package/dist/{chunk-YLEVMOK2.cjs → chunk-R66QG3XT.cjs} +5 -4
  61. package/dist/{chunk-YLEVMOK2.cjs.map → chunk-R66QG3XT.cjs.map} +1 -1
  62. package/dist/{chunk-3M6WB62Y.cjs → chunk-R6VX5YTJ.cjs} +139 -7
  63. package/dist/chunk-R6VX5YTJ.cjs.map +1 -0
  64. package/dist/{chunk-I55HO32M.js → chunk-RJMCWT7Z.js} +3 -3
  65. package/dist/{chunk-I55HO32M.js.map → chunk-RJMCWT7Z.js.map} +1 -1
  66. package/dist/{chunk-TZTCIAYW.cjs → chunk-S3RMAXH5.cjs} +137 -25
  67. package/dist/chunk-S3RMAXH5.cjs.map +1 -0
  68. package/dist/{chunk-HK56GQQP.cjs → chunk-SSLNPHCL.cjs} +886 -13
  69. package/dist/chunk-SSLNPHCL.cjs.map +1 -0
  70. package/dist/{chunk-IBRW3UOA.js → chunk-TWLKXV2O.js} +3 -3
  71. package/dist/{chunk-IBRW3UOA.js.map → chunk-TWLKXV2O.js.map} +1 -1
  72. package/dist/{chunk-VCH7RI5H.js → chunk-UWA5MWCI.js} +4 -4
  73. package/dist/chunk-UWA5MWCI.js.map +1 -0
  74. package/dist/{chunk-RYVV5UVI.cjs → chunk-V4GILQR6.cjs} +4 -4
  75. package/dist/{chunk-RYVV5UVI.cjs.map → chunk-V4GILQR6.cjs.map} +1 -1
  76. package/dist/{chunk-QMTWG6JL.cjs → chunk-V4RO5KYY.cjs} +6 -4
  77. package/dist/chunk-V4RO5KYY.cjs.map +1 -0
  78. package/dist/{chunk-VZ5LDNHK.cjs → chunk-VTSH4YPT.cjs} +12 -12
  79. package/dist/{chunk-VZ5LDNHK.cjs.map → chunk-VTSH4YPT.cjs.map} +1 -1
  80. package/dist/{chunk-UUBNQV2T.cjs → chunk-WQDIZH2Z.cjs} +12 -12
  81. package/dist/{chunk-UUBNQV2T.cjs.map → chunk-WQDIZH2Z.cjs.map} +1 -1
  82. package/dist/{chunk-SUIDD2C5.cjs → chunk-XNCOSVNG.cjs} +63 -6
  83. package/dist/chunk-XNCOSVNG.cjs.map +1 -0
  84. package/dist/{chunk-EGSUMHCS.cjs → chunk-YB4XJY5L.cjs} +12 -12
  85. package/dist/{chunk-EGSUMHCS.cjs.map → chunk-YB4XJY5L.cjs.map} +1 -1
  86. package/dist/{chunk-JHDR56XO.js → chunk-YS6CGUNH.js} +3 -3
  87. package/dist/{chunk-JHDR56XO.js.map → chunk-YS6CGUNH.js.map} +1 -1
  88. package/dist/{types-WTr9W5Ud.d.ts → diagnostics-B-ffSEhl.d.cts} +82 -2
  89. package/dist/{types-WTr9W5Ud.d.cts → diagnostics-B-ffSEhl.d.ts} +82 -2
  90. package/dist/diagrams/blockdiagram/index.cjs +5 -5
  91. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  92. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  93. package/dist/diagrams/blockdiagram/index.js +1 -1
  94. package/dist/diagrams/circuit/index.cjs +8 -8
  95. package/dist/diagrams/circuit/index.d.cts +1 -1
  96. package/dist/diagrams/circuit/index.d.ts +1 -1
  97. package/dist/diagrams/circuit/index.js +2 -2
  98. package/dist/diagrams/ecomap/index.cjs +7 -7
  99. package/dist/diagrams/ecomap/index.d.cts +1 -1
  100. package/dist/diagrams/ecomap/index.d.ts +1 -1
  101. package/dist/diagrams/ecomap/index.js +2 -2
  102. package/dist/diagrams/entity/index.cjs +6 -6
  103. package/dist/diagrams/entity/index.d.cts +1 -1
  104. package/dist/diagrams/entity/index.d.ts +1 -1
  105. package/dist/diagrams/entity/index.js +2 -2
  106. package/dist/diagrams/fishbone/index.cjs +8 -8
  107. package/dist/diagrams/fishbone/index.d.cts +1 -1
  108. package/dist/diagrams/fishbone/index.d.ts +1 -1
  109. package/dist/diagrams/fishbone/index.js +2 -2
  110. package/dist/diagrams/flowchart/index.cjs +8 -8
  111. package/dist/diagrams/flowchart/index.d.cts +2 -2
  112. package/dist/diagrams/flowchart/index.d.ts +2 -2
  113. package/dist/diagrams/flowchart/index.js +2 -2
  114. package/dist/diagrams/genogram/index.cjs +9 -9
  115. package/dist/diagrams/genogram/index.d.cts +1 -1
  116. package/dist/diagrams/genogram/index.d.ts +1 -1
  117. package/dist/diagrams/genogram/index.js +2 -2
  118. package/dist/diagrams/ladder/index.cjs +6 -6
  119. package/dist/diagrams/ladder/index.d.cts +1 -1
  120. package/dist/diagrams/ladder/index.d.ts +1 -1
  121. package/dist/diagrams/ladder/index.js +2 -2
  122. package/dist/diagrams/logic/index.cjs +6 -6
  123. package/dist/diagrams/logic/index.d.cts +1 -1
  124. package/dist/diagrams/logic/index.d.ts +1 -1
  125. package/dist/diagrams/logic/index.js +2 -2
  126. package/dist/diagrams/orgchart/index.cjs +7 -7
  127. package/dist/diagrams/orgchart/index.d.cts +1 -1
  128. package/dist/diagrams/orgchart/index.d.ts +1 -1
  129. package/dist/diagrams/orgchart/index.js +2 -2
  130. package/dist/diagrams/pedigree/index.cjs +7 -7
  131. package/dist/diagrams/pedigree/index.d.cts +1 -1
  132. package/dist/diagrams/pedigree/index.d.ts +1 -1
  133. package/dist/diagrams/pedigree/index.js +2 -2
  134. package/dist/diagrams/phylo/index.cjs +7 -7
  135. package/dist/diagrams/phylo/index.d.cts +1 -1
  136. package/dist/diagrams/phylo/index.d.ts +1 -1
  137. package/dist/diagrams/phylo/index.js +2 -2
  138. package/dist/diagrams/sld/index.cjs +14 -6
  139. package/dist/diagrams/sld/index.d.cts +14 -2
  140. package/dist/diagrams/sld/index.d.ts +14 -2
  141. package/dist/diagrams/sld/index.js +2 -2
  142. package/dist/diagrams/sociogram/index.cjs +6 -6
  143. package/dist/diagrams/sociogram/index.d.cts +1 -1
  144. package/dist/diagrams/sociogram/index.d.ts +1 -1
  145. package/dist/diagrams/sociogram/index.js +2 -2
  146. package/dist/diagrams/timing/index.d.cts +1 -1
  147. package/dist/diagrams/timing/index.d.ts +1 -1
  148. package/dist/diagrams/venn/index.cjs +9 -9
  149. package/dist/diagrams/venn/index.d.cts +1 -1
  150. package/dist/diagrams/venn/index.d.ts +1 -1
  151. package/dist/diagrams/venn/index.js +2 -2
  152. package/dist/{index-BD2yDfQM.d.cts → index-DPWdYfNx.d.ts} +60 -2
  153. package/dist/{index-C30zQWZI.d.ts → index-S0njakQ2.d.cts} +60 -2
  154. package/dist/index.cjs +344 -56
  155. package/dist/index.cjs.map +1 -1
  156. package/dist/index.d.cts +38 -4
  157. package/dist/index.d.ts +38 -4
  158. package/dist/index.js +284 -17
  159. package/dist/index.js.map +1 -1
  160. package/dist/react.cjs +18 -18
  161. package/dist/react.d.cts +2 -2
  162. package/dist/react.d.ts +2 -2
  163. package/dist/react.js +17 -17
  164. package/dist/{tools-DlpuE76u.d.cts → tools-CeGGMCs7.d.cts} +12 -4
  165. package/dist/{tools-BHWaJPOl.d.ts → tools-kK_enDwb.d.ts} +12 -4
  166. package/package.json +1 -1
  167. package/dist/chunk-2VNMKOUO.js.map +0 -1
  168. package/dist/chunk-3M6WB62Y.cjs.map +0 -1
  169. package/dist/chunk-4QPDZJAL.cjs.map +0 -1
  170. package/dist/chunk-6OSUNBZY.js.map +0 -1
  171. package/dist/chunk-D7EHZFK4.cjs.map +0 -1
  172. package/dist/chunk-EPKIJEH7.js.map +0 -1
  173. package/dist/chunk-HK56GQQP.cjs.map +0 -1
  174. package/dist/chunk-OK5ZS3LU.js.map +0 -1
  175. package/dist/chunk-QMTWG6JL.cjs.map +0 -1
  176. package/dist/chunk-QTNPMIO2.cjs.map +0 -1
  177. package/dist/chunk-SUIDD2C5.cjs.map +0 -1
  178. package/dist/chunk-TZTCIAYW.cjs.map +0 -1
  179. package/dist/chunk-UFTYX73U.js.map +0 -1
  180. package/dist/chunk-VCH7RI5H.js.map +0 -1
  181. package/dist/chunk-VJGMEGMR.js.map +0 -1
  182. package/dist/chunk-VKPCR7BG.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/diagrams/sld/parser.ts","../src/diagrams/sld/symbols.ts","../src/diagrams/sld/layout.ts","../src/diagrams/sld/renderer.ts","../src/diagrams/sld/index.ts"],"names":["line","text","title","maxX","lines"],"mappings":"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","file":"chunk-6OSUNBZY.js","sourcesContent":["import type {\n SLDAST,\n SLDNode,\n SLDNodeType,\n SLDConnection,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\nimport { didYouMean } from \"../../core/dsl-suggest\";\n\nexport class SLDParseError extends Error {\n public line?: number;\n public source?: string;\n constructor(message: string, line?: number, source?: string) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"SLDParseError\";\n this.line = line;\n this.source = source;\n }\n}\n\nconst NODE_TYPES = new Set<SLDNodeType>([\n \"utility\", \"generator\", \"solar\", \"wind\", \"ups\",\n \"transformer\", \"transformer_dy\", \"transformer_yd\", \"transformer_yy\",\n \"transformer_dd\", \"autotransformer\", \"transformer_3winding\",\n \"bus\", \"bus_tie\", \"hub\",\n \"breaker\", \"breaker_vacuum\", \"switch\", \"switch_load\", \"ground_switch\",\n \"ats\", \"recloser\", \"sectionalizer\", \"fuse\", \"fuse_cl\",\n \"ct\", \"pt\", \"relay\", \"surge_arrester\", \"ground_fault\",\n \"motor\", \"load\", \"capacitor_bank\", \"harmonic_filter\", \"vfd\",\n \"watthour_meter\", \"demand_meter\",\n]);\n\n// IEC 60364 / BS 7671 / REBT residential vocabulary. These map onto existing\n// IEEE-315 visual primitives until issue 02 Fix C ships a typed `rcd` node\n// and per-curve breaker glyph. The mapping is conservative: every alias\n// renders as a recognisable breaker/RCD variant, no information loss beyond\n// the label-string fidelity LLMs already rely on.\nconst TYPE_ALIASES: Record<string, SLDNodeType> = {\n mcb: \"breaker\",\n mccb: \"breaker\",\n miniature_circuit_breaker: \"breaker\",\n rcd: \"ground_fault\",\n rcbo: \"ground_fault\",\n rccb: \"ground_fault\",\n differential: \"ground_fault\",\n diferencial: \"ground_fault\",\n pia: \"breaker\",\n iga: \"breaker\",\n main_switch: \"switch_load\",\n isolator: \"switch_load\",\n disconnector: \"switch_load\",\n consumer_unit: \"bus\",\n distribution_board: \"bus\",\n panel: \"bus\",\n panelboard: \"bus\",\n};\n\nfunction stripComment(s: string): string {\n // Strip `#`, `//`, or Mermaid `%%` comments. Quoted regions are respected\n // so `\"#fff\"` (a CSS color) and `\"https://…\"` survive.\n let out = \"\";\n let inQuote = false;\n for (let i = 0; i < s.length; i++) {\n const ch = s[i]!;\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"#\") break;\n if (ch === \"/\" && s[i + 1] === \"/\") break;\n if (ch === \"%\" && s[i + 1] === \"%\") break;\n }\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) {\n return t.slice(1, -1);\n }\n return t;\n}\n\nfunction splitAttrs(inside: string): Array<[string, string]> {\n // split by commas (respecting quotes) → \"key: value\" pairs\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n const out: Array<[string, string]> = [];\n for (const p of parts) {\n const s = p.trim();\n if (!s) continue;\n const colon = s.indexOf(\":\");\n if (colon < 0) {\n throw new SLDParseError(`Invalid attribute \"${s}\" (missing \":\")`);\n }\n const k = s.slice(0, colon).trim();\n const v = stripQuotes(s.slice(colon + 1));\n out.push([k, v]);\n }\n return out;\n}\n\nfunction applyAttrs(node: SLDNode, attrs: Array<[string, string]>): void {\n for (const [k, v] of attrs) {\n const key = k.toLowerCase();\n if (key === \"label\") node.label = v;\n else if (key === \"voltage\") node.voltage = v;\n else if (key === \"rating\") node.rating = v;\n else if (key === \"device\") node.deviceNumber = v;\n else {\n // stash everything else as nameplate\n if (!node.nameplate) node.nameplate = {};\n node.nameplate[k] = v;\n }\n }\n}\n\n/** Join lines so that a bracketed attribute block spans a single logical line. */\nfunction joinBrackets(lines: string[]): string[] {\n const out: string[] = [];\n let buf = \"\";\n let depth = 0;\n for (const raw of lines) {\n const line = stripComment(raw);\n if (!line.trim() && depth === 0) {\n if (buf) {\n out.push(buf);\n buf = \"\";\n }\n out.push(\"\");\n continue;\n }\n for (const ch of line) {\n if (ch === \"[\") depth++;\n else if (ch === \"]\") depth = Math.max(0, depth - 1);\n }\n buf = buf ? buf + \" \" + line.trim() : line;\n if (depth === 0) {\n out.push(buf);\n buf = \"\";\n }\n }\n if (buf) out.push(buf);\n return out;\n}\n\nexport function parseSLDDSL(text: string): SLDAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const lines = joinBrackets(rawLines);\n\n let title: string | undefined;\n const nodes: SLDNode[] = [];\n const nodeMap = new Map<string, SLDNode>();\n const connections: SLDConnection[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const raw = lines[i];\n const line = raw.trim();\n if (!line) continue;\n\n // Header: sld \"title\"\n if (/^sld\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // Connection: A -> B [cable: \"...\", label: \"...\"]\n const connMatch = line.match(\n /^([A-Za-z][A-Za-z0-9_-]*)\\s*->\\s*([A-Za-z][A-Za-z0-9_-]*)(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (connMatch) {\n const from = connMatch[1];\n const to = connMatch[2];\n const c: SLDConnection = { from, to };\n if (connMatch[3]) {\n for (const [k, v] of splitAttrs(connMatch[3])) {\n const key = k.toLowerCase();\n if (key === \"cable\") c.cable = v;\n else if (key === \"label\") c.label = v;\n }\n }\n connections.push(c);\n continue;\n }\n\n // Node definition: ID = type [attrs]\n const nodeMatch = line.match(\n /^([A-Za-z][A-Za-z0-9_-]*)\\s*=\\s*([a-zA-Z_][a-zA-Z0-9_]*)(?:\\s*\\[([^\\]]*)\\])?\\s*$/\n );\n if (nodeMatch) {\n const id = nodeMatch[1];\n const rawType = nodeMatch[2].toLowerCase();\n // Resolve REBT/IEC residential aliases (mcb → breaker, rcbo → ground_fault…)\n // before the canonical-type check.\n const canonical = (TYPE_ALIASES[rawType] ?? rawType) as SLDNodeType;\n if (!NODE_TYPES.has(canonical)) {\n const candidates = [\n ...NODE_TYPES,\n ...Object.keys(TYPE_ALIASES),\n ];\n throw new SLDParseError(\n `Unknown node type \"${nodeMatch[2]}\" for \"${id}\"${didYouMean(rawType, candidates)}`,\n i + 1,\n line\n );\n }\n if (nodeMap.has(id)) {\n throw new SLDParseError(`Duplicate node id \"${id}\"`, i + 1, line);\n }\n const node: SLDNode = { id, nodeType: canonical };\n // If the user wrote an alias (mcb/rcbo/iga…), preserve the original word\n // as the visible label unless an explicit `label:` attribute overrides\n // it below. This keeps \"MCB\" / \"IGA\" markings on the rendered SVG.\n if (TYPE_ALIASES[rawType]) {\n node.label = rawType.toUpperCase();\n }\n if (nodeMatch[3]) {\n applyAttrs(node, splitAttrs(nodeMatch[3]));\n }\n nodes.push(node);\n nodeMap.set(id, node);\n continue;\n }\n\n throw new SLDParseError(`Cannot parse line`, i + 1, line);\n }\n\n // Validate connections\n for (const c of connections) {\n if (!nodeMap.has(c.from)) {\n throw new SLDParseError(`Connection references unknown node \"${c.from}\"`);\n }\n if (!nodeMap.has(c.to)) {\n throw new SLDParseError(`Connection references unknown node \"${c.to}\"`);\n }\n }\n\n if (nodes.length === 0) {\n throw new SLDParseError(\"SLD diagram has no nodes\");\n }\n\n return { type: \"sld\", title, nodes, connections };\n}\n","import type { SLDNodeType } from \"../../core/types\";\nimport { el, group, line, path as pathEl, text as textEl } from \"../../core/svg\";\n\n/**\n * Symbol renderers — each returns SVG markup centered at (0,0)\n * Used by the renderer after applying transform=\"translate(cx,cy)\".\n *\n * Every symbol exposes a conceptual top/bottom terminal on the vertical axis,\n * so the layout only needs to draw vertical wires between them.\n */\n\nexport interface SymbolGeometry {\n /** Bounding half-width for layout */\n halfWidth: number;\n /** Y-offset of the top terminal (negative = above center) */\n topY: number;\n /** Y-offset of the bottom terminal (positive = below center) */\n bottomY: number;\n}\n\nexport const DEFAULT_GEOMETRY: SymbolGeometry = {\n halfWidth: 20,\n topY: -20,\n bottomY: 20,\n};\n\nexport function geometryFor(type: SLDNodeType): SymbolGeometry {\n switch (type) {\n case \"utility\":\n case \"generator\":\n case \"solar\":\n case \"wind\":\n return { halfWidth: 18, topY: -24, bottomY: 18 };\n case \"transformer\":\n case \"transformer_dy\":\n case \"transformer_yd\":\n case \"transformer_yy\":\n case \"transformer_dd\":\n case \"autotransformer\":\n case \"transformer_3winding\":\n return { halfWidth: 22, topY: -24, bottomY: 24 };\n case \"breaker\":\n case \"breaker_vacuum\":\n case \"recloser\":\n case \"switch\":\n case \"switch_load\":\n case \"ground_switch\":\n case \"sectionalizer\":\n return { halfWidth: 18, topY: -18, bottomY: 18 };\n case \"fuse\":\n case \"fuse_cl\":\n return { halfWidth: 14, topY: -18, bottomY: 18 };\n case \"motor\":\n return { halfWidth: 16, topY: -16, bottomY: 22 };\n case \"load\":\n case \"capacitor_bank\":\n case \"harmonic_filter\":\n return { halfWidth: 20, topY: -14, bottomY: 14 };\n case \"vfd\":\n case \"ups\":\n return { halfWidth: 24, topY: -18, bottomY: 18 };\n case \"ats\":\n return { halfWidth: 22, topY: -18, bottomY: 18 };\n case \"ct\":\n case \"pt\":\n return { halfWidth: 10, topY: -16, bottomY: 16 };\n case \"relay\":\n return { halfWidth: 12, topY: -12, bottomY: 12 };\n case \"surge_arrester\":\n return { halfWidth: 12, topY: -16, bottomY: 26 };\n case \"watthour_meter\":\n case \"demand_meter\":\n case \"ground_fault\":\n return { halfWidth: 14, topY: -14, bottomY: 14 };\n case \"bus\":\n return DEFAULT_GEOMETRY;\n case \"hub\":\n return { halfWidth: 52, topY: -20, bottomY: 20 };\n case \"bus_tie\":\n return { halfWidth: 16, topY: -10, bottomY: 10 };\n default:\n return DEFAULT_GEOMETRY;\n }\n}\n\nfunction lineEl(x1: number, y1: number, x2: number, y2: number, cls = \"lt-sld-stroke\"): string {\n return line({ x1, y1, x2, y2, class: cls });\n}\n\nfunction utilitySymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 16, class: \"lt-sld-fill\" }),\n pathEl({ d: \"M -8 0 Q -4 -8 0 0 Q 4 8 8 0\", class: \"lt-sld-stroke\", fill: \"none\" }),\n // lead wires in/out\n lineEl(0, -24, 0, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction generatorSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 16, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: -2, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"14\" }, \"G\"),\n pathEl({ d: \"M -6 6 Q -3 1 0 6 Q 3 11 6 6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -24, 0, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction solarSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -18, y: -12, width: 36, height: 24, class: \"lt-sld-fill\" }),\n lineEl(-18, -4, 18, -4),\n lineEl(-18, 4, 18, 4),\n lineEl(-6, -12, -6, 12),\n lineEl(6, -12, 6, 12),\n lineEl(0, 12, 0, 18),\n ]);\n}\n\nfunction windSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 6, class: \"lt-sld-fill\" }),\n lineEl(0, -6, 0, -22),\n pathEl({ d: \"M 0 -6 L 14 -2 L 0 0 Z\", class: \"lt-sld-fill-dark\" }),\n pathEl({ d: \"M 0 -6 L -10 8 L 0 2 Z\", class: \"lt-sld-fill-dark\" }),\n pathEl({ d: \"M 0 -6 L -6 -18 L 2 -6 Z\", class: \"lt-sld-fill-dark\" }),\n lineEl(0, 6, 0, 18),\n ]);\n}\n\nfunction upsSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -22, y: -16, width: 44, height: 32, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"11\" }, \"UPS\"),\n ]);\n}\n\n/**\n * Transformer: two coil groups (three humps each) + polarity dots.\n * Optional winding labels (Δ or Y) are overlaid as compact glyphs.\n */\nfunction transformerSymbol(type: SLDNodeType): string {\n const pieces: string[] = [];\n // primary coil (top)\n pieces.push(\n pathEl({\n d: \"M -12 -18 A 4 4 0 0 1 -4 -18 A 4 4 0 0 1 4 -18 A 4 4 0 0 1 12 -18\",\n class: \"lt-sld-stroke\",\n fill: \"none\",\n })\n );\n // core lines\n pieces.push(lineEl(-14, -8, 14, -8));\n pieces.push(lineEl(-14, -4, 14, -4));\n // secondary coil (bottom, mirrored)\n pieces.push(\n pathEl({\n d: \"M -12 18 A 4 4 0 0 0 -4 18 A 4 4 0 0 0 4 18 A 4 4 0 0 0 12 18\",\n class: \"lt-sld-stroke\",\n fill: \"none\",\n })\n );\n // polarity dots\n pieces.push(el(\"circle\", { cx: -10, cy: -14, r: 2, class: \"lt-sld-dot\" }));\n pieces.push(el(\"circle\", { cx: 10, cy: 14, r: 2, class: \"lt-sld-dot\" }));\n // leads\n pieces.push(lineEl(0, -24, 0, -22));\n pieces.push(lineEl(0, 22, 0, 24));\n\n // Winding designators (Δ / Y / Yg)\n const { primary, secondary } = windingGlyphs(type);\n if (primary) pieces.push(textEl({ x: 20, y: -14, class: \"lt-sld-wdg\", \"text-anchor\": \"start\" }, primary));\n if (secondary) pieces.push(textEl({ x: 20, y: 18, class: \"lt-sld-wdg\", \"text-anchor\": \"start\" }, secondary));\n return group({}, pieces);\n}\n\nfunction windingGlyphs(type: SLDNodeType): { primary?: string; secondary?: string } {\n switch (type) {\n case \"transformer_dy\": return { primary: \"Δ\", secondary: \"Y\" };\n case \"transformer_yd\": return { primary: \"Y\", secondary: \"Δ\" };\n case \"transformer_yy\": return { primary: \"Y\", secondary: \"Y\" };\n case \"transformer_dd\": return { primary: \"Δ\", secondary: \"Δ\" };\n default: return {};\n }\n}\n\nfunction autotransformerSymbol(): string {\n return group({}, [\n pathEl({\n d: \"M 0 -20 A 6 6 0 0 1 0 -10 A 6 6 0 0 1 0 0 A 6 6 0 0 1 0 10 A 6 6 0 0 1 0 20\",\n class: \"lt-sld-stroke\",\n fill: \"none\",\n }),\n lineEl(6, 0, 14, 0),\n lineEl(0, -24, 0, -20),\n lineEl(0, 20, 0, 24),\n ]);\n}\n\nfunction threeWindingSymbol(): string {\n return group({}, [\n // top coil\n pathEl({ d: \"M -10 -18 A 3 3 0 0 1 -4 -18 A 3 3 0 0 1 2 -18 A 3 3 0 0 1 8 -18\", class: \"lt-sld-stroke\", fill: \"none\" }),\n // left-bottom coil\n pathEl({ d: \"M -18 6 A 3 3 0 0 1 -12 6 A 3 3 0 0 1 -6 6 A 3 3 0 0 1 0 6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n // right-bottom coil\n pathEl({ d: \"M 0 6 A 3 3 0 0 1 6 6 A 3 3 0 0 1 12 6 A 3 3 0 0 1 18 6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(-14, -8, 14, -8),\n lineEl(0, -24, 0, -18),\n lineEl(-9, 10, -9, 24),\n lineEl(9, 10, 9, 24),\n ]);\n}\n\n/** Circuit breaker: diagonal line + top arc. */\nfunction breakerSymbol(): string {\n return group({}, [\n lineEl(0, -14, 0, -10, \"lt-sld-stroke\"),\n lineEl(0, 10, 0, 14, \"lt-sld-stroke\"),\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n pathEl({ d: \"M 8 -10 Q 14 -12 12 -18\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -18, 0, -14),\n lineEl(0, 14, 0, 18),\n ]);\n}\n\nfunction vacuumBreakerSymbol(): string {\n return group({}, [\n el(\"ellipse\", { cx: 0, cy: 0, rx: 10, ry: 14, class: \"lt-sld-fill\" }),\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n textEl({ x: -2, y: -4, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-size\": \"8\" }, \"V\"),\n lineEl(0, -18, 0, -14),\n lineEl(0, 14, 0, 18),\n ]);\n}\n\nfunction recloserSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n pathEl({ d: \"M 8 -10 Q 14 -12 12 -18\", class: \"lt-sld-stroke\", fill: \"none\" }),\n pathEl({ d: \"M 14 -6 A 5 5 0 1 1 18 -4\", class: \"lt-sld-stroke\", fill: \"none\" }),\n el(\"polygon\", { points: \"18,-4 20,-8 15,-7\", class: \"lt-sld-dot\" }),\n lineEl(0, -18, 0, -14),\n lineEl(0, 14, 0, 18),\n ]);\n}\n\nfunction switchSymbol(open = false): string {\n const pieces: string[] = [];\n if (open) {\n pieces.push(line({ x1: -6, y1: 10, x2: 10, y2: -8, class: \"lt-sld-stroke-thick\" }));\n pieces.push(el(\"circle\", { cx: 10, cy: -8, r: 2, class: \"lt-sld-fill\" }));\n } else {\n pieces.push(line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }));\n }\n pieces.push(lineEl(0, -18, 0, -10));\n pieces.push(lineEl(0, 10, 0, 18));\n return group({}, pieces);\n}\n\nfunction loadSwitchSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 10, x2: 8, y2: -10, class: \"lt-sld-stroke-thick\" }),\n el(\"rect\", { x: 6, y: -14, width: 6, height: 6, class: \"lt-sld-fill\" }),\n lineEl(0, -18, 0, -10),\n lineEl(0, 10, 0, 18),\n ]);\n}\n\nfunction groundSwitchSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 0, x2: 8, y2: -14, class: \"lt-sld-stroke-thick\" }),\n lineEl(0, -18, 0, -4),\n // ground symbol\n lineEl(-8, 6, 8, 6),\n lineEl(-5, 10, 5, 10),\n lineEl(-2, 14, 2, 14),\n lineEl(0, 0, 0, 6),\n ]);\n}\n\nfunction sectionalizerSymbol(): string {\n return group({}, [\n line({ x1: -6, y1: 10, x2: 10, y2: -8, class: \"lt-sld-stroke-thick\" }),\n el(\"circle\", { cx: 10, cy: -8, r: 2, class: \"lt-sld-fill\" }),\n textEl({ x: 14, y: -4, class: \"lt-sld-wdg\", \"text-anchor\": \"start\" }, \"S\"),\n lineEl(0, -18, 0, -10),\n lineEl(0, 10, 0, 18),\n ]);\n}\n\nfunction fuseSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -5, y: -10, width: 10, height: 20, class: \"lt-sld-fill\" }),\n lineEl(0, -18, 0, -10),\n lineEl(0, 10, 0, 18),\n ]);\n}\n\nfunction fuseCLSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -6, y: -12, width: 12, height: 24, class: \"lt-sld-fill\" }),\n lineEl(-6, 0, 6, 0),\n lineEl(0, -18, 0, -12),\n lineEl(0, 12, 0, 18),\n ]);\n}\n\nfunction motorSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 14, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 5, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"13\" }, \"M\"),\n lineEl(0, -16, 0, -14),\n // 3-phase dots at bottom\n el(\"circle\", { cx: -6, cy: 12, r: 1.5, class: \"lt-sld-dot\" }),\n el(\"circle\", { cx: 0, cy: 14, r: 1.5, class: \"lt-sld-dot\" }),\n el(\"circle\", { cx: 6, cy: 12, r: 1.5, class: \"lt-sld-dot\" }),\n ]);\n}\n\nfunction loadSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -16, y: -12, width: 32, height: 24, class: \"lt-sld-fill\" }),\n ]);\n}\n\nfunction capacitorBankSymbol(): string {\n return group({}, [\n lineEl(-10, -6, 10, -6, \"lt-sld-stroke-thick\"),\n lineEl(-10, -2, 10, -2, \"lt-sld-stroke-thick\"),\n lineEl(-10, 4, 10, 4, \"lt-sld-stroke-thick\"),\n lineEl(-10, 8, 10, 8, \"lt-sld-stroke-thick\"),\n lineEl(0, -14, 0, -6),\n lineEl(0, 8, 0, 14),\n ]);\n}\n\nfunction harmonicFilterSymbol(): string {\n return group({}, [\n // L + C chained\n pathEl({ d: \"M -14 -4 A 3 3 0 0 1 -8 -4 A 3 3 0 0 1 -2 -4 A 3 3 0 0 1 4 -4\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(4, -8, 14, -8),\n lineEl(4, 0, 14, 0),\n lineEl(0, -14, 0, -4),\n lineEl(0, 4, 0, 14),\n ]);\n}\n\nfunction vfdSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -22, y: -16, width: 44, height: 32, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: -2, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"11\" }, \"VFD\"),\n pathEl({ d: \"M -10 8 Q -5 2 0 8 Q 5 14 10 8\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -18, 0, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction atsSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -22, y: -16, width: 44, height: 32, class: \"lt-sld-fill\" }),\n line({ x1: -14, y1: -8, x2: -2, y2: 6, class: \"lt-sld-stroke-thick\" }),\n line({ x1: 14, y1: -8, x2: 2, y2: 6, class: \"lt-sld-stroke-thick\" }),\n textEl({ x: 0, y: 14, class: \"lt-sld-symbol-text\", \"text-anchor\": \"middle\", \"font-weight\": \"bold\", \"font-size\": \"9\" }, \"ATS\"),\n lineEl(-12, -18, -12, -16),\n lineEl(12, -18, 12, -16),\n lineEl(0, 16, 0, 18),\n ]);\n}\n\nfunction ctSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 7, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 3, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"7\" }, \"CT\"),\n lineEl(0, -16, 0, -7),\n lineEl(0, 7, 0, 16),\n ]);\n}\n\nfunction ptSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 7, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 3, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"7\" }, \"PT\"),\n lineEl(0, -16, 0, -7),\n lineEl(0, 7, 0, 16),\n ]);\n}\n\nfunction relaySymbol(deviceNumber?: string): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 11, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"10\" }, deviceNumber ?? \"R\"),\n ]);\n}\n\nfunction surgeArresterSymbol(): string {\n return group({}, [\n el(\"rect\", { x: -7, y: -6, width: 14, height: 14, class: \"lt-sld-fill\" }),\n pathEl({ d: \"M -4 2 Q 0 -4 4 2\", class: \"lt-sld-stroke\", fill: \"none\" }),\n lineEl(0, -16, 0, -6),\n lineEl(0, 8, 0, 14),\n lineEl(-8, 14, 8, 14),\n lineEl(-5, 18, 5, 18),\n lineEl(-2, 22, 2, 22),\n ]);\n}\n\nfunction groundFaultSymbol(): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 12, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"9\" }, \"GFI\"),\n lineEl(0, -14, 0, -12),\n lineEl(0, 12, 0, 14),\n ]);\n}\n\nfunction hubSymbol(label?: string): string {\n return group({}, [\n el(\"rect\", {\n x: -50, y: -18, width: 100, height: 36,\n rx: 4, ry: 4,\n class: \"lt-sld-fill\",\n \"stroke-width\": 2,\n }),\n textEl(\n { x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"11\" },\n label ?? \"HUB\"\n ),\n lineEl(0, -20, 0, -18),\n lineEl(0, 18, 0, 20),\n // left/right lead stubs for lateral ports\n lineEl(-50, 0, -54, 0),\n lineEl(50, 0, 54, 0),\n ]);\n}\n\nfunction busTieSymbol(): string {\n // Horizontal breaker: two stubs + diagonal switch bar + arc above\n return group({}, [\n lineEl(-16, 0, -4, 0),\n lineEl(4, 0, 16, 0),\n pathEl({ d: \"M -4 0 L 4 -6\", class: \"lt-sld-stroke-thick\" }),\n pathEl({ d: \"M -4 -6 Q 0 -10 4 -6\", class: \"lt-sld-stroke\", fill: \"none\" }),\n ]);\n}\n\nfunction meterSymbol(label: string): string {\n return group({}, [\n el(\"circle\", { cx: 0, cy: 0, r: 12, class: \"lt-sld-fill\" }),\n textEl({ x: 0, y: 4, class: \"lt-sld-wdg\", \"text-anchor\": \"middle\", \"font-size\": \"9\" }, label),\n lineEl(0, -14, 0, -12),\n lineEl(0, 12, 0, 14),\n ]);\n}\n\n/** Main entry — render a node symbol at origin. */\nexport function renderSymbol(type: SLDNodeType, detail?: string): string {\n switch (type) {\n case \"utility\": return utilitySymbol();\n case \"generator\": return generatorSymbol();\n case \"solar\": return solarSymbol();\n case \"wind\": return windSymbol();\n case \"ups\": return upsSymbol();\n case \"transformer\":\n case \"transformer_dy\":\n case \"transformer_yd\":\n case \"transformer_yy\":\n case \"transformer_dd\":\n return transformerSymbol(type);\n case \"autotransformer\": return autotransformerSymbol();\n case \"transformer_3winding\": return threeWindingSymbol();\n case \"breaker\": return breakerSymbol();\n case \"breaker_vacuum\": return vacuumBreakerSymbol();\n case \"recloser\": return recloserSymbol();\n case \"switch\": return switchSymbol(true);\n case \"switch_load\": return loadSwitchSymbol();\n case \"ground_switch\": return groundSwitchSymbol();\n case \"sectionalizer\": return sectionalizerSymbol();\n case \"fuse\": return fuseSymbol();\n case \"fuse_cl\": return fuseCLSymbol();\n case \"motor\": return motorSymbol();\n case \"load\": return loadSymbol();\n case \"capacitor_bank\": return capacitorBankSymbol();\n case \"harmonic_filter\": return harmonicFilterSymbol();\n case \"vfd\": return vfdSymbol();\n case \"ats\": return atsSymbol();\n case \"ct\": return ctSymbol();\n case \"pt\": return ptSymbol();\n case \"relay\": return relaySymbol(detail);\n case \"surge_arrester\": return surgeArresterSymbol();\n case \"ground_fault\": return groundFaultSymbol();\n case \"watthour_meter\": return meterSymbol(\"Wh\");\n case \"demand_meter\": return meterSymbol(\"D\");\n case \"bus\": return \"\";\n case \"hub\": return hubSymbol(detail);\n case \"bus_tie\": return busTieSymbol();\n default: return loadSymbol();\n }\n}\n","import type { SLDAST, SLDConnection, SLDNode, SLDNodeType } from \"../../core/types\";\nimport { geometryFor } from \"./symbols\";\n\n/**\n * Top-down hierarchical layout:\n * level 0 = sources (top)\n * each edge forces child.level >= parent.level + 1\n * Bus nodes expand horizontally to span their children.\n * Other nodes are positioned in a tidy tree-like layout.\n */\n\nexport interface SLDLayoutNode {\n node: SLDNode;\n nodeType: SLDNodeType;\n /** center x */\n x: number;\n /** center y */\n y: number;\n /** Terminal y (top and bottom) after symbol geometry */\n topY: number;\n bottomY: number;\n level: number;\n /** Half width for spacing */\n halfWidth: number;\n /** For bus nodes: left and right extent (x min/max) */\n busLeft?: number;\n busRight?: number;\n}\n\nexport interface SLDLayoutEdge {\n from: string;\n to: string;\n path: string;\n cable?: string;\n label?: string;\n midX: number;\n midY: number;\n}\n\nexport interface SLDLayoutBand {\n level: number;\n voltage?: string;\n y: number;\n height: number;\n}\n\nexport interface SLDLayoutResult {\n width: number;\n height: number;\n nodes: SLDLayoutNode[];\n edges: SLDLayoutEdge[];\n bands: SLDLayoutBand[];\n nodeById: Map<string, SLDLayoutNode>;\n}\n\nconst LEVEL_SPACING = 100;\nconst H_SPACING = 90;\nconst LEFT_PADDING = 80;\nconst TOP_PADDING = 40;\nconst BUS_OVERHANG = 20;\n\nfunction computeLevels(ast: SLDAST): Map<string, number> {\n const levels = new Map<string, number>();\n const inEdges = new Map<string, SLDConnection[]>();\n const outEdges = new Map<string, SLDConnection[]>();\n for (const n of ast.nodes) {\n inEdges.set(n.id, []);\n outEdges.set(n.id, []);\n }\n for (const c of ast.connections) {\n inEdges.get(c.to)?.push(c);\n outEdges.get(c.from)?.push(c);\n }\n\n // Sources: no incoming edges\n const roots = ast.nodes.filter((n) => (inEdges.get(n.id) ?? []).length === 0);\n for (const r of roots) levels.set(r.id, 0);\n\n // Identify bus_tie nodes — they are lateral at the same level as their source.\n const typeById = new Map<string, SLDNodeType>();\n for (const n of ast.nodes) typeById.set(n.id, n.nodeType);\n const isTieEdge = (c: SLDConnection): boolean =>\n typeById.get(c.from) === \"bus_tie\" || typeById.get(c.to) === \"bus_tie\";\n\n // Relaxation: level(to) = max(level(from)+1); iterate until stable.\n // Skip edges touching bus_tie (those are lateral).\n const maxIter = ast.nodes.length + 2;\n for (let iter = 0; iter < maxIter; iter++) {\n let changed = false;\n for (const c of ast.connections) {\n if (isTieEdge(c)) continue;\n const fromLvl = levels.get(c.from);\n if (fromLvl === undefined) continue;\n const want = fromLvl + 1;\n const curr = levels.get(c.to);\n if (curr === undefined || want > curr) {\n levels.set(c.to, want);\n changed = true;\n }\n }\n if (!changed) break;\n }\n\n // Tie edges: force both endpoints and the tie node itself to share level\n // with any already-leveled participant.\n for (let iter = 0; iter < maxIter; iter++) {\n let changed = false;\n for (const c of ast.connections) {\n if (!isTieEdge(c)) continue;\n const fromLvl = levels.get(c.from);\n const toLvl = levels.get(c.to);\n const shared = fromLvl ?? toLvl;\n if (shared === undefined) continue;\n if (fromLvl === undefined || fromLvl !== shared) {\n levels.set(c.from, shared);\n changed = true;\n }\n if (toLvl === undefined || toLvl !== shared) {\n levels.set(c.to, shared);\n changed = true;\n }\n }\n if (!changed) break;\n }\n\n // Any orphaned nodes: put at level 0\n for (const n of ast.nodes) {\n if (!levels.has(n.id)) levels.set(n.id, 0);\n }\n return levels;\n}\n\nfunction orderWithinLevel(\n ast: SLDAST,\n levels: Map<string, number>\n): Map<number, string[]> {\n const byLevel = new Map<number, string[]>();\n for (const n of ast.nodes) {\n const lvl = levels.get(n.id) ?? 0;\n if (!byLevel.has(lvl)) byLevel.set(lvl, []);\n byLevel.get(lvl)!.push(n.id);\n }\n\n // Order: DFS from sources preserving declaration order.\n const visited = new Set<string>();\n const order = new Map<string, number>();\n let idx = 0;\n\n const adj = new Map<string, string[]>();\n for (const n of ast.nodes) adj.set(n.id, []);\n for (const c of ast.connections) adj.get(c.from)?.push(c.to);\n\n function dfs(id: string): void {\n if (visited.has(id)) return;\n visited.add(id);\n order.set(id, idx++);\n for (const child of adj.get(id) ?? []) dfs(child);\n }\n\n // Start from sources in declaration order\n const inEdgeCount = new Map<string, number>();\n for (const n of ast.nodes) inEdgeCount.set(n.id, 0);\n for (const c of ast.connections) {\n inEdgeCount.set(c.to, (inEdgeCount.get(c.to) ?? 0) + 1);\n }\n for (const n of ast.nodes) {\n if ((inEdgeCount.get(n.id) ?? 0) === 0) dfs(n.id);\n }\n // Fallback for any remaining nodes\n for (const n of ast.nodes) dfs(n.id);\n\n // Sort each level by the DFS order\n for (const [lvl, ids] of byLevel.entries()) {\n ids.sort((a, b) => (order.get(a) ?? 0) - (order.get(b) ?? 0));\n byLevel.set(lvl, ids);\n }\n return byLevel;\n}\n\nexport function layoutSLD(ast: SLDAST): SLDLayoutResult {\n const levels = computeLevels(ast);\n const byLevel = orderWithinLevel(ast, levels);\n const nodeMap = new Map<string, SLDNode>();\n for (const n of ast.nodes) nodeMap.set(n.id, n);\n\n // First pass: x position for all non-bus nodes.\n // Buses get x later after their children are placed.\n const layoutNodes: SLDLayoutNode[] = [];\n const byIdLayout = new Map<string, SLDLayoutNode>();\n\n const parents = new Map<string, string[]>();\n const children = new Map<string, string[]>();\n for (const n of ast.nodes) {\n parents.set(n.id, []);\n children.set(n.id, []);\n }\n for (const c of ast.connections) {\n parents.get(c.to)?.push(c.from);\n children.get(c.from)?.push(c.to);\n }\n\n const sortedLevels = Array.from(byLevel.keys()).sort((a, b) => a - b);\n const maxLevel = sortedLevels.length ? sortedLevels[sortedLevels.length - 1] : 0;\n\n // Assign sequential X for non-bus leaf-like nodes within each level.\n // Then propagate bus positions by averaging their children.\n let nextX = LEFT_PADDING;\n // x assignment helper: if children already placed, center above them; else nextX\n function placeNode(id: string): SLDLayoutNode {\n const existing = byIdLayout.get(id);\n if (existing) return existing;\n const node = nodeMap.get(id)!;\n const lvl = levels.get(id) ?? 0;\n const geom = geometryFor(node.nodeType);\n const y = TOP_PADDING + lvl * LEVEL_SPACING;\n const ln: SLDLayoutNode = {\n node,\n nodeType: node.nodeType,\n x: 0,\n y,\n topY: y + geom.topY,\n bottomY: y + geom.bottomY,\n level: lvl,\n halfWidth: geom.halfWidth,\n };\n byIdLayout.set(id, ln);\n layoutNodes.push(ln);\n return ln;\n }\n\n // Walk levels top-to-bottom placing non-bus nodes sequentially; buses get centered on children\n // We do this in two passes: first place everything sequentially, then re-center buses.\n for (const lvl of sortedLevels) {\n for (const id of byLevel.get(lvl)!) {\n const ln = placeNode(id);\n if (ln.nodeType === \"bus\") {\n // defer\n ln.x = nextX; // placeholder\n } else {\n ln.x = nextX;\n nextX += H_SPACING;\n }\n }\n }\n\n // Center buses over their children (or parents if no children)\n // Iterate multiple times to stabilize.\n for (let iter = 0; iter < 4; iter++) {\n for (const lvl of sortedLevels) {\n for (const id of byLevel.get(lvl)!) {\n const ln = byIdLayout.get(id)!;\n if (ln.nodeType !== \"bus\") continue;\n const childrenIds = children.get(id) ?? [];\n const parentIds = parents.get(id) ?? [];\n const relatedXs: number[] = [];\n for (const cid of childrenIds) {\n const c = byIdLayout.get(cid);\n if (c && c.nodeType !== \"bus_tie\") relatedXs.push(c.x);\n }\n if (relatedXs.length === 0) {\n for (const pid of parentIds) {\n const p = byIdLayout.get(pid);\n if (p && p.nodeType !== \"bus_tie\") relatedXs.push(p.x);\n }\n }\n if (relatedXs.length > 0) {\n const minX = Math.min(...relatedXs);\n const maxX = Math.max(...relatedXs);\n ln.x = (minX + maxX) / 2;\n ln.busLeft = minX - BUS_OVERHANG;\n ln.busRight = maxX + BUS_OVERHANG;\n } else {\n ln.busLeft = ln.x - 40;\n ln.busRight = ln.x + 40;\n }\n }\n }\n }\n\n // Center non-bus nodes over their child(ren), bottom-up.\n // For convergence (child has multiple parents at same level), spread\n // parents horizontally around the child instead of collapsing them to one x.\n const CONVERGENCE_SPREAD = Math.max(H_SPACING, 110);\n for (let iter = 0; iter < 4; iter++) {\n for (const lvl of [...sortedLevels].reverse()) {\n for (const id of byLevel.get(lvl)!) {\n const ln = byIdLayout.get(id)!;\n if (ln.nodeType === \"bus\" || ln.nodeType === \"bus_tie\") continue;\n const childIds = children.get(id) ?? [];\n if (childIds.length === 1) {\n const child = byIdLayout.get(childIds[0]);\n if (!child) continue;\n // Only the convergence child's parents are spread\n const siblingParents = (parents.get(child.node.id) ?? [])\n .map((pid) => byIdLayout.get(pid))\n .filter((p): p is SLDLayoutNode => !!p && p.level === lvl && p.nodeType !== \"bus\");\n if (siblingParents.length > 1) {\n // Sort by original sequential x to preserve declared order\n siblingParents.sort((a, b) => a.x - b.x);\n const n = siblingParents.length;\n const spread = Math.max(\n CONVERGENCE_SPREAD,\n (child.halfWidth * 2 + 40) / Math.max(1, n - 1)\n );\n const idx = siblingParents.indexOf(ln);\n ln.x = child.x + (idx - (n - 1) / 2) * spread;\n } else {\n ln.x = child.x;\n }\n } else if (childIds.length > 1) {\n const xs = childIds\n .map((c) => byIdLayout.get(c)?.x)\n .filter((v): v is number => v !== undefined);\n if (xs.length > 0) {\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n }\n }\n }\n\n // Bus-tie lateral placement: place tie and its \"second bus\" to the right\n // of the \"first bus\" at the same level. Shift the entire busB cluster\n // (all nodes reachable from busB excluding busA/tie) so the whole\n // right-side subtree moves together.\n for (const ln of layoutNodes) {\n if (ln.nodeType !== \"bus_tie\") continue;\n const inIds = parents.get(ln.node.id) ?? [];\n const outIds = children.get(ln.node.id) ?? [];\n const busA = inIds.map((id) => byIdLayout.get(id)).find((n) => n?.nodeType === \"bus\");\n const busB = outIds.map((id) => byIdLayout.get(id)).find((n) => n?.nodeType === \"bus\");\n if (!busA || !busB) continue;\n\n const busAChildren = (children.get(busA.node.id) ?? [])\n .map((id) => byIdLayout.get(id))\n .filter((c): c is SLDLayoutNode => !!c && c.nodeType !== \"bus_tie\");\n const busAMaxX = busAChildren.length\n ? Math.max(...busAChildren.map((c) => c.x))\n : busA.x;\n ln.y = busA.y;\n ln.x = busAMaxX + 60;\n\n // Cluster of busB: BFS in both directions excluding busA and tie itself\n const cluster = new Set<string>([busB.node.id]);\n const queue = [busB.node.id];\n const excluded = new Set<string>([busA.node.id, ln.node.id]);\n while (queue.length) {\n const cur = queue.shift()!;\n const neighbors = [...(children.get(cur) ?? []), ...(parents.get(cur) ?? [])];\n for (const nb of neighbors) {\n if (cluster.has(nb) || excluded.has(nb)) continue;\n cluster.add(nb);\n queue.push(nb);\n }\n }\n\n // Shift whole cluster so its leftmost member sits just right of the tie\n let minClusterX = Infinity;\n for (const id of cluster) {\n const n = byIdLayout.get(id);\n if (!n) continue;\n const left = n.nodeType === \"bus\" ? (n.busLeft ?? n.x) : n.x - n.halfWidth;\n if (left < minClusterX) minClusterX = left;\n }\n const desiredLeft = ln.x + 30;\n const shift = desiredLeft - minClusterX;\n if (shift > 0) {\n for (const id of cluster) {\n const n = byIdLayout.get(id);\n if (!n) continue;\n n.x += shift;\n if (n.busLeft !== undefined) n.busLeft += shift;\n if (n.busRight !== undefined) n.busRight += shift;\n }\n }\n }\n\n // Label-aware collision resolution within each level.\n // For each non-bus node, estimate displayed label width so sibling\n // placement respects text, not just symbol geometry.\n const labelHalfWidth = (ln: SLDLayoutNode): number => {\n if (ln.nodeType === \"bus\" || ln.nodeType === \"bus_tie\") return 0;\n const node = ln.node;\n const txtParts: string[] = [node.label ?? node.id];\n if (node.rating) txtParts.push(node.rating);\n const longest = txtParts.reduce((m, s) => Math.max(m, s.length), 0);\n // Bold 11px sans-serif id is ~6.2px per char at widest; pad a bit.\n return (longest * 6.2) / 2 + 4;\n };\n\n for (const lvl of sortedLevels) {\n const ids = byLevel.get(lvl)!;\n const sorted = ids.map((id) => byIdLayout.get(id)!).sort((a, b) => a.x - b.x);\n for (let i = 1; i < sorted.length; i++) {\n const prev = sorted[i - 1];\n const cur = sorted[i];\n if (prev.nodeType === \"bus\" && cur.nodeType !== \"bus\") continue;\n if (cur.nodeType === \"bus\" && prev.nodeType !== \"bus\") continue;\n const symGap =\n (prev.nodeType === \"bus\" ? 0 : prev.halfWidth) +\n (cur.nodeType === \"bus\" ? 0 : cur.halfWidth) +\n 16;\n const labelGap = labelHalfWidth(prev) + labelHalfWidth(cur) + 8;\n const minGap = Math.max(symGap, labelGap);\n if (cur.x - prev.x < minGap) {\n cur.x = prev.x + minGap;\n }\n }\n }\n\n // Bus nodes: re-update extent after collision resolution\n for (const ln of layoutNodes) {\n if (ln.nodeType !== \"bus\") continue;\n const childrenIds = children.get(ln.node.id) ?? [];\n const parentIds = parents.get(ln.node.id) ?? [];\n const xs: number[] = [];\n for (const cid of [...childrenIds, ...parentIds]) {\n const rel = byIdLayout.get(cid);\n if (rel && rel.nodeType !== \"bus_tie\") xs.push(rel.x);\n }\n // Include tie x so bus stretches up to the tie (but doesn't center on it)\n const tieXs: number[] = [];\n for (const cid of [...childrenIds, ...parentIds]) {\n const rel = byIdLayout.get(cid);\n if (rel && rel.nodeType === \"bus_tie\") tieXs.push(rel.x);\n }\n if (xs.length > 0) {\n let left = Math.min(...xs) - BUS_OVERHANG;\n let right = Math.max(...xs) + BUS_OVERHANG;\n for (const tx of tieXs) {\n if (tx < left) left = tx;\n if (tx > right) right = tx;\n }\n ln.busLeft = left;\n ln.busRight = right;\n ln.x = (Math.min(...xs) + Math.max(...xs)) / 2;\n }\n }\n\n // Update terminal Ys\n for (const ln of layoutNodes) {\n const geom = geometryFor(ln.nodeType);\n ln.topY = ln.y + geom.topY;\n ln.bottomY = ln.y + geom.bottomY;\n }\n\n // Build edges\n const edges: SLDLayoutEdge[] = [];\n for (const c of ast.connections) {\n const from = byIdLayout.get(c.from);\n const to = byIdLayout.get(c.to);\n if (!from || !to) continue;\n\n const fx = from.x;\n const tx = to.x;\n const lateralTie =\n from.nodeType === \"bus_tie\" ||\n to.nodeType === \"bus_tie\" ||\n (from.level === to.level && (from.nodeType === \"bus\" || to.nodeType === \"bus\"));\n\n let startY: number;\n let endY: number;\n if (lateralTie) {\n startY = from.y;\n endY = to.y;\n } else {\n startY = from.nodeType === \"bus\" ? from.y : from.bottomY;\n endY = to.nodeType === \"bus\" ? to.y : to.topY;\n }\n\n let pathD: string;\n if (lateralTie) {\n // Horizontal segment at common y; small stubs if tie sits on bus y\n pathD = `M ${fx} ${startY} L ${tx} ${endY}`;\n } else if (Math.abs(fx - tx) < 0.5) {\n pathD = `M ${fx} ${startY} L ${tx} ${endY}`;\n } else {\n // L-path: go down halfway, then horizontal, then vertical\n const midY = (startY + endY) / 2;\n pathD = `M ${fx} ${startY} L ${fx} ${midY} L ${tx} ${midY} L ${tx} ${endY}`;\n }\n\n edges.push({\n from: c.from,\n to: c.to,\n path: pathD,\n cable: c.cable,\n label: c.label,\n midX: (fx + tx) / 2,\n midY: (startY + endY) / 2,\n });\n }\n\n // Compute bands (voltage regions)\n const bands: SLDLayoutBand[] = [];\n for (const lvl of sortedLevels) {\n // Find a representative voltage label for this band\n let voltage: string | undefined;\n for (const id of byLevel.get(lvl)!) {\n const n = nodeMap.get(id)!;\n if (n.voltage) {\n voltage = n.voltage;\n break;\n }\n }\n bands.push({\n level: lvl,\n voltage,\n y: TOP_PADDING + lvl * LEVEL_SPACING - LEVEL_SPACING / 2 + 10,\n height: LEVEL_SPACING,\n });\n }\n\n // Normalize X so the leftmost content sits at LEFT_PADDING (no empty left gutter).\n let contentMinX = Infinity;\n for (const ln of layoutNodes) {\n const left = ln.nodeType === \"bus\"\n ? (ln.busLeft ?? ln.x)\n : ln.x - ln.halfWidth;\n if (left < contentMinX) contentMinX = left;\n }\n if (!Number.isFinite(contentMinX)) contentMinX = 0;\n const xShift = LEFT_PADDING - contentMinX;\n if (Math.abs(xShift) > 0.5) {\n for (const ln of layoutNodes) {\n ln.x += xShift;\n if (ln.busLeft !== undefined) ln.busLeft += xShift;\n if (ln.busRight !== undefined) ln.busRight += xShift;\n }\n for (const e of edges) {\n e.midX += xShift;\n // Shift every \"x\" coord in the path string (M / L tokens are \"x y\" pairs).\n e.path = e.path.replace(\n /([ML])\\s+(-?[\\d.]+)\\s+(-?[\\d.]+)/g,\n (_m, cmd, x, y) => `${cmd} ${Number(x) + xShift} ${y}`\n );\n }\n }\n\n // Compute canvas size\n let maxX = 0;\n for (const ln of layoutNodes) {\n const right = (ln.busRight ?? (ln.x + ln.halfWidth)) + 60;\n if (right > maxX) maxX = right;\n }\n const width = Math.max(400, maxX + 40);\n const height = TOP_PADDING + maxLevel * LEVEL_SPACING + 120;\n\n return {\n width,\n height,\n nodes: layoutNodes,\n edges,\n bands,\n nodeById: byIdLayout,\n };\n}\n","import type { SLDAST, SLDNode, RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n defs,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme, type IndustrialTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { layoutSLD, type SLDLayoutNode } from \"./layout\";\nimport { renderSymbol } from \"./symbols\";\n\ntype IT = ResolvedTheme<IndustrialTokens>;\n\n// Zebra-band fills for grouped rows. Local to SLD — no other diagram uses\n// alternating row backgrounds, so they don't need to live in IndustrialTokens.\nconst BAND_ODD_LIGHT = \"#f7f7f7\";\nconst BAND_EVEN_LIGHT = \"#fbfbfb\";\nconst BAND_ODD_DARK = \"#2a2b3c\";\nconst BAND_EVEN_DARK = \"#313244\";\n\nfunction buildCss(t: IT): string {\n const isDark = t.bg !== \"#ffffff\";\n const bandOdd = isDark ? BAND_ODD_DARK : BAND_ODD_LIGHT;\n const bandEven = isDark ? BAND_EVEN_DARK : BAND_EVEN_LIGHT;\n return `\n.lt-sld { font-family: system-ui, -apple-system, sans-serif; }\n.lt-sld-stroke { stroke: ${t.stroke}; stroke-width: 1.8; fill: none; }\n.lt-sld-stroke-thick { stroke: ${t.stroke}; stroke-width: 2.4; fill: none; stroke-linecap: round; }\n.lt-sld-fill { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }\n.lt-sld-fill-dark { fill: ${t.stroke}; stroke: ${t.stroke}; stroke-width: 1; }\n.lt-sld-dot { fill: ${t.stroke}; stroke: none; }\n.lt-sld-wire { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-sld-bus { stroke: ${t.strokeHeavy}; stroke-width: 6; stroke-linecap: square; }\n.lt-sld-band-odd { fill: ${bandOdd}; stroke: none; }\n.lt-sld-band-even { fill: ${bandEven}; stroke: none; }\n.lt-sld-band-label { font: bold 11px sans-serif; fill: ${t.textMuted}; }\n.lt-sld-title { font: bold 16px sans-serif; fill: ${t.text}; }\n.lt-sld-id { font: bold 11px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-sld-rating { font: 9px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-sld-voltage { font: bold 10px sans-serif; fill: ${t.textMuted}; }\n.lt-sld-nameplate { font: 9px sans-serif; fill: ${t.textMuted}; }\n.lt-sld-cable { font: 9px ui-monospace, SFMono-Regular, Menlo, monospace; fill: ${t.textMuted}; }\n.lt-sld-symbol-text { font: 11px sans-serif; fill: ${t.text}; dominant-baseline: middle; }\n.lt-sld-wdg { font: bold 10px sans-serif; fill: ${t.stroke}; dominant-baseline: middle; }\n.lt-sld-bus-label { font: bold 11px sans-serif; fill: ${t.accent}; }\n`.trim();\n}\n\nfunction renderLabels(ln: SLDLayoutNode): string[] {\n const pieces: string[] = [];\n const { node } = ln;\n if (ln.nodeType === \"bus\") {\n // Bus label + voltage sits above the bus bar\n const label = node.label ?? node.id;\n pieces.push(\n textEl(\n { x: (ln.busLeft ?? ln.x - 40) + 4, y: ln.y - 8, class: \"lt-sld-bus-label\" },\n node.voltage ? `${node.voltage} · ${label}` : label\n )\n );\n return pieces;\n }\n\n if (ln.nodeType === \"hub\") {\n // Label rendered inside the hub rect; skip external ID.\n if (node.rating || node.voltage) {\n const lines: string[] = [];\n if (node.rating) lines.push(node.rating);\n if (node.voltage) lines.push(node.voltage);\n lines.forEach((l, i) => {\n pieces.push(\n textEl(\n { x: ln.x, y: ln.bottomY + 14 + i * 11, class: \"lt-sld-rating\" },\n l\n )\n );\n });\n }\n return pieces;\n }\n\n if (ln.nodeType === \"bus_tie\") {\n // Tie breaker label to the side\n pieces.push(\n textEl(\n { x: ln.x, y: ln.topY - 6, class: \"lt-sld-rating\" },\n node.label ?? node.id\n )\n );\n return pieces;\n }\n\n // ID above\n const idY = ln.topY - 22;\n pieces.push(\n textEl({ x: ln.x, y: idY, class: \"lt-sld-id\" }, node.label ?? node.id)\n );\n\n // Rating below\n const lines: string[] = [];\n if (node.rating) lines.push(node.rating);\n if (node.voltage) lines.push(node.voltage);\n if (node.deviceNumber && ln.nodeType === \"relay\") {\n // deviceNumber is shown inside the relay glyph; skip here\n }\n lines.forEach((l, i) => {\n pieces.push(\n textEl(\n { x: ln.x, y: ln.bottomY + 14 + i * 11, class: \"lt-sld-rating\" },\n l\n )\n );\n });\n\n // Transformer nameplate\n if (\n (ln.nodeType === \"transformer\" ||\n ln.nodeType === \"transformer_dy\" ||\n ln.nodeType === \"transformer_yd\" ||\n ln.nodeType === \"transformer_yy\" ||\n ln.nodeType === \"transformer_dd\" ||\n ln.nodeType === \"autotransformer\" ||\n ln.nodeType === \"transformer_3winding\") &&\n node.nameplate\n ) {\n const np = node.nameplate;\n const keys = Object.keys(np);\n let offset = -12;\n const x = ln.x + ln.halfWidth + 28;\n for (const k of keys) {\n pieces.push(\n textEl(\n { x, y: ln.y + offset, class: \"lt-sld-nameplate\" },\n `${k}: ${np[k]}`\n )\n );\n offset += 11;\n }\n }\n\n return pieces;\n}\n\nexport function renderSLD(ast: SLDAST, config?: RenderConfig): string {\n const layout = layoutSLD(ast);\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 34 : 12;\n const width = Math.ceil(layout.width);\n const height = Math.ceil(layout.height + titleOffset);\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Single-Line Diagram\"));\n children.push(\n desc(\n `Single-line diagram with ${ast.nodes.length} nodes and ${ast.connections.length} connections`\n )\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n // Arrow marker\n children.push(\n defs([\n el(\n \"marker\",\n {\n id: \"lt-sld-arrow\",\n markerWidth: 8,\n markerHeight: 8,\n refX: 6,\n refY: 3,\n orient: \"auto\",\n markerUnits: \"strokeWidth\",\n },\n [el(\"path\", { d: \"M 0 0 L 6 3 L 0 6 z\", fill: t.textMuted })]\n ),\n ])\n );\n\n if (ast.title) {\n children.push(\n textEl({ x: 20, y: 22, class: \"lt-sld-title\" }, ast.title)\n );\n }\n\n const inner: string[] = [];\n\n // Voltage bands (alternating background)\n layout.bands.forEach((b, i) => {\n inner.push(\n el(\"rect\", {\n x: 0,\n y: b.y,\n width: layout.width,\n height: b.height,\n class: i % 2 === 0 ? \"lt-sld-band-odd\" : \"lt-sld-band-even\",\n })\n );\n if (b.voltage) {\n inner.push(\n textEl(\n { x: 14, y: b.y + 18, class: \"lt-sld-band-label\" },\n b.voltage\n )\n );\n }\n });\n\n // Connection wires (draw before symbols so symbols sit on top)\n for (const e of layout.edges) {\n inner.push(pathEl({ d: e.path, class: \"lt-sld-wire\" }));\n if (e.cable) {\n // Position cable label near midpoint, slightly offset\n inner.push(\n textEl(\n { x: e.midX + 6, y: e.midY - 2, class: \"lt-sld-cable\" },\n e.cable\n )\n );\n }\n if (e.label) {\n inner.push(\n textEl(\n { x: e.midX + 6, y: e.midY + 10, class: \"lt-sld-cable\" },\n e.label\n )\n );\n }\n }\n\n // Nodes\n for (const ln of layout.nodes) {\n if (ln.nodeType === \"bus\") {\n const left = ln.busLeft ?? ln.x - 40;\n const right = ln.busRight ?? ln.x + 40;\n inner.push(\n el(\"line\", {\n x1: left,\n y1: ln.y,\n x2: right,\n y2: ln.y,\n class: \"lt-sld-bus\",\n \"data-id\": ln.node.id,\n })\n );\n for (const piece of renderLabels(ln)) inner.push(piece);\n continue;\n }\n const attrs = {\n transform: `translate(${ln.x}, ${ln.y})`,\n \"data-type\": ln.nodeType,\n \"data-id\": ln.node.id,\n };\n inner.push(\n group(attrs, [\n renderSymbol(\n ln.nodeType,\n ln.nodeType === \"hub\"\n ? ln.node.label ?? ln.node.id\n : (ln.node as SLDNode).deviceNumber\n ),\n ])\n );\n for (const piece of renderLabels(ln)) inner.push(piece);\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-sld\",\n role: \"img\",\n \"aria-labelledby\": \"lt-sld-title lt-sld-desc\",\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseSLDDSL } from \"./parser\";\nimport { renderSLD } from \"./renderer\";\n\nexport const sld: DiagramPlugin = {\n type: \"sld\",\n detect(text: string): boolean {\n const first = firstContentLine(text)?.toLowerCase() ?? \"\";\n return first.startsWith(\"sld\");\n },\n parse: parseSLDDSL,\n\n render(text: string, config): string {\n const ast = parseSLDDSL(text);\n return renderSLD(ast, config);\n },\n};\n\nexport { parseSLDDSL } from \"./parser\";\nexport { renderSLD } from \"./renderer\";\nexport { layoutSLD } from \"./layout\";\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/core/theme.ts"],"names":[],"mappings":"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","file":"chunk-D7EHZFK4.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 /** Inline `code` foreground/background. */\n codeFg: string;\n codeBg: string;\n /** Link color (with underline). */\n linkColor: string;\n /** Checkbox stroke color (unchecked state). */\n checkboxStroke: string;\n /** Checkbox fill when checked. */\n checkboxFill: string;\n}\n\n/**\n * Tokens for timeline diagrams. Palette-driven so categories/tracks share\n * colors with the rest of the diagram family (ecomap/sociogram/phylo).\n * Era bands and card surfaces use theme-neutral tints so no magic hex codes\n * leak into the renderer.\n */\nexport interface TimelineTokens {\n axis: string;\n axisLabel: string;\n eraLabel: string;\n eraOpacity: number;\n eraPlotOpacity: number;\n /** Alternating lane stripe fill. */\n laneStripe: string;\n laneStripeOpacity: number;\n /** Category / task bar palette. Cycled by `category` (fallback to trackIdx). */\n categoryPalette: readonly string[];\n /** Point/milestone ring — defaults to accent but configurable. */\n markerRing: string;\n markerFill: string;\n milestoneFill: string;\n /** Gantt vertical pin shaft. */\n pinShaft: string;\n /** Lollipop card. */\n cardBg: string;\n cardStroke: string;\n cardText: string;\n cardShadow: string;\n /** Gantt legend chip background. */\n legendBg: string;\n legendStroke: 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 codeFg: \"#be185d\",\n codeBg: \"#fdf2f8\",\n linkColor: \"#2563eb\",\n checkboxStroke: \"#64748b\",\n checkboxFill: \"#10b981\",\n};\n\nconst MONOCHROME_MINDMAP: MindmapTokens = {\n centralFill: \"#000000\",\n branchPalette: [\"#000000\"],\n codeFg: \"#000000\",\n codeBg: \"#e5e5e5\",\n linkColor: \"#000000\",\n checkboxStroke: \"#000000\",\n checkboxFill: \"#000000\",\n};\n\nconst DARK_MINDMAP: MindmapTokens = {\n centralFill: \"#cdd6f4\",\n branchPalette: DARK_PALETTE,\n codeFg: \"#f5c2e7\",\n codeBg: \"#313244\",\n linkColor: \"#89b4fa\",\n checkboxStroke: \"#a6adc8\",\n checkboxFill: \"#a6e3a1\",\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// ─── Timeline Tokens Per Theme ─────────────────────────────\n\nconst DEFAULT_TIMELINE: TimelineTokens = {\n axis: \"#334155\",\n axisLabel: \"#475569\",\n eraLabel: \"#0f172a\",\n eraOpacity: 0.55,\n eraPlotOpacity: 0.14,\n laneStripe: \"#f1f5f9\",\n laneStripeOpacity: 0.6,\n categoryPalette: DEFAULT_PALETTE,\n markerRing: \"#2563eb\",\n markerFill: \"#ffffff\",\n milestoneFill: \"#d97706\",\n pinShaft: \"#94a3b8\",\n cardBg: \"#ffffff\",\n cardStroke: \"#cbd5e1\",\n cardText: \"#0f172a\",\n cardShadow: \"rgba(15,23,42,0.08)\",\n legendBg: \"#f8fafc\",\n legendStroke: \"#e2e8f0\",\n};\n\nconst MONOCHROME_TIMELINE: TimelineTokens = {\n axis: \"#000000\",\n axisLabel: \"#333333\",\n eraLabel: \"#000000\",\n eraOpacity: 0.2,\n eraPlotOpacity: 0.08,\n laneStripe: \"#f0f0f0\",\n laneStripeOpacity: 0.6,\n categoryPalette: MONOCHROME_PALETTE,\n markerRing: \"#000000\",\n markerFill: \"#ffffff\",\n milestoneFill: \"#000000\",\n pinShaft: \"#888888\",\n cardBg: \"#ffffff\",\n cardStroke: \"#000000\",\n cardText: \"#000000\",\n cardShadow: \"rgba(0,0,0,0.06)\",\n legendBg: \"#ffffff\",\n legendStroke: \"#000000\",\n};\n\nconst DARK_TIMELINE: TimelineTokens = {\n axis: \"#cdd6f4\",\n axisLabel: \"#9399b2\",\n eraLabel: \"#cdd6f4\",\n eraOpacity: 0.5,\n eraPlotOpacity: 0.18,\n laneStripe: \"#313244\",\n laneStripeOpacity: 0.5,\n categoryPalette: DARK_PALETTE,\n markerRing: \"#89b4fa\",\n markerFill: \"#1e1e2e\",\n milestoneFill: \"#fab387\",\n pinShaft: \"#6c7086\",\n cardBg: \"#313244\",\n cardStroke: \"#45475a\",\n cardText: \"#cdd6f4\",\n cardShadow: \"rgba(0,0,0,0.35)\",\n legendBg: \"#181825\",\n legendStroke: \"#45475a\",\n};\n\nexport const TIMELINE_TOKENS: Record<ThemeName, TimelineTokens> = {\n default: DEFAULT_TIMELINE,\n monochrome: MONOCHROME_TIMELINE,\n dark: DARK_TIMELINE,\n};\n\nexport function resolveTimelineTheme(name: string): ResolvedTheme<TimelineTokens> {\n const themeName = (name in BASE_THEMES ? name : \"default\") as ThemeName;\n return { ...BASE_THEMES[themeName], ...TIMELINE_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/blockdiagram/parser.ts","../src/diagrams/blockdiagram/layout.ts","../src/diagrams/blockdiagram/renderer.ts","../src/diagrams/blockdiagram/index.ts"],"names":["text","title","i","path"],"mappings":"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","file":"chunk-EPKIJEH7.js","sourcesContent":["import type {\n BlockAST,\n BlockNode,\n BlockEdge,\n SummingJunction,\n BlockRole,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class BlockDiagramParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"BlockDiagramParseError\";\n }\n}\n\nconst ROLE_VALUES = new Set<BlockRole>([\n \"plant\",\n \"controller\",\n \"sensor\",\n \"actuator\",\n \"reference\",\n \"disturbance\",\n \"generic\",\n]);\n\ninterface SignalDecl {\n id: string;\n label: string;\n discrete: boolean;\n}\n\ninterface ParsedAttrs {\n name?: string;\n role?: BlockRole;\n discrete?: boolean;\n label?: string;\n route?: \"above\" | \"below\";\n}\n\nfunction parseAttrs(s: string): ParsedAttrs {\n // Inside [ ... ] — comma-separated key:value or bare flags like \"discrete\"\n const result: ParsedAttrs = {};\n // Split at commas not inside quotes\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n for (const raw of parts) {\n const p = raw.trim();\n if (!p) continue;\n if (p === \"discrete\") {\n result.discrete = true;\n continue;\n }\n if (p.startsWith('\"') && p.endsWith('\"')) {\n result.label = p.slice(1, -1);\n continue;\n }\n const m = p.match(/^(\\w+)\\s*:\\s*(.+)$/);\n if (!m) continue;\n const key = m[1].toLowerCase();\n let val = m[2].trim();\n if (val.startsWith('\"') && val.endsWith('\"')) val = val.slice(1, -1);\n if (key === \"name\") result.name = val;\n else if (key === \"role\") {\n if (ROLE_VALUES.has(val as BlockRole)) result.role = val as BlockRole;\n } else if (key === \"label\") result.label = val;\n else if (key === \"route\") {\n if (val === \"above\" || val === \"below\") result.route = val;\n }\n }\n return result;\n}\n\nexport function parseBlockDiagram(text: string): BlockAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const blocks: BlockNode[] = [];\n const sums: SummingJunction[] = [];\n const connections: BlockEdge[] = [];\n const signals = new Map<string, SignalDecl>();\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = rawLine.replace(/#.*$/, \"\").trim();\n if (!line) continue;\n\n // Header: blockdiagram \"Title\"\n if (/^blockdiagram\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // block: ID = block(\"label\") [role: X, name: \"Y\"]\n const blockMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*block\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (blockMatch) {\n const id = blockMatch[1];\n const label = blockMatch[2];\n const attrs = blockMatch[3] ? parseAttrs(blockMatch[3]) : {};\n const node: BlockNode = { id, label, role: attrs.role ?? \"generic\" };\n if (attrs.route) node.route = attrs.route;\n blocks.push(node);\n continue;\n }\n\n // sum: ID = sum(+a, -b, ...)\n const sumMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*sum\\s*\\(([^)]*)\\)\\s*$/\n );\n if (sumMatch) {\n const id = sumMatch[1];\n const rawInputs = sumMatch[2]\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n const inputs: string[] = [];\n for (const tok of rawInputs) {\n if (tok.startsWith(\"+\") || tok.startsWith(\"-\")) inputs.push(tok);\n else inputs.push(\"+\" + tok);\n }\n sums.push({ id, inputs });\n continue;\n }\n\n // signal: ID = signal(\"label\") [discrete]\n const sigMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*signal\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (sigMatch) {\n const id = sigMatch[1];\n const label = sigMatch[2];\n const attrs = sigMatch[3] ? parseAttrs(sigMatch[3]) : {};\n signals.set(id, { id, label, discrete: !!attrs.discrete });\n continue;\n }\n\n // Connection chain: `A -> B -> C [label_or_attrs]`. Inline `[id] -> [id]` (D2/Mermaid) auto-declares.\n const arrowIdx = line.indexOf(\"->\");\n if (arrowIdx >= 0) {\n let body = line;\n let tailAttrs: ParsedAttrs = {};\n // Trailing `[...]` must be preceded by whitespace, else it's an inline endpoint.\n if (body.endsWith(\"]\")) {\n let bracketStart = -1;\n let depth = 0;\n let inQuote = false;\n for (let i = body.length - 1; i >= 1; i--) {\n const ch = body[i];\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && ch === \"]\") depth++;\n else if (!inQuote && ch === \"[\") {\n depth--;\n if (depth === 0) {\n if (/\\s/.test(body[i - 1] ?? \"\")) bracketStart = i;\n break;\n }\n }\n }\n if (bracketStart >= 0) {\n const inner = body.slice(bracketStart + 1, -1).trim();\n const isBareId = /^[A-Za-z_]\\w*$/.test(inner);\n if (!isBareId) {\n body = body.slice(0, bracketStart).trim();\n if (inner.startsWith('\"') && inner.endsWith('\"') && !inner.slice(1, -1).includes(',')) {\n tailAttrs.label = inner.slice(1, -1);\n } else {\n tailAttrs = parseAttrs(inner);\n }\n }\n }\n }\n const parts = body.split(\"->\").map((x) => x.trim()).filter(Boolean);\n if (parts.length < 2) {\n throw new BlockDiagramParseError(`Invalid connection: ${line}`, lineNo, undefined, line);\n }\n const endpoints = parts.map((p) => {\n const m = /^\\[([A-Za-z_]\\w*)\\]$/.exec(p);\n return m ? m[1] : p;\n });\n for (const ep of endpoints) {\n if (!/^[A-Za-z_]\\w*$/.test(ep)) continue;\n const exists =\n blocks.some((b) => b.id === ep) ||\n sums.some((s) => s.id === ep) ||\n signals.has(ep);\n if (!exists) {\n blocks.push({ id: ep, label: ep, role: \"generic\" });\n }\n }\n for (let i = 0; i < endpoints.length - 1; i++) {\n const from = endpoints[i];\n const to = endpoints[i + 1];\n const isLast = i === endpoints.length - 2;\n const edge: BlockEdge = { from, to };\n if (isLast && tailAttrs.label) edge.label = tailAttrs.label;\n if (isLast && tailAttrs.discrete) edge.discrete = true;\n connections.push(edge);\n }\n continue;\n }\n }\n\n // Post-process: if edge endpoints reference a signal id, inline the signal.\n // A signal is a pass-through label. Merge edges X->sig and sig->Y into X->Y,\n // using signal's label (unless edge already has one) and discrete flag.\n if (signals.size > 0) {\n const merged: BlockEdge[] = [];\n const bySource = new Map<string, BlockEdge[]>();\n const byTarget = new Map<string, BlockEdge[]>();\n for (const e of connections) {\n if (!bySource.has(e.from)) bySource.set(e.from, []);\n bySource.get(e.from)!.push(e);\n if (!byTarget.has(e.to)) byTarget.set(e.to, []);\n byTarget.get(e.to)!.push(e);\n }\n\n const consumed = new Set<BlockEdge>();\n for (const sigId of signals.keys()) {\n const sig = signals.get(sigId)!;\n const incoming = byTarget.get(sigId) ?? [];\n const outgoing = bySource.get(sigId) ?? [];\n // For each incoming/outgoing pair, make a merged edge\n for (const ine of incoming) {\n for (const oute of outgoing) {\n consumed.add(ine);\n consumed.add(oute);\n merged.push({\n from: ine.from,\n to: oute.to,\n label: ine.label ?? oute.label ?? sig.label,\n discrete: sig.discrete || ine.discrete || oute.discrete,\n });\n }\n }\n }\n // Keep edges not consumed\n for (const e of connections) {\n if (!consumed.has(e)) merged.push(e);\n }\n connections.length = 0;\n connections.push(...merged);\n }\n\n return {\n type: \"blockdiagram\",\n title,\n blocks,\n sums,\n connections,\n };\n}\n","import type { BlockAST, BlockEdge, BlockNode, SummingJunction } from \"../../core/types\";\n\nexport interface LaidBlock {\n kind: \"block\";\n id: string;\n label: string;\n role: string;\n x: number;\n y: number;\n width: number;\n height: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidSum {\n kind: \"sum\";\n id: string;\n cx: number;\n cy: number;\n r: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidPort {\n kind: \"port\";\n id: string;\n label: string;\n x: number;\n y: number;\n isInput: boolean;\n hasBranch?: boolean;\n}\n\nexport type LaidNode = LaidBlock | LaidSum | LaidPort;\n\nexport interface LaidEdgePolarity {\n sign: \"+\" | \"-\";\n pin: \"left\" | \"top\" | \"right\" | \"bottom\";\n x: number;\n y: number;\n}\n\nexport interface LaidEdge {\n from: string;\n to: string;\n label?: string;\n discrete: boolean;\n path: string;\n midX: number;\n midY: number;\n isFeedback: boolean;\n /** Polarity sign to draw near the target if target is a sum */\n polarity?: LaidEdgePolarity;\n}\n\nexport interface BlockDiagramLayout {\n width: number;\n height: number;\n nodes: LaidNode[];\n edges: LaidEdge[];\n title?: string;\n /** Offset applied to all y coords (>0 when feedforward rows exist above FWD_Y) */\n topOffset: number;\n}\n\nconst BLOCK_W = 100;\nconst BLOCK_H = 54;\nconst SUM_R = 12;\nconst FWD_Y = 110;\nconst ROW_GAP = 80;\nconst FIRST_ROW_OFFSET = 110;\nconst COL_GAP = 60;\nconst LEFT_PAD = 30;\nconst RIGHT_PAD = 30;\n\ninterface Track {\n /** row index (1, 2, ...); 0 means forward path */\n row: number;\n /** above = y < FWD_Y; below = y > FWD_Y */\n side: \"above\" | \"below\";\n /** Occupied col ranges [minCol, maxCol] for collision detection */\n ranges: Array<[number, number]>;\n}\n\nexport function layoutBlockDiagram(ast: BlockAST): BlockDiagramLayout {\n const nodeIds = new Set<string>();\n for (const b of ast.blocks) nodeIds.add(b.id);\n for (const s of ast.sums) nodeIds.add(s.id);\n for (const e of ast.connections) {\n nodeIds.add(e.from);\n nodeIds.add(e.to);\n }\n\n const outgoing = new Map<string, BlockEdge[]>();\n const incoming = new Map<string, BlockEdge[]>();\n for (const id of nodeIds) {\n outgoing.set(id, []);\n incoming.set(id, []);\n }\n for (const e of ast.connections) {\n outgoing.get(e.from)!.push(e);\n incoming.get(e.to)!.push(e);\n }\n\n // Entry points\n const hasIn = nodeIds.has(\"in\");\n const entries: string[] = [];\n if (hasIn) entries.push(\"in\");\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n if ((incoming.get(id) ?? []).length === 0 && !entries.includes(id)) {\n entries.push(id);\n }\n }\n\n // BFS forward (first-visit col assignment — back-edges become feedback)\n const col = new Map<string, number>();\n const queue: string[] = [];\n for (const e of entries) {\n col.set(e, 0);\n queue.push(e);\n }\n while (queue.length > 0) {\n const cur = queue.shift()!;\n const c = col.get(cur)!;\n for (const edge of outgoing.get(cur) ?? []) {\n if (!col.has(edge.to)) {\n col.set(edge.to, c + 1);\n queue.push(edge.to);\n }\n }\n }\n // Any unreached node\n for (const id of nodeIds) {\n if (!col.has(id)) col.set(id, 1);\n }\n\n // Feedback detection: outgoing edges are ALL going backward\n const isFeedback = new Set<string>();\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n const myCol = col.get(id)!;\n const outs = outgoing.get(id) ?? [];\n if (outs.length === 0) continue;\n const allBack = outs.every((e) => (col.get(e.to) ?? myCol) < myCol);\n if (allBack) isFeedback.add(id);\n }\n\n // For each feedback node, compute loop range [minCol, maxCol]\n const blockById = new Map<string, BlockNode>();\n for (const b of ast.blocks) blockById.set(b.id, b);\n\n interface FbInfo {\n id: string;\n range: [number, number];\n side: \"above\" | \"below\";\n row: number; // depth\n }\n const fbInfos: FbInfo[] = [];\n for (const id of isFeedback) {\n const outs = outgoing.get(id) ?? [];\n const ins = incoming.get(id) ?? [];\n // targets (forward nodes it feeds back into)\n const targetCols = outs.map((e) => col.get(e.to) ?? 0);\n const sourceCols = ins.map((e) => col.get(e.from) ?? 0);\n const minC = Math.min(...targetCols, ...sourceCols);\n const maxC = Math.max(...targetCols, ...sourceCols);\n const bn = blockById.get(id);\n const side: \"above\" | \"below\" = bn?.route === \"above\" ? \"above\" : \"below\";\n fbInfos.push({ id, range: [minC, maxC], side, row: 0 });\n }\n\n // Sort by range width desc (outermost first), break ties by min col\n fbInfos.sort((a, b) => {\n const wa = a.range[1] - a.range[0];\n const wb = b.range[1] - b.range[0];\n if (wa !== wb) return wb - wa;\n return a.range[0] - b.range[0];\n });\n\n // Assign tracks per side, greedy interval-overlap depth\n const tracks: Record<\"above\" | \"below\", Track[]> = { above: [], below: [] };\n for (const fb of fbInfos) {\n let row = 1;\n while (true) {\n // check if any existing block on this (side, row) has overlapping range\n const occupied = tracks[fb.side].find((t) => t.row === row);\n const conflict =\n occupied?.ranges.some(\n ([a, b]) => !(fb.range[1] < a || fb.range[0] > b)\n ) ?? false;\n if (!conflict) {\n if (occupied) occupied.ranges.push(fb.range);\n else\n tracks[fb.side].push({ row, side: fb.side, ranges: [fb.range] });\n fb.row = row;\n break;\n }\n row++;\n }\n }\n\n const maxBelowRow = tracks.below.reduce((m, t) => Math.max(m, t.row), 0);\n const maxAboveRow = tracks.above.reduce((m, t) => Math.max(m, t.row), 0);\n\n // Compute y per (side, row)\n const yFor = (side: \"above\" | \"below\", row: number): number => {\n const step = FIRST_ROW_OFFSET + (row - 1) * ROW_GAP;\n return side === \"above\" ? FWD_Y - step : FWD_Y + step;\n };\n\n // For the feedforward row(s) to have room, shift all y by topOffset\n const topOffset = maxAboveRow > 0 ? (FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP) + 30 : 30;\n const forwardY = FWD_Y + (topOffset - 30);\n\n // Remap y helper\n const rowY = (side: \"above\" | \"below\", row: number): number =>\n yFor(side, row) + (topOffset - 30);\n\n // Normalize columns\n let maxFwdCol = 0;\n for (const id of nodeIds) {\n if (!isFeedback.has(id)) maxFwdCol = Math.max(maxFwdCol, col.get(id) ?? 0);\n }\n const colCount = maxFwdCol + 1;\n const colContent = new Array(colCount).fill(BLOCK_W);\n\n const colX: number[] = [];\n {\n let x = LEFT_PAD;\n for (let i = 0; i < colCount; i++) {\n const w = i === 0 && hasIn ? 30 : colContent[i];\n colX.push(x + w / 2);\n x += w + COL_GAP;\n }\n }\n const totalWidth = colX.length\n ? colX[colX.length - 1] + BLOCK_W / 2 + RIGHT_PAD\n : 400;\n\n // Lookup for feedback row info\n const fbById = new Map<string, FbInfo>();\n for (const f of fbInfos) fbById.set(f.id, f);\n\n const nodes: LaidNode[] = [];\n const branchCount = new Map<string, number>();\n for (const e of ast.connections) {\n branchCount.set(e.from, (branchCount.get(e.from) ?? 0) + 1);\n }\n const hasBranchOf = (id: string) => (branchCount.get(id) ?? 0) > 1;\n\n for (const b of ast.blocks) {\n const c = col.get(b.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(b.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"block\",\n id: b.id,\n label: b.label,\n role: b.role ?? \"generic\",\n x: cx - BLOCK_W / 2,\n y: cy - BLOCK_H / 2,\n width: BLOCK_W,\n height: BLOCK_H,\n hasBranch: hasBranchOf(b.id),\n });\n }\n\n for (const s of ast.sums) {\n const c = col.get(s.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(s.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"sum\",\n id: s.id,\n cx,\n cy,\n r: SUM_R,\n hasBranch: hasBranchOf(s.id),\n });\n }\n\n if (hasIn) {\n nodes.push({\n kind: \"port\",\n id: \"in\",\n label: \"in\",\n x: LEFT_PAD,\n y: forwardY,\n isInput: true,\n hasBranch: hasBranchOf(\"in\"),\n });\n }\n if (nodeIds.has(\"out\")) {\n const outCol = col.get(\"out\") ?? maxFwdCol;\n const cx = colX[Math.min(outCol, colX.length - 1)];\n nodes.push({\n kind: \"port\",\n id: \"out\",\n label: \"out\",\n x: cx,\n y: forwardY,\n isInput: false,\n });\n }\n\n // Anchor lookup\n interface Anchor {\n left: { x: number; y: number };\n right: { x: number; y: number };\n top: { x: number; y: number };\n bottom: { x: number; y: number };\n cx: number;\n cy: number;\n }\n const anchors = new Map<string, Anchor>();\n for (const n of nodes) {\n if (n.kind === \"block\") {\n anchors.set(n.id, {\n left: { x: n.x, y: n.y + n.height / 2 },\n right: { x: n.x + n.width, y: n.y + n.height / 2 },\n top: { x: n.x + n.width / 2, y: n.y },\n bottom: { x: n.x + n.width / 2, y: n.y + n.height },\n cx: n.x + n.width / 2,\n cy: n.y + n.height / 2,\n });\n } else if (n.kind === \"sum\") {\n anchors.set(n.id, {\n left: { x: n.cx - n.r, y: n.cy },\n right: { x: n.cx + n.r, y: n.cy },\n top: { x: n.cx, y: n.cy - n.r },\n bottom: { x: n.cx, y: n.cy + n.r },\n cx: n.cx,\n cy: n.cy,\n });\n } else {\n anchors.set(n.id, {\n left: { x: n.x - 10, y: n.y },\n right: { x: n.x + (n.isInput ? 20 : 0), y: n.y },\n top: { x: n.x, y: n.y - 10 },\n bottom: { x: n.x, y: n.y + 10 },\n cx: n.x,\n cy: n.y,\n });\n }\n }\n\n // Build sum-input-polarity lookup\n const sumPolarity = new Map<string, Map<string, \"+\" | \"-\">>();\n for (const s of ast.sums) {\n const m = new Map<string, \"+\" | \"-\">();\n for (const tok of s.inputs) {\n const sign = tok.startsWith(\"-\") ? \"-\" : \"+\";\n const srcId = tok.replace(/^[+-]/, \"\");\n m.set(srcId, sign);\n }\n sumPolarity.set(s.id, m);\n }\n\n // Build edges\n const edges: LaidEdge[] = [];\n // Track horizontal-track offsets for feedback paths to avoid overlap\n const sumById = new Map<string, SummingJunction>();\n for (const s of ast.sums) sumById.set(s.id, s);\n\n for (const e of ast.connections) {\n const fromA = anchors.get(e.from);\n const toA = anchors.get(e.to);\n if (!fromA || !toA) continue;\n\n const fromFb = fbById.get(e.from);\n const toFb = fbById.get(e.to);\n const fromCol = col.get(e.from) ?? 0;\n const toCol = col.get(e.to) ?? 0;\n\n // Determine pin on target when target is a sum: left (from forward earlier),\n // bottom (from below feedback), top (from above feedforward), or right (rare, output)\n let polarity: LaidEdgePolarity | undefined;\n if (sumById.has(e.to)) {\n const pm = sumPolarity.get(e.to);\n const sign = pm?.get(e.from) ?? \"+\";\n let pin: \"left\" | \"top\" | \"bottom\" | \"right\" = \"left\";\n if (fromFb?.side === \"below\") pin = \"bottom\";\n else if (fromFb?.side === \"above\") pin = \"top\";\n else if (fromCol < toCol) pin = \"left\";\n else pin = \"bottom\";\n const sumNode = nodes.find(\n (n) => n.kind === \"sum\" && n.id === e.to\n ) as LaidSum | undefined;\n if (sumNode) {\n let px = sumNode.cx, py = sumNode.cy;\n if (pin === \"left\") {\n px = sumNode.cx - sumNode.r - 8;\n py = sumNode.cy + 6;\n } else if (pin === \"bottom\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy + sumNode.r + 10;\n } else if (pin === \"top\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy - sumNode.r - 2;\n }\n polarity = { sign, pin, x: px, y: py };\n }\n }\n\n // Route\n let path: string;\n let midX: number, midY: number;\n let isFb = false;\n\n const fromIsFbSide = fromFb?.side;\n const toIsFbSide = toFb?.side;\n\n if (fromIsFbSide && toIsFbSide === fromIsFbSide) {\n // within same feedback row\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"below\") {\n // forward → below feedback: branch down from source.bottom\n const sx = fromA.bottom.x;\n const sy = fromA.bottom.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"above\") {\n // forward → above feedforward: branch up from source.top\n const sx = fromA.top.x;\n const sy = fromA.top.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (fromIsFbSide === \"below\" && !toIsFbSide) {\n // below feedback → forward target (bottom pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (fromIsFbSide === \"above\" && !toIsFbSide) {\n // above feedforward → forward target (top pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.top.x;\n const ty = toA.top.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (toCol < fromCol) {\n // generic back-edge fallback (below)\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n const dipY = Math.max(sy, ty) + 60;\n path = `M ${sx} ${sy} L ${sx} ${dipY} L ${tx} ${dipY} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = dipY + 10;\n isFb = true;\n } else {\n // forward edge\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.left.x;\n const ty = toA.left.y;\n if (Math.abs(sy - ty) < 0.5) {\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n } else {\n const midXH = (sx + tx) / 2;\n path = `M ${sx} ${sy} L ${midXH} ${sy} L ${midXH} ${ty} L ${tx} ${ty}`;\n }\n midX = (sx + tx) / 2;\n midY = sy - 8;\n }\n\n edges.push({\n from: e.from,\n to: e.to,\n label: e.label,\n discrete: !!e.discrete,\n path,\n midX,\n midY,\n isFeedback: isFb,\n polarity,\n });\n }\n\n // Total canvas height: enough for top rows + forward + bottom rows\n const totalTopSpace =\n maxAboveRow > 0\n ? FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP + 60\n : 30;\n const totalBottomSpace =\n maxBelowRow > 0\n ? FIRST_ROW_OFFSET + (maxBelowRow - 1) * ROW_GAP + 60\n : 100;\n const height = Math.max(\n forwardY + totalBottomSpace,\n FWD_Y + 170,\n totalTopSpace + totalBottomSpace\n );\n\n return {\n width: totalWidth,\n height,\n nodes,\n edges,\n title: ast.title,\n topOffset,\n };\n}\n","import type { BlockAST } from \"../../core/types\";\nimport { layoutBlockDiagram } from \"./layout\";\nimport {\n svgRoot,\n defs,\n group,\n el,\n circle,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\n\nconst ROLE_FILL: Record<string, string> = {\n plant: \"#ffffff\",\n controller: \"#E3F2FD\",\n sensor: \"#F3E5F5\",\n actuator: \"#E8F5E9\",\n filter: \"#FFF8E1\",\n reference: \"#ffffff\",\n disturbance: \"#FFF3E0\",\n generic: \"#ffffff\",\n};\n\nexport function renderBlockDiagram(ast: BlockAST): string {\n const layout = layoutBlockDiagram(ast);\n const titleOffset = ast.title ? 26 : 0;\n const { width } = layout;\n const height = layout.height + titleOffset;\n\n const css = `\n.schematex-bd { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-bd-block { stroke: #333; stroke-width: 2; }\n.schematex-bd-tf { font: italic 14px serif; fill: #111; }\n.schematex-bd-block-name { font: 10px sans-serif; fill: #666; }\n.schematex-bd-sum { fill: #fff; stroke: #333; stroke-width: 2; }\n.schematex-bd-sum-sign { font: bold 11px sans-serif; fill: #333; }\n.schematex-bd-signal { stroke: #333; stroke-width: 2; fill: none; }\n.schematex-bd-signal-discrete { stroke: #333; stroke-width: 2; fill: none; stroke-dasharray: 6 4; }\n.schematex-bd-signal-label { font: italic 12px serif; fill: #333; }\n.schematex-bd-port-label { font: italic 13px serif; fill: #111; }\n.schematex-bd-title { font: bold 15px sans-serif; fill: #111; }\n.schematex-bd-branch { fill: #333; stroke: none; }\n`.trim();\n\n const arrowDef = el(\n \"marker\",\n {\n id: \"lt-bd-arrow\",\n markerWidth: 10,\n markerHeight: 8,\n refX: 9,\n refY: 4,\n orient: \"auto\",\n },\n [el(\"polygon\", { points: \"0 0, 10 4, 0 8\", fill: \"#333\" })]\n );\n\n const nodeSvgs: string[] = [];\n const edgeSvgs: string[] = [];\n const branchSvgs: string[] = [];\n\n for (const n of layout.nodes) {\n if (n.kind === \"block\") {\n const fill = ROLE_FILL[n.role] ?? \"#fff\";\n nodeSvgs.push(\n group(\n {\n transform: `translate(${n.x}, ${n.y})`,\n \"data-block-id\": n.id,\n \"data-block-role\": n.role,\n },\n [\n el(\"rect\", {\n width: n.width,\n height: n.height,\n fill,\n class: \"schematex-bd-block\",\n rx: 2,\n }),\n text(\n {\n x: n.width / 2,\n y: n.height / 2 + 5,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-tf\",\n },\n n.label\n ),\n ]\n )\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.x + n.width,\n cy: n.y + n.height / 2,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"sum\") {\n nodeSvgs.push(\n group({ \"data-sum-id\": n.id }, [\n circle({\n cx: n.cx,\n cy: n.cy,\n r: n.r,\n class: \"schematex-bd-sum\",\n }),\n ])\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.cx + n.r,\n cy: n.cy,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"port\") {\n nodeSvgs.push(\n group({ \"data-port-id\": n.id }, [\n text(\n {\n x: n.isInput ? n.x - 4 : n.x + 4,\n y: n.y + 4,\n \"text-anchor\": n.isInput ? \"end\" : \"start\",\n class: \"schematex-bd-port-label\",\n },\n n.label\n ),\n ])\n );\n }\n }\n\n for (const e of layout.edges) {\n const cls = e.discrete\n ? \"schematex-bd-signal-discrete\"\n : \"schematex-bd-signal\";\n edgeSvgs.push(\n pathEl({\n d: e.path,\n class: cls,\n \"marker-end\": \"url(#lt-bd-arrow)\",\n \"data-from\": e.from,\n \"data-to\": e.to,\n })\n );\n if (e.label) {\n edgeSvgs.push(\n text(\n {\n x: e.midX,\n y: e.midY,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-signal-label\",\n },\n e.label\n )\n );\n }\n if (e.polarity) {\n edgeSvgs.push(\n text(\n {\n x: e.polarity.x,\n y: e.polarity.y,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-sum-sign\",\n },\n e.polarity.sign === \"-\" ? \"−\" : \"+\"\n )\n );\n }\n }\n\n const titleSvg = ast.title\n ? text(\n {\n x: width / 2,\n y: 18,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-title\",\n },\n ast.title\n )\n : \"\";\n\n return svgRoot(\n {\n class: \"schematex-bd\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"blockdiagram\",\n },\n [\n titleEl(ast.title ?? \"Block Diagram\"),\n desc(\n `Block diagram with ${ast.blocks.length} blocks, ${ast.sums.length} summing junctions, ${ast.connections.length} signals`\n ),\n defs([el(\"style\", {}, css), arrowDef]),\n titleSvg,\n group({ transform: `translate(0, ${titleOffset})` }, [\n group({ class: \"schematex-bd-signals\" }, edgeSvgs),\n group({ class: \"schematex-bd-nodes\" }, nodeSvgs),\n group({ class: \"schematex-bd-branches\" }, branchSvgs),\n ]),\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseBlockDiagram } from \"./parser\";\nimport { renderBlockDiagram } from \"./renderer\";\n\nexport const blockdiagram: DiagramPlugin = {\n type: \"blockdiagram\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"blockdiagram\");\n },\n parse: parseBlockDiagram,\n\n render(text: string): string {\n const ast = parseBlockDiagram(text);\n return renderBlockDiagram(ast);\n },\n};\n\nexport { parseBlockDiagram } from \"./parser\";\nexport { renderBlockDiagram } from \"./renderer\";\nexport { layoutBlockDiagram } from \"./layout\";\n"]}