schematex 0.5.2 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -1
- package/dist/ai/ai-sdk.cjs +22 -22
- package/dist/ai/ai-sdk.d.cts +3 -3
- package/dist/ai/ai-sdk.d.ts +3 -3
- package/dist/ai/ai-sdk.js +17 -17
- package/dist/ai/index.cjs +34 -26
- package/dist/ai/index.d.cts +4 -4
- package/dist/ai/index.d.ts +4 -4
- package/dist/ai/index.js +17 -17
- package/dist/{api-Cr_MxttI.d.ts → api-XWHHAhQI.d.ts} +3 -40
- package/dist/{api-C5SECOxZ.d.cts → api-qVDutqXH.d.cts} +3 -40
- package/dist/browser.cjs +23 -23
- package/dist/browser.d.cts +3 -3
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +17 -17
- package/dist/{chunk-4QPDZJAL.cjs → chunk-25ZON47K.cjs} +11484 -9030
- package/dist/chunk-25ZON47K.cjs.map +1 -0
- package/dist/{chunk-N7W5KZK7.cjs → chunk-2L4YXZAZ.cjs} +4 -4
- package/dist/{chunk-N7W5KZK7.cjs.map → chunk-2L4YXZAZ.cjs.map} +1 -1
- package/dist/{chunk-ZYRCPSBU.js → chunk-3IE7KZY4.js} +4 -4
- package/dist/{chunk-ZYRCPSBU.js.map → chunk-3IE7KZY4.js.map} +1 -1
- package/dist/{chunk-ZX74KJPM.js → chunk-3VB5AT4R.js} +3 -3
- package/dist/{chunk-ZX74KJPM.js.map → chunk-3VB5AT4R.js.map} +1 -1
- package/dist/{chunk-S2KJRHDZ.cjs → chunk-4UFR2LB6.cjs} +13 -13
- package/dist/{chunk-S2KJRHDZ.cjs.map → chunk-4UFR2LB6.cjs.map} +1 -1
- package/dist/{chunk-QTNPMIO2.cjs → chunk-6JI6FWLZ.cjs} +341 -35
- package/dist/chunk-6JI6FWLZ.cjs.map +1 -0
- package/dist/{chunk-OK5ZS3LU.js → chunk-7AFW2J6J.js} +11445 -8998
- package/dist/chunk-7AFW2J6J.js.map +1 -0
- package/dist/{chunk-UFTYX73U.js → chunk-7F76AWOI.js} +339 -35
- package/dist/chunk-7F76AWOI.js.map +1 -0
- package/dist/{chunk-BW4KGTV7.cjs → chunk-C5C5EF3W.cjs} +4 -4
- package/dist/{chunk-BW4KGTV7.cjs.map → chunk-C5C5EF3W.cjs.map} +1 -1
- package/dist/{chunk-VJGMEGMR.js → chunk-DOK7LKLO.js} +125 -13
- package/dist/chunk-DOK7LKLO.js.map +1 -0
- package/dist/{chunk-3M6WB62Y.cjs → chunk-ECD5XHBM.cjs} +139 -7
- package/dist/chunk-ECD5XHBM.cjs.map +1 -0
- package/dist/{chunk-L3CTXXVZ.js → chunk-FBS3PACU.js} +3 -3
- package/dist/{chunk-L3CTXXVZ.js.map → chunk-FBS3PACU.js.map} +1 -1
- package/dist/{chunk-QUKVGHN4.cjs → chunk-FKJBXGWP.cjs} +4 -4
- package/dist/{chunk-QUKVGHN4.cjs.map → chunk-FKJBXGWP.cjs.map} +1 -1
- package/dist/{chunk-SZK376QB.js → chunk-H4MT5TJP.js} +3 -3
- package/dist/{chunk-SZK376QB.js.map → chunk-H4MT5TJP.js.map} +1 -1
- package/dist/{chunk-3M6T7KB4.js → chunk-HAZALB7U.js} +3 -3
- package/dist/{chunk-3M6T7KB4.js.map → chunk-HAZALB7U.js.map} +1 -1
- package/dist/{chunk-VFZOPRQP.cjs → chunk-HWVBHU3O.cjs} +5 -5
- package/dist/{chunk-VFZOPRQP.cjs.map → chunk-HWVBHU3O.cjs.map} +1 -1
- package/dist/{chunk-D7EHZFK4.cjs → chunk-L7POWM5B.cjs} +138 -2
- package/dist/chunk-L7POWM5B.cjs.map +1 -0
- package/dist/{chunk-6OSUNBZY.js → chunk-LGABFD3L.js} +135 -7
- package/dist/chunk-LGABFD3L.js.map +1 -0
- package/dist/{chunk-2VNMKOUO.js → chunk-LRI4RH2N.js} +135 -3
- package/dist/chunk-LRI4RH2N.js.map +1 -0
- package/dist/{chunk-VDSYMSUY.js → chunk-MVIEIKOI.js} +3 -3
- package/dist/{chunk-VDSYMSUY.js.map → chunk-MVIEIKOI.js.map} +1 -1
- package/dist/{chunk-ZL5RB4UV.js → chunk-N5B242WY.js} +3 -3
- package/dist/{chunk-ZL5RB4UV.js.map → chunk-N5B242WY.js.map} +1 -1
- package/dist/{chunk-VKPCR7BG.js → chunk-P63S7P6N.js} +770 -12
- package/dist/chunk-P63S7P6N.js.map +1 -0
- package/dist/{chunk-YLEVMOK2.cjs → chunk-R66QG3XT.cjs} +5 -4
- package/dist/{chunk-YLEVMOK2.cjs.map → chunk-R66QG3XT.cjs.map} +1 -1
- package/dist/{chunk-I55HO32M.js → chunk-RJMCWT7Z.js} +3 -3
- package/dist/{chunk-I55HO32M.js.map → chunk-RJMCWT7Z.js.map} +1 -1
- package/dist/{chunk-TZTCIAYW.cjs → chunk-S3RMAXH5.cjs} +137 -25
- package/dist/chunk-S3RMAXH5.cjs.map +1 -0
- package/dist/{chunk-IBRW3UOA.js → chunk-TWLKXV2O.js} +3 -3
- package/dist/{chunk-IBRW3UOA.js.map → chunk-TWLKXV2O.js.map} +1 -1
- package/dist/{chunk-VCH7RI5H.js → chunk-UWA5MWCI.js} +4 -4
- package/dist/chunk-UWA5MWCI.js.map +1 -0
- package/dist/{chunk-RYVV5UVI.cjs → chunk-V4GILQR6.cjs} +4 -4
- package/dist/{chunk-RYVV5UVI.cjs.map → chunk-V4GILQR6.cjs.map} +1 -1
- package/dist/{chunk-QMTWG6JL.cjs → chunk-V4RO5KYY.cjs} +6 -4
- package/dist/chunk-V4RO5KYY.cjs.map +1 -0
- package/dist/{chunk-VZ5LDNHK.cjs → chunk-VTSH4YPT.cjs} +12 -12
- package/dist/{chunk-VZ5LDNHK.cjs.map → chunk-VTSH4YPT.cjs.map} +1 -1
- package/dist/{chunk-UUBNQV2T.cjs → chunk-WQDIZH2Z.cjs} +12 -12
- package/dist/{chunk-UUBNQV2T.cjs.map → chunk-WQDIZH2Z.cjs.map} +1 -1
- package/dist/{chunk-EGSUMHCS.cjs → chunk-YB4XJY5L.cjs} +12 -12
- package/dist/{chunk-EGSUMHCS.cjs.map → chunk-YB4XJY5L.cjs.map} +1 -1
- package/dist/{chunk-JHDR56XO.js → chunk-YS6CGUNH.js} +3 -3
- package/dist/{chunk-JHDR56XO.js.map → chunk-YS6CGUNH.js.map} +1 -1
- package/dist/{chunk-HK56GQQP.cjs → chunk-YVDUEUFV.cjs} +773 -13
- package/dist/chunk-YVDUEUFV.cjs.map +1 -0
- package/dist/{types-WTr9W5Ud.d.ts → diagnostics-DRxhodP6.d.cts} +74 -2
- package/dist/{types-WTr9W5Ud.d.cts → diagnostics-DRxhodP6.d.ts} +74 -2
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.cjs +8 -8
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +6 -6
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +7 -7
- package/dist/diagrams/orgchart/index.d.cts +1 -1
- package/dist/diagrams/orgchart/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +14 -6
- package/dist/diagrams/sld/index.d.cts +14 -2
- package/dist/diagrams/sld/index.d.ts +14 -2
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/{index-C30zQWZI.d.ts → index-BRIkOPnd.d.cts} +60 -2
- package/dist/{index-BD2yDfQM.d.cts → index-C7SN-FB3.d.ts} +60 -2
- package/dist/index.cjs +342 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +38 -4
- package/dist/index.d.ts +38 -4
- package/dist/index.js +283 -16
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +17 -17
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +16 -16
- package/dist/{tools-BHWaJPOl.d.ts → tools-BVeUNdsU.d.ts} +12 -4
- package/dist/{tools-DlpuE76u.d.cts → tools-DdhP1kWY.d.cts} +12 -4
- package/package.json +1 -1
- package/dist/chunk-2VNMKOUO.js.map +0 -1
- package/dist/chunk-3M6WB62Y.cjs.map +0 -1
- package/dist/chunk-4QPDZJAL.cjs.map +0 -1
- package/dist/chunk-6OSUNBZY.js.map +0 -1
- package/dist/chunk-D7EHZFK4.cjs.map +0 -1
- package/dist/chunk-HK56GQQP.cjs.map +0 -1
- package/dist/chunk-OK5ZS3LU.js.map +0 -1
- package/dist/chunk-QMTWG6JL.cjs.map +0 -1
- package/dist/chunk-QTNPMIO2.cjs.map +0 -1
- package/dist/chunk-TZTCIAYW.cjs.map +0 -1
- package/dist/chunk-UFTYX73U.js.map +0 -1
- package/dist/chunk-VCH7RI5H.js.map +0 -1
- package/dist/chunk-VJGMEGMR.js.map +0 -1
- package/dist/chunk-VKPCR7BG.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/genogram/parser.ts","../src/diagrams/genogram/layout.ts","../src/diagrams/genogram/symbols.ts","../src/diagrams/genogram/legend.ts","../src/diagrams/genogram/renderer.ts","../src/diagrams/genogram/index.ts"],"names":["line","text","rel","group","fu","path","EMOTIONAL_TYPES","EMOTIONAL_REL_TYPES"],"mappings":"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","file":"chunk-VJGMEGMR.js","sourcesContent":["import type {\n DiagramAST,\n Individual,\n LegendOverrides,\n Relationship,\n RelationshipType,\n Condition,\n ConditionFill,\n} from \"../../core/types\";\nimport { parseLegendDirective } from \"../../core/legend-parser\";\n\n// ─── ParseError ─────────────────────────────────────────────\n\nexport class ParseError extends Error {\n constructor(\n message: string,\n public line: number,\n public column: number,\n public source: string\n ) {\n super(`Line ${line}, col ${column}: ${message}\\n → ${source}`);\n this.name = \"ParseError\";\n }\n}\n\n// ─── Couple operators ───────────────────────────────────────\n\n// Order matters — the parser tries these in sequence and the first match wins.\n// Longer tokens MUST come first so e.g. `~/~` is not split as `~` + `/~`.\nconst COUPLE_OPS: Array<{ token: string; type: RelationshipType }> = [\n { token: \"~/~\", type: \"cohabiting-ended\" },\n { token: \"-//\", type: \"separated\" }, // alias for -/-\n { token: \"-x-\", type: \"divorced\" },\n { token: \"-/-\", type: \"separated\" },\n { token: \"-o-\", type: \"engaged\" },\n { token: \"==\", type: \"consanguineous\" as RelationshipType },\n { token: \"--\", type: \"married\" },\n { token: \"~\", type: \"cohabiting\" },\n];\n\nconst VALID_SEX = new Set([\"male\", \"female\", \"unknown\", \"other\"]);\nconst VALID_STATUS = new Set([\n \"deceased\",\n \"stillborn\",\n \"miscarriage\",\n \"abortion\",\n]);\nconst SPECIAL_CHILD_PROPS = new Set([\n \"adopted\",\n \"foster\",\n \"twin-identical\",\n \"twin-fraternal\",\n]);\n// Tokens whose appearance on a redeclared child indicates the link is a\n// secondary \"current caregiver\" relationship (foster / adopted / guardian),\n// not the structural biological link.\nconst SECONDARY_LINK_PROPS = new Set([\"foster\", \"adopted\", \"guardian\"]);\nconst VALID_FILLS = new Set([\n \"full\",\n \"half-left\",\n \"half-right\",\n \"half-top\",\n \"half-bottom\",\n \"quad-tl\",\n \"quad-tr\",\n \"quad-bl\",\n \"quad-br\",\n \"quarter\",\n \"striped\",\n \"dotted\",\n]);\n\nconst EMOTIONAL_TYPES = new Set([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\n\n// ─── Parser state ───────────────────────────────────────────\n\ninterface ParserState {\n lines: string[];\n currentLine: number;\n}\n\n// ─── Main entry point ───────────────────────────────────────\n\nexport function parseGenogram(text: string): DiagramAST {\n const rawLines = text.split(\"\\n\");\n const state: ParserState = { lines: rawLines, currentLine: 0 };\n\n skipBlankAndComments(state);\n\n // Parse header\n const metadata: Record<string, string> = {};\n const headerLine = currentLineText(state);\n if (headerLine === undefined) {\n throw new ParseError(\"Empty input\", 1, 1, \"\");\n }\n const headerTrimmed = headerLine.trim();\n if (!headerTrimmed.toLowerCase().startsWith(\"genogram\")) {\n throw new ParseError(\n 'Expected \"genogram\" header',\n state.currentLine + 1,\n 1,\n headerLine\n );\n }\n const titleMatch = headerTrimmed.match(/^genogram\\s+\"([^\"]*)\"$/i);\n if (titleMatch) {\n metadata.title = titleMatch[1];\n }\n state.currentLine++;\n\n // Collect individuals and relationships\n const individualsMap = new Map<string, Individual>();\n const relationships: Relationship[] = [];\n const childSpecialProps = new Map<string, string>();\n const legendOverrides: LegendOverrides = {};\n // Track which children already have a structural (primary) parent-child rel.\n // The first one wins layout; later declarations under another couple become\n // secondary \"current caregiver\" links.\n const childrenWithPrimary = new Set<string>();\n // Counter for auto-generated `?` placeholder ids.\n let unknownSibCounter = 0;\n\n skipBlankAndComments(state);\n\n while (state.currentLine < state.lines.length) {\n skipBlankAndComments(state);\n if (state.currentLine >= state.lines.length) break;\n\n const lineText = state.lines[state.currentLine];\n const trimmed = lineText.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\") || trimmed.startsWith(\"%%\")) {\n state.currentLine++;\n continue;\n }\n\n // Legend directives (`legend: ...`, `legend.title: ...`, etc.)\n if (parseLegendDirective(trimmed, legendOverrides)) {\n state.currentLine++;\n continue;\n }\n\n // Check for emotional relationship line: `A -TYPE- B` or `A -TYPE-> B`\n const emotionalMatch = detectEmotionalOp(trimmed);\n if (emotionalMatch) {\n const { leftId, emotionalType, rightId: emRightId, directional, label: emLabel } = emotionalMatch;\n const lineNum = state.currentLine + 1;\n const leftKey = leftId.toLowerCase();\n const rightKey = emRightId.toLowerCase();\n\n if (!individualsMap.has(leftKey)) {\n throw new ParseError(`Unknown individual '${leftId}'`, lineNum, 1, lineText);\n }\n if (!individualsMap.has(rightKey)) {\n throw new ParseError(`Unknown individual '${emRightId}'`, lineNum, 1, lineText);\n }\n\n const rel: Relationship = {\n type: emotionalType as RelationshipType,\n from: leftKey,\n to: rightKey,\n };\n if (directional) rel.directional = true;\n if (emLabel) rel.label = emLabel;\n relationships.push(rel);\n state.currentLine++;\n continue;\n }\n\n const coupleMatch = detectCoupleOp(trimmed);\n if (coupleMatch) {\n const { leftId, op, rightRaw } = coupleMatch;\n const lineNum = state.currentLine + 1;\n\n // Extract optional relationship label: quoted string at the end\n const { cleaned: rightCleaned, label: relLabel } = extractRelLabel(rightRaw);\n\n // Parse right side — may have inline props\n const { id: rightId, props: rightProps } = parseIdWithOptionalProps(rightCleaned);\n\n // Ensure left individual exists\n const leftKey = leftId.toLowerCase();\n if (!individualsMap.has(leftKey)) {\n throw new ParseError(\n `Unknown individual '${leftId}'`,\n lineNum,\n 1,\n lineText\n );\n }\n\n // Register right individual if it has inline props or doesn't exist yet\n const rightKey = rightId.toLowerCase();\n if (rightProps) {\n const incoming = buildIndividual(rightId, rightProps, lineNum, lineText);\n const existing = individualsMap.get(rightKey);\n individualsMap.set(\n rightKey,\n existing\n ? mergeIndividual(existing, incoming, lineNum, lineText)\n : incoming\n );\n } else if (!individualsMap.has(rightKey)) {\n throw new ParseError(\n `Unknown individual '${rightId}'`,\n lineNum,\n 1,\n lineText\n );\n }\n\n const rel: Relationship = { type: op.type, from: leftKey, to: rightKey };\n if (relLabel) rel.label = relLabel;\n relationships.push(rel);\n\n const coupleIndent = getIndent(lineText);\n state.currentLine++;\n\n // Check for children (indented lines below couple)\n while (state.currentLine < state.lines.length) {\n const childLine = state.lines[state.currentLine];\n const childTrimmed = childLine.trim();\n\n if (childTrimmed === \"\" || childTrimmed.startsWith(\"#\") || childTrimmed.startsWith(\"//\") || childTrimmed.startsWith(\"%%\")) {\n state.currentLine++;\n continue;\n }\n\n const childIndent = getIndent(childLine);\n if (childIndent <= coupleIndent) break;\n\n // This is a child line\n const childLineNum = state.currentLine + 1;\n\n // `?` shorthand → synthetic placeholder id with unknown-siblings marker\n let parsedId: string;\n let parsedProps: string | null;\n if (childTrimmed === \"?\" || childTrimmed.startsWith(\"? \")) {\n parsedId = `__unknown_siblings_${++unknownSibCounter}`;\n parsedProps = \"unknown, unknown-siblings\";\n } else {\n const split = splitIdAndProps(childTrimmed);\n parsedId = split.id;\n parsedProps = split.propsStr;\n }\n const childKey = parsedId.toLowerCase();\n\n const incoming = buildIndividual(\n parsedId,\n parsedProps,\n childLineNum,\n childLine\n );\n\n // Check for special child properties (adopted, foster, twin)\n const tokens = parsedProps ? propsTokens(parsedProps) : [];\n for (const sp of SPECIAL_CHILD_PROPS) {\n if (tokens.includes(sp)) childSpecialProps.set(childKey, sp);\n }\n const isSecondaryDecl = tokens.some((t) => SECONDARY_LINK_PROPS.has(t));\n\n const existing = individualsMap.get(childKey);\n individualsMap.set(\n childKey,\n existing\n ? mergeIndividual(existing, incoming, childLineNum, childLine)\n : incoming\n );\n\n // parent-child relationship: from = \"leftKey+rightKey\"\n // IMPORTANT: derive the rel type from THIS line's tokens, not from\n // the cross-declaration `childSpecialProps` map — otherwise a child\n // declared once with `[foster]` and again as a plain bio child would\n // see the bio rel typed as \"foster\" too (the global map is sticky).\n const coupleKey = `${leftKey}+${rightKey}`;\n const lineChildType = tokens.find((t) =>\n SPECIAL_CHILD_PROPS.has(t)\n );\n const relType: RelationshipType =\n lineChildType === \"adopted\" || lineChildType === \"foster\"\n ? (lineChildType as RelationshipType)\n : \"parent-child\";\n\n // Dual-parent handling: if this child already has a primary\n // structural rel, demote this one to secondary so it doesn't\n // compete for layout. Otherwise this becomes the primary.\n const isSecondary =\n isSecondaryDecl && childrenWithPrimary.has(childKey);\n const rel: Relationship = {\n type: relType,\n from: coupleKey,\n to: childKey,\n };\n if (isSecondary) rel.secondary = true;\n relationships.push(rel);\n if (!isSecondary) childrenWithPrimary.add(childKey);\n\n state.currentLine++;\n }\n } else {\n // Individual definition line\n const lineNum = state.currentLine + 1;\n const { id, propsStr } = splitIdAndProps(trimmed);\n const key = id.toLowerCase();\n\n const individual = buildIndividual(id, propsStr, lineNum, lineText);\n\n const existing = individualsMap.get(key);\n if (existing) {\n individualsMap.set(\n key,\n mergeIndividual(existing, individual, lineNum, lineText)\n );\n } else {\n individualsMap.set(key, individual);\n }\n\n state.currentLine++;\n }\n }\n\n // Build twin relationships\n const twinGroups = new Map<string, string[]>();\n for (const [childKey, prop] of childSpecialProps) {\n if (prop === \"twin-identical\" || prop === \"twin-fraternal\") {\n // Find which couple this child belongs to\n const pcRel = relationships.find(\n (r) =>\n r.to === childKey &&\n (r.type === \"parent-child\" ||\n r.type === \"adopted\" ||\n r.type === \"foster\")\n );\n if (pcRel) {\n const groupKey = `${pcRel.from}:${prop}`;\n const group = twinGroups.get(groupKey) ?? [];\n group.push(childKey);\n twinGroups.set(groupKey, group);\n }\n }\n }\n for (const [groupKey, members] of twinGroups) {\n const twinType = groupKey.split(\":\")[1] as RelationshipType;\n for (let i = 0; i < members.length - 1; i++) {\n relationships.push({\n type: twinType,\n from: members[i],\n to: members[i + 1],\n });\n }\n }\n\n // Order-insensitive primary/secondary normalization for dual-parent cases.\n // If a child has multiple parent-child rels, prefer the bio one as primary\n // (`type: \"parent-child\"`); otherwise keep the first declared as primary.\n // All other parent-child rels for that child become `secondary: true`. This\n // protects against the LLM emitting foster-parents-first / bio-parents-second\n // (which would otherwise leave both rels primary and break layout).\n normalizePrimaryParentRels(relationships);\n\n const hasLegendOverrides =\n Object.keys(legendOverrides).length > 0 &&\n Object.values(legendOverrides).some((v) => v !== undefined);\n\n return {\n type: \"genogram\",\n individuals: Array.from(individualsMap.values()),\n relationships,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n legendOverrides: hasLegendOverrides ? legendOverrides : undefined,\n };\n}\n\nfunction normalizePrimaryParentRels(relationships: Relationship[]): void {\n const PARENT_CHILD_TYPES = new Set<RelationshipType>([\n \"parent-child\",\n \"adopted\",\n \"foster\",\n ]);\n // Group indices by child id\n const byChild = new Map<string, number[]>();\n for (let i = 0; i < relationships.length; i++) {\n const r = relationships[i];\n if (!PARENT_CHILD_TYPES.has(r.type)) continue;\n const arr = byChild.get(r.to) ?? [];\n arr.push(i);\n byChild.set(r.to, arr);\n }\n for (const indices of byChild.values()) {\n if (indices.length < 2) continue;\n // Prefer \"parent-child\" (bio) as primary; else first declared.\n let primaryIdx = indices.find((i) => relationships[i].type === \"parent-child\");\n if (primaryIdx === undefined) primaryIdx = indices[0];\n for (const i of indices) {\n if (i === primaryIdx) {\n delete relationships[i].secondary;\n } else {\n relationships[i].secondary = true;\n }\n }\n }\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction currentLineText(state: ParserState): string | undefined {\n return state.lines[state.currentLine];\n}\n\nfunction skipBlankAndComments(state: ParserState): void {\n while (state.currentLine < state.lines.length) {\n const t = state.lines[state.currentLine].trim();\n if (t === \"\" || t.startsWith(\"#\") || t.startsWith(\"//\") || t.startsWith(\"%%\")) {\n state.currentLine++;\n } else {\n break;\n }\n }\n}\n\nfunction getIndent(line: string): number {\n const match = line.match(/^(\\s*)/);\n return match ? match[1].length : 0;\n}\n\ninterface CoupleMatch {\n leftId: string;\n op: { token: string; type: RelationshipType };\n rightRaw: string;\n}\n\ninterface EmotionalMatch {\n leftId: string;\n emotionalType: string;\n rightId: string;\n directional: boolean;\n label: string | null;\n}\n\nfunction detectEmotionalOp(trimmed: string): EmotionalMatch | null {\n // Pattern: ID -TYPE- ID or ID -TYPE-> ID, optionally followed by \"label\"\n const match = trimmed.match(\n /^([a-zA-Z][a-zA-Z0-9_-]*)\\s+-([\\w-]+)->(.*)|^([a-zA-Z][a-zA-Z0-9_-]*)\\s+-([\\w-]+)-\\s+(.*)/\n );\n if (!match) return null;\n\n const directional = !!match[1];\n const leftId = directional ? match[1] : match[4];\n const emotionalType = directional ? match[2] : match[5];\n const rest = (directional ? match[3] : match[6]).trim();\n\n if (!EMOTIONAL_TYPES.has(emotionalType)) return null;\n\n // Extract right ID and optional quoted label\n const { id: rightId, label } = extractIdAndLabel(rest);\n if (!rightId || !/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(rightId)) return null;\n\n return { leftId, emotionalType, rightId, directional, label };\n}\n\nfunction extractIdAndLabel(raw: string): { id: string; label: string | null } {\n // ID possibly followed by \"label text\"\n const labelMatch = raw.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\\s+\"([^\"]*)\"$/);\n if (labelMatch) return { id: labelMatch[1], label: labelMatch[2] };\n const idOnly = raw.match(/^([a-zA-Z][a-zA-Z0-9_-]*)$/);\n if (idOnly) return { id: idOnly[1], label: null };\n return { id: raw.trim(), label: null };\n}\n\nfunction extractRelLabel(rightRaw: string): { cleaned: string; label: string | null } {\n // Check for trailing \"label text\" after the individual definition\n const match = rightRaw.match(/^(.*?)\\s+\"([^\"]*)\"$/);\n if (match) return { cleaned: match[1].trim(), label: match[2] };\n return { cleaned: rightRaw, label: null };\n}\n\nfunction detectCoupleOp(trimmed: string): CoupleMatch | null {\n for (const op of COUPLE_OPS) {\n const parts = splitByOperator(trimmed, op.token);\n if (parts) {\n return { leftId: parts.left.trim(), op, rightRaw: parts.right.trim() };\n }\n }\n return null;\n}\n\nfunction splitByOperator(\n line: string,\n op: string\n): { left: string; right: string } | null {\n // Find operator surrounded by spaces or at word boundaries, outside brackets\n let bracketDepth = 0;\n for (let i = 0; i < line.length; i++) {\n if (line[i] === \"[\") bracketDepth++;\n if (line[i] === \"]\") bracketDepth--;\n if (bracketDepth > 0) continue;\n\n if (line.substring(i, i + op.length) === op) {\n const left = line.substring(0, i).trim();\n const right = line.substring(i + op.length).trim();\n if (left && right) {\n // Verify left is a valid ID (no brackets — it's just a reference)\n const leftId = left.match(/^[a-zA-Z][a-zA-Z0-9_-]*$/);\n if (leftId) return { left, right };\n }\n }\n }\n return null;\n}\n\nfunction parseIdWithOptionalProps(raw: string): {\n id: string;\n props: string | null;\n} {\n const bracketIdx = raw.indexOf(\"[\");\n if (bracketIdx === -1) {\n return { id: raw.trim(), props: null };\n }\n const id = raw.substring(0, bracketIdx).trim();\n const endBracket = raw.lastIndexOf(\"]\");\n const propsStr = raw.substring(bracketIdx + 1, endBracket === -1 ? raw.length : endBracket);\n return { id, props: propsStr };\n}\n\nfunction splitIdAndProps(trimmed: string): { id: string; propsStr: string | null } {\n const bracketIdx = trimmed.indexOf(\"[\");\n if (bracketIdx === -1) {\n return { id: trimmed.trim(), propsStr: null };\n }\n const id = trimmed.substring(0, bracketIdx).trim();\n const endBracket = trimmed.lastIndexOf(\"]\");\n const propsStr = trimmed.substring(\n bracketIdx + 1,\n endBracket === -1 ? trimmed.length : endBracket\n );\n return { id, propsStr };\n}\n\nfunction propsTokens(propsStr: string): string[] {\n return splitProps(propsStr).map((t) => t.trim().toLowerCase());\n}\n\nfunction splitProps(propsStr: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n\n for (const ch of propsStr) {\n if (ch === \"(\") parenDepth++;\n if (ch === \")\") parenDepth--;\n if (ch === \",\" && parenDepth === 0) {\n result.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n if (current.trim()) result.push(current);\n return result;\n}\n\nfunction buildIndividual(\n id: string,\n propsStr: string | null,\n lineNum: number,\n lineText: string\n): Individual {\n const individual: Individual = {\n id: id.toLowerCase(),\n label: id,\n sex: \"unknown\",\n status: \"alive\",\n };\n\n if (!propsStr) return individual;\n\n const tokens = splitProps(propsStr);\n\n for (const rawToken of tokens) {\n const token = rawToken.trim();\n const tokenLower = token.toLowerCase();\n\n if (VALID_SEX.has(tokenLower)) {\n individual.sex = tokenLower as Individual[\"sex\"];\n } else if (VALID_STATUS.has(tokenLower)) {\n individual.status = tokenLower as Individual[\"status\"];\n } else if (tokenLower === \"index\") {\n if (!individual.markers) individual.markers = [];\n individual.markers.push(\"index-person\");\n } else if (tokenLower === \"unknown-siblings\") {\n if (!individual.markers) individual.markers = [];\n individual.markers.push(\"unknown-siblings\");\n if (!individual.label || individual.label === id) individual.label = \"?\";\n } else if (SPECIAL_CHILD_PROPS.has(tokenLower) || tokenLower === \"guardian\") {\n // Handled at caller level for relationships\n continue;\n } else if (/^\\d{4}$/.test(tokenLower)) {\n if (individual.birthYear !== undefined) {\n individual.deathYear = parseInt(token, 10);\n } else {\n individual.birthYear = parseInt(token, 10);\n }\n } else if (tokenLower.startsWith(\"conditions:\")) {\n individual.conditions = parseConditions(\n token.substring(\"conditions:\".length).trim(),\n lineNum,\n lineText\n );\n } else if (token.includes(\":\")) {\n const colonIdx = token.indexOf(\":\");\n const key = token.substring(0, colonIdx).trim().toLowerCase();\n const value = token.substring(colonIdx + 1).trim();\n if (key === \"age\") {\n const ageNum = parseInt(value, 10);\n if (!isNaN(ageNum)) individual.age = ageNum;\n } else if (key === \"death\") {\n const deathNum = parseInt(value, 10);\n if (!isNaN(deathNum)) individual.deathYear = deathNum;\n } else if (key === \"label\") {\n individual.label = value.replace(/^\"|\"$/g, \"\");\n } else if (key === \"sibling-of\") {\n individual.siblingOf = value.toLowerCase();\n } else if (key === \"shape\") {\n const v = value.toLowerCase();\n if (\n v === \"square\" || v === \"circle\" || v === \"diamond\" ||\n v === \"triangle\" || v === \"triangle-down\"\n ) {\n individual.shape = v;\n } else {\n throw new ParseError(\n `Invalid shape '${value}'. Valid: square, circle, diamond, triangle, triangle-down`,\n lineNum, 1, lineText\n );\n }\n } else {\n if (!individual.properties) individual.properties = {};\n individual.properties[key] = value;\n }\n } else {\n throw new ParseError(\n `Unknown property '${token}'. Valid: male, female, unknown, deceased, stillborn, miscarriage, abortion, adopted, foster, guardian, twin-identical, twin-fraternal, index, unknown-siblings, a 4-digit year, conditions:..., age:N, death:YYYY, label:\"...\", sibling-of:ID, or key:value`,\n lineNum,\n 1,\n lineText\n );\n }\n }\n\n return individual;\n}\n\nfunction parseConditions(\n raw: string,\n lineNum: number,\n lineText: string\n): Condition[] {\n const parts = raw.split(\"+\").map((s) => s.trim());\n const conditions: Condition[] = [];\n\n for (const part of parts) {\n const match = part.match(/^([a-zA-Z0-9_-]+)\\(([^)]+)\\)$/);\n if (!match) {\n throw new ParseError(\n `Invalid condition format '${part}'. Expected: name(fill) or name(fill, #color)`,\n lineNum,\n 1,\n lineText\n );\n }\n const [, label, innerRaw] = match;\n const innerParts = innerRaw.split(\",\").map((s) => s.trim());\n const fill = innerParts[0];\n const color = innerParts[1]; // optional\n\n if (!VALID_FILLS.has(fill)) {\n throw new ParseError(\n `Invalid fill pattern '${fill}'. Valid: full, half-left, half-right, half-top, half-bottom, quad-tl, quad-tr, quad-bl, quad-br, quarter, striped, dotted`,\n lineNum,\n 1,\n lineText\n );\n }\n const cond: Condition = { label, fill: fill as ConditionFill };\n if (color) cond.color = color;\n conditions.push(cond);\n }\n\n return conditions;\n}\n\n/**\n * Merge a redeclaration into an existing individual.\n *\n * Rule: defaults (`sex: \"unknown\"`, `status: \"alive\"`, label === id) yield to\n * any non-default value from the other side. Two conflicting non-default\n * values (e.g. sex declared as both `male` and `female`) raise ParseError —\n * silent data loss is the bug we're fixing here.\n */\nfunction mergeIndividual(\n existing: Individual,\n incoming: Individual,\n lineNum: number,\n lineText: string\n): Individual {\n // Sex conflict detection (defaults pass through silently)\n let mergedSex = existing.sex;\n if (incoming.sex !== \"unknown\") {\n if (existing.sex !== \"unknown\" && existing.sex !== incoming.sex) {\n throw new ParseError(\n `Conflicting sex for '${existing.id}': previously '${existing.sex}', now '${incoming.sex}'`,\n lineNum,\n 1,\n lineText\n );\n }\n mergedSex = incoming.sex;\n }\n\n let mergedStatus = existing.status;\n if (incoming.status !== \"alive\") {\n if (existing.status !== \"alive\" && existing.status !== incoming.status) {\n throw new ParseError(\n `Conflicting status for '${existing.id}': previously '${existing.status}', now '${incoming.status}'`,\n lineNum,\n 1,\n lineText\n );\n }\n mergedStatus = incoming.status;\n }\n\n if (\n incoming.birthYear !== undefined &&\n existing.birthYear !== undefined &&\n incoming.birthYear !== existing.birthYear\n ) {\n throw new ParseError(\n `Conflicting birth year for '${existing.id}': previously ${existing.birthYear}, now ${incoming.birthYear}`,\n lineNum,\n 1,\n lineText\n );\n }\n if (\n incoming.deathYear !== undefined &&\n existing.deathYear !== undefined &&\n incoming.deathYear !== existing.deathYear\n ) {\n throw new ParseError(\n `Conflicting death year for '${existing.id}': previously ${existing.deathYear}, now ${incoming.deathYear}`,\n lineNum,\n 1,\n lineText\n );\n }\n\n // Label: incoming overrides only if it's not the default (id-derived)\n const incomingHasExplicitLabel =\n incoming.label !== incoming.id && incoming.label !== \"\";\n const existingHasExplicitLabel =\n existing.label !== existing.id && existing.label !== \"\";\n const mergedLabel = incomingHasExplicitLabel\n ? incoming.label\n : existingHasExplicitLabel\n ? existing.label\n : existing.label;\n\n // Markers: union (preserve set semantics)\n const mergedMarkers = mergeArrayUnique(existing.markers, incoming.markers);\n\n return {\n ...existing,\n sex: mergedSex,\n status: mergedStatus,\n label: mergedLabel,\n birthYear: incoming.birthYear ?? existing.birthYear,\n deathYear: incoming.deathYear ?? existing.deathYear,\n age: incoming.age ?? existing.age,\n conditions: incoming.conditions ?? existing.conditions,\n heritage: incoming.heritage ?? existing.heritage,\n siblingOf: incoming.siblingOf ?? existing.siblingOf,\n markers: mergedMarkers,\n properties: {\n ...existing.properties,\n ...incoming.properties,\n },\n };\n}\n\nfunction mergeArrayUnique<T>(\n a: T[] | undefined,\n b: T[] | undefined\n): T[] | undefined {\n if (!a && !b) return undefined;\n const seen = new Set<T>();\n const out: T[] = [];\n for (const v of [...(a ?? []), ...(b ?? [])]) {\n if (!seen.has(v)) {\n seen.add(v);\n out.push(v);\n }\n }\n return out.length ? out : undefined;\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Internal types ─────────────────────────────────────────\n\ninterface FamilyUnit {\n id: string;\n partners: [string, string];\n relationship: RelationshipType;\n label?: string;\n children: string[];\n}\n\ninterface LayoutGraph {\n individuals: Map<string, Individual>;\n familyUnits: FamilyUnit[];\n generations: Map<string, number>;\n childOf: Map<string, string>; // childId → familyUnitId\n}\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function layoutGenogram(\n ast: DiagramAST,\n config: LayoutConfig\n): LayoutResult {\n const graph = buildGraph(ast);\n assignGenerations(graph);\n const ordered = orderNodesInGenerations(graph, config);\n const positions = assignPositions(ordered, graph, config);\n const edges = computeEdges(graph, positions, config);\n const secondaryEdges = computeSecondaryParentEdges(\n ast.relationships,\n graph,\n positions,\n config\n );\n const emotionalEdges = computeEmotionalEdges(ast.relationships, positions, config);\n return packageResult(\n positions,\n [...edges, ...secondaryEdges, ...emotionalEdges],\n graph,\n config\n );\n}\n\n// ─── Step 1: Build graph ────────────────────────────────────\n\nfunction buildGraph(ast: DiagramAST): LayoutGraph {\n const individuals = new Map<string, Individual>();\n for (const ind of ast.individuals) {\n individuals.set(ind.id, ind);\n }\n\n const familyUnits: FamilyUnit[] = [];\n const childOf = new Map<string, string>();\n\n // Collect couple relationships and their children\n const coupleRels = ast.relationships.filter(\n (r) =>\n r.type === \"married\" ||\n r.type === \"divorced\" ||\n r.type === \"separated\" ||\n r.type === \"engaged\" ||\n r.type === \"cohabiting\" ||\n r.type === \"cohabiting-ended\" ||\n r.type === \"consanguineous\"\n );\n\n for (const rel of coupleRels) {\n const fuId = `${rel.from}+${rel.to}`;\n\n // Order partners: male left, female right\n const indA = individuals.get(rel.from);\n const indB = individuals.get(rel.to);\n let partners: [string, string];\n\n if (indA && indB) {\n if (indA.sex === \"male\" && indB.sex === \"female\") {\n partners = [rel.from, rel.to];\n } else if (indA.sex === \"female\" && indB.sex === \"male\") {\n partners = [rel.to, rel.from];\n } else {\n // Same sex or unknown: older left\n const yearA = indA.birthYear ?? 9999;\n const yearB = indB.birthYear ?? 9999;\n partners = yearA <= yearB ? [rel.from, rel.to] : [rel.to, rel.from];\n }\n } else {\n partners = [rel.from, rel.to];\n }\n\n // Find children for this family unit. Skip *secondary* parent-child rels\n // (foster/adopted \"current caregiver\" links): they are data-true but must\n // not dominate layout — the bio couple keeps the child structurally.\n const children: string[] = [];\n for (const r of ast.relationships) {\n if (\n (r.type === \"parent-child\" ||\n r.type === \"adopted\" ||\n r.type === \"foster\") &&\n r.from === fuId &&\n !r.secondary\n ) {\n children.push(r.to);\n childOf.set(r.to, fuId);\n }\n }\n\n // Sort children by birth year\n children.sort((a, b) => {\n const indChildA = individuals.get(a);\n const indChildB = individuals.get(b);\n return (indChildA?.birthYear ?? 9999) - (indChildB?.birthYear ?? 9999);\n });\n\n familyUnits.push({\n id: fuId,\n partners,\n relationship: rel.type,\n label: rel.label,\n children,\n });\n }\n\n return { individuals, familyUnits, generations: new Map(), childOf };\n}\n\n// ─── Step 2: Assign generations ─────────────────────────────\n\nfunction assignGenerations(graph: LayoutGraph): void {\n const { individuals, familyUnits, childOf, generations } = graph;\n\n // Find roots: individuals not a child of any family unit AND not anchored\n // via siblingOf to another individual (those will be placed in step 2).\n const allIds = Array.from(individuals.keys());\n const roots = allIds.filter((id) => {\n if (childOf.has(id)) return false;\n const ind = individuals.get(id);\n if (ind?.siblingOf) return false;\n return true;\n });\n\n if (roots.length === 0 && allIds.length > 0) {\n // Fallback: everyone is generation 0\n for (const id of allIds) generations.set(id, 0);\n return;\n }\n\n // BFS from roots\n for (const root of roots) {\n if (!generations.has(root)) {\n generations.set(root, 0);\n }\n }\n\n // Propagate through family units\n let changed = true;\n while (changed) {\n changed = false;\n for (const fu of familyUnits) {\n // Ensure partners are same generation\n const gen0 = generations.get(fu.partners[0]);\n const gen1 = generations.get(fu.partners[1]);\n\n let partnerGen: number;\n if (gen0 !== undefined && gen1 !== undefined) {\n partnerGen = Math.max(gen0, gen1);\n if (gen0 !== partnerGen) {\n generations.set(fu.partners[0], partnerGen);\n changed = true;\n }\n if (gen1 !== partnerGen) {\n generations.set(fu.partners[1], partnerGen);\n changed = true;\n }\n } else if (gen0 !== undefined) {\n partnerGen = gen0;\n generations.set(fu.partners[1], partnerGen);\n changed = true;\n } else if (gen1 !== undefined) {\n partnerGen = gen1;\n generations.set(fu.partners[0], partnerGen);\n changed = true;\n } else {\n continue;\n }\n\n // Children are one generation below\n for (const childId of fu.children) {\n const childGen = partnerGen + 1;\n const existing = generations.get(childId);\n if (existing === undefined || existing < childGen) {\n generations.set(childId, childGen);\n changed = true;\n }\n }\n }\n }\n\n // Resolve siblingOf anchors — copy generation from the referenced sibling.\n // Iterate to fixed point in case of chains (siblingOf → siblingOf).\n let siblingChanged = true;\n let safety = 0;\n while (siblingChanged && safety++ < allIds.length + 1) {\n siblingChanged = false;\n for (const id of allIds) {\n if (generations.has(id)) continue;\n const ind = individuals.get(id);\n if (!ind?.siblingOf) continue;\n const refGen = generations.get(ind.siblingOf);\n if (refGen !== undefined) {\n generations.set(id, refGen);\n siblingChanged = true;\n }\n }\n }\n\n // Assign any remaining unvisited individuals to generation 0\n for (const id of allIds) {\n if (!generations.has(id)) {\n generations.set(id, 0);\n }\n }\n}\n\n// ─── Step 3: Order nodes within generations ─────────────────\n\ninterface OrderedGeneration {\n index: number;\n nodeIds: string[];\n}\n\nfunction orderNodesInGenerations(\n graph: LayoutGraph,\n _config: LayoutConfig\n): OrderedGeneration[] {\n const { generations, familyUnits } = graph;\n\n // Group by generation\n const genGroups = new Map<number, string[]>();\n for (const [id, gen] of generations) {\n const group = genGroups.get(gen) ?? [];\n group.push(id);\n genGroups.set(gen, group);\n }\n\n const genIndices = Array.from(genGroups.keys()).sort((a, b) => a - b);\n const result: OrderedGeneration[] = [];\n\n for (const genIdx of genIndices) {\n const nodeIds = genGroups.get(genIdx) ?? [];\n\n // Build ordering based on family unit structure\n const ordered = orderGeneration(nodeIds, genIdx, graph, familyUnits);\n result.push({ index: genIdx, nodeIds: ordered });\n }\n\n return result;\n}\n\nfunction orderGeneration(\n nodeIds: string[],\n _genIdx: number,\n graph: LayoutGraph,\n familyUnits: FamilyUnit[]\n): string[] {\n if (nodeIds.length <= 1) return [...nodeIds];\n\n const nodeSet = new Set(nodeIds);\n const placed = new Set<string>();\n const ordered: string[] = [];\n\n const fuInGen = familyUnits.filter(\n (fu) => nodeSet.has(fu.partners[0]) || nodeSet.has(fu.partners[1])\n );\n\n // Build adjacency: which family units does each person belong to?\n const personToFUs = new Map<string, FamilyUnit[]>();\n for (const fu of fuInGen) {\n for (const p of fu.partners) {\n if (nodeSet.has(p)) {\n const arr = personToFUs.get(p) ?? [];\n arr.push(fu);\n personToFUs.set(p, arr);\n }\n }\n }\n\n // Place a person and recursively expand their family units\n function placePersonAndExpand(id: string): void {\n if (placed.has(id)) return;\n ordered.push(id);\n placed.add(id);\n\n // Expand all family units this person is in\n const fus = personToFUs.get(id) ?? [];\n // Sort: divorced/separated first (left side), current marriage last (right)\n const sortedFUs = [...fus].sort((a, b) => {\n const scoreA = a.relationship === \"divorced\" || a.relationship === \"separated\" ? 0 : 1;\n const scoreB = b.relationship === \"divorced\" || b.relationship === \"separated\" ? 0 : 1;\n return scoreA - scoreB;\n });\n\n for (const fu of sortedFUs) {\n const partner = fu.partners[0] === id ? fu.partners[1] : fu.partners[0];\n if (!placed.has(partner) && nodeSet.has(partner)) {\n ordered.push(partner);\n placed.add(partner);\n // Recursively expand partner's other relationships\n const partnerFUs = personToFUs.get(partner) ?? [];\n for (const pfu of partnerFUs) {\n if (pfu.id !== fu.id) {\n const otherPartner = pfu.partners[0] === partner ? pfu.partners[1] : pfu.partners[0];\n placePersonAndExpand(otherPartner);\n }\n }\n }\n }\n }\n\n // Start by processing family units — expand connected clusters\n for (const fu of fuInGen) {\n if (!placed.has(fu.partners[0]) && nodeSet.has(fu.partners[0])) {\n placePersonAndExpand(fu.partners[0]);\n }\n if (!placed.has(fu.partners[1]) && nodeSet.has(fu.partners[1])) {\n placePersonAndExpand(fu.partners[1]);\n }\n }\n\n // Place remaining unpartnered individuals. Sibling-of anchors get inserted\n // immediately adjacent to their referenced sibling so the dashed bracket\n // stays short. Everyone else falls back to birth-year sort.\n const remaining = nodeIds.filter((id) => !placed.has(id));\n const siblingOfRemaining = remaining.filter((id) => {\n const ind = graph.individuals.get(id);\n return ind?.siblingOf && placed.has(ind.siblingOf);\n });\n const otherRemaining = remaining.filter(\n (id) => !siblingOfRemaining.includes(id)\n );\n otherRemaining.sort((a, b) => {\n const indA = graph.individuals.get(a);\n const indB = graph.individuals.get(b);\n return (indA?.birthYear ?? 9999) - (indB?.birthYear ?? 9999);\n });\n for (const id of otherRemaining) {\n ordered.push(id);\n placed.add(id);\n }\n // Insert each sibling-of node right after its referenced sibling.\n for (const id of siblingOfRemaining) {\n const ind = graph.individuals.get(id);\n if (!ind?.siblingOf) continue;\n const refIdx = ordered.indexOf(ind.siblingOf);\n if (refIdx === -1) {\n ordered.push(id);\n } else {\n ordered.splice(refIdx + 1, 0, id);\n }\n placed.add(id);\n }\n\n return ordered;\n}\n\n// ─── Step 4 & 5: Assign X/Y positions ──────────────────────\n\ninterface NodePosition {\n id: string;\n x: number;\n y: number;\n generation: number;\n}\n\nconst LABEL_HEIGHT = 20;\nconst LABEL_GAP = 6;\n\nfunction assignPositions(\n orderedGens: OrderedGeneration[],\n graph: LayoutGraph,\n config: LayoutConfig\n): Map<string, NodePosition> {\n const positions = new Map<string, NodePosition>();\n const { nodeWidth, nodeSpacingX } = config;\n const half = nodeWidth / 2;\n // Couple gap = space between two partner centers (node edge to edge + line)\n const coupleGap = nodeWidth + nodeSpacingX * 0.6;\n // Family gap = space between separate family units\n const familyGap = nodeWidth + nodeSpacingX * 1.5;\n // Generation Y spacing = node height + label space + vertical gap\n const genStepY = config.nodeHeight + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY;\n\n // Pass 1: Initial placement based on generation ordering\n for (const gen of orderedGens) {\n const y = gen.index * genStepY + half;\n const segments = buildSegments(gen.nodeIds, gen.index, graph);\n\n let xCursor = half;\n for (let s = 0; s < segments.length; s++) {\n const seg = segments[s];\n if (s > 0) xCursor += familyGap;\n\n if (seg.type === \"couple\") {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n xCursor += coupleGap;\n positions.set(seg.ids[1], { id: seg.ids[1], x: xCursor, y, generation: gen.index });\n } else {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n }\n }\n }\n\n // Pass 2: Resolve overlaps (before centering, so centering uses final positions)\n resolveOverlaps(positions, orderedGens, config, graph);\n\n // Pass 3: Center children under parents (and drag partners)\n centerChildrenUnderParents(positions, graph, config);\n\n // Pass 3b: Unscramble interleaved sibships (Case A — cousins from different couples).\n unscrambleSibships(positions, graph, config);\n\n // Pass 4: Resolve any new overlaps introduced by centering\n resolveOverlaps(positions, orderedGens, config, graph);\n\n return positions;\n}\n\ninterface Segment {\n type: \"couple\" | \"single\";\n ids: string[];\n fuId?: string;\n}\n\nfunction buildSegments(\n nodeIds: string[],\n _genIdx: number,\n graph: LayoutGraph\n): Segment[] {\n const nodeSet = new Set(nodeIds);\n\n // Find multi-married individuals first\n const personFUs = new Map<string, FamilyUnit[]>();\n for (const fu of graph.familyUnits) {\n if (nodeSet.has(fu.partners[0]) && nodeSet.has(fu.partners[1])) {\n for (const p of fu.partners) {\n const arr = personFUs.get(p) ?? [];\n arr.push(fu);\n personFUs.set(p, arr);\n }\n }\n }\n\n const multiMarried = new Set<string>();\n for (const [id, fus] of personFUs) {\n if (fus.length > 1) multiMarried.add(id);\n }\n\n const segments: Segment[] = [];\n const placed = new Set<string>();\n\n for (const id of nodeIds) {\n if (placed.has(id)) continue;\n\n // Multi-married: place as couple chain (ex-partner, SHARED, current-partner)\n if (multiMarried.has(id)) {\n const fus = personFUs.get(id) ?? [];\n const sorted = [...fus].sort((a, b) => {\n const sa = a.relationship === \"divorced\" || a.relationship === \"separated\" ? 0 : 1;\n const sb = b.relationship === \"divorced\" || b.relationship === \"separated\" ? 0 : 1;\n return sa - sb;\n });\n\n for (const fu of sorted) {\n const partner = fu.partners[0] === id ? fu.partners[1] : fu.partners[0];\n if (!placed.has(partner)) {\n // For first (ex) partner: place partner first, then shared person\n // For subsequent partners: shared already placed, place partner after\n if (!placed.has(id)) {\n segments.push({ type: \"couple\", ids: [partner, id], fuId: fu.id });\n placed.add(partner);\n placed.add(id);\n } else {\n segments.push({ type: \"couple\", ids: [id, partner], fuId: fu.id });\n placed.add(partner);\n }\n }\n }\n if (!placed.has(id)) {\n segments.push({ type: \"single\", ids: [id] });\n placed.add(id);\n }\n continue;\n }\n\n // Regular: check if part of a couple\n const fu = graph.familyUnits.find(\n (f) =>\n (f.partners[0] === id || f.partners[1] === id) &&\n !placed.has(f.partners[0]) &&\n !placed.has(f.partners[1]) &&\n nodeSet.has(f.partners[0]) &&\n nodeSet.has(f.partners[1])\n );\n\n if (fu) {\n segments.push({\n type: \"couple\",\n ids: [fu.partners[0], fu.partners[1]],\n fuId: fu.id,\n });\n placed.add(fu.partners[0]);\n placed.add(fu.partners[1]);\n } else {\n segments.push({ type: \"single\", ids: [id] });\n placed.add(id);\n }\n }\n\n return segments;\n}\n\nfunction centerChildrenUnderParents(\n positions: Map<string, NodePosition>,\n graph: LayoutGraph,\n config: LayoutConfig\n): void {\n const coupleGap = config.nodeSpacingX + config.nodeWidth;\n\n // Build a lookup: personId → family units they're a partner in\n const personToFUs = new Map<string, FamilyUnit[]>();\n for (const fu of graph.familyUnits) {\n for (const p of fu.partners) {\n const arr = personToFUs.get(p) ?? [];\n arr.push(fu);\n personToFUs.set(p, arr);\n }\n }\n\n // Multiple passes to propagate constraints\n for (let pass = 0; pass < 3; pass++) {\n for (const fu of graph.familyUnits) {\n if (fu.children.length === 0) continue;\n\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const parentMidX = (posA.x + posB.x) / 2;\n\n // Re-space children evenly under parent midpoint\n const sortedChildren = [...fu.children].sort((a, b) => {\n const indA = graph.individuals.get(a);\n const indB = graph.individuals.get(b);\n return (indA?.birthYear ?? 9999) - (indB?.birthYear ?? 9999);\n });\n\n const childSpacing = config.nodeSpacingX + config.nodeWidth;\n if (sortedChildren.length > 1) {\n // Calculate per-gap spacing: add room for married-in spouses\n const gaps: number[] = [];\n for (let gi = 0; gi < sortedChildren.length - 1; gi++) {\n let gap = childSpacing;\n\n // If the RIGHT child has a spouse placed to their LEFT\n const nextChild = sortedChildren[gi + 1];\n const nextFUs = personToFUs.get(nextChild) ?? [];\n for (const cfu of nextFUs) {\n const pid = cfu.partners[0] === nextChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(nextChild);\n const pInd = graph.individuals.get(pid);\n if (!(cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\"))) {\n gap += coupleGap;\n }\n }\n\n // If the LEFT child has a spouse placed to their RIGHT\n const currChild = sortedChildren[gi];\n const currFUs = personToFUs.get(currChild) ?? [];\n for (const cfu of currFUs) {\n const pid = cfu.partners[0] === currChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(currChild);\n const pInd = graph.individuals.get(pid);\n if (cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\")) {\n gap += coupleGap;\n }\n }\n\n gaps.push(gap);\n }\n\n const totalWidth = gaps.reduce((s, g) => s + g, 0);\n const startX = parentMidX - totalWidth / 2;\n let cx = startX;\n for (let i = 0; i < sortedChildren.length; i++) {\n const pos = positions.get(sortedChildren[i]);\n if (pos) pos.x = cx;\n if (i < gaps.length) cx += gaps[i];\n }\n } else {\n const pos = positions.get(sortedChildren[0]);\n if (pos) pos.x = parentMidX;\n }\n\n // After placing children, if any child is also a partner in another\n // couple, drag that partner along to maintain couple gap\n for (const childId of fu.children) {\n const childPos = positions.get(childId);\n if (!childPos) continue;\n const childFUs = personToFUs.get(childId) ?? [];\n for (const childFU of childFUs) {\n const partnerId =\n childFU.partners[0] === childId\n ? childFU.partners[1]\n : childFU.partners[0];\n const partnerPos = positions.get(partnerId);\n if (!partnerPos) continue;\n // Keep partner at couple gap distance, on the correct side\n const childInd = graph.individuals.get(childId);\n const partnerInd = graph.individuals.get(partnerId);\n if (childInd?.sex === \"male\" || (childInd?.sex !== \"female\" && partnerInd?.sex === \"female\")) {\n partnerPos.x = childPos.x + coupleGap;\n } else {\n partnerPos.x = childPos.x - coupleGap;\n }\n }\n }\n }\n }\n}\n\n/** Re-lay each sibship as a contiguous block with `familyGap` between, so cousins don't interleave (Case A). */\nfunction unscrambleSibships(\n positions: Map<string, NodePosition>,\n graph: LayoutGraph,\n config: LayoutConfig\n): void {\n const familyGap = config.nodeWidth + config.nodeSpacingX * 1.5;\n const childSpacing = config.nodeWidth + config.nodeSpacingX;\n\n const byGen = new Map<number, string[]>();\n for (const [id, pos] of positions) {\n const arr = byGen.get(pos.generation) ?? [];\n arr.push(id);\n byGen.set(pos.generation, arr);\n }\n\n for (const [, ids] of byGen) {\n const sibshipMap = new Map<string, string[]>();\n for (const id of ids) {\n const fu = graph.childOf.get(id);\n if (!fu) continue;\n const arr = sibshipMap.get(fu) ?? [];\n arr.push(id);\n sibshipMap.set(fu, arr);\n }\n if (sibshipMap.size <= 1) continue;\n\n const sibships = [...sibshipMap.entries()]\n .map(([fuId, children]) => {\n const fu = graph.familyUnits.find((f) => f.id === fuId);\n if (!fu) return null;\n const pa = positions.get(fu.partners[0]);\n const pb = positions.get(fu.partners[1]);\n if (!pa || !pb) return null;\n return { fuId, children, midX: (pa.x + pb.x) / 2 };\n })\n .filter((x): x is { fuId: string; children: string[]; midX: number } => x !== null)\n .sort((a, b) => a.midX - b.midX);\n\n let cursor: number | null = null;\n for (const ss of sibships) {\n const sortedKids = [...ss.children].sort((a, b) => {\n const ya = graph.individuals.get(a)?.birthYear ?? 9999;\n const yb = graph.individuals.get(b)?.birthYear ?? 9999;\n return ya - yb;\n });\n\n const totalWidth = Math.max(0, (sortedKids.length - 1) * childSpacing);\n let startX = ss.midX - totalWidth / 2;\n if (cursor !== null && startX < cursor) startX = cursor;\n\n for (let i = 0; i < sortedKids.length; i++) {\n const pos = positions.get(sortedKids[i]);\n if (pos) pos.x = startX + i * childSpacing;\n }\n cursor = startX + totalWidth + familyGap;\n }\n }\n}\n\nfunction resolveOverlaps(\n positions: Map<string, NodePosition>,\n orderedGens: OrderedGeneration[],\n config: LayoutConfig,\n graph?: LayoutGraph\n): void {\n const minGap = config.nodeWidth + config.nodeSpacingX;\n // Cousins from different couples need wider visual separation than siblings.\n const familyGap = config.nodeWidth + config.nodeSpacingX * 1.5;\n\n // Cluster = childOf family unit; spouses inherit from their partner.\n const cluster = new Map<string, string>();\n if (graph) {\n for (const [id] of positions) {\n const fu = graph.childOf.get(id);\n if (fu) cluster.set(id, fu);\n }\n for (const fu of graph.familyUnits) {\n for (const p of fu.partners) {\n if (cluster.has(p)) continue;\n const other = fu.partners[0] === p ? fu.partners[1] : fu.partners[0];\n const otherCluster = cluster.get(other);\n if (otherCluster) cluster.set(p, otherCluster);\n }\n }\n }\n\n for (const gen of orderedGens) {\n const genNodes = gen.nodeIds\n .map((id) => positions.get(id))\n .filter((p): p is NodePosition => p !== undefined);\n\n genNodes.sort((a, b) => a.x - b.x);\n\n for (let i = 1; i < genNodes.length; i++) {\n const prev = genNodes[i - 1];\n const cur = genNodes[i];\n const cPrev = cluster.get(prev.id);\n const cCur = cluster.get(cur.id);\n const required = cPrev && cCur && cPrev !== cCur ? familyGap : minGap;\n const gap = cur.x - prev.x;\n if (gap < required) {\n const shift = required - gap;\n for (let j = i; j < genNodes.length; j++) {\n genNodes[j].x += shift;\n }\n }\n }\n }\n\n // Ensure no negative x positions\n let minX = Infinity;\n for (const pos of positions.values()) {\n if (pos.x < minX) minX = pos.x;\n }\n if (minX < config.nodeWidth / 2) {\n const shift = config.nodeWidth / 2 - minX;\n for (const pos of positions.values()) {\n pos.x += shift;\n }\n }\n}\n\n// ─── Step 6: Compute edge paths ─────────────────────────────\n\nfunction computeEdges(\n graph: LayoutGraph,\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeWidth / 2;\n const dropY_offset = config.nodeHeight / 2 + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY * 0.35;\n\n for (const fu of graph.familyUnits) {\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const leftPos = posA.x < posB.x ? posA : posB;\n const rightPos = posA.x < posB.x ? posB : posA;\n const leftId = posA.x < posB.x ? fu.partners[0] : fu.partners[1];\n const rightId = posA.x < posB.x ? fu.partners[1] : fu.partners[0];\n\n // Couple line: edge-to-edge\n const coupleRel: Relationship = {\n type: fu.relationship,\n from: leftId,\n to: rightId,\n label: fu.label,\n };\n const couplePath = `M ${leftPos.x + half} ${leftPos.y} L ${rightPos.x - half} ${rightPos.y}`;\n edges.push({\n from: leftId,\n to: rightId,\n relationship: coupleRel,\n path: couplePath,\n });\n\n // Parent-child connections\n if (fu.children.length > 0) {\n const midX = (posA.x + posB.x) / 2;\n const coupleY = posA.y;\n const dropY = coupleY + dropY_offset;\n\n const childPositions = fu.children\n .map((cid) => ({\n id: cid,\n pos: positions.get(cid),\n }))\n .filter(\n (c): c is { id: string; pos: NodePosition } => c.pos !== undefined\n );\n\n if (childPositions.length === 0) continue;\n\n childPositions.sort((a, b) => a.pos.x - b.pos.x);\n\n const leftX = childPositions[0].pos.x;\n const rightX = childPositions[childPositions.length - 1].pos.x;\n\n // Drop line from couple midpoint\n const dropPath = `M ${midX} ${coupleY} L ${midX} ${dropY}`;\n edges.push({\n from: fu.partners[0],\n to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_drop\" },\n path: dropPath,\n });\n\n // Sibship line (horizontal). Extend to include midX so the parent\n // drop line always lands on the bar — needed when a child is also a\n // partner in another union and gets pulled outside the [leftX, rightX]\n // range of their siblings.\n if (childPositions.length > 1) {\n const sibLeft = Math.min(leftX, midX);\n const sibRight = Math.max(rightX, midX);\n const sibPath = `M ${sibLeft} ${dropY} L ${sibRight} ${dropY}`;\n edges.push({\n from: fu.partners[0],\n to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_sibship\" },\n path: sibPath,\n });\n }\n\n // Vertical lines from sibship to each child\n for (const child of childPositions) {\n const childTop = child.pos.y - config.nodeHeight / 2;\n let childPath: string;\n if (childPositions.length === 1) {\n if (Math.abs(child.pos.x - midX) < 1) {\n childPath = `M ${midX} ${coupleY} L ${midX} ${childTop}`;\n } else {\n childPath = `M ${midX} ${dropY} L ${child.pos.x} ${dropY} L ${child.pos.x} ${childTop}`;\n }\n } else {\n childPath = `M ${child.pos.x} ${dropY} L ${child.pos.x} ${childTop}`;\n }\n\n const pcRel = findParentChildRel(graph, fu.id, child.id);\n edges.push({\n from: fu.id,\n to: child.id,\n relationship: pcRel ?? {\n type: \"parent-child\",\n from: fu.id,\n to: child.id,\n },\n path: childPath,\n });\n }\n }\n }\n\n return edges;\n}\n\nfunction findParentChildRel(\n graph: LayoutGraph,\n _fuId: string,\n childId: string\n): Relationship | undefined {\n // Find from original family unit mapping\n const fuId = graph.childOf.get(childId);\n if (!fuId) return undefined;\n return {\n type: \"parent-child\",\n from: fuId,\n to: childId,\n };\n}\n\n// ─── Step 7: Package result ─────────────────────────────────\n\nfunction packageResult(\n positions: Map<string, NodePosition>,\n edges: LayoutEdge[],\n graph: LayoutGraph,\n config: LayoutConfig\n): LayoutResult {\n const padding = 40;\n const nodes: LayoutNode[] = [];\n\n for (const [id, pos] of positions) {\n const ind = graph.individuals.get(id);\n if (!ind) continue;\n\n nodes.push({\n id,\n x: pos.x - config.nodeWidth / 2 + padding,\n y: pos.y - config.nodeHeight / 2 + padding,\n width: config.nodeWidth,\n height: config.nodeHeight,\n generation: pos.generation,\n individual: ind,\n });\n }\n\n // Shift edges by padding\n const shiftedEdges = edges.map((e) => ({\n ...e,\n path: shiftPath(e.path, padding, padding),\n }));\n\n let maxX = 0;\n let maxY = 0;\n let minX = Infinity;\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const labelText = estimateLabelText(node.individual);\n const labelHalfWidth = labelText.length * 3.8;\n const right = Math.max(node.x + node.width, cx + labelHalfWidth);\n const left = Math.min(node.x, cx - labelHalfWidth);\n const bottom = node.y + node.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n if (left < minX) minX = left;\n }\n\n // If labels extend beyond left edge, shift everything right\n if (minX < 0) {\n const shift = -minX;\n for (const node of nodes) {\n node.x += shift;\n }\n for (const edge of shiftedEdges) {\n edge.path = shiftPath(edge.path, shift, 0);\n }\n maxX += shift;\n }\n\n return {\n width: maxX + padding,\n height: maxY + padding + LABEL_GAP + LABEL_HEIGHT + 10,\n nodes,\n edges: shiftedEdges,\n };\n}\n\nfunction estimateLabelText(ind: Individual): string {\n const name = ind.label || ind.id;\n if (ind.birthYear && ind.deathYear) return `${name} (${ind.birthYear}–${ind.deathYear})`;\n if (ind.birthYear) return `${name} (b. ${ind.birthYear})`;\n return name;\n}\n\n// ─── Emotional relationship edges ───────────────────────────\n\nconst EMOTIONAL_REL_TYPES = new Set([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\nfunction computeEmotionalEdges(\n relationships: Relationship[],\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeWidth / 2;\n\n const emotionalRels = relationships.filter(r => EMOTIONAL_REL_TYPES.has(r.type));\n\n for (const rel of emotionalRels) {\n const posA = positions.get(rel.from);\n const posB = positions.get(rel.to);\n if (!posA || !posB) continue;\n\n // Use raw positions (no padding) — packageResult will shift\n const ax = posA.x;\n const ay = posA.y;\n const bx = posB.x;\n const by = posB.y;\n\n let pathData: string;\n\n if (posA.generation === posB.generation) {\n // Same generation: curved path below nodes\n const midX = (ax + bx) / 2;\n const curveY = ay + half + 30;\n pathData = `M ${ax} ${ay + half} Q ${midX} ${curveY} ${bx} ${by + half}`;\n } else {\n // Cross-generation: curved path to the side\n const midY = (ay + by) / 2;\n const maxX = Math.max(ax, bx);\n const curveX = maxX + half + 30;\n pathData = `M ${ax} ${ay} Q ${curveX} ${midY} ${bx} ${by}`;\n }\n\n edges.push({\n from: rel.from,\n to: rel.to,\n relationship: rel,\n path: pathData,\n });\n }\n\n return edges;\n}\n\n// ─── Secondary parent-child edges (foster/adopted \"current caregiver\") ──\n\nfunction computeSecondaryParentEdges(\n relationships: Relationship[],\n graph: LayoutGraph,\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeHeight / 2;\n\n for (const rel of relationships) {\n if (!rel.secondary) continue;\n if (\n rel.type !== \"parent-child\" &&\n rel.type !== \"foster\" &&\n rel.type !== \"adopted\"\n )\n continue;\n\n // Resolve couple key \"leftId+rightId\" → midpoint of the two partners\n const fu = graph.familyUnits.find((f) => f.id === rel.from);\n if (!fu) continue;\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n const childPos = positions.get(rel.to);\n if (!posA || !posB || !childPos) continue;\n\n const coupleMidX = (posA.x + posB.x) / 2;\n const coupleY = posA.y;\n // Anchor on the bottom edge of the couple line, route to top of child\n const startX = coupleMidX;\n const startY = coupleY + half + 4;\n const childTopY = childPos.y - half - 4;\n\n // Manhattan-style routing so the dotted line is unambiguous, even when\n // the foster couple sits on a different generation than the bio child.\n const path =\n childPos.y === coupleY\n ? `M ${startX} ${startY} L ${startX} ${startY + 16} L ${childPos.x} ${\n startY + 16\n } L ${childPos.x} ${childPos.y - half - 4}`\n : `M ${startX} ${startY} L ${startX} ${\n (startY + childTopY) / 2\n } L ${childPos.x} ${(startY + childTopY) / 2} L ${childPos.x} ${childTopY}`;\n\n edges.push({\n from: rel.from,\n to: rel.to,\n relationship: rel,\n path,\n });\n }\n\n return edges;\n}\n\nfunction shiftPath(pathData: string, dx: number, dy: number): string {\n // Shift all coordinate pairs in the path\n return pathData.replace(\n /([\\d.-]+)\\s+([\\d.-]+)/g,\n (_match, xStr: string, yStr: string) => {\n const x = parseFloat(xStr) + dx;\n const y = parseFloat(yStr) + dy;\n return `${x} ${y}`;\n }\n );\n}\n","import type { Individual, Condition } from \"../../core/types\";\nimport {\n el,\n group,\n rect,\n circle,\n polygon,\n line,\n text,\n title,\n defs,\n pattern,\n path,\n} from \"../../core/svg\";\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderIndividualSymbol(\n individual: Individual,\n x: number,\n y: number,\n size: number\n): string {\n const half = size / 2;\n const classes = [\n \"schematex-genogram-node\",\n `schematex-genogram-${individual.sex === \"other\" ? \"unknown\" : individual.sex}`,\n ];\n if (individual.status === \"deceased\") classes.push(\"schematex-genogram-deceased\");\n\n const titleText = formatTitle(individual);\n const children: string[] = [title(titleText)];\n\n // Index person: outer gold border (concentric shape, slightly larger)\n const isIndex = individual.markers?.includes(\"index-person\");\n if (isIndex) {\n children.push(indexBorder(individual.sex, half));\n classes.push(\"schematex-genogram-index-person\");\n }\n\n // Base shape\n children.push(baseShape(individual.sex, half, individual.shape));\n\n // Condition fills\n if (individual.conditions?.length) {\n for (const cond of individual.conditions) {\n children.push(conditionFillElement(individual.sex, half, cond));\n }\n }\n\n // Deceased overlay\n if (individual.status === \"deceased\") {\n children.push(...deceasedOverlay(individual.sex, half));\n }\n\n // Age display inside node\n const ageToShow = individual.age ?? calcAge(individual);\n if (ageToShow !== undefined) {\n children.push(\n text(\n {\n x: 0,\n y: 5,\n class: \"schematex-genogram-age\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"11\",\n },\n String(ageToShow)\n )\n );\n }\n\n // Unknown-siblings glyph: bold \"?\" centered in the diamond.\n // Drawn after the base shape so the question mark sits on top.\n const isUnknownSiblings = individual.markers?.includes(\"unknown-siblings\");\n if (isUnknownSiblings) {\n classes.push(\"schematex-genogram-unknown-siblings\");\n children.push(\n text(\n {\n x: 0,\n y: 5,\n class: \"schematex-genogram-unknown-siblings-mark\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"16\",\n \"font-weight\": \"bold\",\n },\n \"?\"\n )\n );\n }\n\n return group(\n {\n class: classes.join(\" \"),\n \"data-individual-id\": individual.id,\n transform: `translate(${x}, ${y})`,\n },\n children\n );\n}\n\nexport function getRequiredDefs(individuals: Individual[], includeArrowMarker = false): string {\n const neededFills = new Set<string>();\n for (const ind of individuals) {\n if (ind.conditions) {\n for (const cond of ind.conditions) {\n neededFills.add(cond.fill);\n }\n }\n }\n\n const children: string[] = [];\n\n // All clipPaths use clipPathUnits=\"objectBoundingBox\" so a single clip works\n // for any base shape (rect, circle, diamond) regardless of its size: the\n // rect coordinates are interpreted as fractions (0..1) of the clipped\n // element's bounding box. Both the legacy `-rect` and `-circle` ids point\n // at structurally identical clips — kept under both names for backwards\n // compatibility with conditionFillElement's `${cond.fill}-${clipSuffix}` ref.\n function quadClips(suffix: string, x: number, y: number, w: number, h: number) {\n const r = rect({ x, y, width: w, height: h });\n children.push(\n el(\n \"clipPath\",\n { id: `schematex-genogram-clip-${suffix}-rect`, clipPathUnits: \"objectBoundingBox\" },\n [r]\n ),\n el(\n \"clipPath\",\n { id: `schematex-genogram-clip-${suffix}-circle`, clipPathUnits: \"objectBoundingBox\" },\n [r]\n )\n );\n }\n\n if (neededFills.has(\"half-left\")) quadClips(\"half-left\", 0, 0, 0.5, 1);\n if (neededFills.has(\"half-right\")) quadClips(\"half-right\", 0.5, 0, 0.5, 1);\n if (neededFills.has(\"half-top\")) quadClips(\"half-top\", 0, 0, 1, 0.5);\n if (neededFills.has(\"half-bottom\")) quadClips(\"half-bottom\", 0, 0.5, 1, 0.5);\n if (neededFills.has(\"quarter\")) quadClips(\"quarter\", 0, 0, 0.5, 0.5);\n if (neededFills.has(\"quad-tl\")) quadClips(\"quad-tl\", 0, 0, 0.5, 0.5);\n if (neededFills.has(\"quad-tr\")) quadClips(\"quad-tr\", 0.5, 0, 0.5, 0.5);\n if (neededFills.has(\"quad-bl\")) quadClips(\"quad-bl\", 0, 0.5, 0.5, 0.5);\n if (neededFills.has(\"quad-br\")) quadClips(\"quad-br\", 0.5, 0.5, 0.5, 0.5);\n\n if (neededFills.has(\"striped\")) {\n children.push(\n pattern(\n {\n id: \"schematex-genogram-pattern-striped\",\n patternUnits: \"userSpaceOnUse\",\n width: \"4\",\n height: \"4\",\n },\n [\n path({\n d: \"M-1,1 l2,-2 M0,4 l4,-4 M3,5 l2,-2\",\n stroke: \"#333\",\n \"stroke-width\": \"1\",\n }),\n ]\n )\n );\n }\n\n if (neededFills.has(\"dotted\")) {\n children.push(\n pattern(\n {\n id: \"schematex-genogram-pattern-dotted\",\n patternUnits: \"userSpaceOnUse\",\n width: \"6\",\n height: \"6\",\n },\n [\n circle({ cx: \"3\", cy: \"3\", r: \"1\", fill: \"#333\" }),\n ]\n )\n );\n }\n\n if (includeArrowMarker) {\n children.push(\n el(\"marker\", {\n id: \"schematex-genogram-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"10\",\n refY: \"5\",\n markerWidth: \"6\",\n markerHeight: \"6\",\n orient: \"auto\",\n }, [\n path({ d: \"M 0 0 L 10 5 L 0 10 z\", fill: \"#333\" }),\n ])\n );\n }\n\n return defs(children);\n}\n\n// ─── Internal helpers ───────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction formatTitle(ind: Individual): string {\n const name = capitalize(ind.label || ind.id);\n if (ind.birthYear && ind.deathYear) {\n return `${name} (${ind.birthYear}-${ind.deathYear})`;\n }\n if (ind.birthYear) {\n return `${name} (${ind.birthYear})`;\n }\n return name;\n}\n\nfunction calcAge(ind: Individual): number | undefined {\n if (!ind.birthYear) return undefined;\n if (ind.deathYear) return ind.deathYear - ind.birthYear;\n if (ind.status === \"deceased\") return undefined;\n return undefined;\n}\n\nfunction indexBorder(sex: Individual[\"sex\"], half: number): string {\n const outer = half + 4;\n switch (sex) {\n case \"male\":\n return rect({\n x: -outer,\n y: -outer,\n width: outer * 2,\n height: outer * 2,\n class: \"schematex-genogram-index-border\",\n });\n case \"female\":\n return circle({\n cx: 0,\n cy: 0,\n r: outer,\n class: \"schematex-genogram-index-border\",\n });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return polygon({\n points: `0,${-outer} ${outer},0 0,${outer} ${-outer},0`,\n class: \"schematex-genogram-index-border\",\n });\n }\n}\n\nfunction baseShape(\n sex: Individual[\"sex\"],\n half: number,\n shape?: Individual[\"shape\"]\n): string {\n const cls = \"schematex-genogram-shape\";\n switch (shape) {\n case \"square\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, class: cls });\n case \"circle\":\n return circle({ cx: 0, cy: 0, r: half, class: cls });\n case \"diamond\":\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, class: cls });\n case \"triangle\":\n return polygon({ points: `0,${-half} ${half},${half} ${-half},${half}`, class: cls });\n case \"triangle-down\":\n return polygon({ points: `${-half},${-half} ${half},${-half} 0,${half}`, class: cls });\n }\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, class: cls });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, class: cls });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return polygon({ points: `0,${-half} ${half},0 0,${half} ${-half},0`, class: cls });\n }\n}\n\nfunction deceasedOverlay(sex: Individual[\"sex\"], half: number): string[] {\n const extend = sex === \"female\" ? half * 0.707 : half;\n return [\n line({\n x1: -extend,\n y1: -extend,\n x2: extend,\n y2: extend,\n class: \"schematex-genogram-deceased-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n }),\n line({\n x1: extend,\n y1: -extend,\n x2: -extend,\n y2: extend,\n class: \"schematex-genogram-deceased-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n }),\n ];\n}\n\nfunction conditionFillElement(\n sex: Individual[\"sex\"],\n half: number,\n cond: Condition\n): string {\n const fillColor = cond.color ?? \"#333\";\n const attrs: Record<string, string | number> = {};\n\n if (cond.fill === \"full\") {\n attrs.fill = fillColor;\n } else if (cond.fill === \"striped\") {\n attrs.fill = \"url(#schematex-genogram-pattern-striped)\";\n } else if (cond.fill === \"dotted\") {\n attrs.fill = \"url(#schematex-genogram-pattern-dotted)\";\n } else {\n const clipSuffix = sex === \"female\" ? \"circle\" : \"rect\";\n attrs[\"clip-path\"] = `url(#schematex-genogram-clip-${cond.fill}-${clipSuffix})`;\n attrs.fill = fillColor;\n }\n\n attrs.class = `schematex-genogram-condition-fill schematex-genogram-condition-${cond.label}`;\n\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, ...attrs });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n default:\n return polygon({\n points: `0,${-half} ${half},0 0,${half} ${-half},0`,\n ...attrs,\n });\n }\n}\n","/**\n * Auto-derive a LegendSpec from a genogram AST.\n *\n * Walks the AST and emits one LegendItem per encoding axis actually present:\n *\n * 1. Symbols — sex shapes + status overlays\n * 2. Structural — couple / parent-child / twin relationships\n * 3. Relationships — emotional relationships (color + line-style + width)\n * 4. Conditions — one per unique condition.label (color from condition.color)\n * 5. Heritage — one per heritage id (palette-cycled)\n * 6. Markers — proband / index-person / etc.\n *\n * Items are emitted only for encodings actually used in the diagram.\n */\n\nimport type {\n DiagramAST,\n Individual,\n IndividualMarker,\n IndividualStatus,\n LegendItem,\n LegendSection,\n LegendSpec,\n RelationshipType,\n Sex,\n} from \"../../core/types\";\nimport type { PersonTokens } from \"../../core/theme\";\n\ntype GenogramThemeLike = {\n stroke: string;\n fill: string;\n deceasedMark: string;\n} & Pick<PersonTokens, \"maleFill\" | \"femaleFill\" | \"unknownFill\">;\n\nconst EMOTIONAL_TYPES: ReadonlySet<string> = new Set([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\nconst STRUCTURAL_TYPES: ReadonlySet<string> = new Set([\n \"married\", \"divorced\", \"separated\", \"engaged\", \"cohabiting\", \"cohabiting-ended\",\n \"domestic-partnership\", \"consanguineous\",\n \"parent-child\", \"adopted\", \"foster\",\n \"twin-identical\", \"twin-fraternal\",\n]);\n\n// Heritage palette — cycles through the unified 8-color category palette\n// (see src/core/theme.ts DEFAULT_PALETTE). Kept local so heritage colors are\n// stable independent of theme switches.\nconst HERITAGE_PALETTE = [\n \"#2563eb\", \"#059669\", \"#d97706\", \"#dc2626\",\n \"#7c3aed\", \"#0891b2\", \"#ca8a04\", \"#db2777\",\n];\n\nconst SECTIONS: LegendSection[] = [\n { id: \"symbols\", title: \"Symbols\" },\n { id: \"structural\", title: \"Structural\" },\n { id: \"relationships\", title: \"Relationships\" },\n { id: \"conditions\", title: \"Conditions\" },\n { id: \"heritage\", title: \"Heritage\" },\n { id: \"markers\", title: \"Markers\" },\n];\n\nexport function buildGenogramLegend(\n ast: DiagramAST,\n theme?: GenogramThemeLike\n): LegendSpec {\n const items: LegendItem[] = [];\n\n items.push(...buildSymbolItems(ast.individuals, theme));\n items.push(...buildStructuralItems(ast.relationships, theme));\n items.push(...buildRelationshipItems(ast.relationships));\n items.push(...buildConditionItems(ast.individuals));\n items.push(...buildHeritageItems(ast.individuals));\n items.push(...buildMarkerItems(ast.individuals, theme));\n\n return {\n mode: \"auto\",\n title: \"Legend\",\n position: \"bottom-inline\",\n columns: 1,\n sections: SECTIONS,\n items,\n };\n}\n\n// ─── Symbols ─────────────────────────────────────────────────\n\n// Universal genogram conventions (McGoldrick standard) — square = male and\n// circle = female are read at a glance by anyone literate in the format. We\n// only emit the *less obvious* sex shapes (unknown, nonbinary, etc.) and the\n// status overlays (deceased X, stillborn, miscarriage…) into the auto-derived\n// legend.\nconst OBVIOUS_SEX: ReadonlySet<Sex> = new Set<Sex>([\"male\", \"female\"]);\n\nfunction buildSymbolItems(\n individuals: Individual[],\n theme?: GenogramThemeLike\n): LegendItem[] {\n const items: LegendItem[] = [];\n const sexUsed = new Set<Sex>();\n const statusUsed = new Set<IndividualStatus>();\n\n for (const ind of individuals) {\n sexUsed.add(ind.sex);\n if (ind.status && ind.status !== \"alive\") statusUsed.add(ind.status);\n }\n\n // Only emit non-obvious sex variants. Male/female are universally known.\n const sexOrder: Sex[] = [\n \"unknown\", \"other\", \"nonbinary\", \"intersex\",\n ];\n for (const s of sexOrder) {\n if (!sexUsed.has(s)) continue;\n if (OBVIOUS_SEX.has(s)) continue;\n items.push({\n key: `sex.${s}`,\n label: sexLabel(s),\n kind: \"shape\",\n shape: sexShape(s),\n fill: theme ? sexFill(s, theme) : undefined,\n color: theme?.stroke,\n section: \"symbols\",\n });\n }\n\n const statusOrder: IndividualStatus[] = [\n \"deceased\", \"stillborn\", \"miscarriage\", \"abortion\",\n \"pregnancy\", \"sab\", \"tab\", \"ectopic\",\n ];\n for (const st of statusOrder) {\n if (!statusUsed.has(st)) continue;\n items.push({\n key: `status.${st}`,\n label: statusLabel(st),\n kind: \"marker\",\n marker: statusMarker(st),\n color: theme?.deceasedMark,\n section: \"symbols\",\n });\n }\n\n return items;\n}\n\nfunction sexFill(s: Sex, theme: GenogramThemeLike): string {\n switch (s) {\n case \"male\":\n return theme.maleFill;\n case \"female\":\n return theme.femaleFill;\n default:\n return theme.unknownFill;\n }\n}\n\nfunction sexShape(s: Sex): string {\n switch (s) {\n case \"male\":\n return \"square\";\n case \"female\":\n return \"circle\";\n case \"unknown\":\n return \"diamond\";\n case \"other\":\n case \"nonbinary\":\n return \"diamond\";\n case \"intersex\":\n return \"diamond\";\n default:\n return \"square\";\n }\n}\n\nfunction sexLabel(s: Sex): string {\n switch (s) {\n case \"male\":\n return \"Male\";\n case \"female\":\n return \"Female\";\n case \"unknown\":\n return \"Unknown\";\n case \"other\":\n return \"Other\";\n case \"nonbinary\":\n return \"Non-binary\";\n case \"intersex\":\n return \"Intersex\";\n default:\n return s;\n }\n}\n\nfunction statusMarker(s: IndividualStatus): string {\n switch (s) {\n case \"deceased\":\n case \"stillborn\":\n return \"X\";\n case \"miscarriage\":\n case \"sab\":\n case \"tab\":\n case \"abortion\":\n case \"ectopic\":\n return \"slash\";\n default:\n return \"dot\";\n }\n}\n\nfunction statusLabel(s: IndividualStatus): string {\n switch (s) {\n case \"deceased\":\n return \"Deceased\";\n case \"stillborn\":\n return \"Stillborn\";\n case \"miscarriage\":\n return \"Miscarriage\";\n case \"abortion\":\n return \"Abortion\";\n case \"pregnancy\":\n return \"Pregnancy\";\n case \"sab\":\n return \"Spontaneous abortion\";\n case \"tab\":\n return \"Therapeutic abortion\";\n case \"ectopic\":\n return \"Ectopic pregnancy\";\n default:\n return s;\n }\n}\n\n// ─── Structural ──────────────────────────────────────────────\n\n// Universal genogram conventions everyone in the field reads at a glance —\n// these are excluded from auto-derived legends to keep the legend signal-rich\n// (only encodings that vary by chart get listed).\nconst OBVIOUS_STRUCTURAL: ReadonlySet<RelationshipType> = new Set<RelationshipType>([\n \"married\", // single horizontal line — universal McGoldrick\n \"parent-child\", // single vertical line — universal\n]);\n\nfunction buildStructuralItems(\n rels: { type: RelationshipType }[],\n theme?: GenogramThemeLike\n): LegendItem[] {\n const used = new Set<string>();\n for (const r of rels) {\n if (STRUCTURAL_TYPES.has(r.type)) used.add(r.type);\n }\n // Order matters for legend display.\n const order: RelationshipType[] = [\n \"divorced\", \"separated\", \"engaged\", \"cohabiting\", \"cohabiting-ended\",\n \"domestic-partnership\", \"consanguineous\",\n \"adopted\", \"foster\",\n \"twin-identical\", \"twin-fraternal\",\n ];\n const items: LegendItem[] = [];\n for (const t of order) {\n if (!used.has(t)) continue;\n if (OBVIOUS_STRUCTURAL.has(t)) continue;\n items.push(structuralItem(t, theme));\n }\n return items;\n}\n\nfunction structuralItem(t: RelationshipType, theme?: GenogramThemeLike): LegendItem {\n const base: LegendItem = {\n key: t,\n label: humanize(t),\n kind: \"line\",\n color: theme?.stroke,\n section: \"structural\",\n pattern: \"solid\",\n };\n switch (t) {\n case \"divorced\":\n return { ...base, kind: \"edge\", marker: \"X\", pattern: \"solid\" };\n case \"separated\":\n return { ...base, kind: \"edge\", marker: \"slash\", pattern: \"solid\" };\n case \"cohabiting-ended\":\n return {\n ...base,\n label: \"Cohabiting (ended)\",\n kind: \"edge\",\n marker: \"slash\",\n pattern: \"dashed\",\n };\n case \"engaged\":\n case \"cohabiting\":\n case \"adopted\":\n case \"foster\":\n return { ...base, pattern: \"dashed\" };\n case \"consanguineous\":\n return { ...base, pattern: \"double\" };\n case \"twin-identical\":\n case \"twin-fraternal\":\n return { ...base, pattern: \"solid\" };\n default:\n return base;\n }\n}\n\n// ─── Emotional relationships ────────────────────────────────\n//\n// Mirrors the encoding in renderer.ts (getEmotionalColor / Style / StrokeWidth).\n\nfunction buildRelationshipItems(rels: { type: RelationshipType }[]): LegendItem[] {\n const used = new Set<string>();\n for (const r of rels) {\n if (EMOTIONAL_TYPES.has(r.type)) used.add(r.type);\n }\n const order: RelationshipType[] = [\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n ];\n const items: LegendItem[] = [];\n for (const t of order) {\n if (!used.has(t)) continue;\n items.push({\n key: t,\n label: humanize(t),\n kind: \"line\",\n color: emotionalColor(t),\n pattern: emotionalPattern(t),\n strokeWidth: emotionalStrokeWidth(t),\n section: \"relationships\",\n });\n }\n return items;\n}\n\nfunction emotionalColor(t: RelationshipType): string {\n if ([\"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\"].includes(t)) return \"#4caf50\";\n if ([\"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\"].includes(t)) return \"#e53935\";\n if ([\"close-hostile\", \"fused\", \"fused-hostile\"].includes(t)) return \"#9c27b0\";\n if ([\"distant\", \"normal\", \"nevermet\"].includes(t)) return \"#9e9e9e\";\n if ([\"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\"].includes(t)) return \"#b71c1c\";\n if ([\"manipulative\", \"controlling\", \"jealous\"].includes(t)) return \"#e65100\";\n return \"#1565c0\";\n}\n\nfunction emotionalPattern(t: RelationshipType): \"solid\" | \"dashed\" | \"zigzag\" | \"broken\" {\n if ([\"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"close-hostile\", \"fused-hostile\"].includes(t)) return \"zigzag\";\n if ([\"distant\", \"nevermet\"].includes(t)) return \"dashed\";\n if (t === \"cutoff\") return \"broken\";\n return \"solid\";\n}\n\nfunction emotionalStrokeWidth(t: RelationshipType): number {\n if ([\"fused\", \"fused-hostile\", \"bestfriends\"].includes(t)) return 4;\n if ([\"close\", \"close-hostile\", \"love\", \"inlove\"].includes(t)) return 3;\n return 2;\n}\n\n// ─── Conditions ──────────────────────────────────────────────\n\nfunction buildConditionItems(individuals: Individual[]): LegendItem[] {\n const seen = new Map<string, LegendItem>();\n for (const ind of individuals) {\n if (!ind.conditions) continue;\n for (const c of ind.conditions) {\n if (seen.has(c.label)) continue;\n const color = c.color ?? defaultCategoryColor(c.category);\n const isFull = c.fill === \"full\";\n seen.set(c.label, {\n key: c.label,\n label: humanize(c.label),\n kind: isFull ? \"fill\" : \"fill-pattern\",\n color,\n shape: isFull ? undefined : c.fill,\n section: \"conditions\",\n });\n }\n }\n return Array.from(seen.values());\n}\n\nfunction defaultCategoryColor(cat: string | undefined): string {\n if (!cat) return \"#9ca3af\";\n const map: Record<string, string> = {\n cardiovascular: \"#dc2626\",\n cancer: \"#a21caf\",\n diabetes: \"#d97706\",\n \"mental-health\": \"#2563eb\",\n depression: \"#1d4ed8\",\n anxiety: \"#0ea5e9\",\n bipolar: \"#6366f1\",\n ptsd: \"#475569\",\n \"substance-alcohol\": \"#92400e\",\n \"substance-drugs\": \"#7c2d12\",\n \"substance-tobacco\": \"#854d0e\",\n neurological: \"#7e22ce\",\n respiratory: \"#0891b2\",\n autoimmune: \"#be185d\",\n genetic: \"#0f766e\",\n reproductive: \"#db2777\",\n \"eating-disorder\": \"#9333ea\",\n \"learning-developmental\": \"#0369a1\",\n kidney: \"#b45309\",\n \"liver-gi\": \"#ca8a04\",\n obesity: \"#ea580c\",\n other: \"#9ca3af\",\n };\n return map[cat] ?? \"#9ca3af\";\n}\n\n// ─── Heritage ────────────────────────────────────────────────\n\nfunction buildHeritageItems(individuals: Individual[]): LegendItem[] {\n const all = new Set<string>();\n for (const ind of individuals) {\n if (!ind.heritage) continue;\n for (const h of ind.heritage) all.add(h);\n }\n const ordered = Array.from(all).sort();\n return ordered.map((id, i) => ({\n key: id,\n label: humanize(id),\n kind: \"fill\",\n color: HERITAGE_PALETTE[i % HERITAGE_PALETTE.length],\n section: \"heritage\",\n }));\n}\n\n// ─── Markers ─────────────────────────────────────────────────\n\nfunction buildMarkerItems(\n individuals: Individual[],\n theme?: GenogramThemeLike\n): LegendItem[] {\n const used = new Set<IndividualMarker>();\n for (const ind of individuals) {\n if (!ind.markers) continue;\n for (const m of ind.markers) used.add(m);\n }\n const order: IndividualMarker[] = [\n \"proband\", \"consultand\", \"evaluated\", \"index-person\",\n \"transgender\", \"no-children\", \"infertile\", \"unknown-siblings\",\n ];\n const items: LegendItem[] = [];\n for (const m of order) {\n if (!used.has(m)) continue;\n items.push(markerItem(m, theme));\n }\n return items;\n}\n\nfunction markerItem(m: IndividualMarker, theme?: GenogramThemeLike): LegendItem {\n switch (m) {\n case \"proband\":\n return { key: `marker.${m}`, label: \"Proband (P)\", kind: \"marker\", marker: \"P\", section: \"markers\" };\n case \"consultand\":\n return { key: `marker.${m}`, label: \"Consultand (C)\", kind: \"marker\", marker: \"C\", section: \"markers\" };\n case \"evaluated\":\n return { key: `marker.${m}`, label: \"Evaluated (E)\", kind: \"marker\", marker: \"E\", section: \"markers\" };\n case \"index-person\":\n return {\n key: `marker.${m}`,\n label: \"Index person (focal subject)\",\n kind: \"shape\",\n shape: \"concentric-square\",\n fill: \"#fef3c7\",\n color: theme?.stroke,\n section: \"markers\",\n };\n case \"transgender\":\n return { key: `marker.${m}`, label: \"Transgender\", kind: \"marker\", marker: \"star\", section: \"markers\" };\n case \"no-children\":\n return { key: `marker.${m}`, label: \"No children (by choice)\", kind: \"marker\", marker: \"slash\", section: \"markers\" };\n case \"infertile\":\n return { key: `marker.${m}`, label: \"Infertile\", kind: \"marker\", marker: \"X\", section: \"markers\" };\n case \"unknown-siblings\":\n return {\n key: `marker.${m}`,\n label: \"Sibling(s) — unknown count\",\n kind: \"shape\",\n shape: \"diamond\",\n fill: \"#ffffff\",\n color: theme?.stroke,\n section: \"markers\",\n };\n default:\n return { key: `marker.${m}`, label: humanize(m), kind: \"marker\", marker: \"dot\", section: \"markers\" };\n }\n}\n\n// ─── Helpers ─────────────────────────────────────────────────\n\nfunction humanize(s: string): string {\n return s\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","import type { LayoutResult, LayoutNode, LayoutEdge, RenderConfig, DiagramAST, RelationshipType } from \"../../core/types\";\nimport { svgRoot, el, group, text, title, desc } from \"../../core/svg\";\nimport { cssCustomProperties, resolveGenogramTheme, STROKE_WIDTH } from \"../../core/theme\";\nimport { renderIndividualSymbol, getRequiredDefs } from \"./symbols\";\nimport { applyLegendOverrides, renderLegend } from \"../../core/legend\";\nimport { buildGenogramLegend } from \"./legend\";\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderGenogram(\n layout: LayoutResult,\n config: RenderConfig,\n ast?: DiagramAST\n): string {\n const hasDirectional = layout.edges.some(e => e.relationship.directional);\n const defsStr = getRequiredDefs(layout.nodes.map((n) => n.individual), hasDirectional);\n const styleStr = buildStyles(config);\n\n const genGroups = groupByGeneration(layout.nodes);\n\n // Separate structural and emotional edges\n const structuralEdges = layout.edges.filter(e => !EMOTIONAL_REL_TYPES.has(e.relationship.type));\n const emotionalEdges = layout.edges.filter(e => EMOTIONAL_REL_TYPES.has(e.relationship.type));\n\n const edgeLayers = renderEdges(structuralEdges);\n const emotionalLayer = renderEmotionalEdges(emotionalEdges);\n const nodeLayers = renderNodes(genGroups);\n const labelLayer = renderLabels(layout.nodes, config);\n // Secondary parent-child rels carry their own visible label (e.g. \"foster\")\n // already embedded in the relationship; suppress edge labels for them so\n // the sentinel from layout doesn't render as text.\n const labelEdges = structuralEdges.filter(\n (e) => !e.relationship.secondary\n );\n const edgeLabelLayer = renderEdgeLabels(labelEdges, config);\n const siblingOfLayer = renderSiblingOfBrackets(layout, ast);\n\n const nodeCount = layout.nodes.length;\n const genCount = genGroups.size;\n\n const chartTitle = ast?.metadata?.title;\n\n // Adjust viewBox and add title offset if title exists\n const titleHeight = chartTitle ? 40 : 0;\n const totalHeight = layout.height + titleHeight;\n\n const layers: string[] = [\n title(chartTitle ? `Genogram: ${chartTitle}` : \"Genogram\"),\n desc(\n `Genogram diagram with ${nodeCount} individuals across ${genCount} generations`\n ),\n defsStr,\n styleStr,\n ];\n\n // Build chart content (title + diagram) at native layout.width. We'll wrap\n // it in a horizontally-centering group AFTER the legend tells us the final\n // viewBox width.\n const chartContent: string[] = [];\n if (chartTitle) {\n chartContent.push(\n text(\n {\n x: layout.width / 2,\n y: 28,\n class: \"schematex-genogram-title\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"20\",\n \"font-weight\": \"bold\",\n \"font-family\": config.fontFamily,\n },\n chartTitle\n )\n );\n }\n chartContent.push(\n group(\n { transform: titleHeight > 0 ? `translate(0, ${titleHeight})` : undefined },\n [edgeLayers, siblingOfLayer, emotionalLayer, ...nodeLayers, labelLayer, edgeLabelLayer]\n )\n );\n\n // Compose legend (against the natural canvas size, not the centered one).\n let finalWidth = layout.width;\n let finalHeight = totalHeight;\n let legendSvg = \"\";\n if (ast) {\n const themeBase = resolveGenogramTheme(config.theme);\n const autoSpec = buildGenogramLegend(ast, themeBase);\n const finalSpec = applyLegendOverrides(autoSpec, ast.legendOverrides);\n if (finalSpec.mode === \"on\" && finalSpec.items.length > 0) {\n const { svg, bbox: lb } = renderLegend(\n finalSpec,\n {\n canvasWidth: layout.width,\n canvasHeight: totalHeight,\n padding: 16,\n titleHeight,\n },\n themeBase,\n { fontFamily: config.fontFamily, fontSize: config.fontSize }\n );\n if (svg) {\n legendSvg = svg;\n const overflowX = lb.x + lb.w + 8;\n const overflowY = lb.y + lb.h + 8;\n if (overflowX > finalWidth) finalWidth = overflowX;\n if (overflowY > finalHeight) finalHeight = overflowY;\n }\n }\n }\n\n // Center the chart horizontally inside the (possibly widened) viewBox so\n // small diagrams don't sit flush-left under a wide legend strip.\n const chartXOffset = Math.max(0, (finalWidth - layout.width) / 2);\n layers.push(\n group(\n { transform: chartXOffset > 0 ? `translate(${chartXOffset}, 0)` : undefined },\n chartContent\n )\n );\n if (legendSvg) layers.push(legendSvg);\n\n return svgRoot(\n {\n viewBox: `0 0 ${finalWidth} ${finalHeight}`,\n class: \"schematex-diagram schematex-genogram\",\n width: finalWidth,\n height: finalHeight,\n },\n layers\n );\n}\n\n// ─── Styles ─────────────────────────────────────────────────\n\n// ─── Theme Resolution ──────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig): string {\n const t = resolveGenogramTheme(config.theme);\n const css = `\n.schematex-genogram {${cssCustomProperties(t)}\n}\n.schematex-genogram-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linejoin: round; }\n.schematex-genogram-male .schematex-genogram-shape { fill: ${t.maleFill}; }\n.schematex-genogram-female .schematex-genogram-shape { fill: ${t.femaleFill}; }\n.schematex-genogram-unknown .schematex-genogram-shape { fill: ${t.unknownFill}; }\n.schematex-genogram-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-genogram-edge { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; stroke-linejoin: round; }\n.schematex-genogram-edge-cohabiting path { stroke-dasharray: 6,4; }\n.schematex-genogram-edge-cohabiting-ended path { stroke-dasharray: 6,4; }\n.schematex-genogram-edge-divorced .schematex-genogram-divorce-mark { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-genogram-edge-separated .schematex-genogram-separation-mark { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-genogram-edge-cohabiting-ended .schematex-genogram-separation-mark { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n/* Secondary parent-child link (foster/adopted \"current caregiver\") — dotted, muted */\n.schematex-genogram-edge-secondary path { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 2,4; fill: none; opacity: 0.85; }\n/* Sibling-of bracket (known relative, unknown ancestry) — dashed */\n.schematex-genogram-sibling-of path { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 4,3; fill: none; opacity: 0.7; }\n.schematex-genogram-unknown-siblings-mark { fill: ${t.text}; pointer-events: none; }\n.schematex-genogram-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n/* Inline fill on each .schematex-genogram-condition-fill element comes from cond.color. The CSS only sets a default for elements that did not receive an inline fill attribute. */\n.schematex-genogram-condition-fill:not([fill]) { fill: ${t.conditionFill}; }\n.schematex-genogram-age { font-family: ${config.fontFamily}; fill: ${t.text}; pointer-events: none; }\n.schematex-genogram-title { fill: ${t.text}; }\n.schematex-genogram-edge-label { font-family: ${config.fontFamily}; fill: ${t.text}; }\n.schematex-genogram-index-border { stroke: ${t.warn}; stroke-width: ${STROKE_WIDTH.thick}; fill: none; }\n`;\n return el(\"style\", {}, css);\n}\n\n// ─── Emotional Relationship Types ───────────────────────────\n\nconst EMOTIONAL_REL_TYPES = new Set<string>([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\nfunction getEmotionalColor(type: RelationshipType): string {\n // Positive: green\n if ([\"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\"].includes(type)) return \"#4caf50\";\n // Negative: red\n if ([\"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\"].includes(type)) return \"#e53935\";\n // Ambivalent: purple\n if ([\"close-hostile\", \"fused\", \"fused-hostile\"].includes(type)) return \"#9c27b0\";\n // Distance: gray\n if ([\"distant\", \"normal\", \"nevermet\"].includes(type)) return \"#9e9e9e\";\n // Abuse: dark red\n if ([\"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\"].includes(type)) return \"#b71c1c\";\n // Control: orange\n if ([\"manipulative\", \"controlling\", \"jealous\"].includes(type)) return \"#e65100\";\n // Special: blue\n return \"#1565c0\";\n}\n\nfunction getEmotionalLineStyle(type: RelationshipType): string {\n // Hostile types: zigzag rendered as stroke-dasharray\n if ([\"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"close-hostile\", \"fused-hostile\"].includes(type)) {\n return \"stroke-dasharray: 8,3,2,3;\";\n }\n // Distant types: dashed\n if ([\"distant\", \"distant-hostile\", \"nevermet\"].includes(type)) {\n return \"stroke-dasharray: 6,4;\";\n }\n // Cutoff: gap\n if (type === \"cutoff\") {\n return \"stroke-dasharray: 2,8;\";\n }\n return \"\";\n}\n\nfunction getEmotionalStrokeWidth(type: RelationshipType): number {\n // Fused/best friends: thick (3 lines visually)\n if ([\"fused\", \"fused-hostile\", \"bestfriends\"].includes(type)) return 4;\n // Close/love: medium (2 lines)\n if ([\"close\", \"close-hostile\", \"love\", \"inlove\"].includes(type)) return 3;\n return 2;\n}\n\nfunction renderEmotionalEdges(edges: LayoutEdge[]): string {\n if (edges.length === 0) return group({ class: \"schematex-genogram-emotional-edges\" }, []);\n\n const children: string[] = [];\n for (const edge of edges) {\n const type = edge.relationship.type;\n const color = getEmotionalColor(type);\n const lineStyle = getEmotionalLineStyle(type);\n const strokeWidth = getEmotionalStrokeWidth(type);\n const directional = edge.relationship.directional;\n\n const elements: string[] = [\n el(\"path\", {\n d: edge.path,\n fill: \"none\",\n stroke: color,\n \"stroke-width\": strokeWidth,\n style: lineStyle || undefined,\n \"marker-end\": directional ? \"url(#schematex-genogram-arrow)\" : undefined,\n }),\n ];\n\n // Render label on emotional edge\n if (edge.relationship.label) {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n text(\n {\n x: mid.x,\n y: mid.y - 6,\n class: \"schematex-genogram-edge-label\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"10\",\n fill: color,\n },\n edge.relationship.label\n )\n );\n }\n }\n\n children.push(\n group(\n {\n class: `schematex-genogram-emotional schematex-genogram-emotional-${type}`,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n \"data-relationship-type\": type,\n },\n elements\n )\n );\n }\n\n return group({ class: \"schematex-genogram-emotional-edges\" }, children);\n}\n\n// ─── Edge Labels ────────────────────────────────────────────\n\nfunction renderEdgeLabels(edges: LayoutEdge[], config: RenderConfig): string {\n const labels: string[] = [];\n\n for (const edge of edges) {\n if (!edge.relationship.label) continue;\n const mid = pathMidpoint(edge.path);\n if (!mid) continue;\n\n labels.push(\n text(\n {\n x: mid.x,\n y: mid.y - 6,\n class: \"schematex-genogram-edge-label\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"10\",\n \"font-family\": config.fontFamily,\n },\n edge.relationship.label\n )\n );\n }\n\n return group({ class: \"schematex-genogram-edge-labels\" }, labels);\n}\n\n// ─── Edges ──────────────────────────────────────────────────\n\nfunction renderEdges(edges: LayoutEdge[]): string {\n const children: string[] = [];\n\n for (const edge of edges) {\n const relType = edge.relationship.type;\n const isSecondary = edge.relationship.secondary === true;\n const cssClass = isSecondary\n ? `schematex-genogram-edge schematex-genogram-edge-secondary schematex-genogram-edge-secondary-${relType}`\n : `schematex-genogram-edge schematex-genogram-edge-${relType}`;\n\n const elements: string[] = [\n el(\"path\", { d: edge.path, class: \"schematex-genogram-edge-path\" }),\n ];\n\n // cohabiting-ended: single slash mark like separation\n if (relType === \"cohabiting-ended\" && !isSecondary) {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n el(\"line\", {\n x1: mid.x - 4,\n y1: mid.y - 6,\n x2: mid.x + 4,\n y2: mid.y + 6,\n class: \"schematex-genogram-separation-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n })\n );\n }\n }\n\n // Divorce markers: two short slashes at midpoint\n if (relType === \"divorced\") {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n el(\"line\", {\n x1: mid.x - 4,\n y1: mid.y - 6,\n x2: mid.x + 4,\n y2: mid.y + 6,\n class: \"schematex-genogram-divorce-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n }),\n el(\"line\", {\n x1: mid.x - 4 + 6,\n y1: mid.y - 6,\n x2: mid.x + 4 + 6,\n y2: mid.y + 6,\n class: \"schematex-genogram-divorce-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n })\n );\n }\n }\n\n // Separation marker: single slash\n if (relType === \"separated\") {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n el(\"line\", {\n x1: mid.x - 4,\n y1: mid.y - 6,\n x2: mid.x + 4,\n y2: mid.y + 6,\n class: \"schematex-genogram-separation-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n })\n );\n }\n }\n\n children.push(\n group(\n {\n class: cssClass,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n },\n elements\n )\n );\n }\n\n return group({ class: \"schematex-genogram-edges\" }, children);\n}\n\nfunction pathMidpoint(\n pathData: string\n): { x: number; y: number } | null {\n const coords = pathData.match(/[\\d.-]+/g);\n if (!coords || coords.length < 4) return null;\n const x1 = parseFloat(coords[0]);\n const y1 = parseFloat(coords[1]);\n const x2 = parseFloat(coords[2]);\n const y2 = parseFloat(coords[3]);\n return { x: (x1 + x2) / 2, y: (y1 + y2) / 2 };\n}\n\n// ─── Nodes ──────────────────────────────────────────────────\n\nfunction groupByGeneration(nodes: LayoutNode[]): Map<number, LayoutNode[]> {\n const groups = new Map<number, LayoutNode[]>();\n for (const node of nodes) {\n const gen = node.generation;\n const group = groups.get(gen) ?? [];\n group.push(node);\n groups.set(gen, group);\n }\n return groups;\n}\n\nfunction renderNodes(\n genGroups: Map<number, LayoutNode[]>\n): string[] {\n const layers: string[] = [];\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n\n for (const genIdx of sortedGens) {\n const nodes = genGroups.get(genIdx) ?? [];\n const nodeElements: string[] = [];\n\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n nodeElements.push(\n renderIndividualSymbol(node.individual, cx, cy, node.width)\n );\n }\n\n layers.push(\n group(\n {\n class: `schematex-genogram-generation schematex-genogram-generation-${genIdx}`,\n \"data-generation\": genIdx,\n },\n nodeElements\n )\n );\n }\n\n return layers;\n}\n\n// ─── Sibling-of brackets (known relative, unknown ancestry) ────\n// Drawn directly from AST + layout (not as LayoutEdges) so the synthetic\n// edge type doesn't pollute structural / emotional / secondary classifiers.\n// Cross-generation references are skipped — `siblingOf` is generationally\n// pinned by `assignGenerations`, so a mismatch here means user error or a\n// missing referent, both of which we silently no-op rather than misdraw.\n\nfunction renderSiblingOfBrackets(\n layout: LayoutResult,\n ast?: DiagramAST\n): string {\n if (!ast) return group({ class: \"schematex-genogram-sibling-of-edges\" }, []);\n const elements: string[] = [];\n const nodeById = new Map(layout.nodes.map((n) => [n.id, n] as const));\n\n for (const ind of ast.individuals) {\n if (!ind.siblingOf) continue;\n const fromNode = nodeById.get(ind.id);\n const toNode = nodeById.get(ind.siblingOf);\n if (!fromNode || !toNode) continue;\n if (fromNode.generation !== toNode.generation) continue;\n\n const fromCx = fromNode.x + fromNode.width / 2;\n const fromTopY = fromNode.y;\n const toCx = toNode.x + toNode.width / 2;\n const toTopY = toNode.y;\n const bracketY = Math.min(fromTopY, toTopY) - 12;\n\n const path =\n `M ${fromCx} ${fromTopY} L ${fromCx} ${bracketY}` +\n ` L ${toCx} ${bracketY} L ${toCx} ${toTopY}`;\n elements.push(\n group(\n {\n class: \"schematex-genogram-sibling-of\",\n \"data-from\": ind.id,\n \"data-to\": ind.siblingOf,\n },\n [el(\"path\", { d: path })]\n )\n );\n }\n\n return group({ class: \"schematex-genogram-sibling-of-edges\" }, elements);\n}\n\nfunction renderLabels(\n nodes: LayoutNode[],\n config: RenderConfig\n): string {\n const labels: string[] = [];\n\n for (const node of nodes) {\n const ind = node.individual;\n const label = ind.label || ind.id;\n const cx = node.x + node.width / 2;\n const labelY = node.y + node.height + 6 + config.fontSize;\n\n let labelText = label.charAt(0).toUpperCase() + label.slice(1);\n if (ind.birthYear && ind.deathYear) {\n labelText += ` (${ind.birthYear}–${ind.deathYear})`;\n } else if (ind.birthYear) {\n labelText += ` (b. ${ind.birthYear})`;\n }\n\n labels.push(\n text(\n {\n x: cx,\n y: labelY,\n class: \"schematex-genogram-label\",\n \"data-individual-id\": ind.id,\n },\n labelText\n )\n );\n }\n\n return group({ class: \"schematex-genogram-labels\" }, labels);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseGenogram } from \"./parser\";\nimport { layoutGenogram } from \"./layout\";\nimport { renderGenogram } from \"./renderer\";\n\nexport { parseGenogram, ParseError } from \"./parser\";\nexport { layoutGenogram } from \"./layout\";\nexport { renderGenogram } from \"./renderer\";\nexport { renderIndividualSymbol, getRequiredDefs } from \"./symbols\";\n\nexport const genogram: DiagramPlugin = {\n type: \"genogram\",\n\n detect(text: string): boolean {\n const firstLine = firstContentLine(text)?.toLowerCase() ?? \"\";\n return firstLine === \"genogram\" || firstLine.startsWith(\"genogram \");\n },\n\n parse: parseGenogram,\n\n render(text: string, config?: RenderConfig): string {\n const ast = parseGenogram(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutGenogram(ast, layoutConfig);\n const renderConfig: RenderConfig = {\n fontFamily: config?.fontFamily ?? \"system-ui, -apple-system, sans-serif\",\n fontSize: config?.fontSize ?? 12,\n theme: config?.theme ?? \"default\",\n padding: config?.padding ?? 20,\n };\n return renderGenogram(layout, renderConfig, ast);\n },\n};\n"]}
|