schematex 0.6.5 → 0.6.7
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 +23 -23
- package/dist/ai/ai-sdk.d.cts +3 -3
- package/dist/ai/ai-sdk.d.ts +3 -3
- package/dist/ai/ai-sdk.js +18 -18
- package/dist/ai/index.cjs +29 -29
- package/dist/ai/index.d.cts +3 -3
- package/dist/ai/index.d.ts +3 -3
- package/dist/ai/index.js +18 -18
- package/dist/{api-BIqZjEDf.d.ts → api-DIJM_mqp.d.ts} +2 -2
- package/dist/{api-BXkOT7GL.d.cts → api-JaBtsUT8.d.cts} +2 -2
- package/dist/browser.cjs +24 -24
- package/dist/browser.d.cts +3 -3
- package/dist/browser.d.ts +3 -3
- package/dist/browser.js +18 -18
- package/dist/{chunk-3C5DKCBJ.cjs → chunk-2SZJQVPN.cjs} +12 -12
- package/dist/{chunk-3C5DKCBJ.cjs.map → chunk-2SZJQVPN.cjs.map} +1 -1
- package/dist/{chunk-W3IXH6BN.cjs → chunk-34O3C6OC.cjs} +4 -4
- package/dist/chunk-34O3C6OC.cjs.map +1 -0
- package/dist/{chunk-RVHOCGHT.js → chunk-3GAPHXCE.js} +3 -3
- package/dist/{chunk-RVHOCGHT.js.map → chunk-3GAPHXCE.js.map} +1 -1
- package/dist/{chunk-HCBXTBFA.cjs → chunk-5FYPSIGD.cjs} +12 -12
- package/dist/{chunk-HCBXTBFA.cjs.map → chunk-5FYPSIGD.cjs.map} +1 -1
- package/dist/{chunk-B7ATOBL7.js → chunk-6NUAGU6O.js} +3 -3
- package/dist/{chunk-B7ATOBL7.js.map → chunk-6NUAGU6O.js.map} +1 -1
- package/dist/{chunk-WZ5QBGPZ.cjs → chunk-77GPD4YQ.cjs} +4 -4
- package/dist/{chunk-WZ5QBGPZ.cjs.map → chunk-77GPD4YQ.cjs.map} +1 -1
- package/dist/{chunk-S2CHBZ4A.cjs → chunk-BL57NQKN.cjs} +13 -13
- package/dist/{chunk-S2CHBZ4A.cjs.map → chunk-BL57NQKN.cjs.map} +1 -1
- package/dist/{chunk-EPKIJEH7.js → chunk-C7V57V6O.js} +54 -8
- package/dist/chunk-C7V57V6O.js.map +1 -0
- package/dist/{chunk-I6UJR4SG.cjs → chunk-DR3DDDQY.cjs} +4 -4
- package/dist/{chunk-I6UJR4SG.cjs.map → chunk-DR3DDDQY.cjs.map} +1 -1
- package/dist/{chunk-ZZHQBAC3.js → chunk-EVEPI423.js} +139 -5
- package/dist/chunk-EVEPI423.js.map +1 -0
- package/dist/{chunk-GV5QLYTW.js → chunk-HL5PS6MG.js} +3 -3
- package/dist/{chunk-GV5QLYTW.js.map → chunk-HL5PS6MG.js.map} +1 -1
- package/dist/{chunk-MKECYIWN.js → chunk-HPEAE3JM.js} +3 -3
- package/dist/{chunk-MKECYIWN.js.map → chunk-HPEAE3JM.js.map} +1 -1
- package/dist/{chunk-KPKGMOTS.js → chunk-JN6FHUC6.js} +3 -3
- package/dist/{chunk-KPKGMOTS.js.map → chunk-JN6FHUC6.js.map} +1 -1
- package/dist/{chunk-OANWVUBA.js → chunk-JTGTWBAD.js} +3 -3
- package/dist/chunk-JTGTWBAD.js.map +1 -0
- package/dist/{chunk-OHLNH7IO.js → chunk-K2D6VFLP.js} +3 -3
- package/dist/{chunk-OHLNH7IO.js.map → chunk-K2D6VFLP.js.map} +1 -1
- package/dist/{chunk-ZZFPXCAK.cjs → chunk-KGOZBABH.cjs} +12 -12
- package/dist/{chunk-ZZFPXCAK.cjs.map → chunk-KGOZBABH.cjs.map} +1 -1
- package/dist/{chunk-624UQ5R6.cjs → chunk-LDONE225.cjs} +1104 -442
- package/dist/chunk-LDONE225.cjs.map +1 -0
- package/dist/{chunk-XO7WW3I6.cjs → chunk-LPAWZYDU.cjs} +4 -4
- package/dist/{chunk-XO7WW3I6.cjs.map → chunk-LPAWZYDU.cjs.map} +1 -1
- package/dist/{chunk-IPEHLRTI.js → chunk-MPCSWRZC.js} +76 -14
- package/dist/chunk-MPCSWRZC.js.map +1 -0
- package/dist/{chunk-ROX5KEZM.cjs → chunk-NFZMNKOR.cjs} +15 -15
- package/dist/{chunk-ROX5KEZM.cjs.map → chunk-NFZMNKOR.cjs.map} +1 -1
- package/dist/{chunk-R5E2LSN2.cjs → chunk-NZT5P2XZ.cjs} +73 -2
- package/dist/chunk-NZT5P2XZ.cjs.map +1 -0
- package/dist/{chunk-GPC5BWLI.js → chunk-OFKRELZK.js} +3 -3
- package/dist/{chunk-GPC5BWLI.js.map → chunk-OFKRELZK.js.map} +1 -1
- package/dist/{chunk-XJJUJ2EF.cjs → chunk-QBS4F44Q.cjs} +517 -10
- package/dist/chunk-QBS4F44Q.cjs.map +1 -0
- package/dist/{chunk-SUIDD2C5.cjs → chunk-SHMG7BVF.cjs} +54 -8
- package/dist/chunk-SHMG7BVF.cjs.map +1 -0
- package/dist/{chunk-XEIVA2CT.js → chunk-T3FV73LM.js} +3 -3
- package/dist/{chunk-XEIVA2CT.js.map → chunk-T3FV73LM.js.map} +1 -1
- package/dist/{chunk-4THUHX2D.cjs → chunk-T5KHNJ67.cjs} +5 -5
- package/dist/{chunk-4THUHX2D.cjs.map → chunk-T5KHNJ67.cjs.map} +1 -1
- package/dist/{chunk-FXPOHPBE.cjs → chunk-TACTEF2N.cjs} +4 -4
- package/dist/{chunk-FXPOHPBE.cjs.map → chunk-TACTEF2N.cjs.map} +1 -1
- package/dist/{chunk-MI77LY6A.js → chunk-TRUJ4Q6V.js} +1044 -383
- package/dist/chunk-TRUJ4Q6V.js.map +1 -0
- package/dist/{chunk-BXNOXOE4.cjs → chunk-UHPGWO77.cjs} +77 -14
- package/dist/chunk-UHPGWO77.cjs.map +1 -0
- package/dist/{chunk-AORGFBEH.js → chunk-UK6HF6PE.js} +73 -3
- package/dist/chunk-UK6HF6PE.js.map +1 -0
- package/dist/{chunk-35XCP2E4.js → chunk-WAKRRGAV.js} +516 -10
- package/dist/chunk-WAKRRGAV.js.map +1 -0
- package/dist/{chunk-T3ZN5P32.cjs → chunk-WK36Z63Y.cjs} +141 -7
- package/dist/chunk-WK36Z63Y.cjs.map +1 -0
- package/dist/{chunk-LGFB4H5B.js → chunk-WU2N6ZVM.js} +3 -3
- package/dist/{chunk-LGFB4H5B.js.map → chunk-WU2N6ZVM.js.map} +1 -1
- package/dist/{chunk-FHZTWWI6.js → chunk-YMZTXOUG.js} +3 -3
- package/dist/{chunk-FHZTWWI6.js.map → chunk-YMZTXOUG.js.map} +1 -1
- package/dist/{chunk-XSPENTEG.js → chunk-YTGOLTLJ.js} +3 -3
- package/dist/{chunk-XSPENTEG.js.map → chunk-YTGOLTLJ.js.map} +1 -1
- package/dist/{chunk-VZO2SX6Q.cjs → chunk-Z3A2UNK2.cjs} +4 -4
- package/dist/{chunk-VZO2SX6Q.cjs.map → chunk-Z3A2UNK2.cjs.map} +1 -1
- package/dist/{diagnostics-CzHW0RCo.d.cts → diagnostics-BKRow1ur.d.cts} +15 -1
- package/dist/{diagnostics-CzHW0RCo.d.ts → diagnostics-BKRow1ur.d.ts} +15 -1
- package/dist/diagrams/blockdiagram/index.cjs +5 -5
- package/dist/diagrams/blockdiagram/index.d.cts +1 -1
- package/dist/diagrams/blockdiagram/index.d.ts +1 -1
- package/dist/diagrams/blockdiagram/index.js +1 -1
- package/dist/diagrams/circuit/index.cjs +12 -8
- package/dist/diagrams/circuit/index.d.cts +13 -2
- package/dist/diagrams/circuit/index.d.ts +13 -2
- package/dist/diagrams/circuit/index.js +2 -2
- package/dist/diagrams/ecomap/index.cjs +7 -7
- package/dist/diagrams/ecomap/index.d.cts +1 -1
- package/dist/diagrams/ecomap/index.d.ts +1 -1
- package/dist/diagrams/ecomap/index.js +2 -2
- package/dist/diagrams/entity/index.cjs +6 -6
- package/dist/diagrams/entity/index.d.cts +1 -1
- package/dist/diagrams/entity/index.d.ts +1 -1
- package/dist/diagrams/entity/index.js +2 -2
- package/dist/diagrams/fishbone/index.cjs +8 -8
- package/dist/diagrams/fishbone/index.d.cts +1 -1
- package/dist/diagrams/fishbone/index.d.ts +1 -1
- package/dist/diagrams/fishbone/index.js +2 -2
- package/dist/diagrams/flowchart/index.cjs +8 -8
- package/dist/diagrams/flowchart/index.d.cts +2 -2
- package/dist/diagrams/flowchart/index.d.ts +2 -2
- package/dist/diagrams/flowchart/index.js +2 -2
- package/dist/diagrams/genogram/index.cjs +9 -9
- package/dist/diagrams/genogram/index.d.cts +1 -1
- package/dist/diagrams/genogram/index.d.ts +1 -1
- package/dist/diagrams/genogram/index.js +2 -2
- package/dist/diagrams/ladder/index.cjs +6 -6
- package/dist/diagrams/ladder/index.d.cts +1 -1
- package/dist/diagrams/ladder/index.d.ts +1 -1
- package/dist/diagrams/ladder/index.js +2 -2
- package/dist/diagrams/logic/index.cjs +8 -8
- package/dist/diagrams/logic/index.d.cts +1 -1
- package/dist/diagrams/logic/index.d.ts +1 -1
- package/dist/diagrams/logic/index.js +2 -2
- package/dist/diagrams/orgchart/index.cjs +11 -7
- package/dist/diagrams/orgchart/index.d.cts +27 -2
- package/dist/diagrams/orgchart/index.d.ts +27 -2
- package/dist/diagrams/orgchart/index.js +2 -2
- package/dist/diagrams/pedigree/index.cjs +7 -7
- package/dist/diagrams/pedigree/index.d.cts +1 -1
- package/dist/diagrams/pedigree/index.d.ts +1 -1
- package/dist/diagrams/pedigree/index.js +2 -2
- package/dist/diagrams/phylo/index.cjs +7 -7
- package/dist/diagrams/phylo/index.d.cts +1 -1
- package/dist/diagrams/phylo/index.d.ts +1 -1
- package/dist/diagrams/phylo/index.js +2 -2
- package/dist/diagrams/sld/index.cjs +8 -8
- package/dist/diagrams/sld/index.d.cts +1 -1
- package/dist/diagrams/sld/index.d.ts +1 -1
- package/dist/diagrams/sld/index.js +2 -2
- package/dist/diagrams/sociogram/index.cjs +6 -6
- package/dist/diagrams/sociogram/index.d.cts +1 -1
- package/dist/diagrams/sociogram/index.d.ts +1 -1
- package/dist/diagrams/sociogram/index.js +2 -2
- package/dist/diagrams/timing/index.d.cts +1 -1
- package/dist/diagrams/timing/index.d.ts +1 -1
- package/dist/diagrams/venn/index.cjs +9 -9
- package/dist/diagrams/venn/index.d.cts +1 -1
- package/dist/diagrams/venn/index.d.ts +1 -1
- package/dist/diagrams/venn/index.js +2 -2
- package/dist/{index-R0IwpG20.d.cts → index-DU2h1Y-a.d.cts} +1 -1
- package/dist/{index-DdR1Auby.d.ts → index-Dq3Mfxay.d.ts} +1 -1
- package/dist/index.cjs +79 -75
- package/dist/index.d.cts +7 -5
- package/dist/index.d.ts +7 -5
- package/dist/index.js +22 -22
- package/dist/react.cjs +18 -18
- package/dist/react.d.cts +2 -2
- package/dist/react.d.ts +2 -2
- package/dist/react.js +17 -17
- package/dist/{tools-B7EqXLgD.d.ts → tools-A0HRZ8jj.d.ts} +11 -2
- package/dist/{tools-DHSVXHM9.d.cts → tools-OzOQnlnV.d.cts} +11 -2
- package/package.json +1 -1
- package/dist/chunk-35XCP2E4.js.map +0 -1
- package/dist/chunk-624UQ5R6.cjs.map +0 -1
- package/dist/chunk-AORGFBEH.js.map +0 -1
- package/dist/chunk-BXNOXOE4.cjs.map +0 -1
- package/dist/chunk-EPKIJEH7.js.map +0 -1
- package/dist/chunk-IPEHLRTI.js.map +0 -1
- package/dist/chunk-MI77LY6A.js.map +0 -1
- package/dist/chunk-OANWVUBA.js.map +0 -1
- package/dist/chunk-R5E2LSN2.cjs.map +0 -1
- package/dist/chunk-SUIDD2C5.cjs.map +0 -1
- package/dist/chunk-T3ZN5P32.cjs.map +0 -1
- package/dist/chunk-W3IXH6BN.cjs.map +0 -1
- package/dist/chunk-XJJUJ2EF.cjs.map +0 -1
- package/dist/chunk-ZZHQBAC3.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/diagrams/ecomap/parser.ts","../src/diagrams/ecomap/layout.ts","../src/diagrams/ecomap/legend.ts","../src/diagrams/ecomap/renderer.ts","../src/diagrams/ecomap/index.ts"],"names":["text","CATEGORY_COLORS"],"mappings":"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","file":"chunk-OHLNH7IO.js","sourcesContent":["import type {\n DiagramAST,\n Individual,\n LegendOverrides,\n Relationship,\n RelationshipType,\n Sex,\n} from \"../../core/types\";\nimport { parseLegendDirective } from \"../../core/legend-parser\";\n\n// ─── Error ─────────────────────────────────────────────────\n\nexport class EcomapParseError extends Error {\n constructor(message: string, public line: number) {\n super(`Line ${line}: ${message}`);\n this.name = \"EcomapParseError\";\n }\n}\n\n// ─── Connection operator table ─────────────────────────────\n\ninterface ConnectionOpInfo {\n relType: RelationshipType;\n energyFlow?: \"from\" | \"to\" | \"mutual\";\n}\n\nconst CONNECTION_OPS: Record<string, ConnectionOpInfo> = {\n \"===\": { relType: \"strong\" },\n \"==\": { relType: \"moderate\" },\n \"---\": { relType: \"normal\" },\n \"- -\": { relType: \"weak\" },\n \"~~~\": { relType: \"stressful\" },\n \"~=~\": { relType: \"stressful-strong\" },\n \"~x~\": { relType: \"conflictual\" },\n \"-/-\": { relType: \"broken\" },\n \"===>\": { relType: \"strong\", energyFlow: \"from\" },\n \"<===\": { relType: \"strong\", energyFlow: \"to\" },\n \"<=>\": { relType: \"moderate\", energyFlow: \"mutual\" },\n \"==>\": { relType: \"moderate\", energyFlow: \"from\" },\n \"<==\": { relType: \"moderate\", energyFlow: \"to\" },\n \"-->\": { relType: \"normal\", energyFlow: \"from\" },\n \"<--\": { relType: \"normal\", energyFlow: \"to\" },\n \"<->\": { relType: \"normal\", energyFlow: \"mutual\" },\n};\n\nconst OP_PATTERN =\n \"===>|<===|===|<=>|==>|<==|<->|-->|<--|~=~|~x~|~~~|-\\\\/-|---|==|- -\";\nconst CONNECTION_RE = new RegExp(\n `^([a-zA-Z][a-zA-Z0-9_-]*)\\\\s+(${OP_PATTERN})\\\\s+([a-zA-Z][a-zA-Z0-9_-]*)(.*)$`\n);\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function parseEcomap(text: string): DiagramAST {\n const lines = text.split(\"\\n\");\n const individuals: Individual[] = [];\n const knownIds = new Set<string>();\n const relationships: Relationship[] = [];\n const metadata: Record<string, string> = {};\n const legendOverrides: LegendOverrides = {};\n let hasLegendOverrides = false;\n let centerId: string | null = null;\n\n let i = 0;\n\n while (\n i < lines.length &&\n (lines[i].trim() === \"\" ||\n lines[i].trim().startsWith(\"#\") ||\n lines[i].trim().startsWith(\"//\") ||\n lines[i].trim().startsWith(\"%%\"))\n ) {\n i++;\n }\n if (i >= lines.length) throw new EcomapParseError(\"Empty input\", 1);\n\n const header = lines[i].trim();\n // Mermaid-style header tolerance: `ecomap`, `ecomap \"Title\"`,\n // `ecomap:mode`, `ecomap:mode \"Title\"`. The `:mode` is captured as\n // metadata for future use; current renderer ignores it.\n const headerMatch = header.match(\n /^ecomap(?::([a-zA-Z][\\w-]*))?\\s*(?:\"([^\"]*)\")?\\s*$/i\n );\n if (!headerMatch)\n throw new EcomapParseError(\n `Expected 'ecomap' header (got '${header}')`,\n i + 1\n );\n if (headerMatch[1]) metadata.mode = headerMatch[1].toLowerCase();\n if (headerMatch[2]) metadata.title = headerMatch[2];\n i++;\n\n while (i < lines.length) {\n const raw = lines[i];\n const trimmed = raw.trim();\n if (\n trimmed === \"\" ||\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"//\") ||\n trimmed.startsWith(\"%%\")\n ) {\n i++;\n continue;\n }\n\n // Legend directives: legend.title, legend.position, legend.label, etc.\n if (parseLegendDirective(trimmed, legendOverrides)) {\n hasLegendOverrides = true;\n i++;\n continue;\n }\n\n // Center definition\n const centerMatch = trimmed.match(\n /^center:\\s*([a-zA-Z][a-zA-Z0-9_-]*)\\s*(\\[.*\\])?\\s*$/\n );\n if (centerMatch) {\n const id = centerMatch[1].toLowerCase();\n centerId = id;\n const props = centerMatch[2] ? parseProps(centerMatch[2]) : {};\n individuals.push(buildIndividual(id, props, true));\n knownIds.add(id);\n i++;\n // Skip indented family content under center\n const baseIndent = leadingSpaces(raw);\n while (i < lines.length) {\n if (lines[i].trim() === \"\") {\n i++;\n continue;\n }\n if (leadingSpaces(lines[i]) > baseIndent + 2) {\n i++;\n } else {\n break;\n }\n }\n continue;\n }\n\n // Connection\n const connMatch = trimmed.match(CONNECTION_RE);\n if (connMatch) {\n const fromRaw = connMatch[1].toLowerCase();\n const op = connMatch[2];\n const toRaw = connMatch[3].toLowerCase();\n const rest = connMatch[4]?.trim() ?? \"\";\n\n const opInfo = CONNECTION_OPS[op];\n if (!opInfo)\n throw new EcomapParseError(`Unknown operator '${op}'`, i + 1);\n\n let label: string | undefined;\n const lblMatch = rest.match(/\\[\\s*label:\\s*\"([^\"]*)\"\\s*\\]/);\n if (lblMatch) label = lblMatch[1];\n\n let from = fromRaw;\n let to = toRaw;\n let flow = opInfo.energyFlow;\n\n if (to === centerId && from !== centerId) {\n [from, to] = [to, from];\n if (flow === \"from\") flow = \"to\";\n else if (flow === \"to\") flow = \"from\";\n }\n\n relationships.push({\n type: opInfo.relType,\n from,\n to,\n label,\n energyFlow: flow,\n });\n i++;\n continue;\n }\n\n // System definition\n const sysMatch = trimmed.match(\n /^([a-zA-Z][a-zA-Z0-9_-]*)\\s*(\\[.*\\])?\\s*$/\n );\n if (sysMatch) {\n const id = sysMatch[1].toLowerCase();\n if (!knownIds.has(id)) {\n const props = sysMatch[2] ? parseProps(sysMatch[2]) : {};\n individuals.push(buildIndividual(id, props, false));\n knownIds.add(id);\n }\n i++;\n continue;\n }\n\n throw new EcomapParseError(`Unexpected: ${trimmed}`, i + 1);\n }\n\n return {\n type: \"ecomap\",\n individuals,\n relationships,\n metadata,\n legendOverrides: hasLegendOverrides ? legendOverrides : undefined,\n };\n}\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction leadingSpaces(line: string): number {\n const m = line.match(/^(\\s*)/);\n return m ? m[1].length : 0;\n}\n\nfunction parseProps(bracketStr: string): Record<string, string> {\n const inner = bracketStr.slice(1, -1).trim();\n if (!inner) return {};\n const props: Record<string, string> = {};\n\n for (const part of splitCommas(inner)) {\n const t = part.trim();\n if (!t) continue;\n\n const kv = t.match(/^([\\w][\\w-]*)\\s*:\\s*(?:\"([^\"]*)\"|(\\S+))$/);\n if (kv) {\n props[kv[1]] = kv[2] ?? kv[3];\n continue;\n }\n\n if (t === \"male\" || t === \"female\" || t === \"unknown\") {\n props.sex = t;\n continue;\n }\n\n props[t] = \"true\";\n }\n return props;\n}\n\nfunction splitCommas(s: string): string[] {\n const parts: string[] = [];\n let cur = \"\";\n let inQ = false;\n for (const ch of s) {\n if (ch === '\"') {\n inQ = !inQ;\n cur += ch;\n } else if (ch === \",\" && !inQ) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur) parts.push(cur);\n return parts;\n}\n\nfunction parseSex(s?: string): Sex {\n switch (s) {\n case \"male\":\n case \"female\":\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return s;\n default:\n return \"unknown\";\n }\n}\n\nfunction buildIndividual(\n id: string,\n props: Record<string, string>,\n isCenter: boolean\n): Individual {\n const properties: Record<string, string> = {};\n if (isCenter) properties.center = \"true\";\n if (props.category) properties.category = props.category;\n if (props.size) properties.size = props.size;\n if (props.importance) properties.importance = props.importance;\n if (props.sector) properties.sector = props.sector;\n\n return {\n id,\n label: props.label ?? id,\n sex: parseSex(props.sex),\n status: \"alive\",\n age: props.age ? parseInt(props.age, 10) : undefined,\n properties,\n };\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Constants ─────────────────────────────────────────────\n\nconst CENTER_R = 50;\nconst SYS_R = 30;\nconst SYS_R_LARGE = 40;\nconst SYS_R_SMALL = 20;\nconst PADDING = 40;\nconst LABEL_CLEARANCE = 60;\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function layoutEcomap(\n ast: DiagramAST,\n _config: LayoutConfig\n): LayoutResult {\n const center = ast.individuals.find(\n (ind) => ind.properties?.center === \"true\"\n );\n if (!center) throw new Error(\"Ecomap requires a center element\");\n\n const systems = ast.individuals.filter(\n (ind) => ind.properties?.center !== \"true\"\n );\n const n = systems.length;\n\n if (n === 0) {\n const size = (CENTER_R + PADDING + LABEL_CLEARANCE) * 2;\n return {\n width: size,\n height: size,\n nodes: [\n {\n id: center.id,\n x: size / 2 - CENTER_R,\n y: size / 2 - CENTER_R,\n width: CENTER_R * 2,\n height: CENTER_R * 2,\n generation: 0,\n individual: center,\n },\n ],\n edges: [],\n };\n }\n\n const ringRadii = getRingRadii(n);\n const ringAssignment = assignToRings(\n center.id,\n systems,\n ast.relationships,\n ringRadii.length\n );\n const systemPositions = placeOnRings(systems, ringAssignment, ringRadii);\n\n const maxRing = ringRadii[ringRadii.length - 1] ?? 180;\n const canvasSize = (maxRing + SYS_R_LARGE + LABEL_CLEARANCE + PADDING) * 2;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n const nodes: LayoutNode[] = [];\n\n nodes.push({\n id: center.id,\n x: cx - CENTER_R,\n y: cy - CENTER_R,\n width: CENTER_R * 2,\n height: CENTER_R * 2,\n generation: 0,\n individual: center,\n });\n\n for (const sys of systems) {\n const pos = systemPositions.get(sys.id);\n if (!pos) continue;\n const r = getSystemRadius(sys);\n nodes.push({\n id: sys.id,\n x: cx + pos.x - r,\n y: cy + pos.y - r,\n width: r * 2,\n height: r * 2,\n generation: pos.ring + 1,\n individual: sys,\n });\n }\n\n const edges = computeEdges(nodes, ast.relationships);\n\n return { width: canvasSize, height: canvasSize, nodes, edges };\n}\n\n// ─── Ring configuration ────────────────────────────────────\n\nfunction getRingRadii(n: number): number[] {\n if (n === 0) return [];\n if (n <= 6) return [180];\n if (n <= 12) return [150, 270];\n return [140, 230, 320];\n}\n\nfunction assignToRings(\n _centerId: string,\n systems: Individual[],\n rels: Relationship[],\n ringCount: number\n): Map<string, number> {\n const relBySys = new Map<string, Relationship>();\n for (const r of rels) {\n const sysId =\n r.from === _centerId ? r.to : r.from === _centerId ? r.to : r.to;\n if (!relBySys.has(sysId)) relBySys.set(sysId, r);\n const otherId = r.from === _centerId ? r.to : r.from;\n if (!relBySys.has(otherId)) relBySys.set(otherId, r);\n }\n\n const result = new Map<string, number>();\n\n if (ringCount <= 1) {\n for (const s of systems) result.set(s.id, 0);\n return result;\n }\n\n for (const s of systems) {\n const rel = relBySys.get(s.id);\n if (!rel) {\n result.set(s.id, ringCount - 1);\n continue;\n }\n\n if (rel.type === \"strong\" || rel.type === \"stressful-strong\") {\n result.set(s.id, 0);\n } else if (rel.type === \"weak\" || rel.type === \"broken\") {\n result.set(s.id, ringCount - 1);\n } else {\n result.set(s.id, Math.min(1, ringCount - 1));\n }\n }\n\n return result;\n}\n\n// ─── Placement ─────────────────────────────────────────────\n\ninterface SysPos {\n x: number;\n y: number;\n ring: number;\n}\n\nfunction placeOnRings(\n systems: Individual[],\n ringAssignment: Map<string, number>,\n ringRadii: number[]\n): Map<string, SysPos> {\n const ringGroups = new Map<number, Individual[]>();\n for (const s of systems) {\n const ring = ringAssignment.get(s.id) ?? 0;\n const grp = ringGroups.get(ring) ?? [];\n grp.push(s);\n ringGroups.set(ring, grp);\n }\n\n const positions = new Map<string, SysPos>();\n\n for (const [ring, grp] of ringGroups) {\n const radius = ringRadii[ring] ?? ringRadii[ringRadii.length - 1] ?? 180;\n const n = grp.length;\n const startAngle = -Math.PI / 2;\n\n for (let idx = 0; idx < n; idx++) {\n const angle = startAngle + (2 * Math.PI * idx) / n;\n positions.set(grp[idx].id, {\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n ring,\n });\n }\n }\n\n return positions;\n}\n\n// ─── Edges ─────────────────────────────────────────────────\n\nfunction computeEdges(\n nodes: LayoutNode[],\n rels: Relationship[]\n): LayoutEdge[] {\n const nodeMap = new Map<string, LayoutNode>();\n for (const n of nodes) nodeMap.set(n.id, n);\n\n const edges: LayoutEdge[] = [];\n\n for (const rel of rels) {\n const fromNode = nodeMap.get(rel.from);\n const toNode = nodeMap.get(rel.to);\n if (!fromNode || !toNode) continue;\n\n const fcx = fromNode.x + fromNode.width / 2;\n const fcy = fromNode.y + fromNode.height / 2;\n const tcx = toNode.x + toNode.width / 2;\n const tcy = toNode.y + toNode.height / 2;\n\n const dx = tcx - fcx;\n const dy = tcy - fcy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < 1) continue;\n\n const ux = dx / dist;\n const uy = dy / dist;\n const fromR = fromNode.width / 2;\n const toR = toNode.width / 2;\n\n const x1 = fcx + ux * fromR;\n const y1 = fcy + uy * fromR;\n const x2 = tcx - ux * toR;\n const y2 = tcy - uy * toR;\n\n edges.push({\n from: rel.from,\n to: rel.to,\n relationship: rel,\n path: `M ${x1} ${y1} L ${x2} ${y2}`,\n });\n }\n\n return edges;\n}\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction getSystemRadius(ind: Individual): number {\n const imp = ind.properties?.importance ?? ind.properties?.size;\n switch (imp) {\n case \"major\":\n case \"large\":\n return SYS_R_LARGE;\n case \"minor\":\n case \"small\":\n return SYS_R_SMALL;\n default:\n return SYS_R;\n }\n}\n","/**\n * Auto-derive a LegendSpec from an ecomap AST.\n *\n * Two sections, each emitted only when the diagram uses something non-trivial:\n * 1. Systems — color swatch per used `category` (Hartman palette)\n * 2. Ties — line style per used relationship type (strong/moderate/\n * weak/stressful/conflictual/broken). The default plain\n * line tie is treated as \"obvious\" and not listed.\n */\n\nimport type {\n DiagramAST,\n LegendItem,\n LegendSection,\n LegendSpec,\n RelationshipType,\n} from \"../../core/types\";\n\n// Mirrors the palette in renderer.ts. Kept colocated so the legend swatch\n// matches whatever the renderer paints.\nconst CATEGORY_COLORS: Record<string, string> = {\n family: \"#8D6E63\",\n friends: \"#42A5F5\",\n work: \"#66BB6A\",\n education: \"#FFA726\",\n health: \"#EF5350\",\n \"mental-health\": \"#AB47BC\",\n religion: \"#CCBB33\",\n recreation: \"#26C6DA\",\n legal: \"#78909C\",\n government: \"#8D6E63\",\n financial: \"#66BB6A\",\n community: \"#29B6F6\",\n cultural: \"#FFA726\",\n substance: \"#EF5350\",\n technology: \"#42A5F5\",\n pet: \"#8D6E63\",\n};\n\nconst ECOMAP_TIE_TYPES: ReadonlySet<RelationshipType> = new Set<RelationshipType>([\n \"strong\",\n \"moderate\",\n \"weak\",\n \"stressful\",\n \"stressful-strong\",\n \"conflictual\",\n \"broken\",\n]);\n\nconst SECTIONS: LegendSection[] = [\n { id: \"systems\", title: \"Systems\" },\n { id: \"ties\", title: \"Ties\" },\n];\n\nexport function buildEcomapLegend(ast: DiagramAST): LegendSpec {\n const items: LegendItem[] = [];\n\n // Systems — only categories actually present (excluding the center node).\n const usedCats = new Set<string>();\n for (const ind of ast.individuals) {\n if (ind.properties?.center === \"true\") continue;\n const cat = ind.properties?.category;\n if (cat) usedCats.add(cat);\n }\n // Stable ordering: sort alphabetically.\n const orderedCats = Array.from(usedCats).sort();\n for (const cat of orderedCats) {\n items.push({\n key: `cat.${cat}`,\n label: humanize(cat),\n kind: \"fill\",\n color: CATEGORY_COLORS[cat] ?? \"#9ca3af\",\n section: \"systems\",\n });\n }\n\n // Ties — only types used.\n const usedTies = new Set<RelationshipType>();\n for (const r of ast.relationships) {\n if (ECOMAP_TIE_TYPES.has(r.type)) usedTies.add(r.type);\n }\n const tieOrder: RelationshipType[] = [\n \"strong\",\n \"moderate\",\n \"weak\",\n \"stressful\",\n \"stressful-strong\",\n \"conflictual\",\n \"broken\",\n ];\n for (const t of tieOrder) {\n if (!usedTies.has(t)) continue;\n items.push(tieItem(t));\n }\n\n return {\n mode: \"auto\",\n title: \"Legend\",\n position: \"bottom-inline\",\n columns: 1,\n sections: SECTIONS,\n items,\n };\n}\n\nfunction tieItem(t: RelationshipType): LegendItem {\n const base: LegendItem = {\n key: t,\n label: humanize(t),\n kind: \"line\",\n section: \"ties\",\n pattern: \"solid\",\n };\n switch (t) {\n case \"strong\":\n // Three parallel lines visualised — represented in legend as a thicker solid bar.\n return { ...base, strokeWidth: 4 };\n case \"moderate\":\n return { ...base, strokeWidth: 3 };\n case \"weak\":\n return { ...base, pattern: \"dashed\", strokeWidth: 1.5 };\n case \"stressful\":\n return { ...base, pattern: \"wavy\", strokeWidth: 2 };\n case \"stressful-strong\":\n return { ...base, pattern: \"wavy\", strokeWidth: 3 };\n case \"conflictual\":\n return { ...base, kind: \"edge\", pattern: \"wavy\", marker: \"X\", strokeWidth: 2 };\n case \"broken\":\n return { ...base, pattern: \"broken\" };\n default:\n return base;\n }\n}\n\nfunction humanize(s: string): string {\n return s\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","import type {\n DiagramAST,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n RenderConfig,\n} from \"../../core/types\";\nimport { svgRoot, el, group, text, title, desc } from \"../../core/svg\";\nimport { cssCustomProperties, resolveBaseTheme, STROKE_WIDTH, type BaseTheme } from \"../../core/theme\";\nimport { applyLegendOverrides, renderLegend } from \"../../core/legend\";\nimport { buildEcomapLegend } from \"./legend\";\n\n// ─── Category colors (Hartman standard) ────────────────────\n\nconst CATEGORY_COLORS: Record<string, string> = {\n family: \"#8D6E63\",\n friends: \"#42A5F5\",\n work: \"#66BB6A\",\n education: \"#FFA726\",\n health: \"#EF5350\",\n \"mental-health\": \"#AB47BC\",\n religion: \"#CCBB33\",\n recreation: \"#26C6DA\",\n legal: \"#78909C\",\n government: \"#8D6E63\",\n financial: \"#66BB6A\",\n community: \"#29B6F6\",\n cultural: \"#FFA726\",\n substance: \"#EF5350\",\n technology: \"#42A5F5\",\n pet: \"#8D6E63\",\n};\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function renderEcomap(\n layout: LayoutResult,\n config: RenderConfig,\n ast?: DiagramAST\n): string {\n const centerNode = layout.nodes.find(\n (n) => n.individual.properties?.center === \"true\"\n );\n const systemNodes = layout.nodes.filter(\n (n) => n.individual.properties?.center !== \"true\"\n );\n\n const t = resolveBaseTheme(config.theme);\n const defsStr = buildDefs(t);\n const styleStr = buildStyles(config, t);\n const connectionsStr = renderConnections(layout.edges, centerNode?.individual.id);\n const centerStr = centerNode ? renderCenter(centerNode, config) : \"\";\n const systemsStr = renderSystems(systemNodes, config);\n const labelsStr = renderConnectionLabels(layout.edges, t);\n\n const layers: string[] = [\n title(\"Ecomap\"),\n desc(`Ecomap diagram with ${systemNodes.length} external systems`),\n defsStr,\n styleStr,\n ];\n\n // Defer pushing chart-content until we know whether the legend widens the\n // viewBox so we can horizontally center the chart.\n const chartContent = [\n connectionsStr,\n centerStr,\n systemsStr,\n labelsStr,\n ];\n\n let finalWidth = layout.width;\n let finalHeight = layout.height;\n let legendSvg = \"\";\n\n if (ast) {\n const autoSpec = buildEcomapLegend(ast);\n const finalSpec = applyLegendOverrides(autoSpec, ast.legendOverrides);\n if (finalSpec.mode === \"on\" && finalSpec.items.length > 0) {\n const { svg, bbox: lb } = renderLegend(\n finalSpec,\n {\n canvasWidth: layout.width,\n canvasHeight: layout.height,\n padding: 16,\n },\n t,\n { fontFamily: config.fontFamily, fontSize: config.fontSize }\n );\n if (svg) {\n legendSvg = svg;\n const overflowX = lb.x + lb.w + 8;\n const overflowY = lb.y + lb.h + 8;\n if (overflowX > finalWidth) finalWidth = overflowX;\n if (overflowY > finalHeight) finalHeight = overflowY;\n }\n }\n }\n\n const chartXOffset = Math.max(0, (finalWidth - layout.width) / 2);\n layers.push(\n group(\n { transform: chartXOffset > 0 ? `translate(${chartXOffset}, 0)` : undefined },\n chartContent\n )\n );\n if (legendSvg) layers.push(legendSvg);\n\n return svgRoot(\n {\n viewBox: `0 0 ${finalWidth} ${finalHeight}`,\n class: \"schematex-diagram schematex-ecomap\",\n width: finalWidth,\n height: finalHeight,\n },\n layers\n );\n}\n\n// ─── Defs ──────────────────────────────────────────────────\n\nfunction buildDefs(t: BaseTheme): string {\n const arrowMarker = el(\n \"marker\",\n {\n id: \"schematex-ecomap-eco-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"10\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M 0 0 L 10 5 L 0 10 z\", fill: t.neutral })]\n );\n\n return el(\"defs\", {}, [arrowMarker]);\n}\n\n// ─── Styles ────────────────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig, t: BaseTheme): string {\n let css = `\n.schematex-ecomap {${cssCustomProperties(t)}\n}\n.schematex-ecomap-center-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.thick}; }\n.schematex-ecomap-center-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize + 2}px; text-anchor: middle; dominant-baseline: central; fill: ${t.text}; font-weight: 600; }\n.schematex-ecomap-system-shape { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-ecomap-system-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 1}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-ecomap-eco-line { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-parallel { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-weak { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 6,4; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-broken { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 3,8; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-stressful { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-conn-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 2}px; text-anchor: middle; fill: ${t.textMuted}; }\n.schematex-ecomap-eco-arrow { fill: ${t.neutral}; }\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-parallel,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-weak,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-broken,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-stressful { stroke-opacity: 0.55; }\n`;\n\n for (const [cat, color] of Object.entries(CATEGORY_COLORS)) {\n css += `.schematex-ecomap-system-${cat} .schematex-ecomap-system-shape { fill: ${color}18; stroke: ${color}; }\\n`;\n }\n\n return el(\"style\", {}, css);\n}\n\n// ─── Center ────────────────────────────────────────────────\n\nfunction renderCenter(node: LayoutNode, config: RenderConfig): string {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const r = node.width / 2;\n const ind = node.individual;\n\n const label = ind.label !== ind.id ? ind.label : capitalize(ind.id);\n const elements: string[] = [\n el(\"circle\", {\n cx,\n cy,\n r,\n class: \"schematex-ecomap-center-shape\",\n }),\n text(\n {\n x: cx,\n y: cy,\n class: \"schematex-ecomap-center-label\",\n },\n label\n ),\n ];\n\n if (ind.age) {\n elements.push(\n text(\n {\n x: cx,\n y: cy + config.fontSize + 4,\n class: \"schematex-ecomap-center-label\",\n \"font-size\": `${config.fontSize}px`,\n \"font-weight\": \"normal\",\n },\n `Age ${ind.age}`\n )\n );\n }\n\n return group(\n { class: \"schematex-ecomap-center\", \"data-id\": ind.id },\n elements\n );\n}\n\n// ─── Systems ───────────────────────────────────────────────\n\nfunction renderSystems(\n nodes: LayoutNode[],\n config: RenderConfig\n): string {\n const elements: 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 const r = node.width / 2;\n const ind = node.individual;\n const cat = ind.properties?.category ?? \"other\";\n const label = ind.label !== ind.id ? ind.label : capitalize(ind.id);\n\n const labelLines = wrapLabel(label, 12);\n const labelElements: string[] = [];\n const labelStartY = cy + r + config.fontSize + 2;\n\n for (let li = 0; li < labelLines.length; li++) {\n labelElements.push(\n text(\n {\n x: cx,\n y: labelStartY + li * (config.fontSize + 1),\n class: \"schematex-ecomap-system-label\",\n },\n labelLines[li]\n )\n );\n }\n\n elements.push(\n group(\n {\n class: `schematex-ecomap-system schematex-ecomap-system-${cat}`,\n \"data-system-id\": ind.id,\n },\n [\n el(\"circle\", {\n cx,\n cy,\n r,\n class: \"schematex-ecomap-system-shape\",\n }),\n ...labelElements,\n ]\n )\n );\n }\n\n return group({ class: \"schematex-ecomap-systems\" }, elements);\n}\n\n// ─── Connections ───────────────────────────────────────────\n\nfunction renderConnections(edges: LayoutEdge[], centerId?: string): string {\n const elements: string[] = [];\n\n for (const edge of edges) {\n const coords = extractLineCoords(edge.path);\n if (!coords) continue;\n\n const relType = edge.relationship.type;\n const flow = edge.relationship.energyFlow;\n const lineElements: string[] = [];\n\n const arrowAttrs = getArrowAttrs(flow);\n\n switch (relType) {\n case \"strong\":\n lineElements.push(\n ...parallelLines(coords, 3, 4, {\n class: \"schematex-ecomap-eco-line-parallel\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"moderate\":\n lineElements.push(\n ...parallelLines(coords, 2, 4, {\n class: \"schematex-ecomap-eco-line-parallel\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"weak\":\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line-weak\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"stressful\":\n case \"stressful-strong\":\n lineElements.push(\n el(\"path\", {\n d: wavyPath(\n coords.x1,\n coords.y1,\n coords.x2,\n coords.y2,\n 8,\n 20\n ),\n class: \"schematex-ecomap-eco-line-stressful\",\n \"stroke-width\": relType === \"stressful-strong\" ? \"3\" : \"2\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"conflictual\":\n lineElements.push(\n el(\"path\", {\n d: wavyPath(\n coords.x1,\n coords.y1,\n coords.x2,\n coords.y2,\n 8,\n 20\n ),\n class: \"schematex-ecomap-eco-line-stressful\",\n ...arrowAttrs,\n })\n );\n lineElements.push(\n ...conflictMarks(coords)\n );\n break;\n\n case \"broken\":\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line-broken\",\n ...arrowAttrs,\n })\n );\n break;\n\n default:\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line\",\n ...arrowAttrs,\n })\n );\n break;\n }\n\n const isMesosystem =\n centerId !== undefined && edge.from !== centerId && edge.to !== centerId;\n const groupClass = isMesosystem\n ? `schematex-ecomap-connection schematex-ecomap-connection-${relType} schematex-ecomap-connection-mesosystem`\n : `schematex-ecomap-connection schematex-ecomap-connection-${relType}`;\n const groupAttrs: Record<string, string> = {\n class: groupClass,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n };\n if (isMesosystem) groupAttrs[\"data-mesosystem\"] = \"true\";\n\n elements.push(group(groupAttrs, lineElements));\n }\n\n return group({ class: \"schematex-ecomap-connections\" }, elements);\n}\n\n// ─── Connection labels ─────────────────────────────────────\n\nfunction renderConnectionLabels(edges: LayoutEdge[], t: BaseTheme): string {\n const elements: string[] = [];\n\n for (const edge of edges) {\n if (!edge.relationship.label) continue;\n const coords = extractLineCoords(edge.path);\n if (!coords) continue;\n\n const mx = (coords.x1 + coords.x2) / 2;\n const my = (coords.y1 + coords.y2) / 2;\n\n elements.push(\n group({ class: \"schematex-ecomap-conn-label-group\" }, [\n el(\"rect\", {\n x: mx - 40,\n y: my - 8,\n width: 80,\n height: 16,\n rx: 3,\n fill: t.bg,\n \"fill-opacity\": \"0.85\",\n }),\n text(\n { x: mx, y: my + 4, class: \"schematex-ecomap-eco-conn-label\" },\n edge.relationship.label\n ),\n ])\n );\n }\n\n return group({ class: \"schematex-ecomap-connection-labels\" }, elements);\n}\n\n// ─── Line type helpers ─────────────────────────────────────\n\ninterface LineCoords {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nfunction extractLineCoords(pathData: string): LineCoords | null {\n const m = pathData.match(\n /M\\s*([\\d.-]+)\\s+([\\d.-]+)\\s*L\\s*([\\d.-]+)\\s+([\\d.-]+)/\n );\n if (!m) return null;\n return { x1: +m[1], y1: +m[2], x2: +m[3], y2: +m[4] };\n}\n\nfunction parallelLines(\n coords: LineCoords,\n count: number,\n gap: number,\n attrs: Record<string, string | number | undefined>\n): string[] {\n const { x1, y1, x2, y2 } = coords;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 1) return [];\n\n const nx = -dy / len;\n const ny = dx / len;\n\n const lines: string[] = [];\n const offsets =\n count === 2\n ? [-gap / 2, gap / 2]\n : count === 3\n ? [-gap, 0, gap]\n : [0];\n\n for (const off of offsets) {\n lines.push(\n el(\"line\", {\n x1: x1 + nx * off,\n y1: y1 + ny * off,\n x2: x2 + nx * off,\n y2: y2 + ny * off,\n ...attrs,\n })\n );\n }\n\n return lines;\n}\n\nfunction wavyPath(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n amplitude: number,\n wavelength: number\n): string {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n const segments = Math.max(4, Math.round(len / wavelength));\n\n const ux = dx / len;\n const uy = dy / len;\n const nx = -uy;\n const ny = ux;\n\n let d = `M ${x1} ${y1}`;\n for (let i = 0; i < segments; i++) {\n const t1 = (i + 0.5) / segments;\n const t2 = (i + 1) / segments;\n const sign = i % 2 === 0 ? 1 : -1;\n const cpx = x1 + dx * t1 + nx * amplitude * sign;\n const cpy = y1 + dy * t1 + ny * amplitude * sign;\n const ex = x1 + dx * t2;\n const ey = y1 + dy * t2;\n d += ` Q ${cpx} ${cpy} ${ex} ${ey}`;\n }\n\n return d;\n}\n\nfunction conflictMarks(coords: LineCoords): string[] {\n const mx = (coords.x1 + coords.x2) / 2;\n const my = (coords.y1 + coords.y2) / 2;\n const dx = coords.x2 - coords.x1;\n const dy = coords.y2 - coords.y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 1) return [];\n\n const nx = -dy / len;\n const ny = dx / len;\n const markLen = 6;\n\n return [\n el(\"line\", {\n x1: mx - 3 + nx * markLen,\n y1: my - 3 + ny * markLen,\n x2: mx - 3 - nx * markLen,\n y2: my - 3 - ny * markLen,\n class: \"schematex-ecomap-eco-line\",\n \"stroke-width\": \"2\",\n }),\n el(\"line\", {\n x1: mx + 3 + nx * markLen,\n y1: my + 3 + ny * markLen,\n x2: mx + 3 - nx * markLen,\n y2: my + 3 - ny * markLen,\n class: \"schematex-ecomap-eco-line\",\n \"stroke-width\": \"2\",\n }),\n ];\n}\n\nfunction getArrowAttrs(\n flow?: \"from\" | \"to\" | \"mutual\" | \"none\"\n): Record<string, string> {\n if (!flow || flow === \"none\") return {};\n switch (flow) {\n case \"from\":\n return { \"marker-end\": \"url(#schematex-ecomap-eco-arrow)\" };\n case \"to\":\n return { \"marker-start\": \"url(#schematex-ecomap-eco-arrow)\" };\n case \"mutual\":\n return {\n \"marker-start\": \"url(#schematex-ecomap-eco-arrow)\",\n \"marker-end\": \"url(#schematex-ecomap-eco-arrow)\",\n };\n default:\n return {};\n }\n}\n\n// ─── Text helpers ──────────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction wrapLabel(label: string, maxChars: number): string[] {\n if (label.length <= maxChars) return [label];\n const words = label.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n if (current && current.length + word.length + 1 > maxChars) {\n lines.push(current);\n current = word;\n } else {\n current = current ? current + \" \" + word : word;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseEcomap } from \"./parser\";\nimport { layoutEcomap } from \"./layout\";\nimport { renderEcomap } from \"./renderer\";\n\nexport { parseEcomap, EcomapParseError } from \"./parser\";\nexport { layoutEcomap } from \"./layout\";\nexport { renderEcomap } from \"./renderer\";\n\nexport const ecomap: DiagramPlugin = {\n type: \"ecomap\",\n\n detect(text: string): boolean {\n const firstLine = firstContentLine(text)?.toLowerCase() ?? \"\";\n return (\n firstLine === \"ecomap\" ||\n firstLine.startsWith(\"ecomap \") ||\n firstLine.startsWith(\"ecomap:\")\n );\n },\n\n parse: parseEcomap,\n\n render(text: string, config?: RenderConfig): string {\n const ast = parseEcomap(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutEcomap(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 renderEcomap(layout, renderConfig, ast);\n },\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/diagrams/ecomap/parser.ts","../src/diagrams/ecomap/layout.ts","../src/diagrams/ecomap/legend.ts","../src/diagrams/ecomap/renderer.ts","../src/diagrams/ecomap/index.ts"],"names":["text","CATEGORY_COLORS"],"mappings":"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","file":"chunk-K2D6VFLP.js","sourcesContent":["import type {\n DiagramAST,\n Individual,\n LegendOverrides,\n Relationship,\n RelationshipType,\n Sex,\n} from \"../../core/types\";\nimport { parseLegendDirective } from \"../../core/legend-parser\";\n\n// ─── Error ─────────────────────────────────────────────────\n\nexport class EcomapParseError extends Error {\n constructor(message: string, public line: number) {\n super(`Line ${line}: ${message}`);\n this.name = \"EcomapParseError\";\n }\n}\n\n// ─── Connection operator table ─────────────────────────────\n\ninterface ConnectionOpInfo {\n relType: RelationshipType;\n energyFlow?: \"from\" | \"to\" | \"mutual\";\n}\n\nconst CONNECTION_OPS: Record<string, ConnectionOpInfo> = {\n \"===\": { relType: \"strong\" },\n \"==\": { relType: \"moderate\" },\n \"---\": { relType: \"normal\" },\n \"- -\": { relType: \"weak\" },\n \"~~~\": { relType: \"stressful\" },\n \"~=~\": { relType: \"stressful-strong\" },\n \"~x~\": { relType: \"conflictual\" },\n \"-/-\": { relType: \"broken\" },\n \"===>\": { relType: \"strong\", energyFlow: \"from\" },\n \"<===\": { relType: \"strong\", energyFlow: \"to\" },\n \"<=>\": { relType: \"moderate\", energyFlow: \"mutual\" },\n \"==>\": { relType: \"moderate\", energyFlow: \"from\" },\n \"<==\": { relType: \"moderate\", energyFlow: \"to\" },\n \"-->\": { relType: \"normal\", energyFlow: \"from\" },\n \"<--\": { relType: \"normal\", energyFlow: \"to\" },\n \"<->\": { relType: \"normal\", energyFlow: \"mutual\" },\n};\n\nconst OP_PATTERN =\n \"===>|<===|===|<=>|==>|<==|<->|-->|<--|~=~|~x~|~~~|-\\\\/-|---|==|- -\";\nconst CONNECTION_RE = new RegExp(\n `^([a-zA-Z][a-zA-Z0-9_-]*)\\\\s+(${OP_PATTERN})\\\\s+([a-zA-Z][a-zA-Z0-9_-]*)(.*)$`\n);\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function parseEcomap(text: string): DiagramAST {\n const lines = text.split(\"\\n\");\n const individuals: Individual[] = [];\n const knownIds = new Set<string>();\n const relationships: Relationship[] = [];\n const metadata: Record<string, string> = {};\n const legendOverrides: LegendOverrides = {};\n let hasLegendOverrides = false;\n let centerId: string | null = null;\n\n let i = 0;\n\n while (\n i < lines.length &&\n (lines[i].trim() === \"\" ||\n lines[i].trim().startsWith(\"#\") ||\n lines[i].trim().startsWith(\"//\") ||\n lines[i].trim().startsWith(\"%%\"))\n ) {\n i++;\n }\n if (i >= lines.length) throw new EcomapParseError(\"Empty input\", 1);\n\n const header = lines[i].trim();\n // Mermaid-style header tolerance: `ecomap`, `ecomap \"Title\"`,\n // `ecomap:mode`, `ecomap:mode \"Title\"`. The `:mode` is captured as\n // metadata for future use; current renderer ignores it.\n const headerMatch = header.match(\n /^ecomap(?::([a-zA-Z][\\w-]*))?\\s*(?:\"([^\"]*)\")?\\s*$/i\n );\n if (!headerMatch)\n throw new EcomapParseError(\n `Expected 'ecomap' header (got '${header}')`,\n i + 1\n );\n if (headerMatch[1]) metadata.mode = headerMatch[1].toLowerCase();\n if (headerMatch[2]) metadata.title = headerMatch[2];\n i++;\n\n while (i < lines.length) {\n const raw = lines[i];\n const trimmed = raw.trim();\n if (\n trimmed === \"\" ||\n trimmed.startsWith(\"#\") ||\n trimmed.startsWith(\"//\") ||\n trimmed.startsWith(\"%%\")\n ) {\n i++;\n continue;\n }\n\n // Legend directives: legend.title, legend.position, legend.label, etc.\n if (parseLegendDirective(trimmed, legendOverrides)) {\n hasLegendOverrides = true;\n i++;\n continue;\n }\n\n // Center definition\n const centerMatch = trimmed.match(\n /^center:\\s*([a-zA-Z][a-zA-Z0-9_-]*)\\s*(\\[.*\\])?\\s*$/\n );\n if (centerMatch) {\n const id = centerMatch[1].toLowerCase();\n centerId = id;\n const props = centerMatch[2] ? parseProps(centerMatch[2]) : {};\n individuals.push(buildIndividual(id, props, true));\n knownIds.add(id);\n i++;\n // Skip indented family content under center\n const baseIndent = leadingSpaces(raw);\n while (i < lines.length) {\n if (lines[i].trim() === \"\") {\n i++;\n continue;\n }\n if (leadingSpaces(lines[i]) > baseIndent + 2) {\n i++;\n } else {\n break;\n }\n }\n continue;\n }\n\n // Connection\n const connMatch = trimmed.match(CONNECTION_RE);\n if (connMatch) {\n const fromRaw = connMatch[1].toLowerCase();\n const op = connMatch[2];\n const toRaw = connMatch[3].toLowerCase();\n const rest = connMatch[4]?.trim() ?? \"\";\n\n const opInfo = CONNECTION_OPS[op];\n if (!opInfo)\n throw new EcomapParseError(`Unknown operator '${op}'`, i + 1);\n\n let label: string | undefined;\n const lblMatch = rest.match(/\\[\\s*label:\\s*\"([^\"]*)\"\\s*\\]/);\n if (lblMatch) label = lblMatch[1];\n\n let from = fromRaw;\n let to = toRaw;\n let flow = opInfo.energyFlow;\n\n if (to === centerId && from !== centerId) {\n [from, to] = [to, from];\n if (flow === \"from\") flow = \"to\";\n else if (flow === \"to\") flow = \"from\";\n }\n\n relationships.push({\n type: opInfo.relType,\n from,\n to,\n label,\n energyFlow: flow,\n });\n i++;\n continue;\n }\n\n // System definition\n const sysMatch = trimmed.match(\n /^([a-zA-Z][a-zA-Z0-9_-]*)\\s*(\\[.*\\])?\\s*$/\n );\n if (sysMatch) {\n const id = sysMatch[1].toLowerCase();\n if (!knownIds.has(id)) {\n const props = sysMatch[2] ? parseProps(sysMatch[2]) : {};\n individuals.push(buildIndividual(id, props, false));\n knownIds.add(id);\n }\n i++;\n continue;\n }\n\n throw new EcomapParseError(`Unexpected: ${trimmed}`, i + 1);\n }\n\n return {\n type: \"ecomap\",\n individuals,\n relationships,\n metadata,\n legendOverrides: hasLegendOverrides ? legendOverrides : undefined,\n };\n}\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction leadingSpaces(line: string): number {\n const m = line.match(/^(\\s*)/);\n return m ? m[1].length : 0;\n}\n\nfunction parseProps(bracketStr: string): Record<string, string> {\n const inner = bracketStr.slice(1, -1).trim();\n if (!inner) return {};\n const props: Record<string, string> = {};\n\n for (const part of splitCommas(inner)) {\n const t = part.trim();\n if (!t) continue;\n\n const kv = t.match(/^([\\w][\\w-]*)\\s*:\\s*(?:\"([^\"]*)\"|(\\S+))$/);\n if (kv) {\n props[kv[1]] = kv[2] ?? kv[3];\n continue;\n }\n\n if (t === \"male\" || t === \"female\" || t === \"unknown\") {\n props.sex = t;\n continue;\n }\n\n props[t] = \"true\";\n }\n return props;\n}\n\nfunction splitCommas(s: string): string[] {\n const parts: string[] = [];\n let cur = \"\";\n let inQ = false;\n for (const ch of s) {\n if (ch === '\"') {\n inQ = !inQ;\n cur += ch;\n } else if (ch === \",\" && !inQ) {\n parts.push(cur);\n cur = \"\";\n } else {\n cur += ch;\n }\n }\n if (cur) parts.push(cur);\n return parts;\n}\n\nfunction parseSex(s?: string): Sex {\n switch (s) {\n case \"male\":\n case \"female\":\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return s;\n default:\n return \"unknown\";\n }\n}\n\nfunction buildIndividual(\n id: string,\n props: Record<string, string>,\n isCenter: boolean\n): Individual {\n const properties: Record<string, string> = {};\n if (isCenter) properties.center = \"true\";\n if (props.category) properties.category = props.category;\n if (props.size) properties.size = props.size;\n if (props.importance) properties.importance = props.importance;\n if (props.sector) properties.sector = props.sector;\n\n return {\n id,\n label: props.label ?? id,\n sex: parseSex(props.sex),\n status: \"alive\",\n age: props.age ? parseInt(props.age, 10) : undefined,\n properties,\n };\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Constants ─────────────────────────────────────────────\n\nconst CENTER_R = 50;\nconst SYS_R = 30;\nconst SYS_R_LARGE = 40;\nconst SYS_R_SMALL = 20;\nconst PADDING = 40;\nconst LABEL_CLEARANCE = 60;\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function layoutEcomap(\n ast: DiagramAST,\n _config: LayoutConfig\n): LayoutResult {\n const center = ast.individuals.find(\n (ind) => ind.properties?.center === \"true\"\n );\n if (!center) throw new Error(\"Ecomap requires a center element\");\n\n const systems = ast.individuals.filter(\n (ind) => ind.properties?.center !== \"true\"\n );\n const n = systems.length;\n\n if (n === 0) {\n const size = (CENTER_R + PADDING + LABEL_CLEARANCE) * 2;\n return {\n width: size,\n height: size,\n nodes: [\n {\n id: center.id,\n x: size / 2 - CENTER_R,\n y: size / 2 - CENTER_R,\n width: CENTER_R * 2,\n height: CENTER_R * 2,\n generation: 0,\n individual: center,\n },\n ],\n edges: [],\n };\n }\n\n const ringRadii = getRingRadii(n);\n const ringAssignment = assignToRings(\n center.id,\n systems,\n ast.relationships,\n ringRadii.length\n );\n const systemPositions = placeOnRings(systems, ringAssignment, ringRadii);\n\n const maxRing = ringRadii[ringRadii.length - 1] ?? 180;\n const canvasSize = (maxRing + SYS_R_LARGE + LABEL_CLEARANCE + PADDING) * 2;\n const cx = canvasSize / 2;\n const cy = canvasSize / 2;\n\n const nodes: LayoutNode[] = [];\n\n nodes.push({\n id: center.id,\n x: cx - CENTER_R,\n y: cy - CENTER_R,\n width: CENTER_R * 2,\n height: CENTER_R * 2,\n generation: 0,\n individual: center,\n });\n\n for (const sys of systems) {\n const pos = systemPositions.get(sys.id);\n if (!pos) continue;\n const r = getSystemRadius(sys);\n nodes.push({\n id: sys.id,\n x: cx + pos.x - r,\n y: cy + pos.y - r,\n width: r * 2,\n height: r * 2,\n generation: pos.ring + 1,\n individual: sys,\n });\n }\n\n const edges = computeEdges(nodes, ast.relationships);\n\n return { width: canvasSize, height: canvasSize, nodes, edges };\n}\n\n// ─── Ring configuration ────────────────────────────────────\n\nfunction getRingRadii(n: number): number[] {\n if (n === 0) return [];\n if (n <= 6) return [180];\n if (n <= 12) return [150, 270];\n return [140, 230, 320];\n}\n\nfunction assignToRings(\n _centerId: string,\n systems: Individual[],\n rels: Relationship[],\n ringCount: number\n): Map<string, number> {\n const relBySys = new Map<string, Relationship>();\n for (const r of rels) {\n const sysId =\n r.from === _centerId ? r.to : r.from === _centerId ? r.to : r.to;\n if (!relBySys.has(sysId)) relBySys.set(sysId, r);\n const otherId = r.from === _centerId ? r.to : r.from;\n if (!relBySys.has(otherId)) relBySys.set(otherId, r);\n }\n\n const result = new Map<string, number>();\n\n if (ringCount <= 1) {\n for (const s of systems) result.set(s.id, 0);\n return result;\n }\n\n for (const s of systems) {\n const rel = relBySys.get(s.id);\n if (!rel) {\n result.set(s.id, ringCount - 1);\n continue;\n }\n\n if (rel.type === \"strong\" || rel.type === \"stressful-strong\") {\n result.set(s.id, 0);\n } else if (rel.type === \"weak\" || rel.type === \"broken\") {\n result.set(s.id, ringCount - 1);\n } else {\n result.set(s.id, Math.min(1, ringCount - 1));\n }\n }\n\n return result;\n}\n\n// ─── Placement ─────────────────────────────────────────────\n\ninterface SysPos {\n x: number;\n y: number;\n ring: number;\n}\n\nfunction placeOnRings(\n systems: Individual[],\n ringAssignment: Map<string, number>,\n ringRadii: number[]\n): Map<string, SysPos> {\n const ringGroups = new Map<number, Individual[]>();\n for (const s of systems) {\n const ring = ringAssignment.get(s.id) ?? 0;\n const grp = ringGroups.get(ring) ?? [];\n grp.push(s);\n ringGroups.set(ring, grp);\n }\n\n const positions = new Map<string, SysPos>();\n\n for (const [ring, grp] of ringGroups) {\n const radius = ringRadii[ring] ?? ringRadii[ringRadii.length - 1] ?? 180;\n const n = grp.length;\n const startAngle = -Math.PI / 2;\n\n for (let idx = 0; idx < n; idx++) {\n const angle = startAngle + (2 * Math.PI * idx) / n;\n positions.set(grp[idx].id, {\n x: radius * Math.cos(angle),\n y: radius * Math.sin(angle),\n ring,\n });\n }\n }\n\n return positions;\n}\n\n// ─── Edges ─────────────────────────────────────────────────\n\nfunction computeEdges(\n nodes: LayoutNode[],\n rels: Relationship[]\n): LayoutEdge[] {\n const nodeMap = new Map<string, LayoutNode>();\n for (const n of nodes) nodeMap.set(n.id, n);\n\n const edges: LayoutEdge[] = [];\n\n for (const rel of rels) {\n const fromNode = nodeMap.get(rel.from);\n const toNode = nodeMap.get(rel.to);\n if (!fromNode || !toNode) continue;\n\n const fcx = fromNode.x + fromNode.width / 2;\n const fcy = fromNode.y + fromNode.height / 2;\n const tcx = toNode.x + toNode.width / 2;\n const tcy = toNode.y + toNode.height / 2;\n\n const dx = tcx - fcx;\n const dy = tcy - fcy;\n const dist = Math.sqrt(dx * dx + dy * dy);\n if (dist < 1) continue;\n\n const ux = dx / dist;\n const uy = dy / dist;\n const fromR = fromNode.width / 2;\n const toR = toNode.width / 2;\n\n const x1 = fcx + ux * fromR;\n const y1 = fcy + uy * fromR;\n const x2 = tcx - ux * toR;\n const y2 = tcy - uy * toR;\n\n edges.push({\n from: rel.from,\n to: rel.to,\n relationship: rel,\n path: `M ${x1} ${y1} L ${x2} ${y2}`,\n });\n }\n\n return edges;\n}\n\n// ─── Helpers ───────────────────────────────────────────────\n\nfunction getSystemRadius(ind: Individual): number {\n const imp = ind.properties?.importance ?? ind.properties?.size;\n switch (imp) {\n case \"major\":\n case \"large\":\n return SYS_R_LARGE;\n case \"minor\":\n case \"small\":\n return SYS_R_SMALL;\n default:\n return SYS_R;\n }\n}\n","/**\n * Auto-derive a LegendSpec from an ecomap AST.\n *\n * Two sections, each emitted only when the diagram uses something non-trivial:\n * 1. Systems — color swatch per used `category` (Hartman palette)\n * 2. Ties — line style per used relationship type (strong/moderate/\n * weak/stressful/conflictual/broken). The default plain\n * line tie is treated as \"obvious\" and not listed.\n */\n\nimport type {\n DiagramAST,\n LegendItem,\n LegendSection,\n LegendSpec,\n RelationshipType,\n} from \"../../core/types\";\n\n// Mirrors the palette in renderer.ts. Kept colocated so the legend swatch\n// matches whatever the renderer paints.\nconst CATEGORY_COLORS: Record<string, string> = {\n family: \"#8D6E63\",\n friends: \"#42A5F5\",\n work: \"#66BB6A\",\n education: \"#FFA726\",\n health: \"#EF5350\",\n \"mental-health\": \"#AB47BC\",\n religion: \"#CCBB33\",\n recreation: \"#26C6DA\",\n legal: \"#78909C\",\n government: \"#8D6E63\",\n financial: \"#66BB6A\",\n community: \"#29B6F6\",\n cultural: \"#FFA726\",\n substance: \"#EF5350\",\n technology: \"#42A5F5\",\n pet: \"#8D6E63\",\n};\n\nconst ECOMAP_TIE_TYPES: ReadonlySet<RelationshipType> = new Set<RelationshipType>([\n \"strong\",\n \"moderate\",\n \"weak\",\n \"stressful\",\n \"stressful-strong\",\n \"conflictual\",\n \"broken\",\n]);\n\nconst SECTIONS: LegendSection[] = [\n { id: \"systems\", title: \"Systems\" },\n { id: \"ties\", title: \"Ties\" },\n];\n\nexport function buildEcomapLegend(ast: DiagramAST): LegendSpec {\n const items: LegendItem[] = [];\n\n // Systems — only categories actually present (excluding the center node).\n const usedCats = new Set<string>();\n for (const ind of ast.individuals) {\n if (ind.properties?.center === \"true\") continue;\n const cat = ind.properties?.category;\n if (cat) usedCats.add(cat);\n }\n // Stable ordering: sort alphabetically.\n const orderedCats = Array.from(usedCats).sort();\n for (const cat of orderedCats) {\n items.push({\n key: `cat.${cat}`,\n label: humanize(cat),\n kind: \"fill\",\n color: CATEGORY_COLORS[cat] ?? \"#9ca3af\",\n section: \"systems\",\n });\n }\n\n // Ties — only types used.\n const usedTies = new Set<RelationshipType>();\n for (const r of ast.relationships) {\n if (ECOMAP_TIE_TYPES.has(r.type)) usedTies.add(r.type);\n }\n const tieOrder: RelationshipType[] = [\n \"strong\",\n \"moderate\",\n \"weak\",\n \"stressful\",\n \"stressful-strong\",\n \"conflictual\",\n \"broken\",\n ];\n for (const t of tieOrder) {\n if (!usedTies.has(t)) continue;\n items.push(tieItem(t));\n }\n\n return {\n mode: \"auto\",\n title: \"Legend\",\n position: \"bottom-inline\",\n columns: 1,\n sections: SECTIONS,\n items,\n };\n}\n\nfunction tieItem(t: RelationshipType): LegendItem {\n const base: LegendItem = {\n key: t,\n label: humanize(t),\n kind: \"line\",\n section: \"ties\",\n pattern: \"solid\",\n };\n switch (t) {\n case \"strong\":\n // Three parallel lines visualised — represented in legend as a thicker solid bar.\n return { ...base, strokeWidth: 4 };\n case \"moderate\":\n return { ...base, strokeWidth: 3 };\n case \"weak\":\n return { ...base, pattern: \"dashed\", strokeWidth: 1.5 };\n case \"stressful\":\n return { ...base, pattern: \"wavy\", strokeWidth: 2 };\n case \"stressful-strong\":\n return { ...base, pattern: \"wavy\", strokeWidth: 3 };\n case \"conflictual\":\n return { ...base, kind: \"edge\", pattern: \"wavy\", marker: \"X\", strokeWidth: 2 };\n case \"broken\":\n return { ...base, pattern: \"broken\" };\n default:\n return base;\n }\n}\n\nfunction humanize(s: string): string {\n return s\n .replace(/[-_]+/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n","import type {\n DiagramAST,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n RenderConfig,\n} from \"../../core/types\";\nimport { svgRoot, el, group, text, title, desc } from \"../../core/svg\";\nimport { cssCustomProperties, resolveBaseTheme, STROKE_WIDTH, type BaseTheme } from \"../../core/theme\";\nimport { applyLegendOverrides, renderLegend } from \"../../core/legend\";\nimport { buildEcomapLegend } from \"./legend\";\n\n// ─── Category colors (Hartman standard) ────────────────────\n\nconst CATEGORY_COLORS: Record<string, string> = {\n family: \"#8D6E63\",\n friends: \"#42A5F5\",\n work: \"#66BB6A\",\n education: \"#FFA726\",\n health: \"#EF5350\",\n \"mental-health\": \"#AB47BC\",\n religion: \"#CCBB33\",\n recreation: \"#26C6DA\",\n legal: \"#78909C\",\n government: \"#8D6E63\",\n financial: \"#66BB6A\",\n community: \"#29B6F6\",\n cultural: \"#FFA726\",\n substance: \"#EF5350\",\n technology: \"#42A5F5\",\n pet: \"#8D6E63\",\n};\n\n// ─── Public API ────────────────────────────────────────────\n\nexport function renderEcomap(\n layout: LayoutResult,\n config: RenderConfig,\n ast?: DiagramAST\n): string {\n const centerNode = layout.nodes.find(\n (n) => n.individual.properties?.center === \"true\"\n );\n const systemNodes = layout.nodes.filter(\n (n) => n.individual.properties?.center !== \"true\"\n );\n\n const t = resolveBaseTheme(config.theme);\n const defsStr = buildDefs(t);\n const styleStr = buildStyles(config, t);\n const connectionsStr = renderConnections(layout.edges, centerNode?.individual.id);\n const centerStr = centerNode ? renderCenter(centerNode, config) : \"\";\n const systemsStr = renderSystems(systemNodes, config);\n const labelsStr = renderConnectionLabels(layout.edges, t);\n\n const layers: string[] = [\n title(\"Ecomap\"),\n desc(`Ecomap diagram with ${systemNodes.length} external systems`),\n defsStr,\n styleStr,\n ];\n\n // Defer pushing chart-content until we know whether the legend widens the\n // viewBox so we can horizontally center the chart.\n const chartContent = [\n connectionsStr,\n centerStr,\n systemsStr,\n labelsStr,\n ];\n\n let finalWidth = layout.width;\n let finalHeight = layout.height;\n let legendSvg = \"\";\n\n if (ast) {\n const autoSpec = buildEcomapLegend(ast);\n const finalSpec = applyLegendOverrides(autoSpec, ast.legendOverrides);\n if (finalSpec.mode === \"on\" && finalSpec.items.length > 0) {\n const { svg, bbox: lb } = renderLegend(\n finalSpec,\n {\n canvasWidth: layout.width,\n canvasHeight: layout.height,\n padding: 16,\n },\n t,\n { fontFamily: config.fontFamily, fontSize: config.fontSize }\n );\n if (svg) {\n legendSvg = svg;\n const overflowX = lb.x + lb.w + 8;\n const overflowY = lb.y + lb.h + 8;\n if (overflowX > finalWidth) finalWidth = overflowX;\n if (overflowY > finalHeight) finalHeight = overflowY;\n }\n }\n }\n\n const chartXOffset = Math.max(0, (finalWidth - layout.width) / 2);\n layers.push(\n group(\n { transform: chartXOffset > 0 ? `translate(${chartXOffset}, 0)` : undefined },\n chartContent\n )\n );\n if (legendSvg) layers.push(legendSvg);\n\n return svgRoot(\n {\n viewBox: `0 0 ${finalWidth} ${finalHeight}`,\n class: \"schematex-diagram schematex-ecomap\",\n width: finalWidth,\n height: finalHeight,\n },\n layers\n );\n}\n\n// ─── Defs ──────────────────────────────────────────────────\n\nfunction buildDefs(t: BaseTheme): string {\n const arrowMarker = el(\n \"marker\",\n {\n id: \"schematex-ecomap-eco-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"10\",\n refY: \"5\",\n markerWidth: \"8\",\n markerHeight: \"8\",\n orient: \"auto-start-reverse\",\n },\n [el(\"path\", { d: \"M 0 0 L 10 5 L 0 10 z\", fill: t.neutral })]\n );\n\n return el(\"defs\", {}, [arrowMarker]);\n}\n\n// ─── Styles ────────────────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig, t: BaseTheme): string {\n let css = `\n.schematex-ecomap {${cssCustomProperties(t)}\n}\n.schematex-ecomap-center-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.thick}; }\n.schematex-ecomap-center-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize + 2}px; text-anchor: middle; dominant-baseline: central; fill: ${t.text}; font-weight: 600; }\n.schematex-ecomap-system-shape { fill: ${t.fillMuted}; stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-ecomap-system-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 1}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-ecomap-eco-line { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-parallel { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-weak { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 6,4; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-broken { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; stroke-dasharray: 3,8; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-line-stressful { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }\n.schematex-ecomap-eco-conn-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 2}px; text-anchor: middle; fill: ${t.textMuted}; }\n.schematex-ecomap-eco-arrow { fill: ${t.neutral}; }\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-parallel,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-weak,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-broken,\n.schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-stressful { stroke-opacity: 0.55; }\n`;\n\n for (const [cat, color] of Object.entries(CATEGORY_COLORS)) {\n css += `.schematex-ecomap-system-${cat} .schematex-ecomap-system-shape { fill: ${color}18; stroke: ${color}; }\\n`;\n }\n\n return el(\"style\", {}, css);\n}\n\n// ─── Center ────────────────────────────────────────────────\n\nfunction renderCenter(node: LayoutNode, config: RenderConfig): string {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const r = node.width / 2;\n const ind = node.individual;\n\n const label = ind.label !== ind.id ? ind.label : capitalize(ind.id);\n const elements: string[] = [\n el(\"circle\", {\n cx,\n cy,\n r,\n class: \"schematex-ecomap-center-shape\",\n }),\n text(\n {\n x: cx,\n y: cy,\n class: \"schematex-ecomap-center-label\",\n },\n label\n ),\n ];\n\n if (ind.age) {\n elements.push(\n text(\n {\n x: cx,\n y: cy + config.fontSize + 4,\n class: \"schematex-ecomap-center-label\",\n \"font-size\": `${config.fontSize}px`,\n \"font-weight\": \"normal\",\n },\n `Age ${ind.age}`\n )\n );\n }\n\n return group(\n { class: \"schematex-ecomap-center\", \"data-id\": ind.id },\n elements\n );\n}\n\n// ─── Systems ───────────────────────────────────────────────\n\nfunction renderSystems(\n nodes: LayoutNode[],\n config: RenderConfig\n): string {\n const elements: 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 const r = node.width / 2;\n const ind = node.individual;\n const cat = ind.properties?.category ?? \"other\";\n const label = ind.label !== ind.id ? ind.label : capitalize(ind.id);\n\n const labelLines = wrapLabel(label, 12);\n const labelElements: string[] = [];\n const labelStartY = cy + r + config.fontSize + 2;\n\n for (let li = 0; li < labelLines.length; li++) {\n labelElements.push(\n text(\n {\n x: cx,\n y: labelStartY + li * (config.fontSize + 1),\n class: \"schematex-ecomap-system-label\",\n },\n labelLines[li]\n )\n );\n }\n\n elements.push(\n group(\n {\n class: `schematex-ecomap-system schematex-ecomap-system-${cat}`,\n \"data-system-id\": ind.id,\n },\n [\n el(\"circle\", {\n cx,\n cy,\n r,\n class: \"schematex-ecomap-system-shape\",\n }),\n ...labelElements,\n ]\n )\n );\n }\n\n return group({ class: \"schematex-ecomap-systems\" }, elements);\n}\n\n// ─── Connections ───────────────────────────────────────────\n\nfunction renderConnections(edges: LayoutEdge[], centerId?: string): string {\n const elements: string[] = [];\n\n for (const edge of edges) {\n const coords = extractLineCoords(edge.path);\n if (!coords) continue;\n\n const relType = edge.relationship.type;\n const flow = edge.relationship.energyFlow;\n const lineElements: string[] = [];\n\n const arrowAttrs = getArrowAttrs(flow);\n\n switch (relType) {\n case \"strong\":\n lineElements.push(\n ...parallelLines(coords, 3, 4, {\n class: \"schematex-ecomap-eco-line-parallel\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"moderate\":\n lineElements.push(\n ...parallelLines(coords, 2, 4, {\n class: \"schematex-ecomap-eco-line-parallel\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"weak\":\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line-weak\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"stressful\":\n case \"stressful-strong\":\n lineElements.push(\n el(\"path\", {\n d: wavyPath(\n coords.x1,\n coords.y1,\n coords.x2,\n coords.y2,\n 8,\n 20\n ),\n class: \"schematex-ecomap-eco-line-stressful\",\n \"stroke-width\": relType === \"stressful-strong\" ? \"3\" : \"2\",\n ...arrowAttrs,\n })\n );\n break;\n\n case \"conflictual\":\n lineElements.push(\n el(\"path\", {\n d: wavyPath(\n coords.x1,\n coords.y1,\n coords.x2,\n coords.y2,\n 8,\n 20\n ),\n class: \"schematex-ecomap-eco-line-stressful\",\n ...arrowAttrs,\n })\n );\n lineElements.push(\n ...conflictMarks(coords)\n );\n break;\n\n case \"broken\":\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line-broken\",\n ...arrowAttrs,\n })\n );\n break;\n\n default:\n lineElements.push(\n el(\"line\", {\n x1: coords.x1,\n y1: coords.y1,\n x2: coords.x2,\n y2: coords.y2,\n class: \"schematex-ecomap-eco-line\",\n ...arrowAttrs,\n })\n );\n break;\n }\n\n const isMesosystem =\n centerId !== undefined && edge.from !== centerId && edge.to !== centerId;\n const groupClass = isMesosystem\n ? `schematex-ecomap-connection schematex-ecomap-connection-${relType} schematex-ecomap-connection-mesosystem`\n : `schematex-ecomap-connection schematex-ecomap-connection-${relType}`;\n const groupAttrs: Record<string, string> = {\n class: groupClass,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n };\n if (isMesosystem) groupAttrs[\"data-mesosystem\"] = \"true\";\n\n elements.push(group(groupAttrs, lineElements));\n }\n\n return group({ class: \"schematex-ecomap-connections\" }, elements);\n}\n\n// ─── Connection labels ─────────────────────────────────────\n\nfunction renderConnectionLabels(edges: LayoutEdge[], t: BaseTheme): string {\n const elements: string[] = [];\n\n for (const edge of edges) {\n if (!edge.relationship.label) continue;\n const coords = extractLineCoords(edge.path);\n if (!coords) continue;\n\n const mx = (coords.x1 + coords.x2) / 2;\n const my = (coords.y1 + coords.y2) / 2;\n\n elements.push(\n group({ class: \"schematex-ecomap-conn-label-group\" }, [\n el(\"rect\", {\n x: mx - 40,\n y: my - 8,\n width: 80,\n height: 16,\n rx: 3,\n fill: t.bg,\n \"fill-opacity\": \"0.85\",\n }),\n text(\n { x: mx, y: my + 4, class: \"schematex-ecomap-eco-conn-label\" },\n edge.relationship.label\n ),\n ])\n );\n }\n\n return group({ class: \"schematex-ecomap-connection-labels\" }, elements);\n}\n\n// ─── Line type helpers ─────────────────────────────────────\n\ninterface LineCoords {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n}\n\nfunction extractLineCoords(pathData: string): LineCoords | null {\n const m = pathData.match(\n /M\\s*([\\d.-]+)\\s+([\\d.-]+)\\s*L\\s*([\\d.-]+)\\s+([\\d.-]+)/\n );\n if (!m) return null;\n return { x1: +m[1], y1: +m[2], x2: +m[3], y2: +m[4] };\n}\n\nfunction parallelLines(\n coords: LineCoords,\n count: number,\n gap: number,\n attrs: Record<string, string | number | undefined>\n): string[] {\n const { x1, y1, x2, y2 } = coords;\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 1) return [];\n\n const nx = -dy / len;\n const ny = dx / len;\n\n const lines: string[] = [];\n const offsets =\n count === 2\n ? [-gap / 2, gap / 2]\n : count === 3\n ? [-gap, 0, gap]\n : [0];\n\n for (const off of offsets) {\n lines.push(\n el(\"line\", {\n x1: x1 + nx * off,\n y1: y1 + ny * off,\n x2: x2 + nx * off,\n y2: y2 + ny * off,\n ...attrs,\n })\n );\n }\n\n return lines;\n}\n\nfunction wavyPath(\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n amplitude: number,\n wavelength: number\n): string {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n const segments = Math.max(4, Math.round(len / wavelength));\n\n const ux = dx / len;\n const uy = dy / len;\n const nx = -uy;\n const ny = ux;\n\n let d = `M ${x1} ${y1}`;\n for (let i = 0; i < segments; i++) {\n const t1 = (i + 0.5) / segments;\n const t2 = (i + 1) / segments;\n const sign = i % 2 === 0 ? 1 : -1;\n const cpx = x1 + dx * t1 + nx * amplitude * sign;\n const cpy = y1 + dy * t1 + ny * amplitude * sign;\n const ex = x1 + dx * t2;\n const ey = y1 + dy * t2;\n d += ` Q ${cpx} ${cpy} ${ex} ${ey}`;\n }\n\n return d;\n}\n\nfunction conflictMarks(coords: LineCoords): string[] {\n const mx = (coords.x1 + coords.x2) / 2;\n const my = (coords.y1 + coords.y2) / 2;\n const dx = coords.x2 - coords.x1;\n const dy = coords.y2 - coords.y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n if (len < 1) return [];\n\n const nx = -dy / len;\n const ny = dx / len;\n const markLen = 6;\n\n return [\n el(\"line\", {\n x1: mx - 3 + nx * markLen,\n y1: my - 3 + ny * markLen,\n x2: mx - 3 - nx * markLen,\n y2: my - 3 - ny * markLen,\n class: \"schematex-ecomap-eco-line\",\n \"stroke-width\": \"2\",\n }),\n el(\"line\", {\n x1: mx + 3 + nx * markLen,\n y1: my + 3 + ny * markLen,\n x2: mx + 3 - nx * markLen,\n y2: my + 3 - ny * markLen,\n class: \"schematex-ecomap-eco-line\",\n \"stroke-width\": \"2\",\n }),\n ];\n}\n\nfunction getArrowAttrs(\n flow?: \"from\" | \"to\" | \"mutual\" | \"none\"\n): Record<string, string> {\n if (!flow || flow === \"none\") return {};\n switch (flow) {\n case \"from\":\n return { \"marker-end\": \"url(#schematex-ecomap-eco-arrow)\" };\n case \"to\":\n return { \"marker-start\": \"url(#schematex-ecomap-eco-arrow)\" };\n case \"mutual\":\n return {\n \"marker-start\": \"url(#schematex-ecomap-eco-arrow)\",\n \"marker-end\": \"url(#schematex-ecomap-eco-arrow)\",\n };\n default:\n return {};\n }\n}\n\n// ─── Text helpers ──────────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction wrapLabel(label: string, maxChars: number): string[] {\n if (label.length <= maxChars) return [label];\n const words = label.split(/\\s+/);\n const lines: string[] = [];\n let current = \"\";\n\n for (const word of words) {\n if (current && current.length + word.length + 1 > maxChars) {\n lines.push(current);\n current = word;\n } else {\n current = current ? current + \" \" + word : word;\n }\n }\n if (current) lines.push(current);\n return lines;\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { firstContentLine } from \"../../core/dsl-preprocess\";\nimport { parseEcomap } from \"./parser\";\nimport { layoutEcomap } from \"./layout\";\nimport { renderEcomap } from \"./renderer\";\n\nexport { parseEcomap, EcomapParseError } from \"./parser\";\nexport { layoutEcomap } from \"./layout\";\nexport { renderEcomap } from \"./renderer\";\n\nexport const ecomap: DiagramPlugin = {\n type: \"ecomap\",\n\n detect(text: string): boolean {\n const firstLine = firstContentLine(text)?.toLowerCase() ?? \"\";\n return (\n firstLine === \"ecomap\" ||\n firstLine.startsWith(\"ecomap \") ||\n firstLine.startsWith(\"ecomap:\")\n );\n },\n\n parse: parseEcomap,\n\n render(text: string, config?: RenderConfig): string {\n const ast = parseEcomap(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutEcomap(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 renderEcomap(layout, renderConfig, ast);\n },\n};\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var chunk3KRL2EGN_cjs = require('./chunk-3KRL2EGN.cjs');
|
|
4
4
|
var chunk5UCXMYE7_cjs = require('./chunk-5UCXMYE7.cjs');
|
|
5
|
-
var
|
|
5
|
+
var chunkNZT5P2XZ_cjs = require('./chunk-NZT5P2XZ.cjs');
|
|
6
6
|
var chunk3WNW5Y7P_cjs = require('./chunk-3WNW5Y7P.cjs');
|
|
7
7
|
|
|
8
8
|
// src/diagrams/pedigree/parser.ts
|
|
@@ -828,7 +828,7 @@ function humanize(s) {
|
|
|
828
828
|
|
|
829
829
|
// src/diagrams/pedigree/renderer.ts
|
|
830
830
|
function renderPedigree(layout, config, ast) {
|
|
831
|
-
const t =
|
|
831
|
+
const t = chunkNZT5P2XZ_cjs.resolvePersonTheme(config.theme);
|
|
832
832
|
const defsStr = buildDefs(layout.nodes, t);
|
|
833
833
|
const styleStr = buildStyles(config, t);
|
|
834
834
|
const genGroups = groupByGeneration(layout.nodes);
|
|
@@ -924,21 +924,21 @@ function buildDefs(nodes, t) {
|
|
|
924
924
|
}
|
|
925
925
|
function buildStyles(config, t) {
|
|
926
926
|
const css = `
|
|
927
|
-
.schematex-pedigree {${
|
|
927
|
+
.schematex-pedigree {${chunkNZT5P2XZ_cjs.cssCustomProperties(t)}
|
|
928
928
|
}
|
|
929
|
-
.schematex-pedigree-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${
|
|
929
|
+
.schematex-pedigree-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; stroke-linejoin: round; }
|
|
930
930
|
.schematex-pedigree-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize}px; text-anchor: middle; fill: ${t.text}; }
|
|
931
931
|
.schematex-pedigree-gen-label { font-family: ${config.fontFamily}; font-size: 14px; font-weight: bold; fill: ${t.text}; text-anchor: middle; }
|
|
932
|
-
.schematex-pedigree-edge { stroke: ${t.stroke}; stroke-width: ${
|
|
933
|
-
.schematex-pedigree-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${
|
|
932
|
+
.schematex-pedigree-edge { stroke: ${t.stroke}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; stroke-linejoin: round; }
|
|
933
|
+
.schematex-pedigree-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; stroke-linecap: round; }
|
|
934
934
|
.schematex-pedigree-affected-fill { fill: ${t.conditionFill}; }
|
|
935
935
|
.schematex-pedigree-carrier-fill { fill: ${t.conditionFill}; }
|
|
936
936
|
.schematex-pedigree-carrier-x-dot { fill: ${t.conditionFill}; }
|
|
937
|
-
.schematex-pedigree-presymptomatic-mark { stroke: ${t.conditionFill}; stroke-width: ${
|
|
938
|
-
.schematex-pedigree-proband-arrow-line { stroke: ${t.stroke}; stroke-width: ${
|
|
937
|
+
.schematex-pedigree-presymptomatic-mark { stroke: ${t.conditionFill}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; }
|
|
938
|
+
.schematex-pedigree-proband-arrow-line { stroke: ${t.stroke}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; fill: none; marker-end: url(#schematex-pedigree-proband-arrow); }
|
|
939
939
|
.schematex-pedigree-proband-label { font-family: ${config.fontFamily}; font-size: 10px; font-weight: bold; fill: ${t.stroke}; }
|
|
940
|
-
.schematex-pedigree-loss-shape { fill: ${t.stroke}; stroke: ${t.stroke}; stroke-width: ${
|
|
941
|
-
.schematex-pedigree-tab-slash { stroke: ${t.deceasedMark}; stroke-width: ${
|
|
940
|
+
.schematex-pedigree-loss-shape { fill: ${t.stroke}; stroke: ${t.stroke}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; stroke-linejoin: round; }
|
|
941
|
+
.schematex-pedigree-tab-slash { stroke: ${t.deceasedMark}; stroke-width: ${chunkNZT5P2XZ_cjs.STROKE_WIDTH.normal}; stroke-linecap: round; }
|
|
942
942
|
.schematex-pedigree-status-label { font-family: ${config.fontFamily}; font-size: 10px; font-weight: bold; fill: ${t.text}; }
|
|
943
943
|
.schematex-pedigree-legend { font-family: ${config.fontFamily}; font-size: 11px; fill: ${t.text}; }
|
|
944
944
|
.schematex-pedigree-legend-box { fill: ${t.fill}; stroke: ${t.neutral}; stroke-width: 1; }
|
|
@@ -1268,5 +1268,5 @@ exports.layoutPedigree = layoutPedigree;
|
|
|
1268
1268
|
exports.parsePedigree = parsePedigree;
|
|
1269
1269
|
exports.pedigree = pedigree;
|
|
1270
1270
|
exports.renderPedigree = renderPedigree;
|
|
1271
|
-
//# sourceMappingURL=chunk-
|
|
1272
|
-
//# sourceMappingURL=chunk-
|
|
1271
|
+
//# sourceMappingURL=chunk-KGOZBABH.cjs.map
|
|
1272
|
+
//# sourceMappingURL=chunk-KGOZBABH.cjs.map
|