schematex 0.6.6 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -3
- package/README.zh-CN.md +783 -0
- package/dist/ai/ai-sdk.cjs +11 -11
- package/dist/ai/ai-sdk.d.cts +4 -4
- package/dist/ai/ai-sdk.d.ts +4 -4
- package/dist/ai/ai-sdk.js +6 -6
- package/dist/ai/index.cjs +17 -17
- package/dist/ai/index.d.cts +3 -3
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.js +6 -6
- package/dist/{api-QFMTlIi7.d.ts → api-DIJM_mqp.d.ts} +1 -1
- package/dist/{api-DA4-U-jn.d.cts → api-JaBtsUT8.d.cts} +1 -1
- package/dist/browser.cjs +12 -12
- package/dist/browser.d.cts +3 -3
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +6 -6
- package/dist/{chunk-KJZCRHNR.js → chunk-2TUZ3QJA.js} +623 -9
- package/dist/chunk-2TUZ3QJA.js.map +1 -0
- package/dist/{chunk-EUVUO3CL.cjs → chunk-34O3C6OC.cjs} +2 -2
- package/dist/{chunk-EUVUO3CL.cjs.map → chunk-34O3C6OC.cjs.map} +1 -1
- package/dist/{chunk-MLLARXOI.cjs → chunk-AGBY7KLL.cjs} +131 -27
- package/dist/chunk-AGBY7KLL.cjs.map +1 -0
- package/dist/{chunk-EPKIJEH7.js → chunk-C7V57V6O.js} +54 -8
- package/dist/chunk-C7V57V6O.js.map +1 -0
- package/dist/{chunk-CMZKAASF.cjs → chunk-EDXDFKYO.cjs} +16 -8
- package/dist/chunk-EDXDFKYO.cjs.map +1 -0
- package/dist/{chunk-FOPOOV2P.js → chunk-J2TT7PGI.js} +127 -23
- package/dist/chunk-J2TT7PGI.js.map +1 -0
- package/dist/{chunk-DO2DDHTQ.cjs → chunk-J3EPFZPX.cjs} +623 -8
- package/dist/chunk-J3EPFZPX.cjs.map +1 -0
- package/dist/{chunk-KCHUQXS3.js → chunk-JTGTWBAD.js} +2 -2
- package/dist/{chunk-KCHUQXS3.js.map → chunk-JTGTWBAD.js.map} +1 -1
- package/dist/{chunk-7DAIEDQP.js → chunk-MPCSWRZC.js} +75 -13
- package/dist/chunk-MPCSWRZC.js.map +1 -0
- package/dist/{chunk-3HZW6K5I.js → chunk-QZ2OBNAS.js} +14 -6
- package/dist/chunk-QZ2OBNAS.js.map +1 -0
- package/dist/{chunk-SUIDD2C5.cjs → chunk-SHMG7BVF.cjs} +54 -8
- package/dist/chunk-SHMG7BVF.cjs.map +1 -0
- package/dist/{chunk-XYHCAJMI.cjs → chunk-UHPGWO77.cjs} +75 -12
- package/dist/chunk-UHPGWO77.cjs.map +1 -0
- package/dist/{diagnostics-CSznf_sl.d.cts → diagnostics-BKRow1ur.d.cts} +14 -0
- package/dist/{diagnostics-CSznf_sl.d.ts → diagnostics-BKRow1ur.d.ts} +14 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.cjs +11 -7
- package/dist/diagrams/circuit/index.d.cts +4 -2
- package/dist/diagrams/circuit/index.d.ts +4 -2
- package/dist/diagrams/circuit/index.js +1 -1
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.cjs +10 -6
- package/dist/diagrams/orgchart/index.d.cts +27 -2
- package/dist/diagrams/orgchart/index.d.ts +27 -2
- package/dist/diagrams/orgchart/index.js +1 -1
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/sld/index.cjs +7 -7
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +1 -1
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/{index-CDpYuU7l.d.cts → index-DU2h1Y-a.d.cts} +1 -1
- package/dist/{index-jTwjudTW.d.ts → index-Dq3Mfxay.d.ts} +1 -1
- package/dist/index.cjs +35 -35
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +8 -8
- package/dist/react.cjs +6 -6
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +5 -5
- package/dist/{tools-CbuSbW6B.d.cts → tools-A0HRZ8jj.d.ts} +11 -2
- package/dist/{tools-D344vOzR.d.ts → tools-OzOQnlnV.d.cts} +11 -2
- package/package.json +2 -2
- package/dist/chunk-3HZW6K5I.js.map +0 -1
- package/dist/chunk-7DAIEDQP.js.map +0 -1
- package/dist/chunk-CMZKAASF.cjs.map +0 -1
- package/dist/chunk-DO2DDHTQ.cjs.map +0 -1
- package/dist/chunk-EPKIJEH7.js.map +0 -1
- package/dist/chunk-FOPOOV2P.js.map +0 -1
- package/dist/chunk-KJZCRHNR.js.map +0 -1
- package/dist/chunk-MLLARXOI.cjs.map +0 -1
- package/dist/chunk-SUIDD2C5.cjs.map +0 -1
- package/dist/chunk-XYHCAJMI.cjs.map +0 -1
|
@@ -194,15 +194,37 @@ function parseBlockDiagram(text2) {
|
|
|
194
194
|
const sig = signals.get(sigId);
|
|
195
195
|
const incoming = byTarget.get(sigId) ?? [];
|
|
196
196
|
const outgoing = bySource.get(sigId) ?? [];
|
|
197
|
-
|
|
198
|
-
for (const
|
|
197
|
+
if (incoming.length > 0 && outgoing.length > 0) {
|
|
198
|
+
for (const ine of incoming) {
|
|
199
|
+
for (const oute of outgoing) {
|
|
200
|
+
consumed.add(ine);
|
|
201
|
+
consumed.add(oute);
|
|
202
|
+
merged.push({
|
|
203
|
+
from: ine.from,
|
|
204
|
+
to: oute.to,
|
|
205
|
+
label: ine.label ?? oute.label ?? sig.label,
|
|
206
|
+
discrete: sig.discrete || ine.discrete || oute.discrete
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} else if (incoming.length > 0) {
|
|
211
|
+
for (const ine of incoming) {
|
|
199
212
|
consumed.add(ine);
|
|
200
|
-
consumed.add(oute);
|
|
201
213
|
merged.push({
|
|
202
214
|
from: ine.from,
|
|
215
|
+
to: sigId,
|
|
216
|
+
label: ine.label ?? sig.label,
|
|
217
|
+
discrete: sig.discrete || ine.discrete
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
} else if (outgoing.length > 0) {
|
|
221
|
+
for (const oute of outgoing) {
|
|
222
|
+
consumed.add(oute);
|
|
223
|
+
merged.push({
|
|
224
|
+
from: sigId,
|
|
203
225
|
to: oute.to,
|
|
204
|
-
label:
|
|
205
|
-
discrete: sig.discrete ||
|
|
226
|
+
label: oute.label ?? sig.label,
|
|
227
|
+
discrete: sig.discrete || oute.discrete
|
|
206
228
|
});
|
|
207
229
|
}
|
|
208
230
|
}
|
|
@@ -414,6 +436,29 @@ function layoutBlockDiagram(ast) {
|
|
|
414
436
|
isInput: false
|
|
415
437
|
});
|
|
416
438
|
}
|
|
439
|
+
{
|
|
440
|
+
const knownIds = /* @__PURE__ */ new Set([
|
|
441
|
+
...ast.blocks.map((b) => b.id),
|
|
442
|
+
...ast.sums.map((s) => s.id),
|
|
443
|
+
"in",
|
|
444
|
+
"out"
|
|
445
|
+
]);
|
|
446
|
+
for (const id of nodeIds) {
|
|
447
|
+
if (knownIds.has(id)) continue;
|
|
448
|
+
if ((incoming.get(id)?.length ?? 0) === 0) continue;
|
|
449
|
+
const sigCol = Math.min(col.get(id) ?? maxFwdCol + 1, colX.length - 1);
|
|
450
|
+
const x = colX[sigCol] ?? (colX[colX.length - 1] ?? 0) + COL_GAP;
|
|
451
|
+
nodes.push({
|
|
452
|
+
kind: "port",
|
|
453
|
+
id,
|
|
454
|
+
label: "",
|
|
455
|
+
// edge label carries the signal label; blank avoids double-text
|
|
456
|
+
x,
|
|
457
|
+
y: forwardY,
|
|
458
|
+
isInput: false
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
}
|
|
417
462
|
const anchors = /* @__PURE__ */ new Map();
|
|
418
463
|
for (const n of nodes) {
|
|
419
464
|
if (n.kind === "block") {
|
|
@@ -581,9 +626,10 @@ function layoutBlockDiagram(ast) {
|
|
|
581
626
|
}
|
|
582
627
|
const totalTopSpace = maxAboveRow > 0 ? FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP + 60 : 30;
|
|
583
628
|
const totalBottomSpace = maxBelowRow > 0 ? FIRST_ROW_OFFSET + (maxBelowRow - 1) * ROW_GAP + 60 : 100;
|
|
629
|
+
const hasFeedbackRows = maxBelowRow > 0 || maxAboveRow > 0;
|
|
584
630
|
const height = Math.max(
|
|
585
631
|
forwardY + totalBottomSpace,
|
|
586
|
-
FWD_Y + 170,
|
|
632
|
+
hasFeedbackRows ? FWD_Y + 170 : 0,
|
|
587
633
|
totalTopSpace + totalBottomSpace
|
|
588
634
|
);
|
|
589
635
|
return {
|
|
@@ -808,5 +854,5 @@ exports.blockdiagram = blockdiagram;
|
|
|
808
854
|
exports.layoutBlockDiagram = layoutBlockDiagram;
|
|
809
855
|
exports.parseBlockDiagram = parseBlockDiagram;
|
|
810
856
|
exports.renderBlockDiagram = renderBlockDiagram;
|
|
811
|
-
//# sourceMappingURL=chunk-
|
|
812
|
-
//# sourceMappingURL=chunk-
|
|
857
|
+
//# sourceMappingURL=chunk-SHMG7BVF.cjs.map
|
|
858
|
+
//# sourceMappingURL=chunk-SHMG7BVF.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/blockdiagram/parser.ts","../src/diagrams/blockdiagram/layout.ts","../src/diagrams/blockdiagram/renderer.ts","../src/diagrams/blockdiagram/index.ts"],"names":["text","title","matchQuotedTitle","i","path","el","group","circle","svgRoot","desc","defs"],"mappings":"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","file":"chunk-SHMG7BVF.cjs","sourcesContent":["import type {\n BlockAST,\n BlockNode,\n BlockEdge,\n SummingJunction,\n BlockRole,\n} from \"../../core/types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class BlockDiagramParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"BlockDiagramParseError\";\n }\n}\n\nconst ROLE_VALUES = new Set<BlockRole>([\n \"plant\",\n \"controller\",\n \"sensor\",\n \"actuator\",\n \"reference\",\n \"disturbance\",\n \"generic\",\n]);\n\ninterface SignalDecl {\n id: string;\n label: string;\n discrete: boolean;\n}\n\ninterface ParsedAttrs {\n name?: string;\n role?: BlockRole;\n discrete?: boolean;\n label?: string;\n route?: \"above\" | \"below\";\n}\n\nfunction parseAttrs(s: string): ParsedAttrs {\n // Inside [ ... ] — comma-separated key:value or bare flags like \"discrete\"\n const result: ParsedAttrs = {};\n // Split at commas not inside quotes\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n\n for (const raw of parts) {\n const p = raw.trim();\n if (!p) continue;\n if (p === \"discrete\") {\n result.discrete = true;\n continue;\n }\n if (p.startsWith('\"') && p.endsWith('\"')) {\n result.label = p.slice(1, -1);\n continue;\n }\n const m = p.match(/^(\\w+)\\s*:\\s*(.+)$/);\n if (!m) continue;\n const key = m[1].toLowerCase();\n let val = m[2].trim();\n if (val.startsWith('\"') && val.endsWith('\"')) val = val.slice(1, -1);\n if (key === \"name\") result.name = val;\n else if (key === \"role\") {\n if (ROLE_VALUES.has(val as BlockRole)) result.role = val as BlockRole;\n } else if (key === \"label\") result.label = val;\n else if (key === \"route\") {\n if (val === \"above\" || val === \"below\") result.route = val;\n }\n }\n return result;\n}\n\nexport function parseBlockDiagram(text: string): BlockAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const blocks: BlockNode[] = [];\n const sums: SummingJunction[] = [];\n const connections: BlockEdge[] = [];\n const signals = new Map<string, SignalDecl>();\n\n for (let i = 0; i < lines.length; i++) {\n const rawLine = lines[i] ?? \"\";\n const lineNo = i + 1;\n const line = rawLine.replace(/#.*$/, \"\").trim();\n if (!line) continue;\n\n // Header: blockdiagram \"Title\"\n if (/^blockdiagram\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // block: ID = block(\"label\") [role: X, name: \"Y\"]\n const blockMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*block\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (blockMatch) {\n const id = blockMatch[1];\n const label = blockMatch[2];\n const attrs = blockMatch[3] ? parseAttrs(blockMatch[3]) : {};\n const node: BlockNode = { id, label, role: attrs.role ?? \"generic\" };\n if (attrs.route) node.route = attrs.route;\n blocks.push(node);\n continue;\n }\n\n // sum: ID = sum(+a, -b, ...)\n const sumMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*sum\\s*\\(([^)]*)\\)\\s*$/\n );\n if (sumMatch) {\n const id = sumMatch[1];\n const rawInputs = sumMatch[2]\n .split(\",\")\n .map((x) => x.trim())\n .filter(Boolean);\n const inputs: string[] = [];\n for (const tok of rawInputs) {\n if (tok.startsWith(\"+\") || tok.startsWith(\"-\")) inputs.push(tok);\n else inputs.push(\"+\" + tok);\n }\n sums.push({ id, inputs });\n continue;\n }\n\n // signal: ID = signal(\"label\") [discrete]\n const sigMatch = line.match(\n /^([A-Za-z_]\\w*)\\s*=\\s*signal\\s*\\(\\s*\"([^\"]*)\"\\s*\\)\\s*(?:\\[([^\\]]*)\\])?\\s*$/\n );\n if (sigMatch) {\n const id = sigMatch[1];\n const label = sigMatch[2];\n const attrs = sigMatch[3] ? parseAttrs(sigMatch[3]) : {};\n signals.set(id, { id, label, discrete: !!attrs.discrete });\n continue;\n }\n\n // Connection chain: `A -> B -> C [label_or_attrs]`. Inline `[id] -> [id]` (D2/Mermaid) auto-declares.\n const arrowIdx = line.indexOf(\"->\");\n if (arrowIdx >= 0) {\n let body = line;\n let tailAttrs: ParsedAttrs = {};\n // Trailing `[...]` must be preceded by whitespace, else it's an inline endpoint.\n if (body.endsWith(\"]\")) {\n let bracketStart = -1;\n let depth = 0;\n let inQuote = false;\n for (let i = body.length - 1; i >= 1; i--) {\n const ch = body[i];\n if (ch === '\"') inQuote = !inQuote;\n else if (!inQuote && ch === \"]\") depth++;\n else if (!inQuote && ch === \"[\") {\n depth--;\n if (depth === 0) {\n if (/\\s/.test(body[i - 1] ?? \"\")) bracketStart = i;\n break;\n }\n }\n }\n if (bracketStart >= 0) {\n const inner = body.slice(bracketStart + 1, -1).trim();\n const isBareId = /^[A-Za-z_]\\w*$/.test(inner);\n if (!isBareId) {\n body = body.slice(0, bracketStart).trim();\n if (inner.startsWith('\"') && inner.endsWith('\"') && !inner.slice(1, -1).includes(',')) {\n tailAttrs.label = inner.slice(1, -1);\n } else {\n tailAttrs = parseAttrs(inner);\n }\n }\n }\n }\n const parts = body.split(\"->\").map((x) => x.trim()).filter(Boolean);\n if (parts.length < 2) {\n throw new BlockDiagramParseError(`Invalid connection: ${line}`, lineNo, undefined, line);\n }\n const endpoints = parts.map((p) => {\n const m = /^\\[([A-Za-z_]\\w*)\\]$/.exec(p);\n return m ? m[1] : p;\n });\n for (const ep of endpoints) {\n if (!/^[A-Za-z_]\\w*$/.test(ep)) continue;\n const exists =\n blocks.some((b) => b.id === ep) ||\n sums.some((s) => s.id === ep) ||\n signals.has(ep);\n if (!exists) {\n blocks.push({ id: ep, label: ep, role: \"generic\" });\n }\n }\n for (let i = 0; i < endpoints.length - 1; i++) {\n const from = endpoints[i];\n const to = endpoints[i + 1];\n const isLast = i === endpoints.length - 2;\n const edge: BlockEdge = { from, to };\n if (isLast && tailAttrs.label) edge.label = tailAttrs.label;\n if (isLast && tailAttrs.discrete) edge.discrete = true;\n connections.push(edge);\n }\n continue;\n }\n }\n\n // Post-process: if edge endpoints reference a signal id, inline the signal.\n // A signal is a pass-through label. Merge edges X->sig and sig->Y into X->Y,\n // using signal's label (unless edge already has one) and discrete flag.\n if (signals.size > 0) {\n const merged: BlockEdge[] = [];\n const bySource = new Map<string, BlockEdge[]>();\n const byTarget = new Map<string, BlockEdge[]>();\n for (const e of connections) {\n if (!bySource.has(e.from)) bySource.set(e.from, []);\n bySource.get(e.from)!.push(e);\n if (!byTarget.has(e.to)) byTarget.set(e.to, []);\n byTarget.get(e.to)!.push(e);\n }\n\n const consumed = new Set<BlockEdge>();\n for (const sigId of signals.keys()) {\n const sig = signals.get(sigId)!;\n const incoming = byTarget.get(sigId) ?? [];\n const outgoing = bySource.get(sigId) ?? [];\n\n if (incoming.length > 0 && outgoing.length > 0) {\n // Full pass-through: merge X→sig + sig→Y into X→Y\n for (const ine of incoming) {\n for (const oute of outgoing) {\n consumed.add(ine);\n consumed.add(oute);\n merged.push({\n from: ine.from,\n to: oute.to,\n label: ine.label ?? oute.label ?? sig.label,\n discrete: sig.discrete || ine.discrete || oute.discrete,\n });\n }\n }\n } else if (incoming.length > 0) {\n // Dangling output signal (no consumer): keep the incoming edge but\n // apply the signal's label so the arrowhead is annotated.\n for (const ine of incoming) {\n consumed.add(ine);\n merged.push({\n from: ine.from,\n to: sigId,\n label: ine.label ?? sig.label,\n discrete: sig.discrete || ine.discrete,\n });\n }\n } else if (outgoing.length > 0) {\n // Dangling input signal (no producer): keep the outgoing edge with label.\n for (const oute of outgoing) {\n consumed.add(oute);\n merged.push({\n from: sigId,\n to: oute.to,\n label: oute.label ?? sig.label,\n discrete: sig.discrete || oute.discrete,\n });\n }\n }\n }\n // Keep edges not consumed by any signal merge\n for (const e of connections) {\n if (!consumed.has(e)) merged.push(e);\n }\n connections.length = 0;\n connections.push(...merged);\n }\n\n return {\n type: \"blockdiagram\",\n title,\n blocks,\n sums,\n connections,\n };\n}\n","import type { BlockAST, BlockEdge, BlockNode, SummingJunction } from \"../../core/types\";\n\nexport interface LaidBlock {\n kind: \"block\";\n id: string;\n label: string;\n role: string;\n x: number;\n y: number;\n width: number;\n height: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidSum {\n kind: \"sum\";\n id: string;\n cx: number;\n cy: number;\n r: number;\n hasBranch?: boolean;\n}\n\nexport interface LaidPort {\n kind: \"port\";\n id: string;\n label: string;\n x: number;\n y: number;\n isInput: boolean;\n hasBranch?: boolean;\n}\n\nexport type LaidNode = LaidBlock | LaidSum | LaidPort;\n\nexport interface LaidEdgePolarity {\n sign: \"+\" | \"-\";\n pin: \"left\" | \"top\" | \"right\" | \"bottom\";\n x: number;\n y: number;\n}\n\nexport interface LaidEdge {\n from: string;\n to: string;\n label?: string;\n discrete: boolean;\n path: string;\n midX: number;\n midY: number;\n isFeedback: boolean;\n /** Polarity sign to draw near the target if target is a sum */\n polarity?: LaidEdgePolarity;\n}\n\nexport interface BlockDiagramLayout {\n width: number;\n height: number;\n nodes: LaidNode[];\n edges: LaidEdge[];\n title?: string;\n /** Offset applied to all y coords (>0 when feedforward rows exist above FWD_Y) */\n topOffset: number;\n}\n\nconst BLOCK_W = 100;\nconst BLOCK_H = 54;\nconst SUM_R = 12;\nconst FWD_Y = 110;\nconst ROW_GAP = 80;\nconst FIRST_ROW_OFFSET = 110;\nconst COL_GAP = 60;\nconst LEFT_PAD = 30;\nconst RIGHT_PAD = 30;\n\ninterface Track {\n /** row index (1, 2, ...); 0 means forward path */\n row: number;\n /** above = y < FWD_Y; below = y > FWD_Y */\n side: \"above\" | \"below\";\n /** Occupied col ranges [minCol, maxCol] for collision detection */\n ranges: Array<[number, number]>;\n}\n\nexport function layoutBlockDiagram(ast: BlockAST): BlockDiagramLayout {\n const nodeIds = new Set<string>();\n for (const b of ast.blocks) nodeIds.add(b.id);\n for (const s of ast.sums) nodeIds.add(s.id);\n for (const e of ast.connections) {\n nodeIds.add(e.from);\n nodeIds.add(e.to);\n }\n\n const outgoing = new Map<string, BlockEdge[]>();\n const incoming = new Map<string, BlockEdge[]>();\n for (const id of nodeIds) {\n outgoing.set(id, []);\n incoming.set(id, []);\n }\n for (const e of ast.connections) {\n outgoing.get(e.from)!.push(e);\n incoming.get(e.to)!.push(e);\n }\n\n // Entry points\n const hasIn = nodeIds.has(\"in\");\n const entries: string[] = [];\n if (hasIn) entries.push(\"in\");\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n if ((incoming.get(id) ?? []).length === 0 && !entries.includes(id)) {\n entries.push(id);\n }\n }\n\n // BFS forward (first-visit col assignment — back-edges become feedback)\n const col = new Map<string, number>();\n const queue: string[] = [];\n for (const e of entries) {\n col.set(e, 0);\n queue.push(e);\n }\n while (queue.length > 0) {\n const cur = queue.shift()!;\n const c = col.get(cur)!;\n for (const edge of outgoing.get(cur) ?? []) {\n if (!col.has(edge.to)) {\n col.set(edge.to, c + 1);\n queue.push(edge.to);\n }\n }\n }\n // Any unreached node\n for (const id of nodeIds) {\n if (!col.has(id)) col.set(id, 1);\n }\n\n // Feedback detection: outgoing edges are ALL going backward\n const isFeedback = new Set<string>();\n for (const id of nodeIds) {\n if (id === \"in\" || id === \"out\") continue;\n const myCol = col.get(id)!;\n const outs = outgoing.get(id) ?? [];\n if (outs.length === 0) continue;\n const allBack = outs.every((e) => (col.get(e.to) ?? myCol) < myCol);\n if (allBack) isFeedback.add(id);\n }\n\n // For each feedback node, compute loop range [minCol, maxCol]\n const blockById = new Map<string, BlockNode>();\n for (const b of ast.blocks) blockById.set(b.id, b);\n\n interface FbInfo {\n id: string;\n range: [number, number];\n side: \"above\" | \"below\";\n row: number; // depth\n }\n const fbInfos: FbInfo[] = [];\n for (const id of isFeedback) {\n const outs = outgoing.get(id) ?? [];\n const ins = incoming.get(id) ?? [];\n // targets (forward nodes it feeds back into)\n const targetCols = outs.map((e) => col.get(e.to) ?? 0);\n const sourceCols = ins.map((e) => col.get(e.from) ?? 0);\n const minC = Math.min(...targetCols, ...sourceCols);\n const maxC = Math.max(...targetCols, ...sourceCols);\n const bn = blockById.get(id);\n const side: \"above\" | \"below\" = bn?.route === \"above\" ? \"above\" : \"below\";\n fbInfos.push({ id, range: [minC, maxC], side, row: 0 });\n }\n\n // Sort by range width desc (outermost first), break ties by min col\n fbInfos.sort((a, b) => {\n const wa = a.range[1] - a.range[0];\n const wb = b.range[1] - b.range[0];\n if (wa !== wb) return wb - wa;\n return a.range[0] - b.range[0];\n });\n\n // Assign tracks per side, greedy interval-overlap depth\n const tracks: Record<\"above\" | \"below\", Track[]> = { above: [], below: [] };\n for (const fb of fbInfos) {\n let row = 1;\n while (true) {\n // check if any existing block on this (side, row) has overlapping range\n const occupied = tracks[fb.side].find((t) => t.row === row);\n const conflict =\n occupied?.ranges.some(\n ([a, b]) => !(fb.range[1] < a || fb.range[0] > b)\n ) ?? false;\n if (!conflict) {\n if (occupied) occupied.ranges.push(fb.range);\n else\n tracks[fb.side].push({ row, side: fb.side, ranges: [fb.range] });\n fb.row = row;\n break;\n }\n row++;\n }\n }\n\n const maxBelowRow = tracks.below.reduce((m, t) => Math.max(m, t.row), 0);\n const maxAboveRow = tracks.above.reduce((m, t) => Math.max(m, t.row), 0);\n\n // Compute y per (side, row)\n const yFor = (side: \"above\" | \"below\", row: number): number => {\n const step = FIRST_ROW_OFFSET + (row - 1) * ROW_GAP;\n return side === \"above\" ? FWD_Y - step : FWD_Y + step;\n };\n\n // For the feedforward row(s) to have room, shift all y by topOffset\n const topOffset = maxAboveRow > 0 ? (FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP) + 30 : 30;\n const forwardY = FWD_Y + (topOffset - 30);\n\n // Remap y helper\n const rowY = (side: \"above\" | \"below\", row: number): number =>\n yFor(side, row) + (topOffset - 30);\n\n // Normalize columns\n let maxFwdCol = 0;\n for (const id of nodeIds) {\n if (!isFeedback.has(id)) maxFwdCol = Math.max(maxFwdCol, col.get(id) ?? 0);\n }\n const colCount = maxFwdCol + 1;\n const colContent = new Array(colCount).fill(BLOCK_W);\n\n const colX: number[] = [];\n {\n let x = LEFT_PAD;\n for (let i = 0; i < colCount; i++) {\n const w = i === 0 && hasIn ? 30 : colContent[i];\n colX.push(x + w / 2);\n x += w + COL_GAP;\n }\n }\n const totalWidth = colX.length\n ? colX[colX.length - 1] + BLOCK_W / 2 + RIGHT_PAD\n : 400;\n\n // Lookup for feedback row info\n const fbById = new Map<string, FbInfo>();\n for (const f of fbInfos) fbById.set(f.id, f);\n\n const nodes: LaidNode[] = [];\n const branchCount = new Map<string, number>();\n for (const e of ast.connections) {\n branchCount.set(e.from, (branchCount.get(e.from) ?? 0) + 1);\n }\n const hasBranchOf = (id: string) => (branchCount.get(id) ?? 0) > 1;\n\n for (const b of ast.blocks) {\n const c = col.get(b.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(b.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"block\",\n id: b.id,\n label: b.label,\n role: b.role ?? \"generic\",\n x: cx - BLOCK_W / 2,\n y: cy - BLOCK_H / 2,\n width: BLOCK_W,\n height: BLOCK_H,\n hasBranch: hasBranchOf(b.id),\n });\n }\n\n for (const s of ast.sums) {\n const c = col.get(s.id) ?? 0;\n const cx = colX[Math.min(c, colX.length - 1)];\n let cy = forwardY;\n const fb = fbById.get(s.id);\n if (fb) cy = rowY(fb.side, fb.row);\n nodes.push({\n kind: \"sum\",\n id: s.id,\n cx,\n cy,\n r: SUM_R,\n hasBranch: hasBranchOf(s.id),\n });\n }\n\n if (hasIn) {\n nodes.push({\n kind: \"port\",\n id: \"in\",\n label: \"in\",\n x: LEFT_PAD,\n y: forwardY,\n isInput: true,\n hasBranch: hasBranchOf(\"in\"),\n });\n }\n if (nodeIds.has(\"out\")) {\n const outCol = col.get(\"out\") ?? maxFwdCol;\n const cx = colX[Math.min(outCol, colX.length - 1)];\n nodes.push({\n kind: \"port\",\n id: \"out\",\n label: \"out\",\n x: cx,\n y: forwardY,\n isInput: false,\n });\n }\n\n // Dangling signal targets: node IDs that appear as edge targets but have no\n // block / sum / port entry (i.e. they are the `to` of a signal declaration\n // with no consumer). Create a minimal output-port anchor so the edge is\n // routed and its label rendered rather than silently dropped.\n {\n const knownIds = new Set<string>([\n ...ast.blocks.map((b) => b.id),\n ...ast.sums.map((s) => s.id),\n \"in\",\n \"out\",\n ]);\n for (const id of nodeIds) {\n if (knownIds.has(id)) continue;\n if ((incoming.get(id)?.length ?? 0) === 0) continue;\n const sigCol = Math.min(col.get(id) ?? maxFwdCol + 1, colX.length - 1);\n const x = colX[sigCol] ?? (colX[colX.length - 1] ?? 0) + COL_GAP;\n nodes.push({\n kind: \"port\",\n id,\n label: \"\", // edge label carries the signal label; blank avoids double-text\n x,\n y: forwardY,\n isInput: false,\n });\n }\n }\n\n // Anchor lookup\n interface Anchor {\n left: { x: number; y: number };\n right: { x: number; y: number };\n top: { x: number; y: number };\n bottom: { x: number; y: number };\n cx: number;\n cy: number;\n }\n const anchors = new Map<string, Anchor>();\n for (const n of nodes) {\n if (n.kind === \"block\") {\n anchors.set(n.id, {\n left: { x: n.x, y: n.y + n.height / 2 },\n right: { x: n.x + n.width, y: n.y + n.height / 2 },\n top: { x: n.x + n.width / 2, y: n.y },\n bottom: { x: n.x + n.width / 2, y: n.y + n.height },\n cx: n.x + n.width / 2,\n cy: n.y + n.height / 2,\n });\n } else if (n.kind === \"sum\") {\n anchors.set(n.id, {\n left: { x: n.cx - n.r, y: n.cy },\n right: { x: n.cx + n.r, y: n.cy },\n top: { x: n.cx, y: n.cy - n.r },\n bottom: { x: n.cx, y: n.cy + n.r },\n cx: n.cx,\n cy: n.cy,\n });\n } else {\n anchors.set(n.id, {\n left: { x: n.x - 10, y: n.y },\n right: { x: n.x + (n.isInput ? 20 : 0), y: n.y },\n top: { x: n.x, y: n.y - 10 },\n bottom: { x: n.x, y: n.y + 10 },\n cx: n.x,\n cy: n.y,\n });\n }\n }\n\n // Build sum-input-polarity lookup\n const sumPolarity = new Map<string, Map<string, \"+\" | \"-\">>();\n for (const s of ast.sums) {\n const m = new Map<string, \"+\" | \"-\">();\n for (const tok of s.inputs) {\n const sign = tok.startsWith(\"-\") ? \"-\" : \"+\";\n const srcId = tok.replace(/^[+-]/, \"\");\n m.set(srcId, sign);\n }\n sumPolarity.set(s.id, m);\n }\n\n // Build edges\n const edges: LaidEdge[] = [];\n // Track horizontal-track offsets for feedback paths to avoid overlap\n const sumById = new Map<string, SummingJunction>();\n for (const s of ast.sums) sumById.set(s.id, s);\n\n for (const e of ast.connections) {\n const fromA = anchors.get(e.from);\n const toA = anchors.get(e.to);\n if (!fromA || !toA) continue;\n\n const fromFb = fbById.get(e.from);\n const toFb = fbById.get(e.to);\n const fromCol = col.get(e.from) ?? 0;\n const toCol = col.get(e.to) ?? 0;\n\n // Determine pin on target when target is a sum: left (from forward earlier),\n // bottom (from below feedback), top (from above feedforward), or right (rare, output)\n let polarity: LaidEdgePolarity | undefined;\n if (sumById.has(e.to)) {\n const pm = sumPolarity.get(e.to);\n const sign = pm?.get(e.from) ?? \"+\";\n let pin: \"left\" | \"top\" | \"bottom\" | \"right\" = \"left\";\n if (fromFb?.side === \"below\") pin = \"bottom\";\n else if (fromFb?.side === \"above\") pin = \"top\";\n else if (fromCol < toCol) pin = \"left\";\n else pin = \"bottom\";\n const sumNode = nodes.find(\n (n) => n.kind === \"sum\" && n.id === e.to\n ) as LaidSum | undefined;\n if (sumNode) {\n let px = sumNode.cx, py = sumNode.cy;\n if (pin === \"left\") {\n px = sumNode.cx - sumNode.r - 8;\n py = sumNode.cy + 6;\n } else if (pin === \"bottom\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy + sumNode.r + 10;\n } else if (pin === \"top\") {\n px = sumNode.cx - sumNode.r - 2;\n py = sumNode.cy - sumNode.r - 2;\n }\n polarity = { sign, pin, x: px, y: py };\n }\n }\n\n // Route\n let path: string;\n let midX: number, midY: number;\n let isFb = false;\n\n const fromIsFbSide = fromFb?.side;\n const toIsFbSide = toFb?.side;\n\n if (fromIsFbSide && toIsFbSide === fromIsFbSide) {\n // within same feedback row\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"below\") {\n // forward → below feedback: branch down from source.bottom\n const sx = fromA.bottom.x;\n const sy = fromA.bottom.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (!fromIsFbSide && toIsFbSide === \"above\") {\n // forward → above feedforward: branch up from source.top\n const sx = fromA.top.x;\n const sy = fromA.top.y;\n const tx = toA.right.x;\n const ty = toA.right.y;\n path = `M ${sx} ${sy} L ${sx} ${ty} L ${tx} ${ty}`;\n midX = sx;\n midY = (sy + ty) / 2;\n isFb = true;\n } else if (fromIsFbSide === \"below\" && !toIsFbSide) {\n // below feedback → forward target (bottom pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (fromIsFbSide === \"above\" && !toIsFbSide) {\n // above feedforward → forward target (top pin if sum)\n const sx = fromA.left.x;\n const sy = fromA.left.y;\n const tx = toA.top.x;\n const ty = toA.top.y;\n path = `M ${sx} ${sy} L ${tx} ${sy} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = sy - 6;\n isFb = true;\n } else if (toCol < fromCol) {\n // generic back-edge fallback (below)\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.bottom.x;\n const ty = toA.bottom.y;\n const dipY = Math.max(sy, ty) + 60;\n path = `M ${sx} ${sy} L ${sx} ${dipY} L ${tx} ${dipY} L ${tx} ${ty}`;\n midX = (sx + tx) / 2;\n midY = dipY + 10;\n isFb = true;\n } else {\n // forward edge\n const sx = fromA.right.x;\n const sy = fromA.right.y;\n const tx = toA.left.x;\n const ty = toA.left.y;\n if (Math.abs(sy - ty) < 0.5) {\n path = `M ${sx} ${sy} L ${tx} ${ty}`;\n } else {\n const midXH = (sx + tx) / 2;\n path = `M ${sx} ${sy} L ${midXH} ${sy} L ${midXH} ${ty} L ${tx} ${ty}`;\n }\n midX = (sx + tx) / 2;\n midY = sy - 8;\n }\n\n edges.push({\n from: e.from,\n to: e.to,\n label: e.label,\n discrete: !!e.discrete,\n path,\n midX,\n midY,\n isFeedback: isFb,\n polarity,\n });\n }\n\n // Total canvas height: enough for top rows + forward + bottom rows\n const totalTopSpace =\n maxAboveRow > 0\n ? FIRST_ROW_OFFSET + (maxAboveRow - 1) * ROW_GAP + 60\n : 30;\n const totalBottomSpace =\n maxBelowRow > 0\n ? FIRST_ROW_OFFSET + (maxBelowRow - 1) * ROW_GAP + 60\n : 100;\n // `FWD_Y + 170` is a conservative floor that reserves space for feedback\n // rows. Apply it only when at least one feedback row exists; pure forward\n // diagrams (no loops) are allowed to be more compact.\n const hasFeedbackRows = maxBelowRow > 0 || maxAboveRow > 0;\n const height = Math.max(\n forwardY + totalBottomSpace,\n hasFeedbackRows ? FWD_Y + 170 : 0,\n totalTopSpace + totalBottomSpace\n );\n\n return {\n width: totalWidth,\n height,\n nodes,\n edges,\n title: ast.title,\n topOffset,\n };\n}\n","import type { BlockAST } from \"../../core/types\";\nimport { layoutBlockDiagram } from \"./layout\";\nimport {\n svgRoot,\n defs,\n group,\n el,\n circle,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\n\nconst ROLE_FILL: Record<string, string> = {\n plant: \"#ffffff\",\n controller: \"#E3F2FD\",\n sensor: \"#F3E5F5\",\n actuator: \"#E8F5E9\",\n filter: \"#FFF8E1\",\n reference: \"#ffffff\",\n disturbance: \"#FFF3E0\",\n generic: \"#ffffff\",\n};\n\nexport function renderBlockDiagram(ast: BlockAST): string {\n const layout = layoutBlockDiagram(ast);\n const titleOffset = ast.title ? 26 : 0;\n const { width } = layout;\n const height = layout.height + titleOffset;\n\n const css = `\n.schematex-bd { font-family: system-ui, -apple-system, sans-serif; }\n.schematex-bd-block { stroke: #333; stroke-width: 2; }\n.schematex-bd-tf { font: italic 14px serif; fill: #111; }\n.schematex-bd-block-name { font: 10px sans-serif; fill: #666; }\n.schematex-bd-sum { fill: #fff; stroke: #333; stroke-width: 2; }\n.schematex-bd-sum-sign { font: bold 11px sans-serif; fill: #333; }\n.schematex-bd-signal { stroke: #333; stroke-width: 2; fill: none; }\n.schematex-bd-signal-discrete { stroke: #333; stroke-width: 2; fill: none; stroke-dasharray: 6 4; }\n.schematex-bd-signal-label { font: italic 12px serif; fill: #333; }\n.schematex-bd-port-label { font: italic 13px serif; fill: #111; }\n.schematex-bd-title { font: bold 15px sans-serif; fill: #111; }\n.schematex-bd-branch { fill: #333; stroke: none; }\n`.trim();\n\n const arrowDef = el(\n \"marker\",\n {\n id: \"lt-bd-arrow\",\n markerWidth: 10,\n markerHeight: 8,\n refX: 9,\n refY: 4,\n orient: \"auto\",\n },\n [el(\"polygon\", { points: \"0 0, 10 4, 0 8\", fill: \"#333\" })]\n );\n\n const nodeSvgs: string[] = [];\n const edgeSvgs: string[] = [];\n const branchSvgs: string[] = [];\n\n for (const n of layout.nodes) {\n if (n.kind === \"block\") {\n const fill = ROLE_FILL[n.role] ?? \"#fff\";\n nodeSvgs.push(\n group(\n {\n transform: `translate(${n.x}, ${n.y})`,\n \"data-block-id\": n.id,\n \"data-block-role\": n.role,\n },\n [\n el(\"rect\", {\n width: n.width,\n height: n.height,\n fill,\n class: \"schematex-bd-block\",\n rx: 2,\n }),\n text(\n {\n x: n.width / 2,\n y: n.height / 2 + 5,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-tf\",\n },\n n.label\n ),\n ]\n )\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.x + n.width,\n cy: n.y + n.height / 2,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"sum\") {\n nodeSvgs.push(\n group({ \"data-sum-id\": n.id }, [\n circle({\n cx: n.cx,\n cy: n.cy,\n r: n.r,\n class: \"schematex-bd-sum\",\n }),\n ])\n );\n if (n.hasBranch) {\n branchSvgs.push(\n circle({\n cx: n.cx + n.r,\n cy: n.cy,\n r: 3.5,\n class: \"schematex-bd-branch\",\n })\n );\n }\n } else if (n.kind === \"port\") {\n nodeSvgs.push(\n group({ \"data-port-id\": n.id }, [\n text(\n {\n x: n.isInput ? n.x - 4 : n.x + 4,\n y: n.y + 4,\n \"text-anchor\": n.isInput ? \"end\" : \"start\",\n class: \"schematex-bd-port-label\",\n },\n n.label\n ),\n ])\n );\n }\n }\n\n for (const e of layout.edges) {\n const cls = e.discrete\n ? \"schematex-bd-signal-discrete\"\n : \"schematex-bd-signal\";\n edgeSvgs.push(\n pathEl({\n d: e.path,\n class: cls,\n \"marker-end\": \"url(#lt-bd-arrow)\",\n \"data-from\": e.from,\n \"data-to\": e.to,\n })\n );\n if (e.label) {\n edgeSvgs.push(\n text(\n {\n x: e.midX,\n y: e.midY,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-signal-label\",\n },\n e.label\n )\n );\n }\n if (e.polarity) {\n edgeSvgs.push(\n text(\n {\n x: e.polarity.x,\n y: e.polarity.y,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-sum-sign\",\n },\n e.polarity.sign === \"-\" ? \"−\" : \"+\"\n )\n );\n }\n }\n\n const titleSvg = ast.title\n ? text(\n {\n x: width / 2,\n y: 18,\n \"text-anchor\": \"middle\",\n class: \"schematex-bd-title\",\n },\n ast.title\n )\n : \"\";\n\n return svgRoot(\n {\n class: \"schematex-bd\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"blockdiagram\",\n },\n [\n titleEl(ast.title ?? \"Block Diagram\"),\n desc(\n `Block diagram with ${ast.blocks.length} blocks, ${ast.sums.length} summing junctions, ${ast.connections.length} signals`\n ),\n defs([el(\"style\", {}, css), arrowDef]),\n titleSvg,\n group({ transform: `translate(0, ${titleOffset})` }, [\n group({ class: \"schematex-bd-signals\" }, edgeSvgs),\n group({ class: \"schematex-bd-nodes\" }, nodeSvgs),\n group({ class: \"schematex-bd-branches\" }, branchSvgs),\n ]),\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseBlockDiagram } from \"./parser\";\nimport { renderBlockDiagram } from \"./renderer\";\n\nexport const blockdiagram: DiagramPlugin = {\n type: \"blockdiagram\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"blockdiagram\");\n },\n parse: parseBlockDiagram,\n\n render(text: string): string {\n const ast = parseBlockDiagram(text);\n return renderBlockDiagram(ast);\n },\n};\n\nexport { parseBlockDiagram } from \"./parser\";\nexport { renderBlockDiagram } from \"./renderer\";\nexport { layoutBlockDiagram } from \"./layout\";\n"]}
|
|
@@ -182,6 +182,9 @@ function parseOrgchart(text2) {
|
|
|
182
182
|
const nodeMap = /* @__PURE__ */ new Map();
|
|
183
183
|
const edges = [];
|
|
184
184
|
const indentStack = [];
|
|
185
|
+
const unparseableLines = [];
|
|
186
|
+
const duplicateIds = [];
|
|
187
|
+
const impliedNodes = [];
|
|
185
188
|
for (const rl of rawLines) {
|
|
186
189
|
const line = rl.text;
|
|
187
190
|
if (/^orgchart\b/i.test(line)) {
|
|
@@ -228,10 +231,12 @@ function parseOrgchart(text2) {
|
|
|
228
231
|
if (edgeHandled) continue;
|
|
229
232
|
const parsed = parseNodeLine(line);
|
|
230
233
|
if (!parsed) {
|
|
231
|
-
|
|
234
|
+
unparseableLines.push({ line: rl.line, text: line });
|
|
235
|
+
continue;
|
|
232
236
|
}
|
|
233
237
|
if (nodeMap.has(parsed.id)) {
|
|
234
|
-
|
|
238
|
+
duplicateIds.push(parsed.id);
|
|
239
|
+
continue;
|
|
235
240
|
}
|
|
236
241
|
const node = {
|
|
237
242
|
id: parsed.id,
|
|
@@ -301,18 +306,23 @@ function parseOrgchart(text2) {
|
|
|
301
306
|
if (!exists) edges.push({ from: n.parent, to: n.id, kind: "report" });
|
|
302
307
|
}
|
|
303
308
|
}
|
|
309
|
+
const ensureNode = (id) => {
|
|
310
|
+
if (nodeMap.has(id)) return;
|
|
311
|
+
const node = { id, name: id, kind: "person", matrix: [] };
|
|
312
|
+
nodes.push(node);
|
|
313
|
+
nodeMap.set(id, node);
|
|
314
|
+
impliedNodes.push(id);
|
|
315
|
+
};
|
|
304
316
|
for (const e of edges) {
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
}
|
|
308
|
-
if (!nodeMap.has(e.to)) {
|
|
309
|
-
throw new OrgchartParseError(`Edge references unknown node "${e.to}"`);
|
|
310
|
-
}
|
|
317
|
+
ensureNode(e.from);
|
|
318
|
+
ensureNode(e.to);
|
|
311
319
|
}
|
|
312
320
|
if (nodes.length === 0) {
|
|
313
|
-
throw new OrgchartParseError(
|
|
321
|
+
throw new OrgchartParseError(
|
|
322
|
+
unparseableLines.length > 0 ? `Orgchart has no parseable nodes (${unparseableLines.length} line(s) could not be read)` : "Orgchart has no nodes"
|
|
323
|
+
);
|
|
314
324
|
}
|
|
315
|
-
|
|
325
|
+
const ast = {
|
|
316
326
|
type: "orgchart",
|
|
317
327
|
title: title2,
|
|
318
328
|
direction,
|
|
@@ -320,6 +330,57 @@ function parseOrgchart(text2) {
|
|
|
320
330
|
nodes,
|
|
321
331
|
edges
|
|
322
332
|
};
|
|
333
|
+
if (unparseableLines.length || duplicateIds.length || impliedNodes.length) {
|
|
334
|
+
ast.recovered = {
|
|
335
|
+
...unparseableLines.length ? { unparseableLines } : {},
|
|
336
|
+
...duplicateIds.length ? { duplicateIds } : {},
|
|
337
|
+
...impliedNodes.length ? { impliedNodes } : {}
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
return ast;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// src/diagrams/orgchart/lint.ts
|
|
344
|
+
function lintOrgchart(text2) {
|
|
345
|
+
let ast;
|
|
346
|
+
try {
|
|
347
|
+
ast = parseOrgchart(text2);
|
|
348
|
+
} catch {
|
|
349
|
+
return [];
|
|
350
|
+
}
|
|
351
|
+
const out = [];
|
|
352
|
+
const rec = ast.recovered;
|
|
353
|
+
if (!rec) return out;
|
|
354
|
+
for (const { line, text: src } of rec.unparseableLines ?? []) {
|
|
355
|
+
out.push({
|
|
356
|
+
severity: "warning",
|
|
357
|
+
code: "ORGCHART_UNPARSEABLE_LINE",
|
|
358
|
+
message: `skipped a line that is neither a node nor an edge: "${src}"`,
|
|
359
|
+
line,
|
|
360
|
+
source: src,
|
|
361
|
+
hint: 'A node is `id : "Name" | Title | Dept`; an edge is `parent -> child`. Check for a missing colon or a stray line.',
|
|
362
|
+
fatal: false
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
if (rec.duplicateIds?.length) {
|
|
366
|
+
out.push({
|
|
367
|
+
severity: "warning",
|
|
368
|
+
code: "ORGCHART_DUPLICATE_ID",
|
|
369
|
+
message: `kept the first declaration of duplicate node id(s): ${rec.duplicateIds.map((id) => `"${id}"`).join(", ")}`,
|
|
370
|
+
hint: "Give each person/role a unique id; later redeclarations are dropped.",
|
|
371
|
+
fatal: false
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
if (rec.impliedNodes?.length) {
|
|
375
|
+
out.push({
|
|
376
|
+
severity: "warning",
|
|
377
|
+
code: "ORGCHART_IMPLIED_NODE",
|
|
378
|
+
message: `created node(s) from edges that were never declared: ${rec.impliedNodes.map((id) => `"${id}"`).join(", ")}`,
|
|
379
|
+
hint: 'Declare each person/role explicitly (`id : "Name"`) so labels and roles render; bare ids fall back to the id as the name.',
|
|
380
|
+
fatal: false
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
return out;
|
|
323
384
|
}
|
|
324
385
|
|
|
325
386
|
// src/diagrams/orgchart/layout.ts
|
|
@@ -1010,6 +1071,7 @@ var orgchart = {
|
|
|
1010
1071
|
return /^\s*orgchart\b/i.test(text2);
|
|
1011
1072
|
},
|
|
1012
1073
|
parse: parseOrgchart,
|
|
1074
|
+
lint: lintOrgchart,
|
|
1013
1075
|
render(text2, config) {
|
|
1014
1076
|
const ast = parseOrgchart(text2);
|
|
1015
1077
|
return renderOrgchart(ast, config);
|
|
@@ -1018,8 +1080,9 @@ var orgchart = {
|
|
|
1018
1080
|
|
|
1019
1081
|
exports.OrgchartParseError = OrgchartParseError;
|
|
1020
1082
|
exports.layoutOrgchart = layoutOrgchart;
|
|
1083
|
+
exports.lintOrgchart = lintOrgchart;
|
|
1021
1084
|
exports.orgchart = orgchart;
|
|
1022
1085
|
exports.parseOrgchart = parseOrgchart;
|
|
1023
1086
|
exports.renderOrgchart = renderOrgchart;
|
|
1024
|
-
//# sourceMappingURL=chunk-
|
|
1025
|
-
//# sourceMappingURL=chunk-
|
|
1087
|
+
//# sourceMappingURL=chunk-UHPGWO77.cjs.map
|
|
1088
|
+
//# sourceMappingURL=chunk-UHPGWO77.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/orgchart/parser.ts","../src/diagrams/orgchart/lint.ts","../src/diagrams/orgchart/layout.ts","../src/diagrams/orgchart/renderer.ts","../src/diagrams/orgchart/index.ts"],"names":["text","title","matchQuotedTitle","sx","sy","ex","ey","path","circle","group","rect","desc","el","svgRoot","escapeXml","resolveBaseTheme"],"mappings":"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","file":"chunk-UHPGWO77.cjs","sourcesContent":["import type {\n OrgchartAST,\n OrgchartDirection,\n OrgchartEdge,\n OrgchartLayoutMode,\n OrgchartNode,\n OrgchartNodeKind,\n OrgchartRoleIcon,\n} from \"./types\";\nimport { matchQuotedTitle } from \"../../core/quotes\";\n\nexport class OrgchartParseError extends Error {\n constructor(\n message: string,\n public line?: number,\n public column?: number,\n public source?: string\n ) {\n super(line !== undefined ? `Line ${line}: ${message}` : message);\n this.name = \"OrgchartParseError\";\n }\n}\n\nconst ROLE_ICONS: Record<string, OrgchartRoleIcon> = {\n ceo: \"CEO\",\n cto: \"CTO\",\n cfo: \"CFO\",\n coo: \"COO\",\n cmo: \"CMO\",\n cpo: \"CPO\",\n vp: \"VP\",\n engineer: \"Engineer\",\n engineering: \"Engineer\",\n designer: \"Designer\",\n design: \"Designer\",\n sales: \"Sales\",\n hr: \"HR\",\n legal: \"Legal\",\n ops: \"Ops\",\n operations: \"Ops\",\n marketing: \"Marketing\",\n product: \"Product\",\n data: \"Data\",\n advisor: \"Advisor\",\n intern: \"Intern\",\n vacant: \"Vacant\",\n};\n\nconst NODE_KIND_KEYWORDS = new Set([\n \"person\",\n \"role\",\n \"open\",\n \"draft\",\n \"tbh\",\n \"advisor\",\n \"external\",\n]);\n\nfunction stripComment(line: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of line) {\n if (ch === '\"') inQuote = !inQuote;\n if ((ch === \"#\" || (ch === \"/\" && out.endsWith(\"/\"))) && !inQuote) {\n if (ch === \"/\") return out.slice(0, -1);\n return out;\n }\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) parts.push(cur);\n return parts;\n}\n\nfunction parseProps(inside: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const p of splitTopLevelCommas(inside)) {\n const s = p.trim();\n if (!s) continue;\n const colon = s.indexOf(\":\");\n if (colon < 0) {\n // bare flag like [open]\n out[s.toLowerCase()] = \"true\";\n continue;\n }\n const k = s.slice(0, colon).trim().toLowerCase();\n const v = s.slice(colon + 1).trim();\n out[k] = stripQuotes(v);\n }\n return out;\n}\n\ninterface RawLine {\n indent: number;\n text: string;\n line: number;\n}\n\nfunction tokenizeLines(text: string): RawLine[] {\n const result: RawLine[] = [];\n const split = text.split(\"\\n\");\n for (let i = 0; i < split.length; i++) {\n const raw = split[i] ?? \"\";\n const stripped = stripComment(raw.replace(/\\r$/, \"\"));\n if (!stripped.trim()) continue;\n const match = stripped.match(/^(\\s*)(.*)$/);\n if (!match) continue;\n const indent = match[1].replace(/\\t/g, \" \").length;\n result.push({ indent, text: match[2].trim(), line: i + 1 });\n }\n return result;\n}\n\nfunction parseNodeLine(line: string): {\n kind: OrgchartNodeKind;\n id: string;\n fields: string[];\n props: Record<string, string>;\n} | null {\n // Optional leading kind keyword\n let kind: OrgchartNodeKind = \"person\";\n let rest = line;\n const firstSp = line.indexOf(\" \");\n if (firstSp > 0) {\n const first = line.slice(0, firstSp).toLowerCase();\n if (NODE_KIND_KEYWORDS.has(first)) {\n if (first === \"role\" || first === \"open\") kind = \"role\";\n else if (first === \"draft\" || first === \"tbh\") kind = \"draft\";\n else if (first === \"advisor\" || first === \"external\") kind = \"advisor\";\n else kind = \"person\";\n rest = line.slice(firstSp + 1).trim();\n }\n }\n\n // <id> : \"<name>\" | <title> | <department> [props]\n const colonIdx = rest.indexOf(\":\");\n if (colonIdx < 0) return null;\n const id = rest.slice(0, colonIdx).trim();\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(id)) return null;\n\n let tail = rest.slice(colonIdx + 1).trim();\n // Extract [props]\n let props: Record<string, string> = {};\n const propsMatch = tail.match(/\\[([^\\]]*)\\]\\s*$/);\n if (propsMatch) {\n props = parseProps(propsMatch[1]);\n tail = tail.slice(0, tail.length - propsMatch[0].length).trim();\n }\n\n // Split by pipe at top level (respecting quotes)\n const fields: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of tail) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"|\" && !inQuote) {\n fields.push(cur.trim());\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) fields.push(cur.trim());\n // name field may be quoted\n if (fields.length > 0) fields[0] = stripQuotes(fields[0]);\n return { kind, id, fields, props };\n}\n\nfunction resolveRole(raw: string | undefined): OrgchartRoleIcon | undefined {\n if (!raw) return undefined;\n const key = raw.trim().toLowerCase();\n return ROLE_ICONS[key];\n}\n\nconst EDGE_OPS: Array<{ token: string; kind: \"report\" | \"matrix\" }> = [\n { token: \"-.->\", kind: \"matrix\" },\n { token: \"->\", kind: \"report\" },\n];\n\nfunction findEdgeToken(line: string, token: string): number {\n let inQuote = false;\n for (let i = 0; i < line.length; i++) {\n const ch = line[i];\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote && line.startsWith(token, i)) return i;\n }\n return -1;\n}\n\nexport function parseOrgchart(text: string): OrgchartAST {\n const rawLines = tokenizeLines(text);\n\n let title: string | undefined;\n let direction: OrgchartDirection = \"TD\";\n let layout: OrgchartLayoutMode = \"tree\";\n const nodes: OrgchartNode[] = [];\n const nodeMap = new Map<string, OrgchartNode>();\n const edges: OrgchartEdge[] = [];\n\n // Indent stack for hierarchical parent resolution\n const indentStack: Array<{ indent: number; id: string }> = [];\n\n // Recoverable-input notes — the parser degrades rather than throwing.\n const unparseableLines: { line?: number; text: string }[] = [];\n const duplicateIds: string[] = [];\n const impliedNodes: string[] = [];\n\n for (const rl of rawLines) {\n const line = rl.text;\n\n // Header\n if (/^orgchart\\b/i.test(line)) {\n const t = matchQuotedTitle(line);\n if (t !== undefined) title = t;\n continue;\n }\n\n // Config\n if (/^config\\b/i.test(line)) {\n const m = line.match(/^config\\s*:\\s*(\\w+)\\s*=\\s*\"?([^\"\\n]+?)\"?\\s*$/i);\n if (m) {\n const key = m[1].toLowerCase();\n const val = m[2].trim();\n if (key === \"direction\") {\n direction = val.toUpperCase() === \"LR\" ? \"LR\" : \"TD\";\n } else if (key === \"layout\") {\n const v = val.toLowerCase();\n if (v === \"list\" || v === \"directory\" || v === \"compact\") layout = \"list\";\n else layout = \"tree\";\n }\n }\n continue;\n }\n\n // Edge detection (explicit)\n let edgeHandled = false;\n for (const { token, kind } of EDGE_OPS) {\n const idx = findEdgeToken(line, token);\n if (idx < 0) continue;\n const left = line.slice(0, idx).trim();\n let rest = line.slice(idx + token.length).trim();\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(left)) break;\n let props: Record<string, string> = {};\n const propsMatch = rest.match(/\\[([^\\]]*)\\]\\s*$/);\n if (propsMatch) {\n props = parseProps(propsMatch[1]);\n rest = rest.slice(0, rest.length - propsMatch[0].length).trim();\n }\n const to = rest.split(/\\s+/)[0];\n if (!/^[A-Za-z][A-Za-z0-9_-]*$/.test(to)) break;\n const edge: OrgchartEdge = { from: left, to, kind };\n if (props.label) edge.label = props.label;\n edges.push(edge);\n edgeHandled = true;\n break;\n }\n if (edgeHandled) continue;\n\n // Node line\n const parsed = parseNodeLine(line);\n if (!parsed) {\n // Skip-and-warn rather than blanking the whole chart on one bad line.\n unparseableLines.push({ line: rl.line, text: line });\n continue;\n }\n if (nodeMap.has(parsed.id)) {\n // Keep the first declaration; drop the redeclaration with a warning.\n duplicateIds.push(parsed.id);\n continue;\n }\n\n const node: OrgchartNode = {\n id: parsed.id,\n name: parsed.fields[0] ?? parsed.id,\n title: parsed.fields[1] || undefined,\n department: parsed.fields[2] || undefined,\n info: parsed.fields[3] || undefined,\n kind: parsed.kind,\n matrix: [],\n };\n\n const p = parsed.props;\n if (p.role) node.role = resolveRole(p.role);\n if (p.icon) node.role = resolveRole(p.icon) ?? node.role;\n if (p.open === \"true\") {\n node.open = true;\n node.kind = \"role\";\n }\n if (p.draft === \"true\" || p.tbh === \"true\") {\n node.draft = true;\n node.kind = \"draft\";\n }\n if (p.external === \"true\") {\n node.external = true;\n if (node.kind === \"person\") node.kind = \"advisor\";\n }\n if (p[\"assistant-of\"]) node.assistantOf = p[\"assistant-of\"];\n if (p.reports) node.parent = p.reports;\n if (p.matrix) {\n node.matrix = p.matrix.split(/[\\s,]+/).filter(Boolean);\n }\n if (p.department) node.department = p.department;\n if (p[\"avatar-color\"] || p.avatarcolor) {\n node.avatarColor = p[\"avatar-color\"] ?? p.avatarcolor;\n }\n if (p.gender) {\n const g = p.gender.toLowerCase();\n if (g === \"male\" || g === \"m\") node.gender = \"male\";\n else if (g === \"female\" || g === \"f\") node.gender = \"female\";\n }\n // info line: note / email / phone / location (first one wins if multiple)\n if (!node.info) {\n node.info = p.note ?? p.email ?? p.phone ?? p.location ?? undefined;\n }\n if (p.status) {\n const s = p.status.toLowerCase();\n if (s === \"new\" || s === \"leaving\" || s === \"on-leave\") node.status = s;\n }\n if (node.kind === \"role\" && node.open === undefined && !p.draft) node.open = true;\n if (node.kind === \"role\" && !node.role) node.role = \"Vacant\";\n\n // Resolve parent via indent stack (only if not explicitly set)\n while (indentStack.length > 0 && indentStack[indentStack.length - 1].indent >= rl.indent) {\n indentStack.pop();\n }\n if (!node.parent && indentStack.length > 0) {\n node.parent = indentStack[indentStack.length - 1].id;\n }\n indentStack.push({ indent: rl.indent, id: node.id });\n\n // Attach matrix edges\n for (const m of node.matrix) {\n edges.push({ from: m, to: node.id, kind: \"matrix\" });\n }\n\n nodes.push(node);\n nodeMap.set(node.id, node);\n }\n\n // Add implicit report edges from parent relationships (hierarchical)\n for (const n of nodes) {\n if (n.parent && !n.assistantOf) {\n // Skip if an explicit report edge already exists\n const exists = edges.some(\n (e) => e.kind === \"report\" && e.from === n.parent && e.to === n.id\n );\n if (!exists) edges.push({ from: n.parent, to: n.id, kind: \"report\" });\n }\n }\n\n // Synthesize nodes for ids referenced only by edges. This lets an edge-only\n // chart (`CEO -> CTO`, Mermaid-style shorthand) render instead of throwing —\n // the layout builds the hierarchy from report edges, so the implied nodes\n // slot straight in. Recorded as a warning so the author can declare them.\n const ensureNode = (id: string): void => {\n if (nodeMap.has(id)) return;\n const node: OrgchartNode = { id, name: id, kind: \"person\", matrix: [] };\n nodes.push(node);\n nodeMap.set(id, node);\n impliedNodes.push(id);\n };\n for (const e of edges) {\n ensureNode(e.from);\n ensureNode(e.to);\n }\n\n if (nodes.length === 0) {\n // Nothing renderable at all (empty / header-only / all-unparseable).\n throw new OrgchartParseError(\n unparseableLines.length > 0\n ? `Orgchart has no parseable nodes (${unparseableLines.length} line(s) could not be read)`\n : \"Orgchart has no nodes\"\n );\n }\n\n const ast: OrgchartAST = {\n type: \"orgchart\",\n title,\n direction,\n layout,\n nodes,\n edges,\n };\n if (unparseableLines.length || duplicateIds.length || impliedNodes.length) {\n ast.recovered = {\n ...(unparseableLines.length ? { unparseableLines } : {}),\n ...(duplicateIds.length ? { duplicateIds } : {}),\n ...(impliedNodes.length ? { impliedNodes } : {}),\n };\n }\n return ast;\n}\n","import type { SchematexDiagnostic } from \"../../core/diagnostics\";\nimport type { OrgchartAST } from \"./types\";\nimport { parseOrgchart } from \"./parser\";\n\n/**\n * Orgchart recoverable-input lint.\n *\n * The parser degrades instead of throwing: unparseable lines are skipped,\n * duplicate ids dropped, and ids referenced only by edges are synthesized into\n * nodes. Each recovery is surfaced here as a warning so the render reports\n * `partial` and the author learns what was repaired — without ever blanking a\n * chart that has at least one node.\n */\nexport function lintOrgchart(text: string): SchematexDiagnostic[] {\n let ast: OrgchartAST;\n try {\n ast = parseOrgchart(text);\n } catch {\n return [];\n }\n const out: SchematexDiagnostic[] = [];\n const rec = ast.recovered;\n if (!rec) return out;\n\n for (const { line, text: src } of rec.unparseableLines ?? []) {\n out.push({\n severity: \"warning\",\n code: \"ORGCHART_UNPARSEABLE_LINE\",\n message: `skipped a line that is neither a node nor an edge: \"${src}\"`,\n line,\n source: src,\n hint: 'A node is `id : \"Name\" | Title | Dept`; an edge is `parent -> child`. Check for a missing colon or a stray line.',\n fatal: false,\n });\n }\n\n if (rec.duplicateIds?.length) {\n out.push({\n severity: \"warning\",\n code: \"ORGCHART_DUPLICATE_ID\",\n message: `kept the first declaration of duplicate node id(s): ${rec.duplicateIds\n .map((id) => `\"${id}\"`)\n .join(\", \")}`,\n hint: \"Give each person/role a unique id; later redeclarations are dropped.\",\n fatal: false,\n });\n }\n\n if (rec.impliedNodes?.length) {\n out.push({\n severity: \"warning\",\n code: \"ORGCHART_IMPLIED_NODE\",\n message: `created node(s) from edges that were never declared: ${rec.impliedNodes\n .map((id) => `\"${id}\"`)\n .join(\", \")}`,\n hint: 'Declare each person/role explicitly (`id : \"Name\"`) so labels and roles render; bare ids fall back to the id as the name.',\n fatal: false,\n });\n }\n\n return out;\n}\n","import type {\n OrgchartAST,\n OrgchartLayoutEdge,\n OrgchartLayoutNode,\n OrgchartLayoutResult,\n OrgchartNode,\n} from \"./types\";\n\nconst CARD_W = 240;\nconst CARD_H = 76;\nconst TIER_GAP = 44;\nconst SIB_GAP = 20;\nconst PADDING = 30;\nconst ASSISTANT_GAP = 32;\n\n\ninterface TreeNode {\n id: string;\n children: TreeNode[];\n assistants: TreeNode[];\n node: OrgchartNode;\n subtreeWidth: number;\n x: number;\n y: number;\n}\n\nfunction hashString(s: string): number {\n let h = 0;\n for (let i = 0; i < s.length; i++) {\n h = (h * 31 + s.charCodeAt(i)) | 0;\n }\n return Math.abs(h);\n}\n\nfunction hexToRgb(hex: string): { r: number; g: number; b: number } {\n const h = hex.replace(\"#\", \"\").padEnd(6, \"0\");\n return {\n r: parseInt(h.slice(0, 2), 16),\n g: parseInt(h.slice(2, 4), 16),\n b: parseInt(h.slice(4, 6), 16),\n };\n}\n\nfunction rgbToHex(r: number, g: number, b: number): string {\n const c = (v: number) =>\n Math.max(0, Math.min(255, Math.round(v)))\n .toString(16)\n .padStart(2, \"0\");\n return `#${c(r)}${c(g)}${c(b)}`;\n}\n\n/** Light tint: mix base color with white at given weight (0 = white, 1 = base). */\nfunction tint(hex: string, weight: number): string {\n const { r, g, b } = hexToRgb(hex);\n return rgbToHex(255 + (r - 255) * weight, 255 + (g - 255) * weight, 255 + (b - 255) * weight);\n}\n\n/** Darker shade: mix base with black at given weight (0 = base, 1 = black). */\nfunction shade(hex: string, weight: number): string {\n const { r, g, b } = hexToRgb(hex);\n return rgbToHex(r * (1 - weight), g * (1 - weight), b * (1 - weight));\n}\n\nfunction computeInitials(name: string): string {\n const trimmed = name.trim();\n if (!trimmed) return \"?\";\n // eslint-disable-next-line no-control-regex\n if (/[^\\x00-\\x7F]/.test(trimmed[0])) {\n return Array.from(trimmed)[0];\n }\n const parts = trimmed.split(/\\s+/);\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();\n return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();\n}\n\nexport function layoutOrgchart(\n ast: OrgchartAST,\n palette: readonly string[]\n): OrgchartLayoutResult {\n // If any node has info, expand card height to fit 3 text lines\n const hasInfo = ast.nodes.some((n) => !!n.info);\n const cW = CARD_W;\n const cH = hasInfo ? 92 : CARD_H;\n const tierGap = TIER_GAP;\n const sibGap = SIB_GAP;\n\n const nodeById = new Map<string, OrgchartNode>();\n for (const n of ast.nodes) nodeById.set(n.id, n);\n\n const childrenMap = new Map<string, string[]>();\n const parentMap = new Map<string, string>();\n for (const n of ast.nodes) childrenMap.set(n.id, []);\n for (const e of ast.edges) {\n if (e.kind !== \"report\") continue;\n childrenMap.get(e.from)?.push(e.to);\n parentMap.set(e.to, e.from);\n }\n\n const roots: OrgchartNode[] = [];\n for (const n of ast.nodes) {\n if (!parentMap.has(n.id) && !n.assistantOf) roots.push(n);\n }\n\n const treeById = new Map<string, TreeNode>();\n for (const n of ast.nodes) {\n treeById.set(n.id, {\n id: n.id,\n node: n,\n children: [],\n assistants: [],\n subtreeWidth: 0,\n x: 0,\n y: 0,\n });\n }\n\n for (const n of ast.nodes) {\n const t = treeById.get(n.id)!;\n for (const cid of childrenMap.get(n.id) ?? []) {\n const c = nodeById.get(cid)!;\n if (c.assistantOf === n.id) continue;\n t.children.push(treeById.get(cid)!);\n }\n }\n for (const n of ast.nodes) {\n if (n.assistantOf) {\n const parent = treeById.get(n.assistantOf);\n if (parent) parent.assistants.push(treeById.get(n.id)!);\n }\n }\n\n function computeWidth(t: TreeNode): number {\n if (t.children.length === 0) {\n t.subtreeWidth = cW;\n return t.subtreeWidth;\n }\n let sum = 0;\n for (let i = 0; i < t.children.length; i++) {\n sum += computeWidth(t.children[i]);\n if (i < t.children.length - 1) sum += sibGap;\n }\n t.subtreeWidth = Math.max(cW, sum);\n return t.subtreeWidth;\n }\n\n function assign(t: TreeNode, leftX: number, depth: number): void {\n const cx = leftX + t.subtreeWidth / 2;\n t.x = cx;\n t.y = PADDING + depth * (cH + tierGap);\n if (t.children.length > 0) {\n const childBlock = t.children.reduce(\n (s, c, i) => s + c.subtreeWidth + (i > 0 ? sibGap : 0),\n 0\n );\n let childLeft = cx - childBlock / 2;\n for (const c of t.children) {\n assign(c, childLeft, depth + 1);\n childLeft += c.subtreeWidth + sibGap;\n }\n }\n }\n\n let curLeft = PADDING;\n for (const r of roots) {\n const rt = treeById.get(r.id)!;\n computeWidth(rt);\n assign(rt, curLeft, 0);\n curLeft += rt.subtreeWidth + sibGap * 2;\n }\n\n for (const [, t] of treeById) {\n for (let i = 0; i < t.assistants.length; i++) {\n const a = t.assistants[i];\n a.x = t.x + cW + ASSISTANT_GAP + i * (cW + sibGap);\n a.y = t.y + cH * 0.3;\n }\n }\n\n // Department color index\n const deptIndex = new Map<string, number>();\n for (const n of ast.nodes) {\n if (n.department && !deptIndex.has(n.department)) {\n deptIndex.set(n.department, deptIndex.size);\n }\n }\n\n const nodes: OrgchartLayoutNode[] = [];\n for (const n of ast.nodes) {\n const t = treeById.get(n.id)!;\n const deptColor = n.department\n ? palette[(deptIndex.get(n.department) ?? 0) % palette.length]\n : undefined;\n const base =\n n.avatarColor ??\n deptColor ??\n palette[hashString(n.name) % palette.length];\n const avatarBg = tint(base, 0.14);\n const avatarFg = shade(base, 0.4);\n nodes.push({\n node: n,\n x: t.x,\n y: t.y,\n width: cW,\n height: cH,\n deptColor,\n avatarBg,\n avatarFg,\n initials: computeInitials(n.name),\n });\n }\n\n // Shift all nodes so the leftmost sits at PADDING\n let minX = Infinity;\n for (const n of nodes) minX = Math.min(minX, n.x - n.width / 2);\n const shift = PADDING - minX;\n if (Math.abs(shift) > 0.5) {\n for (const n of nodes) n.x += shift;\n }\n\n const nodeLayoutById = new Map<string, OrgchartLayoutNode>();\n for (const n of nodes) nodeLayoutById.set(n.node.id, n);\n\n const layoutEdges: OrgchartLayoutEdge[] = [];\n for (const e of ast.edges) {\n const from = nodeLayoutById.get(e.from);\n const to = nodeLayoutById.get(e.to);\n if (!from || !to) continue;\n if (e.kind === \"report\") {\n if (to.node.assistantOf === from.node.id) {\n const sx = from.x + from.width / 2;\n const sy = from.y + from.height / 2;\n const ex = to.x - to.width / 2;\n const ey = to.y + to.height / 2;\n layoutEdges.push({ edge: e, path: `M ${sx} ${sy} L ${ex} ${ey}` });\n continue;\n }\n const sx = from.x;\n const sy = from.y + from.height;\n const ex = to.x;\n const ey = to.y;\n const midY = (sy + ey) / 2;\n const path =\n Math.abs(sx - ex) < 0.5\n ? `M ${sx} ${sy} L ${ex} ${ey}`\n : `M ${sx} ${sy} L ${sx} ${midY} L ${ex} ${midY} L ${ex} ${ey}`;\n layoutEdges.push({ edge: e, path });\n } else {\n const sx = from.x;\n const sy = from.y + from.height / 2;\n const ex = to.x;\n const ey = to.y + to.height / 2;\n const midY = (sy + ey) / 2;\n const path = `M ${sx} ${sy} C ${sx} ${midY}, ${ex} ${midY}, ${ex} ${ey}`;\n const entry: OrgchartLayoutEdge = { edge: e, path };\n if (e.label) {\n entry.labelX = (sx + ex) / 2;\n entry.labelY = midY;\n }\n layoutEdges.push(entry);\n }\n }\n\n let maxX = 0;\n let maxY = 0;\n for (const n of nodes) {\n maxX = Math.max(maxX, n.x + n.width / 2);\n maxY = Math.max(maxY, n.y + n.height);\n }\n\n const width = Math.max(400, maxX + PADDING);\n const height = Math.max(200, maxY + PADDING);\n\n return {\n width,\n height,\n nodes,\n edges: layoutEdges,\n title: ast.title,\n mode: \"tree\",\n };\n}\n\n// ──────────────────────────────────────────────────────────────────────────────\n// List / directory layout\n// ──────────────────────────────────────────────────────────────────────────────\n\nconst LIST_ROW_H = 32;\nconst LIST_INDENT = 22;\nconst LIST_PAD = 20;\nconst LIST_PANEL_W = 820;\nconst LIST_GUIDE_X0 = 32; // x of root caret\n\nexport function layoutOrgchartList(\n ast: OrgchartAST,\n palette: readonly string[]\n): OrgchartLayoutResult {\n const nodeById = new Map<string, OrgchartNode>();\n for (const n of ast.nodes) nodeById.set(n.id, n);\n\n const childrenMap = new Map<string, string[]>();\n const parentMap = new Map<string, string>();\n for (const n of ast.nodes) childrenMap.set(n.id, []);\n for (const e of ast.edges) {\n if (e.kind !== \"report\") continue;\n childrenMap.get(e.from)?.push(e.to);\n parentMap.set(e.to, e.from);\n }\n\n const roots: OrgchartNode[] = [];\n for (const n of ast.nodes) {\n if (!parentMap.has(n.id) && !n.assistantOf) roots.push(n);\n }\n\n // Subtree size (descendants count, excluding self)\n const subtreeSize = new Map<string, number>();\n function computeSize(id: string): number {\n const cached = subtreeSize.get(id);\n if (cached !== undefined) return cached;\n const kids = childrenMap.get(id) ?? [];\n let s = kids.length;\n for (const k of kids) s += computeSize(k);\n subtreeSize.set(id, s);\n return s;\n }\n for (const n of ast.nodes) computeSize(n.id);\n\n // Department color index\n const deptIndex = new Map<string, number>();\n for (const n of ast.nodes) {\n if (n.department && !deptIndex.has(n.department)) {\n deptIndex.set(n.department, deptIndex.size);\n }\n }\n\n const nodes: OrgchartLayoutNode[] = [];\n const guides: string[] = [];\n let rowIdx = 0;\n\n function visit(id: string, depth: number): void {\n const n = nodeById.get(id);\n if (!n) return;\n const y = LIST_PAD + rowIdx * LIST_ROW_H;\n const x = LIST_GUIDE_X0 + depth * LIST_INDENT;\n const deptColor = n.department\n ? palette[(deptIndex.get(n.department) ?? 0) % palette.length]\n : undefined;\n const base =\n n.avatarColor ??\n deptColor ??\n palette[hashString(n.name) % palette.length];\n const kids = childrenMap.get(id) ?? [];\n const hasKids = kids.length > 0;\n nodes.push({\n node: n,\n x,\n y,\n width: LIST_PANEL_W - x - LIST_PAD,\n height: LIST_ROW_H,\n deptColor,\n avatarBg: tint(base, 0.14),\n avatarFg: shade(base, 0.4),\n initials: computeInitials(n.name),\n depth,\n subtreeSize: subtreeSize.get(id) ?? 0,\n hasChildren: hasKids,\n });\n rowIdx++;\n for (const c of kids) visit(c, depth + 1);\n }\n\n for (const r of roots) visit(r.id, 0);\n\n // Guide lines: for each parent with children, draw a vertical trunk from its row\n // center down to the last child's row center, plus a short horizontal tick into each child.\n for (let i = 0; i < nodes.length; i++) {\n const p = nodes[i];\n if (!p.hasChildren) continue;\n const pxLine = p.x + 10; // beneath the caret\n const pyStart = p.y + LIST_ROW_H / 2 + 6;\n // Find last descendant child (direct) row y\n const directChildren: OrgchartLayoutNode[] = [];\n for (let j = i + 1; j < nodes.length; j++) {\n const q = nodes[j];\n if ((q.depth ?? 0) <= (p.depth ?? 0)) break;\n if ((q.depth ?? 0) === (p.depth ?? 0) + 1) directChildren.push(q);\n }\n if (directChildren.length === 0) continue;\n const lastChild = directChildren[directChildren.length - 1];\n const pyEnd = lastChild.y + LIST_ROW_H / 2;\n guides.push(`M ${pxLine} ${pyStart} L ${pxLine} ${pyEnd}`);\n for (const c of directChildren) {\n const tickY = c.y + LIST_ROW_H / 2;\n guides.push(`M ${pxLine} ${tickY} L ${c.x - 2} ${tickY}`);\n }\n }\n\n const height = LIST_PAD * 2 + rowIdx * LIST_ROW_H;\n return {\n width: LIST_PANEL_W,\n height,\n nodes,\n edges: [],\n title: ast.title,\n mode: \"list\",\n guides,\n };\n}\n","import type { RenderConfig } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text as textEl,\n title as titleEl,\n desc,\n rect,\n circle,\n escapeXml,\n} from \"../../core/svg\";\nimport { resolveBaseTheme, type BaseTheme } from \"../../core/theme\";\nimport { layoutOrgchart, layoutOrgchartList } from \"./layout\";\nimport type { OrgchartAST, OrgchartLayoutNode, OrgchartRoleIcon } from \"./types\";\n\nfunction buildCss(t: BaseTheme): string {\n return `\n.lt-org { font-family: system-ui, -apple-system, sans-serif; }\n.lt-org-title { font: 500 16px sans-serif; fill: ${t.text}; }\n.lt-org-card { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-org-card-vacant { fill: ${t.bg}; stroke: ${t.warn}; stroke-width: 1; stroke-dasharray: 4,3; }\n.lt-org-card-draft { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; stroke-dasharray: 4,3; opacity: 0.7; }\n.lt-org-card-external { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; stroke-dasharray: 4,3; }\n.lt-org-name { font: 500 14px sans-serif; fill: ${t.text}; }\n.lt-org-title-text { font: 400 12px sans-serif; fill: ${t.textMuted}; }\n.lt-org-info { font: 400 11px sans-serif; fill: ${t.textMuted}; }\n.lt-org-dept { font: 500 10px sans-serif; }\n.lt-org-avatar-text { font: 600 13px sans-serif; text-anchor: middle; }\n.lt-org-edge { stroke: ${t.stroke}; stroke-width: 1.4; fill: none; }\n.lt-org-edge-matrix { stroke: ${t.neutral}; stroke-width: 1.2; stroke-dasharray: 4,3; fill: none; }\n.lt-org-edge-label-bg { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-org-edge-label { font: 500 10px sans-serif; fill: ${t.textMuted}; text-anchor: middle; }\n.lt-org-pill-bg { fill: ${t.bg}; stroke-width: 1; }\n.lt-org-pill { font: 600 9px sans-serif; text-anchor: middle; letter-spacing: 0.4px; }\n.lt-org-panel { fill: ${t.bg}; stroke: ${t.neutral}; stroke-width: 1; }\n.lt-org-guide { stroke: ${t.neutral}; stroke-width: 1; fill: none; }\n.lt-org-caret { font: 400 9px sans-serif; fill: ${t.textMuted}; }\n.lt-org-row-name { font: 500 13px sans-serif; fill: ${t.text}; }\n.lt-org-row-title { font: 400 12px sans-serif; fill: ${t.textMuted}; }\n.lt-org-row-avatar-text { font: 600 10px sans-serif; text-anchor: middle; }\n.lt-org-row-count { font: 400 11px sans-serif; fill: ${t.textMuted}; text-anchor: end; }\n.lt-org-row-dept { font: 500 10px sans-serif; text-anchor: middle; }\n`.trim();\n}\n\n/** Gender silhouette (head + body) centered at (0,0), ~18px tall. */\nfunction renderGenderGlyph(gender: \"male\" | \"female\", fg: string): string {\n const f = `fill=\"${fg}\"`;\n if (gender === \"male\") {\n // head + broad rectangular shoulders\n return `<circle cx=\"0\" cy=\"-7\" r=\"5.5\" ${f}/><path d=\"M -9 11 C -9 2 -5 0 0 0 C 5 0 9 2 9 11 Z\" ${f}/>`;\n }\n // female: head + tapered dress silhouette\n return `<circle cx=\"0\" cy=\"-7\" r=\"5.5\" ${f}/><path d=\"M -5 0 C -10 5 -11 10 -10 11 L 10 11 C 11 10 10 5 5 0 Z\" ${f}/>`;\n}\n\n/** Simple SVG role-icon glyph in `fg` foreground color on a tinted circle. */\nfunction renderRoleGlyph(role: OrgchartRoleIcon, fg: string): string {\n // Approx 20x20 icon centered at (0,0)\n const stroke = `stroke=\"${fg}\" stroke-width=\"1.6\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`;\n const fillWhite = `fill=\"${fg}\"`;\n switch (role) {\n case \"CEO\":\n case \"VP\":\n // Crown\n return `<path d=\"M -10 4 L -10 -6 L -4 0 L 0 -8 L 4 0 L 10 -6 L 10 4 Z\" ${fillWhite} stroke=\"none\"/>`;\n case \"CTO\":\n case \"Engineer\":\n // Gear (simplified 8-tooth)\n return `<circle r=\"6\" ${stroke}/><circle r=\"2\" ${fillWhite} stroke=\"none\"/><g ${stroke}><line x1=\"0\" y1=\"-9\" x2=\"0\" y2=\"-7\"/><line x1=\"0\" y1=\"9\" x2=\"0\" y2=\"7\"/><line x1=\"-9\" y1=\"0\" x2=\"-7\" y2=\"0\"/><line x1=\"9\" y1=\"0\" x2=\"7\" y2=\"0\"/><line x1=\"-6.4\" y1=\"-6.4\" x2=\"-5\" y2=\"-5\"/><line x1=\"6.4\" y1=\"-6.4\" x2=\"5\" y2=\"-5\"/><line x1=\"-6.4\" y1=\"6.4\" x2=\"-5\" y2=\"5\"/><line x1=\"6.4\" y1=\"6.4\" x2=\"5\" y2=\"5\"/></g>`;\n case \"CFO\":\n // Dollar\n return `<text x=\"0\" y=\"6\" text-anchor=\"middle\" font-size=\"18\" font-weight=\"700\" fill=\"${fg}\">$</text>`;\n case \"COO\":\n case \"Ops\":\n // Triple gear dots\n return `<g ${fillWhite}><circle cx=\"-6\" cy=\"0\" r=\"3\" stroke=\"none\"/><circle cx=\"6\" cy=\"0\" r=\"3\" stroke=\"none\"/><circle cx=\"0\" cy=\"-5\" r=\"3\" stroke=\"none\"/></g>`;\n case \"CMO\":\n case \"Marketing\":\n // Megaphone (simplified)\n return `<path d=\"M -8 -4 L 2 -7 L 2 7 L -8 4 Z\" ${fillWhite} stroke=\"none\"/><path d=\"M 2 -4 L 8 -6 L 8 6 L 2 4 Z\" ${fillWhite} stroke=\"none\"/>`;\n case \"CPO\":\n case \"Product\":\n // Lightbulb\n return `<path d=\"M 0 -8 C 5 -8 7 -4 7 0 C 7 3 4 4 4 6 L -4 6 C -4 4 -7 3 -7 0 C -7 -4 -5 -8 0 -8 Z\" ${fillWhite} stroke=\"none\"/><line x1=\"-3\" y1=\"9\" x2=\"3\" y2=\"9\" stroke=\"${fg}\" stroke-width=\"1.5\"/>`;\n case \"Designer\":\n // Paint brush\n return `<path d=\"M -7 7 L 7 -7 L 9 -5 L -5 9 Z\" ${fillWhite} stroke=\"none\"/>`;\n case \"Sales\":\n // Briefcase\n return `<rect x=\"-8\" y=\"-4\" width=\"16\" height=\"10\" rx=\"1\" ${fillWhite} stroke=\"none\"/><rect x=\"-4\" y=\"-7\" width=\"8\" height=\"4\" ${stroke}/>`;\n case \"HR\":\n // Person group\n return `<circle cx=\"-3\" cy=\"-4\" r=\"3\" ${fillWhite} stroke=\"none\"/><circle cx=\"4\" cy=\"-3\" r=\"2.5\" ${fillWhite} stroke=\"none\"/><path d=\"M -8 7 C -8 2 -2 2 -2 2 C -2 2 2 2 2 7 Z\" ${fillWhite} stroke=\"none\"/><path d=\"M 0 7 C 0 4 4 4 4 4 C 4 4 9 4 9 7 Z\" ${fillWhite} stroke=\"none\"/>`;\n case \"Legal\":\n // Balance / scale\n return `<line x1=\"0\" y1=\"-8\" x2=\"0\" y2=\"8\" stroke=\"${fg}\" stroke-width=\"1.6\"/><line x1=\"-7\" y1=\"-6\" x2=\"7\" y2=\"-6\" stroke=\"${fg}\" stroke-width=\"1.6\"/><path d=\"M -9 0 L -5 -6 L -1 0 Z\" ${fillWhite} stroke=\"none\"/><path d=\"M 1 0 L 5 -6 L 9 0 Z\" ${fillWhite} stroke=\"none\"/>`;\n case \"Data\":\n // Bar chart\n return `<g ${fillWhite}><rect x=\"-8\" y=\"0\" width=\"4\" height=\"7\" stroke=\"none\"/><rect x=\"-2\" y=\"-4\" width=\"4\" height=\"11\" stroke=\"none\"/><rect x=\"4\" y=\"-7\" width=\"4\" height=\"14\" stroke=\"none\"/></g>`;\n case \"Advisor\":\n // Star\n return `<path d=\"M 0 -9 L 2.6 -2.7 L 9 -2 L 4 2.3 L 5.3 8.5 L 0 5 L -5.3 8.5 L -4 2.3 L -9 -2 L -2.6 -2.7 Z\" ${fillWhite} stroke=\"none\"/>`;\n case \"Intern\":\n // Graduation cap\n return `<path d=\"M -10 -2 L 0 -7 L 10 -2 L 0 3 Z\" ${fillWhite} stroke=\"none\"/><path d=\"M -5 0 L -5 5 C -5 7 5 7 5 5 L 5 0\" ${stroke}/>`;\n case \"Vacant\":\n return `<circle r=\"7\" stroke=\"${fg}\" stroke-width=\"1.4\" fill=\"none\" stroke-dasharray=\"3,2\"/><text x=\"0\" y=\"4\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"700\" fill=\"${fg}\">?</text>`;\n default:\n return \"\";\n }\n}\n\nfunction renderAvatar(ln: OrgchartLayoutNode): string {\n const role = ln.node.role;\n const cx = -ln.width / 2 + 14 + 18;\n const cy = 0;\n const r = 18;\n const parts: string[] = [\n circle({ cx, cy, r, fill: ln.avatarBg, stroke: \"none\" }),\n ];\n if (role && role !== \"Vacant\") {\n parts.push(\n group({ transform: `translate(${cx}, ${cy})` }, [\n renderRoleGlyph(role, ln.avatarFg),\n ])\n );\n } else if (ln.node.open) {\n parts.push(\n group({ transform: `translate(${cx}, ${cy})` }, [\n renderRoleGlyph(\"Vacant\", ln.avatarFg),\n ])\n );\n } else if (ln.node.gender) {\n parts.push(\n group({ transform: `translate(${cx}, ${cy})` }, [\n renderGenderGlyph(ln.node.gender, ln.avatarFg),\n ])\n );\n } else {\n parts.push(\n textEl(\n { x: cx, y: cy + 5, class: \"lt-org-avatar-text\", fill: ln.avatarFg },\n ln.initials\n )\n );\n }\n return group({}, parts);\n}\n\nfunction renderCardBody(ln: OrgchartLayoutNode, t: BaseTheme): string {\n const n = ln.node;\n const x = -ln.width / 2;\n const y = -ln.height / 2;\n\n let cardClass = \"lt-org-card\";\n if (n.open) cardClass = \"lt-org-card-vacant\";\n else if (n.draft) cardClass = \"lt-org-card-draft\";\n else if (n.external) cardClass = \"lt-org-card-external\";\n\n const parts: string[] = [];\n parts.push(\n rect({\n x,\n y,\n width: ln.width,\n height: ln.height,\n rx: 10,\n ry: 10,\n class: cardClass,\n })\n );\n\n parts.push(renderAvatar(ln));\n\n // Text block to the right of avatar. Name + title only; department is conveyed by avatar color.\n const textX = x + 14 + 36 + 12;\n const hasTitle = !!n.title;\n\n const hasInfo = !!n.info;\n const displayName = n.open && !n.name ? \"Open Role\" : n.name;\n\n // Vertical layout: name → title → info, centered in card\n // Anchor row count determines nameY offset\n const lineCount = 1 + (hasTitle ? 1 : 0) + (hasInfo ? 1 : 0);\n const lineH = 16;\n const nameY = -(lineCount - 1) * lineH / 2;\n\n parts.push(textEl({ x: textX, y: nameY, class: \"lt-org-name\" }, displayName));\n if (hasTitle) {\n parts.push(textEl({ x: textX, y: nameY + lineH, class: \"lt-org-title-text\" }, n.title!));\n }\n if (hasInfo) {\n parts.push(\n textEl(\n { x: textX, y: nameY + lineH * (hasTitle ? 2 : 1), class: \"lt-org-info\" },\n n.info!\n )\n );\n }\n\n // Status / hiring pill (top-right corner)\n const pillLabel =\n n.open\n ? \"HIRING\"\n : n.status === \"new\"\n ? \"NEW\"\n : n.status === \"leaving\"\n ? \"LEAVING\"\n : n.status === \"on-leave\"\n ? \"ON LEAVE\"\n : undefined;\n if (pillLabel) {\n const pw = pillLabel.length * 5.8 + 10;\n const ph = 14;\n const px = ln.width / 2 - pw - 8;\n const py = y + 8;\n const pillFg =\n pillLabel === \"HIRING\"\n ? \"#8a6d00\"\n : pillLabel === \"NEW\"\n ? \"#2b6a3a\"\n : pillLabel === \"LEAVING\"\n ? \"#8a3b1a\"\n : t.textMuted;\n const pillBg =\n pillLabel === \"HIRING\"\n ? \"#fef3c7\"\n : pillLabel === \"NEW\"\n ? \"#dcfce7\"\n : pillLabel === \"LEAVING\"\n ? \"#fee4d8\"\n : \"#eeeeea\";\n parts.push(\n rect({ x: px, y: py, width: pw, height: ph, rx: 3, fill: pillBg, stroke: \"none\" })\n );\n parts.push(\n textEl(\n { x: px + pw / 2, y: py + ph - 4, class: \"lt-org-pill\", fill: pillFg },\n pillLabel\n )\n );\n }\n\n return group(\n {\n transform: `translate(${ln.x}, ${ln.y + ln.height / 2})`,\n \"data-person-id\": n.id,\n \"data-department\": n.department ?? \"\",\n \"data-role\": n.role ?? \"\",\n },\n parts\n );\n}\n\nfunction renderListRow(ln: OrgchartLayoutNode): string {\n const n = ln.node;\n const rowCenterY = ln.y + ln.height / 2;\n const caretX = ln.x;\n const avatarCx = ln.x + 20;\n const avatarR = 11;\n const parts: string[] = [];\n\n // Caret\n const caret = ln.hasChildren ? \"▼\" : \"·\";\n parts.push(\n textEl(\n { x: caretX, y: rowCenterY + 3, class: \"lt-org-caret\" },\n caret\n )\n );\n\n // Avatar\n parts.push(circle({ cx: avatarCx, cy: rowCenterY, r: avatarR, fill: ln.avatarBg, stroke: \"none\" }));\n if (n.role && n.role !== \"Vacant\") {\n parts.push(\n group({ transform: `translate(${avatarCx}, ${rowCenterY}) scale(0.58)` }, [\n renderRoleGlyph(n.role, ln.avatarFg),\n ])\n );\n } else if (n.open) {\n parts.push(\n group({ transform: `translate(${avatarCx}, ${rowCenterY}) scale(0.58)` }, [\n renderRoleGlyph(\"Vacant\", ln.avatarFg),\n ])\n );\n } else if (n.gender) {\n parts.push(\n group({ transform: `translate(${avatarCx}, ${rowCenterY}) scale(0.56)` }, [\n renderGenderGlyph(n.gender, ln.avatarFg),\n ])\n );\n } else {\n parts.push(\n textEl(\n {\n x: avatarCx,\n y: rowCenterY + 3,\n class: \"lt-org-row-avatar-text\",\n fill: ln.avatarFg,\n },\n ln.initials\n )\n );\n }\n\n // Name + title\n const textY = rowCenterY + 4;\n const nameX = avatarCx + avatarR + 10;\n const displayName = n.open && !n.name ? \"Open Role\" : n.name;\n parts.push(textEl({ x: nameX, y: textY, class: \"lt-org-row-name\" }, displayName));\n if (n.title) {\n const titleX = nameX + Math.max(80, displayName.length * 8 + 10);\n parts.push(textEl({ x: titleX, y: textY, class: \"lt-org-row-title\" }, n.title));\n }\n\n // Right side: dept pill + report count (only if root has many)\n const rightEdge = ln.x + ln.width;\n let cursor = rightEdge;\n if (ln.subtreeSize && ln.subtreeSize > 0) {\n const countLabel = ln.depth === 0 ? `${ln.subtreeSize} reports` : `${ln.subtreeSize}`;\n parts.push(\n textEl(\n { x: cursor, y: textY, class: \"lt-org-row-count\" },\n countLabel\n )\n );\n cursor -= Math.max(30, countLabel.length * 6.5) + 12;\n }\n if (n.department) {\n const pw = n.department.length * 5.6 + 14;\n const ph = 16;\n const px = cursor - pw;\n const py = rowCenterY - ph / 2;\n parts.push(\n rect({ x: px, y: py, width: pw, height: ph, rx: 3, fill: ln.avatarBg, stroke: \"none\" })\n );\n parts.push(\n textEl(\n {\n x: px + pw / 2,\n y: textY,\n class: \"lt-org-row-dept\",\n fill: ln.avatarFg,\n },\n n.department\n )\n );\n }\n\n return group({ \"data-person-id\": n.id }, parts);\n}\n\nfunction renderOrgchartList(\n ast: OrgchartAST,\n layout: ReturnType<typeof layoutOrgchartList>,\n t: BaseTheme\n): string {\n const titleOffset = ast.title ? 42 : 16;\n const width = Math.ceil(layout.width);\n const height = Math.ceil(layout.height + titleOffset);\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Organizational Directory\"));\n children.push(\n desc(\n `Organizational directory with ${ast.nodes.length} people and ${ast.edges.length} reporting relationships`\n )\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(textEl({ x: 20, y: 24, class: \"lt-org-title\" }, ast.title));\n }\n\n const inner: string[] = [];\n\n // Guide lines\n for (const g of layout.guides ?? []) {\n inner.push(pathEl({ d: g, class: \"lt-org-guide\" }));\n }\n\n // Rows\n for (const ln of layout.nodes) {\n inner.push(renderListRow(ln));\n }\n\n children.push(group({ transform: `translate(0, ${titleOffset})` }, inner));\n\n return svgRoot(\n {\n class: \"lt-org\",\n role: \"img\",\n \"aria-label\": escapeXml(ast.title ?? \"Organizational directory\"),\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n\nexport function renderOrgchart(ast: OrgchartAST, config?: RenderConfig): string {\n const t = resolveBaseTheme(config?.theme ?? \"default\");\n if (ast.layout === \"list\") {\n return renderOrgchartList(ast, layoutOrgchartList(ast, t.palette), t);\n }\n const layout = layoutOrgchart(ast, t.palette);\n const titleOffset = ast.title ? 36 : 10;\n const width = Math.ceil(layout.width);\n const height = Math.ceil(layout.height + titleOffset);\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Organizational Chart\"));\n children.push(\n desc(\n `Organizational chart with ${ast.nodes.length} people and ${ast.edges.length} relationships`\n )\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(textEl({ x: 20, y: 24, class: \"lt-org-title\" }, ast.title));\n }\n\n const inner: string[] = [];\n\n // Edges first\n for (const le of layout.edges) {\n const cls = le.edge.kind === \"matrix\" ? \"lt-org-edge-matrix\" : \"lt-org-edge\";\n inner.push(pathEl({ d: le.path, class: cls }));\n }\n // Matrix edge labels\n for (const le of layout.edges) {\n if (le.edge.kind !== \"matrix\" || !le.edge.label || le.labelX === undefined) continue;\n const w = le.edge.label.length * 6 + 12;\n const h = 16;\n const x = (le.labelX ?? 0) - w / 2;\n const y = (le.labelY ?? 0) - h / 2;\n inner.push(\n rect({ x, y, width: w, height: h, rx: 3, class: \"lt-org-edge-label-bg\" })\n );\n inner.push(\n textEl(\n { x: le.labelX, y: (le.labelY ?? 0) + 4, class: \"lt-org-edge-label\" },\n le.edge.label\n )\n );\n }\n\n // Cards on top\n for (const ln of layout.nodes) {\n inner.push(renderCardBody(ln, t));\n }\n\n children.push(group({ transform: `translate(0, ${titleOffset})` }, inner));\n\n return svgRoot(\n {\n class: \"lt-org\",\n role: \"img\",\n \"aria-label\": escapeXml(ast.title ?? \"Organizational chart\"),\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseOrgchart } from \"./parser\";\nimport { lintOrgchart } from \"./lint\";\nimport { renderOrgchart } from \"./renderer\";\n\nexport const orgchart: DiagramPlugin = {\n type: \"orgchart\",\n detect(text) {\n return /^\\s*orgchart\\b/i.test(text);\n },\n parse: parseOrgchart,\n lint: lintOrgchart,\n\n render(text, config) {\n const ast = parseOrgchart(text);\n return renderOrgchart(ast, config);\n },\n};\n\nexport { parseOrgchart, OrgchartParseError } from \"./parser\";\nexport { lintOrgchart } from \"./lint\";\nexport { renderOrgchart } from \"./renderer\";\nexport { layoutOrgchart } from \"./layout\";\nexport type * from \"./types\";\n"]}
|