@pixerate/editor 0.55.0 → 0.56.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/index.cjs +18 -17
- package/dist/agent/index.cjs.map +1 -1
- package/dist/agent/index.js +3 -2
- package/dist/agent/index.js.map +1 -1
- package/dist/canvas/index.cjs +2105 -172
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +319 -23
- package/dist/canvas/index.d.ts +319 -23
- package/dist/canvas/index.js +2081 -148
- package/dist/canvas/index.js.map +1 -1
- package/dist/chart/index.cjs +32 -30
- package/dist/chart/index.cjs.map +1 -1
- package/dist/chart/index.d.cts +4 -2
- package/dist/chart/index.d.ts +4 -2
- package/dist/chart/index.js +20 -18
- package/dist/chart/index.js.map +1 -1
- package/dist/{chunk-C3JHII3M.cjs → chunk-3I6V7PI4.cjs} +45 -45
- package/dist/{chunk-C3JHII3M.cjs.map → chunk-3I6V7PI4.cjs.map} +1 -1
- package/dist/{chunk-P43HUQRX.cjs → chunk-AHCENCU4.cjs} +12 -10
- package/dist/chunk-AHCENCU4.cjs.map +1 -0
- package/dist/chunk-II77MLHN.cjs +11106 -0
- package/dist/chunk-II77MLHN.cjs.map +1 -0
- package/dist/{chunk-OIKYP7XC.js → chunk-LMUDHBWR.js} +2 -2
- package/dist/{chunk-VODBAO32.js → chunk-OEFCLWZ3.js} +4 -1425
- package/dist/chunk-OEFCLWZ3.js.map +1 -0
- package/dist/{chunk-NK3WL5TJ.cjs → chunk-P2CTDJNF.cjs} +27 -1448
- package/dist/chunk-P2CTDJNF.cjs.map +1 -0
- package/dist/chunk-TKPPIVW7.cjs +1443 -0
- package/dist/chunk-TKPPIVW7.cjs.map +1 -0
- package/dist/chunk-WJSCGBJ2.js +11106 -0
- package/dist/chunk-WJSCGBJ2.js.map +1 -0
- package/dist/{chunk-RIXTW3C4.js → chunk-WLVZ235X.js} +5 -3
- package/dist/{chunk-RIXTW3C4.js.map → chunk-WLVZ235X.js.map} +1 -1
- package/dist/chunk-ZOH6X3VR.js +1443 -0
- package/dist/chunk-ZOH6X3VR.js.map +1 -0
- package/dist/{controller-DscWQbjO.d.ts → controller-D2rj5umx.d.ts} +2 -362
- package/dist/{controller-CX0QfSv0.d.cts → controller-R2biKk_E.d.cts} +2 -362
- package/dist/diagram/index.cjs +1457 -47
- package/dist/diagram/index.cjs.map +1 -1
- package/dist/diagram/index.d.cts +1734 -15
- package/dist/diagram/index.d.ts +1734 -15
- package/dist/diagram/index.js +1436 -26
- package/dist/diagram/index.js.map +1 -1
- package/dist/extensions/index.cjs +5 -4
- package/dist/extensions/index.cjs.map +1 -1
- package/dist/extensions/index.d.cts +4 -3
- package/dist/extensions/index.d.ts +4 -3
- package/dist/extensions/index.js +4 -3
- package/dist/{index-DIWB6xMf.d.cts → index-BcHyG0Wq.d.cts} +2 -1
- package/dist/{index-CALDD35B.d.ts → index-CTCc3m3C.d.ts} +2 -1
- package/dist/index.cjs +10 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +4 -3
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/types-BRp-6zkY.d.cts +362 -0
- package/dist/types-BRp-6zkY.d.ts +362 -0
- package/dist/{types-BULrFyuQ.d.cts → types-DYkjhzdz.d.cts} +1 -1
- package/dist/{types-BULrFyuQ.d.ts → types-DYkjhzdz.d.ts} +1 -1
- package/package.json +1 -1
- package/dist/chunk-H5K77C7Y.cjs +0 -3848
- package/dist/chunk-H5K77C7Y.cjs.map +0 -1
- package/dist/chunk-NK3WL5TJ.cjs.map +0 -1
- package/dist/chunk-P43HUQRX.cjs.map +0 -1
- package/dist/chunk-VODBAO32.js.map +0 -1
- package/dist/chunk-WWJNC7SX.js +0 -3848
- package/dist/chunk-WWJNC7SX.js.map +0 -1
- /package/dist/{chunk-OIKYP7XC.js.map → chunk-LMUDHBWR.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/diagram/layout-registry.ts","../src/diagram/source/lines.ts","../src/diagram/source/metadata.ts","../src/diagram/flowchart/edges.ts","../src/diagram/flowchart/shapes.ts","../src/diagram/flowchart/statements.ts","../src/diagram/flowchart/parse.ts","../src/diagram/flowchart/serialize.ts","../src/diagram/flowchart/edit.ts","../src/diagram/flowchart/index.ts","../src/diagram/lines-grammar/engine.ts","../src/diagram/passthrough.ts","../src/diagram/lines-grammar/state.ts","../src/diagram/lines-grammar/class.ts","../src/diagram/lines-grammar/er.ts","../src/diagram/statements/base.ts","../src/diagram/pie/geometry.ts","../src/diagram/pie/index.ts","../src/diagram/mindmap/geometry.ts","../src/diagram/mindmap/index.ts","../src/diagram/quadrant/geometry.ts","../src/diagram/quadrant/index.ts","../src/diagram/c4/geometry.ts","../src/diagram/c4/index.ts","../src/diagram/architecture/geometry.ts","../src/diagram/architecture/index.ts","../src/diagram/sequence/geometry.ts","../src/diagram/sequence/index.ts","../src/diagram/gitgraph/geometry.ts","../src/diagram/gitgraph/index.ts","../src/diagram/gantt/geometry.ts","../src/diagram/statements/sections.ts","../src/diagram/gantt/index.ts","../src/diagram/timeline/geometry.ts","../src/diagram/timeline/index.ts","../src/diagram/journey/geometry.ts","../src/diagram/journey/index.ts","../src/diagram/xychart/index.ts","../src/diagram/radar/index.ts","../src/diagram/registry.ts","../src/diagram/document.ts"],"sourcesContent":["import type { DiagramFamily, DiagramGraph, DiagramMeta, GraphNode, Point } from \"./types.js\";\n\n/**\n * Family layouts: families whose positions come from their data (quadrant points,\n * sequence participants, pie slices, Gantt bars…) register one here so the canvas\n * shows the diagram's own geometry instead of a generic graph layout. The dagre layout\n * in `@pixerate/editor/canvas` asks this registry first. Kept here, free of dagre, so\n * family adapters can register without pulling in the canvas.\n *\n * @module\n */\n\nexport interface Size {\n width: number;\n height: number;\n}\n\n/** Absolute top-left positions and sizes for every node and group. */\nexport interface LayoutResult {\n positions: Record<string, Point>;\n sizes: Record<string, Size>;\n}\n\n/** Options a family layout receives (the canvas layout options, with a measure resolved). */\nexport interface FamilyLayoutOptions {\n /** Node size estimator. */\n measure: (node: GraphNode) => Size;\n /** Gap between nodes in a rank, in px. */\n nodeSep?: number;\n /** Gap between ranks, in px. */\n rankSep?: number;\n /** Padding inside groups around their children, in px. */\n groupPadding?: number;\n /** Height reserved for a group's title, in px. */\n groupTitleHeight?: number;\n}\n\n/**\n * A family-specific layout. Receives the graph, the stored metadata and the resolved\n * options; returns absolute positions and sizes for every node and group.\n */\nexport type FamilyLayout = (graph: DiagramGraph, meta: DiagramMeta, options: FamilyLayoutOptions) => LayoutResult;\n\nconst familyLayouts = new Map<DiagramFamily, FamilyLayout>();\n\n/** Registers (or replaces) the layout used for a family. */\nexport function registerFamilyLayout(family: DiagramFamily, layout: FamilyLayout): void {\n familyLayouts.set(family, layout);\n}\n\nexport function getFamilyLayout(family: DiagramFamily | undefined): FamilyLayout | undefined {\n return family ? familyLayouts.get(family) : undefined;\n}\n\n/** The frame XY charts are drawn in (Mermaid's default 700 × 500). */\nexport const XY_CHART_BOX = { x: 0, y: 0, width: 700, height: 500 } as const;\n/** The frame radar charts are drawn in (Mermaid's default 600 × 600). */\nexport const RADAR_CHART_BOX = { x: 0, y: 0, width: 600, height: 600 } as const;\n\n/** A layout that gives every node and group the same frame (charts drawn as one picture). */\nexport function sharedFrameLayout(box: { x: number; y: number; width: number; height: number }): FamilyLayout {\n return (graph) => {\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const item of [...graph.nodes, ...graph.groups]) {\n positions[item.id] = [box.x, box.y];\n sizes[item.id] = { width: box.width, height: box.height };\n }\n return { positions, sizes };\n };\n}\n","import type { DiagramFamily, Preamble } from \"../types.js\";\n\nexport interface SplitSource {\n eol: \"\\n\" | \"\\r\\n\";\n preamble: Preamble;\n /** Header line without EOL; empty string if none was found. */\n header: string;\n /** 0-based index of the header line in the original line array. */\n headerIndex: number;\n bodyLines: string[];\n trailing: string;\n}\n\n/** Matches the first token of a diagram header and maps it to a family. */\nconst HEADER_PATTERNS: [RegExp, DiagramFamily][] = [\n [/^\\s*(flowchart|graph)(?:-elk)?\\b/i, \"flowchart\"],\n [/^\\s*stateDiagram(?:-v2)?\\b/i, \"state\"],\n [/^\\s*classDiagram(?:-v2)?\\b/i, \"class\"],\n [/^\\s*erDiagram\\b/i, \"er\"],\n [/^\\s*requirementDiagram\\b/i, \"requirement\"],\n [/^\\s*mindmap\\b/i, \"mindmap\"],\n [/^\\s*sequenceDiagram\\b/i, \"sequence\"],\n [/^\\s*gantt\\b/i, \"gantt\"],\n [/^\\s*pie\\b/i, \"pie\"],\n [/^\\s*journey\\b/i, \"journey\"],\n [/^\\s*timeline\\b/i, \"timeline\"],\n [/^\\s*gitGraph\\b/i, \"gitGraph\"],\n [/^\\s*C4(Context|Container|Component|Dynamic|Deployment)\\b/, \"c4\"],\n [/^\\s*quadrantChart\\b/i, \"quadrant\"],\n [/^\\s*sankey(?:-beta)?\\b/i, \"sankey\"],\n [/^\\s*xychart(?:-beta)?\\b/i, \"xychart\"],\n [/^\\s*block(?:-beta)?\\b/i, \"block\"],\n [/^\\s*architecture(?:-beta)?\\b/i, \"architecture\"],\n [/^\\s*packet(?:-beta)?\\b/i, \"packet\"],\n [/^\\s*kanban\\b/i, \"kanban\"],\n [/^\\s*radar(?:-beta)?\\b/i, \"radar\"],\n [/^\\s*treemap(?:-beta)?\\b/i, \"treemap\"],\n [/^\\s*info\\b/i, \"info\"],\n];\n\n/** Detects the diagram family of a header line (or whole source). */\nexport function detectFamilyFromHeader(header: string): DiagramFamily {\n for (const [re, family] of HEADER_PATTERNS) {\n if (re.test(header)) return family;\n }\n return \"unknown\";\n}\n\nexport function isCommentLine(line: string): boolean {\n const t = line.trim();\n return t.startsWith(\"%%\") && !t.startsWith(\"%%{\");\n}\n\nexport function isDirectiveLine(line: string): boolean {\n return /^\\s*%%\\{.*\\}%%\\s*$/.test(line);\n}\n\n/**\n * Splits a Mermaid source into preamble, header, body and trailing whitespace.\n *\n * The preamble is everything before the header: an optional YAML frontmatter\n * block (which must start on the first line), directives, comments and blank\n * lines. All of it is kept verbatim.\n */\nexport function splitSource(source: string): SplitSource {\n const eol: \"\\n\" | \"\\r\\n\" = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const rawLines = source.split(/\\r\\n|\\n/);\n\n // Trailing: blank lines at the very end (and whether the source ended with EOL)\n let end = rawLines.length;\n while (end > 0 && rawLines[end - 1]!.trim() === \"\") end--;\n const trailingLines = rawLines.slice(end);\n // If the source ended with an EOL, split() produced a final \"\" entry. We\n // reconstruct trailing as the exact suffix after the last non-blank line.\n const trailing = trailingLines.length ? eol + trailingLines.join(eol) : \"\";\n const lines = rawLines.slice(0, end);\n\n const preambleLines: string[] = [];\n let i = 0;\n let frontmatter: Record<string, unknown> | undefined;\n\n if (lines[0] !== undefined && /^---\\s*$/.test(lines[0])) {\n // Frontmatter block\n preambleLines.push(lines[0]);\n i = 1;\n const fm: string[] = [];\n while (i < lines.length && !/^---\\s*$/.test(lines[i]!)) {\n fm.push(lines[i]!);\n preambleLines.push(lines[i]!);\n i++;\n }\n if (i < lines.length) {\n preambleLines.push(lines[i]!);\n i++;\n }\n frontmatter = parseSimpleYaml(fm);\n }\n\n while (i < lines.length) {\n const line = lines[i]!;\n if (line.trim() === \"\" || isDirectiveLine(line) || isCommentLine(line)) {\n preambleLines.push(line);\n i++;\n continue;\n }\n break;\n }\n\n const headerIndex = i;\n const header = lines[i] ?? \"\";\n const bodyLines = lines.slice(i + 1);\n\n return {\n eol,\n preamble: { lines: preambleLines, frontmatter },\n header,\n headerIndex,\n bodyLines,\n trailing,\n };\n}\n\n/**\n * Minimal YAML reader for Mermaid frontmatter. Handles scalar `key: value`\n * pairs, JSON flow values (`key: {\"a\":1}`) and one level of nested maps —\n * enough for `title`, `displayMode`, `config` and the diagram module's own key. Anything\n * else is kept as the raw string.\n */\nexport function parseSimpleYaml(lines: string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n let currentKey: string | null = null;\n let nested: Record<string, unknown> | null = null;\n for (const raw of lines) {\n if (raw.trim() === \"\" || raw.trim().startsWith(\"#\")) continue;\n const indent = raw.length - raw.trimStart().length;\n const m = /^([A-Za-z_][\\w-]*)\\s*:\\s*(.*)$/.exec(raw.trim());\n if (!m) continue;\n const [, key, valueRaw] = m;\n const value = parseYamlScalar(valueRaw!);\n if (indent === 0) {\n currentKey = key!;\n if (valueRaw!.trim() === \"\") {\n nested = {};\n out[key!] = nested;\n } else {\n nested = null;\n out[key!] = value;\n }\n } else if (nested && currentKey) {\n nested[key!] = value;\n }\n }\n return out;\n}\n\nfunction parseYamlScalar(v: string): unknown {\n const t = v.trim();\n if (t === \"\") return \"\";\n if (t.startsWith(\"{\") || t.startsWith(\"[\")) {\n try {\n return JSON.parse(t);\n } catch {\n return t;\n }\n }\n if (/^(true|false)$/i.test(t)) return t.toLowerCase() === \"true\";\n if (/^-?\\d+(\\.\\d+)?$/.test(t)) return Number(t);\n if ((t.startsWith('\"') && t.endsWith('\"')) || (t.startsWith(\"'\") && t.endsWith(\"'\"))) {\n return t.slice(1, -1);\n }\n return t;\n}\n\n/**\n * Splits a single line into `;`-separated statements, ignoring separators\n * inside quotes or brackets. Mermaid allows `A --> B; B --> C` on one line.\n */\nexport function splitStatements(line: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let quote: string | null = null;\n let cur = \"\";\n for (let i = 0; i < line.length; i++) {\n const ch = line[i]!;\n if (quote) {\n cur += ch;\n if (ch === quote) quote = null;\n continue;\n }\n if (ch === '\"' || ch === \"`\") {\n quote = ch;\n cur += ch;\n continue;\n }\n if (ch === \"[\" || ch === \"(\" || ch === \"{\") depth++;\n else if (ch === \"]\" || ch === \")\" || ch === \"}\") depth = Math.max(0, depth - 1);\n if (ch === \";\" && depth === 0) {\n parts.push(cur);\n cur = \"\";\n continue;\n }\n cur += ch;\n }\n parts.push(cur);\n return parts;\n}\n","import type { MetaCarrier, Point, Preamble, DiagramMeta } from \"../types.js\";\n\n/** Prefix of the metadata comment line. */\nexport const META_COMMENT_PREFIX = \"%% @pixerate \";\n/** Frontmatter key used when comments are not safe for a family. */\nexport const META_FRONTMATTER_KEY = \"pixerate\";\n/** Frontmatter key written by Ursula, still read. */\nconst LEGACY_FRONTMATTER_KEY = \"ursula\";\n\n/** `%% @pixerate {json}`; Ursula's `%% @ursula {json}` is read the same way and rewritten as `@pixerate`. */\nconst META_LINE = /^\\s*%%\\s*@(?:pixerate|ursula)\\s+(\\{.*\\})\\s*$/;\n/**\n * `%% @layout {\"id\":[x,y]}`, the positions-only comment written by the\n * redesign-agentic-web diagram editor. Same coordinates as `meta.layout`\n * (absolute top-left), so it is read as layout and replaced by `@pixerate` the\n * next time the document is serialised.\n */\nconst LEGACY_LAYOUT_LINE = /^\\s*%%\\s*@layout\\b\\s*(.*?)\\s*$/;\n\nexport function emptyMeta(): DiagramMeta {\n return { v: 1 };\n}\n\nexport function isMetaLine(line: string): boolean {\n return META_LINE.test(line) || LEGACY_LAYOUT_LINE.test(line);\n}\n\n/**\n * Extracts `%% @pixerate {json}` lines from a body. Several lines are merged\n * (later wins) so that hand-edited documents stay tolerant.\n */\nexport function extractMetaFromBody(bodyLines: string[]): {\n bodyLines: string[];\n meta: DiagramMeta | null;\n} {\n let meta: DiagramMeta | null = null;\n let legacy: DiagramMeta | null = null;\n const rest: string[] = [];\n for (const line of bodyLines) {\n const m = META_LINE.exec(line);\n if (m) {\n const parsed = safeParseMeta(m[1]!);\n if (parsed) meta = mergeMeta(meta ?? emptyMeta(), parsed);\n continue;\n }\n const lm = LEGACY_LAYOUT_LINE.exec(line);\n if (lm) {\n // A malformed payload is dropped too: keeping it would leave a second,\n // stale layout comment beside the `@pixerate` one.\n const parsed = safeParseMeta(`{\"layout\":${lm[1] || \"null\"}}`);\n if (parsed) legacy = mergeMeta(legacy ?? emptyMeta(), parsed);\n continue;\n }\n rest.push(line);\n }\n // `@pixerate` wins wherever both carry a position.\n if (legacy) meta = meta ? mergeMeta(legacy, meta) : legacy;\n return { bodyLines: rest, meta };\n}\n\nexport function extractMetaFromFrontmatter(preamble: Preamble): DiagramMeta | null {\n const value = preamble.frontmatter?.[META_FRONTMATTER_KEY] ?? preamble.frontmatter?.[LEGACY_FRONTMATTER_KEY];\n if (!value) return null;\n if (typeof value === \"string\") return safeParseMeta(value);\n if (typeof value === \"object\") return normaliseMeta(value as Record<string, unknown>);\n return null;\n}\n\nfunction safeParseMeta(json: string): DiagramMeta | null {\n try {\n const value = JSON.parse(json) as Record<string, unknown>;\n return normaliseMeta(value);\n } catch {\n return null;\n }\n}\n\nfunction normaliseMeta(value: Record<string, unknown>): DiagramMeta {\n const meta: DiagramMeta = { v: 1 };\n if (value.layout && typeof value.layout === \"object\") {\n const layout: Record<string, Point> = {};\n for (const [id, pos] of Object.entries(value.layout as Record<string, unknown>)) {\n if (Array.isArray(pos) && pos.length === 2 && pos.every((n) => typeof n === \"number\")) {\n layout[id] = [pos[0] as number, pos[1] as number];\n }\n }\n meta.layout = layout;\n }\n if (value.sizes && typeof value.sizes === \"object\") {\n const sizes: Record<string, readonly [number, number]> = {};\n for (const [id, size] of Object.entries(value.sizes as Record<string, unknown>)) {\n if (Array.isArray(size) && size.length === 2 && size.every((n) => typeof n === \"number\")) {\n sizes[id] = [size[0] as number, size[1] as number];\n }\n }\n meta.sizes = sizes;\n }\n if (value.viewport && typeof value.viewport === \"object\") {\n const vp = value.viewport as Record<string, unknown>;\n if (typeof vp.x === \"number\" && typeof vp.y === \"number\" && typeof vp.zoom === \"number\") {\n meta.viewport = { x: vp.x, y: vp.y, zoom: vp.zoom };\n }\n }\n if (value.ext && typeof value.ext === \"object\") meta.ext = value.ext as Record<string, unknown>;\n return meta;\n}\n\nexport function mergeMeta(a: DiagramMeta, b: DiagramMeta): DiagramMeta {\n return {\n v: 1,\n layout: a.layout || b.layout ? { ...a.layout, ...b.layout } : undefined,\n sizes: a.sizes || b.sizes ? { ...a.sizes, ...b.sizes } : undefined,\n viewport: b.viewport ?? a.viewport,\n ext: a.ext || b.ext ? { ...a.ext, ...b.ext } : undefined,\n };\n}\n\n/** True when there is nothing worth writing. */\nexport function isMetaEmpty(meta: DiagramMeta): boolean {\n const hasLayout = !!meta.layout && Object.keys(meta.layout).length > 0;\n const hasSizes = !!meta.sizes && Object.keys(meta.sizes).length > 0;\n const hasExt = !!meta.ext && Object.keys(meta.ext).length > 0;\n return !hasLayout && !hasSizes && !meta.viewport && !hasExt;\n}\n\n/** Compact, deterministic JSON so diffs stay small. Positions are rounded. */\nexport function serializeMeta(meta: DiagramMeta): string {\n const out: Record<string, unknown> = { v: 1 };\n if (meta.layout && Object.keys(meta.layout).length) {\n const layout: Record<string, Point> = {};\n for (const id of Object.keys(meta.layout).sort()) {\n const [x, y] = meta.layout[id]!;\n layout[id] = [Math.round(x), Math.round(y)];\n }\n out.layout = layout;\n }\n if (meta.sizes && Object.keys(meta.sizes).length) {\n const sizes: Record<string, readonly [number, number]> = {};\n for (const id of Object.keys(meta.sizes).sort()) {\n const [w, h] = meta.sizes[id]!;\n sizes[id] = [Math.round(w), Math.round(h)];\n }\n out.sizes = sizes;\n }\n if (meta.viewport) {\n out.viewport = {\n x: Math.round(meta.viewport.x),\n y: Math.round(meta.viewport.y),\n zoom: Math.round(meta.viewport.zoom * 1000) / 1000,\n };\n }\n if (meta.ext && Object.keys(meta.ext).length) out.ext = meta.ext;\n return JSON.stringify(out);\n}\n\nexport function metaCommentLine(meta: DiagramMeta, indent = \" \"): string {\n return `${indent}${META_COMMENT_PREFIX}${serializeMeta(meta)}`;\n}\n\n/**\n * Returns preamble lines with the `pixerate:` frontmatter entry set/removed.\n * Creates a frontmatter block when none exists.\n */\nexport function writeMetaToPreamble(preamble: Preamble, meta: DiagramMeta | null): string[] {\n const lines = [...preamble.lines];\n const hasFm = lines[0] !== undefined && /^---\\s*$/.test(lines[0]);\n const entry =\n meta && !isMetaEmpty(meta) ? `${META_FRONTMATTER_KEY}: ${serializeMeta(meta)}` : null;\n\n if (!hasFm) {\n if (!entry) return lines;\n return [\"---\", entry, \"---\", ...lines];\n }\n const close = lines.findIndex((l, i) => i > 0 && /^---\\s*$/.test(l));\n const fmEnd = close === -1 ? lines.length : close;\n const existing = lines.findIndex(\n (l, i) => i > 0 && i < fmEnd && new RegExp(`^(?:${META_FRONTMATTER_KEY}|${LEGACY_FRONTMATTER_KEY})\\\\s*:`).test(l),\n );\n if (existing !== -1) {\n if (entry) lines[existing] = entry;\n else lines.splice(existing, 1);\n } else if (entry) {\n lines.splice(fmEnd, 0, entry);\n }\n // Collapse an emptied frontmatter block.\n if (!entry) {\n const close2 = lines.findIndex((l, i) => i > 0 && /^---\\s*$/.test(l));\n if (close2 === 1) lines.splice(0, 2);\n }\n return lines;\n}\n\n/** Families whose grammar rejects `%%` comments in the body. */\nexport const FRONTMATTER_META_FAMILIES = new Set([\"requirement\"]);\n\nexport function defaultCarrierFor(family: string): MetaCarrier {\n return FRONTMATTER_META_FAMILIES.has(family) ? \"frontmatter\" : \"comment\";\n}\n","import type { ArrowHead, EdgePattern } from \"../types.js\";\n\n/**\n * Flowchart link syntax.\n *\n * Grammar (informal):\n *\n * link := [edgeId '@'] (plainLink | textLink) [ '|' label '|' ]\n * plainLink := [head] body [head]\n * textLink := [head] open ws label ws close [head]\n * body := '--'+ | '=='+ | '-' '.'+ '-' | '~~~'+\n * head := '>' | 'x' | 'o' | '<' (start only)\n *\n * @module\n */\n\nexport interface ParsedLink {\n /** User-defined edge id (`A e1@--> B`). */\n id?: string;\n pattern: EdgePattern;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n length: number;\n label?: string;\n /** How the label was written, so regeneration keeps the author's style. */\n labelStyle?: \"inline\" | \"pipe\";\n /** Characters consumed from the input. */\n consumed: number;\n raw: string;\n}\n\nconst START_HEADS: Record<string, ArrowHead> = {\n \"<\": \"arrow_point\",\n x: \"arrow_cross\",\n o: \"arrow_circle\",\n};\nconst END_HEADS: Record<string, ArrowHead> = {\n \">\": \"arrow_point\",\n x: \"arrow_cross\",\n o: \"arrow_circle\",\n};\n\nconst EDGE_ID = /^([A-Za-z0-9_À--]+)@(?=[<xo]?[-=~.])/;\n// Head + body + head. Dotted body is `-` dots `-`.\nconst PLAIN = /^([<xo](?=[-=~]))?(-{2,}|={2,}|-\\.+-|~{3,})([>xo])?/;\n// Text link opener: `--`, `-.` or `==` followed by whitespace then label.\nconst TEXT_OPEN = /^([<xo](?=[-=]))?(--|-\\.|==)(?=\\s)/;\n// Text link closer, searched after the label.\nconst TEXT_CLOSE = /\\s+(-{2,}|\\.+-|={2,})([>xo])?(?=$|\\s|\\||[A-Za-z0-9_À-([{>\"`&])/;\n\nfunction patternOf(body: string): EdgePattern {\n if (body.startsWith(\"~\")) return \"invisible\";\n if (body.startsWith(\"=\")) return \"thick\";\n if (body.includes(\".\")) return \"dotted\";\n return \"solid\";\n}\n\nfunction lengthOf(body: string, hasEndHead: boolean): number {\n if (body.startsWith(\"~\")) return Math.max(1, body.length - 2);\n if (body.includes(\".\")) return Math.max(1, (body.match(/\\./g) ?? []).length);\n // solid / thick\n return Math.max(1, body.length - (hasEndHead ? 1 : 2));\n}\n\n/** Length of a text-link closer (`-->` is 1, `--->` is 2, `.->` is 1, `..->` 2). */\nfunction closerLength(closer: string, hasEndHead: boolean): number {\n if (closer.includes(\".\")) return Math.max(1, (closer.match(/\\./g) ?? []).length);\n return Math.max(1, closer.length - (hasEndHead ? 1 : 2));\n}\n\n/**\n * Attempts to parse a link at the start of `input`. Returns `null` when the\n * input does not begin with a link.\n */\nexport function parseLink(input: string): ParsedLink | null {\n let pos = 0;\n let id: string | undefined;\n const idm = EDGE_ID.exec(input);\n if (idm) {\n id = idm[1]!;\n pos += idm[0].length;\n }\n const rest = input.slice(pos);\n\n // Text link first: `-- label -->`\n const tm = TEXT_OPEN.exec(rest);\n if (tm) {\n const afterOpen = rest.slice(tm[0].length);\n const cm = TEXT_CLOSE.exec(afterOpen);\n if (cm && cm.index > 0) {\n const label = afterOpen.slice(0, cm.index).trim();\n // Label must not start with a link char (that would be a plain link).\n if (label && !/^[-=.>|]/.test(label)) {\n const closer = cm[1]!;\n const endHead = cm[2];\n const consumed = pos + tm[0].length + cm.index + cm[0].length;\n const body = tm[2]!;\n const result: ParsedLink = {\n id,\n pattern: patternOf(body === \"-.\" ? \"-.-\" : body),\n arrowStart: tm[1] ? START_HEADS[tm[1]]! : \"none\",\n arrowEnd: endHead ? END_HEADS[endHead]! : \"none\",\n length: closerLength(closer, !!endHead),\n label: unquoteLabel(label),\n labelStyle: \"inline\",\n consumed,\n raw: input.slice(0, consumed),\n };\n return withPipeLabel(input, result);\n }\n }\n }\n\n const pm = PLAIN.exec(rest);\n if (!pm) return null;\n const body = pm[2]!;\n const endHead = pm[3];\n const consumed = pos + pm[0].length;\n const result: ParsedLink = {\n id,\n pattern: patternOf(body),\n arrowStart: pm[1] ? START_HEADS[pm[1]]! : \"none\",\n arrowEnd: endHead ? END_HEADS[endHead]! : \"none\",\n length: lengthOf(body, !!endHead),\n consumed,\n raw: input.slice(0, consumed),\n };\n return withPipeLabel(input, result);\n}\n\n/** Consumes an optional `|label|` after the link token. */\nfunction withPipeLabel(input: string, link: ParsedLink): ParsedLink {\n const after = input.slice(link.consumed);\n // A quoted label may contain `|` (Mermaid accepts it, and `quoteLabelIfNeeded`\n // writes it), so try the quoted form before stopping at the first pipe.\n const m = /^\\s*\\|(\\s*\"[^\"]*\"\\s*)\\|/.exec(after) ?? /^\\s*\\|([^|]*)\\|/.exec(after);\n if (!m) return link;\n const consumed = link.consumed + m[0].length;\n return {\n ...link,\n label: unquoteLabel(m[1]!.trim()),\n labelStyle: link.label ? link.labelStyle : \"pipe\",\n consumed,\n raw: input.slice(0, consumed),\n };\n}\n\nexport function unquoteLabel(text: string): string {\n const t = text.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\n/** Characters that force a label to be quoted in Mermaid. */\nconst NEEDS_QUOTE = /[[\\]{}()|<>\"#;&%]|^\\s|\\s$|^-|^=|^\\./;\n\nexport function quoteLabelIfNeeded(label: string): string {\n if (label === \"\") return '\"\"';\n if (label.startsWith(\"`\") && label.endsWith(\"`\")) return `\"${label}\"`;\n if (NEEDS_QUOTE.test(label)) {\n return `\"${label.replace(/\"/g, \"#quot;\")}\"`;\n }\n return label;\n}\n\nconst START_CHAR: Partial<Record<ArrowHead, string>> = {\n arrow_point: \"<\",\n arrow_cross: \"x\",\n arrow_circle: \"o\",\n};\nconst END_CHAR: Partial<Record<ArrowHead, string>> = {\n arrow_point: \">\",\n arrow_cross: \"x\",\n arrow_circle: \"o\",\n};\n\nexport interface LinkSpec {\n id?: string;\n pattern: EdgePattern;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n length: number;\n label?: string;\n labelStyle?: \"inline\" | \"pipe\";\n}\n\n/** Serialises a link back to Mermaid syntax. */\nexport function formatLink(spec: LinkSpec): string {\n const start = START_CHAR[spec.arrowStart] ?? \"\";\n const end = END_CHAR[spec.arrowEnd] ?? \"\";\n const len = Math.max(1, spec.length);\n const label = spec.label?.trim();\n\n const body = (closing: boolean): string => {\n switch (spec.pattern) {\n case \"invisible\":\n return \"~\".repeat(len + 2);\n case \"thick\":\n return \"=\".repeat(end ? len + 1 : len + 2);\n case \"dotted\":\n return closing ? `${\".\".repeat(len)}-` : `-${\".\".repeat(len)}-`;\n default:\n return \"-\".repeat(end ? len + 1 : len + 2);\n }\n };\n\n const prefix = spec.id ? `${spec.id}@` : \"\";\n\n if (label && spec.labelStyle === \"inline\" && spec.pattern !== \"invisible\") {\n const open = spec.pattern === \"thick\" ? \"==\" : spec.pattern === \"dotted\" ? \"-.\" : \"--\";\n return `${prefix}${start}${open} ${quoteLabelIfNeeded(label)} ${body(true)}${end}`;\n }\n const token = `${prefix}${start}${body(false)}${end}`;\n if (label) return `${token}|${quoteLabelIfNeeded(label)}|`;\n return token;\n}\n","/**\n * Flowchart shape vocabulary.\n *\n * Mermaid has two ways to express a shape: classic bracket syntax (`A[text]`)\n * and the `@{ shape: … }` data syntax introduced in v11. the diagram module normalises\n * both to the *short name* used by the data syntax (`rect`, `diam`, `cyl`…),\n * which is also what Mermaid's `getData()` reports for data-syntax nodes.\n *\n * @module\n */\n\nexport interface BracketForm {\n open: string;\n close: string;\n}\n\nexport interface ShapeDef {\n /** Canonical short name (what `@{ shape: … }` expects). */\n name: string;\n /** Human-readable name for UIs. */\n title: string;\n /** Alternative names accepted by Mermaid's data syntax. */\n aliases: string[];\n /** Classic bracket syntax when one exists. */\n bracket?: BracketForm;\n /** Broad visual category, handy for toolbars. */\n category: \"basic\" | \"process\" | \"data\" | \"control\" | \"misc\";\n}\n\nexport const FLOWCHART_SHAPES: ShapeDef[] = [\n {\n name: \"rect\",\n title: \"Rectangle\",\n aliases: [\"rectangle\", \"proc\", \"process\", \"squareRect\", \"square\"],\n bracket: { open: \"[\", close: \"]\" },\n category: \"basic\",\n },\n {\n name: \"rounded\",\n title: \"Rounded rectangle\",\n aliases: [\"rounded-rectangle\", \"event\", \"roundedRect\", \"round\"],\n bracket: { open: \"(\", close: \")\" },\n category: \"basic\",\n },\n {\n name: \"stadium\",\n title: \"Stadium\",\n aliases: [\"pill\", \"terminal\"],\n bracket: { open: \"([\", close: \"])\" },\n category: \"basic\",\n },\n {\n name: \"subproc\",\n title: \"Subprocess\",\n aliases: [\"subprocess\", \"subroutine\", \"framed-rectangle\", \"fr-rect\"],\n bracket: { open: \"[[\", close: \"]]\" },\n category: \"process\",\n },\n {\n name: \"cyl\",\n title: \"Cylinder (database)\",\n aliases: [\"cylinder\", \"database\", \"db\"],\n bracket: { open: \"[(\", close: \")]\" },\n category: \"data\",\n },\n {\n name: \"circle\",\n title: \"Circle\",\n aliases: [\"circ\"],\n bracket: { open: \"((\", close: \"))\" },\n category: \"basic\",\n },\n {\n name: \"odd\",\n title: \"Asymmetric\",\n aliases: [\"asymmetric\", \"rect_left_inv_arrow\"],\n bracket: { open: \">\", close: \"]\" },\n category: \"misc\",\n },\n {\n name: \"diam\",\n title: \"Diamond (decision)\",\n aliases: [\"diamond\", \"decision\", \"question\"],\n bracket: { open: \"{\", close: \"}\" },\n category: \"control\",\n },\n {\n name: \"hex\",\n title: \"Hexagon (prepare)\",\n aliases: [\"hexagon\", \"prepare\"],\n bracket: { open: \"{{\", close: \"}}\" },\n category: \"process\",\n },\n {\n name: \"lean-r\",\n title: \"Parallelogram (lean right)\",\n aliases: [\"lean-right\", \"in-out\", \"lean_right\"],\n bracket: { open: \"[/\", close: \"/]\" },\n category: \"data\",\n },\n {\n name: \"lean-l\",\n title: \"Parallelogram (lean left)\",\n aliases: [\"lean-left\", \"out-in\", \"lean_left\"],\n bracket: { open: \"[\\\\\", close: \"\\\\]\" },\n category: \"data\",\n },\n {\n name: \"trap-b\",\n title: \"Trapezoid (base bottom)\",\n aliases: [\"trapezoid-bottom\", \"priority\", \"trapezoid\"],\n bracket: { open: \"[/\", close: \"\\\\]\" },\n category: \"process\",\n },\n {\n name: \"trap-t\",\n title: \"Trapezoid (base top)\",\n aliases: [\"trapezoid-top\", \"manual\", \"inv_trapezoid\"],\n bracket: { open: \"[\\\\\", close: \"/]\" },\n category: \"process\",\n },\n {\n name: \"dbl-circ\",\n title: \"Double circle\",\n aliases: [\"double-circle\", \"doublecircle\"],\n bracket: { open: \"(((\", close: \")))\" },\n category: \"basic\",\n },\n // Data-syntax-only shapes\n { name: \"text\", title: \"Text\", aliases: [], category: \"misc\" },\n {\n name: \"card\",\n title: \"Card (notched rectangle)\",\n aliases: [\"notched-rectangle\", \"notch-rect\"],\n category: \"misc\",\n },\n {\n name: \"lin-rect\",\n title: \"Lined rectangle (shaded process)\",\n aliases: [\"lined-rectangle\", \"lin-proc\", \"lined-process\", \"shaded-process\"],\n category: \"process\",\n },\n {\n name: \"sm-circ\",\n title: \"Small circle (start)\",\n aliases: [\"small-circle\", \"start\"],\n category: \"control\",\n },\n {\n name: \"fr-circ\",\n title: \"Framed circle (stop)\",\n aliases: [\"framed-circle\", \"stop\"],\n category: \"control\",\n },\n { name: \"fork\", title: \"Fork / join\", aliases: [\"join\"], category: \"control\" },\n { name: \"hourglass\", title: \"Hourglass (collate)\", aliases: [\"collate\"], category: \"process\" },\n {\n name: \"brace\",\n title: \"Comment (left brace)\",\n aliases: [\"brace-l\", \"comment\"],\n category: \"misc\",\n },\n { name: \"brace-r\", title: \"Comment (right brace)\", aliases: [], category: \"misc\" },\n { name: \"braces\", title: \"Comment (both braces)\", aliases: [], category: \"misc\" },\n {\n name: \"bolt\",\n title: \"Lightning bolt (com link)\",\n aliases: [\"com-link\", \"lightning-bolt\"],\n category: \"misc\",\n },\n { name: \"doc\", title: \"Document\", aliases: [\"document\"], category: \"data\" },\n {\n name: \"delay\",\n title: \"Delay (half-rounded rectangle)\",\n aliases: [\"half-rounded-rectangle\"],\n category: \"process\",\n },\n {\n name: \"h-cyl\",\n title: \"Horizontal cylinder (direct access)\",\n aliases: [\"das\", \"horizontal-cylinder\"],\n category: \"data\",\n },\n {\n name: \"lin-cyl\",\n title: \"Lined cylinder (disk storage)\",\n aliases: [\"disk\", \"lined-cylinder\"],\n category: \"data\",\n },\n {\n name: \"curv-trap\",\n title: \"Curved trapezoid (display)\",\n aliases: [\"curved-trapezoid\", \"display\"],\n category: \"misc\",\n },\n {\n name: \"div-rect\",\n title: \"Divided rectangle\",\n aliases: [\"div-proc\", \"divided-process\", \"divided-rectangle\"],\n category: \"process\",\n },\n {\n name: \"tri\",\n title: \"Triangle (extract)\",\n aliases: [\"extract\", \"triangle\"],\n category: \"process\",\n },\n {\n name: \"win-pane\",\n title: \"Window pane (internal storage)\",\n aliases: [\"internal-storage\", \"window-pane\"],\n category: \"data\",\n },\n {\n name: \"f-circ\",\n title: \"Filled circle (junction)\",\n aliases: [\"filled-circle\", \"junction\"],\n category: \"control\",\n },\n { name: \"lin-doc\", title: \"Lined document\", aliases: [\"lined-document\"], category: \"data\" },\n { name: \"notch-rect\", title: \"Notched rectangle (card)\", aliases: [], category: \"misc\" },\n { name: \"flag\", title: \"Flag (paper tape)\", aliases: [\"paper-tape\"], category: \"data\" },\n {\n name: \"docs\",\n title: \"Stacked documents\",\n aliases: [\"documents\", \"st-doc\", \"stacked-document\"],\n category: \"data\",\n },\n {\n name: \"st-rect\",\n title: \"Stacked rectangles\",\n aliases: [\"processes\", \"procs\", \"stacked-rectangle\"],\n category: \"process\",\n },\n {\n name: \"bow-rect\",\n title: \"Bow-tie rectangle (stored data)\",\n aliases: [\"bow-tie-rectangle\", \"stored-data\"],\n category: \"data\",\n },\n {\n name: \"cross-circ\",\n title: \"Crossed circle (summary)\",\n aliases: [\"crossed-circle\", \"summary\"],\n category: \"process\",\n },\n { name: \"tag-doc\", title: \"Tagged document\", aliases: [\"tagged-document\"], category: \"data\" },\n {\n name: \"tag-rect\",\n title: \"Tagged rectangle\",\n aliases: [\"tag-proc\", \"tagged-process\", \"tagged-rectangle\"],\n category: \"process\",\n },\n {\n name: \"notch-pent\",\n title: \"Notched pentagon (loop limit)\",\n aliases: [\"loop-limit\", \"notched-pentagon\"],\n category: \"control\",\n },\n {\n name: \"flip-tri\",\n title: \"Flipped triangle (manual file)\",\n aliases: [\"flipped-triangle\", \"manual-file\"],\n category: \"data\",\n },\n {\n name: \"sl-rect\",\n title: \"Sloped rectangle (manual input)\",\n aliases: [\"manual-input\", \"sloped-rectangle\"],\n category: \"data\",\n },\n { name: \"icon\", title: \"Icon\", aliases: [], category: \"misc\" },\n { name: \"image\", title: \"Image\", aliases: [\"img\"], category: \"misc\" },\n { name: \"anchor\", title: \"Anchor (invisible)\", aliases: [], category: \"misc\" },\n];\n\nconst BY_NAME = new Map<string, ShapeDef>();\nfor (const def of FLOWCHART_SHAPES) {\n BY_NAME.set(def.name, def);\n for (const alias of def.aliases) BY_NAME.set(alias, def);\n}\n\n/** Resolves any accepted shape name/alias (or Mermaid `getData()` id) to its definition. */\nexport function resolveShape(name: string | undefined): ShapeDef | undefined {\n if (!name) return undefined;\n return BY_NAME.get(name) ?? BY_NAME.get(name.toLowerCase());\n}\n\n/** Canonical short name for any alias; unknown names pass through unchanged. */\nexport function canonicalShape(name: string | undefined): string {\n if (!name) return \"rect\";\n return resolveShape(name)?.name ?? name;\n}\n\n/**\n * Bracket openers ordered longest-first so that greedy matching finds\n * `(((` before `((` before `(`.\n */\nexport const BRACKET_OPENERS: string[] = Array.from(\n new Set(FLOWCHART_SHAPES.filter((s) => s.bracket).map((s) => s.bracket!.open)),\n).sort((a, b) => b.length - a.length);\n\n/** Closers that can follow a given opener (e.g. `[/` may close with `/]` or `\\]`). */\nexport function closersFor(open: string): string[] {\n return FLOWCHART_SHAPES.filter((s) => s.bracket?.open === open)\n .map((s) => s.bracket!.close)\n .sort((a, b) => b.length - a.length);\n}\n\nexport function shapeForBracket(open: string, close: string): ShapeDef | undefined {\n return FLOWCHART_SHAPES.find((s) => s.bracket?.open === open && s.bracket.close === close);\n}\n\n/** Default label Mermaid shows for a node declared without text: the id itself. */\nexport const DEFAULT_SHAPE = \"rect\";\n","import type { ArrowHead, EdgePattern } from \"../types.js\";\nimport { parseLink, quoteLabelIfNeeded, unquoteLabel, formatLink } from \"./edges.js\";\nimport {\n BRACKET_OPENERS,\n closersFor,\n shapeForBracket,\n canonicalShape,\n resolveShape,\n} from \"./shapes.js\";\n\n/**\n * Statement-level model of a flowchart body. Every line of the source maps\n * to exactly one statement (multi-line `@{ … }` blocks and `;`-joined\n * statements are normalised during tokenisation). Statements remember their\n * raw text and are re-emitted verbatim unless marked `dirty`.\n *\n * @module\n */\n\nexport interface NodeRef {\n id: string;\n /** Shape when declared on this occurrence (bracket or data syntax). */\n shape?: string;\n /** How the shape was expressed: classic brackets or `@{ … }`. */\n form?: \"bracket\" | \"data\";\n label?: string;\n labelQuoted?: boolean;\n /** Parsed `@{ … }` entries (shape/label removed). Values keep their raw text. */\n data?: Record<string, string>;\n classes: string[];\n}\n\nexport interface LinkRef {\n id?: string;\n pattern: EdgePattern;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n length: number;\n label?: string;\n labelStyle?: \"inline\" | \"pipe\";\n}\n\nexport interface Chain {\n /** `groups[i]` are the nodes joined by `&`; `links[i]` connects group i → i+1. */\n groups: NodeRef[][];\n links: LinkRef[];\n}\n\nexport type FlowStatement =\n | { kind: \"raw\"; raw: string }\n | { kind: \"chain\"; raw: string; indent: string; chain: Chain; dirty?: boolean }\n | {\n kind: \"subgraph\";\n raw: string;\n indent: string;\n id: string;\n title?: string;\n /** `subgraph id [title]` vs `subgraph \"title\"` */\n titleForm: \"bracket\" | \"bare\" | \"none\";\n dirty?: boolean;\n }\n | { kind: \"end\"; raw: string; indent: string }\n | { kind: \"direction\"; raw: string; indent: string; direction: string; dirty?: boolean }\n | {\n kind: \"classDef\";\n raw: string;\n indent: string;\n names: string[];\n styles: string[];\n dirty?: boolean;\n }\n | {\n kind: \"class\";\n raw: string;\n indent: string;\n ids: string[];\n className: string;\n dirty?: boolean;\n }\n | { kind: \"style\"; raw: string; indent: string; id: string; styles: string[]; dirty?: boolean }\n | {\n kind: \"linkStyle\";\n raw: string;\n indent: string;\n targets: number[] | \"default\";\n styles: string[];\n dirty?: boolean;\n }\n | { kind: \"click\"; raw: string; indent: string; id: string; rest: string; dirty?: boolean };\n\n// ---------------------------------------------------------------------------\n// Tokenisation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Mermaid's NODE_STRING: letters, digits and a generous set of punctuation,\n * plus `-` when not followed by `>`, `-` or `.`, and `=` when not followed by `=`.\n */\nfunction readId(input: string, pos: number): string {\n let i = pos;\n while (i < input.length) {\n const ch = input[i]!;\n const next = input[i + 1];\n if (/[A-Za-z0-9_À-!#$%*+?/\\\\'`]/.test(ch)) {\n i++;\n continue;\n }\n if (ch === \".\" && next !== \"-\") {\n i++;\n continue;\n }\n if (\n ch === \"-\" &&\n next !== \">\" &&\n next !== \"-\" &&\n next !== \".\" &&\n next !== undefined &&\n !/\\s/.test(next)\n ) {\n i++;\n continue;\n }\n if (ch === \"=\" && next !== \"=\") {\n i++;\n continue;\n }\n break;\n }\n return input.slice(pos, i);\n}\n\n/** Finds the first occurrence of any closer outside double quotes. */\nfunction findCloser(\n input: string,\n pos: number,\n closers: string[],\n): { index: number; closer: string } | null {\n let quote: string | null = null;\n for (let i = pos; i < input.length; i++) {\n const ch = input[i]!;\n if (quote) {\n if (ch === quote) quote = null;\n continue;\n }\n if (ch === '\"') {\n quote = ch;\n continue;\n }\n for (const closer of closers) {\n if (input.startsWith(closer, i)) return { index: i, closer };\n }\n }\n return null;\n}\n\n/** Reads a balanced `{ … }` block starting at `pos` (which must be `{`). */\nfunction readBraceBlock(input: string, pos: number): number {\n let depth = 0;\n let quote: string | null = null;\n for (let i = pos; i < input.length; i++) {\n const ch = input[i]!;\n if (quote) {\n if (ch === quote) quote = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n continue;\n }\n if (ch === \"{\") depth++;\n else if (ch === \"}\") {\n depth--;\n if (depth === 0) return i + 1;\n }\n }\n return -1;\n}\n\n/** Parses the inside of `@{ … }` into key → raw value. */\nexport function parseShapeData(inner: string): Record<string, string> {\n const out: Record<string, string> = {};\n // Split on commas/newlines outside quotes.\n const parts: string[] = [];\n let cur = \"\";\n let quote: string | null = null;\n for (const ch of inner) {\n if (quote) {\n cur += ch;\n if (ch === quote) quote = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quote = ch;\n cur += ch;\n continue;\n }\n if (ch === \",\" || ch === \"\\n\") {\n parts.push(cur);\n cur = \"\";\n continue;\n }\n cur += ch;\n }\n parts.push(cur);\n for (const part of parts) {\n const m = /^\\s*([A-Za-z_][\\w-]*)\\s*:\\s*([\\s\\S]*?)\\s*$/.exec(part);\n if (m) out[m[1]!] = m[2]!;\n }\n return out;\n}\n\nfunction unquoteData(value: string | undefined): string | undefined {\n if (value === undefined) return undefined;\n const t = value.trim();\n if ((t.startsWith('\"') && t.endsWith('\"')) || (t.startsWith(\"'\") && t.endsWith(\"'\"))) {\n return t.slice(1, -1);\n }\n return t;\n}\n\nexport function formatShapeData(data: Record<string, string>): string {\n const entries = Object.entries(data).map(([k, v]) => `${k}: ${v}`);\n return `@{ ${entries.join(\", \")} }`;\n}\n\n/**\n * Parses one node reference at `pos`. Returns `null` when no id is present.\n */\nfunction readNode(input: string, pos: number): { node: NodeRef; end: number } | null {\n const id = readId(input, pos);\n if (!id) return null;\n let i = pos + id.length;\n const node: NodeRef = { id, classes: [] };\n\n // Data syntax: id@{ ... }\n if (input[i] === \"@\" && input[i + 1] === \"{\") {\n const end = readBraceBlock(input, i + 1);\n if (end !== -1) {\n const inner = input.slice(i + 2, end - 1);\n const data = parseShapeData(inner);\n node.form = \"data\";\n if (data.shape !== undefined) {\n node.shape = canonicalShape(unquoteData(data.shape));\n delete data.shape;\n }\n if (data.label !== undefined) {\n node.label = unquoteData(data.label);\n node.labelQuoted = /^\\s*[\"']/.test(data.label);\n delete data.label;\n }\n // Mermaid draws a node with `img` as an image and one with `icon` as an\n // icon, whatever its `shape` says.\n if (\"img\" in data) node.shape = \"image\";\n else if (\"icon\" in data && node.shape === undefined) node.shape = \"icon\";\n node.data = data;\n i = end;\n }\n } else {\n // Bracket syntax\n for (const open of BRACKET_OPENERS) {\n if (!input.startsWith(open, i)) continue;\n const closers = closersFor(open);\n const found = findCloser(input, i + open.length, closers);\n if (!found) break;\n const shapeDef = shapeForBracket(open, found.closer);\n if (!shapeDef) break;\n const rawLabel = input.slice(i + open.length, found.index);\n node.shape = shapeDef.name;\n node.form = \"bracket\";\n node.label = unquoteLabel(rawLabel);\n node.labelQuoted = rawLabel.trim().startsWith('\"');\n i = found.index + found.closer.length;\n break;\n }\n }\n\n // :::class (repeatable)\n while (input.startsWith(\":::\", i)) {\n const cls = readId(input, i + 3);\n if (!cls) break;\n node.classes.push(cls);\n i += 3 + cls.length;\n }\n return { node, end: i };\n}\n\nfunction skipWs(input: string, pos: number): number {\n let i = pos;\n while (i < input.length && /\\s/.test(input[i]!)) i++;\n return i;\n}\n\n/**\n * Parses a chain statement (`A[x] --> B & C -- t --> D:::k`).\n * Returns `null` if the text is not a chain.\n */\nexport function parseChain(text: string): Chain | null {\n const groups: NodeRef[][] = [];\n const links: LinkRef[] = [];\n let pos = skipWs(text, 0);\n let group: NodeRef[] = [];\n\n const first = readNode(text, pos);\n if (!first) return null;\n group.push(first.node);\n pos = skipWs(text, first.end);\n\n while (pos < text.length) {\n if (text[pos] === \"&\") {\n pos = skipWs(text, pos + 1);\n const n = readNode(text, pos);\n if (!n) return null;\n group.push(n.node);\n pos = skipWs(text, n.end);\n continue;\n }\n const link = parseLink(text.slice(pos));\n if (link) {\n groups.push(group);\n group = [];\n links.push({\n id: link.id,\n pattern: link.pattern,\n arrowStart: link.arrowStart,\n arrowEnd: link.arrowEnd,\n length: link.length,\n label: link.label,\n labelStyle: link.labelStyle,\n });\n pos = skipWs(text, pos + link.consumed);\n const n = readNode(text, pos);\n if (!n) return null;\n group.push(n.node);\n pos = skipWs(text, n.end);\n continue;\n }\n return null; // trailing garbage\n }\n groups.push(group);\n return { groups, links };\n}\n\n// ---------------------------------------------------------------------------\n// Statement classification\n// ---------------------------------------------------------------------------\n\nfunction splitStyles(text: string): string[] {\n return text\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean);\n}\n\n/** Classifies a single logical statement line. */\nexport function parseStatement(line: string): FlowStatement {\n const indent = line.match(/^\\s*/)![0];\n const text = line.trim();\n if (text === \"\" || text.startsWith(\"%%\")) return { kind: \"raw\", raw: line };\n\n let m: RegExpExecArray | null;\n\n if (/^end\\s*$/i.test(text)) return { kind: \"end\", raw: line, indent };\n\n if ((m = /^direction\\s+(TB|TD|BT|LR|RL)\\s*$/i.exec(text))) {\n return { kind: \"direction\", raw: line, indent, direction: m[1]!.toUpperCase() };\n }\n\n if ((m = /^subgraph\\s+(.*)$/i.exec(text))) {\n const rest = m[1]!.trim();\n let sm: RegExpExecArray | null;\n if ((sm = /^([^\\s[\"]+)\\s*\\[(.*)\\]\\s*$/.exec(rest))) {\n return {\n kind: \"subgraph\",\n raw: line,\n indent,\n id: sm[1]!,\n title: unquoteLabel(sm[2]!),\n titleForm: \"bracket\",\n };\n }\n if ((sm = /^\"(.*)\"\\s*$/.exec(rest))) {\n return { kind: \"subgraph\", raw: line, indent, id: sm[1]!, title: sm[1]!, titleForm: \"bare\" };\n }\n if (/\\s/.test(rest)) {\n // `subgraph My Title` — id is the title text, as Mermaid does.\n return { kind: \"subgraph\", raw: line, indent, id: rest, title: rest, titleForm: \"bare\" };\n }\n return { kind: \"subgraph\", raw: line, indent, id: rest, titleForm: \"none\" };\n }\n\n if ((m = /^classDef\\s+([^\\s]+)\\s+(.*)$/.exec(text))) {\n return {\n kind: \"classDef\",\n raw: line,\n indent,\n names: m[1]!.split(\",\"),\n styles: splitStyles(m[2]!),\n };\n }\n\n if ((m = /^class\\s+([^\\s]+)\\s+([^\\s]+)\\s*$/.exec(text))) {\n return { kind: \"class\", raw: line, indent, ids: m[1]!.split(\",\"), className: m[2]! };\n }\n\n if ((m = /^style\\s+([^\\s]+)\\s+(.*)$/.exec(text))) {\n return { kind: \"style\", raw: line, indent, id: m[1]!, styles: splitStyles(m[2]!) };\n }\n\n if ((m = /^linkStyle\\s+(default|[\\d,\\s]+)\\s+(.*)$/.exec(text))) {\n const targets =\n m[1] === \"default\"\n ? (\"default\" as const)\n : m[1]!\n .split(\",\")\n .map((s) => Number.parseInt(s.trim(), 10))\n .filter((n) => !Number.isNaN(n));\n return { kind: \"linkStyle\", raw: line, indent, targets, styles: splitStyles(m[2]!) };\n }\n\n if ((m = /^click\\s+([^\\s]+)\\s+(.*)$/.exec(text))) {\n return { kind: \"click\", raw: line, indent, id: m[1]!, rest: m[2]! };\n }\n\n if (/^(accTitle|accDescr)\\b/.test(text) || /^title\\s/.test(text))\n return { kind: \"raw\", raw: line };\n\n const chain = parseChain(text);\n if (chain) return { kind: \"chain\", raw: line, indent, chain };\n\n return { kind: \"raw\", raw: line };\n}\n\n// ---------------------------------------------------------------------------\n// Serialisation\n// ---------------------------------------------------------------------------\n\nexport function formatNode(node: NodeRef): string {\n let out = node.id;\n const shape = node.shape ? resolveShape(node.shape) : undefined;\n const useData =\n node.form === \"data\" ||\n (node.shape && !shape?.bracket) ||\n (node.data && Object.keys(node.data).length);\n if (\n useData &&\n (node.shape || node.label !== undefined || (node.data && Object.keys(node.data).length))\n ) {\n const data: Record<string, string> = {};\n // Mermaid infers these shapes from `img` / `icon` (and has no `shape: image`).\n const implied =\n (node.shape === \"image\" && node.data && \"img\" in node.data) ||\n (node.shape === \"icon\" && node.data && \"icon\" in node.data);\n if (node.shape && !implied) data.shape = node.shape;\n if (node.label !== undefined) data.label = JSON.stringify(node.label);\n Object.assign(data, node.data ?? {});\n out += formatShapeData(data);\n } else if (\n shape?.bracket &&\n (node.label !== undefined || node.shape !== \"rect\" || node.form === \"bracket\")\n ) {\n const label = node.label ?? node.id;\n const text = node.labelQuoted\n ? `\"${label.replace(/\"/g, \"#quot;\")}\"`\n : quoteLabelIfNeeded(label);\n out += `${shape.bracket.open}${text}${shape.bracket.close}`;\n } else if (node.label !== undefined && node.label !== node.id) {\n out += `[${quoteLabelIfNeeded(node.label)}]`;\n }\n for (const cls of node.classes) out += `:::${cls}`;\n return out;\n}\n\nexport function formatChain(chain: Chain): string {\n const parts: string[] = [];\n chain.groups.forEach((group, i) => {\n parts.push(group.map(formatNode).join(\" & \"));\n const link = chain.links[i];\n if (link) parts.push(formatLink(link));\n });\n return parts.join(\" \");\n}\n\nexport function formatStatement(stmt: FlowStatement): string {\n if (stmt.kind === \"raw\" || stmt.kind === \"end\") return stmt.raw;\n if (!stmt.dirty) return stmt.raw;\n switch (stmt.kind) {\n case \"chain\":\n return stmt.indent + formatChain(stmt.chain);\n case \"subgraph\": {\n if (stmt.titleForm === \"none\" || stmt.title === undefined)\n return `${stmt.indent}subgraph ${stmt.id}`;\n if (stmt.titleForm === \"bare\")\n return `${stmt.indent}subgraph ${stmt.title.includes(\" \") || stmt.title !== stmt.id ? `\"${stmt.title}\"` : stmt.title}`;\n return `${stmt.indent}subgraph ${stmt.id} [${quoteLabelIfNeeded(stmt.title)}]`;\n }\n case \"direction\":\n return `${stmt.indent}direction ${stmt.direction}`;\n case \"classDef\":\n return `${stmt.indent}classDef ${stmt.names.join(\",\")} ${stmt.styles.join(\",\")}`;\n case \"class\":\n return `${stmt.indent}class ${stmt.ids.join(\",\")} ${stmt.className}`;\n case \"style\":\n return `${stmt.indent}style ${stmt.id} ${stmt.styles.join(\",\")}`;\n case \"linkStyle\":\n return `${stmt.indent}linkStyle ${stmt.targets === \"default\" ? \"default\" : stmt.targets.join(\",\")} ${stmt.styles.join(\",\")}`;\n case \"click\":\n return `${stmt.indent}click ${stmt.id} ${stmt.rest}`;\n }\n}\n\n/**\n * Joins physical lines into logical statements: a line with an unclosed\n * `@{` absorbs following lines until the block closes. Returns the logical\n * statements and, for each, how many physical lines it spans.\n */\nexport function joinLogicalLines(lines: string[]): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < lines.length) {\n let cur = lines[i]!;\n const at = cur.indexOf(\"@{\");\n if (at !== -1 && readBraceBlock(cur, at + 1) === -1) {\n let j = i + 1;\n while (j < lines.length) {\n cur += \"\\n\" + lines[j];\n j++;\n if (readBraceBlock(cur, at + 1) !== -1) break;\n }\n out.push(cur);\n i = j;\n continue;\n }\n out.push(cur);\n i++;\n }\n return out;\n}\n","import type {\n AdapterParseContext,\n Diagnostic,\n DiagramGraph,\n GraphEdge,\n GraphGroup,\n GraphNode,\n MermaidDocument,\n} from \"../types.js\";\nimport { splitStatements } from \"../source/lines.js\";\nimport { joinLogicalLines, parseStatement, type FlowStatement, type NodeRef } from \"./statements.js\";\nimport { DEFAULT_SHAPE } from \"./shapes.js\";\n\n/** Body model of a flowchart document. */\nexport interface FlowchartBody {\n statements: FlowStatement[];\n}\n\nexport type FlowchartDocument = MermaidDocument<FlowchartBody>;\n\n/** Mermaid's auto edge id scheme. */\nexport function autoEdgeId(source: string, target: string, ordinal: number): string {\n return `L_${source}_${target}_${ordinal}`;\n}\n\nconst HEADER_DIRECTION = /^\\s*(?:flowchart|graph)(?:-elk)?\\s*(TB|TD|BT|LR|RL)?\\s*;?\\s*$/i;\n\nexport function headerDirection(header: string): string {\n const m = HEADER_DIRECTION.exec(header);\n return (m?.[1] ?? \"TB\").toUpperCase();\n}\n\n/** Tokenises body lines into statements (one per logical line or `;` segment). */\nexport function tokenizeBody(bodyLines: string[]): FlowStatement[] {\n const statements: FlowStatement[] = [];\n for (const logical of joinLogicalLines(bodyLines)) {\n // `;` separated statements on one line are kept as separate statements\n // but we remember they shared a line through a trailing marker so the\n // serializer can join them back. Simpler: only split when it is unambiguous\n // (no `@{`), otherwise keep the whole line.\n if (logical.includes(\"@{\") || !logical.includes(\";\")) {\n statements.push(parseStatement(logical));\n continue;\n }\n const segments = splitStatements(logical);\n const nonEmpty = segments.filter((s) => s.trim() !== \"\");\n if (nonEmpty.length <= 1) {\n // A single statement, possibly with a trailing `;` — keep the line intact.\n const stmt = parseStatement(nonEmpty[0] ?? logical);\n stmt.raw = logical;\n statements.push(stmt);\n continue;\n }\n // Keep `;`-joined statements as one raw-ish compound: parse each segment\n // so the graph is right, but mark the group so re-emission stays on a line.\n const parsed = nonEmpty.map((seg, i) => parseStatement(i === 0 ? seg : seg.trimStart()));\n // Attach the original for lossless output when untouched.\n statements.push(...withCompoundMarker(parsed, logical));\n }\n return statements;\n}\n\n/**\n * Compound (`a; b`) handling: the first statement carries the full raw line\n * and the rest carry an empty raw so that serialising untouched output\n * reproduces the single line. When any member becomes dirty, each member is\n * emitted on its own line — a semantics-preserving normalisation.\n */\nconst COMPOUND = Symbol(\"compound\");\nexport interface CompoundMarked {\n [COMPOUND]?: { members: FlowStatement[]; raw: string };\n}\n\nfunction withCompoundMarker(parsed: FlowStatement[], raw: string): FlowStatement[] {\n parsed.forEach((stmt, i) => markCompound(stmt, parsed, i === 0 ? raw : \"\"));\n return parsed;\n}\n\n/** Attaches compound membership to a statement (used when cloning). */\nexport function markCompound(stmt: FlowStatement, members: FlowStatement[], raw: string): void {\n (stmt as CompoundMarked)[COMPOUND] = { members, raw };\n}\n\nexport function compoundInfo(\n stmt: FlowStatement,\n): { members: FlowStatement[]; raw: string } | undefined {\n return (stmt as CompoundMarked)[COMPOUND];\n}\n\n/**\n * Builds the normalised graph from statements. Follows Mermaid's rules:\n * a node belongs to the innermost subgraph in which it is mentioned; when it\n * is mentioned in several, the one declared last wins (Mermaid's `makeUniq`).\n */\nexport function buildGraph(\n statements: FlowStatement[],\n direction: string,\n title?: string,\n): {\n graph: DiagramGraph;\n diagnostics: Diagnostic[];\n} {\n const nodes = new Map<string, GraphNode>();\n const groups = new Map<string, GraphGroup>();\n const edges: GraphEdge[] = [];\n const classDefs: Record<string, string[]> = {};\n const diagnostics: Diagnostic[] = [];\n const stack: string[] = [];\n /** Mentions per subgraph, in declaration order. */\n const membership = new Map<string, Set<string>>();\n const classAssignments: { ids: string[]; className: string }[] = [];\n const styleAssignments: { id: string; styles: string[] }[] = [];\n const clicks: { id: string; rest: string }[] = [];\n const linkStyles: { targets: number[] | \"default\"; styles: string[] }[] = [];\n const dataOnly: { id: string; data: Record<string, string> }[] = [];\n let ordinal = 0;\n\n const touch = (ref: NodeRef): GraphNode => {\n let node = nodes.get(ref.id);\n if (!node) {\n node = { id: ref.id, label: ref.id, shape: DEFAULT_SHAPE, classes: [], styles: [] };\n nodes.set(ref.id, node);\n }\n if (ref.label !== undefined) node.label = ref.label;\n if (ref.shape) node.shape = ref.shape;\n for (const cls of ref.classes) if (!node.classes.includes(cls)) node.classes.push(cls);\n if (ref.data && Object.keys(ref.data).length) {\n node.data = { ...(node.data ?? {}), ...stripQuotes(ref.data) };\n }\n const current = stack[stack.length - 1];\n if (current) membership.get(current)!.add(ref.id);\n return node;\n };\n\n statements.forEach((stmt, index) => {\n switch (stmt.kind) {\n case \"subgraph\": {\n const parent = stack[stack.length - 1];\n if (groups.has(stmt.id)) {\n diagnostics.push({\n severity: \"warning\",\n message: `Duplicate subgraph id \"${stmt.id}\"`,\n line: index + 1,\n source: \"pixerate\",\n });\n }\n groups.set(stmt.id, {\n id: stmt.id,\n label: stmt.title ?? stmt.id,\n parentId: parent,\n classes: [],\n styles: [],\n });\n membership.set(stmt.id, new Set());\n if (parent) membership.get(parent)!.add(stmt.id);\n stack.push(stmt.id);\n break;\n }\n case \"end\":\n if (!stack.length) {\n diagnostics.push({\n severity: \"warning\",\n message: \"Stray `end` without a subgraph\",\n line: index + 1,\n source: \"pixerate\",\n });\n }\n stack.pop();\n break;\n case \"direction\": {\n const current = stack[stack.length - 1];\n if (current) groups.get(current)!.direction = stmt.direction;\n break;\n }\n case \"chain\": {\n const { groups: ngroups, links } = stmt.chain;\n // A lone `id@{ animate: true }` targets an edge, not a node — resolve later.\n if (ngroups.length === 1 && ngroups[0]!.length === 1 && links.length === 0) {\n const ref = ngroups[0]!;\n const only = ref[0]!;\n if (\n only.form === \"data\" &&\n only.data &&\n !only.shape &&\n only.label === undefined &&\n (\"animate\" in only.data || \"animation\" in only.data)\n ) {\n dataOnly.push({ id: only.id, data: only.data });\n break;\n }\n }\n for (const group of ngroups) for (const ref of group) touch(ref);\n links.forEach((link, i) => {\n const from = ngroups[i]!;\n const to = ngroups[i + 1]!;\n for (const s of from) {\n for (const t of to) {\n const id = link.id ?? autoEdgeId(s.id, t.id, ordinal);\n edges.push({\n id,\n source: s.id,\n target: t.id,\n label: link.label,\n pattern: link.pattern,\n arrowStart: link.arrowStart,\n arrowEnd: link.arrowEnd,\n length: link.length,\n classes: [],\n styles: [],\n userDefinedId: !!link.id,\n });\n ordinal++;\n }\n }\n });\n break;\n }\n case \"classDef\":\n for (const name of stmt.names) classDefs[name] = [...stmt.styles];\n break;\n case \"class\":\n classAssignments.push({ ids: stmt.ids, className: stmt.className });\n break;\n case \"style\":\n styleAssignments.push({ id: stmt.id, styles: stmt.styles });\n break;\n case \"linkStyle\":\n linkStyles.push({ targets: stmt.targets, styles: stmt.styles });\n break;\n case \"click\":\n clicks.push({ id: stmt.id, rest: stmt.rest });\n break;\n default:\n break;\n }\n });\n\n if (stack.length) {\n diagnostics.push({\n severity: \"warning\",\n message: `${stack.length} subgraph(s) missing \\`end\\``,\n source: \"pixerate\",\n });\n }\n\n // Resolve group membership: last mention wins.\n const parentOf = new Map<string, string>();\n for (const [groupId, members] of membership) {\n for (const member of members) parentOf.set(member, groupId);\n }\n for (const node of nodes.values()) {\n const parent = parentOf.get(node.id);\n if (parent && groups.has(parent)) node.parentId = parent;\n }\n for (const group of groups.values()) {\n const parent = parentOf.get(group.id);\n if (parent && parent !== group.id && groups.has(parent)) group.parentId = parent;\n }\n\n for (const { ids, className } of classAssignments) {\n for (const id of ids) {\n const node = nodes.get(id);\n const group = groups.get(id);\n const target = node ?? group;\n if (target && !target.classes.includes(className)) target.classes.push(className);\n }\n }\n for (const { id, styles } of styleAssignments) {\n const target = nodes.get(id) ?? groups.get(id);\n if (target) target.styles.push(...styles);\n }\n for (const { id, rest } of clicks) {\n const node = nodes.get(id);\n if (!node) continue;\n const parsed = parseClick(rest);\n if (parsed.href) {\n node.link = parsed.href;\n node.linkTarget = parsed.target;\n }\n if (parsed.tooltip) node.tooltip = parsed.tooltip;\n if (parsed.callback) node.data = { ...(node.data ?? {}), callback: parsed.callback };\n }\n for (const { targets, styles } of linkStyles) {\n if (targets === \"default\") {\n for (const edge of edges) edge.styles.push(...styles);\n } else {\n for (const idx of targets) {\n const edge = edges[idx];\n if (edge) edge.styles.push(...styles);\n else\n diagnostics.push({\n severity: \"warning\",\n message: `linkStyle index ${idx} has no edge`,\n source: \"pixerate\",\n });\n }\n }\n }\n for (const { id, data } of dataOnly) {\n const edge = edges.find((e) => e.id === id);\n if (edge) {\n if (data.animate !== undefined) edge.animate = data.animate.trim() === \"true\";\n if (data.animation !== undefined) {\n const a = data.animation.trim();\n if (a === \"fast\" || a === \"slow\") edge.animation = a;\n }\n } else {\n // Not an edge after all: treat as a node with data.\n const node: GraphNode = {\n id,\n label: id,\n shape: DEFAULT_SHAPE,\n classes: [],\n styles: [],\n data: stripQuotes(data),\n };\n nodes.set(id, node);\n }\n }\n\n return {\n graph: {\n direction,\n nodes: [...nodes.values()],\n edges,\n groups: [...groups.values()],\n classDefs,\n title,\n },\n diagnostics,\n };\n}\n\nfunction stripQuotes(data: Record<string, string>): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data)) {\n const t = v.trim();\n if ((t.startsWith('\"') && t.endsWith('\"')) || (t.startsWith(\"'\") && t.endsWith(\"'\")))\n out[k] = t.slice(1, -1);\n else if (t === \"true\" || t === \"false\") out[k] = t === \"true\";\n else if (/^-?\\d+(\\.\\d+)?$/.test(t)) out[k] = Number(t);\n else out[k] = t;\n }\n return out;\n}\n\nexport interface ParsedClick {\n href?: string;\n target?: string;\n tooltip?: string;\n callback?: string;\n}\n\n/** Parses the tail of a `click` statement. */\nexport function parseClick(rest: string): ParsedClick {\n const out: ParsedClick = {};\n const strings = [...rest.matchAll(/\"([^\"]*)\"/g)].map((m) => m[1]!);\n const words = rest\n .replace(/\"[^\"]*\"/g, \"\")\n .trim()\n .split(/\\s+/)\n .filter(Boolean);\n const targetWord = words.find((w) => /^_(blank|self|parent|top)$/.test(w));\n if (targetWord) out.target = targetWord;\n if (words[0] === \"href\") {\n out.href = strings[0];\n out.tooltip = strings[1];\n } else if (words[0] === \"call\" || words[0] === \"callback\") {\n out.callback =\n words[0] === \"callback\"\n ? words[1]\n : rest\n .replace(/^call\\s+/, \"\")\n .replace(/\"[^\"]*\"/g, \"\")\n .trim();\n out.tooltip = strings[0];\n } else if (strings.length && /^https?:|^\\/|^#|^mailto:/.test(strings[0]!)) {\n out.href = strings[0];\n out.tooltip = strings[1];\n } else if (words.length) {\n out.callback = words[0];\n out.tooltip = strings[0];\n }\n return out;\n}\n\n/** Parses a flowchart body into a document. */\nexport function parseFlowchart(_source: string, ctx: AdapterParseContext): FlowchartDocument {\n const statements = tokenizeBody(ctx.bodyLines);\n const direction = headerDirection(ctx.header);\n const title =\n typeof ctx.preamble.frontmatter?.title === \"string\"\n ? ctx.preamble.frontmatter.title\n : undefined;\n const { graph, diagnostics } = buildGraph(statements, direction, title);\n return {\n family: \"flowchart\",\n tier: \"editable\",\n source: ctx.source,\n preamble: ctx.preamble,\n header: ctx.header,\n trailing: ctx.trailing,\n eol: ctx.eol,\n graph,\n meta: ctx.meta,\n metaCarrier: ctx.metaCarrier,\n body: { statements },\n diagnostics,\n dirty: false,\n };\n}\n","import type { MermaidDocument, DiagramMeta } from \"../types.js\";\nimport { isMetaEmpty, metaCommentLine, writeMetaToPreamble } from \"../source/metadata.js\";\nimport { compoundInfo, type FlowchartBody } from \"./parse.js\";\nimport { formatStatement, type FlowStatement } from \"./statements.js\";\n\n/** Serialises statements, honouring compound (`a; b`) lines. */\nexport function serializeStatements(statements: FlowStatement[]): string[] {\n const out: string[] = [];\n const emitted = new Set<FlowStatement>();\n const present = new Set(statements);\n for (const stmt of statements) {\n if (emitted.has(stmt)) continue;\n const compound = compoundInfo(stmt);\n if (compound) {\n const members = compound.members.filter((m) => present.has(m));\n const complete = members.length === compound.members.length;\n const anyDirty = members.some((m) => \"dirty\" in m && m.dirty);\n if (complete && !anyDirty) {\n out.push(compound.raw);\n for (const member of compound.members) emitted.add(member);\n continue;\n }\n // Normalise to one statement per line; each member keeps its own text.\n const indent =\n \"indent\" in compound.members[0]! ? (compound.members[0] as { indent: string }).indent : \"\";\n for (const member of members) {\n const text = formatStatement(member);\n if (text.trim() === \"\") continue;\n out.push(text.startsWith(indent) ? text : indent + text.trimStart());\n }\n for (const member of compound.members) emitted.add(member);\n continue;\n }\n out.push(formatStatement(stmt));\n emitted.add(stmt);\n }\n return out;\n}\n\n/** Indentation used by the first indented body statement, defaulting to two spaces. */\nexport function detectIndent(statements: FlowStatement[]): string {\n for (const stmt of statements) {\n if (\"indent\" in stmt && stmt.indent) return stmt.indent;\n }\n return \" \";\n}\n\n/**\n * Assembles the full document text: preamble, header, metadata, body and the\n * original trailing whitespace.\n */\nexport function assembleDocument(\n doc: Pick<MermaidDocument, \"preamble\" | \"header\" | \"trailing\" | \"eol\" | \"meta\" | \"metaCarrier\">,\n bodyLines: string[],\n indent: string,\n): string {\n const meta: DiagramMeta | null = isMetaEmpty(doc.meta) ? null : doc.meta;\n const preambleLines =\n doc.metaCarrier === \"frontmatter\"\n ? writeMetaToPreamble(doc.preamble, meta)\n : [...doc.preamble.lines];\n const lines = [...preambleLines];\n if (doc.header) lines.push(doc.header);\n if (meta && doc.metaCarrier === \"comment\") lines.push(metaCommentLine(meta, indent));\n lines.push(...bodyLines);\n return lines.join(doc.eol) + doc.trailing;\n}\n\nexport function serializeFlowchart(doc: MermaidDocument<FlowchartBody>): string {\n const bodyLines = serializeStatements(doc.body.statements);\n return assembleDocument(doc, bodyLines, detectIndent(doc.body.statements));\n}\n","import type { EditOp, GraphEdge, MermaidDocument } from \"../types.js\";\nimport { type FlowchartBody, parseFlowchart, compoundInfo, markCompound } from \"./parse.js\";\nimport { serializeFlowchart, detectIndent } from \"./serialize.js\";\nimport { splitSource } from \"../source/lines.js\";\nimport {\n defaultCarrierFor,\n extractMetaFromBody,\n extractMetaFromFrontmatter,\n emptyMeta,\n mergeMeta,\n} from \"../source/metadata.js\";\nimport type { Chain, FlowStatement, LinkRef, NodeRef } from \"./statements.js\";\nimport { canonicalShape } from \"./shapes.js\";\n\ntype Doc = MermaidDocument<FlowchartBody>;\ntype ChainStmt = Extract<FlowStatement, { kind: \"chain\" }>;\ntype SubgraphStmt = Extract<FlowStatement, { kind: \"subgraph\" }>;\n\n/**\n * Applies an edit to a flowchart document. Statements are mutated in place\n * on a shallow copy, the document is re-serialised and re-parsed so that the\n * returned model is always consistent with its text.\n */\nexport function applyFlowchartEdit(doc: Doc, op: EditOp): Doc {\n if (op.type === \"removeEdges\" && op.ids.length > 1) return removeEdgesOneByOne(doc, op.ids);\n const statements = cloneStatements(doc.body.statements);\n const work: Doc = {\n ...doc,\n body: { statements },\n meta: { ...doc.meta, layout: { ...doc.meta.layout }, sizes: { ...doc.meta.sizes } },\n };\n const indent = detectIndent(statements);\n\n switch (op.type) {\n case \"moveNodes\":\n for (const { id, position } of op.moves) work.meta.layout![id] = position;\n return reparse(work, false);\n case \"resizeNode\":\n if (op.size) work.meta.sizes![op.id] = op.size;\n else delete work.meta.sizes![op.id];\n return reparse(work, false);\n case \"setViewport\":\n work.meta.viewport = op.viewport;\n return reparse(work, false);\n case \"setMetaExt\":\n work.meta.ext = { ...(work.meta.ext ?? {}), [op.key]: op.value };\n if (op.value === undefined) delete work.meta.ext[op.key];\n return reparse(work, false);\n case \"setDirection\":\n work.header = setHeaderDirection(work.header, op.direction);\n return reparse(work, true);\n case \"setTitle\":\n work.preamble = {\n ...work.preamble,\n lines: setFrontmatterTitle(work.preamble.lines, op.title),\n };\n return reparse(work, true);\n case \"replaceSource\":\n return parseFlowchartSource(op.source, work.metaCarrier);\n default:\n break;\n }\n\n // Structural edits below.\n switch (op.type) {\n case \"addNode\": {\n const ref: NodeRef = {\n id: op.node.id,\n label: op.node.label ?? op.node.id,\n shape: canonicalShape(op.node.shape ?? \"rect\"),\n form: \"bracket\",\n classes: [...(op.node.classes ?? [])],\n };\n const data = shapeDataFor(ref.shape!, encodeData(op.node.data));\n if (Object.keys(data).length) {\n ref.form = \"data\";\n ref.data = data;\n }\n const stmt: ChainStmt = {\n kind: \"chain\",\n raw: \"\",\n indent,\n chain: { groups: [[ref]], links: [] },\n dirty: true,\n };\n insertIntoGroup(statements, stmt, op.node.parentId, indent);\n if (op.position) work.meta.layout![op.node.id] = op.position;\n if (op.node.styles?.length) {\n statements.push({\n kind: \"style\",\n raw: \"\",\n indent,\n id: op.node.id,\n styles: [...op.node.styles],\n dirty: true,\n });\n }\n break;\n }\n case \"removeNodes\": {\n const ids = new Set(op.ids.filter((id) => !doc.graph.groups.some((g) => g.id === id)));\n // Group ids: drop the subgraph wrapper, keep its content (same as `ungroup`).\n for (const gid of op.ids.filter((id) => doc.graph.groups.some((g) => g.id === id))) {\n const range = groupRange(statements, gid);\n if (!range) continue;\n statements.splice(range.end, 1);\n statements.splice(range.start, 1);\n delete work.meta.layout![gid];\n delete work.meta.sizes![gid];\n }\n const removedEdgeOrdinals = edgeOrdinalsTouching(\n doc.graph.edges,\n (e) => ids.has(e.source) || ids.has(e.target),\n );\n removeNodesFromStatements(statements, ids);\n dropRedundantBareMentions(statements);\n // Drop class/style/click statements for removed nodes.\n filterInPlace(statements, (s) => {\n if (s.kind === \"style\" || s.kind === \"click\") return !ids.has(s.id);\n if (s.kind === \"class\") {\n s.ids = s.ids.filter((id) => !ids.has(id));\n if (!s.ids.length) return false;\n s.dirty = true;\n return true;\n }\n return true;\n });\n adjustLinkStyles(statements, removedEdgeOrdinals);\n for (const id of ids) {\n delete work.meta.layout![id];\n delete work.meta.sizes![id];\n }\n break;\n }\n case \"renameNode\": {\n const ref = declaringRef(statements, op.id, \"label\") ?? firstRef(statements, op.id);\n if (!ref) break;\n const node = doc.graph.nodes.find((n) => n.id === op.id);\n if (ref.ref.label === undefined) {\n ref.ref.shape = ref.ref.shape ?? node?.shape ?? \"rect\";\n ref.ref.form = ref.ref.form ?? \"bracket\";\n }\n ref.ref.label = op.label;\n ref.ref.labelQuoted = undefined;\n ref.stmt.dirty = true;\n break;\n }\n case \"setNodeShape\": {\n const shape = canonicalShape(op.shape);\n const ref = declaringRef(statements, op.id, \"shape\") ?? firstRef(statements, op.id);\n if (!ref) break;\n const node = doc.graph.nodes.find((n) => n.id === op.id);\n ref.ref.shape = shape;\n if (ref.ref.label === undefined) ref.ref.label = node?.label ?? op.id;\n ref.ref.form = ref.ref.form ?? \"bracket\";\n const data = shapeDataFor(shape, ref.ref.data ?? {});\n if (Object.keys(data).length) ref.ref.form = \"data\";\n ref.ref.data = Object.keys(data).length ? data : undefined;\n ref.stmt.dirty = true;\n break;\n }\n case \"setNodeClasses\": {\n // Clear existing `:::` and `class` references.\n for (const s of statements) {\n if (s.kind === \"chain\") {\n for (const g of s.chain.groups) {\n for (const r of g) {\n if (r.id === op.id && r.classes.length) {\n r.classes = [];\n s.dirty = true;\n }\n }\n }\n }\n }\n filterInPlace(statements, (s) => {\n if (s.kind !== \"class\") return true;\n if (!s.ids.includes(op.id)) return true;\n s.ids = s.ids.filter((id) => id !== op.id);\n s.dirty = true;\n return s.ids.length > 0;\n });\n const [first, ...rest] = op.classes;\n if (first) {\n const ref = declaringRef(statements, op.id, \"label\") ?? firstRef(statements, op.id);\n if (ref) {\n ref.ref.classes = [first];\n ref.stmt.dirty = true;\n }\n }\n for (const cls of rest)\n statements.push({\n kind: \"class\",\n raw: \"\",\n indent,\n ids: [op.id],\n className: cls,\n dirty: true,\n });\n break;\n }\n case \"setNodeStyles\": {\n filterInPlace(statements, (s) => !(s.kind === \"style\" && s.id === op.id));\n if (op.styles.length)\n statements.push({\n kind: \"style\",\n raw: \"\",\n indent,\n id: op.id,\n styles: [...op.styles],\n dirty: true,\n });\n break;\n }\n case \"setNodeLink\": {\n filterInPlace(statements, (s) => !(s.kind === \"click\" && s.id === op.id));\n if (op.link) {\n const parts = [`href \"${op.link}\"`];\n if (op.tooltip) parts.push(`\"${op.tooltip}\"`);\n if (op.target) parts.push(op.target);\n statements.push({\n kind: \"click\",\n raw: \"\",\n indent,\n id: op.id,\n rest: parts.join(\" \"),\n dirty: true,\n });\n }\n break;\n }\n case \"setNodeData\": {\n const ref = declaringRef(statements, op.id, \"label\") ?? firstRef(statements, op.id);\n if (!ref) break;\n const node = doc.graph.nodes.find((n) => n.id === op.id);\n ref.ref.form = \"data\";\n ref.ref.shape = ref.ref.shape ?? node?.shape ?? \"rect\";\n if (ref.ref.label === undefined) ref.ref.label = node?.label ?? op.id;\n const data = { ...(ref.ref.data ?? {}) };\n for (const [k, v] of Object.entries(op.data)) {\n if (v === undefined || v === null) delete data[k];\n else data[k] = typeof v === \"string\" ? JSON.stringify(v) : String(v);\n }\n ref.ref.data = data;\n ref.stmt.dirty = true;\n break;\n }\n case \"addEdge\": {\n const link: LinkRef = {\n id: op.edge.userDefinedId ? op.edge.id : undefined,\n pattern: op.edge.pattern ?? \"solid\",\n arrowStart: op.edge.arrowStart ?? \"none\",\n arrowEnd: op.edge.arrowEnd ?? \"arrow_point\",\n length: op.edge.length ?? 1,\n label: op.edge.label || undefined,\n labelStyle: op.edge.label ? \"pipe\" : undefined,\n };\n const stmt: ChainStmt = {\n kind: \"chain\",\n raw: \"\",\n indent,\n chain: {\n groups: [[{ id: op.edge.source, classes: [] }], [{ id: op.edge.target, classes: [] }]],\n links: [link],\n },\n dirty: true,\n };\n // Appending at top level never changes subgraph membership.\n appendAtEnd(statements, stmt);\n if (op.edge.styles?.length) {\n statements.push({\n kind: \"linkStyle\",\n raw: \"\",\n indent,\n targets: [doc.graph.edges.length],\n styles: [...op.edge.styles],\n dirty: true,\n });\n }\n break;\n }\n case \"removeEdges\": {\n const ids = new Set(op.ids);\n const removedOrdinals = edgeOrdinalsTouching(doc.graph.edges, (e) => ids.has(e.id));\n for (const edge of doc.graph.edges) {\n if (!ids.has(edge.id)) continue;\n const located = locateEdge(statements, doc.graph.edges, edge.id);\n if (!located) continue;\n removeLinkFromChain(\n statements,\n located.stmt,\n located.linkIndex,\n located.source,\n located.target,\n indent,\n );\n }\n adjustLinkStyles(statements, removedOrdinals);\n break;\n }\n case \"setEdgeLabel\":\n case \"setEdgeStyle\":\n case \"reconnectEdge\": {\n const located = locateEdge(statements, doc.graph.edges, op.id);\n if (!located) break;\n const stmt = isolateEdge(\n statements,\n located.stmt,\n located.linkIndex,\n located.source,\n located.target,\n indent,\n );\n const link = stmt.chain.links[0]!;\n if (op.type === \"setEdgeLabel\") {\n link.label = op.label || undefined;\n if (link.label && !link.labelStyle) link.labelStyle = \"pipe\";\n } else if (op.type === \"setEdgeStyle\") {\n if (op.pattern) link.pattern = op.pattern;\n if (op.arrowStart) link.arrowStart = op.arrowStart;\n if (op.arrowEnd) link.arrowEnd = op.arrowEnd;\n if (op.length) link.length = op.length;\n if (op.styles) {\n const ordinal = doc.graph.edges.findIndex((e) => e.id === op.id);\n setLinkStyleFor(statements, ordinal, op.styles, indent);\n }\n } else {\n stmt.chain.groups[0] = [{ id: op.source, classes: [] }];\n stmt.chain.groups[1] = [{ id: op.target, classes: [] }];\n }\n stmt.dirty = true;\n break;\n }\n case \"groupNodes\": {\n const open: SubgraphStmt = {\n kind: \"subgraph\",\n raw: \"\",\n indent,\n id: op.groupId,\n title: op.label,\n titleForm: \"bracket\",\n dirty: true,\n };\n const members: FlowStatement[] = op.nodeIds.map((id) => ({\n kind: \"chain\" as const,\n raw: \"\",\n indent: indent + indent,\n chain: { groups: [[{ id, classes: [] }]], links: [] },\n dirty: true,\n }));\n const block: FlowStatement[] = [\n open,\n ...members,\n { kind: \"end\", raw: `${indent}end`, indent },\n ];\n if (op.parentId) insertManyIntoGroup(statements, block, op.parentId, indent);\n else statements.push(...block);\n break;\n }\n case \"ungroup\": {\n const range = groupRange(statements, op.groupId);\n if (!range) break;\n const openIndent = (statements[range.start] as SubgraphStmt).indent;\n const inner = openIndent + indent;\n for (let i = range.start + 1; i < range.end; i++) {\n const s = statements[i]!;\n if (s.kind === \"raw\" || s.kind === \"end\") {\n if (s.raw.startsWith(inner))\n (s as { raw: string }).raw = openIndent + s.raw.slice(inner.length);\n continue;\n }\n if (s.indent.startsWith(inner)) {\n s.indent = openIndent + s.indent.slice(inner.length);\n s.dirty = true;\n }\n }\n statements.splice(range.end, 1);\n statements.splice(range.start, 1);\n // Remove direction statements that belonged to the group.\n for (let i = range.start; i < range.end - 1; i++) {\n const s = statements[i];\n if (\n s &&\n s.kind === \"direction\" &&\n depthAt(statements, i) === depthAt(statements, range.start)\n ) {\n statements.splice(i, 1);\n break;\n }\n }\n delete work.meta.layout![op.groupId];\n delete work.meta.sizes![op.groupId];\n break;\n }\n case \"renameGroup\": {\n const range = groupRange(statements, op.id);\n if (!range) break;\n const open = statements[range.start] as SubgraphStmt;\n open.title = op.label;\n if (open.titleForm === \"none\") open.titleForm = \"bracket\";\n if (open.titleForm === \"bare\") {\n // `subgraph Title` uses the title as id; switch to id [title] to keep the id stable.\n open.titleForm = \"bracket\";\n }\n open.dirty = true;\n break;\n }\n case \"setGroupDirection\": {\n const range = groupRange(statements, op.id);\n if (!range) break;\n let found = -1;\n for (let i = range.start + 1; i < range.end; i++) {\n const s = statements[i]!;\n if (\n s.kind === \"direction\" &&\n depthAt(statements, i) === depthAt(statements, range.start) + 1\n ) {\n found = i;\n break;\n }\n }\n if (op.direction) {\n if (found !== -1) {\n const s = statements[found] as Extract<FlowStatement, { kind: \"direction\" }>;\n s.direction = op.direction;\n s.dirty = true;\n } else {\n const inner = (statements[range.start] as SubgraphStmt).indent + indent;\n statements.splice(range.start + 1, 0, {\n kind: \"direction\",\n raw: \"\",\n indent: inner,\n direction: op.direction,\n dirty: true,\n });\n }\n } else if (found !== -1) {\n statements.splice(found, 1);\n }\n break;\n }\n case \"setNodeParent\": {\n for (const id of op.ids) {\n // Remove bare declarations (single-node chains) so the new mention is last.\n const bare = statements\n .map((s, i) => ({ s, i }))\n .filter(\n ({ s }) =>\n s.kind === \"chain\" &&\n s.chain.links.length === 0 &&\n s.chain.groups[0]!.length === 1 &&\n s.chain.groups[0]![0]!.id === id,\n );\n let decl: NodeRef | undefined;\n for (const { s, i } of bare.reverse()) {\n const ref = (s as ChainStmt).chain.groups[0]![0]!;\n if (ref.label !== undefined || ref.shape) decl = { ...ref };\n statements.splice(i, 1);\n }\n if (op.parentId) {\n const ref: NodeRef = decl ?? { id, classes: [] };\n const stmt: ChainStmt = {\n kind: \"chain\",\n raw: \"\",\n indent,\n chain: { groups: [[ref]], links: [] },\n dirty: true,\n };\n insertIntoGroup(statements, stmt, op.parentId, indent);\n } else if (decl) {\n appendAtEnd(statements, {\n kind: \"chain\",\n raw: \"\",\n indent,\n chain: { groups: [[decl]], links: [] },\n dirty: true,\n });\n }\n }\n break;\n }\n case \"setClassDef\": {\n let found = false;\n for (const s of statements) {\n if (s.kind !== \"classDef\") continue;\n if (s.names.length === 1 && s.names[0] === op.name) {\n found = true;\n if (op.styles) {\n s.styles = [...op.styles];\n s.dirty = true;\n }\n } else if (s.names.includes(op.name) && op.styles) {\n s.names = s.names.filter((n) => n !== op.name);\n s.dirty = true;\n }\n }\n if (!op.styles)\n filterInPlace(\n statements,\n (s) => !(s.kind === \"classDef\" && s.names.length === 1 && s.names[0] === op.name),\n );\n else if (!found)\n statements.push({\n kind: \"classDef\",\n raw: \"\",\n indent,\n names: [op.name],\n styles: [...op.styles],\n dirty: true,\n });\n break;\n }\n default:\n break;\n }\n\n return reparse(work, true);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Clones statements and re-links compound (`a; b`) groups onto the clones. */\nfunction cloneStatements(statements: FlowStatement[]): FlowStatement[] {\n const clones = statements.map(cloneStatement);\n const index = new Map(statements.map((s, i) => [s, i]));\n const done = new Set<FlowStatement>();\n statements.forEach((original) => {\n const info = compoundInfo(original);\n if (!info || done.has(original)) return;\n const members = info.members.map((m) => clones[index.get(m)!]!);\n info.members.forEach((m, j) => {\n done.add(m);\n markCompound(members[j]!, members, j === 0 ? info.raw : \"\");\n });\n });\n return clones;\n}\n\nfunction cloneStatement(s: FlowStatement): FlowStatement {\n if (s.kind === \"chain\") {\n return {\n ...s,\n chain: {\n groups: s.chain.groups.map((g) =>\n g.map((r) => ({\n ...r,\n classes: [...r.classes],\n data: r.data ? { ...r.data } : undefined,\n })),\n ),\n links: s.chain.links.map((l) => ({ ...l })),\n },\n };\n }\n if (s.kind === \"classDef\") return { ...s, names: [...s.names], styles: [...s.styles] };\n if (s.kind === \"class\") return { ...s, ids: [...s.ids] };\n if (s.kind === \"style\") return { ...s, styles: [...s.styles] };\n if (s.kind === \"linkStyle\")\n return {\n ...s,\n targets: s.targets === \"default\" ? \"default\" : [...s.targets],\n styles: [...s.styles],\n };\n return { ...s };\n}\n\nfunction reparse(work: Doc, structural: boolean): Doc {\n const text = serializeFlowchart(work);\n const next = parseFlowchartSource(text, work.metaCarrier);\n next.dirty = doc_dirty(work, structural);\n return next;\n}\n\nfunction doc_dirty(work: Doc, structural: boolean): boolean {\n return work.dirty || structural;\n}\n\n/** Full parse of a flowchart source, used after edits. */\nexport function parseFlowchartSource(source: string, carrier?: Doc[\"metaCarrier\"]): Doc {\n const split = splitSource(source);\n const fromBody = extractMetaFromBody(split.bodyLines);\n const fromFm = extractMetaFromFrontmatter(split.preamble);\n let meta = emptyMeta();\n if (fromFm) meta = mergeMeta(meta, fromFm);\n if (fromBody.meta) meta = mergeMeta(meta, fromBody.meta);\n return parseFlowchart(source, {\n source,\n eol: split.eol,\n preamble: split.preamble,\n header: split.header,\n bodyLines: fromBody.bodyLines,\n trailing: split.trailing,\n meta,\n metaCarrier:\n carrier ?? (fromFm && !fromBody.meta ? \"frontmatter\" : defaultCarrierFor(\"flowchart\")),\n family: \"flowchart\",\n });\n}\n\nfunction filterInPlace<T>(arr: T[], keep: (item: T) => boolean): void {\n let j = 0;\n for (let i = 0; i < arr.length; i++) {\n if (keep(arr[i]!)) arr[j++] = arr[i]!;\n }\n arr.length = j;\n}\n\nfunction setHeaderDirection(header: string, direction: string): string {\n const m = /^(\\s*)(flowchart|graph)(-elk)?\\b/i.exec(header);\n if (!m) return header;\n const keyword = `${m[2]}${m[3] ?? \"\"}`;\n const trailingSemi = /;\\s*$/.test(header) ? \";\" : \"\";\n return `${m[1]}${keyword} ${direction}${trailingSemi}`;\n}\n\nfunction setFrontmatterTitle(lines: string[], title: string | undefined): string[] {\n const out = [...lines];\n const hasFm = out[0] !== undefined && /^---\\s*$/.test(out[0]);\n if (!hasFm) {\n if (title === undefined) return out;\n return [\"---\", `title: ${title}`, \"---\", ...out];\n }\n const close = out.findIndex((l, i) => i > 0 && /^---\\s*$/.test(l));\n const end = close === -1 ? out.length : close;\n const idx = out.findIndex((l, i) => i > 0 && i < end && /^title\\s*:/.test(l));\n if (title === undefined) {\n if (idx !== -1) out.splice(idx, 1);\n const close2 = out.findIndex((l, i) => i > 0 && /^---\\s*$/.test(l));\n if (close2 === 1) out.splice(0, 2);\n return out;\n }\n if (idx !== -1) out[idx] = `title: ${title}`;\n else out.splice(end, 0, `title: ${title}`);\n return out;\n}\n\n/** 0-based nesting depth before statement `index`. */\nfunction depthAt(statements: FlowStatement[], index: number): number {\n let depth = 0;\n for (let i = 0; i < index; i++) {\n const s = statements[i]!;\n if (s.kind === \"subgraph\") depth++;\n else if (s.kind === \"end\") depth = Math.max(0, depth - 1);\n }\n return depth;\n}\n\n/** Index range [start, end] of a subgraph's open/`end` statements. */\nfunction groupRange(\n statements: FlowStatement[],\n groupId: string,\n): { start: number; end: number } | null {\n const start = statements.findIndex((s) => s.kind === \"subgraph\" && s.id === groupId);\n if (start === -1) return null;\n let depth = 0;\n for (let i = start; i < statements.length; i++) {\n const s = statements[i]!;\n if (s.kind === \"subgraph\") depth++;\n else if (s.kind === \"end\") {\n depth--;\n if (depth === 0) return { start, end: i };\n }\n }\n return { start, end: statements.length };\n}\n\n/** Appends a statement at the top level, before trailing classDef/style blocks if present. */\nfunction appendAtEnd(statements: FlowStatement[], stmt: FlowStatement): void {\n statements.push(stmt);\n}\n\nfunction insertIntoGroup(\n statements: FlowStatement[],\n stmt: FlowStatement,\n groupId: string | undefined,\n indent: string,\n): void {\n insertManyIntoGroup(statements, [stmt], groupId, indent);\n}\n\nfunction insertManyIntoGroup(\n statements: FlowStatement[],\n block: FlowStatement[],\n groupId: string | undefined,\n indent: string,\n): void {\n const range = groupId ? groupRange(statements, groupId) : null;\n if (!range) {\n statements.push(...block);\n return;\n }\n const open = statements[range.start] as SubgraphStmt;\n const inner = open.indent + indent;\n for (const s of block)\n if (\"indent\" in s)\n (s as { indent: string }).indent =\n inner + (s as { indent: string }).indent.slice(indent.length);\n statements.splice(range.end, 0, ...block);\n}\n\ninterface RefLocation {\n stmt: ChainStmt;\n ref: NodeRef;\n}\n\nfunction declaringRef(\n statements: FlowStatement[],\n id: string,\n prop: \"label\" | \"shape\",\n): RefLocation | null {\n for (const s of statements) {\n if (s.kind !== \"chain\") continue;\n for (const g of s.chain.groups) {\n for (const r of g) {\n if (r.id === id && r[prop] !== undefined) return { stmt: s, ref: r };\n }\n }\n }\n return null;\n}\n\nfunction firstRef(statements: FlowStatement[], id: string): RefLocation | null {\n for (const s of statements) {\n if (s.kind !== \"chain\") continue;\n for (const g of s.chain.groups) for (const r of g) if (r.id === id) return { stmt: s, ref: r };\n }\n return null;\n}\n\nfunction edgeOrdinalsTouching(edges: GraphEdge[], predicate: (e: GraphEdge) => boolean): number[] {\n const out: number[] = [];\n edges.forEach((e, i) => {\n if (predicate(e)) out.push(i);\n });\n return out;\n}\n\n/** Re-indexes `linkStyle` statements after edges were removed. */\nfunction adjustLinkStyles(statements: FlowStatement[], removedOrdinals: number[]): void {\n if (!removedOrdinals.length) return;\n const removed = new Set(removedOrdinals);\n filterInPlace(statements, (s) => {\n if (s.kind !== \"linkStyle\" || s.targets === \"default\") return true;\n const next = s.targets\n .filter((t) => !removed.has(t))\n .map((t) => t - removedOrdinals.filter((r) => r < t).length);\n if (next.length !== s.targets.length || next.some((t, i) => t !== s.targets[i])) {\n s.targets = next;\n s.dirty = true;\n }\n return next.length > 0;\n });\n}\n\nfunction setLinkStyleFor(\n statements: FlowStatement[],\n ordinal: number,\n styles: string[],\n indent: string,\n): void {\n if (ordinal < 0) return;\n // Remove the ordinal from existing statements, then add a dedicated one.\n filterInPlace(statements, (s) => {\n if (s.kind !== \"linkStyle\" || s.targets === \"default\") return true;\n if (!s.targets.includes(ordinal)) return true;\n s.targets = s.targets.filter((t) => t !== ordinal);\n s.dirty = true;\n return s.targets.length > 0;\n });\n if (styles.length)\n statements.push({\n kind: \"linkStyle\",\n raw: \"\",\n indent,\n targets: [ordinal],\n styles: [...styles],\n dirty: true,\n });\n}\n\ninterface EdgeLocation {\n stmt: ChainStmt;\n linkIndex: number;\n source: string;\n target: string;\n}\n\n/**\n * Finds the chain statement and link index that produced a graph edge, by\n * replaying the edge ordinal assignment of {@link buildGraph}.\n */\nfunction locateEdge(\n statements: FlowStatement[],\n edges: GraphEdge[],\n edgeId: string,\n): EdgeLocation | null {\n const target = edges.find((e) => e.id === edgeId);\n if (!target) return null;\n const ordinal = edges.indexOf(target);\n let n = 0;\n for (const s of statements) {\n if (s.kind !== \"chain\") continue;\n const { groups, links } = s.chain;\n if (\n groups.length === 1 &&\n groups[0]!.length === 1 &&\n links.length === 0 &&\n isEdgeDataStatement(groups[0]![0]!)\n )\n continue;\n for (let i = 0; i < links.length; i++) {\n for (const from of groups[i]!) {\n for (const to of groups[i + 1]!) {\n if (n === ordinal) return { stmt: s, linkIndex: i, source: from.id, target: to.id };\n n++;\n }\n }\n }\n }\n return null;\n}\n\nfunction isEdgeDataStatement(ref: NodeRef): boolean {\n return (\n ref.form === \"data\" &&\n !!ref.data &&\n !ref.shape &&\n ref.label === undefined &&\n (\"animate\" in ref.data || \"animation\" in ref.data)\n );\n}\n\n/**\n * Rewrites a chain so that the given link/pair lives in its own two-node\n * statement, returning that statement. Other pairs and declarations are kept.\n */\nfunction isolateEdge(\n statements: FlowStatement[],\n stmt: ChainStmt,\n linkIndex: number,\n source: string,\n target: string,\n indent: string,\n): ChainStmt {\n const { groups, links } = stmt.chain;\n const simple = groups.length === 2 && groups[0]!.length === 1 && groups[1]!.length === 1;\n if (simple) return stmt;\n const expanded = expandChain(stmt.chain);\n const idx = statements.indexOf(stmt);\n const out: ChainStmt[] = expanded.map((chain) => ({\n kind: \"chain\",\n raw: \"\",\n indent: stmt.indent || indent,\n chain,\n dirty: true,\n }));\n statements.splice(idx, 1, ...out);\n const found = out.find(\n (s) =>\n s.chain.links.length === 1 &&\n s.chain.groups[0]![0]!.id === source &&\n s.chain.groups[1]![0]!.id === target &&\n sameLink(s.chain.links[0]!, links[linkIndex]!),\n );\n return found ?? out[0]!;\n}\n\nfunction sameLink(a: LinkRef, b: LinkRef): boolean {\n return (\n a.pattern === b.pattern &&\n a.arrowStart === b.arrowStart &&\n a.arrowEnd === b.arrowEnd &&\n a.label === b.label &&\n a.id === b.id &&\n a.length === b.length\n );\n}\n\n/**\n * Expands `A & B --> C --> D` into one two-node chain per edge, keeping\n * every node declaration on its first occurrence.\n */\nfunction expandChain(chain: Chain): Chain[] {\n const out: Chain[] = [];\n const declared = new Set<string>();\n const refFor = (r: NodeRef): NodeRef => {\n if (declared.has(r.id)) return { id: r.id, classes: [] };\n declared.add(r.id);\n return { ...r, classes: [...r.classes] };\n };\n chain.links.forEach((link, i) => {\n for (const from of chain.groups[i]!) {\n for (const to of chain.groups[i + 1]!) {\n out.push({ groups: [[refFor(from)], [refFor(to)]], links: [{ ...link }] });\n }\n }\n });\n if (!chain.links.length) {\n for (const ref of chain.groups[0]!) out.push({ groups: [[refFor(ref)]], links: [] });\n }\n return out;\n}\n\nfunction removeLinkFromChain(\n statements: FlowStatement[],\n stmt: ChainStmt,\n linkIndex: number,\n source: string,\n target: string,\n indent: string,\n): void {\n const isolated = isolateEdge(statements, stmt, linkIndex, source, target, indent);\n const idx = statements.indexOf(isolated);\n if (idx === -1) return;\n const [from, to] = [isolated.chain.groups[0]![0]!, isolated.chain.groups[1]![0]!];\n const keep: ChainStmt[] = [];\n // Keep declarations (or bare mentions of otherwise-unmentioned nodes) that would be lost.\n for (const ref of [from, to]) {\n const declares =\n ref.label !== undefined ||\n ref.shape ||\n ref.classes.length ||\n (ref.data && Object.keys(ref.data).length);\n const mentionedElsewhere = statements.some(\n (s) =>\n s !== isolated &&\n s.kind === \"chain\" &&\n s.chain.groups.some((g) => g.some((r) => r.id === ref.id)),\n );\n if (declares || !mentionedElsewhere) {\n keep.push({\n kind: \"chain\",\n raw: \"\",\n indent: isolated.indent || indent,\n chain: { groups: [[ref]], links: [] },\n dirty: true,\n });\n }\n }\n statements.splice(idx, 1, ...keep);\n}\n\n/** Removes single bare-id statements for nodes that are mentioned elsewhere. */\nfunction dropRedundantBareMentions(statements: FlowStatement[]): void {\n const mentions = new Map<string, number>();\n for (const s of statements) {\n if (s.kind !== \"chain\") continue;\n for (const g of s.chain.groups)\n for (const r of g) mentions.set(r.id, (mentions.get(r.id) ?? 0) + 1);\n }\n filterInPlace(statements, (s) => {\n if (s.kind !== \"chain\" || !s.dirty || s.chain.links.length || s.chain.groups[0]!.length !== 1)\n return true;\n const ref = s.chain.groups[0]![0]!;\n const bare =\n ref.label === undefined &&\n !ref.shape &&\n !ref.classes.length &&\n !(ref.data && Object.keys(ref.data).length);\n if (!bare) return true;\n if ((mentions.get(ref.id) ?? 0) > 1) {\n mentions.set(ref.id, mentions.get(ref.id)! - 1);\n return false;\n }\n return true;\n });\n}\n\nfunction removeNodesFromStatements(statements: FlowStatement[], ids: Set<string>): void {\n for (let i = 0; i < statements.length; i++) {\n const s = statements[i]!;\n if (s.kind !== \"chain\") continue;\n const mentions = s.chain.groups.some((g) => g.some((r) => ids.has(r.id)));\n if (!mentions) continue;\n const pieces = splitChainWithout(s.chain, ids);\n const replacement: ChainStmt[] = pieces.map((chain) => ({\n kind: \"chain\",\n raw: \"\",\n indent: s.indent,\n chain,\n dirty: true,\n }));\n statements.splice(i, 1, ...replacement);\n i += replacement.length - 1;\n }\n}\n\n/** Removes nodes from a chain, splitting it where a group becomes empty. */\nfunction splitChainWithout(chain: Chain, ids: Set<string>): Chain[] {\n const out: Chain[] = [];\n let cur: Chain = { groups: [], links: [] };\n for (let i = 0; i < chain.groups.length; i++) {\n const group = chain.groups[i]!.filter((r) => !ids.has(r.id));\n if (!group.length) {\n if (cur.groups.length) out.push(cur);\n cur = { groups: [], links: [] };\n continue;\n }\n if (cur.groups.length) cur.links.push({ ...chain.links[i - 1]! });\n cur.groups.push(group);\n }\n if (cur.groups.length) out.push(cur);\n return out;\n}\n\n/**\n * Removes several edges. Edges are located by their ordinal in the parsed\n * graph, and removing one rewrites (and may split) chain statements, so the\n * ordinals of the others are only valid against the document they came from.\n * Removing them one at a time, last first, means each removal leaves the\n * edges still to remove untouched; each is re-found in the updated document\n * by its endpoints and its index among edges between the same pair.\n */\nfunction removeEdgesOneByOne(doc: Doc, ids: string[]): Doc {\n const wanted = new Set(ids);\n const targets = doc.graph.edges\n .map((edge, ordinal) => ({ edge, ordinal }))\n .filter(({ edge }) => wanted.has(edge.id))\n .map(({ edge, ordinal }) => ({\n ordinal,\n source: edge.source,\n target: edge.target,\n pairIndex: doc.graph.edges\n .slice(0, ordinal)\n .filter((e) => e.source === edge.source && e.target === edge.target).length,\n }))\n .sort((a, b) => b.ordinal - a.ordinal);\n let current = doc;\n for (const t of targets) {\n const match = current.graph.edges.filter((e) => e.source === t.source && e.target === t.target)[\n t.pairIndex\n ];\n if (match) current = applyFlowchartEdit(current, { type: \"removeEdges\", ids: [match.id] });\n }\n return current;\n}\n\n/** Node data as `@{ … }` raw values: strings quoted, numbers and booleans bare. */\nfunction encodeData(data: Record<string, unknown> | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(data ?? {})) {\n if (v === undefined || v === null) continue;\n out[k] = typeof v === \"string\" ? JSON.stringify(v) : String(v);\n }\n return out;\n}\n\n/** Image-node keys Mermaid reads (`img` makes a node an image whatever its shape). */\nconst IMAGE_KEYS = [\"img\", \"pos\", \"w\", \"h\", \"constraint\"];\n\n/**\n * Keeps a node's data consistent with its shape: an image node always has\n * `img` (empty until one is chosen) so it stays an image; any other shape\n * drops the image keys, which would otherwise turn it back into one.\n */\nfunction shapeDataFor(shape: string, data: Record<string, string>): Record<string, string> {\n const out = { ...data };\n if (shape === \"image\") {\n if (!(\"img\" in out)) out.img = '\"\"';\n } else {\n for (const key of IMAGE_KEYS) delete out[key];\n }\n return out;\n}\n","import type { DiagramAdapter } from \"../types.js\";\nimport { applyFlowchartEdit } from \"./edit.js\";\nimport { parseFlowchart, type FlowchartBody } from \"./parse.js\";\nimport { serializeFlowchart } from \"./serialize.js\";\n\nexport const flowchartAdapter: DiagramAdapter<FlowchartBody> = {\n family: \"flowchart\",\n tier: \"editable\",\n parse: parseFlowchart,\n serialize: serializeFlowchart,\n apply: applyFlowchartEdit,\n};\n\nexport type { FlowchartBody, FlowchartDocument } from \"./parse.js\";\nexport { parseFlowchartSource } from \"./edit.js\";\nexport { FLOWCHART_SHAPES, resolveShape, canonicalShape, type ShapeDef } from \"./shapes.js\";\nexport { parseLink, formatLink, quoteLabelIfNeeded, type LinkSpec } from \"./edges.js\";\nexport {\n parseChain,\n parseStatement,\n formatChain,\n formatNode,\n type FlowStatement,\n type Chain,\n type NodeRef,\n type LinkRef,\n} from \"./statements.js\";\n","import type {\n AdapterParseContext,\n ArrowHead,\n Diagnostic,\n DiagramAdapter,\n DiagramFamily,\n DiagramGraph,\n EditOp,\n GraphEdge,\n GraphGroup,\n GraphNode,\n MermaidDocument,\n Point,\n} from \"../types.js\";\nimport { assembleDocument } from \"../flowchart/serialize.js\";\nimport { splitSource } from \"../source/lines.js\";\nimport {\n defaultCarrierFor,\n emptyMeta,\n extractMetaFromBody,\n extractMetaFromFrontmatter,\n mergeMeta,\n} from \"../source/metadata.js\";\n\n/**\n * A small engine for \"one statement per line\" Mermaid grammars\n * (stateDiagram, classDiagram, erDiagram). A grammar classifies each logical\n * line into a typed statement; the engine builds the graph, applies edits and\n * re-emits untouched statements verbatim.\n *\n * @module\n */\n\nexport interface NodeDecl {\n id: string;\n label?: string;\n shape?: string;\n classes: string[];\n /** Family-specific data (members, attributes, descriptions…). */\n data?: Record<string, unknown>;\n}\n\nexport type LineStatement =\n | { kind: \"raw\"; raw: string; indent: string }\n | {\n kind: \"node\";\n raw: string;\n indent: string;\n decl: NodeDecl;\n /** Multi-line body `{ … }` kept verbatim. */ body?: string[];\n dirty?: boolean;\n }\n | {\n kind: \"edge\";\n raw: string;\n indent: string;\n source: NodeDecl;\n target: NodeDecl;\n label?: string;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n pattern: GraphEdge[\"pattern\"];\n /** Family-specific data (cardinalities…). */\n data?: Record<string, unknown>;\n dirty?: boolean;\n }\n | { kind: \"groupOpen\"; raw: string; indent: string; id: string; label?: string; dirty?: boolean }\n | { kind: \"groupClose\"; raw: string; indent: string }\n | { kind: \"direction\"; raw: string; indent: string; direction: string; dirty?: boolean }\n | {\n kind: \"classDef\";\n raw: string;\n indent: string;\n names: string[];\n styles: string[];\n dirty?: boolean;\n }\n | {\n kind: \"class\";\n raw: string;\n indent: string;\n ids: string[];\n className: string;\n dirty?: boolean;\n }\n | { kind: \"style\"; raw: string; indent: string; id: string; styles: string[]; dirty?: boolean };\n\nexport interface EdgeSpec {\n label?: string;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n pattern: GraphEdge[\"pattern\"];\n data?: Record<string, unknown>;\n}\n\nexport interface LineGrammar {\n family: DiagramFamily;\n defaultShape: string;\n /** Groups logical statements from physical lines (brace blocks, `end note`, …). */\n joinLines(lines: string[]): string[];\n parseLine(line: string): LineStatement;\n formatStatement(stmt: LineStatement): string;\n /** Builds a node statement for a new node. */\n nodeStatement(decl: NodeDecl, indent: string): LineStatement;\n /** Builds an edge statement. */\n edgeStatement(source: string, target: string, spec: EdgeSpec, indent: string): LineStatement;\n /** Builds the open/close statements of a group. */\n groupStatements(\n id: string,\n label: string | undefined,\n indent: string,\n ): { open: LineStatement; close: LineStatement };\n /** Reads the header direction. */\n headerDirection(header: string, statements: LineStatement[]): string;\n /** Optional: pseudo-node ids such as `[*]` that need special graph handling. */\n resolveEndpoint?(\n id: string,\n groupStack: string[],\n role: \"source\" | \"target\",\n ): { id: string; shape: string; label: string; synthetic: true } | null;\n /** Default edge spec when the UI connects two nodes. */\n defaultEdge: EdgeSpec;\n /** Whether `setDirection` writes a `direction` statement (true) or the header. */\n directionAsStatement: boolean;\n /** False when the family has no grouping construct (ER). Group ops become no-ops. */\n supportsGroups?: boolean;\n}\n\nexport interface LineBody {\n statements: LineStatement[];\n}\n\nexport type LineDocument = MermaidDocument<LineBody>;\n\n// ---------------------------------------------------------------------------\n// Parsing\n// ---------------------------------------------------------------------------\n\nexport function buildLineGraph(\n grammar: LineGrammar,\n statements: LineStatement[],\n direction: string,\n title?: string,\n): { graph: DiagramGraph; diagnostics: Diagnostic[] } {\n const nodes = new Map<string, GraphNode>();\n const groups = new Map<string, GraphGroup>();\n const edges: GraphEdge[] = [];\n const classDefs: Record<string, string[]> = {};\n const diagnostics: Diagnostic[] = [];\n const stack: string[] = [];\n const classAssignments: { ids: string[]; className: string }[] = [];\n const styleAssignments: { id: string; styles: string[] }[] = [];\n let ordinal = 0;\n\n const touch = (decl: NodeDecl, role: \"source\" | \"target\" | \"decl\"): string => {\n if (role !== \"decl\" && grammar.resolveEndpoint) {\n const resolved = grammar.resolveEndpoint(decl.id, stack, role);\n if (resolved) {\n if (!nodes.has(resolved.id)) {\n nodes.set(resolved.id, {\n id: resolved.id,\n label: resolved.label,\n shape: resolved.shape,\n parentId: stack[stack.length - 1],\n classes: [],\n styles: [],\n data: { synthetic: true },\n });\n }\n return resolved.id;\n }\n }\n let node = nodes.get(decl.id);\n if (!node) {\n node = { id: decl.id, label: decl.id, shape: grammar.defaultShape, classes: [], styles: [] };\n nodes.set(decl.id, node);\n }\n // Mermaid: a mention inside a group claims the node, whatever the order;\n // root-level mentions never un-claim it.\n const parent = stack[stack.length - 1];\n if (parent) node.parentId = parent;\n if (decl.label !== undefined) node.label = decl.label;\n if (decl.shape) node.shape = decl.shape;\n for (const cls of decl.classes) if (!node.classes.includes(cls)) node.classes.push(cls);\n if (decl.data) node.data = mergeData(node.data, decl.data);\n return node.id;\n };\n\n for (const stmt of statements) {\n switch (stmt.kind) {\n case \"groupOpen\": {\n const parent = stack[stack.length - 1];\n // A group may have been referenced as a node earlier (state X then state X { }).\n const existing = nodes.get(stmt.id);\n if (existing) nodes.delete(stmt.id);\n groups.set(stmt.id, {\n id: stmt.id,\n label: stmt.label ?? existing?.label ?? stmt.id,\n parentId: parent,\n classes: existing?.classes ?? [],\n styles: existing?.styles ?? [],\n data: existing?.data,\n });\n stack.push(stmt.id);\n break;\n }\n case \"groupClose\":\n if (!stack.length)\n diagnostics.push({\n severity: \"warning\",\n message: \"Unbalanced closing brace\",\n source: \"pixerate\",\n });\n stack.pop();\n break;\n case \"direction\": {\n const current = stack[stack.length - 1];\n if (current) groups.get(current)!.direction = stmt.direction;\n break;\n }\n case \"node\":\n touch(stmt.decl, \"decl\");\n break;\n case \"edge\": {\n const s = touch(stmt.source, \"source\");\n const t = touch(stmt.target, \"target\");\n edges.push({\n id: `L_${s}_${t}_${ordinal}`,\n source: s,\n target: t,\n label: stmt.label,\n pattern: stmt.pattern,\n arrowStart: stmt.arrowStart,\n arrowEnd: stmt.arrowEnd,\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: stmt.data,\n });\n ordinal++;\n break;\n }\n case \"classDef\":\n for (const name of stmt.names) classDefs[name] = [...stmt.styles];\n break;\n case \"class\":\n classAssignments.push({ ids: stmt.ids, className: stmt.className });\n break;\n case \"style\":\n styleAssignments.push({ id: stmt.id, styles: stmt.styles });\n break;\n default:\n break;\n }\n }\n if (stack.length)\n diagnostics.push({\n severity: \"warning\",\n message: `${stack.length} block(s) not closed`,\n source: \"pixerate\",\n });\n\n // Edges may reference a group id (e.g. transitions to a composite state).\n for (const edge of edges) {\n for (const end of [\"source\", \"target\"] as const) {\n const id = edge[end];\n if (groups.has(id) && nodes.has(id)) nodes.delete(id);\n }\n }\n for (const { ids, className } of classAssignments) {\n for (const id of ids) {\n const target = nodes.get(id) ?? groups.get(id);\n if (target && !target.classes.includes(className)) target.classes.push(className);\n }\n }\n for (const { id, styles } of styleAssignments) {\n const target = nodes.get(id) ?? groups.get(id);\n if (target) target.styles.push(...styles);\n }\n\n return {\n graph: {\n direction,\n nodes: [...nodes.values()],\n edges,\n groups: [...groups.values()],\n classDefs,\n title,\n },\n diagnostics,\n };\n}\n\nfunction mergeData(\n a: Record<string, unknown> | undefined,\n b: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...(a ?? {}) };\n for (const [k, v] of Object.entries(b)) {\n if (Array.isArray(v) && Array.isArray(out[k])) out[k] = [...(out[k] as unknown[]), ...v];\n else out[k] = v;\n }\n return out;\n}\n\nexport function parseLineDocument(\n grammar: LineGrammar,\n source: string,\n ctx: AdapterParseContext,\n): LineDocument {\n const statements = grammar.joinLines(ctx.bodyLines).map((line) => grammar.parseLine(line));\n const direction = grammar.headerDirection(ctx.header, statements);\n const title =\n typeof ctx.preamble.frontmatter?.title === \"string\"\n ? ctx.preamble.frontmatter.title\n : undefined;\n const { graph, diagnostics } = buildLineGraph(grammar, statements, direction, title);\n return {\n family: grammar.family,\n tier: \"editable\",\n source,\n preamble: ctx.preamble,\n header: ctx.header,\n trailing: ctx.trailing,\n eol: ctx.eol,\n graph,\n meta: ctx.meta,\n metaCarrier: ctx.metaCarrier,\n body: { statements },\n diagnostics,\n dirty: false,\n };\n}\n\nexport function serializeLineDocument(grammar: LineGrammar, doc: LineDocument): string {\n const lines: string[] = [];\n for (const stmt of doc.body.statements) {\n if (stmt.kind === \"raw\") {\n lines.push(stmt.raw);\n continue;\n }\n if (!(\"dirty\" in stmt) || !stmt.dirty) {\n lines.push(stmt.raw);\n if (stmt.kind === \"node\" && stmt.body) lines.push(...stmt.body);\n continue;\n }\n lines.push(grammar.formatStatement(stmt));\n if (stmt.kind === \"node\" && stmt.body) lines.push(...stmt.body);\n }\n const indent = detectIndent(doc.body.statements);\n return assembleDocument(doc, lines, indent);\n}\n\nexport function detectIndent(statements: LineStatement[]): string {\n for (const s of statements) if (s.indent) return s.indent;\n return \" \";\n}\n\nfunction parseFull(\n grammar: LineGrammar,\n source: string,\n carrier?: LineDocument[\"metaCarrier\"],\n): LineDocument {\n const split = splitSource(source);\n const fromBody = extractMetaFromBody(split.bodyLines);\n const fromFm = extractMetaFromFrontmatter(split.preamble);\n let meta = emptyMeta();\n if (fromFm) meta = mergeMeta(meta, fromFm);\n if (fromBody.meta) meta = mergeMeta(meta, fromBody.meta);\n return parseLineDocument(grammar, source, {\n source,\n eol: split.eol,\n preamble: split.preamble,\n header: split.header,\n bodyLines: fromBody.bodyLines,\n trailing: split.trailing,\n meta,\n metaCarrier:\n carrier ?? (fromFm && !fromBody.meta ? \"frontmatter\" : defaultCarrierFor(grammar.family)),\n family: grammar.family,\n });\n}\n\n// ---------------------------------------------------------------------------\n// Editing\n// ---------------------------------------------------------------------------\n\nexport function applyLineEdit(grammar: LineGrammar, doc: LineDocument, op: EditOp): LineDocument {\n const statements = doc.body.statements.map((s) => ({\n ...s,\n ...(\"decl\" in s\n ? {\n decl: {\n ...s.decl,\n classes: [...s.decl.classes],\n data: s.decl.data ? { ...s.decl.data } : undefined,\n },\n }\n : {}),\n ...(\"source\" in s\n ? {\n source: { ...s.source, classes: [...s.source.classes] },\n target: { ...s.target, classes: [...s.target.classes] },\n }\n : {}),\n })) as LineStatement[];\n const work: LineDocument = {\n ...doc,\n body: { statements },\n meta: { ...doc.meta, layout: { ...doc.meta.layout }, sizes: { ...doc.meta.sizes } },\n };\n const indent = detectIndent(statements);\n const reparse = (structural: boolean): LineDocument => {\n const text = serializeLineDocument(grammar, work);\n const next = parseFull(grammar, text, work.metaCarrier);\n next.dirty = doc.dirty || structural;\n return next;\n };\n\n switch (op.type) {\n case \"moveNodes\":\n for (const { id, position } of op.moves) work.meta.layout![id] = position as Point;\n return reparse(false);\n case \"resizeNode\":\n if (op.size) work.meta.sizes![op.id] = op.size;\n else delete work.meta.sizes![op.id];\n return reparse(false);\n case \"setViewport\":\n work.meta.viewport = op.viewport;\n return reparse(false);\n case \"setMetaExt\":\n work.meta.ext = { ...(work.meta.ext ?? {}), [op.key]: op.value };\n if (op.value === undefined) delete work.meta.ext[op.key];\n return reparse(false);\n case \"replaceSource\":\n return parseFull(grammar, op.source, work.metaCarrier);\n case \"setTitle\": {\n const lines = [...work.preamble.lines];\n work.preamble = { ...work.preamble, lines: setTitle(lines, op.title) };\n return reparse(true);\n }\n case \"setDirection\": {\n if (grammar.directionAsStatement) {\n const idx = statements.findIndex(\n (s, i) => s.kind === \"direction\" && depthAt(statements, i) === 0,\n );\n if (idx !== -1) {\n const s = statements[idx] as Extract<LineStatement, { kind: \"direction\" }>;\n s.direction = op.direction;\n s.dirty = true;\n } else {\n statements.unshift({\n kind: \"direction\",\n raw: \"\",\n indent,\n direction: op.direction,\n dirty: true,\n });\n }\n } else {\n work.header = work.header.replace(/\\s+(TB|TD|BT|LR|RL)\\s*$/i, \"\") + ` ${op.direction}`;\n }\n return reparse(true);\n }\n case \"addNode\": {\n const decl: NodeDecl = {\n id: op.node.id,\n label: op.node.label,\n shape: op.node.shape,\n classes: [...(op.node.classes ?? [])],\n data: op.node.data,\n };\n insertIntoGroup(statements, [grammar.nodeStatement(decl, indent)], op.node.parentId, indent);\n if (op.position) work.meta.layout![op.node.id] = op.position;\n return reparse(true);\n }\n case \"removeNodes\": {\n const ids = new Set(op.ids);\n filterInPlace(statements, (s) => {\n if (s.kind === \"node\") return !ids.has(s.decl.id);\n if (s.kind === \"edge\") return !(ids.has(s.source.id) || ids.has(s.target.id));\n if (s.kind === \"style\") return !ids.has(s.id);\n if (s.kind === \"class\") {\n s.ids = s.ids.filter((id) => !ids.has(id));\n s.dirty = true;\n return s.ids.length > 0;\n }\n return true;\n });\n // Remove groups whose id was deleted (keep their content).\n for (const id of ids) {\n const range = groupRange(statements, id);\n if (range) {\n statements.splice(range.end, 1);\n statements.splice(range.start, 1);\n }\n delete work.meta.layout![id];\n delete work.meta.sizes![id];\n }\n return reparse(true);\n }\n case \"renameNode\":\n case \"setNodeShape\":\n case \"setNodeClasses\":\n case \"setNodeData\": {\n const id = op.id;\n let decl = findDecl(statements, id);\n if (!decl) {\n // Create a declaration statement right after the first mention.\n const node = doc.graph.nodes.find((n) => n.id === id);\n const stmt = grammar.nodeStatement(\n {\n id,\n label: node?.label !== id ? node?.label : undefined,\n shape: node?.shape !== grammar.defaultShape ? node?.shape : undefined,\n classes: [],\n },\n indent,\n );\n const first = statements.findIndex(\n (s) => s.kind === \"edge\" && (s.source.id === id || s.target.id === id),\n );\n statements.splice(first === -1 ? statements.length : first, 0, stmt);\n decl = findDecl(statements, id)!;\n }\n const target = decl.stmt;\n if (op.type === \"renameNode\") decl.decl.label = op.label;\n if (op.type === \"setNodeShape\") decl.decl.shape = op.shape;\n if (op.type === \"setNodeClasses\") {\n decl.decl.classes = [...op.classes];\n filterInPlace(statements, (s) => {\n if (s.kind !== \"class\" || !s.ids.includes(id)) return true;\n s.ids = s.ids.filter((x) => x !== id);\n s.dirty = true;\n return s.ids.length > 0;\n });\n }\n if (op.type === \"setNodeData\") {\n decl.decl.data = { ...(decl.decl.data ?? {}), ...op.data };\n // Body-bearing data (class members, ER attributes) lives in the `{ … }`\n // block: regenerate it from the grammar so the text follows the data.\n if (target.kind === \"node\" && (\"members\" in op.data || \"attributes\" in op.data)) {\n const fresh = grammar.nodeStatement(decl.decl, target.indent);\n target.body = fresh.kind === \"node\" ? fresh.body : undefined;\n }\n }\n (target as { dirty?: boolean }).dirty = true;\n return reparse(true);\n }\n case \"setNodeStyles\": {\n filterInPlace(statements, (s) => !(s.kind === \"style\" && s.id === op.id));\n if (op.styles.length)\n statements.push({\n kind: \"style\",\n raw: \"\",\n indent,\n id: op.id,\n styles: [...op.styles],\n dirty: true,\n });\n return reparse(true);\n }\n case \"addEdge\": {\n const spec: EdgeSpec = {\n ...grammar.defaultEdge,\n ...(op.edge.pattern ? { pattern: op.edge.pattern } : {}),\n ...(op.edge.arrowStart ? { arrowStart: op.edge.arrowStart } : {}),\n ...(op.edge.arrowEnd ? { arrowEnd: op.edge.arrowEnd } : {}),\n label: op.edge.label,\n data: {\n ...(op.edge.data ?? {}),\n synthetic: {\n source: isSyntheticEndpoint(doc, op.edge.source),\n target: isSyntheticEndpoint(doc, op.edge.target),\n },\n },\n };\n const stmt = grammar.edgeStatement(op.edge.source, op.edge.target, spec, indent);\n // Place inside the common parent group when both ends share one.\n const sp = parentOf(doc, op.edge.source);\n const tp = parentOf(doc, op.edge.target);\n insertIntoGroup(statements, [stmt], sp && sp === tp ? sp : undefined, indent);\n return reparse(true);\n }\n case \"removeEdges\": {\n const targets = new Set(op.ids.map((id) => edgeOrdinal(doc, id)).filter((n) => n >= 0));\n let ordinal = 0;\n filterInPlace(statements, (s) => {\n if (s.kind !== \"edge\") return true;\n const keep = !targets.has(ordinal);\n ordinal++;\n return keep;\n });\n return reparse(true);\n }\n case \"setEdgeLabel\":\n case \"setEdgeStyle\":\n case \"reconnectEdge\": {\n const stmt = edgeStatementFor(statements, doc, op.id);\n if (!stmt) return doc;\n if (op.type === \"setEdgeLabel\") stmt.label = op.label || undefined;\n if (op.type === \"setEdgeStyle\") {\n if (op.pattern) stmt.pattern = op.pattern;\n if (op.arrowStart) stmt.arrowStart = op.arrowStart;\n if (op.arrowEnd) stmt.arrowEnd = op.arrowEnd;\n }\n if (op.type === \"reconnectEdge\") {\n stmt.source = { id: op.source, classes: [] };\n stmt.target = { id: op.target, classes: [] };\n }\n stmt.dirty = true;\n return reparse(true);\n }\n case \"groupNodes\": {\n if (grammar.supportsGroups === false) return doc;\n const { open, close } = grammar.groupStatements(op.groupId, op.label, indent);\n const moved: LineStatement[] = [];\n // Move node declarations (and edges fully inside the set) into the group.\n const set = new Set(op.nodeIds);\n filterInPlace(statements, (s) => {\n if (s.kind === \"node\" && set.has(s.decl.id)) {\n moved.push(reindent(s, indent + indent));\n return false;\n }\n if (s.kind === \"edge\" && set.has(s.source.id) && set.has(s.target.id)) {\n moved.push(reindent(s, indent + indent));\n return false;\n }\n return true;\n });\n for (const id of op.nodeIds) {\n if (!moved.some((s) => s.kind === \"node\" && s.decl.id === id)) {\n moved.push(grammar.nodeStatement({ id, classes: [] }, indent + indent));\n }\n }\n insertIntoGroup(statements, [open, ...moved, close], op.parentId, indent);\n return reparse(true);\n }\n case \"ungroup\": {\n const range = groupRange(statements, op.groupId);\n if (!range) return doc;\n const inner = statements\n .slice(range.start + 1, range.end)\n .map((s) => reindent(s, (statements[range.start] as { indent: string }).indent));\n statements.splice(\n range.start,\n range.end - range.start + 1,\n ...inner.filter((s) => s.kind !== \"direction\"),\n );\n delete work.meta.layout![op.groupId];\n return reparse(true);\n }\n case \"renameGroup\": {\n const range = groupRange(statements, op.id);\n if (!range) return doc;\n const open = statements[range.start] as Extract<LineStatement, { kind: \"groupOpen\" }>;\n open.label = op.label;\n open.dirty = true;\n return reparse(true);\n }\n case \"setGroupDirection\": {\n const range = groupRange(statements, op.id);\n if (!range) return doc;\n const idx = statements.findIndex(\n (s, i) =>\n i > range.start &&\n i < range.end &&\n s.kind === \"direction\" &&\n depthAt(statements, i) === depthAt(statements, range.start) + 1,\n );\n if (op.direction) {\n if (idx !== -1) {\n const s = statements[idx] as Extract<LineStatement, { kind: \"direction\" }>;\n s.direction = op.direction;\n s.dirty = true;\n } else {\n const inner = (statements[range.start] as { indent: string }).indent + indent;\n statements.splice(range.start + 1, 0, {\n kind: \"direction\",\n raw: \"\",\n indent: inner,\n direction: op.direction,\n dirty: true,\n });\n }\n } else if (idx !== -1) statements.splice(idx, 1);\n return reparse(true);\n }\n case \"setNodeParent\": {\n for (const id of op.ids) {\n const found = findDecl(statements, id);\n let stmt: LineStatement;\n if (found) {\n statements.splice(statements.indexOf(found.stmt), 1);\n stmt = found.stmt;\n } else {\n stmt = grammar.nodeStatement({ id, classes: [] }, indent);\n }\n insertIntoGroup(statements, [stmt], op.parentId, indent);\n }\n return reparse(true);\n }\n case \"setClassDef\": {\n let found = false;\n for (const s of statements) {\n if (s.kind !== \"classDef\") continue;\n if (s.names.length === 1 && s.names[0] === op.name) {\n found = true;\n if (op.styles) {\n s.styles = [...op.styles];\n s.dirty = true;\n }\n }\n }\n if (!op.styles)\n filterInPlace(\n statements,\n (s) => !(s.kind === \"classDef\" && s.names.length === 1 && s.names[0] === op.name),\n );\n else if (!found)\n statements.push({\n kind: \"classDef\",\n raw: \"\",\n indent,\n names: [op.name],\n styles: [...op.styles],\n dirty: true,\n });\n return reparse(true);\n }\n default:\n return doc;\n }\n}\n\n/**\n * A node is a synthetic endpoint (`[*]`) when the graph says so, or when it is\n * unknown but named like one — the UI may offer \"connect to end\" for a scope\n * that has no end pseudo-state yet.\n */\nfunction isSyntheticEndpoint(doc: LineDocument, id: string): boolean {\n const node = doc.graph.nodes.find((n) => n.id === id);\n if (node) return !!node.data?.synthetic;\n // Unknown id: only `root_start|end` or `<existing group>_start|end` count as `[*]`.\n const m = /^(.+)_(start|end)$/.exec(id);\n if (!m) return false;\n return m[1] === \"root\" || doc.graph.groups.some((g) => g.id === m[1]);\n}\n\nfunction reindent(s: LineStatement, indent: string): LineStatement {\n const next = { ...s, indent } as LineStatement;\n if (s.kind === \"raw\") return s;\n (next as { dirty?: boolean }).dirty = true;\n if (s.kind === \"node\" && s.body) {\n const delta = indent.length - s.indent.length;\n (next as { body?: string[] }).body = s.body.map((l) =>\n delta >= 0\n ? \" \".repeat(delta) + l\n : l.slice(Math.min(-delta, l.length - l.trimStart().length)),\n );\n }\n return next;\n}\n\nfunction findDecl(\n statements: LineStatement[],\n id: string,\n): { stmt: LineStatement; decl: NodeDecl } | null {\n for (const s of statements) {\n if (s.kind === \"node\" && s.decl.id === id) return { stmt: s, decl: s.decl };\n }\n for (const s of statements) {\n if (s.kind === \"edge\") {\n if (\n s.source.id === id &&\n (s.source.label !== undefined || s.source.shape || s.source.classes.length)\n )\n return { stmt: s, decl: s.source };\n if (\n s.target.id === id &&\n (s.target.label !== undefined || s.target.shape || s.target.classes.length)\n )\n return { stmt: s, decl: s.target };\n }\n }\n return null;\n}\n\nfunction parentOf(doc: LineDocument, id: string): string | undefined {\n return (\n doc.graph.nodes.find((n) => n.id === id)?.parentId ??\n doc.graph.groups.find((g) => g.id === id)?.parentId\n );\n}\n\nfunction edgeOrdinal(doc: LineDocument, edgeId: string): number {\n return doc.graph.edges.findIndex((e) => e.id === edgeId);\n}\n\nfunction edgeStatementFor(\n statements: LineStatement[],\n doc: LineDocument,\n edgeId: string,\n): Extract<LineStatement, { kind: \"edge\" }> | null {\n const ordinal = edgeOrdinal(doc, edgeId);\n if (ordinal < 0) return null;\n let n = 0;\n for (const s of statements) {\n if (s.kind !== \"edge\") continue;\n if (n === ordinal) return s;\n n++;\n }\n return null;\n}\n\nfunction depthAt(statements: LineStatement[], index: number): number {\n let depth = 0;\n for (let i = 0; i < index; i++) {\n const s = statements[i]!;\n if (s.kind === \"groupOpen\") depth++;\n else if (s.kind === \"groupClose\") depth = Math.max(0, depth - 1);\n }\n return depth;\n}\n\nfunction groupRange(\n statements: LineStatement[],\n groupId: string,\n): { start: number; end: number } | null {\n const start = statements.findIndex((s) => s.kind === \"groupOpen\" && s.id === groupId);\n if (start === -1) return null;\n let depth = 0;\n for (let i = start; i < statements.length; i++) {\n const s = statements[i]!;\n if (s.kind === \"groupOpen\") depth++;\n else if (s.kind === \"groupClose\") {\n depth--;\n if (depth === 0) return { start, end: i };\n }\n }\n return { start, end: statements.length };\n}\n\nfunction insertIntoGroup(\n statements: LineStatement[],\n block: LineStatement[],\n groupId: string | undefined,\n indent: string,\n): void {\n const range = groupId ? groupRange(statements, groupId) : null;\n if (!range) {\n statements.push(...block);\n return;\n }\n const open = statements[range.start] as { indent: string };\n const inner = open.indent + indent;\n const adjusted = block.map((s) =>\n s.kind === \"raw\" ? s : reindent(s, inner + s.indent.slice(indent.length)),\n );\n statements.splice(range.end, 0, ...adjusted);\n}\n\nfunction filterInPlace<T>(arr: T[], keep: (item: T) => boolean): void {\n let j = 0;\n for (let i = 0; i < arr.length; i++) if (keep(arr[i]!)) arr[j++] = arr[i]!;\n arr.length = j;\n}\n\nfunction setTitle(lines: string[], title: string | undefined): string[] {\n const out = [...lines];\n const hasFm = out[0] !== undefined && /^---\\s*$/.test(out[0]);\n if (!hasFm) return title === undefined ? out : [\"---\", `title: ${title}`, \"---\", ...out];\n const close = out.findIndex((l, i) => i > 0 && /^---\\s*$/.test(l));\n const end = close === -1 ? out.length : close;\n const idx = out.findIndex((l, i) => i > 0 && i < end && /^title\\s*:/.test(l));\n if (title === undefined) {\n if (idx !== -1) out.splice(idx, 1);\n if (out.length >= 2 && /^---\\s*$/.test(out[1]!)) out.splice(0, 2);\n return out;\n }\n if (idx !== -1) out[idx] = `title: ${title}`;\n else out.splice(end, 0, `title: ${title}`);\n return out;\n}\n\n/** Sets or removes the frontmatter `title`. Shared with the passthrough adapter. */\nexport function setFrontmatterTitle(lines: string[], title: string | undefined): string[] {\n return setTitle(lines, title);\n}\n\n/** Creates a full adapter from a grammar. */\nexport function createLineAdapter(grammar: LineGrammar): DiagramAdapter<LineBody> {\n return {\n family: grammar.family,\n tier: \"editable\",\n parse: (source, ctx) => parseLineDocument(grammar, source, ctx),\n serialize: (doc) => serializeLineDocument(grammar, doc),\n apply: (doc, op) => applyLineEdit(grammar, doc, op),\n };\n}\n\n/** Joins lines into logical statements by matching `{ … }` across lines. */\nexport function joinBraceBlocks(\n lines: string[],\n extraBlock?: { open: RegExp; close: RegExp },\n): string[] {\n const out: string[] = [];\n let i = 0;\n while (i < lines.length) {\n const line = lines[i]!;\n if (extraBlock && extraBlock.open.test(line)) {\n let cur = line;\n let j = i + 1;\n while (j < lines.length && !extraBlock.close.test(lines[j]!)) {\n cur += \"\\n\" + lines[j];\n j++;\n }\n if (j < lines.length) {\n cur += \"\\n\" + lines[j];\n j++;\n }\n out.push(cur);\n i = j;\n continue;\n }\n const opens = (line.match(/\\{/g) ?? []).length;\n const closes = (line.match(/\\}/g) ?? []).length;\n if (opens > closes && /\\{\\s*$/.test(line)) {\n // Peek: a block whose content is attribute lines (no nested statements)\n // is kept with its opener as one \"node with body\" statement. The group\n // grammars decide via parseLine; here we just gather until the matching `}`.\n let depth = opens - closes;\n let j = i + 1;\n const body: string[] = [];\n let isSimpleBody = true;\n while (j < lines.length && depth > 0) {\n const l = lines[j]!;\n depth += (l.match(/\\{/g) ?? []).length - (l.match(/\\}/g) ?? []).length;\n if (depth > 0) body.push(l);\n if (\n /-->|<\\|--|\\*--|o--|\\.\\.>|--\\|>|\\|\\|--|\\}o--|\\}\\|--|^\\s*(state|class|namespace|note|direction)\\b/.test(\n l,\n ) &&\n depth > 0\n )\n isSimpleBody = false;\n j++;\n }\n if (isSimpleBody && depth === 0) {\n out.push([line, ...body, lines[j - 1]!].join(\"\\n\"));\n i = j;\n continue;\n }\n }\n out.push(line);\n i++;\n }\n return out;\n}\n","import type {\n AdapterParseContext,\n DiagramAdapter,\n DiagramFamily,\n EditOp,\n MermaidDocument,\n SupportTier,\n} from \"./types.js\";\nimport { assembleDocument } from \"./flowchart/serialize.js\";\nimport { setFrontmatterTitle } from \"./lines-grammar/engine.js\";\n\n/** Body of a render-only document: the raw body lines. */\nexport interface PassthroughBody {\n lines: string[];\n}\n\n/**\n * Adapter for families the diagram module cannot edit on a canvas. The text is preserved\n * verbatim; only `replaceSource`, `setTitle` and metadata edits apply.\n */\nexport function createPassthroughAdapter(\n family: DiagramFamily,\n tier: SupportTier = \"render-only\",\n): DiagramAdapter<PassthroughBody> {\n const adapter: DiagramAdapter<PassthroughBody> = {\n family,\n tier,\n parse(source: string, ctx: AdapterParseContext): MermaidDocument<PassthroughBody> {\n const title =\n typeof ctx.preamble.frontmatter?.title === \"string\"\n ? ctx.preamble.frontmatter.title\n : undefined;\n return {\n family,\n tier,\n source,\n preamble: ctx.preamble,\n header: ctx.header,\n trailing: ctx.trailing,\n eol: ctx.eol,\n graph: { direction: \"TB\", nodes: [], edges: [], groups: [], classDefs: {}, title },\n meta: ctx.meta,\n metaCarrier: ctx.metaCarrier,\n body: { lines: ctx.bodyLines },\n diagnostics: [],\n dirty: false,\n };\n },\n serialize(doc) {\n return assembleDocument(doc, doc.body.lines, \" \");\n },\n apply(doc, op: EditOp) {\n const next: MermaidDocument<PassthroughBody> = { ...doc, meta: { ...doc.meta } };\n switch (op.type) {\n case \"setViewport\":\n next.meta.viewport = op.viewport;\n break;\n case \"setMetaExt\":\n next.meta.ext = { ...(next.meta.ext ?? {}), [op.key]: op.value };\n break;\n case \"moveNodes\":\n next.meta.layout = { ...(next.meta.layout ?? {}) };\n for (const { id, position } of op.moves) next.meta.layout[id] = position;\n break;\n case \"setTitle\":\n next.preamble = {\n ...next.preamble,\n lines: setFrontmatterTitle(next.preamble.lines, op.title),\n };\n next.dirty = true;\n break;\n default:\n return doc;\n }\n next.source = adapter.serialize(next);\n return next;\n },\n };\n return adapter;\n}\n","import type { LineGrammar, NodeDecl, EdgeSpec } from \"./engine.js\";\nimport { joinBraceBlocks } from \"./engine.js\";\n\n/**\n * stateDiagram / stateDiagram-v2 grammar.\n *\n * Supported statements: transitions (`A --> B : label`), `state \"desc\" as A`,\n * `state A <<fork|join|choice>>`, composite `state A { … }`, `A : description`,\n * `[*]` start/end pseudo-states, `direction`, `classDef`, `class`, `style`,\n * `A:::cls`. Notes, concurrency separators (`--`) and anything else are kept\n * verbatim as passthrough statements.\n *\n * @module\n */\n\nconst ID = String.raw`[A-Za-z0-9_À-.-]+`;\nconst TRANSITION = new RegExp(\n String.raw`^(\\[\\*\\]|${ID}(?::::${ID})?)\\s*-->\\s*(\\[\\*\\]|${ID}(?::::${ID})?)\\s*(?::\\s*(.*))?$`,\n);\n\nexport const STATE_SHAPES = [\n { name: \"rect\", title: \"State\" },\n { name: \"fork\", title: \"Fork\" },\n { name: \"join\", title: \"Join\" },\n { name: \"choice\", title: \"Choice\" },\n] as const;\n\nfunction splitClasses(token: string): { id: string; classes: string[] } {\n const [id, ...classes] = token.split(\":::\");\n return { id: id!, classes };\n}\n\nfunction quoteIfNeeded(label: string): string {\n return /[\\s:{}\"]/.test(label) || label === \"\" ? `\"${label.replace(/\"/g, \"'\")}\"` : label;\n}\n\nexport const stateGrammar: LineGrammar = {\n family: \"state\",\n defaultShape: \"rect\",\n directionAsStatement: true,\n defaultEdge: { arrowStart: \"none\", arrowEnd: \"arrow_barb\", pattern: \"solid\" },\n\n joinLines(lines) {\n // Multi-line notes: `note right of A` … `end note`\n return joinBraceBlocks(lines, {\n open: /^\\s*note\\s+(left|right)\\s+of\\s+\\S+\\s*$/i,\n close: /^\\s*end\\s+note\\s*$/i,\n }).flatMap((logical) => {\n // Composite states are groups: keep `{` opener and `}` closer as their own lines.\n if (/^\\s*state\\b.*\\{\\s*$/.test(logical.split(\"\\n\")[0]!) && logical.includes(\"\\n\"))\n return logical.split(\"\\n\");\n return [logical];\n });\n },\n\n parseLine(line) {\n const indent = line.match(/^\\s*/)![0];\n const text = line.trim();\n if (text === \"\" || text.startsWith(\"%%\") || text.startsWith(\"note\") || text === \"--\")\n return { kind: \"raw\", raw: line, indent };\n if (text === \"}\") return { kind: \"groupClose\", raw: line, indent };\n let m: RegExpExecArray | null;\n\n if ((m = /^direction\\s+(TB|TD|BT|LR|RL)\\s*$/i.exec(text)))\n return { kind: \"direction\", raw: line, indent, direction: m[1]!.toUpperCase() };\n if ((m = /^classDef\\s+(\\S+)\\s+(.*)$/.exec(text)))\n return {\n kind: \"classDef\",\n raw: line,\n indent,\n names: m[1]!.split(\",\"),\n styles: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n };\n if ((m = /^class\\s+(\\S+)\\s+(\\S+)\\s*$/.exec(text)))\n return { kind: \"class\", raw: line, indent, ids: m[1]!.split(\",\"), className: m[2]! };\n if ((m = /^style\\s+(\\S+)\\s+(.*)$/.exec(text)))\n return {\n kind: \"style\",\n raw: line,\n indent,\n id: m[1]!,\n styles: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n };\n\n // state \"Label\" as A { | state A {\n if ((m = new RegExp(String.raw`^state\\s+(?:\"([^\"]*)\"\\s+as\\s+)?(${ID})\\s*\\{\\s*$`).exec(text))) {\n return { kind: \"groupOpen\", raw: line, indent, id: m[2]!, label: m[1] };\n }\n // state \"Label\" as A | state A <<fork>> | state A\n if (\n (m = new RegExp(\n String.raw`^state\\s+(?:\"([^\"]*)\"\\s+as\\s+)?(${ID})(?::::(${ID}))?(?:\\s+<<(fork|join|choice|end)>>)?\\s*$`,\n ).exec(text))\n ) {\n const decl: NodeDecl = { id: m[2]!, label: m[1], classes: m[3] ? [m[3]] : [] };\n if (m[4]) decl.shape = m[4] === \"end\" ? \"stateEnd\" : m[4];\n return { kind: \"node\", raw: line, indent, decl };\n }\n // Transition\n if ((m = TRANSITION.exec(text))) {\n const s = splitClasses(m[1]!);\n const t = splitClasses(m[2]!);\n return {\n kind: \"edge\",\n raw: line,\n indent,\n source: { id: s.id, classes: s.classes },\n target: { id: t.id, classes: t.classes },\n label: m[3]?.trim() || undefined,\n arrowStart: \"none\",\n arrowEnd: \"arrow_barb\",\n pattern: \"solid\",\n };\n }\n // A : description\n if ((m = new RegExp(String.raw`^(${ID})\\s*:\\s*(.*)$`).exec(text))) {\n return {\n kind: \"node\",\n raw: line,\n indent,\n decl: { id: m[1]!, classes: [], data: { descriptions: [m[2]!.trim()] } },\n };\n }\n // bare id (with optional :::class)\n if ((m = new RegExp(String.raw`^(${ID})(?::::(${ID}))?\\s*$`).exec(text))) {\n return { kind: \"node\", raw: line, indent, decl: { id: m[1]!, classes: m[2] ? [m[2]] : [] } };\n }\n return { kind: \"raw\", raw: line, indent };\n },\n\n formatStatement(stmt) {\n switch (stmt.kind) {\n case \"node\": {\n const d = stmt.decl;\n const descriptions = d.data?.descriptions as string[] | undefined;\n if (descriptions?.length && d.label === undefined && !d.shape) {\n return `${stmt.indent}${d.id} : ${descriptions[0]}`;\n }\n let out = `${stmt.indent}state `;\n if (d.label !== undefined && d.label !== d.id) out += `\"${d.label.replace(/\"/g, \"'\")}\" as `;\n out += d.id;\n for (const c of d.classes) out += `:::${c}`;\n if (d.shape && d.shape !== \"rect\")\n out += ` <<${d.shape === \"stateEnd\" ? \"end\" : d.shape}>>`;\n return out;\n }\n case \"edge\": {\n const fmt = (n: NodeDecl) => n.id + n.classes.map((c) => `:::${c}`).join(\"\");\n const src = fmt(stmt.source);\n const tgt = fmt(stmt.target);\n return `${stmt.indent}${src} --> ${tgt}${stmt.label ? ` : ${stmt.label}` : \"\"}`;\n }\n case \"groupOpen\":\n return `${stmt.indent}state ${stmt.label !== undefined && stmt.label !== stmt.id ? `\"${stmt.label}\" as ` : \"\"}${stmt.id} {`;\n case \"groupClose\":\n return `${stmt.indent}}`;\n case \"direction\":\n return `${stmt.indent}direction ${stmt.direction}`;\n case \"classDef\":\n return `${stmt.indent}classDef ${stmt.names.join(\",\")} ${stmt.styles.join(\",\")}`;\n case \"class\":\n return `${stmt.indent}class ${stmt.ids.join(\",\")} ${stmt.className}`;\n case \"style\":\n return `${stmt.indent}style ${stmt.id} ${stmt.styles.join(\",\")}`;\n default:\n return stmt.raw;\n }\n },\n\n nodeStatement(decl, indent) {\n return {\n kind: \"node\",\n raw: \"\",\n indent,\n decl: { ...decl, classes: [...decl.classes] },\n dirty: true,\n };\n },\n\n edgeStatement(source, target, spec: EdgeSpec, indent) {\n const synthetic = (spec.data?.synthetic ?? {}) as { source?: boolean; target?: boolean };\n const endpoint = (id: string, isSynthetic: boolean | undefined): NodeDecl =>\n isSynthetic ? { id: \"[*]\", classes: [] } : { id, classes: [] };\n return {\n kind: \"edge\",\n raw: \"\",\n indent,\n source: endpoint(source, synthetic.source),\n target: endpoint(target, synthetic.target),\n label: spec.label,\n arrowStart: \"none\",\n arrowEnd: \"arrow_barb\",\n pattern: \"solid\",\n dirty: true,\n };\n },\n\n groupStatements(id, label, indent) {\n return {\n open: { kind: \"groupOpen\", raw: \"\", indent, id, label, dirty: true },\n close: { kind: \"groupClose\", raw: `${indent}}`, indent },\n };\n },\n\n headerDirection(_header, statements) {\n const top = statements.find((s) => s.kind === \"direction\");\n return top && top.kind === \"direction\" ? top.direction : \"TB\";\n },\n\n resolveEndpoint(id, stack, role) {\n if (id !== \"[*]\") return null;\n const scope = stack[stack.length - 1] ?? \"root\";\n return role === \"source\"\n ? { id: `${scope}_start`, shape: \"stateStart\", label: \"\", synthetic: true }\n : { id: `${scope}_end`, shape: \"stateEnd\", label: \"\", synthetic: true };\n },\n};\n\nexport function quoteStateLabel(label: string): string {\n return quoteIfNeeded(label);\n}\n","import type { ArrowHead, EdgePattern } from \"../types.js\";\nimport type { LineGrammar, LineStatement, NodeDecl, EdgeSpec } from \"./engine.js\";\nimport { joinBraceBlocks } from \"./engine.js\";\n\n/**\n * classDiagram grammar.\n *\n * Supported: `class A`, `class A[\"Label\"]`, `class A:::cls`, `class A { … }`\n * bodies (kept verbatim and parsed into members), `A : member`, relations\n * with cardinalities and labels, `namespace N { … }`, `direction`, `classDef`,\n * `cssClass`, `style`. `<<annotation>> A`, notes, `click`, `link`, `callback`\n * stay as passthrough.\n *\n * @module\n */\n\nconst ID = String.raw`[A-Za-z0-9_À-.~-]+`;\n\n/** Relation syntax → arrow heads. Order matters: longer tokens first. */\nexport interface ClassRelation {\n token: string;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n pattern: EdgePattern;\n title: string;\n}\n\nexport const CLASS_RELATIONS: ClassRelation[] = [\n {\n token: \"<|--\",\n arrowStart: \"extension\",\n arrowEnd: \"none\",\n pattern: \"solid\",\n title: \"Inheritance\",\n },\n {\n token: \"--|>\",\n arrowStart: \"none\",\n arrowEnd: \"extension\",\n pattern: \"solid\",\n title: \"Inheritance (reversed)\",\n },\n {\n token: \"<|..\",\n arrowStart: \"extension\",\n arrowEnd: \"none\",\n pattern: \"dotted\",\n title: \"Realization\",\n },\n {\n token: \"..|>\",\n arrowStart: \"none\",\n arrowEnd: \"extension\",\n pattern: \"dotted\",\n title: \"Realization (reversed)\",\n },\n {\n token: \"*--\",\n arrowStart: \"composition\",\n arrowEnd: \"none\",\n pattern: \"solid\",\n title: \"Composition\",\n },\n {\n token: \"--*\",\n arrowStart: \"none\",\n arrowEnd: \"composition\",\n pattern: \"solid\",\n title: \"Composition (reversed)\",\n },\n {\n token: \"o--\",\n arrowStart: \"aggregation\",\n arrowEnd: \"none\",\n pattern: \"solid\",\n title: \"Aggregation\",\n },\n {\n token: \"--o\",\n arrowStart: \"none\",\n arrowEnd: \"aggregation\",\n pattern: \"solid\",\n title: \"Aggregation (reversed)\",\n },\n {\n token: \"<--\",\n arrowStart: \"dependency\",\n arrowEnd: \"none\",\n pattern: \"solid\",\n title: \"Association (reversed)\",\n },\n {\n token: \"-->\",\n arrowStart: \"none\",\n arrowEnd: \"dependency\",\n pattern: \"solid\",\n title: \"Association\",\n },\n {\n token: \"<..\",\n arrowStart: \"dependency\",\n arrowEnd: \"none\",\n pattern: \"dotted\",\n title: \"Dependency (reversed)\",\n },\n {\n token: \"..>\",\n arrowStart: \"none\",\n arrowEnd: \"dependency\",\n pattern: \"dotted\",\n title: \"Dependency\",\n },\n { token: \"()--\", arrowStart: \"lollipop\", arrowEnd: \"none\", pattern: \"solid\", title: \"Lollipop\" },\n {\n token: \"--()\",\n arrowStart: \"none\",\n arrowEnd: \"lollipop\",\n pattern: \"solid\",\n title: \"Lollipop (reversed)\",\n },\n { token: \"--\", arrowStart: \"none\", arrowEnd: \"none\", pattern: \"solid\", title: \"Link (solid)\" },\n { token: \"..\", arrowStart: \"none\", arrowEnd: \"none\", pattern: \"dotted\", title: \"Link (dashed)\" },\n];\n\nconst REL_TOKENS = CLASS_RELATIONS.map((r) => r.token.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\n \"|\",\n);\nconst RELATION = new RegExp(\n String.raw`^(${ID})(?:\\[\"([^\"]*)\"\\])?(?::::(${ID}))?\\s*(?:\"([^\"]*)\"\\s*)?(${REL_TOKENS})\\s*(?:\"([^\"]*)\"\\s*)?(${ID})(?:\\[\"([^\"]*)\"\\])?(?::::(${ID}))?\\s*(?::\\s*(.*))?$`,\n);\n\nexport function relationFor(\n arrowStart: ArrowHead,\n arrowEnd: ArrowHead,\n pattern: EdgePattern,\n): ClassRelation {\n return (\n CLASS_RELATIONS.find(\n (r) => r.arrowStart === arrowStart && r.arrowEnd === arrowEnd && r.pattern === pattern,\n ) ?? CLASS_RELATIONS.find((r) => r.token === \"-->\")!\n );\n}\n\nexport interface ClassMember {\n raw: string;\n visibility?: \"+\" | \"-\" | \"#\" | \"~\";\n kind: \"attribute\" | \"method\";\n}\n\nexport function parseMembers(bodyLines: string[]): ClassMember[] {\n const out: ClassMember[] = [];\n for (const line of bodyLines) {\n const t = line.trim();\n if (!t || t === \"}\" || t.startsWith(\"%%\") || /^<<.*>>$/.test(t)) continue;\n const vis = /^[+\\-#~]/.exec(t)?.[0] as ClassMember[\"visibility\"] | undefined;\n out.push({ raw: t, visibility: vis, kind: /\\(.*\\)/.test(t) ? \"method\" : \"attribute\" });\n }\n return out;\n}\n\nfunction annotationsOf(bodyLines: string[]): string[] {\n return bodyLines\n .map((l) => l.trim())\n .filter((t) => /^<<.*>>$/.test(t))\n .map((t) => t.slice(2, -2));\n}\n\nexport const classGrammar: LineGrammar = {\n family: \"class\",\n defaultShape: \"classBox\",\n directionAsStatement: true,\n defaultEdge: { arrowStart: \"none\", arrowEnd: \"dependency\", pattern: \"solid\" },\n\n joinLines(lines) {\n return joinBraceBlocks(lines, { open: /^\\s*note\\s+(for\\s+\\S+\\s+)?\"[^\"]*$/i, close: /\"\\s*$/ });\n },\n\n parseLine(logical) {\n const [line, ...bodyRest] = logical.split(\"\\n\");\n const indent = line!.match(/^\\s*/)![0];\n const text = line!.trim();\n if (text === \"\" || text.startsWith(\"%%\") || /^(note|click|link|callback|<<)/.test(text))\n return { kind: \"raw\", raw: logical, indent };\n if (text === \"}\") return { kind: \"groupClose\", raw: line!, indent };\n let m: RegExpExecArray | null;\n\n if ((m = /^direction\\s+(TB|TD|BT|LR|RL)\\s*$/i.exec(text)))\n return { kind: \"direction\", raw: line!, indent, direction: m[1]!.toUpperCase() };\n if ((m = /^classDef\\s+(\\S+)\\s+(.*)$/.exec(text)))\n return {\n kind: \"classDef\",\n raw: line!,\n indent,\n names: m[1]!.split(\",\"),\n styles: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n };\n if ((m = /^cssClass\\s+\"([^\"]+)\"\\s+(\\S+)\\s*$/.exec(text)))\n return {\n kind: \"class\",\n raw: line!,\n indent,\n ids: m[1]!.split(\",\").map((s) => s.trim()),\n className: m[2]!,\n };\n if ((m = /^style\\s+(\\S+)\\s+(.*)$/.exec(text)))\n return {\n kind: \"style\",\n raw: line!,\n indent,\n id: m[1]!,\n styles: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n };\n\n if ((m = new RegExp(String.raw`^namespace\\s+(${ID})\\s*\\{\\s*$`).exec(text)))\n return { kind: \"groupOpen\", raw: line!, indent, id: m[1]! };\n\n // class A[\"Label\"]:::cls { (body joined) | class A\n if (\n (m = new RegExp(\n String.raw`^class\\s+(${ID})(?:\\[\"([^\"]*)\"\\])?(?::::(${ID}))?\\s*(\\{)?\\s*$`,\n ).exec(text))\n ) {\n const decl: NodeDecl = { id: m[1]!, label: m[2], classes: m[3] ? [m[3]] : [] };\n if (m[4] && bodyRest.length) {\n decl.data = { members: parseMembers(bodyRest), annotations: annotationsOf(bodyRest) };\n return { kind: \"node\", raw: line!, indent, decl, body: bodyRest };\n }\n if (m[4] && !bodyRest.length) {\n // `class A {` whose body contains statements → treat as a group-like raw.\n return { kind: \"raw\", raw: line!, indent };\n }\n return { kind: \"node\", raw: line!, indent, decl };\n }\n\n if ((m = RELATION.exec(text))) {\n const rel = CLASS_RELATIONS.find((r) => r.token === m![5])!;\n return {\n kind: \"edge\",\n raw: line!,\n indent,\n source: { id: m[1]!, label: m[2], classes: m[3] ? [m[3]] : [] },\n target: { id: m[7]!, label: m[8], classes: m[9] ? [m[9]] : [] },\n label: m[10]?.trim() || undefined,\n arrowStart: rel.arrowStart,\n arrowEnd: rel.arrowEnd,\n pattern: rel.pattern,\n data: { cardinalityStart: m[4], cardinalityEnd: m[6] },\n };\n }\n\n // A : +member\n if ((m = new RegExp(String.raw`^(${ID})\\s*:\\s*(.+)$`).exec(text))) {\n return {\n kind: \"node\",\n raw: line!,\n indent,\n decl: { id: m[1]!, classes: [], data: { members: parseMembers([m[2]!]) } },\n };\n }\n return { kind: \"raw\", raw: logical, indent };\n },\n\n formatStatement(stmt) {\n switch (stmt.kind) {\n case \"node\": {\n const d = stmt.decl;\n const members = d.data?.members as ClassMember[] | undefined;\n if (\n !stmt.body &&\n members?.length === 1 &&\n d.label === undefined &&\n !d.classes.length &&\n stmt.raw.includes(\" : \")\n ) {\n return `${stmt.indent}${d.id} : ${members[0]!.raw}`;\n }\n let out = `${stmt.indent}class ${d.id}`;\n if (d.label !== undefined && d.label !== d.id) out += `[\"${d.label.replace(/\"/g, \"'\")}\"]`;\n for (const c of d.classes) out += `:::${c}`;\n if (stmt.body) out += \" {\";\n return out;\n }\n case \"edge\": {\n const rel = relationFor(stmt.arrowStart, stmt.arrowEnd, stmt.pattern);\n const cs = stmt.data?.cardinalityStart as string | undefined;\n const ce = stmt.data?.cardinalityEnd as string | undefined;\n const fmt = (n: NodeDecl) =>\n n.id +\n (n.label !== undefined ? `[\"${n.label}\"]` : \"\") +\n n.classes.map((c) => `:::${c}`).join(\"\");\n return `${stmt.indent}${fmt(stmt.source)} ${cs ? `\"${cs}\" ` : \"\"}${rel.token} ${ce ? `\"${ce}\" ` : \"\"}${fmt(stmt.target)}${stmt.label ? ` : ${stmt.label}` : \"\"}`;\n }\n case \"groupOpen\":\n return `${stmt.indent}namespace ${stmt.id} {`;\n case \"groupClose\":\n return `${stmt.indent}}`;\n case \"direction\":\n return `${stmt.indent}direction ${stmt.direction}`;\n case \"classDef\":\n return `${stmt.indent}classDef ${stmt.names.join(\",\")} ${stmt.styles.join(\",\")}`;\n case \"class\":\n return `${stmt.indent}cssClass \"${stmt.ids.join(\",\")}\" ${stmt.className}`;\n case \"style\":\n return `${stmt.indent}style ${stmt.id} ${stmt.styles.join(\",\")}`;\n default:\n return stmt.raw;\n }\n },\n\n nodeStatement(decl, indent) {\n const members = decl.data?.members as ClassMember[] | undefined;\n const body = members?.length\n ? [...members.map((m) => `${indent} ${m.raw}`), `${indent}}`]\n : undefined;\n return {\n kind: \"node\",\n raw: \"\",\n indent,\n decl: { ...decl, classes: [...decl.classes] },\n body,\n dirty: true,\n };\n },\n\n edgeStatement(source, target, spec: EdgeSpec, indent) {\n return {\n kind: \"edge\",\n raw: \"\",\n indent,\n source: { id: source, classes: [] },\n target: { id: target, classes: [] },\n label: spec.label,\n arrowStart: spec.arrowStart,\n arrowEnd: spec.arrowEnd,\n pattern: spec.pattern,\n data: spec.data,\n dirty: true,\n };\n },\n\n groupStatements(id, _label, indent) {\n return {\n open: { kind: \"groupOpen\", raw: \"\", indent, id, dirty: true },\n close: { kind: \"groupClose\", raw: `${indent}}`, indent },\n };\n },\n\n headerDirection(_header, statements) {\n const top = statements.find((s) => s.kind === \"direction\");\n return top && top.kind === \"direction\" ? top.direction : \"TB\";\n },\n};\n\nexport type { LineStatement };\n","import type { ArrowHead, EdgePattern } from \"../types.js\";\nimport type { LineGrammar, NodeDecl, EdgeSpec } from \"./engine.js\";\nimport { joinBraceBlocks } from \"./engine.js\";\n\n/**\n * erDiagram grammar.\n *\n * Supported: relationships with crow's-foot cardinalities\n * (`A ||--o{ B : label`), entities with attribute blocks (kept verbatim and\n * parsed), aliases (`A[Alias]`), `direction`, `classDef`, `class`, `style`,\n * `A:::cls`. Word-form cardinalities (`one or more to …`) are passthrough.\n *\n * @module\n */\n\nconst ID = String.raw`[A-Za-z0-9_À--]+|\"[^\"]+\"`;\n\nexport const ER_CARDINALITIES: {\n token: string;\n head: ArrowHead;\n side: \"left\" | \"right\";\n title: string;\n}[] = [\n { token: \"|o\", head: \"zero_or_one\", side: \"left\", title: \"Zero or one\" },\n { token: \"||\", head: \"only_one\", side: \"left\", title: \"Exactly one\" },\n { token: \"}o\", head: \"zero_or_more\", side: \"left\", title: \"Zero or more\" },\n { token: \"}|\", head: \"one_or_more\", side: \"left\", title: \"One or more\" },\n { token: \"o|\", head: \"zero_or_one\", side: \"right\", title: \"Zero or one\" },\n { token: \"||\", head: \"only_one\", side: \"right\", title: \"Exactly one\" },\n { token: \"o{\", head: \"zero_or_more\", side: \"right\", title: \"Zero or more\" },\n { token: \"|{\", head: \"one_or_more\", side: \"right\", title: \"One or more\" },\n];\n\nconst LEFT: Record<string, ArrowHead> = {\n \"|o\": \"zero_or_one\",\n \"||\": \"only_one\",\n \"}o\": \"zero_or_more\",\n \"}|\": \"one_or_more\",\n};\nconst RIGHT: Record<string, ArrowHead> = {\n \"o|\": \"zero_or_one\",\n \"||\": \"only_one\",\n \"o{\": \"zero_or_more\",\n \"|{\": \"one_or_more\",\n};\nconst LEFT_TOKEN: Partial<Record<ArrowHead, string>> = {\n zero_or_one: \"|o\",\n only_one: \"||\",\n zero_or_more: \"}o\",\n one_or_more: \"}|\",\n};\nconst RIGHT_TOKEN: Partial<Record<ArrowHead, string>> = {\n zero_or_one: \"o|\",\n only_one: \"||\",\n zero_or_more: \"o{\",\n one_or_more: \"|{\",\n};\n\nconst RELATION = new RegExp(\n String.raw`^(${ID})(?:\\[([^\\]]*)\\])?(?::::([\\w-]+))?\\s+(\\|o|\\|\\||\\}o|\\}\\|)(--|\\.\\.|\\.-|-\\.)(o\\||\\|\\||o\\{|\\|\\{)\\s+(${ID})(?:\\[([^\\]]*)\\])?(?::::([\\w-]+))?\\s*:\\s*(.*)$`,\n);\n\nexport interface ErAttribute {\n raw: string;\n type: string;\n name: string;\n keys: string[];\n comment?: string;\n}\n\nexport function parseAttributes(bodyLines: string[]): ErAttribute[] {\n const out: ErAttribute[] = [];\n for (const line of bodyLines) {\n const t = line.trim();\n if (!t || t === \"}\" || t.startsWith(\"%%\")) continue;\n const m =\n /^(\\S+)\\s+(\\S+)((?:\\s+(?:PK|FK|UK)(?:\\s*,\\s*(?:PK|FK|UK))*)?)\\s*(?:\"([^\"]*)\")?\\s*$/.exec(t);\n if (m) {\n out.push({\n raw: t,\n type: m[1]!,\n name: m[2]!,\n keys: (m[3] ?? \"\").split(/[\\s,]+/).filter(Boolean),\n comment: m[4],\n });\n } else {\n out.push({ raw: t, type: \"\", name: t, keys: [] });\n }\n }\n return out;\n}\n\nfunction unq(id: string): string {\n return id.startsWith('\"') && id.endsWith('\"') ? id.slice(1, -1) : id;\n}\n\nfunction fmtId(id: string): string {\n return /[\\s]/.test(id) ? `\"${id}\"` : id;\n}\n\nexport const erGrammar: LineGrammar = {\n family: \"er\",\n defaultShape: \"erBox\",\n directionAsStatement: true,\n supportsGroups: false,\n defaultEdge: { arrowStart: \"only_one\", arrowEnd: \"zero_or_more\", pattern: \"solid\", label: \"has\" },\n\n joinLines(lines) {\n return joinBraceBlocks(lines);\n },\n\n parseLine(logical) {\n const [line, ...bodyRest] = logical.split(\"\\n\");\n const indent = line!.match(/^\\s*/)![0];\n const text = line!.trim();\n if (text === \"\" || text.startsWith(\"%%\")) return { kind: \"raw\", raw: logical, indent };\n let m: RegExpExecArray | null;\n\n if ((m = /^direction\\s+(TB|TD|BT|LR|RL)\\s*$/i.exec(text)))\n return { kind: \"direction\", raw: line!, indent, direction: m[1]!.toUpperCase() };\n if ((m = /^classDef\\s+(\\S+)\\s+(.*)$/.exec(text)))\n return {\n kind: \"classDef\",\n raw: line!,\n indent,\n names: m[1]!.split(\",\"),\n styles: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n };\n if ((m = /^class\\s+(\\S+)\\s+(\\S+)\\s*$/.exec(text)))\n return { kind: \"class\", raw: line!, indent, ids: m[1]!.split(\",\"), className: m[2]! };\n if ((m = /^style\\s+(\\S+)\\s+(.*)$/.exec(text)))\n return {\n kind: \"style\",\n raw: line!,\n indent,\n id: m[1]!,\n styles: m[2]!\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n };\n\n if ((m = RELATION.exec(text))) {\n const line_ = m[5]!;\n return {\n kind: \"edge\",\n raw: line!,\n indent,\n source: { id: unq(m[1]!), label: m[2], classes: m[3] ? [m[3]] : [] },\n target: { id: unq(m[7]!), label: m[8], classes: m[9] ? [m[9]] : [] },\n label: unq(m[10]!.trim()),\n arrowStart: LEFT[m[4]!]!,\n arrowEnd: RIGHT[m[6]!]!,\n pattern: line_ === \"--\" ? \"solid\" : \"dotted\",\n data: { identifying: line_ === \"--\" },\n };\n }\n\n // Entity with attributes: NAME[\"Label\"]:::cls {\n if (\n (m = new RegExp(String.raw`^(${ID})(?:\\[([^\\]]*)\\])?(?::::([\\w-]+))?\\s*(\\{)?\\s*$`).exec(text))\n ) {\n const decl: NodeDecl = {\n id: unq(m[1]!),\n label: m[2] !== undefined ? unq(m[2]) : undefined,\n classes: m[3] ? [m[3]] : [],\n };\n if (m[4]) {\n decl.data = { attributes: parseAttributes(bodyRest) };\n return { kind: \"node\", raw: line!, indent, decl, body: bodyRest };\n }\n return { kind: \"node\", raw: line!, indent, decl };\n }\n return { kind: \"raw\", raw: logical, indent };\n },\n\n formatStatement(stmt) {\n switch (stmt.kind) {\n case \"node\": {\n const d = stmt.decl;\n let out = `${stmt.indent}${fmtId(d.id)}`;\n if (d.label !== undefined && d.label !== d.id) out += `[\"${d.label}\"]`;\n for (const c of d.classes) out += `:::${c}`;\n if (stmt.body) out += \" {\";\n return out;\n }\n case \"edge\": {\n const fmt = (n: NodeDecl) =>\n fmtId(n.id) +\n (n.label !== undefined ? `[\"${n.label}\"]` : \"\") +\n n.classes.map((c) => `:::${c}`).join(\"\");\n const l = LEFT_TOKEN[stmt.arrowStart] ?? \"||\";\n const r = RIGHT_TOKEN[stmt.arrowEnd] ?? \"o{\";\n const mid = stmt.pattern === \"dotted\" ? \"..\" : \"--\";\n const label = stmt.label ?? \"\";\n return `${stmt.indent}${fmt(stmt.source)} ${l}${mid}${r} ${fmt(stmt.target)} : ${/\\s/.test(label) ? `\"${label}\"` : label || '\"\"'}`;\n }\n case \"direction\":\n return `${stmt.indent}direction ${stmt.direction}`;\n case \"classDef\":\n return `${stmt.indent}classDef ${stmt.names.join(\",\")} ${stmt.styles.join(\",\")}`;\n case \"class\":\n return `${stmt.indent}class ${stmt.ids.join(\",\")} ${stmt.className}`;\n case \"style\":\n return `${stmt.indent}style ${stmt.id} ${stmt.styles.join(\",\")}`;\n default:\n return stmt.raw;\n }\n },\n\n nodeStatement(decl, indent) {\n const attrs = decl.data?.attributes as ErAttribute[] | undefined;\n const body = attrs?.length\n ? [...attrs.map((a) => `${indent} ${a.raw}`), `${indent}}`]\n : undefined;\n return {\n kind: \"node\",\n raw: \"\",\n indent,\n decl: { ...decl, classes: [...decl.classes] },\n body,\n dirty: true,\n };\n },\n\n edgeStatement(source, target, spec: EdgeSpec, indent) {\n return {\n kind: \"edge\",\n raw: \"\",\n indent,\n source: { id: source, classes: [] },\n target: { id: target, classes: [] },\n label: spec.label ?? \"has\",\n arrowStart: spec.arrowStart,\n arrowEnd: spec.arrowEnd,\n pattern: spec.pattern,\n data: spec.data,\n dirty: true,\n };\n },\n\n groupStatements(id, _label, indent) {\n // ER diagrams have no grouping construct; emit a comment pair so the\n // engine's bookkeeping still works and Mermaid ignores it.\n return {\n open: { kind: \"raw\", raw: `${indent}%% group ${id}`, indent },\n close: { kind: \"raw\", raw: `${indent}%% end group ${id}`, indent },\n };\n },\n\n headerDirection(_header, statements) {\n const top = statements.find((s) => s.kind === \"direction\");\n return top && top.kind === \"direction\" ? top.direction : \"TB\";\n },\n};\n\nexport const ER_PATTERNS: { pattern: EdgePattern; title: string }[] = [\n { pattern: \"solid\", title: \"Identifying\" },\n { pattern: \"dotted\", title: \"Non-identifying\" },\n];\n","import type {\n AdapterParseContext,\n Diagnostic,\n DiagramAdapter,\n DiagramFamily,\n DiagramGraph,\n EditOp,\n MermaidDocument,\n Point,\n} from \"../types.js\";\nimport { assembleDocument } from \"../flowchart/serialize.js\";\nimport { setFrontmatterTitle } from \"../lines-grammar/engine.js\";\nimport { splitSource } from \"../source/lines.js\";\nimport {\n defaultCarrierFor,\n emptyMeta,\n extractMetaFromBody,\n extractMetaFromFrontmatter,\n mergeMeta,\n} from \"../source/metadata.js\";\n\n/**\n * Shared scaffolding for statement-based adapters whose semantics do not fit\n * the flowchart-like line-grammar engine (sequence, gantt, pie, mindmap,\n * timeline, journey, gitGraph, architecture, quadrant…).\n *\n * A grammar turns body lines into typed statements that always keep their\n * `raw` text. Serialisation emits `raw` for untouched statements and\n * `format(stmt)` for dirty ones, so untouched documents round-trip\n * byte-for-byte. Edits mutate a shallow copy of the statement list, then the\n * document is serialised and re-parsed so `graph` always matches `source`.\n *\n * The base handles metadata ops (`moveNodes`, `resizeNode`, `setViewport`,\n * `setMetaExt`), `replaceSource` and a frontmatter fallback for `setTitle`;\n * everything else is delegated to `grammar.edit`.\n *\n * @module\n */\n\n/** Minimum shape of a statement: raw text plus a dirty flag. */\nexport interface BaseStatement {\n raw: string;\n indent: string;\n /** When true, {@link StatementGrammar.format} regenerates the text. */\n dirty?: boolean;\n}\n\nexport interface StatementBody<S extends BaseStatement> {\n statements: S[];\n}\n\nexport type StatementDocument<S extends BaseStatement> = MermaidDocument<StatementBody<S>>;\n\nexport interface GraphBuildContext {\n header: string;\n /** `title` from the frontmatter, if any. */\n frontmatterTitle?: string;\n meta: AdapterParseContext[\"meta\"];\n}\n\nexport interface EditContext<S extends BaseStatement> {\n /** The document the edit is applied to (read-only; `statements` is the working copy). */\n doc: StatementDocument<S>;\n /** Mutable working copy of the statement list. */\n statements: S[];\n /** Mutable copy of the metadata (layout/sizes already cloned). */\n meta: AdapterParseContext[\"meta\"];\n /** Indentation unit detected in the document (or the grammar default). */\n indent: string;\n /** Replaces the header line (families that encode settings in it). */\n setHeader(header: string): void;\n /** Replaces the preamble lines (frontmatter edits). */\n setPreambleLines(lines: string[]): void;\n}\n\nexport interface StatementGrammar<S extends BaseStatement> {\n family: DiagramFamily;\n /** Groups physical lines into logical statements (default: one per line). */\n joinLines?(lines: string[]): string[];\n parseLine(line: string, index: number, all: string[]): S;\n /** Regenerates the text of a dirty statement (may return several lines joined by `\\n`). */\n format(stmt: S): string;\n buildGraph(\n statements: S[],\n ctx: GraphBuildContext,\n ): { graph: DiagramGraph; diagnostics?: Diagnostic[] };\n /**\n * Applies a structural edit by mutating `ctx.statements` (and/or header,\n * preamble, meta). Return `false` for ops the family does not support; the\n * document is then returned unchanged.\n */\n edit(op: EditOp, ctx: EditContext<S>): boolean;\n /**\n * Optional hook for families whose positions are data rather than layout\n * metadata (quadrant points: moving a point rewrites its coordinates). Called\n * before the base's own handling of `moveNodes`, `resizeNode`, `setViewport`\n * and `setMetaExt`; return `true` when the op was handled (the document is\n * then serialised and re-parsed), `false` to fall back to the default.\n */\n interceptMeta?(op: EditOp, ctx: EditContext<S>): boolean;\n /** Indentation unit used when the document has none. */\n defaultIndent?: string;\n /**\n * Whether `setTitle` is handled by `edit` (a `title` statement) rather than\n * by the frontmatter fallback. Default false.\n */\n titleAsStatement?: boolean;\n}\n\nfunction detectIndent(statements: BaseStatement[], fallback: string): string {\n for (const s of statements) if (s.indent) return s.indent;\n return fallback;\n}\n\nexport function parseStatementDocument<S extends BaseStatement>(\n grammar: StatementGrammar<S>,\n source: string,\n ctx: AdapterParseContext,\n): StatementDocument<S> {\n const logical = grammar.joinLines ? grammar.joinLines(ctx.bodyLines) : ctx.bodyLines;\n const statements = logical.map((line, i) => grammar.parseLine(line, i, logical));\n const frontmatterTitle =\n typeof ctx.preamble.frontmatter?.title === \"string\"\n ? ctx.preamble.frontmatter.title\n : undefined;\n const { graph, diagnostics } = grammar.buildGraph(statements, {\n header: ctx.header,\n frontmatterTitle,\n meta: ctx.meta,\n });\n if (graph.title === undefined && frontmatterTitle !== undefined) graph.title = frontmatterTitle;\n return {\n family: grammar.family,\n tier: \"editable\",\n source,\n preamble: ctx.preamble,\n header: ctx.header,\n trailing: ctx.trailing,\n eol: ctx.eol,\n graph,\n meta: ctx.meta,\n metaCarrier: ctx.metaCarrier,\n body: { statements },\n diagnostics: diagnostics ?? [],\n dirty: false,\n };\n}\n\nexport function serializeStatementDocument<S extends BaseStatement>(\n grammar: StatementGrammar<S>,\n doc: StatementDocument<S>,\n): string {\n const lines: string[] = [];\n for (const stmt of doc.body.statements) {\n const text = stmt.dirty ? grammar.format(stmt) : stmt.raw;\n lines.push(...text.split(\"\\n\"));\n }\n return assembleDocument(\n doc,\n lines,\n detectIndent(doc.body.statements, grammar.defaultIndent ?? \" \"),\n );\n}\n\nfunction parseFull<S extends BaseStatement>(\n grammar: StatementGrammar<S>,\n source: string,\n carrier?: MermaidDocument[\"metaCarrier\"],\n): StatementDocument<S> {\n const split = splitSource(source);\n const fromBody = extractMetaFromBody(split.bodyLines);\n const fromFm = extractMetaFromFrontmatter(split.preamble);\n let meta = emptyMeta();\n if (fromFm) meta = mergeMeta(meta, fromFm);\n if (fromBody.meta) meta = mergeMeta(meta, fromBody.meta);\n return parseStatementDocument(grammar, source, {\n source,\n eol: split.eol,\n preamble: split.preamble,\n header: split.header,\n bodyLines: fromBody.bodyLines,\n trailing: split.trailing,\n meta,\n metaCarrier:\n carrier ?? (fromFm && !fromBody.meta ? \"frontmatter\" : defaultCarrierFor(grammar.family)),\n family: grammar.family,\n });\n}\n\nexport function applyStatementEdit<S extends BaseStatement>(\n grammar: StatementGrammar<S>,\n doc: StatementDocument<S>,\n op: EditOp,\n): StatementDocument<S> {\n const statements = doc.body.statements.map((s) => ({ ...s })) as S[];\n const work: StatementDocument<S> = {\n ...doc,\n body: { statements },\n meta: { ...doc.meta, layout: { ...doc.meta.layout }, sizes: { ...doc.meta.sizes } },\n };\n const reparse = (structural: boolean): StatementDocument<S> => {\n const text = serializeStatementDocument(grammar, work);\n const next = parseFull(grammar, text, work.metaCarrier);\n next.dirty = doc.dirty || structural;\n return next;\n };\n\n const makeContext = (): EditContext<S> => ({\n doc,\n statements,\n meta: work.meta,\n indent: detectIndent(statements, grammar.defaultIndent ?? \" \"),\n setHeader: (h) => {\n work.header = h;\n },\n setPreambleLines: (lines) => {\n work.preamble = { ...work.preamble, lines };\n },\n });\n const metaOp =\n op.type === \"moveNodes\" ||\n op.type === \"resizeNode\" ||\n op.type === \"setViewport\" ||\n op.type === \"setMetaExt\";\n if (metaOp && grammar.interceptMeta?.(op, makeContext())) return reparse(true);\n\n switch (op.type) {\n case \"moveNodes\":\n for (const { id, position } of op.moves) work.meta.layout![id] = position as Point;\n break;\n case \"resizeNode\":\n if (op.size) work.meta.sizes![op.id] = op.size;\n else delete work.meta.sizes![op.id];\n break;\n case \"setViewport\":\n work.meta.viewport = op.viewport;\n break;\n case \"setMetaExt\":\n work.meta.ext = { ...(work.meta.ext ?? {}), [op.key]: op.value };\n if (op.value === undefined) delete work.meta.ext[op.key];\n break;\n case \"replaceSource\":\n return parseFull(grammar, op.source, work.metaCarrier);\n default: {\n let handled = grammar.edit(op, makeContext());\n if (!handled && op.type === \"setTitle\" && !grammar.titleAsStatement) {\n work.preamble = {\n ...work.preamble,\n lines: setFrontmatterTitle(work.preamble.lines, op.title),\n };\n handled = true;\n }\n if (!handled) return doc;\n return reparse(true);\n }\n }\n return reparse(false);\n}\n\n/** Creates a full adapter from a statement grammar. */\nexport function createStatementAdapter<S extends BaseStatement>(\n grammar: StatementGrammar<S>,\n): DiagramAdapter<StatementBody<S>> {\n return {\n family: grammar.family,\n tier: \"editable\",\n parse: (source, ctx) => parseStatementDocument(grammar, source, ctx),\n serialize: (doc) => serializeStatementDocument(grammar, doc),\n apply: (doc, op) => applyStatementEdit(grammar, doc, op),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers shared by grammars\n// ---------------------------------------------------------------------------\n\n/** Leading whitespace of a line. */\nexport function indentOf(line: string): string {\n return line.match(/^\\s*/)![0];\n}\n\n/** Lower-case, `_`-joined identifier derived from free text; `fallback` when empty. */\nexport function slugId(text: string, fallback = \"item\"): string {\n const slug = text\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^A-Za-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return slug || fallback;\n}\n\n/** Returns `base`, or `base_2`, `base_3`… until unused in `taken` (which is updated). */\nexport function uniqueId(base: string, taken: Set<string>): string {\n let id = base;\n let n = 2;\n while (taken.has(id)) id = `${base}_${n++}`;\n taken.add(id);\n return id;\n}\n\n/** Removes the elements for which `keep` is false, in place. */\nexport function filterInPlace<T>(arr: T[], keep: (item: T, index: number) => boolean): void {\n let j = 0;\n for (let i = 0; i < arr.length; i++) if (keep(arr[i]!, i)) arr[j++] = arr[i]!;\n arr.length = j;\n}\n\n/** Moves metadata (layout, size) from one id to another, e.g. after a rename. */\nexport function renameMetaKey(meta: AdapterParseContext[\"meta\"], from: string, to: string): void {\n if (from === to) return;\n if (meta.layout?.[from]) {\n meta.layout[to] = meta.layout[from]!;\n delete meta.layout[from];\n }\n if (meta.sizes?.[from]) {\n meta.sizes[to] = meta.sizes[from]!;\n delete meta.sizes[from];\n }\n}\n\n/** Removes metadata for ids that no longer exist. */\nexport function dropMetaKeys(meta: AdapterParseContext[\"meta\"], ids: Iterable<string>): void {\n for (const id of ids) {\n delete meta.layout?.[id];\n delete meta.sizes?.[id];\n }\n}\n\n/** Wraps text in double quotes, escaping inner quotes Mermaid-style. */\nexport function quote(text: string): string {\n return `\"${text.replace(/\"/g, \"#quot;\")}\"`;\n}\n\n/** Strips one layer of matching double quotes. */\nexport function unquote(text: string): string {\n const t = text.trim();\n return t.length >= 2 && t.startsWith('\"') && t.endsWith('\"') ? t.slice(1, -1) : t;\n}\n\n/** Splits on a separator outside quotes/brackets. */\nexport function splitOutsideQuotes(text: string, sep: string): string[] {\n const out: string[] = [];\n let cur = \"\";\n let quoteCh: string | null = null;\n let depth = 0;\n for (const ch of text) {\n if (quoteCh) {\n cur += ch;\n if (ch === quoteCh) quoteCh = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") {\n quoteCh = ch;\n cur += ch;\n continue;\n }\n if (\"([{\".includes(ch)) depth++;\n else if (\")]}\".includes(ch)) depth = Math.max(0, depth - 1);\n if (ch === sep && depth === 0) {\n out.push(cur);\n cur = \"\";\n continue;\n }\n cur += ch;\n }\n out.push(cur);\n return out;\n}\n","import type { DiagramGraph } from \"../types.js\";\n\n/**\n * Geometry of a pie chart as Mermaid draws it (`pieRenderer.ts`): a 450×450\n * frame with the pie centred in it (radius 185 = 450 / 2 − 40), wedges in\n * document order clockwise from 12 o'clock, a percentage label on each wedge\n * at 0.75 of the radius, the legend to the right of the pie (one 18 px colour\n * square + name per row, 22 px apart, vertically centred) and the title\n * centred above. Shared by the layout and the React canvas, so both agree.\n *\n * Mermaid's quirks are kept: a label that repeats an earlier one is ignored\n * (the first value wins); slices under 1 % of the total get no wedge (the\n * others share the full circle) but keep their legend row; wedge colours\n * follow the order of the distinct labels (`pie1`…`pie12`, cycling).\n *\n * All coordinates are canvas pixels in the frame of Mermaid's SVG.\n *\n * @module\n */\n\n/** Mermaid's pie defaults. */\nexport const PIE_METRICS = {\n height: 450,\n margin: 40,\n legendRectSize: 18,\n legendSpacing: 4,\n /** `pie.textPosition`: label distance from the centre, as a fraction of the radius. */\n textPosition: 0.75,\n /** `pieOuterStrokeWidth` (the outer circle sits half a stroke outside the wedges). */\n outerStrokeWidth: 2,\n titleFontSize: 25,\n legendFontSize: 17,\n /** Wedges under this percentage of the total are not drawn. */\n minPercent: 1,\n} as const;\n\nexport interface PieSliceGeometry {\n id: string;\n label: string;\n value: number;\n /** Share of the total, 0–100 (what the wedge label shows, rounded). */\n percent: number;\n /** Index into Mermaid's `pie1`…`pie12` palette (0-based, already wrapped). */\n colorIndex: number;\n /** False for slices too small to get a wedge (and for duplicate labels). */\n drawn: boolean;\n /** Radians clockwise from 12 o'clock. */\n startAngle: number;\n endAngle: number;\n /** SVG path of the wedge, in canvas coordinates. */\n path: string;\n /** Anchor of the percentage label (`text-anchor: middle`, alphabetic baseline). */\n labelX: number;\n labelY: number;\n /** The wedge's label text, e.g. `42%`. */\n labelText: string;\n}\n\nexport interface PieLegendEntry {\n sliceId: string;\n label: string;\n /** Text Mermaid prints: the label, plus ` [value]` with `showData`. */\n text: string;\n colorIndex: number;\n /** Top-left of the colour square. */\n x: number;\n y: number;\n}\n\nexport interface PieGeometry {\n cx: number;\n cy: number;\n radius: number;\n /** Radius of the outer circle's centre line. */\n outerRadius: number;\n /** Square every wedge node shares (the pie plus its outer stroke). */\n box: { x: number; y: number; width: number; height: number };\n /** One entry per graph node, in document order (duplicates have `drawn: false`). */\n slices: PieSliceGeometry[];\n legend: PieLegendEntry[];\n /** Title anchor (`text-anchor: middle`, alphabetic baseline), when there is a title. */\n title?: { text: string; x: number; y: number };\n}\n\nconst TAU = Math.PI * 2;\n\nconst round = (v: number) => Math.round(v * 1000) / 1000;\n\n/** The point at `angle` (clockwise from 12 o'clock) on a circle. */\nfunction polar(cx: number, cy: number, r: number, angle: number): [number, number] {\n return [round(cx + r * Math.sin(angle)), round(cy - r * Math.cos(angle))];\n}\n\n/** A wedge path as d3's `arc()` draws it (a full circle for a lone slice). */\nexport function wedgePath(\n cx: number,\n cy: number,\n r: number,\n startAngle: number,\n endAngle: number,\n): string {\n const sweep = endAngle - startAngle;\n if (sweep <= 0) return \"\";\n if (sweep >= TAU - 1e-6) {\n const [x0, y0] = polar(cx, cy, r, 0);\n const [x1, y1] = polar(cx, cy, r, Math.PI);\n return `M${x0},${y0}A${r},${r},0,1,1,${x1},${y1}A${r},${r},0,1,1,${x0},${y0}Z`;\n }\n const [x0, y0] = polar(cx, cy, r, startAngle);\n const [x1, y1] = polar(cx, cy, r, endAngle);\n const large = sweep > Math.PI ? 1 : 0;\n return `M${x0},${y0}A${r},${r},0,${large},1,${x1},${y1}L${cx},${cy}Z`;\n}\n\n/** Rough legend text width (Mermaid measures the DOM; the canvas only needs a hit box). */\nexport function legendTextWidth(text: string): number {\n return Math.ceil(text.length * PIE_METRICS.legendFontSize * 0.56);\n}\n\n/** Computes the pie as Mermaid would draw `graph`. */\nexport function pieGeometry(graph: Pick<DiagramGraph, \"nodes\" | \"title\" | \"data\">): PieGeometry {\n const M = PIE_METRICS;\n const cx = M.height / 2;\n const cy = M.height / 2;\n const radius = M.height / 2 - M.margin;\n const outerRadius = radius + M.outerStrokeWidth / 2;\n const pad = M.outerStrokeWidth;\n const box = {\n x: cx - outerRadius - pad,\n y: cy - outerRadius - pad,\n width: 2 * (outerRadius + pad),\n height: 2 * (outerRadius + pad),\n };\n\n // Mermaid keeps the first section for each label.\n const seen = new Set<string>();\n const sections: { id: string; label: string; value: number }[] = [];\n const duplicates = new Set<string>();\n for (const n of graph.nodes) {\n const value = typeof n.data?.value === \"number\" ? n.data.value : 0;\n if (seen.has(n.label)) {\n duplicates.add(n.id);\n continue;\n }\n seen.add(n.label);\n sections.push({ id: n.id, label: n.label, value });\n }\n const sum = sections.reduce((acc, s) => acc + s.value, 0);\n const pct = (v: number) => (sum > 0 ? (v / sum) * 100 : 0);\n const drawn = sections.filter((s) => pct(s.value) >= M.minPercent);\n const drawnSum = drawn.reduce((acc, s) => acc + s.value, 0);\n\n const angles = new Map<string, [number, number]>();\n let angle = 0;\n for (const s of drawn) {\n const sweep = drawnSum > 0 ? (s.value / drawnSum) * TAU : 0;\n angles.set(s.id, [angle, angle + sweep]);\n angle += sweep;\n }\n\n const colorOf = new Map(sections.map((s, i) => [s.id, i % 12]));\n const labelRadius = radius * M.textPosition;\n const slices: PieSliceGeometry[] = graph.nodes.map((n) => {\n const section = sections.find((s) => s.id === n.id);\n const range = angles.get(n.id);\n const value = section?.value ?? (typeof n.data?.value === \"number\" ? n.data.value : 0);\n const percent = section ? pct(section.value) : 0;\n const [startAngle, endAngle] = range ?? [0, 0];\n const mid = (startAngle + endAngle) / 2;\n const [labelX, labelY] = polar(cx, cy, labelRadius, mid);\n return {\n id: n.id,\n label: n.label,\n value,\n percent,\n colorIndex: colorOf.get(n.id) ?? 0,\n drawn: !!range && !duplicates.has(n.id),\n startAngle,\n endAngle,\n path: range ? wedgePath(cx, cy, radius, startAngle, endAngle) : \"\",\n labelX,\n labelY,\n labelText: `${percent.toFixed(0)}%`,\n };\n });\n\n const rowHeight = M.legendRectSize + M.legendSpacing;\n const offset = (rowHeight * sections.length) / 2;\n const showData = !!graph.data?.showData;\n const legend: PieLegendEntry[] = sections.map((s, i) => ({\n sliceId: s.id,\n label: s.label,\n text: showData ? `${s.label} [${s.value}]` : s.label,\n colorIndex: i % 12,\n x: cx + 12 * M.legendRectSize,\n y: cy + i * rowHeight - offset,\n }));\n\n return {\n cx,\n cy,\n radius,\n outerRadius,\n box,\n slices,\n legend,\n ...(graph.title ? { title: { text: graph.title, x: cx, y: cy - (M.height - 50) / 2 } } : {}),\n };\n}\n","import type { DiagramGraph, GraphNode } from \"../types.js\";\nimport { registerFamilyLayout } from \"../layout-registry.js\";\nimport { pieGeometry } from \"./geometry.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n quote,\n renameMetaKey,\n slugId,\n uniqueId,\n type BaseStatement,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * `pie` adapter.\n *\n * ```\n * pie showData\n * title Pets adopted\n * \"Dogs\" : 386\n * \"Cats\" : 85\n * ```\n *\n * Canvas model: one node per slice (shape `slice`, `data.value`), no edges,\n * no groups. `graph.data.showData` mirrors the header flag; the title comes\n * from a `title` statement (or the header's `title …` suffix). Slice ids are\n * derived from their labels (`Dogs` → `Dogs`, `Hot dogs` → `Hot_dogs`), made\n * unique with `_2`, `_3`… and kept stable through edits other than renames.\n *\n * Positions are data: the registered layout puts every slice on the pie's\n * bounding square (see `./geometry`), and drop positions are ignored.\n *\n * @module\n */\n\nexport type PieStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string })\n | (BaseStatement & { kind: \"slice\"; label: string; value: number });\n\nconst SLICE = /^\"((?:[^\"\\\\]|\\\\.)*)\"\\s*:\\s*(-?\\d+(?:\\.\\d+)?)\\s*$/;\nconst HEADER = /^(\\s*pie)(\\s+showData)?(?:\\s+title\\s+(.*))?\\s*$/i;\n\nfunction parseHeader(header: string): { showData: boolean; title?: string } {\n const m = HEADER.exec(header);\n if (!m) return { showData: /\\bshowData\\b/.test(header) };\n return { showData: !!m[2], title: m[3]?.trim() || undefined };\n}\n\nfunction formatHeader(indent: string, showData: boolean, title: string | undefined): string {\n return `${indent}pie${showData ? \" showData\" : \"\"}${title ? ` title ${title}` : \"\"}`;\n}\n\nfunction sliceIds(statements: PieStatement[]): Map<PieStatement, string> {\n const taken = new Set<string>();\n const ids = new Map<PieStatement, string>();\n for (const s of statements) {\n if (s.kind === \"slice\") ids.set(s, uniqueId(slugId(s.label, \"slice\"), taken));\n }\n return ids;\n}\n\nfunction formatValue(value: number): string {\n return Number.isInteger(value) ? String(value) : String(Math.round(value * 1000) / 1000);\n}\n\nexport const pieGrammar: StatementGrammar<PieStatement> = {\n family: \"pie\",\n titleAsStatement: true,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if ((m = /^title\\s+(.*)$/i.exec(text)))\n return { kind: \"title\", raw: line, indent, title: m[1]!.trim() };\n if ((m = SLICE.exec(text)))\n return {\n kind: \"slice\",\n raw: line,\n indent,\n label: m[1]!.replace(/\\\\\"/g, '\"'),\n value: Number(m[2]),\n };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n switch (stmt.kind) {\n case \"title\":\n return `${stmt.indent}title ${stmt.title}`;\n case \"slice\":\n return `${stmt.indent}${quote(stmt.label)} : ${formatValue(stmt.value)}`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const header = parseHeader(ctx.header);\n const ids = sliceIds(statements);\n const nodes: GraphNode[] = [];\n let title = header.title;\n for (const s of statements) {\n if (s.kind === \"title\") title = s.title;\n if (s.kind === \"slice\")\n nodes.push({\n id: ids.get(s)!,\n label: s.label,\n shape: \"slice\",\n classes: [],\n styles: [],\n data: { value: s.value, details: [formatValue(s.value)] },\n });\n }\n const graph: DiagramGraph = {\n direction: \"TB\",\n nodes,\n edges: [],\n groups: [],\n classDefs: {},\n title: title ?? ctx.frontmatterTitle,\n data: { showData: header.showData },\n };\n return { graph };\n },\n\n edit(op, ctx) {\n const { statements, doc, indent } = ctx;\n const ids = sliceIds(statements);\n const byId = new Map<string, Extract<PieStatement, { kind: \"slice\" }>>();\n for (const [s, id] of ids) byId.set(id, s as Extract<PieStatement, { kind: \"slice\" }>);\n const lastSlice = () => {\n let idx = -1;\n statements.forEach((s, i) => {\n if (s.kind === \"slice\") idx = i;\n });\n return idx;\n };\n switch (op.type) {\n case \"addNode\": {\n const label = op.node.label ?? op.node.id;\n const value = typeof op.node.data?.value === \"number\" ? op.node.data.value : 10;\n const stmt: PieStatement = { kind: \"slice\", raw: \"\", indent, label, value, dirty: true };\n // Wedges are placed from the data; a drop position means nothing.\n statements.splice(lastSlice() + 1, 0, stmt);\n return true;\n }\n case \"removeNodes\": {\n const remove = new Set(op.ids.map((id) => byId.get(id)).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as never));\n dropMetaKeys(ctx.meta, op.ids);\n return true;\n }\n case \"renameNode\": {\n const s = byId.get(op.id);\n if (!s) return false;\n s.label = op.label;\n s.dirty = true;\n const taken = new Set([...ids.values()].filter((id) => id !== op.id));\n renameMetaKey(ctx.meta, op.id, uniqueId(slugId(op.label, \"slice\"), taken));\n return true;\n }\n case \"setNodeData\": {\n const s = byId.get(op.id);\n if (!s) return false;\n if (typeof op.data.value === \"number\" && Number.isFinite(op.data.value)) {\n s.value = op.data.value;\n s.dirty = true;\n return true;\n }\n return false;\n }\n case \"setTitle\": {\n const header = parseHeader(doc.header);\n if (header.title !== undefined) {\n ctx.setHeader(formatHeader(indentOf(doc.header), header.showData, op.title));\n return true;\n }\n const idx = statements.findIndex((s) => s.kind === \"title\");\n if (op.title === undefined || op.title === \"\") {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as Extract<PieStatement, { kind: \"title\" }>;\n s.title = op.title;\n s.dirty = true;\n } else statements.unshift({ kind: \"title\", raw: \"\", indent, title: op.title, dirty: true });\n return true;\n }\n case \"setGraphData\": {\n if (typeof op.data.showData !== \"boolean\") return false;\n const header = parseHeader(doc.header);\n ctx.setHeader(formatHeader(indentOf(doc.header), op.data.showData, header.title));\n return true;\n }\n default:\n return false;\n }\n },\n};\n\nexport const pieAdapter = createStatementAdapter(pieGrammar);\n\n/**\n * Positions come from the data: every slice node shares the pie's bounding\n * square (each draws only its own wedge), as Mermaid lays the chart out.\n */\nregisterFamilyLayout(\"pie\", (graph) => {\n const { box } = pieGeometry(graph);\n const positions: Record<string, readonly [number, number]> = {};\n const sizes: Record<string, { width: number; height: number }> = {};\n for (const n of graph.nodes) {\n positions[n.id] = [box.x, box.y];\n sizes[n.id] = { width: box.width, height: box.height };\n }\n return { positions, sizes };\n});\n","import type { DiagramGraph, Point } from \"../types.js\";\nimport type { MindmapForm } from \"./index.js\";\n\n/**\n * Geometry of a mind map as Mermaid draws it: the root in the centre, each\n * top-level branch a \"section\" with its own colour, node shapes sized like\n * Mermaid's mindmap shapes (padding 10, labels wrapped at 200px), and edges\n * whose width shrinks with depth.\n *\n * Mermaid places the nodes with cose-bilkent, a force-directed layout whose\n * result is not reproducible outside a browser; this module uses a\n * deterministic radial tree with the same character: the root in the middle,\n * branches spread all around it, children further out in their branch's\n * sector. Shared by the layout, the editor (dropping a topic on another one\n * re-parents it) and the React canvas, so all agree.\n *\n * @module\n */\n\nexport const MINDMAP_METRICS = {\n fontSize: 16,\n lineHeight: 24,\n /** `mindmap.maxNodeWidth`: labels wrap at this width. */\n wrapWidth: 200,\n /** Clear space between rings of the radial tree. */\n ringGap: 44,\n /** Clear space between neighbours on a ring. */\n siblingGap: 14,\n /** Mermaid cycles sections modulo `MAX_SECTIONS - 1`. */\n sections: 11,\n} as const;\n\nconst M = MINDMAP_METRICS;\n\nexport interface MindmapTopicGeometry {\n id: string;\n /** Centre. */\n x: number;\n y: number;\n /** The shape's box (Mermaid's node size); clouds and bangs bulge a little past it. */\n width: number;\n height: number;\n form: MindmapForm;\n depth: number;\n /** Section (colour) index; `-1` for the root. */\n section: number;\n parent?: string;\n /** Label lines as Mermaid wraps them. */\n lines: string[];\n}\n\nexport interface MindmapEdgeGeometry {\n edgeId: string;\n source: string;\n target: string;\n /** Mermaid's `edge-depth-<n>` stroke width. */\n width: number;\n section: number;\n}\n\nexport interface MindmapGeometry {\n topics: Map<string, MindmapTopicGeometry>;\n edges: MindmapEdgeGeometry[];\n}\n\n/** Rough width of a run of text in Mermaid's default 16px font. */\nexport function estimateTextWidth(text: string, fontSize: number = M.fontSize): number {\n let em = 0;\n for (const ch of text) {\n if (/[ilj.,:;'|!()[\\]{}]/.test(ch)) em += 0.3;\n else if (ch === \" \") em += 0.3;\n else if (/[mwMW@%]/.test(ch)) em += 0.85;\n else if (/[A-Z]/.test(ch)) em += 0.65;\n else if (/[0-9]/.test(ch)) em += 0.55;\n else em += 0.52;\n }\n return Math.ceil(em * fontSize);\n}\n\n/** Label lines: `<br>` breaks, then word wrap at `mindmap.maxNodeWidth`. */\nexport function wrapLabel(label: string): string[] {\n const text = label.startsWith(\"`\") && label.endsWith(\"`\") ? label.slice(1, -1) : label;\n const lines: string[] = [];\n for (const part of text.split(/<br\\s*\\/?>|\\n/i)) {\n let line = \"\";\n for (const word of part.split(/\\s+/).filter(Boolean)) {\n const next = line ? `${line} ${word}` : word;\n if (line && estimateTextWidth(next) > M.wrapWidth) {\n lines.push(line);\n line = word;\n } else line = next;\n }\n lines.push(line);\n }\n return lines.length ? lines : [\"\"];\n}\n\n/** Mermaid's shape size for a label box of `tw` × `th` (see the mindmap shapes). */\nexport function shapeSize(\n form: MindmapForm,\n tw: number,\n th: number,\n): { width: number; height: number } {\n switch (form) {\n case \"rounded\":\n return { width: tw + 30, height: th + 30 };\n case \"square\":\n return { width: tw + 40, height: th + 20 };\n case \"circle\": {\n const d = Math.sqrt(tw * tw + th * th) + 20;\n return { width: d, height: d };\n }\n case \"cloud\":\n return { width: tw + 10, height: th + 10 };\n case \"bang\":\n return { width: tw + 50, height: th + 40 };\n case \"hexagon\": {\n const h = th + 20;\n return { width: tw + h / 2 + 20, height: h };\n }\n default:\n return { width: tw + 40, height: th + 10 };\n }\n}\n\n/** The space a shape takes, bulges included (for spacing, not for drawing). */\nfunction extent(form: MindmapForm, w: number, h: number): { width: number; height: number } {\n if (form === \"cloud\") return { width: w * 1.35, height: h + w * 0.55 };\n if (form === \"bang\") return { width: w * 1.25, height: h * 1.25 };\n return { width: w, height: h };\n}\n\n/** Half the size of a `w` × `h` box along direction `angle`. */\nfunction along(w: number, h: number, angle: number): number {\n return (Math.abs(Math.cos(angle)) * w + Math.abs(Math.sin(angle)) * h) / 2;\n}\n\nconst FORMS = new Set<MindmapForm>([\n \"default\",\n \"square\",\n \"rounded\",\n \"circle\",\n \"bang\",\n \"cloud\",\n \"hexagon\",\n]);\n\nexport function mindmapGeometry(graph: DiagramGraph): MindmapGeometry {\n const children = new Map<string, string[]>();\n const parentOf = new Map<string, string>();\n for (const e of graph.edges) {\n if (parentOf.has(e.target)) continue;\n parentOf.set(e.target, e.source);\n const list = children.get(e.source) ?? [];\n list.push(e.target);\n children.set(e.source, list);\n }\n const roots = graph.nodes.filter((n) => !parentOf.has(n.id)).map((n) => n.id);\n\n const topics = new Map<string, MindmapTopicGeometry>();\n const ext = new Map<string, { width: number; height: number }>();\n for (const n of graph.nodes) {\n const raw = n.data?.form as MindmapForm | undefined;\n const form: MindmapForm = raw && FORMS.has(raw) ? raw : \"default\";\n const lines = wrapLabel(n.label);\n const tw = Math.max(...lines.map((l) => estimateTextWidth(l)), 8);\n const th = lines.length * M.lineHeight;\n const { width, height } = shapeSize(form, tw, th);\n topics.set(n.id, { id: n.id, x: 0, y: 0, width, height, form, depth: 0, section: -1, lines });\n ext.set(n.id, extent(form, width, height));\n }\n\n // Leaf counts weight the sectors.\n const weight = new Map<string, number>();\n const weigh = (id: string, seen: Set<string>): number => {\n if (seen.has(id)) return 0;\n seen.add(id);\n const kids = children.get(id) ?? [];\n const w = kids.length ? kids.reduce((s, k) => s + weigh(k, seen), 0) : 1;\n weight.set(id, Math.max(1, w));\n return Math.max(1, w);\n };\n\n let offsetX = 0;\n for (const root of roots) {\n weigh(root, new Set());\n // Angles and depths: each node gets a slice of its parent's sector.\n const angle = new Map<string, number>();\n const byDepth: string[][] = [];\n const visit = (id: string, depth: number, a0: number, a1: number, section: number) => {\n const t = topics.get(id)!;\n t.depth = depth;\n t.section = section;\n angle.set(id, (a0 + a1) / 2);\n (byDepth[depth] ??= []).push(id);\n const kids = (children.get(id) ?? []).filter((k) => topics.get(k)!.depth === 0 && k !== root);\n const total = kids.reduce((s, k) => s + weight.get(k)!, 0);\n let start = a0;\n kids.forEach((k, i) => {\n const span = ((a1 - a0) * weight.get(k)!) / total;\n topics.get(k)!.parent = id;\n visit(k, depth + 1, start, start + span, depth === 0 ? i % M.sections : section);\n start += span;\n });\n };\n // The first branch starts at the top and the others follow clockwise.\n visit(root, 0, -Math.PI / 2, (3 * Math.PI) / 2, -1);\n\n // Ring radii: clear of the ring inside, and wide enough for neighbours on the ring.\n const radius: number[] = [0];\n const half = (id: string) => {\n const e = ext.get(id)!;\n return along(e.width, e.height, angle.get(id)!);\n };\n for (let d = 1; d < byDepth.length; d++) {\n const ring = byDepth[d]!;\n const inner = Math.max(...byDepth[d - 1]!.map((id) => (d === 1 ? halfRoot(id) : half(id))));\n let r = radius[d - 1]! + inner + Math.max(...ring.map(half)) + M.ringGap;\n const sorted = [...ring].sort((a, b) => angle.get(a)! - angle.get(b)!);\n if (sorted.length > 1) {\n for (let i = 0; i < sorted.length; i++) {\n const a = sorted[i]!;\n const b = sorted[(i + 1) % sorted.length]!;\n let delta = angle.get(b)! - angle.get(a)!;\n if (i === sorted.length - 1) delta += 2 * Math.PI;\n if (delta <= 0 || delta >= Math.PI) continue;\n const ea = ext.get(a)!;\n const eb = ext.get(b)!;\n const tangent = (id: string, e: { width: number; height: number }) =>\n along(e.width, e.height, angle.get(id)! + Math.PI / 2);\n const need = tangent(a, ea) + tangent(b, eb) + M.siblingGap;\n r = Math.max(r, need / (2 * Math.sin(delta / 2)));\n }\n }\n radius[d] = r;\n }\n function halfRoot(id: string): number {\n const e = ext.get(id)!;\n // The root is passed in every direction: use its largest half-size.\n return Math.max(e.width, e.height) / 2;\n }\n\n // Place, then shift this tree to the right of the previous one.\n let minX = Infinity;\n let maxX = -Infinity;\n byDepth.forEach((ring, d) => {\n for (const id of ring) {\n const t = topics.get(id)!;\n const a = angle.get(id)!;\n t.x = d === 0 ? 0 : radius[d]! * Math.cos(a);\n t.y = d === 0 ? 0 : radius[d]! * Math.sin(a);\n minX = Math.min(minX, t.x - t.width / 2);\n maxX = Math.max(maxX, t.x + t.width / 2);\n }\n });\n const shift = offsetX - (offsetX === 0 ? 0 : minX);\n for (const ring of byDepth) {\n for (const id of ring) {\n const t = topics.get(id)!;\n t.x = Math.round(t.x + shift);\n t.y = Math.round(t.y);\n }\n }\n offsetX = maxX + shift + 80;\n }\n\n const edges: MindmapEdgeGeometry[] = [];\n for (const e of graph.edges) {\n const s = topics.get(e.source);\n const t = topics.get(e.target);\n if (!s || !t || t.parent !== e.source) continue;\n // `.edge-depth-<n>` is 17 - 3·(n + 1) px; past depth 4 it falls back to `.edge` (3px).\n const n = s.depth + 1;\n const width = 17 - 3 * (n + 1);\n edges.push({\n edgeId: e.id,\n source: e.source,\n target: e.target,\n width: width > 0 ? width : 3,\n section: t.section,\n });\n }\n return { topics, edges };\n}\n\n/**\n * The topic a dragged topic was dropped on: the one whose shape contains the\n * dragged topic's centre (never the topic itself or one of its descendants).\n */\nexport function dropTarget(geo: MindmapGeometry, id: string, centre: Point): string | undefined {\n const isInside = (candidate: string): boolean => {\n let cur: string | undefined = candidate;\n const seen = new Set<string>();\n while (cur && !seen.has(cur)) {\n if (cur === id) return true;\n seen.add(cur);\n cur = geo.topics.get(cur)?.parent;\n }\n return false;\n };\n let best: { id: string; dist: number } | undefined;\n for (const t of geo.topics.values()) {\n if (isInside(t.id)) continue;\n const dx = Math.abs(centre[0] - t.x);\n const dy = Math.abs(centre[1] - t.y);\n if (dx > t.width / 2 + 8 || dy > t.height / 2 + 8) continue;\n const dist = dx * dx + dy * dy;\n if (!best || dist < best.dist) best = { id: t.id, dist };\n }\n return best?.id;\n}\n","import type { Diagnostic, DiagramGraph, GraphEdge, GraphNode, Point } from \"../types.js\";\nimport { registerFamilyLayout, type Size } from \"../layout-registry.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n indentOf,\n quote,\n renameMetaKey,\n slugId,\n uniqueId,\n unquote,\n type BaseStatement,\n type StatementGrammar,\n} from \"../statements/base.js\";\nimport { dropTarget, mindmapGeometry } from \"./geometry.js\";\n\n/**\n * `mindmap` adapter.\n *\n * ```\n * mindmap\n * root((Generative Diagrams))\n * Authoring\n * Canvas editing\n * Rendering\n * ::icon(fa fa-image)\n * ```\n *\n * Canvas model: one node per mindmap line, one solid tree edge (`data.tree`)\n * from each node to each child, no groups. Hierarchy comes from indentation:\n * a node is the child of the nearest shallower node above. Positions are\n * derived (see `./geometry`): the root in the centre, branches around it.\n *\n * The bracket form is kept in `data.form` (`default`, `square`, `rounded`,\n * `circle`, `bang`, `cloud`, `hexagon`) and mapped to a diagram shape\n * (`text` for the default form); a\n * leading Mermaid id (`root((…))`) is kept (`data.explicitId`), otherwise the\n * id is derived from the label (`Canvas editing` → `Canvas_editing`).\n * `::icon(…)` and `:::class` lines decorate the node above them and move or\n * disappear with it.\n *\n * Edits: `addNode` (as last child of `node.parentId`, default the root),\n * `renameNode`, `setNodeShape`, `removeNodes` (with the whole subtree),\n * `addEdge` / `reconnectEdge` (re-parent the target, with its subtree, under\n * the source), `setNodeData` (`icon`). Tree edges cannot be removed on their\n * own; `setTitle` uses the frontmatter. `moveNodes` never stores positions: a\n * topic dropped onto another topic is re-parented under it (`interceptMeta`).\n *\n * @module\n */\n\n/** Bracket forms of a mindmap node. `default` is plain text. */\nexport type MindmapForm =\n \"default\" | \"square\" | \"rounded\" | \"circle\" | \"bang\" | \"cloud\" | \"hexagon\";\n\ntype NodeStatement = BaseStatement & {\n kind: \"node\";\n /** The Mermaid id written before the brackets, if any. */\n id?: string;\n label: string;\n form: MindmapForm;\n /** Whether the label was written in double quotes. */\n quoted?: boolean;\n};\ntype IconStatement = BaseStatement & { kind: \"icon\"; icon: string };\ntype ClassStatement = BaseStatement & { kind: \"class\"; classes: string[] };\n\nexport type MindmapStatement =\n (BaseStatement & { kind: \"raw\" }) | NodeStatement | IconStatement | ClassStatement;\n\n/** Delimiters per form; order matters when matching (`((` before `(`). */\nconst FORMS: { form: Exclude<MindmapForm, \"default\">; open: string; close: string }[] = [\n { form: \"circle\", open: \"((\", close: \"))\" },\n { form: \"bang\", open: \"))\", close: \"((\" },\n { form: \"hexagon\", open: \"{{\", close: \"}}\" },\n { form: \"rounded\", open: \"(\", close: \")\" },\n { form: \"cloud\", open: \")\", close: \"(\" },\n { form: \"square\", open: \"[\", close: \"]\" },\n];\n\nconst escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\nconst FORM_RES = FORMS.map((f) => ({\n ...f,\n re: new RegExp(`^([^\\\\s()[\\\\]{}\"]*)${escapeRe(f.open)}(.*)${escapeRe(f.close)}$`),\n}));\n\nconst FORM_TO_SHAPE: Record<MindmapForm, string> = {\n default: \"text\",\n square: \"rect\",\n rounded: \"rounded\",\n circle: \"circle\",\n bang: \"odd\",\n cloud: \"stadium\",\n hexagon: \"hex\",\n};\n\nconst SHAPE_TO_FORM: Partial<Record<string, Exclude<MindmapForm, \"default\">>> = {\n rect: \"square\",\n rounded: \"rounded\",\n circle: \"circle\",\n odd: \"bang\",\n stadium: \"cloud\",\n hex: \"hexagon\",\n};\n\nfunction parseNodeText(text: string): Omit<NodeStatement, \"raw\" | \"indent\" | \"kind\"> {\n for (const f of FORM_RES) {\n const m = f.re.exec(text);\n if (!m) continue;\n const inner = m[2]!;\n const quoted = /^\\s*\".*\"\\s*$/.test(inner);\n return {\n id: m[1] || undefined,\n label: quoted ? unquote(inner) : inner,\n form: f.form,\n ...(quoted ? { quoted } : {}),\n };\n }\n return { label: text, form: \"default\" };\n}\n\nfunction formatNode(stmt: NodeStatement): string {\n if (stmt.form === \"default\") return `${stmt.indent}${stmt.label}`;\n const f = FORMS.find((x) => x.form === stmt.form)!;\n // Quote labels that would otherwise close the brackets early.\n const label = stmt.quoted || /[()[\\]{}]/.test(stmt.label) ? quote(stmt.label) : stmt.label;\n return `${stmt.indent}${stmt.id ?? \"\"}${f.open}${label}${f.close}`;\n}\n\n/** Ids per node statement: explicit ids first, then label-derived ones. */\nfunction nodeIds(statements: MindmapStatement[]): Map<NodeStatement, string> {\n const taken = new Set<string>();\n const ids = new Map<NodeStatement, string>();\n for (const s of statements) if (s.kind === \"node\" && s.id) ids.set(s, uniqueId(s.id, taken));\n for (const s of statements)\n if (s.kind === \"node\" && !s.id) ids.set(s, uniqueId(slugId(s.label, \"topic\"), taken));\n return ids;\n}\n\n/** Index of each node's parent node statement (by nearest shallower indent above). */\nfunction parentIndices(statements: MindmapStatement[]): Map<number, number | undefined> {\n const parents = new Map<number, number | undefined>();\n const stack: number[] = [];\n statements.forEach((s, i) => {\n if (s.kind !== \"node\") return;\n while (stack.length && statements[stack.at(-1)!]!.indent.length >= s.indent.length) stack.pop();\n parents.set(i, stack.at(-1));\n stack.push(i);\n });\n return parents;\n}\n\n/** Last statement index of the subtree rooted at node statement `i` (decorations included). */\nfunction subtreeEnd(statements: MindmapStatement[], i: number): number {\n const depth = statements[i]!.indent.length;\n let last = i;\n for (let j = i + 1; j < statements.length; j++) {\n const s = statements[j]!;\n if (s.kind === \"node\") {\n if (s.indent.length <= depth) break;\n last = j;\n } else if (s.kind === \"icon\" || s.kind === \"class\") last = j;\n }\n return last;\n}\n\n/** Indentation unit: the first increase between consecutive node lines, else two spaces. */\nfunction indentUnit(statements: MindmapStatement[]): string {\n let prev: string | undefined;\n for (const s of statements) {\n if (s.kind !== \"node\") continue;\n if (prev !== undefined && s.indent.length > prev.length)\n return s.indent.startsWith(prev)\n ? s.indent.slice(prev.length)\n : \" \".repeat(s.indent.length - prev.length);\n prev = s.indent;\n }\n return \" \";\n}\n\n/** Re-indents a moved block so its first line sits at `target`. */\nfunction reindent(block: MindmapStatement[], target: string): void {\n const base = block[0]!.indent;\n for (const s of block) {\n if (!s.raw.trim() && s.kind === \"raw\") continue;\n const rest = s.indent.startsWith(base) ? s.indent.slice(base.length) : \"\";\n s.indent = target + rest;\n s.dirty = true;\n }\n}\n\n/** Index of the node statement with graph id `id`, or -1. */\nfunction statementIndex(statements: MindmapStatement[], id: string): number {\n for (const [s, sid] of nodeIds(statements)) if (sid === id) return statements.indexOf(s);\n return -1;\n}\n\n/** Moves topic `childId` (with its subtree) to be the last child of `parentId`. */\nfunction reparentTopic(statements: MindmapStatement[], parentId: string, childId: string): boolean {\n const ci = statementIndex(statements, childId);\n const pi = statementIndex(statements, parentId);\n if (ci === -1 || pi === -1 || ci === pi) return false;\n const end = subtreeEnd(statements, ci);\n if (pi > ci && pi <= end) return false; // parent inside the child's subtree\n if (parentIndices(statements).get(ci) === pi) return false; // already its child\n const parentStmt = statements[pi]!;\n const unit = indentUnit(statements);\n const block = statements.splice(ci, end - ci + 1);\n reindent(block, parentStmt.indent + unit);\n const at = subtreeEnd(statements, statements.indexOf(parentStmt)) + 1;\n statements.splice(at, 0, ...block);\n return true;\n}\n\nexport const mindmapGrammar: StatementGrammar<MindmapStatement> = {\n family: \"mindmap\",\n\n /**\n * Positions are derived, so moves are never stored; a topic dropped onto\n * another topic moves (with its subtree) under it. Moves that leave a topic\n * where the layout has it (layout pins) change nothing.\n */\n interceptMeta(op, ctx) {\n if (op.type !== \"moveNodes\") return false;\n const geo = mindmapGeometry(ctx.doc.graph);\n for (const { id, position } of op.moves) {\n const t = geo.topics.get(id);\n if (!t) continue;\n const centre: Point = [position[0] + t.width / 2, position[1] + t.height / 2];\n if (Math.abs(centre[0] - t.x) < 1 && Math.abs(centre[1] - t.y) < 1) continue;\n const target = dropTarget(geo, id, centre);\n if (target && target !== t.parent) reparentTopic(ctx.statements, target, id);\n }\n return true;\n },\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if (!text || text.startsWith(\"%%\")) return { kind: \"raw\", raw: line, indent };\n if ((m = /^::icon\\((.*)\\)$/.exec(text)))\n return { kind: \"icon\", raw: line, indent, icon: m[1]!.trim() };\n if ((m = /^:::(.*)$/.exec(text)))\n return { kind: \"class\", raw: line, indent, classes: m[1]!.trim().split(/\\s+/) };\n return { kind: \"node\", raw: line, indent, ...parseNodeText(text) };\n },\n\n format(stmt) {\n switch (stmt.kind) {\n case \"node\":\n return formatNode(stmt);\n case \"icon\":\n return `${stmt.indent}::icon(${stmt.icon})`;\n case \"class\":\n return `${stmt.indent}:::${stmt.classes.join(\" \")}`;\n default:\n return stmt.raw.trim() ? `${stmt.indent}${stmt.raw.trim()}` : stmt.raw;\n }\n },\n\n buildGraph(statements) {\n const ids = nodeIds(statements);\n const parents = parentIndices(statements);\n const nodes: GraphNode[] = [];\n const edges: GraphEdge[] = [];\n const diagnostics: Diagnostic[] = [];\n let current: GraphNode | undefined;\n let roots = 0;\n statements.forEach((s, i) => {\n if (s.kind === \"node\") {\n const id = ids.get(s)!;\n current = {\n id,\n label: s.label,\n shape: FORM_TO_SHAPE[s.form],\n classes: [],\n styles: [],\n data: { form: s.form, explicitId: !!s.id },\n };\n nodes.push(current);\n const p = parents.get(i);\n if (p === undefined) roots++;\n else {\n const parentId = ids.get(statements[p] as NodeStatement)!;\n edges.push({\n id: `L_${parentId}_${id}_0`,\n source: parentId,\n target: id,\n pattern: \"solid\",\n arrowStart: \"none\",\n arrowEnd: \"none\",\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: { tree: true },\n });\n }\n } else if (s.kind === \"icon\" && current) {\n current.data = { ...current.data, icon: s.icon, details: [s.icon] };\n } else if (s.kind === \"class\" && current) {\n current.classes.push(...s.classes.filter(Boolean));\n }\n });\n if (roots > 1)\n diagnostics.push({\n severity: \"warning\",\n message: `A mindmap has a single root; found ${roots} top-level nodes.`,\n source: \"pixerate\",\n });\n const graph: DiagramGraph = {\n direction: \"LR\",\n nodes,\n edges,\n groups: [],\n classDefs: {},\n };\n return { graph, diagnostics };\n },\n\n edit(op, ctx) {\n const { statements } = ctx;\n const ids = nodeIds(statements);\n const indexOf = (id: string): number => {\n for (const [s, sid] of ids) if (sid === id) return statements.indexOf(s);\n return -1;\n };\n const unit = indentUnit(statements);\n const reparent = (parentId: string, childId: string) =>\n reparentTopic(statements, parentId, childId);\n\n switch (op.type) {\n case \"addNode\": {\n const label = op.node.label?.trim() || \"New topic\";\n const shape = op.node.shape;\n let form: MindmapForm = shape ? (SHAPE_TO_FORM[shape] ?? \"default\") : \"default\";\n const taken = new Set(ids.values());\n const slug = slugId(label, \"topic\");\n let explicit: string | undefined;\n if (taken.has(slug)) {\n // An explicit id keeps existing same-label nodes on their ids; plain text cannot carry one.\n explicit = uniqueId(slug, taken);\n if (form === \"default\") form = \"rounded\";\n }\n const parentIdx = op.node.parentId\n ? indexOf(op.node.parentId)\n : statements.findIndex((s) => s.kind === \"node\");\n let at = statements.length;\n let indent = ctx.indent;\n if (parentIdx !== -1) {\n at = subtreeEnd(statements, parentIdx) + 1;\n indent = statements[parentIdx]!.indent + unit;\n }\n const stmt: NodeStatement = {\n kind: \"node\",\n raw: \"\",\n indent,\n label,\n form,\n ...(explicit ? { id: explicit } : {}),\n dirty: true,\n };\n statements.splice(at, 0, stmt);\n return true;\n }\n case \"removeNodes\": {\n const remove = new Set<number>();\n const removedIds: string[] = [];\n for (const id of op.ids) {\n const i = indexOf(id);\n if (i === -1) continue;\n const end = subtreeEnd(statements, i);\n for (let j = i; j <= end; j++) remove.add(j);\n }\n if (!remove.size) return false;\n for (const i of remove) {\n const s = statements[i]!;\n if (s.kind === \"node\") removedIds.push(ids.get(s)!);\n }\n const kept = statements.filter((_, i) => !remove.has(i));\n statements.length = 0;\n statements.push(...kept);\n dropMetaKeys(ctx.meta, removedIds);\n return true;\n }\n case \"renameNode\": {\n const i = indexOf(op.id);\n if (i === -1 || !op.label.trim()) return false;\n const s = statements[i] as NodeStatement;\n s.label = op.label.trim();\n s.dirty = true;\n if (!s.id) {\n const taken = new Set([...ids.values()].filter((id) => id !== op.id));\n renameMetaKey(ctx.meta, op.id, uniqueId(slugId(s.label, \"topic\"), taken));\n }\n return true;\n }\n case \"setNodeShape\": {\n const i = indexOf(op.id);\n if (i === -1) return false;\n const s = statements[i] as NodeStatement;\n const form: MindmapForm = SHAPE_TO_FORM[op.shape] ?? \"default\";\n if (form === s.form) return true;\n s.form = form;\n s.dirty = true;\n if (form === \"default\" && s.id) {\n // Plain text cannot carry an id: the id becomes label-derived.\n delete s.id;\n const taken = new Set([...ids.values()].filter((id) => id !== op.id));\n renameMetaKey(ctx.meta, op.id, uniqueId(slugId(s.label, \"topic\"), taken));\n }\n return true;\n }\n case \"addEdge\":\n return reparent(op.edge.source, op.edge.target);\n case \"reconnectEdge\":\n return reparent(op.source, op.target);\n case \"setNodeData\": {\n if (!(\"icon\" in op.data)) return false;\n const i = indexOf(op.id);\n if (i === -1) return false;\n const value = typeof op.data.icon === \"string\" ? op.data.icon.trim() : \"\";\n let iconAt = -1;\n for (let j = i + 1; j < statements.length; j++) {\n const s = statements[j]!;\n if (s.kind === \"icon\") iconAt = j;\n if (s.kind !== \"icon\" && s.kind !== \"class\") break;\n }\n if (iconAt !== -1) {\n if (!value) statements.splice(iconAt, 1);\n else {\n const s = statements[iconAt] as IconStatement;\n s.icon = value;\n s.dirty = true;\n }\n } else if (value) {\n statements.splice(i + 1, 0, {\n kind: \"icon\",\n raw: \"\",\n indent: statements[i]!.indent + unit,\n icon: value,\n dirty: true,\n });\n }\n return true;\n }\n default:\n return false;\n }\n },\n};\n\nexport const mindmapAdapter = createStatementAdapter(mindmapGrammar);\n\n/**\n * Mermaid's arrangement (see `./geometry`): positions come from the tree, so\n * stored positions are ignored and the canvas always matches Mermaid.\n */\nregisterFamilyLayout(\"mindmap\", (graph) => {\n const geo = mindmapGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const t of geo.topics.values()) {\n positions[t.id] = [t.x - t.width / 2, t.y - t.height / 2];\n sizes[t.id] = { width: t.width, height: t.height };\n }\n return { positions, sizes };\n});\n","import type { DiagramGraph, Point } from \"../types.js\";\n\n/**\n * Geometry of a quadrant chart as Mermaid draws it (`quadrantBuilder.ts`): a\n * 500×500 chart with the title on top, the y-axis labels in a strip on the\n * left, the x-axis labels in a strip under the chart (above it when there\n * are no points), the square chart area split into four quadrants, and every\n * point a circle on its `[x, y]` with its label just below. Shared by the\n * layout, the editor (dragging a point rewrites its coordinates) and the\n * React canvas, so all three agree.\n *\n * All coordinates are canvas pixels in the frame of Mermaid's SVG.\n *\n * @module\n */\n\n/** Mermaid's `quadrantChart` defaults. */\nexport const QUADRANT_METRICS = {\n chartWidth: 500,\n chartHeight: 500,\n titleFontSize: 20,\n titlePadding: 10,\n quadrantPadding: 5,\n xAxisLabelPadding: 5,\n yAxisLabelPadding: 5,\n xAxisLabelFontSize: 16,\n yAxisLabelFontSize: 16,\n quadrantLabelFontSize: 16,\n quadrantTextTopPadding: 5,\n pointTextPadding: 5,\n pointLabelFontSize: 12,\n pointRadius: 5,\n internalBorderWidth: 1,\n externalBorderWidth: 2,\n} as const;\n\n/** Side of the square node box every point gets on the canvas (centred on the point). */\nexport const POINT_BOX = 24;\n\nexport interface QuadrantSpace {\n /** Left / top of the chart area (the four quadrants). */\n left: number;\n top: number;\n width: number;\n height: number;\n /** Mermaid moves the x-axis labels under the chart once there are points. */\n xAxisPosition: \"top\" | \"bottom\";\n}\n\nexport interface QuadrantSpaceInput {\n title: boolean;\n xAxis: boolean;\n yAxis: boolean;\n points: boolean;\n}\n\n/** Mermaid's `calculateSpace`. */\nexport function quadrantSpace({ title, xAxis, yAxis, points }: QuadrantSpaceInput): QuadrantSpace {\n const M = QUADRANT_METRICS;\n const xAxisPosition = points ? \"bottom\" : \"top\";\n const xAxisSpace = xAxis ? M.xAxisLabelPadding * 2 + M.xAxisLabelFontSize : 0;\n const yAxisSpace = yAxis ? M.yAxisLabelPadding * 2 + M.yAxisLabelFontSize : 0;\n const titleSpace = title ? M.titleFontSize + M.titlePadding * 2 : 0;\n const top = M.quadrantPadding + (xAxisPosition === \"top\" ? xAxisSpace : 0) + titleSpace;\n return {\n left: M.quadrantPadding + yAxisSpace,\n top,\n width: M.chartWidth - M.quadrantPadding * 2 - yAxisSpace,\n height: M.chartHeight - M.quadrantPadding * 2 - xAxisSpace - titleSpace,\n xAxisPosition,\n };\n}\n\ntype GraphLike = Pick<DiagramGraph, \"nodes\" | \"title\" | \"data\">;\n\n/** What the space depends on, read from a graph. */\nexport function spaceInput(graph: GraphLike, pointCount = graph.nodes.length): QuadrantSpaceInput {\n const d = graph.data ?? {};\n return {\n title: !!graph.title,\n xAxis: !!(d.xAxisLeft || d.xAxisRight),\n yAxis: !!(d.yAxisBottom || d.yAxisTop),\n points: pointCount > 0,\n };\n}\n\nconst clamp01 = (v: number) => Math.min(1, Math.max(0, v));\nconst round = (v: number, digits: number) => Math.round(v * 10 ** digits) / 10 ** digits;\n\n/** Centre of a point with coordinates `[x, y]` (0–1). */\nexport function pointCentre(x: number, y: number, space: QuadrantSpace): Point {\n return [space.left + x * space.width, space.top + (1 - y) * space.height];\n}\n\n/** Top-left of a point's node box (see {@link POINT_BOX}). */\nexport function pointPosition(x: number, y: number, space: QuadrantSpace): Point {\n const [cx, cy] = pointCentre(x, y, space);\n return [cx - POINT_BOX / 2, cy - POINT_BOX / 2];\n}\n\n/** Coordinates (0–1, two decimals, clamped) of a point whose node box is at `position`. */\nexport function positionToData(position: Point, space: QuadrantSpace): { x: number; y: number } {\n const cx = position[0] + POINT_BOX / 2;\n const cy = position[1] + POINT_BOX / 2;\n return {\n x: clamp01(round((cx - space.left) / space.width, 2)),\n y: clamp01(round(1 - (cy - space.top) / space.height, 2)),\n };\n}\n\nexport interface QuadrantBox {\n n: 1 | 2 | 3 | 4;\n /** Group id (`quadrant-1`…). */\n id: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Label anchor: centred horizontally; `top` hangs from y, `middle` is centred on it. */\n labelX: number;\n labelY: number;\n labelBaseline: \"top\" | \"middle\";\n}\n\nexport type AxisKey = \"xAxisLeft\" | \"xAxisRight\" | \"yAxisBottom\" | \"yAxisTop\";\n\nexport interface QuadrantAxisLabel {\n key: AxisKey;\n text: string;\n /** Anchor; the text hangs from it (rotated −90° for the y axis, reading upwards). */\n x: number;\n y: number;\n anchor: \"start\" | \"middle\";\n rotation: 0 | -90;\n /** Length of the strip the label belongs to (for hit boxes). */\n span: number;\n}\n\nexport interface QuadrantPointGeometry {\n id: string;\n label: string;\n cx: number;\n cy: number;\n radius: number;\n color?: string;\n strokeColor?: string;\n strokeWidth?: string;\n}\n\nexport interface QuadrantBorder {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n external: boolean;\n}\n\nexport interface QuadrantGeometry {\n space: QuadrantSpace;\n /** Title anchor (centred, hanging from y), when there is a title. */\n title?: { text: string; x: number; y: number };\n quadrants: QuadrantBox[];\n axisLabels: QuadrantAxisLabel[];\n borders: QuadrantBorder[];\n points: QuadrantPointGeometry[];\n}\n\n/** `[\"color: #f00\", \"radius: 4\"]` → `{ color: \"#f00\", radius: \"4\" }`. */\nfunction styleMap(styles: string[] | undefined): Record<string, string> {\n const out: Record<string, string> = {};\n for (const s of styles ?? []) {\n const i = s.indexOf(\":\");\n if (i !== -1) out[s.slice(0, i).trim()] = s.slice(i + 1).trim();\n }\n return out;\n}\n\n/** Computes the chart as Mermaid would draw `graph`. */\nexport function quadrantGeometry(\n graph: GraphLike & Partial<Pick<DiagramGraph, \"classDefs\">>,\n): QuadrantGeometry {\n const M = QUADRANT_METRICS;\n const space = quadrantSpace(spaceInput(graph));\n const { left, top, width, height } = space;\n const halfW = width / 2;\n const halfH = height / 2;\n const d = (graph.data ?? {}) as Record<string, unknown>;\n const text = (k: AxisKey) => (typeof d[k] === \"string\" ? (d[k] as string) : \"\");\n const hasPoints = graph.nodes.length > 0;\n\n const origin: Record<1 | 2 | 3 | 4, [number, number]> = {\n 1: [left + halfW, top],\n 2: [left, top],\n 3: [left, top + halfH],\n 4: [left + halfW, top + halfH],\n };\n const quadrants: QuadrantBox[] = ([1, 2, 3, 4] as const).map((n) => {\n const [x, y] = origin[n];\n return {\n n,\n id: `quadrant-${n}`,\n x,\n y,\n width: halfW,\n height: halfH,\n labelX: x + halfW / 2,\n labelY: hasPoints ? y + M.quadrantTextTopPadding : y + halfH / 2,\n labelBaseline: hasPoints ? \"top\" : \"middle\",\n };\n });\n\n const axisLabels: QuadrantAxisLabel[] = [];\n const xInMiddle = !!text(\"xAxisRight\");\n const yInMiddle = !!text(\"yAxisTop\");\n const titleSpace = graph.title ? M.titleFontSize + M.titlePadding * 2 : 0;\n const xY =\n space.xAxisPosition === \"top\"\n ? M.xAxisLabelPadding + titleSpace\n : M.xAxisLabelPadding + top + height + M.quadrantPadding;\n if (text(\"xAxisLeft\"))\n axisLabels.push({\n key: \"xAxisLeft\",\n text: text(\"xAxisLeft\"),\n x: left + (xInMiddle ? halfW / 2 : 0),\n y: xY,\n anchor: xInMiddle ? \"middle\" : \"start\",\n rotation: 0,\n span: xInMiddle ? halfW : width,\n });\n if (text(\"xAxisRight\"))\n axisLabels.push({\n key: \"xAxisRight\",\n text: text(\"xAxisRight\"),\n x: left + halfW + (xInMiddle ? halfW / 2 : 0),\n y: xY,\n anchor: xInMiddle ? \"middle\" : \"start\",\n rotation: 0,\n span: halfW,\n });\n if (text(\"yAxisBottom\"))\n axisLabels.push({\n key: \"yAxisBottom\",\n text: text(\"yAxisBottom\"),\n x: M.yAxisLabelPadding,\n y: top + height - (yInMiddle ? halfH / 2 : 0),\n anchor: yInMiddle ? \"middle\" : \"start\",\n rotation: -90,\n span: yInMiddle ? halfH : height,\n });\n if (text(\"yAxisTop\"))\n axisLabels.push({\n key: \"yAxisTop\",\n text: text(\"yAxisTop\"),\n x: M.yAxisLabelPadding,\n y: top + halfH - (yInMiddle ? halfH / 2 : 0),\n anchor: yInMiddle ? \"middle\" : \"start\",\n rotation: -90,\n span: halfH,\n });\n\n const hb = M.externalBorderWidth / 2;\n const borders: QuadrantBorder[] = [\n { x1: left - hb, y1: top, x2: left + width + hb, y2: top, external: true },\n { x1: left + width, y1: top + hb, x2: left + width, y2: top + height - hb, external: true },\n { x1: left - hb, y1: top + height, x2: left + width + hb, y2: top + height, external: true },\n { x1: left, y1: top + hb, x2: left, y2: top + height - hb, external: true },\n { x1: left + halfW, y1: top + hb, x2: left + halfW, y2: top + height - hb, external: false },\n { x1: left + hb, y1: top + halfH, x2: left + width - hb, y2: top + halfH, external: false },\n ];\n\n const points: QuadrantPointGeometry[] = graph.nodes.map((n) => {\n const x = typeof n.data?.x === \"number\" ? n.data.x : 0.5;\n const y = typeof n.data?.y === \"number\" ? n.data.y : 0.5;\n const [cx, cy] = pointCentre(x, y, space);\n // Class styles first, the point's own styles over them (as Mermaid merges them).\n const cls = n.classes.reduce<Record<string, string>>(\n (acc, c) => ({ ...acc, ...styleMap(graph.classDefs?.[c]) }),\n {},\n );\n const own = n.data ?? {};\n const classRadius = cls.radius !== undefined ? parseInt(cls.radius, 10) : NaN;\n const radius =\n typeof own.radius === \"number\"\n ? own.radius\n : Number.isFinite(classRadius)\n ? classRadius\n : M.pointRadius;\n const color = (typeof own.color === \"string\" ? own.color : undefined) ?? cls.color;\n const strokeColor =\n (typeof own.strokeColor === \"string\" ? own.strokeColor : undefined) ?? cls[\"stroke-color\"];\n const strokeWidth =\n (typeof own.strokeWidth === \"string\" ? own.strokeWidth : undefined) ?? cls[\"stroke-width\"];\n return {\n id: n.id,\n label: n.label,\n cx,\n cy,\n radius,\n ...(color ? { color } : {}),\n ...(strokeColor ? { strokeColor } : {}),\n ...(strokeWidth ? { strokeWidth } : {}),\n };\n });\n\n return {\n space,\n ...(graph.title\n ? { title: { text: graph.title, x: M.chartWidth / 2, y: M.titlePadding } }\n : {}),\n quadrants,\n axisLabels,\n borders,\n points,\n };\n}\n","import type { DiagramGraph, GraphGroup, GraphNode, Point } from \"../types.js\";\nimport { registerFamilyLayout, type Size } from \"../layout-registry.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n quote,\n renameMetaKey,\n slugId,\n uniqueId,\n unquote,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\nimport {\n POINT_BOX,\n pointPosition,\n positionToData,\n quadrantGeometry,\n quadrantSpace,\n spaceInput,\n} from \"./geometry.js\";\n\nexport {\n POINT_BOX,\n QUADRANT_METRICS,\n pointCentre,\n pointPosition,\n positionToData,\n quadrantGeometry,\n quadrantSpace,\n spaceInput,\n} from \"./geometry.js\";\nexport type { QuadrantGeometry, QuadrantSpace } from \"./geometry.js\";\n\n/**\n * `quadrantChart` adapter.\n *\n * ```\n * quadrantChart\n * title Feature prioritisation\n * x-axis Low effort --> High effort\n * y-axis Low impact --> High impact\n * quadrant-1 Plan carefully\n * Dark mode: [0.3, 0.45] radius: 8, color: #ff9900\n * ```\n *\n * Canvas model: one node per point (shape `point`, `data.x` / `data.y` in\n * 0–1, optional `radius` / `color`), the four quadrants as locked groups\n * (`quadrant-1` top-right, `quadrant-2` top-left, `quadrant-3` bottom-left,\n * `quadrant-4` bottom-right) with each point inside the quadrant it falls in.\n * Axis labels live in `graph.data` (`xAxisLeft`, `xAxisRight`, `yAxisBottom`,\n * `yAxisTop`). Point ids are derived from labels like pie slices.\n *\n * Positions are data: the registered layout places points from their\n * coordinates on Mermaid's 500×500 chart (see `./geometry`), and dragging a\n * point (`moveNodes`) rewrites its `[x, y]` instead of storing layout\n * metadata. A quadrant without a `quadrant-N` statement is labelled\n * `Quadrant N` with `data.placeholder` (Mermaid draws no label for it).\n *\n * @module\n */\n\ntype PointStatement = BaseStatement & {\n kind: \"point\";\n label: string;\n quoted?: boolean;\n className?: string;\n x: number;\n y: number;\n /** Trailing styling, e.g. `radius: 10, color: #ff0000`. */\n styles: string;\n};\ntype AxisStatement = BaseStatement & { kind: \"axis\"; axis: \"x\" | \"y\"; from: string; to?: string };\ntype QuadrantStatement = BaseStatement & { kind: \"quadrant\"; n: 1 | 2 | 3 | 4; label: string };\n\nexport type QuadrantChartStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string })\n | (BaseStatement & { kind: \"classDef\"; name: string; styles: string })\n | AxisStatement\n | QuadrantStatement\n | PointStatement;\n\nconst NUM = \"(\\\\d*\\\\.?\\\\d+)\";\nconst POINT = new RegExp(\n `^(?:\"([^\"]*)\"|([^:\"]+?))\\\\s*(?::::([A-Za-z0-9_-]+))?\\\\s*:\\\\s*\\\\[\\\\s*${NUM}\\\\s*,\\\\s*${NUM}\\\\s*\\\\]\\\\s*(.*)$`,\n);\nconst AXIS = /^([xy])-axis\\s+(.*?)(?:\\s*--+>\\s*(.*))?$/i;\nconst HEX = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n\nconst clamp01 = (v: number) => Math.min(1, Math.max(0, v));\nconst round = (v: number, digits: number) => Math.round(v * 10 ** digits) / 10 ** digits;\n\n/** The chart area of `graph` with `pointCount` points (the x axis moves once there are any). */\nconst spaceOf = (graph: DiagramGraph, pointCount = graph.nodes.length) =>\n quadrantSpace(spaceInput(graph, pointCount));\n\n/** Mermaid accepts `0`, `1` and `0.xx` only. */\nfunction formatCoord(v: number): string {\n return String(round(clamp01(v), 3));\n}\n\n/** `radius: 10, color: #f00` → ordered key/value pairs. */\nfunction parseStyles(text: string): [string, string][] {\n return text\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean)\n .map((p) => {\n const i = p.indexOf(\":\");\n return i === -1 ? [p, \"\"] : [p.slice(0, i).trim(), p.slice(i + 1).trim()];\n });\n}\n\nfunction setStyle(text: string, key: string, value: string | undefined): string {\n const pairs = parseStyles(text);\n const i = pairs.findIndex(([k]) => k === key);\n if (value === undefined) {\n if (i !== -1) pairs.splice(i, 1);\n } else if (i !== -1) pairs[i]![1] = value;\n else pairs.push([key, value]);\n return pairs.map(([k, v]) => `${k}: ${v}`).join(\", \");\n}\n\nfunction pointIds(statements: QuadrantChartStatement[]): Map<PointStatement, string> {\n const taken = new Set<string>();\n const ids = new Map<PointStatement, string>();\n for (const s of statements)\n if (s.kind === \"point\") ids.set(s, uniqueId(slugId(s.label, \"point\"), taken));\n return ids;\n}\n\n/** Quadrant a coordinate falls in (Mermaid numbering). */\nfunction quadrantOf(x: number, y: number): 1 | 2 | 3 | 4 {\n if (y >= 0.5) return x >= 0.5 ? 1 : 2;\n return x >= 0.5 ? 4 : 3;\n}\n\nfunction formatPoint(s: PointStatement): string {\n const label = s.quoted || /[:\"[\\],]/.test(s.label) ? quote(s.label.replace(/\"/g, \"'\")) : s.label;\n const cls = s.className ? `:::${s.className}` : \"\";\n const styles = s.styles.trim() ? ` ${s.styles.trim()}` : \"\";\n return `${s.indent}${label}${cls}: [${formatCoord(s.x)}, ${formatCoord(s.y)}]${styles}`;\n}\n\n/** Index after the last \"header\" statement (title, axes, quadrant labels), or 0. */\nfunction settingsEnd(statements: QuadrantChartStatement[]): number {\n let at = 0;\n statements.forEach((s, i) => {\n if (s.kind === \"title\" || s.kind === \"axis\" || s.kind === \"quadrant\") at = i + 1;\n });\n return at;\n}\n\nexport const quadrantGrammar: StatementGrammar<QuadrantChartStatement> = {\n family: \"quadrant\",\n titleAsStatement: true,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if (!text || text.startsWith(\"%%\") || /^acc(Title|Descr)\\b/.test(text))\n return { kind: \"raw\", raw: line, indent };\n if ((m = /^title\\s+(.*)$/i.exec(text)))\n return { kind: \"title\", raw: line, indent, title: m[1]!.trim() };\n if ((m = AXIS.exec(text)))\n return {\n kind: \"axis\",\n raw: line,\n indent,\n axis: m[1]!.toLowerCase() as \"x\" | \"y\",\n from: m[2]!.trim(),\n ...(m[3] !== undefined ? { to: m[3].trim() } : {}),\n };\n if ((m = /^quadrant-([1-4])\\s+(.*)$/i.exec(text)))\n return {\n kind: \"quadrant\",\n raw: line,\n indent,\n n: Number(m[1]) as 1 | 2 | 3 | 4,\n label: m[2]!.trim(),\n };\n if ((m = /^classDef\\s+(\\S+)\\s*(.*)$/.exec(text)))\n return { kind: \"classDef\", raw: line, indent, name: m[1]!, styles: m[2]!.trim() };\n if ((m = POINT.exec(text)))\n return {\n kind: \"point\",\n raw: line,\n indent,\n label: m[1] !== undefined ? m[1] : m[2]!.trim(),\n ...(m[1] !== undefined ? { quoted: true } : {}),\n ...(m[3] ? { className: m[3] } : {}),\n x: Number(m[4]),\n y: Number(m[5]),\n styles: m[6]!.trim(),\n };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n switch (stmt.kind) {\n case \"title\":\n return `${stmt.indent}title ${stmt.title}`;\n case \"axis\":\n return `${stmt.indent}${stmt.axis}-axis ${stmt.from}${stmt.to ? ` --> ${stmt.to}` : \"\"}`;\n case \"quadrant\":\n return `${stmt.indent}quadrant-${stmt.n} ${stmt.label}`;\n case \"point\":\n return formatPoint(stmt);\n case \"classDef\":\n return `${stmt.indent}classDef ${stmt.name} ${stmt.styles}`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const ids = pointIds(statements);\n const quadrantLabels: Record<number, string> = {};\n const data = { xAxisLeft: \"\", xAxisRight: \"\", yAxisBottom: \"\", yAxisTop: \"\" };\n const classDefs: Record<string, string[]> = {};\n const nodes: GraphNode[] = [];\n let title: string | undefined;\n for (const s of statements) {\n if (s.kind === \"title\") title = s.title;\n else if (s.kind === \"quadrant\") quadrantLabels[s.n] = unquote(s.label);\n else if (s.kind === \"classDef\")\n classDefs[s.name] = parseStyles(s.styles).map(([k, v]) => `${k}: ${v}`);\n else if (s.kind === \"axis\") {\n if (s.axis === \"x\") {\n data.xAxisLeft = unquote(s.from);\n data.xAxisRight = s.to ? unquote(s.to) : \"\";\n } else {\n data.yAxisBottom = unquote(s.from);\n data.yAxisTop = s.to ? unquote(s.to) : \"\";\n }\n } else if (s.kind === \"point\") {\n const styles = Object.fromEntries(parseStyles(s.styles));\n const radius = styles.radius !== undefined ? Number(styles.radius) : undefined;\n nodes.push({\n id: ids.get(s)!,\n label: s.label,\n shape: \"point\",\n parentId: `quadrant-${quadrantOf(s.x, s.y)}`,\n classes: s.className ? [s.className] : [],\n styles: [],\n data: {\n x: s.x,\n y: s.y,\n ...(radius !== undefined && Number.isFinite(radius) ? { radius } : {}),\n ...(styles.color ? { color: styles.color } : {}),\n ...(styles[\"stroke-color\"] ? { strokeColor: styles[\"stroke-color\"] } : {}),\n ...(styles[\"stroke-width\"] ? { strokeWidth: styles[\"stroke-width\"] } : {}),\n details: [`${s.x}, ${s.y}`],\n },\n });\n }\n }\n const groups: GraphGroup[] = ([1, 2, 3, 4] as const).map((n) => ({\n id: `quadrant-${n}`,\n label: quadrantLabels[n] ?? `Quadrant ${n}`,\n classes: [],\n styles: [],\n data: { locked: true, quadrant: n, ...(n in quadrantLabels ? {} : { placeholder: true }) },\n }));\n const graph: DiagramGraph = {\n direction: \"TB\",\n nodes,\n edges: [],\n groups,\n classDefs,\n title: title ?? ctx.frontmatterTitle,\n data,\n };\n return { graph };\n },\n\n interceptMeta(op, ctx) {\n if (op.type !== \"moveNodes\") return false;\n const ids = pointIds(ctx.statements);\n const byId = new Map([...ids].map(([s, id]) => [id, s]));\n const space = spaceOf(ctx.doc.graph);\n for (const { id, position } of op.moves) {\n const s = byId.get(id);\n if (!s) continue; // quadrants are fixed\n // Positions that already match the data (layout pins) leave the text alone.\n const [ex, ey] = pointPosition(s.x, s.y, space);\n if (Math.abs(ex - position[0]) < 1 && Math.abs(ey - position[1]) < 1) continue;\n const { x, y } = positionToData(position, space);\n if (x === s.x && y === s.y) continue;\n s.x = x;\n s.y = y;\n s.dirty = true;\n }\n return true;\n },\n\n edit(op, ctx) {\n const { statements, indent } = ctx;\n const ids = pointIds(statements);\n const byId = new Map<string, PointStatement>();\n for (const [s, id] of ids) byId.set(id, s);\n switch (op.type) {\n case \"addNode\": {\n const label = op.node.label?.trim() || \"New point\";\n const d = op.node.data ?? {};\n let x = typeof d.x === \"number\" ? clamp01(d.x) : 0.5;\n let y = typeof d.y === \"number\" ? clamp01(d.y) : 0.5;\n if (op.position)\n ({ x, y } = positionToData(op.position, spaceOf(ctx.doc.graph, ids.size + 1)));\n let styles = \"\";\n if (typeof d.radius === \"number\" && d.radius > 0)\n styles = setStyle(styles, \"radius\", String(d.radius));\n if (typeof d.color === \"string\" && HEX.test(d.color))\n styles = setStyle(styles, \"color\", d.color);\n let at = statements.length;\n statements.forEach((s, i) => {\n if (s.kind === \"point\") at = i + 1;\n });\n statements.splice(at, 0, {\n kind: \"point\",\n raw: \"\",\n indent,\n label,\n x,\n y,\n styles,\n dirty: true,\n });\n return true;\n }\n case \"removeNodes\": {\n const remove = new Set(op.ids.map((id) => byId.get(id)).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as PointStatement));\n dropMetaKeys(ctx.meta, op.ids);\n return true;\n }\n case \"renameNode\": {\n const s = byId.get(op.id);\n if (!s || !op.label.trim()) return false;\n s.label = op.label.trim();\n s.dirty = true;\n const taken = new Set([...ids.values()].filter((id) => id !== op.id));\n renameMetaKey(ctx.meta, op.id, uniqueId(slugId(s.label, \"point\"), taken));\n return true;\n }\n case \"setNodeData\":\n return setPointData(byId.get(op.id), op.data);\n case \"setNodeParent\":\n // The quadrant follows from the coordinates the accompanying move wrote.\n return op.ids.some((id) => byId.has(id));\n case \"renameGroup\": {\n const m = /^quadrant-([1-4])$/.exec(op.id);\n if (!m) return false;\n const n = Number(m[1]) as 1 | 2 | 3 | 4;\n const label = op.label.trim();\n const idx = statements.findIndex((s) => s.kind === \"quadrant\" && s.n === n);\n if (!label) {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as QuadrantStatement;\n s.label = label;\n s.dirty = true;\n } else\n statements.splice(settingsEnd(statements), 0, {\n kind: \"quadrant\",\n raw: \"\",\n indent,\n n,\n label,\n dirty: true,\n });\n return true;\n }\n case \"setTitle\": {\n const idx = statements.findIndex((s) => s.kind === \"title\");\n if (!op.title) {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as Extract<QuadrantChartStatement, { kind: \"title\" }>;\n s.title = op.title;\n s.dirty = true;\n } else statements.unshift({ kind: \"title\", raw: \"\", indent, title: op.title, dirty: true });\n return true;\n }\n case \"setGraphData\":\n return setAxes(ctx, op.data);\n default:\n return false;\n }\n },\n};\n\nfunction setPointData(s: PointStatement | undefined, data: Record<string, unknown>): boolean {\n if (!s) return false;\n let handled = false;\n const num = (v: unknown) => (typeof v === \"number\" && Number.isFinite(v) ? v : undefined);\n if (\"x\" in data && num(data.x) !== undefined) {\n s.x = round(clamp01(num(data.x)!), 3);\n handled = true;\n }\n if (\"y\" in data && num(data.y) !== undefined) {\n s.y = round(clamp01(num(data.y)!), 3);\n handled = true;\n }\n if (\"radius\" in data) {\n const r = num(data.radius);\n if (r !== undefined && r <= 0) return false;\n s.styles = setStyle(s.styles, \"radius\", r === undefined ? undefined : String(r));\n handled = true;\n }\n if (\"color\" in data) {\n const c = typeof data.color === \"string\" ? data.color.trim() : \"\";\n if (c && !HEX.test(c)) return false; // Mermaid only accepts hex colours\n s.styles = setStyle(s.styles, \"color\", c || undefined);\n handled = true;\n }\n if (handled) s.dirty = true;\n return handled;\n}\n\nconst AXIS_KEYS = [\"xAxisLeft\", \"xAxisRight\", \"yAxisBottom\", \"yAxisTop\"] as const;\n\nfunction setAxes(ctx: EditContext<QuadrantChartStatement>, data: Record<string, unknown>): boolean {\n if (!AXIS_KEYS.some((k) => k in data)) return false;\n const { statements } = ctx;\n for (const axis of [\"x\", \"y\"] as const) {\n const [fromKey, toKey] = axis === \"x\" ? AXIS_KEYS.slice(0, 2) : AXIS_KEYS.slice(2);\n if (!(fromKey! in data) && !(toKey! in data)) continue;\n const idx = statements.findIndex((s) => s.kind === \"axis\" && s.axis === axis);\n const current = idx !== -1 ? (statements[idx] as AxisStatement) : undefined;\n const text = (key: string, fallback: string | undefined) =>\n key in data\n ? typeof data[key] === \"string\"\n ? (data[key] as string).trim()\n : \"\"\n : (fallback ?? \"\");\n const from = text(fromKey!, current?.from);\n const to = text(toKey!, current?.to);\n if (!from && !to) {\n if (idx !== -1) statements.splice(idx, 1);\n continue;\n }\n // Mermaid needs a start label; an end-only axis keeps the end text as the start.\n const next: AxisStatement = {\n kind: \"axis\",\n raw: \"\",\n indent: current?.indent ?? ctx.indent,\n axis,\n from: from || to,\n ...(from && to ? { to } : {}),\n dirty: true,\n };\n if (idx !== -1) statements[idx] = next;\n else {\n const xAt = statements.findIndex((s) => s.kind === \"axis\" && s.axis === \"x\");\n const titleAt = statements.findIndex((s) => s.kind === \"title\");\n statements.splice(axis === \"y\" && xAt !== -1 ? xAt + 1 : titleAt + 1, 0, next);\n }\n }\n return true;\n}\n\nexport const quadrantAdapter = createStatementAdapter(quadrantGrammar);\n\n/**\n * Positions come from the data, never from `meta.layout`: Mermaid's chart\n * area split into four quadrants, each point's box centred on its coordinates.\n */\nregisterFamilyLayout(\"quadrant\", (graph) => {\n const geo = quadrantGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const q of geo.quadrants) {\n positions[q.id] = [q.x, q.y];\n sizes[q.id] = { width: q.width, height: q.height };\n }\n for (const p of geo.points) {\n positions[p.id] = [p.cx - POINT_BOX / 2, p.cy - POINT_BOX / 2];\n sizes[p.id] = { width: POINT_BOX, height: POINT_BOX };\n }\n return { positions, sizes };\n});\n","import type { LayoutResult, Size } from \"../layout-registry.js\";\nimport type { DiagramGraph, GraphGroup, GraphNode, Point, DiagramMeta } from \"../types.js\";\n\n/**\n * C4 geometry as Mermaid draws it, shared by the layout (positions), the\n * canvas (shapes and text placement) and the relation renderer.\n *\n * Mermaid lays C4 elements out in rows inside each boundary (four per row by\n * default, `UpdateLayoutConfig` changes it), nested boundaries below their\n * parent's elements (two per row), with 50px margins; every element is 216px\n * wide and as tall as its text. The shapes are Mermaid's unified ones:\n * `person` (a head over a rounded body), rounded rectangles for systems,\n * containers and components, `cylinder` for `*Db` and a horizontal\n * cylinder for `*Queue`. The text is a bold name, a `[Type: technology]`\n * line and the description, each wrapped to the shape's width.\n *\n * Text sizes are estimated (no DOM): close to Mermaid's for the default\n * \"Open Sans\" font, so the canvas has the same rows, gaps and proportions.\n *\n * @module\n */\n\n/** Mermaid's C4 defaults (`config.c4`). */\nexport const C4_METRICS = {\n shapeMargin: 50,\n shapePadding: 20,\n width: 216,\n diagramMarginX: 50,\n diagramMarginY: 10,\n shapeInRow: 4,\n boundaryInRow: 2,\n nextLinePaddingX: 0,\n /** Element name size; the type line is 0.75em of it, the description 0.82em. */\n fontSize: 14,\n boundaryFontSize: 14,\n messageFontSize: 12,\n /** Gap between the name, type and description blocks. */\n sectionGap: 3,\n lineHeight: 1.15,\n /** Mermaid wraps against `screen.availWidth`; used when there is no screen. */\n screenWidth: 1920,\n /** Size given to a boundary with nothing in it (Mermaid draws it 0×0). */\n emptyBoundary: { width: 216, height: 100 },\n} as const;\n\nconst M = C4_METRICS;\n\n// ---------------------------------------------------------------------------\n// Text estimates\n// ---------------------------------------------------------------------------\n\n/** Approximate advance of one character, in em, for a humanist sans (Open Sans). */\nfunction charEm(ch: string): number {\n if (ch === \" \") return 0.26;\n if (/[iljtfI.,:;'!|()[\\]]/.test(ch)) return 0.3;\n if (/[mwMW@]/.test(ch)) return 0.86;\n if (/[A-Z]/.test(ch)) return 0.66;\n if (/[0-9]/.test(ch)) return 0.57;\n return 0.54;\n}\n\n/** Estimated rendered width of a single line of text. */\nexport function textWidth(text: string, fontSize: number, bold = false): number {\n let em = 0;\n for (const ch of text) em += charEm(ch);\n return em * fontSize * 0.97 * (bold ? 1.06 : 1);\n}\n\n/** Greedy word wrap of `text` (with `<br>` / newline breaks) at `maxWidth`. */\nexport function wrapText(text: string, maxWidth: number, fontSize: number, bold = false): string[] {\n const out: string[] = [];\n for (const para of text.split(/<br\\s*\\/?>|\\n/i)) {\n const words = para.split(/\\s+/).filter(Boolean);\n if (!words.length) {\n out.push(\"\");\n continue;\n }\n let line = \"\";\n for (const w of words) {\n const next = line ? `${line} ${w}` : w;\n if (line && textWidth(next, fontSize, bold) > maxWidth) {\n out.push(line);\n line = w;\n } else line = next;\n }\n out.push(line);\n }\n return out;\n}\n\nconst lineHeightOf = (fontSize: number) => fontSize * M.lineHeight;\n\n// ---------------------------------------------------------------------------\n// Elements\n// ---------------------------------------------------------------------------\n\nexport type C4Base = \"person\" | \"system\" | \"container\" | \"component\";\nexport type C4ShapeKind = \"person\" | \"rounded\" | \"cylinder\" | \"h-cyl\";\n\n/** Mermaid's element type (`external_container_db`…) for an element keyword. */\nexport interface C4ElementType {\n base: C4Base;\n variant: \"\" | \"db\" | \"queue\";\n external: boolean;\n /** `person`, `external_system_db`…, as Mermaid's `typeC4Shape`. */\n type: string;\n}\n\nconst KEYWORD = /^(Person|System|Container|Component)(Db|Queue)?(_Ext)?$/;\nconst STEREOTYPE: Record<C4Base, string> = {\n person: \"Person\",\n system: \"Software System\",\n container: \"Container\",\n component: \"Component\",\n};\n\nexport function c4ElementType(node: GraphNode): C4ElementType {\n const m = KEYWORD.exec(String(node.data?.kind ?? \"\"));\n const base = (m?.[1]?.toLowerCase() as C4Base | undefined) ?? fromShape(node.shape);\n const variant =\n (m?.[2]?.toLowerCase() as \"db\" | \"queue\" | undefined) ??\n (node.shape === \"c4-db\" ? \"db\" : node.shape === \"c4-queue\" ? \"queue\" : \"\");\n const external = m ? !!m[3] : /-ext$/.test(node.shape ?? \"\");\n const type = `${external ? \"external_\" : \"\"}${base}${variant ? `_${variant}` : \"\"}`;\n return { base, variant, external, type };\n}\n\nfunction fromShape(shape: string | undefined): C4Base {\n const m = /^c4-(person|system|container|component)/.exec(shape ?? \"\");\n return (m?.[1] as C4Base | undefined) ?? \"container\";\n}\n\n/** Which of the element's text parts a section shows (and edits). */\nexport type C4TextPart = \"label\" | \"tech\" | \"descr\";\n\nexport interface C4TextSection {\n part: C4TextPart;\n /** The text shown (the type line is `[Container: tech]`). */\n text: string;\n lines: string[];\n fontSize: number;\n bold: boolean;\n height: number;\n}\n\nexport interface C4ElementGeometry {\n type: C4ElementType;\n shape: C4ShapeKind;\n width: number;\n height: number;\n /** Width the text wraps at. */\n wrapWidth: number;\n sections: C4TextSection[];\n textHeight: number;\n /** Centre of the text block, relative to the element's top-left. */\n textCenter: { x: number; y: number };\n /** Person: head radius, where the body starts and its corner radius. */\n person?: { headRadius: number; bodyTop: number; bodyRadius: number };\n /** Cylinders: the end-cap ellipse radii (`rx` along the axis for `h-cyl`). */\n cylinder?: { rx: number; ry: number };\n}\n\n/** The `[Type]` / `[Type: technology]` line Mermaid prints under the name. */\nexport function c4Stereotype(type: C4ElementType, tech?: string): string {\n const name = STEREOTYPE[type.base];\n return tech ? `[${name}: ${tech}]` : `[${name}]`;\n}\n\nconst str = (v: unknown) => (typeof v === \"string\" && v ? v : undefined);\n\n/** Size, shape and text layout of one element, as Mermaid computes them. */\nexport function c4ElementGeometry(node: GraphNode): C4ElementGeometry {\n const type = c4ElementType(node);\n const shape: C4ShapeKind =\n type.base === \"person\"\n ? \"person\"\n : type.variant === \"db\"\n ? \"cylinder\"\n : type.variant === \"queue\"\n ? \"h-cyl\"\n : \"rounded\";\n const pad = M.shapePadding;\n // Each shape handler narrows the width before the label is wrapped.\n const wrapWidth =\n shape === \"cylinder\"\n ? M.width - pad - 2 * pad\n : shape === \"h-cyl\"\n ? M.width - pad / 2 - 2 * pad\n : M.width - 2 * pad;\n const tech = str(node.data?.tech);\n const descr = str(node.data?.descr);\n const parts: [C4TextPart, string, number, boolean][] = [\n [\"label\", node.label ?? \"\", M.fontSize, true],\n [\"tech\", c4Stereotype(type, tech), M.fontSize * 0.75, false],\n ];\n if (descr) parts.push([\"descr\", descr, M.fontSize * 0.82, false]);\n const sections: C4TextSection[] = parts\n .filter(([, text]) => text)\n .map(([part, text, fontSize, bold]) => {\n // Mermaid measures for wrapping before the name turns bold.\n const lines = wrapText(text, wrapWidth, fontSize);\n return { part, text, lines, fontSize, bold, height: lines.length * lineHeightOf(fontSize) };\n });\n const textWidthMax = Math.max(\n 0,\n ...sections.flatMap((s) => s.lines.map((l) => textWidth(l, s.fontSize, s.bold))),\n );\n const textHeight =\n sections.reduce((h, s) => h + s.height, 0) + M.sectionGap * Math.max(0, sections.length - 1);\n\n // A line that did not wrap (measured narrower than it renders) widens the shape.\n let width: number =\n shape === \"cylinder\"\n ? Math.max(M.width - pad, textWidthMax) + pad\n : shape === \"h-cyl\"\n ? Math.max(M.width - pad / 2, textWidthMax)\n : Math.max(M.width, textWidthMax + 2 * pad);\n let height: number;\n let textCenter: { x: number; y: number };\n let person: C4ElementGeometry[\"person\"];\n let cylinder: C4ElementGeometry[\"cylinder\"];\n switch (shape) {\n case \"person\": {\n const headRadius = Math.min(Math.max(width * 0.23, 16), 56);\n const overlap = headRadius * 0.27;\n const bodyHeight = textHeight + pad * 2;\n const bodyRadius = Math.min(width * 0.177, bodyHeight * 0.45);\n const bodyTop = 2 * headRadius - overlap;\n height = bodyTop + bodyHeight;\n person = { headRadius, bodyTop, bodyRadius };\n textCenter = { x: width / 2, y: bodyTop + bodyHeight / 2 };\n break;\n }\n case \"cylinder\": {\n const rx = width / 2;\n const ry = rx / (2.5 + width / 50);\n const body = textHeight + pad + ry;\n height = body + 2 * ry;\n cylinder = { rx, ry };\n textCenter = { x: width / 2, y: height / 2 + pad / 1.5 };\n break;\n }\n case \"h-cyl\": {\n const h = textHeight + pad / 2;\n const ry = h / 2;\n const rx = ry / (2.5 + h / 50);\n const body = width + pad / 2 + rx;\n width = body + 2 * rx;\n height = h;\n cylinder = { rx, ry };\n textCenter = { x: body / 2, y: h / 2 };\n break;\n }\n default:\n height = textHeight + pad * 2;\n textCenter = { x: width / 2, y: height / 2 };\n }\n return {\n type,\n shape,\n width,\n height,\n wrapWidth,\n sections,\n textHeight,\n textCenter,\n person,\n cylinder,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Boundaries\n// ---------------------------------------------------------------------------\n\nexport interface C4BoundaryText {\n label: string;\n /** `[system]`, `[node]`… (Mermaid's default type per boundary keyword). */\n type: string;\n descr?: string;\n /** Centre lines of the label, type and description, from the boundary's top. */\n labelY: number;\n typeY: number;\n descrY?: number;\n /** Height the texts take above the boundary (Mermaid's `Y`). */\n height: number;\n /** Deployment nodes are drawn with a solid border. */\n solid: boolean;\n}\n\nconst BOUNDARY_TYPE: Record<string, string> = {\n Enterprise_Boundary: \"ENTERPRISE\",\n System_Boundary: \"SYSTEM\",\n Container_Boundary: \"CONTAINER\",\n Boundary: \"system\",\n Node: \"node\",\n Node_L: \"node\",\n Node_R: \"node\",\n Deployment_Node: \"node\",\n};\n\nexport function c4BoundaryText(group: Pick<GraphGroup, \"label\" | \"data\">): C4BoundaryText {\n const kind = String(group.data?.kind ?? \"System_Boundary\");\n const typeText = str(group.data?.type) ?? BOUNDARY_TYPE[kind] ?? \"system\";\n const descr = str(group.data?.descr);\n return boundaryText(group.label, typeText, descr, /^(Node|Deployment_Node)/.test(kind));\n}\n\nfunction boundaryText(label: string, type: string, descr: string | undefined, solid: boolean) {\n const labelH = lineHeightOf(M.boundaryFontSize + 2);\n const typeH = lineHeightOf(M.boundaryFontSize);\n const labelY = 8;\n const typeY = labelY + labelH + 5;\n let height = typeY + typeH;\n let descrY: number | undefined;\n if (descr) {\n descrY = height + 20;\n height = descrY + lineHeightOf(M.boundaryFontSize - 2);\n }\n return { label, type: `[${type}]`, descr, labelY, typeY, descrY, height, solid };\n}\n\n// ---------------------------------------------------------------------------\n// Layout (Mermaid's c4Renderer `Bounds` algorithm)\n// ---------------------------------------------------------------------------\n\ninterface Extent {\n startx?: number;\n stopx?: number;\n starty?: number;\n stopy?: number;\n}\n\nclass Bounds {\n data: Extent & { widthLimit: number } = { widthLimit: 0 };\n next: Extent & { cnt: number } = { cnt: 0 };\n constructor(private readonly shapeInRow: number) {}\n setData(startx: number, stopx: number, starty: number, stopy: number) {\n this.next.startx = this.data.startx = startx;\n this.next.stopx = this.data.stopx = stopx;\n this.next.starty = this.data.starty = starty;\n this.next.stopy = this.data.stopy = stopy;\n }\n private update(\n obj: Extent,\n key: keyof Extent,\n val: number,\n fn: (a: number, b: number) => number,\n ) {\n const cur = obj[key];\n obj[key] = cur === undefined ? val : fn(val, cur);\n }\n insert(box: { x: number; y: number; width: number; height: number }) {\n const margin = M.shapeMargin;\n this.next.cnt += 1;\n let startx =\n this.next.startx === this.next.stopx\n ? this.next.stopx! + margin\n : this.next.stopx! + margin * 2;\n let stopx = startx + box.width;\n let starty = this.next.starty! + margin * 2;\n let stopy = starty + box.height;\n if (\n startx >= this.data.widthLimit ||\n stopx >= this.data.widthLimit ||\n this.next.cnt > this.shapeInRow\n ) {\n startx = this.next.startx! + margin + M.nextLinePaddingX;\n starty = this.next.stopy! + margin * 2;\n this.next.stopx = stopx = startx + box.width;\n this.next.starty = this.next.stopy;\n this.next.stopy = stopy = starty + box.height;\n this.next.cnt = 1;\n }\n box.x = startx;\n box.y = starty;\n for (const o of [this.data, this.next]) {\n this.update(o, \"startx\", startx, Math.min);\n this.update(o, \"starty\", starty, Math.min);\n this.update(o, \"stopx\", stopx, Math.max);\n this.update(o, \"stopy\", stopy, Math.max);\n }\n }\n bumpLastMargin(margin: number) {\n this.data.stopx! += margin;\n this.data.stopy! += margin;\n }\n}\n\nexport interface C4Layout extends LayoutResult {\n elements: Map<string, C4ElementGeometry>;\n boundaries: Map<string, C4BoundaryText>;\n}\n\nexport interface C4LayoutOptions {\n /** Mermaid wraps rows against the screen width (`screen.availWidth`). */\n screenWidth?: number;\n}\n\nfunction screenWidth(): number {\n const avail =\n typeof screen !== \"undefined\" ? (screen as { availWidth?: number }).availWidth : undefined;\n return avail && avail > 0 ? avail : M.screenWidth;\n}\n\n/**\n * Element and boundary boxes as Mermaid's C4 renderer computes them, then\n * stored positions (elements the user dragged) on top; boundaries that\n * contain a moved element are re-fitted around their content with Mermaid's\n * margins.\n */\nexport function c4Layout(\n graph: DiagramGraph,\n meta: DiagramMeta = { v: 1 },\n options: C4LayoutOptions = {},\n): C4Layout {\n const shapeInRow = Number(graph.data?.c4ShapeInRow) || M.shapeInRow;\n const boundaryInRow = Number(graph.data?.c4BoundaryInRow) || M.boundaryInRow;\n const elements = new Map(graph.nodes.map((n) => [n.id, c4ElementGeometry(n)]));\n const texts = new Map(graph.groups.map((g) => [g.id, c4BoundaryText(g)]));\n const groupIds = new Set(graph.groups.map((g) => g.id));\n const parentOf = (p: string | undefined) => (p && groupIds.has(p) ? p : undefined);\n const elementsIn = new Map<string | undefined, GraphNode[]>();\n const boundariesIn = new Map<string | undefined, GraphGroup[]>();\n for (const n of graph.nodes) push(elementsIn, parentOf(n.parentId), n);\n for (const g of graph.groups) push(boundariesIn, parentOf(g.parentId), g);\n\n const boxes = new Map<string, { x: number; y: number; width: number; height: number }>();\n const rects = new Map<string, { x: number; y: number; width: number; height: number }>();\n const global = boundaryText(\"global\", \"global\", undefined, false);\n\n const drawInside = (parent: Bounds, list: (GraphGroup | null)[]) => {\n const current = new Bounds(shapeInRow);\n current.data.widthLimit = parent.data.widthLimit / Math.min(boundaryInRow, list.length);\n list.forEach((boundary, i) => {\n const alias = boundary?.id;\n const Y = boundary ? texts.get(boundary.id)!.height : global.height;\n if (i === 0 || i % boundaryInRow === 0) {\n const x = parent.data.startx! + M.diagramMarginX;\n const y = parent.data.stopy! + M.diagramMarginY + Y;\n current.setData(x, x, y, y);\n } else {\n const x =\n current.data.stopx !== current.data.startx\n ? current.data.stopx! + M.diagramMarginX\n : current.data.startx!;\n const y = current.data.starty!;\n current.setData(x, x, y, y);\n }\n const shapes = elementsIn.get(alias) ?? [];\n for (const n of shapes) {\n const g = elements.get(n.id)!;\n const box = { x: 0, y: 0, width: g.width, height: g.height };\n current.insert(box);\n boxes.set(n.id, box);\n }\n if (shapes.length) current.bumpLastMargin(M.shapeMargin);\n const nested = boundariesIn.get(alias) ?? [];\n if (nested.length) drawInside(current, nested);\n if (boundary)\n rects.set(boundary.id, {\n x: current.data.startx!,\n y: current.data.starty!,\n width: current.data.stopx! - current.data.startx!,\n height: current.data.stopy! - current.data.starty!,\n });\n parent.data.stopy = Math.max(current.data.stopy! + M.shapeMargin, parent.data.stopy!);\n parent.data.stopx = Math.max(current.data.stopx! + M.shapeMargin, parent.data.stopx!);\n });\n };\n const screenBounds = new Bounds(shapeInRow);\n screenBounds.setData(M.diagramMarginX, M.diagramMarginX, M.diagramMarginY, M.diagramMarginY);\n screenBounds.data.widthLimit = options.screenWidth ?? screenWidth();\n drawInside(screenBounds, [null]);\n\n // Stored positions win; boundaries around moved content are re-fitted.\n const stored = meta.layout ?? {};\n const moved = new Set<string>();\n for (const [id, box] of boxes) {\n const p = stored[id];\n if (!p) continue;\n box.x = p[0];\n box.y = p[1];\n moved.add(id);\n }\n const depth = (g: GraphGroup): number => {\n let d = 0;\n let p = parentOf(g.parentId);\n const seen = new Set<string>();\n while (p && !seen.has(p)) {\n seen.add(p);\n d++;\n p = parentOf(graph.groups.find((x) => x.id === p)?.parentId);\n }\n return d;\n };\n const deepestFirst = [...graph.groups].sort((a, b) => depth(b) - depth(a));\n for (const g of deepestFirst) {\n const rect = rects.get(g.id)!;\n const els = (elementsIn.get(g.id) ?? []).map((n) => ({ id: n.id, box: boxes.get(n.id)! }));\n const subs = (boundariesIn.get(g.id) ?? []).map((b) => ({ id: b.id, box: rects.get(b.id)! }));\n const touched = [...els, ...subs].some((c) => moved.has(c.id));\n if (!els.length && !subs.length) {\n const p = stored[g.id];\n if (p) {\n rect.x = p[0];\n rect.y = p[1];\n moved.add(g.id);\n }\n rect.width = Math.max(rect.width, M.emptyBoundary.width);\n rect.height = Math.max(rect.height, M.emptyBoundary.height);\n continue;\n }\n if (!touched) continue;\n const all = [...els, ...subs].map((c) => c.box);\n const left = Math.min(...all.map((b) => b.x)) - M.shapeMargin;\n const right = Math.max(...all.map((b) => b.x + b.width)) + M.shapeMargin;\n const bottom = Math.max(...all.map((b) => b.y + b.height)) + M.shapeMargin;\n const tops = [\n ...els.map((c) => c.box.y - M.shapeMargin * 2),\n ...subs.map((c) => c.box.y - M.diagramMarginY - texts.get(c.id)!.height),\n ];\n const top = Math.min(...tops);\n Object.assign(rect, { x: left, y: top, width: right - left, height: bottom - top });\n moved.add(g.id);\n }\n\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const [id, b] of [...boxes, ...rects]) {\n positions[id] = [b.x, b.y];\n sizes[id] = { width: b.width, height: b.height };\n }\n return { positions, sizes, elements, boundaries: texts };\n}\n\nfunction push<K, V>(map: Map<K, V[]>, key: K, value: V): void {\n const arr = map.get(key);\n if (arr) arr.push(value);\n else map.set(key, [value]);\n}\n\n// ---------------------------------------------------------------------------\n// Relations\n// ---------------------------------------------------------------------------\n\nexport interface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Where the line from the box's centre towards `point` leaves the box. */\nexport function intersectBox(box: Box, point: { x: number; y: number }): { x: number; y: number } {\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n const dx = point.x - cx;\n const dy = point.y - cy;\n const w = box.width / 2;\n const h = box.height / 2;\n if (!dx && !dy) return { x: cx, y: cy };\n if (Math.abs(dy) * w > Math.abs(dx) * h) {\n const sy = dy < 0 ? -h : h;\n return { x: cx + (sy * dx) / dy, y: cy + sy };\n }\n const sx = dx < 0 ? -w : w;\n return { x: cx + sx, y: cy + (sx * dy) / dx };\n}\n\nexport interface C4RelGeometry {\n start: { x: number; y: number };\n end: { x: number; y: number };\n /** Quadratic control point: Mermaid draws every relation but the first as a curve. */\n control?: { x: number; y: number };\n /** Left edge of the label block (Mermaid starts the label at the midpoint), vertically centred. */\n label: { x: number; y: number };\n}\n\n/**\n * A relation between two element boxes: endpoints where the centre-to-centre\n * line leaves each box, the first relation straight and the others as\n * Mermaid's quadratic curves, the label at the midpoint.\n */\nexport function c4RelGeometry(from: Box, to: Box, index: number): C4RelGeometry {\n const centre = (b: Box) => ({ x: b.x + b.width / 2, y: b.y + b.height / 2 });\n const start = intersectBox(from, centre(to));\n const end = intersectBox(to, centre(from));\n const control =\n index === 0\n ? undefined\n : {\n x: start.x + (end.x - start.x) / 2 - (end.x - start.x) / 4,\n y: start.y + (end.y - start.y) / 2,\n };\n const label = {\n x: Math.min(start.x, end.x) + Math.abs(end.x - start.x) / 2,\n y: Math.min(start.y, end.y) + Math.abs(end.y - start.y) / 2,\n };\n return { start, end, control, label };\n}\n\n/**\n * Mermaid's C4 arrowhead (a 10×10 triangle, `refX` 9) at `tip`, pointing\n * along the direction from `from` to `tip`; as an SVG `points` list.\n */\nexport function c4ArrowHead(tip: { x: number; y: number }, from: { x: number; y: number }): string {\n const dx = tip.x - from.x;\n const dy = tip.y - from.y;\n const len = Math.hypot(dx, dy) || 1;\n const ux = dx / len;\n const uy = dy / len;\n const point = { x: tip.x + ux, y: tip.y + uy };\n const base = { x: tip.x - ux * 9, y: tip.y - uy * 9 };\n const pts = [\n point,\n { x: base.x - uy * 5, y: base.y + ux * 5 },\n { x: base.x + uy * 5, y: base.y - ux * 5 },\n ];\n return pts.map((p) => `${round(p.x)},${round(p.y)}`).join(\" \");\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100;\n","import { registerFamilyLayout } from \"../layout-registry.js\";\nimport type { ArrowHead, DiagramGraph, GraphEdge, GraphGroup, GraphNode } from \"../types.js\";\nimport { c4Layout } from \"./geometry.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n slugId,\n splitOutsideQuotes,\n uniqueId,\n unquote,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * C4 adapter (`C4Context`, `C4Container`, `C4Component`, `C4Dynamic`,\n * `C4Deployment`).\n *\n * ```\n * C4Container\n * title Containers\n * Person(user, \"User\")\n * System_Boundary(sb, \"Portal\") {\n * Container(web, \"Web app\", \"React\", \"The UI\")\n * }\n * Rel(user, web, \"Uses\", \"HTTPS\")\n * ```\n *\n * Canvas model: one node per element (`Person`, `System*`, `Container*`,\n * `Component*`; id = alias, shape `c4-*`, `data = { kind, descr, tech, extra,\n * details }`), one group per boundary block (`*_Boundary`, `Boundary`,\n * `Node*`, `Deployment_Node`; `data = { kind, type, descr }`) and one edge per\n * relation (`Rel`, `BiRel`, `Rel_Back`, `Rel_U`…, `RelIndex`; `data = { kind,\n * tech }`). Named `$…` arguments are kept verbatim and re-emitted after the\n * positional ones. `UpdateRelStyle` / `UpdateElementStyle` lines are kept as\n * written but dropped with the element or relation they style.\n *\n * Mermaid's C4 lexer does not understand `#quot;`, so inner double quotes are\n * written as `'`.\n *\n * For the canvas, `graph.data` carries the diagram type (`c4Type`, e.g.\n * `C4Dynamic` numbers its relations) and `UpdateLayoutConfig` values\n * (`c4ShapeInRow`, `c4BoundaryInRow`); `UpdateElementStyle` colours are\n * mirrored to `node.data.c4Style` (`bgColor`, `fontColor`, `borderColor`) and\n * `UpdateRelStyle` ones to `edge.data.c4Style` (`textColor`, `lineColor`,\n * `offsetX`, `offsetY`). The layout is Mermaid's own (see `./geometry`).\n *\n * @module\n */\n\n/** Positional arguments shared by elements, boundaries and relations. */\ninterface Args {\n label: string;\n /** Positional values beyond the ones the diagram module models (sprite, tags, link…), unquoted. */\n rest: string[];\n /** Named `$key=value` arguments, verbatim. */\n extra: string[];\n}\n\nexport type C4Statement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string })\n | (BaseStatement &\n Args & { kind: \"element\"; keyword: string; alias: string; tech?: string; descr?: string })\n | (BaseStatement &\n Args & { kind: \"boundary\"; keyword: string; alias: string; type?: string; descr?: string })\n | (BaseStatement & { kind: \"close\" })\n | (BaseStatement &\n Args & {\n kind: \"rel\";\n keyword: string;\n /** `RelIndex` sequence number. */\n index?: string;\n from: string;\n to: string;\n tech?: string;\n })\n | (BaseStatement & { kind: \"relStyle\"; from: string; to: string; rest: string[] })\n | (BaseStatement & { kind: \"elementStyle\"; alias: string });\n\ntype ElementStmt = Extract<C4Statement, { kind: \"element\" }>;\ntype BoundaryStmt = Extract<C4Statement, { kind: \"boundary\" }>;\ntype RelStmt = Extract<C4Statement, { kind: \"rel\" }>;\n\ntype Base = \"Person\" | \"System\" | \"Container\" | \"Component\";\ntype Variant = \"\" | \"Db\" | \"Queue\";\n\ninterface ElementKind {\n base: Base;\n variant: Variant;\n ext: boolean;\n}\n\nconst ELEMENT_KIND = /^(Person|System|Container|Component)(Db|Queue)?(_Ext)?$/;\nconst BOUNDARY_KINDS = new Set([\n \"Enterprise_Boundary\",\n \"System_Boundary\",\n \"Container_Boundary\",\n \"Boundary\",\n \"Node\",\n \"Node_L\",\n \"Node_R\",\n \"Deployment_Node\",\n]);\n/** Boundaries whose second positional argument is a type (and third, for nodes, a description). */\nconst TYPED_BOUNDARIES = new Set([\"Boundary\", \"Node\", \"Node_L\", \"Node_R\", \"Deployment_Node\"]);\nconst NODE_BOUNDARIES = new Set([\"Node\", \"Node_L\", \"Node_R\", \"Deployment_Node\"]);\n/** Relation keywords Mermaid 12 accepts (`Rel_Back_U`, `BiRel_U` are rejected by its lexer). */\nconst REL_KINDS = new Set([\n \"Rel\",\n \"BiRel\",\n \"Rel_Back\",\n \"Rel_U\",\n \"Rel_Up\",\n \"Rel_D\",\n \"Rel_Down\",\n \"Rel_L\",\n \"Rel_Left\",\n \"Rel_R\",\n \"Rel_Right\",\n \"RelIndex\",\n]);\nconst CALL = /^([A-Za-z_]+)\\s*\\((.*)\\)\\s*(\\{)?\\s*$/;\n\nfunction parseKind(keyword: string): ElementKind | undefined {\n const m = ELEMENT_KIND.exec(keyword);\n if (!m) return undefined;\n const base = m[1] as Base;\n const variant = (m[2] ?? \"\") as Variant;\n if (base === \"Person\" && variant) return undefined;\n return { base, variant, ext: !!m[3] };\n}\n\nfunction kindKeyword(k: ElementKind): string {\n return `${k.base}${k.variant}${k.ext ? \"_Ext\" : \"\"}`;\n}\n\nfunction shapeOf(k: ElementKind): string {\n if (k.variant === \"Db\") return \"c4-db\";\n if (k.variant === \"Queue\") return \"c4-queue\";\n return `c4-${k.base.toLowerCase()}${k.ext ? \"-ext\" : \"\"}`;\n}\n\n/** Whether a base carries a technology argument before its description. */\nconst hasTech = (base: Base) => base === \"Container\" || base === \"Component\";\n\n/** The element base a diagram type adds by default (and uses for `c4-db` / `c4-queue`). */\nfunction defaultBase(header: string): Base {\n if (/^\\s*C4Context\\b/.test(header)) return \"System\";\n if (/^\\s*C4Component\\b/.test(header)) return \"Component\";\n return \"Container\";\n}\n\n/** Element kind for a canvas shape, keeping what it can of `current`. */\nfunction kindForShape(\n shape: string | undefined,\n header: string,\n current?: ElementKind,\n): ElementKind | undefined {\n const fallback = current && current.base !== \"Person\" ? current.base : defaultBase(header);\n const m = /^c4-(person|system|container|component)(-ext)?$/.exec(shape ?? \"\");\n if (m) {\n const base = (m[1]![0]!.toUpperCase() + m[1]!.slice(1)) as Base;\n return { base, variant: \"\", ext: !!m[2] };\n }\n if (shape === \"c4-db\" || shape === \"c4-queue\")\n return { base: fallback, variant: shape === \"c4-db\" ? \"Db\" : \"Queue\", ext: !!current?.ext };\n if (shape === undefined) return { base: fallback, variant: \"\", ext: false };\n return undefined;\n}\n\n/** Named `$key=\"value\"` arguments of a raw call, as a record. */\nfunction namedArgs(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n for (const m of raw.matchAll(/\\$(\\w+)\\s*=\\s*\"([^\"]*)\"/g)) out[m[1]!] = m[2]!;\n return out;\n}\n\n/** Quotes a C4 string argument (`\"` → `'`, since C4 has no escape for it). */\nfunction q(text: string): string {\n return `\"${text.replace(/\"/g, \"'\")}\"`;\n}\n\nfunction splitArgs(text: string): { ids: string[]; positional: string[]; extra: string[] } {\n const parts = splitOutsideQuotes(text, \",\").map((p) => p.trim());\n const extra = parts.filter((p) => p.startsWith(\"$\"));\n const values = parts.filter((p) => !p.startsWith(\"$\"));\n return { ids: values, positional: values.map(unquote), extra };\n}\n\n/** Joins positional values, dropping trailing empty ones (they are optional). */\nfunction positional(values: (string | undefined)[], rest: string[]): string[] {\n const all = [...values.map((v) => v ?? \"\"), ...rest];\n while (all.length > 1 && all[all.length - 1] === \"\") all.pop();\n return all.map(q);\n}\n\nfunction call(indent: string, keyword: string, args: string[], open = false): string {\n return `${indent}${keyword}(${args.join(\", \")})${open ? \" {\" : \"\"}`;\n}\n\nfunction arrowsOf(keyword: string): { arrowStart: ArrowHead; arrowEnd: ArrowHead } {\n if (keyword === \"BiRel\") return { arrowStart: \"arrow_point\", arrowEnd: \"arrow_point\" };\n if (keyword === \"Rel_Back\") return { arrowStart: \"arrow_point\", arrowEnd: \"none\" };\n return { arrowStart: \"none\", arrowEnd: \"arrow_point\" };\n}\n\n/** Edge ids `L_<from>_<to>_<n>`, numbered per endpoint pair in document order. */\nfunction relIds(statements: C4Statement[]): Map<RelStmt, string> {\n const counts = new Map<string, number>();\n const ids = new Map<RelStmt, string>();\n for (const s of statements) {\n if (s.kind !== \"rel\") continue;\n const key = `${s.from}_${s.to}`;\n const n = counts.get(key) ?? 0;\n counts.set(key, n + 1);\n ids.set(s, `L_${key}_${n}`);\n }\n return ids;\n}\n\n/** Index of the `}` closing the boundary opened at `open` (or the last index if unclosed). */\nfunction blockEnd(statements: C4Statement[], open: number): number {\n if (statements[open]?.kind !== \"boundary\") return open;\n let depth = 0;\n for (let i = open; i < statements.length; i++) {\n const s = statements[i]!;\n if (s.kind === \"boundary\") depth++;\n else if (s.kind === \"close\" && --depth === 0) return i;\n }\n return statements.length - 1;\n}\n\n/** Enclosing boundary alias of each statement index. */\nfunction parents(statements: C4Statement[]): (string | undefined)[] {\n const stack: string[] = [];\n return statements.map((s) => {\n const parent = stack.at(-1);\n if (s.kind === \"boundary\") stack.push(s.alias);\n else if (s.kind === \"close\") stack.pop();\n return s.kind === \"close\" ? stack.at(-1) : parent;\n });\n}\n\n/** Re-indents statements whose text starts with `from` so it starts with `to`. */\nfunction reindent(block: C4Statement[], from: string, to: string): void {\n if (from === to) return;\n for (const s of block) {\n if (!s.raw.trim() || !s.raw.startsWith(from)) continue;\n s.raw = to + s.raw.slice(from.length);\n s.indent = to + s.indent.slice(from.length);\n }\n}\n\nexport const c4Grammar: StatementGrammar<C4Statement> = {\n family: \"c4\",\n titleAsStatement: true,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if (text === \"}\") return { kind: \"close\", raw: line, indent };\n if ((m = /^title\\s+(.*)$/.exec(text)))\n return { kind: \"title\", raw: line, indent, title: m[1]!.trim() };\n if (!(m = CALL.exec(text))) return { kind: \"raw\", raw: line, indent };\n const keyword = m[1]!;\n const opens = !!m[3];\n const { ids, positional: pos, extra } = splitArgs(m[2]!);\n const base = { raw: line, indent, extra };\n const elementKind = parseKind(keyword);\n if (elementKind && !opens && ids.length >= 2) {\n const tech = hasTech(elementKind.base);\n const [label, a, b, ...rest] = pos.slice(1);\n return {\n ...base,\n kind: \"element\",\n keyword,\n alias: ids[0]!,\n label: label ?? \"\",\n tech: tech ? a : undefined,\n descr: tech ? b : a,\n rest: tech ? rest : [b, ...rest].filter((v): v is string => v !== undefined),\n };\n }\n if (BOUNDARY_KINDS.has(keyword) && opens && ids.length >= 2) {\n const typed = TYPED_BOUNDARIES.has(keyword);\n const node = NODE_BOUNDARIES.has(keyword);\n const [label, ...more] = pos.slice(1);\n return {\n ...base,\n kind: \"boundary\",\n keyword,\n alias: ids[0]!,\n label: label ?? \"\",\n type: typed ? more[0] : undefined,\n descr: node ? more[1] : undefined,\n rest: more.slice(node ? 2 : typed ? 1 : 0),\n };\n }\n if (REL_KINDS.has(keyword) && !opens) {\n const lead = keyword === \"RelIndex\" ? 1 : 0;\n if (ids.length < lead + 3) return { kind: \"raw\", raw: line, indent };\n const [label, tech, ...rest] = pos.slice(lead + 2);\n return {\n ...base,\n kind: \"rel\",\n keyword,\n index: lead ? ids[0] : undefined,\n from: ids[lead]!,\n to: ids[lead + 1]!,\n label: label ?? \"\",\n tech,\n rest,\n };\n }\n if (keyword === \"UpdateRelStyle\" && ids.length >= 2)\n return {\n kind: \"relStyle\",\n raw: line,\n indent,\n from: ids[0]!,\n to: ids[1]!,\n rest: splitOutsideQuotes(m[2]!, \",\")\n .slice(2)\n .map((p) => p.trim()),\n };\n if (keyword === \"UpdateElementStyle\" && ids.length >= 1)\n return { kind: \"elementStyle\", raw: line, indent, alias: ids[0]! };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n switch (stmt.kind) {\n case \"title\":\n return `${stmt.indent}title ${stmt.title}`;\n case \"element\": {\n const k = parseKind(stmt.keyword);\n const values =\n k && hasTech(k.base) ? [stmt.label, stmt.tech, stmt.descr] : [stmt.label, stmt.descr];\n return call(stmt.indent, stmt.keyword, [\n stmt.alias,\n ...positional(values, stmt.rest),\n ...stmt.extra,\n ]);\n }\n case \"boundary\": {\n const values = NODE_BOUNDARIES.has(stmt.keyword)\n ? [stmt.label, stmt.type, stmt.descr]\n : TYPED_BOUNDARIES.has(stmt.keyword)\n ? [stmt.label, stmt.type]\n : [stmt.label];\n return call(\n stmt.indent,\n stmt.keyword,\n [stmt.alias, ...positional(values, stmt.rest), ...stmt.extra],\n true,\n );\n }\n case \"rel\": {\n const ids =\n stmt.index !== undefined ? [stmt.index, stmt.from, stmt.to] : [stmt.from, stmt.to];\n const values = positional([stmt.label, stmt.tech], stmt.rest);\n if (!values.length) values.push(q(\"\"));\n return call(stmt.indent, stmt.keyword, [...ids, ...values, ...stmt.extra]);\n }\n case \"relStyle\":\n return call(stmt.indent, \"UpdateRelStyle\", [stmt.from, stmt.to, ...stmt.rest]);\n case \"close\":\n return `${stmt.indent}}`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const nodes: GraphNode[] = [];\n const groups: GraphGroup[] = [];\n const edges: GraphEdge[] = [];\n const seen = new Set<string>();\n const parentOf = parents(statements);\n let title: string | undefined;\n const elementStyles = new Map<string, Record<string, string>>();\n const relStyles = new Map<string, Record<string, string>>();\n const layoutConfig: Record<string, number> = {};\n for (const s of statements) {\n if (s.kind === \"elementStyle\")\n elementStyles.set(s.alias, { ...elementStyles.get(s.alias), ...namedArgs(s.raw) });\n if (s.kind === \"relStyle\") {\n const key = `${s.from}\\u0000${s.to}`;\n relStyles.set(key, { ...relStyles.get(key), ...namedArgs(s.raw) });\n }\n if (s.kind === \"raw\" && /^\\s*UpdateLayoutConfig\\s*\\(/.test(s.raw)) {\n const args = namedArgs(s.raw);\n for (const key of [\"c4ShapeInRow\", \"c4BoundaryInRow\"]) {\n const n = Number(args[key]);\n if (n >= 1) layoutConfig[key] = n;\n }\n }\n }\n statements.forEach((s, i) => {\n const parentId = parentOf[i];\n if (s.kind === \"title\") title = s.title;\n if (s.kind === \"element\" && !seen.has(s.alias)) {\n seen.add(s.alias);\n const k = parseKind(s.keyword)!;\n nodes.push({\n id: s.alias,\n label: s.label,\n shape: shapeOf(k),\n parentId,\n classes: [],\n styles: [],\n data: {\n kind: s.keyword,\n descr: s.descr,\n tech: s.tech,\n extra: s.extra.length ? s.extra.join(\", \") : undefined,\n details: [s.tech ? `[${s.tech}]` : undefined, s.descr].filter(Boolean),\n c4Style: elementStyles.get(s.alias),\n },\n });\n }\n if (s.kind === \"boundary\" && !seen.has(s.alias)) {\n seen.add(s.alias);\n groups.push({\n id: s.alias,\n label: s.label,\n parentId,\n classes: [],\n styles: [],\n data: {\n kind: s.keyword,\n type: s.type,\n descr: s.descr,\n extra: s.extra.length ? s.extra.join(\", \") : undefined,\n },\n });\n }\n });\n for (const [s, id] of relIds(statements)) {\n // Relations to undeclared aliases have nothing to attach to on the canvas.\n if (!seen.has(s.from) || !seen.has(s.to)) continue;\n edges.push({\n id,\n source: s.from,\n target: s.to,\n label: s.label,\n pattern: \"solid\",\n ...arrowsOf(s.keyword),\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: {\n kind: s.keyword,\n tech: s.tech,\n index: s.index,\n c4Style: relStyles.get(`${s.from}\\u0000${s.to}`),\n },\n });\n }\n const graph: DiagramGraph = {\n direction: \"TB\",\n nodes,\n edges,\n groups,\n classDefs: {},\n title: title ?? ctx.frontmatterTitle,\n data: { c4Type: /^\\s*(C4\\w+)/.exec(ctx.header)?.[1] ?? \"C4Context\", ...layoutConfig },\n };\n return { graph };\n },\n\n edit(op, ctx) {\n return editC4(op, ctx);\n },\n};\n\nfunction editC4(\n op: Parameters<StatementGrammar<C4Statement>[\"edit\"]>[0],\n ctx: EditContext<C4Statement>,\n) {\n const { statements, doc } = ctx;\n const unit = ctx.indent || \" \";\n const header = doc.header;\n\n const indexOf = (alias: string) =>\n statements.findIndex(\n (s) => (s.kind === \"element\" || s.kind === \"boundary\") && s.alias === alias,\n );\n const element = (alias: string) =>\n statements.find((s): s is ElementStmt => s.kind === \"element\" && s.alias === alias);\n const boundary = (alias: string) =>\n statements.find((s): s is BoundaryStmt => s.kind === \"boundary\" && s.alias === alias);\n const relById = () => {\n const map = new Map<string, RelStmt>();\n for (const [s, id] of relIds(statements)) map.set(id, s);\n return map;\n };\n const taken = () =>\n new Set(\n statements.flatMap((s) => (s.kind === \"element\" || s.kind === \"boundary\" ? [s.alias] : [])),\n );\n /** Indentation of top-level statements. */\n const baseIndent = () => {\n const p = parents(statements);\n const s = statements.find(\n (st, i) => p[i] === undefined && st.raw.trim() && st.kind !== \"close\",\n );\n return s ? s.indent : unit;\n };\n /** Where a new top-level element goes: after the last top-level element or boundary block. */\n const topInsertIndex = () => {\n const p = parents(statements);\n let idx = -1;\n statements.forEach((s, i) => {\n if (p[i] === undefined && (s.kind === \"element\" || s.kind === \"close\" || s.kind === \"title\"))\n idx = i;\n });\n if (idx !== -1) return idx + 1;\n const firstRel = statements.findIndex((s) => s.kind === \"rel\");\n return firstRel === -1 ? statements.length : firstRel;\n };\n /** Moves an element or boundary block into `parent` (top level when undefined). */\n const moveInto = (id: string, parent: string | undefined) => {\n const start = indexOf(id);\n if (start === -1) return false;\n if (parents(statements)[start] === parent) return true;\n const block = statements.splice(start, blockEnd(statements, start) - start + 1);\n const target = parent === undefined ? -1 : indexOf(parent);\n const at = target === -1 ? topInsertIndex() : blockEnd(statements, target);\n const indent = target === -1 ? baseIndent() : statements[target]!.indent + unit;\n reindent(block, block[0]!.indent, indent);\n statements.splice(at, 0, ...block);\n return true;\n };\n /** Removes a boundary's braces, keeping (and dedenting) its content. */\n const unwrap = (alias: string) => {\n const open = statements.findIndex((s) => s.kind === \"boundary\" && s.alias === alias);\n if (open === -1) return false;\n const close = blockEnd(statements, open);\n const inner = statements.slice(open + 1, close);\n const first = inner.find((s) => s.raw.trim());\n if (first) reindent(inner, first.indent, statements[open]!.indent);\n if (statements[close]?.kind === \"close\") statements.splice(close, 1);\n statements.splice(open, 1);\n return true;\n };\n /** Drops `UpdateRelStyle` lines whose endpoint pair no longer has a relation. */\n const pruneRelStyles = () => {\n const pairs = new Set(\n statements.flatMap((s) => (s.kind === \"rel\" ? [`${s.from}\\u0000${s.to}`] : [])),\n );\n filterInPlace(statements, (s) => s.kind !== \"relStyle\" || pairs.has(`${s.from}\\u0000${s.to}`));\n };\n const str = (v: unknown) => (typeof v === \"string\" ? v : undefined);\n\n switch (op.type) {\n case \"addNode\": {\n const kind = kindForShape(op.node.shape, header);\n if (!kind) return false;\n const id = uniqueId(slugId(op.node.id, \"el\"), taken());\n const parent = op.node.parentId && boundary(op.node.parentId) ? op.node.parentId : undefined;\n const target = parent ? indexOf(parent) : -1;\n const at = target === -1 ? topInsertIndex() : blockEnd(statements, target);\n const indent = target === -1 ? baseIndent() : statements[target]!.indent + unit;\n const tech = hasTech(kind.base) ? str(op.node.data?.tech) : undefined;\n statements.splice(at, 0, {\n kind: \"element\",\n raw: \"\",\n indent,\n dirty: true,\n keyword: kindKeyword(kind),\n alias: id,\n label: op.node.label ?? id,\n tech,\n descr: str(op.node.data?.descr),\n rest: [],\n extra: [],\n });\n if (op.position) ctx.meta.layout![id] = op.position;\n return true;\n }\n case \"renameNode\":\n case \"renameGroup\": {\n const s = element(op.id) ?? boundary(op.id);\n if (!s) return false;\n s.label = op.label;\n s.dirty = true;\n return true;\n }\n case \"setNodeShape\": {\n const s = element(op.id);\n const current = s && parseKind(s.keyword);\n const next = current && kindForShape(op.shape, header, current);\n if (!s || !next) return false;\n s.keyword = kindKeyword(next);\n // Systems and people have no technology slot; it is dropped with the move.\n if (!hasTech(next.base)) s.tech = undefined;\n s.dirty = true;\n return true;\n }\n case \"setNodeData\": {\n const s = element(op.id);\n if (!s) return false;\n let changed = false;\n if (\"descr\" in op.data) {\n s.descr = str(op.data.descr) || undefined;\n changed = true;\n }\n if (\"tech\" in op.data && hasTech(parseKind(s.keyword)!.base)) {\n s.tech = str(op.data.tech) || undefined;\n changed = true;\n }\n s.dirty ||= changed;\n return changed;\n }\n case \"removeNodes\": {\n const ids = new Set(op.ids);\n const found = op.ids.some((id) => indexOf(id) !== -1);\n if (!found) return false;\n filterInPlace(statements, (s) => {\n if (s.kind === \"element\") return !ids.has(s.alias);\n if (s.kind === \"rel\" || s.kind === \"relStyle\") return !ids.has(s.from) && !ids.has(s.to);\n if (s.kind === \"elementStyle\") return !ids.has(s.alias);\n return true;\n });\n // Deleted boundaries keep their content, like flowchart subgraphs.\n for (const id of ids) unwrap(id);\n dropMetaKeys(ctx.meta, ids);\n return true;\n }\n case \"addEdge\": {\n const ids = taken();\n if (!ids.has(op.edge.source) || !ids.has(op.edge.target)) return false;\n const start = op.edge.arrowStart ?? \"none\";\n const end = op.edge.arrowEnd ?? \"arrow_point\";\n const keyword =\n start !== \"none\" && end !== \"none\" ? \"BiRel\" : start !== \"none\" ? \"Rel_Back\" : \"Rel\";\n let last = -1;\n statements.forEach((s, i) => {\n if (s.kind === \"rel\") last = i;\n });\n if (last === -1)\n statements.forEach((s, i) => {\n if (s.raw.trim()) last = i;\n });\n const prev = statements[last];\n const indent = prev?.kind === \"rel\" ? prev.indent : baseIndent();\n statements.splice(last + 1, 0, {\n kind: \"rel\",\n raw: \"\",\n indent,\n dirty: true,\n keyword,\n from: op.edge.source,\n to: op.edge.target,\n label: op.edge.label ?? \"Uses\",\n tech: str(op.edge.data?.tech),\n rest: [],\n extra: [],\n });\n return true;\n }\n case \"removeEdges\": {\n const rels = relById();\n const remove = new Set(op.ids.map((id) => rels.get(id)).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as RelStmt));\n pruneRelStyles();\n return true;\n }\n case \"setEdgeLabel\": {\n const s = relById().get(op.id);\n if (!s) return false;\n s.label = op.label;\n s.dirty = true;\n return true;\n }\n case \"setEdgeData\": {\n const s = relById().get(op.id);\n if (!s || !(\"tech\" in op.data)) return false;\n s.tech = str(op.data.tech) || undefined;\n s.dirty = true;\n return true;\n }\n case \"setEdgeStyle\": {\n const s = relById().get(op.id);\n if (!s) return false;\n const cur = arrowsOf(s.keyword);\n const start = (op.arrowStart ?? cur.arrowStart) !== \"none\";\n const end = (op.arrowEnd ?? cur.arrowEnd) !== \"none\";\n if (!start && !end) return false; // C4 has no plain line.\n const forward = s.keyword !== \"BiRel\" && s.keyword !== \"Rel_Back\";\n const keyword = start && end ? \"BiRel\" : start ? \"Rel_Back\" : forward ? s.keyword : \"Rel\";\n if (keyword === s.keyword) return false;\n if (s.index !== undefined) return false; // RelIndex is always forward.\n s.keyword = keyword;\n s.dirty = true;\n return true;\n }\n case \"reconnectEdge\": {\n const s = relById().get(op.id);\n const ids = taken();\n if (!s || !ids.has(op.source) || !ids.has(op.target)) return false;\n const shared = statements.filter(\n (r) => r.kind === \"rel\" && r.from === s.from && r.to === s.to,\n ).length;\n // A style line that only belonged to this relation follows it.\n if (shared === 1)\n for (const r of statements)\n if (r.kind === \"relStyle\" && r.from === s.from && r.to === s.to) {\n r.from = op.source;\n r.to = op.target;\n r.dirty = true;\n }\n s.from = op.source;\n s.to = op.target;\n s.dirty = true;\n pruneRelStyles();\n return true;\n }\n case \"groupNodes\": {\n const members = op.nodeIds.filter((id) => indexOf(id) !== -1);\n if (!members.length) return false;\n members.sort((a, b) => indexOf(a) - indexOf(b));\n const first = indexOf(members[0]!);\n const parentAt = parents(statements);\n const parent = op.parentId && boundary(op.parentId) ? op.parentId : parentAt[first];\n // The new boundary must not end up inside one of its members.\n if (parent && members.some((m) => isWithin(statements, parent, m))) return false;\n const id = uniqueId(slugId(op.groupId, \"boundary\"), taken());\n const target = parent === undefined ? -1 : indexOf(parent);\n const at =\n parentAt[first] === parent\n ? first\n : target === -1\n ? topInsertIndex()\n : blockEnd(statements, target);\n const indent = target === -1 ? baseIndent() : statements[target]!.indent + unit;\n const keyword = /^\\s*C4Deployment\\b/.test(header)\n ? \"Deployment_Node\"\n : /^\\s*C4Container\\b/.test(header)\n ? \"Container_Boundary\"\n : \"System_Boundary\";\n statements.splice(\n at,\n 0,\n {\n kind: \"boundary\",\n raw: \"\",\n indent,\n dirty: true,\n keyword,\n alias: id,\n label: op.label,\n type: keyword === \"Deployment_Node\" ? \"node\" : undefined,\n rest: [],\n extra: [],\n },\n { kind: \"close\", raw: `${indent}}`, indent },\n );\n for (const m of members) moveInto(m, id);\n return true;\n }\n case \"ungroup\": {\n if (!unwrap(op.groupId)) return false;\n dropMetaKeys(ctx.meta, [op.groupId]);\n return true;\n }\n case \"setNodeParent\": {\n const parent = op.parentId;\n if (parent !== undefined && !boundary(parent)) return false;\n const ids = op.ids.filter((id) => indexOf(id) !== -1);\n if (!ids.length) return false;\n if (parent && ids.some((id) => isWithin(statements, parent, id))) return false;\n for (const id of ids) moveInto(id, parent);\n return true;\n }\n case \"setTitle\": {\n const idx = statements.findIndex((s) => s.kind === \"title\");\n if (!op.title) {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as Extract<C4Statement, { kind: \"title\" }>;\n s.title = op.title;\n s.dirty = true;\n } else\n statements.unshift({\n kind: \"title\",\n raw: \"\",\n indent: baseIndent(),\n title: op.title,\n dirty: true,\n });\n return true;\n }\n default:\n return false;\n }\n}\n\n/** True when boundary/element `id` is `ancestor` or nested inside it. */\nfunction isWithin(statements: C4Statement[], id: string, ancestor: string): boolean {\n const open = statements.findIndex(\n (s) => (s.kind === \"boundary\" || s.kind === \"element\") && s.alias === ancestor,\n );\n if (open === -1) return false;\n const end = blockEnd(statements, open);\n return statements\n .slice(open, end + 1)\n .some((s) => (s.kind === \"boundary\" || s.kind === \"element\") && s.alias === id);\n}\n\n/** C4 adapter (all five C4 diagram types). */\nexport const c4Adapter = createStatementAdapter(c4Grammar);\n\n/**\n * Mermaid's C4 layout (rows of elements inside each boundary, see\n * `./geometry`), with the positions of elements the user dragged on top.\n */\nregisterFamilyLayout(\"c4\", (graph, meta) => {\n const { positions, sizes } = c4Layout(graph, meta);\n return { positions, sizes };\n});\n\nexport {\n C4_METRICS,\n c4ArrowHead,\n c4BoundaryText,\n c4ElementGeometry,\n c4ElementType,\n c4Layout,\n c4RelGeometry,\n c4Stereotype,\n} from \"./geometry.js\";\n","import type { LayoutResult, Size } from \"../layout-registry.js\";\nimport type { DiagramGraph, GraphNode, Point, DiagramMeta } from \"../types.js\";\n\n/**\n * `architecture-beta` geometry as Mermaid draws it, shared by the layout and\n * the canvas.\n *\n * Mermaid derives a spatial map from the edges' port sides (`a:R --> L:b`\n * puts `b` one cell to the right of `a`, `a:B --> T:b` one cell below) and\n * hands it to cytoscape's fcose layout as alignment and relative-placement\n * constraints. This module builds the same spatial map and turns it into a\n * grid deterministically: cells one icon plus the ideal edge length (120px)\n * apart, more where neighbours sit on either side of a group border; groups\n * wrap their members (labels included) with Mermaid's padding. Measured\n * against Mermaid's own output this puts every icon within a few pixels for\n * typical diagrams. Services are 80px icon squares with the label beneath;\n * junctions are points.\n *\n * @module\n */\n\nexport type ArchSide = \"L\" | \"R\" | \"T\" | \"B\";\n\n/** Mermaid's `config.architecture` defaults plus the drawing constants of its renderer. */\nexport const ARCH_METRICS = {\n iconSize: 80,\n padding: 40,\n /** A group's frame around its members: the padding plus cytoscape's compound border, as Mermaid draws it. */\n groupPadding: 42.5,\n fontSize: 16,\n /** Service labels wrap at 1.5 × the icon size. */\n labelWidth: 120,\n lineHeight: 17.6,\n /** Gap between neighbouring icons (Mermaid's ideal edge length, 1.5 × the icon). */\n gap: 120,\n /** Junctions are invisible in Mermaid; the canvas draws a small point. */\n junctionSize: 12,\n arrowSize: 80 / 6,\n groupIconSize: 30,\n /** How far `{group}` edges extend past the service, to the group's border. */\n groupEdgeShift: 44,\n} as const;\n\nconst A = ARCH_METRICS;\n\nconst SIDES = new Set<string>([\"L\", \"R\", \"T\", \"B\"]);\nexport const isSide = (v: unknown): v is ArchSide => typeof v === \"string\" && SIDES.has(v);\nexport const isHorizontal = (s: ArchSide) => s === \"L\" || s === \"R\";\n\n/** React Flow handle position for a port side. */\nexport const SIDE_POSITION: Record<ArchSide, \"left\" | \"right\" | \"top\" | \"bottom\"> = {\n L: \"left\",\n R: \"right\",\n T: \"top\",\n B: \"bottom\",\n};\n\n// ---------------------------------------------------------------------------\n// Text\n// ---------------------------------------------------------------------------\n\nfunction charEm(ch: string): number {\n if (ch === \" \") return 0.26;\n if (/[iljtfI.,:;'!|()[\\]]/.test(ch)) return 0.3;\n if (/[mwMW@]/.test(ch)) return 0.86;\n if (/[A-Z]/.test(ch)) return 0.66;\n if (/[0-9]/.test(ch)) return 0.57;\n return 0.54;\n}\n\nexport function archTextWidth(text: string, fontSize: number = A.fontSize): number {\n let em = 0;\n for (const ch of text) em += charEm(ch);\n return em * fontSize;\n}\n\n/** A service label wrapped as Mermaid wraps it (at 1.5 × the icon size). */\nexport function serviceLabelLines(label: string): string[] {\n const out: string[] = [];\n for (const para of label.split(/<br\\s*\\/?>|\\n/i)) {\n let line = \"\";\n for (const w of para.split(/\\s+/).filter(Boolean)) {\n const next = line ? `${line} ${w}` : w;\n if (line && archTextWidth(next) > A.labelWidth) {\n out.push(line);\n line = w;\n } else line = next;\n }\n if (line) out.push(line);\n }\n return out;\n}\n\nconst isJunction = (n: GraphNode) => n.shape === \"sm-circ\" || !!n.data?.junction;\n\n/** The area a node takes in the layout: its icon plus the label below it. */\nfunction footprint(n: GraphNode): {\n width: number;\n height: number;\n box: { x: number; y: number; width: number; height: number };\n} {\n if (isJunction(n)) {\n const off = (A.iconSize - A.junctionSize) / 2;\n return {\n width: A.iconSize,\n height: A.iconSize,\n box: { x: off, y: off, width: A.junctionSize, height: A.junctionSize },\n };\n }\n const lines = n.data?.untitled ? [] : serviceLabelLines(n.label ?? \"\");\n const labelW = Math.min(A.labelWidth, Math.max(0, ...lines.map((l) => archTextWidth(l))));\n const width = Math.max(A.iconSize, labelW);\n const height = A.iconSize + lines.length * A.lineHeight;\n return {\n width,\n height,\n box: { x: (width - A.iconSize) / 2, y: 0, width: A.iconSize, height: A.iconSize },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Spatial map\n// ---------------------------------------------------------------------------\n\nconst VEC: Record<ArchSide, [number, number]> = { L: [-1, 0], R: [1, 0], T: [0, -1], B: [0, 1] };\n\n/**\n * Grid offset of an edge's target from its source (screen axes, y down):\n * the target sits in the direction the source port faces, and for a bend\n * (`a:R --> T:b`) also on the far side of its own port.\n */\nexport function sideOffset(source: ArchSide, target: ArchSide): [number, number] {\n const [sx, sy] = VEC[source];\n if (isHorizontal(source) === isHorizontal(target)) return [sx, sy];\n const [tx, ty] = VEC[target];\n return [sx - tx, sy - ty];\n}\n\nexport interface ArchitectureLayout extends LayoutResult {\n /** The spatial map: grid cell of every service and junction (x right, y down). */\n cells: Map<string, Point>;\n}\n\n/**\n * Positions and sizes for every service, junction and group, as described\n * in the module docs; nodes the user dragged keep their stored positions and\n * groups are re-fitted around their members.\n */\nexport function architectureLayout(\n graph: DiagramGraph,\n meta: DiagramMeta = { v: 1 },\n): ArchitectureLayout {\n const groupIds = new Set(graph.groups.map((g) => g.id));\n const parentById = new Map<string, string | undefined>();\n for (const n of graph.nodes)\n parentById.set(n.id, n.parentId && groupIds.has(n.parentId) ? n.parentId : undefined);\n for (const g of graph.groups)\n parentById.set(\n g.id,\n g.parentId && groupIds.has(g.parentId) && g.parentId !== g.id ? g.parentId : undefined,\n );\n const ancestors = (id: string): string[] => {\n const out: string[] = [];\n let p = parentById.get(id);\n while (p && !out.includes(p)) {\n out.push(p);\n p = parentById.get(p);\n }\n return out;\n };\n /** Group borders a line between two nodes crosses. */\n const borders = (a: string, b: string) => {\n const pa = ancestors(a);\n const pb = ancestors(b);\n const shared = pa.filter((g) => pb.includes(g)).length;\n return pa.length + pb.length - 2 * shared;\n };\n const prints = new Map(graph.nodes.map((n) => [n.id, footprint(n)]));\n const nodeIds = new Set(graph.nodes.map((n) => n.id));\n\n // The spatial map: breadth-first over each connected component, like Mermaid.\n const links = graph.edges.flatMap((e) => {\n const sa = e.data?.sourceSide;\n const sb = e.data?.targetSide;\n if (!isSide(sa) || !isSide(sb) || e.source === e.target) return [];\n if (!nodeIds.has(e.source) || !nodeIds.has(e.target)) return [];\n return [{ a: e.source, b: e.target, offset: sideOffset(sa, sb) }];\n });\n const cells = new Map<string, Point>();\n let nextX = 0;\n for (const start of graph.nodes) {\n if (cells.has(start.id)) continue;\n const comp = new Map<string, Point>([[start.id, [0, 0]]]);\n const taken = new Set([\"0,0\"]);\n const queue = [start.id];\n while (queue.length) {\n const id = queue.shift()!;\n const [x, y] = comp.get(id)!;\n for (const l of links) {\n const forward = l.a === id;\n if (!forward && l.b !== id) continue;\n const other = forward ? l.b : l.a;\n if (comp.has(other)) continue;\n const sx = forward ? l.offset[0] : -l.offset[0];\n const sy = forward ? l.offset[1] : -l.offset[1];\n const step: Point = Math.abs(sx) >= Math.abs(sy) ? [Math.sign(sx), 0] : [0, Math.sign(sy)];\n let cell: Point = [x + sx, y + sy];\n while (taken.has(`${cell[0]},${cell[1]}`)) cell = [cell[0] + step[0], cell[1] + step[1]];\n comp.set(other, cell);\n taken.add(`${cell[0]},${cell[1]}`);\n queue.push(other);\n }\n }\n const xs = [...comp.values()].map((c) => c[0]);\n const ys = [...comp.values()].map((c) => c[1]);\n const minX = Math.min(...xs);\n const minY = Math.min(...ys);\n for (const [id, [cx, cy]] of comp) cells.set(id, [cx - minX + nextX, cy - minY]);\n nextX += Math.max(...xs) - minX + 1;\n }\n\n // Cell centres: one icon plus Mermaid's ideal edge length apart, more where\n // the line between neighbours crosses group borders (their padding, and the\n // label of a node the border passes under).\n const labelOf = (id: string) => prints.get(id)!.height - A.iconSize;\n const axisCentres = (axis: 0 | 1) => {\n const keys = [...new Set([...cells.values()].map((c) => c[axis]))].sort((a, b) => a - b);\n const lines = new Map<number, [number, string][]>();\n for (const [id, c] of cells) {\n const line = c[1 - axis]!;\n const list = lines.get(line) ?? [];\n list.push([c[axis]!, id]);\n lines.set(line, list);\n }\n for (const list of lines.values()) list.sort((a, b) => a[0] - b[0]);\n const centre = new Map<number, number>();\n let prev: number | undefined;\n for (const k of keys) {\n let at = prev === undefined ? 0 : centre.get(prev)! + A.iconSize + A.gap;\n for (const list of lines.values()) {\n const i = list.findIndex(([key]) => key === k);\n if (i <= 0) continue;\n const [pk, pid] = list[i - 1]!;\n const id = list[i]![1];\n const crossed = borders(pid, id);\n // Leaving a group downwards passes under the label inside the frame.\n const leaves = ancestors(pid).some((g) => !ancestors(id).includes(g));\n const extra = crossed * A.groupPadding + (axis === 1 && leaves ? labelOf(pid) : 0);\n at = Math.max(at, centre.get(pk)! + A.iconSize + A.gap + extra);\n }\n centre.set(k, at);\n prev = k;\n }\n return centre;\n };\n const X = axisCentres(0);\n const Y = axisCentres(1);\n\n const stored = meta.layout ?? {};\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n /** Extent of each node's footprint (icon and label) and each group, for fitting groups. */\n const extents = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const n of graph.nodes) {\n const fp = prints.get(n.id)!;\n const [cx, cy] = cells.get(n.id)!;\n const box: Point = stored[n.id] ?? [\n X.get(cx)! - A.iconSize / 2 + (fp.box.x - (fp.width - A.iconSize) / 2),\n Y.get(cy)! - A.iconSize / 2 + fp.box.y,\n ];\n positions[n.id] = box;\n sizes[n.id] = { width: fp.box.width, height: fp.box.height };\n extents.set(n.id, {\n x: box[0] - fp.box.x,\n y: box[1] - fp.box.y,\n width: fp.width,\n height: fp.height,\n });\n }\n // Groups wrap their members (deepest first), Mermaid's compound sizing.\n let right = Math.max(0, ...[...extents.values()].map((e) => e.x + e.width));\n const depth = (id: string) => ancestors(id).length;\n for (const g of [...graph.groups].sort((a, b) => depth(b.id) - depth(a.id))) {\n const members = [...parentById.entries()]\n .filter(([id, p]) => p === g.id && extents.has(id))\n .map(([id]) => extents.get(id)!);\n let rect: { x: number; y: number; width: number; height: number };\n if (members.length) {\n const x1 = Math.min(...members.map((m) => m.x)) - A.groupPadding;\n const y1 = Math.min(...members.map((m) => m.y)) - A.groupPadding;\n const x2 = Math.max(...members.map((m) => m.x + m.width)) + A.groupPadding;\n const y2 = Math.max(...members.map((m) => m.y + m.height)) + A.groupPadding;\n rect = { x: x1, y: y1, width: x2 - x1, height: y2 - y1 };\n } else {\n // An empty group: Mermaid's padding around nothing, beside the diagram.\n const side = A.iconSize + 2 * A.groupPadding;\n const at = stored[g.id] ?? [right + A.gap, 0];\n if (!stored[g.id]) right += A.gap + side;\n rect = { x: at[0], y: at[1], width: side, height: side };\n }\n extents.set(g.id, rect);\n positions[g.id] = [rect.x, rect.y];\n sizes[g.id] = { width: rect.width, height: rect.height };\n }\n return { positions, sizes, cells };\n}\n\n// ---------------------------------------------------------------------------\n// Edges\n// ---------------------------------------------------------------------------\n\nexport interface ArchEdgeRoute {\n points: { x: number; y: number }[];\n /** Where Mermaid puts the title: the middle of the line, or the bend. */\n label: { x: number; y: number };\n /** `X`: horizontal text, `Y`: rotated −90°, `XY`: rotated ±45° at the bend. */\n axis: \"X\" | \"Y\" | \"XY\";\n /** Rotation of the title, in degrees. */\n rotate: number;\n}\n\n/**\n * The orthogonal line between two ports: straight between aligned ports, an\n * L with one bend for a horizontal-to-vertical pair (Mermaid's `segments`\n * edge, bending at the source's axis), and a Z (or U, for same-side ports)\n * when the ends are no longer aligned after a drag.\n */\nexport function architectureEdgeRoute(\n s: { x: number; y: number },\n sourceSide: ArchSide,\n t: { x: number; y: number },\n targetSide: ArchSide,\n): ArchEdgeRoute {\n const hs = isHorizontal(sourceSide);\n if (hs !== isHorizontal(targetSide)) {\n const corner = hs ? { x: t.x, y: s.y } : { x: s.x, y: t.y };\n const pair = `${sourceSide}${targetSide}`;\n const [fx, fy] =\n pair === \"LT\" || pair === \"TL\"\n ? [1, 1]\n : pair === \"BL\" || pair === \"LB\"\n ? [1, -1]\n : pair === \"BR\" || pair === \"RB\"\n ? [-1, -1]\n : [-1, 1];\n return { points: [s, corner, t], label: corner, axis: \"XY\", rotate: -fx * fy * 45 };\n }\n const axis = hs ? \"X\" : \"Y\";\n const rotate = hs ? 0 : -90;\n const aligned = hs ? Math.abs(s.y - t.y) < 0.5 : Math.abs(s.x - t.x) < 0.5;\n if (aligned)\n return { points: [s, t], label: { x: (s.x + t.x) / 2, y: (s.y + t.y) / 2 }, axis, rotate };\n const out = 30;\n const mid =\n sourceSide !== targetSide\n ? hs\n ? (s.x + t.x) / 2\n : (s.y + t.y) / 2\n : sourceSide === \"R\"\n ? Math.max(s.x, t.x) + out\n : sourceSide === \"L\"\n ? Math.min(s.x, t.x) - out\n : sourceSide === \"B\"\n ? Math.max(s.y, t.y) + out\n : Math.min(s.y, t.y) - out;\n const p1 = hs ? { x: mid, y: s.y } : { x: s.x, y: mid };\n const p2 = hs ? { x: mid, y: t.y } : { x: t.x, y: mid };\n return {\n points: [s, p1, p2, t],\n label: { x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 },\n axis,\n rotate,\n };\n}\n\n/** Mermaid's arrowhead at a port: a triangle pointing into the node, its tip 2px inside. */\nexport function architectureArrow(point: { x: number; y: number }, side: ArchSide): string {\n const s = A.arrowSize;\n const shapes: Record<ArchSide, [number, number][]> = {\n L: [\n [s, s / 2],\n [0, s],\n [0, 0],\n ],\n R: [\n [0, s / 2],\n [s, 0],\n [s, s],\n ],\n T: [\n [0, 0],\n [s, 0],\n [s / 2, s],\n ],\n B: [\n [s / 2, 0],\n [s, s],\n [0, s],\n ],\n };\n const dx = side === \"L\" ? point.x - s + 2 : side === \"R\" ? point.x - 2 : point.x - s / 2;\n const dy = side === \"T\" ? point.y - s + 2 : side === \"B\" ? point.y - 2 : point.y - s / 2;\n return shapes[side].map(([x, y]) => `${round(x + dx)},${round(y + dy)}`).join(\" \");\n}\n\n/**\n * Moves an edge end from its port: `{group}` ends reach out to the group's\n * border (Mermaid's `padding + 4`, plus 18 below for the label), junction\n * ends meet at the junction's centre.\n */\nexport function shiftEndpoint(\n p: { x: number; y: number },\n side: ArchSide,\n opts: { group?: boolean; junction?: boolean },\n): { x: number; y: number } {\n const [vx, vy] = VEC[side];\n if (opts.group) {\n const d = A.groupEdgeShift + (side === \"B\" ? 18 : 0);\n return { x: p.x + vx * d, y: p.y + vy * d };\n }\n if (opts.junction) {\n const d = A.junctionSize / 2;\n return { x: p.x - vx * d, y: p.y - vy * d };\n }\n return p;\n}\n\nconst round = (n: number) => Math.round(n * 100) / 100;\n","import { registerFamilyLayout } from \"../layout-registry.js\";\nimport type { DiagramGraph, GraphEdge, GraphGroup, GraphNode } from \"../types.js\";\nimport { architectureLayout } from \"./geometry.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n slugId,\n uniqueId,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * `architecture-beta` adapter.\n *\n * ```\n * architecture-beta\n * group api(cloud)[API tier]\n * service db(database)[Postgres] in api\n * junction j in api\n * gateway:R --> L:server\n * ```\n *\n * Canvas model: services are nodes (shape `arch-service`, `data.icon`;\n * `data.untitled` when the declaration has no `[label]`, so the label is the id),\n * junctions are small circles (shape `sm-circ`, `data.junction`), groups are\n * groups (`data.icon`, nested with `in`), and edges carry the sides they\n * attach to (`data.sourceSide` / `targetSide`, `L|R|T|B`) and whether they\n * leave a group boundary (`{group}` → `data.sourceGroup` / `targetGroup`).\n * Arrow tokens map to heads: `--` none, `-->` end, `<--` start, `<-->` both.\n * The optional edge title (`-[label]-`) is the edge label. Icon names\n * (`cloud`, `logos:aws-lambda`…) are kept verbatim.\n *\n * Positions follow Mermaid's arrangement by port sides (see `./geometry`);\n * a new edge drawn on the canvas gets the sides that face each other there.\n *\n * @module\n */\n\ntype Side = \"L\" | \"R\" | \"T\" | \"B\";\n\nexport type ArchitectureStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string })\n | (BaseStatement & {\n kind: \"group\" | \"service\";\n id: string;\n icon?: string;\n label?: string;\n parent?: string;\n })\n | (BaseStatement & { kind: \"junction\"; id: string; parent?: string })\n | (BaseStatement & {\n kind: \"edge\";\n lhs: string;\n lhsGroup: boolean;\n lhsSide: Side;\n rhs: string;\n rhsGroup: boolean;\n rhsSide: Side;\n arrowStart: boolean;\n arrowEnd: boolean;\n label?: string;\n });\n\ntype Decl = Extract<ArchitectureStatement, { kind: \"group\" | \"service\" | \"junction\" }>;\ntype EdgeStmt = Extract<ArchitectureStatement, { kind: \"edge\" }>;\n\nconst ID = \"([\\\\w-]+)\";\nconst IN = `(?:\\\\s+in\\\\s+${ID})?`;\nconst DECL = new RegExp(\n `^(group|service)\\\\s+${ID}\\\\s*(?:\\\\(([^)]*)\\\\))?\\\\s*(?:\\\\[([^\\\\]]*)\\\\])?${IN}\\\\s*$`,\n);\nconst JUNCTION = new RegExp(`^junction\\\\s+${ID}${IN}\\\\s*$`);\nconst EDGE = new RegExp(\n `^${ID}(\\\\{group\\\\})?\\\\s*:\\\\s*([LRTB])\\\\s*(<)?-(?:\\\\[([^\\\\]]*)\\\\])?-(>)?\\\\s*([LRTB])\\\\s*:\\\\s*${ID}(\\\\{group\\\\})?\\\\s*$`,\n);\nconst SIDES = new Set<string>([\"L\", \"R\", \"T\", \"B\"]);\n\n/** Brackets would end the `[label]` early. */\nconst cleanLabel = (text: string) => text.replace(/[[\\]]/g, \"\");\n\nfunction edgeIds(statements: ArchitectureStatement[]): Map<EdgeStmt, string> {\n const counts = new Map<string, number>();\n const ids = new Map<EdgeStmt, string>();\n for (const s of statements) {\n if (s.kind !== \"edge\") continue;\n const key = `${s.lhs}_${s.rhs}`;\n const n = counts.get(key) ?? 0;\n counts.set(key, n + 1);\n ids.set(s, `L_${key}_${n}`);\n }\n return ids;\n}\n\nexport const architectureGrammar: StatementGrammar<ArchitectureStatement> = {\n family: \"architecture\",\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if ((m = /^title\\s+(.*)$/.exec(text)))\n return { kind: \"title\", raw: line, indent, title: m[1]!.trim() };\n if ((m = DECL.exec(text)))\n return {\n kind: m[1] as \"group\" | \"service\",\n raw: line,\n indent,\n id: m[2]!,\n icon: m[3],\n label: m[4],\n parent: m[5],\n };\n if ((m = JUNCTION.exec(text)))\n return { kind: \"junction\", raw: line, indent, id: m[1]!, parent: m[2] };\n if ((m = EDGE.exec(text)))\n return {\n kind: \"edge\",\n raw: line,\n indent,\n lhs: m[1]!,\n lhsGroup: !!m[2],\n lhsSide: m[3] as Side,\n arrowStart: !!m[4],\n label: m[5],\n arrowEnd: !!m[6],\n rhsSide: m[7] as Side,\n rhs: m[8]!,\n rhsGroup: !!m[9],\n };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n const inClause = (parent?: string) => (parent ? ` in ${parent}` : \"\");\n switch (stmt.kind) {\n case \"title\":\n return `${stmt.indent}title ${stmt.title}`;\n case \"group\":\n case \"service\":\n return `${stmt.indent}${stmt.kind} ${stmt.id}${stmt.icon ? `(${stmt.icon})` : \"\"}${\n stmt.label !== undefined ? `[${cleanLabel(stmt.label)}]` : \"\"\n }${inClause(stmt.parent)}`;\n case \"junction\":\n return `${stmt.indent}junction ${stmt.id}${inClause(stmt.parent)}`;\n case \"edge\": {\n const arrow = `${stmt.arrowStart ? \"<\" : \"\"}-${stmt.label ? `[${cleanLabel(stmt.label)}]` : \"\"}-${\n stmt.arrowEnd ? \">\" : \"\"\n }`;\n return `${stmt.indent}${stmt.lhs}${stmt.lhsGroup ? \"{group}\" : \"\"}:${stmt.lhsSide} ${arrow} ${\n stmt.rhsSide\n }:${stmt.rhs}${stmt.rhsGroup ? \"{group}\" : \"\"}`;\n }\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const groupIds = new Set(statements.flatMap((s) => (s.kind === \"group\" ? [s.id] : [])));\n const parentOf = (s: { id: string; parent?: string }) =>\n s.parent && s.parent !== s.id && groupIds.has(s.parent) ? s.parent : undefined;\n const nodes: GraphNode[] = [];\n const groups: GraphGroup[] = [];\n const edges: GraphEdge[] = [];\n const seen = new Set<string>();\n let title: string | undefined;\n for (const s of statements) {\n if (s.kind === \"title\") title = s.title;\n if (s.kind !== \"group\" && s.kind !== \"service\" && s.kind !== \"junction\") continue;\n if (seen.has(s.id)) continue;\n seen.add(s.id);\n const base = { id: s.id, parentId: parentOf(s), classes: [], styles: [] };\n // Mermaid draws no label when the declaration has none (`untitled`).\n const untitled = s.kind !== \"junction\" && s.label === undefined ? true : undefined;\n if (s.kind === \"group\")\n groups.push({ ...base, label: s.label ?? s.id, data: { icon: s.icon, untitled } });\n else if (s.kind === \"service\")\n nodes.push({\n ...base,\n label: s.label ?? s.id,\n shape: \"arch-service\",\n data: { icon: s.icon, details: s.icon ? [s.icon] : [], untitled },\n });\n else nodes.push({ ...base, label: \"\", shape: \"sm-circ\", data: { junction: true } });\n }\n const nodeIds = new Set(nodes.map((n) => n.id));\n for (const [s, id] of edgeIds(statements)) {\n if (!nodeIds.has(s.lhs) || !nodeIds.has(s.rhs)) continue;\n edges.push({\n id,\n source: s.lhs,\n target: s.rhs,\n label: s.label,\n pattern: \"solid\",\n arrowStart: s.arrowStart ? \"arrow_point\" : \"none\",\n arrowEnd: s.arrowEnd ? \"arrow_point\" : \"none\",\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: {\n sourceSide: s.lhsSide,\n targetSide: s.rhsSide,\n sourceGroup: s.lhsGroup,\n targetGroup: s.rhsGroup,\n },\n });\n }\n const graph: DiagramGraph = {\n direction: \"LR\",\n nodes,\n edges,\n groups,\n classDefs: {},\n title: title ?? ctx.frontmatterTitle,\n };\n return { graph };\n },\n\n edit(op, ctx) {\n return editArchitecture(op, ctx);\n },\n};\n\n/** Sides facing each other given the endpoints' stored positions (`R`/`L` without them). */\nfunction facingSides(\n from: readonly [number, number] | undefined,\n to: readonly [number, number] | undefined,\n): [Side, Side] {\n if (!from || !to) return [\"R\", \"L\"];\n const dx = to[0] - from[0];\n const dy = to[1] - from[1];\n if (Math.abs(dx) >= Math.abs(dy)) return dx >= 0 ? [\"R\", \"L\"] : [\"L\", \"R\"];\n return dy >= 0 ? [\"B\", \"T\"] : [\"T\", \"B\"];\n}\n\nfunction editArchitecture(\n op: Parameters<StatementGrammar<ArchitectureStatement>[\"edit\"]>[0],\n ctx: EditContext<ArchitectureStatement>,\n): boolean {\n const { statements } = ctx;\n const isDecl = (s: ArchitectureStatement): s is Decl =>\n s.kind === \"group\" || s.kind === \"service\" || s.kind === \"junction\";\n const decl = (id: string) => statements.find((s): s is Decl => isDecl(s) && s.id === id);\n const group = (id: string) => {\n const s = decl(id);\n return s?.kind === \"group\" ? s : undefined;\n };\n const isNode = (id: string) => {\n const s = decl(id);\n return s?.kind === \"service\" || s?.kind === \"junction\";\n };\n const edgesById = () => {\n const map = new Map<string, EdgeStmt>();\n for (const [s, id] of edgeIds(statements)) map.set(id, s);\n return map;\n };\n const taken = () => new Set(statements.flatMap((s) => (isDecl(s) ? [s.id] : [])));\n /** True when group `id` is `ancestor` or nested (through `in`) inside it. */\n const within = (id: string | undefined, ancestor: string) => {\n const visited = new Set<string>();\n while (id && !visited.has(id)) {\n if (id === ancestor) return true;\n visited.add(id);\n id = group(id)?.parent;\n }\n return false;\n };\n const lastIndex = (pred: (s: ArchitectureStatement) => boolean) => {\n let idx = -1;\n statements.forEach((s, i) => {\n if (pred(s)) idx = i;\n });\n return idx;\n };\n const declIndent = () => statements.find(isDecl)?.indent ?? ctx.indent;\n /** Members of a removed group move to the group's own parent. */\n const dissolve = (id: string) => {\n const g = group(id);\n if (!g) return false;\n for (const s of statements)\n if (isDecl(s) && s.parent === id) {\n s.parent = g.parent;\n s.dirty = true;\n }\n filterInPlace(statements, (s) => s !== g);\n return true;\n };\n const str = (v: unknown) => (typeof v === \"string\" && v ? v : undefined);\n const side = (v: unknown) => (typeof v === \"string\" && SIDES.has(v) ? (v as Side) : undefined);\n\n switch (op.type) {\n case \"addNode\": {\n const id = uniqueId(slugId(op.node.id, \"svc\"), taken());\n const parent = op.node.parentId && group(op.node.parentId) ? op.node.parentId : undefined;\n const base = { raw: \"\", indent: declIndent(), dirty: true, id, parent };\n const stmt: ArchitectureStatement =\n op.node.shape === \"sm-circ\"\n ? { ...base, kind: \"junction\" }\n : {\n ...base,\n kind: \"service\",\n icon: str(op.node.data?.icon) ?? \"server\",\n label: op.node.label ?? id,\n };\n // After the last declaration (or title); else before the first edge; else at the end.\n let at = lastIndex(isDecl);\n if (at === -1) at = lastIndex((s) => s.kind === \"title\");\n const firstEdge = statements.findIndex((s) => s.kind === \"edge\");\n statements.splice(\n at !== -1 ? at + 1 : firstEdge !== -1 ? firstEdge : statements.length,\n 0,\n stmt,\n );\n if (op.position) ctx.meta.layout![id] = op.position;\n return true;\n }\n case \"renameNode\":\n case \"renameGroup\": {\n const s = decl(op.id);\n if (!s || s.kind === \"junction\") return false;\n s.label = op.label;\n s.dirty = true;\n return true;\n }\n case \"setNodeData\": {\n const s = decl(op.id);\n if (!s || s.kind === \"junction\" || !(\"icon\" in op.data)) return false;\n s.icon = str(op.data.icon);\n s.dirty = true;\n return true;\n }\n case \"setNodeShape\": {\n const i = statements.findIndex((s) => isDecl(s) && s.id === op.id);\n const s = statements[i] as Decl | undefined;\n if (!s || s.kind === \"group\") return false;\n const base = { raw: \"\", indent: s.indent, dirty: true, id: s.id, parent: s.parent };\n if (op.shape === \"sm-circ\" && s.kind === \"service\")\n statements[i] = { ...base, kind: \"junction\" };\n else if (op.shape === \"arch-service\" && s.kind === \"junction\")\n statements[i] = { ...base, kind: \"service\", icon: \"server\", label: s.id };\n else return false;\n return true;\n }\n case \"removeNodes\": {\n const ids = new Set(op.ids);\n if (!op.ids.some((id) => decl(id))) return false;\n filterInPlace(statements, (s) => {\n if (s.kind === \"service\" || s.kind === \"junction\") return !ids.has(s.id);\n if (s.kind === \"edge\") return !ids.has(s.lhs) && !ids.has(s.rhs);\n return true;\n });\n for (const id of ids) dissolve(id);\n dropMetaKeys(ctx.meta, ids);\n return true;\n }\n case \"setNodeParent\": {\n const parent = op.parentId;\n if (parent !== undefined && !group(parent)) return false;\n const targets = op.ids.map(decl).filter((s): s is Decl => !!s);\n if (!targets.length) return false;\n if (parent && targets.some((s) => s.kind === \"group\" && within(parent, s.id))) return false;\n for (const s of targets) {\n s.parent = parent;\n s.dirty = true;\n }\n return true;\n }\n case \"addEdge\": {\n const { source, target, data } = op.edge;\n if (!isNode(source) || !isNode(target)) return false;\n const placed = architectureLayout(ctx.doc.graph, ctx.meta).positions;\n const [fromSide, toSide] = facingSides(placed[source], placed[target]);\n const last = lastIndex((s) => s.kind === \"edge\");\n const prev = statements[last];\n const at = last !== -1 ? last + 1 : lastIndex((s) => s.raw.trim() !== \"\") + 1;\n statements.splice(at, 0, {\n kind: \"edge\",\n raw: \"\",\n indent: prev?.indent ?? declIndent(),\n dirty: true,\n lhs: source,\n lhsGroup: false,\n lhsSide: side(data?.sourceSide) ?? fromSide,\n rhs: target,\n rhsGroup: false,\n rhsSide: side(data?.targetSide) ?? toSide,\n arrowStart: (op.edge.arrowStart ?? \"none\") !== \"none\",\n arrowEnd: (op.edge.arrowEnd ?? \"arrow_point\") !== \"none\",\n label: str(op.edge.label),\n });\n return true;\n }\n case \"removeEdges\": {\n const edges = edgesById();\n const remove = new Set(op.ids.map((id) => edges.get(id)).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as EdgeStmt));\n return true;\n }\n case \"setEdgeLabel\": {\n // Mermaid 12 accepts an edge title written inside the arrow: `a:R -[label]- L:b`.\n const s = edgesById().get(op.id);\n if (!s) return false;\n s.label = str(op.label);\n s.dirty = true;\n return true;\n }\n case \"setEdgeStyle\": {\n const s = edgesById().get(op.id);\n if (!s || (op.arrowStart === undefined && op.arrowEnd === undefined)) return false;\n if (op.arrowStart !== undefined) s.arrowStart = op.arrowStart !== \"none\";\n if (op.arrowEnd !== undefined) s.arrowEnd = op.arrowEnd !== \"none\";\n s.dirty = true;\n return true;\n }\n case \"setEdgeData\": {\n const s = edgesById().get(op.id);\n if (!s) return false;\n const from = side(op.data.sourceSide);\n const to = side(op.data.targetSide);\n if (!from && !to) return false;\n if (from) s.lhsSide = from;\n if (to) s.rhsSide = to;\n s.dirty = true;\n return true;\n }\n case \"reconnectEdge\": {\n const s = edgesById().get(op.id);\n if (!s || !isNode(op.source) || !isNode(op.target)) return false;\n // `{group}` is only valid when both ends sit in different groups; drop it on reconnect.\n if (s.lhs !== op.source) s.lhsGroup = false;\n if (s.rhs !== op.target) s.rhsGroup = false;\n s.lhs = op.source;\n s.rhs = op.target;\n s.dirty = true;\n return true;\n }\n case \"groupNodes\": {\n const members = op.nodeIds.map(decl).filter((s): s is Decl => !!s);\n if (!members.length) return false;\n const first = Math.min(...members.map((m) => statements.indexOf(m)));\n const firstMember = statements[first] as Decl;\n const parent = op.parentId && group(op.parentId) ? op.parentId : firstMember.parent;\n if (parent && members.some((m) => m.kind === \"group\" && within(parent, m.id))) return false;\n const id = uniqueId(slugId(op.groupId, \"group\"), taken());\n statements.splice(first, 0, {\n kind: \"group\",\n raw: \"\",\n indent: firstMember.indent,\n dirty: true,\n id,\n icon: \"cloud\",\n label: op.label,\n parent: parent && group(parent) ? parent : undefined,\n });\n for (const m of members) {\n m.parent = id;\n m.dirty = true;\n }\n return true;\n }\n case \"ungroup\": {\n if (!dissolve(op.groupId)) return false;\n dropMetaKeys(ctx.meta, [op.groupId]);\n return true;\n }\n case \"setTitle\": {\n // Only an existing `title` statement is edited; otherwise the base writes frontmatter.\n const idx = statements.findIndex((s) => s.kind === \"title\");\n if (idx === -1) return false;\n if (!op.title) statements.splice(idx, 1);\n else {\n const s = statements[idx] as Extract<ArchitectureStatement, { kind: \"title\" }>;\n s.title = op.title;\n s.dirty = true;\n }\n return true;\n }\n default:\n return false;\n }\n}\n\n/** `architecture-beta` adapter. */\nexport const architectureAdapter = createStatementAdapter(architectureGrammar);\n\n/** Mermaid's side-driven arrangement (see `./geometry`), with dragged nodes kept where dropped. */\nregisterFamilyLayout(\"architecture\", (graph, meta) => {\n const { positions, sizes } = architectureLayout(graph, meta);\n return { positions, sizes };\n});\n\nexport {\n ARCH_METRICS,\n architectureArrow,\n architectureEdgeRoute,\n architectureLayout,\n serviceLabelLines,\n type ArchSide,\n} from \"./geometry.js\";\n","import type { DiagramGraph, GraphNode } from \"../types.js\";\n\n/**\n * Geometry of a sequence diagram as Mermaid draws it: participants in a row\n * of equal-height boxes, a lifeline under each, and one row per message,\n * note or fragment boundary, top to bottom in document order. Shared by the\n * layout (participant boxes), the editor (dragging a participant reorders the\n * columns) and the React canvas (lifelines, message rows, notes, fragments\n * and activation bars), so all three agree.\n *\n * @module\n */\n\n/** Ordered things that take vertical space, exposed as `graph.data.events`. */\nexport type SequenceEvent =\n | { kind: \"message\"; edgeId: string; from: string; to: string; mod: \"\" | \"+\" | \"-\" }\n | { kind: \"note\"; placement: \"over\" | \"left\" | \"right\"; targets: string[]; text: string }\n | { kind: \"open\"; keyword: string; text: string }\n | { kind: \"else\"; keyword: string; text: string }\n | { kind: \"end\" }\n | { kind: \"activate\" | \"deactivate\"; target: string };\n\n/** Mermaid's sequence defaults (actor width 150, height 65, margin 50…), in canvas pixels. */\nexport const SEQUENCE_METRICS = {\n actorWidth: 150,\n actorHeight: 65,\n actorGap: 50,\n boxPad: 12,\n boxTitle: 26,\n firstRow: 34,\n messageRow: 46,\n selfMessageRow: 64,\n noteRow: 48,\n openRow: 36,\n elseRow: 32,\n endRow: 18,\n bottomGap: 24,\n activationWidth: 10,\n} as const;\n\nexport interface SequenceColumn {\n id: string;\n x: number;\n width: number;\n center: number;\n}\n\nexport interface SequenceMessageRow {\n edgeId: string;\n /** y of the arrow line. */\n y: number;\n self: boolean;\n}\n\nexport interface SequenceNoteBox {\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface SequenceFragment {\n keyword: string;\n text: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** `else` / `and` / `option` dividers. */\n dividers: { y: number; text: string }[];\n depth: number;\n}\n\nexport interface SequenceActivation {\n participant: string;\n x: number;\n top: number;\n bottom: number;\n}\n\nexport interface SequenceGeometry {\n columns: Map<string, SequenceColumn>;\n order: string[];\n messages: SequenceMessageRow[];\n notes: SequenceNoteBox[];\n fragments: SequenceFragment[];\n activations: SequenceActivation[];\n /** Box (group) frames, spanning the full height. */\n boxes: Map<string, { x: number; y: number; width: number; height: number }>;\n lifelineTop: number;\n lifelineBottom: number;\n /** Total width and height (bottom of the mirrored participants). */\n width: number;\n height: number;\n}\n\n/** Width Mermaid gives a participant: at least 150px, wider for long names. */\nexport function participantWidth(node: GraphNode): number {\n const longest = Math.max(\n ...String(node.label || node.id)\n .split(/<br\\s*\\/?>|\\n/)\n .map((l) => l.length),\n 1,\n );\n return Math.max(SEQUENCE_METRICS.actorWidth, Math.round(longest * 8.2 + 32));\n}\n\nfunction estimateTextWidth(text: string): number {\n return Math.round(text.length * 7.4 + 24);\n}\n\nexport function sequenceGeometry(graph: DiagramGraph): SequenceGeometry {\n const M = SEQUENCE_METRICS;\n const columns = new Map<string, SequenceColumn>();\n const order: string[] = [];\n let x = 0;\n let prevBox: string | undefined;\n for (const n of graph.nodes) {\n if (n.parentId !== prevBox && (n.parentId || prevBox) && order.length) x += M.boxPad * 2;\n prevBox = n.parentId;\n const width = participantWidth(n);\n columns.set(n.id, { id: n.id, x, width, center: x + width / 2 });\n order.push(n.id);\n x += width + M.actorGap;\n }\n const width = Math.max(0, x - M.actorGap);\n const centerOf = (id: string) => columns.get(id)?.center ?? 0;\n\n const events: SequenceEvent[] =\n (graph.data?.events as SequenceEvent[] | undefined) ??\n graph.edges.map((e) => ({\n kind: \"message\" as const,\n edgeId: e.id,\n from: e.source,\n to: e.target,\n mod: \"\" as const,\n }));\n\n const messages: SequenceMessageRow[] = [];\n const notes: SequenceNoteBox[] = [];\n const fragments: SequenceFragment[] = [];\n const activations: SequenceActivation[] = [];\n const open: { frag: SequenceFragment; members: Set<string> }[] = [];\n const active = new Map<string, number[]>();\n\n const startActivation = (id: string, at: number) => {\n const stack = active.get(id) ?? [];\n stack.push(at);\n active.set(id, stack);\n };\n const endActivation = (id: string, at: number) => {\n const stack = active.get(id);\n const top = stack?.pop();\n if (top === undefined) return;\n const depth = stack!.length;\n activations.push({\n participant: id,\n x: centerOf(id) - M.activationWidth / 2 + depth * (M.activationWidth / 2),\n top,\n bottom: at,\n });\n };\n const touch = (...ids: string[]) => {\n for (const f of open) for (const id of ids) f.members.add(id);\n };\n\n let y = M.actorHeight + M.firstRow;\n for (const ev of events) {\n switch (ev.kind) {\n case \"message\": {\n const self = ev.from === ev.to;\n const rowHeight = self ? M.selfMessageRow : M.messageRow;\n const lineY = y + (self ? 26 : rowHeight - 14);\n messages.push({ edgeId: ev.edgeId, y: lineY, self });\n touch(ev.from, ev.to);\n if (ev.mod === \"+\") startActivation(ev.to, lineY);\n if (ev.mod === \"-\") endActivation(ev.from, lineY);\n y += rowHeight;\n break;\n }\n case \"note\": {\n const centers = ev.targets.map(centerOf);\n const textWidth = estimateTextWidth(ev.text);\n let left: number;\n let noteWidth: number;\n if (ev.placement === \"over\") {\n const min = Math.min(...centers);\n const max = Math.max(...centers);\n noteWidth = Math.max(textWidth, max - min + 50);\n left = (min + max) / 2 - noteWidth / 2;\n } else if (ev.placement === \"left\") {\n noteWidth = Math.max(textWidth, 100);\n left = centers[0]! - 12 - noteWidth;\n } else {\n noteWidth = Math.max(textWidth, 100);\n left = centers[0]! + 12;\n }\n notes.push({ text: ev.text, x: left, y: y + 6, width: noteWidth, height: M.noteRow - 12 });\n touch(...ev.targets);\n y += M.noteRow;\n break;\n }\n case \"open\": {\n const frag: SequenceFragment = {\n keyword: ev.keyword,\n text: ev.text,\n x: 0,\n y,\n width: 0,\n height: 0,\n dividers: [],\n depth: open.length,\n };\n open.push({ frag, members: new Set() });\n y += M.openRow;\n break;\n }\n case \"else\": {\n const top = open[open.length - 1];\n if (top) top.frag.dividers.push({ y: y + 4, text: ev.text });\n y += M.elseRow;\n break;\n }\n case \"end\": {\n const top = open.pop();\n if (top) {\n const members = top.members.size ? [...top.members] : order;\n const xs = members.map(centerOf);\n const pad = 24 + (open.length + 1) * 6;\n top.frag.x = Math.min(...xs) - pad - top.frag.depth * 6;\n top.frag.width = Math.max(...xs) - Math.min(...xs) + pad * 2 + top.frag.depth * 12;\n top.frag.width = Math.max(top.frag.width, 160);\n top.frag.height = y + 6 - top.frag.y;\n fragments.push(top.frag);\n // Parent fragments span their children's participants too.\n for (const f of open) for (const id of top.members) f.members.add(id);\n }\n y += M.endRow;\n break;\n }\n case \"activate\":\n startActivation(ev.target, y);\n break;\n case \"deactivate\":\n endActivation(ev.target, y);\n break;\n }\n }\n const lifelineBottom = y + M.bottomGap;\n for (const [id, stack] of active)\n while (stack.length) {\n const top = stack.pop()!;\n activations.push({\n participant: id,\n x: centerOf(id) - M.activationWidth / 2 + stack.length * (M.activationWidth / 2),\n top,\n bottom: lifelineBottom,\n });\n }\n\n const height = lifelineBottom + M.actorHeight;\n const boxes = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const g of graph.groups) {\n const cols = graph.nodes.filter((n) => n.parentId === g.id).map((n) => columns.get(n.id)!);\n if (!cols.length) {\n boxes.set(g.id, { x: width + M.actorGap, y: -M.boxTitle - M.boxPad, width: 200, height });\n continue;\n }\n const minX = Math.min(...cols.map((c) => c.x));\n const maxX = Math.max(...cols.map((c) => c.x + c.width));\n boxes.set(g.id, {\n x: minX - M.boxPad,\n y: -M.boxTitle - M.boxPad,\n width: maxX - minX + M.boxPad * 2,\n height: height + M.boxTitle + M.boxPad * 2,\n });\n }\n\n return {\n columns,\n order,\n messages,\n notes,\n fragments,\n activations,\n boxes,\n lifelineTop: M.actorHeight,\n lifelineBottom,\n width,\n height,\n };\n}\n\n/** Index in `order` that a participant dropped with its box centre at `x` moves to. */\nexport function dropIndex(geometry: SequenceGeometry, id: string, centerX: number): number {\n const others = geometry.order.filter((o) => o !== id);\n let index = 0;\n for (const o of others) if (geometry.columns.get(o)!.center < centerX) index++;\n return index;\n}\n","import type {\n ArrowHead,\n DiagramGraph,\n EditOp,\n EdgePattern,\n GraphEdge,\n GraphGroup,\n GraphNode,\n Point,\n} from \"../types.js\";\nimport { registerFamilyLayout, type Size } from \"../layout-registry.js\";\nimport { SEQUENCE_METRICS, dropIndex, sequenceGeometry, type SequenceEvent } from \"./geometry.js\";\nimport { setFrontmatterTitle } from \"../lines-grammar/engine.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n renameMetaKey,\n slugId,\n uniqueId,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * `sequenceDiagram` adapter.\n *\n * ```\n * sequenceDiagram\n * autonumber\n * actor U as Customer\n * participant W as Web app\n * U->>W: Place order\n * alt Approved\n * W-->>U: Order confirmed\n * end\n * ```\n *\n * Canvas model: one node per participant (shape `rect`, or `actor` for\n * `actor` declarations), declared ones first in declaration order, then the\n * ones only mentioned in messages. One edge per message line in document\n * order; `data.index` is the message's position, `data.kind` the arrow token,\n * `data.activate` / `data.deactivate` the `+` / `-` suffixes. `box … end`\n * blocks are groups (`data.color` keeps the box colour). Fragments (`alt`,\n * `loop`, `par`…), notes, activations and every other line are kept verbatim;\n * messages inside fragments are still edges. `graph.data.autonumber` mirrors\n * the `autonumber` statement.\n *\n * Message edge ids are `L_<from>_<to>_<n>` where `n` counts messages of the\n * same pair in document order, so unrelated edits keep them stable.\n *\n * @module\n */\n\ntype ParticipantKeyword = \"participant\" | \"actor\";\ntype Modifier = \"\" | \"+\" | \"-\";\n\nexport type SequenceStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string; colon: boolean })\n | (BaseStatement & { kind: \"autonumber\"; off: boolean })\n | (BaseStatement & {\n kind: \"participant\";\n keyword: ParticipantKeyword;\n id: string;\n alias?: string;\n /** `@{ … }` participant configuration, kept verbatim. */\n config?: string;\n create: boolean;\n })\n | (BaseStatement & {\n kind: \"message\";\n from: string;\n to: string;\n arrow: string;\n mod: Modifier;\n text: string;\n })\n | (BaseStatement & { kind: \"box\"; color?: string; label: string })\n /** Fragment openers (`alt`, `loop`…) and continuations (`else`, `and`, `option`). */\n | (BaseStatement & { kind: \"block\"; keyword: string; text: string; opens: boolean })\n | (BaseStatement & { kind: \"end\" })\n /** Lines that reference participants (`Note`, `activate`, `destroy`, `link`…). */\n | (BaseStatement & { kind: \"ref\"; keyword: string; targets: string[] });\n\ntype Of<K extends SequenceStatement[\"kind\"]> = Extract<SequenceStatement, { kind: K }>;\ntype Participant = Of<\"participant\">;\ntype Message = Of<\"message\">;\ntype Box = Of<\"box\">;\n\ninterface ArrowSpec {\n token: string;\n pattern: EdgePattern;\n arrowStart: ArrowHead;\n arrowEnd: ArrowHead;\n}\n\n/** Arrow tokens, longest first so the regex alternation picks the right one. */\nconst ARROWS: ArrowSpec[] = [\n { token: \"<<-->>\", pattern: \"dotted\", arrowStart: \"arrow_point\", arrowEnd: \"arrow_point\" },\n { token: \"<<->>\", pattern: \"solid\", arrowStart: \"arrow_point\", arrowEnd: \"arrow_point\" },\n { token: \"-->>\", pattern: \"dotted\", arrowStart: \"none\", arrowEnd: \"arrow_point\" },\n { token: \"->>\", pattern: \"solid\", arrowStart: \"none\", arrowEnd: \"arrow_point\" },\n { token: \"--x\", pattern: \"dotted\", arrowStart: \"none\", arrowEnd: \"arrow_cross\" },\n { token: \"-x\", pattern: \"solid\", arrowStart: \"none\", arrowEnd: \"arrow_cross\" },\n { token: \"--)\", pattern: \"dotted\", arrowStart: \"none\", arrowEnd: \"arrow_open\" },\n { token: \"-)\", pattern: \"solid\", arrowStart: \"none\", arrowEnd: \"arrow_open\" },\n { token: \"-->\", pattern: \"dotted\", arrowStart: \"none\", arrowEnd: \"none\" },\n { token: \"->\", pattern: \"solid\", arrowStart: \"none\", arrowEnd: \"none\" },\n];\nconst ARROW_BY_TOKEN = new Map(ARROWS.map((a) => [a.token, a]));\n\nconst escapeRe = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\nconst MESSAGE = new RegExp(\n `^([^:]+?)\\\\s*(${ARROWS.map((a) => escapeRe(a.token)).join(\"|\")})\\\\s*([+-]?)\\\\s*([^:]+?)\\\\s*:(.*)$`,\n);\nconst PARTICIPANT = /^(create\\s+)?(participant|actor)\\s+(.+?)(\\s*@\\{.*\\})?(?:\\s+as\\s+(.*?))?\\s*$/;\nconst BLOCK_OPEN = /^(alt|opt|loop|par_over|par|critical|break|rect)\\b\\s*(.*)$/;\nconst BLOCK_CONT = /^(else|and|option)\\b\\s*(.*)$/;\nconst NOTE = /^note\\s+(?:left\\s+of|right\\s+of|over)\\s+([^:]+?)\\s*:/i;\nconst TARGET_LINE = /^(activate|deactivate|destroy)\\s+(.+?)\\s*$/;\nconst LINK_LINE = /^(links|link|properties|details)\\s+([^:]+?)\\s*:/;\n\n/** CSS named colours Mermaid accepts as the first word of a `box` line. */\nconst CSS_COLORS = new Set(\n (\n \"transparent aliceblue antiquewhite aqua aquamarine azure beige bisque black blanchedalmond \" +\n \"blue blueviolet brown burlywood cadetblue chartreuse chocolate coral cornflowerblue cornsilk \" +\n \"crimson cyan darkblue darkcyan darkgoldenrod darkgray darkgreen darkgrey darkkhaki \" +\n \"darkmagenta darkolivegreen darkorange darkorchid darkred darksalmon darkseagreen \" +\n \"darkslateblue darkslategray darkslategrey darkturquoise darkviolet deeppink deepskyblue \" +\n \"dimgray dimgrey dodgerblue firebrick floralwhite forestgreen fuchsia gainsboro ghostwhite \" +\n \"gold goldenrod gray green greenyellow grey honeydew hotpink indianred indigo ivory khaki \" +\n \"lavender lavenderblush lawngreen lemonchiffon lightblue lightcoral lightcyan \" +\n \"lightgoldenrodyellow lightgray lightgreen lightgrey lightpink lightsalmon lightseagreen \" +\n \"lightskyblue lightslategray lightslategrey lightsteelblue lightyellow lime limegreen linen \" +\n \"magenta maroon mediumaquamarine mediumblue mediumorchid mediumpurple mediumseagreen \" +\n \"mediumslateblue mediumspringgreen mediumturquoise mediumvioletred midnightblue mintcream \" +\n \"mistyrose moccasin navajowhite navy oldlace olive olivedrab orange orangered orchid \" +\n \"palegoldenrod palegreen paleturquoise palevioletred papayawhip peachpuff peru pink plum \" +\n \"powderblue purple rebeccapurple red rosybrown royalblue saddlebrown salmon sandybrown \" +\n \"seagreen seashell sienna silver skyblue slateblue slategray slategrey snow springgreen \" +\n \"steelblue tan teal thistle tomato turquoise violet wheat white whitesmoke yellow yellowgreen\"\n ).split(\" \"),\n);\n\n/** Splits a `box` line's text into colour and label the way Mermaid does. */\nfunction parseBoxText(text: string): { color?: string; label: string } {\n const fn = /^((?:rgba?|hsla?)\\s*\\([^)]*\\))\\s*(.*)$/i.exec(text);\n if (fn) return { color: fn[1]!, label: fn[2]!.trim() };\n const word = /^(\\w+)\\s*(.*)$/.exec(text);\n if (word && CSS_COLORS.has(word[1]!.toLowerCase())) return { color: word[1]!, label: word[2]! };\n return { label: text.trim() };\n}\n\n/** True when Mermaid would read the label's first word as a colour. */\nfunction labelLooksLikeColor(label: string): boolean {\n return parseBoxText(label).color !== undefined;\n}\n\nfunction splitTargets(text: string): string[] {\n return text\n .split(\",\")\n .map((t) => t.trim())\n .filter(Boolean);\n}\n\n/** Mermaid strips a leading `+`/`-` from activation targets too. */\nfunction parseRef(text: string): { keyword: string; targets: string[] } | null {\n let m: RegExpExecArray | null;\n if ((m = NOTE.exec(text))) return { keyword: \"note\", targets: splitTargets(m[1]!) };\n if ((m = TARGET_LINE.exec(text))) return { keyword: m[1]!, targets: [m[2]!.trim()] };\n if ((m = LINK_LINE.exec(text))) return { keyword: m[1]!, targets: [m[2]!.trim()] };\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Analysis shared by buildGraph and edit\n// ---------------------------------------------------------------------------\n\ninterface BoxInfo {\n stmt: Box;\n index: number;\n endIndex: number;\n /** The closing `end` statement (undefined when the box is unterminated). */\n end?: SequenceStatement;\n id: string;\n}\n\ninterface ParticipantInfo {\n id: string;\n /** First declaration (create declarations included). */\n decl?: Participant;\n box?: BoxInfo;\n}\n\ninterface MessageInfo {\n stmt: Message;\n index: number;\n edgeId: string;\n /** Enclosing fragment text (`alt Approved`, `else Declined`…). */\n block?: string;\n}\n\ninterface Analysis {\n participants: Map<string, ParticipantInfo>;\n messages: MessageInfo[];\n boxes: BoxInfo[];\n /** Box containing each statement index. */\n boxAt: Map<number, BoxInfo>;\n}\n\nfunction analyse(statements: SequenceStatement[]): Analysis {\n const participants = new Map<string, ParticipantInfo>();\n const messages: MessageInfo[] = [];\n const boxes: BoxInfo[] = [];\n const boxAt = new Map<number, BoxInfo>();\n const stack: { box?: BoxInfo; text?: string }[] = [];\n const pairCount = new Map<string, number>();\n const mentioned: string[] = [];\n\n statements.forEach((s, i) => {\n const top = stack[stack.length - 1];\n if (top?.box) boxAt.set(i, top.box);\n switch (s.kind) {\n case \"box\": {\n const info: BoxInfo = { stmt: s, index: i, endIndex: statements.length, id: \"\" };\n boxes.push(info);\n stack.push({ box: info });\n break;\n }\n case \"block\":\n if (s.opens) stack.push({ text: s.raw.trim() });\n else if (top && !top.box) top.text = s.raw.trim();\n break;\n case \"end\": {\n const popped = stack.pop();\n if (popped?.box) {\n popped.box.endIndex = i;\n popped.box.end = s;\n }\n break;\n }\n case \"participant\":\n if (!participants.has(s.id)) participants.set(s.id, { id: s.id, decl: s, box: top?.box });\n break;\n case \"message\": {\n const key = `${s.from}\\u0000${s.to}`;\n const n = pairCount.get(key) ?? 0;\n pairCount.set(key, n + 1);\n const block = [...stack].reverse().find((f) => f.text)?.text;\n messages.push({ stmt: s, index: i, edgeId: `L_${s.from}_${s.to}_${n}`, block });\n mentioned.push(s.from, s.to);\n break;\n }\n default:\n break;\n }\n });\n for (const id of mentioned) if (!participants.has(id)) participants.set(id, { id });\n const taken = new Set(participants.keys());\n for (const b of boxes) b.id = uniqueId(slugId(b.stmt.label, \"box\"), taken);\n return { participants, messages, boxes, boxAt };\n}\n\nfunction arrowFor(pattern: EdgePattern, arrowStart: ArrowHead, arrowEnd: ArrowHead): string {\n const dotted = pattern === \"dotted\";\n if (arrowStart === \"arrow_point\" && arrowEnd === \"arrow_point\")\n return dotted ? \"<<-->>\" : \"<<->>\";\n switch (arrowEnd) {\n case \"none\":\n return dotted ? \"-->\" : \"->\";\n case \"arrow_cross\":\n return dotted ? \"--x\" : \"-x\";\n case \"arrow_open\":\n return dotted ? \"--)\" : \"-)\";\n default:\n return dotted ? \"-->>\" : \"->>\";\n }\n}\n\n/** Index after the last top-level (non-`create`) declaration or box, else after title/autonumber. */\nfunction declarationInsertIndex(statements: SequenceStatement[], a: Analysis): number {\n let last = -1;\n statements.forEach((s, i) => {\n if (s.kind === \"participant\" && !s.create && !a.boxAt.has(i)) last = i;\n });\n for (const b of a.boxes) last = Math.max(last, b.endIndex);\n if (last !== -1) return Math.min(last + 1, statements.length);\n let j = 0;\n while (j < statements.length && /^(title|autonumber)$/.test(statements[j]!.kind)) j++;\n return j;\n}\n\nfunction newDecl(\n indent: string,\n id: string,\n keyword: ParticipantKeyword,\n alias?: string,\n): Participant {\n return {\n kind: \"participant\",\n raw: \"\",\n indent,\n keyword,\n id,\n alias: alias && alias !== id ? alias : undefined,\n create: false,\n dirty: true,\n };\n}\n\n/**\n * Keeps Mermaid's lifecycle rules satisfied after structural edits: a\n * `create` declaration must be followed by a message to it, a `destroy` by a\n * message involving it, and deactivations need an active participant.\n * Offending `create` flags / `-` suffixes are dropped and orphan `destroy`,\n * `deactivate` lines removed, so edits never produce text Mermaid rejects.\n */\nfunction repairLifecycle(statements: SequenceStatement[]): void {\n const seen = new Set<string>();\n const active = new Map<string, number>();\n const drop = new Set<SequenceStatement>();\n let pendingCreate: Participant | undefined;\n let pendingDestroy: { stmt: SequenceStatement; id: string } | undefined;\n const clearCreate = (p: Participant) => {\n p.create = false;\n p.dirty = true;\n };\n for (const s of statements) {\n if (s.kind === \"participant\") {\n if (s.create) {\n if (pendingCreate) clearCreate(pendingCreate);\n if (seen.has(s.id)) clearCreate(s);\n else pendingCreate = s;\n }\n seen.add(s.id);\n } else if (s.kind === \"message\") {\n if (pendingCreate) {\n if (s.to !== pendingCreate.id) clearCreate(pendingCreate);\n pendingCreate = undefined;\n } else if (pendingDestroy) {\n if (s.to !== pendingDestroy.id && s.from !== pendingDestroy.id)\n drop.add(pendingDestroy.stmt);\n pendingDestroy = undefined;\n }\n seen.add(s.from);\n seen.add(s.to);\n if (s.mod === \"+\") active.set(s.to, (active.get(s.to) ?? 0) + 1);\n if (s.mod === \"-\") {\n const n = active.get(s.from) ?? 0;\n if (n < 1) {\n s.mod = \"\";\n s.dirty = true;\n } else active.set(s.from, n - 1);\n }\n } else if (s.kind === \"ref\") {\n const id = s.targets[0]?.replace(/^[+-]/, \"\") ?? \"\";\n if (s.keyword === \"destroy\") {\n if (pendingDestroy) drop.add(pendingDestroy.stmt);\n pendingDestroy = { stmt: s, id };\n } else if (s.keyword === \"activate\") active.set(id, (active.get(id) ?? 0) + 1);\n else if (s.keyword === \"deactivate\") {\n const n = active.get(id) ?? 0;\n if (n < 1) drop.add(s);\n else active.set(id, n - 1);\n }\n }\n }\n if (pendingCreate) clearCreate(pendingCreate);\n if (pendingDestroy) drop.add(pendingDestroy.stmt);\n if (drop.size) filterInPlace(statements, (s) => !drop.has(s));\n}\n\n/** `box` statements that contain no declaration. */\nfunction emptyBoxes(statements: SequenceStatement[]): BoxInfo[] {\n return analyse(statements).boxes.filter(\n (b) =>\n b.end && !statements.slice(b.index + 1, b.endIndex).some((s) => s.kind === \"participant\"),\n );\n}\n\n/** Moves (or creates) declarations for `ids`, returning them detached from the list. */\nfunction takeDeclarations(\n ctx: EditContext<SequenceStatement>,\n ids: string[],\n a: Analysis,\n): Participant[] {\n const out: Participant[] = [];\n const remove = new Set<SequenceStatement>();\n for (const id of ids) {\n const info = a.participants.get(id);\n if (!info) continue;\n if (info.decl?.create) continue; // created participants stay where their message is\n if (info.decl) {\n remove.add(info.decl);\n out.push(info.decl);\n } else out.push(newDecl(ctx.indent, id, \"participant\"));\n }\n filterInPlace(ctx.statements, (s) => !remove.has(s));\n return out;\n}\n\nfunction setIndent(stmts: SequenceStatement[], indent: string): void {\n for (const s of stmts) {\n if (s.indent !== indent) {\n s.indent = indent;\n s.dirty = true;\n }\n }\n}\n\nconst NOTE_TEXT = /^note\\s+(left\\s+of|right\\s+of|over)\\s+([^:]+?)\\s*:\\s*(.*)$/i;\n\n/** Rows Mermaid draws, in document order (see {@link SequenceEvent}). */\nfunction sequenceEvents(statements: SequenceStatement[], a: Analysis): SequenceEvent[] {\n const edgeOf = new Map(a.messages.map((m) => [m.stmt, m.edgeId]));\n const events: SequenceEvent[] = [];\n const stack: (\"box\" | \"frag\")[] = [];\n for (const s of statements) {\n switch (s.kind) {\n case \"box\":\n stack.push(\"box\");\n break;\n case \"block\":\n if (s.opens) {\n stack.push(\"frag\");\n events.push({ kind: \"open\", keyword: s.keyword, text: s.text.trim() });\n } else events.push({ kind: \"else\", keyword: s.keyword, text: s.text.trim() });\n break;\n case \"end\":\n if (stack.pop() === \"frag\") events.push({ kind: \"end\" });\n break;\n case \"message\":\n events.push({\n kind: \"message\",\n edgeId: edgeOf.get(s)!,\n from: s.from,\n to: s.to,\n mod: s.mod,\n });\n break;\n case \"ref\": {\n if (s.keyword === \"note\") {\n const m = NOTE_TEXT.exec(s.raw.trim());\n if (!m) break;\n const where = m[1]!.toLowerCase();\n events.push({\n kind: \"note\",\n placement: where.startsWith(\"left\")\n ? \"left\"\n : where.startsWith(\"right\")\n ? \"right\"\n : \"over\",\n targets: splitTargets(m[2]!),\n text: m[3]!.replace(/<br\\s*\\/?>/gi, \" \"),\n });\n } else if (s.keyword === \"activate\" || s.keyword === \"deactivate\")\n events.push({ kind: s.keyword, target: s.targets[0]! });\n break;\n }\n default:\n break;\n }\n }\n return events;\n}\n\n/**\n * Dragging a participant reorders the columns: its declaration moves next to\n * the participant it was dropped beside. Positions are never stored, since\n * Mermaid derives them from the order.\n */\nfunction reorderParticipants(op: EditOp, ctx: EditContext<SequenceStatement>): boolean {\n if (op.type !== \"moveNodes\") return false;\n const geometry = sequenceGeometry(ctx.doc.graph);\n for (const { id, position } of op.moves) {\n const col = geometry.columns.get(id);\n if (!col) continue; // boxes follow their members\n const from = geometry.order.indexOf(id);\n const to = dropIndex(geometry, id, position[0] + col.width / 2);\n if (to === from) continue;\n const a = analyse(ctx.statements);\n if (a.participants.get(id)?.decl?.create) continue;\n // Declare everyone (in the current order) so the new order can be written.\n const undeclared = geometry.order.filter((p) => !a.participants.get(p)?.decl);\n if (undeclared.length) {\n const at = declarationInsertIndex(ctx.statements, a);\n ctx.statements.splice(at, 0, ...undeclared.map((p) => newDecl(ctx.indent, p, \"participant\")));\n }\n const fresh = analyse(ctx.statements);\n const others = geometry.order.filter((p) => p !== id);\n const anchorId = to < others.length ? others[to]! : others[others.length - 1]!;\n const anchor = fresh.participants.get(anchorId)?.decl;\n const moved = fresh.participants.get(id)?.decl;\n if (!anchor || !moved || anchor.create) continue;\n ctx.statements.splice(ctx.statements.indexOf(moved), 1);\n if (moved.indent !== anchor.indent) {\n moved.indent = anchor.indent;\n moved.dirty = true;\n }\n const at = ctx.statements.indexOf(anchor);\n ctx.statements.splice(to < others.length ? at : at + 1, 0, moved);\n }\n return true;\n}\n\nexport const sequenceGrammar: StatementGrammar<SequenceStatement> = {\n family: \"sequence\",\n titleAsStatement: true,\n interceptMeta: reorderParticipants,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if (!text || text.startsWith(\"%%\")) return { kind: \"raw\", raw: line, indent };\n if ((m = /^title(\\s*:\\s*|\\s+)(.*)$/.exec(text)))\n return { kind: \"title\", raw: line, indent, title: m[2]!.trim(), colon: m[1]!.includes(\":\") };\n if ((m = /^autonumber\\b(.*)$/.exec(text)))\n return { kind: \"autonumber\", raw: line, indent, off: m[1]!.trim() === \"off\" };\n if ((m = PARTICIPANT.exec(text)))\n return {\n kind: \"participant\",\n raw: line,\n indent,\n create: !!m[1],\n keyword: m[2] as ParticipantKeyword,\n id: m[3]!.trim(),\n config: m[4]?.trim() || undefined,\n alias: m[5]?.trim() || undefined,\n };\n if ((m = /^box(?:\\s+(.*))?$/.exec(text))) {\n const box = parseBoxText(m[1] ?? \"\");\n return { kind: \"box\", raw: line, indent, color: box.color, label: box.label };\n }\n if (text === \"end\") return { kind: \"end\", raw: line, indent };\n if ((m = BLOCK_OPEN.exec(text)))\n return { kind: \"block\", raw: line, indent, keyword: m[1]!, text: m[2]!, opens: true };\n if ((m = BLOCK_CONT.exec(text)))\n return { kind: \"block\", raw: line, indent, keyword: m[1]!, text: m[2]!, opens: false };\n const ref = parseRef(text);\n if (ref) return { kind: \"ref\", raw: line, indent, ...ref };\n if ((m = MESSAGE.exec(text)))\n return {\n kind: \"message\",\n raw: line,\n indent,\n from: m[1]!.trim(),\n arrow: m[2]!,\n mod: m[3] as Modifier,\n to: m[4]!.trim(),\n text: m[5]!.trim(),\n };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n const i = stmt.indent;\n switch (stmt.kind) {\n case \"title\":\n return `${i}title${stmt.colon ? \": \" : \" \"}${stmt.title}`;\n case \"autonumber\":\n return `${i}autonumber${stmt.off ? \" off\" : \"\"}`;\n case \"participant\":\n return `${i}${stmt.create ? \"create \" : \"\"}${stmt.keyword} ${stmt.id}${\n stmt.config ? stmt.config : \"\"\n }${stmt.alias ? ` as ${stmt.alias}` : \"\"}`;\n case \"message\":\n return `${i}${stmt.from}${stmt.arrow}${stmt.mod}${stmt.to}:${stmt.text ? ` ${stmt.text}` : \"\"}`;\n case \"box\":\n return `${i}box${stmt.color ? ` ${stmt.color}` : \"\"}${stmt.label ? ` ${stmt.label}` : \"\"}`;\n case \"end\":\n return `${i}end`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const a = analyse(statements);\n const nodes: GraphNode[] = [...a.participants.values()].map((p) => ({\n id: p.id,\n label: p.decl?.alias ?? p.id,\n shape: p.decl?.keyword === \"actor\" ? \"actor\" : \"rect\",\n parentId: p.box?.id,\n classes: [],\n styles: [],\n data: {\n declared: !!p.decl,\n ...(p.decl?.create ? { create: true } : {}),\n ...(p.decl?.config ? { config: p.decl.config } : {}),\n },\n }));\n const edges: GraphEdge[] = a.messages.map((m, index) => {\n const spec = ARROW_BY_TOKEN.get(m.stmt.arrow)!;\n return {\n id: m.edgeId,\n source: m.stmt.from,\n target: m.stmt.to,\n label: m.stmt.text,\n pattern: spec.pattern,\n arrowStart: spec.arrowStart,\n arrowEnd: spec.arrowEnd,\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: {\n index,\n kind: m.stmt.arrow,\n activate: m.stmt.mod === \"+\",\n deactivate: m.stmt.mod === \"-\",\n ...(m.block ? { details: [m.block] } : {}),\n },\n };\n });\n const groups: GraphGroup[] = a.boxes.map((b) => ({\n id: b.id,\n label: b.stmt.label,\n classes: [],\n styles: [],\n data: b.stmt.color ? { color: b.stmt.color } : {},\n }));\n let title: string | undefined;\n let autonumber = false;\n for (const s of statements) {\n if (s.kind === \"title\") title = s.title;\n if (s.kind === \"autonumber\") autonumber = !s.off;\n }\n const events = sequenceEvents(statements, a);\n const graph: DiagramGraph = {\n direction: \"LR\",\n nodes,\n edges,\n groups,\n classDefs: {},\n title: title ?? ctx.frontmatterTitle,\n data: { autonumber, events },\n };\n return { graph };\n },\n\n edit(op, ctx) {\n const emptyBefore = new Set(emptyBoxes(ctx.statements).map((b) => b.stmt));\n const handled = editSequence(op, ctx);\n if (handled) {\n repairLifecycle(ctx.statements);\n // Boxes the edit emptied (members moved or removed) go away with their `end`.\n const drop = new Set<SequenceStatement>();\n for (const b of emptyBoxes(ctx.statements))\n if (!emptyBefore.has(b.stmt)) drop.add(b.stmt).add(b.end!);\n if (drop.size) filterInPlace(ctx.statements, (s) => !drop.has(s));\n }\n return handled;\n },\n};\n\nfunction editSequence(\n op: Parameters<StatementGrammar<SequenceStatement>[\"edit\"]>[0],\n ctx: EditContext<SequenceStatement>,\n): boolean {\n const { statements, indent } = ctx;\n const a = analyse(statements);\n const message = (id: string) => a.messages.find((m) => m.edgeId === id)?.stmt;\n const boxById = (id: string | undefined) => a.boxes.find((b) => b.id === id);\n\n switch (op.type) {\n case \"addNode\": {\n const taken = new Set([...a.participants.keys(), ...a.boxes.map((b) => b.id)]);\n const id = uniqueId(slugId(op.node.id, \"P\"), taken);\n const keyword: ParticipantKeyword = op.node.shape === \"actor\" ? \"actor\" : \"participant\";\n const label = op.node.label?.trim() || id;\n const box = boxById(op.node.parentId);\n if (box?.end) {\n statements.splice(box.endIndex, 0, newDecl(box.stmt.indent + indent, id, keyword, label));\n } else {\n const at = declarationInsertIndex(statements, a);\n statements.splice(at, 0, newDecl(indent, id, keyword, label));\n }\n if (op.position) ctx.meta.layout![id] = op.position;\n return true;\n }\n case \"renameNode\":\n case \"setNodeShape\": {\n const info = a.participants.get(op.id);\n if (!info) return false;\n let decl = info.decl;\n if (!decl) {\n decl = newDecl(indent, op.id, \"participant\");\n statements.splice(declarationInsertIndex(statements, a), 0, decl);\n }\n if (op.type === \"renameNode\") {\n const label = op.label.trim();\n decl.alias = label && label !== op.id ? label : undefined;\n } else {\n if (op.shape !== \"actor\" && op.shape !== \"rect\") return false;\n decl.keyword = op.shape === \"actor\" ? \"actor\" : \"participant\";\n }\n decl.dirty = true;\n return true;\n }\n case \"removeNodes\": {\n const ids = new Set(op.ids.filter((id) => a.participants.has(id)));\n if (!ids.size) return false;\n filterInPlace(statements, (s) => {\n if (s.kind === \"participant\") return !ids.has(s.id);\n if (s.kind === \"message\") return !ids.has(s.from) && !ids.has(s.to);\n if (s.kind === \"ref\") return !s.targets.some((t) => ids.has(t.replace(/^[+-]/, \"\").trim()));\n return true;\n });\n dropMetaKeys(ctx.meta, ids);\n return true;\n }\n case \"addEdge\": {\n const { source, target } = op.edge;\n if (!source || !target) return false;\n const kind = op.edge.data?.kind;\n const arrow =\n typeof kind === \"string\" && ARROW_BY_TOKEN.has(kind)\n ? kind\n : arrowFor(\n op.edge.pattern ?? \"solid\",\n op.edge.arrowStart ?? \"none\",\n op.edge.arrowEnd ?? \"arrow_point\",\n );\n statements.push({\n kind: \"message\",\n raw: \"\",\n indent,\n from: source,\n to: target,\n arrow,\n mod: \"\",\n text: (op.edge.label ?? \"Message\").replace(/[\\r\\n]+/g, \" \").trim(),\n dirty: true,\n });\n return true;\n }\n case \"setEdgeLabel\": {\n const m = message(op.id);\n if (!m) return false;\n m.text = op.label.replace(/[\\r\\n]+/g, \" \").trim();\n m.dirty = true;\n return true;\n }\n case \"setEdgeStyle\": {\n const m = message(op.id);\n if (!m) return false;\n const cur = ARROW_BY_TOKEN.get(m.arrow)!;\n const pattern = op.pattern === \"dotted\" ? \"dotted\" : op.pattern ? \"solid\" : cur.pattern;\n m.arrow = arrowFor(pattern, op.arrowStart ?? cur.arrowStart, op.arrowEnd ?? cur.arrowEnd);\n m.dirty = true;\n return true;\n }\n case \"setEdgeData\": {\n const info = a.messages.find((x) => x.edgeId === op.id);\n if (!info) return false;\n const m = info.stmt;\n let changed = false;\n if (typeof op.data.kind === \"string\" && ARROW_BY_TOKEN.has(op.data.kind)) {\n m.arrow = op.data.kind;\n changed = true;\n }\n if (typeof op.data.deactivate === \"boolean\") {\n if (op.data.deactivate) m.mod = \"-\";\n else if (m.mod === \"-\") m.mod = \"\";\n changed = true;\n }\n if (typeof op.data.activate === \"boolean\") {\n if (op.data.activate) m.mod = \"+\";\n else if (m.mod === \"+\") m.mod = \"\";\n changed = true;\n }\n if (changed) m.dirty = true;\n if (typeof op.data.index === \"number\" && Number.isFinite(op.data.index)) {\n const target = Math.max(0, Math.floor(op.data.index));\n const current = a.messages.indexOf(info);\n if (target !== current) {\n statements.splice(statements.indexOf(m), 1);\n const others = a.messages.filter((x) => x !== info);\n const before = others[target]?.stmt;\n if (before) {\n statements.splice(statements.indexOf(before), 0, m);\n m.indent = before.indent;\n } else {\n statements.push(m);\n m.indent = indent;\n }\n m.dirty = true;\n changed = true;\n }\n }\n return changed;\n }\n case \"reconnectEdge\": {\n const m = message(op.id);\n if (!m) return false;\n m.from = op.source;\n m.to = op.target;\n m.dirty = true;\n return true;\n }\n case \"removeEdges\": {\n const remove = new Set(op.ids.map(message).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as Message));\n return true;\n }\n case \"groupNodes\": {\n const ids = op.nodeIds.filter((id) => a.participants.has(id));\n if (!ids.length) return false;\n // Boxes cannot nest: insert at the first member's top-level position.\n const firstIdx = Math.min(\n ...ids.map((id) => {\n const p = a.participants.get(id)!;\n if (!p.decl) return declarationInsertIndex(statements, a);\n const idx = statements.indexOf(p.decl);\n return p.box ? p.box.index : idx;\n }),\n );\n const anchor = statements[firstIdx];\n const decls = takeDeclarations(ctx, ids, a);\n if (!decls.length) return false;\n setIndent(decls, indent + indent);\n let at = anchor ? statements.indexOf(anchor) : -1;\n if (at === -1) at = Math.min(firstIdx, statements.length);\n let label = op.label.trim() || \"Box\";\n if (labelLooksLikeColor(label)) label = `transparent ${label}`;\n const box = parseBoxText(label);\n statements.splice(\n at,\n 0,\n { kind: \"box\", raw: \"\", indent, color: box.color, label: box.label, dirty: true },\n ...decls,\n { kind: \"end\", raw: \"\", indent, dirty: true },\n );\n return true;\n }\n case \"ungroup\": {\n const box = boxById(op.groupId);\n if (!box?.end) return false;\n setIndent(statements.slice(box.index + 1, box.endIndex), box.stmt.indent);\n filterInPlace(statements, (s) => s !== box.stmt && s !== box.end);\n dropMetaKeys(ctx.meta, [box.id]);\n return true;\n }\n case \"renameGroup\": {\n const box = boxById(op.id);\n if (!box) return false;\n const label = op.label.trim();\n // Keep an explicit colour; otherwise protect labels Mermaid would read as one.\n if (!box.stmt.color && labelLooksLikeColor(label)) box.stmt.color = \"transparent\";\n box.stmt.label = label;\n box.stmt.dirty = true;\n const others = new Set([\n ...a.participants.keys(),\n ...a.boxes.filter((b) => b !== box).map((b) => b.id),\n ]);\n renameMetaKey(ctx.meta, box.id, uniqueId(slugId(label, \"box\"), others));\n return true;\n }\n case \"setNodeParent\": {\n const box = op.parentId ? boxById(op.parentId) : undefined;\n if (op.parentId && !box?.end) return false;\n const ids = op.ids.filter((id) => {\n const p = a.participants.get(id);\n return p && p.box?.id !== box?.id && !p.decl?.create;\n });\n if (!ids.length) return false;\n if (box?.end) {\n const decls = takeDeclarations(ctx, ids, a);\n setIndent(decls, box.stmt.indent + indent);\n statements.splice(statements.indexOf(box.end), 0, ...decls);\n } else {\n // Out of their boxes: right after the box each one leaves.\n for (const id of ids) {\n const p = a.participants.get(id)!;\n if (!p.decl || !p.box?.end) continue;\n statements.splice(statements.indexOf(p.decl), 1);\n setIndent([p.decl], p.box.stmt.indent);\n statements.splice(statements.indexOf(p.box.end) + 1, 0, p.decl);\n }\n }\n return true;\n }\n case \"setTitle\": {\n const idx = statements.findIndex((s) => s.kind === \"title\");\n const title = op.title?.trim();\n if (idx === -1 && typeof ctx.doc.preamble.frontmatter?.title === \"string\") {\n ctx.setPreambleLines(setFrontmatterTitle(ctx.doc.preamble.lines, title || undefined));\n return true;\n }\n if (!title) {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as Of<\"title\">;\n s.title = title;\n s.dirty = true;\n } else\n statements.unshift({ kind: \"title\", raw: \"\", indent, title, colon: false, dirty: true });\n return true;\n }\n case \"setGraphData\": {\n if (typeof op.data.autonumber !== \"boolean\") return false;\n if (!op.data.autonumber) {\n filterInPlace(statements, (s) => s.kind !== \"autonumber\");\n return true;\n }\n const existing = statements.filter((s): s is Of<\"autonumber\"> => s.kind === \"autonumber\");\n if (existing.length) {\n for (const s of existing)\n if (s.off) {\n s.off = false;\n s.dirty = true;\n }\n } else statements.unshift({ kind: \"autonumber\", raw: \"\", indent, off: false, dirty: true });\n return true;\n }\n default:\n return false;\n }\n}\n\nexport const sequenceAdapter = createStatementAdapter(sequenceGrammar);\n\n/**\n * Participants sit in one row in diagram order with Mermaid's box sizes;\n * boxes span the full height of the lifelines (see {@link sequenceGeometry}).\n */\nregisterFamilyLayout(\"sequence\", (graph) => {\n const g = sequenceGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const col of g.columns.values()) {\n positions[col.id] = [col.x, 0];\n sizes[col.id] = { width: col.width, height: SEQUENCE_METRICS.actorHeight };\n }\n for (const [id, box] of g.boxes) {\n positions[id] = [box.x, box.y];\n sizes[id] = { width: box.width, height: box.height };\n }\n return { positions, sizes };\n});\n\nexport { sequenceGeometry, SEQUENCE_METRICS, type SequenceEvent } from \"./geometry.js\";\n","import type { DiagramGraph } from \"../types.js\";\n\n/**\n * Geometry of a git graph as Mermaid draws it (`gitGraphRenderer`, default\n * config: `rotateCommitLabel: true`, `parallelCommits: false`,\n * `showBranches: true`): one lane per branch in `order`, commits in sequence\n * order 50px apart along the lanes, and parent links routed with Mermaid's\n * arcs and lane-finding. Shared by the layout (node boxes), the editor and the\n * React canvas, so all agree with Mermaid's picture.\n *\n * Coordinates are Mermaid's own (commit centres; lanes start at x = 0 for\n * `LR`, y = 30 for `TB`/`BT`).\n *\n * @module\n */\n\n/** Mermaid's gitGraph constants (`COMMIT_STEP`, `LAYOUT_OFFSET`…), in canvas pixels. */\nexport const GIT_METRICS = {\n /** Distance between consecutive commits (`COMMIT_STEP + LAYOUT_OFFSET`). */\n commitStep: 50,\n layoutOffset: 10,\n /** Lane start for vertical graphs (`defaultPos`). */\n defaultPos: 30,\n /** Lane spacing: 50, + 40 for rotated commit labels (+ half the label width when vertical). */\n laneStep: 90,\n commitRadius: 10,\n /** Size of the selectable commit box centred on the commit. */\n commitBox: 24,\n branchFontSize: 16,\n /** Height of a branch name's text box at 16px. */\n branchTextHeight: 18,\n labelFontSize: 10,\n labelTextHeight: 12,\n colors: 8,\n} as const;\n\nconst M = GIT_METRICS;\n\nexport type GitDirection = \"LR\" | \"TB\" | \"BT\";\nexport type CommitSymbol = \"NORMAL\" | \"REVERSE\" | \"HIGHLIGHT\" | \"MERGE\" | \"CHERRY_PICK\";\n\nexport interface GitCommitGeometry {\n id: string;\n /** Centre of the commit bullet. */\n x: number;\n y: number;\n branch: string;\n /** Colour slot (`--mermaid-git<n>`), the branch's lane index modulo 8. */\n color: number;\n seq: number;\n symbol: CommitSymbol;\n /** The commit label Mermaid prints (its id), when it prints one. */\n label?: string;\n tags: string[];\n /** Last commit on its branch (a merge can start from it). */\n tip: boolean;\n}\n\nexport interface GitLaneGeometry {\n branch: string;\n index: number;\n color: number;\n /** The dashed branch line. */\n line: { x1: number; y1: number; x2: number; y2: number };\n /** The branch name pill. */\n label: { x: number; y: number; width: number; height: number };\n}\n\nexport interface GitArrowGeometry {\n edgeId: string;\n path: string;\n color: number;\n}\n\nexport interface GitGeometry {\n direction: GitDirection;\n commits: Map<string, GitCommitGeometry>;\n /** Lanes in Mermaid's branch order. */\n lanes: GitLaneGeometry[];\n arrows: Map<string, GitArrowGeometry>;\n /** End of the lanes along the commit axis. */\n maxPos: number;\n}\n\n/** Rough width of a run of text in Mermaid's default font. */\nexport function estimateTextWidth(text: string, fontSize: number): number {\n let em = 0;\n for (const ch of text) {\n if (/[ilj.,:;'|!()[\\]{}]/.test(ch)) em += 0.3;\n else if (ch === \" \") em += 0.3;\n else if (/[mwMW@%]/.test(ch)) em += 0.85;\n else if (/[A-Z]/.test(ch)) em += 0.65;\n else if (/[0-9]/.test(ch)) em += 0.55;\n else em += 0.52;\n }\n return Math.ceil(em * fontSize);\n}\n\nexport function gitDirection(graph: DiagramGraph): GitDirection {\n const d = graph.direction.toUpperCase();\n return d === \"TB\" || d === \"TD\" ? \"TB\" : d === \"BT\" ? \"BT\" : \"LR\";\n}\n\n/** Branches in Mermaid's order (`getBranchesAsObjArray`): explicit `order`, else `0.<index>`. */\nexport function branchOrder(graph: DiagramGraph): string[] {\n return graph.groups\n .map((g, i) => {\n const order = g.data?.order;\n // `main` comes first with Mermaid's `mainBranchOrder` (0); 0.<i> for i = 0 is 0 too.\n const value = typeof order === \"number\" ? order : parseFloat(`0.${i}`);\n return { id: g.id, value };\n })\n .sort((a, b) => a.value - b.value)\n .map((b) => b.id);\n}\n\nfunction symbolOf(data: Record<string, unknown> | undefined): CommitSymbol {\n const type = typeof data?.type === \"string\" ? data.type.toUpperCase() : \"NORMAL\";\n if (data?.kind === \"cherry-pick\") return \"CHERRY_PICK\";\n if (type === \"REVERSE\" || type === \"HIGHLIGHT\") return type;\n return data?.kind === \"merge\" ? \"MERGE\" : \"NORMAL\";\n}\n\n/** Computes the whole picture from the graph the adapter builds. */\nexport function gitGraphGeometry(graph: DiagramGraph): GitGeometry {\n const dir = gitDirection(graph);\n const vertical = dir !== \"LR\";\n const order = branchOrder(graph);\n const laneIndex = new Map(order.map((b, i) => [b, i]));\n const labelText = new Map(graph.groups.map((g) => [g.id, g.label || g.id]));\n\n // Lane positions (`setBranchPosition`).\n const lanePos = new Map<string, number>();\n let pos = 0;\n for (const b of order) {\n lanePos.set(b, pos);\n const w = estimateTextWidth(labelText.get(b) ?? b, M.branchFontSize);\n pos += M.laneStep + (vertical ? w / 2 : 0);\n }\n\n // Commits in sequence order (`drawCommits`).\n const nodes = graph.nodes;\n const n = nodes.length;\n const tipOf = new Map<string, string>();\n for (const node of nodes) tipOf.set(String(node.data?.branch ?? node.parentId ?? \"\"), node.id);\n const commits = new Map<string, GitCommitGeometry>();\n nodes.forEach((node, seq) => {\n const branch = String(node.data?.branch ?? node.parentId ?? order[0] ?? \"main\");\n const lane = lanePos.get(branch) ?? 0;\n const slot = dir === \"BT\" ? n - 1 - seq : seq;\n const along = (vertical ? M.defaultPos : 0) + slot * M.commitStep + M.layoutOffset;\n const symbol = symbolOf(node.data);\n const explicit = node.data?.explicitId !== false;\n const showLabel = symbol !== \"CHERRY_PICK\" && (node.data?.kind !== \"merge\" || explicit);\n const tag = typeof node.data?.tag === \"string\" && node.data.tag ? node.data.tag : undefined;\n const from = typeof node.data?.from === \"string\" ? node.data.from : undefined;\n const tags = tag\n ? [tag]\n : node.data?.kind === \"cherry-pick\" && from\n ? [`cherry-pick:${from}`]\n : [];\n commits.set(node.id, {\n id: node.id,\n x: vertical ? lane : along,\n y: vertical ? along : lane - 2,\n branch,\n color: (laneIndex.get(branch) ?? 0) % M.colors,\n seq,\n symbol,\n label: showLabel ? node.label || node.id : undefined,\n tags,\n tip: tipOf.get(branch) === node.id,\n });\n });\n const maxPos = (vertical ? M.defaultPos : 0) + n * M.commitStep;\n\n // Lanes and branch name pills (`drawBranches`).\n const lanes: GitLaneGeometry[] = order.map((b, index) => {\n const p = lanePos.get(b)!;\n const w = estimateTextWidth(labelText.get(b) ?? b, M.branchFontSize);\n const h = M.branchTextHeight;\n const spine = vertical ? p : p - 2;\n const line = vertical\n ? { x1: p, y1: M.defaultPos, x2: p, y2: maxPos }\n : { x1: 0, y1: spine, x2: maxPos, y2: spine };\n const label = vertical\n ? { x: p - w / 2 - 10, y: dir === \"TB\" ? 0 : maxPos, width: w + 18, height: h + 4 }\n : { x: -w - 53, y: spine - (h + 4) / 2, width: w + 18, height: h + 4 };\n return { branch: b, index, color: index % M.colors, line, label };\n });\n\n // Parent links (`drawArrows`), in commit then parent order like Mermaid.\n const usedLanes: number[] = lanes.map((l) => (vertical ? l.line.x1 : l.line.y1));\n const parents = new Map<string, string[]>();\n for (const e of graph.edges) {\n const list = parents.get(e.target) ?? [];\n list.push(e.source);\n parents.set(e.target, list);\n }\n const findLane = (y1: number, y2: number, depth = 0): number => {\n const candidate = y1 + Math.abs(y1 - y2) / 2;\n if (depth > 5) return candidate;\n if (usedLanes.every((lane) => Math.abs(lane - candidate) >= 10)) {\n usedLanes.push(candidate);\n return candidate;\n }\n const diff = Math.abs(y1 - y2);\n return findLane(y1, y2 - diff / 5, depth + 1);\n };\n const all = [...commits.values()];\n const arrows = new Map<string, GitArrowGeometry>();\n for (const e of graph.edges) {\n const a = commits.get(e.source);\n const b = commits.get(e.target);\n if (!a || !b) continue;\n const firstParent = parents.get(b.id)?.[0];\n const isMerge = nodes[b.seq]?.data?.kind === \"merge\";\n arrows.set(e.id, {\n edgeId: e.id,\n ...arrowPath(dir, a, b, isMerge && a.id !== firstParent, all, findLane),\n });\n }\n return { direction: dir, commits, lanes, arrows, maxPos };\n}\n\n/** `drawArrow`: the path from parent `a` to child `b` and its colour slot. */\nfunction arrowPath(\n dir: GitDirection,\n a: GitCommitGeometry,\n b: GitCommitGeometry,\n /** `b` is a merge and `a` its merged-in (second) parent. */\n mergedIn: boolean,\n all: GitCommitGeometry[],\n findLane: (y1: number, y2: number) => number,\n): { path: string; color: number } {\n const p1 = a;\n const p2 = b;\n const vertical = dir !== \"LR\";\n const furthest = vertical ? p1.x < p2.x : p1.y < p2.y;\n const curveBranch = furthest ? b.branch : a.branch;\n const reroute = all.some((c) => c.seq > a.seq && c.seq < b.seq && c.branch === curveBranch);\n let color = mergedIn ? a.color : b.color;\n let path = `M ${p1.x} ${p1.y} L ${p2.x} ${p2.y}`;\n\n if (reroute) {\n const arc = \"A 10 10, 0, 0, 0,\";\n const arc2 = \"A 10 10, 0, 0, 1,\";\n const r = 10;\n const lineY = p1.y < p2.y ? findLane(p1.y, p2.y) : findLane(p2.y, p1.y);\n const lineX = p1.x < p2.x ? findLane(p1.x, p2.x) : findLane(p2.x, p1.x);\n if (dir === \"TB\") {\n if (p1.x < p2.x)\n path = `M ${p1.x} ${p1.y} L ${lineX - r} ${p1.y} ${arc2} ${lineX} ${p1.y + r} L ${lineX} ${p2.y - r} ${arc} ${lineX + r} ${p2.y} L ${p2.x} ${p2.y}`;\n else {\n color = a.color;\n path = `M ${p1.x} ${p1.y} L ${lineX + r} ${p1.y} ${arc} ${lineX} ${p1.y + r} L ${lineX} ${p2.y - r} ${arc2} ${lineX - r} ${p2.y} L ${p2.x} ${p2.y}`;\n }\n } else if (dir === \"BT\") {\n if (p1.x < p2.x)\n path = `M ${p1.x} ${p1.y} L ${lineX - r} ${p1.y} ${arc} ${lineX} ${p1.y - r} L ${lineX} ${p2.y + r} ${arc2} ${lineX + r} ${p2.y} L ${p2.x} ${p2.y}`;\n else {\n color = a.color;\n path = `M ${p1.x} ${p1.y} L ${lineX + r} ${p1.y} ${arc2} ${lineX} ${p1.y - r} L ${lineX} ${p2.y + r} ${arc} ${lineX - r} ${p2.y} L ${p2.x} ${p2.y}`;\n }\n } else if (p1.y < p2.y) {\n path = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY - r} ${arc} ${p1.x + r} ${lineY} L ${p2.x - r} ${lineY} ${arc2} ${p2.x} ${lineY + r} L ${p2.x} ${p2.y}`;\n } else {\n color = a.color;\n path = `M ${p1.x} ${p1.y} L ${p1.x} ${lineY + r} ${arc2} ${p1.x + r} ${lineY} L ${p2.x - r} ${lineY} ${arc} ${p2.x} ${lineY - r} L ${p2.x} ${p2.y}`;\n }\n return { path, color };\n }\n\n const arc = \"A 20 20, 0, 0, 0,\";\n const arc2 = \"A 20 20, 0, 0, 1,\";\n const r = 20;\n if (dir === \"TB\") {\n if (p1.x < p2.x)\n path = mergedIn\n ? `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - r} ${arc} ${p1.x + r} ${p2.y} L ${p2.x} ${p2.y}`\n : `M ${p1.x} ${p1.y} L ${p2.x - r} ${p1.y} ${arc2} ${p2.x} ${p1.y + r} L ${p2.x} ${p2.y}`;\n else if (p1.x > p2.x)\n path = mergedIn\n ? `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - r} ${arc2} ${p1.x - r} ${p2.y} L ${p2.x} ${p2.y}`\n : `M ${p1.x} ${p1.y} L ${p2.x + r} ${p1.y} ${arc} ${p2.x} ${p1.y + r} L ${p2.x} ${p2.y}`;\n } else if (dir === \"BT\") {\n if (p1.x < p2.x)\n path = mergedIn\n ? `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + r} ${arc2} ${p1.x + r} ${p2.y} L ${p2.x} ${p2.y}`\n : `M ${p1.x} ${p1.y} L ${p2.x - r} ${p1.y} ${arc} ${p2.x} ${p1.y - r} L ${p2.x} ${p2.y}`;\n else if (p1.x > p2.x)\n path = mergedIn\n ? `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + r} ${arc} ${p1.x - r} ${p2.y} L ${p2.x} ${p2.y}`\n : `M ${p1.x} ${p1.y} L ${p2.x + r} ${p1.y} ${arc2} ${p2.x} ${p1.y - r} L ${p2.x} ${p2.y}`;\n } else if (p1.y < p2.y) {\n path = mergedIn\n ? `M ${p1.x} ${p1.y} L ${p2.x - r} ${p1.y} ${arc2} ${p2.x} ${p1.y + r} L ${p2.x} ${p2.y}`\n : `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - r} ${arc} ${p1.x + r} ${p2.y} L ${p2.x} ${p2.y}`;\n } else if (p1.y > p2.y) {\n path = mergedIn\n ? `M ${p1.x} ${p1.y} L ${p2.x - r} ${p1.y} ${arc} ${p2.x} ${p1.y - r} L ${p2.x} ${p2.y}`\n : `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + r} ${arc2} ${p1.x + r} ${p2.y} L ${p2.x} ${p2.y}`;\n }\n return { path, color };\n}\n","import type { DiagramGraph, GraphEdge, GraphGroup, GraphNode, Point } from \"../types.js\";\nimport { registerFamilyLayout, type Size } from \"../layout-registry.js\";\nimport { GIT_METRICS, gitGraphGeometry } from \"./geometry.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n renameMetaKey,\n uniqueId,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * `gitGraph` adapter.\n *\n * ```\n * gitGraph LR:\n * commit id: \"init\"\n * branch develop\n * checkout develop\n * commit id: \"feat\" tag: \"v0.1\"\n * checkout main\n * merge develop\n * ```\n *\n * Canvas model: the statements are simulated in order like Mermaid does\n * (`branch` also checks the new branch out, the starting branch is `main`).\n * Every `commit`, `merge` and `cherry-pick` is a node (shape `commit`, or\n * `merge-commit` for merges); edges are parent links (parent → child, two\n * parents for merges, and a dotted second link from the picked commit for\n * cherry-picks, as Mermaid records it); every branch is a group whose members are its commits.\n * Node ids are the explicit `id:` values, or `c<n>` (the commit's 1-based\n * ordinal in the document) for commits without one — Mermaid generates random\n * ids for those, so they are only stable until an earlier commit is inserted.\n *\n * Edits never produce text Mermaid rejects: after removals, merges and\n * cherry-picks that became invalid (same head, missing source…) are dropped,\n * and `addEdge` only appends a `merge` when it is valid at the end of the\n * document.\n *\n * @module\n */\n\ninterface Attr {\n key: string;\n value: string;\n quoted: boolean;\n}\n\nexport type GitStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & {\n kind: \"commit\";\n attrs: Attr[];\n /** Attributes the diagram module could not read; the line is never regenerated. */\n opaque: boolean;\n })\n | (BaseStatement & { kind: \"merge\"; branch: string; attrs: Attr[]; opaque: boolean })\n | (BaseStatement & { kind: \"cherryPick\"; attrs: Attr[]; opaque: boolean })\n | (BaseStatement & { kind: \"branch\"; name: string; order?: string })\n | (BaseStatement & { kind: \"checkout\"; keyword: \"checkout\" | \"switch\"; name: string });\n\ntype Of<K extends GitStatement[\"kind\"]> = Extract<GitStatement, { kind: K }>;\ntype CommitLike = Of<\"commit\"> | Of<\"merge\"> | Of<\"cherryPick\">;\n\nconst MAIN = \"main\";\nconst COMMIT_TYPES = [\"NORMAL\", \"REVERSE\", \"HIGHLIGHT\"] as const;\nconst NAME = String.raw`(\"[^\"]*\"|[^\\s\"]+)`;\nconst ATTR = /\\s*([\\w-]+)\\s*:\\s*(\"[^\"]*\"|[^\\s\"]+)/y;\nconst HEADER = /^(\\s*gitGraph)\\s*(?:(LR|TB|BT|TD)?\\s*:)?\\s*$/i;\n\nfunction parseAttrs(text: string): { attrs: Attr[]; opaque: boolean } {\n const attrs: Attr[] = [];\n ATTR.lastIndex = 0;\n let m: RegExpExecArray | null;\n let end = 0;\n while ((m = ATTR.exec(text))) {\n const quoted = m[2]!.startsWith('\"');\n attrs.push({ key: m[1]!, value: quoted ? m[2]!.slice(1, -1) : m[2]!, quoted });\n end = ATTR.lastIndex;\n }\n return { attrs, opaque: text.slice(end).trim() !== \"\" };\n}\n\nconst unq = (name: string) => (name.startsWith('\"') ? name.slice(1, -1) : name);\nconst fmtName = (name: string) => (/[\\s\"]/.test(name) ? `\"${name.replace(/\"/g, \"'\")}\"` : name);\nconst fmtAttrs = (attrs: Attr[]) =>\n attrs.map((a) => ` ${a.key}: ${a.quoted ? `\"${a.value}\"` : a.value}`).join(\"\");\n/** Mermaid strings cannot escape `\"`, so values swap them for `'`. */\nconst cleanValue = (v: string) =>\n v\n .replace(/\"/g, \"'\")\n .replace(/[\\r\\n]+/g, \" \")\n .trim();\n\nfunction attr(s: CommitLike, key: string): string | undefined {\n return s.attrs.find((a) => a.key === key)?.value;\n}\n\n/** Sets (or, with `undefined`, removes) an attribute; returns false for opaque lines. */\nfunction setAttr(s: CommitLike, key: string, value: string | undefined): boolean {\n if (s.opaque) return false;\n const first = s.attrs.findIndex((a) => a.key === key);\n filterInPlace(s.attrs, (a, i) => a.key !== key || (i === first && value !== undefined));\n if (value !== undefined) {\n const entry = { key, value, quoted: key !== \"type\" };\n if (first !== -1) s.attrs[first] = entry;\n else if (key === \"id\") s.attrs.unshift(entry);\n else s.attrs.push(entry);\n }\n s.dirty = true;\n return true;\n}\n\nfunction headerDirection(header: string): string {\n const d = HEADER.exec(header)?.[2]?.toUpperCase();\n return !d ? \"LR\" : d === \"TD\" ? \"TB\" : d;\n}\n\n// ---------------------------------------------------------------------------\n// Simulation\n// ---------------------------------------------------------------------------\n\ninterface CommitInfo {\n stmt: CommitLike;\n id: string;\n explicitId: boolean;\n label: string;\n branch: string;\n kind: \"commit\" | \"merge\" | \"cherry-pick\";\n parents: string[];\n ordinal: number;\n}\n\ninterface BranchInfo {\n name: string;\n tip?: string;\n stmt?: Of<\"branch\">;\n}\n\ninterface Simulation {\n commits: CommitInfo[];\n byId: Map<string, CommitInfo>;\n branches: Map<string, BranchInfo>;\n /** Checked-out branch after the last statement. */\n current: string;\n /** First merge / cherry-pick Mermaid would reject, if any. */\n invalid?: GitStatement;\n}\n\nfunction simulate(statements: GitStatement[]): Simulation {\n const explicit = new Set<string>();\n for (const s of statements)\n if ((s.kind === \"commit\" || s.kind === \"merge\") && attr(s, \"id\") !== undefined)\n explicit.add(attr(s, \"id\")!);\n const taken = new Set(explicit);\n const assigned = new Set<string>();\n const commits: CommitInfo[] = [];\n const byId = new Map<string, CommitInfo>();\n /** Ids Mermaid itself knows (explicit ones). */\n const realIds = new Map<string, CommitInfo>();\n const branches = new Map<string, BranchInfo>([[MAIN, { name: MAIN }]]);\n let current = MAIN;\n let invalid: GitStatement | undefined;\n let ordinal = 0;\n\n const tipOf = (b: string) => {\n const tip = branches.get(b)?.tip;\n return tip === undefined ? undefined : byId.get(tip);\n };\n const add = (stmt: CommitLike, kind: CommitInfo[\"kind\"], parents: string[]) => {\n ordinal++;\n const own = stmt.kind === \"cherryPick\" ? undefined : attr(stmt, \"id\");\n let id: string;\n if (own !== undefined && !assigned.has(own)) id = own;\n else id = uniqueId(own ?? `c${ordinal}`, taken);\n assigned.add(id);\n taken.add(id);\n const msg = stmt.kind === \"commit\" ? attr(stmt, \"msg\") : undefined;\n const info: CommitInfo = {\n stmt,\n id,\n explicitId: own !== undefined,\n label: own ?? (msg || id),\n branch: current,\n kind,\n parents,\n ordinal,\n };\n commits.push(info);\n byId.set(id, info);\n if (own !== undefined) realIds.set(own, info);\n if (!branches.has(current)) branches.set(current, { name: current });\n branches.get(current)!.tip = id;\n };\n\n for (const s of statements) {\n switch (s.kind) {\n case \"commit\": {\n const tip = tipOf(current);\n add(s, \"commit\", tip ? [tip.id] : []);\n break;\n }\n case \"branch\":\n if (!branches.has(s.name)) branches.set(s.name, { name: s.name, stmt: s });\n branches.get(s.name)!.tip = branches.get(current)?.tip;\n current = s.name;\n break;\n case \"checkout\":\n current = s.name;\n break;\n case \"merge\": {\n const cur = tipOf(current);\n const other = tipOf(s.branch);\n const customId = attr(s, \"id\");\n const bad =\n current === s.branch ||\n !branches.has(s.branch) ||\n !cur ||\n !other ||\n cur === other ||\n cur.branch === s.branch ||\n (customId !== undefined && realIds.has(customId));\n if (bad) invalid ??= s;\n add(\n s,\n \"merge\",\n [cur?.id, other?.id].filter((p): p is string => !!p),\n );\n break;\n }\n case \"cherryPick\": {\n const source = realIds.get(attr(s, \"id\") ?? \"\");\n const parent = attr(s, \"parent\");\n const cur = tipOf(current);\n const bad =\n !source ||\n (parent !== undefined && !source.parents.includes(parent)) ||\n (source.kind === \"merge\" && parent === undefined) ||\n source.branch === current ||\n !cur;\n if (bad) invalid ??= s;\n // Like Mermaid: the current tip, then the picked commit as a second parent.\n add(\n s,\n \"cherry-pick\",\n [cur?.id, source?.id].filter((p): p is string => !!p),\n );\n break;\n }\n default:\n break;\n }\n }\n return { commits, byId, branches, current, invalid };\n}\n\n/** Drops merges / cherry-picks Mermaid would reject, one at a time until none is left. */\nfunction repair(statements: GitStatement[]): void {\n for (let guard = statements.length; guard > 0; guard--) {\n const bad = simulate(statements).invalid;\n if (!bad) return;\n statements.splice(statements.indexOf(bad), 1);\n }\n}\n\nfunction edgeList(sim: Simulation): GraphEdge[] {\n const counts = new Map<string, number>();\n const edges: GraphEdge[] = [];\n for (const c of sim.commits) {\n c.parents.forEach((p, i) => {\n const key = `${p}\\u0000${c.id}`;\n const n = counts.get(key) ?? 0;\n counts.set(key, n + 1);\n const second = i === 1;\n edges.push({\n id: `L_${p}_${c.id}_${n}`,\n source: p,\n target: c.id,\n pattern: second && c.kind === \"cherry-pick\" ? \"dotted\" : \"solid\",\n arrowStart: \"none\",\n arrowEnd: \"arrow_point\",\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: {\n merge: second && c.kind === \"merge\",\n ...(second && c.kind === \"cherry-pick\" ? { cherryPick: true } : {}),\n },\n });\n });\n }\n return edges;\n}\n\nfunction branchName(label: string): string {\n return (\n label\n .trim()\n .replace(/\\s+/g, \"-\")\n .replace(/[^\\w\\-./]/g, \"\") || \"branch\"\n );\n}\n\nexport const gitGraphGrammar: StatementGrammar<GitStatement> = {\n family: \"gitGraph\",\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if ((m = /^commit\\b(.*)$/.exec(text)))\n return { kind: \"commit\", raw: line, indent, ...parseAttrs(m[1]!) };\n if ((m = new RegExp(`^merge\\\\s+${NAME}(.*)$`).exec(text)))\n return { kind: \"merge\", raw: line, indent, branch: unq(m[1]!), ...parseAttrs(m[2]!) };\n if ((m = /^cherry-pick\\b(.*)$/.exec(text)))\n return { kind: \"cherryPick\", raw: line, indent, ...parseAttrs(m[1]!) };\n if ((m = new RegExp(`^branch\\\\s+${NAME}(?:\\\\s+order\\\\s*:\\\\s*(\\\\d+))?\\\\s*$`).exec(text)))\n return { kind: \"branch\", raw: line, indent, name: unq(m[1]!), order: m[2] };\n if ((m = new RegExp(`^(checkout|switch)\\\\s+${NAME}\\\\s*$`).exec(text)))\n return {\n kind: \"checkout\",\n raw: line,\n indent,\n keyword: m[1] as \"checkout\" | \"switch\",\n name: unq(m[2]!),\n };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n const i = stmt.indent;\n switch (stmt.kind) {\n case \"commit\":\n return stmt.opaque ? stmt.raw : `${i}commit${fmtAttrs(stmt.attrs)}`;\n case \"merge\":\n return stmt.opaque ? stmt.raw : `${i}merge ${fmtName(stmt.branch)}${fmtAttrs(stmt.attrs)}`;\n case \"cherryPick\":\n return stmt.opaque ? stmt.raw : `${i}cherry-pick${fmtAttrs(stmt.attrs)}`;\n case \"branch\":\n return `${i}branch ${fmtName(stmt.name)}${stmt.order ? ` order: ${stmt.order}` : \"\"}`;\n case \"checkout\":\n return `${i}${stmt.keyword} ${fmtName(stmt.name)}`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const sim = simulate(statements);\n const nodes: GraphNode[] = sim.commits.map((c) => {\n const tag = attr(c.stmt, \"tag\");\n const msg = c.stmt.kind === \"commit\" ? attr(c.stmt, \"msg\") : undefined;\n const from = c.stmt.kind === \"cherryPick\" ? attr(c.stmt, \"id\") : undefined;\n return {\n id: c.id,\n label: c.label,\n shape: c.kind === \"merge\" ? \"merge-commit\" : \"commit\",\n parentId: c.branch,\n classes: [],\n styles: [],\n data: {\n branch: c.branch,\n tag,\n type: attr(c.stmt, \"type\") ?? \"NORMAL\",\n msg,\n kind: c.kind,\n explicitId: c.explicitId,\n ...(from !== undefined ? { from } : {}),\n details: [c.branch, tag ? `tag: ${tag}` : undefined].filter(Boolean),\n },\n };\n });\n const groups: GraphGroup[] = [...sim.branches.values()].map((b) => ({\n id: b.name,\n label: b.name,\n classes: [],\n styles: [],\n data: b.stmt?.order !== undefined ? { order: Number(b.stmt.order) } : {},\n }));\n const graph: DiagramGraph = {\n direction: headerDirection(ctx.header),\n nodes,\n edges: edgeList(sim),\n groups,\n classDefs: {},\n title: ctx.frontmatterTitle,\n };\n return { graph };\n },\n\n /** Positions come from the commit order (see `./geometry`): drags and layout pins are not stored. */\n interceptMeta(op) {\n return op.type === \"moveNodes\";\n },\n\n edit(op, ctx) {\n return editGit(op, ctx);\n },\n};\n\nfunction editGit(\n op: Parameters<StatementGrammar<GitStatement>[\"edit\"]>[0],\n ctx: EditContext<GitStatement>,\n): boolean {\n const { statements, indent } = ctx;\n const sim = simulate(statements);\n const checkoutIfNeeded = (branch: string) => {\n if (sim.current !== branch)\n statements.push({\n kind: \"checkout\",\n raw: \"\",\n indent,\n keyword: \"checkout\",\n name: branch,\n dirty: true,\n });\n };\n\n switch (op.type) {\n case \"addNode\": {\n const parent = op.node.parentId;\n const branch =\n parent && sim.branches.has(parent)\n ? parent\n : parent && sim.byId.has(parent)\n ? sim.byId.get(parent)!.branch\n : sim.current;\n if (!sim.branches.has(branch)) return false;\n const label = cleanValue(op.node.label ?? \"\") || \"New commit\";\n const id = uniqueId(label, new Set(sim.byId.keys()));\n checkoutIfNeeded(branch);\n const stmt: Of<\"commit\"> = {\n kind: \"commit\",\n raw: \"\",\n indent,\n attrs: [{ key: \"id\", value: id, quoted: true }],\n opaque: false,\n dirty: true,\n };\n applyData(stmt, op.node.data ?? {});\n statements.push(stmt);\n return true;\n }\n case \"renameNode\": {\n const c = sim.byId.get(op.id);\n if (!c || c.stmt.kind === \"cherryPick\" || c.stmt.opaque) return false;\n const label = cleanValue(op.label);\n if (!label) return false;\n const others = new Set([...sim.byId.keys()].filter((k) => k !== op.id));\n const id = uniqueId(label, others);\n setAttr(c.stmt, \"id\", id);\n if (c.explicitId) {\n for (const s of statements) {\n if (s.kind !== \"cherryPick\" || s.opaque) continue;\n for (const a of s.attrs) {\n if ((a.key === \"id\" || a.key === \"parent\") && a.value === op.id) {\n a.value = id;\n s.dirty = true;\n }\n }\n }\n }\n renameMetaKey(ctx.meta, op.id, id);\n return true;\n }\n case \"setNodeData\": {\n const c = sim.byId.get(op.id);\n if (!c) return false;\n return applyData(c.stmt, op.data);\n }\n case \"removeNodes\": {\n const remove = new Set(op.ids.map((id) => sim.byId.get(id)?.stmt).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as CommitLike));\n repair(statements);\n dropMetaKeys(ctx.meta, op.ids);\n return true;\n }\n case \"addEdge\": {\n const a = sim.byId.get(op.edge.source);\n const b = sim.byId.get(op.edge.target);\n if (!a || !b || a.branch === b.branch) return false;\n if (sim.branches.get(a.branch)?.tip !== a.id || sim.branches.get(b.branch)?.tip !== b.id)\n return false;\n const before = statements.length;\n checkoutIfNeeded(b.branch);\n statements.push({\n kind: \"merge\",\n raw: \"\",\n indent,\n branch: a.branch,\n attrs: [],\n opaque: false,\n dirty: true,\n });\n if (simulate(statements).invalid) {\n statements.length = before;\n return false;\n }\n return true;\n }\n case \"removeEdges\": {\n const edges = edgeList(sim);\n const remove = new Set<GitStatement>();\n for (const id of op.ids) {\n const e = edges.find((x) => x.id === id);\n if (e?.data?.merge || e?.data?.cherryPick) remove.add(sim.byId.get(e.target)!.stmt);\n }\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s));\n repair(statements);\n return true;\n }\n case \"groupNodes\": {\n const name = uniqueId(branchName(op.label), new Set(sim.branches.keys()));\n statements.push(\n { kind: \"branch\", raw: \"\", indent, name, dirty: true },\n { kind: \"checkout\", raw: \"\", indent, keyword: \"checkout\", name, dirty: true },\n );\n return true;\n }\n case \"renameGroup\": {\n const info = sim.branches.get(op.id);\n if (!info?.stmt) return false; // `main` (or a branch never created) cannot be renamed\n const others = new Set([...sim.branches.keys()].filter((k) => k !== op.id));\n const name = uniqueId(branchName(op.label), others);\n for (const s of statements) {\n if ((s.kind === \"branch\" || s.kind === \"checkout\") && s.name === op.id) {\n s.name = name;\n s.dirty = true;\n } else if (s.kind === \"merge\" && s.branch === op.id && !s.opaque) {\n s.branch = name;\n s.dirty = true;\n }\n }\n renameMetaKey(ctx.meta, op.id, name);\n return true;\n }\n case \"setDirection\": {\n const m = HEADER.exec(ctx.doc.header);\n const d = op.direction.toUpperCase() === \"TD\" ? \"TB\" : op.direction.toUpperCase();\n if (!m || ![\"LR\", \"TB\", \"BT\"].includes(d)) return false;\n ctx.setHeader(`${m[1]} ${d}:`);\n return true;\n }\n default:\n return false;\n }\n}\n\n/** Applies `tag` / `type` / `msg` from a data payload; returns true when anything changed. */\nfunction applyData(stmt: CommitLike, data: Record<string, unknown>): boolean {\n let changed = false;\n if (typeof data.tag === \"string\")\n changed = setAttr(stmt, \"tag\", cleanValue(data.tag) || undefined) || changed;\n if (typeof data.type === \"string\" && stmt.kind !== \"cherryPick\") {\n const t = data.type.toUpperCase();\n if (t === \"\" || (COMMIT_TYPES as readonly string[]).includes(t))\n changed = setAttr(stmt, \"type\", t === \"\" || t === \"NORMAL\" ? undefined : t) || changed;\n }\n if (typeof data.msg === \"string\" && stmt.kind === \"commit\")\n changed = setAttr(stmt, \"msg\", cleanValue(data.msg) || undefined) || changed;\n return changed;\n}\n\nexport const gitGraphAdapter = createStatementAdapter(gitGraphGrammar);\n\n/**\n * Positions are Mermaid's own (see `./geometry`): branches are lanes in\n * `order`, commits advance 50px per commit in document order. Each commit is a\n * small box centred on its bullet; each branch is its name pill at the lane's\n * start. Stored positions are ignored, since Mermaid derives them.\n */\nregisterFamilyLayout(\"gitGraph\", (graph) => {\n const geo = gitGraphGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n const box = GIT_METRICS.commitBox;\n for (const c of geo.commits.values()) {\n positions[c.id] = [c.x - box / 2, c.y - box / 2];\n sizes[c.id] = { width: box, height: box };\n }\n for (const lane of geo.lanes) {\n positions[lane.branch] = [lane.label.x, lane.label.y];\n sizes[lane.branch] = { width: lane.label.width, height: lane.label.height };\n }\n return { positions, sizes };\n});\n","import type { DiagramGraph, GraphNode } from \"../types.js\";\n\n/**\n * Geometry of a Gantt chart as Mermaid draws it: one row per task in\n * document order, sections as full-width bands with their name on the left,\n * bars placed on a shared time scale, milestones as diamonds, vertical grid\n * lines with date ticks along the bottom, and a \"today\" line. Shared by the\n * layout, the editor (dragging a bar changes its dates or its row) and the\n * React canvas.\n *\n * @module\n */\n\nexport const DAY_MS = 86_400_000;\n\nexport const GANTT_METRICS = {\n /** Mermaid's barHeight 20 / barGap 4, scaled up a little for editing. */\n barHeight: 24,\n barGap: 6,\n /** Width of the section-name column left of the chart. */\n labelWidth: 150,\n rightPadding: 40,\n /** Space for the date ticks under the chart. */\n axisHeight: 32,\n milestoneSize: 22,\n minChartWidth: 960,\n maxPxPerDay: 48,\n minPxPerDay: 4,\n} as const;\n\nexport interface GanttRow {\n id: string;\n /** Section id, if the task belongs to one. */\n section?: string;\n sectionIndex: number;\n row: number;\n /** Bar box (absolute). */\n x: number;\n y: number;\n width: number;\n height: number;\n milestone: boolean;\n start?: number;\n end?: number;\n}\n\nexport interface GanttBand {\n id?: string;\n label?: string;\n index: number;\n y: number;\n height: number;\n}\n\nexport interface GanttTick {\n x: number;\n time: number;\n label: string;\n}\n\nexport interface GanttGeometry {\n origin: number;\n pxPerDay: number;\n rows: GanttRow[];\n rowById: Map<string, GanttRow>;\n bands: GanttBand[];\n /** Chart area (right of the section labels). */\n chartX: number;\n chartWidth: number;\n top: number;\n bottom: number;\n ticks: GanttTick[];\n today?: number;\n}\n\nconst time = (n: GraphNode, key: \"startTime\" | \"endTime\"): number | undefined =>\n typeof n.data?.[key] === \"number\" && Number.isFinite(n.data[key] as number)\n ? (n.data[key] as number)\n : undefined;\n\n/**\n * Pixels per day: the largest of a few fixed steps that keeps the chart\n * around a comfortable width. Snapping to steps means small edits (dragging a\n * bar a few days) do not rescale the whole chart under the pointer.\n */\nconst SCALE_STEPS = [48, 32, 24, 16, 12, 8, 6, 4, 3, 2, 1];\nfunction scaleFor(spanDays: number): number {\n const step = SCALE_STEPS.find((px) => spanDays * px <= 1200) ?? 1;\n return Math.min(GANTT_METRICS.maxPxPerDay, step);\n}\n\nexport function ganttGeometry(graph: DiagramGraph, now = Date.now()): GanttGeometry {\n const M = GANTT_METRICS;\n const starts = graph.nodes.map((n) => time(n, \"startTime\")).filter((t) => t !== undefined);\n const ends = graph.nodes.map((n) => time(n, \"endTime\")).filter((t) => t !== undefined);\n const origin = starts.length ? Math.min(...starts) : Date.UTC(2026, 0, 1);\n const last = ends.length ? Math.max(...ends) : origin + 7 * DAY_MS;\n const spanDays = Math.max(1, (last - origin) / DAY_MS);\n const pxPerDay = scaleFor(spanDays);\n const chartX = 0;\n const chartWidth = Math.max(M.minChartWidth, spanDays * pxPerDay);\n const xOf = (t: number) => chartX + ((t - origin) / DAY_MS) * pxPerDay;\n\n // Bands: tasks without a section first (Mermaid's implicit section), then sections in order.\n const sectionIndex = new Map(graph.groups.map((g, i) => [g.id, i]));\n const ordered = [...graph.nodes].sort((a, b) => {\n const sa = a.parentId ? sectionIndex.get(a.parentId)! + 1 : 0;\n const sb = b.parentId ? sectionIndex.get(b.parentId)! + 1 : 0;\n return sa - sb;\n });\n const rowH = M.barHeight + M.barGap;\n const rows: GanttRow[] = [];\n const bands: GanttBand[] = [];\n const top = 0;\n let y = top;\n let row = 0;\n const pushBand = (\n id: string | undefined,\n label: string | undefined,\n index: number,\n nodes: GraphNode[],\n ) => {\n const bandTop = y;\n for (const n of nodes) {\n const start = time(n, \"startTime\");\n const end = time(n, \"endTime\");\n const milestone = n.shape === \"milestone\";\n const x = start !== undefined ? xOf(start) : chartX;\n const width = milestone\n ? M.milestoneSize\n : Math.max(\n 6,\n start !== undefined && end !== undefined\n ? ((end - start) / DAY_MS) * pxPerDay\n : 6 * pxPerDay,\n );\n rows.push({\n id: n.id,\n section: id,\n sectionIndex: index,\n row: row++,\n x: milestone ? x - M.milestoneSize / 2 : x,\n y: y + M.barGap / 2 + (milestone ? (M.barHeight - M.milestoneSize) / 2 : 0),\n width,\n height: milestone ? M.milestoneSize : M.barHeight,\n milestone,\n start,\n end,\n });\n y += rowH;\n }\n // Empty sections still take one row, as Mermaid reserves their title.\n if (!nodes.length) y += rowH;\n bands.push({ id, label, index, y: bandTop, height: y - bandTop });\n };\n const loose = ordered.filter((n) => !n.parentId);\n if (loose.length) pushBand(undefined, undefined, -1, loose);\n graph.groups.forEach((g, i) =>\n pushBand(\n g.id,\n g.label,\n i,\n ordered.filter((n) => n.parentId === g.id),\n ),\n );\n\n return {\n origin,\n pxPerDay,\n rows,\n rowById: new Map(rows.map((r) => [r.id, r])),\n bands,\n chartX,\n chartWidth,\n top,\n bottom: y,\n ticks: ticksFor(\n origin,\n origin + (chartWidth / pxPerDay) * DAY_MS,\n xOf,\n graph.data?.axisFormat as string | undefined,\n ),\n today: graph.data?.todayMarker !== \"off\" && now >= origin && now <= last ? xOf(now) : undefined,\n };\n}\n\nconst MONTHS = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\nconst MONTHS_LONG = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst DAYS = [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"];\n\n/** Formats UTC time with the d3 specifiers Mermaid's `axisFormat` uses (`%Y-%m-%d`, `%b %d`…). */\nexport function formatAxis(t: number, format = \"%Y-%m-%d\"): string {\n const d = new Date(t);\n const pad = (n: number) => String(n).padStart(2, \"0\");\n return format.replace(/%([a-zA-Z%])/g, (_, c: string) => {\n switch (c) {\n case \"Y\":\n return String(d.getUTCFullYear());\n case \"y\":\n return pad(d.getUTCFullYear() % 100);\n case \"m\":\n return pad(d.getUTCMonth() + 1);\n case \"d\":\n return pad(d.getUTCDate());\n case \"e\":\n return String(d.getUTCDate());\n case \"b\":\n return MONTHS[d.getUTCMonth()]!;\n case \"B\":\n return MONTHS_LONG[d.getUTCMonth()]!;\n case \"a\":\n return DAYS[d.getUTCDay()]!;\n case \"H\":\n return pad(d.getUTCHours());\n case \"M\":\n return pad(d.getUTCMinutes());\n case \"%\":\n return \"%\";\n default:\n return `%${c}`;\n }\n });\n}\n\n/** Tick times on day, week (Mondays), month or year boundaries, like d3's time scale. */\nfunction ticksFor(\n from: number,\n to: number,\n xOf: (t: number) => number,\n axisFormat: string | undefined,\n): GanttTick[] {\n const days = (to - from) / DAY_MS;\n const start = new Date(from);\n const out: number[] = [];\n if (days <= 14) {\n for (\n let t = Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate());\n t <= to;\n t += DAY_MS\n )\n if (t >= from) out.push(t);\n } else if (days <= 120) {\n let t = Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate());\n while (new Date(t).getUTCDay() !== 1) t += DAY_MS;\n for (; t <= to; t += 7 * DAY_MS) out.push(t);\n } else if (days <= 900) {\n for (let y = start.getUTCFullYear(), m = start.getUTCMonth() + 1; ; m++) {\n const t = Date.UTC(y, m, 1);\n if (t > to) break;\n out.push(t);\n }\n } else {\n for (let y = start.getUTCFullYear() + 1; Date.UTC(y, 0, 1) <= to; y++)\n out.push(Date.UTC(y, 0, 1));\n }\n return out.map((t) => ({ time: t, x: xOf(t), label: formatAxis(t, axisFormat || \"%Y-%m-%d\") }));\n}\n\n/** Date (UTC ms, snapped to whole days) at canvas x. */\nexport function timeAtX(geometry: GanttGeometry, x: number): number {\n const days = Math.round((x - geometry.chartX) / geometry.pxPerDay);\n return geometry.origin + days * DAY_MS;\n}\n\n/** Index (into `rows`) of the row nearest to canvas y. */\nexport function rowAtY(geometry: GanttGeometry, y: number): number {\n let best = 0;\n let bestDist = Infinity;\n geometry.rows.forEach((r, i) => {\n const d = Math.abs(r.y + r.height / 2 - y);\n if (d < bestDist) {\n best = i;\n bestDist = d;\n }\n });\n return best;\n}\n","import type { GraphEdge, GraphGroup, GraphNode, Point, DiagramMeta } from \"../types.js\";\nimport type { FamilyLayout, LayoutResult, Size } from \"../layout-registry.js\";\nimport { filterInPlace, slugId, uniqueId, type BaseStatement, type EditContext } from \"./base.js\";\nimport type { EditOp } from \"../types.js\";\n\n/**\n * Shared machinery for \"sections of items\" families (gantt, timeline,\n * journey). Their documents share one shape:\n *\n * ```\n * <header>\n * title Some title\n * item before any section\n * section First\n * item\n * item\n * section Second\n * item\n * ```\n *\n * - `section X` starts a group; every following item belongs to it until the\n * next `section` line. Items before the first section have no group.\n * - Groups get ids `uniqueId(slugId(label))`; items get ids from the family\n * (explicit ids first, then slugs of their text). Explicit ids are reserved\n * first, then item slugs, then section slugs, so that structural edits on\n * sections (ungroup, rename) never change item ids.\n * - {@link editSections} implements the shared edits (title, add/remove/rename\n * items, grouping, re-parenting) and re-keys layout metadata by statement\n * identity after every edit, so any id change (rename, explicit id edit)\n * carries the stored position along.\n *\n * Families plug in with a {@link SectionsSpec}: how to recognise and create\n * items, how to rename them, and which characters their grammar forbids.\n *\n * @module\n */\n\n/** `title …` statement. */\nexport interface TitleStatement extends BaseStatement {\n kind: \"title\";\n title: string;\n}\n\n/** `section …` statement (starts a group). */\nexport interface SectionStatement extends BaseStatement {\n kind: \"section\";\n label: string;\n}\n\n/** A statement the diagram module does not model; always emitted verbatim. */\nexport interface RawStatement extends BaseStatement {\n kind: \"raw\";\n}\n\n/** Any statement of a sections family: the shared kinds plus family-specific ones. */\nexport type SectionsStatementBase = BaseStatement & { kind: string };\n\n/** An item (node) with its resolved id and enclosing section. */\nexport interface SectionItem<I> {\n stmt: I;\n id: string;\n section?: SectionEntry;\n}\n\n/** A section (group) with its resolved id. */\nexport interface SectionEntry {\n stmt: SectionStatement;\n id: string;\n}\n\n/** Ids of every item and section in a statement list, in document order. */\nexport interface SectionsModel<I> {\n items: SectionItem<I>[];\n sections: SectionEntry[];\n itemById: Map<string, SectionItem<I>>;\n sectionById: Map<string, SectionEntry>;\n /** Statement → id, for items and sections (used to re-key metadata). */\n ids: Map<BaseStatement, string>;\n}\n\n/** Hooks a family provides to reuse the shared model and edits. */\nexport interface SectionsSpec<S extends SectionsStatementBase, I extends S> {\n /** Whether a statement is an item (a node). */\n isItem(stmt: S): stmt is I;\n /** Text the derived id is slugged from (task name, period…). */\n itemText(item: I): string;\n /** Explicit id written in the source (gantt task ids), reserved before slugs. */\n explicitId?(item: I): string | undefined;\n /** Slug fallback when the text has no usable characters. */\n fallbackId: string;\n /** Builds a dirty item statement for `addNode`; `null` refuses the op. */\n createItem(\n node: Partial<GraphNode>,\n ctx: { indent: string; statements: S[]; model: SectionsModel<I> },\n ): I | null;\n /** Applies a new label to an item (mark it dirty); false refuses. */\n renameItem(item: I, label: string): boolean;\n /** Characters the family's grammar does not allow in section labels. */\n sectionForbidden?: RegExp;\n /** Characters the family's grammar does not allow in titles. */\n titleForbidden?: RegExp;\n /**\n * Where a missing `title` statement is inserted (index in `statements`).\n * Default: right after the header (index 0).\n */\n titleIndex?(statements: S[]): number;\n}\n\n/** Parses the shared `title` / `section` lines; `null` for anything else. */\nexport function parseSectionsLine(\n line: string,\n indent: string,\n): TitleStatement | SectionStatement | null {\n const text = line.trim();\n let m: RegExpExecArray | null;\n if ((m = /^title(?:\\s+(.*))?$/i.exec(text)) && !/^title\\s*:/i.test(text))\n return { kind: \"title\", raw: line, indent, title: (m[1] ?? \"\").trim() };\n if ((m = /^section(?:\\s+(.*))?$/i.exec(text)))\n return { kind: \"section\", raw: line, indent, label: (m[1] ?? \"\").trim() };\n return null;\n}\n\n/** Formats a dirty `title` / `section` statement; `undefined` for other kinds. */\nexport function formatSectionsLine(stmt: SectionsStatementBase): string | undefined {\n if (stmt.kind === \"title\") return `${stmt.indent}title ${(stmt as TitleStatement).title}`;\n if (stmt.kind === \"section\") return `${stmt.indent}section ${(stmt as SectionStatement).label}`;\n return undefined;\n}\n\n/**\n * Groups multi-line `accDescr { … }` blocks into one logical statement so\n * their inner lines are never mistaken for items. Use as (part of) a\n * grammar's `joinLines`.\n */\nexport function joinAccDescrBlocks(lines: string[]): string[] {\n const out: string[] = [];\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]!;\n if (/^\\s*accDescr\\s*\\{/.test(line) && !line.includes(\"}\")) {\n const block = [line];\n while (i + 1 < lines.length) {\n const next = lines[++i]!;\n block.push(next);\n if (next.includes(\"}\")) break;\n }\n out.push(block.join(\"\\n\"));\n } else out.push(line);\n }\n return out;\n}\n\n/** Resolves ids for every item and section of a statement list. */\nexport function buildSectionsModel<S extends SectionsStatementBase, I extends S>(\n statements: S[],\n spec: SectionsSpec<S, I>,\n): SectionsModel<I> {\n const taken = new Set<string>();\n const ids = new Map<BaseStatement, string>();\n for (const s of statements) {\n const explicit = spec.isItem(s) ? spec.explicitId?.(s) : undefined;\n if (explicit && !taken.has(explicit)) {\n taken.add(explicit);\n ids.set(s, explicit);\n }\n }\n for (const s of statements)\n if (spec.isItem(s) && !ids.has(s))\n ids.set(s, uniqueId(slugId(spec.itemText(s), spec.fallbackId), taken));\n for (const s of statements)\n if (s.kind === \"section\")\n ids.set(s, uniqueId(slugId((s as unknown as SectionStatement).label, \"section\"), taken));\n\n const model: SectionsModel<I> = {\n items: [],\n sections: [],\n itemById: new Map(),\n sectionById: new Map(),\n ids,\n };\n let current: SectionEntry | undefined;\n for (const s of statements) {\n if (s.kind === \"section\") {\n current = { stmt: s as unknown as SectionStatement, id: ids.get(s)! };\n model.sections.push(current);\n model.sectionById.set(current.id, current);\n } else if (spec.isItem(s)) {\n const item: SectionItem<I> = { stmt: s, id: ids.get(s)!, section: current };\n model.items.push(item);\n model.itemById.set(item.id, item);\n }\n }\n return model;\n}\n\n/** Text of the last `title` statement, if any. */\nexport function sectionsTitle(statements: SectionsStatementBase[]): string | undefined {\n let title: string | undefined;\n for (const s of statements) if (s.kind === \"title\") title = (s as TitleStatement).title;\n return title;\n}\n\n/** One {@link GraphGroup} per section, in document order. */\nexport function sectionGroups<I>(model: SectionsModel<I>): GraphGroup[] {\n return model.sections.map((s) => ({ id: s.id, label: s.stmt.label, classes: [], styles: [] }));\n}\n\n/**\n * Synthetic solid edges between consecutive items so the canvas reads as a\n * sequence. They carry `data.synthetic: true` and cannot be edited.\n */\nexport function sequenceEdges<I>(model: SectionsModel<I>): GraphEdge[] {\n const edges: GraphEdge[] = [];\n for (let i = 1; i < model.items.length; i++) {\n const a = model.items[i - 1]!.id;\n const b = model.items[i]!.id;\n edges.push({\n id: `L_${a}_${b}_0`,\n source: a,\n target: b,\n pattern: \"solid\",\n arrowStart: \"none\",\n arrowEnd: \"none\",\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: { synthetic: true },\n });\n }\n return edges;\n}\n\n/** Removes forbidden characters and newlines, collapsing whitespace. */\nexport function cleanText(text: string, forbidden?: RegExp): string {\n let t = text.replace(/[\\r\\n]+/g, \" \");\n if (forbidden) t = t.replace(new RegExp(forbidden.source, \"g\"), \"\");\n return t.replace(/\\s+/g, \" \").trim();\n}\n\n/**\n * Re-indents a (possibly multi-line) statement: the first line gets `indent`,\n * continuation lines keep their offset relative to the old indentation.\n */\nexport function reindent(stmt: BaseStatement, indent: string): void {\n if (stmt.indent === indent) return;\n const old = stmt.indent;\n stmt.raw = stmt.raw\n .split(\"\\n\")\n .map((line, i) => {\n if (i === 0) return indent + line.slice(old.length);\n if (line.startsWith(old)) return indent + line.slice(old.length);\n return line;\n })\n .join(\"\\n\");\n stmt.indent = indent;\n}\n\n/**\n * Re-keys layout/size metadata after an edit: statements whose id changed\n * carry their entries to the new id; removed statements lose theirs.\n */\nexport function remapMeta(\n meta: DiagramMeta,\n before: Map<BaseStatement, string>,\n after: Map<BaseStatement, string>,\n): void {\n const moved: { to?: string; layout?: Point; size?: readonly [number, number] }[] = [];\n for (const [stmt, from] of before) {\n const to = after.get(stmt);\n if (to === from) continue;\n moved.push({ to, layout: meta.layout?.[from], size: meta.sizes?.[from] });\n delete meta.layout?.[from];\n delete meta.sizes?.[from];\n }\n for (const m of moved) {\n if (!m.to) continue;\n if (m.layout && meta.layout) meta.layout[m.to] = m.layout;\n if (m.size && meta.sizes) meta.sizes[m.to] = m.size;\n }\n}\n\n/** Indentation for an item placed in `section` (or outside any section). */\nfunction itemIndent<I extends BaseStatement>(\n model: SectionsModel<I>,\n section: SectionEntry | undefined,\n unit: string,\n): string {\n const peers = model.items.filter((i) => i.section === section);\n if (peers.length) return peers.at(-1)!.stmt.indent;\n if (section) {\n const nested = model.items.find((i) => i.section);\n return nested ? nested.stmt.indent : section.stmt.indent + unit;\n }\n return model.sections[0]?.stmt.indent ?? unit;\n}\n\n/** Index right after the last item of `section` (or after its header line). */\nfunction endOfSection<S extends SectionsStatementBase, I extends S>(\n statements: S[],\n section: SectionStatement,\n spec: SectionsSpec<S, I>,\n): number {\n const start = statements.indexOf(section as unknown as S);\n let at = start + 1;\n for (let i = start + 1; i < statements.length; i++) {\n const s = statements[i]!;\n if (s.kind === \"section\") break;\n if (spec.isItem(s)) at = i + 1;\n }\n return at;\n}\n\nfunction makeSection<S>(label: string, indent: string): S {\n const stmt: SectionStatement = { kind: \"section\", raw: \"\", indent, label, dirty: true };\n return stmt as unknown as S;\n}\n\n/**\n * Applies an edit to a sections family. `custom` runs first and handles the\n * family-specific ops (node data, shapes, edges…): it returns `true`/`false`\n * when it handled/refused the op and `undefined` to fall through to the\n * shared implementation of `setTitle`, `addNode`, `removeNodes`,\n * `renameNode`, `groupNodes`, `ungroup`, `renameGroup` and `setNodeParent`.\n * Every other op is refused. Metadata is re-keyed afterwards (see\n * {@link remapMeta}).\n */\nexport function editSections<S extends SectionsStatementBase, I extends S>(\n op: EditOp,\n ctx: EditContext<S>,\n spec: SectionsSpec<S, I>,\n custom?: (op: EditOp, model: SectionsModel<I>) => boolean | undefined,\n): boolean {\n const before = buildSectionsModel(ctx.statements, spec);\n let added: I | null = null;\n let handled = custom?.(op, before);\n if (handled === undefined) {\n const result = sharedEdit(op, ctx, spec, before);\n handled = result.handled;\n added = result.added;\n }\n if (!handled) return false;\n const after = buildSectionsModel(ctx.statements, spec);\n remapMeta(ctx.meta, before.ids, after.ids);\n if (added && op.type === \"addNode\" && op.position) {\n const id = after.ids.get(added);\n if (id) ctx.meta.layout![id] = op.position;\n }\n return true;\n}\n\nfunction sharedEdit<S extends SectionsStatementBase, I extends S>(\n op: EditOp,\n ctx: EditContext<S>,\n spec: SectionsSpec<S, I>,\n model: SectionsModel<I>,\n): { handled: boolean; added: I | null } {\n const { statements } = ctx;\n const no = { handled: false, added: null };\n const yes = { handled: true, added: null };\n switch (op.type) {\n case \"setTitle\": {\n const idx = statements.findIndex((s) => s.kind === \"title\");\n const title = op.title === undefined ? \"\" : cleanText(op.title, spec.titleForbidden);\n if (!title) {\n if (idx !== -1) statements.splice(idx, 1);\n return yes;\n }\n if (idx !== -1) {\n const s = statements[idx] as unknown as TitleStatement;\n s.title = title;\n s.dirty = true;\n return yes;\n }\n const stmt: TitleStatement = {\n kind: \"title\",\n raw: \"\",\n indent: model.sections[0]?.stmt.indent ?? ctx.indent,\n title,\n dirty: true,\n };\n statements.splice(spec.titleIndex?.(statements) ?? 0, 0, stmt as unknown as S);\n return yes;\n }\n case \"addNode\": {\n const section = op.node.parentId ? model.sectionById.get(op.node.parentId) : undefined;\n // Without a parent the item is appended at the end: it joins whatever\n // section is open there.\n const effective =\n section ?? (model.items.length ? model.items.at(-1)!.section : model.sections.at(-1));\n const indent = itemIndent(model, effective, ctx.indent);\n const stmt = spec.createItem(op.node, { indent, statements, model });\n if (!stmt) return no;\n let at: number;\n if (section) at = endOfSection(statements, section.stmt, spec);\n else if (model.items.length) at = statements.indexOf(model.items.at(-1)!.stmt) + 1;\n else at = statements.length;\n statements.splice(at, 0, stmt);\n return { handled: true, added: stmt };\n }\n case \"removeNodes\": {\n const remove = new Set<BaseStatement>(\n op.ids.map((id) => model.itemById.get(id)?.stmt).filter((s): s is I => !!s),\n );\n if (!remove.size) return no;\n filterInPlace(statements, (s) => !remove.has(s));\n return yes;\n }\n case \"renameNode\": {\n const item = model.itemById.get(op.id);\n if (!item) return no;\n return spec.renameItem(item.stmt, op.label) ? yes : no;\n }\n case \"renameGroup\": {\n const section = model.sectionById.get(op.id);\n const label = cleanText(op.label, spec.sectionForbidden);\n if (!section || !label) return no;\n section.stmt.label = label;\n section.stmt.dirty = true;\n return yes;\n }\n case \"ungroup\": {\n const section = model.sectionById.get(op.groupId);\n if (!section) return no;\n filterInPlace(statements, (s) => s !== (section.stmt as unknown as S));\n return yes;\n }\n case \"groupNodes\": {\n const selected = model.items.filter((i) => op.nodeIds.includes(i.id));\n if (!selected.length) return no;\n const label = cleanText(op.label, spec.sectionForbidden) || \"Section\";\n const first = selected[0]!;\n const previous = first.section;\n const chosen = new Set<BaseStatement>(selected.map((i) => i.stmt));\n // Items of the previous section that stay behind after the moved block.\n const firstIdx = statements.indexOf(first.stmt);\n const stays = (i: SectionItem<I>) => i.section === previous && !chosen.has(i.stmt);\n const leaders =\n !!previous && model.items.some((i) => stays(i) && statements.indexOf(i.stmt) < firstIdx);\n const followers =\n !!previous && model.items.some((i) => stays(i) && statements.indexOf(i.stmt) > firstIdx);\n const sectionIndent = model.sections[0]?.stmt.indent ?? ctx.indent;\n const indent = previous\n ? first.stmt.indent\n : (model.items.find((i) => i.section)?.stmt.indent ?? sectionIndent + ctx.indent);\n filterInPlace(statements, (s) => !chosen.has(s));\n let at: number;\n // When nothing of the previous section precedes the selection, the new\n // section goes before its header, which then keeps the followers.\n if (previous && !leaders) at = statements.indexOf(previous.stmt as unknown as S);\n else if (previous) at = firstIdx;\n else {\n // Outside any section: place the new section after the unsectioned\n // items so they keep having no section.\n const firstSection = statements.findIndex((s) => s.kind === \"section\");\n at = firstSection === -1 ? statements.length : firstSection;\n }\n const block: S[] = [makeSection<S>(label, sectionIndent)];\n for (const item of selected) {\n reindent(item.stmt, indent);\n block.push(item.stmt);\n }\n if (followers && leaders && previous)\n block.push(makeSection<S>(previous.stmt.label, previous.stmt.indent));\n statements.splice(at, 0, ...block);\n return yes;\n }\n case \"setNodeParent\": {\n const moving = model.items.filter((i) => op.ids.includes(i.id));\n if (!moving.length) return no;\n const target = op.parentId ? model.sectionById.get(op.parentId) : undefined;\n if (op.parentId && !target) return no;\n if (!target && !model.sections.length) return no;\n if (moving.every((i) => i.section === target)) return yes;\n const indent = itemIndent(model, target, ctx.indent);\n const set = new Set<BaseStatement>(moving.map((i) => i.stmt));\n filterInPlace(statements, (s) => !set.has(s));\n const at = target\n ? endOfSection(statements, target.stmt, spec)\n : statements.findIndex((s) => s.kind === \"section\");\n for (const item of moving) reindent(item.stmt, indent);\n statements.splice(at, 0, ...moving.map((i) => i.stmt));\n return yes;\n }\n default:\n return no;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Reordering (families drawn as one row of items: timeline, journey)\n// ---------------------------------------------------------------------------\n\n/** Where an item goes: a section (`undefined` = before any section) and an index among its items. */\nexport interface SectionSlot {\n section?: string;\n index: number;\n}\n\n/** A section's horizontal span on a canvas that draws all items in one row. */\nexport interface SectionSpan {\n /** Section id; `undefined` for the items before the first section. */\n section?: string;\n x0: number;\n x1: number;\n /** The section's items in order, with the x of their centres. */\n items: { id: string; centre: number }[];\n}\n\n/**\n * The slot an item dropped with its centre at `x` moves to: the section\n * whose span holds `x` (clamped to the first / last span) and the number of\n * that section's other items left of `x`. `null` when there are no spans.\n */\nexport function sectionDropTarget(spans: SectionSpan[], id: string, x: number): SectionSlot | null {\n if (!spans.length) return null;\n const span =\n spans.find((s) => x >= s.x0 && x < s.x1) ?? (x < spans[0]!.x0 ? spans[0]! : spans.at(-1)!);\n const index = span.items.filter((i) => i.id !== id && i.centre < x).length;\n return { section: span.section, index };\n}\n\n/**\n * Moves an item to a slot: into `slot.section` (or before the first section)\n * at `slot.index` among that section's other items, re-indented like its new\n * peers. Returns false when the item is unknown, the section does not exist or\n * the item is already there. Layout metadata is re-keyed (ids derived from\n * text may change when duplicates swap places).\n */\nexport function moveSectionItem<S extends SectionsStatementBase, I extends S>(\n ctx: Pick<EditContext<S>, \"statements\" | \"meta\" | \"indent\">,\n spec: SectionsSpec<S, I>,\n id: string,\n slot: SectionSlot,\n): boolean {\n const { statements } = ctx;\n const model = buildSectionsModel(statements, spec);\n const item = model.itemById.get(id);\n if (!item) return false;\n const section = slot.section !== undefined ? model.sectionById.get(slot.section) : undefined;\n if (slot.section !== undefined && !section) return false;\n const peers = model.items.filter((i) => i.section === section && i !== item);\n const index = Math.max(0, Math.min(slot.index, peers.length));\n if (item.section === section) {\n const current = model.items.filter((i) => i.section === section).indexOf(item);\n if (current === index) return false;\n }\n const indent = peers[0]?.stmt.indent ?? itemIndent(model, section, ctx.indent);\n filterInPlace(statements, (s) => s !== item.stmt);\n let at: number;\n if (index < peers.length) at = statements.indexOf(peers[index]!.stmt);\n else if (peers.length) at = statements.indexOf(peers.at(-1)!.stmt) + 1;\n else if (section) at = endOfSection(statements, section.stmt, spec);\n else {\n const first = statements.findIndex((s) => s.kind === \"section\");\n at = first === -1 ? statements.length : first;\n }\n reindent(item.stmt, indent);\n statements.splice(at, 0, item.stmt);\n remapMeta(ctx.meta, model.ids, buildSectionsModel(statements, spec).ids);\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Layout\n// ---------------------------------------------------------------------------\n\nconst PAD = 24;\nconst TITLE_H = 32;\nconst GAP = 12;\nconst COLUMN_GAP = 48;\n\n/**\n * Column layout shared by timeline and journey: sections become columns from\n * left to right (each a group box with 24px padding and a 32px title band),\n * items inside a section stack top to bottom in document order with 12px\n * gaps; items without a section form the first column. Stored positions\n * (`meta.layout`) win for nodes and groups the user dragged; items without\n * one are stacked below their predecessors inside their (possibly moved)\n * group.\n */\nexport const sectionColumnsLayout: FamilyLayout = (graph, meta, { measure }) => {\n const stored = meta.layout ?? {};\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n const sizeOf = (n: GraphNode, width: number): Size =>\n meta.sizes?.[n.id]\n ? { width: meta.sizes[n.id]![0], height: meta.sizes[n.id]![1] }\n : { width, height: measure(n).height };\n\n const columns: { group?: GraphGroup; nodes: GraphNode[] }[] = [];\n const loose = graph.nodes.filter(\n (n) => !n.parentId || !graph.groups.some((g) => g.id === n.parentId),\n );\n if (loose.length) columns.push({ nodes: loose });\n for (const g of graph.groups)\n columns.push({ group: g, nodes: graph.nodes.filter((n) => n.parentId === g.id) });\n\n let x = 0;\n for (const col of columns) {\n const width = Math.max(160, ...col.nodes.map((n) => measure(n).width));\n let origin: Point = [x, 0];\n if (col.group) {\n const own = stored[col.group.id];\n const pinned = col.nodes.filter((n) => stored[n.id]);\n if (own) origin = own;\n else if (pinned.length && pinned.length === col.nodes.length)\n origin = [\n Math.min(...pinned.map((n) => stored[n.id]![0])) - PAD,\n Math.min(...pinned.map((n) => stored[n.id]![1])) - PAD - TITLE_H,\n ];\n }\n const innerX = col.group ? origin[0] + PAD : x;\n let y = origin[1] + PAD + TITLE_H;\n for (const n of col.nodes) {\n const size = sizeOf(n, width);\n const pos = stored[n.id] ?? ([innerX, y] as Point);\n positions[n.id] = pos;\n sizes[n.id] = size;\n y = pos[1] + size.height + GAP;\n }\n let right = x + width;\n if (col.group) {\n positions[col.group.id] = origin;\n const box = boundingSize(origin, col.nodes, positions, sizes, width);\n sizes[col.group.id] = meta.sizes?.[col.group.id]\n ? { width: meta.sizes[col.group.id]![0], height: meta.sizes[col.group.id]![1] }\n : box;\n right = Math.max(x + width + PAD * 2, origin[0] + sizes[col.group.id]!.width);\n }\n x = right + COLUMN_GAP;\n }\n return { positions, sizes } satisfies LayoutResult;\n};\n\n/** Group box from its origin to the far edge of its children, plus padding. */\nexport function boundingSize(\n origin: Point,\n nodes: GraphNode[],\n positions: Record<string, Point>,\n sizes: Record<string, Size>,\n minInnerWidth = 152,\n): Size {\n if (!nodes.length) return { width: Math.max(200, minInnerWidth + PAD * 2), height: 100 };\n let maxX = origin[0] + PAD + minInnerWidth;\n let maxY = origin[1] + PAD + TITLE_H;\n for (const n of nodes) {\n const [px, py] = positions[n.id]!;\n maxX = Math.max(maxX, px + sizes[n.id]!.width);\n maxY = Math.max(maxY, py + sizes[n.id]!.height);\n }\n return { width: maxX - origin[0] + PAD, height: maxY - origin[1] + PAD };\n}\n\n/** Layout constants shared with families that build their own layout. */\nexport const SECTION_LAYOUT = { pad: PAD, titleHeight: TITLE_H, gap: GAP } as const;\n","import type { DiagramGraph, EditOp, GraphEdge, GraphNode, Point } from \"../types.js\";\nimport { registerFamilyLayout, type Size } from \"../layout-registry.js\";\nimport { DAY_MS as GEO_DAY_MS, GANTT_METRICS, ganttGeometry, rowAtY, timeAtX } from \"./geometry.js\";\nimport {\n createStatementAdapter,\n type EditContext,\n indentOf,\n type BaseStatement,\n type StatementGrammar,\n} from \"../statements/base.js\";\nimport {\n buildSectionsModel,\n cleanText,\n editSections,\n formatSectionsLine,\n joinAccDescrBlocks,\n parseSectionsLine,\n sectionGroups,\n sectionsTitle,\n type RawStatement,\n type SectionStatement,\n type SectionsModel,\n type SectionsSpec,\n type TitleStatement,\n} from \"../statements/sections.js\";\n\n/**\n * `gantt` adapter.\n *\n * ```\n * gantt\n * title Q4 delivery roadmap\n * dateFormat YYYY-MM-DD\n * section Platform\n * Design system v9 rollout :done, ds, 2026-10-01, 14d\n * Observability upgrade :ob, after ds, 14d\n * ```\n *\n * Canvas model: one node per task (shape `task`, or `milestone` when tagged\n * so), sections as groups, and one dependency edge `X → task` per id in a\n * task's `after X Y` start (`data.dependency: true`). Task ids are the\n * explicit Mermaid ids, or slugs of the task names for tasks without one.\n * Task data: `tags`, `start`, `end` (as written), `explicitId`, plus the\n * resolved `startTime` / `endTime` (UTC epoch ms, when computable) that the\n * time-axis layout uses. Config lines (`dateFormat`, `axisFormat`,\n * `excludes`, `tickInterval`, `todayMarker`) are exposed as `graph.data`.\n *\n * @module\n */\n\n/** Task tags Mermaid recognises before the id/start/end parts. */\nexport const GANTT_TAGS = [\"done\", \"active\", \"crit\", \"milestone\", \"vert\"] as const;\n\n/** Diagram-level settings edited with `setGraphData`. */\nexport const GANTT_CONFIG_KEYS = [\n \"dateFormat\",\n \"axisFormat\",\n \"excludes\",\n \"tickInterval\",\n \"todayMarker\",\n] as const;\ntype ConfigKey = (typeof GANTT_CONFIG_KEYS)[number];\n\n/** A task line: `Name :tags, id, start, end`. */\nexport interface GanttTask extends BaseStatement {\n kind: \"task\";\n name: string;\n tags: string[];\n id?: string;\n start?: string;\n end: string;\n /** Text after the task data that Mermaid ignores (`; …`, `# …`), kept on format. */\n suffix: string;\n}\n\n/** One of the {@link GANTT_CONFIG_KEYS} lines. */\nexport interface GanttConfig extends BaseStatement {\n kind: \"config\";\n key: ConfigKey;\n value: string;\n}\n\nexport type GanttStatement =\n RawStatement | TitleStatement | SectionStatement | GanttConfig | GanttTask;\n\n/** Lines Mermaid reads as keywords; never tasks even when they contain a colon. */\nconst KEYWORD =\n /^(?:(?:dateFormat|axisFormat|tickInterval|excludes|includes|todayMarker|weekday|weekend|inclusiveEndDates|topAxis|click|accTitle|accDescr|accDescription|displayMode)\\b|%%|#)/i;\nconst CONFIG = new RegExp(`^(${GANTT_CONFIG_KEYS.join(\"|\")})\\\\s+(.*)$`, \"i\");\n/** A 2-part task whose first part looks like a start (date, `after`, `until`, number). */\nconst START_LIKE = /^(after|until)\\s|^\\d{4}-\\d{2}-\\d{2}$|^\\d+$|^\\d[\\d\\-/.: T]*\\d$/i;\nconst DURATION = /^(\\d+(?:\\.\\d+)?)(ms|[Mdhmswy])$/;\nconst AFTER = /^after\\s+(.+)$/i;\nconst UNTIL = /^until\\s+(.+)$/i;\nconst DAY_MS = 86_400_000;\nconst DEFAULT_DATE_FORMAT = \"YYYY-MM-DD\";\n\nconst isTag = (part: string): boolean => (GANTT_TAGS as readonly string[]).includes(part);\n\n/** `after a b` → `[\"a\", \"b\"]`; `[]` for any other start. */\nexport function afterIds(start: string | undefined): string[] {\n const m = start ? AFTER.exec(start.trim()) : null;\n return m ? m[1]!.trim().split(/\\s+/) : [];\n}\n\nfunction untilIds(end: string | undefined): string[] {\n const m = end ? UNTIL.exec(end.trim()) : null;\n return m ? m[1]!.trim().split(/\\s+/) : [];\n}\n\nfunction parseTaskData(data: string): Omit<GanttTask, \"raw\" | \"indent\" | \"kind\" | \"name\"> | null {\n const cut = data.search(/[#;]/);\n const body = cut === -1 ? data : data.slice(0, cut);\n const suffix = cut === -1 ? \"\" : data.slice(cut);\n const parts = body.split(\",\").map((p) => p.trim());\n const tags: string[] = [];\n // Like Mermaid: every leading part that is a tag is a tag, in any order.\n while (parts.length && isTag(parts[0]!)) tags.push(parts.shift()!);\n if (parts.some((p) => !p) || parts.length === 0 || parts.length > 3) return null;\n if (parts.length === 3) return { tags, id: parts[0], start: parts[1], end: parts[2]!, suffix };\n if (parts.length === 2) {\n if (START_LIKE.test(parts[0]!)) return { tags, start: parts[0], end: parts[1]!, suffix };\n return { tags, id: parts[0], end: parts[1]!, suffix };\n }\n return { tags, end: parts[0]!, suffix };\n}\n\n// ---------------------------------------------------------------------------\n// Dates\n// ---------------------------------------------------------------------------\n\n/** dayjs tokens are runs of one letter; only these runs are understood. */\nconst TOKENS = /([A-Za-z])\\1*/g;\nconst SUPPORTED = new Set([\n \"YYYY\",\n \"YY\",\n \"MM\",\n \"M\",\n \"DD\",\n \"D\",\n \"HH\",\n \"H\",\n \"mm\",\n \"m\",\n \"ss\",\n \"s\",\n \"SSS\",\n]);\nconst supported = (fmt: string): boolean =>\n !/[[\\]]/.test(fmt) && (fmt.match(TOKENS) ?? []).every((t) => SUPPORTED.has(t));\n\n/**\n * Parses a date written in a dayjs-style `dateFormat` (`YYYY`, `MM`, `DD`,\n * `HH`, `mm`, `ss`… plus `x` / `X` timestamps). Falls back to ISO / `Date`\n * parsing like Mermaid does. Returns UTC epoch milliseconds.\n */\nexport function parseGanttDate(text: string, format = DEFAULT_DATE_FORMAT): number | undefined {\n const t = text.trim();\n const fmt = format.trim();\n if (fmt === \"x\" && /^\\d+$/.test(t)) return Number(t);\n if (fmt === \"X\" && /^\\d+$/.test(t)) return Number(t) * 1000;\n if (supported(fmt)) {\n const fields: string[] = [];\n const pattern = fmt.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(TOKENS, (tok) => {\n fields.push(tok);\n return tok.length === 1 ? \"(\\\\d{1,2})\" : `(\\\\d{${tok.length}})`;\n });\n const m = new RegExp(`^${pattern}$`).exec(t);\n if (m) {\n const v: Record<string, number> = {};\n fields.forEach((f, i) => (v[f[0]!] = Number(m[i + 1])));\n const year = fields.includes(\"YY\") ? 2000 + v.Y! : (v.Y ?? 1970);\n return Date.UTC(year, (v.M ?? 1) - 1, v.D ?? 1, v.H ?? 0, v.m ?? 0, v.s ?? 0, v.S ?? 0);\n }\n }\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(t)) return Date.parse(`${t}T00:00:00Z`);\n if (!/^\\d/.test(t)) return undefined;\n const d = Date.parse(t);\n return Number.isFinite(d) ? d : undefined;\n}\n\n/** Formats UTC epoch ms with a `dateFormat`; unsupported formats fall back to `YYYY-MM-DD`. */\nexport function formatGanttDate(ms: number, format = DEFAULT_DATE_FORMAT): string {\n let fmt = format.trim();\n if (fmt === \"x\") return String(ms);\n if (fmt === \"X\") return String(Math.floor(ms / 1000));\n if (!supported(fmt)) fmt = DEFAULT_DATE_FORMAT;\n const d = new Date(ms);\n const pad = (n: number, w = 2) => String(n).padStart(w, \"0\");\n const values: Record<string, string> = {\n YYYY: pad(d.getUTCFullYear(), 4),\n YY: pad(d.getUTCFullYear() % 100),\n MM: pad(d.getUTCMonth() + 1),\n M: String(d.getUTCMonth() + 1),\n DD: pad(d.getUTCDate()),\n D: String(d.getUTCDate()),\n HH: pad(d.getUTCHours()),\n H: String(d.getUTCHours()),\n mm: pad(d.getUTCMinutes()),\n m: String(d.getUTCMinutes()),\n ss: pad(d.getUTCSeconds()),\n s: String(d.getUTCSeconds()),\n SSS: pad(d.getUTCMilliseconds(), 3),\n };\n return fmt.replace(TOKENS, (tok) => values[tok]!);\n}\n\nfunction addDuration(start: number, text: string): number | undefined {\n const m = DURATION.exec(text.trim());\n if (!m) return undefined;\n const n = Number(m[1]);\n const unit = m[2]!;\n const fixed: Record<string, number> = {\n ms: 1,\n s: 1000,\n m: 60_000,\n h: 3_600_000,\n d: DAY_MS,\n w: 7 * DAY_MS,\n };\n if (fixed[unit]) return start + n * fixed[unit]!;\n const d = new Date(start);\n if (unit === \"M\") d.setUTCMonth(d.getUTCMonth() + n);\n else d.setUTCFullYear(d.getUTCFullYear() + n);\n return d.getTime();\n}\n\ninterface Schedule {\n start?: number;\n end?: number;\n}\n\n/**\n * Resolves start/end times the way Mermaid does (a task without a start\n * follows the previous task; `after` takes the latest end of its ids;\n * `until` the earliest start), iterating until stable so forward references\n * resolve. `excludes` / `inclusiveEndDates` are ignored.\n */\nfunction resolveSchedule(\n items: { id: string; task: GanttTask }[],\n format: string,\n): Map<string, Schedule> {\n const out = new Map<string, Schedule>(items.map((i) => [i.id, {}]));\n for (let pass = 0; pass <= items.length; pass++) {\n let changed = false;\n items.forEach(({ id, task }, index) => {\n const cur = out.get(id)!;\n let start: number | undefined;\n if (!task.start) start = index > 0 ? out.get(items[index - 1]!.id)!.end : undefined;\n else if (AFTER.test(task.start)) {\n const ends = afterIds(task.start).map((d) => out.get(d)?.end);\n start = ends.every((e) => e !== undefined) && ends.length ? Math.max(...ends) : undefined;\n } else start = parseGanttDate(task.start, format);\n let end: number | undefined;\n const until = untilIds(task.end);\n if (until.length) {\n const starts = until.map((d) => out.get(d)?.start);\n end = starts.every((s) => s !== undefined) ? Math.min(...(starts as number[])) : undefined;\n } else if (start !== undefined && DURATION.test(task.end)) end = addDuration(start, task.end);\n else end = parseGanttDate(task.end, format);\n if (start !== cur.start || end !== cur.end) {\n out.set(id, { start, end });\n changed = true;\n }\n });\n if (!changed) break;\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Grammar\n// ---------------------------------------------------------------------------\n\nfunction cleanName(text: string): string {\n return cleanText(text, /[:#;]/);\n}\n\nfunction cleanId(text: string): string {\n return text.trim().replace(/[^\\w-]+/g, \"_\");\n}\n\nconst spec: SectionsSpec<GanttStatement, GanttTask> = {\n isItem: (s): s is GanttTask => s.kind === \"task\",\n itemText: (t) => t.name,\n explicitId: (t) => t.id,\n fallbackId: \"task\",\n titleForbidden: /[#;]/,\n createItem(node, { indent, statements, model }) {\n const name = cleanName(node.label ?? node.id ?? \"\") || \"New task\";\n const data = node.data ?? {};\n const tags = Array.isArray(data.tags) ? data.tags.map(String).filter(isTag) : [];\n if (node.shape === \"milestone\" && !tags.includes(\"milestone\")) tags.push(\"milestone\");\n const id = typeof data.id === \"string\" && data.id.trim() ? cleanId(data.id) : undefined;\n if (id && model.itemById.has(id)) return null;\n let start = typeof data.start === \"string\" && data.start.trim() ? data.start.trim() : undefined;\n const end = typeof data.end === \"string\" && data.end.trim() ? data.end.trim() : \"7d\";\n // An explicit id needs the 3-part form, which needs a start.\n if (id && !start) start = defaultStart(statements, model);\n return { kind: \"task\", raw: \"\", indent, name, tags, id, start, end, suffix: \"\", dirty: true };\n },\n renameItem(task, label) {\n const name = cleanName(label);\n if (!name) return false;\n task.name = name;\n task.dirty = true;\n return true;\n },\n};\n\nfunction dateFormatOf(statements: GanttStatement[]): string {\n const c = statements.find((s): s is GanttConfig => s.kind === \"config\" && s.key === \"dateFormat\");\n return c?.value.trim() || DEFAULT_DATE_FORMAT;\n}\n\nfunction scheduleOf(\n statements: GanttStatement[],\n model: SectionsModel<GanttTask>,\n): Map<string, Schedule> {\n return resolveSchedule(\n model.items.map((i) => ({ id: i.id, task: i.stmt })),\n dateFormatOf(statements),\n );\n}\n\n/** Earliest written/resolved start date, formatted (`2026-01-01` when there is none). */\nfunction defaultStart(statements: GanttStatement[], model: SectionsModel<GanttTask>): string {\n const starts = [...scheduleOf(statements, model).values()]\n .map((s) => s.start)\n .filter((s): s is number => s !== undefined);\n return starts.length\n ? formatGanttDate(Math.min(...starts), dateFormatOf(statements))\n : \"2026-01-01\";\n}\n\n/** The resolved start of a task as a date in the diagram's format (fallback: earliest start). */\nfunction startDateOf(\n id: string,\n statements: GanttStatement[],\n model: SectionsModel<GanttTask>,\n): string {\n const start = scheduleOf(statements, model).get(id)?.start;\n return start !== undefined\n ? formatGanttDate(start, dateFormatOf(statements))\n : defaultStart(statements, model);\n}\n\nfunction dependencyEdges(model: SectionsModel<GanttTask>): GraphEdge[] {\n const edges: GraphEdge[] = [];\n const seen = new Set<string>();\n for (const { stmt, id } of model.items) {\n for (const dep of afterIds(stmt.start)) {\n const edgeId = `L_${dep}_${id}_0`;\n if (!model.itemById.has(dep) || dep === id || seen.has(edgeId)) continue;\n seen.add(edgeId);\n edges.push({\n id: edgeId,\n source: dep,\n target: id,\n pattern: \"solid\",\n arrowStart: \"none\",\n arrowEnd: \"arrow_point\",\n length: 1,\n classes: [],\n styles: [],\n userDefinedId: false,\n data: { dependency: true },\n });\n }\n }\n return edges;\n}\n\nexport const ganttGrammar: StatementGrammar<GanttStatement> = {\n family: \"gantt\",\n titleAsStatement: true,\n defaultIndent: \" \",\n joinLines: joinAccDescrBlocks,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n const shared = parseSectionsLine(line, indent);\n if (shared) return shared;\n let m: RegExpExecArray | null;\n if ((m = CONFIG.exec(text))) {\n const key = GANTT_CONFIG_KEYS.find((k) => k.toLowerCase() === m![1]!.toLowerCase())!;\n return { kind: \"config\", raw: line, indent, key, value: m[2]!.trim() };\n }\n const colon = text.indexOf(\":\");\n if (!KEYWORD.test(text) && colon > 0) {\n const name = text.slice(0, colon).trim();\n const data = parseTaskData(text.slice(colon + 1));\n if (name && data) return { kind: \"task\", raw: line, indent, name, ...data };\n }\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n if (stmt.kind === \"config\") return `${stmt.indent}${stmt.key} ${stmt.value}`;\n if (stmt.kind === \"task\") {\n const parts = [...stmt.tags, stmt.id, stmt.start, stmt.end].filter(Boolean);\n return `${stmt.indent}${stmt.name} :${parts.join(\", \")}${stmt.suffix}`;\n }\n return formatSectionsLine(stmt) ?? stmt.raw;\n },\n\n buildGraph(statements, ctx) {\n const model = buildSectionsModel(statements, spec);\n const schedule = scheduleOf(statements, model);\n const nodes: GraphNode[] = model.items.map(({ stmt, id, section }) => ({\n id,\n label: stmt.name,\n shape: stmt.tags.includes(\"milestone\") ? \"milestone\" : \"task\",\n parentId: section?.id,\n classes: [],\n styles: [],\n data: {\n tags: stmt.tags,\n start: stmt.start,\n end: stmt.end,\n explicitId: !!stmt.id,\n details: [stmt.start, stmt.end].filter(Boolean),\n startTime: schedule.get(id)?.start,\n endTime: schedule.get(id)?.end,\n },\n }));\n const data: Record<string, unknown> = {};\n for (const key of GANTT_CONFIG_KEYS) data[key] = undefined;\n for (const s of statements) if (s.kind === \"config\") data[s.key] = s.value;\n const graph: DiagramGraph = {\n direction: \"LR\",\n nodes,\n edges: dependencyEdges(model),\n groups: sectionGroups(model),\n classDefs: {},\n title: sectionsTitle(statements) ?? ctx.frontmatterTitle,\n data,\n };\n return { graph };\n },\n\n interceptMeta: (op, ctx) => dragTask(op, ctx),\n\n edit(op, ctx) {\n const { statements } = ctx;\n return editSections(op, ctx, spec, (op, model) => {\n const task = (id: string) => model.itemById.get(id)?.stmt;\n /** Gives a task an explicit id (= its node id) so others can depend on it. */\n const ensureId = (id: string) => {\n const t = task(id)!;\n if (t.id) return;\n if (!t.start) t.start = startDateOf(id, statements, model);\n t.id = id;\n t.dirty = true;\n };\n /** Drops `dep` from `id`'s `after` list, pinning the start date when it empties. */\n const removeDependency = (dep: string, id: string): boolean => {\n const t = task(id);\n const deps = afterIds(t?.start);\n if (!t || !deps.includes(dep)) return false;\n const rest = deps.filter((d) => d !== dep);\n t.start = rest.length ? `after ${rest.join(\" \")}` : startDateOf(id, statements, model);\n t.dirty = true;\n return true;\n };\n /** Whether `to` is reachable from `from` along dependency edges. */\n const reaches = (from: string, to: string): boolean => {\n const edges = dependencyEdges(model);\n const stack = [from];\n const seen = new Set<string>();\n while (stack.length) {\n const cur = stack.pop()!;\n if (cur === to) return true;\n if (seen.has(cur)) continue;\n seen.add(cur);\n for (const e of edges) if (e.source === cur) stack.push(e.target);\n }\n return false;\n };\n const addDependency = (dep: string, id: string): boolean => {\n const t = task(id);\n if (!t || !task(dep) || dep === id || reaches(id, dep)) return false;\n const deps = afterIds(t.start);\n if (deps.includes(dep)) return true;\n ensureId(dep);\n t.start = `after ${[...deps, dep].join(\" \")}`;\n t.dirty = true;\n return true;\n };\n const edgeById = (edgeId: string) => dependencyEdges(model).find((e) => e.id === edgeId);\n\n switch (op.type) {\n case \"removeNodes\": {\n // Drop references to the removed tasks first; the shared code removes the lines.\n const removed = op.ids.filter((id) => model.itemById.has(id));\n for (const { id } of model.items) {\n if (removed.includes(id)) continue;\n for (const dep of afterIds(task(id)!.start))\n if (removed.includes(dep)) removeDependency(dep, id);\n const t = task(id)!;\n const until = untilIds(t.end);\n if (until.some((d) => removed.includes(d))) {\n const rest = until.filter((d) => !removed.includes(d));\n const end = scheduleOf(statements, model).get(id)?.end;\n t.end = rest.length\n ? `until ${rest.join(\" \")}`\n : end !== undefined\n ? formatGanttDate(end, dateFormatOf(statements))\n : \"1d\";\n t.dirty = true;\n }\n }\n return undefined;\n }\n case \"setNodeShape\": {\n const t = task(op.id);\n if (!t || (op.shape !== \"task\" && op.shape !== \"milestone\")) return false;\n const has = t.tags.includes(\"milestone\");\n if (has === (op.shape === \"milestone\")) return true;\n t.tags = has ? t.tags.filter((g) => g !== \"milestone\") : [...t.tags, \"milestone\"];\n t.dirty = true;\n return true;\n }\n case \"setNodeData\": {\n const t = task(op.id);\n if (!t) return false;\n let changed = false;\n const { start, end, tags, id } = op.data;\n if (Array.isArray(tags)) {\n t.tags = tags.map(String).filter((g, i, all) => isTag(g) && all.indexOf(g) === i);\n changed = true;\n }\n if (typeof end === \"string\") {\n t.end = cleanText(end, /[,#;]/) || \"1d\";\n changed = true;\n }\n if (typeof id === \"string\") {\n const next = id.trim() ? cleanId(id) : undefined;\n const referenced = model.items.some(\n (i) => afterIds(i.stmt.start).includes(op.id) || untilIds(i.stmt.end).includes(op.id),\n );\n if (next !== t.id) {\n if (!next && referenced) return false;\n if (next && model.itemById.has(next) && next !== op.id) return false;\n // Point dependants at the new id.\n if (next)\n for (const i of model.items) {\n const deps = afterIds(i.stmt.start);\n if (deps.includes(op.id)) {\n i.stmt.start = `after ${deps.map((d) => (d === op.id ? next : d)).join(\" \")}`;\n i.stmt.dirty = true;\n }\n const until = untilIds(i.stmt.end);\n if (until.includes(op.id)) {\n i.stmt.end = `until ${until.map((d) => (d === op.id ? next : d)).join(\" \")}`;\n i.stmt.dirty = true;\n }\n }\n if (next && !t.start) t.start = startDateOf(op.id, statements, model);\n t.id = next;\n changed = true;\n }\n }\n if (typeof start === \"string\") {\n const value = cleanText(start, /[,#;]/);\n t.start = value || (t.id ? startDateOf(op.id, statements, model) : undefined);\n changed = true;\n }\n if (changed) t.dirty = true;\n return changed;\n }\n case \"addEdge\":\n return addDependency(op.edge.source, op.edge.target);\n case \"removeEdges\": {\n let changed = false;\n for (const edgeId of op.ids) {\n const e = edgeById(edgeId);\n if (e && removeDependency(e.source, e.target)) changed = true;\n }\n return changed;\n }\n case \"reconnectEdge\": {\n const e = edgeById(op.id);\n if (!e) return false;\n if (e.source === op.source && e.target === op.target) return true;\n if (!task(op.source) || !task(op.target) || op.source === op.target) return false;\n if (e.target === op.target) {\n // Same dependant: swap the id in place.\n if (reaches(op.target, op.source)) return false;\n ensureId(op.source);\n const t = task(op.target)!;\n const deps = afterIds(t.start).map((d) => (d === e.source ? op.source : d));\n t.start = `after ${deps.filter((d, i) => deps.indexOf(d) === i).join(\" \")}`;\n t.dirty = true;\n return true;\n }\n // Moving to another dependant: check the new link first so a refused\n // reconnect leaves the old dependency in place.\n if (afterIds(task(op.target)!.start).includes(op.source))\n return removeDependency(e.source, e.target);\n if (reaches(op.target, op.source)) return false;\n removeDependency(e.source, e.target);\n return addDependency(op.source, op.target);\n }\n case \"setGraphData\": {\n let changed = false;\n for (const key of GANTT_CONFIG_KEYS) {\n if (!(key in op.data)) continue;\n const raw = op.data[key];\n const value = raw === undefined || raw === null ? \"\" : cleanText(String(raw), /[#;]/);\n const idx = statements.findIndex((s) => s.kind === \"config\" && s.key === key);\n if (!value) {\n if (idx !== -1) statements.splice(idx, 1);\n } else if (idx !== -1) {\n const s = statements[idx] as GanttConfig;\n s.value = value;\n s.dirty = true;\n } else {\n let at = -1;\n statements.forEach((s, i) => {\n if (s.kind === \"config\") at = i;\n });\n if (at === -1) at = statements.findIndex((s) => s.kind === \"title\");\n const indent = (at !== -1 ? statements[at]!.indent : undefined) ?? ctx.indent;\n statements.splice(at + 1, 0, {\n kind: \"config\",\n raw: \"\",\n indent,\n key,\n value,\n dirty: true,\n });\n }\n changed = true;\n }\n return changed;\n }\n case \"setEdgeLabel\":\n case \"setEdgeStyle\":\n case \"setEdgeData\":\n return false;\n default:\n return undefined;\n }\n });\n },\n};\n\nexport const ganttAdapter = createStatementAdapter(ganttGrammar);\n\n// ---------------------------------------------------------------------------\n// Direct manipulation\n// ---------------------------------------------------------------------------\n\n/**\n * Bars are positioned from their dates, so drags and resizes become date\n * edits instead of stored positions: dragging a bar sideways moves its start\n * (snapped to days; an explicit end date moves with it, a duration is kept,\n * an `after …` start is replaced by the date it was dropped on); dragging it\n * up or down moves the task line to that row, and so into that row's section;\n * resizing a bar sets its duration in days.\n */\nfunction dragTask(op: EditOp, ctx: EditContext<GanttStatement>): boolean {\n if (op.type !== \"moveNodes\" && op.type !== \"resizeNode\") return false;\n const geo = ganttGeometry(ctx.doc.graph);\n const model = buildSectionsModel(ctx.statements, spec);\n const format = dateFormatOf(ctx.statements);\n if (op.type === \"resizeNode\") {\n const row = geo.rowById.get(op.id);\n const task = model.itemById.get(op.id)?.stmt;\n if (!row || !task || row.milestone || !op.size) return true;\n const days = Math.max(1, Math.round(op.size[0] / geo.pxPerDay));\n const endIsDate = parseGanttDate(task.end, format) !== undefined;\n const next =\n endIsDate && row.start !== undefined\n ? formatGanttDate(row.start + days * GEO_DAY_MS, format)\n : `${days}d`;\n if (next !== task.end) {\n task.end = next;\n task.dirty = true;\n }\n return true;\n }\n for (const { id, position } of op.moves) {\n const row = geo.rowById.get(id);\n const task = model.itemById.get(id)?.stmt;\n if (!row || !task) continue; // section bands are not moved\n const left = position[0] + (row.milestone ? GANTT_METRICS.milestoneSize / 2 : 0);\n const start = timeAtX(geo, left);\n if (row.start !== undefined && start !== row.start) {\n const delta = start - row.start;\n const end = parseGanttDate(task.end, format);\n task.start = formatGanttDate(start, format);\n if (end !== undefined) task.end = formatGanttDate(end + delta, format);\n task.dirty = true;\n }\n const from = geo.rows.indexOf(row);\n const to = rowAtY(geo, position[1] + row.height / 2);\n if (to !== from) {\n const anchor = model.itemById.get(geo.rows[to]!.id)?.stmt;\n if (!anchor) continue;\n ctx.statements.splice(ctx.statements.indexOf(task), 1);\n const at = ctx.statements.indexOf(anchor);\n ctx.statements.splice(to > from ? at + 1 : at, 0, task);\n if (task.indent !== anchor.indent) {\n task.indent = anchor.indent;\n task.dirty = true;\n }\n }\n }\n return true;\n}\n\n// ---------------------------------------------------------------------------\n// Layout\n// ---------------------------------------------------------------------------\n\n/**\n * Mermaid's Gantt geometry (see {@link ganttGeometry}): a row per task, bars\n * on a shared time scale, sections as full-width bands with a label column on\n * the left. Positions always come from the dates and document order.\n */\nregisterFamilyLayout(\"gantt\", (graph) => {\n const geo = ganttGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const r of geo.rows) {\n positions[r.id] = [r.x, r.y];\n sizes[r.id] = { width: r.width, height: r.height };\n }\n for (const band of geo.bands) {\n if (!band.id) continue;\n positions[band.id] = [geo.chartX - GANTT_METRICS.labelWidth, band.y];\n sizes[band.id] = {\n width: GANTT_METRICS.labelWidth + geo.chartWidth + GANTT_METRICS.rightPadding,\n height: band.height,\n };\n }\n return { positions, sizes };\n});\n\nexport { ganttGeometry, GANTT_METRICS, formatAxis } from \"./geometry.js\";\n","import type { DiagramGraph, GraphNode } from \"../types.js\";\nimport type { SectionSpan } from \"../statements/sections.js\";\n\n/**\n * Geometry of a timeline as Mermaid's (left-to-right) renderer draws it:\n * section header bands on top, one 190px column per period with its box\n * below the header, a thick time axis under the periods, and each period's\n * events stacked further down on a dashed line. Shared by the layout (period\n * and section boxes), the adapter (dragging a period sideways reorders it)\n * and the React canvas (events, lines, axis, title), so all three agree.\n *\n * Coordinates are Mermaid's, shifted so the first column starts at x = 0 and\n * the top of the first row (headers, or periods without sections) at y = 0.\n *\n * @module\n */\n\n/** Mermaid's timeline constants (`timelineRenderer.ts`, `svgDraw.js`), in canvas pixels. */\nexport const TIMELINE_METRICS = {\n /** Box width: 150px of text plus 20px padding on both sides. */\n nodeWidth: 190,\n /** Width text wraps at. */\n wrapWidth: 150,\n padding: 20,\n /** Distance between the left edges of two columns. */\n columnStep: 200,\n fontSize: 16,\n lineHeight: 17.6,\n /** Events are at least this tall. */\n eventMinHeight: 50,\n eventGap: 10,\n /** From a period's top to its first event. */\n eventOffset: 200,\n /** Between the section headers and the periods. */\n sectionGap: 50,\n /** Between the bottom of the period row and the axis. */\n axisGap: 50,\n /** The axis starts this far left of the first column… */\n axisBefore: 50,\n /** …and ends this far right of the last one. */\n axisAfter: 250,\n axisWidth: 4,\n eventLineWidth: 2,\n /** Mermaid's colour scale has 12 slots (`cScale0`…`cScale11`). */\n colours: 12,\n} as const;\n\nconst M = TIMELINE_METRICS;\n\n/** Colour slot: an index into Mermaid's `cScale` scale, or `root` (`git0`). */\nexport type TimelineColour = number | \"root\";\n\nexport interface TimelineBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface TimelinePeriodBox extends TimelineBox {\n id: string;\n colour: TimelineColour;\n /** Index in visual (document) order. */\n index: number;\n}\n\nexport interface TimelineEventBox extends TimelineBox {\n periodId: string;\n /** Index in the period's `events`. */\n index: number;\n text: string;\n colour: TimelineColour;\n}\n\nexport interface TimelineSectionBox extends TimelineBox {\n id: string;\n colour: TimelineColour;\n /** True when the section has no periods (Mermaid still reserves a column). */\n empty: boolean;\n}\n\nexport interface TimelineGeometry {\n periods: Map<string, TimelinePeriodBox>;\n sections: Map<string, TimelineSectionBox>;\n /** Events of every period, in order. */\n events: TimelineEventBox[];\n /** Dashed line under each period, from the bottom of its box past its events. */\n eventLines: { periodId: string; x: number; y1: number; y2: number }[];\n /** Where the \"add event\" affordance goes under each period's last event. */\n addEvent: Map<string, { x: number; y: number }>;\n axis: { x1: number; x2: number; y: number };\n /** Top-left of the title text box (Mermaid: `x = width / 2 - leftMargin`, baseline 20). */\n title: { x: number; baseline: number };\n /** Section spans for drag-to-reorder (see `sectionDropTarget`). */\n spans: SectionSpan[];\n hasSections: boolean;\n width: number;\n height: number;\n}\n\nlet measurer: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Width of text in Mermaid's default font: measured with a canvas in a\n * browser, estimated (0.47em per character) elsewhere (tests, SSR, jsdom).\n */\nexport function textWidth(text: string, fontSize: number = M.fontSize, bold = false): number {\n if (measurer === undefined) {\n measurer = null;\n const browser =\n typeof document !== \"undefined\" &&\n typeof navigator !== \"undefined\" &&\n !/jsdom/i.test(navigator.userAgent);\n if (browser)\n try {\n measurer = document.createElement(\"canvas\").getContext(\"2d\");\n } catch {\n measurer = null;\n }\n }\n if (!measurer) return text.length * fontSize * 0.47;\n measurer.font = `${bold ? \"bold \" : \"\"}${fontSize}px \"trebuchet ms\", verdana, arial, sans-serif`;\n return measurer.measureText(text).width;\n}\n\n/** Lines `text` wraps to at `width` (word wrap, `<br>` breaks), as Mermaid's `wrap`. */\nexport function wrapLines(text: string, width: number = M.wrapWidth): number {\n let lines = 0;\n for (const part of String(text).split(/<br\\s*\\/?>|\\n/i)) {\n lines++;\n let line = \"\";\n for (const word of part.split(/\\s+/).filter(Boolean)) {\n const next = line ? `${line} ${word}` : word;\n if (line && textWidth(next) > width) {\n lines++;\n line = word;\n } else line = next;\n }\n }\n return Math.max(1, lines);\n}\n\n/**\n * Height Mermaid gives a box of text (`getVirtualNodeHeight`): the text's\n * bounding box, half a line and the padding.\n */\nexport function textBoxHeight(text: string, width: number = M.wrapWidth): number {\n const lines = wrapLines(text, width);\n const bbox = M.fontSize * 1.15 + (lines - 1) * M.lineHeight;\n return bbox + M.fontSize * 1.1 * 0.5 + M.padding;\n}\n\nfunction eventsOf(node: GraphNode): string[] {\n const events = node.data?.events;\n return Array.isArray(events) ? events.map(String) : [];\n}\n\nexport function timelineGeometry(graph: DiagramGraph): TimelineGeometry {\n const groups = graph.groups;\n const hasSections = groups.length > 0;\n const inGroup = (n: GraphNode) => !!n.parentId && groups.some((g) => g.id === n.parentId);\n // Mermaid sizes every period box from the text \"[object Object]\" (it\n // measures the task object), so the row height is the same for all.\n const rowHeight = graph.nodes.length ? textBoxHeight(\"[object Object]\") + 20 : 0;\n const headerHeight = Math.max(0, ...groups.map((g) => textBoxHeight(g.label) + 20));\n const eventStack = Math.max(\n 0,\n ...graph.nodes.map((n) => {\n const events = eventsOf(n);\n return (\n events.reduce((sum, e) => sum + textBoxHeight(e), 0) +\n Math.max(0, events.length - 1) * M.eventGap\n );\n }),\n );\n const periodY = hasSections ? headerHeight + M.sectionGap : 0;\n\n const periods = new Map<string, TimelinePeriodBox>();\n const sections = new Map<string, TimelineSectionBox>();\n const events: TimelineEventBox[] = [];\n const eventLines: TimelineGeometry[\"eventLines\"] = [];\n const addEvent = new Map<string, { x: number; y: number }>();\n const spans: SectionSpan[] = [];\n\n const centreOf = (id: string): number => {\n const p = periods.get(id);\n return p ? p.x + p.width / 2 : 0;\n };\n let x = 0;\n let index = 0;\n const place = (node: GraphNode, colour: TimelineColour) => {\n const height = Math.max(textBoxHeight(node.label ?? node.id), rowHeight);\n periods.set(node.id, { id: node.id, x, y: periodY, width: M.nodeWidth, height, colour, index });\n let y = periodY + M.eventOffset;\n eventsOf(node).forEach((text, i) => {\n const h = Math.max(textBoxHeight(text), M.eventMinHeight);\n events.push({\n periodId: node.id,\n index: i,\n text,\n colour,\n x,\n y,\n width: M.nodeWidth,\n height: h,\n });\n y += h + M.eventGap;\n });\n const centre = x + M.nodeWidth / 2;\n addEvent.set(node.id, { x: centre, y: y - M.eventGap + 14 });\n eventLines.push({\n periodId: node.id,\n x: centre,\n y1: periodY + height,\n y2: periodY + rowHeight + M.eventOffset + eventStack,\n });\n index++;\n x += M.columnStep;\n };\n\n // Periods before the first section: Mermaid skips them once there are\n // sections; the canvas keeps them (in Mermaid's \"root\" colour) so they stay editable.\n const loose = graph.nodes.filter((n) => !inGroup(n));\n if (loose.length) {\n const x0 = x;\n loose.forEach((n, i) => place(n, hasSections ? \"root\" : i % M.colours));\n spans.push({ x0, x1: x, items: loose.map((n) => ({ id: n.id, centre: centreOf(n.id) })) });\n }\n groups.forEach((g, s) => {\n const members = graph.nodes.filter((n) => n.parentId === g.id);\n const x0 = x;\n const colour = s % M.colours;\n if (members.length) members.forEach((n) => place(n, colour));\n else x += M.columnStep;\n const width = M.columnStep * Math.max(members.length, 1) - 10;\n sections.set(g.id, {\n id: g.id,\n x: x0,\n y: 0,\n width,\n height: Math.max(textBoxHeight(g.label, width - 2 * M.padding), headerHeight),\n colour,\n empty: !members.length,\n });\n spans.push({\n section: g.id,\n x0,\n x1: x,\n items: members.map((n) => ({ id: n.id, centre: centreOf(n.id) })),\n });\n });\n const width = Math.max(0, x - (M.columnStep - M.nodeWidth));\n const axisY = periodY + rowHeight + M.axisGap;\n const bottom = Math.max(\n axisY,\n ...eventLines.map((l) => l.y2),\n ...events.map((e) => e.y + e.height),\n );\n return {\n periods,\n sections,\n events,\n eventLines,\n addEvent,\n axis: { x1: -M.axisBefore, x2: width + M.axisAfter, y: axisY },\n // Mermaid: `x = box.width / 2 - leftMargin` with the content starting at\n // 50 + leftMargin (leftMargin 150), baseline at y = 20 (30 above the content).\n title: { x: width / 2 - 350, baseline: -30 },\n spans,\n hasSections,\n width,\n height: bottom,\n };\n}\n","import type { DiagramGraph, EditOp, GraphNode, Point } from \"../types.js\";\nimport { registerFamilyLayout, type FamilyLayout, type Size } from \"../layout-registry.js\";\nimport {\n createStatementAdapter,\n indentOf,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\nimport {\n buildSectionsModel,\n cleanText,\n editSections,\n formatSectionsLine,\n joinAccDescrBlocks,\n moveSectionItem,\n parseSectionsLine,\n sectionDropTarget,\n sectionGroups,\n sectionsTitle,\n sequenceEdges,\n type RawStatement,\n type SectionStatement,\n type SectionsSpec,\n type TitleStatement,\n} from \"../statements/sections.js\";\nimport { timelineGeometry } from \"./geometry.js\";\n\n/**\n * `timeline` adapter.\n *\n * ```\n * timeline\n * title Platform milestones\n * 2024 : Unified portal launched\n * : Design system v1\n * section Later\n * 2025 : AI chat assistant : Generative forms\n * ```\n *\n * Canvas model: one node per period (shape `rounded`, `data.events`),\n * sections as groups and synthetic \"next\" edges between consecutive periods\n * (not editable; the canvas does not draw them, as Mermaid has no such\n * arrows). Positions derive from the order of the periods (see\n * `./geometry`): moving a period (`moveNodes`) reorders it, possibly into\n * another section, instead of storing a position. A period line and the continuation lines that follow it\n * directly (` : more`) form ONE statement whose `raw` keeps the original\n * line breaks; when edited it is re-emitted with the colons aligned under the\n * period's colon. Period ids are slugs of the period text (`2024` → `2024`).\n *\n * @module\n */\n\n/** A period with its events (possibly spanning several physical lines). */\nexport interface TimelinePeriod extends BaseStatement {\n kind: \"period\";\n period: string;\n events: string[];\n}\n\nexport type TimelineStatement = RawStatement | TitleStatement | SectionStatement | TimelinePeriod;\n\n/** Keywords and comments that are never periods. */\nconst NOT_PERIOD = /^(title\\b|section\\b|accTitle\\b|accDescr\\b|%%|#|:)/i;\n/** A continuation line: `: event`. */\nconst CONTINUATION = /^\\s*:\\s/;\n/** The timeline lexer reads periods as `[^#:\\n]+`. */\nconst PERIOD_FORBIDDEN = /[#:]/;\n\nfunction isPeriodLine(line: string): boolean {\n const text = line.trim();\n return !!text && !NOT_PERIOD.test(text);\n}\n\n/** Splits `: a : b` into events; `null` when the text is not an event list. */\nfunction splitEvents(text: string): string[] | null {\n if (!text.trim()) return [];\n if (!/^:\\s/.test(text) && text.trim() !== \":\") return null;\n return text\n .split(/:(?=\\s|$)/)\n .slice(1)\n .map((e) => e.trim())\n .filter(Boolean);\n}\n\n/** An event may not contain `:` followed by whitespace (it would start a new event). */\nfunction cleanEvent(event: string): string {\n return cleanText(event.replace(/:(?=\\s|$)/g, \" -\"));\n}\n\nfunction cleanEvents(events: unknown): string[] {\n if (!Array.isArray(events)) return [];\n return events\n .flatMap((e) => String(e).split(/\\r?\\n/))\n .map(cleanEvent)\n .filter(Boolean);\n}\n\nconst spec: SectionsSpec<TimelineStatement, TimelinePeriod> = {\n isItem: (s): s is TimelinePeriod => s.kind === \"period\",\n itemText: (p) => p.period,\n fallbackId: \"period\",\n sectionForbidden: /:/,\n createItem(node, { indent }) {\n const period = cleanText(node.label ?? node.id ?? \"\", PERIOD_FORBIDDEN) || \"New period\";\n const events = node.data?.events !== undefined ? cleanEvents(node.data.events) : [\"Event\"];\n return { kind: \"period\", raw: \"\", indent, period, events, dirty: true };\n },\n renameItem(p, label) {\n const period = cleanText(label, PERIOD_FORBIDDEN);\n if (!period) return false;\n p.period = period;\n p.dirty = true;\n return true;\n },\n};\n\n/** Dragging a period sideways moves it to the column it is dropped on. */\nfunction reorderPeriods(op: EditOp, ctx: EditContext<TimelineStatement>): boolean {\n if (op.type !== \"moveNodes\") return false;\n const geometry = timelineGeometry(ctx.doc.graph);\n let handled = false;\n for (const { id, position } of op.moves) {\n const period = geometry.periods.get(id);\n if (!period) {\n // Section headers follow their periods.\n if (geometry.sections.has(id)) handled = true;\n continue;\n }\n handled = true;\n const slot = sectionDropTarget(geometry.spans, id, position[0] + period.width / 2);\n if (slot) moveSectionItem(ctx, spec, id, slot);\n }\n return handled;\n}\n\nexport const timelineGrammar: StatementGrammar<TimelineStatement> = {\n family: \"timeline\",\n titleAsStatement: true,\n defaultIndent: \" \",\n interceptMeta: reorderPeriods,\n\n /** A period line absorbs the continuation lines (`: event`) right after it. */\n joinLines(lines) {\n const out: string[] = [];\n let open = false;\n for (const line of joinAccDescrBlocks(lines)) {\n if (open && CONTINUATION.test(line)) {\n out[out.length - 1] += `\\n${line}`;\n continue;\n }\n open = !line.includes(\"\\n\") && isPeriodLine(line);\n out.push(line);\n }\n return out;\n },\n\n parseLine(line) {\n const indent = indentOf(line);\n const shared = parseSectionsLine(line, indent);\n if (shared) return shared;\n const [first, ...rest] = line.split(\"\\n\");\n if (isPeriodLine(first!)) {\n const text = first!.trim();\n const colon = text.indexOf(\":\");\n const period = (colon === -1 ? text : text.slice(0, colon)).trim();\n const events = splitEvents(colon === -1 ? \"\" : text.slice(colon));\n const more = rest.map((l) => splitEvents(l.trim()));\n if (period && events && more.every(Boolean))\n return {\n kind: \"period\",\n raw: line,\n indent,\n period,\n events: [...events, ...more.flatMap((e) => e!)],\n };\n }\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n if (stmt.kind !== \"period\") return formatSectionsLine(stmt) ?? stmt.raw;\n const [first, ...rest] = stmt.events;\n if (first === undefined) return `${stmt.indent}${stmt.period}`;\n const pad = `${stmt.indent}${\" \".repeat(stmt.period.length)}`;\n return [`${stmt.indent}${stmt.period} : ${first}`, ...rest.map((e) => `${pad} : ${e}`)].join(\n \"\\n\",\n );\n },\n\n buildGraph(statements, ctx) {\n const model = buildSectionsModel(statements, spec);\n const nodes: GraphNode[] = model.items.map(({ stmt, id, section }) => ({\n id,\n label: stmt.period,\n shape: \"rounded\",\n parentId: section?.id,\n classes: [],\n styles: [],\n data: { events: stmt.events, details: stmt.events },\n }));\n const graph: DiagramGraph = {\n direction: /\\bTD\\b/i.test(ctx.header) ? \"TB\" : \"LR\",\n nodes,\n edges: sequenceEdges(model),\n groups: sectionGroups(model),\n classDefs: {},\n title: sectionsTitle(statements) ?? ctx.frontmatterTitle,\n };\n return { graph };\n },\n\n edit(op, ctx) {\n return editSections(op, ctx, spec, (op, model) => {\n if (op.type !== \"setNodeData\") return undefined;\n const period = model.itemById.get(op.id)?.stmt;\n if (!period || !Array.isArray(op.data.events)) return false;\n period.events = cleanEvents(op.data.events);\n period.dirty = true;\n return true;\n });\n },\n};\n\nexport const timelineAdapter = createStatementAdapter(timelineGrammar);\n\n/**\n * Mermaid's geometry: periods in one row (in document order) under their\n * section headers; stored positions are ignored.\n */\nexport const timelineLayout: FamilyLayout = (graph) => {\n const geometry = timelineGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const box of [...geometry.periods.values(), ...geometry.sections.values()]) {\n positions[box.id] = [box.x, box.y];\n sizes[box.id] = { width: box.width, height: box.height };\n }\n return { positions, sizes };\n};\n\nregisterFamilyLayout(\"timeline\", timelineLayout);\n","import type { DiagramGraph, GraphNode } from \"../types.js\";\nimport type { SectionSpan } from \"../statements/sections.js\";\n\n/**\n * Geometry of a user journey as Mermaid draws it (`journeyRenderer.ts`): an\n * actor legend on the left, section bars on top, one 150×50 task box per\n * column below them, a dashed line down from each task to its face (higher\n * score = higher face, 30px per point), and a thick axis between the tasks\n * and the faces. Shared by the layout (task and section boxes), the adapter\n * (dragging a task sideways reorders it) and the React canvas (faces, lines,\n * legend, axis, title), so all three agree.\n *\n * Coordinates are Mermaid's own (the legend starts at x = 0, the title\n * baseline is at y = 25).\n *\n * @module\n */\n\n/** Mermaid's `journey` config defaults and renderer constants, in canvas pixels. */\nexport const JOURNEY_METRICS = {\n leftMargin: 150,\n taskWidth: 150,\n taskHeight: 50,\n /** `width + taskMargin`: distance between the left edges of two tasks. */\n taskStep: 200,\n sectionY: 50,\n /** `height * 2 + diagramMarginY`. */\n taskY: 110,\n /** Centre of a score-5 face; each point lower is 30px further down. */\n faceTop: 300,\n faceStep: 30,\n faceRadius: 15,\n /** Bottom of the dashed task lines (`300 + 5 * 30`). */\n lineBottom: 450,\n /** `height * 4`. */\n axisY: 200,\n axisWidth: 4,\n legendX: 20,\n legendY: 60,\n legendStep: 20,\n /** Legend labels start at `40 + 2 * boxTextMargin`. */\n legendTextX: 50,\n actorRadius: 7,\n /** Actor dots on a task: first centre 14px in, then every 10px. */\n actorInset: 14,\n actorStep: 10,\n titleBaseline: 25,\n fontSize: 16,\n /** `journey.sectionFills` has 7 entries; sections cycle through `fillType0…6`. */\n sectionColours: 7,\n /** `journey.actorColours` has 6 entries. */\n actorColours: 6,\n} as const;\n\nconst M = JOURNEY_METRICS;\n\nexport interface JourneyBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface JourneyTaskBox extends JourneyBox {\n id: string;\n /** `fillType` slot of the task's section. */\n colour: number;\n score: number;\n /** Centre of the face. */\n face: { x: number; y: number };\n /** Actor dots across the top edge, with their legend slot. */\n actors: { name: string; colour: number; x: number; y: number }[];\n index: number;\n}\n\nexport interface JourneySectionBox extends JourneyBox {\n id: string;\n colour: number;\n /** Mermaid draws no bar for a section without tasks; the canvas parks one after the tasks. */\n empty: boolean;\n}\n\nexport interface JourneyGeometry {\n tasks: Map<string, JourneyTaskBox>;\n sections: Map<string, JourneySectionBox>;\n /** Actors in Mermaid's order (sorted), with their legend dot and label positions. */\n legend: { name: string; colour: number; x: number; y: number; labelX: number }[];\n /** `leftMargin` plus the widest legend label when it exceeds half of it. */\n left: number;\n axis: { x1: number; x2: number; y: number };\n title: { x: number; baseline: number };\n spans: SectionSpan[];\n width: number;\n height: number;\n}\n\nlet measurer: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Width of text in Mermaid's default font: measured with a canvas in a\n * browser, estimated (0.47em per character) elsewhere (tests, SSR, jsdom).\n */\nexport function textWidth(text: string, fontSize: number = M.fontSize, bold = false): number {\n if (measurer === undefined) {\n measurer = null;\n const browser =\n typeof document !== \"undefined\" &&\n typeof navigator !== \"undefined\" &&\n !/jsdom/i.test(navigator.userAgent);\n if (browser)\n try {\n measurer = document.createElement(\"canvas\").getContext(\"2d\");\n } catch {\n measurer = null;\n }\n }\n if (!measurer) return text.length * fontSize * 0.47;\n measurer.font = `${bold ? \"bold \" : \"\"}${fontSize}px \"trebuchet ms\", verdana, arial, sans-serif`;\n return measurer.measureText(text).width;\n}\n\n/** Score clamped to Mermaid's 1–5 range for drawing. */\nexport function faceY(score: number): number {\n return M.faceTop + (5 - score) * M.faceStep;\n}\n\n/** The whole score (1–5) whose face row is nearest to `y`. */\nexport function scoreAt(y: number): number {\n return Math.min(5, Math.max(1, Math.round(5 - (y - M.faceTop) / M.faceStep)));\n}\n\nfunction actorsOf(node: GraphNode): string[] {\n const actors = node.data?.actors;\n return Array.isArray(actors) ? actors.map(String) : [];\n}\n\nexport function journeyGeometry(graph: DiagramGraph): JourneyGeometry {\n // Mermaid: unique actors of all tasks, sorted; colours follow that order.\n const names = [...new Set(graph.nodes.flatMap(actorsOf))].sort();\n const slot = new Map(names.map((n, i) => [n, i]));\n const legend = names.map((name, i) => ({\n name,\n colour: i % M.actorColours,\n x: M.legendX,\n y: M.legendY + i * M.legendStep,\n labelX: M.legendTextX,\n }));\n const widest = Math.max(0, ...names.map((n) => textWidth(n)));\n const left = M.leftMargin + (widest > M.leftMargin / 2 ? widest : 0);\n\n const groups = graph.groups;\n const inGroup = (n: GraphNode) => !!n.parentId && groups.some((g) => g.id === n.parentId);\n // Mermaid's columns follow document order; the graph lists the tasks\n // before the first section first, then each section's tasks.\n const ordered = [\n ...graph.nodes.filter((n) => !inGroup(n)),\n ...groups.flatMap((g) => graph.nodes.filter((n) => n.parentId === g.id)),\n ];\n const tasks = new Map<string, JourneyTaskBox>();\n const colourOf = new Map<string | undefined, number>();\n let drawn = 0;\n for (const g of groups)\n if (graph.nodes.some((n) => n.parentId === g.id))\n colourOf.set(g.id, drawn++ % M.sectionColours);\n ordered.forEach((n, i) => {\n const x = left + i * M.taskStep;\n const score = typeof n.data?.score === \"number\" ? n.data.score : 0;\n const cx = x + M.taskWidth / 2;\n tasks.set(n.id, {\n id: n.id,\n x,\n y: M.taskY,\n width: M.taskWidth,\n height: M.taskHeight,\n // Tasks before the first section get Mermaid's default slot 0.\n colour: inGroup(n) ? (colourOf.get(n.parentId) ?? 0) : 0,\n score,\n face: { x: cx, y: faceY(score) },\n actors: actorsOf(n)\n .filter((a) => slot.has(a))\n .map((name, k) => ({\n name,\n colour: slot.get(name)! % M.actorColours,\n x: x + M.actorInset + k * M.actorStep,\n y: M.taskY,\n })),\n index: i,\n });\n });\n\n const sections = new Map<string, JourneySectionBox>();\n const spans: SectionSpan[] = [];\n const looseIds = ordered.filter((n) => !inGroup(n)).map((n) => n.id);\n const centre = (id: string) => tasks.get(id)!.x + M.taskWidth / 2;\n if (looseIds.length)\n spans.push({\n x0: left,\n x1: left + looseIds.length * M.taskStep,\n items: looseIds.map((id) => ({ id, centre: centre(id) })),\n });\n let parked = ordered.length;\n for (const g of groups) {\n const members = ordered.filter((n) => n.parentId === g.id).map((n) => n.id);\n const first = members.length ? tasks.get(members[0]!)!.index : parked++;\n const x = left + first * M.taskStep;\n const count = Math.max(members.length, 1);\n sections.set(g.id, {\n id: g.id,\n x,\n y: M.sectionY,\n width: M.taskWidth * count + (M.taskStep - M.taskWidth) * (count - 1),\n height: M.taskHeight,\n colour: colourOf.get(g.id) ?? 0,\n empty: !members.length,\n });\n spans.push({\n section: g.id,\n x0: x,\n x1: x + count * M.taskStep,\n items: members.map((id) => ({ id, centre: centre(id) })),\n });\n }\n spans.sort((a, b) => a.x0 - b.x0);\n\n // Mermaid: from `leftMargin` to `width - leftMargin - 4`, i.e. 196px past the last task's left edge.\n const last = left + (ordered.length - 1) * M.taskStep;\n const width = Math.max(left + Math.max(parked, 1) * M.taskStep, left + M.taskStep);\n return {\n tasks,\n sections,\n legend,\n left,\n axis: { x1: left, x2: ordered.length ? last + 196 : left + 96, y: M.axisY },\n title: { x: left, baseline: M.titleBaseline },\n spans,\n width,\n height: M.lineBottom + M.faceRadius,\n };\n}\n","import type { DiagramGraph, EditOp, GraphNode, Point } from \"../types.js\";\nimport { registerFamilyLayout, type FamilyLayout, type Size } from \"../layout-registry.js\";\nimport {\n createStatementAdapter,\n indentOf,\n type BaseStatement,\n type EditContext,\n type StatementGrammar,\n} from \"../statements/base.js\";\nimport {\n buildSectionsModel,\n cleanText,\n editSections,\n formatSectionsLine,\n joinAccDescrBlocks,\n moveSectionItem,\n parseSectionsLine,\n sectionDropTarget,\n sectionGroups,\n sectionsTitle,\n sequenceEdges,\n type RawStatement,\n type SectionStatement,\n type SectionsSpec,\n type TitleStatement,\n} from \"../statements/sections.js\";\nimport { journeyGeometry } from \"./geometry.js\";\n\n/**\n * `journey` (user journey) adapter.\n *\n * ```\n * journey\n * title Requesting a new laptop\n * section Discover\n * Find IT portal: 3: Employee\n * Read policy: 2: Employee, IT\n * ```\n *\n * Canvas model: one node per task (shape `rect`, `data.score` 1–5,\n * `data.actors`), sections as groups and synthetic \"next\" edges between\n * consecutive tasks (not editable; the canvas does not draw them, as Mermaid\n * has no such arrows). Positions derive from the order of the tasks (see\n * `./geometry`): moving a task (`moveNodes`) reorders it, possibly into\n * another section, instead of storing a position. Task ids are slugs of the task names\n * (`Find IT portal` → `Find_IT_portal`), made unique with `_2`, `_3`….\n *\n * @module\n */\n\n/** A task line: `Name: score: actor1, actor2`. */\nexport interface JourneyTask extends BaseStatement {\n kind: \"task\";\n name: string;\n score: number;\n actors: string[];\n}\n\nexport type JourneyStatement = RawStatement | TitleStatement | SectionStatement | JourneyTask;\n\n/** Lines Mermaid reads as keywords even though they contain a colon. */\nconst KEYWORD = /^(accTitle|accDescr|%%|#)/i;\nconst TASK = /^([^#:;]+?)\\s*:\\s*(\\d+(?:\\.\\d+)?)\\s*(?::([^#;]*))?$/;\n/** Characters the journey lexer does not allow in names (`[^#:\\n;]+`). */\nconst NAME_FORBIDDEN = /[#:;]/;\n\nfunction clampScore(value: number): number {\n return Math.min(5, Math.max(1, Math.round(value)));\n}\n\nfunction details(score: number, actors: string[]): string[] {\n return [`Score ${score}`, actors.join(\", \")].filter(Boolean);\n}\n\nfunction cleanActors(actors: unknown): string[] {\n if (!Array.isArray(actors)) return [];\n return actors\n .map((a) => cleanText(String(a), /[#:;,]/))\n .filter((a, i, all) => a && all.indexOf(a) === i);\n}\n\nconst spec: SectionsSpec<JourneyStatement, JourneyTask> = {\n isItem: (s): s is JourneyTask => s.kind === \"task\",\n itemText: (t) => t.name,\n fallbackId: \"task\",\n sectionForbidden: NAME_FORBIDDEN,\n titleForbidden: /[#;]/,\n createItem(node, { indent }) {\n const name = cleanText(node.label ?? node.id ?? \"\", NAME_FORBIDDEN) || \"New task\";\n const score = typeof node.data?.score === \"number\" ? clampScore(node.data.score) : 3;\n return {\n kind: \"task\",\n raw: \"\",\n indent,\n name,\n score,\n actors: cleanActors(node.data?.actors),\n dirty: true,\n };\n },\n renameItem(task, label) {\n const name = cleanText(label, NAME_FORBIDDEN);\n if (!name) return false;\n task.name = name;\n task.dirty = true;\n return true;\n },\n};\n\n/** Dragging a task sideways moves it to the column it is dropped on. */\nfunction reorderTasks(op: EditOp, ctx: EditContext<JourneyStatement>): boolean {\n if (op.type !== \"moveNodes\") return false;\n const geometry = journeyGeometry(ctx.doc.graph);\n let handled = false;\n for (const { id, position } of op.moves) {\n const task = geometry.tasks.get(id);\n if (!task) {\n // Section bars follow their tasks.\n if (geometry.sections.has(id)) handled = true;\n continue;\n }\n handled = true;\n const slot = sectionDropTarget(geometry.spans, id, position[0] + task.width / 2);\n if (slot) moveSectionItem(ctx, spec, id, slot);\n }\n return handled;\n}\n\nexport const journeyGrammar: StatementGrammar<JourneyStatement> = {\n family: \"journey\",\n titleAsStatement: true,\n defaultIndent: \" \",\n joinLines: joinAccDescrBlocks,\n interceptMeta: reorderTasks,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n const shared = parseSectionsLine(line, indent);\n if (shared) return shared;\n let m: RegExpExecArray | null;\n if (!KEYWORD.test(text) && (m = TASK.exec(text)))\n return {\n kind: \"task\",\n raw: line,\n indent,\n name: m[1]!.trim(),\n score: Number(m[2]),\n actors: (m[3] ?? \"\")\n .split(\",\")\n .map((a) => a.trim())\n .filter(Boolean),\n };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n if (stmt.kind === \"task\")\n return `${stmt.indent}${stmt.name}: ${stmt.score}${stmt.actors.length ? `: ${stmt.actors.join(\", \")}` : \"\"}`;\n return formatSectionsLine(stmt) ?? stmt.raw;\n },\n\n buildGraph(statements, ctx) {\n const model = buildSectionsModel(statements, spec);\n const nodes: GraphNode[] = model.items.map(({ stmt, id, section }) => ({\n id,\n label: stmt.name,\n shape: \"rect\",\n parentId: section?.id,\n classes: [],\n styles: [],\n data: { score: stmt.score, actors: stmt.actors, details: details(stmt.score, stmt.actors) },\n }));\n const graph: DiagramGraph = {\n direction: \"LR\",\n nodes,\n edges: sequenceEdges(model),\n groups: sectionGroups(model),\n classDefs: {},\n title: sectionsTitle(statements) ?? ctx.frontmatterTitle,\n };\n return { graph };\n },\n\n edit(op, ctx) {\n return editSections(op, ctx, spec, (op, model) => {\n if (op.type !== \"setNodeData\") return undefined;\n const task = model.itemById.get(op.id)?.stmt;\n if (!task) return false;\n let changed = false;\n if (typeof op.data.score === \"number\" && Number.isFinite(op.data.score)) {\n task.score = clampScore(op.data.score);\n changed = true;\n }\n if (Array.isArray(op.data.actors)) {\n task.actors = cleanActors(op.data.actors);\n changed = true;\n }\n if (changed) task.dirty = true;\n return changed;\n });\n },\n};\n\nexport const journeyAdapter = createStatementAdapter(journeyGrammar);\n\n/**\n * Mermaid's geometry: tasks in one row (in document order) under their\n * section bars; stored positions are ignored.\n */\nexport const journeyLayout: FamilyLayout = (graph) => {\n const geometry = journeyGeometry(graph);\n const positions: Record<string, Point> = {};\n const sizes: Record<string, Size> = {};\n for (const box of [...geometry.tasks.values(), ...geometry.sections.values()]) {\n positions[box.id] = [box.x, box.y];\n sizes[box.id] = { width: box.width, height: box.height };\n }\n return { positions, sizes };\n};\n\nregisterFamilyLayout(\"journey\", journeyLayout);\n","import { registerFamilyLayout, sharedFrameLayout, XY_CHART_BOX } from \"../layout-registry.js\";\nimport type { DiagramGraph, GraphNode } from \"../types.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n quote,\n splitOutsideQuotes,\n unquote,\n type BaseStatement,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * `xychart-beta` adapter.\n *\n * ```\n * xychart-beta\n * title \"Sales revenue\"\n * x-axis [jan, feb, mar]\n * y-axis \"Revenue (in $)\" 4000 --> 11000\n * bar [5000, 6000, 7500]\n * line \"Target\" [5500, 6500, 7000]\n * ```\n *\n * Canvas model: one node per series (shape `bar` or `line`, `data.values`\n * in x-axis order), no edges, no groups. Series ids are their kind and\n * ordinal (`bar1`, `bar2`, `line1`), so a rename keeps the id; the label is\n * the series title, or `Bar 1` / `Line 1` when it has none\n * (`data.titled: false`). The axes and orientation are diagram data:\n * `graph.data` holds `categories` (the x-axis bands), `xTitle`, `xMin` /\n * `xMax` (a numeric x-axis), `yTitle`, `yMin` / `yMax` and `horizontal`.\n *\n * Drawn with the chart module (`@pixerate/editor/canvas` family scenes); every series\n * node shares the chart frame.\n *\n * @module\n */\n\nexport type XySeriesKind = \"bar\" | \"line\";\n\nexport type XyStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string })\n | (BaseStatement & {\n kind: \"xaxis\";\n title?: string;\n categories?: string[];\n range?: [number, number];\n })\n | (BaseStatement & { kind: \"yaxis\"; title?: string; range?: [number, number] })\n | (BaseStatement & { kind: \"series\"; series: XySeriesKind; title?: string; values: number[] });\n\ntype Series = Extract<XyStatement, { kind: \"series\" }>;\ntype XAxis = Extract<XyStatement, { kind: \"xaxis\" }>;\ntype YAxis = Extract<XyStatement, { kind: \"yaxis\" }>;\n\nconst HEADER = /^(\\s*)(xychart(?:-beta)?)(?:\\s+(horizontal|vertical))?\\s*$/i;\nconst NUMBER = /^-?\\d+(?:\\.\\d+)?$/;\nconst RANGE = /^(-?\\d+(?:\\.\\d+)?)\\s*-->\\s*(-?\\d+(?:\\.\\d+)?)$/;\n\nfunction parseHeader(header: string): { keyword: string; horizontal: boolean } {\n const m = HEADER.exec(header);\n return { keyword: m?.[2] ?? \"xychart-beta\", horizontal: m?.[3]?.toLowerCase() === \"horizontal\" };\n}\n\nfunction formatHeader(header: string, horizontal: boolean): string {\n const { keyword } = parseHeader(header);\n return `${indentOf(header)}${keyword}${horizontal ? \" horizontal\" : \"\"}`;\n}\n\n/** Splits a leading axis / series title (`\"Revenue\"` or one word) from the rest. */\nfunction takeTitle(text: string): { title?: string; rest: string } {\n const t = text.trim();\n if (t.startsWith('\"')) {\n const end = t.indexOf('\"', 1);\n if (end > 0) return { title: t.slice(1, end), rest: t.slice(end + 1).trim() };\n }\n if (!t || t.startsWith(\"[\") || RANGE.test(t) || NUMBER.test(t.split(/\\s/)[0]!))\n return { rest: t };\n const m = /^(\\S+)\\s*(.*)$/.exec(t)!;\n return { title: m[1], rest: m[2]!.trim() };\n}\n\nfunction parseList(text: string): string[] | undefined {\n const m = /^\\[(.*)\\]$/s.exec(text.trim());\n if (!m) return undefined;\n if (!m[1]!.trim()) return [];\n return splitOutsideQuotes(m[1]!, \",\").map((x) => unquote(x.trim()));\n}\n\nfunction parseRange(text: string): [number, number] | undefined {\n const m = RANGE.exec(text.trim());\n return m ? [Number(m[1]), Number(m[2])] : undefined;\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : String(Math.round(value * 1000) / 1000);\n}\n\n/** A category or title as Mermaid's `text`: bare when it is one plain word. */\nfunction formatText(text: string): string {\n return /^[A-Za-z0-9_]+$/.test(text) ? text : quote(text);\n}\n\nfunction formatRange(range: [number, number]): string {\n return `${formatNumber(range[0])} --> ${formatNumber(range[1])}`;\n}\n\nfunction seriesIds(statements: XyStatement[]): Map<Series, string> {\n const counts: Record<XySeriesKind, number> = { bar: 0, line: 0 };\n const ids = new Map<Series, string>();\n for (const s of statements) {\n if (s.kind === \"series\") ids.set(s, `${s.series}${++counts[s.series]}`);\n }\n return ids;\n}\n\nfunction finiteNumbers(value: unknown): number[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const nums = value.map(Number);\n return nums.every((n) => Number.isFinite(n)) ? nums : undefined;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n const n = typeof value === \"string\" && value.trim() === \"\" ? NaN : Number(value);\n return value === undefined || value === null || !Number.isFinite(n) ? undefined : n;\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n\nexport const xyChartGrammar: StatementGrammar<XyStatement> = {\n family: \"xychart\",\n titleAsStatement: true,\n defaultIndent: \" \",\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if ((m = /^title\\s+(.+)$/i.exec(text)))\n return { kind: \"title\", raw: line, indent, title: unquote(m[1]!.trim()) };\n if ((m = /^x-axis\\b(.*)$/i.exec(text))) {\n const { title, rest } = takeTitle(m[1]!);\n const categories = parseList(rest);\n const range = categories ? undefined : parseRange(rest);\n if (rest && !categories && !range) return { kind: \"raw\", raw: line, indent };\n return { kind: \"xaxis\", raw: line, indent, title, categories, range };\n }\n if ((m = /^y-axis\\b(.*)$/i.exec(text))) {\n const { title, rest } = takeTitle(m[1]!);\n const range = parseRange(rest);\n if (rest && !range) return { kind: \"raw\", raw: line, indent };\n return { kind: \"yaxis\", raw: line, indent, title, range };\n }\n if ((m = /^(bar|line)\\b(.*)$/i.exec(text))) {\n const { title, rest } = takeTitle(m[2]!);\n const list = parseList(rest);\n const values = list?.map(Number);\n if (!values || values.some((v) => !Number.isFinite(v)))\n return { kind: \"raw\", raw: line, indent };\n const series = m[1]!.toLowerCase() as XySeriesKind;\n return { kind: \"series\", raw: line, indent, series, title, values };\n }\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n switch (stmt.kind) {\n case \"title\":\n return `${stmt.indent}title ${quote(stmt.title)}`;\n case \"xaxis\": {\n let out = `${stmt.indent}x-axis`;\n if (stmt.title) out += ` ${quote(stmt.title)}`;\n if (stmt.categories) out += ` [${stmt.categories.map(formatText).join(\", \")}]`;\n else if (stmt.range) out += ` ${formatRange(stmt.range)}`;\n return out;\n }\n case \"yaxis\": {\n let out = `${stmt.indent}y-axis`;\n if (stmt.title) out += ` ${quote(stmt.title)}`;\n if (stmt.range) out += ` ${formatRange(stmt.range)}`;\n return out;\n }\n case \"series\":\n return `${stmt.indent}${stmt.series}${stmt.title ? ` ${quote(stmt.title)}` : \"\"} [${stmt.values.map(formatNumber).join(\", \")}]`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const ids = seriesIds(statements);\n const nodes: GraphNode[] = [];\n let title: string | undefined;\n let xAxis: XAxis | undefined;\n let yAxis: YAxis | undefined;\n for (const s of statements) {\n if (s.kind === \"title\") title = s.title;\n else if (s.kind === \"xaxis\") xAxis = s;\n else if (s.kind === \"yaxis\") yAxis = s;\n else if (s.kind === \"series\") {\n const id = ids.get(s)!;\n const ordinal = id.slice(s.series.length);\n nodes.push({\n id,\n label: s.title ?? `${s.series === \"bar\" ? \"Bar\" : \"Line\"} ${ordinal}`,\n shape: s.series,\n classes: [],\n styles: [],\n data: {\n values: s.values,\n titled: s.title !== undefined,\n details: [s.values.map(formatNumber).join(\", \")],\n },\n });\n }\n }\n const graph: DiagramGraph = {\n direction: \"LR\",\n nodes,\n edges: [],\n groups: [],\n classDefs: {},\n title: title ?? ctx.frontmatterTitle,\n data: {\n categories: xAxis?.categories ?? [],\n xTitle: xAxis?.title,\n xMin: xAxis?.range?.[0],\n xMax: xAxis?.range?.[1],\n yTitle: yAxis?.title,\n yMin: yAxis?.range?.[0],\n yMax: yAxis?.range?.[1],\n horizontal: parseHeader(ctx.header).horizontal,\n },\n };\n return { graph };\n },\n\n edit(op, ctx) {\n const { statements, doc, indent } = ctx;\n const ids = seriesIds(statements);\n const byId = new Map<string, Series>();\n for (const [s, id] of ids) byId.set(id, s);\n const lastIndex = (pred: (s: XyStatement) => boolean) => {\n let idx = -1;\n statements.forEach((s, i) => {\n if (pred(s)) idx = i;\n });\n return idx;\n };\n /** The x- or y-axis statement, inserted after the title / x-axis when missing. */\n const axis = <K extends \"xaxis\" | \"yaxis\">(kind: K) => {\n const found = statements.find((s) => s.kind === kind);\n if (found) return found as Extract<XyStatement, { kind: K }>;\n const after =\n kind === \"xaxis\"\n ? lastIndex((s) => s.kind === \"title\")\n : lastIndex((s) => s.kind === \"title\" || s.kind === \"xaxis\");\n const stmt = { kind, raw: \"\", indent, dirty: true } as Extract<XyStatement, { kind: K }>;\n statements.splice(after + 1, 0, stmt);\n return stmt;\n };\n switch (op.type) {\n case \"addNode\": {\n const series: XySeriesKind = op.node.shape === \"line\" ? \"line\" : \"bar\";\n const existing = [...byId.values()];\n const width =\n (statements.find((s) => s.kind === \"xaxis\") as XAxis | undefined)?.categories?.length ||\n existing[0]?.values.length ||\n 3;\n const all = existing.flatMap((s) => s.values);\n const fill = all.length ? all.reduce((a, b) => a + b, 0) / all.length : 10;\n const values =\n finiteNumbers(op.node.data?.values) ??\n Array.from({ length: width }, () => Math.round(fill));\n const stmt: Series = {\n kind: \"series\",\n raw: \"\",\n indent,\n series,\n title: optionalText(op.node.label),\n values,\n dirty: true,\n };\n // Series are drawn from the data; a drop position means nothing.\n statements.splice(lastIndex((s) => s.kind !== \"raw\") + 1, 0, stmt);\n return true;\n }\n case \"removeNodes\": {\n const remove = new Set(op.ids.map((id) => byId.get(id)).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as Series));\n dropMetaKeys(ctx.meta, op.ids);\n return true;\n }\n case \"renameNode\": {\n const s = byId.get(op.id);\n if (!s) return false;\n s.title = optionalText(op.label);\n s.dirty = true;\n return true;\n }\n case \"setNodeShape\": {\n const s = byId.get(op.id);\n if (!s || (op.shape !== \"bar\" && op.shape !== \"line\")) return false;\n s.series = op.shape;\n s.dirty = true;\n return true;\n }\n case \"setNodeData\": {\n const s = byId.get(op.id);\n const values = finiteNumbers(op.data.values);\n if (!s || !values) return false;\n s.values = values;\n s.dirty = true;\n return true;\n }\n case \"setTitle\": {\n const idx = statements.findIndex((s) => s.kind === \"title\");\n if (op.title === undefined || op.title === \"\") {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as Extract<XyStatement, { kind: \"title\" }>;\n s.title = op.title;\n s.dirty = true;\n } else statements.unshift({ kind: \"title\", raw: \"\", indent, title: op.title, dirty: true });\n return true;\n }\n case \"setGraphData\": {\n const d = op.data;\n let changed = false;\n if (typeof d.horizontal === \"boolean\") {\n ctx.setHeader(formatHeader(doc.header, d.horizontal));\n changed = true;\n }\n if (\"categories\" in d && Array.isArray(d.categories)) {\n const x = axis(\"xaxis\");\n x.categories = d.categories.map(String);\n x.range = undefined;\n x.dirty = true;\n changed = true;\n }\n if (\"xTitle\" in d) {\n const x = axis(\"xaxis\");\n x.title = optionalText(d.xTitle);\n x.dirty = true;\n changed = true;\n }\n if (\"yTitle\" in d) {\n const y = axis(\"yaxis\");\n y.title = optionalText(d.yTitle);\n y.dirty = true;\n changed = true;\n }\n if (\"yMin\" in d || \"yMax\" in d) {\n const y = axis(\"yaxis\");\n const values = [...byId.values()].flatMap((s) => s.values);\n const min = \"yMin\" in d ? optionalNumber(d.yMin) : y.range?.[0];\n const max = \"yMax\" in d ? optionalNumber(d.yMax) : y.range?.[1];\n // Mermaid wants both ends; the other one comes from the data.\n if (min === undefined && max === undefined) y.range = undefined;\n else\n y.range = [\n min ?? Math.min(0, ...values),\n max ?? Math.max(min !== undefined ? min + 1 : 1, ...values),\n ];\n y.dirty = true;\n changed = true;\n }\n // An axis line with nothing left on it is not valid Mermaid.\n filterInPlace(\n statements,\n (s) =>\n !(\n (s.kind === \"xaxis\" || s.kind === \"yaxis\") &&\n s.dirty &&\n !s.title &&\n !s.range &&\n !(s.kind === \"xaxis\" && s.categories)\n ),\n );\n return changed;\n }\n default:\n return false;\n }\n },\n};\n\nexport const xyChartAdapter = createStatementAdapter(xyChartGrammar);\n\nregisterFamilyLayout(\"xychart\", sharedFrameLayout(XY_CHART_BOX));\n","import { registerFamilyLayout, sharedFrameLayout, RADAR_CHART_BOX } from \"../layout-registry.js\";\nimport type { DiagramGraph, GraphNode } from \"../types.js\";\nimport {\n createStatementAdapter,\n dropMetaKeys,\n filterInPlace,\n indentOf,\n slugId,\n splitOutsideQuotes,\n uniqueId,\n unquote,\n type BaseStatement,\n type StatementGrammar,\n} from \"../statements/base.js\";\n\n/**\n * `radar-beta` adapter.\n *\n * ```\n * radar-beta\n * title Skills\n * axis m[\"Math\"], s[\"Science\"], e[\"English\"]\n * curve alice[\"Alice\"]{85, 90, 80}\n * curve bob[\"Bob\"]{ e: 70, m: 75, s: 85 }\n * max 100\n * ```\n *\n * Canvas model: one node per curve (shape `curve`, `data.values` in axis\n * order; keyed entries are resolved and missing axes read 0), no edges, no\n * groups. Node ids are the curve ids and labels their `[\"…\"]` labels (or the\n * id). The axes and options are diagram data: `graph.data` holds `axes`\n * (labels), `axisIds`, `max`, `min`, `ticks`, `graticule` and `showLegend`.\n * Edited curves are written positionally; editing the axes rewrites them as\n * one `axis` line and every curve to the new axis count.\n *\n * Drawn with the chart module (`@pixerate/editor/canvas` family scenes); every series\n * node shares the chart frame.\n *\n * @module\n */\n\ninterface AxisEntry {\n id: string;\n label?: string;\n}\n\ninterface CurveEntry {\n axis?: string;\n value: number;\n}\n\nconst OPTIONS = [\"max\", \"min\", \"ticks\", \"graticule\", \"showLegend\"] as const;\ntype OptionName = (typeof OPTIONS)[number];\n\nexport type RadarStatement =\n | (BaseStatement & { kind: \"raw\" })\n | (BaseStatement & { kind: \"title\"; title: string })\n | (BaseStatement & { kind: \"axis\"; axes: AxisEntry[] })\n | (BaseStatement & { kind: \"curve\"; id: string; label?: string; entries: CurveEntry[] })\n | (BaseStatement & { kind: \"option\"; name: OptionName; value: string });\n\ntype Curve = Extract<RadarStatement, { kind: \"curve\" }>;\ntype AxisStmt = Extract<RadarStatement, { kind: \"axis\" }>;\ntype OptionStmt = Extract<RadarStatement, { kind: \"option\" }>;\n\nconst ID = \"[A-Za-z_][\\\\w-]*\";\nconst NAMED = new RegExp(`^(${ID})\\\\s*(?:\\\\[\\\\s*(\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\")\\\\s*\\\\])?$`);\nconst CURVE = new RegExp(\n `^curve\\\\s+(${ID})\\\\s*(?:\\\\[\\\\s*(\"(?:[^\"\\\\\\\\]|\\\\\\\\.)*\")\\\\s*\\\\])?\\\\s*\\\\{(.*)\\\\}\\\\s*$`,\n);\nconst NUMBER = /^-?\\d+(?:\\.\\d+)?$/;\n\nfunction parseNamed(text: string): AxisEntry | undefined {\n const m = NAMED.exec(text.trim());\n if (!m) return undefined;\n return { id: m[1]!, label: m[2] ? unquote(m[2]) : undefined };\n}\n\nfunction parseEntries(text: string): CurveEntry[] | undefined {\n if (!text.trim()) return [];\n const out: CurveEntry[] = [];\n for (const part of splitOutsideQuotes(text, \",\")) {\n const t = part.trim();\n const keyed = new RegExp(`^(${ID})\\\\s*:\\\\s*(-?\\\\d+(?:\\\\.\\\\d+)?)$`).exec(t);\n if (keyed) out.push({ axis: keyed[1], value: Number(keyed[2]) });\n else if (NUMBER.test(t)) out.push({ value: Number(t) });\n else return undefined;\n }\n return out;\n}\n\nfunction formatNumber(value: number): string {\n return Number.isInteger(value) ? String(value) : String(Math.round(value * 1000) / 1000);\n}\n\nfunction formatNamed(id: string, label?: string): string {\n return label !== undefined && label !== id ? `${id}[\"${label.replace(/\"/g, \"'\")}\"]` : id;\n}\n\n/** The curve's value for each axis, in axis order. */\nfunction valuesFor(curve: Curve, axisIds: string[]): number[] {\n if (curve.entries.every((e) => e.axis === undefined))\n return axisIds.map((_, i) => curve.entries[i]?.value ?? 0);\n const byAxis = new Map(curve.entries.map((e) => [e.axis, e.value]));\n return axisIds.map((id) => byAxis.get(id) ?? 0);\n}\n\n/** A valid, unused identifier derived from a label. */\nfunction identifier(label: string, fallback: string, taken: Set<string>): string {\n const slug = slugId(label, fallback);\n return uniqueId(/^[A-Za-z_]/.test(slug) ? slug : `${fallback}_${slug}`, taken);\n}\n\nfunction finiteNumbers(value: unknown): number[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const nums = value.map(Number);\n return nums.every((n) => Number.isFinite(n)) ? nums : undefined;\n}\n\nfunction optionValue(name: OptionName, value: unknown): string | undefined {\n if (value === undefined || value === null || value === \"\") return undefined;\n if (name === \"showLegend\") return typeof value === \"boolean\" ? String(value) : undefined;\n if (name === \"graticule\") return value === \"circle\" || value === \"polygon\" ? value : undefined;\n const n = Number(value);\n if (!Number.isFinite(n)) return undefined;\n return name === \"ticks\" ? String(Math.max(1, Math.round(n))) : formatNumber(n);\n}\n\nfunction readOption(stmt: OptionStmt | undefined): unknown {\n if (!stmt) return undefined;\n if (stmt.name === \"showLegend\") return stmt.value === \"true\";\n if (stmt.name === \"graticule\") return stmt.value;\n return Number(stmt.value);\n}\n\nexport const radarGrammar: StatementGrammar<RadarStatement> = {\n family: \"radar\",\n titleAsStatement: true,\n\n parseLine(line) {\n const indent = indentOf(line);\n const text = line.trim();\n let m: RegExpExecArray | null;\n if ((m = /^title\\s+(.+)$/.exec(text)))\n return { kind: \"title\", raw: line, indent, title: m[1]!.trim() };\n if ((m = /^axis\\s+(.+)$/.exec(text))) {\n const axes = splitOutsideQuotes(m[1]!, \",\").map(parseNamed);\n if (axes.every(Boolean))\n return { kind: \"axis\", raw: line, indent, axes: axes as AxisEntry[] };\n }\n if ((m = CURVE.exec(text))) {\n const entries = parseEntries(m[3]!);\n if (entries)\n return {\n kind: \"curve\",\n raw: line,\n indent,\n id: m[1]!,\n label: m[2] ? unquote(m[2]) : undefined,\n entries,\n };\n }\n if ((m = /^(max|min|ticks|graticule|showLegend)\\s+(\\S+)$/.exec(text)))\n return { kind: \"option\", raw: line, indent, name: m[1] as OptionName, value: m[2]! };\n return { kind: \"raw\", raw: line, indent };\n },\n\n format(stmt) {\n switch (stmt.kind) {\n case \"title\":\n return `${stmt.indent}title ${stmt.title}`;\n case \"axis\":\n return `${stmt.indent}axis ${stmt.axes.map((a) => formatNamed(a.id, a.label)).join(\", \")}`;\n case \"curve\": {\n const values = stmt.entries\n .map((e) => (e.axis ? `${e.axis}: ${formatNumber(e.value)}` : formatNumber(e.value)))\n .join(\", \");\n return `${stmt.indent}curve ${formatNamed(stmt.id, stmt.label)}{${values}}`;\n }\n case \"option\":\n return `${stmt.indent}${stmt.name} ${stmt.value}`;\n default:\n return stmt.raw;\n }\n },\n\n buildGraph(statements, ctx) {\n const axes = statements.flatMap((s) => (s.kind === \"axis\" ? s.axes : []));\n const axisIds = axes.map((a) => a.id);\n const options = new Map<OptionName, OptionStmt>();\n const nodes: GraphNode[] = [];\n let title: string | undefined;\n for (const s of statements) {\n if (s.kind === \"title\") title = s.title;\n else if (s.kind === \"option\") options.set(s.name, s);\n else if (s.kind === \"curve\") {\n const values = valuesFor(s, axisIds);\n nodes.push({\n id: s.id,\n label: s.label ?? s.id,\n shape: \"curve\",\n classes: [],\n styles: [],\n data: { values, details: [values.map(formatNumber).join(\", \")] },\n });\n }\n }\n const data: Record<string, unknown> = {\n axes: axes.map((a) => a.label ?? a.id),\n axisIds,\n };\n for (const name of OPTIONS) data[name] = readOption(options.get(name));\n const graph: DiagramGraph = {\n direction: \"TB\",\n nodes,\n edges: [],\n groups: [],\n classDefs: {},\n title: title ?? ctx.frontmatterTitle,\n data,\n };\n return { graph };\n },\n\n edit(op, ctx) {\n const { statements, indent } = ctx;\n const curves = statements.filter((s): s is Curve => s.kind === \"curve\");\n const byId = new Map(curves.map((c) => [c.id, c]));\n const axisIds = statements.flatMap((s) => (s.kind === \"axis\" ? s.axes.map((a) => a.id) : []));\n const lastIndex = (pred: (s: RadarStatement) => boolean) => {\n let idx = -1;\n statements.forEach((s, i) => {\n if (pred(s)) idx = i;\n });\n return idx;\n };\n const writePositional = (curve: Curve, values: number[]) => {\n curve.entries = values.map((value) => ({ value }));\n curve.dirty = true;\n };\n switch (op.type) {\n case \"addNode\": {\n const taken = new Set([...byId.keys(), ...axisIds]);\n const label = op.node.label?.trim() || undefined;\n const id = identifier(op.node.id || label || \"curve\", \"curve\", taken);\n const all = curves.flatMap((c) => valuesFor(c, axisIds));\n const fill = all.length ? all.reduce((a, b) => a + b, 0) / all.length : 50;\n const values = finiteNumbers(op.node.data?.values) ?? axisIds.map(() => Math.round(fill));\n const stmt: Curve = { kind: \"curve\", raw: \"\", indent, id, label, entries: [], dirty: true };\n writePositional(stmt, values);\n // Curves are drawn from the data; a drop position means nothing.\n const after = lastIndex(\n (s) => s.kind === \"curve\" || s.kind === \"axis\" || s.kind === \"title\",\n );\n statements.splice(after + 1, 0, stmt);\n return true;\n }\n case \"removeNodes\": {\n const remove = new Set(op.ids.map((id) => byId.get(id)).filter(Boolean));\n if (!remove.size) return false;\n filterInPlace(statements, (s) => !remove.has(s as Curve));\n dropMetaKeys(ctx.meta, op.ids);\n return true;\n }\n case \"renameNode\": {\n const c = byId.get(op.id);\n if (!c) return false;\n c.label = op.label.trim() || undefined;\n c.dirty = true;\n return true;\n }\n case \"setNodeData\": {\n const c = byId.get(op.id);\n const values = finiteNumbers(op.data.values);\n if (!c || !values) return false;\n writePositional(c, values);\n return true;\n }\n case \"setTitle\": {\n const idx = statements.findIndex((s) => s.kind === \"title\");\n if (op.title === undefined || op.title === \"\") {\n if (idx !== -1) statements.splice(idx, 1);\n return true;\n }\n if (idx !== -1) {\n const s = statements[idx] as Extract<RadarStatement, { kind: \"title\" }>;\n s.title = op.title;\n s.dirty = true;\n } else statements.unshift({ kind: \"title\", raw: \"\", indent, title: op.title, dirty: true });\n return true;\n }\n case \"setGraphData\": {\n const d = op.data;\n let changed = false;\n if (Array.isArray(d.axes)) {\n const labels = d.axes.map((a) => String(a).trim()).filter(Boolean);\n const old = statements.flatMap((s) => (s.kind === \"axis\" ? s.axes : []));\n const taken = new Set<string>(curves.map((c) => c.id));\n // Axes keep their ids by position; new ones get one from their label.\n const axes: AxisEntry[] = labels.map((label, i) => {\n const keep = old[i];\n const id = keep && !taken.has(keep.id) ? keep.id : identifier(label, \"axis\", taken);\n taken.add(id);\n return { id, label };\n });\n // Values follow their axis id; positional curves follow position.\n for (const c of curves) {\n const before = valuesFor(\n c,\n old.map((a) => a.id),\n );\n const keyed = c.entries.some((e) => e.axis !== undefined);\n const byOld = new Map(old.map((a, i) => [a.id, before[i]!]));\n writePositional(\n c,\n axes.map((a, i) => (keyed ? (byOld.get(a.id) ?? 0) : (before[i] ?? 0))),\n );\n }\n const first = statements.findIndex((s) => s.kind === \"axis\");\n filterInPlace(statements, (s) => s.kind !== \"axis\");\n if (axes.length) {\n const stmt: AxisStmt = { kind: \"axis\", raw: \"\", indent, axes, dirty: true };\n const at = first !== -1 ? first : lastIndex((s) => s.kind === \"title\") + 1;\n statements.splice(at, 0, stmt);\n }\n changed = true;\n }\n for (const name of OPTIONS) {\n if (!(name in d)) continue;\n const value = optionValue(name, d[name]);\n const idx = statements.findIndex((s) => s.kind === \"option\" && s.name === name);\n if (value === undefined) {\n if (idx !== -1) statements.splice(idx, 1);\n } else if (idx !== -1) {\n const s = statements[idx] as OptionStmt;\n s.value = value;\n s.dirty = true;\n } else {\n statements.push({ kind: \"option\", raw: \"\", indent, name, value, dirty: true });\n }\n changed = true;\n }\n return changed;\n }\n default:\n return false;\n }\n },\n};\n\nexport const radarAdapter = createStatementAdapter(radarGrammar);\n\nregisterFamilyLayout(\"radar\", sharedFrameLayout(RADAR_CHART_BOX));\n","import type { DiagramAdapter, DiagramFamily, SupportTier } from \"./types.js\";\nimport { flowchartAdapter } from \"./flowchart/index.js\";\nimport { createPassthroughAdapter } from \"./passthrough.js\";\nimport { classGrammar, createLineAdapter, erGrammar, stateGrammar } from \"./lines-grammar/index.js\";\nimport { pieAdapter } from \"./pie/index.js\";\nimport { mindmapAdapter } from \"./mindmap/index.js\";\nimport { quadrantAdapter } from \"./quadrant/index.js\";\nimport { c4Adapter } from \"./c4/index.js\";\nimport { architectureAdapter } from \"./architecture/index.js\";\nimport { sequenceAdapter } from \"./sequence/index.js\";\nimport { gitGraphAdapter } from \"./gitgraph/index.js\";\nimport { ganttAdapter } from \"./gantt/index.js\";\nimport { timelineAdapter } from \"./timeline/index.js\";\nimport { journeyAdapter } from \"./journey/index.js\";\nimport { xyChartAdapter } from \"./xychart/index.js\";\nimport { radarAdapter } from \"./radar/index.js\";\n\nconst adapters = new Map<DiagramFamily, DiagramAdapter<unknown>>();\n\n/** Registers (or replaces) the adapter for a family. */\nexport function registerDiagramAdapter(adapter: DiagramAdapter<unknown>): void {\n adapters.set(adapter.family, adapter);\n}\n\nexport function getDiagramAdapter(family: DiagramFamily): DiagramAdapter<unknown> {\n return adapters.get(family) ?? adapters.get(\"unknown\")!;\n}\n\n/** `editable` for every family with an adapter; `render-only` for sankey, block, packet, kanban, treemap and the rest. */\nexport function supportTierOf(family: DiagramFamily): SupportTier {\n return getDiagramAdapter(family).tier;\n}\n\nregisterDiagramAdapter(flowchartAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(createLineAdapter(stateGrammar) as DiagramAdapter<unknown>);\nregisterDiagramAdapter(createLineAdapter(classGrammar) as DiagramAdapter<unknown>);\nregisterDiagramAdapter(createLineAdapter(erGrammar) as DiagramAdapter<unknown>);\nregisterDiagramAdapter(pieAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(mindmapAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(quadrantAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(c4Adapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(architectureAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(sequenceAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(gitGraphAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(ganttAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(timelineAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(journeyAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(xyChartAdapter as DiagramAdapter<unknown>);\nregisterDiagramAdapter(radarAdapter as DiagramAdapter<unknown>);\nfor (const family of [\n \"sankey\", \"block\", \"packet\", \"kanban\", \"treemap\", \"info\", \"requirement\", \"unknown\",\n] as DiagramFamily[]) {\n registerDiagramAdapter(createPassthroughAdapter(family) as DiagramAdapter<unknown>);\n}\n","import type { DiagramFamily, EditOp, MermaidDocument, MetaCarrier } from \"./types.js\";\nimport { detectFamilyFromHeader, splitSource } from \"./source/lines.js\";\nimport {\n defaultCarrierFor,\n emptyMeta,\n extractMetaFromBody,\n extractMetaFromFrontmatter,\n mergeMeta,\n} from \"./source/metadata.js\";\nimport { getDiagramAdapter } from \"./registry.js\";\n\nexport interface ParseOptions {\n /** Force where metadata is written. Defaults per family. */\n metaCarrier?: MetaCarrier;\n}\n\n/** Detects the diagram family of a Mermaid source without fully parsing it. */\nexport function detectFamily(source: string): DiagramFamily {\n return detectFamilyFromHeader(splitSource(source).header);\n}\n\n/**\n * Parses Mermaid text into a {@link MermaidDocument}.\n *\n * Never throws: unknown or malformed input yields a `render-only` document\n * with diagnostics, so hosts can always show the source editor.\n */\nexport function parseMermaid(source: string, options: ParseOptions = {}): MermaidDocument {\n const split = splitSource(source);\n const family = detectFamilyFromHeader(split.header);\n const fromBody = extractMetaFromBody(split.bodyLines);\n const fromFm = extractMetaFromFrontmatter(split.preamble);\n let meta = emptyMeta();\n if (fromFm) meta = mergeMeta(meta, fromFm);\n if (fromBody.meta) meta = mergeMeta(meta, fromBody.meta);\n const metaCarrier: MetaCarrier =\n options.metaCarrier ?? (fromFm && !fromBody.meta ? \"frontmatter\" : defaultCarrierFor(family));\n const adapter = getDiagramAdapter(family);\n const doc = adapter.parse(source, {\n source,\n eol: split.eol,\n preamble: split.preamble,\n header: split.header,\n bodyLines: fromBody.bodyLines,\n trailing: split.trailing,\n meta,\n metaCarrier,\n family,\n });\n return doc;\n}\n\n/** Serialises a document back to Mermaid text. */\nexport function serializeMermaid(doc: MermaidDocument): string {\n return getDiagramAdapter(doc.family).serialize(doc);\n}\n\n/**\n * Applies an edit and returns a new document whose `source` is the updated\n * text. Documents are immutable; keep the returned value.\n */\nexport function applyEdit(doc: MermaidDocument, op: EditOp): MermaidDocument {\n if (op.type === \"replaceSource\") {\n const next = parseMermaid(op.source, { metaCarrier: doc.metaCarrier });\n next.dirty = true;\n return next;\n }\n const next = getDiagramAdapter(doc.family).apply(doc, op);\n if (next !== doc && next.source === doc.source) {\n // Adapters normally refresh `source`; make sure it is current.\n next.source = serializeMermaid(next);\n }\n return next;\n}\n\n/** Applies several edits in order. */\nexport function applyEdits(doc: MermaidDocument, ops: EditOp[]): MermaidDocument {\n return ops.reduce((d, op) => applyEdit(d, op), doc);\n}\n"],"mappings":"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","names":["quote","endHead","consumed","body","result","spec","quote","parentOf","detectIndent","reparse","depthAt","insertIntoGroup","filterInPlace","groupRange","spec","setFrontmatterTitle","setFrontmatterTitle","spec","ID","spec","ID","RELATION","spec","detectIndent","parseFull","reparse","setFrontmatterTitle","filterInPlace","x0","y0","x1","y1","M","filterInPlace","parentOf","halfRoot","FORMS","formatNode","parents","reindent","M","round","clamp01","round","filterInPlace","q","M","parentOf","round","reindent","parentOf","filterInPlace","str","id","charEm","nodeIds","round","ID","SIDES","parentOf","nodeIds","filterInPlace","str","s","estimateTextWidth","M","width","textWidth","escapeRe","filterInPlace","at","spec","setFrontmatterTitle","M","estimateTextWidth","along","parents","arc","arc2","r","HEADER","unq","filterInPlace","headerDirection","parents","M","spec","reindent","filterInPlace","KEYWORD","DAY_MS","op","M","textWidth","events","width","spec","op","M","measurer","textWidth","M","textWidth","KEYWORD","spec","op","HEADER","parseHeader","formatHeader","filterInPlace","ID","NUMBER","formatNumber","finiteNumbers","filterInPlace","next"]}
|