schematex 0.3.2 → 0.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +20 -1
  2. package/dist/ai/ai-sdk.cjs +25 -25
  3. package/dist/ai/ai-sdk.d.cts +1 -1
  4. package/dist/ai/ai-sdk.d.ts +1 -1
  5. package/dist/ai/ai-sdk.js +20 -20
  6. package/dist/ai/index.cjs +28 -28
  7. package/dist/ai/index.d.cts +1 -1
  8. package/dist/ai/index.d.ts +1 -1
  9. package/dist/ai/index.js +20 -20
  10. package/dist/browser.cjs +22 -22
  11. package/dist/browser.js +20 -20
  12. package/dist/{chunk-UK7JF5QB.cjs → chunk-3MJKJX27.cjs} +37 -38
  13. package/dist/chunk-3MJKJX27.cjs.map +1 -0
  14. package/dist/{chunk-HIQPEAL7.js → chunk-3RAVPXLN.js} +4 -4
  15. package/dist/{chunk-HIQPEAL7.js.map → chunk-3RAVPXLN.js.map} +1 -1
  16. package/dist/{chunk-LFZZ4NCP.cjs → chunk-3WNW5Y7P.cjs} +48 -8
  17. package/dist/chunk-3WNW5Y7P.cjs.map +1 -0
  18. package/dist/{chunk-XUEROLSB.cjs → chunk-4THC4VUA.cjs} +17 -17
  19. package/dist/chunk-4THC4VUA.cjs.map +1 -0
  20. package/dist/{chunk-K5QG53GT.cjs → chunk-5COUZTVA.cjs} +27 -27
  21. package/dist/{chunk-K5QG53GT.cjs.map → chunk-5COUZTVA.cjs.map} +1 -1
  22. package/dist/{chunk-F6OROIHS.js → chunk-5CTERELC.js} +4 -4
  23. package/dist/{chunk-F6OROIHS.js.map → chunk-5CTERELC.js.map} +1 -1
  24. package/dist/{chunk-ZNLEUL7T.js → chunk-5SKT7RYR.js} +5 -5
  25. package/dist/chunk-5SKT7RYR.js.map +1 -0
  26. package/dist/{chunk-75BMFCP5.cjs → chunk-5UCXMYE7.cjs} +44 -44
  27. package/dist/{chunk-75BMFCP5.cjs.map → chunk-5UCXMYE7.cjs.map} +1 -1
  28. package/dist/{chunk-GYTWJ6VB.cjs → chunk-6ULC3UHJ.cjs} +68 -49
  29. package/dist/chunk-6ULC3UHJ.cjs.map +1 -0
  30. package/dist/{chunk-3YXXZ4LT.cjs → chunk-6WORZSL3.cjs} +34 -34
  31. package/dist/{chunk-3YXXZ4LT.cjs.map → chunk-6WORZSL3.cjs.map} +1 -1
  32. package/dist/{chunk-6BKUD5EJ.js → chunk-6XGSEG3K.js} +4 -5
  33. package/dist/chunk-6XGSEG3K.js.map +1 -0
  34. package/dist/{chunk-OK5RYX55.cjs → chunk-CQP5YHVK.cjs} +26 -27
  35. package/dist/chunk-CQP5YHVK.cjs.map +1 -0
  36. package/dist/{chunk-2UJAVPA4.cjs → chunk-CS67UBP3.cjs} +27 -27
  37. package/dist/{chunk-2UJAVPA4.cjs.map → chunk-CS67UBP3.cjs.map} +1 -1
  38. package/dist/{chunk-YTEEZV6J.cjs → chunk-DBMZEZLF.cjs} +425 -425
  39. package/dist/chunk-DBMZEZLF.cjs.map +1 -0
  40. package/dist/{chunk-NFT6VW73.js → chunk-DHKKDIVT.js} +4 -4
  41. package/dist/chunk-DHKKDIVT.js.map +1 -0
  42. package/dist/{chunk-H4CJTKEH.js → chunk-DNZV4V4R.js} +5 -5
  43. package/dist/{chunk-H4CJTKEH.js.map → chunk-DNZV4V4R.js.map} +1 -1
  44. package/dist/{chunk-ZTSO3S4P.js → chunk-FO7BLCEW.js} +3 -3
  45. package/dist/{chunk-ZTSO3S4P.js.map → chunk-FO7BLCEW.js.map} +1 -1
  46. package/dist/{chunk-EYHD7LV3.cjs → chunk-H5JYZ5YS.cjs} +130 -130
  47. package/dist/chunk-H5JYZ5YS.cjs.map +1 -0
  48. package/dist/{chunk-RNGYXGHS.js → chunk-HKJRHXGZ.js} +22 -22
  49. package/dist/chunk-HKJRHXGZ.js.map +1 -0
  50. package/dist/{chunk-X4F6VVEJ.js → chunk-I6VEXSUK.js} +3 -4
  51. package/dist/chunk-I6VEXSUK.js.map +1 -0
  52. package/dist/{chunk-MKKFIPKU.cjs → chunk-IFR34VTL.cjs} +47 -47
  53. package/dist/chunk-IFR34VTL.cjs.map +1 -0
  54. package/dist/{chunk-BJ65PKDU.js → chunk-IURM4ZWE.js} +4 -4
  55. package/dist/chunk-IURM4ZWE.js.map +1 -0
  56. package/dist/{chunk-M5ZC3LFJ.js → chunk-IZMAZOQI.js} +4 -4
  57. package/dist/chunk-IZMAZOQI.js.map +1 -0
  58. package/dist/{chunk-RODV6PC4.cjs → chunk-J3Y2QDJR.cjs} +7 -7
  59. package/dist/{chunk-RODV6PC4.cjs.map → chunk-J3Y2QDJR.cjs.map} +1 -1
  60. package/dist/{chunk-BUN3CRMP.cjs → chunk-K6RAUXRQ.cjs} +65 -66
  61. package/dist/chunk-K6RAUXRQ.cjs.map +1 -0
  62. package/dist/{chunk-IT2TVXC7.js → chunk-LPKVIRYT.js} +4 -5
  63. package/dist/chunk-LPKVIRYT.js.map +1 -0
  64. package/dist/{chunk-W7GIQTJV.cjs → chunk-MIKCKV27.cjs} +22 -22
  65. package/dist/chunk-MIKCKV27.cjs.map +1 -0
  66. package/dist/{chunk-KUXOHLGC.cjs → chunk-O5POCPXZ.cjs} +52 -53
  67. package/dist/chunk-O5POCPXZ.cjs.map +1 -0
  68. package/dist/{chunk-BJWMPPEA.js → chunk-PWI4NFYR.js} +4 -4
  69. package/dist/chunk-PWI4NFYR.js.map +1 -0
  70. package/dist/{chunk-WHJXRLFD.js → chunk-SYYBKDL7.js} +48 -8
  71. package/dist/chunk-SYYBKDL7.js.map +1 -0
  72. package/dist/{chunk-L2KUGWFR.cjs → chunk-T47A6XUK.cjs} +47 -47
  73. package/dist/chunk-T47A6XUK.cjs.map +1 -0
  74. package/dist/{chunk-SFSZUOFT.js → chunk-TWAC2IIS.js} +4 -4
  75. package/dist/chunk-TWAC2IIS.js.map +1 -0
  76. package/dist/{chunk-XI6JOG76.cjs → chunk-V4OVUBLA.cjs} +46 -46
  77. package/dist/chunk-V4OVUBLA.cjs.map +1 -0
  78. package/dist/{chunk-2J2QWNGI.js → chunk-VRE5VWDQ.js} +27 -8
  79. package/dist/chunk-VRE5VWDQ.js.map +1 -0
  80. package/dist/{chunk-SE23X5OE.js → chunk-WHNIK4LK.js} +4 -5
  81. package/dist/chunk-WHNIK4LK.js.map +1 -0
  82. package/dist/{chunk-C3IVD7DI.cjs → chunk-WIFGBWET.cjs} +25 -26
  83. package/dist/chunk-WIFGBWET.cjs.map +1 -0
  84. package/dist/{chunk-7MVDN5UC.cjs → chunk-XSNNGYXZ.cjs} +36 -36
  85. package/dist/chunk-XSNNGYXZ.cjs.map +1 -0
  86. package/dist/{chunk-7BEJHG43.js → chunk-YWDODCW2.js} +4 -4
  87. package/dist/{chunk-7BEJHG43.js.map → chunk-YWDODCW2.js.map} +1 -1
  88. package/dist/{chunk-M3R6RCXY.js → chunk-ZKDL6Y3O.js} +4 -4
  89. package/dist/chunk-ZKDL6Y3O.js.map +1 -0
  90. package/dist/{chunk-56LXBM45.js → chunk-ZQZNWAHH.js} +4 -5
  91. package/dist/chunk-ZQZNWAHH.js.map +1 -0
  92. package/dist/diagrams/blockdiagram/index.cjs +6 -6
  93. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  94. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  95. package/dist/diagrams/blockdiagram/index.js +2 -2
  96. package/dist/diagrams/circuit/index.cjs +8 -8
  97. package/dist/diagrams/circuit/index.d.cts +1 -1
  98. package/dist/diagrams/circuit/index.d.ts +1 -1
  99. package/dist/diagrams/circuit/index.js +2 -2
  100. package/dist/diagrams/ecomap/index.cjs +8 -8
  101. package/dist/diagrams/ecomap/index.d.cts +1 -1
  102. package/dist/diagrams/ecomap/index.d.ts +1 -1
  103. package/dist/diagrams/ecomap/index.js +3 -3
  104. package/dist/diagrams/entity/index.cjs +6 -6
  105. package/dist/diagrams/entity/index.d.cts +1 -1
  106. package/dist/diagrams/entity/index.d.ts +1 -1
  107. package/dist/diagrams/entity/index.js +2 -2
  108. package/dist/diagrams/fishbone/index.cjs +8 -8
  109. package/dist/diagrams/fishbone/index.d.cts +1 -1
  110. package/dist/diagrams/fishbone/index.d.ts +1 -1
  111. package/dist/diagrams/fishbone/index.js +2 -2
  112. package/dist/diagrams/flowchart/index.cjs +8 -8
  113. package/dist/diagrams/flowchart/index.d.cts +2 -2
  114. package/dist/diagrams/flowchart/index.d.ts +2 -2
  115. package/dist/diagrams/flowchart/index.js +2 -2
  116. package/dist/diagrams/genogram/index.cjs +10 -10
  117. package/dist/diagrams/genogram/index.d.cts +1 -1
  118. package/dist/diagrams/genogram/index.d.ts +1 -1
  119. package/dist/diagrams/genogram/index.js +3 -3
  120. package/dist/diagrams/ladder/index.cjs +6 -6
  121. package/dist/diagrams/ladder/index.d.cts +1 -1
  122. package/dist/diagrams/ladder/index.d.ts +1 -1
  123. package/dist/diagrams/ladder/index.js +2 -2
  124. package/dist/diagrams/logic/index.cjs +6 -6
  125. package/dist/diagrams/logic/index.d.cts +1 -1
  126. package/dist/diagrams/logic/index.d.ts +1 -1
  127. package/dist/diagrams/logic/index.js +2 -2
  128. package/dist/diagrams/orgchart/index.cjs +7 -7
  129. package/dist/diagrams/orgchart/index.d.cts +1 -1
  130. package/dist/diagrams/orgchart/index.d.ts +1 -1
  131. package/dist/diagrams/orgchart/index.js +2 -2
  132. package/dist/diagrams/pedigree/index.cjs +8 -8
  133. package/dist/diagrams/pedigree/index.d.cts +1 -1
  134. package/dist/diagrams/pedigree/index.d.ts +1 -1
  135. package/dist/diagrams/pedigree/index.js +3 -3
  136. package/dist/diagrams/phylo/index.cjs +7 -7
  137. package/dist/diagrams/phylo/index.d.cts +1 -1
  138. package/dist/diagrams/phylo/index.d.ts +1 -1
  139. package/dist/diagrams/phylo/index.js +2 -2
  140. package/dist/diagrams/sld/index.cjs +6 -6
  141. package/dist/diagrams/sld/index.d.cts +1 -1
  142. package/dist/diagrams/sld/index.d.ts +1 -1
  143. package/dist/diagrams/sld/index.js +2 -2
  144. package/dist/diagrams/sociogram/index.cjs +7 -7
  145. package/dist/diagrams/sociogram/index.d.cts +1 -1
  146. package/dist/diagrams/sociogram/index.d.ts +1 -1
  147. package/dist/diagrams/sociogram/index.js +3 -3
  148. package/dist/diagrams/timing/index.cjs +5 -5
  149. package/dist/diagrams/timing/index.d.cts +1 -1
  150. package/dist/diagrams/timing/index.d.ts +1 -1
  151. package/dist/diagrams/timing/index.js +2 -2
  152. package/dist/diagrams/venn/index.cjs +9 -9
  153. package/dist/diagrams/venn/index.d.cts +1 -1
  154. package/dist/diagrams/venn/index.d.ts +1 -1
  155. package/dist/diagrams/venn/index.js +2 -2
  156. package/dist/export.cjs +1 -1
  157. package/dist/export.cjs.map +1 -1
  158. package/dist/export.d.cts +1 -1
  159. package/dist/export.d.ts +1 -1
  160. package/dist/export.js +1 -1
  161. package/dist/export.js.map +1 -1
  162. package/dist/{index-dWDwG6BW.d.ts → index-D3u6vcA4.d.ts} +1 -1
  163. package/dist/{index-BrLxEzSQ.d.cts → index-bdfj6FpQ.d.cts} +1 -1
  164. package/dist/index.cjs +41 -41
  165. package/dist/index.d.cts +2 -2
  166. package/dist/index.d.ts +2 -2
  167. package/dist/index.js +19 -19
  168. package/dist/react.cjs +20 -20
  169. package/dist/react.js +19 -19
  170. package/dist/{types-BtiUg7Gx.d.cts → types-DnU2UlWz.d.cts} +2 -0
  171. package/dist/{types-BtiUg7Gx.d.ts → types-DnU2UlWz.d.ts} +2 -0
  172. package/package.json +1 -1
  173. package/dist/chunk-2J2QWNGI.js.map +0 -1
  174. package/dist/chunk-56LXBM45.js.map +0 -1
  175. package/dist/chunk-6BKUD5EJ.js.map +0 -1
  176. package/dist/chunk-7MVDN5UC.cjs.map +0 -1
  177. package/dist/chunk-BJ65PKDU.js.map +0 -1
  178. package/dist/chunk-BJWMPPEA.js.map +0 -1
  179. package/dist/chunk-BUN3CRMP.cjs.map +0 -1
  180. package/dist/chunk-C3IVD7DI.cjs.map +0 -1
  181. package/dist/chunk-EYHD7LV3.cjs.map +0 -1
  182. package/dist/chunk-GYTWJ6VB.cjs.map +0 -1
  183. package/dist/chunk-IT2TVXC7.js.map +0 -1
  184. package/dist/chunk-KUXOHLGC.cjs.map +0 -1
  185. package/dist/chunk-L2KUGWFR.cjs.map +0 -1
  186. package/dist/chunk-LFZZ4NCP.cjs.map +0 -1
  187. package/dist/chunk-M3R6RCXY.js.map +0 -1
  188. package/dist/chunk-M5ZC3LFJ.js.map +0 -1
  189. package/dist/chunk-MKKFIPKU.cjs.map +0 -1
  190. package/dist/chunk-NFT6VW73.js.map +0 -1
  191. package/dist/chunk-OK5RYX55.cjs.map +0 -1
  192. package/dist/chunk-RNGYXGHS.js.map +0 -1
  193. package/dist/chunk-SE23X5OE.js.map +0 -1
  194. package/dist/chunk-SFSZUOFT.js.map +0 -1
  195. package/dist/chunk-UK7JF5QB.cjs.map +0 -1
  196. package/dist/chunk-W7GIQTJV.cjs.map +0 -1
  197. package/dist/chunk-WHJXRLFD.js.map +0 -1
  198. package/dist/chunk-X4F6VVEJ.js.map +0 -1
  199. package/dist/chunk-XI6JOG76.cjs.map +0 -1
  200. package/dist/chunk-XUEROLSB.cjs.map +0 -1
  201. package/dist/chunk-YTEEZV6J.cjs.map +0 -1
  202. package/dist/chunk-ZNLEUL7T.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/ladder/parser.ts","../src/diagrams/ladder/layout.ts","../src/diagrams/ladder/renderer.ts","../src/diagrams/ladder/index.ts"],"names":["text","title","el","w","h","slot","nx","ny","id","LINE_H"],"mappings":"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","file":"chunk-ZKDL6Y3O.js","sourcesContent":["import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n LadderContactType,\n LadderCoilType,\n LadderFBType,\n} from \"../../core/types\";\n\nexport class LadderParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"LadderParseError\";\n }\n}\n\nconst CONTACT_TYPES = new Set<LadderContactType>([\"XIC\", \"XIO\", \"ONS\", \"OSF\"]);\nconst COIL_TYPES = new Set<LadderCoilType>([\"OTE\", \"OTL\", \"OTU\", \"OTN\"]);\nconst FB_TYPES = new Set<LadderFBType>([\n \"TON\", \"TOFF\", \"TP\",\n \"CTU\", \"CTD\", \"CTUD\",\n \"ADD\", \"SUB\", \"MUL\", \"DIV\",\n \"MOV\",\n \"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\",\n]);\n\n/** Split comma-separated args respecting quoted strings. */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n out.push(cur.trim());\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n/** Parse one element line, e.g. XIC(START), TON(T1, PT=5000), OTE(MOTOR). */\nfunction parseElement(line: string, lineNo: number): LadderElement {\n const m = line.match(/^([A-Z][A-Z0-9_]*)\\s*\\(\\s*([^)]*)\\s*\\)\\s*$/);\n if (!m) {\n throw new LadderParseError(`invalid element syntax: ${line}`, lineNo, undefined, line);\n }\n const op = m[1] as string;\n const args = splitArgs(m[2]);\n if (args.length === 0 || !args[0]) {\n throw new LadderParseError(`element missing tag: ${line}`, lineNo, undefined, line);\n }\n const tag = args[0];\n\n if (CONTACT_TYPES.has(op as LadderContactType)) {\n const contact: LadderContact = {\n elementType: \"contact\",\n contactType: op as LadderContactType,\n tag,\n };\n // optional address as second positional or address=...\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") contact.address = stripQuotes(kv[2]);\n else if (key === \"name\") contact.name = stripQuotes(kv[2]);\n } else {\n contact.address = stripQuotes(a);\n }\n }\n return contact;\n }\n\n if (COIL_TYPES.has(op as LadderCoilType)) {\n const coil: LadderCoil = {\n elementType: \"coil\",\n coilType: op as LadderCoilType,\n tag,\n };\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") coil.address = stripQuotes(kv[2]);\n else if (key === \"name\") coil.name = stripQuotes(kv[2]);\n } else {\n coil.address = stripQuotes(a);\n }\n }\n return coil;\n }\n\n if (FB_TYPES.has(op as LadderFBType)) {\n const params: Record<string, string | number> = {};\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const v = stripQuotes(kv[2]);\n const n = Number(v);\n params[kv[1]] = Number.isFinite(n) && v !== \"\" && /^-?\\d+(\\.\\d+)?$/.test(v) ? n : v;\n }\n }\n const fb: LadderFunctionBlock = {\n elementType: \"function_block\",\n fbType: op as LadderFBType,\n tag,\n params,\n };\n return fb;\n }\n\n throw new LadderParseError(`unknown element type \"${op}\"`, lineNo, undefined, line);\n}\n\nexport function parseLadderDSL(text: string): LadderAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const rungs: LadderRung[] = [];\n\n let currentRung: LadderRung | null = null;\n let currentParallel: LadderBranch[] | null = null;\n let currentBranch: LadderBranch | null = null;\n let parallelIndent = -1;\n let branchIndent = -1;\n\n function finishParallel() {\n if (currentRung && currentParallel) {\n currentRung.elements.push({ parallel: currentParallel });\n }\n currentParallel = null;\n currentBranch = null;\n parallelIndent = -1;\n branchIndent = -1;\n }\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i];\n const lineNo = i + 1;\n const stripped = raw.replace(/#.*$/, \"\");\n if (!stripped.trim()) continue;\n\n // indentation = count of leading spaces/tabs (tab = 2)\n let indent = 0;\n for (const ch of stripped) {\n if (ch === \" \") indent++;\n else if (ch === \"\\t\") indent += 2;\n else break;\n }\n const line = stripped.trim();\n\n // Header: ladder \"title\"\n if (/^ladder\\b/i.test(line)) {\n const m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\n continue;\n }\n\n // Rung: rung N \"comment\":\n const rungMatch = line.match(/^rung\\s+(\\d+)(?:\\s+\"([^\"]*)\")?\\s*:\\s*$/i);\n if (rungMatch) {\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n currentRung = {\n number: Number(rungMatch[1]),\n comment: rungMatch[2],\n elements: [],\n };\n continue;\n }\n\n if (!currentRung) {\n throw new LadderParseError(`element outside of rung: ${line}`, lineNo, undefined, line);\n }\n\n // parallel:\n if (/^parallel\\s*:\\s*$/i.test(line)) {\n finishParallel();\n currentParallel = [];\n parallelIndent = indent;\n continue;\n }\n\n // branch:\n if (/^branch\\s*:\\s*$/i.test(line)) {\n if (!currentParallel) {\n throw new LadderParseError(`branch: without parallel:`, lineNo, undefined, line);\n }\n currentBranch = { elements: [] };\n currentParallel.push(currentBranch);\n branchIndent = indent;\n continue;\n }\n\n // If we're in a parallel block but indent fell back, close it.\n if (currentParallel && indent <= parallelIndent) {\n finishParallel();\n }\n\n const element = parseElement(line, lineNo);\n\n if (currentParallel && currentBranch && indent > branchIndent) {\n currentBranch.elements.push(element);\n } else {\n if (currentParallel) finishParallel();\n currentRung.elements.push(element);\n }\n }\n\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n\n if (rungs.length === 0) {\n throw new LadderParseError(\"Ladder diagram has no rungs\");\n }\n\n return { type: \"ladder\", title, rungs };\n}\n","import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n} from \"../../core/types\";\n\nexport const LEFT_RAIL_X = 60;\nexport const RIGHT_RAIL_MARGIN = 30;\nexport const BASE_RUNG_HEIGHT = 100;\nexport const ELEMENT_WIDTH = 32;\nexport const ELEMENT_HEIGHT = 24;\nexport const FB_WIDTH = 80;\nexport const FB_HEIGHT = 56;\nexport const CMP_WIDTH = 56;\nexport const CMP_HEIGHT = 34;\nexport const RUNG_Y_OFFSET = 70;\nexport const H_SPACING = 16;\nexport const PARALLEL_GAP = 14;\nexport const CANVAS_PADDING = 30;\n\n/** Rough chars → pixels for 9px font */\nconst CHAR_W = 6.1;\nconst LINE_H = 11;\n\nexport type LadderElementKind =\n | \"contact\"\n | \"coil\"\n | \"function_block\"\n | \"compare\";\n\nexport interface LadderLayoutNode {\n id: string;\n rungIndex: number;\n element: LadderElement;\n kind: LadderElementKind;\n /** x of the element body (left edge) */\n x: number;\n /** y of the element body (top edge) */\n y: number;\n width: number;\n height: number;\n /** rung centerline Y (where wires attach) */\n rungY: number;\n}\n\nexport interface LadderLayoutWire {\n path: string;\n}\n\nexport interface LadderLayoutRung {\n rung: LadderRung;\n index: number;\n y: number;\n /** Rightmost x reached by elements on this rung. */\n endX: number;\n /** Rung slot total height (used for spacing). */\n height: number;\n /** Total pixel height reserved above rungY for name/tag labels. */\n headerHeight: number;\n}\n\nexport interface LadderLayoutResult {\n width: number;\n height: number;\n leftRailX: number;\n rightRailX: number;\n rungs: LadderLayoutRung[];\n nodes: LadderLayoutNode[];\n wires: LadderLayoutWire[];\n}\n\nconst COMPARE_TYPES = new Set([\"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\"]);\n\nfunction bodyWidth(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_WIDTH;\n return FB_WIDTH;\n }\n return ELEMENT_WIDTH;\n}\n\nfunction bodyHeight(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_HEIGHT;\n return FB_HEIGHT;\n }\n return ELEMENT_HEIGHT;\n}\n\nfunction elementKind(el: LadderElement): LadderElementKind {\n if (el.elementType === \"contact\") return \"contact\";\n if (el.elementType === \"coil\") return \"coil\";\n if (COMPARE_TYPES.has(el.fbType)) return \"compare\";\n return \"function_block\";\n}\n\n/** Wrap a long description into lines of ~13 chars without splitting words. */\nexport function wrapName(name: string, maxChars = 14): string[] {\n const words = name.split(/\\s+/);\n const lines: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (trial.length > maxChars && cur) {\n lines.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n if (cur) lines.push(cur);\n return lines.slice(0, 3);\n}\n\nfunction labelLinesForContactOrCoil(el: LadderElement): string[] {\n if (el.elementType === \"function_block\") return [el.tag];\n const lines: string[] = [];\n if (el.name) lines.push(...wrapName(el.name));\n lines.push(el.tag);\n if (el.address) lines.push(el.address);\n return lines;\n}\n\n/** Max label width in px across all label lines of the element. */\nfunction labelWidth(el: LadderElement): number {\n const lines = labelLinesForContactOrCoil(el);\n let maxChars = 0;\n for (const l of lines) if (l.length > maxChars) maxChars = l.length;\n return maxChars * CHAR_W;\n}\n\n/** Slot width = max(bodyWidth, labelWidth) + padding on both sides. */\nfunction slotWidth(el: LadderElement): number {\n return Math.max(bodyWidth(el), labelWidth(el)) + 6;\n}\n\n/** Total label rows above the element body (name lines + tag). */\nfunction labelRowsAbove(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 1;\n const name = el.name ? wrapName(el.name).length : 0;\n return name + 1; // + tag line\n}\n\nfunction labelRowsBelow(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 0;\n if ((el as { address?: string }).address) return 1;\n return 0;\n}\n\n/** Required vertical pixels above rung centerline for tallest element label stack. */\nfunction rungLabelHeaderHeight(rung: LadderRung): number {\n let maxAbovePx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n // Only the top-branch elements extend above the centerline.\n const topBranch = item.parallel[0];\n if (!topBranch) continue;\n const aboveRows = Math.max(\n 1,\n ...topBranch.elements.map((e) => labelRowsAbove(e))\n );\n const px = ph / 2 + aboveRows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n } else {\n const rows = labelRowsAbove(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n }\n }\n return maxAbovePx;\n}\n\nfunction rungLabelFooterHeight(rung: LadderRung): number {\n let maxBelowPx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n const bottomBranch = item.parallel[item.parallel.length - 1];\n if (!bottomBranch) continue;\n const belowRows = Math.max(\n 0,\n ...bottomBranch.elements.map((e) => labelRowsBelow(e))\n );\n const px = ph / 2 + belowRows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n } else {\n const rows = labelRowsBelow(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n }\n }\n return maxBelowPx;\n}\n\nfunction branchInlineWidth(branch: LadderBranch): number {\n if (branch.elements.length === 0) return ELEMENT_WIDTH;\n let w = 0;\n branch.elements.forEach((el, i) => {\n w += slotWidth(el);\n if (i < branch.elements.length - 1) w += H_SPACING;\n });\n return w;\n}\n\nfunction parallelWidth(branches: LadderBranch[]): number {\n const maxBranch = Math.max(\n ELEMENT_WIDTH,\n ...branches.map(branchInlineWidth)\n );\n return maxBranch + 2 * H_SPACING;\n}\n\n/** Per-branch row height including label stack above + below. */\nfunction branchRowHeight(branch: LadderBranch): number {\n const bodyH = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(1, ...branch.elements.map((e) => labelRowsAbove(e)));\n const below = Math.max(0, ...branch.elements.map((e) => labelRowsBelow(e)));\n return bodyH + above * LINE_H + below * LINE_H + 6;\n}\n\nfunction parallelHeight(branches: LadderBranch[]): number {\n // Account for label space between branches so name/address rows don't collide.\n let total = 0;\n branches.forEach((br, i) => {\n total += branchRowHeight(br);\n if (i < branches.length - 1) total += PARALLEL_GAP;\n });\n return Math.max(total, ELEMENT_HEIGHT);\n}\n\nexport function layoutLadder(ast: LadderAST): LadderLayoutResult {\n const nodes: LadderLayoutNode[] = [];\n const wires: LadderLayoutWire[] = [];\n const rungs: LadderLayoutRung[] = [];\n\n let maxEndX = LEFT_RAIL_X + 200;\n let cursorY = RUNG_Y_OFFSET;\n\n ast.rungs.forEach((rung, rungIndex) => {\n const headerH = rungLabelHeaderHeight(rung);\n const footerH = rungLabelFooterHeight(rung);\n // Per-rung height is comment (16) + header + footer + a little breathing room.\n const rungHeight = Math.max(BASE_RUNG_HEIGHT, 16 + headerH + footerH + 16);\n const rungY = cursorY + 16 + headerH;\n\n let x = LEFT_RAIL_X + H_SPACING;\n let prevRightX = LEFT_RAIL_X;\n let prevRightY = rungY;\n\n const addWire = (x1: number, y1: number, x2: number, y2: number) => {\n wires.push({ path: `M ${x1} ${y1} L ${x2} ${y2}` });\n };\n\n rung.elements.forEach((item, elIdx) => {\n if (\"parallel\" in item) {\n const branches = item.parallel;\n const pw = parallelWidth(branches);\n const ph = parallelHeight(branches);\n const bx = x;\n const ex = x + pw;\n\n addWire(prevRightX, prevRightY, bx, rungY);\n\n const busTop = rungY - ph / 2;\n const busBot = rungY + ph / 2;\n wires.push({ path: `M ${bx} ${busTop} L ${bx} ${busBot}` });\n wires.push({ path: `M ${ex} ${busTop} L ${ex} ${busBot}` });\n\n // Pre-compute row Y for each branch using actual row heights.\n let rowY = busTop;\n branches.forEach((branch, bIdx) => {\n const rowH = branchRowHeight(branch);\n const bodyMax = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(\n 1,\n ...branch.elements.map((e) => labelRowsAbove(e))\n );\n // Position centerline so labels above fit within rowH.\n const branchY = rowY + above * LINE_H + bodyMax / 2;\n const bInline = branchInlineWidth(branch);\n const startX = bx + H_SPACING + ((ex - bx - 2 * H_SPACING) - bInline) / 2;\n let bx0 = startX;\n let prevBX = bx;\n branch.elements.forEach((bel, beIdx) => {\n const w = bodyWidth(bel);\n const h = bodyHeight(bel);\n const slot = slotWidth(bel);\n const nx = bx0 + (slot - w) / 2;\n const ny = branchY - h / 2;\n const id = `R${rung.number}_P${elIdx}_B${bIdx}_E${beIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: bel,\n kind: elementKind(bel),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY: branchY,\n });\n addWire(prevBX, branchY, nx, branchY);\n prevBX = nx + w;\n bx0 += slot + H_SPACING;\n });\n addWire(prevBX, branchY, ex, branchY);\n rowY += rowH + PARALLEL_GAP;\n });\n\n prevRightX = ex;\n prevRightY = rungY;\n x = ex + H_SPACING;\n return;\n }\n\n const el = item;\n const w = bodyWidth(el);\n const h = bodyHeight(el);\n const slot = slotWidth(el);\n const nx = x + (slot - w) / 2;\n const ny = rungY - h / 2;\n const id = `R${rung.number}_E${elIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: el,\n kind: elementKind(el),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY,\n });\n addWire(prevRightX, prevRightY, nx, rungY);\n prevRightX = nx + w;\n prevRightY = rungY;\n x += slot + H_SPACING;\n });\n\n rungs.push({\n rung,\n index: rungIndex,\n y: rungY,\n endX: prevRightX,\n height: rungHeight,\n headerHeight: headerH,\n });\n if (prevRightX > maxEndX) maxEndX = prevRightX;\n cursorY += rungHeight;\n });\n\n const rightRailX = maxEndX + H_SPACING * 2;\n const width = rightRailX + RIGHT_RAIL_MARGIN;\n const height = cursorY + CANVAS_PADDING;\n\n for (const r of rungs) {\n wires.push({ path: `M ${r.endX} ${r.y} L ${rightRailX} ${r.y}` });\n }\n\n return {\n width,\n height,\n leftRailX: LEFT_RAIL_X,\n rightRailX,\n rungs,\n nodes,\n wires,\n };\n}\n\nexport { labelRowsAbove, labelRowsBelow };\n","import type {\n LadderAST,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n RenderConfig,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme, type IndustrialTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { layoutLadder, type LadderLayoutNode, wrapName } from \"./layout\";\n\ntype IT = ResolvedTheme<IndustrialTokens>;\n\nfunction buildCss(t: IT): string {\n return `\n.lt-ladder { font-family: system-ui, -apple-system, sans-serif; }\n.lt-ladder-rail { stroke: ${t.strokeHeavy}; stroke-width: 4; stroke-linecap: square; }\n.lt-ladder-wire { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-ladder-element { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-coil { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-fb { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }\n.lt-ladder-fb-name { font: bold 11px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-pin { font: 8px sans-serif; fill: ${t.stroke}; }\n.lt-ladder-name { font: 9px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-tag { font: 600 9px ui-monospace, SFMono-Regular, Menlo, monospace; fill: ${t.accent}; text-anchor: middle; }\n.lt-ladder-addr { font: 600 8.5px ui-monospace, monospace; fill: ${t.error}; text-anchor: middle; }\n.lt-ladder-rung-num { font: 10px sans-serif; fill: ${t.textMuted}; text-anchor: end; }\n.lt-ladder-comment { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.lt-ladder-title { font: bold 15px sans-serif; fill: ${t.text}; }\n.lt-ladder-symbol-label { font: bold 10px sans-serif; fill: ${t.stroke}; text-anchor: middle; }\n`.trim();\n}\n\nconst LINE_H = 11;\n\nfunction labelsAbove(\n name: string | undefined,\n tag: string,\n cx: number,\n bodyTopY: number\n): string[] {\n const pieces: string[] = [];\n const nameLines = name ? wrapName(name) : [];\n const totalLines = nameLines.length + 1; // +1 for tag\n const firstY = bodyTopY - 4 - (totalLines - 1) * LINE_H;\n nameLines.forEach((line, i) => {\n pieces.push(\n text({ x: cx, y: firstY + i * LINE_H, class: \"lt-ladder-name\" }, line)\n );\n });\n pieces.push(\n text(\n { x: cx, y: firstY + nameLines.length * LINE_H, class: \"lt-ladder-tag\" },\n tag\n )\n );\n return pieces;\n}\n\nfunction renderContact(node: LadderLayoutNode): string {\n const c = node.element as LadderContact;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const leftBarX = x + 4;\n const rightBarX = x + w - 4;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: leftBarX, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: leftBarX, y1: y, x2: leftBarX, y2: y + h, class: \"lt-ladder-element\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: y, x2: rightBarX, y2: y + h, class: \"lt-ladder-element\" }));\n\n if (c.contactType === \"XIO\") {\n pieces.push(\n el(\"line\", {\n x1: leftBarX + 2,\n y1: y + h - 2,\n x2: rightBarX - 2,\n y2: y + 2,\n class: \"lt-ladder-element\",\n })\n );\n } else if (c.contactType === \"ONS\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↑\"));\n } else if (c.contactType === \"OSF\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↓\"));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"contact\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCoil(node: LadderLayoutNode): string {\n const c = node.element as LadderCoil;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n const leftArc = `M ${x + 6} ${y} A 10 ${h / 2} 0 0 0 ${x + 6} ${y + h}`;\n const rightArc = `M ${x + w - 6} ${y} A 10 ${h / 2} 0 0 1 ${x + w - 6} ${y + h}`;\n pieces.push(pathEl({ d: leftArc, class: \"lt-ladder-coil\" }));\n pieces.push(pathEl({ d: rightArc, class: \"lt-ladder-coil\" }));\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: x + 6, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w - 6, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n\n let inner = \"\";\n if (c.coilType === \"OTL\") inner = \"S\";\n else if (c.coilType === \"OTU\") inner = \"R\";\n else if (c.coilType === \"OTN\") inner = \"/\";\n if (inner) {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, inner));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"coil\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCompare(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 12, class: \"lt-ladder-fb-name\" }, fb.fbType));\n const entries = Object.entries(fb.params);\n entries.slice(0, 2).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 22 + i * 9, class: \"lt-ladder-pin\" }, `${k}:${v}`)\n );\n });\n pieces.push(el(\"line\", { x1: x - 2, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w, y1: cy, x2: x + w + 2, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"compare\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderFunctionBlock(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 14, class: \"lt-ladder-fb-name\" }, fb.fbType));\n\n pieces.push(\n el(\"line\", { x1: x - 6, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" })\n );\n pieces.push(\n el(\"line\", { x1: x + w, y1: cy, x2: x + w + 6, y2: cy, class: \"lt-ladder-wire\" })\n );\n\n const entries = Object.entries(fb.params);\n entries.slice(0, 3).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 28 + i * 9, class: \"lt-ladder-pin\" }, `${k}=${v}`)\n );\n });\n\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"function_block\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderNode(node: LadderLayoutNode): string {\n switch (node.kind) {\n case \"contact\":\n return renderContact(node);\n case \"coil\":\n return renderCoil(node);\n case \"compare\":\n return renderCompare(node);\n case \"function_block\":\n return renderFunctionBlock(node);\n }\n}\n\nexport function renderLadder(ast: LadderAST, config?: RenderConfig): string {\n const layout = layoutLadder(ast);\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 30 : 0;\n const width = layout.width;\n const height = layout.height + titleOffset;\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Ladder Logic\"));\n children.push(\n desc(`PLC ladder logic diagram with ${ast.rungs.length} rung${ast.rungs.length === 1 ? \"\" : \"s\"}`)\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(\n text({ x: layout.leftRailX, y: 20, class: \"lt-ladder-title\" }, ast.title)\n );\n }\n\n const inner: string[] = [];\n\n inner.push(\n el(\"line\", {\n x1: layout.leftRailX,\n y1: 0,\n x2: layout.leftRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n inner.push(\n el(\"line\", {\n x1: layout.rightRailX,\n y1: 0,\n x2: layout.rightRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n\n for (const r of layout.rungs) {\n inner.push(\n text(\n { x: layout.leftRailX - 6, y: r.y + 3, class: \"lt-ladder-rung-num\" },\n `Rung ${String(r.rung.number).padStart(3, \"0\")}`\n )\n );\n if (r.rung.comment) {\n // Place comment above the tallest element label on this rung (and above the parallel bus if any).\n const commentY = Math.max(14, r.y - (r.headerHeight + 6));\n inner.push(\n text(\n {\n x: layout.leftRailX + 10,\n y: commentY,\n class: \"lt-ladder-comment\",\n },\n `— ${r.rung.comment} —`\n )\n );\n }\n }\n\n for (const w of layout.wires) {\n inner.push(pathEl({ d: w.path, class: \"lt-ladder-wire\" }));\n }\n\n for (const n of layout.nodes) {\n inner.push(renderNode(n));\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-ladder\",\n role: \"img\",\n \"aria-labelledby\": \"lt-ladder-title lt-ladder-desc\",\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseLadderDSL } from \"./parser\";\nimport { renderLadder } from \"./renderer\";\n\nexport const ladder: DiagramPlugin = {\n type: \"ladder\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"ladder\");\n },\n parse: parseLadderDSL,\n\n render(text: string, config): string {\n const ast = parseLadderDSL(text);\n return renderLadder(ast, config);\n },\n};\n\nexport { parseLadderDSL } from \"./parser\";\nexport { renderLadder } from \"./renderer\";\nexport { layoutLadder } from \"./layout\";\n"]}
@@ -1,6 +1,6 @@
1
- import { parseLegendDirective, applyLegendOverrides, renderLegend } from './chunk-ZTSO3S4P.js';
1
+ import { parseLegendDirective, applyLegendOverrides, renderLegend } from './chunk-FO7BLCEW.js';
2
2
  import { resolveBaseTheme, STROKE_WIDTH, FONT_SIZE, cssCustomProperties } from './chunk-2VNMKOUO.js';
3
- import { text, title, desc, el, group, svgRoot, line, circle, polygon } from './chunk-WHJXRLFD.js';
3
+ import { text, title, desc, el, group, svgRoot, line, circle, polygon } from './chunk-SYYBKDL7.js';
4
4
 
5
5
  // src/diagrams/sociogram/parser.ts
6
6
  var SociogramParseError = class extends Error {
@@ -635,7 +635,6 @@ function buildCSS(ast, t) {
635
635
  return `
636
636
  .schematex-sociogram {${cssCustomProperties(t)}
637
637
  font-family: system-ui, -apple-system, sans-serif;
638
- background: ${t.bg};
639
638
  }
640
639
  .schematex-sociogram-node { fill: ${t.accent}; stroke: ${t.accent}; stroke-width: ${STROKE_WIDTH.normal}; }
641
640
  .schematex-sociogram-node-star { fill: ${rf.star}; stroke: ${t.warn}; stroke-width: ${STROKE_WIDTH.thick}; }
@@ -935,5 +934,5 @@ var sociogram = {
935
934
  };
936
935
 
937
936
  export { layoutSociogram, parseSociogram, renderSociogram, sociogram };
938
- //# sourceMappingURL=chunk-56LXBM45.js.map
939
- //# sourceMappingURL=chunk-56LXBM45.js.map
937
+ //# sourceMappingURL=chunk-ZQZNWAHH.js.map
938
+ //# sourceMappingURL=chunk-ZQZNWAHH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/sociogram/parser.ts","../src/diagrams/sociogram/layout.ts","../src/diagrams/sociogram/legend.ts","../src/diagrams/sociogram/renderer.ts","../src/diagrams/sociogram/index.ts"],"names":["line","text","clean","props"],"mappings":"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","file":"chunk-ZQZNWAHH.js","sourcesContent":["import { parseLegendDirective } from \"../../core/legend-parser\";\n\nexport class SociogramParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SociogramParseError\";\n }\n}\n\n// ─── AST Types ──────────────────────────────────────────────\n\nexport type SociogramLayout = \"circular\" | \"force-directed\" | \"concentric\";\nexport type EdgeValence = \"positive\" | \"negative\" | \"neutral\";\nexport type EdgeDirection = \"one-way\" | \"mutual\" | \"undirected\";\nexport type NodeRole = \"star\" | \"isolate\" | \"bridge\" | \"neglectee\" | \"rejected\";\nexport type SizingMode = \"uniform\" | \"in-degree\" | \"betweenness\";\nexport type ColoringMode = \"default\" | \"group\" | \"role\";\n\nexport interface SociogramNode {\n id: string;\n label?: string;\n group?: string;\n role?: NodeRole;\n size?: \"small\" | \"medium\" | \"large\";\n properties?: Record<string, string>;\n}\n\nexport interface SociogramEdge {\n from: string;\n to: string;\n direction: EdgeDirection;\n valence: EdgeValence;\n weight: number;\n label?: string;\n}\n\nexport interface SociogramGroup {\n id: string;\n label?: string;\n color?: string;\n members: string[];\n}\n\nexport interface SociogramConfig {\n layout: SociogramLayout;\n sizing: SizingMode;\n coloring: ColoringMode;\n highlight: string[];\n}\n\nexport interface SociogramAST {\n type: \"sociogram\";\n title?: string;\n config: SociogramConfig;\n nodes: SociogramNode[];\n edges: SociogramEdge[];\n groups: SociogramGroup[];\n legendOverrides?: import(\"../../core/types\").LegendOverrides;\n}\n\n// ─── Edge Operator Parsing ──────────────────────────────────\n\ninterface EdgeOp {\n direction: EdgeDirection;\n valence: EdgeValence;\n weight: number;\n}\n\nconst EDGE_OPS: [string, EdgeOp][] = [\n [\"<===>\", { direction: \"mutual\", valence: \"positive\", weight: 4 }],\n [\"===>\" , { direction: \"one-way\", valence: \"positive\", weight: 4 }],\n [\"<===\", { direction: \"one-way\", valence: \"positive\", weight: 4 }],\n [\"<==>\", { direction: \"mutual\", valence: \"positive\", weight: 3 }],\n [\"==>\" , { direction: \"one-way\", valence: \"positive\", weight: 3 }],\n [\"<==\", { direction: \"one-way\", valence: \"positive\", weight: 3 }],\n [\"===\", { direction: \"undirected\", valence: \"positive\", weight: 3 }],\n [\"<x->\", { direction: \"mutual\", valence: \"negative\", weight: 2 }],\n [\"-x>\", { direction: \"one-way\", valence: \"negative\", weight: 2 }],\n [\"<x-\", { direction: \"one-way\", valence: \"negative\", weight: 2 }],\n [\"-x-\", { direction: \"undirected\", valence: \"negative\", weight: 2 }],\n [\"<.->\", { direction: \"mutual\", valence: \"neutral\", weight: 2 }],\n [\".->\", { direction: \"one-way\", valence: \"neutral\", weight: 2 }], // part of -.>\n [\"-.-\", { direction: \"undirected\", valence: \"neutral\", weight: 2 }],\n [\"<->\", { direction: \"mutual\", valence: \"positive\", weight: 2 }],\n [\"->\", { direction: \"one-way\", valence: \"positive\", weight: 2 }],\n [\"<-\", { direction: \"one-way\", valence: \"positive\", weight: 2 }],\n [\"--\", { direction: \"undirected\", valence: \"positive\", weight: 2 }],\n];\n\nfunction findEdgeOp(line: string): { leftId: string; rightId: string; op: EdgeOp; rest: string } | null {\n for (const [opStr, op] of EDGE_OPS) {\n const idx = line.indexOf(` ${opStr} `);\n if (idx === -1) continue;\n\n const leftId = line.slice(0, idx).trim();\n const afterOp = line.slice(idx + opStr.length + 2).trim();\n\n if (!leftId || !/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(leftId)) continue;\n\n // Right side: ID [props]\n const rightMatch = afterOp.match(/^([a-zA-Z][a-zA-Z0-9_-]*)(.*)/);\n if (!rightMatch) continue;\n\n const rightId = rightMatch[1];\n const rest = rightMatch[2].trim();\n\n // Handle reverse direction\n if (opStr === \"<-\" || opStr === \"<==\" || opStr === \"<===\" || opStr === \"<x-\") {\n return { leftId: rightId, rightId: leftId, op: { ...op, direction: \"one-way\" }, rest };\n }\n\n return { leftId, rightId, op, rest };\n }\n\n // Try -.> which has the dot embedded\n const dashDotMatch = line.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\\s+-\\.>\\s+([a-zA-Z][a-zA-Z0-9_-]*)(.*)/);\n if (dashDotMatch) {\n return {\n leftId: dashDotMatch[1],\n rightId: dashDotMatch[2],\n op: { direction: \"one-way\", valence: \"neutral\", weight: 2 },\n rest: dashDotMatch[3].trim(),\n };\n }\n\n return null;\n}\n\n// ─── Property Parsing ───────────────────────────────────────\n\nfunction parseProperties(propsStr: string): Record<string, string> {\n const result: Record<string, string> = {};\n // Match key: \"value\" or key: value pairs\n const regex = /(\\w[\\w-]*):\\s*(?:\"([^\"]*)\"|([^\\s,\\]]+))/g;\n let match;\n while ((match = regex.exec(propsStr)) !== null) {\n result[match[1]] = match[2] ?? match[3];\n }\n return result;\n}\n\nfunction extractProps(line: string): { clean: string; props: Record<string, string> } {\n const bracketMatch = line.match(/\\[([^\\]]*)\\]/);\n if (!bracketMatch) return { clean: line, props: {} };\n const clean = line.slice(0, bracketMatch.index).trim();\n const props = parseProperties(bracketMatch[1]);\n return { clean, props };\n}\n\n// ─── Main Parser ────────────────────────────────────────────\n\nexport function parseSociogram(text: string): SociogramAST {\n const lines = text.split(\"\\n\");\n let lineIdx = 0;\n\n // Skip empty lines\n while (lineIdx < lines.length && !lines[lineIdx].trim()) lineIdx++;\n\n // Parse header\n const headerLine = lines[lineIdx]?.trim() ?? \"\";\n if (!headerLine.toLowerCase().startsWith(\"sociogram\")) {\n throw new SociogramParseError(\"Sociogram must start with 'sociogram'\");\n }\n lineIdx++;\n\n let titleStr: string | undefined;\n const titleMatch = headerLine.match(/\"([^\"]+)\"/);\n if (titleMatch) titleStr = titleMatch[1];\n\n const config: SociogramConfig = {\n layout: \"circular\",\n sizing: \"uniform\",\n coloring: \"default\",\n highlight: [\"stars\", \"isolates\"],\n };\n\n const nodes: SociogramNode[] = [];\n const edges: SociogramEdge[] = [];\n const groups: SociogramGroup[] = [];\n const nodeIds = new Set<string>();\n const legendOverrides: import(\"../../core/types\").LegendOverrides = {};\n let hasLegendOverrides = false;\n\n let currentGroup: SociogramGroup | null = null;\n\n while (lineIdx < lines.length) {\n const raw = lines[lineIdx];\n const trimmed = raw.trim();\n lineIdx++;\n\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n\n // Legend directives (legend.title, legend.position, legend.label, etc.)\n if (parseLegendDirective(trimmed, legendOverrides)) {\n hasLegendOverrides = true;\n continue;\n }\n\n // Config line\n if (trimmed.startsWith(\"config:\")) {\n const configBody = trimmed.slice(7).trim();\n const eqIdx = configBody.indexOf(\"=\");\n if (eqIdx !== -1) {\n const key = configBody.slice(0, eqIdx).trim();\n const val = configBody.slice(eqIdx + 1).trim();\n switch (key) {\n case \"layout\":\n if ([\"circular\", \"force-directed\", \"concentric\"].includes(val)) {\n config.layout = val as SociogramLayout;\n }\n break;\n case \"sizing\":\n if ([\"uniform\", \"in-degree\", \"betweenness\"].includes(val)) {\n config.sizing = val as SizingMode;\n }\n break;\n case \"coloring\":\n if ([\"default\", \"group\", \"role\"].includes(val)) {\n config.coloring = val as ColoringMode;\n }\n break;\n case \"highlight\":\n config.highlight = val.split(\",\").map((s) => s.trim());\n break;\n }\n }\n continue;\n }\n\n // Group definition\n if (trimmed.startsWith(\"group \")) {\n const { clean, props } = extractProps(trimmed.slice(6).trim());\n const groupId = clean.split(/\\s/)[0];\n currentGroup = {\n id: groupId,\n label: props.label ?? groupId,\n color: props.color,\n members: [],\n };\n groups.push(currentGroup);\n continue;\n }\n\n // Check indentation for group members\n const indent = raw.search(/\\S/);\n if (currentGroup && indent >= 4) {\n const { clean, props } = extractProps(trimmed);\n const memberId = clean.split(/\\s/)[0];\n if (memberId && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(memberId)) {\n currentGroup.members.push(memberId);\n if (!nodeIds.has(memberId)) {\n nodeIds.add(memberId);\n nodes.push({\n id: memberId,\n label: props.label,\n group: currentGroup.id,\n role: props.role as NodeRole | undefined,\n size: props.size as \"small\" | \"medium\" | \"large\" | undefined,\n });\n }\n continue;\n }\n }\n\n if (indent < 4) {\n currentGroup = null;\n }\n\n // Try edge parsing\n const edgeResult = findEdgeOp(trimmed);\n if (edgeResult) {\n const { leftId, rightId, op, rest } = edgeResult;\n const edgeProps = extractProps(rest).props;\n\n // Auto-register nodes\n for (const id of [leftId, rightId]) {\n if (!nodeIds.has(id)) {\n nodeIds.add(id);\n nodes.push({ id });\n }\n }\n\n const weight = edgeProps.weight ? Number(edgeProps.weight) : op.weight;\n\n edges.push({\n from: leftId,\n to: rightId,\n direction: op.direction,\n valence: op.valence,\n weight,\n label: edgeProps.label,\n });\n continue;\n }\n\n // Node definition: ID [props]\n const { clean, props } = extractProps(trimmed);\n const nodeId = clean.split(/\\s/)[0];\n if (nodeId && /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(nodeId) && !nodeIds.has(nodeId)) {\n nodeIds.add(nodeId);\n const node: SociogramNode = {\n id: nodeId,\n label: props.label,\n group: props.group,\n role: props.role as NodeRole | undefined,\n size: props.size as \"small\" | \"medium\" | \"large\" | undefined,\n };\n nodes.push(node);\n\n // Auto-add to group by group property\n if (props.group) {\n let grp = groups.find((g) => g.id === props.group);\n if (!grp) {\n grp = { id: props.group, members: [] };\n groups.push(grp);\n }\n grp.members.push(nodeId);\n }\n }\n }\n\n return {\n type: \"sociogram\",\n title: titleStr,\n config,\n nodes,\n edges,\n groups,\n legendOverrides: hasLegendOverrides ? legendOverrides : undefined,\n };\n}\n","import type {\n SociogramAST,\n SociogramNode,\n SociogramEdge,\n NodeRole,\n} from \"./parser\";\n\nexport interface SociogramLayoutNode {\n node: SociogramNode;\n x: number;\n y: number;\n radius: number;\n computedRole?: NodeRole;\n}\n\nexport interface SociogramLayoutEdge {\n edge: SociogramEdge;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nexport interface SociogramLayoutResult {\n width: number;\n height: number;\n nodes: SociogramLayoutNode[];\n edges: SociogramLayoutEdge[];\n ast: SociogramAST;\n}\n\n// ─── Metrics ────────────────────────────────────────────────\n\nfunction computeInDegree(nodeId: string, edges: SociogramEdge[]): number {\n let count = 0;\n for (const e of edges) {\n if (e.to === nodeId) count++;\n if (e.direction === \"mutual\" && e.from === nodeId) count++;\n if (e.direction === \"undirected\" && e.from === nodeId) count++;\n }\n return count;\n}\n\nfunction computeOutDegree(nodeId: string, edges: SociogramEdge[]): number {\n let count = 0;\n for (const e of edges) {\n if (e.from === nodeId) count++;\n if (e.direction === \"mutual\" && e.to === nodeId) count++;\n if (e.direction === \"undirected\" && e.to === nodeId) count++;\n }\n return count;\n}\n\nfunction autoDetectRole(\n node: SociogramNode,\n inDeg: number,\n outDeg: number,\n meanIn: number,\n sdIn: number,\n rejectionCount: number\n): NodeRole | undefined {\n if (node.role) return node.role;\n if (inDeg === 0 && outDeg === 0) return \"isolate\";\n if (inDeg === 0 && outDeg > 0) return \"neglectee\";\n if (rejectionCount >= 2) return \"rejected\";\n if (sdIn > 0 && inDeg >= meanIn + 1.5 * sdIn) return \"star\";\n return undefined;\n}\n\n// ─── Node Radius ────────────────────────────────────────────\n\nconst BASE_RADIUS = 20;\n\nfunction computeNodeRadius(\n node: SociogramNode,\n inDeg: number,\n sizing: string\n): number {\n if (node.size === \"small\") return 14;\n if (node.size === \"large\") return 30;\n if (sizing === \"in-degree\") {\n return Math.min(40, Math.max(14, 14 + inDeg * 4));\n }\n return BASE_RADIUS;\n}\n\n// ─── Circular Layout ────────────────────────────────────────\n\nfunction layoutCircular(ast: SociogramAST): SociogramLayoutResult {\n const n = ast.nodes.length;\n const radius = Math.max(120, n * 22);\n const canvasSize = radius * 2 + 160;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n // Compute metrics\n const inDegrees = new Map<string, number>();\n const outDegrees = new Map<string, number>();\n const rejections = new Map<string, number>();\n\n for (const node of ast.nodes) {\n inDegrees.set(node.id, computeInDegree(node.id, ast.edges));\n outDegrees.set(node.id, computeOutDegree(node.id, ast.edges));\n rejections.set(node.id, 0);\n }\n\n for (const e of ast.edges) {\n if (e.valence === \"negative\") {\n rejections.set(e.to, (rejections.get(e.to) ?? 0) + 1);\n }\n }\n\n const inVals = Array.from(inDegrees.values());\n const meanIn = inVals.reduce((a, b) => a + b, 0) / (inVals.length || 1);\n const sdIn = Math.sqrt(\n inVals.reduce((sum, v) => sum + (v - meanIn) ** 2, 0) / (inVals.length || 1)\n );\n\n // Sort nodes: group members adjacent, then by id\n const sortedNodes = [...ast.nodes];\n if (ast.groups.length > 0) {\n const groupOrder = new Map<string, number>();\n ast.groups.forEach((g, i) => {\n for (const m of g.members) groupOrder.set(m, i);\n });\n sortedNodes.sort((a, b) => {\n const ga = groupOrder.get(a.id) ?? 999;\n const gb = groupOrder.get(b.id) ?? 999;\n if (ga !== gb) return ga - gb;\n return a.id.localeCompare(b.id);\n });\n }\n\n const angleStep = (2 * Math.PI) / n;\n const startAngle = -Math.PI / 2;\n\n const layoutNodes: SociogramLayoutNode[] = sortedNodes.map((node, i) => {\n const angle = startAngle + i * angleStep;\n const inDeg = inDegrees.get(node.id) ?? 0;\n const outDeg = outDegrees.get(node.id) ?? 0;\n const rej = rejections.get(node.id) ?? 0;\n const nodeRadius = computeNodeRadius(node, inDeg, ast.config.sizing);\n const computedRole = autoDetectRole(node, inDeg, outDeg, meanIn, sdIn, rej);\n\n return {\n node,\n x: cx + radius * Math.cos(angle),\n y: cy + radius * Math.sin(angle),\n radius: nodeRadius,\n computedRole,\n };\n });\n\n const layoutEdges = computeEdgePositions(layoutNodes, ast.edges);\n\n return {\n width: canvasSize,\n height: canvasSize,\n nodes: layoutNodes,\n edges: layoutEdges,\n ast,\n };\n}\n\n// ─── Force-Directed Layout ─────────────────────────────────\n\nfunction layoutForceDirected(ast: SociogramAST): SociogramLayoutResult {\n const n = ast.nodes.length;\n const canvasSize = n <= 8 ? 400 : n <= 20 ? 600 : n <= 40 ? 800 : 1000;\n const padding = 60;\n\n // Compute metrics\n const inDegrees = new Map<string, number>();\n const outDegrees = new Map<string, number>();\n const rejections = new Map<string, number>();\n\n for (const node of ast.nodes) {\n inDegrees.set(node.id, computeInDegree(node.id, ast.edges));\n outDegrees.set(node.id, computeOutDegree(node.id, ast.edges));\n rejections.set(node.id, 0);\n }\n\n for (const e of ast.edges) {\n if (e.valence === \"negative\") {\n rejections.set(e.to, (rejections.get(e.to) ?? 0) + 1);\n }\n }\n\n const inVals = Array.from(inDegrees.values());\n const meanIn = inVals.reduce((a, b) => a + b, 0) / (inVals.length || 1);\n const sdIn = Math.sqrt(\n inVals.reduce((sum, v) => sum + (v - meanIn) ** 2, 0) / (inVals.length || 1)\n );\n\n // Initialize positions in a circle\n const initRadius = canvasSize * 0.3;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n const positions: { x: number; y: number }[] = ast.nodes.map((_, i) => {\n const angle = (2 * Math.PI * i) / n - Math.PI / 2;\n return {\n x: cx + initRadius * Math.cos(angle),\n y: cy + initRadius * Math.sin(angle),\n };\n });\n\n // Build adjacency for edges\n const nodeIdx = new Map<string, number>();\n ast.nodes.forEach((node, i) => nodeIdx.set(node.id, i));\n\n // Fruchterman-Reingold\n const area = (canvasSize - 2 * padding) ** 2;\n const k = Math.sqrt(area / Math.max(n, 1));\n const maxIterations = 200;\n let temperature = canvasSize / 8;\n const coolingRate = 0.95;\n const minDist = 60;\n\n for (let iter = 0; iter < maxIterations; iter++) {\n const disp: { dx: number; dy: number }[] = positions.map(() => ({ dx: 0, dy: 0 }));\n\n // Repulsive forces between all pairs\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = positions[i].x - positions[j].x;\n const dy = positions[i].y - positions[j].y;\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1);\n const force = (k * k) / dist;\n const fx = (dx / dist) * force;\n const fy = (dy / dist) * force;\n disp[i].dx += fx;\n disp[i].dy += fy;\n disp[j].dx -= fx;\n disp[j].dy -= fy;\n }\n }\n\n // Attractive forces along edges\n for (const edge of ast.edges) {\n const i = nodeIdx.get(edge.from);\n const j = nodeIdx.get(edge.to);\n if (i === undefined || j === undefined) continue;\n const dx = positions[i].x - positions[j].x;\n const dy = positions[i].y - positions[j].y;\n const dist = Math.max(Math.sqrt(dx * dx + dy * dy), 1);\n const force = (dist * dist) / k;\n const fx = (dx / dist) * force;\n const fy = (dy / dist) * force;\n disp[i].dx -= fx;\n disp[i].dy -= fy;\n disp[j].dx += fx;\n disp[j].dy += fy;\n }\n\n // Apply displacements, clamp to temperature\n for (let i = 0; i < n; i++) {\n const mag = Math.sqrt(disp[i].dx ** 2 + disp[i].dy ** 2);\n if (mag > 0) {\n const scale = Math.min(mag, temperature) / mag;\n positions[i].x += disp[i].dx * scale;\n positions[i].y += disp[i].dy * scale;\n }\n // Keep within bounds\n positions[i].x = Math.max(padding, Math.min(canvasSize - padding, positions[i].x));\n positions[i].y = Math.max(padding, Math.min(canvasSize - padding, positions[i].y));\n }\n\n // Enforce minimum distance\n for (let i = 0; i < n; i++) {\n for (let j = i + 1; j < n; j++) {\n const dx = positions[i].x - positions[j].x;\n const dy = positions[i].y - positions[j].y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < minDist && dist > 0) {\n const push = (minDist - dist) / 2;\n const nx = dx / dist;\n const ny = dy / dist;\n positions[i].x += nx * push;\n positions[i].y += ny * push;\n positions[j].x -= nx * push;\n positions[j].y -= ny * push;\n }\n }\n }\n\n temperature *= coolingRate;\n }\n\n const layoutNodes: SociogramLayoutNode[] = ast.nodes.map((node, i) => {\n const inDeg = inDegrees.get(node.id) ?? 0;\n const outDeg = outDegrees.get(node.id) ?? 0;\n const rej = rejections.get(node.id) ?? 0;\n const nodeRadius = computeNodeRadius(node, inDeg, ast.config.sizing);\n const computedRole = autoDetectRole(node, inDeg, outDeg, meanIn, sdIn, rej);\n return {\n node,\n x: positions[i].x,\n y: positions[i].y,\n radius: nodeRadius,\n computedRole,\n };\n });\n\n const layoutEdges = computeEdgePositions(layoutNodes, ast.edges);\n\n return {\n width: canvasSize,\n height: canvasSize,\n nodes: layoutNodes,\n edges: layoutEdges,\n ast,\n };\n}\n\n// ─── Edge Position Calculation ──────────────────────────────\n\nfunction computeEdgePositions(\n nodes: SociogramLayoutNode[],\n edges: SociogramEdge[]\n): SociogramLayoutEdge[] {\n const nodeMap = new Map<string, SociogramLayoutNode>();\n for (const n of nodes) nodeMap.set(n.node.id, n);\n\n return edges.map((edge) => {\n const fromNode = nodeMap.get(edge.from);\n const toNode = nodeMap.get(edge.to);\n if (!fromNode || !toNode) {\n return { edge, x1: 0, y1: 0, x2: 0, y2: 0 };\n }\n\n // Compute edge-to-edge (subtract radius from endpoints)\n const dx = toNode.x - fromNode.x;\n const dy = toNode.y - fromNode.y;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist === 0) return { edge, x1: fromNode.x, y1: fromNode.y, x2: toNode.x, y2: toNode.y };\n\n const nx = dx / dist;\n const ny = dy / dist;\n const markerGap = 10;\n\n return {\n edge,\n x1: fromNode.x + nx * (fromNode.radius + 2),\n y1: fromNode.y + ny * (fromNode.radius + 2),\n x2: toNode.x - nx * (toNode.radius + markerGap),\n y2: toNode.y - ny * (toNode.radius + markerGap),\n };\n });\n}\n\n// ─── Main Layout ────────────────────────────────────────────\n\nexport function layoutSociogram(ast: SociogramAST): SociogramLayoutResult {\n switch (ast.config.layout) {\n case \"force-directed\":\n return layoutForceDirected(ast);\n case \"circular\":\n default:\n return layoutCircular(ast);\n }\n}\n","/**\n * Auto-derive a LegendSpec from a sociogram AST.\n *\n * Sections (each emitted only when the corresponding encoding is present):\n * 1. Groups — color swatch per declared group (emits when coloring=\"group\"\n * or any group has an explicit color)\n * 2. Roles — sociometric role markers (star, isolate, neglectee, rejected)\n * — only roles actually used in the chart\n * 3. Ties — edge valence (positive solid, negative dashed red, neutral\n * dotted grey) — only valences actually used\n */\n\nimport type { SociogramAST, EdgeValence, NodeRole } from \"./parser\";\nimport type {\n LegendItem,\n LegendSection,\n LegendSpec,\n} from \"../../core/types\";\nimport type { BaseTheme } from \"../../core/theme\";\n\nconst SECTIONS: LegendSection[] = [\n { id: \"groups\", title: \"Groups\" },\n { id: \"roles\", title: \"Roles\" },\n { id: \"ties\", title: \"Ties\" },\n];\n\nexport function buildSociogramLegend(\n ast: SociogramAST,\n theme: BaseTheme\n): LegendSpec {\n const items: LegendItem[] = [];\n\n // Groups: when coloring=group or groups have explicit colors, list each.\n const colorByGroup = ast.config.coloring === \"group\" || ast.groups.some(g => g.color);\n if (colorByGroup) {\n ast.groups.forEach((g, i) => {\n const color = g.color ?? theme.palette[i % theme.palette.length];\n items.push({\n key: `group.${g.id}`,\n label: g.label ?? humanize(g.id),\n kind: \"fill\",\n color,\n section: \"groups\",\n });\n });\n }\n\n // Roles: emit each role actually used (star/isolate/neglectee/rejected).\n // \"bridge\" is excluded — it's a structural notion (no special visual).\n const usedRoles = new Set<NodeRole>();\n for (const n of ast.nodes) {\n if (n.role) usedRoles.add(n.role);\n }\n const roleOrder: NodeRole[] = [\"star\", \"isolate\", \"neglectee\", \"rejected\"];\n for (const r of roleOrder) {\n if (!usedRoles.has(r)) continue;\n items.push(roleItem(r, theme));\n }\n\n // Ties: emit each valence used.\n const usedValences = new Set<EdgeValence>();\n for (const e of ast.edges) usedValences.add(e.valence);\n const valOrder: EdgeValence[] = [\"positive\", \"negative\", \"neutral\"];\n for (const v of valOrder) {\n if (!usedValences.has(v)) continue;\n items.push(valenceItem(v, theme));\n }\n\n return {\n mode: \"auto\",\n title: \"Legend\",\n position: \"bottom-inline\",\n columns: 1,\n sections: SECTIONS,\n items,\n };\n}\n\nfunction roleItem(r: NodeRole, theme: BaseTheme): LegendItem {\n switch (r) {\n case \"star\":\n return {\n key: `role.${r}`,\n label: \"Star (sociometric center)\",\n kind: \"shape\",\n shape: \"circle\",\n fill: theme.warn,\n color: theme.warn,\n section: \"roles\",\n };\n case \"isolate\":\n return {\n key: `role.${r}`,\n label: \"Isolate\",\n kind: \"shape\",\n shape: \"circle\",\n fill: theme.fillMuted,\n color: theme.neutral,\n section: \"roles\",\n };\n case \"neglectee\":\n return {\n key: `role.${r}`,\n label: \"Neglectee\",\n kind: \"shape\",\n shape: \"circle\",\n fill: theme.fillMuted,\n color: theme.accent,\n section: \"roles\",\n };\n case \"rejected\":\n return {\n key: `role.${r}`,\n label: \"Rejected\",\n kind: \"shape\",\n shape: \"circle\",\n fill: theme.negative,\n color: theme.negative,\n section: \"roles\",\n };\n default:\n return {\n key: `role.${r}`,\n label: humanize(r),\n kind: \"shape\",\n shape: \"circle\",\n section: \"roles\",\n };\n }\n}\n\nfunction valenceItem(v: EdgeValence, theme: BaseTheme): LegendItem {\n switch (v) {\n case \"positive\":\n return {\n key: `valence.${v}`,\n label: \"Positive tie\",\n kind: \"line\",\n color: theme.positive,\n pattern: \"solid\",\n strokeWidth: 2,\n section: \"ties\",\n };\n case \"negative\":\n return {\n key: `valence.${v}`,\n label: \"Negative tie\",\n kind: \"line\",\n color: theme.negative,\n pattern: \"dashed\",\n strokeWidth: 2,\n section: \"ties\",\n };\n case \"neutral\":\n return {\n key: `valence.${v}`,\n label: \"Neutral tie\",\n kind: \"line\",\n color: theme.neutral,\n pattern: \"dotted\",\n strokeWidth: 2,\n section: \"ties\",\n };\n }\n}\n\nfunction humanize(s: string): string {\n return s.replace(/[-_]+/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","import type { SociogramAST, NodeRole } from \"./parser\";\nimport type { SociogramLayoutResult, SociogramLayoutNode } from \"./layout\";\nimport {\n svgRoot,\n el,\n group,\n circle,\n line,\n text,\n title,\n desc,\n polygon,\n} from \"../../core/svg\";\nimport { cssCustomProperties, resolveBaseTheme, FONT_SIZE, STROKE_WIDTH, type BaseTheme } from \"../../core/theme\";\nimport { applyLegendOverrides, renderLegend } from \"../../core/legend\";\nimport { buildSociogramLegend } from \"./legend\";\n\n// ─── Constants ──────────────────────────────────────────────\n\nconst LABEL_GAP = 4;\nconst LABEL_FONT_SIZE = 11;\n\nfunction valenceColors(t: BaseTheme) {\n return { positive: t.positive, negative: t.negative, neutral: t.neutral };\n}\n\nfunction roleFills(t: BaseTheme) {\n return { star: t.warn, isolate: t.fillMuted, rejected: t.negative };\n}\n\n// ─── CSS ────────────────────────────────────────────────────\n\nfunction buildCSS(ast: SociogramAST, t: BaseTheme): string {\n const vc = valenceColors(t);\n const rf = roleFills(t);\n const groupColors = ast.groups.map((g, i) => {\n const color = g.color ?? t.palette[i % t.palette.length];\n return `.schematex-sociogram-group-${g.id} { fill: ${color}; stroke: ${color}; }`;\n });\n\n return `\n.schematex-sociogram {${cssCustomProperties(t)}\n font-family: system-ui, -apple-system, sans-serif;\n}\n.schematex-sociogram-node { fill: ${t.accent}; stroke: ${t.accent}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-sociogram-node-star { fill: ${rf.star}; stroke: ${t.warn}; stroke-width: ${STROKE_WIDTH.thick}; }\n.schematex-sociogram-node-isolate { fill: ${rf.isolate}; stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4 3; }\n.schematex-sociogram-node-neglectee { fill: ${t.fillMuted}; stroke: ${t.accent}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4 3; }\n.schematex-sociogram-node-rejected { fill: ${rf.rejected}; stroke: ${t.negative}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4 3; }\n.schematex-sociogram-edge { stroke-linecap: round; }\n.schematex-sociogram-edge-positive { stroke: ${vc.positive}; }\n.schematex-sociogram-edge-negative { stroke: ${vc.negative}; stroke-dasharray: 6 3; }\n.schematex-sociogram-edge-neutral { stroke: ${vc.neutral}; stroke-dasharray: 2 3; }\n.schematex-sociogram-label { font-size: ${LABEL_FONT_SIZE}px; fill: ${t.text}; text-anchor: middle; }\n.schematex-sociogram-edge-label { font-size: ${FONT_SIZE.small}px; fill: ${t.textMuted}; text-anchor: middle; }\n.schematex-sociogram-title { font-size: ${FONT_SIZE.title}px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }\n.schematex-sociogram-star-badge { font-size: 10px; fill: ${t.warn}; }\n.schematex-sociogram-group-label { font-size: 13px; font-weight: bold; fill-opacity: 0.7; text-anchor: middle; }\n${groupColors.join(\"\\n\")}\n`.trim();\n}\n\n// ─── Defs (Arrow Markers) ───────────────────────────────────\n\nfunction buildDefs(t: BaseTheme): string {\n const vc = valenceColors(t);\n const markers = [\n { id: \"sociogram-arrow\", fill: vc.positive },\n { id: \"sociogram-arrow-negative\", fill: vc.negative },\n { id: \"sociogram-arrow-neutral\", fill: vc.neutral },\n ];\n\n const markerEls = markers.map((m) =>\n el(\n \"marker\",\n {\n id: m.id,\n viewBox: \"0 0 10 10\",\n refX: \"9\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto\",\n },\n el(\"path\", { d: \"M 0 0 L 10 5 L 0 10 z\", fill: m.fill })\n )\n );\n\n return el(\"defs\", {}, markerEls);\n}\n\n// ─── Edge Weight → Stroke Width ─────────────────────────────\n\nfunction edgeStrokeWidth(weight: number): number {\n if (weight <= 1) return 1;\n if (weight === 2) return 2;\n if (weight === 3) return 3.5;\n return 5;\n}\n\n// ─── Node Rendering ─────────────────────────────────────────\n\nfunction getNodeClass(role?: NodeRole): string {\n if (!role) return \"schematex-sociogram-node\";\n switch (role) {\n case \"star\": return \"schematex-sociogram-node schematex-sociogram-node-star\";\n case \"isolate\": return \"schematex-sociogram-node schematex-sociogram-node-isolate\";\n case \"neglectee\": return \"schematex-sociogram-node schematex-sociogram-node-neglectee\";\n case \"rejected\": return \"schematex-sociogram-node schematex-sociogram-node-rejected\";\n case \"bridge\": return \"schematex-sociogram-node\";\n default: return \"schematex-sociogram-node\";\n }\n}\n\nfunction getNodeFill(\n node: SociogramLayoutNode,\n ast: SociogramAST,\n t: BaseTheme\n): string | undefined {\n const role = node.computedRole ?? node.node.role;\n const rf = roleFills(t);\n\n if (ast.config.coloring === \"role\" && role) {\n return rf[role as keyof typeof rf];\n }\n\n if (ast.config.coloring === \"group\" && node.node.group) {\n const gIdx = ast.groups.findIndex((g) => g.id === node.node.group);\n if (gIdx >= 0) {\n return ast.groups[gIdx].color ?? t.palette[gIdx % t.palette.length];\n }\n }\n\n return undefined;\n}\n\nfunction renderNodes(\n layout: SociogramLayoutResult,\n t: BaseTheme\n): { nodeEls: string[]; labelEls: string[] } {\n const nodeEls: string[] = [];\n const labelEls: string[] = [];\n const { ast } = layout;\n\n for (const layoutNode of layout.nodes) {\n const { node, x, y, radius, computedRole } = layoutNode;\n const role = computedRole ?? node.role;\n const cls = getNodeClass(role);\n const fill = getNodeFill(layoutNode, ast, t);\n\n const attrs: Record<string, string | number | undefined> = {\n cx: x,\n cy: y,\n r: radius,\n class: cls,\n \"data-node-id\": node.id,\n };\n if (fill) attrs.fill = fill;\n\n nodeEls.push(circle(attrs));\n\n // Star badge\n if (role === \"star\") {\n const badgeX = x + radius * 0.6;\n const badgeY = y - radius * 0.6;\n const s = 6;\n const points = starPoints(badgeX, badgeY, s, s * 0.4, 5);\n nodeEls.push(\n polygon({\n points,\n fill: t.warn,\n class: \"schematex-sociogram-star-badge\",\n })\n );\n }\n\n // Label\n const label = node.label ?? node.id;\n labelEls.push(\n text(\n {\n x,\n y: y + radius + LABEL_GAP + LABEL_FONT_SIZE,\n class: \"schematex-sociogram-label\",\n \"data-node-id\": node.id,\n },\n label\n )\n );\n }\n\n return { nodeEls, labelEls };\n}\n\nfunction starPoints(\n cx: number,\n cy: number,\n outerR: number,\n innerR: number,\n points: number\n): string {\n const coords: string[] = [];\n for (let i = 0; i < points * 2; i++) {\n const angle = (Math.PI * i) / points - Math.PI / 2;\n const r = i % 2 === 0 ? outerR : innerR;\n coords.push(`${cx + r * Math.cos(angle)},${cy + r * Math.sin(angle)}`);\n }\n return coords.join(\" \");\n}\n\n// ─── Edge Rendering ─────────────────────────────────────────\n\nfunction getMarkerUrl(valence: string, direction: string): {\n start?: string;\n end?: string;\n} {\n if (direction === \"undirected\") return {};\n\n const markerId =\n valence === \"negative\"\n ? \"sociogram-arrow-negative\"\n : valence === \"neutral\"\n ? \"sociogram-arrow-neutral\"\n : \"sociogram-arrow\";\n\n if (direction === \"mutual\") {\n return {\n start: `url(#${markerId})`,\n end: `url(#${markerId})`,\n };\n }\n\n return { end: `url(#${markerId})` };\n}\n\nfunction renderEdges(layout: SociogramLayoutResult): {\n edgeEls: string[];\n edgeLabelEls: string[];\n} {\n const edgeEls: string[] = [];\n const edgeLabelEls: string[] = [];\n\n for (const layoutEdge of layout.edges) {\n const { edge, x1, y1, x2, y2 } = layoutEdge;\n const valenceClass = `schematex-sociogram-edge-${edge.valence}`;\n const markers = getMarkerUrl(edge.valence, edge.direction);\n const sw = edgeStrokeWidth(edge.weight);\n\n const attrs: Record<string, string | number | undefined> = {\n x1,\n y1,\n x2,\n y2,\n class: `schematex-sociogram-edge ${valenceClass}`,\n \"stroke-width\": sw,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n };\n\n if (markers.end) attrs[\"marker-end\"] = markers.end;\n if (markers.start) attrs[\"marker-start\"] = markers.start;\n\n edgeEls.push(line(attrs));\n\n // Edge label\n if (edge.label) {\n const mx = (x1 + x2) / 2;\n const my = (y1 + y2) / 2;\n edgeLabelEls.push(\n text(\n { x: mx, y: my - 6, class: \"schematex-sociogram-edge-label\" },\n edge.label\n )\n );\n }\n }\n\n return { edgeEls, edgeLabelEls };\n}\n\n// ─── Group Background Labels ────────────────────────────────\n\nfunction renderGroupLabels(layout: SociogramLayoutResult, t: BaseTheme): string[] {\n const elements: string[] = [];\n const { ast } = layout;\n\n for (let gi = 0; gi < ast.groups.length; gi++) {\n const grp = ast.groups[gi];\n const memberNodes = layout.nodes.filter(\n (n) => n.node.group === grp.id\n );\n if (memberNodes.length === 0) continue;\n\n const color = grp.color ?? t.palette[gi % t.palette.length];\n const cx = memberNodes.reduce((s, n) => s + n.x, 0) / memberNodes.length;\n const minY = Math.min(...memberNodes.map((n) => n.y - n.radius));\n\n elements.push(\n text(\n {\n x: cx,\n y: minY - 14,\n class: \"schematex-sociogram-group-label\",\n fill: color,\n },\n grp.label ?? grp.id\n )\n );\n }\n\n return elements;\n}\n\n// ─── Main Renderer ──────────────────────────────────────────\n\nexport function renderSociogram(\n layout: SociogramLayoutResult,\n options: { theme?: string } = {}\n): string {\n const { ast } = layout;\n const t = resolveBaseTheme(options.theme ?? \"default\");\n\n const css = buildCSS(ast, t);\n const defsStr = buildDefs(t);\n\n const titleOffset = ast.title ? 30 : 0;\n const totalWidth = layout.width;\n const totalHeight = layout.height + titleOffset;\n\n const { edgeEls, edgeLabelEls } = renderEdges(layout);\n const { nodeEls, labelEls } = renderNodes(layout, t);\n const groupLabelEls = renderGroupLabels(layout, t);\n\n const titleEl = ast.title\n ? text(\n { x: totalWidth / 2, y: 20, class: \"schematex-sociogram-title\" },\n ast.title\n )\n : \"\";\n\n const transformY = titleOffset;\n const transform = transformY ? `translate(0,${transformY})` : undefined;\n\n const svgContent: string[] = [\n title(`Sociogram${ast.title ? `: ${ast.title}` : \"\"}`),\n desc(\n `Sociogram with ${ast.nodes.length} members and ${ast.edges.length} connections`\n ),\n el(\"style\", {}, css),\n defsStr,\n ];\n\n if (titleEl) svgContent.push(titleEl);\n\n if (groupLabelEls.length > 0) {\n svgContent.push(\n group({ class: \"schematex-sociogram-groups\", transform }, groupLabelEls)\n );\n }\n\n svgContent.push(\n group({ class: \"schematex-sociogram-edges\", transform }, [\n ...edgeEls,\n ...edgeLabelEls,\n ])\n );\n\n svgContent.push(\n group({ class: \"schematex-sociogram-nodes\", transform }, nodeEls)\n );\n\n svgContent.push(\n group({ class: \"schematex-sociogram-labels\", transform }, labelEls)\n );\n\n // Compose legend\n let finalWidth = totalWidth;\n let finalHeight = totalHeight;\n const autoSpec = buildSociogramLegend(ast, t);\n const finalSpec = applyLegendOverrides(autoSpec, ast.legendOverrides);\n if (finalSpec.mode === \"on\" && finalSpec.items.length > 0) {\n const { svg: legendSvg, bbox: lb } = renderLegend(\n finalSpec,\n {\n canvasWidth: totalWidth,\n canvasHeight: totalHeight,\n padding: 16,\n titleHeight: titleOffset,\n },\n t,\n { fontFamily: \"system-ui, sans-serif\", fontSize: 12 }\n );\n if (legendSvg) {\n svgContent.push(legendSvg);\n const overflowX = lb.x + lb.w + 8;\n const overflowY = lb.y + lb.h + 8;\n if (overflowX > finalWidth) finalWidth = overflowX;\n if (overflowY > finalHeight) finalHeight = overflowY;\n }\n }\n\n return svgRoot(\n {\n class: \"schematex-diagram schematex-sociogram\",\n viewBox: `0 0 ${finalWidth} ${finalHeight}`,\n width: finalWidth,\n height: finalHeight,\n },\n svgContent\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseSociogram } from \"./parser\";\nimport { layoutSociogram } from \"./layout\";\nimport { renderSociogram } from \"./renderer\";\n\nexport const sociogram: DiagramPlugin = {\n type: \"sociogram\",\n\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"sociogram\");\n },\n\n parse: parseSociogram,\n\n render(text: string, config): string {\n const ast = parseSociogram(text);\n const layout = layoutSociogram(ast);\n return renderSociogram(layout, { theme: config?.theme });\n },\n};\n\nexport { parseSociogram } from \"./parser\";\nexport { layoutSociogram } from \"./layout\";\nexport { renderSociogram } from \"./renderer\";\n"]}
@@ -1,25 +1,25 @@
1
1
  'use strict';
2
2
 
3
- var chunk2UJAVPA4_cjs = require('../../chunk-2UJAVPA4.cjs');
4
- require('../../chunk-LFZZ4NCP.cjs');
3
+ var chunkCS67UBP3_cjs = require('../../chunk-CS67UBP3.cjs');
4
+ require('../../chunk-3WNW5Y7P.cjs');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "blockdiagram", {
9
9
  enumerable: true,
10
- get: function () { return chunk2UJAVPA4_cjs.blockdiagram; }
10
+ get: function () { return chunkCS67UBP3_cjs.blockdiagram; }
11
11
  });
12
12
  Object.defineProperty(exports, "layoutBlockDiagram", {
13
13
  enumerable: true,
14
- get: function () { return chunk2UJAVPA4_cjs.layoutBlockDiagram; }
14
+ get: function () { return chunkCS67UBP3_cjs.layoutBlockDiagram; }
15
15
  });
16
16
  Object.defineProperty(exports, "parseBlockDiagram", {
17
17
  enumerable: true,
18
- get: function () { return chunk2UJAVPA4_cjs.parseBlockDiagram; }
18
+ get: function () { return chunkCS67UBP3_cjs.parseBlockDiagram; }
19
19
  });
20
20
  Object.defineProperty(exports, "renderBlockDiagram", {
21
21
  enumerable: true,
22
- get: function () { return chunk2UJAVPA4_cjs.renderBlockDiagram; }
22
+ get: function () { return chunkCS67UBP3_cjs.renderBlockDiagram; }
23
23
  });
24
24
  //# sourceMappingURL=index.cjs.map
25
25
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { B as BlockAST, D as DiagramPlugin } from '../../types-BtiUg7Gx.cjs';
1
+ import { B as BlockAST, D as DiagramPlugin } from '../../types-DnU2UlWz.cjs';
2
2
 
3
3
  declare function parseBlockDiagram(text: string): BlockAST;
4
4
 
@@ -1,4 +1,4 @@
1
- import { B as BlockAST, D as DiagramPlugin } from '../../types-BtiUg7Gx.js';
1
+ import { B as BlockAST, D as DiagramPlugin } from '../../types-DnU2UlWz.js';
2
2
 
3
3
  declare function parseBlockDiagram(text: string): BlockAST;
4
4
 
@@ -1,4 +1,4 @@
1
- export { blockdiagram, layoutBlockDiagram, parseBlockDiagram, renderBlockDiagram } from '../../chunk-F6OROIHS.js';
2
- import '../../chunk-WHJXRLFD.js';
1
+ export { blockdiagram, layoutBlockDiagram, parseBlockDiagram, renderBlockDiagram } from '../../chunk-5CTERELC.js';
2
+ import '../../chunk-SYYBKDL7.js';
3
3
  //# sourceMappingURL=index.js.map
4
4
  //# sourceMappingURL=index.js.map
@@ -1,34 +1,34 @@
1
1
  'use strict';
2
2
 
3
- var chunkXUEROLSB_cjs = require('../../chunk-XUEROLSB.cjs');
3
+ var chunk4THC4VUA_cjs = require('../../chunk-4THC4VUA.cjs');
4
4
  require('../../chunk-D7EHZFK4.cjs');
5
- require('../../chunk-LFZZ4NCP.cjs');
5
+ require('../../chunk-3WNW5Y7P.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "circuit", {
10
10
  enumerable: true,
11
- get: function () { return chunkXUEROLSB_cjs.circuit; }
11
+ get: function () { return chunk4THC4VUA_cjs.circuit; }
12
12
  });
13
13
  Object.defineProperty(exports, "layoutCircuit", {
14
14
  enumerable: true,
15
- get: function () { return chunkXUEROLSB_cjs.layoutCircuit; }
15
+ get: function () { return chunk4THC4VUA_cjs.layoutCircuit; }
16
16
  });
17
17
  Object.defineProperty(exports, "layoutCircuitNetlist", {
18
18
  enumerable: true,
19
- get: function () { return chunkXUEROLSB_cjs.layoutCircuitNetlist; }
19
+ get: function () { return chunk4THC4VUA_cjs.layoutCircuitNetlist; }
20
20
  });
21
21
  Object.defineProperty(exports, "parseCircuit", {
22
22
  enumerable: true,
23
- get: function () { return chunkXUEROLSB_cjs.parseCircuit; }
23
+ get: function () { return chunk4THC4VUA_cjs.parseCircuit; }
24
24
  });
25
25
  Object.defineProperty(exports, "parseNetlist", {
26
26
  enumerable: true,
27
- get: function () { return chunkXUEROLSB_cjs.parseNetlist; }
27
+ get: function () { return chunk4THC4VUA_cjs.parseNetlist; }
28
28
  });
29
29
  Object.defineProperty(exports, "renderCircuit", {
30
30
  enumerable: true,
31
- get: function () { return chunkXUEROLSB_cjs.renderCircuit; }
31
+ get: function () { return chunk4THC4VUA_cjs.renderCircuit; }
32
32
  });
33
33
  //# sourceMappingURL=index.cjs.map
34
34
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { C as CircuitAST, R as RenderConfig, p as CircuitComponent, D as DiagramPlugin } from '../../types-BtiUg7Gx.cjs';
1
+ import { C as CircuitAST, R as RenderConfig, p as CircuitComponent, D as DiagramPlugin } from '../../types-DnU2UlWz.cjs';
2
2
 
3
3
  /**
4
4
  * Top-level circuit parser. Detects two DSL modes:
@@ -1,4 +1,4 @@
1
- import { C as CircuitAST, R as RenderConfig, p as CircuitComponent, D as DiagramPlugin } from '../../types-BtiUg7Gx.js';
1
+ import { C as CircuitAST, R as RenderConfig, p as CircuitComponent, D as DiagramPlugin } from '../../types-DnU2UlWz.js';
2
2
 
3
3
  /**
4
4
  * Top-level circuit parser. Detects two DSL modes:
@@ -1,5 +1,5 @@
1
- export { circuit, layoutCircuit, layoutCircuitNetlist, parseCircuit, parseNetlist, renderCircuit } from '../../chunk-ZNLEUL7T.js';
1
+ export { circuit, layoutCircuit, layoutCircuitNetlist, parseCircuit, parseNetlist, renderCircuit } from '../../chunk-5SKT7RYR.js';
2
2
  import '../../chunk-2VNMKOUO.js';
3
- import '../../chunk-WHJXRLFD.js';
3
+ import '../../chunk-SYYBKDL7.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map
@@ -1,31 +1,31 @@
1
1
  'use strict';
2
2
 
3
- var chunkUK7JF5QB_cjs = require('../../chunk-UK7JF5QB.cjs');
4
- require('../../chunk-75BMFCP5.cjs');
3
+ var chunk3MJKJX27_cjs = require('../../chunk-3MJKJX27.cjs');
4
+ require('../../chunk-5UCXMYE7.cjs');
5
5
  require('../../chunk-D7EHZFK4.cjs');
6
- require('../../chunk-LFZZ4NCP.cjs');
6
+ require('../../chunk-3WNW5Y7P.cjs');
7
7
 
8
8
 
9
9
 
10
10
  Object.defineProperty(exports, "EcomapParseError", {
11
11
  enumerable: true,
12
- get: function () { return chunkUK7JF5QB_cjs.EcomapParseError; }
12
+ get: function () { return chunk3MJKJX27_cjs.EcomapParseError; }
13
13
  });
14
14
  Object.defineProperty(exports, "ecomap", {
15
15
  enumerable: true,
16
- get: function () { return chunkUK7JF5QB_cjs.ecomap; }
16
+ get: function () { return chunk3MJKJX27_cjs.ecomap; }
17
17
  });
18
18
  Object.defineProperty(exports, "layoutEcomap", {
19
19
  enumerable: true,
20
- get: function () { return chunkUK7JF5QB_cjs.layoutEcomap; }
20
+ get: function () { return chunk3MJKJX27_cjs.layoutEcomap; }
21
21
  });
22
22
  Object.defineProperty(exports, "parseEcomap", {
23
23
  enumerable: true,
24
- get: function () { return chunkUK7JF5QB_cjs.parseEcomap; }
24
+ get: function () { return chunk3MJKJX27_cjs.parseEcomap; }
25
25
  });
26
26
  Object.defineProperty(exports, "renderEcomap", {
27
27
  enumerable: true,
28
- get: function () { return chunkUK7JF5QB_cjs.renderEcomap; }
28
+ get: function () { return chunk3MJKJX27_cjs.renderEcomap; }
29
29
  });
30
30
  //# sourceMappingURL=index.cjs.map
31
31
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { a as DiagramAST, L as LayoutConfig, b as LayoutResult, R as RenderConfig, D as DiagramPlugin } from '../../types-BtiUg7Gx.cjs';
1
+ import { a as DiagramAST, L as LayoutConfig, b as LayoutResult, R as RenderConfig, D as DiagramPlugin } from '../../types-DnU2UlWz.cjs';
2
2
 
3
3
  declare class EcomapParseError extends Error {
4
4
  line: number;
@@ -1,4 +1,4 @@
1
- import { a as DiagramAST, L as LayoutConfig, b as LayoutResult, R as RenderConfig, D as DiagramPlugin } from '../../types-BtiUg7Gx.js';
1
+ import { a as DiagramAST, L as LayoutConfig, b as LayoutResult, R as RenderConfig, D as DiagramPlugin } from '../../types-DnU2UlWz.js';
2
2
 
3
3
  declare class EcomapParseError extends Error {
4
4
  line: number;
@@ -1,6 +1,6 @@
1
- export { EcomapParseError, ecomap, layoutEcomap, parseEcomap, renderEcomap } from '../../chunk-IT2TVXC7.js';
2
- import '../../chunk-ZTSO3S4P.js';
1
+ export { EcomapParseError, ecomap, layoutEcomap, parseEcomap, renderEcomap } from '../../chunk-LPKVIRYT.js';
2
+ import '../../chunk-FO7BLCEW.js';
3
3
  import '../../chunk-2VNMKOUO.js';
4
- import '../../chunk-WHJXRLFD.js';
4
+ import '../../chunk-SYYBKDL7.js';
5
5
  //# sourceMappingURL=index.js.map
6
6
  //# sourceMappingURL=index.js.map
@@ -1,26 +1,26 @@
1
1
  'use strict';
2
2
 
3
- var chunkXI6JOG76_cjs = require('../../chunk-XI6JOG76.cjs');
3
+ var chunkV4OVUBLA_cjs = require('../../chunk-V4OVUBLA.cjs');
4
4
  require('../../chunk-D7EHZFK4.cjs');
5
- require('../../chunk-LFZZ4NCP.cjs');
5
+ require('../../chunk-3WNW5Y7P.cjs');
6
6
 
7
7
 
8
8
 
9
9
  Object.defineProperty(exports, "entity", {
10
10
  enumerable: true,
11
- get: function () { return chunkXI6JOG76_cjs.entity; }
11
+ get: function () { return chunkV4OVUBLA_cjs.entity; }
12
12
  });
13
13
  Object.defineProperty(exports, "layoutEntity", {
14
14
  enumerable: true,
15
- get: function () { return chunkXI6JOG76_cjs.layoutEntity; }
15
+ get: function () { return chunkV4OVUBLA_cjs.layoutEntity; }
16
16
  });
17
17
  Object.defineProperty(exports, "parseEntityDSL", {
18
18
  enumerable: true,
19
- get: function () { return chunkXI6JOG76_cjs.parseEntityDSL; }
19
+ get: function () { return chunkV4OVUBLA_cjs.parseEntityDSL; }
20
20
  });
21
21
  Object.defineProperty(exports, "renderEntity", {
22
22
  enumerable: true,
23
- get: function () { return chunkXI6JOG76_cjs.renderEntity; }
23
+ get: function () { return chunkV4OVUBLA_cjs.renderEntity; }
24
24
  });
25
25
  //# sourceMappingURL=index.cjs.map
26
26
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { E as EntityAST, R as RenderConfig, j as EntityNode, k as EntityEdge, D as DiagramPlugin } from '../../types-BtiUg7Gx.cjs';
1
+ import { E as EntityAST, R as RenderConfig, j as EntityNode, k as EntityEdge, D as DiagramPlugin } from '../../types-DnU2UlWz.cjs';
2
2
 
3
3
  declare function parseEntityDSL(text: string): EntityAST;
4
4
 
@@ -1,4 +1,4 @@
1
- import { E as EntityAST, R as RenderConfig, j as EntityNode, k as EntityEdge, D as DiagramPlugin } from '../../types-BtiUg7Gx.js';
1
+ import { E as EntityAST, R as RenderConfig, j as EntityNode, k as EntityEdge, D as DiagramPlugin } from '../../types-DnU2UlWz.js';
2
2
 
3
3
  declare function parseEntityDSL(text: string): EntityAST;
4
4
 
@@ -1,5 +1,5 @@
1
- export { entity, layoutEntity, parseEntityDSL, renderEntity } from '../../chunk-NFT6VW73.js';
1
+ export { entity, layoutEntity, parseEntityDSL, renderEntity } from '../../chunk-DHKKDIVT.js';
2
2
  import '../../chunk-2VNMKOUO.js';
3
- import '../../chunk-WHJXRLFD.js';
3
+ import '../../chunk-SYYBKDL7.js';
4
4
  //# sourceMappingURL=index.js.map
5
5
  //# sourceMappingURL=index.js.map