schematex 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (178) hide show
  1. package/README.md +5 -4
  2. package/dist/ai/ai-sdk.cjs +20 -19
  3. package/dist/ai/ai-sdk.cjs.map +1 -1
  4. package/dist/ai/ai-sdk.d.cts +2 -2
  5. package/dist/ai/ai-sdk.d.ts +2 -2
  6. package/dist/ai/ai-sdk.js +15 -14
  7. package/dist/ai/ai-sdk.js.map +1 -1
  8. package/dist/ai/index.cjs +23 -22
  9. package/dist/ai/index.d.cts +2 -2
  10. package/dist/ai/index.d.ts +2 -2
  11. package/dist/ai/index.js +15 -14
  12. package/dist/{api-BuFilDQB.d.cts → api-BIj9t4Oc.d.cts} +1 -1
  13. package/dist/{api-BuFilDQB.d.ts → api-BIj9t4Oc.d.ts} +1 -1
  14. package/dist/browser.cjs +17 -16
  15. package/dist/browser.cjs.map +1 -1
  16. package/dist/browser.d.cts +2 -2
  17. package/dist/browser.d.ts +2 -2
  18. package/dist/browser.js +15 -14
  19. package/dist/browser.js.map +1 -1
  20. package/dist/{chunk-4THC4VUA.cjs → chunk-2Z543TC3.cjs} +7 -6
  21. package/dist/chunk-2Z543TC3.cjs.map +1 -0
  22. package/dist/{chunk-DNZV4V4R.js → chunk-3ADSXODY.js} +428 -10
  23. package/dist/chunk-3ADSXODY.js.map +1 -0
  24. package/dist/{chunk-ZKDL6Y3O.js → chunk-5FF2IT3C.js} +5 -4
  25. package/dist/chunk-5FF2IT3C.js.map +1 -0
  26. package/dist/chunk-5IKOLUWK.js +89 -0
  27. package/dist/chunk-5IKOLUWK.js.map +1 -0
  28. package/dist/{chunk-3RAVPXLN.js → chunk-6URNSB6G.js} +5 -4
  29. package/dist/chunk-6URNSB6G.js.map +1 -0
  30. package/dist/{chunk-J3Y2QDJR.cjs → chunk-7LNIBHO6.cjs} +430 -12
  31. package/dist/chunk-7LNIBHO6.cjs.map +1 -0
  32. package/dist/{chunk-MIKCKV27.cjs → chunk-BW4KGTV7.cjs} +65 -31
  33. package/dist/chunk-BW4KGTV7.cjs.map +1 -0
  34. package/dist/{chunk-6ULC3UHJ.cjs → chunk-E2EJRVWS.cjs} +43 -12
  35. package/dist/chunk-E2EJRVWS.cjs.map +1 -0
  36. package/dist/{chunk-5CTERELC.js → chunk-EPKIJEH7.js} +5 -4
  37. package/dist/chunk-EPKIJEH7.js.map +1 -0
  38. package/dist/{chunk-IFR34VTL.cjs → chunk-GZY4CJ23.cjs} +5 -4
  39. package/dist/chunk-GZY4CJ23.cjs.map +1 -0
  40. package/dist/{chunk-TWAC2IIS.js → chunk-I55HO32M.js} +5 -4
  41. package/dist/chunk-I55HO32M.js.map +1 -0
  42. package/dist/{chunk-5SKT7RYR.js → chunk-J7JWMQD5.js} +7 -6
  43. package/dist/chunk-J7JWMQD5.js.map +1 -0
  44. package/dist/{chunk-PWI4NFYR.js → chunk-JDBG5DU2.js} +5 -4
  45. package/dist/chunk-JDBG5DU2.js.map +1 -0
  46. package/dist/{chunk-VRE5VWDQ.js → chunk-KVP7AORH.js} +43 -12
  47. package/dist/chunk-KVP7AORH.js.map +1 -0
  48. package/dist/{chunk-IURM4ZWE.js → chunk-L3CTXXVZ.js} +65 -31
  49. package/dist/chunk-L3CTXXVZ.js.map +1 -0
  50. package/dist/chunk-NAGUZFXX.cjs +94 -0
  51. package/dist/chunk-NAGUZFXX.cjs.map +1 -0
  52. package/dist/{chunk-DBMZEZLF.cjs → chunk-O2HN4WRG.cjs} +6229 -51
  53. package/dist/chunk-O2HN4WRG.cjs.map +1 -0
  54. package/dist/{chunk-HKJRHXGZ.js → chunk-O4RHSAHR.js} +6217 -39
  55. package/dist/chunk-O4RHSAHR.js.map +1 -0
  56. package/dist/{chunk-H5JYZ5YS.cjs → chunk-OIZ4MYSF.cjs} +5 -4
  57. package/dist/chunk-OIZ4MYSF.cjs.map +1 -0
  58. package/dist/{chunk-T47A6XUK.cjs → chunk-QUKVGHN4.cjs} +5 -4
  59. package/dist/chunk-QUKVGHN4.cjs.map +1 -0
  60. package/dist/{chunk-V4OVUBLA.cjs → chunk-RYVV5UVI.cjs} +5 -4
  61. package/dist/chunk-RYVV5UVI.cjs.map +1 -0
  62. package/dist/{chunk-CQP5YHVK.cjs → chunk-S2KJRHDZ.cjs} +4 -5
  63. package/dist/chunk-S2KJRHDZ.cjs.map +1 -0
  64. package/dist/{chunk-5COUZTVA.cjs → chunk-ST5YRTTV.cjs} +5 -4
  65. package/dist/chunk-ST5YRTTV.cjs.map +1 -0
  66. package/dist/{chunk-CS67UBP3.cjs → chunk-SUIDD2C5.cjs} +5 -4
  67. package/dist/chunk-SUIDD2C5.cjs.map +1 -0
  68. package/dist/{chunk-DHKKDIVT.js → chunk-SZK376QB.js} +5 -4
  69. package/dist/chunk-SZK376QB.js.map +1 -0
  70. package/dist/{chunk-WIFGBWET.cjs → chunk-UUBNQV2T.cjs} +4 -5
  71. package/dist/chunk-UUBNQV2T.cjs.map +1 -0
  72. package/dist/{chunk-I6VEXSUK.js → chunk-VDSYMSUY.js} +4 -5
  73. package/dist/chunk-VDSYMSUY.js.map +1 -0
  74. package/dist/{chunk-XSNNGYXZ.cjs → chunk-YLEVMOK2.cjs} +22 -8
  75. package/dist/chunk-YLEVMOK2.cjs.map +1 -0
  76. package/dist/{chunk-ZQZNWAHH.js → chunk-ZX74KJPM.js} +4 -5
  77. package/dist/chunk-ZX74KJPM.js.map +1 -0
  78. package/dist/{chunk-IZMAZOQI.js → chunk-ZYRCPSBU.js} +22 -8
  79. package/dist/chunk-ZYRCPSBU.js.map +1 -0
  80. package/dist/diagrams/blockdiagram/index.cjs +6 -5
  81. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  82. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  83. package/dist/diagrams/blockdiagram/index.js +2 -1
  84. package/dist/diagrams/circuit/index.cjs +8 -7
  85. package/dist/diagrams/circuit/index.d.cts +1 -1
  86. package/dist/diagrams/circuit/index.d.ts +1 -1
  87. package/dist/diagrams/circuit/index.js +2 -1
  88. package/dist/diagrams/ecomap/index.d.cts +1 -1
  89. package/dist/diagrams/ecomap/index.d.ts +1 -1
  90. package/dist/diagrams/entity/index.cjs +6 -5
  91. package/dist/diagrams/entity/index.d.cts +1 -1
  92. package/dist/diagrams/entity/index.d.ts +1 -1
  93. package/dist/diagrams/entity/index.js +2 -1
  94. package/dist/diagrams/fishbone/index.d.cts +1 -1
  95. package/dist/diagrams/fishbone/index.d.ts +1 -1
  96. package/dist/diagrams/flowchart/index.cjs +7 -7
  97. package/dist/diagrams/flowchart/index.d.cts +2 -2
  98. package/dist/diagrams/flowchart/index.d.ts +2 -2
  99. package/dist/diagrams/flowchart/index.js +1 -1
  100. package/dist/diagrams/genogram/index.d.cts +1 -1
  101. package/dist/diagrams/genogram/index.d.ts +1 -1
  102. package/dist/diagrams/ladder/index.cjs +6 -5
  103. package/dist/diagrams/ladder/index.d.cts +1 -1
  104. package/dist/diagrams/ladder/index.d.ts +1 -1
  105. package/dist/diagrams/ladder/index.js +2 -1
  106. package/dist/diagrams/logic/index.cjs +6 -5
  107. package/dist/diagrams/logic/index.d.cts +1 -1
  108. package/dist/diagrams/logic/index.d.ts +1 -1
  109. package/dist/diagrams/logic/index.js +2 -1
  110. package/dist/diagrams/orgchart/index.cjs +7 -6
  111. package/dist/diagrams/orgchart/index.d.cts +1 -1
  112. package/dist/diagrams/orgchart/index.d.ts +1 -1
  113. package/dist/diagrams/orgchart/index.js +2 -1
  114. package/dist/diagrams/pedigree/index.d.cts +1 -1
  115. package/dist/diagrams/pedigree/index.d.ts +1 -1
  116. package/dist/diagrams/phylo/index.cjs +7 -6
  117. package/dist/diagrams/phylo/index.d.cts +1 -1
  118. package/dist/diagrams/phylo/index.d.ts +1 -1
  119. package/dist/diagrams/phylo/index.js +2 -1
  120. package/dist/diagrams/sld/index.cjs +6 -5
  121. package/dist/diagrams/sld/index.d.cts +1 -1
  122. package/dist/diagrams/sld/index.d.ts +1 -1
  123. package/dist/diagrams/sld/index.js +2 -1
  124. package/dist/diagrams/sociogram/index.cjs +6 -5
  125. package/dist/diagrams/sociogram/index.d.cts +1 -1
  126. package/dist/diagrams/sociogram/index.d.ts +1 -1
  127. package/dist/diagrams/sociogram/index.js +2 -1
  128. package/dist/diagrams/timing/index.cjs +5 -4
  129. package/dist/diagrams/timing/index.d.cts +1 -1
  130. package/dist/diagrams/timing/index.d.ts +1 -1
  131. package/dist/diagrams/timing/index.js +2 -1
  132. package/dist/diagrams/venn/index.cjs +9 -8
  133. package/dist/diagrams/venn/index.d.cts +1 -1
  134. package/dist/diagrams/venn/index.d.ts +1 -1
  135. package/dist/diagrams/venn/index.js +2 -1
  136. package/dist/{index-D3u6vcA4.d.ts → index-CGK0xVls.d.ts} +3 -3
  137. package/dist/{index-bdfj6FpQ.d.cts → index-OW8eDrKj.d.cts} +3 -3
  138. package/dist/index.cjs +32 -31
  139. package/dist/index.d.cts +3 -3
  140. package/dist/index.d.ts +3 -3
  141. package/dist/index.js +14 -13
  142. package/dist/react.cjs +15 -14
  143. package/dist/react.cjs.map +1 -1
  144. package/dist/react.d.cts +1 -1
  145. package/dist/react.d.ts +1 -1
  146. package/dist/react.js +14 -13
  147. package/dist/react.js.map +1 -1
  148. package/dist/{types-DnU2UlWz.d.ts → types-Gkyab1sL.d.cts} +5 -1
  149. package/dist/{types-DnU2UlWz.d.cts → types-Gkyab1sL.d.ts} +5 -1
  150. package/package.json +2 -2
  151. package/dist/chunk-3RAVPXLN.js.map +0 -1
  152. package/dist/chunk-4THC4VUA.cjs.map +0 -1
  153. package/dist/chunk-5COUZTVA.cjs.map +0 -1
  154. package/dist/chunk-5CTERELC.js.map +0 -1
  155. package/dist/chunk-5SKT7RYR.js.map +0 -1
  156. package/dist/chunk-6ULC3UHJ.cjs.map +0 -1
  157. package/dist/chunk-CQP5YHVK.cjs.map +0 -1
  158. package/dist/chunk-CS67UBP3.cjs.map +0 -1
  159. package/dist/chunk-DBMZEZLF.cjs.map +0 -1
  160. package/dist/chunk-DHKKDIVT.js.map +0 -1
  161. package/dist/chunk-DNZV4V4R.js.map +0 -1
  162. package/dist/chunk-H5JYZ5YS.cjs.map +0 -1
  163. package/dist/chunk-HKJRHXGZ.js.map +0 -1
  164. package/dist/chunk-I6VEXSUK.js.map +0 -1
  165. package/dist/chunk-IFR34VTL.cjs.map +0 -1
  166. package/dist/chunk-IURM4ZWE.js.map +0 -1
  167. package/dist/chunk-IZMAZOQI.js.map +0 -1
  168. package/dist/chunk-J3Y2QDJR.cjs.map +0 -1
  169. package/dist/chunk-MIKCKV27.cjs.map +0 -1
  170. package/dist/chunk-PWI4NFYR.js.map +0 -1
  171. package/dist/chunk-T47A6XUK.cjs.map +0 -1
  172. package/dist/chunk-TWAC2IIS.js.map +0 -1
  173. package/dist/chunk-V4OVUBLA.cjs.map +0 -1
  174. package/dist/chunk-VRE5VWDQ.js.map +0 -1
  175. package/dist/chunk-WIFGBWET.cjs.map +0 -1
  176. package/dist/chunk-XSNNGYXZ.cjs.map +0 -1
  177. package/dist/chunk-ZKDL6Y3O.js.map +0 -1
  178. package/dist/chunk-ZQZNWAHH.js.map +0 -1
@@ -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","matchQuotedTitle","parseLegendDirective","clean","props","cssCustomProperties","STROKE_WIDTH","FONT_SIZE","el","circle","polygon","resolveBaseTheme","title","desc","group","applyLegendOverrides","renderLegend","svgRoot"],"mappings":"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","file":"chunk-UUBNQV2T.cjs","sourcesContent":["import { parseLegendDirective } from \"../../core/legend-parser\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\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 const titleStr: string | undefined = matchQuotedTitle(headerLine);\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,4 +1,5 @@
1
1
  import { resolveBiologyTheme, STROKE_WIDTH, FONT_SIZE, cssCustomProperties } from './chunk-2VNMKOUO.js';
2
+ import { matchQuotedTitle } from './chunk-5IKOLUWK.js';
2
3
  import { path, circle, text, title, desc, el, group, svgRoot, rect, line } from './chunk-SYYBKDL7.js';
3
4
 
4
5
  // src/diagrams/phylo/parser.ts
@@ -299,9 +300,7 @@ function parsePhylo(text2) {
299
300
  throw new PhyloParseError("Phylo document must start with 'phylo'");
300
301
  }
301
302
  lineIdx++;
302
- let title2;
303
- const titleMatch = headerLine.match(/"([^"]+)"/);
304
- if (titleMatch) title2 = titleMatch[1];
303
+ const title2 = matchQuotedTitle(headerLine);
305
304
  let headerProps = {
306
305
  layout: "rectangular",
307
306
  mode: "phylogram",
@@ -885,5 +884,5 @@ var phylo = {
885
884
  };
886
885
 
887
886
  export { PhyloParseError, layoutPhylo, parsePhylo, phylo, renderPhylo };
888
- //# sourceMappingURL=chunk-I6VEXSUK.js.map
889
- //# sourceMappingURL=chunk-I6VEXSUK.js.map
887
+ //# sourceMappingURL=chunk-VDSYMSUY.js.map
888
+ //# sourceMappingURL=chunk-VDSYMSUY.js.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"],"mappings":"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","file":"chunk-VDSYMSUY.js","sourcesContent":["import type {\n PhyloTreeAST,\n PhyloNode,\n PhyloLayout,\n PhyloMode,\n CladeDef,\n CladeHighlightMode,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\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 const title: string | undefined = matchQuotedTitle(headerLine);\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}\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,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkD7EHZFK4_cjs = require('./chunk-D7EHZFK4.cjs');
4
+ var chunkNAGUZFXX_cjs = require('./chunk-NAGUZFXX.cjs');
4
5
  var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
5
6
 
6
7
  // src/diagrams/logic/parser.ts
@@ -75,8 +76,8 @@ function parseLogic(text2) {
75
76
  continue;
76
77
  }
77
78
  if (/^logic\b/i.test(line)) {
78
- const t = line.match(/"([^"]*)"/);
79
- if (t) title2 = t[1];
79
+ const t = chunkNAGUZFXX_cjs.matchQuotedTitle(line);
80
+ if (t !== void 0) title2 = t;
80
81
  const s = line.match(/style\s*:\s*(ansi|iec)/i);
81
82
  if (s) style = s[1].toLowerCase();
82
83
  continue;
@@ -123,15 +124,27 @@ function parseLogic(text2) {
123
124
  if (mapped) out.from = mapped;
124
125
  else if (gates.some((g) => g.id === out.id)) out.from = out.id;
125
126
  }
127
+ const warnings = [];
126
128
  const known = /* @__PURE__ */ new Set([
127
129
  ...inputs.map((i) => i.id),
128
130
  ...gates.map((g) => g.id)
129
131
  ]);
132
+ const autoDeclared = /* @__PURE__ */ new Set();
130
133
  for (const g of gates) {
131
134
  for (const inp of g.inputs) {
132
- const clean = inp.startsWith("~") ? inp.slice(1) : inp;
133
- if (!known.has(clean)) {
134
- throw new LogicParseError(`Unknown signal "${clean}" in gate ${g.id}`);
135
+ const isLow = inp.startsWith("~");
136
+ const clean = isLow ? inp.slice(1) : inp;
137
+ if (!known.has(clean) && !autoDeclared.has(clean)) {
138
+ autoDeclared.add(clean);
139
+ inputs.push({
140
+ id: clean,
141
+ label: clean,
142
+ isActiveLow: isLow || void 0,
143
+ autoDeclared: true
144
+ });
145
+ warnings.push(
146
+ `Signal "${clean}" referenced in gate ${g.id} was not declared; auto-declared as input.`
147
+ );
135
148
  }
136
149
  }
137
150
  }
@@ -142,7 +155,8 @@ function parseLogic(text2) {
142
155
  inputs,
143
156
  outputs,
144
157
  gates,
145
- modules: modules.length > 0 ? modules : void 0
158
+ modules: modules.length > 0 ? modules : void 0,
159
+ warnings: warnings.length > 0 ? warnings : void 0
146
160
  };
147
161
  }
148
162
 
@@ -871,5 +885,5 @@ exports.layoutLogic = layoutLogic;
871
885
  exports.logic = logic;
872
886
  exports.parseLogic = parseLogic;
873
887
  exports.renderLogic = renderLogic;
874
- //# sourceMappingURL=chunk-XSNNGYXZ.cjs.map
875
- //# sourceMappingURL=chunk-XSNNGYXZ.cjs.map
888
+ //# sourceMappingURL=chunk-YLEVMOK2.cjs.map
889
+ //# sourceMappingURL=chunk-YLEVMOK2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/diagrams/logic/parser.ts","../src/diagrams/logic/symbols.ts","../src/diagrams/logic/layout.ts","../src/diagrams/logic/renderer.ts","../src/diagrams/logic/index.ts"],"names":["text","title","matchQuotedTitle","path","PORT_SIZE","PORT_H","el","circle","polygon","resolveIndustrialTheme","group","svgRoot","desc","defs"],"mappings":"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","file":"chunk-YLEVMOK2.cjs","sourcesContent":["import type {\n LogicGateAST,\n LogicGateInput,\n LogicGateOutput,\n LogicGateNode,\n LogicGateType,\n LogicGateStyle,\n LogicGateModule,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class LogicParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LogicParseError\";\n }\n}\n\nconst GATE_TYPES = new Set<string>([\n \"AND\", \"OR\", \"NOT\", \"NAND\", \"NOR\", \"XOR\", \"XNOR\", \"BUF\",\n \"TRISTATE_BUF\", \"TRISTATE_INV\", \"OPEN_DRAIN\", \"SCHMITT\",\n \"DFF\", \"JKFF\", \"SRFF\", \"TFF\", \"LATCH_SR\", \"LATCH_D\",\n \"MUX\", \"DEMUX\", \"DECODER\", \"ENCODER\", \"COUNTER\", \"SHIFT_REG\",\n]);\n\nfunction splitIds(s: string): string[] {\n return s\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n}\n\nfunction parseInputList(s: string): string[] {\n // Supports named (D=A) or positional. Returns raw tokens (keep ~ prefix for active-low).\n return s\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean)\n .map((tok) => {\n const eq = tok.indexOf(\"=\");\n return eq >= 0 ? tok.slice(eq + 1).trim() : tok;\n });\n}\n\nexport function parseLogic(text: string): LogicGateAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\").trim());\n let title: string | undefined;\n let style: LogicGateStyle | undefined;\n const inputs: LogicGateInput[] = [];\n const outputs: LogicGateOutput[] = [];\n const gates: LogicGateNode[] = [];\n const modules: LogicGateModule[] = [];\n const moduleStack: string[] = [];\n let moduleCounter = 0;\n const explicitOutputFrom = new Map<string, string>();\n\n for (const rawLine of lines) {\n // Strip line comments\n const line = rawLine.replace(/#.*$/, \"\").replace(/--.*$/, \"\").trim();\n if (!line) continue;\n\n // module \"Label\" { or module Label {\n const modOpen = line.match(/^module\\s+(?:\"([^\"]+)\"|([a-zA-Z_][\\w]*))\\s*\\{$/);\n if (modOpen) {\n const label = modOpen[1] ?? modOpen[2];\n const id = `mod_${moduleCounter++}`;\n modules.push({ id, label });\n moduleStack.push(id);\n continue;\n }\n\n // close module\n if (line === \"}\") {\n if (moduleStack.length === 0) {\n throw new LogicParseError(\"Unmatched `}` — no open module\");\n }\n moduleStack.pop();\n continue;\n }\n\n // Header\n if (/^logic\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n const s = line.match(/style\\s*:\\s*(ansi|iec)/i);\n if (s) style = s[1].toLowerCase() as LogicGateStyle;\n continue;\n }\n\n // input A, B, C\n const inputMatch = line.match(/^input\\s+(.+)$/i);\n if (inputMatch) {\n for (const id of splitIds(inputMatch[1])) {\n const isLow = id.startsWith(\"~\");\n const clean = isLow ? id.slice(1) : id;\n inputs.push({ id: clean, label: clean, isActiveLow: isLow || undefined });\n }\n continue;\n }\n\n // output X, Y\n const outputMatch = line.match(/^output\\s+(.+)$/i);\n if (outputMatch) {\n for (const id of splitIds(outputMatch[1])) {\n outputs.push({ id, label: id, from: id });\n }\n continue;\n }\n\n // OUTPUT <- GATE (map output to gate)\n const assignMatch = line.match(/^([a-zA-Z_][\\w]*)\\s*<-\\s*([a-zA-Z_][\\w]*)$/);\n if (assignMatch) {\n explicitOutputFrom.set(assignMatch[1], assignMatch[2]);\n continue;\n }\n\n // Gate: ID = GATE(a, b, ...)\n const gateMatch = line.match(/^([a-zA-Z_][\\w]*)\\s*=\\s*([A-Za-z_][\\w]*)\\s*\\(([^)]*)\\)$/);\n if (gateMatch) {\n const id = gateMatch[1];\n const rawType = gateMatch[2].toUpperCase();\n if (!GATE_TYPES.has(rawType)) {\n throw new LogicParseError(`Unknown gate type: ${rawType}`);\n }\n const gInputs = parseInputList(gateMatch[3]);\n const moduleId = moduleStack[moduleStack.length - 1];\n gates.push({ id, gateType: rawType as LogicGateType, inputs: gInputs, moduleId });\n continue;\n }\n }\n\n if (moduleStack.length > 0) {\n throw new LogicParseError(`Unclosed module (${moduleStack.length} open)`);\n }\n\n // Wire outputs: if output not explicitly mapped, look for gate with same id\n for (const out of outputs) {\n const mapped = explicitOutputFrom.get(out.id);\n if (mapped) out.from = mapped;\n else if (gates.some((g) => g.id === out.id)) out.from = out.id;\n }\n\n // Resolve undefined signal references: auto-declare them as inputs and\n // emit a warning. Hard-failing here is hostile to LLM-generated DSL where\n // the model often forgets the explicit `input` line — see playbook.\n const warnings: string[] = [];\n const known = new Set<string>([\n ...inputs.map((i) => i.id),\n ...gates.map((g) => g.id),\n ]);\n const autoDeclared = new Set<string>();\n for (const g of gates) {\n for (const inp of g.inputs) {\n const isLow = inp.startsWith(\"~\");\n const clean = isLow ? inp.slice(1) : inp;\n if (!known.has(clean) && !autoDeclared.has(clean)) {\n autoDeclared.add(clean);\n inputs.push({\n id: clean,\n label: clean,\n isActiveLow: isLow || undefined,\n autoDeclared: true,\n });\n warnings.push(\n `Signal \"${clean}\" referenced in gate ${g.id} was not declared; auto-declared as input.`\n );\n }\n }\n }\n\n return {\n type: \"logic\",\n title,\n style: style ?? \"ansi\",\n inputs,\n outputs,\n gates,\n modules: modules.length > 0 ? modules : undefined,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n","import type { LogicGateType } from \"../../core/types\";\n\n// Normalized gate geometry: combinational gates fit in 100×60; sequential in 60×80.\nexport interface GateGeometry {\n width: number;\n height: number;\n inputPins: Array<{ id: string; x: number; y: number; label?: string }>;\n outputPins: Array<{ id: string; x: number; y: number; label?: string; bubble?: boolean }>;\n /** Body SVG path (ANSI) */\n ansiPath: string;\n /** Output bubble? */\n outputBubble?: boolean;\n /** Clock triangle pin id (sequential) */\n clockPin?: string;\n /** IEC label inside rectangle */\n iecLabel?: string;\n}\n\nfunction combPins(nInputs: number, _width: number, leftX: number): Array<{ id: string; x: number; y: number }> {\n const pins: Array<{ id: string; x: number; y: number }> = [];\n if (nInputs === 1) {\n pins.push({ id: \"in1\", x: leftX, y: 30 });\n } else if (nInputs === 2) {\n pins.push({ id: \"in1\", x: leftX, y: 15 });\n pins.push({ id: \"in2\", x: leftX, y: 45 });\n } else {\n const step = 50 / (nInputs - 1);\n for (let i = 0; i < nInputs; i++) {\n pins.push({ id: `in${i + 1}`, x: leftX, y: 5 + step * i });\n }\n }\n return pins;\n}\n\nexport function getGateGeometry(\n gateType: LogicGateType,\n inputCount: number\n): GateGeometry {\n switch (gateType) {\n case \"AND\":\n case \"NAND\": {\n const bubble = gateType === \"NAND\";\n return {\n width: bubble ? 90 : 80,\n height: 60,\n inputPins: combPins(inputCount, 80, 20).map((p) => ({ ...p, x: 20 })),\n outputPins: [{ id: \"out\", x: bubble ? 90 : 80, y: 30, bubble }],\n ansiPath: \"M 20,60 L 20,0 Q 80,0 80,30 Q 80,60 20,60 Z\",\n outputBubble: bubble,\n iecLabel: \"&\",\n };\n }\n case \"OR\":\n case \"NOR\": {\n const bubble = gateType === \"NOR\";\n return {\n width: bubble ? 80 : 70,\n height: 60,\n inputPins: combPins(inputCount, 80, 18).map((p) => ({ ...p, x: 18 })),\n outputPins: [{ id: \"out\", x: bubble ? 80 : 70, y: 30, bubble }],\n ansiPath: \"M 15,60 Q 10,30 15,0 Q 30,15 70,30 Q 30,45 15,60 Z\",\n outputBubble: bubble,\n iecLabel: \"≥1\",\n };\n }\n case \"XOR\":\n case \"XNOR\": {\n const bubble = gateType === \"XNOR\";\n return {\n width: bubble ? 80 : 70,\n height: 60,\n inputPins: combPins(inputCount, 80, 12).map((p) => ({ ...p, x: 12 })),\n outputPins: [{ id: \"out\", x: bubble ? 80 : 70, y: 30, bubble }],\n ansiPath:\n \"M 15,60 Q 10,30 15,0 Q 30,15 70,30 Q 30,45 15,60 Z M 8,60 Q 3,30 8,0\",\n outputBubble: bubble,\n iecLabel: \"=1\",\n };\n }\n case \"NOT\": {\n return {\n width: 70,\n height: 60,\n inputPins: [{ id: \"in1\", x: 10, y: 30 }],\n outputPins: [{ id: \"out\", x: 70, y: 30, bubble: true }],\n ansiPath: \"M 10,55 L 60,30 L 10,5 Z\",\n outputBubble: true,\n iecLabel: \"1\",\n };\n }\n case \"BUF\":\n case \"SCHMITT\": {\n return {\n width: 60,\n height: 60,\n inputPins: [{ id: \"in1\", x: 10, y: 30 }],\n outputPins: [{ id: \"out\", x: 60, y: 30 }],\n ansiPath: \"M 10,55 L 60,30 L 10,5 Z\",\n iecLabel: \"1\",\n };\n }\n case \"TRISTATE_BUF\":\n case \"TRISTATE_INV\":\n case \"OPEN_DRAIN\": {\n const bubble = gateType === \"TRISTATE_INV\";\n return {\n width: bubble ? 70 : 60,\n height: 70,\n inputPins: [\n { id: \"in1\", x: 10, y: 30 },\n { id: \"en\", x: 35, y: 65, label: \"EN\" },\n ],\n outputPins: [{ id: \"out\", x: bubble ? 70 : 60, y: 30, bubble }],\n ansiPath: \"M 10,55 L 60,30 L 10,5 Z\",\n outputBubble: bubble,\n iecLabel: \"1\",\n };\n }\n case \"DFF\": {\n return {\n width: 60,\n height: 80,\n inputPins: [\n { id: \"D\", x: 0, y: 20, label: \"D\" },\n { id: \"CLK\", x: 0, y: 50, label: \"\" },\n ],\n outputPins: [\n { id: \"Q\", x: 60, y: 20, label: \"Q\" },\n { id: \"Qn\", x: 60, y: 60, label: \"Q̄\", bubble: true },\n ],\n ansiPath: \"M 0,0 H 60 V 80 H 0 Z\",\n clockPin: \"CLK\",\n iecLabel: \"DFF\",\n };\n }\n case \"JKFF\": {\n return {\n width: 60,\n height: 80,\n inputPins: [\n { id: \"J\", x: 0, y: 15, label: \"J\" },\n { id: \"CLK\", x: 0, y: 40 },\n { id: \"K\", x: 0, y: 65, label: \"K\" },\n ],\n outputPins: [\n { id: \"Q\", x: 60, y: 20, label: \"Q\" },\n { id: \"Qn\", x: 60, y: 60, label: \"Q̄\", bubble: true },\n ],\n ansiPath: \"M 0,0 H 60 V 80 H 0 Z\",\n clockPin: \"CLK\",\n iecLabel: \"JK\",\n };\n }\n case \"SRFF\":\n case \"LATCH_SR\": {\n return {\n width: 60,\n height: 80,\n inputPins: [\n { id: \"S\", x: 0, y: 20, label: \"S\" },\n { id: \"R\", x: 0, y: 60, label: \"R\" },\n ],\n outputPins: [\n { id: \"Q\", x: 60, y: 20, label: \"Q\" },\n { id: \"Qn\", x: 60, y: 60, label: \"Q̄\", bubble: true },\n ],\n ansiPath: \"M 0,0 H 60 V 80 H 0 Z\",\n iecLabel: \"SR\",\n };\n }\n case \"TFF\": {\n return {\n width: 60,\n height: 80,\n inputPins: [\n { id: \"T\", x: 0, y: 20, label: \"T\" },\n { id: \"CLK\", x: 0, y: 50 },\n ],\n outputPins: [\n { id: \"Q\", x: 60, y: 20, label: \"Q\" },\n { id: \"Qn\", x: 60, y: 60, label: \"Q̄\", bubble: true },\n ],\n ansiPath: \"M 0,0 H 60 V 80 H 0 Z\",\n clockPin: \"CLK\",\n iecLabel: \"T\",\n };\n }\n case \"LATCH_D\": {\n return {\n width: 60,\n height: 80,\n inputPins: [\n { id: \"D\", x: 0, y: 20, label: \"D\" },\n { id: \"E\", x: 0, y: 60, label: \"E\" },\n ],\n outputPins: [\n { id: \"Q\", x: 60, y: 20, label: \"Q\" },\n { id: \"Qn\", x: 60, y: 60, label: \"Q̄\", bubble: true },\n ],\n ansiPath: \"M 0,0 H 60 V 80 H 0 Z\",\n iecLabel: \"D\",\n };\n }\n default: {\n // Generic box for MUX/DEMUX/DECODER/ENCODER/COUNTER/SHIFT_REG\n const ins = Math.max(inputCount, 2);\n const inputPins = combPins(ins, 100, 0).map((p, i) => ({\n ...p,\n x: 0,\n label: `I${i}`,\n }));\n return {\n width: 100,\n height: 80,\n inputPins,\n outputPins: [{ id: \"out\", x: 100, y: 40 }],\n ansiPath: \"M 0,0 H 100 V 80 H 0 Z\",\n iecLabel: gateType,\n };\n }\n }\n}\n","import type { LogicGateAST } from \"../../core/types\";\nimport { getGateGeometry, type GateGeometry } from \"./symbols\";\n\nexport interface LogicLayoutNode {\n id: string;\n kind: \"input\" | \"gate\" | \"output\";\n x: number;\n y: number;\n layer: number;\n geometry?: GateGeometry;\n gateType?: string;\n label: string;\n isActiveLow?: boolean;\n}\n\nexport interface LogicLayoutWire {\n fromNode: string;\n fromX: number;\n fromY: number;\n toNode: string;\n toX: number;\n toY: number;\n isActiveLow?: boolean;\n path: string;\n}\n\nexport interface LogicLayoutModule {\n id: string;\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface LogicLayoutResult {\n width: number;\n height: number;\n nodes: LogicLayoutNode[];\n wires: LogicLayoutWire[];\n modules: LogicLayoutModule[];\n}\n\nconst LAYER_GAP = 80; // extra horizontal gap between layers\nconst ROW_GAP = 40; // vertical gap between rows in same layer\nconst PORT_SIZE = 40; // input/output port pseudo-box width\nconst PORT_H = 30;\n\nexport function layoutLogic(ast: LogicGateAST): LogicLayoutResult {\n // Determine layer per signal id using longest-path layering\n const layerOf = new Map<string, number>();\n for (const inp of ast.inputs) layerOf.set(inp.id, 0);\n\n // Build dependency map for gates\n const pending = new Set(ast.gates.map((g) => g.id));\n let safety = 0;\n while (pending.size > 0 && safety++ < 1000) {\n for (const g of ast.gates) {\n if (!pending.has(g.id)) continue;\n let maxDep = -1;\n let ready = true;\n for (const inp of g.inputs) {\n const clean = inp.startsWith(\"~\") ? inp.slice(1) : inp;\n const l = layerOf.get(clean);\n if (l === undefined) {\n ready = false;\n break;\n }\n if (l > maxDep) maxDep = l;\n }\n if (ready) {\n layerOf.set(g.id, maxDep + 1);\n pending.delete(g.id);\n }\n }\n }\n if (pending.size > 0) {\n // cycle or unresolved: force layer 1\n for (const id of pending) layerOf.set(id, 1);\n }\n\n const outputLayer =\n Math.max(0, ...Array.from(layerOf.values())) + 1;\n // All outputs get a terminal label node. Use synthetic id to avoid colliding\n // with a gate that shares the output's name (e.g. `output Y; Y = AND(A,B)`).\n const outTermId = (o: { id: string }) => `$out$${o.id}`;\n const portOutputs = ast.outputs.map((o) => ({\n ...o,\n termId: outTermId(o),\n source: o.from,\n }));\n for (const o of portOutputs) layerOf.set(o.termId, outputLayer);\n\n // Group ids by layer\n const layers = new Map<number, string[]>();\n const addToLayer = (id: string, layer: number) => {\n if (!layers.has(layer)) layers.set(layer, []);\n layers.get(layer)!.push(id);\n };\n for (const i of ast.inputs) addToLayer(i.id, 0);\n for (const g of ast.gates) addToLayer(g.id, layerOf.get(g.id)!);\n for (const o of portOutputs) addToLayer(o.termId, outputLayer);\n\n // Compute sizes per node (precompute geometries for gates)\n const gateGeoms = new Map<string, GateGeometry>();\n for (const g of ast.gates) {\n gateGeoms.set(g.id, getGateGeometry(g.gateType, g.inputs.length));\n }\n\n // Assign coordinates\n const nodes: LogicLayoutNode[] = [];\n const sortedLayers = Array.from(layers.keys()).sort((a, b) => a - b);\n\n // compute each layer's widest node\n const layerWidth = new Map<number, number>();\n for (const [layerIdx, ids] of layers) {\n let maxW = 60;\n for (const id of ids) {\n const g = gateGeoms.get(id);\n if (g && g.width > maxW) maxW = g.width;\n if (!g && layerIdx === 0) maxW = Math.max(maxW, PORT_SIZE);\n if (!g && layerIdx === outputLayer) maxW = Math.max(maxW, PORT_SIZE);\n }\n layerWidth.set(layerIdx, maxW);\n }\n\n let cursorX = 20;\n const layerStartMap = new Map<number, number>();\n for (const layerIdx of sortedLayers) {\n layerStartMap.set(layerIdx, cursorX);\n cursorX += (layerWidth.get(layerIdx) ?? 60) + LAYER_GAP;\n }\n const totalW = cursorX;\n\n // Compute vertical placement per layer\n const heightOf = (id: string): number => {\n const g = gateGeoms.get(id);\n if (g) return g.height;\n return PORT_H;\n };\n\n // find max column height\n let maxColH = 0;\n for (const ids of layers.values()) {\n const total = ids.reduce((s, id) => s + heightOf(id), 0) + (ids.length - 1) * ROW_GAP;\n if (total > maxColH) maxColH = total;\n }\n const totalH = maxColH + 80;\n\n const nodeInfo = new Map<string, LogicLayoutNode>();\n for (const [layerIdx, ids] of layers) {\n const xStart = layerStartMap.get(layerIdx)!;\n const total = ids.reduce((s, id) => s + heightOf(id), 0) + (ids.length - 1) * ROW_GAP;\n let y = 40 + (maxColH - total) / 2;\n for (const id of ids) {\n const h = heightOf(id);\n const g = gateGeoms.get(id);\n let node: LogicLayoutNode;\n if (layerIdx === 0) {\n const inp = ast.inputs.find((i) => i.id === id)!;\n node = {\n id,\n kind: \"input\",\n x: xStart,\n y,\n layer: 0,\n label: inp.label,\n isActiveLow: inp.isActiveLow,\n };\n } else if (layerIdx === outputLayer && !g && id.startsWith(\"$out$\")) {\n const out = portOutputs.find((o) => o.termId === id)!;\n node = {\n id,\n kind: \"output\",\n x: xStart,\n y,\n layer: outputLayer,\n label: out.label,\n isActiveLow: out.isActiveLow,\n };\n } else {\n node = {\n id,\n kind: \"gate\",\n x: xStart,\n y,\n layer: layerIdx,\n geometry: g,\n gateType: ast.gates.find((gg) => gg.id === id)!.gateType,\n label: id,\n };\n }\n nodes.push(node);\n nodeInfo.set(id, node);\n y += h + ROW_GAP;\n }\n }\n\n // Wires\n const wires: LogicLayoutWire[] = [];\n const getSourcePoint = (id: string) => {\n const n = nodeInfo.get(id);\n if (!n) return null;\n if (n.kind === \"input\") return { x: n.x + PORT_SIZE, y: n.y + PORT_H / 2 };\n if (n.kind === \"gate\" && n.geometry) {\n const out = n.geometry.outputPins[0];\n return { x: n.x + out.x, y: n.y + out.y };\n }\n return null;\n };\n\n for (const g of ast.gates) {\n const target = nodeInfo.get(g.id);\n if (!target || !target.geometry) continue;\n g.inputs.forEach((rawInp, idx) => {\n const isLow = rawInp.startsWith(\"~\");\n const srcId = isLow ? rawInp.slice(1) : rawInp;\n const src = getSourcePoint(srcId);\n if (!src) return;\n const pin = target.geometry!.inputPins[idx];\n if (!pin) return;\n const toX = target.x + pin.x;\n const toY = target.y + pin.y;\n const midX = (src.x + toX) / 2;\n const path = `M ${src.x},${src.y} L ${midX},${src.y} L ${midX},${toY} L ${toX},${toY}`;\n wires.push({\n fromNode: srcId,\n fromX: src.x,\n fromY: src.y,\n toNode: g.id,\n toX,\n toY,\n isActiveLow: isLow,\n path,\n });\n });\n }\n\n // Output port wires\n for (const o of portOutputs) {\n const src = getSourcePoint(o.source);\n const target = nodeInfo.get(o.termId);\n if (!src || !target || target.kind !== \"output\") continue;\n const toX = target.x;\n const toY = target.y + PORT_H / 2;\n let path: string;\n if (Math.abs(src.y - toY) < 0.5) {\n path = `M ${src.x},${src.y} L ${toX},${toY}`;\n } else {\n const midX = (src.x + toX) / 2;\n path = `M ${src.x},${src.y} L ${midX},${src.y} L ${midX},${toY} L ${toX},${toY}`;\n }\n wires.push({\n fromNode: o.source,\n fromX: src.x,\n fromY: src.y,\n toNode: o.termId,\n toX,\n toY,\n path,\n });\n }\n\n // Module bounding boxes (dashed enclosure for sub-circuits)\n const modules: LogicLayoutModule[] = [];\n if (ast.modules && ast.modules.length > 0) {\n const PAD = 14;\n for (const mod of ast.modules) {\n const memberIds = new Set(\n ast.gates.filter((g) => g.moduleId === mod.id).map((g) => g.id)\n );\n if (memberIds.size === 0) continue;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const n of nodes) {\n if (!memberIds.has(n.id)) continue;\n const w = n.geometry?.width ?? 60;\n const h = n.geometry?.height ?? 60;\n if (n.x < minX) minX = n.x;\n if (n.y < minY) minY = n.y;\n if (n.x + w > maxX) maxX = n.x + w;\n if (n.y + h > maxY) maxY = n.y + h;\n }\n if (!isFinite(minX)) continue;\n modules.push({\n id: mod.id,\n label: mod.label,\n x: minX - PAD,\n y: minY - PAD - 4,\n width: maxX - minX + PAD * 2,\n height: maxY - minY + PAD * 2 + 4,\n });\n }\n }\n\n return { width: totalW, height: totalH, nodes, wires, modules };\n}\n","import type { LogicGateAST, LogicGateStyle, RenderConfig } from \"../../core/types\";\nimport { layoutLogic } from \"./layout\";\nimport {\n svgRoot,\n defs,\n group,\n el,\n circle,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n polygon,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme } from \"../../core/theme\";\n\nconst PORT_SIZE = 40;\nconst PORT_H = 30;\n\nfunction renderGateBody(\n n: ReturnType<typeof layoutLogic>[\"nodes\"][number],\n style: LogicGateStyle\n): string[] {\n const out: string[] = [];\n if (!n.geometry) return out;\n const g = n.geometry;\n\n if (style === \"iec\") {\n // Rectangle\n out.push(\n el(\"rect\", {\n x: 0,\n y: 0,\n width: g.width,\n height: g.height,\n class: \"schematex-logic-gate-body\",\n })\n );\n if (g.iecLabel) {\n out.push(\n text(\n {\n x: g.width / 2,\n y: g.height / 2 + 4,\n class: \"schematex-logic-gate-iec-label\",\n \"text-anchor\": \"middle\",\n },\n g.iecLabel\n )\n );\n }\n } else {\n out.push(\n el(\"path\", { d: g.ansiPath, class: \"schematex-logic-gate-body\" })\n );\n }\n\n // Output bubble\n if (g.outputBubble) {\n const op = g.outputPins[0];\n out.push(\n circle({\n cx: op.x - 4,\n cy: op.y,\n r: 4,\n class: \"schematex-logic-bubble\",\n })\n );\n }\n\n // Clock triangle\n if (g.clockPin) {\n const cp = g.inputPins.find((p) => p.id === g.clockPin);\n if (cp) {\n out.push(\n polygon({\n points: `${cp.x},${cp.y - 5} ${cp.x + 8},${cp.y} ${cp.x},${cp.y + 5}`,\n class: \"schematex-logic-clock-tri\",\n })\n );\n }\n }\n\n // Qn bubble (sequential)\n for (const op of g.outputPins) {\n if (op.bubble && op.id !== \"out\") {\n out.push(\n circle({\n cx: op.x + 4,\n cy: op.y,\n r: 4,\n class: \"schematex-logic-bubble\",\n })\n );\n }\n }\n\n // Pin labels\n for (const pin of g.inputPins) {\n if (pin.label && pin.id !== g.clockPin) {\n out.push(\n text(\n {\n x: pin.x + 5,\n y: pin.y + 3,\n class: \"schematex-logic-pin-label\",\n },\n pin.label\n )\n );\n }\n }\n for (const pin of g.outputPins) {\n if (pin.label) {\n out.push(\n text(\n {\n x: pin.x - 6,\n y: pin.y + 3,\n class: \"schematex-logic-pin-label\",\n \"text-anchor\": \"end\",\n },\n pin.label\n )\n );\n }\n }\n\n // Gate type label (center top, small)\n if (style === \"ansi\" && g.iecLabel && g.height >= 60) {\n const labelX = g.width / 2;\n const labelY = g.height + 14;\n out.push(\n text(\n {\n x: labelX,\n y: labelY,\n class: \"schematex-logic-gate-type\",\n \"text-anchor\": \"middle\",\n },\n n.gateType ?? \"\"\n )\n );\n }\n\n return out;\n}\n\nexport function renderLogic(ast: LogicGateAST, config?: RenderConfig): string {\n const style: LogicGateStyle = ast.style ?? \"ansi\";\n const layout = layoutLogic(ast);\n const { width, height } = layout;\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n\n const gateSvgs: string[] = [];\n const portSvgs: string[] = [];\n const moduleSvgs: string[] = [];\n\n for (const m of layout.modules) {\n moduleSvgs.push(\n group({ \"data-module-id\": m.id }, [\n el(\"rect\", {\n x: m.x,\n y: m.y,\n width: m.width,\n height: m.height,\n rx: 6,\n class: \"schematex-logic-module\",\n }),\n text(\n {\n x: m.x + 10,\n y: m.y + 14,\n class: \"schematex-logic-module-label\",\n },\n m.label\n ),\n ])\n );\n }\n\n for (const n of layout.nodes) {\n if (n.kind === \"gate\") {\n gateSvgs.push(\n group(\n {\n transform: `translate(${n.x}, ${n.y})`,\n \"data-gate-id\": n.id,\n \"data-gate-type\": n.gateType ?? \"\",\n },\n renderGateBody(n, style)\n )\n );\n } else if (n.kind === \"input\") {\n // Label + short stub line; no rectangle.\n const cy = PORT_H / 2;\n portSvgs.push(\n group({ transform: `translate(${n.x}, ${n.y})`, \"data-port\": \"input\" }, [\n text(\n {\n x: 0,\n y: cy + 4,\n \"text-anchor\": \"start\",\n class: \"schematex-logic-port-label\",\n },\n n.label\n ),\n el(\"line\", {\n x1: PORT_SIZE - 12,\n y1: cy,\n x2: n.isActiveLow ? PORT_SIZE - 8 : PORT_SIZE,\n y2: cy,\n class: \"schematex-logic-wire\",\n }),\n n.isActiveLow\n ? circle({\n cx: PORT_SIZE - 4,\n cy,\n r: 4,\n class: \"schematex-logic-bubble\",\n })\n : \"\",\n ])\n );\n } else if (n.kind === \"output\") {\n const cy = PORT_H / 2;\n portSvgs.push(\n group({ transform: `translate(${n.x}, ${n.y})`, \"data-port\": \"output\" }, [\n el(\"line\", {\n x1: 0,\n y1: cy,\n x2: 12,\n y2: cy,\n class: \"schematex-logic-wire\",\n }),\n text(\n {\n x: 16,\n y: cy + 4,\n \"text-anchor\": \"start\",\n class: \"schematex-logic-port-label\",\n },\n n.label\n ),\n ])\n );\n }\n }\n\n const wireSvgs = layout.wires.map((w) => {\n const extras: string[] = [];\n if (w.isActiveLow) {\n extras.push(\n circle({\n cx: w.toX - 4,\n cy: w.toY,\n r: 4,\n class: \"schematex-logic-bubble\",\n })\n );\n }\n return [\n pathEl({\n d: w.path,\n class: \"schematex-logic-wire\",\n \"data-from\": w.fromNode,\n \"data-to\": w.toNode,\n }),\n ...extras,\n ].join(\"\");\n });\n\n const css = `\n.schematex-logic { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-logic-gate-body { fill: none; stroke: ${t.strokeHeavy}; stroke-width: 1.75; stroke-linejoin: round; }\n.schematex-logic-bubble { fill: ${t.bg}; stroke: ${t.strokeHeavy}; stroke-width: 1.5; }\n.schematex-logic-clock-tri { fill: none; stroke: ${t.strokeHeavy}; stroke-width: 1.5; stroke-linejoin: round; }\n.schematex-logic-wire { stroke: ${t.strokeHeavy}; stroke-width: 1.5; fill: none; stroke-linecap: square; }\n.schematex-logic-port-label { font: 13px system-ui, sans-serif; fill: ${t.text}; }\n.schematex-logic-pin-label { font: 9px sans-serif; fill: ${t.stroke}; }\n.schematex-logic-gate-type { font: 10px sans-serif; fill: ${t.textMuted}; }\n.schematex-logic-gate-iec-label { font: bold 13px sans-serif; fill: ${t.text}; }\n.schematex-logic-title { font: bold 14px sans-serif; fill: ${t.text}; }\n.schematex-logic-module { fill: none; stroke: ${t.textMuted}; stroke-width: 1.25; stroke-dasharray: 6 4; }\n.schematex-logic-module-label { font: 11px sans-serif; fill: ${t.textMuted}; font-style: italic; }\n`.trim();\n\n const titleSvg = ast.title\n ? text(\n {\n x: width / 2,\n y: 18,\n \"text-anchor\": \"middle\",\n class: \"schematex-logic-title\",\n },\n ast.title\n )\n : \"\";\n\n return svgRoot(\n {\n class: \"schematex-logic\",\n viewBox: `0 0 ${width} ${height + (ast.title ? 20 : 0)}`,\n width,\n height: height + (ast.title ? 20 : 0),\n role: \"img\",\n \"data-diagram-type\": \"logic\",\n },\n [\n titleEl(ast.title ?? \"Logic Gate Diagram\"),\n desc(\n `Logic gate diagram with ${ast.gates.length} gates, ${ast.inputs.length} inputs, ${ast.outputs.length} outputs`\n ),\n defs([el(\"style\", {}, css)]),\n group(\n { transform: `translate(0, ${ast.title ? 20 : 0})` },\n [\n group({ class: \"schematex-logic-modules\" }, moduleSvgs),\n group({ class: \"schematex-logic-wires\" }, wireSvgs),\n group({ class: \"schematex-logic-gates\" }, gateSvgs),\n group({ class: \"schematex-logic-ports\" }, portSvgs),\n ]\n ),\n titleSvg,\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseLogic } from \"./parser\";\nimport { renderLogic } from \"./renderer\";\n\nexport const logic: DiagramPlugin = {\n type: \"logic\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"logic\");\n },\n parse: parseLogic,\n\n render(text: string, config): string {\n const ast = parseLogic(text);\n return renderLogic(ast, config);\n },\n};\n\nexport { parseLogic } from \"./parser\";\nexport { renderLogic } from \"./renderer\";\nexport { layoutLogic } from \"./layout\";\n"]}