schematex 0.1.1 → 0.2.2
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.
- package/README.md +130 -15
- package/dist/api-bQZ98gkJ.d.cts +22 -0
- package/dist/api-bQZ98gkJ.d.ts +22 -0
- package/dist/browser.cjs +46 -0
- package/dist/browser.cjs.map +1 -0
- package/dist/browser.d.cts +27 -0
- package/dist/browser.d.ts +27 -0
- package/dist/browser.js +40 -0
- package/dist/browser.js.map +1 -0
- package/dist/{chunk-IX554O5K.js → chunk-2VNMKOUO.js} +90 -6
- package/dist/chunk-2VNMKOUO.js.map +1 -0
- package/dist/{chunk-LMFSHK45.js → chunk-4KYW63IK.js} +4 -3
- package/dist/{chunk-LMFSHK45.js.map → chunk-4KYW63IK.js.map} +1 -1
- package/dist/{chunk-FGPTCDUT.cjs → chunk-4S2WILLW.cjs} +5 -4
- package/dist/chunk-4S2WILLW.cjs.map +1 -0
- package/dist/{chunk-4G7ZIBHN.js → chunk-5SH5NUDW.js} +3 -2
- package/dist/{chunk-4G7ZIBHN.js.map → chunk-5SH5NUDW.js.map} +1 -1
- package/dist/{chunk-PDPHRZZT.js → chunk-5UV5VQ7J.js} +4 -3
- package/dist/chunk-5UV5VQ7J.js.map +1 -0
- package/dist/{chunk-VFQCTXOX.js → chunk-5YYAYW67.js} +4 -3
- package/dist/chunk-5YYAYW67.js.map +1 -0
- package/dist/{chunk-HGHWCB6K.js → chunk-6YMQSTFF.js} +4 -3
- package/dist/chunk-6YMQSTFF.js.map +1 -0
- package/dist/chunk-7HKXU7J2.cjs +4838 -0
- package/dist/chunk-7HKXU7J2.cjs.map +1 -0
- package/dist/{chunk-UHLYS3W5.cjs → chunk-7IRT3LOY.cjs} +5 -4
- package/dist/{chunk-UHLYS3W5.cjs.map → chunk-7IRT3LOY.cjs.map} +1 -1
- package/dist/{chunk-U5GGE6PJ.js → chunk-CJ2A3UEQ.js} +4 -3
- package/dist/chunk-CJ2A3UEQ.js.map +1 -0
- package/dist/chunk-CXHPP5BL.cjs +1880 -0
- package/dist/chunk-CXHPP5BL.cjs.map +1 -0
- package/dist/{chunk-N7KOXOMX.cjs → chunk-D7EHZFK4.cjs} +90 -5
- package/dist/chunk-D7EHZFK4.cjs.map +1 -0
- package/dist/{chunk-FDLZEKEB.js → chunk-GEPBET4L.js} +3 -2
- package/dist/chunk-GEPBET4L.js.map +1 -0
- package/dist/{chunk-4DBRNOPA.cjs → chunk-ISACNVFE.cjs} +5 -4
- package/dist/{chunk-4DBRNOPA.cjs.map → chunk-ISACNVFE.cjs.map} +1 -1
- package/dist/{chunk-ROFLJ74T.js → chunk-JDTB7IKL.js} +4 -3
- package/dist/chunk-JDTB7IKL.js.map +1 -0
- package/dist/{chunk-47ZC6EMJ.js → chunk-LCR3KOJV.js} +4 -3
- package/dist/{chunk-47ZC6EMJ.js.map → chunk-LCR3KOJV.js.map} +1 -1
- package/dist/{chunk-7FZSPKX3.cjs → chunk-LKOBOVNL.cjs} +6 -5
- package/dist/chunk-LKOBOVNL.cjs.map +1 -0
- package/dist/{chunk-34X3ZJ6E.cjs → chunk-LXNFVHDT.cjs} +3 -2
- package/dist/{chunk-34X3ZJ6E.cjs.map → chunk-LXNFVHDT.cjs.map} +1 -1
- package/dist/{chunk-XX4BKS7Y.js → chunk-M5B2UUNW.js} +4 -3
- package/dist/chunk-M5B2UUNW.js.map +1 -0
- package/dist/{chunk-XXU36667.js → chunk-PGALHQFF.js} +4 -3
- package/dist/chunk-PGALHQFF.js.map +1 -0
- package/dist/{chunk-ZX7QKZK2.cjs → chunk-QR7VTCI4.cjs} +28 -27
- package/dist/chunk-QR7VTCI4.cjs.map +1 -0
- package/dist/{chunk-3FTUWAXK.cjs → chunk-QSQX77S2.cjs} +5 -4
- package/dist/chunk-QSQX77S2.cjs.map +1 -0
- package/dist/chunk-UUPYTUGR.js +4833 -0
- package/dist/chunk-UUPYTUGR.js.map +1 -0
- package/dist/{chunk-BE5HNDA5.cjs → chunk-WYFXOXVK.cjs} +5 -4
- package/dist/{chunk-BE5HNDA5.cjs.map → chunk-WYFXOXVK.cjs.map} +1 -1
- package/dist/{chunk-5C7DPDHQ.js → chunk-X2BQKXMA.js} +28 -27
- package/dist/chunk-X2BQKXMA.js.map +1 -0
- package/dist/{chunk-XQ52ICHU.cjs → chunk-X7RPFTTR.cjs} +14 -13
- package/dist/chunk-X7RPFTTR.cjs.map +1 -0
- package/dist/{chunk-S6BK5DB6.cjs → chunk-XHZ7GXP2.cjs} +13 -12
- package/dist/chunk-XHZ7GXP2.cjs.map +1 -0
- package/dist/{chunk-DS47NTWZ.cjs → chunk-XVCAOGFL.cjs} +11 -10
- package/dist/chunk-XVCAOGFL.cjs.map +1 -0
- package/dist/{chunk-D4JTSPOL.js → chunk-YN467EEQ.js} +4 -3
- package/dist/chunk-YN467EEQ.js.map +1 -0
- package/dist/{chunk-CZRM7LT7.js → chunk-YQANC7HQ.js} +4 -3
- package/dist/chunk-YQANC7HQ.js.map +1 -0
- package/dist/{chunk-NYCIK4SU.cjs → chunk-YXIIWLLB.cjs} +13 -12
- package/dist/chunk-YXIIWLLB.cjs.map +1 -0
- package/dist/chunk-Z3WOHHG3.js +1873 -0
- package/dist/chunk-Z3WOHHG3.js.map +1 -0
- package/dist/{chunk-2UKC6ZCY.cjs → chunk-Z63XPA2V.cjs} +12 -11
- package/dist/chunk-Z63XPA2V.cjs.map +1 -0
- package/dist/{chunk-V6WO7RK7.cjs → chunk-ZNOD4VZT.cjs} +5 -4
- package/dist/chunk-ZNOD4VZT.cjs.map +1 -0
- package/dist/{chunk-3J7TFUOC.js → chunk-ZNZIL244.js} +4 -3
- package/dist/{chunk-3J7TFUOC.js.map → chunk-ZNZIL244.js.map} +1 -1
- package/dist/{chunk-2MQWZ2XY.cjs → chunk-ZO77FHBF.cjs} +3 -2
- package/dist/chunk-ZO77FHBF.cjs.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +6 -6
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/export.cjs +87 -0
- package/dist/export.cjs.map +1 -0
- package/dist/export.d.cts +38 -0
- package/dist/export.d.ts +38 -0
- package/dist/export.js +83 -0
- package/dist/export.js.map +1 -0
- package/dist/{index-BXefHVce.d.cts → index-SSGpCggE.d.cts} +52 -3
- package/dist/{index-BSlza1YY.d.ts → index-ga04CTBI.d.ts} +52 -3
- package/dist/index.cjs +65 -1948
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -12
- package/dist/index.d.ts +7 -12
- package/dist/index.js +19 -1942
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +56 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +24 -0
- package/dist/react.d.ts +24 -0
- package/dist/react.js +54 -0
- package/dist/react.js.map +1 -0
- package/dist/{types-DqfcYkcY.d.ts → types-BcPhMdHd.d.cts} +6 -2
- package/dist/{types-DqfcYkcY.d.cts → types-BcPhMdHd.d.ts} +6 -2
- package/package.json +34 -4
- package/dist/chunk-2MQWZ2XY.cjs.map +0 -1
- package/dist/chunk-2UKC6ZCY.cjs.map +0 -1
- package/dist/chunk-3FTUWAXK.cjs.map +0 -1
- package/dist/chunk-5C7DPDHQ.js.map +0 -1
- package/dist/chunk-7FZSPKX3.cjs.map +0 -1
- package/dist/chunk-ADOXGKAK.js +0 -1251
- package/dist/chunk-ADOXGKAK.js.map +0 -1
- package/dist/chunk-CZRM7LT7.js.map +0 -1
- package/dist/chunk-D4JTSPOL.js.map +0 -1
- package/dist/chunk-DS47NTWZ.cjs.map +0 -1
- package/dist/chunk-FDLZEKEB.js.map +0 -1
- package/dist/chunk-FGPTCDUT.cjs.map +0 -1
- package/dist/chunk-HGHWCB6K.js.map +0 -1
- package/dist/chunk-IX554O5K.js.map +0 -1
- package/dist/chunk-MDICUK6F.cjs +0 -1258
- package/dist/chunk-MDICUK6F.cjs.map +0 -1
- package/dist/chunk-N7KOXOMX.cjs.map +0 -1
- package/dist/chunk-NYCIK4SU.cjs.map +0 -1
- package/dist/chunk-PDPHRZZT.js.map +0 -1
- package/dist/chunk-ROFLJ74T.js.map +0 -1
- package/dist/chunk-S6BK5DB6.cjs.map +0 -1
- package/dist/chunk-U5GGE6PJ.js.map +0 -1
- package/dist/chunk-V6WO7RK7.cjs.map +0 -1
- package/dist/chunk-VFQCTXOX.js.map +0 -1
- package/dist/chunk-XQ52ICHU.cjs.map +0 -1
- package/dist/chunk-XX4BKS7Y.js.map +0 -1
- package/dist/chunk-XXU36667.js.map +0 -1
- package/dist/chunk-ZX7QKZK2.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
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-X2BQKXMA.js","sourcesContent":["import type {\n SLDAST,\n SLDNode,\n SLDNodeType,\n SLDConnection,\n} from \"../../core/types\";\n\nexport class SLDParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SLDParseError\";\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\nfunction stripComment(s: string): string {\n // remove # comments (outside quotes)\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\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 m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\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 nodeType = nodeMatch[2] as SLDNodeType;\n if (!NODE_TYPES.has(nodeType)) {\n throw new SLDParseError(\n `Unknown node type \"${nodeType}\" for \"${id}\" (line: ${line})`\n );\n }\n if (nodeMap.has(id)) {\n throw new SLDParseError(`Duplicate node id \"${id}\"`);\n }\n const node: SLDNode = { id, nodeType };\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: ${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 { background: ${t.bg}; 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 { parseSLDDSL } from \"./parser\";\nimport { renderSLD } from \"./renderer\";\n\nexport const sld: DiagramPlugin = {\n type: \"sld\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().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,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
|
|
4
4
|
var chunkHDKDQAEQ_cjs = require('./chunk-HDKDQAEQ.cjs');
|
|
5
5
|
|
|
6
6
|
// src/diagrams/phylo/parser.ts
|
|
@@ -628,22 +628,22 @@ function buildCSS(ast, t) {
|
|
|
628
628
|
.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;
|
|
629
629
|
});
|
|
630
630
|
return `
|
|
631
|
-
.schematex-phylo {${
|
|
631
|
+
.schematex-phylo {${chunkD7EHZFK4_cjs.cssCustomProperties(t)}
|
|
632
632
|
font-family: system-ui, -apple-system, sans-serif;
|
|
633
633
|
background: ${t.bg};
|
|
634
634
|
}
|
|
635
|
-
.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${
|
|
636
|
-
.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${
|
|
637
|
-
.schematex-phylo-tip-label { font-size: ${
|
|
635
|
+
.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; stroke-linecap: round; }
|
|
636
|
+
.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; }
|
|
637
|
+
.schematex-phylo-tip-label { font-size: ${chunkD7EHZFK4_cjs.FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }
|
|
638
638
|
.schematex-phylo-tip-label-italic { font-style: italic; }
|
|
639
|
-
.schematex-phylo-support-label { font-size: ${
|
|
639
|
+
.schematex-phylo-support-label { font-size: ${chunkD7EHZFK4_cjs.FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }
|
|
640
640
|
.schematex-phylo-support-dot { stroke: none; }
|
|
641
|
-
.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${
|
|
641
|
+
.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; }
|
|
642
642
|
.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }
|
|
643
|
-
.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${
|
|
644
|
-
.schematex-phylo-title { font-size: ${
|
|
643
|
+
.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.thin}; }
|
|
644
|
+
.schematex-phylo-title { font-size: ${chunkD7EHZFK4_cjs.FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }
|
|
645
645
|
.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }
|
|
646
|
-
.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${
|
|
646
|
+
.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; }
|
|
647
647
|
${cladeColors.join("\n")}
|
|
648
648
|
`.trim();
|
|
649
649
|
}
|
|
@@ -740,7 +740,7 @@ function renderCladeBackgrounds(layout, t) {
|
|
|
740
740
|
}
|
|
741
741
|
function renderPhylo(layout) {
|
|
742
742
|
const { ast, nodes, branches } = layout;
|
|
743
|
-
const t =
|
|
743
|
+
const t = chunkD7EHZFK4_cjs.resolveBiologyTheme(ast.metadata?.theme ?? "default");
|
|
744
744
|
const css = buildCSS(ast, t);
|
|
745
745
|
const titleOffset = ast.title ? 30 : 0;
|
|
746
746
|
const totalHeight = layout.height + titleOffset;
|
|
@@ -879,6 +879,7 @@ var phylo = {
|
|
|
879
879
|
const firstLine = text2.trim().split("\n")[0]?.trim().toLowerCase() ?? "";
|
|
880
880
|
return firstLine === "phylo" || firstLine.startsWith("phylo ");
|
|
881
881
|
},
|
|
882
|
+
parse: parsePhylo,
|
|
882
883
|
render(text2) {
|
|
883
884
|
const ast = parsePhylo(text2);
|
|
884
885
|
const layout = layoutPhylo(ast);
|
|
@@ -891,5 +892,5 @@ exports.layoutPhylo = layoutPhylo;
|
|
|
891
892
|
exports.parsePhylo = parsePhylo;
|
|
892
893
|
exports.phylo = phylo;
|
|
893
894
|
exports.renderPhylo = renderPhylo;
|
|
894
|
-
//# sourceMappingURL=chunk-
|
|
895
|
-
//# sourceMappingURL=chunk-
|
|
895
|
+
//# sourceMappingURL=chunk-X7RPFTTR.cjs.map
|
|
896
|
+
//# sourceMappingURL=chunk-X7RPFTTR.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/phylo/parser.ts","../src/diagrams/phylo/layout.ts","../src/diagrams/phylo/renderer.ts","../src/diagrams/phylo/index.ts"],"names":["name","num","line","children","idx","text","title","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","group","rect","resolveBiologyTheme","path","circle","desc","el","svgRoot"],"mappings":"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","file":"chunk-X7RPFTTR.cjs","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\n\nexport class PhyloParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"PhyloParseError\";\n }\n}\n\n// ─── Newick Parser ──────────────────────────────────────────\n\nlet _pos = 0;\nlet _src = \"\";\nlet _nextId = 0;\n\nfunction genId(): string {\n return `_n${_nextId++}`;\n}\n\nfunction peek(): string {\n return _src[_pos] ?? \"\";\n}\n\nfunction advance(): string {\n return _src[_pos++] ?? \"\";\n}\n\nfunction skipWhitespace(): void {\n while (_pos < _src.length && /\\s/.test(_src[_pos])) _pos++;\n}\n\nfunction parseNewickName(): string {\n skipWhitespace();\n if (peek() === \"'\") {\n advance();\n let name = \"\";\n while (_pos < _src.length) {\n if (peek() === \"'\") {\n advance();\n if (peek() === \"'\") {\n name += \"'\";\n advance();\n } else {\n break;\n }\n } else {\n name += advance();\n }\n }\n return name;\n }\n let name = \"\";\n while (_pos < _src.length && !/[\\s():,;[\\]']/.test(_src[_pos])) {\n name += advance();\n }\n return name;\n}\n\nfunction parseNewickLength(): number | undefined {\n skipWhitespace();\n if (peek() !== \":\") return undefined;\n advance();\n skipWhitespace();\n let numStr = \"\";\n while (_pos < _src.length && /[0-9eE.+-]/.test(_src[_pos])) {\n numStr += advance();\n }\n if (!numStr) return undefined;\n const val = Number(numStr);\n return Number.isNaN(val) ? undefined : val;\n}\n\nfunction parseNHX(): { support?: number; nhx?: Record<string, string> } | undefined {\n skipWhitespace();\n if (peek() !== \"[\") return undefined;\n const start = _pos;\n advance();\n let content = \"\";\n let depth = 1;\n while (_pos < _src.length && depth > 0) {\n if (peek() === \"[\") depth++;\n if (peek() === \"]\") depth--;\n if (depth > 0) content += advance();\n else advance();\n }\n if (content.startsWith(\"&&NHX:\")) {\n const pairs = content.slice(6).split(\":\");\n const nhx: Record<string, string> = {};\n let support: number | undefined;\n for (const pair of pairs) {\n const eq = pair.indexOf(\"=\");\n if (eq === -1) continue;\n const key = pair.slice(0, eq);\n const val = pair.slice(eq + 1);\n nhx[key] = val;\n if (key === \"B\") {\n const num = Number(val);\n if (!Number.isNaN(num)) support = num;\n }\n }\n return { support, nhx };\n }\n // Plain bootstrap value in brackets like [95]\n const num = Number(content.trim());\n if (!Number.isNaN(num) && content.trim().length > 0) {\n return { support: num };\n }\n // Unknown bracket content — rewind\n _pos = start;\n return undefined;\n}\n\nfunction parseNewickSubtree(): PhyloNode {\n skipWhitespace();\n let children: PhyloNode[] = [];\n\n if (peek() === \"(\") {\n advance();\n children = [];\n children.push(parseNewickSubtree());\n skipWhitespace();\n while (peek() === \",\") {\n advance();\n children.push(parseNewickSubtree());\n skipWhitespace();\n }\n skipWhitespace();\n if (peek() === \")\") advance();\n }\n\n const name = parseNewickName();\n const nhxData = parseNHX();\n const branchLength = parseNewickLength();\n // NHX can also appear after length\n const nhxData2 = nhxData ? undefined : parseNHX();\n const merged = nhxData ?? nhxData2;\n\n const isLeaf = children.length === 0;\n const id = name || genId();\n\n return {\n id,\n label: name || undefined,\n branchLength,\n support: merged?.support,\n children,\n isLeaf,\n nhx: merged?.nhx,\n };\n}\n\nexport function parseNewick(newick: string): PhyloNode {\n _pos = 0;\n _src = newick.trim();\n _nextId = 0;\n\n if (_src.endsWith(\";\")) {\n _src = _src.slice(0, -1);\n }\n\n const root = parseNewickSubtree();\n return root;\n}\n\n// ─── Indent DSL Parser ──────────────────────────────────────\n\ninterface IndentLine {\n indent: number;\n name: string;\n branchLength?: number;\n support?: number;\n}\n\nfunction parseIndentTree(lines: string[]): PhyloNode {\n _nextId = 0;\n const parsed: IndentLine[] = [];\n\n for (const raw of lines) {\n if (!raw.trim() || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.search(/\\S/);\n const content = raw.trim();\n\n let name: string;\n let branchLength: number | undefined;\n let support: number | undefined;\n\n // Check for support value [N]\n let contentClean = content;\n const supportMatch = contentClean.match(/\\[(\\d+(?:\\.\\d+)?)\\]\\s*$/);\n if (supportMatch) {\n support = Number(supportMatch[1]);\n contentClean = contentClean.slice(0, supportMatch.index).trim();\n }\n\n // \"Name: length\" or \":length\" or \"Name:\" or \"Name\"\n const colonIdx = contentClean.indexOf(\":\");\n if (colonIdx === -1) {\n name = contentClean;\n } else {\n name = contentClean.slice(0, colonIdx).trim();\n const lenStr = contentClean.slice(colonIdx + 1).trim();\n if (lenStr) {\n const num = Number(lenStr);\n if (!Number.isNaN(num)) branchLength = num;\n }\n }\n\n parsed.push({ indent, name, branchLength, support });\n }\n\n if (parsed.length === 0) {\n throw new PhyloParseError(\"Empty indent tree definition\");\n }\n\n function buildTree(startIdx: number, parentIndent: number): { node: PhyloNode; nextIdx: number } {\n const line = parsed[startIdx];\n const children: PhyloNode[] = [];\n let idx = startIdx + 1;\n\n while (idx < parsed.length && parsed[idx].indent > parentIndent) {\n if (parsed[idx].indent === line.indent + 2 || parsed[idx].indent > line.indent) {\n const childIndent = parsed[idx].indent;\n const result = buildTree(idx, childIndent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const id = line.name || genId();\n return {\n node: {\n id,\n label: line.name || undefined,\n branchLength: line.branchLength,\n support: line.support,\n children,\n isLeaf: children.length === 0,\n },\n nextIdx: idx,\n };\n }\n\n // Build from the first line\n const rootLine = parsed[0];\n const rootIndent = rootLine.indent;\n const children: PhyloNode[] = [];\n let idx = 1;\n\n while (idx < parsed.length) {\n if (parsed[idx].indent > rootIndent) {\n const result = buildTree(idx, parsed[idx].indent);\n children.push(result.node);\n idx = result.nextIdx;\n } else {\n break;\n }\n }\n\n const rootId = rootLine.name || genId();\n return {\n id: rootId,\n label: rootLine.name || undefined,\n branchLength: rootLine.branchLength,\n support: rootLine.support,\n children,\n isLeaf: children.length === 0,\n };\n}\n\n// ─── Main Document Parser ───────────────────────────────────\n\nfunction parseHeaderProps(propsStr: string): {\n layout: PhyloLayout;\n mode: PhyloMode;\n unrooted: boolean;\n branchWidth?: number;\n openAngle?: number;\n mrsd?: string;\n} {\n const result: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n\n const pairs = propsStr.split(\",\").map((s) => s.trim());\n for (const pair of pairs) {\n if (pair === \"unrooted\") {\n result.unrooted = true;\n continue;\n }\n const colonIdx = pair.indexOf(\":\");\n if (colonIdx === -1) continue;\n const key = pair.slice(0, colonIdx).trim();\n const val = pair.slice(colonIdx + 1).trim().replace(/^[\"']|[\"']$/g, \"\");\n\n switch (key) {\n case \"layout\":\n if ([\"rectangular\", \"slanted\", \"circular\", \"unrooted\"].includes(val)) {\n result.layout = val as PhyloLayout;\n }\n break;\n case \"mode\":\n if ([\"phylogram\", \"cladogram\", \"chronogram\"].includes(val)) {\n result.mode = val as PhyloMode;\n }\n break;\n case \"branch-width\":\n result.branchWidth = Number(val);\n break;\n case \"openAngle\":\n result.openAngle = Number(val);\n break;\n case \"mrsd\":\n result.mrsd = val;\n break;\n }\n }\n\n if (result.layout === \"unrooted\") {\n result.unrooted = true;\n }\n\n return result;\n}\n\nfunction parseCladeLine(line: string): CladeDef | null {\n // clade ID = (member1, member2, ...) [color: \"#hex\", label: \"text\", highlight: mode]\n const match = line.match(\n /^clade\\s+(\\S+)\\s*=\\s*\\(([^)]+)\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (!match) return null;\n\n const id = match[1];\n const members = match[2].split(\",\").map((s) => s.trim()).filter(Boolean);\n const propsStr = match[3] ?? \"\";\n\n let color: string | undefined;\n let label: string | undefined;\n let highlight: CladeHighlightMode | undefined;\n\n if (propsStr) {\n const colorMatch = propsStr.match(/color:\\s*\"([^\"]+)\"/);\n if (colorMatch) color = colorMatch[1];\n const labelMatch = propsStr.match(/label:\\s*\"([^\"]+)\"/);\n if (labelMatch) label = labelMatch[1];\n const hlMatch = propsStr.match(/highlight:\\s*(\\w+)/);\n if (hlMatch && [\"branch\", \"background\", \"both\"].includes(hlMatch[1])) {\n highlight = hlMatch[1] as CladeHighlightMode;\n }\n }\n\n return { id, members, color, label, highlight };\n}\n\nexport function parsePhylo(text: string): PhyloTreeAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header: phylo \"title\" [props]\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"phylo\")) {\n throw new PhyloParseError(\"Phylo document must start with 'phylo'\");\n }\n lineIdx++;\n\n let title: string | undefined;\n const titleMatch = headerLine.match(/\"([^\"]+)\"/);\n if (titleMatch) title = titleMatch[1];\n\n let headerProps: ReturnType<typeof parseHeaderProps> = {\n layout: \"rectangular\",\n mode: \"phylogram\",\n unrooted: false,\n };\n const propsMatch = headerLine.match(/\\[([^\\]]+)\\]/);\n if (propsMatch) {\n headerProps = parseHeaderProps(propsMatch[1]);\n }\n\n // Parse body: newick, indent tree, scale, outgroup, clade definitions\n let root: PhyloNode | null = null;\n let scaleLabel: string | undefined;\n let outgroup: string | undefined;\n const clades: CladeDef[] = [];\n const indentLines: string[] = [];\n let inIndentTree = false;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Newick definition\n if (trimmed.startsWith(\"newick:\")) {\n const newickStr = trimmed.slice(7).trim().replace(/^[\"']|[\"']$/g, \"\");\n root = parseNewick(newickStr);\n inIndentTree = false;\n continue;\n }\n\n // Scale definition\n if (trimmed.startsWith(\"scale\")) {\n const scaleMatch = trimmed.match(/scale\\s+\"([^\"]+)\"/);\n if (scaleMatch) {\n scaleLabel = scaleMatch[1];\n } else {\n scaleLabel = trimmed.slice(5).trim().replace(/^[\"']|[\"']$/g, \"\") || \"substitutions/site\";\n }\n continue;\n }\n\n // Outgroup\n if (trimmed.startsWith(\"outgroup:\")) {\n outgroup = trimmed.slice(9).trim();\n continue;\n }\n\n // Clade definition\n if (trimmed.startsWith(\"clade \")) {\n const clade = parseCladeLine(trimmed);\n if (clade) clades.push(clade);\n continue;\n }\n\n // Style line (alternative props)\n if (trimmed.startsWith(\"style\")) {\n const styleProps = trimmed.match(/\\[([^\\]]+)\\]/);\n if (styleProps) {\n headerProps = { ...headerProps, ...parseHeaderProps(styleProps[1]) };\n }\n continue;\n }\n\n // Indent tree definition\n if (trimmed.endsWith(\":\") && (trimmed === \"root:\" || !trimmed.includes(\" \"))) {\n inIndentTree = true;\n indentLines.push(raw);\n continue;\n }\n\n if (inIndentTree) {\n indentLines.push(raw);\n continue;\n }\n }\n\n // Parse indent tree if present and no Newick was found\n if (!root && indentLines.length > 0) {\n root = parseIndentTree(indentLines);\n }\n\n if (!root) {\n throw new PhyloParseError(\"No tree definition found (newick: or indent tree)\");\n }\n\n return {\n type: \"phylo\",\n title,\n root,\n unrooted: headerProps.unrooted,\n layout: headerProps.layout,\n mode: headerProps.mode,\n clades,\n scaleLabel,\n mrsd: headerProps.mrsd,\n outgroup,\n metadata: {},\n };\n}\n","import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayoutNode,\n} from \"../../core/types\";\n\nexport interface PhyloLayoutResult {\n width: number;\n height: number;\n nodes: PhyloLayoutNode[];\n /** Branch paths: { path, cladeId?, isConnector } */\n branches: PhyloBranch[];\n ast: PhyloTreeAST;\n scale: number;\n}\n\nexport interface PhyloBranch {\n path: string;\n fromId: string;\n toId: string;\n /** Clade id if this branch belongs to a highlighted clade */\n cladeId?: string;\n /** Is this a vertical/arc connector (no length meaning) vs horizontal branch */\n isConnector: boolean;\n}\n\n// ─── Tree Utilities ─────────────────────────────────────────\n\nfunction collectLeaves(node: PhyloNode): PhyloNode[] {\n if (node.isLeaf) return [node];\n const leaves: PhyloNode[] = [];\n for (const child of node.children) {\n leaves.push(...collectLeaves(child));\n }\n return leaves;\n}\n\nfunction maxRootToTip(node: PhyloNode, distSoFar: number): number {\n if (node.isLeaf) return distSoFar;\n let maxDist = distSoFar;\n for (const child of node.children) {\n const childDist = maxRootToTip(child, distSoFar + (child.branchLength ?? 0));\n if (childDist > maxDist) maxDist = childDist;\n }\n return maxDist;\n}\n\nfunction maxDepth(node: PhyloNode): number {\n if (node.isLeaf) return 0;\n let max = 0;\n for (const child of node.children) {\n const d = maxDepth(child) + 1;\n if (d > max) max = d;\n }\n return max;\n}\n\nfunction estimateLabelWidth(node: PhyloNode): number {\n const label = node.label ?? node.id;\n return label.length * 7.2 + 6;\n}\n\n// ─── Clade Membership ───────────────────────────────────────\n\nfunction buildCladeMap(\n ast: PhyloTreeAST\n): Map<string, string> {\n const branchToCladeMap = new Map<string, string>();\n\n for (const clade of ast.clades) {\n const memberSet = new Set(clade.members);\n markCladeBranches(ast.root, memberSet, clade.id, branchToCladeMap);\n }\n\n return branchToCladeMap;\n}\n\nfunction markCladeBranches(\n node: PhyloNode,\n memberSet: Set<string>,\n cladeId: string,\n result: Map<string, string>\n): boolean {\n if (node.isLeaf) {\n return memberSet.has(node.id);\n }\n\n const childResults: boolean[] = [];\n for (const child of node.children) {\n childResults.push(markCladeBranches(child, memberSet, cladeId, result));\n }\n\n const allIn = childResults.every(Boolean);\n const anyIn = childResults.some(Boolean);\n\n if (allIn && anyIn) {\n for (const child of node.children) {\n result.set(child.id, cladeId);\n }\n return true;\n }\n\n // Partial — mark only children that are fully within\n for (let i = 0; i < node.children.length; i++) {\n if (childResults[i]) {\n result.set(node.children[i].id, cladeId);\n }\n }\n\n return false;\n}\n\n// ─── Rectangular Phylogram Layout ───────────────────────────\n\nconst TIP_SPACING = 20;\nconst PADDING_LEFT = 20;\nconst PADDING_RIGHT = 20;\nconst PADDING_TOP = 20;\nconst PADDING_BOTTOM = 40;\n\nexport function layoutPhylo(ast: PhyloTreeAST): PhyloLayoutResult {\n const leaves = collectLeaves(ast.root);\n const numLeaves = leaves.length;\n const tipSpacing = TIP_SPACING;\n\n // Compute scale\n const maxLabelWidth = Math.max(...leaves.map(estimateLabelWidth), 60);\n const maxDist = maxRootToTip(ast.root, 0);\n const isCladogram = ast.mode === \"cladogram\";\n\n const availableWidth = Math.max(300, numLeaves * 30 + maxLabelWidth + 100);\n const plotWidth = availableWidth - PADDING_LEFT - PADDING_RIGHT - maxLabelWidth;\n\n let scale: number;\n if (isCladogram || maxDist === 0) {\n const depth = maxDepth(ast.root);\n scale = depth > 0 ? plotWidth / depth : plotWidth;\n } else {\n scale = plotWidth / maxDist;\n }\n\n // Step 1: assign Y to leaves (in-order)\n const nodeMap = new Map<string, PhyloLayoutNode>();\n let leafIdx = 0;\n\n function assignLeafY(node: PhyloNode): void {\n if (node.isLeaf) {\n const y = PADDING_TOP + leafIdx * tipSpacing;\n nodeMap.set(node.id, { node, x: 0, y });\n leafIdx++;\n return;\n }\n for (const child of node.children) {\n assignLeafY(child);\n }\n }\n assignLeafY(ast.root);\n\n // Step 2: assign Y to internal nodes (mean of children)\n function assignInternalY(node: PhyloNode): number {\n const existing = nodeMap.get(node.id);\n if (node.isLeaf && existing) return existing.y;\n const childYs = node.children.map(assignInternalY);\n const y = (Math.min(...childYs) + Math.max(...childYs)) / 2;\n if (!existing) {\n nodeMap.set(node.id, { node, x: 0, y });\n } else {\n existing.y = y;\n }\n return y;\n }\n assignInternalY(ast.root);\n\n // Step 3: assign X (distance from root)\n function assignX(node: PhyloNode, parentX: number, depth: number): void {\n let x: number;\n if (node === ast.root) {\n x = PADDING_LEFT;\n } else if (isCladogram) {\n if (node.isLeaf) {\n x = PADDING_LEFT + plotWidth;\n } else {\n x = PADDING_LEFT + depth * (plotWidth / maxDepth(ast.root));\n }\n } else {\n x = parentX + (node.branchLength ?? 0) * scale;\n }\n\n const layoutNode = nodeMap.get(node.id);\n if (layoutNode) layoutNode.x = x;\n\n for (const child of node.children) {\n assignX(child, x, depth + 1);\n }\n }\n assignX(ast.root, PADDING_LEFT, 0);\n\n // For cladogram: recalculate internal node X as parent of children\n if (isCladogram) {\n assignCladogramInternalX(ast.root, nodeMap);\n }\n\n // Build clade membership map\n const cladeMap = buildCladeMap(ast);\n\n // Step 4: generate branch paths\n const branches: PhyloBranch[] = [];\n\n function generateBranches(node: PhyloNode): void {\n const parentLayout = nodeMap.get(node.id);\n if (!parentLayout) return;\n\n if (node.children.length === 0) return;\n\n const childLayouts = node.children\n .map((c) => nodeMap.get(c.id))\n .filter((l): l is PhyloLayoutNode => l !== undefined);\n\n if (childLayouts.length === 0) return;\n\n // Vertical connector from min child Y to max child Y at parent X\n const minY = Math.min(...childLayouts.map((c) => c.y));\n const maxY = Math.max(...childLayouts.map((c) => c.y));\n\n if (ast.layout === \"slanted\") {\n // Slanted: diagonal lines from parent to each child\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${parentLayout.y} L ${childLayout.x},${childLayout.y}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n } else {\n // Rectangular: vertical connector + horizontal branches\n branches.push({\n path: `M ${parentLayout.x},${minY} V ${maxY}`,\n fromId: node.id,\n toId: node.id,\n isConnector: true,\n });\n\n for (const child of node.children) {\n const childLayout = nodeMap.get(child.id);\n if (!childLayout) continue;\n const pathStr = `M ${parentLayout.x},${childLayout.y} H ${childLayout.x}`;\n branches.push({\n path: pathStr,\n fromId: node.id,\n toId: child.id,\n cladeId: cladeMap.get(child.id),\n isConnector: false,\n });\n }\n }\n\n for (const child of node.children) {\n generateBranches(child);\n }\n }\n\n generateBranches(ast.root);\n\n // Compute final dimensions\n const allNodes = Array.from(nodeMap.values());\n let maxX = Math.max(...allNodes.map((n) => n.x + (n.node.isLeaf ? estimateLabelWidth(n.node) : 0)));\n\n // Add space for clade labels (background/both mode places labels to the right)\n let maxCladeLabelWidth = 0;\n for (const clade of ast.clades) {\n if (clade.label && clade.highlight && clade.highlight !== \"branch\") {\n const w = clade.label.length * 8 + 30;\n if (w > maxCladeLabelWidth) maxCladeLabelWidth = w;\n }\n }\n maxX += maxCladeLabelWidth;\n\n const maxNodeY = Math.max(...allNodes.map((n) => n.y));\n\n const width = Math.max(maxX + PADDING_RIGHT, availableWidth);\n const height = maxNodeY + PADDING_TOP + PADDING_BOTTOM;\n\n return {\n width,\n height,\n nodes: allNodes,\n branches,\n ast,\n scale,\n };\n}\n\nfunction assignCladogramInternalX(\n node: PhyloNode,\n nodeMap: Map<string, PhyloLayoutNode>\n): number {\n if (node.isLeaf) {\n return nodeMap.get(node.id)?.x ?? 0;\n }\n\n let minChildX = Infinity;\n for (const child of node.children) {\n const childX = assignCladogramInternalX(child, nodeMap);\n if (childX < minChildX) minChildX = childX;\n }\n\n const layout = nodeMap.get(node.id);\n if (layout) {\n layout.x = minChildX - 40;\n if (layout.x < PADDING_LEFT) layout.x = PADDING_LEFT;\n }\n\n return layout?.x ?? PADDING_LEFT;\n}\n","import type { PhyloTreeAST } from \"../../core/types\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport {\n svgRoot,\n group,\n path,\n line,\n circle,\n text,\n title,\n desc,\n rect,\n el,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBiologyTheme, FONT_SIZE, STROKE_WIDTH, type ResolvedTheme, type BiologyTokens } from \"../../core/theme\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst TIP_LABEL_GAP = 6;\nconst SUPPORT_THRESHOLD = 50;\n\nfunction getSupportColor(value: number, t: ResolvedTheme<BiologyTokens>): string {\n if (value >= 95) return t.supportGood;\n if (value >= 75) return t.supportMedium;\n if (value >= 50) return t.supportWarn;\n return t.supportBad;\n}\n\nfunction isSpeciesBinomial(label: string): boolean {\n const parts = label.trim().split(/\\s+/);\n if (parts.length !== 2) return false;\n return /^[A-Z][a-z]+$/.test(parts[0]) && /^[a-z]+$/.test(parts[1]);\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: PhyloTreeAST, t: ResolvedTheme<BiologyTokens>): string {\n const cladeColors = ast.clades.map((c, i) => {\n const color = c.color ?? t.cladeColors[i % t.cladeColors.length];\n return `.schematex-phylo-clade-${c.id} { stroke: ${color}; }\n.schematex-phylo-clade-bg-${c.id} { fill: ${color}; fill-opacity: 0.12; }\n.schematex-phylo-clade-label-${c.id} { fill: ${color}; }`;\n });\n\n return `\n.schematex-phylo {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n background: ${t.bg};\n}\n.schematex-phylo-branch { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-phylo-branch-connector { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-tip-label { font-size: ${FONT_SIZE.label}px; fill: ${t.text}; dominant-baseline: central; }\n.schematex-phylo-tip-label-italic { font-style: italic; }\n.schematex-phylo-support-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; dominant-baseline: auto; }\n.schematex-phylo-support-dot { stroke: none; }\n.schematex-phylo-scale-bar line { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-phylo-scale-bar text { font-size: 10px; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-scale-tick { stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.thin}; }\n.schematex-phylo-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-phylo-clade-label { font-size: 13px; font-weight: bold; }\n.schematex-phylo-root-marker { fill: none; stroke: ${t.text}; stroke-width: ${STROKE_WIDTH.normal}; }\n${cladeColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Scale Bar ──────────────────────────────────────────────\n\nfunction computeScaleBar(\n scale: number,\n plotWidth: number\n): { length: number; label: string; pxLength: number } {\n if (scale <= 0) return { length: 0.1, label: \"0.1\", pxLength: 50 };\n\n const targetPx = plotWidth * 0.2;\n\n const magnitudes = [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, 50, 100];\n let best = magnitudes[0];\n let bestDiff = Infinity;\n\n for (const m of magnitudes) {\n const diff = Math.abs(m * scale - targetPx);\n if (diff < bestDiff) {\n bestDiff = diff;\n best = m;\n }\n }\n\n return {\n length: best,\n label: best < 0.01 ? best.toExponential() : String(best),\n pxLength: best * scale,\n };\n}\n\nfunction renderScaleBar(\n layout: PhyloLayoutResult,\n t: ResolvedTheme<BiologyTokens>,\n scaleLabel?: string\n): string {\n if (layout.ast.mode === \"cladogram\") return \"\";\n\n const plotWidth = layout.width - 40;\n const bar = computeScaleBar(layout.scale, plotWidth);\n if (bar.pxLength < 5) return \"\";\n\n const x = 20;\n const y = layout.height - 20;\n\n const elements = [\n line({ x1: x, y1: y, x2: x + bar.pxLength, y2: y, class: \"schematex-phylo-scale-bar\" }),\n line({ x1: x, y1: y - 4, x2: x, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n line({ x1: x + bar.pxLength, y1: y - 4, x2: x + bar.pxLength, y2: y + 4, class: \"schematex-phylo-scale-tick\" }),\n text({ x: x + bar.pxLength / 2, y: y + 16, \"text-anchor\": \"middle\", class: \"schematex-phylo-scale-bar\" }, bar.label),\n ];\n\n if (scaleLabel) {\n elements.push(\n text(\n { x: x + bar.pxLength / 2, y: y + 28, \"text-anchor\": \"middle\", \"font-size\": \"9\", fill: t.textMuted },\n scaleLabel\n )\n );\n }\n\n return group({ class: \"schematex-phylo-scale-bar\" }, elements);\n}\n\n// ─── Clade Backgrounds ──────────────────────────────────────\n\nfunction renderCladeBackgrounds(layout: PhyloLayoutResult, t: ResolvedTheme<BiologyTokens>): string[] {\n const elements: string[] = [];\n\n for (let ci = 0; ci < layout.ast.clades.length; ci++) {\n const clade = layout.ast.clades[ci];\n const hl = clade.highlight ?? \"branch\";\n if (hl === \"branch\") continue;\n\n const memberNodes = layout.nodes.filter(\n (n) => n.node.isLeaf && clade.members.includes(n.node.id)\n );\n if (memberNodes.length === 0) continue;\n\n const minY = Math.min(...memberNodes.map((n) => n.y)) - 10;\n const maxY = Math.max(...memberNodes.map((n) => n.y)) + 10;\n const minX = Math.min(...memberNodes.map((n) => n.x)) - 20;\n const maxX = Math.max(...memberNodes.map((n) => {\n const labelW = ((n.node.label ?? n.node.id).length * 7.2) + TIP_LABEL_GAP + 8;\n return n.x + labelW;\n }));\n\n const color = clade.color ?? t.cladeColors[ci % t.cladeColors.length];\n\n elements.push(\n rect({\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n rx: 4,\n class: `schematex-phylo-clade-bg schematex-phylo-clade-bg-${clade.id}`,\n fill: color,\n \"fill-opacity\": 0.12,\n })\n );\n\n if (clade.label) {\n elements.push(\n text(\n {\n x: maxX + 4,\n y: (minY + maxY) / 2,\n class: `schematex-phylo-clade-label schematex-phylo-clade-label-${clade.id}`,\n fill: color,\n \"font-weight\": \"bold\",\n \"font-size\": \"13\",\n \"dominant-baseline\": \"central\",\n },\n clade.label\n )\n );\n }\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderPhylo(layout: PhyloLayoutResult): string {\n const { ast, nodes, branches } = layout;\n const t = resolveBiologyTheme(ast.metadata?.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalHeight = layout.height + titleOffset;\n const totalWidth = layout.width;\n\n // Build layers\n const branchElements: string[] = [];\n const nodeElements: string[] = [];\n const labelElements: string[] = [];\n\n // Branches\n for (const branch of branches) {\n const cladeIdx = branch.cladeId\n ? ast.clades.findIndex((c) => c.id === branch.cladeId)\n : -1;\n const cladeColor =\n cladeIdx >= 0\n ? ast.clades[cladeIdx].color ?? t.cladeColors[cladeIdx % t.cladeColors.length]\n : undefined;\n\n const cls = branch.isConnector\n ? \"schematex-phylo-branch schematex-phylo-branch-connector\"\n : `schematex-phylo-branch schematex-phylo-branch-internal${branch.cladeId ? ` schematex-phylo-clade-${branch.cladeId}` : \"\"}`;\n\n const attrs: Record<string, string | number | undefined> = {\n d: branch.path,\n class: cls,\n };\n if (cladeColor && !branch.isConnector) {\n attrs.stroke = cladeColor;\n }\n\n branchElements.push(path(attrs));\n }\n\n // Nodes (support dots + root marker + tip labels)\n const rootLayout = nodes.find((n) => n.node === ast.root);\n\n // Root marker\n if (rootLayout && !ast.unrooted) {\n nodeElements.push(\n circle({\n cx: rootLayout.x,\n cy: rootLayout.y,\n r: 5,\n class: \"schematex-phylo-root-marker\",\n })\n );\n }\n\n for (const layoutNode of nodes) {\n const { node, x, y } = layoutNode;\n\n // Support dots / labels for internal nodes\n if (!node.isLeaf && node.support !== undefined) {\n const support = node.support > 1 ? node.support : node.support * 100;\n if (support >= SUPPORT_THRESHOLD) {\n const color = getSupportColor(support, t);\n nodeElements.push(\n circle({\n cx: x,\n cy: y,\n r: 4,\n class: \"schematex-phylo-support-dot\",\n fill: color,\n })\n );\n labelElements.push(\n text(\n { x, y: y - 8, class: \"schematex-phylo-support-label\" },\n String(Math.round(support))\n )\n );\n }\n }\n\n // Tip labels\n if (node.isLeaf) {\n const label = node.label ?? node.id;\n const italic = isSpeciesBinomial(label);\n const cls = `schematex-phylo-tip-label${italic ? \" schematex-phylo-tip-label-italic\" : \"\"}`;\n\n labelElements.push(\n text(\n {\n x: x + TIP_LABEL_GAP,\n y,\n class: cls,\n \"font-style\": italic ? \"italic\" : undefined,\n \"data-taxon-id\": node.id,\n },\n label\n )\n );\n }\n }\n\n // Clade backgrounds\n const cladeBgElements = renderCladeBackgrounds(layout, t);\n\n // Scale bar\n const scaleBarEl = renderScaleBar(layout, t, ast.scaleLabel);\n\n // Title\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-phylo-title\" },\n ast.title\n )\n : \"\";\n\n // Assemble\n const leafCount = nodes.filter((n) => n.node.isLeaf).length;\n const svgContent = [\n title(`Phylogenetic Tree${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(`Phylogenetic tree with ${leafCount} taxa, ${ast.mode} mode, ${ast.layout} layout`),\n el(\"style\", {}, css),\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n const transformY = titleOffset;\n\n if (cladeBgElements.length > 0) {\n svgContent.push(\n group(\n { class: \"schematex-phylo-clade-highlights\", transform: transformY ? `translate(0,${transformY})` : undefined },\n cladeBgElements\n )\n );\n }\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-branches\", transform: transformY ? `translate(0,${transformY})` : undefined },\n branchElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-nodes\", transform: transformY ? `translate(0,${transformY})` : undefined },\n nodeElements\n )\n );\n\n svgContent.push(\n group(\n { class: \"schematex-phylo-labels\", transform: transformY ? `translate(0,${transformY})` : undefined },\n labelElements\n )\n );\n\n if (scaleBarEl) {\n svgContent.push(\n group(\n { transform: transformY ? `translate(0,${transformY})` : undefined },\n [scaleBarEl]\n )\n );\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-phylo\",\n viewBox: `0 0 ${totalWidth} ${totalHeight}`,\n width: totalWidth,\n height: totalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parsePhylo, PhyloParseError } from \"./parser\";\nimport { layoutPhylo } from \"./layout\";\nimport type { PhyloLayoutResult } from \"./layout\";\nimport { renderPhylo } from \"./renderer\";\n\nexport const phylo: DiagramPlugin = {\n type: \"phylo\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"phylo\" || firstLine.startsWith(\"phylo \");\n },\n\n parse: parsePhylo,\n\n render(text: string): string {\n const ast = parsePhylo(text);\n const layout = layoutPhylo(ast);\n return renderPhylo(layout);\n },\n};\n\nexport { parsePhylo, PhyloParseError, layoutPhylo, renderPhylo };\nexport type { PhyloLayoutResult };\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
|
|
4
4
|
var chunkHDKDQAEQ_cjs = require('./chunk-HDKDQAEQ.cjs');
|
|
5
5
|
|
|
6
6
|
// src/diagrams/ecomap/parser.ts
|
|
@@ -406,7 +406,7 @@ function renderEcomap(layout, config) {
|
|
|
406
406
|
const systemNodes = layout.nodes.filter(
|
|
407
407
|
(n) => n.individual.properties?.center !== "true"
|
|
408
408
|
);
|
|
409
|
-
const t =
|
|
409
|
+
const t = chunkD7EHZFK4_cjs.resolveBaseTheme(config.theme);
|
|
410
410
|
const defsStr = buildDefs(t);
|
|
411
411
|
const styleStr = buildStyles(config, t);
|
|
412
412
|
const connectionsStr = renderConnections(layout.edges);
|
|
@@ -452,18 +452,18 @@ function buildDefs(t) {
|
|
|
452
452
|
}
|
|
453
453
|
function buildStyles(config, t) {
|
|
454
454
|
let css = `
|
|
455
|
-
.schematex-ecomap {${
|
|
455
|
+
.schematex-ecomap {${chunkD7EHZFK4_cjs.cssCustomProperties(t)}
|
|
456
456
|
background: ${t.bg};
|
|
457
457
|
}
|
|
458
|
-
.schematex-ecomap-center-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${
|
|
458
|
+
.schematex-ecomap-center-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.thick}; }
|
|
459
459
|
.schematex-ecomap-center-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize + 2}px; text-anchor: middle; dominant-baseline: central; fill: ${t.text}; font-weight: 600; }
|
|
460
|
-
.schematex-ecomap-system-shape { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: ${
|
|
460
|
+
.schematex-ecomap-system-shape { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; }
|
|
461
461
|
.schematex-ecomap-system-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 1}px; text-anchor: middle; fill: ${t.text}; }
|
|
462
|
-
.schematex-ecomap-eco-line { stroke: ${t.neutral}; stroke-width: ${
|
|
463
|
-
.schematex-ecomap-eco-line-parallel { stroke: ${t.neutral}; stroke-width: ${
|
|
464
|
-
.schematex-ecomap-eco-line-weak { stroke: ${t.neutral}; stroke-width: ${
|
|
465
|
-
.schematex-ecomap-eco-line-broken { stroke: ${t.neutral}; stroke-width: ${
|
|
466
|
-
.schematex-ecomap-eco-line-stressful { stroke: ${t.neutral}; stroke-width: ${
|
|
462
|
+
.schematex-ecomap-eco-line { stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }
|
|
463
|
+
.schematex-ecomap-eco-line-parallel { stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }
|
|
464
|
+
.schematex-ecomap-eco-line-weak { stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; stroke-dasharray: 6,4; fill: none; stroke-linecap: round; }
|
|
465
|
+
.schematex-ecomap-eco-line-broken { stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; stroke-dasharray: 3,8; fill: none; stroke-linecap: round; }
|
|
466
|
+
.schematex-ecomap-eco-line-stressful { stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }
|
|
467
467
|
.schematex-ecomap-eco-conn-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 2}px; text-anchor: middle; fill: ${t.textMuted}; }
|
|
468
468
|
.schematex-ecomap-eco-arrow { fill: ${t.neutral}; }
|
|
469
469
|
`;
|
|
@@ -823,6 +823,7 @@ var ecomap = {
|
|
|
823
823
|
const firstLine = text2.trim().split("\n")[0]?.trim().toLowerCase() ?? "";
|
|
824
824
|
return firstLine === "ecomap" || firstLine.startsWith("ecomap ");
|
|
825
825
|
},
|
|
826
|
+
parse: parseEcomap,
|
|
826
827
|
render(text2, config) {
|
|
827
828
|
const ast = parseEcomap(text2);
|
|
828
829
|
const layout = layoutEcomap(ast);
|
|
@@ -841,5 +842,5 @@ exports.ecomap = ecomap;
|
|
|
841
842
|
exports.layoutEcomap = layoutEcomap;
|
|
842
843
|
exports.parseEcomap = parseEcomap;
|
|
843
844
|
exports.renderEcomap = renderEcomap;
|
|
844
|
-
//# sourceMappingURL=chunk-
|
|
845
|
-
//# sourceMappingURL=chunk-
|
|
845
|
+
//# sourceMappingURL=chunk-XHZ7GXP2.cjs.map
|
|
846
|
+
//# sourceMappingURL=chunk-XHZ7GXP2.cjs.map
|