schematex 0.2.2 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/ai-sdk.cjs +85 -0
- package/dist/ai/ai-sdk.cjs.map +1 -0
- package/dist/ai/ai-sdk.d.cts +30 -0
- package/dist/ai/ai-sdk.d.ts +30 -0
- package/dist/ai/ai-sdk.js +83 -0
- package/dist/ai/ai-sdk.js.map +1 -0
- package/dist/ai/index.cjs +60 -0
- package/dist/ai/index.cjs.map +1 -0
- package/dist/ai/index.d.cts +155 -0
- package/dist/ai/index.d.ts +155 -0
- package/dist/ai/index.js +23 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/browser.cjs +16 -15
- package/dist/browser.cjs.map +1 -1
- package/dist/browser.js +14 -13
- package/dist/browser.js.map +1 -1
- package/dist/{chunk-ZO77FHBF.cjs → chunk-2JDVJRR3.cjs} +14 -6
- package/dist/chunk-2JDVJRR3.cjs.map +1 -0
- package/dist/{chunk-QR7VTCI4.cjs → chunk-3YZ6FPQW.cjs} +13 -7
- package/dist/chunk-3YZ6FPQW.cjs.map +1 -0
- package/dist/{chunk-GEPBET4L.js → chunk-45KP67RR.js} +14 -6
- package/dist/chunk-45KP67RR.js.map +1 -0
- package/dist/{chunk-LKOBOVNL.cjs → chunk-5AEN2PLB.cjs} +14 -6
- package/dist/chunk-5AEN2PLB.cjs.map +1 -0
- package/dist/{chunk-7IRT3LOY.cjs → chunk-A5D2IMOX.cjs} +16 -8
- package/dist/chunk-A5D2IMOX.cjs.map +1 -0
- package/dist/{chunk-XVCAOGFL.cjs → chunk-B37IKTI7.cjs} +221 -44
- package/dist/chunk-B37IKTI7.cjs.map +1 -0
- package/dist/{chunk-ISACNVFE.cjs → chunk-B6INLQBU.cjs} +15 -9
- package/dist/chunk-B6INLQBU.cjs.map +1 -0
- package/dist/{chunk-YXIIWLLB.cjs → chunk-COLTVQWR.cjs} +174 -6
- package/dist/chunk-COLTVQWR.cjs.map +1 -0
- package/dist/chunk-DNZFOCV7.js +796 -0
- package/dist/chunk-DNZFOCV7.js.map +1 -0
- package/dist/chunk-DPQYGWCT.cjs +1121 -0
- package/dist/chunk-DPQYGWCT.cjs.map +1 -0
- package/dist/{chunk-XHZ7GXP2.cjs → chunk-E65ITQXV.cjs} +178 -22
- package/dist/chunk-E65ITQXV.cjs.map +1 -0
- package/dist/{chunk-LCR3KOJV.js → chunk-FCGHV6ZK.js} +16 -8
- package/dist/chunk-FCGHV6ZK.js.map +1 -0
- package/dist/{chunk-X2BQKXMA.js → chunk-FE6GAUNW.js} +13 -7
- package/dist/chunk-FE6GAUNW.js.map +1 -0
- package/dist/{chunk-YN467EEQ.js → chunk-H2OEUBPO.js} +547 -101
- package/dist/chunk-H2OEUBPO.js.map +1 -0
- package/dist/{chunk-Z3WOHHG3.js → chunk-J2LVOWVY.js} +177 -24
- package/dist/chunk-J2LVOWVY.js.map +1 -0
- package/dist/{chunk-CJ2A3UEQ.js → chunk-LR4X4ZRG.js} +179 -23
- package/dist/chunk-LR4X4ZRG.js.map +1 -0
- package/dist/{chunk-LXNFVHDT.cjs → chunk-MCFQAUQV.cjs} +21 -13
- package/dist/chunk-MCFQAUQV.cjs.map +1 -0
- package/dist/{chunk-Z63XPA2V.cjs → chunk-MJGDP3CS.cjs} +546 -100
- package/dist/chunk-MJGDP3CS.cjs.map +1 -0
- package/dist/chunk-MR5HU5WU.js +1112 -0
- package/dist/chunk-MR5HU5WU.js.map +1 -0
- package/dist/{chunk-7HKXU7J2.cjs → chunk-MSYBSOU2.cjs} +65 -38
- package/dist/chunk-MSYBSOU2.cjs.map +1 -0
- package/dist/{chunk-4KYW63IK.js → chunk-OC22GGQN.js} +222 -45
- package/dist/chunk-OC22GGQN.js.map +1 -0
- package/dist/{chunk-5UV5VQ7J.js → chunk-RP5UATRA.js} +174 -6
- package/dist/chunk-RP5UATRA.js.map +1 -0
- package/dist/{chunk-ZNZIL244.js → chunk-U6L3FAML.js} +15 -9
- package/dist/chunk-U6L3FAML.js.map +1 -0
- package/dist/{chunk-CXHPP5BL.cjs → chunk-UAGSCTYI.cjs} +177 -24
- package/dist/chunk-UAGSCTYI.cjs.map +1 -0
- package/dist/{chunk-5SH5NUDW.js → chunk-UGCUNADI.js} +21 -13
- package/dist/chunk-UGCUNADI.js.map +1 -0
- package/dist/chunk-ULYRO2KY.cjs +800 -0
- package/dist/chunk-ULYRO2KY.cjs.map +1 -0
- package/dist/{chunk-UUPYTUGR.js → chunk-VPKCW4PB.js} +54 -27
- package/dist/chunk-VPKCW4PB.js.map +1 -0
- package/dist/{chunk-6YMQSTFF.js → chunk-ZNDIGQJD.js} +14 -6
- package/dist/chunk-ZNDIGQJD.js.map +1 -0
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.d.cts +1 -1
- package/dist/diagrams/circuit/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.cjs +7 -6
- package/dist/diagrams/ecomap/index.d.cts +2 -2
- package/dist/diagrams/ecomap/index.d.ts +2 -2
- package/dist/diagrams/ecomap/index.js +2 -1
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.cjs +7 -7
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +1 -1
- package/dist/diagrams/flowchart/index.cjs +7 -7
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +1 -1
- package/dist/diagrams/genogram/index.cjs +9 -8
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -1
- package/dist/diagrams/ladder/index.cjs +5 -5
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +1 -1
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/orgchart/index.cjs +6 -6
- package/dist/diagrams/orgchart/index.d.cts +5 -2
- package/dist/diagrams/orgchart/index.d.ts +5 -2
- package/dist/diagrams/orgchart/index.js +1 -1
- package/dist/diagrams/pedigree/index.cjs +7 -6
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -1
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/sld/index.cjs +5 -5
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +1 -1
- package/dist/diagrams/sociogram/index.cjs +6 -5
- package/dist/diagrams/sociogram/index.d.cts +2 -1
- package/dist/diagrams/sociogram/index.d.ts +2 -1
- package/dist/diagrams/sociogram/index.js +2 -1
- package/dist/diagrams/timing/index.cjs +4 -4
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/timing/index.js +1 -1
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/{index-ga04CTBI.d.ts → index-BTZEka65.d.cts} +11 -2
- package/dist/{index-SSGpCggE.d.cts → index-DcU88F9i.d.ts} +11 -2
- package/dist/index.cjs +28 -27
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +13 -12
- package/dist/react.cjs +14 -13
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +13 -12
- package/dist/react.js.map +1 -1
- package/dist/{types-BcPhMdHd.d.ts → types-C4LnMEcB.d.cts} +58 -4
- package/dist/{types-BcPhMdHd.d.cts → types-C4LnMEcB.d.ts} +58 -4
- package/package.json +27 -5
- package/dist/chunk-4KYW63IK.js.map +0 -1
- package/dist/chunk-5SH5NUDW.js.map +0 -1
- package/dist/chunk-5UV5VQ7J.js.map +0 -1
- package/dist/chunk-6YMQSTFF.js.map +0 -1
- package/dist/chunk-7HKXU7J2.cjs.map +0 -1
- package/dist/chunk-7IRT3LOY.cjs.map +0 -1
- package/dist/chunk-CJ2A3UEQ.js.map +0 -1
- package/dist/chunk-CXHPP5BL.cjs.map +0 -1
- package/dist/chunk-GEPBET4L.js.map +0 -1
- package/dist/chunk-ISACNVFE.cjs.map +0 -1
- package/dist/chunk-LCR3KOJV.js.map +0 -1
- package/dist/chunk-LKOBOVNL.cjs.map +0 -1
- package/dist/chunk-LXNFVHDT.cjs.map +0 -1
- package/dist/chunk-QR7VTCI4.cjs.map +0 -1
- package/dist/chunk-UUPYTUGR.js.map +0 -1
- package/dist/chunk-X2BQKXMA.js.map +0 -1
- package/dist/chunk-XHZ7GXP2.cjs.map +0 -1
- package/dist/chunk-XVCAOGFL.cjs.map +0 -1
- package/dist/chunk-YN467EEQ.js.map +0 -1
- package/dist/chunk-YXIIWLLB.cjs.map +0 -1
- package/dist/chunk-Z3WOHHG3.js.map +0 -1
- package/dist/chunk-Z63XPA2V.cjs.map +0 -1
- package/dist/chunk-ZNZIL244.js.map +0 -1
- package/dist/chunk-ZO77FHBF.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/genogram/parser.ts","../src/diagrams/genogram/layout.ts","../src/diagrams/genogram/symbols.ts","../src/diagrams/genogram/renderer.ts","../src/diagrams/genogram/index.ts"],"names":["line","text","group","fu","title","el","rect","pattern","path","circle","defs","polygon","EMOTIONAL_REL_TYPES","desc","svgRoot","resolveGenogramTheme","cssCustomProperties","STROKE_WIDTH"],"mappings":"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","file":"chunk-Z63XPA2V.cjs","sourcesContent":["import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n Condition,\n ConditionFill,\n} from \"../../core/types\";\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\nconst COUPLE_OPS: Array<{ token: string; type: RelationshipType }> = [\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]);\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\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(\"#\")) {\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 rightIndividual = buildIndividual(rightId, rightProps, lineNum, lineText);\n individualsMap.set(rightKey, rightIndividual);\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(\"#\")) {\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 const { id: childId, propsStr } = splitIdAndProps(childTrimmed);\n const childKey = childId.toLowerCase();\n\n const individual = buildIndividual(\n childId,\n propsStr,\n childLineNum,\n childLine\n );\n\n // Check for special child properties (adopted, foster, twin)\n if (propsStr) {\n for (const sp of SPECIAL_CHILD_PROPS) {\n if (propsTokens(propsStr).includes(sp)) {\n childSpecialProps.set(childKey, sp);\n }\n }\n }\n\n individualsMap.set(childKey, individual);\n\n // parent-child relationship: from = \"leftKey+rightKey\"\n const coupleKey = `${leftKey}+${rightKey}`;\n const pcType = childSpecialProps.get(childKey);\n const relType: RelationshipType =\n pcType && (pcType === \"adopted\" || pcType === \"foster\")\n ? pcType\n : \"parent-child\";\n relationships.push({ type: relType, from: coupleKey, to: 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(key, mergeIndividual(existing, individual));\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 return {\n type: \"genogram\",\n individuals: Array.from(individualsMap.values()),\n relationships,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\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(\"#\")) {\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 (SPECIAL_CHILD_PROPS.has(tokenLower)) {\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 {\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, twin-identical, twin-fraternal, index, a 4-digit year, conditions:..., age:N, death:YYYY, 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\nfunction mergeIndividual(\n existing: Individual,\n incoming: Individual\n): Individual {\n return {\n ...existing,\n sex: incoming.sex !== \"unknown\" ? incoming.sex : existing.sex,\n status: incoming.status !== \"alive\" ? incoming.status : existing.status,\n birthYear: incoming.birthYear ?? existing.birthYear,\n deathYear: incoming.deathYear ?? existing.deathYear,\n conditions: incoming.conditions ?? existing.conditions,\n properties: {\n ...existing.properties,\n ...incoming.properties,\n },\n };\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 emotionalEdges = computeEmotionalEdges(ast.relationships, positions, config);\n return packageResult(positions, [...edges, ...emotionalEdges], graph, config);\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 === \"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\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 ) {\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\n const allIds = Array.from(individuals.keys());\n const roots = allIds.filter((id) => !childOf.has(id));\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 // 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 (sorted by birth year)\n const remaining = nodeIds.filter((id) => !placed.has(id));\n remaining.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 remaining) {\n ordered.push(id);\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);\n\n // Pass 3: Center children under parents (and drag partners)\n centerChildrenUnderParents(positions, graph, config);\n\n // Pass 4: Resolve any new overlaps introduced by centering\n resolveOverlaps(positions, orderedGens, config);\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\nfunction resolveOverlaps(\n positions: Map<string, NodePosition>,\n orderedGens: OrderedGeneration[],\n config: LayoutConfig\n): void {\n const minGap = config.nodeWidth + config.nodeSpacingX;\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 gap = genNodes[i].x - genNodes[i - 1].x;\n if (gap < minGap) {\n const shift = minGap - gap;\n // Push this and all subsequent nodes right\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)\n if (childPositions.length > 1) {\n const sibPath = `M ${leftX} ${dropY} L ${rightX} ${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\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));\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 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 if (neededFills.has(\"half-left\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-left-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"100%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-left-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"100\" }),\n ])\n );\n }\n\n if (neededFills.has(\"half-right\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-right-rect\" }, [\n rect({ x: \"50%\", y: \"0\", width: \"50%\", height: \"100%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-right-circle\" }, [\n rect({ x: \"0\", y: \"-50\", width: \"50\", height: \"100\" }),\n ])\n );\n }\n\n if (neededFills.has(\"half-bottom\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-bottom-rect\" }, [\n rect({ x: \"0\", y: \"50%\", width: \"100%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-bottom-circle\" }, [\n rect({ x: \"-50\", y: \"0\", width: \"100\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quarter\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quarter-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quarter-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"half-top\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-top-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"100%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-top-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"100\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-tl\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tl-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tl-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-tr\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tr-rect\" }, [\n rect({ x: \"50%\", y: \"0\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tr-circle\" }, [\n rect({ x: \"0\", y: \"-50\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-bl\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-bl-rect\" }, [\n rect({ x: \"0\", y: \"50%\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-bl-circle\" }, [\n rect({ x: \"-50\", y: \"0\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-br\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-br-rect\" }, [\n rect({ x: \"50%\", y: \"50%\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-br-circle\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50\", height: \"50\" }),\n ])\n );\n }\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(sex: Individual[\"sex\"], half: number): string {\n switch (sex) {\n case \"male\":\n return rect({\n x: -half,\n y: -half,\n width: half * 2,\n height: half * 2,\n class: \"schematex-genogram-shape\",\n });\n case \"female\":\n return circle({\n cx: 0,\n cy: 0,\n r: half,\n class: \"schematex-genogram-shape\",\n });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return polygon({\n points: `0,${-half} ${half},0 0,${half} ${-half},0`,\n class: \"schematex-genogram-shape\",\n });\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","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\";\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 const edgeLabelLayer = renderEdgeLabels(structuralEdges, config);\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 if (chartTitle) {\n layers.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\n // Wrap content in a group with title offset\n const contentGroup = group(\n { transform: titleHeight > 0 ? `translate(0, ${titleHeight})` : undefined },\n [edgeLayers, emotionalLayer, ...nodeLayers, labelLayer, edgeLabelLayer]\n );\n layers.push(contentGroup);\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${totalHeight}`,\n class: \"schematex-diagram schematex-genogram\",\n width: layout.width,\n height: totalHeight,\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 background: ${t.bg};\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-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-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-genogram-condition-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 cssClass = `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 // 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// ─── Labels ─────────────────────────────────────────────────\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 { 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 = text.trim().split(\"\\n\")[0]?.trim().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"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/ladder/parser.ts","../src/diagrams/ladder/layout.ts","../src/diagrams/ladder/renderer.ts","../src/diagrams/ladder/index.ts"],"names":["text","title","el","w","h","slot","nx","ny","id","LINE_H"],"mappings":";;;;AAaO,IAAM,gBAAA,GAAN,cAA+B,KAAA,CAAM;AAAA,EAC1C,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF,CAAA;AAEA,IAAM,aAAA,uBAAoB,GAAA,CAAuB,CAAC,OAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAC7E,IAAM,UAAA,uBAAiB,GAAA,CAAoB,CAAC,OAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AACvE,IAAM,QAAA,uBAAe,GAAA,CAAkB;AAAA,EACrC,KAAA;AAAA,EAAO,MAAA;AAAA,EAAQ,IAAA;AAAA,EACf,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,MAAA;AAAA,EACd,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EACrB,KAAA;AAAA,EACA,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO,KAAA;AAAA,EAAO;AACrC,CAAC,CAAA;AAGD,SAAS,UAAU,CAAA,EAAqB;AACtC,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,KAAA,MAAW,MAAM,CAAA,EAAG;AAClB,IAAA,IAAI,EAAA,KAAO,GAAA,EAAK,OAAA,GAAU,CAAC,OAAA;AAC3B,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,CAAC,OAAA,EAAS;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,CAAA;AACnB,MAAA,GAAA,GAAM,EAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,EAAA;AAAA,IACT;AAAA,EACF;AACA,EAAA,IAAI,IAAI,IAAA,EAAK,MAAO,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA;AACnC,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,YAAY,CAAA,EAAmB;AACtC,EAAA,MAAM,CAAA,GAAI,EAAE,IAAA,EAAK;AACjB,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG,OAAO,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAC9D,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,YAAA,CAAa,MAAc,MAAA,EAA+B;AACjE,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,4CAA4C,CAAA;AACjE,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,MAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAE,CAAA;AAAA,EAC9E;AACA,EAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,CAAA,CAAE,CAAC,CAAC,CAAA;AAC3B,EAAA,IAAI,KAAK,MAAA,KAAW,CAAA,IAAK,CAAC,IAAA,CAAK,CAAC,CAAA,EAAG;AACjC,IAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,MAAM,CAAA,uBAAA,EAA0B,IAAI,CAAA,CAAE,CAAA;AAAA,EAC3E;AACA,EAAA,MAAM,GAAA,GAAM,KAAK,CAAC,CAAA;AAElB,EAAA,IAAI,aAAA,CAAc,GAAA,CAAI,EAAuB,CAAA,EAAG;AAC9C,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,WAAA,EAAa,SAAA;AAAA,MACb,WAAA,EAAa,EAAA;AAAA,MACb;AAAA,KACF;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA;AACvC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,GAAA,GAAM,EAAA,CAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAC9B,QAAA,IAAI,QAAQ,SAAA,EAAW,OAAA,CAAQ,UAAU,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,aAAA,IACjD,QAAQ,MAAA,EAAQ,OAAA,CAAQ,OAAO,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,MAC3D,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,OAAA,GAAU,YAAY,CAAC,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,CAAW,GAAA,CAAI,EAAoB,CAAA,EAAG;AACxC,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,WAAA,EAAa,MAAA;AAAA,MACb,QAAA,EAAU,EAAA;AAAA,MACV;AAAA,KACF;AACA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA;AACvC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,GAAA,GAAM,EAAA,CAAG,CAAC,CAAA,CAAE,WAAA,EAAY;AAC9B,QAAA,IAAI,QAAQ,SAAA,EAAW,IAAA,CAAK,UAAU,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,aAAA,IAC9C,QAAQ,MAAA,EAAQ,IAAA,CAAK,OAAO,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AAAA,MACxD,CAAA,MAAO;AACL,QAAA,IAAA,CAAK,OAAA,GAAU,YAAY,CAAC,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAA,CAAS,GAAA,CAAI,EAAkB,CAAA,EAAG;AACpC,IAAA,MAAM,SAA0C,EAAC;AACjD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,CAAA,GAAI,KAAK,CAAC,CAAA;AAChB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA;AACvC,MAAA,IAAI,EAAA,EAAI;AACN,QAAA,MAAM,CAAA,GAAI,WAAA,CAAY,EAAA,CAAG,CAAC,CAAC,CAAA;AAC3B,QAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,QAAA,MAAA,CAAO,EAAA,CAAG,CAAC,CAAC,CAAA,GAAI,OAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,KAAM,EAAA,IAAM,iBAAA,CAAkB,IAAA,CAAK,CAAC,IAAI,CAAA,GAAI,CAAA;AAAA,MACpF;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAA0B;AAAA,MAC9B,WAAA,EAAa,gBAAA;AAAA,MACb,MAAA,EAAQ,EAAA;AAAA,MACR,GAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,MAAM,CAAA,wBAAA,EAA2B,EAAE,CAAA,CAAA,CAAG,CAAA;AAC3E;AAEO,SAAS,eAAeA,KAAAA,EAAyB;AACtD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAC,CAAA;AACjE,EAAA,IAAIC,MAAAA;AACJ,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,IAAI,WAAA,GAAiC,IAAA;AACrC,EAAA,IAAI,eAAA,GAAyC,IAAA;AAC7C,EAAA,IAAI,aAAA,GAAqC,IAAA;AACzC,EAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,EAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,EAAA,SAAS,cAAA,GAAiB;AACxB,IAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,MAAA,WAAA,CAAY,QAAA,CAAS,IAAA,CAAK,EAAE,QAAA,EAAU,iBAAiB,CAAA;AAAA,IACzD;AACA,IAAA,eAAA,GAAkB,IAAA;AAClB,IAAA,aAAA,GAAgB,IAAA;AAChB,IAAA,cAAA,GAAiB,EAAA;AACjB,IAAA,YAAA,GAAe,EAAA;AAAA,EACjB;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,IAAA,MAAM,SAAS,CAAA,GAAI,CAAA;AACnB,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACvC,IAAA,IAAI,CAAC,QAAA,CAAS,IAAA,EAAK,EAAG;AAGtB,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,MAAA,IAAI,OAAO,GAAA,EAAK,MAAA,EAAA;AAAA,WAAA,IACP,EAAA,KAAO,KAAM,MAAA,IAAU,CAAA;AAAA,WAC3B;AAAA,IACP;AACA,IAAA,MAAM,IAAA,GAAO,SAAS,IAAA,EAAK;AAG3B,IAAA,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AAChC,MAAA,IAAI,CAAA,EAAGA,MAAAA,GAAQ,CAAA,CAAE,CAAC,CAAA;AAClB,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,yCAAyC,CAAA;AACtE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,cAAA,EAAe;AACf,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,IAAI,WAAA,CAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACrC,UAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,WAAA,CAAY,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,QACrE;AACA,QAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,MACxB;AACA,MAAA,WAAA,GAAc;AAAA,QACZ,MAAA,EAAQ,MAAA,CAAO,SAAA,CAAU,CAAC,CAAC,CAAA;AAAA,QAC3B,OAAA,EAAS,UAAU,CAAC,CAAA;AAAA,QACpB,UAAU;AAAC,OACb;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,MAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AAAA,IAC/E;AAGA,IAAA,IAAI,oBAAA,CAAqB,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,cAAA,EAAe;AACf,MAAA,eAAA,GAAkB,EAAC;AACnB,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAA,EAAG;AACjC,MAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,QAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,MAAM,CAAA,2BAAA,CAA6B,CAAA;AAAA,MACxE;AACA,MAAA,aAAA,GAAgB,EAAE,QAAA,EAAU,EAAC,EAAE;AAC/B,MAAA,eAAA,CAAgB,KAAK,aAAa,CAAA;AAClC,MAAA,YAAA,GAAe,MAAA;AACf,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,eAAA,IAAmB,UAAU,cAAA,EAAgB;AAC/C,MAAA,cAAA,EAAe;AAAA,IACjB;AAEA,IAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,MAAM,CAAA;AAEzC,IAAA,IAAI,eAAA,IAAmB,aAAA,IAAiB,MAAA,GAAS,YAAA,EAAc;AAC7D,MAAA,aAAA,CAAc,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,IAAI,iBAAiB,cAAA,EAAe;AACpC,MAAA,WAAA,CAAY,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACnC;AAAA,EACF;AAEA,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,IAAI,WAAA,CAAY,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,gBAAA,CAAiB,CAAA,KAAA,EAAQ,WAAA,CAAY,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IACrE;AACA,IAAA,KAAA,CAAM,KAAK,WAAW,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,iBAAiB,6BAA6B,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAAA,QAAO,KAAA,EAAM;AACxC;;;AC5OO,IAAM,WAAA,GAAc,EAAA;AACpB,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,cAAA,GAAiB,EAAA;AACvB,IAAM,QAAA,GAAW,EAAA;AACjB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,cAAA,GAAiB,EAAA;AAG9B,IAAM,MAAA,GAAS,GAAA;AACf,IAAM,MAAA,GAAS,EAAA;AAiDf,IAAM,aAAA,mBAAgB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,OAAO,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAK,CAAC,CAAA;AAExE,SAAS,UAAUC,GAAAA,EAA2B;AAC5C,EAAA,IAAIA,GAAAA,CAAG,gBAAgB,gBAAA,EAAkB;AACvC,IAAA,IAAI,aAAA,CAAc,GAAA,CAAIA,GAAAA,CAAG,MAAM,GAAG,OAAO,SAAA;AACzC,IAAA,OAAO,QAAA;AAAA,EACT;AACA,EAAA,OAAO,aAAA;AACT;AAEA,SAAS,WAAWA,GAAAA,EAA2B;AAC7C,EAAA,IAAIA,GAAAA,CAAG,gBAAgB,gBAAA,EAAkB;AACvC,IAAA,IAAI,aAAA,CAAc,GAAA,CAAIA,GAAAA,CAAG,MAAM,GAAG,OAAO,UAAA;AACzC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,cAAA;AACT;AAEA,SAAS,YAAYA,GAAAA,EAAsC;AACzD,EAAA,IAAIA,GAAAA,CAAG,WAAA,KAAgB,SAAA,EAAW,OAAO,SAAA;AACzC,EAAA,IAAIA,GAAAA,CAAG,WAAA,KAAgB,MAAA,EAAQ,OAAO,MAAA;AACtC,EAAA,IAAI,aAAA,CAAc,GAAA,CAAIA,GAAAA,CAAG,MAAM,GAAG,OAAO,SAAA;AACzC,EAAA,OAAO,gBAAA;AACT;AAGO,SAAS,QAAA,CAAS,IAAA,EAAc,QAAA,GAAW,EAAA,EAAc;AAC9D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,MAAM,QAAQ,GAAA,GAAM,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,GAAK,CAAA;AACpC,IAAA,IAAI,KAAA,CAAM,MAAA,GAAS,QAAA,IAAY,GAAA,EAAK;AAClC,MAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,MAAA,GAAA,GAAM,CAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA,GAAA,GAAM,KAAA;AAAA,IACR;AAAA,EACF;AACA,EAAA,IAAI,GAAA,EAAK,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AACzB;AAEA,SAAS,2BAA2BA,GAAAA,EAA6B;AAC/D,EAAA,IAAIA,IAAG,WAAA,KAAgB,gBAAA,EAAkB,OAAO,CAACA,IAAG,GAAG,CAAA;AACvD,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAIA,GAAAA,CAAG,MAAM,KAAA,CAAM,IAAA,CAAK,GAAG,QAAA,CAASA,GAAAA,CAAG,IAAI,CAAC,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,CAAKA,IAAG,GAAG,CAAA;AACjB,EAAA,IAAIA,GAAAA,CAAG,OAAA,EAAS,KAAA,CAAM,IAAA,CAAKA,IAAG,OAAO,CAAA;AACrC,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,WAAWA,GAAAA,EAA2B;AAC7C,EAAA,MAAM,KAAA,GAAQ,2BAA2BA,GAAE,CAAA;AAC3C,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO,IAAI,EAAE,MAAA,GAAS,QAAA,aAAqB,CAAA,CAAE,MAAA;AAC7D,EAAA,OAAO,QAAA,GAAW,MAAA;AACpB;AAGA,SAAS,UAAUA,GAAAA,EAA2B;AAC5C,EAAA,OAAO,IAAA,CAAK,IAAI,SAAA,CAAUA,GAAE,GAAG,UAAA,CAAWA,GAAE,CAAC,CAAA,GAAI,CAAA;AACnD;AAGA,SAAS,eAAeA,GAAAA,EAA2B;AACjD,EAAA,IAAIA,GAAAA,CAAG,WAAA,KAAgB,gBAAA,EAAkB,OAAO,CAAA;AAChD,EAAA,MAAM,OAAOA,GAAAA,CAAG,IAAA,GAAO,SAASA,GAAAA,CAAG,IAAI,EAAE,MAAA,GAAS,CAAA;AAClD,EAAA,OAAO,IAAA,GAAO,CAAA;AAChB;AAEA,SAAS,eAAeA,GAAAA,EAA2B;AACjD,EAAA,IAAIA,GAAAA,CAAG,WAAA,KAAgB,gBAAA,EAAkB,OAAO,CAAA;AAChD,EAAA,IAAKA,GAAAA,CAA4B,SAAS,OAAO,CAAA;AACjD,EAAA,OAAO,CAAA;AACT;AAGA,SAAS,sBAAsB,IAAA,EAA0B;AACvD,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,QAAA,EAAU;AAChC,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,MAAM,EAAA,GAAK,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AAEvC,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA;AACjC,MAAA,IAAI,CAAC,SAAA,EAAW;AAChB,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,QACrB,CAAA;AAAA,QACA,GAAG,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAC;AAAA,OACpD;AACA,MAAA,MAAM,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,SAAA,GAAY,MAAA,GAAS,CAAA;AACzC,MAAA,IAAI,EAAA,GAAK,YAAY,UAAA,GAAa,EAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,MAAA,MAAM,KAAK,UAAA,CAAW,IAAI,CAAA,GAAI,CAAA,GAAI,OAAO,MAAA,GAAS,CAAA;AAClD,MAAA,IAAI,EAAA,GAAK,YAAY,UAAA,GAAa,EAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,sBAAsB,IAAA,EAA0B;AACvD,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,QAAA,EAAU;AAChC,IAAA,IAAI,cAAc,IAAA,EAAM;AACtB,MAAA,MAAM,EAAA,GAAK,cAAA,CAAe,IAAA,CAAK,QAAQ,CAAA;AACvC,MAAA,MAAM,eAAe,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,QAAA,CAAS,SAAS,CAAC,CAAA;AAC3D,MAAA,IAAI,CAAC,YAAA,EAAc;AACnB,MAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,QACrB,CAAA;AAAA,QACA,GAAG,aAAa,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAC;AAAA,OACvD;AACA,MAAA,MAAM,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,SAAA,GAAY,MAAA,GAAS,CAAA;AACzC,MAAA,IAAI,EAAA,GAAK,YAAY,UAAA,GAAa,EAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,MAAM,IAAA,GAAO,eAAe,IAAI,CAAA;AAChC,MAAA,MAAM,KAAK,UAAA,CAAW,IAAI,CAAA,GAAI,CAAA,GAAI,OAAO,MAAA,GAAS,CAAA;AAClD,MAAA,IAAI,EAAA,GAAK,YAAY,UAAA,GAAa,EAAA;AAAA,IACpC;AAAA,EACF;AACA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,kBAAkB,MAAA,EAA8B;AACvD,EAAA,IAAI,MAAA,CAAO,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,aAAA;AACzC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAACA,GAAAA,EAAI,CAAA,KAAM;AACjC,IAAA,CAAA,IAAK,UAAUA,GAAE,CAAA;AACjB,IAAA,IAAI,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,MAAA,GAAS,GAAG,CAAA,IAAK,SAAA;AAAA,EAC3C,CAAC,CAAA;AACD,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,cAAc,QAAA,EAAkC;AACvD,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA;AAAA,IACrB,aAAA;AAAA,IACA,GAAG,QAAA,CAAS,GAAA,CAAI,iBAAiB;AAAA,GACnC;AACA,EAAA,OAAO,YAAY,CAAA,GAAI,SAAA;AACzB;AAGA,SAAS,gBAAgB,MAAA,EAA8B;AACrD,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,IACjB,cAAA;AAAA,IACA,GAAG,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC;AAAA,GAC7C;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAC,CAAC,CAAA;AAC1E,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAC,CAAC,CAAA;AAC1E,EAAA,OAAO,KAAA,GAAQ,KAAA,GAAQ,MAAA,GAAS,KAAA,GAAQ,MAAA,GAAS,CAAA;AACnD;AAEA,SAAS,eAAe,QAAA,EAAkC;AAExD,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,EAAA,EAAI,CAAA,KAAM;AAC1B,IAAA,KAAA,IAAS,gBAAgB,EAAE,CAAA;AAC3B,IAAA,IAAI,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG,KAAA,IAAS,YAAA;AAAA,EACxC,CAAC,CAAA;AACD,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,cAAc,CAAA;AACvC;AAEO,SAAS,aAAa,GAAA,EAAoC;AAC/D,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,MAAM,QAA4B,EAAC;AAEnC,EAAA,IAAI,UAAU,WAAA,GAAc,GAAA;AAC5B,EAAA,IAAI,OAAA,GAAU,aAAA;AAEd,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,SAAA,KAAc;AACrC,IAAA,MAAM,OAAA,GAAU,sBAAsB,IAAI,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,sBAAsB,IAAI,CAAA;AAE1C,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,kBAAkB,EAAA,GAAK,OAAA,GAAU,UAAU,EAAE,CAAA;AACzE,IAAA,MAAM,KAAA,GAAQ,UAAU,EAAA,GAAK,OAAA;AAE7B,IAAA,IAAI,IAAI,WAAA,GAAc,SAAA;AACtB,IAAA,IAAI,UAAA,GAAa,WAAA;AACjB,IAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,IAAA,MAAM,OAAA,GAAU,CAAC,EAAA,EAAY,EAAA,EAAY,IAAY,EAAA,KAAe;AAClE,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,IACpD,CAAA;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,IAAA,EAAM,KAAA,KAAU;AACrC,MAAA,IAAI,cAAc,IAAA,EAAM;AACtB,QAAA,MAAM,WAAW,IAAA,CAAK,QAAA;AACtB,QAAA,MAAM,EAAA,GAAK,cAAc,QAAQ,CAAA;AACjC,QAAA,MAAM,EAAA,GAAK,eAAe,QAAQ,CAAA;AAClC,QAAA,MAAM,EAAA,GAAK,CAAA;AACX,QAAA,MAAM,KAAK,CAAA,GAAI,EAAA;AAEf,QAAA,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI,KAAK,CAAA;AAEzC,QAAA,MAAM,MAAA,GAAS,QAAQ,EAAA,GAAK,CAAA;AAC5B,QAAA,MAAM,MAAA,GAAS,QAAQ,EAAA,GAAK,CAAA;AAC5B,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,CAAA;AAC1D,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,GAAA,EAAM,EAAE,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,CAAA;AAG1D,QAAA,IAAI,IAAA,GAAO,MAAA;AACX,QAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAA,EAAQ,IAAA,KAAS;AACjC,UAAA,MAAM,IAAA,GAAO,gBAAgB,MAAM,CAAA;AACnC,UAAA,MAAM,UAAU,IAAA,CAAK,GAAA;AAAA,YACnB,cAAA;AAAA,YACA,GAAG,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAC,CAAC;AAAA,WAC7C;AACA,UAAA,MAAM,QAAQ,IAAA,CAAK,GAAA;AAAA,YACjB,CAAA;AAAA,YACA,GAAG,OAAO,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,KAAM,cAAA,CAAe,CAAC,CAAC;AAAA,WACjD;AAEA,UAAA,MAAM,OAAA,GAAU,IAAA,GAAO,KAAA,GAAQ,MAAA,GAAS,OAAA,GAAU,CAAA;AAClD,UAAA,MAAM,OAAA,GAAU,kBAAkB,MAAM,CAAA;AACxC,UAAA,MAAM,SAAS,EAAA,GAAK,SAAA,GAAA,CAAc,KAAK,EAAA,GAAK,CAAA,GAAI,YAAa,OAAA,IAAW,CAAA;AACxE,UAAA,IAAI,GAAA,GAAM,MAAA;AACV,UAAA,IAAI,MAAA,GAAS,EAAA;AACb,UAAA,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,CAAC,GAAA,EAAK,KAAA,KAAU;AACtC,YAAA,MAAMC,EAAAA,GAAI,UAAU,GAAG,CAAA;AACvB,YAAA,MAAMC,EAAAA,GAAI,WAAW,GAAG,CAAA;AACxB,YAAA,MAAMC,KAAAA,GAAO,UAAU,GAAG,CAAA;AAC1B,YAAA,MAAMC,GAAAA,GAAK,GAAA,GAAA,CAAOD,KAAAA,GAAOF,EAAAA,IAAK,CAAA;AAC9B,YAAA,MAAMI,GAAAA,GAAK,UAAUH,EAAAA,GAAI,CAAA;AACzB,YAAA,MAAMI,GAAAA,GAAK,IAAI,IAAA,CAAK,MAAM,KAAK,KAAK,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA;AACvD,YAAA,KAAA,CAAM,IAAA,CAAK;AAAA,cACT,EAAA,EAAAA,GAAAA;AAAA,cACA,SAAA;AAAA,cACA,OAAA,EAAS,GAAA;AAAA,cACT,IAAA,EAAM,YAAY,GAAG,CAAA;AAAA,cACrB,CAAA,EAAGF,GAAAA;AAAA,cACH,CAAA,EAAGC,GAAAA;AAAA,cACH,KAAA,EAAOJ,EAAAA;AAAA,cACP,MAAA,EAAQC,EAAAA;AAAA,cACR,KAAA,EAAO;AAAA,aACR,CAAA;AACD,YAAA,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAASE,GAAAA,EAAI,OAAO,CAAA;AACpC,YAAA,MAAA,GAASA,GAAAA,GAAKH,EAAAA;AACd,YAAA,GAAA,IAAOE,KAAAA,GAAO,SAAA;AAAA,UAChB,CAAC,CAAA;AACD,UAAA,OAAA,CAAQ,MAAA,EAAQ,OAAA,EAAS,EAAA,EAAI,OAAO,CAAA;AACpC,UAAA,IAAA,IAAQ,IAAA,GAAO,YAAA;AAAA,QACjB,CAAC,CAAA;AAED,QAAA,UAAA,GAAa,EAAA;AACb,QAAA,UAAA,GAAa,KAAA;AACb,QAAA,CAAA,GAAI,EAAA,GAAK,SAAA;AACT,QAAA;AAAA,MACF;AAEA,MAAA,MAAMH,GAAAA,GAAK,IAAA;AACX,MAAA,MAAM,CAAA,GAAI,UAAUA,GAAE,CAAA;AACtB,MAAA,MAAM,CAAA,GAAI,WAAWA,GAAE,CAAA;AACvB,MAAA,MAAM,IAAA,GAAO,UAAUA,GAAE,CAAA;AACzB,MAAA,MAAM,EAAA,GAAK,CAAA,GAAA,CAAK,IAAA,GAAO,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,QAAQ,CAAA,GAAI,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAM,KAAK,KAAK,CAAA,CAAA;AACpC,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,EAAA;AAAA,QACA,SAAA;AAAA,QACA,OAAA,EAASA,GAAAA;AAAA,QACT,IAAA,EAAM,YAAYA,GAAE,CAAA;AAAA,QACpB,CAAA,EAAG,EAAA;AAAA,QACH,CAAA,EAAG,EAAA;AAAA,QACH,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR;AAAA,OACD,CAAA;AACD,MAAA,OAAA,CAAQ,UAAA,EAAY,UAAA,EAAY,EAAA,EAAI,KAAK,CAAA;AACzC,MAAA,UAAA,GAAa,EAAA,GAAK,CAAA;AAClB,MAAA,UAAA,GAAa,KAAA;AACb,MAAA,CAAA,IAAK,IAAA,GAAO,SAAA;AAAA,IACd,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,CAAA,EAAG,KAAA;AAAA,MACH,IAAA,EAAM,UAAA;AAAA,MACN,MAAA,EAAQ,UAAA;AAAA,MACR,YAAA,EAAc;AAAA,KACf,CAAA;AACD,IAAA,IAAI,UAAA,GAAa,SAAS,OAAA,GAAU,UAAA;AACpC,IAAA,OAAA,IAAW,UAAA;AAAA,EACb,CAAC,CAAA;AAED,EAAA,MAAM,UAAA,GAAa,UAAU,SAAA,GAAY,CAAA;AACzC,EAAA,MAAM,QAAQ,UAAA,GAAa,iBAAA;AAC3B,EAAA,MAAM,SAAS,OAAA,GAAU,cAAA;AAEzB,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,CAAA,EAAA,EAAK,EAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,MAAM,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,IAAI,CAAA;AAAA,EAClE;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA,EAAW,WAAA;AAAA,IACX,UAAA;AAAA,IACA,KAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACnWA,SAAS,SAAS,CAAA,EAAe;AAC/B,EAAA,OAAO;AAAA,yBAAA,EACkB,EAAE,EAAE,CAAA;AAAA,0BAAA,EACH,EAAE,WAAW,CAAA;AAAA,0BAAA,EACb,EAAE,MAAM,CAAA;AAAA,6BAAA,EACL,EAAE,MAAM,CAAA;AAAA,0BAAA,EACX,EAAE,MAAM,CAAA;AAAA,sBAAA,EACZ,CAAA,CAAE,EAAE,CAAA,UAAA,EAAa,CAAA,CAAE,MAAM,CAAA;AAAA,uDAAA,EACQ,EAAE,IAAI,CAAA;AAAA,6CAAA,EAChB,EAAE,MAAM,CAAA;AAAA,8CAAA,EACP,EAAE,IAAI,CAAA;AAAA,qFAAA,EACiC,EAAE,MAAM,CAAA;AAAA,iEAAA,EAC5B,EAAE,KAAK,CAAA;AAAA,mDAAA,EACrB,EAAE,SAAS,CAAA;AAAA,yDAAA,EACL,EAAE,SAAS,CAAA;AAAA,qDAAA,EACf,EAAE,IAAI,CAAA;AAAA,4DAAA,EACC,EAAE,MAAM,CAAA;AAAA,CAAA,CACpE,IAAA,EAAK;AACP;AAEA,IAAMO,OAAAA,GAAS,EAAA;AAEf,SAAS,WAAA,CACP,IAAA,EACA,GAAA,EACA,EAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,SAAA,GAAY,IAAA,GAAO,QAAA,CAAS,IAAI,IAAI,EAAC;AAC3C,EAAA,MAAM,UAAA,GAAa,UAAU,MAAA,GAAS,CAAA;AACtC,EAAA,MAAM,MAAA,GAAS,QAAA,GAAW,CAAA,GAAA,CAAK,UAAA,GAAa,CAAA,IAAKA,OAAAA;AACjD,EAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AAC7B,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,MAAA,GAAS,CAAA,GAAIA,OAAAA,EAAQ,KAAA,EAAO,gBAAA,EAAiB,EAAG,IAAI;AAAA,KACvE;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,IAAA;AAAA,MACE,EAAE,GAAG,EAAA,EAAI,CAAA,EAAG,SAAS,SAAA,CAAU,MAAA,GAASA,OAAAA,EAAQ,KAAA,EAAO,eAAA,EAAgB;AAAA,MACvE;AAAA;AACF,GACF;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,cAAc,IAAA,EAAgC;AACrD,EAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,IAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,WAAW,CAAA,GAAI,CAAA;AACrB,EAAA,MAAM,SAAA,GAAY,IAAI,CAAA,GAAI,CAAA;AAC1B,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,UAAU,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AACxF,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,GAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAC7F,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,UAAU,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,QAAA,EAAU,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,mBAAA,EAAqB,CAAC,CAAA;AACpG,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,WAAW,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,mBAAA,EAAqB,CAAC,CAAA;AAEtG,EAAA,IAAI,CAAA,CAAE,gBAAgB,KAAA,EAAO;AAC3B,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,GAAG,MAAA,EAAQ;AAAA,QACT,IAAI,QAAA,GAAW,CAAA;AAAA,QACf,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,QACZ,IAAI,SAAA,GAAY,CAAA;AAAA,QAChB,IAAI,CAAA,GAAI,CAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR;AAAA,KACH;AAAA,EACF,CAAA,MAAA,IAAW,CAAA,CAAE,WAAA,KAAgB,KAAA,EAAO;AAClC,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,wBAAA,EAAyB,EAAG,QAAG,CAAC,CAAA;AAAA,EAC9E,CAAA,MAAA,IAAW,CAAA,CAAE,WAAA,KAAgB,KAAA,EAAO;AAClC,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,wBAAA,EAAyB,EAAG,QAAG,CAAC,CAAA;AAAA,EAC9E;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA,EAAK,EAAA,EAAI,CAAC,CAAC,CAAA;AAChD,EAAA,IAAI,EAAE,OAAA,EAAS;AACb,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,OAAO;AAAA,KACnE;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,EAAE,cAAA,EAAgB,SAAA,EAAW,YAAY,CAAA,CAAE,GAAA,IAAO,MAAM,CAAA;AACvE;AAEA,SAAS,WAAW,IAAA,EAAgC;AAClD,EAAA,MAAM,IAAI,IAAA,CAAK,OAAA;AACf,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,IAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,OAAA,GAAU,CAAA,EAAA,EAAK,CAAA,GAAI,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,CAAA,GAAI,CAAC,CAAA,OAAA,EAAU,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AACrE,EAAA,MAAM,WAAW,CAAA,EAAA,EAAK,CAAA,GAAI,CAAA,GAAI,CAAC,IAAI,CAAC,CAAA,MAAA,EAAS,CAAA,GAAI,CAAC,UAAU,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,CAAA,CAAA;AAC9E,EAAA,MAAA,CAAO,IAAA,CAAK,KAAO,EAAE,CAAA,EAAG,SAAS,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAC3D,EAAA,MAAA,CAAO,IAAA,CAAK,KAAO,EAAE,CAAA,EAAG,UAAU,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAC5D,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,GAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,GAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AACrF,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAI,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAE7F,EAAA,IAAI,KAAA,GAAQ,EAAA;AACZ,EAAA,IAAI,CAAA,CAAE,QAAA,KAAa,KAAA,EAAO,KAAA,GAAQ,GAAA;AAAA,OAAA,IACzB,CAAA,CAAE,QAAA,KAAa,KAAA,EAAO,KAAA,GAAQ,GAAA;AAAA,OAAA,IAC9B,CAAA,CAAE,QAAA,KAAa,KAAA,EAAO,KAAA,GAAQ,GAAA;AACvC,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,GAAK,CAAA,EAAG,KAAA,EAAO,wBAAA,EAAyB,EAAG,KAAK,CAAC,CAAA;AAAA,EAChF;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,GAAG,WAAA,CAAY,CAAA,CAAE,MAAM,CAAA,CAAE,GAAA,EAAK,EAAA,EAAI,CAAC,CAAC,CAAA;AAChD,EAAA,IAAI,EAAE,OAAA,EAAS;AACb,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAiB,EAAG,CAAA,CAAE,OAAO;AAAA,KACnE;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,EAAE,cAAA,EAAgB,MAAA,EAAQ,YAAY,CAAA,CAAE,GAAA,IAAO,MAAM,CAAA;AACpE;AAEA,SAAS,cAAc,IAAA,EAAgC;AACrD,EAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,IAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAC5E,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB,EAAG,EAAA,CAAG,MAAM,CAAC,CAAA;AAC7E,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,MAAM,CAAA;AACxC,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AACzC,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,KAAK,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,OAAO,eAAA,EAAgB,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE;AAAA,KAC3E;AAAA,EACF,CAAC,CAAA;AACD,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,GAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AACrF,EAAA,MAAA,CAAO,KAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,CAAA,GAAI,GAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,EAAI,IAAI,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAC7F,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,eAAA,EAAgB,EAAG,EAAA,CAAG,GAAG,CAAC,CAAA;AACrE,EAAA,OAAO,KAAA,CAAM,EAAE,cAAA,EAAgB,SAAA,EAAW,YAAY,EAAA,CAAG,GAAA,IAAO,MAAM,CAAA;AACxE;AAEA,SAAS,oBAAoB,IAAA,EAAgC;AAC3D,EAAA,MAAM,KAAK,IAAA,CAAK,OAAA;AAChB,EAAA,MAAM,EAAE,CAAA,EAAG,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,EAAQ,GAAE,GAAI,IAAA;AACtC,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,EAAA,GAAK,IAAI,CAAA,GAAI,CAAA;AACnB,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,MAAA,CAAO,IAAA,CAAK,EAAA,CAAG,MAAA,EAAQ,EAAE,CAAA,EAAG,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,cAAA,EAAgB,CAAC,CAAA;AAC5E,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,KAAA,EAAO,mBAAA,EAAoB,EAAG,EAAA,CAAG,MAAM,CAAC,CAAA;AAE7E,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,EAAA,CAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,kBAAkB;AAAA,GAC1E;AACA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,GAAG,MAAA,EAAQ,EAAE,EAAA,EAAI,CAAA,GAAI,GAAG,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,KAAA,EAAO,kBAAkB;AAAA,GAClF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,EAAA,CAAG,MAAM,CAAA;AACxC,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM;AACzC,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,KAAK,EAAE,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,CAAA,EAAG,OAAO,eAAA,EAAgB,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE;AAAA,KAC3E;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,EAAE,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,eAAA,EAAgB,EAAG,EAAA,CAAG,GAAG,CAAC,CAAA;AACrE,EAAA,OAAO,KAAA,CAAM,EAAE,cAAA,EAAgB,gBAAA,EAAkB,YAAY,EAAA,CAAG,GAAA,IAAO,MAAM,CAAA;AAC/E;AAEA,SAAS,WAAW,IAAA,EAAgC;AAClD,EAAA,QAAQ,KAAK,IAAA;AAAM,IACjB,KAAK,SAAA;AACH,MAAA,OAAO,cAAc,IAAI,CAAA;AAAA,IAC3B,KAAK,MAAA;AACH,MAAA,OAAO,WAAW,IAAI,CAAA;AAAA,IACxB,KAAK,SAAA;AACH,MAAA,OAAO,cAAc,IAAI,CAAA;AAAA,IAC3B,KAAK,gBAAA;AACH,MAAA,OAAO,oBAAoB,IAAI,CAAA;AAAA;AAErC;AAEO,SAAS,YAAA,CAAa,KAAgB,MAAA,EAA+B;AAC1E,EAAA,MAAM,MAAA,GAAS,aAAa,GAAG,CAAA;AAC/B,EAAA,MAAM,CAAA,GAAI,sBAAA,CAAuB,MAAA,EAAQ,KAAA,IAAS,SAAS,CAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,GAAQ,EAAA,GAAK,CAAA;AACrC,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,MAAA,GAAS,OAAO,MAAA,GAAS,WAAA;AAE/B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,QAAA,CAAS,IAAA,CAAK,KAAA,CAAQ,GAAA,CAAI,KAAA,IAAS,cAAc,CAAC,CAAA;AAClD,EAAA,QAAA,CAAS,IAAA;AAAA,IACP,IAAA,CAAK,CAAA,8BAAA,EAAiC,GAAA,CAAI,KAAA,CAAM,MAAM,CAAA,KAAA,EAAQ,GAAA,CAAI,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,CAAE;AAAA,GACnG;AACA,EAAA,QAAA,CAAS,IAAA,CAAK,GAAG,OAAA,EAAS,IAAI,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAE1C,EAAA,IAAI,IAAI,KAAA,EAAO;AACb,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,IAAA,CAAK,EAAE,CAAA,EAAG,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG,EAAA,EAAI,KAAA,EAAO,iBAAA,EAAkB,EAAG,GAAA,CAAI,KAAK;AAAA,KAC1E;AAAA,EACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,GAAG,MAAA,EAAQ;AAAA,MACT,IAAI,MAAA,CAAO,SAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,IAAI,MAAA,CAAO,SAAA;AAAA,MACX,IAAI,MAAA,CAAO,MAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AACA,EAAA,KAAA,CAAM,IAAA;AAAA,IACJ,GAAG,MAAA,EAAQ;AAAA,MACT,IAAI,MAAA,CAAO,UAAA;AAAA,MACX,EAAA,EAAI,CAAA;AAAA,MACJ,IAAI,MAAA,CAAO,UAAA;AAAA,MACX,IAAI,MAAA,CAAO,MAAA;AAAA,MACX,KAAA,EAAO;AAAA,KACR;AAAA,GACH;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,IAAA;AAAA,QACE,EAAE,CAAA,EAAG,MAAA,CAAO,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,CAAE,CAAA,GAAI,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAqB;AAAA,QACnE,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAE,IAAA,CAAK,MAAM,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA;AAChD,KACF;AACA,IAAA,IAAI,CAAA,CAAE,KAAK,OAAA,EAAS;AAElB,MAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA,IAAK,CAAA,CAAE,eAAe,CAAA,CAAE,CAAA;AACxD,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,IAAA;AAAA,UACE;AAAA,YACE,CAAA,EAAG,OAAO,SAAA,GAAY,EAAA;AAAA,YACtB,CAAA,EAAG,QAAA;AAAA,YACH,KAAA,EAAO;AAAA,WACT;AAAA,UACA,CAAA,OAAA,EAAK,CAAA,CAAE,IAAA,CAAK,OAAO,CAAA,OAAA;AAAA;AACrB,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK,KAAO,EAAE,CAAA,EAAG,EAAE,IAAA,EAAM,KAAA,EAAO,gBAAA,EAAkB,CAAC,CAAA;AAAA,EAC3D;AAEA,EAAA,KAAA,MAAW,CAAA,IAAK,OAAO,KAAA,EAAO;AAC5B,IAAA,KAAA,CAAM,IAAA,CAAK,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,EAAE,SAAA,EAAW,gBAAgB,WAAW,CAAA,CAAA,CAAA,IAAO,KAAK,CAAA;AACvE,EAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAElB,EAAA,OAAO,OAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,IAAA,EAAM,KAAA;AAAA,MACN,iBAAA,EAAmB,gCAAA;AAAA,MACnB,KAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA,EAAS,CAAA,IAAA,EAAO,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA;AAAA,KACjC;AAAA,IACA;AAAA,GACF;AACF;;;ACtRO,IAAM,MAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,QAAA;AAAA,EACN,OAAOT,KAAAA,EAAuB;AAC5B,IAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AAClE,IAAA,OAAO,KAAA,CAAM,WAAW,QAAQ,CAAA;AAAA,EAClC,CAAA;AAAA,EACA,KAAA,EAAO,cAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAAgB;AACnC,IAAA,MAAM,GAAA,GAAM,eAAeA,KAAI,CAAA;AAC/B,IAAA,OAAO,YAAA,CAAa,KAAK,MAAM,CAAA;AAAA,EACjC;AACF","file":"chunk-ZNZIL244.js","sourcesContent":["import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n LadderContactType,\n LadderCoilType,\n LadderFBType,\n} from \"../../core/types\";\n\nexport class LadderParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"LadderParseError\";\n }\n}\n\nconst CONTACT_TYPES = new Set<LadderContactType>([\"XIC\", \"XIO\", \"ONS\", \"OSF\"]);\nconst COIL_TYPES = new Set<LadderCoilType>([\"OTE\", \"OTL\", \"OTU\", \"OTN\"]);\nconst FB_TYPES = new Set<LadderFBType>([\n \"TON\", \"TOFF\", \"TP\",\n \"CTU\", \"CTD\", \"CTUD\",\n \"ADD\", \"SUB\", \"MUL\", \"DIV\",\n \"MOV\",\n \"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\",\n]);\n\n/** Split comma-separated args respecting quoted strings. */\nfunction splitArgs(s: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \",\" && !inQuote) {\n out.push(cur.trim());\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur.trim()) out.push(cur.trim());\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n/** Parse one element line, e.g. XIC(START), TON(T1, PT=5000), OTE(MOTOR). */\nfunction parseElement(line: string, lineNo: number): LadderElement {\n const m = line.match(/^([A-Z][A-Z0-9_]*)\\s*\\(\\s*([^)]*)\\s*\\)\\s*$/);\n if (!m) {\n throw new LadderParseError(`Line ${lineNo}: invalid element syntax: ${line}`);\n }\n const op = m[1] as string;\n const args = splitArgs(m[2]);\n if (args.length === 0 || !args[0]) {\n throw new LadderParseError(`Line ${lineNo}: element missing tag: ${line}`);\n }\n const tag = args[0];\n\n if (CONTACT_TYPES.has(op as LadderContactType)) {\n const contact: LadderContact = {\n elementType: \"contact\",\n contactType: op as LadderContactType,\n tag,\n };\n // optional address as second positional or address=...\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") contact.address = stripQuotes(kv[2]);\n else if (key === \"name\") contact.name = stripQuotes(kv[2]);\n } else {\n contact.address = stripQuotes(a);\n }\n }\n return contact;\n }\n\n if (COIL_TYPES.has(op as LadderCoilType)) {\n const coil: LadderCoil = {\n elementType: \"coil\",\n coilType: op as LadderCoilType,\n tag,\n };\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const key = kv[1].toLowerCase();\n if (key === \"address\") coil.address = stripQuotes(kv[2]);\n else if (key === \"name\") coil.name = stripQuotes(kv[2]);\n } else {\n coil.address = stripQuotes(a);\n }\n }\n return coil;\n }\n\n if (FB_TYPES.has(op as LadderFBType)) {\n const params: Record<string, string | number> = {};\n for (let i = 1; i < args.length; i++) {\n const a = args[i];\n const kv = a.match(/^(\\w+)\\s*=\\s*(.+)$/);\n if (kv) {\n const v = stripQuotes(kv[2]);\n const n = Number(v);\n params[kv[1]] = Number.isFinite(n) && v !== \"\" && /^-?\\d+(\\.\\d+)?$/.test(v) ? n : v;\n }\n }\n const fb: LadderFunctionBlock = {\n elementType: \"function_block\",\n fbType: op as LadderFBType,\n tag,\n params,\n };\n return fb;\n }\n\n throw new LadderParseError(`Line ${lineNo}: unknown element type \"${op}\"`);\n}\n\nexport function parseLadderDSL(text: string): LadderAST {\n const rawLines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n let title: string | undefined;\n const rungs: LadderRung[] = [];\n\n let currentRung: LadderRung | null = null;\n let currentParallel: LadderBranch[] | null = null;\n let currentBranch: LadderBranch | null = null;\n let parallelIndent = -1;\n let branchIndent = -1;\n\n function finishParallel() {\n if (currentRung && currentParallel) {\n currentRung.elements.push({ parallel: currentParallel });\n }\n currentParallel = null;\n currentBranch = null;\n parallelIndent = -1;\n branchIndent = -1;\n }\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i];\n const lineNo = i + 1;\n const stripped = raw.replace(/#.*$/, \"\");\n if (!stripped.trim()) continue;\n\n // indentation = count of leading spaces/tabs (tab = 2)\n let indent = 0;\n for (const ch of stripped) {\n if (ch === \" \") indent++;\n else if (ch === \"\\t\") indent += 2;\n else break;\n }\n const line = stripped.trim();\n\n // Header: ladder \"title\"\n if (/^ladder\\b/i.test(line)) {\n const m = line.match(/\"([^\"]*)\"/);\n if (m) title = m[1];\n continue;\n }\n\n // Rung: rung N \"comment\":\n const rungMatch = line.match(/^rung\\s+(\\d+)(?:\\s+\"([^\"]*)\")?\\s*:\\s*$/i);\n if (rungMatch) {\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n currentRung = {\n number: Number(rungMatch[1]),\n comment: rungMatch[2],\n elements: [],\n };\n continue;\n }\n\n if (!currentRung) {\n throw new LadderParseError(`Line ${lineNo}: element outside of rung: ${line}`);\n }\n\n // parallel:\n if (/^parallel\\s*:\\s*$/i.test(line)) {\n finishParallel();\n currentParallel = [];\n parallelIndent = indent;\n continue;\n }\n\n // branch:\n if (/^branch\\s*:\\s*$/i.test(line)) {\n if (!currentParallel) {\n throw new LadderParseError(`Line ${lineNo}: branch: without parallel:`);\n }\n currentBranch = { elements: [] };\n currentParallel.push(currentBranch);\n branchIndent = indent;\n continue;\n }\n\n // If we're in a parallel block but indent fell back, close it.\n if (currentParallel && indent <= parallelIndent) {\n finishParallel();\n }\n\n const element = parseElement(line, lineNo);\n\n if (currentParallel && currentBranch && indent > branchIndent) {\n currentBranch.elements.push(element);\n } else {\n if (currentParallel) finishParallel();\n currentRung.elements.push(element);\n }\n }\n\n finishParallel();\n if (currentRung) {\n if (currentRung.elements.length === 0) {\n throw new LadderParseError(`Rung ${currentRung.number}: empty rung`);\n }\n rungs.push(currentRung);\n }\n\n if (rungs.length === 0) {\n throw new LadderParseError(\"Ladder diagram has no rungs\");\n }\n\n return { type: \"ladder\", title, rungs };\n}\n","import type {\n LadderAST,\n LadderRung,\n LadderElement,\n LadderBranch,\n} from \"../../core/types\";\n\nexport const LEFT_RAIL_X = 60;\nexport const RIGHT_RAIL_MARGIN = 30;\nexport const BASE_RUNG_HEIGHT = 100;\nexport const ELEMENT_WIDTH = 32;\nexport const ELEMENT_HEIGHT = 24;\nexport const FB_WIDTH = 80;\nexport const FB_HEIGHT = 56;\nexport const CMP_WIDTH = 56;\nexport const CMP_HEIGHT = 34;\nexport const RUNG_Y_OFFSET = 70;\nexport const H_SPACING = 16;\nexport const PARALLEL_GAP = 14;\nexport const CANVAS_PADDING = 30;\n\n/** Rough chars → pixels for 9px font */\nconst CHAR_W = 6.1;\nconst LINE_H = 11;\n\nexport type LadderElementKind =\n | \"contact\"\n | \"coil\"\n | \"function_block\"\n | \"compare\";\n\nexport interface LadderLayoutNode {\n id: string;\n rungIndex: number;\n element: LadderElement;\n kind: LadderElementKind;\n /** x of the element body (left edge) */\n x: number;\n /** y of the element body (top edge) */\n y: number;\n width: number;\n height: number;\n /** rung centerline Y (where wires attach) */\n rungY: number;\n}\n\nexport interface LadderLayoutWire {\n path: string;\n}\n\nexport interface LadderLayoutRung {\n rung: LadderRung;\n index: number;\n y: number;\n /** Rightmost x reached by elements on this rung. */\n endX: number;\n /** Rung slot total height (used for spacing). */\n height: number;\n /** Total pixel height reserved above rungY for name/tag labels. */\n headerHeight: number;\n}\n\nexport interface LadderLayoutResult {\n width: number;\n height: number;\n leftRailX: number;\n rightRailX: number;\n rungs: LadderLayoutRung[];\n nodes: LadderLayoutNode[];\n wires: LadderLayoutWire[];\n}\n\nconst COMPARE_TYPES = new Set([\"EQU\", \"NEQ\", \"GRT\", \"LES\", \"GEQ\", \"LEQ\"]);\n\nfunction bodyWidth(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_WIDTH;\n return FB_WIDTH;\n }\n return ELEMENT_WIDTH;\n}\n\nfunction bodyHeight(el: LadderElement): number {\n if (el.elementType === \"function_block\") {\n if (COMPARE_TYPES.has(el.fbType)) return CMP_HEIGHT;\n return FB_HEIGHT;\n }\n return ELEMENT_HEIGHT;\n}\n\nfunction elementKind(el: LadderElement): LadderElementKind {\n if (el.elementType === \"contact\") return \"contact\";\n if (el.elementType === \"coil\") return \"coil\";\n if (COMPARE_TYPES.has(el.fbType)) return \"compare\";\n return \"function_block\";\n}\n\n/** Wrap a long description into lines of ~13 chars without splitting words. */\nexport function wrapName(name: string, maxChars = 14): string[] {\n const words = name.split(/\\s+/);\n const lines: string[] = [];\n let cur = \"\";\n for (const w of words) {\n const trial = cur ? `${cur} ${w}` : w;\n if (trial.length > maxChars && cur) {\n lines.push(cur);\n cur = w;\n } else {\n cur = trial;\n }\n }\n if (cur) lines.push(cur);\n return lines.slice(0, 3);\n}\n\nfunction labelLinesForContactOrCoil(el: LadderElement): string[] {\n if (el.elementType === \"function_block\") return [el.tag];\n const lines: string[] = [];\n if (el.name) lines.push(...wrapName(el.name));\n lines.push(el.tag);\n if (el.address) lines.push(el.address);\n return lines;\n}\n\n/** Max label width in px across all label lines of the element. */\nfunction labelWidth(el: LadderElement): number {\n const lines = labelLinesForContactOrCoil(el);\n let maxChars = 0;\n for (const l of lines) if (l.length > maxChars) maxChars = l.length;\n return maxChars * CHAR_W;\n}\n\n/** Slot width = max(bodyWidth, labelWidth) + padding on both sides. */\nfunction slotWidth(el: LadderElement): number {\n return Math.max(bodyWidth(el), labelWidth(el)) + 6;\n}\n\n/** Total label rows above the element body (name lines + tag). */\nfunction labelRowsAbove(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 1;\n const name = el.name ? wrapName(el.name).length : 0;\n return name + 1; // + tag line\n}\n\nfunction labelRowsBelow(el: LadderElement): number {\n if (el.elementType === \"function_block\") return 0;\n if ((el as { address?: string }).address) return 1;\n return 0;\n}\n\n/** Required vertical pixels above rung centerline for tallest element label stack. */\nfunction rungLabelHeaderHeight(rung: LadderRung): number {\n let maxAbovePx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n // Only the top-branch elements extend above the centerline.\n const topBranch = item.parallel[0];\n if (!topBranch) continue;\n const aboveRows = Math.max(\n 1,\n ...topBranch.elements.map((e) => labelRowsAbove(e))\n );\n const px = ph / 2 + aboveRows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n } else {\n const rows = labelRowsAbove(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxAbovePx) maxAbovePx = px;\n }\n }\n return maxAbovePx;\n}\n\nfunction rungLabelFooterHeight(rung: LadderRung): number {\n let maxBelowPx = 0;\n for (const item of rung.elements) {\n if (\"parallel\" in item) {\n const ph = parallelHeight(item.parallel);\n const bottomBranch = item.parallel[item.parallel.length - 1];\n if (!bottomBranch) continue;\n const belowRows = Math.max(\n 0,\n ...bottomBranch.elements.map((e) => labelRowsBelow(e))\n );\n const px = ph / 2 + belowRows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n } else {\n const rows = labelRowsBelow(item);\n const px = bodyHeight(item) / 2 + rows * LINE_H + 4;\n if (px > maxBelowPx) maxBelowPx = px;\n }\n }\n return maxBelowPx;\n}\n\nfunction branchInlineWidth(branch: LadderBranch): number {\n if (branch.elements.length === 0) return ELEMENT_WIDTH;\n let w = 0;\n branch.elements.forEach((el, i) => {\n w += slotWidth(el);\n if (i < branch.elements.length - 1) w += H_SPACING;\n });\n return w;\n}\n\nfunction parallelWidth(branches: LadderBranch[]): number {\n const maxBranch = Math.max(\n ELEMENT_WIDTH,\n ...branches.map(branchInlineWidth)\n );\n return maxBranch + 2 * H_SPACING;\n}\n\n/** Per-branch row height including label stack above + below. */\nfunction branchRowHeight(branch: LadderBranch): number {\n const bodyH = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(1, ...branch.elements.map((e) => labelRowsAbove(e)));\n const below = Math.max(0, ...branch.elements.map((e) => labelRowsBelow(e)));\n return bodyH + above * LINE_H + below * LINE_H + 6;\n}\n\nfunction parallelHeight(branches: LadderBranch[]): number {\n // Account for label space between branches so name/address rows don't collide.\n let total = 0;\n branches.forEach((br, i) => {\n total += branchRowHeight(br);\n if (i < branches.length - 1) total += PARALLEL_GAP;\n });\n return Math.max(total, ELEMENT_HEIGHT);\n}\n\nexport function layoutLadder(ast: LadderAST): LadderLayoutResult {\n const nodes: LadderLayoutNode[] = [];\n const wires: LadderLayoutWire[] = [];\n const rungs: LadderLayoutRung[] = [];\n\n let maxEndX = LEFT_RAIL_X + 200;\n let cursorY = RUNG_Y_OFFSET;\n\n ast.rungs.forEach((rung, rungIndex) => {\n const headerH = rungLabelHeaderHeight(rung);\n const footerH = rungLabelFooterHeight(rung);\n // Per-rung height is comment (16) + header + footer + a little breathing room.\n const rungHeight = Math.max(BASE_RUNG_HEIGHT, 16 + headerH + footerH + 16);\n const rungY = cursorY + 16 + headerH;\n\n let x = LEFT_RAIL_X + H_SPACING;\n let prevRightX = LEFT_RAIL_X;\n let prevRightY = rungY;\n\n const addWire = (x1: number, y1: number, x2: number, y2: number) => {\n wires.push({ path: `M ${x1} ${y1} L ${x2} ${y2}` });\n };\n\n rung.elements.forEach((item, elIdx) => {\n if (\"parallel\" in item) {\n const branches = item.parallel;\n const pw = parallelWidth(branches);\n const ph = parallelHeight(branches);\n const bx = x;\n const ex = x + pw;\n\n addWire(prevRightX, prevRightY, bx, rungY);\n\n const busTop = rungY - ph / 2;\n const busBot = rungY + ph / 2;\n wires.push({ path: `M ${bx} ${busTop} L ${bx} ${busBot}` });\n wires.push({ path: `M ${ex} ${busTop} L ${ex} ${busBot}` });\n\n // Pre-compute row Y for each branch using actual row heights.\n let rowY = busTop;\n branches.forEach((branch, bIdx) => {\n const rowH = branchRowHeight(branch);\n const bodyMax = Math.max(\n ELEMENT_HEIGHT,\n ...branch.elements.map((e) => bodyHeight(e))\n );\n const above = Math.max(\n 1,\n ...branch.elements.map((e) => labelRowsAbove(e))\n );\n // Position centerline so labels above fit within rowH.\n const branchY = rowY + above * LINE_H + bodyMax / 2;\n const bInline = branchInlineWidth(branch);\n const startX = bx + H_SPACING + ((ex - bx - 2 * H_SPACING) - bInline) / 2;\n let bx0 = startX;\n let prevBX = bx;\n branch.elements.forEach((bel, beIdx) => {\n const w = bodyWidth(bel);\n const h = bodyHeight(bel);\n const slot = slotWidth(bel);\n const nx = bx0 + (slot - w) / 2;\n const ny = branchY - h / 2;\n const id = `R${rung.number}_P${elIdx}_B${bIdx}_E${beIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: bel,\n kind: elementKind(bel),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY: branchY,\n });\n addWire(prevBX, branchY, nx, branchY);\n prevBX = nx + w;\n bx0 += slot + H_SPACING;\n });\n addWire(prevBX, branchY, ex, branchY);\n rowY += rowH + PARALLEL_GAP;\n });\n\n prevRightX = ex;\n prevRightY = rungY;\n x = ex + H_SPACING;\n return;\n }\n\n const el = item;\n const w = bodyWidth(el);\n const h = bodyHeight(el);\n const slot = slotWidth(el);\n const nx = x + (slot - w) / 2;\n const ny = rungY - h / 2;\n const id = `R${rung.number}_E${elIdx}`;\n nodes.push({\n id,\n rungIndex,\n element: el,\n kind: elementKind(el),\n x: nx,\n y: ny,\n width: w,\n height: h,\n rungY,\n });\n addWire(prevRightX, prevRightY, nx, rungY);\n prevRightX = nx + w;\n prevRightY = rungY;\n x += slot + H_SPACING;\n });\n\n rungs.push({\n rung,\n index: rungIndex,\n y: rungY,\n endX: prevRightX,\n height: rungHeight,\n headerHeight: headerH,\n });\n if (prevRightX > maxEndX) maxEndX = prevRightX;\n cursorY += rungHeight;\n });\n\n const rightRailX = maxEndX + H_SPACING * 2;\n const width = rightRailX + RIGHT_RAIL_MARGIN;\n const height = cursorY + CANVAS_PADDING;\n\n for (const r of rungs) {\n wires.push({ path: `M ${r.endX} ${r.y} L ${rightRailX} ${r.y}` });\n }\n\n return {\n width,\n height,\n leftRailX: LEFT_RAIL_X,\n rightRailX,\n rungs,\n nodes,\n wires,\n };\n}\n\nexport { labelRowsAbove, labelRowsBelow };\n","import type {\n LadderAST,\n LadderContact,\n LadderCoil,\n LadderFunctionBlock,\n RenderConfig,\n} from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n path as pathEl,\n text,\n title as titleEl,\n desc,\n} from \"../../core/svg\";\nimport { resolveIndustrialTheme, type IndustrialTokens, type ResolvedTheme } from \"../../core/theme\";\nimport { layoutLadder, type LadderLayoutNode, wrapName } from \"./layout\";\n\ntype IT = ResolvedTheme<IndustrialTokens>;\n\nfunction buildCss(t: IT): string {\n return `\n.lt-ladder { background: ${t.bg}; font-family: system-ui, -apple-system, sans-serif; }\n.lt-ladder-rail { stroke: ${t.strokeHeavy}; stroke-width: 4; stroke-linecap: square; }\n.lt-ladder-wire { stroke: ${t.stroke}; stroke-width: 1.5; fill: none; }\n.lt-ladder-element { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-coil { stroke: ${t.stroke}; stroke-width: 2; fill: none; }\n.lt-ladder-fb { fill: ${t.bg}; stroke: ${t.stroke}; stroke-width: 2; }\n.lt-ladder-fb-name { font: bold 11px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-pin { font: 8px sans-serif; fill: ${t.stroke}; }\n.lt-ladder-name { font: 9px sans-serif; fill: ${t.text}; text-anchor: middle; }\n.lt-ladder-tag { font: 600 9px ui-monospace, SFMono-Regular, Menlo, monospace; fill: ${t.accent}; text-anchor: middle; }\n.lt-ladder-addr { font: 600 8.5px ui-monospace, monospace; fill: ${t.error}; text-anchor: middle; }\n.lt-ladder-rung-num { font: 10px sans-serif; fill: ${t.textMuted}; text-anchor: end; }\n.lt-ladder-comment { font: italic 10px sans-serif; fill: ${t.textMuted}; }\n.lt-ladder-title { font: bold 15px sans-serif; fill: ${t.text}; }\n.lt-ladder-symbol-label { font: bold 10px sans-serif; fill: ${t.stroke}; text-anchor: middle; }\n`.trim();\n}\n\nconst LINE_H = 11;\n\nfunction labelsAbove(\n name: string | undefined,\n tag: string,\n cx: number,\n bodyTopY: number\n): string[] {\n const pieces: string[] = [];\n const nameLines = name ? wrapName(name) : [];\n const totalLines = nameLines.length + 1; // +1 for tag\n const firstY = bodyTopY - 4 - (totalLines - 1) * LINE_H;\n nameLines.forEach((line, i) => {\n pieces.push(\n text({ x: cx, y: firstY + i * LINE_H, class: \"lt-ladder-name\" }, line)\n );\n });\n pieces.push(\n text(\n { x: cx, y: firstY + nameLines.length * LINE_H, class: \"lt-ladder-tag\" },\n tag\n )\n );\n return pieces;\n}\n\nfunction renderContact(node: LadderLayoutNode): string {\n const c = node.element as LadderContact;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const leftBarX = x + 4;\n const rightBarX = x + w - 4;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: leftBarX, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: leftBarX, y1: y, x2: leftBarX, y2: y + h, class: \"lt-ladder-element\" }));\n pieces.push(el(\"line\", { x1: rightBarX, y1: y, x2: rightBarX, y2: y + h, class: \"lt-ladder-element\" }));\n\n if (c.contactType === \"XIO\") {\n pieces.push(\n el(\"line\", {\n x1: leftBarX + 2,\n y1: y + h - 2,\n x2: rightBarX - 2,\n y2: y + 2,\n class: \"lt-ladder-element\",\n })\n );\n } else if (c.contactType === \"ONS\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↑\"));\n } else if (c.contactType === \"OSF\") {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, \"↓\"));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"contact\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCoil(node: LadderLayoutNode): string {\n const c = node.element as LadderCoil;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n const leftArc = `M ${x + 6} ${y} A 10 ${h / 2} 0 0 0 ${x + 6} ${y + h}`;\n const rightArc = `M ${x + w - 6} ${y} A 10 ${h / 2} 0 0 1 ${x + w - 6} ${y + h}`;\n pieces.push(pathEl({ d: leftArc, class: \"lt-ladder-coil\" }));\n pieces.push(pathEl({ d: rightArc, class: \"lt-ladder-coil\" }));\n pieces.push(el(\"line\", { x1: x, y1: cy, x2: x + 6, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w - 6, y1: cy, x2: x + w, y2: cy, class: \"lt-ladder-wire\" }));\n\n let inner = \"\";\n if (c.coilType === \"OTL\") inner = \"S\";\n else if (c.coilType === \"OTU\") inner = \"R\";\n else if (c.coilType === \"OTN\") inner = \"/\";\n if (inner) {\n pieces.push(text({ x: cx, y: cy + 3, class: \"lt-ladder-symbol-label\" }, inner));\n }\n\n pieces.push(...labelsAbove(c.name, c.tag, cx, y));\n if (c.address) {\n pieces.push(\n text({ x: cx, y: y + h + 10, class: \"lt-ladder-addr\" }, c.address)\n );\n }\n return group({ \"data-element\": \"coil\", \"data-tag\": c.tag }, pieces);\n}\n\nfunction renderCompare(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 12, class: \"lt-ladder-fb-name\" }, fb.fbType));\n const entries = Object.entries(fb.params);\n entries.slice(0, 2).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 22 + i * 9, class: \"lt-ladder-pin\" }, `${k}:${v}`)\n );\n });\n pieces.push(el(\"line\", { x1: x - 2, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(el(\"line\", { x1: x + w, y1: cy, x2: x + w + 2, y2: cy, class: \"lt-ladder-wire\" }));\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"compare\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderFunctionBlock(node: LadderLayoutNode): string {\n const fb = node.element as LadderFunctionBlock;\n const { x, y, width: w, height: h } = node;\n const cy = y + h / 2;\n const cx = x + w / 2;\n const pieces: string[] = [];\n\n pieces.push(el(\"rect\", { x, y, width: w, height: h, class: \"lt-ladder-fb\" }));\n pieces.push(text({ x: cx, y: y + 14, class: \"lt-ladder-fb-name\" }, fb.fbType));\n\n pieces.push(\n el(\"line\", { x1: x - 6, y1: cy, x2: x, y2: cy, class: \"lt-ladder-wire\" })\n );\n pieces.push(\n el(\"line\", { x1: x + w, y1: cy, x2: x + w + 6, y2: cy, class: \"lt-ladder-wire\" })\n );\n\n const entries = Object.entries(fb.params);\n entries.slice(0, 3).forEach(([k, v], i) => {\n pieces.push(\n text({ x: x + 4, y: y + 28 + i * 9, class: \"lt-ladder-pin\" }, `${k}=${v}`)\n );\n });\n\n pieces.push(text({ x: cx, y: y - 4, class: \"lt-ladder-tag\" }, fb.tag));\n return group({ \"data-element\": \"function_block\", \"data-tag\": fb.tag }, pieces);\n}\n\nfunction renderNode(node: LadderLayoutNode): string {\n switch (node.kind) {\n case \"contact\":\n return renderContact(node);\n case \"coil\":\n return renderCoil(node);\n case \"compare\":\n return renderCompare(node);\n case \"function_block\":\n return renderFunctionBlock(node);\n }\n}\n\nexport function renderLadder(ast: LadderAST, config?: RenderConfig): string {\n const layout = layoutLadder(ast);\n const t = resolveIndustrialTheme(config?.theme ?? \"default\");\n const titleOffset = ast.title ? 30 : 0;\n const width = layout.width;\n const height = layout.height + titleOffset;\n\n const children: string[] = [];\n children.push(titleEl(ast.title ?? \"Ladder Logic\"));\n children.push(\n desc(`PLC ladder logic diagram with ${ast.rungs.length} rung${ast.rungs.length === 1 ? \"\" : \"s\"}`)\n );\n children.push(el(\"style\", {}, buildCss(t)));\n\n if (ast.title) {\n children.push(\n text({ x: layout.leftRailX, y: 20, class: \"lt-ladder-title\" }, ast.title)\n );\n }\n\n const inner: string[] = [];\n\n inner.push(\n el(\"line\", {\n x1: layout.leftRailX,\n y1: 0,\n x2: layout.leftRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n inner.push(\n el(\"line\", {\n x1: layout.rightRailX,\n y1: 0,\n x2: layout.rightRailX,\n y2: layout.height,\n class: \"lt-ladder-rail\",\n })\n );\n\n for (const r of layout.rungs) {\n inner.push(\n text(\n { x: layout.leftRailX - 6, y: r.y + 3, class: \"lt-ladder-rung-num\" },\n `Rung ${String(r.rung.number).padStart(3, \"0\")}`\n )\n );\n if (r.rung.comment) {\n // Place comment above the tallest element label on this rung (and above the parallel bus if any).\n const commentY = Math.max(14, r.y - (r.headerHeight + 6));\n inner.push(\n text(\n {\n x: layout.leftRailX + 10,\n y: commentY,\n class: \"lt-ladder-comment\",\n },\n `— ${r.rung.comment} —`\n )\n );\n }\n }\n\n for (const w of layout.wires) {\n inner.push(pathEl({ d: w.path, class: \"lt-ladder-wire\" }));\n }\n\n for (const n of layout.nodes) {\n inner.push(renderNode(n));\n }\n\n const wrap = group({ transform: `translate(0, ${titleOffset})` }, inner);\n children.push(wrap);\n\n return svgRoot(\n {\n class: \"lt-ladder\",\n role: \"img\",\n \"aria-labelledby\": \"lt-ladder-title lt-ladder-desc\",\n width,\n height,\n viewBox: `0 0 ${width} ${height}`,\n },\n children\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseLadderDSL } from \"./parser\";\nimport { renderLadder } from \"./renderer\";\n\nexport const ladder: DiagramPlugin = {\n type: \"ladder\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"ladder\");\n },\n parse: parseLadderDSL,\n\n render(text: string, config): string {\n const ast = parseLadderDSL(text);\n return renderLadder(ast, config);\n },\n};\n\nexport { parseLadderDSL } from \"./parser\";\nexport { renderLadder } from \"./renderer\";\nexport { layoutLadder } from \"./layout\";\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/timing/parser.ts","../src/diagrams/timing/renderer.ts","../src/diagrams/timing/index.ts"],"names":["text","title","el","group","svgRoot","desc","defs"],"mappings":"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","file":"chunk-ZO77FHBF.cjs","sourcesContent":["import type { TimingAST, TimingSignal, TimingGroup } from \"../../core/types\";\n\nexport class TimingParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"TimingParseError\";\n }\n}\n\nconst VALID_STATES = /^[01xzpPnNhHlLudD=\\.23456789]+$/;\n\nfunction splitDataList(rest: string): { wave: string; data: string[] } {\n // Wave string is first token; remaining tokens are quoted strings or a `data: [...]` form\n const trimmed = rest.trim();\n // Accept: `wave data: [\"a\",\"b\"]` or `wave \"a\" \"b\" \"c\"`\n const m = trimmed.match(/^(\\S+)\\s*(.*)$/);\n if (!m) return { wave: trimmed, data: [] };\n const wave = m[1];\n const remainder = m[2].trim();\n if (!remainder) return { wave, data: [] };\n\n const data: string[] = [];\n // Strip `data:` prefix + optional brackets\n let r = remainder.replace(/^data\\s*:\\s*/, \"\").trim();\n if (r.startsWith(\"[\") && r.endsWith(\"]\")) r = r.slice(1, -1);\n const re = /\"([^\"]*)\"/g;\n let match: RegExpExecArray | null;\n while ((match = re.exec(r)) !== null) data.push(match[1]);\n return { wave, data };\n}\n\nexport function parseTiming(text: string): TimingAST {\n const lines = text.split(\"\\n\").map((l) => l.replace(/\\r$/, \"\"));\n const signals: Array<TimingSignal | TimingGroup> = [];\n let title: string | undefined;\n let hscale: number | undefined;\n let currentGroup: TimingGroup | null = null;\n\n for (const raw of lines) {\n const line = raw.trim();\n if (!line || line.startsWith(\"#\")) continue;\n\n // Header: `timing \"title\" [hscale: 2]`\n if (/^timing\\b/i.test(line)) {\n const titleMatch = line.match(/\"([^\"]*)\"/);\n if (titleMatch) title = titleMatch[1];\n const hs = line.match(/hscale\\s*:\\s*(\\d+(?:\\.\\d+)?)/);\n if (hs) hscale = parseFloat(hs[1]);\n continue;\n }\n\n // Group start: `[GroupName]` or `group \"name\" {`\n const groupOpen = line.match(/^\\[([^\\]]+)\\]$/) || line.match(/^group\\s+\"([^\"]+)\"\\s*\\{?$/);\n if (groupOpen) {\n currentGroup = { label: groupOpen[1], signals: [] };\n signals.push(currentGroup);\n continue;\n }\n if (line === \"}\") {\n currentGroup = null;\n continue;\n }\n if (line === \"---\") {\n currentGroup = null;\n continue;\n }\n\n // Signal: `NAME: wave ...`\n const sigMatch = line.match(/^([^:]+):\\s*(.+)$/);\n if (sigMatch) {\n const name = sigMatch[1].trim();\n const { wave, data } = splitDataList(sigMatch[2]);\n if (!VALID_STATES.test(wave)) {\n throw new TimingParseError(`Invalid wave string \"${wave}\" for signal ${name}`);\n }\n const signal: TimingSignal = { name, wave, data: data.length ? data : undefined };\n if (currentGroup) currentGroup.signals.push(signal);\n else signals.push(signal);\n continue;\n }\n }\n\n return { type: \"timing\", title, hscale, signals };\n}\n","import type { TimingAST, TimingSignal, TimingGroup } from \"../../core/types\";\nimport { svgRoot, defs, group, el, text, title as titleEl, desc } from \"../../core/svg\";\n\nconst NAME_W = 120;\nconst SIG_H = 36;\nconst PAD_TOP = 12;\nconst PAD_BOT = 12;\nconst PAD_V = 6; // vertical padding inside band for rail spacing\nconst DEFAULT_PW = 40;\nconst GROUP_LABEL_H = 22;\n\ntype FlatRow =\n | { kind: \"signal\"; signal: TimingSignal; indent: number }\n | { kind: \"group\"; label: string; indent: number };\n\nfunction flatten(items: Array<TimingSignal | TimingGroup>, indent = 0): FlatRow[] {\n const out: FlatRow[] = [];\n for (const item of items) {\n if (\"wave\" in item) {\n out.push({ kind: \"signal\", signal: item, indent });\n } else {\n out.push({ kind: \"group\", label: item.label, indent });\n out.push(...flatten(item.signals, indent + 1));\n }\n }\n return out;\n}\n\ninterface WaveCtx {\n pw: number;\n yHi: number;\n yLo: number;\n yMid: number;\n h: number;\n}\n\ntype PrevState = \"hi\" | \"lo\" | \"bus\" | \"z\" | \"x\" | \"none\";\n\nfunction renderWave(signal: TimingSignal, ctx: WaveCtx): { svg: string; labels: string } {\n const { pw, yHi, yLo, yMid } = ctx;\n const wave = signal.wave;\n const paths: string[] = [];\n const busRects: string[] = [];\n const busTexts: string[] = [];\n const xPatchRects: string[] = [];\n const zLines: string[] = [];\n\n let prev: PrevState = \"none\";\n let prevChar = \"\";\n let busStartX = 0;\n let busIndex = 0;\n let dataIdx = 0;\n let linePath = \"\";\n\n const startLine = (x: number, y: number) => {\n if (linePath) paths.push(linePath);\n linePath = `M ${x},${y}`;\n };\n const extendLineTo = (x: number, y: number) => {\n linePath += ` L ${x},${y}`;\n };\n const flushLine = () => {\n if (linePath) {\n paths.push(linePath);\n linePath = \"\";\n }\n };\n\n const closeBus = (x: number) => {\n const start = busStartX;\n const end = x;\n const inset = Math.min(5, (end - start) / 2);\n // Trapezoid outline\n const d = `M ${start + inset},${yHi} L ${end - inset},${yHi} L ${end},${yMid} L ${end - inset},${yLo} L ${start + inset},${yLo} L ${start},${yMid} Z`;\n busRects.push(\n el(\"path\", { class: \"schematex-timing-bus\", d, \"data-bus-index\": String(busIndex) })\n );\n // Data label\n const label = signal.data?.[dataIdx] ?? \"\";\n if (label) {\n busTexts.push(\n text(\n {\n x: (start + end) / 2,\n y: yMid + 4,\n class: \"schematex-timing-bus-label\",\n \"text-anchor\": \"middle\",\n },\n label\n )\n );\n }\n dataIdx++;\n busIndex++;\n };\n\n for (let i = 0; i < wave.length; i++) {\n const ch = wave[i];\n const x = i * pw;\n const xNext = x + pw;\n\n // Handle continuation '.'\n const effective = ch === \".\" ? prevChar : ch;\n\n switch (effective) {\n case \"0\":\n case \"l\":\n case \"L\": {\n if (prev === \"bus\") closeBus(x);\n if (prev === \"x\" || prev === \"z\" || prev === \"none\" || prev === \"bus\") {\n flushLine();\n startLine(x, yLo);\n } else if (prev === \"hi\") {\n extendLineTo(x, yLo);\n }\n extendLineTo(xNext, yLo);\n prev = \"lo\";\n break;\n }\n case \"1\":\n case \"h\":\n case \"H\": {\n if (prev === \"bus\") closeBus(x);\n if (prev === \"x\" || prev === \"z\" || prev === \"none\" || prev === \"bus\") {\n flushLine();\n startLine(x, yHi);\n } else if (prev === \"lo\") {\n extendLineTo(x, yHi);\n }\n extendLineTo(xNext, yHi);\n prev = \"hi\";\n break;\n }\n case \"p\":\n case \"P\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n // One-period positive clock: lo→hi at x, hi until midpoint, lo at mid, lo until xNext\n startLine(x, yLo);\n extendLineTo(x, yHi);\n extendLineTo(x + pw / 2, yHi);\n extendLineTo(x + pw / 2, yLo);\n extendLineTo(xNext, yLo);\n flushLine();\n prev = \"lo\";\n break;\n }\n case \"n\":\n case \"N\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yHi);\n extendLineTo(x, yLo);\n extendLineTo(x + pw / 2, yLo);\n extendLineTo(x + pw / 2, yHi);\n extendLineTo(xNext, yHi);\n flushLine();\n prev = \"hi\";\n break;\n }\n case \"u\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yLo);\n extendLineTo(xNext, yHi);\n prev = \"hi\";\n break;\n }\n case \"d\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n startLine(x, yHi);\n extendLineTo(xNext, yLo);\n prev = \"lo\";\n break;\n }\n case \"z\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n zLines.push(\n el(\"line\", {\n x1: x,\n y1: yMid,\n x2: xNext,\n y2: yMid,\n class: \"schematex-timing-hiz\",\n })\n );\n prev = \"z\";\n break;\n }\n case \"x\": {\n if (prev === \"bus\") closeBus(x);\n flushLine();\n xPatchRects.push(\n el(\"rect\", {\n x,\n y: yHi,\n width: pw,\n height: yLo - yHi,\n class: \"schematex-timing-unknown\",\n fill: \"url(#schematex-timing-xhatch)\",\n })\n );\n prev = \"x\";\n break;\n }\n case \"=\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\": {\n // Each fresh bus char (not '.') begins a new segment.\n const isContinuation = ch === \".\";\n if (!isContinuation && prev === \"bus\") closeBus(x);\n if (prev !== \"bus\" || !isContinuation) {\n flushLine();\n busStartX = x;\n }\n prev = \"bus\";\n break;\n }\n default: {\n // unknown char -> treat as x\n flushLine();\n xPatchRects.push(\n el(\"rect\", {\n x,\n y: yHi,\n width: pw,\n height: yLo - yHi,\n class: \"schematex-timing-unknown\",\n fill: \"url(#schematex-timing-xhatch)\",\n })\n );\n prev = \"x\";\n }\n }\n\n prevChar = effective;\n }\n\n // Close trailing bus\n if (prev === \"bus\") closeBus(wave.length * pw);\n flushLine();\n\n const waveSvg = paths\n .map((d) => el(\"path\", { class: \"schematex-timing-wave\", d }))\n .concat(xPatchRects, zLines, busRects)\n .join(\"\");\n\n return { svg: waveSvg, labels: busTexts.join(\"\") };\n}\n\nexport function renderTiming(ast: TimingAST): string {\n const pw = DEFAULT_PW * (ast.hscale ?? 1);\n const rows = flatten(ast.signals);\n const maxWaveLen = Math.max(\n 1,\n ...rows.filter((r) => r.kind === \"signal\").map((r) => (r as any).signal.wave.length)\n );\n const waveAreaW = maxWaveLen * pw;\n const width = NAME_W + waveAreaW + 20;\n\n let y = PAD_TOP;\n const rowYs: number[] = [];\n for (const r of rows) {\n rowYs.push(y);\n y += r.kind === \"group\" ? GROUP_LABEL_H : SIG_H;\n }\n const height = y + PAD_BOT + 10;\n\n // Render rows\n const waveSvgs: string[] = [];\n const labelSvgs: string[] = [];\n const nameSvgs: string[] = [];\n const gridLines: string[] = [];\n\n // Grid: vertical period ticks across signal area\n for (let i = 0; i <= maxWaveLen; i++) {\n const xg = NAME_W + i * pw;\n gridLines.push(\n el(\"line\", {\n x1: xg,\n y1: PAD_TOP,\n x2: xg,\n y2: height - PAD_BOT,\n class: \"schematex-timing-grid\",\n })\n );\n }\n\n for (let i = 0; i < rows.length; i++) {\n const row = rows[i];\n const ry = rowYs[i];\n\n if (row.kind === \"group\") {\n nameSvgs.push(\n text(\n {\n x: 6 + row.indent * 10,\n y: ry + GROUP_LABEL_H - 6,\n class: \"schematex-timing-group-label\",\n },\n row.label\n )\n );\n continue;\n }\n\n const signal = row.signal;\n const yHi = ry + PAD_V;\n const yLo = ry + SIG_H - PAD_V;\n const yMid = ry + SIG_H / 2;\n\n // Signal name (right-aligned in name column). `~NAME` or `/NAME` → overlined active-low.\n const activeLow = signal.name.startsWith(\"~\") || signal.name.startsWith(\"/\");\n const displayName = activeLow ? signal.name.slice(1) : signal.name;\n nameSvgs.push(\n text(\n {\n x: NAME_W - 8,\n y: yMid + 4,\n class: activeLow\n ? \"schematex-timing-name schematex-timing-name-activelow\"\n : \"schematex-timing-name\",\n \"text-anchor\": \"end\",\n },\n displayName\n )\n );\n\n const { svg, labels } = renderWave(signal, {\n pw,\n yHi,\n yLo,\n yMid,\n h: SIG_H - 2 * PAD_V,\n });\n\n waveSvgs.push(\n group(\n {\n transform: `translate(${NAME_W}, 0)`,\n \"data-signal\": signal.name,\n },\n [svg]\n )\n );\n labelSvgs.push(\n group({ transform: `translate(${NAME_W}, 0)` }, [labels])\n );\n }\n\n const xhatch = el(\n \"pattern\",\n {\n id: \"schematex-timing-xhatch\",\n patternUnits: \"userSpaceOnUse\",\n width: 6,\n height: 6,\n },\n [\n el(\"rect\", { x: 0, y: 0, width: 6, height: 6, fill: \"#f5f5f5\" }),\n el(\"path\", {\n d: \"M 0,6 L 6,0 M -1,1 L 1,-1 M 5,7 L 7,5\",\n stroke: \"#999\",\n \"stroke-width\": 0.8,\n }),\n ]\n );\n\n const css = `\n.schematex-timing { background: #fff; font-family: system-ui, -apple-system, sans-serif; }\n.schematex-timing-name { font: 12px monospace; fill: #111; }\n.schematex-timing-name-activelow { text-decoration: overline; }\n.schematex-timing-group-label { font: bold 12px sans-serif; fill: #111; }\n.schematex-timing-wave { stroke: #111; stroke-width: 1.75; fill: none; stroke-linejoin: miter; stroke-linecap: square; }\n.schematex-timing-bus { fill: none; stroke: #111; stroke-width: 1.5; }\n.schematex-timing-bus-label { font: 11px monospace; fill: #111; }\n.schematex-timing-unknown { stroke: #555; stroke-width: 0.5; }\n.schematex-timing-hiz { stroke: #555; stroke-width: 1.5; stroke-dasharray: 4 3; }\n.schematex-timing-grid { stroke: #eee; stroke-width: 0.5; }\n`.trim();\n\n return svgRoot(\n {\n class: \"schematex-timing\",\n viewBox: `0 0 ${width} ${height}`,\n width,\n height,\n role: \"img\",\n \"data-diagram-type\": \"timing\",\n },\n [\n titleEl(ast.title ?? \"Timing Diagram\"),\n desc(`Digital timing diagram with ${rows.filter((r) => r.kind === \"signal\").length} signals`),\n defs([xhatch, el(\"style\", {}, css)]),\n group({ class: \"schematex-timing-grid-g\" }, gridLines),\n group({ class: \"schematex-timing-waves\" }, waveSvgs),\n group({ class: \"schematex-timing-labels\" }, labelSvgs),\n group({ class: \"schematex-timing-names\" }, nameSvgs),\n ast.title\n ? text(\n {\n x: width / 2,\n y: 14,\n \"text-anchor\": \"middle\",\n class: \"schematex-timing-title\",\n style: \"font: bold 13px sans-serif; fill: #333;\",\n },\n ast.title\n )\n : \"\",\n ]\n );\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseTiming } from \"./parser\";\nimport { renderTiming } from \"./renderer\";\n\nexport const timing: DiagramPlugin = {\n type: \"timing\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"timing\");\n },\n parse: parseTiming,\n\n render(text: string): string {\n const ast = parseTiming(text);\n return renderTiming(ast);\n },\n};\n\nexport { parseTiming } from \"./parser\";\nexport { renderTiming } from \"./renderer\";\n"]}
|