schematex 0.2.4 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/README.md +4 -3
  2. package/dist/ai/ai-sdk.cjs +10 -10
  3. package/dist/ai/ai-sdk.d.cts +2 -2
  4. package/dist/ai/ai-sdk.d.ts +2 -2
  5. package/dist/ai/ai-sdk.js +5 -5
  6. package/dist/ai/index.cjs +13 -13
  7. package/dist/ai/index.d.cts +3 -3
  8. package/dist/ai/index.d.ts +3 -3
  9. package/dist/ai/index.js +5 -5
  10. package/dist/{api-bQZ98gkJ.d.cts → api-BuFilDQB.d.cts} +1 -1
  11. package/dist/{api-bQZ98gkJ.d.ts → api-BuFilDQB.d.ts} +1 -1
  12. package/dist/browser.cjs +7 -7
  13. package/dist/browser.d.cts +2 -2
  14. package/dist/browser.d.ts +2 -2
  15. package/dist/browser.js +5 -5
  16. package/dist/{chunk-UAGSCTYI.cjs → chunk-3FKS4KQK.cjs} +22 -6
  17. package/dist/chunk-3FKS4KQK.cjs.map +1 -0
  18. package/dist/{chunk-4S2WILLW.cjs → chunk-K2SOC3XF.cjs} +5 -3
  19. package/dist/chunk-K2SOC3XF.cjs.map +1 -0
  20. package/dist/{chunk-LR4X4ZRG.js → chunk-NB56L5QK.js} +18 -14
  21. package/dist/chunk-NB56L5QK.js.map +1 -0
  22. package/dist/{chunk-VPKCW4PB.js → chunk-NNU4RGT3.js} +2820 -20
  23. package/dist/chunk-NNU4RGT3.js.map +1 -0
  24. package/dist/{chunk-E65ITQXV.cjs → chunk-NZH4GWE6.cjs} +18 -14
  25. package/dist/chunk-NZH4GWE6.cjs.map +1 -0
  26. package/dist/{chunk-DPQYGWCT.cjs → chunk-SQKLKBBK.cjs} +32 -5
  27. package/dist/chunk-SQKLKBBK.cjs.map +1 -0
  28. package/dist/{chunk-J2LVOWVY.js → chunk-TYCHEOQX.js} +22 -6
  29. package/dist/chunk-TYCHEOQX.js.map +1 -0
  30. package/dist/{chunk-MR5HU5WU.js → chunk-VLMK7MQK.js} +30 -3
  31. package/dist/chunk-VLMK7MQK.js.map +1 -0
  32. package/dist/{chunk-MSYBSOU2.cjs → chunk-XTATRNUN.cjs} +2824 -22
  33. package/dist/chunk-XTATRNUN.cjs.map +1 -0
  34. package/dist/{chunk-PGALHQFF.js → chunk-XZNPAD6E.js} +5 -3
  35. package/dist/chunk-XZNPAD6E.js.map +1 -0
  36. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  37. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  38. package/dist/diagrams/circuit/index.cjs +7 -7
  39. package/dist/diagrams/circuit/index.d.cts +1 -1
  40. package/dist/diagrams/circuit/index.d.ts +1 -1
  41. package/dist/diagrams/circuit/index.js +1 -1
  42. package/dist/diagrams/ecomap/index.cjs +6 -6
  43. package/dist/diagrams/ecomap/index.d.cts +1 -1
  44. package/dist/diagrams/ecomap/index.d.ts +1 -1
  45. package/dist/diagrams/ecomap/index.js +1 -1
  46. package/dist/diagrams/entity/index.d.cts +1 -1
  47. package/dist/diagrams/entity/index.d.ts +1 -1
  48. package/dist/diagrams/fishbone/index.d.cts +1 -1
  49. package/dist/diagrams/fishbone/index.d.ts +1 -1
  50. package/dist/diagrams/flowchart/index.cjs +7 -7
  51. package/dist/diagrams/flowchart/index.d.cts +2 -2
  52. package/dist/diagrams/flowchart/index.d.ts +2 -2
  53. package/dist/diagrams/flowchart/index.js +1 -1
  54. package/dist/diagrams/genogram/index.d.cts +1 -1
  55. package/dist/diagrams/genogram/index.d.ts +1 -1
  56. package/dist/diagrams/ladder/index.d.cts +1 -1
  57. package/dist/diagrams/ladder/index.d.ts +1 -1
  58. package/dist/diagrams/logic/index.d.cts +1 -1
  59. package/dist/diagrams/logic/index.d.ts +1 -1
  60. package/dist/diagrams/orgchart/index.d.cts +1 -1
  61. package/dist/diagrams/orgchart/index.d.ts +1 -1
  62. package/dist/diagrams/pedigree/index.d.cts +1 -1
  63. package/dist/diagrams/pedigree/index.d.ts +1 -1
  64. package/dist/diagrams/phylo/index.d.cts +1 -1
  65. package/dist/diagrams/phylo/index.d.ts +1 -1
  66. package/dist/diagrams/sld/index.d.cts +1 -1
  67. package/dist/diagrams/sld/index.d.ts +1 -1
  68. package/dist/diagrams/sociogram/index.d.cts +1 -1
  69. package/dist/diagrams/sociogram/index.d.ts +1 -1
  70. package/dist/diagrams/timing/index.d.cts +1 -1
  71. package/dist/diagrams/timing/index.d.ts +1 -1
  72. package/dist/diagrams/venn/index.d.cts +1 -1
  73. package/dist/diagrams/venn/index.d.ts +1 -1
  74. package/dist/{index-DcU88F9i.d.ts → index-CUwp4GXI.d.ts} +1 -1
  75. package/dist/{index-BTZEka65.d.cts → index-ivhNGsyU.d.cts} +1 -1
  76. package/dist/index.cjs +19 -11
  77. package/dist/index.d.cts +8 -4
  78. package/dist/index.d.ts +8 -4
  79. package/dist/index.js +4 -4
  80. package/dist/react.cjs +5 -5
  81. package/dist/react.d.cts +1 -1
  82. package/dist/react.d.ts +1 -1
  83. package/dist/react.js +4 -4
  84. package/dist/{types-C4LnMEcB.d.cts → types-Bl-Pn7Wj.d.cts} +1 -1
  85. package/dist/{types-C4LnMEcB.d.ts → types-Bl-Pn7Wj.d.ts} +1 -1
  86. package/package.json +2 -2
  87. package/dist/chunk-4S2WILLW.cjs.map +0 -1
  88. package/dist/chunk-DPQYGWCT.cjs.map +0 -1
  89. package/dist/chunk-E65ITQXV.cjs.map +0 -1
  90. package/dist/chunk-J2LVOWVY.js.map +0 -1
  91. package/dist/chunk-LR4X4ZRG.js.map +0 -1
  92. package/dist/chunk-MR5HU5WU.js.map +0 -1
  93. package/dist/chunk-MSYBSOU2.cjs.map +0 -1
  94. package/dist/chunk-PGALHQFF.js.map +0 -1
  95. package/dist/chunk-UAGSCTYI.cjs.map +0 -1
  96. package/dist/chunk-VPKCW4PB.js.map +0 -1
@@ -530,7 +530,7 @@ function renderEcomap(layout, config, ast) {
530
530
  const t = chunkD7EHZFK4_cjs.resolveBaseTheme(config.theme);
531
531
  const defsStr = buildDefs(t);
532
532
  const styleStr = buildStyles(config, t);
533
- const connectionsStr = renderConnections(layout.edges);
533
+ const connectionsStr = renderConnections(layout.edges, centerNode?.individual.id);
534
534
  const centerStr = centerNode ? renderCenter(centerNode, config) : "";
535
535
  const systemsStr = renderSystems(systemNodes, config);
536
536
  const labelsStr = renderConnectionLabels(layout.edges, t);
@@ -622,6 +622,11 @@ function buildStyles(config, t) {
622
622
  .schematex-ecomap-eco-line-stressful { stroke: ${t.neutral}; stroke-width: ${chunkD7EHZFK4_cjs.STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; }
623
623
  .schematex-ecomap-eco-conn-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize - 2}px; text-anchor: middle; fill: ${t.textMuted}; }
624
624
  .schematex-ecomap-eco-arrow { fill: ${t.neutral}; }
625
+ .schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line,
626
+ .schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-parallel,
627
+ .schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-weak,
628
+ .schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-broken,
629
+ .schematex-ecomap-connection-mesosystem .schematex-ecomap-eco-line-stressful { stroke-opacity: 0.55; }
625
630
  `;
626
631
  for (const [cat, color] of Object.entries(CATEGORY_COLORS2)) {
627
632
  css += `.schematex-ecomap-system-${cat} .schematex-ecomap-system-shape { fill: ${color}18; stroke: ${color}; }
@@ -714,7 +719,7 @@ function renderSystems(nodes, config) {
714
719
  }
715
720
  return chunkHDKDQAEQ_cjs.group({ class: "schematex-ecomap-systems" }, elements);
716
721
  }
717
- function renderConnections(edges) {
722
+ function renderConnections(edges, centerId) {
718
723
  const elements = [];
719
724
  for (const edge of edges) {
720
725
  const coords = extractLineCoords(edge.path);
@@ -814,16 +819,15 @@ function renderConnections(edges) {
814
819
  );
815
820
  break;
816
821
  }
817
- elements.push(
818
- chunkHDKDQAEQ_cjs.group(
819
- {
820
- class: `schematex-ecomap-connection schematex-ecomap-connection-${relType}`,
821
- "data-from": edge.from,
822
- "data-to": edge.to
823
- },
824
- lineElements
825
- )
826
- );
822
+ const isMesosystem = centerId !== void 0 && edge.from !== centerId && edge.to !== centerId;
823
+ const groupClass = isMesosystem ? `schematex-ecomap-connection schematex-ecomap-connection-${relType} schematex-ecomap-connection-mesosystem` : `schematex-ecomap-connection schematex-ecomap-connection-${relType}`;
824
+ const groupAttrs = {
825
+ class: groupClass,
826
+ "data-from": edge.from,
827
+ "data-to": edge.to
828
+ };
829
+ if (isMesosystem) groupAttrs["data-mesosystem"] = "true";
830
+ elements.push(chunkHDKDQAEQ_cjs.group(groupAttrs, lineElements));
827
831
  }
828
832
  return chunkHDKDQAEQ_cjs.group({ class: "schematex-ecomap-connections" }, elements);
829
833
  }
@@ -998,5 +1002,5 @@ exports.ecomap = ecomap;
998
1002
  exports.layoutEcomap = layoutEcomap;
999
1003
  exports.parseEcomap = parseEcomap;
1000
1004
  exports.renderEcomap = renderEcomap;
1001
- //# sourceMappingURL=chunk-E65ITQXV.cjs.map
1002
- //# sourceMappingURL=chunk-E65ITQXV.cjs.map
1005
+ //# sourceMappingURL=chunk-NZH4GWE6.cjs.map
1006
+ //# sourceMappingURL=chunk-NZH4GWE6.cjs.map
@@ -0,0 +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","parseLegendDirective","CATEGORY_COLORS","resolveBaseTheme","title","desc","applyLegendOverrides","renderLegend","group","svgRoot","el","cssCustomProperties","STROKE_WIDTH"],"mappings":"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","file":"chunk-NZH4GWE6.cjs","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 (i < lines.length && lines[i].trim() === \"\") i++;\n if (i >= lines.length) throw new EcomapParseError(\"Empty input\", 1);\n\n const header = lines[i].trim();\n const headerMatch = header.match(/^ecomap\\s*(?:\"([^\"]*)\")?$/i);\n if (!headerMatch)\n throw new EcomapParseError(\"Expected 'ecomap' header\", i + 1);\n if (headerMatch[1]) metadata.title = headerMatch[1];\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 ) {\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 background: ${t.bg};\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 { 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 = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"ecomap\" || firstLine.startsWith(\"ecomap \");\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,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkMSYBSOU2_cjs = require('./chunk-MSYBSOU2.cjs');
3
+ var chunkXTATRNUN_cjs = require('./chunk-XTATRNUN.cjs');
4
4
 
5
5
  // src/ai/registry.ts
6
6
  var DIAGRAM_REGISTRY = [
@@ -105,6 +105,15 @@ var DIAGRAM_REGISTRY = [
105
105
  standard: "IEEE Std 315 + ANSI device numbering",
106
106
  syntaxKey: "sld"
107
107
  },
108
+ {
109
+ type: "pid",
110
+ name: "P&ID (Piping & Instrumentation)",
111
+ tagline: "ISA-5.1 process equipment, valves, and instrument bubbles.",
112
+ useWhen: "Use for chemical / petrochemical / pharmaceutical / water-treatment process diagrams \u2014 vessels, columns, heat exchangers, pumps, valves, and instrument loops with ISA tag codes (FT/FIC/PT/etc.). Equipment + piping + instrumentation in one diagram.",
113
+ cluster: "electrical-industrial",
114
+ standard: "ANSI/ISA-5.1-2009 + ISO 10628-1:2014",
115
+ syntaxKey: "pid"
116
+ },
108
117
  // ── Corporate / Legal ────────────────────────────────────────
109
118
  {
110
119
  type: "entity",
@@ -143,6 +152,16 @@ var DIAGRAM_REGISTRY = [
143
152
  standard: "Howard-Raiffa / CART-sklearn / taxonomy",
144
153
  syntaxKey: "decisiontree"
145
154
  },
155
+ // ── Behavior modeling ────────────────────────────────────────
156
+ {
157
+ type: "state",
158
+ name: "State diagram",
159
+ tagline: "UML 2.5 / Harel statechart with composite states and pseudo-states.",
160
+ useWhen: "Use for modeling reactive system behavior \u2014 finite state machines, lifecycle states, controller modes, UI workflows. Supports simple states, composite (nested) states, fork/join, choice, history, and full Mermaid `stateDiagram-v2` syntax.",
161
+ cluster: "behavior-modeling",
162
+ standard: "OMG UML 2.5.1 \xA714 + Harel (1987) statechart",
163
+ syntaxKey: "state"
164
+ },
146
165
  // ── Generic process / flow ───────────────────────────────────
147
166
  {
148
167
  type: "flowchart",
@@ -998,6 +1017,14 @@ var SYNTAX = {
998
1017
  "timeline": {
999
1018
  "title": "Timeline diagram",
1000
1019
  "content": '## 1. Your first timeline\n\nThe smallest useful timeline: a title, two ordinary events, and a milestone.\n\n```\ntimeline "Product Launch"\n2024-06-01: "Development complete"\n2024-08-15: "Closed beta"\n2024-09-01: milestone "Public launch"\n```\n\nFour rules cover 80% of usage:\n\n1. Start with the keyword `timeline`, optionally followed by a quoted title.\n2. Each event is `DATE: "Label"` \u2014 a date, a colon, then a quoted label. A `milestone` keyword before the label marks the event as a milestone.\n3. Date ranges use `DATE - DATE:` or `DATE .. DATE:` (both are equivalent).\n4. Add `[key: value]` properties after the quoted label to set color, side placement, shape, or category.\n\n> Comments must start with `#` or `//` on their own line.\n\n---\n\n## 2. Events\n\nAn event line places a labeled marker at a point in time (or a bar across a span).\n\n### 2.1 Point events\n\n```\n2024-09-15: "Conference keynote"\n```\n\n### 2.2 Range events\n\n```\n2024-06-01 - 2024-08-31: "Q3 development sprint"\n2024-06-01 .. 2024-08-31: "Q3 development sprint"\n```\n\nBoth separators (`-` surrounded by spaces, or `..`) are equivalent.\n\n### 2.3 Milestones\n\n```\n2024-09-01: milestone "Public launch"\n```\n\nThe `milestone` keyword before the quoted label switches the marker to a diamond shape.\n\n### 2.4 Event properties\n\nProperties go in `[key: value, \u2026]` after the quoted label, before the newline.\n\n| Property | Values | Meaning |\n|---|---|---|\n| `color:` | hex string | Custom color for this marker or bar |\n| `side:` | `above` \\| `below` | Force placement above or below the axis (swimlane / lollipop) |\n| `icon:` | any text (e.g. emoji) | Icon displayed with the event |\n| `shape:` | `circle` \\| `square` \\| `diamond` \\| `star` \\| `flag` | Point marker shape |\n| `category:` | quoted string | Group label \u2014 drives color in gantt legend |\n\n```\n2024-09-01: milestone "Launch day" [color: #E53935, side: above]\n2024-07-15: "Beta ships" [icon: \u{1F680}, category: "product"]\n```\n\n```\ntimeline "Engineering Milestones"\nconfig: style = lollipop\n\n2024-01-08: "Sprint planning complete"\n2024-02-14: milestone "Design system shipped" [side: above, color: #1565C0]\n2024-03-22: "Incident \u2014 4h outage" [icon: \u26A0\uFE0F]\n2024-04-01 - 2024-06-30: "API v2 build"\n2024-07-01: milestone "API v2 GA" [side: above, color: #2E7D32]\n```\n\n---\n\n## 3. Date formats\n\nAll date formats can appear anywhere a date is expected \u2014 in events, eras, and ranges.\n\n| Format | Example | Notes |\n|---|---|---|\n| Full date | `2024-09-15` | Day-precision; `YYYY-MM-DD` |\n| Year-month | `2024-09` | Month-precision |\n| Year | `2024` | Year-precision |\n| Quarter | `2024-Q3` | Maps to start of that quarter |\n| BC year (negative) | `-753` | 753 BC |\n| BC year (suffix) | `753BC` or `753BCE` | Same as `-753` |\n| Geological | `65Ma`, `4.6Ga`, `12ka` | Million / billion / thousand years ago |\n\n```\ntimeline "Age of Earth"\nconfig: style = lollipop\nconfig: scale = log\n\n4600Ma: "Earth forms"\n540Ma: "Cambrian explosion"\n252Ma: milestone "Permian extinction \u2014 96% of species lost"\n66Ma: milestone "K-Pg extinction \u2014 end of non-avian dinosaurs"\n3Ma: "Earliest stone tools (Lomekwi)"\n0: "Present day"\n```\n\n---\n\n## 4. Eras (background spans)\n\nAn `era` line draws a shaded background band across the time axis. It always requires a date range.\n\n```\nera 2020 - 2022: "Foundation Phase"\nera 2022 .. 2025: "Growth Phase" [color: #E8F5E9]\n```\n\nThe `[color: \u2026]` property is optional. Overlapping eras stack into separate bands automatically.\n\n```\ntimeline "Company History"\nconfig: style = swimlane\n\nera 2019..2021: "Early Stage" [color: #FFF8E1]\nera 2021..2024: "Series A & B" [color: #E8F5E9]\n\n2019-03-01: "Founded"\n2019-11-15: "First paying customer"\n2020-05-01: milestone "Product-market fit" [side: above]\n2021-02-10: "Series A \u2014 $8M"\n2022-09-01: "Series B \u2014 $30M"\n2023-06-15: milestone "Profitability" [color: #1B5E20]\n```\n\n---\n\n## 5. Tracks (swimlane grouping)\n\nA `track` block groups related events into a named swimlane. Indented event lines (2 spaces) belong to the track.\n\n```\ntrack "Engineering":\n 2024-01-15 - 2024-03-31: "API design"\n 2024-04-01 - 2024-07-31: "Implementation"\n\ntrack "Marketing":\n 2024-06-01: "Campaign kick-off"\n 2024-09-01: milestone "Launch campaign" [color: #1B5E20]\n```\n\nTracks are most useful in `gantt` style, where each track becomes its own labeled row.\n\n```\ntimeline "Q3 Project Plan"\nconfig: style = gantt\n\ntrack "Backend":\n 2024-07-01 - 2024-08-15: "Database migration"\n 2024-08-16 - 2024-09-30: "API hardening"\n\ntrack "Frontend":\n 2024-07-01 - 2024-08-31: "New design system"\n 2024-09-01 - 2024-09-30: "Integration & QA"\n\ntrack "DevOps":\n 2024-07-15 - 2024-08-01: "Staging environment"\n 2024-09-30: milestone "Go-live" [color: #2E7D32]\n```\n\n---\n\n## 6. Notes\n\nA `note:` line indented under an event attaches a tooltip annotation to it.\n\n```\n2024-06-01: "Beta launch"\n note: "First external users; NPS target 40+"\n```\n\nNotes work both for flat events and for events inside tracks.\n\n---\n\n## 7. Configuration\n\n`config:` lines tune the layout and visual style. Each is its own line in the form `config: key = value`.\n\n| Key | Values | Default | Effect |\n|---|---|---|---|\n| `style` | `swimlane` \\| `gantt` \\| `lollipop` | `swimlane` | Visual rendering mode |\n| `orientation` | `horizontal` \\| `vertical` | `horizontal` | Axis direction |\n| `scale` | `proportional` \\| `equidistant` \\| `log` | `proportional` | How time maps to screen space |\n| `axis` | `bottom` \\| `center` | `bottom` | Where the time axis is drawn |\n\n**Style notes:**\n- `swimlane` \u2014 events alternate above and below a horizontal axis; `side:` controls per-event placement. Eras add colored background bands. Best for roadmaps and biographies.\n- `gantt` \u2014 each named track becomes a horizontal bar lane; milestones become pins above the bars. `gantt-project` is an alias. Best for project scheduling.\n- `lollipop` \u2014 a center axis with labeled cards on alternating stems. Best for historical retrospectives with sparse, memorable events.\n\n**Swimlane** \u2014 roadmaps, product timelines, biographies. Eras add color bands; events alternate above and below.\n\n```\ntimeline "SaaS Platform Roadmap"\nconfig: style = swimlane\n\nera 2024-Q1..2024-Q2: "Foundation" [color: #E3F2FD]\nera 2024-Q3..2024-Q4: "Growth" [color: #E8F5E9]\n\n2024-01-15: "Kick-off & team onboarding"\n2024-02-01: milestone "Architecture sign-off" [side: above]\n2024-03-01 - 2024-05-31: "API v2 build"\n2024-04-10: "Security audit" [color: #F9A825]\n2024-06-30: milestone "Beta launch" [side: above]\n2024-07-01 - 2024-09-30: "Performance & scaling"\n2024-10-15: milestone "General availability" [color: #2E7D32]\n```\n\n**Gantt** \u2014 parallel tracks with horizontal duration bars and milestone pins. Best for project scheduling.\n\n```\ntimeline "Product Launch \u2014 Q4"\nconfig: style = gantt\n\ntrack "Engineering":\n 2024-10-01 - 2024-11-15: "Feature freeze & hardening"\n 2024-11-16 - 2024-11-30: "Load testing"\n\ntrack "Design":\n 2024-10-01 - 2024-10-31: "Final UI polish"\n 2024-11-01 - 2024-11-14: "Asset delivery"\n\ntrack "Marketing":\n 2024-10-15 - 2024-11-14: "Campaign prep"\n 2024-11-15 - 2024-11-30: "Launch campaign"\n 2024-12-01: milestone "Launch day" [color: #2E7D32]\n```\n\n**Lollipop** \u2014 sparse milestones on a centered axis with alternating cards. Best for historical retrospectives and brand stories.\n\n```\ntimeline "History of Computing"\nconfig: style = lollipop\nconfig: scale = equidistant\n\n1936: "Turing \u2014 On Computable Numbers"\n1945: "ENIAC \u2014 first general-purpose computer"\n1969: "ARPANET"\n1971: milestone "Intel 4004 microprocessor" [side: above]\n1976: "Apple I"\n1991: "World Wide Web (Berners-Lee)"\n2007: milestone "iPhone" [color: #1565C0, side: above]\n```\n\n---\n\n## 8. Labels & comments\n\n- **Title:** `timeline "My Title"` \u2014 first line only.\n- **Event label:** quoted string after the colon: `DATE: "Label"`.\n- **Milestone label:** `DATE: milestone "Label"`.\n- **Era label:** `era DATE - DATE: "Label"`.\n- **Track name:** `track "Name":`.\n- **Note:** `note: "text"` indented under an event.\n- **Comments:** `#` or `//` at the start of a line (after leading whitespace).\n\n---\n\n## 9. Reserved words & escaping\n\n**Reserved at line start:** `timeline` (header), `config:`, `era`, `track`, `note:`.\n\n**Date range separators:** ` - ` (space-hyphen-space) and `..` \u2014 avoid these sequences inside label text that appears before the colon.\n\n**BC years as negative integers:** `-753` is the year 753 BC. The parser distinguishes the negative sign from a range separator by checking for surrounding whitespace \u2014 ` - ` (with spaces) is a range; `-753` (no leading space after a colon) is a BC year.\n\n**Property blocks:** `[key: value]` must appear *after* the quoted label on the same line. The closing `]` must be present; unclosed brackets produce a parse error.\n\n---\n\n## 10. Common mistakes\n\n| You wrote | Parser says | Fix |\n|---|---|---|\n| `2024-06-01: Launch day` (unquoted label) | Line not recognized as an event \u2014 `TimelineParseError` | Quote the label: `2024-06-01: "Launch day"` |\n| `2024-06 - 2024-09: "Q3"` (year-month range) | Parsed correctly | This works \u2014 all date formats are valid in ranges |\n| `era 2024: "Whole year"` (no range) | `TimelineParseError: era requires a date range` | Use a range: `era 2024 - 2024: "Whole year"` |\n| `track "Backend"` (no colon) | `TimelineParseError: Expected \':\' after track name` | Add the colon: `track "Backend":` |\n| `2024-01-01: "Event" [side: left]` | `side: left` silently ignored; only `above` and `below` are valid | Use `side: above` or `side: below` |\n| `config: style = Gantt` (capital G) | `TimelineParseError: Invalid style: Gantt` | Use lowercase: `config: style = gantt` |\n| `2024-01-01-2024-03-31: "Q1"` (no spaces around `-`) | Parser reads `2024-01-01-2024` as a date \u2014 fails | Use spaces: `2024-01-01 - 2024-03-31:` or `..`: `2024-01-01..2024-03-31:` |\n| Indented event without a track | Indented lines under the timeline header that aren\'t inside a `track` block \u2014 parsed as flat events | Only indent events that are inside a `track "Name":` block |\n\n---\n\n## 11. Grammar (EBNF)\n\n```text\ndocument = header ( blank | comment | config | era | track | event )*\n\nheader = "timeline" ( WS quoted-string )? NEWLINE\nquoted-string = \'"\' any-char-but-quote* \'"\'\n\nconfig = "config:" WS key WS "=" WS value NEWLINE\nkey = "style" | "orientation" | "scale" | "axis"\n\nera = "era" WS date-range ":" WS quoted-string ( WS props )? NEWLINE\ntrack = "track" WS quoted-string ":" NEWLINE\n ( INDENT\u22652 event | INDENT\u22652 note )*\n\nevent = date-spec ":" WS event-body ( WS props )? NEWLINE\n ( INDENT note )?\nevent-body = ( "milestone" WS )? quoted-string\ndate-spec = date ( ( " - " | ".." ) date )?\n\nnote = "note:" WS quoted-string NEWLINE\n\nprops = "[" prop-list "]"\nprop-list = prop ( "," prop )*\nprop = key ":" WS value\n | key ":" WS quoted-string\n\ndate = iso-date | year-month | year | quarter | bc-year | geological\niso-date = digit{4} "-" digit{2} "-" digit{2}\nyear-month = digit{4} "-" digit{2}\nyear = "-"? digit{1,5}\nquarter = digit{4} "-"? "Q" [1-4]\nbc-year = digit+ ( "BC" | "BCE" )\ngeological = number ( "Ma" | "Ga" | "ka" )\n\ncomment = ( "#" | "//" ) any NEWLINE\n```\n\nAuthoritative source: `src/diagrams/timeline/parser.ts`. If this diverges from the parser, the parser wins \u2014 please open an issue.\n\n---'
1020
+ },
1021
+ "state": {
1022
+ "title": "State diagram",
1023
+ "content": '## 1. Your first state diagram\n\nThe smallest useful state diagram has an initial state, a final state, and one transition.\n\n```\nstateDiagram-v2\n[*] --> Running\nRunning --> [*] : done\n```\n\nThree rules cover 80% of usage:\n\n1. Start with `stateDiagram-v2` (Mermaid-style) or `state` (Schematex-style) header.\n2. Use `[*]` for the implicit start node (when on the left of `-->`) or end node (when on the right).\n3. Connect states with `-->`. Add a label after `:` \u2014 full UML form is `trigger [guard] / action`.\n\nThe default direction is **TB** (top-to-bottom) to match Mermaid. Override with `direction LR` on its own line, or `[direction: LR]` on the header.\n\n> Comments use `%%` (Mermaid), `#`, or `//`.\n\n---\n\n## 2. State declarations\n\nStates are auto-created when first referenced in a transition, but explicit declarations let you control the label and shape.\n\n```\nstate Authenticating\nstate "Awaiting Approval" as Approval\nIdle: Waiting for input\n```\n\n| Form | Effect |\n|---|---|\n| `Idle` | Bare ID \u2014 created as a simple state with `Idle` as both id and label |\n| `state Idle` | Explicit declaration; same effect |\n| `state "Awaiting Approval" as Approval` | Aliased \u2014 display `Awaiting Approval`, refer to it by `Approval` in transitions |\n| `Idle: Waiting for input` | Inline label \u2014 `Idle` is the id, `Waiting for input` is the visible label |\n\n---\n\n## 3. Pseudo-states\n\nPseudo-states control the flow of a state machine without representing a stable resting state.\n\n| Mermaid | Schematex | Symbol | Purpose |\n|---|---|---|---|\n| `[*]` (source) | `initial id` | Filled black circle | Entry point of a region |\n| `[*]` (target) | `final id` | Filled circle inside outer ring | Successful exit |\n| `state X <<choice>>` | `choice X` | Diamond | Dynamic branch (guards evaluated at runtime) |\n| `state X <<fork>>` | `fork X` | Thick black bar | One-input \u2192 N parallel outputs |\n| `state X <<join>>` | `join X` | Thick black bar | N inputs \u2192 one output |\n| \u2014 | `junction X` | Small filled circle | Static merge point |\n| \u2014 | `history X` | Circle with `H` | Re-enter at last visited sub-state |\n| \u2014 | `dhistory X` | Circle with `H*` | Deep history (recursive) |\n| \u2014 | `terminate X` | `\xD7` mark | Abnormal termination (no cleanup) |\n| \u2014 | `entry_point X` / `exit_point X` | Hollow circle on composite border | Named entry / exit points |\n\n`[*]` is the Mermaid alias and is always direction-resolved: on the **source** side of `-->` it\'s an `initial`, on the **target** side it\'s a `final`. Each composite scope gets its own pair.\n\n```\nstateDiagram-v2\n[*] --> Idle\nstate Decide <<choice>>\nstate Joiner <<join>>\nIdle --> Decide : evaluate\nDecide --> Authorized : [role == "admin"]\nDecide --> Joiner : [role == "user"]\nAuthorized --> Joiner\nJoiner --> [*]\n```\n\n---\n\n## 4. Transitions\n\nThe full UML 2.5 transition label has three optional parts:\n\n```\ntrigger [guard] / action\n```\n\n| Field | Meaning | Example |\n|---|---|---|\n| `trigger` | Event that fires the transition | `submit`, `tick`, `timeout(30s)` |\n| `[guard]` | Boolean expression evaluated at trigger time | `[count > 0]`, `[role == "admin"]` |\n| `/ action` | Action(s) executed when transition is taken | `/ log(); increment()` |\n\nAll three are optional \u2014 an unlabeled transition is anonymous (completion transition).\n\n```\nA --> B %% anonymous completion\nA --> B : tick %% trigger only\nA --> B : [count > 0] %% guard only\nA --> B : / clearErrors() %% action only\nA --> B : tick [count > 0] / log() %% all three\nA --> B : tick, tock [enabled] / handle() %% multi-trigger\n```\n\nLong labels wrap automatically when they exceed the lane width.\n\n---\n\n## 5. Composite states\n\nA composite state contains a nested sub-statechart. The outer state acts as a container with its own initial / final pseudo-states.\n\n```\nstate Playing {\n [*] --> Buffering\n Buffering --> Streaming : buffer_full\n Streaming --> Buffering : underflow\n}\n```\n\nBoth Mermaid syntax (`state X { \u2026 }`) and the Schematex form (`composite X { \u2026 }`) are accepted. Activities can be declared inside the composite block:\n\n```\nstate Playing {\n entry / startBuffer()\n exit / stopBuffer()\n do / decodeFrames()\n\n [*] --> Buffering\n Buffering --> Streaming : buffer_full\n Streaming --> Buffering : underflow\n}\n```\n\nThe renderer draws composites as a styled cluster with title bar + activity compartment.\n\n```\nstateDiagram-v2\n\n[*] --> Stopped\n\nStopped --> Playing : play / loadSource()\nPlaying --> Paused : pause\nPaused --> Playing : play\nPlaying --> Stopped : stop / releaseSource()\n\nstate Playing {\n entry / startBuffer()\n exit / stopBuffer()\n do / decodeFrames()\n\n [*] --> Buffering\n Buffering --> Streaming : buffer_full\n Streaming --> Buffering : underflow\n}\n```\n\nCross-boundary transitions (`Outside --> Inside`) are routed automatically \u2014 the Sugiyama layout pulls the source/target through the composite border.\n\n---\n\n## 6. Concurrent regions\n\nInside a composite, the `--` separator (Mermaid) or `---` (Schematex) splits the body into orthogonal regions that run concurrently.\n\n```\nstate Active {\n [*] --> r1_idle\n r1_idle --> Connected : connect\n --\n [*] --> r2_idle\n r2_idle --> Working : start\n}\n```\n\nUse `fork` and `join` to spawn / synchronize across regions:\n\n```\nstateDiagram-v2 [direction: LR]\n\n[*] --> F\nstate F <<fork>>\nstate J <<join>>\nF --> A\nF --> B\nA --> J : done_a\nB --> J : done_b\nJ --> [*]\n```\n\n---\n\n## 7. Notes\n\nA short annotation can be attached to either side of any state.\n\n```\nnote right of Checking : Calls /api/verify synchronously.\nnote left of Idle : Anonymous landing state\n```\n\nMulti-line notes use the Mermaid `end note` block form, or the Schematex `{ \u2026 }` form:\n\n```\nnote right of Authenticating\n Stores the JWT in localStorage\n on success.\nend note\n\nnote left_of Idle {\n Anonymous landing state.\n Returns here on 401.\n}\n```\n\n---\n\n## 8. Self-transitions\n\nA transition `A --> A` renders as a curved arc on the right side of the node.\n\n```\nIdle --> Idle : poll / refresh()\n```\n\nThe label is placed beside the arc, outside the bounding box.\n\n---\n\n## 9. Layout direction\n\nSchematex defaults to **`TB`** (top-to-bottom), matching Mermaid. Override on the header:\n\n```\nstateDiagram-v2\ndirection LR\n\n[*] --> Loading\nLoading --> Ready\n```\n\nOr with the Schematex bracket-attr form:\n\n```\nstate "Order Lifecycle" [direction: TB]\n\n[*] --> Pending\nPending --> Paid\n```\n\n`BT` and `RL` are accepted by the parser but normalized to `TB` and `LR` respectively (the layout engine doesn\'t yet flip the visual order).\n\n---\n\n## 10. Common mistakes\n\n| You wrote | Parser says | Fix |\n|---|---|---|\n| `[*] -> [*]` | Treated as both initial alias and final alias on the same line | Always have at least one named state between `[*]` aliases |\n| `state X <<branch>>` | `branch` is not a stereotype | Use `<<choice>>` (dynamic) or `<<fork>>` / `<<join>>` |\n| `note right of`<br/>`text` | Multi-line note must end with `end note` | Add `end note` on its own line |\n| `composite X` (no braces) | Treated as a bare state declaration | Open the block: `composite X {` |\n| `direction LR` inside composite | Per-region direction not yet supported | Set direction on the header line |\n\n---\n\n## 11. Grammar (EBNF)\n\n```text\ndocument = header statement*\nheader = ("stateDiagram-v2" | "stateDiagram" | "state")\n ( title )? ( "[" attrs "]" )? NEWLINE\nattrs = attr ("," attr)*\nattr = "direction:" ("TB" | "LR")\n\nstatement = comment\n | direction-stmt %% direction LR / TB / BT / RL\n | state-decl\n | alias-decl %% state "Long" as ID\n | stereotype-decl %% state ID <<choice|fork|join|end>>\n | pseudo-decl %% initial / final / choice / ... ID\n | composite-block %% (state | composite) ID { ... }\n | label-stmt %% ID : description\n | transition\n | note-stmt\n | region-sep %% -- or ---\n\ntransition = (ID | "[*]") "-->" (ID | "[*]") ( ":" trans-label )? NEWLINE\ntrans-label = trigger? ( "[" guard "]" )? ( "/" action )?\n\nnote-stmt = "note" side ID ":" inline-text NEWLINE\n | "note" side ID NEWLINE text-line+ ("end note" | "}") NEWLINE\nside = "left of" | "right of" | "left_of" | "right_of"\n\ncomment = "%%" any | "#" any | "//" any\n\nID = [A-Za-z_] [A-Za-z0-9_]*\n```\n\nAuthoritative source: `src/diagrams/state/parser.ts`. If this diverges from the parser, the parser wins \u2014 please open an issue.\n\n---'
1024
+ },
1025
+ "pid": {
1026
+ "title": "P&ID (Piping & Instrumentation Diagram)",
1027
+ "content": '## 1. Your first P&ID\n\nA minimal P&ID has at least one piece of equipment and one process line.\n\n```\npid\n\nequip T-1 : tank_atm\nequip P-1 : pump_centrifugal\nequip V-1 : vessel_v\n\nline L1 from T-1.bottom to P-1.in [size: "2\\\\"", type: "process"]\nline L2 from P-1.out to V-1.in [size: "2\\\\"", type: "process"]\n```\n\nThree rules cover 80% of usage:\n\n1. Start the document with `pid` (optional title and `[direction: LR]` attrs).\n2. Declare each piece of equipment: `equip : <type> [tag: "label"]`.\n3. Connect them with `line from <equip>.<port> to <equip>.<port> [type: "process", size: "4\\""]`.\n\nInstrumentation is added separately with `inst : <category>` plus indented `measures` / `controls` clauses.\n\n> Comments use `#` at the start of a line.\n\n---\n\n## 2. Equipment\n\nThe `equip` statement declares process equipment. The catalog follows ISO 10628 / ISA-5.1 conventions.\n\n```\nequip T-101 : tank_atm [tag: "Feed Tank"]\nequip P-101 : pump_centrifugal\nequip E-201 : hx_shell_tube [tag: "Overhead Cond"]\nequip T-201 : column_tray [tag: "Stripper"]\n```\n\n### 2.1 Equipment catalog\n\n| Type | Symbol | Purpose |\n|---|---|---|\n| `tank_atm` | Cylinder + dome top | Atmospheric storage tank |\n| `tank_cone_roof` | Cylinder + cone roof | Cone-roof storage tank |\n| `vessel_v` | Vertical capsule | Vertical pressure vessel |\n| `vessel_h` | Horizontal capsule | Horizontal pressure vessel |\n| `sphere` | Filled circle | LPG / ammonia sphere |\n| `column_tray` | Tall capsule + horizontal tray lines | Distillation tray column |\n| `column_packed` | Tall capsule + cross-hatch | Packed absorption column |\n| `hx_shell_tube` | Horizontal capsule + tube bundle | Shell-and-tube heat exchanger |\n| `hx_air_cooled` | Rectangle + fan circle | Air-cooled (fin-fan) cooler |\n| `reboiler` | Capsule + parallel tube lines | Kettle reboiler |\n| `condenser` | Horizontal capsule + tubes | Overhead condenser |\n| `pump_centrifugal` | Circle + right-side triangle outlet | Centrifugal pump |\n| `pump_pd` | Circle + internal gears | Positive-displacement pump |\n| `compressor` | Trapezoid (narrow on right) | Centrifugal compressor |\n| `blower` | Circle + 3-blade fan | Blower / fan |\n| `reactor_cstr` | Vertical capsule + agitator | Stirred tank reactor (CSTR) |\n| `reactor_pfr` | Horizontal capsule + packed bed dots | Plug-flow / fixed-bed reactor |\n| `filter` | Rectangle + diagonal hatch | Filter |\n| `cyclone` | Cylinder + cone bottom | Cyclone separator |\n| `flare` | Tall stack + flame | Flare stack |\n| `cooling_tower` | Hourglass | Induced-draft cooling tower |\n\n### 2.2 Valve catalog\n\nValves are equipment that sit on the piping line. Render in `bowtie` style with type-specific actuator decoration.\n\n| Type | Decoration | Purpose |\n|---|---|---|\n| `valve_gate` | Plain bowtie | Manual on/off (full-port) |\n| `valve_ball` | Bowtie + filled center circle | Manual on/off (quarter-turn) |\n| `valve_globe` | Bowtie + small top circle | Manual flow control |\n| `valve_butterfly` | Bowtie + center vertical line | Quarter-turn throttle |\n| `valve_check` | Bowtie + arc | Non-return check valve |\n| `valve_control` | Bowtie + diaphragm actuator | Pneumatic control valve (paired with FIC) |\n| `valve_psv` | Bowtie + 45\xB0 outlet + spring stack | Pressure safety relief valve |\n\n```\nequip V-101 : valve_control [tag: "V-101 (FC)"]\nequip V-303 : valve_psv [tag: "V-303 \xB7 150 psig"]\n```\n\n---\n\n## 3. Piping & signal lines\n\nThe `line` statement connects two anchor points (equipment ports or instrument tags).\n\n```\nline L1 from T-101.bottom to P-101.in [size: "4\\"", service: "water", type: "process"]\nline s1 from FT-101 to FIC-101 [type: "electric"]\nline s2 from FIC-101 to V-101 [type: "pneumatic"]\n```\n\n### 3.1 Anchor syntax\n\nEach end of a line is either:\n- `<equip-id>.<port>` \u2014 port name from \xA72.2 (`in`, `out`, `top`, `bottom`, `feed`, `shell_in`, `tube_out`, `reflux`, etc.)\n- `<equip-id>` \u2014 port omitted; defaults to `in` (target) / `out` (source) per equipment family\n- `<inst-tag>` \u2014 instrument bubble center (signal lines)\n\n### 3.2 Line types (ISA-5.1 \xA75)\n\n| `type:` | Stroke | Use |\n|---|---|---|\n| `process` | Solid, thick | Major process line (default) |\n| `process_minor` | Solid, thin | Auxiliary / utility |\n| `pneumatic` | Solid + diagonal tick marks | Air-actuator signal |\n| `electric` | Long-dash | Electric / 4\u201320 mA signal |\n| `hydraulic` | Long-dash + pause | Hydraulic actuator |\n| `capillary` | Dotted (round caps) | Filled-system temperature |\n| `software` | Short-dash, light | DCS / PLC internal data link |\n| `mechanical` | Mixed dash | Mechanical linkage |\n\n### 3.3 Line tags\n\nThe standard PIP PIC001 tag format is `<size>"-<service>-<sequence>-<spec>`. Pass it via the `tag:` attribute and the renderer places a small white tag rectangle at the line midpoint.\n\n```\nline L1 from T-101.bottom to P-101.in [size: "4\\"", service: "PG", tag: "4\\"-PG-101-A1B"]\n```\n\n---\n\n## 4. Instrumentation (ISA-5.1 \xA74)\n\nThe `inst` statement declares an instrument bubble. The **tag** uses the ISA letter-code convention: first letter is the *measured variable*, subsequent letters are *modifiers* and *function*.\n\n```\ninst FT-101 : field_discrete %% Flow Transmitter, loop 101\ninst FIC-101 : cr_shared %% Flow Indicating Controller (DCS)\ninst PSHH-301: cr_plc %% Pressure Switch High-High (PLC)\ninst LIC-201 : cr_shared\n measures D-201\n controls V-202\n```\n\n### 4.1 Letter codes (first letter)\n\nMost-used: `F` flow \xB7 `L` level \xB7 `P` pressure \xB7 `T` temperature \xB7 `A` analysis \xB7 `S` speed \xB7 `H` hand \xB7 `Y` event/state. Full list in ISA-5.1 Table 1.\n\n### 4.2 Function modifiers\n\n`I` indicator \xB7 `R` recorder \xB7 `C` controller \xB7 `T` transmitter \xB7 `E` element \xB7 `V` valve \xB7 `S` switch \xB7 `A` alarm \xB7 `H`/`L` high/low. Combine into the multi-letter tag: `FIC` = Flow Indicating Controller; `PSHH` = Pressure Switch High-High.\n\n### 4.3 Bubble categories\n\nISA-5.1 distinguishes **location** (where the instrument lives) and **type** (analog vs. shared vs. computer vs. PLC). Schematex implements the four most common combinations:\n\n| Category | Bubble shape | Use |\n|---|---|---|\n| `field_discrete` | Plain circle | Field-mounted analog instrument (FT, PT) |\n| `cr_shared` | Circle + horizontal line + inscribed hexagon | DCS-controlled HMI display |\n| `cr_computer` | Circle + horizontal line + inscribed diamond | Computer function (FY, calculation) |\n| `cr_plc` | Circle + horizontal line + inscribed square | PLC-driven logic |\n\n`field_*` variants omit the horizontal centerline; `local_*` variants use a dashed centerline; `cr_*` variants use a solid centerline indicating "main control panel \u2014 front."\n\n### 4.4 measures / controls\n\nIndented under an `inst` declaration:\n\n| Clause | Effect |\n|---|---|\n| `measures <equip-id>` | Auto-routed dashed-electric signal line from the equipment to the bubble |\n| `controls <equip-id>` | Auto-routed pneumatic signal line from the bubble to the equipment (typically a `valve_control`) |\n\n```\ninst FT-101 : field_discrete\n measures P-101\ninst FIC-101 : cr_shared\n controls V-101\n```\n\nThese auto-signals are independent of the explicit `line` statements \u2014 they get rendered with the appropriate signal-line style based on the relation type.\n\n---\n\n## 5. Layout direction\n\nThe default direction is **`LR`** (left-to-right) \u2014 process feed enters on the left, product exits on the right. Override on the header:\n\n```\npid "Distillation Tower" [direction: TB]\n\nequip T-201 : column_tray\n\u2026\n```\n\nThe MVP layout places equipment in declaration order along the primary direction with Manhattan signal-line routing. **Multi-row / parallel-flow layouts and tee junctions are roadmap items** \u2014 see \xA79.\n\n---\n\n## 6. Worked example: Distillation column\n\nA real overhead-condenser loop with reboiler, reflux drum, and instrumentation:\n\n```\npid "Distillation T-201"\n\nequip T-201 : column_tray [tag: "T-201"]\nequip E-201 : condenser [tag: "Overhead Cond"]\nequip D-201 : vessel_h [tag: "Reflux Drum"]\nequip P-201 : pump_centrifugal [tag: "Reflux Pump"]\nequip E-202 : reboiler [tag: "Reboiler"]\n\nline L1 from T-201.top to E-201.shell_in [size: "8\\\\"", service: "vapor", type: "process"]\nline L2 from E-201.shell_out to D-201.in [size: "8\\\\"", type: "process"]\nline L3 from D-201.bottom to P-201.in [size: "3\\\\"", type: "process"]\nline L4 from P-201.out to T-201.reflux [size: "3\\\\"", type: "process"]\nline L5 from T-201.bottom to E-202.in [size: "6\\\\"", type: "process"]\n\ninst PT-201 : field_discrete\n measures T-201\ninst LIC-201 : cr_shared\n measures D-201\ninst TIC-201 : cr_shared\n measures T-201\n```\n\n---\n\n## 7. Grammar (EBNF)\n\n```text\ndocument = header statement*\nheader = "pid" ( title )? ( "[" attrs "]" )? NEWLINE\nattrs = attr ("," attr)*\nattr = "direction:" ("LR" | "TB")\n | "units:" ("imperial" | "metric")\n\nstatement = comment\n | equipment-decl\n | line-decl\n | instrument-decl\n\nequipment-decl = "equip" ID ":" equip-type ( "[" attr-list "]" )? NEWLINE\nequip-type = "tank_atm" | "tank_cone_roof"\n | "vessel_v" | "vessel_h" | "sphere"\n | "column_tray" | "column_packed"\n | "hx_shell_tube" | "hx_air_cooled" | "reboiler" | "condenser"\n | "pump_centrifugal" | "pump_pd"\n | "compressor" | "blower"\n | "reactor_cstr" | "reactor_pfr"\n | "filter" | "cyclone" | "flare" | "cooling_tower"\n | "valve_gate" | "valve_ball" | "valve_globe" | "valve_butterfly"\n | "valve_check" | "valve_control" | "valve_psv"\n\nline-decl = "line" ID "from" anchor "to" anchor ( "[" attr-list "]" )? NEWLINE\nanchor = ID ( "." port )?\nport = "in" | "out" | "top" | "bottom" | "left" | "right"\n | "feed" | "reflux" | "shell_in" | "shell_out"\n | "tube_in" | "tube_out" | "vapor_out" | "liquid_out"\n | "bottom_return"\n\ninstrument-decl = "inst" tag ":" inst-category ( "[" attr-list "]" )? NEWLINE\n ( indented "measures" anchor NEWLINE )*\n ( indented "controls" ID NEWLINE )*\ntag = letter-code "-" loop-num %% e.g., "FIC-101"\ninst-category = "field_discrete" | "field_shared" | "field_computer" | "field_plc"\n | "cr_discrete" | "cr_shared" | "cr_computer" | "cr_plc"\n | "local_discrete" | "local_shared"\n\nattr-list = attr ("," attr)*\nattr = key ":" value\nkey = "tag" | "size" | "service" | "type" | "set_pressure"\n | "actuator" | "fail" | "trays" | \u2026\nvalue = quoted-string | bare-word\n\nID = [A-Za-z] [A-Za-z0-9_-]*\n```\n\nAuthoritative source: `src/diagrams/pid/parser.ts`. If this diverges from the parser, the parser wins \u2014 please open an issue.\n\n---'
1001
1028
  }
1002
1029
  };
1003
1030
 
@@ -1077,7 +1104,7 @@ function getExamples(type, opts = {}) {
1077
1104
  function validateDsl(type, dsl) {
1078
1105
  const config = type ? { type } : void 0;
1079
1106
  try {
1080
- chunkMSYBSOU2_cjs.parse(dsl, config);
1107
+ chunkXTATRNUN_cjs.parse(dsl, config);
1081
1108
  return { ok: true, type: type ?? resolveTypeFromText(dsl) };
1082
1109
  } catch (err) {
1083
1110
  return {
@@ -1093,7 +1120,7 @@ function renderDsl(type, dsl, options = {}) {
1093
1120
  ...type ? { type } : {}
1094
1121
  };
1095
1122
  try {
1096
- const svg = chunkMSYBSOU2_cjs.render(dsl, config);
1123
+ const svg = chunkXTATRNUN_cjs.render(dsl, config);
1097
1124
  return { ok: true, type: type ?? resolveTypeFromText(dsl), svg };
1098
1125
  } catch (err) {
1099
1126
  return {
@@ -1117,5 +1144,5 @@ exports.getSyntax = getSyntax;
1117
1144
  exports.listDiagrams = listDiagrams;
1118
1145
  exports.renderDsl = renderDsl;
1119
1146
  exports.validateDsl = validateDsl;
1120
- //# sourceMappingURL=chunk-DPQYGWCT.cjs.map
1121
- //# sourceMappingURL=chunk-DPQYGWCT.cjs.map
1147
+ //# sourceMappingURL=chunk-SQKLKBBK.cjs.map
1148
+ //# sourceMappingURL=chunk-SQKLKBBK.cjs.map