schematex 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/ai-sdk.cjs +85 -0
- package/dist/ai/ai-sdk.cjs.map +1 -0
- package/dist/ai/ai-sdk.d.cts +30 -0
- package/dist/ai/ai-sdk.d.ts +30 -0
- package/dist/ai/ai-sdk.js +83 -0
- package/dist/ai/ai-sdk.js.map +1 -0
- package/dist/ai/index.cjs +60 -0
- package/dist/ai/index.cjs.map +1 -0
- package/dist/ai/index.d.cts +155 -0
- package/dist/ai/index.d.ts +155 -0
- package/dist/ai/index.js +23 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/browser.cjs +16 -15
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +14 -13
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-ZO77FHBF.cjs → chunk-2JDVJRR3.cjs} +14 -6
- package/dist/chunk-2JDVJRR3.cjs.map +1 -0
- package/dist/{chunk-QR7VTCI4.cjs → chunk-3YZ6FPQW.cjs} +13 -7
- package/dist/chunk-3YZ6FPQW.cjs.map +1 -0
- package/dist/{chunk-GEPBET4L.js → chunk-45KP67RR.js} +14 -6
- package/dist/chunk-45KP67RR.js.map +1 -0
- package/dist/{chunk-LKOBOVNL.cjs → chunk-5AEN2PLB.cjs} +14 -6
- package/dist/chunk-5AEN2PLB.cjs.map +1 -0
- package/dist/{chunk-7IRT3LOY.cjs → chunk-A5D2IMOX.cjs} +16 -8
- package/dist/chunk-A5D2IMOX.cjs.map +1 -0
- package/dist/{chunk-XVCAOGFL.cjs → chunk-B37IKTI7.cjs} +221 -44
- package/dist/chunk-B37IKTI7.cjs.map +1 -0
- package/dist/{chunk-ISACNVFE.cjs → chunk-B6INLQBU.cjs} +15 -9
- package/dist/chunk-B6INLQBU.cjs.map +1 -0
- package/dist/{chunk-YXIIWLLB.cjs → chunk-COLTVQWR.cjs} +174 -6
- package/dist/chunk-COLTVQWR.cjs.map +1 -0
- package/dist/chunk-DNZFOCV7.js +796 -0
- package/dist/chunk-DNZFOCV7.js.map +1 -0
- package/dist/chunk-DPQYGWCT.cjs +1121 -0
- package/dist/chunk-DPQYGWCT.cjs.map +1 -0
- package/dist/{chunk-XHZ7GXP2.cjs → chunk-E65ITQXV.cjs} +178 -22
- package/dist/chunk-E65ITQXV.cjs.map +1 -0
- package/dist/{chunk-LCR3KOJV.js → chunk-FCGHV6ZK.js} +16 -8
- package/dist/chunk-FCGHV6ZK.js.map +1 -0
- package/dist/{chunk-X2BQKXMA.js → chunk-FE6GAUNW.js} +13 -7
- package/dist/chunk-FE6GAUNW.js.map +1 -0
- package/dist/{chunk-YN467EEQ.js → chunk-H2OEUBPO.js} +547 -101
- package/dist/chunk-H2OEUBPO.js.map +1 -0
- package/dist/{chunk-Z3WOHHG3.js → chunk-J2LVOWVY.js} +177 -24
- package/dist/chunk-J2LVOWVY.js.map +1 -0
- package/dist/{chunk-CJ2A3UEQ.js → chunk-LR4X4ZRG.js} +179 -23
- package/dist/chunk-LR4X4ZRG.js.map +1 -0
- package/dist/{chunk-LXNFVHDT.cjs → chunk-MCFQAUQV.cjs} +21 -13
- package/dist/chunk-MCFQAUQV.cjs.map +1 -0
- package/dist/{chunk-Z63XPA2V.cjs → chunk-MJGDP3CS.cjs} +546 -100
- package/dist/chunk-MJGDP3CS.cjs.map +1 -0
- package/dist/chunk-MR5HU5WU.js +1112 -0
- package/dist/chunk-MR5HU5WU.js.map +1 -0
- package/dist/{chunk-7HKXU7J2.cjs → chunk-MSYBSOU2.cjs} +65 -38
- package/dist/chunk-MSYBSOU2.cjs.map +1 -0
- package/dist/{chunk-4KYW63IK.js → chunk-OC22GGQN.js} +222 -45
- package/dist/chunk-OC22GGQN.js.map +1 -0
- package/dist/{chunk-5UV5VQ7J.js → chunk-RP5UATRA.js} +174 -6
- package/dist/chunk-RP5UATRA.js.map +1 -0
- package/dist/{chunk-ZNZIL244.js → chunk-U6L3FAML.js} +15 -9
- package/dist/chunk-U6L3FAML.js.map +1 -0
- package/dist/{chunk-CXHPP5BL.cjs → chunk-UAGSCTYI.cjs} +177 -24
- package/dist/chunk-UAGSCTYI.cjs.map +1 -0
- package/dist/{chunk-5SH5NUDW.js → chunk-UGCUNADI.js} +21 -13
- package/dist/chunk-UGCUNADI.js.map +1 -0
- package/dist/chunk-ULYRO2KY.cjs +800 -0
- package/dist/chunk-ULYRO2KY.cjs.map +1 -0
- package/dist/{chunk-UUPYTUGR.js → chunk-VPKCW4PB.js} +54 -27
- package/dist/chunk-VPKCW4PB.js.map +1 -0
- package/dist/{chunk-6YMQSTFF.js → chunk-ZNDIGQJD.js} +14 -6
- package/dist/chunk-ZNDIGQJD.js.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.cjs +7 -6
- package/dist/diagrams/ecomap/index.d.cts +2 -2
- package/dist/diagrams/ecomap/index.d.ts +2 -2
- package/dist/diagrams/ecomap/index.js +2 -1
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.cjs +7 -7
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +1 -1
- package/dist/diagrams/flowchart/index.cjs +7 -7
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +1 -1
- package/dist/diagrams/genogram/index.cjs +9 -8
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -1
- package/dist/diagrams/ladder/index.cjs +5 -5
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +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 +6 -6
- package/dist/diagrams/orgchart/index.d.cts +5 -2
- package/dist/diagrams/orgchart/index.d.ts +5 -2
- package/dist/diagrams/orgchart/index.js +1 -1
- package/dist/diagrams/pedigree/index.cjs +7 -6
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -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 +5 -5
- 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.cjs +6 -5
- package/dist/diagrams/sociogram/index.d.cts +2 -1
- package/dist/diagrams/sociogram/index.d.ts +2 -1
- package/dist/diagrams/sociogram/index.js +2 -1
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/{index-ga04CTBI.d.ts → index-BTZEka65.d.cts} +11 -2
- package/dist/{index-SSGpCggE.d.cts → index-DcU88F9i.d.ts} +11 -2
- package/dist/index.cjs +28 -27
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +13 -12
- package/dist/react.cjs +14 -13
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +13 -12
- package/dist/react.js.map +1 -1
- package/dist/{types-BcPhMdHd.d.ts → types-C4LnMEcB.d.cts} +58 -4
- package/dist/{types-BcPhMdHd.d.cts → types-C4LnMEcB.d.ts} +58 -4
- package/package.json +27 -5
- package/dist/chunk-4KYW63IK.js.map +0 -1
- package/dist/chunk-5SH5NUDW.js.map +0 -1
- package/dist/chunk-5UV5VQ7J.js.map +0 -1
- package/dist/chunk-6YMQSTFF.js.map +0 -1
- package/dist/chunk-7HKXU7J2.cjs.map +0 -1
- package/dist/chunk-7IRT3LOY.cjs.map +0 -1
- package/dist/chunk-CJ2A3UEQ.js.map +0 -1
- package/dist/chunk-CXHPP5BL.cjs.map +0 -1
- package/dist/chunk-GEPBET4L.js.map +0 -1
- package/dist/chunk-ISACNVFE.cjs.map +0 -1
- package/dist/chunk-LCR3KOJV.js.map +0 -1
- package/dist/chunk-LKOBOVNL.cjs.map +0 -1
- package/dist/chunk-LXNFVHDT.cjs.map +0 -1
- package/dist/chunk-QR7VTCI4.cjs.map +0 -1
- package/dist/chunk-UUPYTUGR.js.map +0 -1
- package/dist/chunk-X2BQKXMA.js.map +0 -1
- package/dist/chunk-XHZ7GXP2.cjs.map +0 -1
- package/dist/chunk-XVCAOGFL.cjs.map +0 -1
- package/dist/chunk-YN467EEQ.js.map +0 -1
- package/dist/chunk-YXIIWLLB.cjs.map +0 -1
- package/dist/chunk-Z3WOHHG3.js.map +0 -1
- package/dist/chunk-Z63XPA2V.cjs.map +0 -1
- package/dist/chunk-ZNZIL244.js.map +0 -1
- package/dist/chunk-ZO77FHBF.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/ladder/parser.ts","../src/diagrams/ladder/layout.ts","../src/diagrams/ladder/renderer.ts","../src/diagrams/ladder/index.ts"],"names":["text","title","el","w","h","slot","nx","ny","id","LINE_H","group","path","resolveIndustrialTheme","desc","svgRoot"],"mappings":"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","file":"chunk-ISACNVFE.cjs","sourcesContent":["import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n LadderContactType,\n LadderCoilType,\n LadderFBType,\n} from \"../../core/types\";\n\nexport class LadderParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LadderParseError\";\n }\n}\n\nconst CONTACT_TYPES = new Set<LadderContactType>([\"XIC\", \"XIO\", \"ONS\", \"OSF\"]);\nconst COIL_TYPES = new Set<LadderCoilType>([\"OTE\", \"OTL\", \"OTU\", \"OTN\"]);\nconst FB_TYPES = new Set<LadderFBType>([\n \"TON\", \"TOFF\", \"TP\",\n \"CTU\", \"CTD\", \"CTUD\",\n \"ADD\", \"SUB\", \"MUL\", \"DIV\",\n \"MOV\",\n \"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\",\n]);\n\n/** Split comma-separated args respecting quoted strings. */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n out.push(cur.trim());\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n/** Parse one element line, e.g. XIC(START), TON(T1, PT=5000), OTE(MOTOR). */\nfunction parseElement(line: string, lineNo: number): LadderElement {\n const m = line.match(/^([A-Z][A-Z0-9_]*)\\s*\\(\\s*([^)]*)\\s*\\)\\s*$/);\n if (!m) {\n throw new LadderParseError(`Line ${lineNo}: invalid element syntax: ${line}`);\n }\n const op = m[1] as string;\n const args = splitArgs(m[2]);\n if (args.length === 0 || !args[0]) {\n throw new LadderParseError(`Line ${lineNo}: element missing tag: ${line}`);\n }\n const tag = args[0];\n\n if (CONTACT_TYPES.has(op as LadderContactType)) {\n const contact: LadderContact = {\n elementType: \"contact\",\n contactType: op as LadderContactType,\n tag,\n };\n // optional address as second positional or address=...\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") contact.address = stripQuotes(kv[2]);\n else if (key === \"name\") contact.name = stripQuotes(kv[2]);\n } else {\n contact.address = stripQuotes(a);\n }\n }\n return contact;\n }\n\n if (COIL_TYPES.has(op as LadderCoilType)) {\n const coil: LadderCoil = {\n elementType: \"coil\",\n coilType: op as LadderCoilType,\n tag,\n };\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") coil.address = stripQuotes(kv[2]);\n else if (key === \"name\") coil.name = stripQuotes(kv[2]);\n } else {\n coil.address = stripQuotes(a);\n }\n }\n return coil;\n }\n\n if (FB_TYPES.has(op as LadderFBType)) {\n const params: Record<string, string | number> = {};\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const v = stripQuotes(kv[2]);\n const n = Number(v);\n params[kv[1]] = Number.isFinite(n) && v !== \"\" && /^-?\\d+(\\.\\d+)?$/.test(v) ? n : v;\n }\n }\n const fb: LadderFunctionBlock = {\n elementType: \"function_block\",\n fbType: op as LadderFBType,\n tag,\n params,\n };\n return fb;\n }\n\n throw new LadderParseError(`Line ${lineNo}: unknown element type \"${op}\"`);\n}\n\nexport function parseLadderDSL(text: string): LadderAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const rungs: LadderRung[] = [];\n\n let currentRung: LadderRung | null = null;\n let currentParallel: LadderBranch[] | null = null;\n let currentBranch: LadderBranch | null = null;\n let parallelIndent = -1;\n let branchIndent = -1;\n\n function finishParallel() {\n if (currentRung && currentParallel) {\n currentRung.elements.push({ parallel: currentParallel });\n }\n currentParallel = null;\n currentBranch = null;\n parallelIndent = -1;\n branchIndent = -1;\n }\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i];\n const lineNo = i + 1;\n const stripped = raw.replace(/#.*$/, \"\");\n if (!stripped.trim()) continue;\n\n // indentation = count of leading spaces/tabs (tab = 2)\n let indent = 0;\n for (const ch of stripped) {\n if (ch === \" \") indent++;\n else if (ch === \"\\t\") indent += 2;\n else break;\n }\n const line = stripped.trim();\n\n // Header: ladder \"title\"\n if (/^ladder\\b/i.test(line)) {\n const m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\n continue;\n }\n\n // Rung: rung N \"comment\":\n const rungMatch = line.match(/^rung\\s+(\\d+)(?:\\s+\"([^\"]*)\")?\\s*:\\s*$/i);\n if (rungMatch) {\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n currentRung = {\n number: Number(rungMatch[1]),\n comment: rungMatch[2],\n elements: [],\n };\n continue;\n }\n\n if (!currentRung) {\n throw new LadderParseError(`Line ${lineNo}: element outside of rung: ${line}`);\n }\n\n // parallel:\n if (/^parallel\\s*:\\s*$/i.test(line)) {\n finishParallel();\n currentParallel = [];\n parallelIndent = indent;\n continue;\n }\n\n // branch:\n if (/^branch\\s*:\\s*$/i.test(line)) {\n if (!currentParallel) {\n throw new LadderParseError(`Line ${lineNo}: branch: without parallel:`);\n }\n currentBranch = { elements: [] };\n currentParallel.push(currentBranch);\n branchIndent = indent;\n continue;\n }\n\n // If we're in a parallel block but indent fell back, close it.\n if (currentParallel && indent <= parallelIndent) {\n finishParallel();\n }\n\n const element = parseElement(line, lineNo);\n\n if (currentParallel && currentBranch && indent > branchIndent) {\n currentBranch.elements.push(element);\n } else {\n if (currentParallel) finishParallel();\n currentRung.elements.push(element);\n }\n }\n\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n\n if (rungs.length === 0) {\n throw new LadderParseError(\"Ladder diagram has no rungs\");\n }\n\n return { type: \"ladder\", title, rungs };\n}\n","import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n} from \"../../core/types\";\n\nexport const LEFT_RAIL_X = 60;\nexport const RIGHT_RAIL_MARGIN = 30;\nexport const BASE_RUNG_HEIGHT = 100;\nexport const ELEMENT_WIDTH = 32;\nexport const ELEMENT_HEIGHT = 24;\nexport const FB_WIDTH = 80;\nexport const FB_HEIGHT = 56;\nexport const CMP_WIDTH = 56;\nexport const CMP_HEIGHT = 34;\nexport const RUNG_Y_OFFSET = 70;\nexport const H_SPACING = 16;\nexport const PARALLEL_GAP = 14;\nexport const CANVAS_PADDING = 30;\n\n/** Rough chars → pixels for 9px font */\nconst CHAR_W = 6.1;\nconst LINE_H = 11;\n\nexport type LadderElementKind =\n | \"contact\"\n | \"coil\"\n | \"function_block\"\n | \"compare\";\n\nexport interface LadderLayoutNode {\n id: string;\n rungIndex: number;\n element: LadderElement;\n kind: LadderElementKind;\n /** x of the element body (left edge) */\n x: number;\n /** y of the element body (top edge) */\n y: number;\n width: number;\n height: number;\n /** rung centerline Y (where wires attach) */\n rungY: number;\n}\n\nexport interface LadderLayoutWire {\n path: string;\n}\n\nexport interface LadderLayoutRung {\n rung: LadderRung;\n index: number;\n y: number;\n /** Rightmost x reached by elements on this rung. */\n endX: number;\n /** Rung slot total height (used for spacing). */\n height: number;\n /** Total pixel height reserved above rungY for name/tag labels. */\n headerHeight: number;\n}\n\nexport interface LadderLayoutResult {\n width: number;\n height: number;\n leftRailX: number;\n rightRailX: number;\n rungs: LadderLayoutRung[];\n nodes: LadderLayoutNode[];\n wires: LadderLayoutWire[];\n}\n\nconst COMPARE_TYPES = new Set([\"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\"]);\n\nfunction bodyWidth(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_WIDTH;\n return FB_WIDTH;\n }\n return ELEMENT_WIDTH;\n}\n\nfunction bodyHeight(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_HEIGHT;\n return FB_HEIGHT;\n }\n return ELEMENT_HEIGHT;\n}\n\nfunction elementKind(el: LadderElement): LadderElementKind {\n if (el.elementType === \"contact\") return \"contact\";\n if (el.elementType === \"coil\") return \"coil\";\n if (COMPARE_TYPES.has(el.fbType)) return \"compare\";\n return \"function_block\";\n}\n\n/** Wrap a long description into lines of ~13 chars without splitting words. */\nexport function wrapName(name: string, maxChars = 14): string[] {\n const words = name.split(/\\s+/);\n const lines: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (trial.length > maxChars && cur) {\n lines.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n if (cur) lines.push(cur);\n return lines.slice(0, 3);\n}\n\nfunction labelLinesForContactOrCoil(el: LadderElement): string[] {\n if (el.elementType === \"function_block\") return [el.tag];\n const lines: string[] = [];\n if (el.name) lines.push(...wrapName(el.name));\n lines.push(el.tag);\n if (el.address) lines.push(el.address);\n return lines;\n}\n\n/** Max label width in px across all label lines of the element. */\nfunction labelWidth(el: LadderElement): number {\n const lines = labelLinesForContactOrCoil(el);\n let maxChars = 0;\n for (const l of lines) if (l.length > maxChars) maxChars = l.length;\n return maxChars * CHAR_W;\n}\n\n/** Slot width = max(bodyWidth, labelWidth) + padding on both sides. */\nfunction slotWidth(el: LadderElement): number {\n return Math.max(bodyWidth(el), labelWidth(el)) + 6;\n}\n\n/** Total label rows above the element body (name lines + tag). */\nfunction labelRowsAbove(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 1;\n const name = el.name ? wrapName(el.name).length : 0;\n return name + 1; // + tag line\n}\n\nfunction labelRowsBelow(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 0;\n if ((el as { address?: string }).address) return 1;\n return 0;\n}\n\n/** Required vertical pixels above rung centerline for tallest element label stack. */\nfunction rungLabelHeaderHeight(rung: LadderRung): number {\n let maxAbovePx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n // Only the top-branch elements extend above the centerline.\n const topBranch = item.parallel[0];\n if (!topBranch) continue;\n const aboveRows = Math.max(\n 1,\n ...topBranch.elements.map((e) => labelRowsAbove(e))\n );\n const px = ph / 2 + aboveRows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n } else {\n const rows = labelRowsAbove(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n }\n }\n return maxAbovePx;\n}\n\nfunction rungLabelFooterHeight(rung: LadderRung): number {\n let maxBelowPx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n const bottomBranch = item.parallel[item.parallel.length - 1];\n if (!bottomBranch) continue;\n const belowRows = Math.max(\n 0,\n ...bottomBranch.elements.map((e) => labelRowsBelow(e))\n );\n const px = ph / 2 + belowRows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n } else {\n const rows = labelRowsBelow(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n }\n }\n return maxBelowPx;\n}\n\nfunction branchInlineWidth(branch: LadderBranch): number {\n if (branch.elements.length === 0) return ELEMENT_WIDTH;\n let w = 0;\n branch.elements.forEach((el, i) => {\n w += slotWidth(el);\n if (i < branch.elements.length - 1) w += H_SPACING;\n });\n return w;\n}\n\nfunction parallelWidth(branches: LadderBranch[]): number {\n const maxBranch = Math.max(\n ELEMENT_WIDTH,\n ...branches.map(branchInlineWidth)\n );\n return maxBranch + 2 * H_SPACING;\n}\n\n/** Per-branch row height including label stack above + below. */\nfunction branchRowHeight(branch: LadderBranch): number {\n const bodyH = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(1, ...branch.elements.map((e) => labelRowsAbove(e)));\n const below = Math.max(0, ...branch.elements.map((e) => labelRowsBelow(e)));\n return bodyH + above * LINE_H + below * LINE_H + 6;\n}\n\nfunction parallelHeight(branches: LadderBranch[]): number {\n // Account for label space between branches so name/address rows don't collide.\n let total = 0;\n branches.forEach((br, i) => {\n total += branchRowHeight(br);\n if (i < branches.length - 1) total += PARALLEL_GAP;\n });\n return Math.max(total, ELEMENT_HEIGHT);\n}\n\nexport function layoutLadder(ast: LadderAST): LadderLayoutResult {\n const nodes: LadderLayoutNode[] = [];\n const wires: LadderLayoutWire[] = [];\n const rungs: LadderLayoutRung[] = [];\n\n let maxEndX = LEFT_RAIL_X + 200;\n let cursorY = RUNG_Y_OFFSET;\n\n ast.rungs.forEach((rung, rungIndex) => {\n const headerH = rungLabelHeaderHeight(rung);\n const footerH = rungLabelFooterHeight(rung);\n // Per-rung height is comment (16) + header + footer + a little breathing room.\n const rungHeight = Math.max(BASE_RUNG_HEIGHT, 16 + headerH + footerH + 16);\n const rungY = cursorY + 16 + headerH;\n\n let x = LEFT_RAIL_X + H_SPACING;\n let prevRightX = LEFT_RAIL_X;\n let prevRightY = rungY;\n\n const addWire = (x1: number, y1: number, x2: number, y2: number) => {\n wires.push({ path: `M ${x1} ${y1} L ${x2} ${y2}` });\n };\n\n rung.elements.forEach((item, elIdx) => {\n if (\"parallel\" in item) {\n const branches = item.parallel;\n const pw = parallelWidth(branches);\n const ph = parallelHeight(branches);\n const bx = x;\n const ex = x + pw;\n\n addWire(prevRightX, prevRightY, bx, rungY);\n\n const busTop = rungY - ph / 2;\n const busBot = rungY + ph / 2;\n wires.push({ path: `M ${bx} ${busTop} L ${bx} ${busBot}` });\n wires.push({ path: `M ${ex} ${busTop} L ${ex} ${busBot}` });\n\n // Pre-compute row Y for each branch using actual row heights.\n let rowY = busTop;\n branches.forEach((branch, bIdx) => {\n const rowH = branchRowHeight(branch);\n const bodyMax = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(\n 1,\n ...branch.elements.map((e) => labelRowsAbove(e))\n );\n // Position centerline so labels above fit within rowH.\n const branchY = rowY + above * LINE_H + bodyMax / 2;\n const bInline = branchInlineWidth(branch);\n const startX = bx + H_SPACING + ((ex - bx - 2 * H_SPACING) - bInline) / 2;\n let bx0 = startX;\n let prevBX = bx;\n branch.elements.forEach((bel, beIdx) => {\n const w = bodyWidth(bel);\n const h = bodyHeight(bel);\n const slot = slotWidth(bel);\n const nx = bx0 + (slot - w) / 2;\n const ny = branchY - h / 2;\n const id = `R${rung.number}_P${elIdx}_B${bIdx}_E${beIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: bel,\n kind: elementKind(bel),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY: branchY,\n });\n addWire(prevBX, branchY, nx, branchY);\n prevBX = nx + w;\n bx0 += slot + H_SPACING;\n });\n addWire(prevBX, branchY, ex, branchY);\n rowY += rowH + PARALLEL_GAP;\n });\n\n prevRightX = ex;\n prevRightY = rungY;\n x = ex + H_SPACING;\n return;\n }\n\n const el = item;\n const w = bodyWidth(el);\n const h = bodyHeight(el);\n const slot = slotWidth(el);\n const nx = x + (slot - w) / 2;\n const ny = rungY - h / 2;\n const id = `R${rung.number}_E${elIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: el,\n kind: elementKind(el),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY,\n });\n addWire(prevRightX, prevRightY, nx, rungY);\n prevRightX = nx + w;\n prevRightY = rungY;\n x += slot + H_SPACING;\n });\n\n rungs.push({\n rung,\n index: rungIndex,\n y: rungY,\n endX: prevRightX,\n height: rungHeight,\n headerHeight: headerH,\n });\n if (prevRightX > maxEndX) maxEndX = prevRightX;\n cursorY += rungHeight;\n });\n\n const rightRailX = maxEndX + H_SPACING * 2;\n const width = rightRailX + RIGHT_RAIL_MARGIN;\n const height = cursorY + CANVAS_PADDING;\n\n for (const r of rungs) {\n wires.push({ path: `M ${r.endX} ${r.y} L ${rightRailX} ${r.y}` });\n }\n\n return {\n width,\n height,\n leftRailX: LEFT_RAIL_X,\n rightRailX,\n rungs,\n nodes,\n wires,\n };\n}\n\nexport { labelRowsAbove, labelRowsBelow };\n","import type {\n LadderAST,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n RenderConfig,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme, type IndustrialTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { layoutLadder, type LadderLayoutNode, wrapName } from \"./layout\";\n\ntype IT = ResolvedTheme<IndustrialTokens>;\n\nfunction buildCss(t: IT): string {\n return `\n.lt-ladder { background: ${t.bg}; font-family: system-ui, -apple-system, sans-serif; }\n.lt-ladder-rail { stroke: ${t.strokeHeavy}; stroke-width: 4; stroke-linecap: square; }\n.lt-ladder-wire { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-ladder-element { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-coil { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-fb { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }\n.lt-ladder-fb-name { font: bold 11px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-pin { font: 8px sans-serif; fill: ${t.stroke}; }\n.lt-ladder-name { font: 9px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-tag { font: 600 9px ui-monospace, SFMono-Regular, Menlo, monospace; fill: ${t.accent}; text-anchor: middle; }\n.lt-ladder-addr { font: 600 8.5px ui-monospace, monospace; fill: ${t.error}; text-anchor: middle; }\n.lt-ladder-rung-num { font: 10px sans-serif; fill: ${t.textMuted}; text-anchor: end; }\n.lt-ladder-comment { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.lt-ladder-title { font: bold 15px sans-serif; fill: ${t.text}; }\n.lt-ladder-symbol-label { font: bold 10px sans-serif; fill: ${t.stroke}; text-anchor: middle; }\n`.trim();\n}\n\nconst LINE_H = 11;\n\nfunction labelsAbove(\n name: string | undefined,\n tag: string,\n cx: number,\n bodyTopY: number\n): string[] {\n const pieces: string[] = [];\n const nameLines = name ? wrapName(name) : [];\n const totalLines = nameLines.length + 1; // +1 for tag\n const firstY = bodyTopY - 4 - (totalLines - 1) * LINE_H;\n nameLines.forEach((line, i) => {\n pieces.push(\n text({ x: cx, y: firstY + i * LINE_H, class: \"lt-ladder-name\" }, line)\n );\n });\n pieces.push(\n text(\n { x: cx, y: firstY + nameLines.length * LINE_H, class: \"lt-ladder-tag\" },\n tag\n )\n );\n return pieces;\n}\n\nfunction renderContact(node: LadderLayoutNode): string {\n const c = node.element as LadderContact;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const leftBarX = x + 4;\n const rightBarX = x + w - 4;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: leftBarX, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: leftBarX, y1: y, x2: leftBarX, y2: y + h, class: \"lt-ladder-element\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: y, x2: rightBarX, y2: y + h, class: \"lt-ladder-element\" }));\n\n if (c.contactType === \"XIO\") {\n pieces.push(\n el(\"line\", {\n x1: leftBarX + 2,\n y1: y + h - 2,\n x2: rightBarX - 2,\n y2: y + 2,\n class: \"lt-ladder-element\",\n })\n );\n } else if (c.contactType === \"ONS\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↑\"));\n } else if (c.contactType === \"OSF\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↓\"));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"contact\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCoil(node: LadderLayoutNode): string {\n const c = node.element as LadderCoil;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n const leftArc = `M ${x + 6} ${y} A 10 ${h / 2} 0 0 0 ${x + 6} ${y + h}`;\n const rightArc = `M ${x + w - 6} ${y} A 10 ${h / 2} 0 0 1 ${x + w - 6} ${y + h}`;\n pieces.push(pathEl({ d: leftArc, class: \"lt-ladder-coil\" }));\n pieces.push(pathEl({ d: rightArc, class: \"lt-ladder-coil\" }));\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: x + 6, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w - 6, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n\n let inner = \"\";\n if (c.coilType === \"OTL\") inner = \"S\";\n else if (c.coilType === \"OTU\") inner = \"R\";\n else if (c.coilType === \"OTN\") inner = \"/\";\n if (inner) {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, inner));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"coil\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCompare(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 12, class: \"lt-ladder-fb-name\" }, fb.fbType));\n const entries = Object.entries(fb.params);\n entries.slice(0, 2).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 22 + i * 9, class: \"lt-ladder-pin\" }, `${k}:${v}`)\n );\n });\n pieces.push(el(\"line\", { x1: x - 2, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w, y1: cy, x2: x + w + 2, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"compare\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderFunctionBlock(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 14, class: \"lt-ladder-fb-name\" }, fb.fbType));\n\n pieces.push(\n el(\"line\", { x1: x - 6, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" })\n );\n pieces.push(\n el(\"line\", { x1: x + w, y1: cy, x2: x + w + 6, y2: cy, class: \"lt-ladder-wire\" })\n );\n\n const entries = Object.entries(fb.params);\n entries.slice(0, 3).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 28 + i * 9, class: \"lt-ladder-pin\" }, `${k}=${v}`)\n );\n });\n\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"function_block\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderNode(node: LadderLayoutNode): string {\n switch (node.kind) {\n case \"contact\":\n return renderContact(node);\n case \"coil\":\n return renderCoil(node);\n case \"compare\":\n return renderCompare(node);\n case \"function_block\":\n return renderFunctionBlock(node);\n }\n}\n\nexport function renderLadder(ast: LadderAST, config?: RenderConfig): string {\n const layout = layoutLadder(ast);\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 30 : 0;\n const width = layout.width;\n const height = layout.height + titleOffset;\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Ladder Logic\"));\n children.push(\n desc(`PLC ladder logic diagram with ${ast.rungs.length} rung${ast.rungs.length === 1 ? \"\" : \"s\"}`)\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(\n text({ x: layout.leftRailX, y: 20, class: \"lt-ladder-title\" }, ast.title)\n );\n }\n\n const inner: string[] = [];\n\n inner.push(\n el(\"line\", {\n x1: layout.leftRailX,\n y1: 0,\n x2: layout.leftRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n inner.push(\n el(\"line\", {\n x1: layout.rightRailX,\n y1: 0,\n x2: layout.rightRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n\n for (const r of layout.rungs) {\n inner.push(\n text(\n { x: layout.leftRailX - 6, y: r.y + 3, class: \"lt-ladder-rung-num\" },\n `Rung ${String(r.rung.number).padStart(3, \"0\")}`\n )\n );\n if (r.rung.comment) {\n // Place comment above the tallest element label on this rung (and above the parallel bus if any).\n const commentY = Math.max(14, r.y - (r.headerHeight + 6));\n inner.push(\n text(\n {\n x: layout.leftRailX + 10,\n y: commentY,\n class: \"lt-ladder-comment\",\n },\n `— ${r.rung.comment} —`\n )\n );\n }\n }\n\n for (const w of layout.wires) {\n inner.push(pathEl({ d: w.path, class: \"lt-ladder-wire\" }));\n }\n\n for (const n of layout.nodes) {\n inner.push(renderNode(n));\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-ladder\",\n role: \"img\",\n \"aria-labelledby\": \"lt-ladder-title lt-ladder-desc\",\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseLadderDSL } from \"./parser\";\nimport { renderLadder } from \"./renderer\";\n\nexport const ladder: DiagramPlugin = {\n type: \"ladder\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"ladder\");\n },\n parse: parseLadderDSL,\n\n render(text: string, config): string {\n const ast = parseLadderDSL(text);\n return renderLadder(ast, config);\n },\n};\n\nexport { parseLadderDSL } from \"./parser\";\nexport { renderLadder } from \"./renderer\";\nexport { layoutLadder } from \"./layout\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/orgchart/parser.ts","../src/diagrams/orgchart/layout.ts","../src/diagrams/orgchart/renderer.ts","../src/diagrams/orgchart/index.ts"],"names":["text","title","sx","sy","ex","ey","path"],"mappings":"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","file":"chunk-LCR3KOJV.js","sourcesContent":["import type {\n OrgchartAST,\n OrgchartDirection,\n OrgchartEdge,\n OrgchartLayoutMode,\n OrgchartNode,\n OrgchartNodeKind,\n OrgchartRoleIcon,\n} from \"./types\";\n\nexport class OrgchartParseError extends Error {\n constructor(message: string) {\n super(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}\n\nfunction tokenizeLines(text: string): RawLine[] {\n const result: RawLine[] = [];\n for (const raw of text.split(\"\\n\")) {\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() });\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 for (const rl of rawLines) {\n const line = rl.text;\n\n // Header\n if (/^orgchart\\b/i.test(line)) {\n const m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\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 throw new OrgchartParseError(`Cannot parse line: ${line}`);\n }\n if (nodeMap.has(parsed.id)) {\n throw new OrgchartParseError(`Duplicate node id \"${parsed.id}\"`);\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 // Validate edges reference known nodes\n for (const e of edges) {\n if (!nodeMap.has(e.from)) {\n throw new OrgchartParseError(`Edge references unknown node \"${e.from}\"`);\n }\n if (!nodeMap.has(e.to)) {\n throw new OrgchartParseError(`Edge references unknown node \"${e.to}\"`);\n }\n }\n\n if (nodes.length === 0) {\n throw new OrgchartParseError(\"Orgchart has no nodes\");\n }\n\n return {\n type: \"orgchart\",\n title,\n direction,\n layout,\n nodes,\n edges,\n };\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 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 { background: ${t.bg}; 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 let 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 { 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\n render(text, config) {\n const ast = parseOrgchart(text);\n return renderOrgchart(ast, config);\n },\n};\n\nexport { parseOrgchart, OrgchartParseError } from \"./parser\";\nexport { renderOrgchart } from \"./renderer\";\nexport { layoutOrgchart } from \"./layout\";\nexport type * from \"./types\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/fishbone/parser.ts","../src/diagrams/fishbone/layout.ts","../src/diagrams/fishbone/renderer.ts","../src/diagrams/fishbone/index.ts"],"names":["text","title","line","resolveFishboneTheme","rect","el","group","polygon","desc","defs","svgRoot"],"mappings":"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","file":"chunk-LKOBOVNL.cjs","sourcesContent":["import type {\n FishboneAST,\n FishboneCauseSide,\n FishboneDensity,\n FishboneNode,\n FishboneOrientation,\n FishboneSides,\n} from \"../../core/types\";\n\nexport class FishboneParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FishboneParseError\";\n }\n}\n\ninterface CategoryDef {\n id: string;\n label: string;\n color?: string;\n side?: \"top\" | \"bottom\";\n order?: number;\n}\n\nconst SLOPE_PRESETS: Record<string, number> = {\n gentle: 0.45,\n normal: 0.6,\n steep: 0.75,\n};\n\n/**\n * Fishbone DSL parser.\n *\n * Supports two syntactic styles, mixable in one document:\n *\n * Style A — structured (per 13-FISHBONE-STANDARD §11)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category content \"Content\"\n * category tech \"Technical\"\n * content : \"Publishing frequency down\"\n * content : \"Keyword gaps\"\n * - \"No long-tail coverage\"\n * - \"Competitor dominates H1\"\n *\n * Style B — compact shorthand (convenient for quick authoring, AI output)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category Content: Publishing frequency down; Content too generic; Keyword gaps\n * category Technical: Core Web Vitals failing; Crawl coverage drop\n *\n * Config directives:\n *\n * config direction = left|right # head orientation (default right)\n * config width = 900\n * config height = 620\n *\n * Lines starting with `#` are comments. Leading whitespace is indentation; a\n * line that begins with `-` (after ≥2 spaces of indent) is a Level-2 sub-cause\n * for the most-recent Level-1 cause.\n */\nexport function parseFishboneDSL(text: string): FishboneAST {\n const rawLines = text.split(/\\r?\\n/);\n\n let title: string | undefined;\n let effect = \"\";\n let orientation: FishboneOrientation = \"ltr\";\n let width: number | undefined;\n let height: number | undefined;\n let sides: FishboneSides | undefined;\n let ribSlope: number | undefined;\n let density: FishboneDensity | undefined;\n let causeSide: FishboneCauseSide | undefined;\n\n const categories: CategoryDef[] = [];\n const causesByCategory = new Map<string, FishboneNode[]>();\n let lastLevel1: FishboneNode | null = null;\n\n let headerSeen = false;\n\n const getCat = (id: string): CategoryDef | undefined =>\n categories.find((c) => c.id === id || c.label === id);\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i] ?? \"\";\n const line = stripComment(raw).trimEnd();\n if (!line.trim()) continue;\n\n const indent = countIndent(raw);\n const trimmed = line.trim();\n\n // Header: fishbone \"Title\" OR fishbone: \"Title\"\n if (!headerSeen && /^fishbone\\b/i.test(trimmed)) {\n const m = trimmed.match(/^fishbone\\s*:?\\s*(.*)$/i);\n if (m && m[1]) title = stripQuotes(m[1]);\n headerSeen = true;\n continue;\n }\n\n // Sub-cause (Level 2+): starts with \"-\" after indent\n if (indent >= 2 && trimmed.startsWith(\"-\")) {\n if (!lastLevel1) {\n throw new FishboneParseError(\n `Sub-cause at line ${i + 1} has no preceding Level-1 cause: \"${trimmed}\"`\n );\n }\n const subText = stripQuotes(trimmed.slice(1).trim());\n if (!subText) continue;\n lastLevel1.children.push({ label: subText, children: [] });\n continue;\n }\n\n // effect \"...\"\n if (/^effect\\b/i.test(trimmed)) {\n const m = trimmed.match(/^effect\\s*:?\\s*(.*)$/i);\n if (m) effect = stripQuotes(m[1] ?? \"\");\n continue;\n }\n\n // config key = value\n if (/^config\\b/i.test(trimmed)) {\n const m = trimmed.match(/^config\\s+([a-zA-Z]+)\\s*=\\s*(.+)$/i);\n if (m) {\n const key = m[1]!.toLowerCase();\n const val = stripQuotes(m[2]!.trim());\n if (key === \"direction\") {\n orientation = val === \"left\" || val === \"rtl\" ? \"rtl\" : \"ltr\";\n } else if (key === \"width\") {\n const n = Number(val);\n if (Number.isFinite(n)) width = n;\n } else if (key === \"height\") {\n const n = Number(val);\n if (Number.isFinite(n)) height = n;\n } else if (key === \"sides\") {\n const v = val.toLowerCase();\n if (v === \"both\" || v === \"top\" || v === \"bottom\") sides = v;\n } else if (key === \"slope\" || key === \"ribslope\") {\n const preset = SLOPE_PRESETS[val.toLowerCase()];\n if (preset !== undefined) ribSlope = preset;\n else {\n const n = Number(val);\n if (Number.isFinite(n) && n > 0 && n < 3) ribSlope = n;\n }\n } else if (key === \"density\") {\n const v = val.toLowerCase();\n if (v === \"compact\" || v === \"normal\" || v === \"spacious\") density = v;\n } else if (key === \"causeside\" || key === \"cause-side\") {\n const v = val.toLowerCase();\n if (v === \"head\" || v === \"tail\" || v === \"both\") causeSide = v;\n }\n }\n continue;\n }\n\n // category <id> \"<display>\" [color: <hex>]\n if (/^category\\b/i.test(trimmed)) {\n const compact = trimmed.match(/^category\\s+([^:]+?)\\s*:\\s*(.+)$/i);\n const structured = trimmed.match(\n /^category\\s+([a-zA-Z][\\w-]*)\\s+(\"[^\"]*\"|[^\\s[]+)(?:\\s*(\\[.*\\]))?\\s*$/i\n );\n\n if (structured) {\n const id = structured[1]!;\n const label = stripQuotes(structured[2]!);\n const props = parseProps(structured[3] ?? \"\");\n if (!getCat(id)) {\n const sideProp = props[\"side\"]?.toLowerCase();\n const side =\n sideProp === \"top\" || sideProp === \"bottom\" ? sideProp : undefined;\n const orderProp = props[\"order\"];\n const orderNum = orderProp !== undefined ? Number(orderProp) : NaN;\n const order = Number.isFinite(orderNum) ? orderNum : undefined;\n categories.push({ id, label, color: props[\"color\"], side, order });\n causesByCategory.set(id, []);\n }\n lastLevel1 = null;\n continue;\n }\n\n if (compact) {\n const label = stripQuotes(compact[1]!.trim());\n const id = slugify(label);\n const rest = compact[2]!.trim();\n if (!getCat(id)) {\n categories.push({ id, label });\n causesByCategory.set(id, []);\n }\n // split by `;` for compact style causes\n const bucket = causesByCategory.get(id)!;\n for (const part of rest.split(/[;,]/)) {\n const txt = stripQuotes(part.trim());\n if (txt) {\n const node: FishboneNode = { label: txt, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n }\n }\n continue;\n }\n }\n\n // <categoryId> : \"cause\"\n const causeMatch = trimmed.match(/^([a-zA-Z][\\w-]*)\\s*:\\s*(.+)$/);\n if (causeMatch) {\n const catId = causeMatch[1]!;\n const cat = getCat(catId);\n if (!cat) {\n throw new FishboneParseError(\n `Unknown category \"${catId}\" at line ${i + 1}. Declare with \\`category ${catId} \"...\"\\` first.`\n );\n }\n const bucket = causesByCategory.get(cat.id)!;\n const rest = causeMatch[2]!.trim();\n // `cause_text [prop: value]`\n const { text: causeText } = splitTrailingProps(rest);\n const label = stripQuotes(causeText);\n if (!label) continue;\n const node: FishboneNode = { label, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n continue;\n }\n\n // Unknown line — ignore silently to tolerate alien syntax blends\n }\n\n if (!effect) {\n // Fallback: use title as effect\n effect = title ?? \"\";\n }\n\n if (categories.length === 0) {\n throw new FishboneParseError(\n \"Fishbone requires at least one `category`. See docs/reference/13-FISHBONE-STANDARD.md.\"\n );\n }\n\n const majors: FishboneNode[] = categories.map((c) => ({\n label: c.label,\n color: c.color,\n children: causesByCategory.get(c.id) ?? [],\n side: c.side,\n order: c.order,\n }));\n\n return {\n type: \"fishbone\",\n title,\n effect,\n majors,\n orientation,\n width,\n height,\n sides,\n ribSlope,\n density,\n causeSide,\n };\n}\n\n// ─── helpers ─────────────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction countIndent(raw: string): number {\n let n = 0;\n for (const ch of raw) {\n if (ch === \" \") n += 1;\n else if (ch === \"\\t\") n += 2;\n else break;\n }\n return n;\n}\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^\\w\\u4e00-\\u9fff]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"cat\"\n );\n}\n\nfunction splitTrailingProps(s: string): { text: string; props: Record<string, string> } {\n const idx = s.lastIndexOf(\"[\");\n if (idx < 0 || !s.trimEnd().endsWith(\"]\")) return { text: s, props: {} };\n const text = s.slice(0, idx).trim();\n const props = parseProps(s.slice(idx));\n return { text, props };\n}\n\nfunction parseProps(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n const m = raw.match(/^\\[(.*)\\]$/s);\n if (!m) return out;\n const inside = m[1]!;\n for (const part of splitTopLevelCommas(inside)) {\n const [k, ...rest] = part.split(\":\");\n if (!k || rest.length === 0) continue;\n out[k.trim()] = stripQuotes(rest.join(\":\").trim());\n }\n return out;\n}\n\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let buf = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth += 1;\n else if (ch === \"]\") depth -= 1;\n else if (ch === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n }\n buf += ch;\n }\n if (buf.trim()) parts.push(buf);\n return parts;\n}\n","import type { FishboneAST, FishboneCauseSide, FishboneNode } from \"../../core/types\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\n/**\n * Fishbone layout engine.\n *\n * Geometric contract (see 13-FISHBONE-STANDARD §5, §9):\n * - Horizontal spine at `spineY`\n * - Effect polygon at right (ltr) or left (rtl) end\n * - Category ribs slant AWAY from the fish head (signature of Ishikawa form)\n * - Ribs are paired top/bottom on the same X column for visual rhythm\n * - Each rib hosts Level-1 causes as short horizontal branches toward the head\n * - Rib length adapts to (max) cause count in its half so headers align\n *\n * This is an optimized v2 layout that improves on the naive fixed-slope design:\n * 1. Dynamic row heights — a Level-1 cause with N sub-causes reserves\n * (baseRow + N·subRow) of vertical space so nothing overlaps.\n * 2. Per-half aligned headers — ribs in the same half share the same outer Y\n * so category pills form a clean visual row.\n * 3. Column-pairing — top and bottom ribs share the same spine X.\n * 4. Smart canvas sizing — derives width/height from content, respecting\n * optional user overrides from `config width = …` / `config height = …`.\n * 5. Label-aware extents — long cause labels extend the canvas rather than\n * clipping, so multi-lingual / verbose content is first-class.\n * 6. Label bboxes exposed for the renderer to build a text-gap mask.\n */\n\n// ─── Public Types ─────────────────────────────────────────────\n\nexport interface FishboneLayoutCause {\n label: string;\n /** Rib index (0 = first category) */\n ribIndex: number;\n /** Slot index on the rib (0 = closest to spine) */\n slotIndex: number;\n /** Cause start point on the rib */\n ribX: number;\n ribY: number;\n /** Horizontal branch end point (label starts just beyond) */\n branchX: number;\n branchY: number;\n /** Label anchor (x where text starts, y baseline) */\n labelX: number;\n labelY: number;\n labelAnchor: \"start\" | \"end\";\n /** Direction this cause branch sticks out: \"head\" = toward head, \"tail\" = toward tail. */\n causeSide: \"head\" | \"tail\";\n /** Sub-causes (Level 2) stacked below the main label */\n subCauses: FishboneLayoutSubCause[];\n}\n\nexport interface FishboneLayoutSubCause {\n label: string;\n x: number;\n y: number;\n tickX1: number;\n tickX2: number;\n tickY: number;\n anchor: \"start\" | \"end\";\n}\n\nexport interface FishboneLayoutRib {\n index: number;\n half: \"top\" | \"bottom\";\n label: string;\n color: string;\n /** Where rib meets spine */\n spineX: number;\n spineY: number;\n /** Far end of rib (where header pill sits) */\n endX: number;\n endY: number;\n /** Header pill geometry */\n headerX: number;\n headerY: number;\n headerW: number;\n headerH: number;\n causes: FishboneLayoutCause[];\n}\n\nexport interface FishboneBBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FishboneLayoutResult {\n width: number;\n height: number;\n orientation: \"ltr\" | \"rtl\";\n spineY: number;\n spineStartX: number;\n spineEndX: number;\n tailForkTipTop: { x: number; y: number };\n tailForkTipBot: { x: number; y: number };\n head: {\n x: number; // spine-attached x\n y: number; // spine-attached y (= spineY)\n tipX: number; // pointy tip\n tipY: number;\n w: number;\n h: number;\n label: string;\n };\n ribs: FishboneLayoutRib[];\n /** Label bounding boxes (for text-gap mask) */\n textBBoxes: FishboneBBox[];\n title?: string;\n}\n\n// ─── Geometry constants (tunable, exported for renderer parity) ──\n\nexport const FB_CONST = {\n PADDING: 40,\n HEAD_W: 90,\n HEAD_H: 80,\n TAIL_LEN: 40,\n SPINE_OFFSET_FROM_TAIL: 40, // distance from canvas left to spine start\n RIB_SLOPE: 0.6, // dx/dy — consistent across all ribs\n RIB_BASE_EXTENT_Y: 30, // vertical distance of first slot from spine\n ROW_HEIGHT: 30, // vertical gap between Level-1 slots\n SUB_ROW_HEIGHT: 17,\n BRANCH_LEN: 30, // horizontal Level-1 branch length\n SUB_TICK_LEN: 10,\n HEADER_W: 132,\n HEADER_H: 34,\n HEADER_GAP: 12, // gap between rib endpoint and header pill\n COL_STEP: 130, // spine x gap between adjacent ribs\n COL_FIRST_OFFSET: 170, // first rib's distance from spine start\n LABEL_FONT: 12,\n HEADER_FONT: 14,\n SUB_FONT: 11,\n EFFECT_FONT: 14,\n LABEL_GAP: 6, // gap from branch end to label\n MIN_ROWS_PER_HALF: 4, // aesthetic minimum rib length\n COL_GAP_BETWEEN_LABELS: 18, // min horizontal breathing between adjacent ribs' label columns\n HEAD_PAD_X: 44, // total horizontal padding around effect text inside head\n HEAD_PAD_Y: 20, // min vertical padding around effect text inside head\n TITLE_CLEARANCE: 24, // extra gap between title baseline and top header pill\n} as const;\n\n// ─── Default palette (13-FISHBONE-STANDARD §5.4) ─────────────\n\n\n// ─── Text measurement (CJK-aware approximation) ───────────────\n\nexport function estimateTextWidth(s: string, fontSize: number): number {\n let w = 0;\n for (const ch of s) {\n const cp = ch.codePointAt(0) ?? 0;\n // CJK unified ideographs + kana + Hangul + fullwidth\n const isWide =\n (cp >= 0x3000 && cp <= 0x30ff) ||\n (cp >= 0x3400 && cp <= 0x9fff) ||\n (cp >= 0xac00 && cp <= 0xd7af) ||\n (cp >= 0xff00 && cp <= 0xffef);\n w += fontSize * (isWide ? 1.0 : 0.56);\n }\n return w;\n}\n\n// ─── Density presets ──────────────────────────────────────────\n\ninterface DensityTunables {\n rowHeight: number;\n subRowHeight: number;\n colStep: number;\n headerW: number;\n headerH: number;\n headerGap: number;\n minRowsPerHalf: number;\n colFirstOffset: number;\n}\n\nconst DENSITY: Record<\"compact\" | \"normal\" | \"spacious\", DensityTunables> = {\n compact: {\n rowHeight: 24,\n subRowHeight: 15,\n colStep: 110,\n headerW: 118,\n headerH: 30,\n headerGap: 8,\n minRowsPerHalf: 3,\n colFirstOffset: 140,\n },\n normal: {\n rowHeight: 30,\n subRowHeight: 17,\n colStep: 130,\n headerW: 132,\n headerH: 34,\n headerGap: 12,\n minRowsPerHalf: 4,\n colFirstOffset: 170,\n },\n spacious: {\n rowHeight: 36,\n subRowHeight: 19,\n colStep: 150,\n headerW: 148,\n headerH: 38,\n headerGap: 16,\n minRowsPerHalf: 5,\n colFirstOffset: 200,\n },\n};\n\n// ─── Public API ───────────────────────────────────────────────\n\nexport function layoutFishbone(ast: FishboneAST, opts?: { palette?: readonly string[] }): FishboneLayoutResult {\n const majors = ast.majors.length > 0 ? ast.majors : [];\n const nRibs = majors.length;\n\n const density = ast.density ?? \"normal\";\n const D = DENSITY[density];\n const ribSlope = ast.ribSlope ?? FB_CONST.RIB_SLOPE;\n const causeSideSetting: FishboneCauseSide = ast.causeSide ?? \"head\";\n const sides = ast.sides ?? \"both\";\n\n // Partition ribs into top/bottom halves honoring per-category `side` overrides\n // and the `sides` setting. If a category has an explicit side, use it;\n // otherwise fall back to the global `sides` default (single-sided layouts\n // pin everything to that half; \"both\" alternates declaration order across\n // the two halves as before).\n const topMajors: FishboneNode[] = [];\n const botMajors: FishboneNode[] = [];\n if (sides === \"top\" || sides === \"bottom\") {\n const bucket = sides === \"top\" ? topMajors : botMajors;\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else bucket.push(m);\n }\n } else {\n const autoPool: FishboneNode[] = [];\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else autoPool.push(m);\n }\n // Greedy balance — push into whichever half currently has fewer ribs,\n // ties → top (matches the prior \"top gets the extra\" rule).\n for (const m of autoPool) {\n if (topMajors.length <= botMajors.length) topMajors.push(m);\n else botMajors.push(m);\n }\n }\n\n // Respect per-rib `order` (lower = closer to tail). Stable sort within half.\n const byOrder = (a: FishboneNode, b: FishboneNode): number => {\n const ao = a.order ?? Number.POSITIVE_INFINITY;\n const bo = b.order ?? Number.POSITIVE_INFINITY;\n return ao - bo;\n };\n topMajors.sort(byOrder);\n botMajors.sort(byOrder);\n\n const nTop = topMajors.length;\n const nBot = botMajors.length;\n // Keep legacy var names alive\n void nRibs;\n\n // Row count per rib = max(subCauses) for that rib's Level-1 list.\n // Extent per rib = sum of rowHeights for slots 0..n-1.\n const ribRowHeights = (m: FishboneNode): number[] => {\n if (m.children.length === 0) return [];\n return m.children.map(\n (c) => D.rowHeight + c.children.length * D.subRowHeight\n );\n };\n\n const topExtents = topMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n const botExtents = botMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n\n // ── Head sizing (computed early so it can influence half-extent padding) ──\n const effectTextW = estimateTextWidth(ast.effect, FB_CONST.EFFECT_FONT);\n // Grow H proportionally with W to maintain ≈2:1 W:H ratio (avoids flat sliver).\n const rawHeadW = effectTextW + FB_CONST.HEAD_PAD_X;\n const headEffectiveH = Math.max(FB_CONST.HEAD_H, Math.ceil(rawHeadW / 2));\n // At y ± font/2, available width = W * (1 − font/H) due to triangle taper.\n const taperAtText = 1 - FB_CONST.EFFECT_FONT / headEffectiveH;\n const headEffectiveW = Math.max(FB_CONST.HEAD_W, Math.ceil(rawHeadW / taperAtText));\n\n // Head extends ±headEffectiveH/2 from spine — guarantee half extents cover it.\n const minHalfFromHead = Math.ceil(headEffectiveH / 2) + 6;\n\n const topHalfExtent =\n nTop > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(topExtents.length ? topExtents : [0])\n )\n : sides === \"bottom\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n const botHalfExtent =\n nBot > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(botExtents.length ? botExtents : [0])\n )\n : sides === \"top\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n\n const nCols = Math.max(nTop, nBot, 1);\n\n // ── Adaptive column step: widest Level-1 label + branch + gap + breathing ──\n let maxCauseLabelW = 0;\n let maxSubLabelW = 0;\n for (const m of majors) {\n for (const c of m.children) {\n maxCauseLabelW = Math.max(\n maxCauseLabelW,\n estimateTextWidth(c.label, FB_CONST.LABEL_FONT)\n );\n for (const sc of c.children) {\n maxSubLabelW = Math.max(\n maxSubLabelW,\n estimateTextWidth(sc.label, FB_CONST.SUB_FONT)\n );\n }\n }\n }\n // Label column needs to fit the widest Level-1 label AND any Level-2 tick+label\n // that sits under it (sub causes are indented by SUB_TICK_LEN + 4 from labelX).\n const subExtent = maxSubLabelW > 0 ? FB_CONST.SUB_TICK_LEN + 4 + maxSubLabelW : 0;\n const labelColW = Math.max(maxCauseLabelW, subExtent);\n // When causes can sit on both sides, each column must reserve label space on both sides.\n const labelExtentsPerCol = causeSideSetting === \"both\" ? 2 : 1;\n const minColStep =\n FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + FB_CONST.COL_GAP_BETWEEN_LABELS;\n const colStep = Math.max(\n D.colStep,\n Math.ceil(minColStep * (labelExtentsPerCol === 2 ? 1.15 : 1))\n );\n\n // ── Canvas sizing ───────────────────────────────────────────\n const spineStartX = FB_CONST.PADDING + FB_CONST.TAIL_LEN + FB_CONST.SPINE_OFFSET_FROM_TAIL;\n const firstRibX = spineStartX + D.colFirstOffset;\n const lastRibX = firstRibX + (nCols - 1) * colStep;\n // Reserve room for the last rib's label column before the head begins.\n const spineEndX = lastRibX + Math.max(40, FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + 12);\n\n const headX = spineEndX;\n const headTipXAdj = headX + headEffectiveW;\n\n const width =\n ast.width ?? Math.ceil(headTipXAdj + FB_CONST.PADDING);\n\n const title = ast.title;\n const titleReserve = title ? FB_CONST.TITLE_CLEARANCE + 20 : 0;\n\n const spineY =\n FB_CONST.PADDING + titleReserve + topHalfExtent + D.headerH / 2 + 12;\n\n const height =\n ast.height ??\n Math.ceil(\n spineY + botHalfExtent + D.headerH / 2 + 12 + FB_CONST.PADDING\n );\n\n // ── Ribs ────────────────────────────────────────────────────\n const ribs: FishboneLayoutRib[] = [];\n const palette = opts?.palette ?? resolveFishboneTheme(\"default\").palette;\n const textBBoxes: FishboneBBox[] = [];\n\n const buildHalfRibs = (\n halfMajors: FishboneNode[],\n startIndex: number,\n half: \"top\" | \"bottom\",\n halfExtent: number\n ): void => {\n for (let i = 0; i < halfMajors.length; i++) {\n const major = halfMajors[i]!;\n const globalIdx = startIndex + i;\n const color = major.color ?? palette[globalIdx % palette.length]!;\n const spineX = firstRibX + i * colStep;\n\n // Aligned rib endpoint Y → same for all ribs in half.\n const endY = half === \"top\" ? spineY - halfExtent : spineY + halfExtent;\n const endX = spineX - halfExtent * ribSlope;\n\n // Header pill positioned along the rib's slope extension.\n // The rib direction: for every 1 unit of Y away from spine, X moves -ribSlope.\n const extraDist = D.headerGap + D.headerH / 2;\n const headerCenterY =\n half === \"top\" ? endY - extraDist : endY + extraDist;\n // Continue the slope: pill center X follows the same dx/dy as the rib.\n const headerCenterX = endX - extraDist * ribSlope;\n const headerW = Math.max(\n D.headerW,\n estimateTextWidth(major.label, FB_CONST.HEADER_FONT) + 28\n );\n const headerX = headerCenterX - headerW / 2;\n const headerY = headerCenterY - D.headerH / 2;\n\n textBBoxes.push({\n x: headerX,\n y: headerY,\n w: headerW,\n h: D.headerH,\n });\n\n // Cause slots — cumulative along rib from spine outward.\n const causes: FishboneLayoutCause[] = [];\n let accum = FB_CONST.RIB_BASE_EXTENT_Y; // distance from spine to first slot center\n for (let s = 0; s < major.children.length; s++) {\n const child = major.children[s]!;\n const rowH =\n D.rowHeight + child.children.length * D.subRowHeight;\n // vertical offset for this slot (center of row)\n const slotOffset = accum + rowH / 2 - D.rowHeight / 2;\n const ribY =\n half === \"top\" ? spineY - slotOffset : spineY + slotOffset;\n const ribX = spineX - slotOffset * ribSlope;\n\n // Resolve cause direction for this slot.\n const causeDir: \"head\" | \"tail\" =\n causeSideSetting === \"tail\"\n ? \"tail\"\n : causeSideSetting === \"both\"\n ? s % 2 === 0\n ? \"head\"\n : \"tail\"\n : \"head\";\n\n const branchY = ribY;\n const branchX =\n causeDir === \"head\"\n ? ribX + FB_CONST.BRANCH_LEN\n : ribX - FB_CONST.BRANCH_LEN;\n const labelX =\n causeDir === \"head\"\n ? branchX + FB_CONST.LABEL_GAP\n : branchX - FB_CONST.LABEL_GAP;\n const labelY = branchY;\n const labelAnchor: \"start\" | \"end\" =\n causeDir === \"head\" ? \"start\" : \"end\";\n\n // Text bbox for mask\n const labelW = estimateTextWidth(child.label, FB_CONST.LABEL_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? labelX - 2 : labelX - labelW - 2,\n y: labelY - FB_CONST.LABEL_FONT / 2 - 2,\n w: labelW + 4,\n h: FB_CONST.LABEL_FONT + 4,\n });\n\n // Sub-causes stack below the main label\n const subCauses: FishboneLayoutSubCause[] = [];\n for (let si = 0; si < child.children.length; si++) {\n const sub = child.children[si]!;\n const subY = labelY + (si + 1) * D.subRowHeight;\n const tickX1 =\n causeDir === \"head\" ? labelX + 2 : labelX - 2;\n const tickX2 =\n causeDir === \"head\"\n ? tickX1 + FB_CONST.SUB_TICK_LEN\n : tickX1 - FB_CONST.SUB_TICK_LEN;\n const subX =\n causeDir === \"head\" ? tickX2 + 4 : tickX2 - 4;\n subCauses.push({\n label: sub.label,\n x: subX,\n y: subY,\n tickX1,\n tickX2,\n tickY: subY,\n anchor: causeDir === \"head\" ? \"start\" : \"end\",\n });\n const subW = estimateTextWidth(sub.label, FB_CONST.SUB_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? subX - 2 : subX - subW - 2,\n y: subY - FB_CONST.SUB_FONT / 2 - 2,\n w: subW + 4,\n h: FB_CONST.SUB_FONT + 4,\n });\n }\n\n causes.push({\n label: child.label,\n ribIndex: globalIdx,\n slotIndex: s,\n ribX,\n ribY,\n branchX,\n branchY,\n labelX,\n labelY,\n labelAnchor,\n causeSide: causeDir,\n subCauses,\n });\n\n accum += rowH;\n }\n\n ribs.push({\n index: globalIdx,\n half,\n label: major.label,\n color,\n spineX,\n spineY,\n endX,\n endY,\n headerX,\n headerY,\n headerW,\n headerH: D.headerH,\n causes,\n });\n }\n };\n\n buildHalfRibs(topMajors, 0, \"top\", topHalfExtent);\n buildHalfRibs(botMajors, nTop, \"bottom\", botHalfExtent);\n\n // ── Head polygon (right-facing default) ─────────────────────\n const head = {\n x: headX,\n y: spineY,\n tipX: headTipXAdj,\n tipY: spineY,\n w: headEffectiveW,\n h: headEffectiveH,\n label: ast.effect,\n };\n\n // Effect label bbox (for mask around it — though usually effect sits in head\n // which has its own fill, we still add it so any crossing line punches out).\n textBBoxes.push({\n x: headX + 4,\n y: spineY - headEffectiveH / 2 + 4,\n w: headEffectiveW - 8,\n h: headEffectiveH - 8,\n });\n\n // Note: rtl (head-on-left) support: mirror transform applied in renderer\n // rather than recomputing coordinates — simpler and visually identical.\n\n return {\n width,\n height,\n orientation: ast.orientation,\n spineY,\n spineStartX,\n spineEndX,\n tailForkTipTop: { x: FB_CONST.PADDING, y: spineY - FB_CONST.TAIL_LEN },\n tailForkTipBot: { x: FB_CONST.PADDING, y: spineY + FB_CONST.TAIL_LEN },\n head,\n ribs,\n textBBoxes,\n title,\n };\n}\n\nfunction sumOrMin(arr: number[], min: number): number {\n if (arr.length === 0) return min;\n const s = arr.reduce((a, b) => a + b, 0);\n return Math.max(s, min);\n}\n","import type { FishboneAST } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n line as lineEl,\n rect,\n text as textEl,\n polygon,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { layoutFishbone, type FishboneLayoutResult, type FishboneBBox } from \"./layout\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\nconst CSS = `\n.sx-fb { background: var(--schematex-fb-bg, #ffffff); font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fb-title { font: 600 16px sans-serif; fill: #111; }\n.sx-fb-spine { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: butt; fill: none; }\n.sx-fb-tail { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: round; fill: none; }\n.sx-fb-head { stroke-width: 0.5; }\n.sx-fb-head-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-rib { stroke-width: 1.5; fill: none; }\n.sx-fb-header-pill { stroke-width: 0.6; }\n.sx-fb-header-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-branch { stroke-width: 0.8; opacity: 0.6; fill: none; }\n.sx-fb-cause-label { font: 400 12px sans-serif; fill: #3d3d3a; dominant-baseline: central; }\n.sx-fb-sub-tick { stroke-width: 0.7; opacity: 0.5; fill: none; }\n.sx-fb-sub-label { font: 400 11px sans-serif; fill: #555; dominant-baseline: central; }\n`.trim();\n\nfunction lighten(hex: string, amount: number): string {\n // amount in [0, 1]; shifts toward white\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r + (255 - r) * amount);\n const gg = Math.round(g + (255 - g) * amount);\n const bb = Math.round(b + (255 - b) * amount);\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction darken(hex: string, amount: number): string {\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r * (1 - amount));\n const gg = Math.round(g * (1 - amount));\n const bb = Math.round(b * (1 - amount));\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2, 8);\n}\n\nfunction buildMask(id: string, w: number, h: number, bboxes: FishboneBBox[]): string {\n const base = rect({ x: 0, y: 0, width: w, height: h, fill: \"white\" });\n const holes = bboxes\n .map((b) =>\n rect({\n x: b.x,\n y: b.y,\n width: b.w,\n height: b.h,\n fill: \"black\",\n rx: 2,\n })\n )\n .join(\"\\n\");\n return el(\"mask\", { id, maskUnits: \"userSpaceOnUse\" }, [base, holes]);\n}\n\nfunction renderHead(layout: FishboneLayoutResult, ltr: boolean): string {\n const h = layout.head;\n const tipX = ltr ? h.tipX : h.x - (h.tipX - h.x);\n const leftX = ltr ? h.x : h.x;\n const rightX = ltr ? h.tipX : tipX;\n // Polygon pointing toward head direction\n const points = ltr\n ? `${leftX},${h.y - h.h / 2} ${leftX},${h.y + h.h / 2} ${rightX},${h.y}`\n : `${rightX},${h.y - h.h / 2} ${rightX},${h.y + h.h / 2} ${tipX},${h.y}`;\n const fill = \"#faece7\";\n const stroke = \"#993c1d\";\n // Bias text toward the wide base (35% from base, 65% from tip) so it reads\n // balanced inside the tapering triangle rather than shifted toward the tip.\n const textX = ltr ? leftX + h.w * 0.38 : rightX - h.w * 0.38;\n return group({ class: \"sx-fb-head-g\" }, [\n polygon({\n points,\n class: \"sx-fb-head\",\n fill,\n stroke,\n }),\n textEl(\n {\n x: textX,\n y: h.y,\n class: \"sx-fb-head-text\",\n fill: darken(stroke, 0.3),\n },\n h.label\n ),\n ]);\n}\n\nfunction renderRibs(layout: FishboneLayoutResult, maskUrl: string): string {\n const parts: string[] = [];\n for (const rib of layout.ribs) {\n const pillFill = lighten(rib.color, 0.82);\n const pillStroke = rib.color;\n const headerTextFill = darken(rib.color, 0.3);\n\n // Rib line (with mask to punch out text overlaps)\n parts.push(\n lineEl({\n x1: rib.spineX,\n y1: rib.spineY,\n x2: rib.endX,\n y2: rib.endY,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n\n // Extend the rib line to the pill center along the same slope.\n parts.push(\n lineEl({\n x1: rib.endX,\n y1: rib.endY,\n x2: rib.headerX + rib.headerW / 2,\n y2: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n })\n );\n\n // Header pill\n parts.push(\n rect({\n x: rib.headerX,\n y: rib.headerY,\n width: rib.headerW,\n height: rib.headerH,\n rx: 8,\n class: \"sx-fb-header-pill\",\n fill: pillFill,\n stroke: pillStroke,\n })\n );\n parts.push(\n textEl(\n {\n x: rib.headerX + rib.headerW / 2,\n y: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-header-text\",\n fill: headerTextFill,\n },\n rib.label\n )\n );\n\n // Branches + labels\n for (const cause of rib.causes) {\n parts.push(\n lineEl({\n x1: cause.ribX,\n y1: cause.ribY,\n x2: cause.branchX,\n y2: cause.branchY,\n class: \"sx-fb-branch\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n parts.push(\n textEl(\n {\n x: cause.labelX,\n y: cause.labelY,\n class: \"sx-fb-cause-label\",\n \"text-anchor\": cause.labelAnchor,\n },\n cause.label\n )\n );\n\n // Sub-causes (Level 2)\n for (const sub of cause.subCauses) {\n parts.push(\n lineEl({\n x1: sub.tickX1,\n y1: sub.tickY,\n x2: sub.tickX2,\n y2: sub.tickY,\n class: \"sx-fb-sub-tick\",\n stroke: rib.color,\n })\n );\n parts.push(\n textEl(\n {\n x: sub.x,\n y: sub.y,\n class: \"sx-fb-sub-label\",\n \"text-anchor\": sub.anchor,\n },\n sub.label\n )\n );\n }\n }\n }\n return group({ class: \"sx-fb-ribs\" }, parts);\n}\n\nexport function renderFishboneAST(ast: FishboneAST, options: { theme?: string } = {}): string {\n const themeName = options.theme ?? ast.metadata?.[\"theme\"] ?? \"default\";\n const tokens = resolveFishboneTheme(themeName);\n const layout = layoutFishbone(ast, { palette: tokens.palette });\n const ltr = layout.orientation !== \"rtl\";\n const maskId = `sx-fb-mask-${randomId()}`;\n const maskUrl = `url(#${maskId})`;\n\n const mask = buildMask(maskId, layout.width, layout.height, layout.textBBoxes);\n\n const spine = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.spineEndX,\n y2: layout.spineY,\n class: \"sx-fb-spine\",\n });\n\n const tailTop = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipTop.x,\n y2: layout.tailForkTipTop.y,\n class: \"sx-fb-tail\",\n });\n const tailBot = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipBot.x,\n y2: layout.tailForkTipBot.y,\n class: \"sx-fb-tail\",\n });\n\n const titleBlock = layout.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 28,\n class: \"sx-fb-title\",\n \"text-anchor\": \"middle\",\n },\n layout.title\n )\n : \"\";\n\n const head = renderHead(layout, ltr);\n const ribs = renderRibs(layout, maskUrl);\n\n const inner = [\n titleEl(layout.title ? `${layout.title} — Fishbone diagram` : \"Fishbone diagram\"),\n descEl(\n `Ishikawa cause-and-effect diagram. Effect: ${ast.effect}. ${ast.majors.length} categories.`\n ),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n tailTop,\n tailBot,\n spine,\n head,\n ribs,\n ];\n\n // For RTL (head on left), mirror horizontally via transform.\n if (!ltr) {\n const mirrored = group(\n {\n transform: `translate(${layout.width} 0) scale(-1 1)`,\n },\n [tailTop, tailBot, spine, head, ribs]\n );\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n [\n titleEl(layout.title ?? \"Fishbone\"),\n descEl(`Ishikawa diagram (head-left). Effect: ${ast.effect}.`),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n mirrored,\n ]\n );\n }\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n inner\n );\n}\n\nexport function renderFishbone(text: string, options: { theme?: string } = {}): string {\n const ast = parseFishboneDSL(text);\n return renderFishboneAST(ast, options);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { renderFishbone } from \"./renderer\";\n\nexport const fishbone: DiagramPlugin = {\n type: \"fishbone\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"fishbone\");\n },\n parse: parseFishboneDSL,\n render(text: string): string {\n return renderFishbone(text);\n },\n};\n\nexport { parseFishboneDSL } from \"./parser\";\nexport { renderFishbone, renderFishboneAST } from \"./renderer\";\nexport { layoutFishbone, FB_CONST } from \"./layout\";\n"]}
|