@kekonic/diagrams-core 1.0.0-rc.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +69 -0
- package/dist/index.d.mts +967 -0
- package/dist/index.mjs +4966 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["DEFAULT_FLOW_MS","DEFAULT_PULSE_MS","collectStyleRefsFromProperties","collectUnresolvedVars","collectAnimationBlocks"],"sources":["../src/types/branch.ts","../src/animation/infer-auto-animation.ts","../src/animation/bind-sequence-flow-edge-ids.ts","../src/animation/index.ts","../src/types/cardinality.ts","../src/types/table.ts","../src/types/sequence.ts","../src/parser/edge-ops.ts","../src/parser/lexer.ts","../src/parser/parser.ts","../src/types/presentation.ts","../src/types/shapes.ts","../src/compiler/kinds.ts","../src/compiler/direction.ts","../src/compiler/compile-animations.ts","../src/compiler/compile-sequence.ts","../src/compiler/compile.ts","../src/format/print.ts","../src/types/graph.ts","../src/types/geometry.ts"],"sourcesContent":["/** Compiled / derived branch outcome for edges (layout + theme share this). */\nexport type BranchKind = \"yes\" | \"no\" | \"neutral\";\n\n/**\n * Classify an edge label into a yes/no/neutral branch cue.\n * Only clear affirmative/negative tokens — use `branch: yes|no` for outcome wording.\n */\nexport function classifyBranch(label?: string): BranchKind {\n if (!label) return \"neutral\";\n const normalized = label.trim().toLowerCase();\n\n if (/^(yes|y|true|ok)\\b/.test(normalized) || normalized === \"yes\") return \"yes\";\n if (/^(no|n|false)\\b/.test(normalized) || normalized === \"no\") return \"no\";\n if (/\\byes\\b/.test(normalized) && !/\\bno\\b/.test(normalized)) return \"yes\";\n if (/\\bno\\b/.test(normalized) && !/\\byes\\b/.test(normalized)) return \"no\";\n return \"neutral\";\n}\n\nexport function normalizeBranch(value: unknown): BranchKind | undefined {\n if (value === \"yes\" || value === \"no\" || value === \"neutral\") return value;\n return undefined;\n}\n","import type { GraphEdge, GraphModel, GraphNode } from \"../types/graph.ts\";\nimport { classifyBranch } from \"../types/branch.ts\";\nimport type { AnimationCue, AnimationDefinition, AnimationTarget } from \"./types.ts\";\n\nconst DEFAULT_FLOW_MS = 500;\nconst DEFAULT_PULSE_MS = 650;\n/** Dwell pulse for ordinary nodes between hops. */\nconst DEFAULT_NODE_PULSE_MS = 450;\nconst DEFAULT_WAIT_MS = 600;\nconst DEFAULT_CHAPTER_MS = 350;\n/** Soft cap so dense exclusive-branch DAGs stay watchable. */\nconst MAX_AUTO_CHAPTERS = 12;\n\nexport type AutoWalkStep =\n | { kind: \"chapter\" }\n | { kind: \"enter\"; nodeId: string }\n | { kind: \"enter-many\"; nodeIds: string[] }\n | { kind: \"edge\"; from: string; to: string }\n | { kind: \"parallel-edges\"; edges: Array<{ from: string; to: string }> };\n\ntype OutEdge = { to: string; edge: GraphEdge };\ntype Hop = { from: string; to: string };\n\n/**\n * Infer Automatic animation.\n *\n * - **Exclusive** fan-out (choice nodes / yes·no branches) → one chapter per alternative.\n * - **Parallel** fan-out (everything else) → `parallel` flow cues in a single story.\n */\nexport function inferAutoAnimation(graph: GraphModel): AnimationDefinition | null {\n if (graph.diagramKind === \"sequence\" && graph.sequence) {\n return inferSequenceAutoAnimation(graph);\n }\n\n const steps = planAutoWalk(graph);\n if (steps.length === 0) return null;\n\n const cues: AnimationCue[] = [];\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n let chapterIndex = -1;\n\n const pulseFor = (nodeId: string): AnimationCue => {\n const node = nodeById.get(nodeId);\n return {\n op: \"pulse\",\n targets: [{ type: \"node\", id: nodeId }],\n durationMs: node?.kind === \"choice\" ? DEFAULT_PULSE_MS : DEFAULT_NODE_PULSE_MS,\n };\n };\n\n for (const step of steps) {\n if (step.kind === \"chapter\") {\n chapterIndex += 1;\n cues.push({ op: \"dim\", targets: [{ type: \"all\" }] });\n if (chapterIndex > 0) {\n cues.push({ op: \"wait\", durationMs: DEFAULT_CHAPTER_MS });\n }\n continue;\n }\n\n if (step.kind === \"enter\") {\n cues.push({ op: \"activate\", targets: [{ type: \"node\", id: step.nodeId }] });\n cues.push(pulseFor(step.nodeId));\n continue;\n }\n\n if (step.kind === \"enter-many\") {\n const targets: AnimationTarget[] = step.nodeIds.map((id) => ({ type: \"node\", id }));\n cues.push({ op: \"activate\", targets });\n // wavefront only emits enter-many for 2+ nodes; pulse them together.\n cues.push({\n op: \"parallel\",\n cues: step.nodeIds.map((id) => pulseFor(id)),\n });\n continue;\n }\n\n if (step.kind === \"edge\") {\n cues.push({\n op: \"flow\",\n path: [step.from, step.to],\n durationMs: DEFAULT_FLOW_MS,\n });\n continue;\n }\n\n if (step.edges.length === 1) {\n const e = step.edges[0]!;\n cues.push({\n op: \"flow\",\n path: [e.from, e.to],\n durationMs: DEFAULT_FLOW_MS,\n });\n } else {\n cues.push({\n op: \"parallel\",\n cues: step.edges.map((e) => ({\n op: \"flow\" as const,\n path: [e.from, e.to],\n durationMs: DEFAULT_FLOW_MS,\n })),\n });\n }\n }\n\n cues.push({ op: \"wait\", durationMs: DEFAULT_WAIT_MS });\n\n return {\n id: \"auto\",\n name: \"Automatic\",\n loop: false,\n cues,\n source: \"auto\",\n };\n}\n\n/**\n * Chaptered walk: exclusive alternatives restart as chapters; concurrent\n * fan-out becomes parallel edge steps within a chapter.\n */\nexport function planAutoWalk(graph: GraphModel): AutoWalkStep[] {\n const chapters = enumerateChapterEdgeSets(graph);\n if (chapters.length === 0) return [];\n\n const steps: AutoWalkStep[] = [];\n for (const chapter of chapters) {\n steps.push({ kind: \"chapter\" });\n steps.push(...wavefrontSteps(chapter.startId, chapter.edges));\n }\n return steps;\n}\n\n/**\n * Exclusive alternatives as node sequences (parallel siblings linearized in\n * wavefront order). Prefer {@link planAutoWalk} for playback structure.\n */\nexport function enumerateAutoPaths(graph: GraphModel): string[][] {\n return enumerateChapterEdgeSets(graph).map((ch) => linearizeChapter(ch.startId, ch.edges));\n}\n\n/** First-visit node order across Automatic chapters. */\nexport function traceDeclarationPath(graph: GraphModel): string[] {\n const seen = new Set<string>();\n const path: string[] = [];\n for (const step of planAutoWalk(graph)) {\n if (step.kind === \"enter\") {\n if (seen.has(step.nodeId)) continue;\n seen.add(step.nodeId);\n path.push(step.nodeId);\n } else if (step.kind === \"enter-many\") {\n for (const id of step.nodeIds) {\n if (seen.has(id)) continue;\n seen.add(id);\n path.push(id);\n }\n }\n }\n return path;\n}\n\ntype ChapterEdges = { startId: string; edges: Hop[] };\n\nfunction enumerateChapterEdgeSets(graph: GraphModel): ChapterEdges[] {\n if (graph.nodes.length === 0) return [];\n\n const nodeIds = new Set(graph.nodes.map((n) => n.id));\n const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));\n const outs = buildOuts(graph, nodeIds);\n const indegree = buildIndegree(graph, nodeIds);\n\n const sources = graph.nodes.filter((n) => (indegree.get(n.id) ?? 0) === 0);\n const startIds = sources.length > 0 ? sources.map((n) => n.id) : [graph.nodes[0]!.id];\n const primary = startIds[0]!;\n\n const chapters: ChapterEdges[] = [];\n const pushChapter = (startId: string, edges: Hop[]) => {\n if (chapters.length >= MAX_AUTO_CHAPTERS) return;\n const key = `${startId}|${edges.map((e) => `${e.from}>${e.to}`).join(\";\")}`;\n if (\n chapters.some(\n (c) => `${c.startId}|${c.edges.map((e) => `${e.from}>${e.to}`).join(\";\")}` === key,\n )\n ) {\n return;\n }\n chapters.push({ startId, edges: dedupeEdges(edges) });\n };\n\n for (const edgeSet of edgeSetsFrom(primary, new Set(), nodeById, outs)) {\n pushChapter(primary, edgeSet);\n if (chapters.length >= MAX_AUTO_CHAPTERS) break;\n }\n\n const covered = new Set<string>();\n for (const ch of chapters) {\n covered.add(ch.startId);\n for (const e of ch.edges) {\n covered.add(e.from);\n covered.add(e.to);\n }\n }\n\n for (const sourceId of startIds.slice(1)) {\n if (chapters.length >= MAX_AUTO_CHAPTERS) break;\n const side: Hop[] = [];\n const seen = new Set<string>();\n let nodeId: string | undefined = sourceId;\n while (nodeId && !seen.has(nodeId)) {\n seen.add(nodeId);\n if (seen.size > 1 && covered.has(nodeId)) break;\n const nexts: OutEdge[] = outs.get(nodeId) ?? [];\n if (nexts.length === 0) break;\n const out: OutEdge = nexts[0]!;\n side.push({ from: nodeId, to: out.to });\n nodeId = out.to;\n }\n pushChapter(sourceId, side);\n }\n\n for (const node of graph.nodes) {\n if (covered.has(node.id)) continue;\n if (\n chapters.some(\n (ch) =>\n ch.startId === node.id || ch.edges.some((e) => e.from === node.id || e.to === node.id),\n )\n ) {\n continue;\n }\n if (chapters.length >= MAX_AUTO_CHAPTERS) break;\n const sets = edgeSetsFrom(node.id, new Set(), nodeById, outs);\n if (sets.length === 0) pushChapter(node.id, []);\n else for (const edgeSet of sets) pushChapter(node.id, edgeSet);\n }\n\n return chapters;\n}\n\n/**\n * Edge-set alternatives from `nodeId`.\n * Exclusive fan-out → multiple sets; parallel fan-out → one set (cartesian if\n * parallel arms themselves contain exclusive forks).\n */\nfunction edgeSetsFrom(\n nodeId: string,\n trail: Set<string>,\n nodeById: Map<string, GraphNode>,\n outs: Map<string, OutEdge[]>,\n): Hop[][] {\n if (trail.has(nodeId)) return [[]];\n const nextTrail = new Set(trail);\n nextTrail.add(nodeId);\n const nexts = outs.get(nodeId) ?? [];\n if (nexts.length === 0) return [[]];\n\n if (isExclusiveFanOut(nodeById.get(nodeId), nexts)) {\n const result: Hop[][] = [];\n for (const out of nexts) {\n const hop = { from: nodeId, to: out.to };\n for (const suffix of edgeSetsFrom(out.to, nextTrail, nodeById, outs)) {\n result.push([hop, ...suffix]);\n }\n }\n return result.length > 0 ? result : [[]];\n }\n\n // Parallel / single: each successor contributes alternatives; take the product.\n const branchAlts: Hop[][][] = nexts.map((out) => {\n const hop = { from: nodeId, to: out.to };\n const suffixes = edgeSetsFrom(out.to, nextTrail, nodeById, outs);\n return suffixes.map((suffix) => [hop, ...suffix]);\n });\n return cartesianConcat(branchAlts);\n}\n\nfunction cartesianConcat(branches: Hop[][][]): Hop[][] {\n if (branches.length === 0) return [[]];\n let acc: Hop[][] = [[]];\n for (const alts of branches) {\n const next: Hop[][] = [];\n for (const prefix of acc) {\n for (const alt of alts) {\n next.push([...prefix, ...alt]);\n }\n }\n acc = next;\n if (acc.length >= MAX_AUTO_CHAPTERS) break;\n }\n return acc;\n}\n\nfunction wavefrontSteps(startId: string, edges: Hop[]): AutoWalkStep[] {\n const steps: AutoWalkStep[] = [];\n const remaining = new Set(edges.map((e) => keyOf(e)));\n const edgeByKey = new Map(edges.map((e) => [keyOf(e), e]));\n const reached = new Set<string>([startId]);\n steps.push({ kind: \"enter\", nodeId: startId });\n\n let guard = edges.length + 2;\n while (remaining.size > 0 && guard-- > 0) {\n const ready: Hop[] = [];\n for (const key of remaining) {\n const e = edgeByKey.get(key)!;\n if (reached.has(e.from)) ready.push(e);\n }\n if (ready.length === 0) break;\n\n if (ready.length === 1) {\n const e = ready[0]!;\n steps.push({ kind: \"edge\", from: e.from, to: e.to });\n } else {\n steps.push({ kind: \"parallel-edges\", edges: ready });\n }\n\n const newly: string[] = [];\n for (const e of ready) {\n remaining.delete(keyOf(e));\n if (!reached.has(e.to)) {\n reached.add(e.to);\n newly.push(e.to);\n }\n }\n const uniqueNew = [...new Set(newly)];\n if (uniqueNew.length === 1) {\n steps.push({ kind: \"enter\", nodeId: uniqueNew[0]! });\n } else if (uniqueNew.length > 1) {\n steps.push({ kind: \"enter-many\", nodeIds: uniqueNew });\n }\n }\n\n return steps;\n}\n\nfunction linearizeChapter(startId: string, edges: Hop[]): string[] {\n const ids: string[] = [];\n const seen = new Set<string>();\n for (const step of wavefrontSteps(startId, edges)) {\n if (step.kind === \"enter\") {\n if (!seen.has(step.nodeId)) {\n seen.add(step.nodeId);\n ids.push(step.nodeId);\n }\n } else if (step.kind === \"enter-many\") {\n for (const id of step.nodeIds) {\n if (seen.has(id)) continue;\n seen.add(id);\n ids.push(id);\n }\n }\n }\n return ids;\n}\n\n/** Choice diamonds / yes·no forks are mutually exclusive stories. */\nexport function isExclusiveFanOut(node: GraphNode | undefined, outs: OutEdge[]): boolean {\n if (outs.length < 2) return false;\n if (node?.kind === \"choice\") return true;\n const branches = new Set(outs.map((o) => o.edge.branch ?? classifyBranch(o.edge.label)));\n return branches.has(\"yes\") && branches.has(\"no\");\n}\n\nfunction buildOuts(graph: GraphModel, nodeIds: Set<string>): Map<string, OutEdge[]> {\n const outs = new Map<string, OutEdge[]>();\n for (const edge of graph.edges) {\n if (!nodeIds.has(edge.from) || !nodeIds.has(edge.to)) continue;\n const list = outs.get(edge.from);\n if (list) list.push({ to: edge.to, edge });\n else outs.set(edge.from, [{ to: edge.to, edge }]);\n }\n return outs;\n}\n\nfunction buildIndegree(graph: GraphModel, nodeIds: Set<string>): Map<string, number> {\n const indegree = new Map<string, number>();\n for (const id of nodeIds) indegree.set(id, 0);\n for (const edge of graph.edges) {\n if (!nodeIds.has(edge.to)) continue;\n indegree.set(edge.to, (indegree.get(edge.to) ?? 0) + 1);\n }\n return indegree;\n}\n\nfunction dedupeEdges(edges: Hop[]): Hop[] {\n const seen = new Set<string>();\n const out: Hop[] = [];\n for (const e of edges) {\n const k = keyOf(e);\n if (seen.has(k)) continue;\n seen.add(k);\n out.push(e);\n }\n return out;\n}\n\nfunction keyOf(e: Hop): string {\n return `${e.from}\\0${e.to}`;\n}\n\n/** Participants with an open activation bar covering this message order. */\nfunction liveParticipantsAt(\n activations: Array<{ participantId: string; startOrder: number; endOrder: number }>,\n order: number,\n): string[] {\n const ids = new Set<string>();\n for (const a of activations) {\n if (a.startOrder <= order && order <= a.endOrder) ids.add(a.participantId);\n }\n return [...ids];\n}\n\n/**\n * Walk sequence messages in order.\n * Emphasis follows SequenceIR activation spans: when a participant deactivates,\n * we dim and re-activate only the still-live set (plus the hop endpoints).\n */\nfunction inferSequenceAutoAnimation(graph: GraphModel): AnimationDefinition | null {\n const seq = graph.sequence;\n if (!seq || seq.messages.length === 0) return null;\n\n const cues: AnimationCue[] = [];\n let prevEmphasisKey = \"\";\n\n for (const msg of seq.messages) {\n if (!msg.from || !msg.to || msg.kind === \"destroy\") continue;\n\n const live = liveParticipantsAt(seq.activations, msg.order);\n const emphasis = new Set(live);\n emphasis.add(msg.from);\n emphasis.add(msg.to);\n const emphasisKey = [...emphasis].sort().join(\"\\0\");\n\n // Reset sticky highlights when the activation set changes (activate/deactivate).\n if (emphasisKey !== prevEmphasisKey) {\n cues.push({ op: \"dim\", targets: [{ type: \"all\" }] });\n cues.push({\n op: \"activate\",\n targets: [...emphasis].map((id) => ({ type: \"node\" as const, id })),\n });\n prevEmphasisKey = emphasisKey;\n }\n\n cues.push({\n op: \"flow\",\n path: [msg.from, msg.to],\n durationMs: DEFAULT_FLOW_MS,\n edgeId: msg.id,\n edgeIds: [msg.id],\n });\n cues.push({\n op: \"pulse\",\n targets: [{ type: \"node\", id: msg.to }],\n durationMs: DEFAULT_NODE_PULSE_MS,\n });\n }\n\n cues.push({ op: \"wait\", durationMs: DEFAULT_WAIT_MS });\n return {\n id: \"auto\",\n name: \"Automatic\",\n loop: false,\n cues,\n source: \"auto\",\n };\n}\n","import type { GraphModel } from \"../types/graph.ts\";\nimport type { AnimationCue } from \"./types.ts\";\n\nexport type FlowEdgeRefs = {\n edgeId?: string;\n edgeIds?: string[];\n};\n\n/**\n * Resolve the concrete edge/message id for hop `i` of a flow cue.\n * `edgeIds` is authoritative and index-aligned with hops; lone `edgeId` only\n * covers hop 0 (single-hop convenience / auto-anim).\n */\nexport function flowHopEdgeId(hopIndex: number, refs: FlowEdgeRefs): string | undefined {\n if (refs.edgeIds && hopIndex < refs.edgeIds.length) return refs.edgeIds[hopIndex];\n if (hopIndex === 0) return refs.edgeId;\n return undefined;\n}\n\n/** Attach concrete sequence message ids to authored `flow` cues (in place-safe copy). */\nexport function bindSequenceFlowEdgeIds(graph: GraphModel, cues: AnimationCue[]): AnimationCue[] {\n const seq = graph.sequence;\n if (!seq) return cues;\n\n const messages = seq.messages\n .filter((m) => m.from && m.to && m.kind !== \"destroy\")\n .slice()\n .sort((a, b) => a.order - b.order);\n const used = new Set<string>();\n\n const take = (from: string, to: string): string | undefined => {\n for (const m of messages) {\n if (used.has(m.id) || m.from !== from || m.to !== to) continue;\n used.add(m.id);\n return m.id;\n }\n return undefined;\n };\n\n const mapCue = (cue: AnimationCue): AnimationCue => {\n if (cue.op === \"parallel\") return { ...cue, cues: cue.cues.map(mapCue) };\n if (cue.op !== \"flow\") return cue;\n // Explicit / auto-bound ids win — don't rebind.\n if (cue.edgeId || (cue.edgeIds && cue.edgeIds.length > 0)) return cue;\n if (cue.path.length < 2) return cue;\n\n const hops = cue.path.length - 1;\n const edgeIds: string[] = [];\n for (let i = 0; i < hops; i++) {\n const id = take(cue.path[i]!, cue.path[i + 1]!);\n if (!id) return cue; // incomplete bind — leave cue unbound\n edgeIds.push(id);\n }\n return { ...cue, edgeId: edgeIds[0], edgeIds };\n };\n\n return cues.map(mapCue);\n}\n","export type { AnimationTarget, AnimationCue, AnimationDefinition } from \"./types.ts\";\nexport type { AutoWalkStep } from \"./infer-auto-animation.ts\";\nexport {\n inferAutoAnimation,\n planAutoWalk,\n enumerateAutoPaths,\n traceDeclarationPath,\n} from \"./infer-auto-animation.ts\";\nexport { bindSequenceFlowEdgeIds, flowHopEdgeId } from \"./bind-sequence-flow-edge-ids.ts\";\nexport type { FlowEdgeRefs } from \"./bind-sequence-flow-edge-ids.ts\";\n\n/** Slugify an authored animation name into a stable id. */\nexport function animationIdFromName(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return slug || \"animation\";\n}\n","/**\n * Relationship endpoint multiplicity for ERD edges.\n * Drawn as crow's-foot / IE-style markers instead of plain arrowheads.\n */\nexport type Cardinality = \"one\" | \"zeroOrOne\" | \"oneOrMany\" | \"zeroOrMany\";\n\nexport type EdgeCardinality = {\n /** Multiplicity at the source (from) end. */\n from: Cardinality;\n /** Multiplicity at the target (to) end. */\n to: Cardinality;\n};\n\nconst ALIASES: Record<string, Cardinality> = {\n \"1\": \"one\",\n one: \"one\",\n exactlyone: \"one\",\n \"0..1\": \"zeroOrOne\",\n \"0:1\": \"zeroOrOne\",\n \"01\": \"zeroOrOne\",\n zeroorone: \"zeroOrOne\",\n optional: \"zeroOrOne\",\n \"1..n\": \"oneOrMany\",\n \"1..*\": \"oneOrMany\",\n \"1:n\": \"oneOrMany\",\n \"1:*\": \"oneOrMany\",\n n: \"oneOrMany\",\n many: \"oneOrMany\",\n \"+\": \"oneOrMany\",\n oneormany: \"oneOrMany\",\n \"0..n\": \"zeroOrMany\",\n \"0..*\": \"zeroOrMany\",\n \"0:n\": \"zeroOrMany\",\n \"0:*\": \"zeroOrMany\",\n \"*\": \"zeroOrMany\",\n zeroormany: \"zeroOrMany\",\n};\n\nfunction normalizeToken(raw: string): Cardinality | undefined {\n const key = raw.trim().toLowerCase().replace(/\\s+/g, \"\");\n return ALIASES[key];\n}\n\n/**\n * Parse cardinality from a property or label.\n *\n * Forms:\n * - `\"1:N\"` / `\"1:0..N\"` / `\"0..1:N\"` (from:to)\n * - Mermaid-ish `\"||--o{\"` / `\"}o--||\"`\n * - Single side `\"N\"` (applied to target; source defaults to `one`)\n */\nexport function parseCardinality(raw: unknown): EdgeCardinality | undefined {\n if (raw == null || raw === \"\") return undefined;\n if (typeof raw !== \"string\" && typeof raw !== \"number\" && typeof raw !== \"boolean\") {\n return undefined;\n }\n const text = String(raw).trim();\n if (!text) return undefined;\n\n const mermaid = parseMermaidCardinality(text);\n if (mermaid) return mermaid;\n\n const parts = text\n .split(/[:|]/)\n .map((p) => p.trim())\n .filter(Boolean);\n if (parts.length >= 2) {\n const from = normalizeToken(parts[0]!);\n const to = normalizeToken(parts[1]!);\n if (from && to) return { from, to };\n }\n\n const single = normalizeToken(text);\n if (single) return { from: \"one\", to: single };\n\n return undefined;\n}\n\n/**\n * True when a label only encodes cardinality (crow's-foot already conveys it).\n * Shared by finalize (label placement) and SVG (hide duplicate text).\n */\nexport function isPureCardinalityLabel(label: string | undefined): boolean {\n if (!label) return true;\n const t = label.trim();\n if (!t) return true;\n if (parseMermaidCardinality(t)) return true;\n if (/^(?:1|0\\.\\.1|1\\.\\.N|0\\.\\.N|N|\\*):\\s*(?:1|0\\.\\.1|1\\.\\.N|0\\.\\.N|N|\\*)$/i.test(t)) {\n return true;\n }\n if (/^(?:\\d+\\.\\.[Nn*]|\\d+:[Nn*]|\\*|[Nn]|0\\.\\.[Nn*])$/i.test(t)) return true;\n // Parsed as cardinality and contains no alphabetic words (aside from N).\n const parsed = parseCardinality(t);\n if (!parsed) return false;\n return !/[a-z]/i.test(t.replace(/n/gi, \"\"));\n}\n\nexport function cardinalityLabel(c: EdgeCardinality): string {\n return `${formatSide(c.from)}:${formatSide(c.to)}`;\n}\n\nfunction parseMermaidCardinality(text: string): EdgeCardinality | undefined {\n const t = text.replace(/\\s+/g, \"\");\n const match = t.match(/^([|}{o]+)--([|}{o]+)$/);\n if (!match) return undefined;\n const from = mermaidEnd(match[1]!);\n const to = mermaidEnd(match[2]!);\n if (!from || !to) return undefined;\n return { from, to };\n}\n\nfunction mermaidEnd(token: string): Cardinality | undefined {\n if (token === \"}o\" || token === \"o{\") return \"zeroOrMany\";\n if (token === \"}|\" || token === \"|{\") return \"oneOrMany\";\n if (token === \"||\") return \"one\";\n if (token === \"o|\" || token === \"|o\") return \"zeroOrOne\";\n if (token === \"|\") return \"one\";\n if (token === \"o\") return \"zeroOrOne\";\n return undefined;\n}\n\nfunction formatSide(c: Cardinality): string {\n switch (c) {\n case \"one\":\n return \"1\";\n case \"zeroOrOne\":\n return \"0..1\";\n case \"oneOrMany\":\n return \"1..N\";\n case \"zeroOrMany\":\n return \"0..N\";\n }\n}\n\n/** Default IE cardinality for a FK from parent → child. */\nexport function fkCardinality(fkNotNull: boolean | undefined): EdgeCardinality {\n // Nullability lives on the parent end: optional parent participation when FK is nullable.\n return {\n from: fkNotNull ? \"one\" : \"zeroOrOne\",\n to: \"zeroOrMany\",\n };\n}\n","/** Column key roles for ERD-style table nodes. */\nexport type TableColumnKey = \"pk\" | \"fk\" | \"uk\";\n\nexport type TableColumnRef = {\n /** Referenced table / entity node id. */\n table: string;\n /** Referenced column name (usually a PK). */\n column: string;\n};\n\nexport type TableColumn = {\n /** Column / attribute name. */\n name: string;\n /** SQL-ish or conceptual type (e.g. uuid, text, timestamptz). */\n type?: string;\n /** Primary / foreign / unique key markers (order preserved). */\n keys: TableColumnKey[];\n /** NOT NULL */\n notNull?: boolean;\n /** FK target — e.g. from `\"customer_id FK uuid -> customers.id\"`. */\n references?: TableColumnRef;\n /** Optional short note shown muted after the type. */\n note?: string;\n};\n\nconst FLAG_TOKENS = new Set([\n \"PK\",\n \"PRIMARY\",\n \"FK\",\n \"FOREIGN\",\n \"UK\",\n \"UNIQUE\",\n \"NN\",\n \"NOTNULL\",\n \"NOT_NULL\",\n]);\n\n/**\n * Parse a compact column spec string into a structured column.\n *\n * Accepted forms (whitespace-separated):\n * - `\"id PK uuid\"`\n * - `\"email text UK NN\"`\n * - `\"customer_id : uuid FK\"`\n * - `\"customer_id FK uuid -> customers.id\"`\n * - `\"status text NN // order lifecycle\"` (note after //)\n *\n * Flags: PK, FK, UK/UNIQUE, NN/NOT NULL/NOTNULL (case-insensitive).\n */\nexport function parseTableColumnSpec(raw: string): TableColumn | null {\n let trimmed = raw.trim();\n if (!trimmed) return null;\n\n let note: string | undefined;\n const noteSplit = trimmed.split(/\\s+\\/\\/\\s+/);\n if (noteSplit.length > 1) {\n trimmed = noteSplit[0]!.trim();\n note = noteSplit.slice(1).join(\" // \").trim() || undefined;\n }\n\n let references: TableColumnRef | undefined;\n const refMatch = trimmed.match(/^(.*?)\\s*->\\s*([A-Za-z_][\\w-]*)\\.([A-Za-z_][\\w-]*)\\s*$/);\n if (refMatch) {\n trimmed = refMatch[1]!.trim();\n references = { table: refMatch[2]!, column: refMatch[3]! };\n } else {\n const refWord = trimmed.match(\n /^(.*?)\\s+(?:ref|references)\\s+([A-Za-z_][\\w-]*)\\.([A-Za-z_][\\w-]*)\\s*$/i,\n );\n if (refWord) {\n trimmed = refWord[1]!.trim();\n references = { table: refWord[2]!, column: refWord[3]! };\n }\n }\n\n // Allow \"name : type FLAGS\" as well as free-order tokens.\n const normalized = trimmed.replace(/\\s*:\\s*/g, \" \");\n const parts = normalized.split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return null;\n\n const name = parts[0]!;\n const keys: TableColumnKey[] = [];\n let notNull = false;\n const typeParts: string[] = [];\n\n for (let i = 1; i < parts.length; i++) {\n const token = parts[i]!;\n const upper = token.toUpperCase();\n // Accept \"NOT NULL\" as two tokens (in addition to NN / NOTNULL / NOT_NULL).\n if (upper === \"NOT\" && parts[i + 1]?.toUpperCase() === \"NULL\") {\n notNull = true;\n i++;\n continue;\n }\n switch (upper) {\n case \"PK\":\n case \"PRIMARY\":\n if (!keys.includes(\"pk\")) keys.push(\"pk\");\n break;\n case \"FK\":\n case \"FOREIGN\":\n if (!keys.includes(\"fk\")) keys.push(\"fk\");\n break;\n case \"UK\":\n case \"UNIQUE\":\n if (!keys.includes(\"uk\")) keys.push(\"uk\");\n break;\n case \"NN\":\n case \"NOTNULL\":\n case \"NOT_NULL\":\n notNull = true;\n break;\n default:\n if (!FLAG_TOKENS.has(upper)) typeParts.push(token);\n break;\n }\n }\n\n if (references && !keys.includes(\"fk\")) keys.push(\"fk\");\n\n return {\n name,\n type: typeParts.length ? typeParts.join(\" \") : undefined,\n keys,\n notNull: notNull || undefined,\n references,\n note,\n };\n}\n\nexport function parseTableColumns(raw: unknown): TableColumn[] {\n if (!Array.isArray(raw)) return [];\n const columns: TableColumn[] = [];\n for (const item of raw) {\n const col = parseTableColumnSpec(String(item));\n if (col) columns.push(col);\n }\n return columns;\n}\n\nexport function findColumnIndex(columns: TableColumn[] | undefined, name: string): number {\n if (!columns) return -1;\n return columns.findIndex((c) => c.name === name);\n}\n\n/**\n * Format a structured column as a highlightable line:\n * `customer_id: uuid FK NN -> customers.id // buyer`\n */\nexport function formatTableColumnLine(col: TableColumn): string {\n const flags: string[] = [];\n for (const key of col.keys) {\n flags.push(key.toUpperCase());\n }\n if (col.notNull) flags.push(\"NN\");\n\n const rhs: string[] = [];\n if (col.type) rhs.push(col.type);\n rhs.push(...flags);\n if (col.references) {\n rhs.push(`-> ${col.references.table}.${col.references.column}`);\n }\n\n let line = col.name;\n if (rhs.length) line += `: ${rhs.join(\" \")}`;\n if (col.note) line += ` // ${col.note}`;\n return line;\n}\n","import type { SourceRange } from \"./geometry.ts\";\n\n/** Diagram surface — flow/state use ELK; sequence uses the time-axis layout engine. */\nexport type DiagramKind = \"flow\" | \"state\" | \"sequence\";\n\nexport type SequenceMessageKind =\n | \"sync\"\n | \"async\"\n | \"return\"\n | \"create\"\n | \"destroy\"\n | \"failure\"\n | \"found\"\n | \"lost\";\n\n/**\n * Combined-fragment operators (canonical long names).\n * Parser also accepts Mermaid-style aliases: alt, opt, par, group.\n */\nexport type SequenceFragmentOperator =\n | \"alternate\"\n | \"optional\"\n | \"loop\"\n | \"parallel\"\n | \"critical\"\n | \"break\"\n | \"section\";\n\n/** Map authored keyword (including aliases) → canonical operator. */\nexport const SEQUENCE_FRAGMENT_ALIASES: Record<string, SequenceFragmentOperator> = {\n alt: \"alternate\",\n alternate: \"alternate\",\n opt: \"optional\",\n optional: \"optional\",\n loop: \"loop\",\n par: \"parallel\",\n parallel: \"parallel\",\n critical: \"critical\",\n break: \"break\",\n group: \"section\",\n section: \"section\",\n box: \"section\",\n};\n\n/** Title-case label painted on the fragment frame (newcomer-friendly). */\nexport function sequenceFragmentDisplayName(operator: SequenceFragmentOperator): string {\n switch (operator) {\n case \"alternate\":\n return \"Alternate\";\n case \"optional\":\n return \"Optional\";\n case \"loop\":\n return \"Loop\";\n case \"parallel\":\n return \"Parallel\";\n case \"critical\":\n return \"Critical\";\n case \"break\":\n return \"Break\";\n case \"section\":\n return \"Section\";\n }\n}\n\nexport function normalizeSequenceFragmentOperator(\n word: string,\n): SequenceFragmentOperator | undefined {\n return SEQUENCE_FRAGMENT_ALIASES[word.toLowerCase()];\n}\n\nexport type SequenceNotePlacement = \"over\" | \"left\" | \"right\";\n\nexport type SequenceMessage = {\n id: string;\n order: number;\n from: string | null;\n to: string | null;\n kind: SequenceMessageKind;\n label?: string;\n labelAuthored?: boolean;\n /** Pair return messages back to the call that opened them (when known). */\n replyTo?: string;\n sourceRange?: SourceRange;\n};\n\nexport type SequenceActivation = {\n id: string;\n participantId: string;\n startOrder: number;\n endOrder: number;\n sourceRange?: SourceRange;\n};\n\nexport type SequenceFragmentOperand = {\n label?: string;\n styleRefs: string[];\n /** Inclusive message-order span covered by this operand. */\n startOrder: number;\n endOrder: number;\n children: SequenceFragment[];\n};\n\nexport type SequenceFragment = {\n id: string;\n operator: SequenceFragmentOperator;\n label?: string;\n /** `is danger` / authored fragment styles. */\n styleRefs: string[];\n /** Inline CSS vars from `style … for fragment` resolution inputs (compile-time bag). */\n unresolvedVars: Record<string, string>;\n startOrder: number;\n endOrder: number;\n operands: SequenceFragmentOperand[];\n sourceRange?: SourceRange;\n};\n\nexport type SequenceNote = {\n id: string;\n order: number;\n placement: SequenceNotePlacement;\n participantIds: string[];\n text: string;\n sourceRange?: SourceRange;\n};\n\nexport type SequenceDivider = {\n id: string;\n order: number;\n label?: string;\n sourceRange?: SourceRange;\n};\n\n/**\n * Sequence-specific IR compiled beside GraphModel.\n * Ordering, activations, and fragments live here — not on unordered GraphEdge alone.\n */\nexport type SequenceIR = {\n autonumber: boolean;\n messages: SequenceMessage[];\n activations: SequenceActivation[];\n fragments: SequenceFragment[];\n notes: SequenceNote[];\n dividers: SequenceDivider[];\n /** Participant ids in declaration order (X axis). */\n participantOrder: string[];\n};\n","/** Edge operators — longest first so `<->` / `<..` / `<~` / `-->` win over shorter prefixes. */\nexport const EDGE_OPS = [\n \"<->\",\n \"<..\",\n \"<~\",\n \"<=\",\n \"<-\",\n \"x-\",\n \"=>\",\n \"~>\",\n \"..>\",\n \"-->\",\n \"-x\",\n \"->\",\n \"--\",\n] as const;\n\nexport type EdgeOperator = (typeof EDGE_OPS)[number];\n\n/** Escape for TextMate / Shiki character classes (e.g. `.` in `..>`). */\nexport function edgeOpsPattern(): string {\n return EDGE_OPS.map((op) => op.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")).join(\"|\");\n}\n","import type { Diagnostic, SourceRange } from \"../types/geometry.ts\";\nimport { EDGE_OPS } from \"./edge-ops.ts\";\n\nexport type TokenType =\n | \"identifier\"\n | \"string\"\n | \"number\"\n | \"lbrace\"\n | \"rbrace\"\n | \"lbracket\"\n | \"rbracket\"\n | \"lparen\"\n | \"rparen\"\n | \"colon\"\n | \"comma\"\n | \"dot\"\n | \"star\"\n | \"edgeOp\"\n | \"comment\"\n | \"newline\"\n | \"eof\";\n\nexport type Token = {\n type: TokenType;\n value: string;\n range: SourceRange;\n};\n\nexport type { EdgeOperator } from \"./edge-ops.ts\";\nexport { EDGE_OPS, edgeOpsPattern } from \"./edge-ops.ts\";\n\n/** Soft keywords — statement intros; lexer emits them as identifiers. */\nexport const STATEMENT_KEYWORDS = new Set([\n \"diagram\",\n \"state\",\n \"sequence\",\n \"kdiagram\",\n \"group\",\n \"boundary\",\n \"zone\",\n \"swimlane\",\n \"direction\",\n \"density\",\n \"layout\",\n \"edges\",\n \"render\",\n \"presentation\",\n \"animation\",\n \"style\",\n \"is\",\n \"for\",\n \"edge\",\n \"svg\",\n \"activate\",\n \"deactivate\",\n \"create\",\n \"destroy\",\n \"note\",\n \"autonumber\",\n \"alt\",\n \"alternate\",\n \"else\",\n \"otherwise\",\n \"opt\",\n \"optional\",\n \"loop\",\n \"par\",\n \"parallel\",\n \"and\",\n \"also\",\n \"critical\",\n \"break\",\n \"section\",\n \"box\",\n \"divider\",\n]);\n\nexport function tokenize(source: string, diagnostics: Diagnostic[] = []): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n let line = 1;\n let column = 1;\n\n const makeRange = (start: number, end: number): SourceRange => {\n const startLine = source.slice(0, start).split(\"\\n\").length;\n const startCol = start - (source.lastIndexOf(\"\\n\", start - 1) + 1) + 1;\n const endLine = source.slice(0, end).split(\"\\n\").length;\n const endCol = end - (source.lastIndexOf(\"\\n\", end - 1) + 1) + 1;\n return {\n start: { line: startLine, column: startCol, offset: start },\n end: { line: endLine, column: endCol, offset: end },\n };\n };\n\n while (i < source.length) {\n const start = i;\n\n if (source[i] === \"\\n\") {\n tokens.push({ type: \"newline\", value: \"\\n\", range: makeRange(start, ++i) });\n line++;\n column = 1;\n continue;\n }\n\n // Whitespace and property separators (`;` is explicit trivia).\n if (source[i] === \" \" || source[i] === \"\\t\" || source[i] === \"\\r\" || source[i] === \";\") {\n i++;\n column++;\n continue;\n }\n\n if (source.slice(i, i + 2) === \"//\") {\n i += 2;\n const commentStart = i;\n while (i < source.length && source[i] !== \"\\n\") i++;\n tokens.push({\n type: \"comment\",\n value: source.slice(commentStart, i).trim(),\n range: makeRange(start, i),\n });\n continue;\n }\n\n if (source.slice(i, i + 2) === \"/*\") {\n i += 2;\n while (i < source.length && source.slice(i, i + 2) !== \"*/\") i++;\n if (i < source.length) i += 2;\n continue;\n }\n\n if (source[i] === \"[\") {\n tokens.push({ type: \"lbracket\", value: \"[\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \"]\") {\n tokens.push({ type: \"rbracket\", value: \"]\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \"(\") {\n tokens.push({ type: \"lparen\", value: \"(\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \")\") {\n tokens.push({ type: \"rparen\", value: \")\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n\n if (source[i] === \"{\") {\n tokens.push({ type: \"lbrace\", value: \"{\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \"}\") {\n tokens.push({ type: \"rbrace\", value: \"}\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \":\") {\n tokens.push({ type: \"colon\", value: \":\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \",\") {\n // Property / list separator — keep as token (parser already skips commas in props).\n tokens.push({ type: \"comma\", value: \",\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n if (source[i] === \"*\") {\n tokens.push({ type: \"star\", value: \"*\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n\n // CSS hex colors (#rgb, #rrggbb, #rgba, #rrggbbaa).\n if (source[i] === \"#\") {\n let j = i + 1;\n while (j < source.length && /[0-9a-fA-F]/.test(source[j]!)) j++;\n const hexLen = j - i - 1;\n if (hexLen === 3 || hexLen === 4 || hexLen === 6 || hexLen === 8) {\n tokens.push({ type: \"identifier\", value: source.slice(i, j), range: makeRange(start, j) });\n column += j - i;\n i = j;\n continue;\n }\n diagnostics.push({\n severity: \"error\",\n code: \"FM006\",\n message: `Unexpected character \"#\"`,\n range: makeRange(start, start + 1),\n hint: \"Use a valid hex color (#rgb, #rrggbb, #rgba, or #rrggbbaa)\",\n });\n i++;\n column++;\n continue;\n }\n\n // Edge ops before '.' so \"..>\" is not split. Association `--` must not steal `--icon-color`.\n let matchedEdge = false;\n for (const op of EDGE_OPS) {\n if (source.slice(i, i + op.length) !== op) continue;\n if (op === \"--\") {\n const next = source[i + 2];\n if (next && /[A-Za-z0-9_-]/.test(next)) continue;\n }\n tokens.push({ type: \"edgeOp\", value: op, range: makeRange(start, i + op.length) });\n i += op.length;\n column += op.length;\n matchedEdge = true;\n break;\n }\n if (matchedEdge) continue;\n\n if (source[i] === \".\") {\n tokens.push({ type: \"dot\", value: \".\", range: makeRange(start, ++i) });\n column++;\n continue;\n }\n\n if (source[i] === '\"') {\n i++;\n let value = \"\";\n while (i < source.length && source[i] !== '\"') {\n if (source[i] === \"\\\\\" && i + 1 < source.length) {\n value += source[++i];\n } else {\n value += source[i];\n }\n i++;\n }\n if (i >= source.length || source[i] !== '\"') {\n diagnostics.push({\n severity: \"error\",\n code: \"FM007\",\n message: \"Unclosed string literal\",\n range: makeRange(start, i),\n });\n } else {\n i++;\n }\n tokens.push({ type: \"string\", value, range: makeRange(start, i) });\n continue;\n }\n\n if (/[0-9]/.test(source[i]!)) {\n let value = \"\";\n while (i < source.length && /[0-9]/.test(source[i]!)) value += source[i++];\n if (source[i] === \".\" && /[0-9]/.test(source[i + 1] ?? \"\")) {\n value += source[i++];\n while (i < source.length && /[0-9]/.test(source[i]!)) value += source[i++];\n }\n tokens.push({ type: \"number\", value, range: makeRange(start, i) });\n continue;\n }\n\n // Identifiers: [a-zA-Z_][a-zA-Z0-9_-]* or CSS custom props --name\n if (source[i] === \"-\" && source[i + 1] === \"-\" && /[a-zA-Z_]/.test(source[i + 2] ?? \"\")) {\n let value = \"--\";\n i += 2;\n while (i < source.length && /[a-zA-Z0-9_-]/.test(source[i]!)) value += source[i++];\n tokens.push({ type: \"identifier\", value, range: makeRange(start, i) });\n continue;\n }\n\n if (/[a-zA-Z_]/.test(source[i]!)) {\n let value = \"\";\n while (i < source.length && /[a-zA-Z0-9_-]/.test(source[i]!)) value += source[i++];\n tokens.push({ type: \"identifier\", value, range: makeRange(start, i) });\n continue;\n }\n\n diagnostics.push({\n severity: \"error\",\n code: \"FM006\",\n message: `Unexpected character \"${source[i]}\"`,\n range: makeRange(start, start + 1),\n });\n i++;\n column++;\n }\n\n tokens.push({\n type: \"eof\",\n value: \"\",\n range: makeRange(source.length, source.length),\n });\n return tokens;\n}\n","import type { Diagnostic, SourceRange } from \"../types/geometry.ts\";\nimport type {\n DiagramAst,\n EdgeAst,\n KDiagramAst,\n GroupAst,\n GroupMemberAst,\n NodeAst,\n PropertyMap,\n SequenceAst,\n SequenceFragmentAst,\n SequenceFragmentOperandAst,\n SequenceStatementAst,\n StatementAst,\n StyleAst,\n StyleRefAst,\n AnimationBlockAst,\n AnimationCueAst,\n AnimationTargetAst,\n TopLevelNode,\n} from \"./ast.ts\";\nimport { tokenize, type Token } from \"./lexer.ts\";\nimport { normalizeSequenceFragmentOperator } from \"../types/sequence.ts\";\n\nexport function parse(source: string): KDiagramAst {\n const diagnostics: Diagnostic[] = [];\n const tokens = tokenize(source, diagnostics);\n const parser = new Parser(tokens, diagnostics, source);\n return parser.parseDocument();\n}\n\nclass Parser {\n private pos = 0;\n\n constructor(\n private tokens: Token[],\n private diagnostics: Diagnostic[],\n private source: string,\n ) {}\n\n private peek(offset = 0): Token {\n return this.tokens[this.pos + offset] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private advance(): Token {\n return this.tokens[this.pos++] ?? this.tokens[this.tokens.length - 1]!;\n }\n\n private at(type: string, value?: string): boolean {\n const t = this.peek();\n return t.type === type && (value === undefined || t.value === value);\n }\n\n /** Soft keyword / identifier word match. */\n private atWord(value: string): boolean {\n const t = this.peek();\n return t.type === \"identifier\" && t.value === value;\n }\n\n private skipNewlines(): void {\n this.skipTrivia();\n }\n\n /** Skip newlines and line comments (trivia). */\n private skipTrivia(): void {\n while (this.at(\"newline\") || this.at(\"comment\")) this.advance();\n }\n\n private error(code: string, message: string, range: SourceRange, hint?: string): void {\n this.diagnostics.push({ severity: \"error\", code, message, range, hint });\n }\n\n parseDocument(): KDiagramAst {\n this.skipNewlines();\n let version: number | undefined;\n\n if (this.atWord(\"kdiagram\")) {\n this.advance();\n const num = this.advance();\n if (num.type === \"number\") version = Number(num.value);\n this.skipNewlines();\n }\n\n const body: TopLevelNode[] = [];\n while (!this.at(\"eof\")) {\n this.skipNewlines();\n if (this.at(\"eof\")) break;\n if (this.atWord(\"diagram\")) {\n body.push(this.parseDiagram(\"flow\"));\n } else if (this.atWord(\"state\")) {\n body.push(this.parseDiagram(\"state\"));\n } else if (this.atWord(\"sequence\")) {\n body.push(this.parseSequence());\n } else {\n this.error(\"FM001\", `Unexpected token \"${this.peek().value}\"`, this.peek().range);\n this.advance();\n }\n this.skipNewlines();\n }\n\n return { type: \"Document\", version, body, diagnostics: this.diagnostics };\n }\n\n private parseSequence(): SequenceAst {\n const start = this.peek().range.start;\n this.advance(); // sequence\n this.skipTrivia();\n let name: string | undefined;\n if (this.at(\"string\")) {\n name = this.advance().value;\n this.skipTrivia();\n }\n if (!this.at(\"lbrace\")) {\n this.error(\"FM002\", 'Expected \"{\" to open sequence', this.peek().range);\n } else {\n this.advance();\n }\n const statements: SequenceStatementAst[] = [];\n\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipNewlines();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n const stmt = this.parseSequenceStatement();\n if (!stmt) continue;\n if (Array.isArray(stmt)) statements.push(...stmt);\n else statements.push(stmt);\n }\n\n if (!this.at(\"rbrace\")) {\n this.error(\"FM002\", 'Expected \"}\" to close sequence', this.peek().range);\n } else {\n this.advance();\n }\n\n const end = this.tokens[Math.min(this.pos, this.tokens.length - 1)]!.range.end;\n return {\n type: \"Sequence\",\n name,\n statements,\n range: { start, end },\n };\n }\n\n private parseSequenceStatement(): SequenceStatementAst | SequenceStatementAst[] | null {\n if (this.at(\"identifier\") && this.peek(1).type === \"colon\") {\n const id = this.advance();\n this.advance(); // colon\n return this.parseNode(id.value, id.range);\n }\n\n if (this.atWord(\"activate\")) return this.parseSequenceActivate();\n if (this.atWord(\"deactivate\")) return this.parseSequenceDeactivate();\n if (this.atWord(\"create\")) return this.parseSequenceCreate();\n if (this.atWord(\"destroy\")) return this.parseSequenceDestroy();\n if (this.atWord(\"note\")) return this.parseSequenceNote();\n if (this.atWord(\"autonumber\")) {\n const tok = this.advance();\n return { type: \"SequenceAutonumber\", range: tok.range };\n }\n if (this.atWord(\"divider\")) {\n return this.parseSequenceDivider();\n }\n if (\n this.atWord(\"alt\") ||\n this.atWord(\"alternate\") ||\n this.atWord(\"opt\") ||\n this.atWord(\"optional\") ||\n this.atWord(\"loop\") ||\n this.atWord(\"par\") ||\n this.atWord(\"parallel\") ||\n this.atWord(\"critical\") ||\n this.atWord(\"break\") ||\n this.atWord(\"group\") ||\n this.atWord(\"section\") ||\n this.atWord(\"box\")\n ) {\n return this.parseSequenceFragment();\n }\n if (this.atWord(\"style\")) return this.parseStyle() as SequenceStatementAst;\n if (this.atWord(\"direction\") || this.atWord(\"density\")) {\n return this.parseDirective() as SequenceStatementAst;\n }\n if (this.atWord(\"layout\")) return this.parseLayoutBlock() as SequenceStatementAst;\n if (this.atWord(\"edges\")) return this.parseEdgePolicyBlock() as SequenceStatementAst;\n if (this.atWord(\"render\")) return this.parseRenderBlock() as SequenceStatementAst;\n if (this.atWord(\"presentation\")) return this.parsePresentationBlock() as SequenceStatementAst;\n if (this.atWord(\"animation\")) return this.parseAnimationBlock() as SequenceStatementAst;\n\n // Found message: `* -> participant`\n if (this.at(\"star\") && this.peek(1).type === \"edgeOp\") {\n const star = this.advance();\n return this.parseEdgeChain(\"*\", undefined, star.range);\n }\n\n if (this.at(\"identifier\")) {\n if (this.looksLikeStyleRef()) {\n return this.parseStyleRefStatement() as SequenceStatementAst;\n }\n const id = this.advance();\n if (this.at(\"dot\") || this.at(\"edgeOp\")) {\n const from = this.parseQualifiedName(id.value, id.range);\n return this.parseEdgeChain(from.nodeId, from.column, id.range);\n }\n this.error(\"FM003\", `Unexpected identifier \"${id.value}\"`, id.range);\n return null;\n }\n\n this.error(\"FM004\", `Unexpected token \"${this.peek().value}\"`, this.peek().range);\n this.advance();\n return null;\n }\n\n private parseSequenceActivate(): SequenceStatementAst {\n const startTok = this.advance();\n const idTok = this.advance();\n if (idTok.type !== \"identifier\") {\n this.error(\"FM140\", \"Expected participant id after activate\", idTok.range);\n return {\n type: \"SequenceActivate\",\n participantId: \"\",\n range: startTok.range,\n };\n }\n return {\n type: \"SequenceActivate\",\n participantId: idTok.value,\n range: { start: startTok.range.start, end: idTok.range.end },\n };\n }\n\n private parseSequenceDeactivate(): SequenceStatementAst {\n const startTok = this.advance();\n const idTok = this.advance();\n if (idTok.type !== \"identifier\") {\n this.error(\"FM141\", \"Expected participant id after deactivate\", idTok.range);\n return {\n type: \"SequenceDeactivate\",\n participantId: \"\",\n range: startTok.range,\n };\n }\n return {\n type: \"SequenceDeactivate\",\n participantId: idTok.value,\n range: { start: startTok.range.start, end: idTok.range.end },\n };\n }\n\n private parseSequenceCreate(): SequenceStatementAst {\n const startTok = this.advance(); // create\n this.skipTrivia();\n if (!(this.at(\"identifier\") && this.peek(1).type === \"colon\")) {\n this.error(\"FM142\", 'Expected `create id: kind \"Label\"`', this.peek().range);\n return {\n type: \"SequenceCreate\",\n node: {\n type: \"Node\",\n id: \"\",\n kind: \"participant\",\n properties: {},\n styleRefs: [],\n range: startTok.range,\n },\n range: startTok.range,\n };\n }\n const id = this.advance();\n this.advance(); // colon\n const node = this.parseNode(id.value, id.range);\n return {\n type: \"SequenceCreate\",\n node,\n range: { start: startTok.range.start, end: node.range.end },\n };\n }\n\n private parseSequenceDestroy(): SequenceStatementAst {\n const startTok = this.advance();\n const idTok = this.advance();\n if (idTok.type !== \"identifier\") {\n this.error(\"FM143\", \"Expected participant id after destroy\", idTok.range);\n return {\n type: \"SequenceDestroy\",\n participantId: \"\",\n range: startTok.range,\n };\n }\n return {\n type: \"SequenceDestroy\",\n participantId: idTok.value,\n range: { start: startTok.range.start, end: idTok.range.end },\n };\n }\n\n private parseSequenceNote(): SequenceStatementAst {\n const startTok = this.advance(); // note\n this.skipTrivia();\n let placement: \"over\" | \"left\" | \"right\" = \"over\";\n if (this.atWord(\"over\")) {\n this.advance();\n placement = \"over\";\n } else if (this.atWord(\"left\")) {\n this.advance();\n this.skipTrivia();\n if (this.atWord(\"of\")) this.advance();\n placement = \"left\";\n } else if (this.atWord(\"right\")) {\n this.advance();\n this.skipTrivia();\n if (this.atWord(\"of\")) this.advance();\n placement = \"right\";\n } else {\n this.error(\"FM144\", \"Expected note placement (over | left of | right of)\", this.peek().range);\n }\n this.skipTrivia();\n const participantIds: string[] = [];\n while (this.at(\"identifier\")) {\n participantIds.push(this.advance().value);\n this.skipTrivia();\n if (this.at(\"comma\")) {\n this.advance();\n this.skipTrivia();\n continue;\n }\n break;\n }\n let text = \"\";\n if (this.at(\"string\")) {\n text = this.advance().value;\n } else {\n this.error(\"FM145\", \"Expected note text string\", this.peek().range);\n }\n return {\n type: \"SequenceNote\",\n placement,\n participantIds,\n text,\n range: {\n start: startTok.range.start,\n end: this.peek(-1)?.range.end ?? startTok.range.end,\n },\n };\n }\n\n private parseSequenceDivider(): SequenceStatementAst {\n const startTok = this.advance(); // divider\n this.skipTrivia();\n let label: string | undefined;\n if (this.at(\"string\")) label = this.advance().value;\n return {\n type: \"SequenceDivider\",\n label,\n range: {\n start: startTok.range.start,\n end: this.peek(-1)?.range.end ?? startTok.range.end,\n },\n };\n }\n\n private parseSequenceFragment(): SequenceFragmentAst {\n const startTok = this.peek();\n const operator = normalizeSequenceFragmentOperator(startTok.value) ?? \"section\";\n this.advance();\n this.skipTrivia();\n let label: string | undefined;\n if (this.at(\"string\")) {\n label = this.advance().value;\n this.skipTrivia();\n }\n const styleRefs = this.parseOptionalIsStyleRefs();\n this.skipTrivia();\n const operands: SequenceFragmentOperandAst[] = [];\n // Opening `is …` styles the first operand (and the fragment frame fallback).\n const first = this.parseSequenceFragmentBody(label, styleRefs);\n operands.push(first);\n\n // alternate … else|otherwise … / parallel … and|also …\n while (\n (operator === \"alternate\" && (this.atWord(\"else\") || this.atWord(\"otherwise\"))) ||\n (operator === \"parallel\" && (this.atWord(\"and\") || this.atWord(\"also\")))\n ) {\n this.advance();\n this.skipTrivia();\n let opLabel: string | undefined;\n if (this.at(\"string\")) {\n opLabel = this.advance().value;\n this.skipTrivia();\n }\n const opStyleRefs = this.parseOptionalIsStyleRefs();\n this.skipTrivia();\n operands.push(this.parseSequenceFragmentBody(opLabel, opStyleRefs));\n }\n\n return {\n type: \"SequenceFragment\",\n operator,\n label,\n styleRefs,\n operands,\n range: {\n start: startTok.range.start,\n end: this.peek(-1)?.range.end ?? startTok.range.end,\n },\n };\n }\n\n private parseSequenceFragmentBody(\n label?: string,\n styleRefs: string[] = [],\n ): SequenceFragmentOperandAst {\n const start = this.peek().range.start;\n if (!this.at(\"lbrace\")) {\n this.error(\"FM146\", 'Expected \"{\" to open fragment body', this.peek().range);\n return { label, styleRefs, statements: [], range: this.peek().range };\n }\n this.advance();\n const statements: SequenceStatementAst[] = [];\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipNewlines();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n const stmt = this.parseSequenceStatement();\n if (!stmt) continue;\n if (Array.isArray(stmt)) statements.push(...stmt);\n else statements.push(stmt);\n }\n if (!this.at(\"rbrace\")) {\n this.error(\"FM146\", 'Expected \"}\" to close fragment body', this.peek().range);\n } else {\n this.advance();\n }\n return {\n label,\n styleRefs,\n statements,\n range: { start, end: this.peek(-1)?.range.end ?? start },\n };\n }\n\n private parseDiagram(diagramKind: \"flow\" | \"state\"): DiagramAst {\n const start = this.peek().range.start;\n this.advance(); // diagram | state\n this.skipTrivia();\n // Title is optional: `diagram { … }` or `diagram \"Title\" { … }`.\n let name: string | undefined;\n if (this.at(\"string\")) {\n name = this.advance().value;\n this.skipTrivia();\n }\n if (!this.at(\"lbrace\")) {\n this.error(\"FM002\", `Expected \"{\" to open ${diagramKind} diagram`, this.peek().range);\n } else {\n this.advance();\n }\n const statements: StatementAst[] = [];\n\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipNewlines();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n const stmt = this.parseStatement(true);\n if (!stmt) continue;\n if (Array.isArray(stmt)) statements.push(...stmt);\n else statements.push(stmt);\n }\n\n if (!this.at(\"rbrace\")) {\n this.error(\"FM002\", 'Expected \"}\" to close diagram', this.peek().range);\n } else {\n this.advance();\n }\n\n const end = this.tokens[Math.min(this.pos, this.tokens.length - 1)]!.range.end;\n return {\n type: \"Diagram\",\n diagramKind,\n name,\n statements,\n range: { start, end },\n };\n }\n\n private parseStatement(inGroup = false): StatementAst | StatementAst[] | null {\n // Soft keywords: `id: kind` is always a node (so `edge: gateway` / `layout: service` work).\n // Group layout hints (`arrange:`, `gap:`, …) stay directives inside groups.\n if (this.at(\"identifier\") && this.peek(1).type === \"colon\") {\n if (inGroup && isGroupLayoutHint(this.peek().value)) {\n return this.parseDirective();\n }\n const id = this.advance();\n this.advance(); // colon\n return this.parseNode(id.value, id.range);\n }\n\n if (\n this.atWord(\"group\") ||\n this.atWord(\"boundary\") ||\n this.atWord(\"zone\") ||\n this.atWord(\"swimlane\")\n ) {\n return this.parseGroup();\n }\n if (this.atWord(\"style\")) return this.parseStyle();\n if (this.atWord(\"direction\") || this.atWord(\"density\")) {\n return this.parseDirective();\n }\n if (this.atWord(\"layout\")) return this.parseLayoutBlock();\n if (this.atWord(\"edges\")) return this.parseEdgePolicyBlock();\n if (this.atWord(\"render\")) return this.parseRenderBlock();\n if (this.atWord(\"presentation\")) return this.parsePresentationBlock();\n if (this.atWord(\"animation\")) return this.parseAnimationBlock();\n\n if (this.at(\"identifier\")) {\n if (this.looksLikeStyleRef()) {\n return this.parseStyleRefStatement();\n }\n if (inGroup && this.looksLikeGroupMember()) {\n return this.parseGroupMemberList();\n }\n const id = this.advance();\n if (this.at(\"dot\") || this.at(\"edgeOp\")) {\n const from = this.parseQualifiedName(id.value, id.range);\n return this.parseEdgeChain(from.nodeId, from.column, id.range);\n }\n this.error(\"FM003\", `Unexpected identifier \"${id.value}\"`, id.range);\n return null;\n }\n\n this.error(\"FM004\", `Unexpected token \"${this.peek().value}\"`, this.peek().range);\n this.advance();\n return null;\n }\n\n private parseNode(id: string, idRange: SourceRange): NodeAst {\n const start = idRange.start;\n const kindTok = this.advance();\n const kind = kindTok.value;\n let label: string | undefined;\n if (this.at(\"string\")) label = this.advance().value;\n\n // `deadLetter: dlq \"…\" is failed { icon: … }` or `{ … } is failed`\n const styleRefs = this.parseOptionalIsStyleRefs();\n const properties = this.parseOptionalProperties();\n styleRefs.push(...this.parseOptionalIsStyleRefs());\n const end = this.peek(-1)?.range.end ?? kindTok.range.end;\n return { type: \"Node\", id, kind, label, properties, styleRefs, range: { start, end } };\n }\n\n private parseOptionalIsStyleRefs(): string[] {\n const refs: string[] = [];\n while (this.atWord(\"is\")) {\n this.advance();\n const styleTok = this.advance();\n if (styleTok.type !== \"identifier\") {\n this.error(\"FM008\", 'Expected style name after \"is\"', styleTok.range);\n break;\n }\n refs.push(styleTok.value);\n }\n return refs;\n }\n\n private parseQualifiedName(\n firstId: string,\n _firstRange: SourceRange,\n ): { nodeId: string; column?: string } {\n if (!this.at(\"dot\")) return { nodeId: firstId };\n this.advance();\n const colTok = this.advance();\n if (colTok.type !== \"identifier\") {\n this.error(\"FM007\", \"Expected column name after '.'\", colTok.range);\n return { nodeId: firstId };\n }\n return { nodeId: firstId, column: colTok.value };\n }\n\n private parseEdgeChain(\n from: string,\n fromColumn: string | undefined,\n fromRange: SourceRange,\n ): EdgeAst[] {\n const edges: EdgeAst[] = [];\n let currentFrom = from;\n let currentFromColumn = fromColumn;\n let chainStart = fromRange.start;\n\n while (this.at(\"edgeOp\")) {\n const opTok = this.advance();\n let toNodeId: string;\n let toColumn: string | undefined;\n let toRange: SourceRange;\n if (this.at(\"star\")) {\n const star = this.advance();\n toNodeId = \"*\";\n toRange = star.range;\n } else {\n const toTok = this.advance();\n if (toTok.type !== \"identifier\") {\n this.error(\n \"FM005\",\n \"Expected target node id after edge operator\",\n toTok.range,\n \"Add a target node id after the edge operator.\",\n );\n break;\n }\n const to = this.parseQualifiedName(toTok.value, toTok.range);\n toNodeId = to.nodeId;\n toColumn = to.column;\n toRange = toTok.range;\n }\n\n let label: string | undefined;\n if (this.at(\"string\")) label = this.advance().value;\n const properties = this.parseOptionalProperties();\n const end = this.peek(-1)?.range.end ?? toRange.end;\n\n edges.push({\n type: \"Edge\",\n from: currentFrom,\n to: toNodeId,\n fromColumn: currentFromColumn,\n toColumn,\n op: opTok.value as EdgeAst[\"op\"],\n label,\n properties,\n styleRefs: [],\n range: { start: chainStart, end },\n });\n\n currentFrom = toNodeId;\n currentFromColumn = toColumn;\n chainStart = toRange.start;\n\n if (this.atWord(\"is\")) {\n this.advance();\n const styleTok = this.advance();\n edges[edges.length - 1]!.styleRefs.push(styleTok.value);\n }\n }\n\n return edges;\n }\n\n private looksLikeStyleRef(): boolean {\n let p = this.pos;\n while (this.tokens[p]?.type === \"identifier\") {\n p++;\n if (this.tokens[p]?.type === \"comma\") {\n p++;\n continue;\n }\n break;\n }\n const t = this.tokens[p];\n return t?.type === \"identifier\" && t.value === \"is\";\n }\n\n private looksLikeGroupMember(): boolean {\n if (!this.at(\"identifier\")) return false;\n const next = this.peek(1);\n if (next.type === \"colon\" || next.type === \"edgeOp\" || next.type === \"dot\") return false;\n if (next.type === \"identifier\" && next.value === \"is\") return false;\n return true;\n }\n\n private parseStyleRefStatement(): StyleRefAst {\n const start = this.peek().range.start;\n const targetIds: string[] = [this.advance().value];\n while (this.at(\"comma\")) {\n this.advance();\n targetIds.push(this.advance().value);\n }\n this.advance(); // is\n const styleName = this.advance().value;\n const end = this.peek(-1)?.range.end ?? start;\n return { type: \"StyleRef\", targetIds, styleName, range: { start, end } };\n }\n\n private parseGroupMemberList(): GroupMemberAst {\n const start = this.peek().range.start;\n const nodeIds: string[] = [this.advance().value];\n while (this.at(\"comma\")) {\n this.advance();\n nodeIds.push(this.advance().value);\n }\n const end = this.peek(-1)?.range.end ?? start;\n return { type: \"GroupMember\", nodeIds, range: { start, end } };\n }\n\n private parseGroup(): GroupAst {\n const start = this.peek().range.start;\n const kindTok = this.advance();\n const groupKind = kindTok.value as GroupAst[\"groupKind\"];\n let id: string | undefined;\n let label: string | undefined;\n\n if (this.at(\"identifier\")) id = this.advance().value;\n if (this.at(\"string\")) label = this.advance().value;\n\n const properties: PropertyMap = {};\n if (this.at(\"lbrace\")) {\n this.advance();\n const statements: StatementAst[] = [];\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipNewlines();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n const stmt = this.parseStatement(true);\n if (!stmt) continue;\n if (Array.isArray(stmt)) statements.push(...stmt);\n else statements.push(stmt);\n }\n if (this.at(\"rbrace\")) this.advance();\n const end = this.peek(-1)?.range.end ?? kindTok.range.end;\n return { type: \"Group\", id, label, groupKind, statements, properties, range: { start, end } };\n }\n\n this.error(\"FM006\", \"Expected { after group declaration\", this.peek().range);\n return {\n type: \"Group\",\n id,\n label,\n groupKind,\n statements: [],\n properties,\n range: { start, end: kindTok.range.end },\n };\n }\n\n private parseStyle(): StyleAst {\n const start = this.advance().range.start;\n const nameTok = this.advance();\n const name = nameTok.value;\n let target: StyleAst[\"target\"] = \"node\";\n if (this.atWord(\"for\")) {\n this.advance();\n if (this.atWord(\"edge\")) {\n this.advance();\n target = \"edge\";\n } else if (this.atWord(\"fragment\")) {\n this.advance();\n target = \"fragment\";\n }\n }\n const properties = this.parseBlockProperties();\n return {\n type: \"Style\",\n name,\n target,\n properties,\n range: { start, end: this.peek(-1)?.range.end ?? nameTok.range.end },\n };\n }\n\n private parseDirective(): StatementAst {\n const keywordTok = this.advance();\n const start = keywordTok.range.start;\n const name = keywordTok.value;\n let value: string | number | boolean | string[] | undefined;\n if (this.at(\"colon\")) this.advance();\n if (this.at(\"lbracket\")) {\n value = this.parseIdentifierList();\n } else if (\n !this.at(\"newline\") &&\n !this.at(\"comment\") &&\n !this.at(\"rbrace\") &&\n !this.at(\"eof\")\n ) {\n value = this.parsePropertyValue();\n }\n return {\n type: \"Directive\",\n name,\n value,\n range: { start, end: this.peek(-1)?.range.end ?? keywordTok.range.end },\n };\n }\n\n private parseLayoutBlock(): StatementAst {\n const start = this.advance().range.start;\n const properties = this.parseBlockProperties();\n return {\n type: \"LayoutBlock\",\n properties,\n range: { start, end: this.peek(-1)?.range.end ?? { line: 1, column: 1, offset: 0 } },\n };\n }\n\n private parseEdgePolicyBlock(): StatementAst {\n const start = this.advance().range.start;\n const properties = this.parseBlockProperties();\n return {\n type: \"EdgePolicyBlock\",\n properties,\n range: { start, end: this.peek(-1)?.range.end ?? { line: 1, column: 1, offset: 0 } },\n };\n }\n\n private parseRenderBlock(): StatementAst {\n const start = this.advance().range.start;\n const properties = this.at(\"lbrace\") ? this.parseBlockProperties() : {};\n return {\n type: \"RenderBlock\",\n properties,\n range: { start, end: this.peek(-1)?.range.end ?? { line: 1, column: 1, offset: 0 } },\n };\n }\n\n private parsePresentationBlock(): StatementAst {\n const start = this.advance().range.start;\n const properties = this.at(\"lbrace\") ? this.parseBlockProperties() : {};\n return {\n type: \"PresentationBlock\",\n properties,\n range: { start, end: this.peek(-1)?.range.end ?? { line: 1, column: 1, offset: 0 } },\n };\n }\n\n private parseAnimationBlock(): AnimationBlockAst {\n const startTok = this.advance(); // animation\n this.skipTrivia();\n let name = \"Animation\";\n if (this.at(\"string\")) {\n name = this.advance().value;\n this.skipTrivia();\n } else {\n this.error(\"FM120\", \"Expected quoted animation name after `animation`\", this.peek().range);\n }\n if (!this.at(\"lbrace\")) {\n this.error(\"FM121\", 'Expected \"{\" to open animation block', this.peek().range);\n return {\n type: \"AnimationBlock\",\n name,\n cues: [],\n range: { start: startTok.range.start, end: startTok.range.end },\n };\n }\n this.advance(); // {\n const cues: AnimationCueAst[] = [];\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipTrivia();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n const cue = this.parseAnimationCue();\n if (cue) cues.push(cue);\n }\n if (this.at(\"rbrace\")) this.advance();\n else this.error(\"FM121\", 'Expected \"}\" to close animation block', this.peek().range);\n return {\n type: \"AnimationBlock\",\n name,\n cues,\n range: {\n start: startTok.range.start,\n end: this.peek(-1)?.range.end ?? startTok.range.end,\n },\n };\n }\n\n private parseAnimationCue(): AnimationCueAst | null {\n const start = this.peek().range;\n if (this.atWord(\"loop\")) {\n this.advance();\n return { type: \"loop\", range: start };\n }\n if (this.atWord(\"wait\")) {\n this.advance();\n const durationMs = this.parseDurationMs() ?? 400;\n return {\n type: \"wait\",\n durationMs,\n range: { start: start.start, end: this.peek(-1)?.range.end ?? start.end },\n };\n }\n if (this.atWord(\"parallel\")) {\n this.advance();\n this.skipTrivia();\n if (!this.at(\"lbrace\")) {\n this.error(\"FM121\", 'Expected \"{\" to open parallel animation group', this.peek().range);\n return null;\n }\n this.advance(); // {\n const cues: AnimationCueAst[] = [];\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipTrivia();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n if (this.atWord(\"parallel\")) {\n this.error(\n \"FM130\",\n \"Nested parallel groups are not supported\",\n this.peek().range,\n \"Keep parallel groups one level deep\",\n );\n this.advance();\n continue;\n }\n if (this.atWord(\"loop\")) {\n this.error(\n \"FM129\",\n \"`loop` belongs on the animation block, not inside parallel\",\n this.peek().range,\n );\n this.advance();\n continue;\n }\n const cue = this.parseAnimationCue();\n if (cue) cues.push(cue);\n }\n if (this.at(\"rbrace\")) this.advance();\n else this.error(\"FM121\", 'Expected \"}\" to close parallel group', this.peek().range);\n return {\n type: \"parallel\",\n cues,\n range: { start: start.start, end: this.peek(-1)?.range.end ?? start.end },\n };\n }\n if (this.atWord(\"dim\") || this.atWord(\"activate\") || this.atWord(\"pulse\")) {\n const op = this.advance().value as \"dim\" | \"activate\" | \"pulse\";\n const targets = this.parseAnimationTargets();\n let durationMs: number | undefined;\n if (op === \"pulse\" && this.atWord(\"for\")) {\n this.advance();\n durationMs = this.parseDurationMs();\n }\n const range = {\n start: start.start,\n end: this.peek(-1)?.range.end ?? start.end,\n };\n if (op === \"pulse\") return { type: \"pulse\", targets, durationMs, range };\n return { type: op, targets, range };\n }\n if (this.atWord(\"flow\")) {\n this.advance();\n const path = this.parseAnimationPath();\n let durationMs: number | undefined;\n if (this.atWord(\"for\")) {\n this.advance();\n durationMs = this.parseDurationMs();\n }\n return {\n type: \"flow\",\n path,\n durationMs,\n range: { start: start.start, end: this.peek(-1)?.range.end ?? start.end },\n };\n }\n this.error(\n \"FM122\",\n `Unexpected animation cue \"${this.peek().value}\"`,\n this.peek().range,\n \"Expected dim, activate, pulse, flow, wait, parallel, or loop\",\n );\n this.advance();\n return null;\n }\n\n private parseAnimationTargets(): AnimationTargetAst[] {\n const targets: AnimationTargetAst[] = [];\n for (;;) {\n this.skipTrivia();\n if (this.at(\"star\")) {\n this.advance();\n targets.push({ type: \"all\" });\n } else if (this.at(\"identifier\")) {\n const from = this.advance().value;\n if (this.at(\"edgeOp\") && this.peek().value === \"->\") {\n this.advance();\n if (!this.at(\"identifier\")) {\n this.error(\n \"FM123\",\n \"Expected node id after `->` in animation target\",\n this.peek().range,\n );\n break;\n }\n const to = this.advance().value;\n targets.push({ type: \"edge\", from, to });\n } else {\n targets.push({ type: \"node\", id: from });\n }\n } else {\n break;\n }\n this.skipTrivia();\n if (this.at(\"comma\")) {\n this.advance();\n continue;\n }\n break;\n }\n if (targets.length === 0) {\n this.error(\"FM124\", \"Expected animation target (* or node id)\", this.peek().range);\n }\n return targets;\n }\n\n private parseAnimationPath(): string[] {\n const path: string[] = [];\n if (!this.at(\"identifier\")) {\n this.error(\"FM125\", \"Expected node id to start flow path\", this.peek().range);\n return path;\n }\n path.push(this.advance().value);\n while (this.at(\"edgeOp\") && this.peek().value === \"->\") {\n this.advance();\n if (!this.at(\"identifier\")) {\n this.error(\"FM125\", \"Expected node id after `->` in flow path\", this.peek().range);\n break;\n }\n path.push(this.advance().value);\n }\n if (path.length < 2) {\n this.error(\"FM126\", \"flow path needs at least two node ids (a -> b)\", this.peek().range);\n }\n return path;\n }\n\n /** Parse `800ms`, `1.5s`, or bare number (milliseconds). */\n private parseDurationMs(): number | undefined {\n if (!this.at(\"number\")) {\n this.error(\"FM127\", \"Expected duration (e.g. 800ms or 1.5s)\", this.peek().range);\n return undefined;\n }\n const n = Number(this.advance().value);\n if (!Number.isFinite(n)) return undefined;\n if (this.at(\"identifier\") && (this.peek().value === \"ms\" || this.peek().value === \"s\")) {\n const unit = this.advance().value;\n return unit === \"s\" ? Math.round(n * 1000) : Math.round(n);\n }\n return Math.round(n);\n }\n\n private parseBlockProperties(): PropertyMap {\n const props: PropertyMap = {};\n if (!this.at(\"lbrace\")) return props;\n this.advance();\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipTrivia();\n if (this.at(\"identifier\")) {\n const key = this.advance().value;\n if (this.at(\"colon\")) this.advance();\n // Structured ERD columns: `columns { id: uuid PK … }`\n if (key === \"columns\" && this.at(\"lbrace\")) {\n props[key] = this.parseColumnsBlock();\n continue;\n }\n if (this.at(\"lbracket\")) {\n props[key] = this.parseIdentifierList();\n continue;\n }\n if (this.at(\"newline\") || this.at(\"comment\") || this.at(\"rbrace\") || this.at(\"eof\")) {\n continue;\n }\n // CSS custom properties keep raw line text (`#hex`, `var(...)`, color-mix, …).\n // `iconColor` is a CSS color shorthand for `--icon-color`.\n props[key] =\n key.startsWith(\"--\") || key === \"iconColor\"\n ? this.parseCssValue()\n : this.parsePropertyValue();\n } else if (!this.at(\"rbrace\")) {\n this.advance();\n }\n }\n if (this.at(\"rbrace\")) this.advance();\n return props;\n }\n\n /**\n * Property values: numbers, booleans, strings, identifiers,\n * and qualified ids like `lucide:user` / `logos:aws`.\n */\n private parsePropertyValue(): string | number | boolean {\n const val = this.advance();\n if (val.type === \"number\") return Number(val.value);\n if (val.value === \"true\" || val.value === \"false\") {\n return val.value === \"true\";\n }\n if (val.type === \"string\") return val.value;\n let text = val.value;\n // `collection:name` (Iconify / Lucide-style) — keep consuming `:` + identifier segments.\n while (this.at(\"colon\") && this.peek(1).type === \"identifier\") {\n this.advance(); // :\n text += `:${this.advance().value}`;\n }\n return text;\n }\n\n /**\n * CSS custom-property values on a style/node — slice source through end of line so\n * `#hex`, `var(...)`, and `color-mix(...)` keep spaces and punctuation.\n */\n private parseCssValue(): string {\n if (this.at(\"string\")) return this.advance().value;\n if (this.at(\"newline\") || this.at(\"comment\") || this.at(\"rbrace\") || this.at(\"eof\")) {\n return \"\";\n }\n const start = this.peek().range.start.offset;\n let end = start;\n while (!this.at(\"newline\") && !this.at(\"comment\") && !this.at(\"rbrace\") && !this.at(\"eof\")) {\n end = this.advance().range.end.offset;\n }\n return this.source.slice(start, end).trim();\n }\n\n /**\n * Parse `columns { name: type FLAGS … }` into compact column specs\n * (same strings `parseTableColumnSpec` already understands).\n */\n private parseColumnsBlock(): string[] {\n const cols: string[] = [];\n if (!this.at(\"lbrace\")) return cols;\n this.advance(); // {\n while (!this.at(\"rbrace\") && !this.at(\"eof\")) {\n this.skipTrivia();\n if (this.at(\"rbrace\") || this.at(\"eof\")) break;\n\n if (this.peek().type !== \"identifier\") {\n this.error(\"FM113\", \"Expected column name in columns block\", this.peek().range);\n this.advance();\n continue;\n }\n const nameTok = this.advance();\n if (this.at(\"colon\")) this.advance();\n\n const parts: string[] = [];\n while (\n !this.at(\"newline\") &&\n !this.at(\"comment\") &&\n !this.at(\"rbrace\") &&\n !this.at(\"eof\") &&\n !this.at(\"comma\")\n ) {\n const t = this.advance();\n parts.push(t.value);\n }\n\n let note: string | undefined;\n if (this.at(\"comment\")) {\n note = this.advance().value || undefined;\n }\n if (this.at(\"comma\")) this.advance();\n\n const body = joinColumnParts(parts);\n const spec = note ? `${nameTok.value}: ${body} // ${note}` : `${nameTok.value}: ${body}`;\n cols.push(spec.trim());\n }\n if (this.at(\"rbrace\")) this.advance();\n return cols;\n }\n\n private parseOptionalProperties(): PropertyMap {\n if (!this.at(\"lbrace\")) return {};\n return this.parseBlockProperties();\n }\n\n private parseIdentifierList(): string[] {\n const items: string[] = [];\n if (!this.at(\"lbracket\")) return items;\n this.advance();\n while (!this.at(\"rbracket\") && !this.at(\"eof\")) {\n this.skipTrivia();\n if (this.at(\"rbracket\")) break;\n items.push(this.advance().value);\n if (this.at(\"comma\")) this.advance();\n }\n if (this.at(\"rbracket\")) this.advance();\n return items;\n }\n}\n\n/** Join column RHS tokens so `customers . id` becomes `customers.id`. */\nfunction joinColumnParts(parts: string[]): string {\n if (parts.length === 0) return \"\";\n let out = \"\";\n for (const part of parts) {\n if (part === \".\") {\n out = out.trimEnd() + \".\";\n continue;\n }\n if (out.endsWith(\".\")) {\n out += part;\n continue;\n }\n out += out ? ` ${part}` : part;\n }\n return out.trim();\n}\n\nconst GROUP_LAYOUT_HINTS = new Set([\n \"padding\",\n \"arrange\",\n \"align\",\n \"gap\",\n \"columns\",\n \"rows\",\n \"column\",\n \"row\",\n \"span\",\n \"colSpan\",\n \"rowSpan\",\n \"chrome\",\n \"icon\",\n \"iconPaint\",\n \"iconColor\",\n]);\n\nfunction isGroupLayoutHint(name: string): boolean {\n return GROUP_LAYOUT_HINTS.has(name);\n}\n","/** Padding — uniform number or per-side box. */\nexport type PaddingSpec = number | { top?: number; right?: number; bottom?: number; left?: number };\n\n/** Only as-authored — no silent case transforms. */\nexport type LabelCasePolicy = \"as-authored\";\n\nexport type TitleSpec =\n | false\n | true\n | \"auto\"\n | {\n text?: string;\n subtitle?: string;\n align?: \"start\" | \"center\";\n };\n\n/**\n * Opt-in presentation chrome. Omitted options yield embeddable, transparent SVG.\n * There are no presets — set fields explicitly when you want title, accents, etc.\n */\nexport type PresentationOptions = {\n title?: TitleSpec;\n /** Outer inset around the full rendered canvas (including chrome). */\n padding?: PaddingSpec;\n /** Gap between chrome elements (title block) and diagram content. */\n contentPadding?: PaddingSpec;\n labelCase?: LabelCasePolicy;\n /**\n * When true, stamp built-in kind eyebrows (Service, Gateway, …) under every node.\n * Prefer per-node `subtitle: \"…\"` for authored captions. Default false.\n */\n showKindSubtitles?: boolean;\n /**\n * When true, paint small dots where edges meet node silhouettes.\n * Dot fill matches the edge stroke. Default false.\n */\n showEndpoints?: boolean;\n /** Tint group bands for review readability. */\n groupAccent?: boolean;\n /** Keep edge labels inside the diagram bounds (default true). */\n clampLabels?: boolean;\n};\n\nexport type ResolvedPadding = { top: number; right: number; bottom: number; left: number };\n\nexport type ResolvedTitle =\n | false\n | {\n text: string;\n subtitle?: string;\n align: \"start\" | \"center\";\n };\n\n/** Fully resolved presentation — no undefined fields. */\nexport type ResolvedPresentation = {\n title: ResolvedTitle;\n padding: ResolvedPadding;\n contentPadding: ResolvedPadding;\n labelCase: LabelCasePolicy;\n showKindSubtitles: boolean;\n showEndpoints: boolean;\n groupAccent: boolean;\n clampLabels: boolean;\n};\n\n/** Props removed from the presentation DSL — emit a diagnostic instead of ignoring. */\nexport const REMOVED_PRESENTATION_PROPS = [\n \"preset\",\n \"background\",\n \"grid\",\n \"frame\",\n \"legend\",\n \"nodeGradient\",\n \"groupHeaders\",\n] as const;\n\nexport type RemovedPresentationProp = (typeof REMOVED_PRESENTATION_PROPS)[number];\n\nexport function normalizePadding(spec: PaddingSpec | undefined, fallback = 0): ResolvedPadding {\n if (spec == null) {\n return { top: fallback, right: fallback, bottom: fallback, left: fallback };\n }\n if (typeof spec === \"number\") {\n return { top: spec, right: spec, bottom: spec, left: spec };\n }\n return {\n top: spec.top ?? fallback,\n right: spec.right ?? fallback,\n bottom: spec.bottom ?? fallback,\n left: spec.left ?? fallback,\n };\n}\n\nconst BASE_DEFAULTS: PresentationOptions = {\n title: false,\n labelCase: \"as-authored\",\n showKindSubtitles: false,\n showEndpoints: false,\n groupAccent: false,\n clampLabels: true,\n};\n\nfunction resolveTitle(title: TitleSpec | undefined, graphTitle?: string): ResolvedTitle {\n if (title === false || title == null) return false;\n if (title === true || title === \"auto\") {\n if (!graphTitle) return false;\n return { text: graphTitle, align: \"start\" };\n }\n if (typeof title === \"object\") {\n const text = title.text ?? graphTitle;\n if (!text) return false;\n return {\n text,\n subtitle: title.subtitle,\n align: title.align ?? \"start\",\n };\n }\n return false;\n}\n\n/** Merge explicit options onto chromeless defaults. */\nexport function resolvePresentation(\n options: PresentationOptions | undefined,\n graphTitle?: string,\n): ResolvedPresentation {\n const merged: PresentationOptions = {\n ...BASE_DEFAULTS,\n ...options,\n };\n\n return {\n title: resolveTitle(merged.title, graphTitle),\n padding: normalizePadding(merged.padding, 0),\n contentPadding: normalizePadding(merged.contentPadding, 0),\n labelCase: \"as-authored\",\n showKindSubtitles: merged.showKindSubtitles === true,\n showEndpoints: merged.showEndpoints === true,\n groupAccent: merged.groupAccent === true,\n clampLabels: merged.clampLabels !== false,\n };\n}\n\n/** Parse a DSL property map into PresentationOptions. */\nexport function presentationFromProperties(props: Record<string, unknown>): PresentationOptions {\n const out: PresentationOptions = {};\n\n const str = (key: string): string | undefined => {\n const v = props[key];\n return typeof v === \"string\" ? v : undefined;\n };\n const bool = (key: string): boolean | undefined => {\n const v = props[key];\n if (typeof v === \"boolean\") return v;\n if (v === \"true\") return true;\n if (v === \"false\") return false;\n return undefined;\n };\n const num = (key: string): number | undefined => {\n const v = props[key];\n return typeof v === \"number\" ? v : undefined;\n };\n\n const titleVal = props.title;\n const titleSubtitle = str(\"titleSubtitle\");\n const titleAlign = str(\"titleAlign\") as \"start\" | \"center\" | undefined;\n if (titleVal === false || titleVal === \"false\" || titleVal === \"none\") out.title = false;\n else if (titleVal === true || titleVal === \"true\" || titleVal === \"auto\") {\n if (titleSubtitle || titleAlign) {\n out.title = { subtitle: titleSubtitle, align: titleAlign };\n } else {\n out.title = titleVal === \"auto\" ? \"auto\" : true;\n }\n } else if (typeof titleVal === \"string\") {\n out.title = {\n text: titleVal,\n subtitle: titleSubtitle,\n align: titleAlign,\n };\n } else if (titleSubtitle || titleAlign) {\n out.title = { subtitle: titleSubtitle, align: titleAlign };\n }\n\n const padding = num(\"padding\");\n if (padding != null) out.padding = padding;\n\n const contentPadding = num(\"contentPadding\");\n if (contentPadding != null) out.contentPadding = contentPadding;\n\n out.labelCase = \"as-authored\";\n\n const showKindSubtitles = bool(\"showKindSubtitles\");\n if (showKindSubtitles != null) out.showKindSubtitles = showKindSubtitles;\n\n const showEndpoints = bool(\"showEndpoints\");\n if (showEndpoints != null) out.showEndpoints = showEndpoints;\n\n // `auto` was a synonym — treat as true; prefer boolean in docs.\n if (props.groupAccent === \"auto\") out.groupAccent = true;\n else {\n const b = bool(\"groupAccent\");\n if (b != null) out.groupAccent = b;\n }\n\n const clampLabels = bool(\"clampLabels\");\n if (clampLabels != null) out.clampLabels = clampLabels;\n\n return out;\n}\n\n/**\n * Pick the case policy for a concrete label.\n * Quoted / authored labels are never rewritten.\n */\nexport function displayLabelCase(\n _labelAuthored: boolean | undefined,\n _policy: LabelCasePolicy,\n): LabelCasePolicy {\n return \"as-authored\";\n}\n\nexport function formatLabelText(text: string, _policy: LabelCasePolicy): string {\n return text;\n}\n\n/** Shallow-merge presentation layers (later wins). */\nexport function mergePresentationOptions(\n ...layers: (PresentationOptions | undefined)[]\n): PresentationOptions | undefined {\n let result: PresentationOptions | undefined;\n for (const layer of layers) {\n if (!layer) continue;\n result = { ...result, ...layer };\n }\n return result;\n}\n","/**\n * Shared shape id vocabulary — leaf types used by kinds, compile, and geometry.\n * Geometry implementations live in @kekonic/diagrams-geometry; this module\n * only names the ids so core can validate without depending on renderers.\n */\n\nexport const BUILTIN_SHAPE_IDS = [\n \"rectangle\",\n \"rounded\",\n \"pill\",\n \"circle\",\n \"ellipse\",\n \"diamond\",\n \"hexagon\",\n \"triangle\",\n \"parallelogram\",\n \"trapezoid\",\n \"document\",\n \"folded-document\",\n \"cylinder\",\n \"cloud\",\n \"person\",\n \"queue\",\n \"stream\",\n \"table\",\n \"boundary\",\n] as const;\n\nexport type BuiltinShapeId = (typeof BUILTIN_SHAPE_IDS)[number];\n\n/**\n * Open shape id — built-ins plus custom registry ids.\n * Prefer this over a closed union so `registerShape()` can extend the set.\n */\nexport type ShapeId = BuiltinShapeId | (string & {});\n\nconst SHAPE_ALIASES: Record<string, string> = {\n note: \"folded-document\",\n card: \"rounded\",\n round: \"rounded\",\n roundedbox: \"rounded\",\n rect: \"rectangle\",\n box: \"rectangle\",\n cyl: \"cylinder\",\n hex: \"hexagon\",\n diam: \"diamond\",\n capsule: \"pill\",\n stadium: \"pill\",\n pipe: \"queue\",\n log: \"stream\",\n};\n\nexport function normalizeShapeId(shape: string | undefined | null): string {\n if (!shape) return \"rounded\";\n const key = String(shape).trim().toLowerCase();\n if (!key) return \"rounded\";\n return SHAPE_ALIASES[key] ?? key;\n}\n\nexport function isKnownShapeId(shape: string | undefined | null): boolean {\n if (!shape) return false;\n const id = normalizeShapeId(shape);\n return (BUILTIN_SHAPE_IDS as readonly string[]).includes(id);\n}\n\nexport function listBuiltinShapeIds(): readonly string[] {\n return BUILTIN_SHAPE_IDS;\n}\n","import type { ShapeId } from \"../types/shapes.ts\";\nimport { BUILTIN_SHAPE_IDS, isKnownShapeId, normalizeShapeId } from \"../types/shapes.ts\";\n\n/**\n * Capabilities communicate layout/render behavior beyond the visible shape.\n * Example: ERD column cards need row anchors even when themed like a cylinder.\n */\nexport type NodeCapability =\n | \"erd-table\"\n | \"symbolic\"\n | \"icon-only\"\n | \"card\"\n | \"annotation\"\n | \"boundary\"\n | \"messaging\"\n | \"datastore\"\n | \"sequence-lifeline\";\n\nexport type NodeKindCategory =\n | \"general\"\n | \"flowchart\"\n | \"architecture\"\n | \"infrastructure\"\n | \"messaging\"\n | \"modeling\"\n | \"state\"\n | \"git\"\n /** Bare geometry ids usable as kinds: `n: diamond \"X\"`. */\n | \"shape\";\n\nexport type NodeKindDefaults = {\n shape: ShapeId;\n /** Default icon when the author omits `icon:` (suppressed with `icon: none`). */\n icon?: string;\n /** Presentation subtitle (C4 / architecture eyebrow). */\n subtitle: string;\n classNames: string[];\n cssVars: Record<string, string>;\n defaultMinWidth: number;\n defaultMaxWidth: number;\n defaultDepth: number;\n category: NodeKindCategory;\n capabilities: NodeCapability[];\n};\n\ntype KindSpec = {\n shape: ShapeId;\n subtitle: string;\n category: NodeKindCategory;\n icon?: string;\n min?: number;\n max?: number;\n depth?: number;\n /** Extra CSS classes beyond `flow-node-${id}`. */\n extraClasses?: string[];\n capabilities?: NodeCapability[];\n cssVars?: Record<string, string>;\n};\n\nfunction defineKind(id: string, spec: KindSpec): NodeKindDefaults {\n const caps = new Set<NodeCapability>(spec.capabilities ?? []);\n if (\n spec.shape === \"rounded\" ||\n spec.shape === \"rectangle\" ||\n spec.shape === \"table\" ||\n spec.shape === \"boundary\"\n ) {\n caps.add(\"card\");\n }\n const shapeId = normalizeShapeId(spec.shape);\n const classNames = [`flow-node-${id}`, `flow-shape-${shapeId}`, ...(spec.extraClasses ?? [])];\n return {\n shape: shapeId,\n icon: spec.icon,\n subtitle: spec.subtitle,\n classNames: [...new Set(classNames)],\n cssVars: spec.cssVars ?? {},\n defaultMinWidth: spec.min ?? 120,\n defaultMaxWidth: spec.max ?? 240,\n defaultDepth: spec.depth ?? 1,\n category: spec.category,\n capabilities: [...caps],\n };\n}\n\nfunction titleCaseKind(kind: string): string {\n const words = kind.replace(/[_-]+/g, \" \").trim();\n if (!words) return \"Node\";\n return words.replace(/\\b\\w/g, (c) => c.toUpperCase());\n}\n\nfunction sanitizeKindClass(kind: string): string {\n return kind.replace(/[^a-z0-9-]/gi, \"\") || \"generic\";\n}\n\n/**\n * Built-in semantic node kinds.\n * Geometry is selected via `shape`; meaning via kind + theme (+ optional authored `icon`).\n * Do not invent a unique SVG engine per kind — map onto the shared geometry library.\n */\nconst BUILTIN_KINDS: Record<string, NodeKindDefaults> = {\n // —— General / annotation ——\n note: defineKind(\"note\", {\n shape: \"folded-document\",\n subtitle: \"Note\",\n category: \"general\",\n min: 120,\n max: 280,\n capabilities: [\"annotation\"],\n }),\n label: defineKind(\"label\", {\n shape: \"rounded\",\n subtitle: \"Label\",\n category: \"general\",\n min: 64,\n max: 200,\n capabilities: [\"annotation\", \"symbolic\"],\n }),\n group: defineKind(\"group\", {\n shape: \"boundary\",\n subtitle: \"Group\",\n category: \"general\",\n min: 160,\n max: 400,\n capabilities: [\"boundary\"],\n }),\n image: defineKind(\"image\", {\n shape: \"rectangle\",\n subtitle: \"Image\",\n category: \"general\",\n min: 80,\n max: 320,\n }),\n icon: defineKind(\"icon\", {\n shape: \"rounded\",\n subtitle: \"Icon\",\n category: \"general\",\n min: 56,\n max: 96,\n capabilities: [\"symbolic\", \"icon-only\"],\n }),\n\n // —— Flowchart ——\n start: defineKind(\"start\", {\n shape: \"pill\",\n subtitle: \"Start\",\n category: \"flowchart\",\n min: 88,\n max: 160,\n capabilities: [\"symbolic\"],\n }),\n end: defineKind(\"end\", {\n shape: \"pill\",\n subtitle: \"End\",\n category: \"flowchart\",\n min: 88,\n max: 160,\n capabilities: [\"symbolic\"],\n }),\n process: defineKind(\"process\", {\n shape: \"rounded\",\n subtitle: \"Process\",\n category: \"flowchart\",\n min: 128,\n max: 260,\n }),\n task: defineKind(\"task\", {\n shape: \"rounded\",\n subtitle: \"Task\",\n category: \"flowchart\",\n min: 120,\n max: 240,\n }),\n subprocess: defineKind(\"subprocess\", {\n shape: \"rounded\",\n subtitle: \"Subprocess\",\n category: \"flowchart\",\n min: 140,\n max: 280,\n }),\n choice: defineKind(\"choice\", {\n shape: \"diamond\",\n subtitle: \"Decision\",\n category: \"flowchart\",\n min: 180,\n max: 360,\n }),\n decision: defineKind(\"decision\", {\n shape: \"diamond\",\n subtitle: \"Decision\",\n category: \"flowchart\",\n min: 180,\n max: 360,\n extraClasses: [\"flow-node-choice\"],\n }),\n io: defineKind(\"io\", {\n shape: \"parallelogram\",\n subtitle: \"Input / Output\",\n category: \"flowchart\",\n min: 120,\n max: 240,\n }),\n document: defineKind(\"document\", {\n shape: \"document\",\n subtitle: \"Document\",\n category: \"flowchart\",\n min: 120,\n max: 240,\n }),\n preparation: defineKind(\"preparation\", {\n shape: \"hexagon\",\n subtitle: \"Preparation\",\n category: \"flowchart\",\n min: 120,\n max: 220,\n }),\n manual: defineKind(\"manual\", {\n shape: \"trapezoid\",\n subtitle: \"Manual\",\n category: \"flowchart\",\n min: 120,\n max: 240,\n }),\n connector: defineKind(\"connector\", {\n shape: \"circle\",\n subtitle: \"Connector\",\n category: \"flowchart\",\n min: 36,\n max: 56,\n capabilities: [\"symbolic\"],\n }),\n\n // —— Architecture / C4 ——\n user: defineKind(\"user\", {\n shape: \"person\",\n subtitle: \"User\",\n category: \"architecture\",\n icon: \"user\",\n min: 100,\n max: 220,\n extraClasses: [\"flow-node-user\"],\n }),\n person: defineKind(\"person\", {\n shape: \"person\",\n subtitle: \"Person\",\n category: \"architecture\",\n icon: \"user\",\n min: 100,\n max: 220,\n extraClasses: [\"flow-node-user\"],\n }),\n actor: defineKind(\"actor\", {\n shape: \"rounded\",\n subtitle: \"Actor\",\n category: \"architecture\",\n icon: \"user\",\n min: 120,\n max: 240,\n extraClasses: [\"flow-node-actor\"],\n capabilities: [\"sequence-lifeline\"],\n }),\n participant: defineKind(\"participant\", {\n shape: \"rounded\",\n subtitle: \"Participant\",\n category: \"architecture\",\n min: 120,\n max: 240,\n extraClasses: [\"flow-node-participant\"],\n capabilities: [\"sequence-lifeline\"],\n }),\n system: defineKind(\"system\", {\n shape: \"rounded\",\n subtitle: \"System\",\n category: \"architecture\",\n min: 176,\n max: 340,\n }),\n external: defineKind(\"external\", {\n shape: \"rectangle\",\n subtitle: \"External\",\n category: \"architecture\",\n min: 120,\n max: 260,\n }),\n container: defineKind(\"container\", {\n shape: \"rounded\",\n subtitle: \"Container\",\n category: \"architecture\",\n min: 148,\n max: 300,\n }),\n component: defineKind(\"component\", {\n shape: \"rounded\",\n subtitle: \"Component\",\n category: \"architecture\",\n min: 120,\n max: 240,\n }),\n service: defineKind(\"service\", {\n shape: \"rounded\",\n subtitle: \"Service\",\n category: \"architecture\",\n min: 128,\n max: 280,\n }),\n application: defineKind(\"application\", {\n shape: \"rounded\",\n subtitle: \"Application\",\n category: \"architecture\",\n min: 140,\n max: 280,\n extraClasses: [\"flow-node-service\"],\n }),\n module: defineKind(\"module\", {\n shape: \"rounded\",\n subtitle: \"Module\",\n category: \"architecture\",\n min: 120,\n max: 240,\n extraClasses: [\"flow-node-service\"],\n }),\n package: defineKind(\"package\", {\n shape: \"folded-document\",\n subtitle: \"Package\",\n category: \"architecture\",\n min: 120,\n max: 240,\n }),\n deployment: defineKind(\"deployment\", {\n shape: \"rectangle\",\n subtitle: \"Deployment\",\n category: \"architecture\",\n min: 140,\n max: 280,\n extraClasses: [\"flow-node-service\"],\n }),\n\n // —— Infrastructure / cloud ——\n server: defineKind(\"server\", {\n shape: \"rectangle\",\n subtitle: \"Server\",\n category: \"infrastructure\",\n min: 120,\n max: 240,\n extraClasses: [\"flow-node-service\"],\n }),\n database: defineKind(\"database\", {\n shape: \"cylinder\",\n subtitle: \"Database\",\n category: \"infrastructure\",\n min: 100,\n max: 200,\n capabilities: [\"datastore\"],\n }),\n cache: defineKind(\"cache\", {\n shape: \"cylinder\",\n subtitle: \"Cache\",\n category: \"infrastructure\",\n min: 100,\n max: 200,\n capabilities: [\"datastore\"],\n extraClasses: [\"flow-node-database\"],\n }),\n store: defineKind(\"store\", {\n shape: \"cylinder\",\n subtitle: \"Data store\",\n category: \"infrastructure\",\n min: 100,\n max: 220,\n capabilities: [\"datastore\"],\n extraClasses: [\"flow-node-database\"],\n }),\n bucket: defineKind(\"bucket\", {\n shape: \"cylinder\",\n subtitle: \"Object store\",\n category: \"infrastructure\",\n min: 100,\n max: 220,\n capabilities: [\"datastore\"],\n extraClasses: [\"flow-node-database\"],\n }),\n queue: defineKind(\"queue\", {\n shape: \"queue\",\n subtitle: \"Queue\",\n category: \"infrastructure\",\n min: 100,\n max: 180,\n capabilities: [\"messaging\"],\n }),\n topic: defineKind(\"topic\", {\n shape: \"stream\",\n subtitle: \"Topic\",\n category: \"infrastructure\",\n min: 100,\n max: 220,\n capabilities: [\"messaging\"],\n extraClasses: [\"flow-node-stream\"],\n }),\n stream: defineKind(\"stream\", {\n shape: \"stream\",\n subtitle: \"Stream\",\n category: \"infrastructure\",\n min: 120,\n max: 260,\n capabilities: [\"messaging\"],\n }),\n gateway: defineKind(\"gateway\", {\n shape: \"hexagon\",\n subtitle: \"Gateway\",\n category: \"infrastructure\",\n min: 110,\n max: 200,\n }),\n loadbalancer: defineKind(\"loadbalancer\", {\n shape: \"hexagon\",\n subtitle: \"Load balancer\",\n category: \"infrastructure\",\n min: 120,\n max: 220,\n extraClasses: [\"flow-node-gateway\"],\n }),\n cloud: defineKind(\"cloud\", {\n shape: \"cloud\",\n subtitle: \"Cloud\",\n category: \"infrastructure\",\n min: 140,\n max: 260,\n }),\n firewall: defineKind(\"firewall\", {\n shape: \"rectangle\",\n subtitle: \"Firewall\",\n category: \"infrastructure\",\n min: 100,\n max: 200,\n extraClasses: [\"flow-node-gateway\"],\n }),\n zone: defineKind(\"zone\", {\n shape: \"boundary\",\n subtitle: \"Zone\",\n category: \"infrastructure\",\n min: 180,\n max: 400,\n capabilities: [\"boundary\"],\n }),\n\n // —— Messaging / data flow ——\n broker: defineKind(\"broker\", {\n shape: \"hexagon\",\n subtitle: \"Broker\",\n category: \"messaging\",\n min: 110,\n max: 200,\n capabilities: [\"messaging\"],\n }),\n event: defineKind(\"event\", {\n shape: \"pill\",\n subtitle: \"Event\",\n category: \"messaging\",\n min: 90,\n max: 180,\n capabilities: [\"messaging\", \"symbolic\"],\n }),\n command: defineKind(\"command\", {\n shape: \"rounded\",\n subtitle: \"Command\",\n category: \"messaging\",\n min: 110,\n max: 220,\n capabilities: [\"messaging\"],\n extraClasses: [\"flow-node-service\"],\n }),\n message: defineKind(\"message\", {\n shape: \"document\",\n subtitle: \"Message\",\n category: \"messaging\",\n min: 100,\n max: 200,\n capabilities: [\"messaging\"],\n }),\n worker: defineKind(\"worker\", {\n shape: \"rounded\",\n subtitle: \"Worker\",\n category: \"messaging\",\n min: 110,\n max: 200,\n extraClasses: [\"flow-node-service\"],\n }),\n producer: defineKind(\"producer\", {\n shape: \"rounded\",\n subtitle: \"Producer\",\n category: \"messaging\",\n min: 110,\n max: 200,\n capabilities: [\"messaging\"],\n extraClasses: [\"flow-node-service\"],\n }),\n consumer: defineKind(\"consumer\", {\n shape: \"rounded\",\n subtitle: \"Consumer\",\n category: \"messaging\",\n min: 110,\n max: 200,\n capabilities: [\"messaging\"],\n extraClasses: [\"flow-node-service\"],\n }),\n dlq: defineKind(\"dlq\", {\n shape: \"queue\",\n subtitle: \"Dead-letter queue\",\n category: \"messaging\",\n min: 110,\n max: 200,\n capabilities: [\"messaging\"],\n extraClasses: [\"flow-node-queue\", \"flow-node-warning\"],\n }),\n job: defineKind(\"job\", {\n shape: \"rounded\",\n subtitle: \"Job\",\n category: \"messaging\",\n min: 110,\n max: 200,\n extraClasses: [\"flow-node-worker\"],\n }),\n\n // —— Modeling / ERD / UML-ish ——\n table: defineKind(\"table\", {\n // Without columns → architecture cylinder; with columns → ERD card (`shape: \"table\"`).\n shape: \"cylinder\",\n subtitle: \"Table\",\n category: \"modeling\",\n min: 160,\n max: 320,\n capabilities: [\"datastore\", \"erd-table\"],\n }),\n entity: defineKind(\"entity\", {\n shape: \"cylinder\",\n subtitle: \"Entity\",\n category: \"modeling\",\n min: 160,\n max: 320,\n capabilities: [\"datastore\", \"erd-table\"],\n extraClasses: [\"flow-node-table\"],\n }),\n class: defineKind(\"class\", {\n shape: \"table\",\n subtitle: \"Class\",\n category: \"modeling\",\n min: 160,\n max: 320,\n capabilities: [\"erd-table\"],\n extraClasses: [\"flow-node-table\"],\n }),\n interface: defineKind(\"interface\", {\n shape: \"rounded\",\n subtitle: \"Interface\",\n category: \"modeling\",\n min: 120,\n max: 240,\n extraClasses: [\"flow-node-service\"],\n }),\n aggregate: defineKind(\"aggregate\", {\n shape: \"rounded\",\n subtitle: \"Aggregate\",\n category: \"modeling\",\n min: 140,\n max: 280,\n extraClasses: [\"flow-node-service\"],\n }),\n projection: defineKind(\"projection\", {\n shape: \"rounded\",\n subtitle: \"Projection\",\n category: \"modeling\",\n min: 140,\n max: 280,\n extraClasses: [\"flow-node-service\"],\n }),\n policy: defineKind(\"policy\", {\n shape: \"hexagon\",\n subtitle: \"Policy\",\n category: \"modeling\",\n min: 120,\n max: 220,\n extraClasses: [\"flow-node-gateway\"],\n }),\n\n // —— State machine ——\n state: defineKind(\"state\", {\n shape: \"rounded\",\n subtitle: \"State\",\n category: \"state\",\n min: 100,\n max: 200,\n }),\n initial: defineKind(\"initial\", {\n shape: \"circle\",\n subtitle: \"Initial\",\n category: \"state\",\n min: 28,\n max: 40,\n capabilities: [\"symbolic\"],\n }),\n final: defineKind(\"final\", {\n shape: \"circle\",\n subtitle: \"Final\",\n category: \"state\",\n min: 32,\n max: 48,\n capabilities: [\"symbolic\"],\n }),\n junction: defineKind(\"junction\", {\n shape: \"circle\",\n subtitle: \"Junction\",\n category: \"state\",\n min: 24,\n max: 36,\n capabilities: [\"symbolic\"],\n }),\n fork: defineKind(\"fork\", {\n shape: \"rectangle\",\n subtitle: \"Fork\",\n category: \"state\",\n min: 80,\n max: 160,\n capabilities: [\"symbolic\"],\n }),\n join: defineKind(\"join\", {\n shape: \"rectangle\",\n subtitle: \"Join\",\n category: \"state\",\n min: 80,\n max: 160,\n capabilities: [\"symbolic\"],\n }),\n\n // —— Outcomes ——\n success: defineKind(\"success\", {\n shape: \"rounded\",\n subtitle: \"Success\",\n category: \"flowchart\",\n min: 128,\n max: 260,\n }),\n warning: defineKind(\"warning\", {\n shape: \"rounded\",\n subtitle: \"Manual review\",\n category: \"flowchart\",\n min: 128,\n max: 260,\n }),\n failure: defineKind(\"failure\", {\n shape: \"rounded\",\n subtitle: \"Failure\",\n category: \"flowchart\",\n min: 120,\n max: 240,\n extraClasses: [\"flow-node-warning\"],\n }),\n\n // —— Git ——\n commit: defineKind(\"commit\", {\n shape: \"circle\",\n subtitle: \"Commit\",\n category: \"git\",\n min: 28,\n max: 44,\n capabilities: [\"symbolic\"],\n }),\n branch: defineKind(\"branch\", {\n shape: \"pill\",\n subtitle: \"Branch\",\n category: \"git\",\n min: 72,\n max: 160,\n capabilities: [\"symbolic\"],\n }),\n tag: defineKind(\"tag\", {\n shape: \"pill\",\n subtitle: \"Tag\",\n category: \"git\",\n min: 64,\n max: 140,\n capabilities: [\"symbolic\"],\n }),\n};\n\n/**\n * Bare geometry kinds — shape ids usable directly as DSL kinds.\n * Skips ids already claimed by a semantic kind above (cloud, document, person, queue, …).\n * Those semantic kinds already expose the same geometries.\n */\nconst GEOMETRY_KIND_SPECS: Record<string, KindSpec> = {\n rectangle: { shape: \"rectangle\", subtitle: \"Rectangle\", category: \"shape\", min: 100, max: 240 },\n rounded: { shape: \"rounded\", subtitle: \"Rounded\", category: \"shape\", min: 100, max: 240 },\n pill: {\n shape: \"pill\",\n subtitle: \"Pill\",\n category: \"shape\",\n min: 88,\n max: 180,\n capabilities: [\"symbolic\"],\n },\n circle: {\n shape: \"circle\",\n subtitle: \"Circle\",\n category: \"shape\",\n min: 36,\n max: 72,\n capabilities: [\"symbolic\"],\n },\n ellipse: { shape: \"ellipse\", subtitle: \"Ellipse\", category: \"shape\", min: 100, max: 200 },\n diamond: { shape: \"diamond\", subtitle: \"Diamond\", category: \"shape\", min: 120, max: 280 },\n hexagon: { shape: \"hexagon\", subtitle: \"Hexagon\", category: \"shape\", min: 110, max: 220 },\n triangle: {\n shape: \"triangle\",\n subtitle: \"Triangle\",\n category: \"shape\",\n min: 64,\n max: 140,\n capabilities: [\"symbolic\"],\n },\n parallelogram: {\n shape: \"parallelogram\",\n subtitle: \"Parallelogram\",\n category: \"shape\",\n min: 120,\n max: 240,\n },\n trapezoid: { shape: \"trapezoid\", subtitle: \"Trapezoid\", category: \"shape\", min: 120, max: 240 },\n \"folded-document\": {\n shape: \"folded-document\",\n subtitle: \"Folded document\",\n category: \"shape\",\n min: 120,\n max: 240,\n capabilities: [\"annotation\"],\n },\n cylinder: {\n shape: \"cylinder\",\n subtitle: \"Cylinder\",\n category: \"shape\",\n min: 100,\n max: 200,\n capabilities: [\"datastore\"],\n },\n boundary: {\n shape: \"boundary\",\n subtitle: \"Boundary\",\n category: \"shape\",\n min: 160,\n max: 400,\n capabilities: [\"boundary\"],\n },\n};\n\nfor (const [id, spec] of Object.entries(GEOMETRY_KIND_SPECS)) {\n if (!(id in BUILTIN_KINDS)) {\n BUILTIN_KINDS[id] = defineKind(id, spec);\n }\n}\n\nconst GENERIC_DEFAULTS: NodeKindDefaults = {\n shape: \"rounded\",\n subtitle: \"Node\",\n classNames: [\"flow-node-generic\"],\n cssVars: {},\n defaultMinWidth: 100,\n defaultMaxWidth: 200,\n defaultDepth: 1,\n category: \"general\",\n capabilities: [\"card\"],\n};\n\nfunction geometryDefaultsFor(shapeId: string): NodeKindDefaults {\n const existing = BUILTIN_KINDS[shapeId];\n if (existing) return existing;\n return defineKind(shapeId, {\n shape: shapeId,\n subtitle: titleCaseKind(shapeId),\n category: \"shape\",\n });\n}\n\nexport function getKindDefaults(kind: string): { defaults: NodeKindDefaults; isBuiltin: boolean } {\n const defaults = BUILTIN_KINDS[kind];\n if (defaults) return { defaults, isBuiltin: true };\n\n const shapeId = normalizeShapeId(kind);\n // Shape aliases (`diam`, `hex`, `rect`, `card`, …) resolve to geometry kinds.\n if (shapeId !== kind && isKnownShapeId(shapeId)) {\n return { defaults: geometryDefaultsFor(shapeId), isBuiltin: true };\n }\n if ((BUILTIN_SHAPE_IDS as readonly string[]).includes(kind)) {\n return { defaults: geometryDefaultsFor(kind), isBuiltin: true };\n }\n\n return {\n defaults: {\n ...GENERIC_DEFAULTS,\n subtitle: titleCaseKind(kind),\n classNames: [`flow-node-${sanitizeKindClass(kind)}`, \"flow-node-generic\"],\n },\n isBuiltin: false,\n };\n}\n\nexport function isBuiltinKind(kind: string): boolean {\n return getKindDefaults(kind).isBuiltin;\n}\n\n/**\n * True when `kind` names a built-in shape (or alias): `diamond`, `hex`, `cloud`, …\n * Semantic kinds that share a shape id (`cloud`, `document`, `person`, `queue`) count —\n * they are usable as both meaning and geometry. ERD `table` is excluded.\n */\nexport function isGeometryKind(kind: string): boolean {\n const shapeId = normalizeShapeId(kind);\n if (!isKnownShapeId(shapeId) || shapeId === \"table\") return false;\n if (shapeId !== kind) return true;\n return kind === shapeId && (BUILTIN_SHAPE_IDS as readonly string[]).includes(kind);\n}\n\nexport function kindHasCapability(kind: string, capability: NodeCapability): boolean {\n return getKindDefaults(kind).defaults.capabilities.includes(capability);\n}\n\n/** Human-readable kind subtitle for presentation chrome. */\nexport function kindSubtitle(kind: string): string {\n return getKindDefaults(kind).defaults.subtitle;\n}\n\nexport function listKindsByCategory(category: NodeKindCategory): string[] {\n return Object.entries(BUILTIN_KINDS)\n .filter(([, d]) => d.category === category)\n .map(([id]) => id)\n .sort();\n}\n\n/**\n * Shape ids usable directly as kinds (excludes ERD `table`, which stays semantic-only).\n * Includes semantic synonyms that share a shape id (`cloud`, `document`, `person`, `queue`).\n */\nexport function listGeometryKinds(): string[] {\n return BUILTIN_SHAPE_IDS.filter((id) => id !== \"table\" && id in BUILTIN_KINDS).sort();\n}\n\nexport const BUILTIN_KIND_LIST = Object.keys(BUILTIN_KINDS).sort();\n\nexport const BUILTIN_KIND_CATALOG: Readonly<Record<string, NodeKindDefaults>> = BUILTIN_KINDS;\n","import type { Direction } from \"../types/graph.ts\";\n\n/** Normalize DSL direction aliases to canonical values (§6.5). */\nexport function normalizeDirection(value: string): Direction {\n switch (value.toLowerCase()) {\n case \"lr\":\n case \"right\":\n return \"LR\";\n case \"rl\":\n return \"RL\";\n case \"td\":\n case \"tb\":\n case \"down\":\n return \"TD\";\n case \"bt\":\n return \"BT\";\n default:\n return value.toUpperCase() as Direction;\n }\n}\n","import type { Diagnostic } from \"../types/geometry.ts\";\nimport type { AnimationDefinition, AnimationCue, AnimationTarget } from \"../animation/types.ts\";\nimport { animationIdFromName } from \"../animation/index.ts\";\nimport type { AnimationBlockAst, AnimationCueAst, AnimationTargetAst } from \"../parser/ast.ts\";\nimport type { GraphNode } from \"../types/graph.ts\";\n\nconst DEFAULT_PULSE_MS = 400;\nconst DEFAULT_FLOW_MS = 600;\n\nexport function compileAnimationBlocks(\n blocks: AnimationBlockAst[],\n nodes: Map<string, GraphNode>,\n diagnostics: Diagnostic[],\n): AnimationDefinition[] {\n const usedIds = new Set<string>();\n const animations: AnimationDefinition[] = [];\n\n for (const block of blocks) {\n let id = animationIdFromName(block.name);\n if (usedIds.has(id)) {\n let n = 2;\n while (usedIds.has(`${id}-${n}`)) n++;\n id = `${id}-${n}`;\n }\n usedIds.add(id);\n\n let loop = false;\n const cues: AnimationCue[] = [];\n\n for (const cueAst of block.cues) {\n if (cueAst.type === \"loop\") {\n loop = true;\n continue;\n }\n const cue = compileCue(cueAst, nodes, diagnostics);\n if (cue) cues.push(cue);\n }\n\n // Empty body (optional `loop`) opts into inferred Automatic with this name.\n const source = cues.length === 0 ? \"auto\" : \"authored\";\n\n animations.push({\n id,\n name: block.name,\n loop,\n cues,\n source,\n });\n }\n\n return animations;\n}\n\nfunction compileCue(\n cue: AnimationCueAst,\n nodes: Map<string, GraphNode>,\n diagnostics: Diagnostic[],\n): AnimationCue | null {\n switch (cue.type) {\n case \"dim\":\n case \"activate\":\n return {\n op: cue.type,\n targets: resolveTargets(cue.targets, nodes, diagnostics, cue.range),\n };\n case \"pulse\":\n return {\n op: \"pulse\",\n targets: resolveTargets(cue.targets, nodes, diagnostics, cue.range),\n durationMs: cue.durationMs ?? DEFAULT_PULSE_MS,\n };\n case \"flow\": {\n for (const id of cue.path) {\n if (!nodes.has(id)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM128\",\n message: `Unknown node \"${id}\" in animation flow path`,\n range: cue.range,\n });\n }\n }\n return {\n op: \"flow\",\n path: cue.path,\n durationMs: cue.durationMs ?? DEFAULT_FLOW_MS,\n };\n }\n case \"wait\":\n return { op: \"wait\", durationMs: cue.durationMs };\n case \"parallel\": {\n const children: AnimationCue[] = [];\n for (const child of cue.cues) {\n if (child.type === \"loop\") {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM129\",\n message: \"`loop` inside parallel is ignored — place it on the animation block\",\n range: child.range,\n });\n continue;\n }\n if (child.type === \"parallel\") {\n diagnostics.push({\n severity: \"error\",\n code: \"FM130\",\n message: \"Nested parallel groups are not supported\",\n range: child.range,\n });\n continue;\n }\n const compiled = compileCue(child, nodes, diagnostics);\n if (compiled) children.push(compiled);\n }\n return { op: \"parallel\", cues: children };\n }\n case \"loop\":\n return null;\n }\n}\n\nfunction resolveTargets(\n targets: AnimationTargetAst[],\n nodes: Map<string, GraphNode>,\n diagnostics: Diagnostic[],\n range: import(\"../types/geometry.ts\").SourceRange,\n): AnimationTarget[] {\n const out: AnimationTarget[] = [];\n for (const t of targets) {\n if (t.type === \"all\") {\n out.push({ type: \"all\" });\n continue;\n }\n if (t.type === \"node\") {\n if (!nodes.has(t.id)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM128\",\n message: `Unknown node \"${t.id}\" in animation`,\n range,\n });\n }\n out.push({ type: \"node\", id: t.id });\n continue;\n }\n if (!nodes.has(t.from) || !nodes.has(t.to)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM128\",\n message: `Unknown edge endpoints \"${t.from} -> ${t.to}\" in animation`,\n range,\n });\n }\n out.push({ type: \"edge\", from: t.from, to: t.to });\n }\n return out;\n}\n","import type { Diagnostic } from \"../types/geometry.ts\";\nimport type {\n CompileResult,\n GraphEdge,\n GraphModel,\n GraphNode,\n StyleDefinition,\n} from \"../types/graph.ts\";\nimport type {\n SequenceActivation,\n SequenceDivider,\n SequenceFragment,\n SequenceFragmentOperand,\n SequenceIR,\n SequenceMessage,\n SequenceMessageKind,\n SequenceNote,\n} from \"../types/sequence.ts\";\nimport type {\n EdgeAst,\n KDiagramAst,\n NodeAst,\n SequenceAst,\n SequenceFragmentAst,\n SequenceStatementAst,\n AnimationBlockAst,\n} from \"../parser/ast.ts\";\nimport { getKindDefaults } from \"./kinds.ts\";\nimport { isKnownShapeId, normalizeShapeId } from \"../types/shapes.ts\";\nimport { compileAnimationBlocks } from \"./compile-animations.ts\";\nimport {\n mergePresentationOptions,\n presentationFromProperties,\n type PresentationOptions,\n} from \"../types/presentation.ts\";\nimport type { LayoutOptions, RenderOptions, RoutingOptions } from \"../types/graph.ts\";\nimport { normalizeDirection } from \"./direction.ts\";\nimport { classifyBranch, normalizeBranch } from \"../types/branch.ts\";\n\nfunction edgeOpToSequenceKind(op: EdgeAst[\"op\"], from: string, to: string): SequenceMessageKind {\n if (from === \"*\") return \"found\";\n if (to === \"*\") return \"lost\";\n switch (op) {\n case \"-->\":\n return \"return\";\n case \"~>\":\n case \"<~\":\n case \"=>\":\n case \"<=\":\n return \"async\";\n case \"-x\":\n case \"x-\":\n return \"failure\";\n default:\n return \"sync\";\n }\n}\n\nfunction collectStyleRefsFromProperties(properties: Record<string, unknown>): string[] {\n const raw = properties.styles ?? properties.style;\n if (Array.isArray(raw)) return raw.map(String);\n if (typeof raw === \"string\") return [raw];\n return [];\n}\n\nfunction collectUnresolvedVars(properties: Record<string, unknown>): Record<string, string> {\n const vars: Record<string, string> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n continue;\n }\n if (key.startsWith(\"--\") || key === \"iconColor\") {\n if (key === \"iconColor\") vars[\"--icon-color\"] = String(value);\n else if (key.startsWith(\"--\")) vars[key] = String(value);\n }\n }\n return vars;\n}\n\nfunction materializeNode(\n stmt: NodeAst,\n nodes: Map<string, GraphNode>,\n diagnostics: Diagnostic[],\n): GraphNode | null {\n if (nodes.has(stmt.id)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM101\",\n message: `Duplicate participant id \"${stmt.id}\"`,\n range: stmt.range,\n });\n return nodes.get(stmt.id) ?? null;\n }\n\n const { defaults, isBuiltin } = getKindDefaults(stmt.kind);\n if (!isBuiltin) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM102\",\n message: `Unknown node kind \"${stmt.kind}\" — using generic defaults`,\n range: stmt.range,\n hint: \"Any kind can be a sequence lifeline; prefer participant, actor, or architecture kinds.\",\n });\n }\n const rawShape = stmt.properties.shape != null ? String(stmt.properties.shape) : undefined;\n const shapeOverride = rawShape ? normalizeShapeId(rawShape) : undefined;\n if (rawShape && !isKnownShapeId(shapeOverride)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM111\",\n message: `Unknown shape \"${rawShape}\"`,\n range: stmt.range,\n });\n }\n const styleRefs = [...collectStyleRefsFromProperties(stmt.properties), ...stmt.styleRefs];\n const unresolvedVars = {\n ...defaults.cssVars,\n ...collectUnresolvedVars(stmt.properties),\n };\n const rawIcon = stmt.properties.icon != null ? String(stmt.properties.icon) : undefined;\n const icon =\n rawIcon === \"none\"\n ? undefined\n : rawIcon !== undefined\n ? rawIcon\n : defaults.shape === \"person\"\n ? undefined\n : defaults.icon;\n const authoredPaint =\n stmt.properties.iconPaint != null ? String(stmt.properties.iconPaint).toLowerCase() : undefined;\n const iconPaint =\n authoredPaint === \"theme\" || authoredPaint === \"brand\" ? authoredPaint : undefined;\n const iconColor =\n stmt.properties.iconColor != null && String(stmt.properties.iconColor).length > 0\n ? String(stmt.properties.iconColor)\n : undefined;\n const nodeVars = {\n ...unresolvedVars,\n ...(iconColor ? { \"--icon-color\": iconColor } : {}),\n };\n const node: GraphNode = {\n id: stmt.id,\n label: stmt.label ?? stmt.id,\n labelAuthored: stmt.label != null,\n kind: stmt.kind,\n shape: shapeOverride ?? defaults.shape,\n icon,\n iconPaint,\n iconColor,\n minWidth: defaults.defaultMinWidth,\n maxWidth: defaults.defaultMaxWidth,\n depth: defaults.defaultDepth,\n styleRefs,\n unresolvedVars: Object.keys(nodeVars).length ? nodeVars : undefined,\n sourceRange: stmt.range,\n };\n nodes.set(stmt.id, node);\n return node;\n}\n\ntype SeqCtx = {\n nodes: Map<string, GraphNode>;\n edges: GraphEdge[];\n styles: StyleDefinition[];\n diagnostics: Diagnostic[];\n participantOrder: string[];\n messages: SequenceMessage[];\n activations: SequenceActivation[];\n fragments: SequenceFragment[];\n notes: SequenceNote[];\n dividers: SequenceDivider[];\n autonumber: boolean;\n order: number;\n edgeCounter: number;\n /** Open activation stacks per participant (explicit activate). */\n openActivations: Map<\n string,\n { id: string; startOrder: number; range?: SequenceMessage[\"sourceRange\"] }[]\n >;\n /** Auto sync-call stack for return pairing + auto-activate. */\n callStack: { messageId: string; to: string; from: string }[];\n nextActId: number;\n nextFragId: number;\n nextNoteId: number;\n nextDivId: number;\n};\n\nfunction nextOrder(ctx: SeqCtx): number {\n const o = ctx.order;\n ctx.order += 1;\n return o;\n}\n\nfunction ensureParticipant(ctx: SeqCtx, id: string, range: SequenceMessage[\"sourceRange\"]): void {\n if (id === \"*\" || !id) return;\n if (!ctx.nodes.has(id)) {\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"FM147\",\n message: `Unknown participant \"${id}\" — declare with \\`id: kind \"Label\"\\` before use`,\n range: range ?? {\n start: { line: 1, column: 1, offset: 0 },\n end: { line: 1, column: 1, offset: 0 },\n },\n });\n } else if (!ctx.participantOrder.includes(id)) {\n ctx.participantOrder.push(id);\n }\n}\n\nfunction pushMessage(\n ctx: SeqCtx,\n partial: Omit<SequenceMessage, \"id\" | \"order\"> & { id?: string },\n edgeMeta?: { styleRefs?: string[]; branch?: GraphEdge[\"branch\"] },\n): SequenceMessage {\n const order = nextOrder(ctx);\n const id = partial.id ?? `msg${ctx.edgeCounter++}`;\n const msg: SequenceMessage = { ...partial, id, order };\n ctx.messages.push(msg);\n\n const styleRefs = edgeMeta?.styleRefs ?? [];\n const branch = edgeMeta?.branch ?? (msg.label != null ? classifyBranch(msg.label) : undefined);\n\n // Mirror as GraphEdge for animation / tooling (skip found/lost ghosts without both ends).\n if (msg.from && msg.to && msg.from !== \"*\" && msg.to !== \"*\") {\n ctx.edges.push({\n id,\n from: msg.from,\n to: msg.to,\n label: msg.label,\n labelAuthored: msg.labelAuthored,\n kind:\n msg.kind === \"async\"\n ? \"eventual\"\n : msg.kind === \"failure\"\n ? \"failure\"\n : msg.kind === \"return\"\n ? \"dependency\"\n : msg.kind === \"destroy\"\n ? \"failure\"\n : \"sync\",\n arrows: \"end\",\n styleRefs,\n branch: branch === \"neutral\" ? undefined : branch,\n sequenceOrder: order,\n sequenceKind: msg.kind,\n sourceRange: msg.sourceRange,\n });\n }\n\n return msg;\n}\n\nfunction closeActivation(ctx: SeqCtx, participantId: string, endOrder: number): void {\n const stack = ctx.openActivations.get(participantId);\n if (!stack || stack.length === 0) return;\n const open = stack.pop()!;\n ctx.activations.push({\n id: open.id,\n participantId,\n startOrder: open.startOrder,\n endOrder,\n sourceRange: open.range,\n });\n}\n\nfunction openActivation(\n ctx: SeqCtx,\n participantId: string,\n startOrder: number,\n range?: SequenceMessage[\"sourceRange\"],\n): void {\n const stack = ctx.openActivations.get(participantId) ?? [];\n stack.push({ id: `act${ctx.nextActId++}`, startOrder, range });\n ctx.openActivations.set(participantId, stack);\n}\n\nfunction collectSequenceStatements(statements: SequenceStatementAst[], ctx: SeqCtx): void {\n for (const stmt of statements) {\n switch (stmt.type) {\n case \"Node\": {\n materializeNode(stmt, ctx.nodes, ctx.diagnostics);\n if (!ctx.participantOrder.includes(stmt.id)) ctx.participantOrder.push(stmt.id);\n break;\n }\n case \"Edge\": {\n const from = stmt.from;\n const to = stmt.to;\n ensureParticipant(ctx, from, stmt.range);\n ensureParticipant(ctx, to, stmt.range);\n const kind = edgeOpToSequenceKind(stmt.op, from, to);\n const styleRefs = [...collectStyleRefsFromProperties(stmt.properties), ...stmt.styleRefs];\n const branch =\n normalizeBranch(stmt.properties.branch) ??\n (stmt.label != null ? classifyBranch(stmt.label) : undefined);\n const msg = pushMessage(\n ctx,\n {\n from: from === \"*\" ? null : from,\n to: to === \"*\" ? null : to,\n kind,\n label: stmt.label,\n labelAuthored: stmt.label != null,\n sourceRange: stmt.range,\n },\n { styleRefs, branch },\n );\n\n // Auto-activate: sync call opens target; matching return closes it.\n if (kind === \"sync\" && msg.to) {\n openActivation(ctx, msg.to, msg.order, stmt.range);\n if (msg.from) ctx.callStack.push({ messageId: msg.id, to: msg.to, from: msg.from });\n } else if (kind === \"return\" && msg.from) {\n const idx = [...ctx.callStack].reverse().findIndex((c) => c.to === msg.from);\n if (idx >= 0) {\n const real = ctx.callStack.length - 1 - idx;\n const call = ctx.callStack[real]!;\n msg.replyTo = call.messageId;\n ctx.callStack.splice(real, 1);\n }\n closeActivation(ctx, msg.from, msg.order);\n }\n break;\n }\n case \"SequenceActivate\": {\n ensureParticipant(ctx, stmt.participantId, stmt.range);\n openActivation(ctx, stmt.participantId, ctx.order, stmt.range);\n break;\n }\n case \"SequenceDeactivate\": {\n ensureParticipant(ctx, stmt.participantId, stmt.range);\n closeActivation(ctx, stmt.participantId, Math.max(0, ctx.order - 1));\n break;\n }\n case \"SequenceCreate\": {\n materializeNode(stmt.node, ctx.nodes, ctx.diagnostics);\n if (!ctx.participantOrder.includes(stmt.node.id)) {\n ctx.participantOrder.push(stmt.node.id);\n }\n // Create message from previous speaker if any, else found-style.\n const prev = ctx.messages.at(-1);\n const from = prev?.to ?? prev?.from ?? null;\n pushMessage(ctx, {\n from,\n to: stmt.node.id,\n kind: \"create\",\n label: stmt.node.label,\n labelAuthored: stmt.node.label != null,\n sourceRange: stmt.range,\n });\n break;\n }\n case \"SequenceDestroy\": {\n ensureParticipant(ctx, stmt.participantId, stmt.range);\n pushMessage(ctx, {\n from: stmt.participantId,\n to: stmt.participantId,\n kind: \"destroy\",\n sourceRange: stmt.range,\n });\n closeActivation(ctx, stmt.participantId, ctx.order - 1);\n break;\n }\n case \"SequenceNote\": {\n for (const id of stmt.participantIds) ensureParticipant(ctx, id, stmt.range);\n const order = nextOrder(ctx);\n ctx.notes.push({\n id: `note${ctx.nextNoteId++}`,\n order,\n placement: stmt.placement,\n participantIds: stmt.participantIds,\n text: stmt.text,\n sourceRange: stmt.range,\n });\n break;\n }\n case \"SequenceDivider\": {\n const order = nextOrder(ctx);\n ctx.dividers.push({\n id: `div${ctx.nextDivId++}`,\n order,\n label: stmt.label,\n sourceRange: stmt.range,\n });\n break;\n }\n case \"SequenceAutonumber\": {\n ctx.autonumber = true;\n break;\n }\n case \"SequenceFragment\": {\n collectFragment(stmt, ctx);\n break;\n }\n case \"Style\": {\n ctx.styles.push({\n name: stmt.name,\n target: stmt.target,\n properties: Object.fromEntries(\n Object.entries(stmt.properties).map(([k, v]) => [k, String(v)]),\n ),\n });\n break;\n }\n case \"StyleRef\": {\n for (const id of stmt.targetIds) {\n const node = ctx.nodes.get(id);\n if (node && !node.styleRefs.includes(stmt.styleName)) {\n node.styleRefs.push(stmt.styleName);\n }\n }\n break;\n }\n case \"Directive\":\n case \"LayoutBlock\":\n case \"EdgePolicyBlock\":\n case \"RenderBlock\":\n case \"PresentationBlock\":\n case \"AnimationBlock\":\n break;\n default:\n break;\n }\n }\n}\n\nfunction collectFragment(stmt: SequenceFragmentAst, ctx: SeqCtx): void {\n const fragId = `frag${ctx.nextFragId++}`;\n const startOrder = ctx.order;\n const operands: SequenceFragmentOperand[] = [];\n\n for (const op of stmt.operands) {\n const opStart = ctx.order;\n const childFragsStart = ctx.fragments.length;\n collectSequenceStatements(op.statements, ctx);\n const nested = ctx.fragments.splice(childFragsStart);\n const opEnd = Math.max(opStart, ctx.order - 1);\n operands.push({\n label: op.label,\n styleRefs: [...op.styleRefs],\n startOrder: opStart,\n endOrder: opEnd,\n children: nested,\n });\n }\n\n const endOrder = Math.max(startOrder, ctx.order - 1);\n ctx.fragments.push({\n id: fragId,\n operator: stmt.operator,\n label: stmt.label,\n styleRefs: [...stmt.styleRefs],\n unresolvedVars: {},\n startOrder,\n endOrder,\n operands,\n sourceRange: stmt.range,\n });\n}\n\nfunction collectAnimationBlocks(statements: SequenceStatementAst[]): AnimationBlockAst[] {\n const blocks: AnimationBlockAst[] = [];\n for (const stmt of statements) {\n if (stmt.type === \"AnimationBlock\") blocks.push(stmt);\n if (stmt.type === \"SequenceFragment\") {\n for (const op of stmt.operands) {\n blocks.push(...collectAnimationBlocks(op.statements));\n }\n }\n }\n return blocks;\n}\n\nfunction finalizeOpenActivations(ctx: SeqCtx): void {\n const lastOrder = Math.max(0, ctx.order - 1);\n for (const [participantId, stack] of ctx.openActivations) {\n while (stack.length) {\n const open = stack.pop()!;\n ctx.activations.push({\n id: open.id,\n participantId,\n startOrder: open.startOrder,\n endOrder: lastOrder,\n sourceRange: open.range,\n });\n }\n }\n}\n\n/** Compile a `sequence { … }` document body into GraphModel + SequenceIR. */\nexport function compileSequence(ast: KDiagramAst, diagramIndex = 0): CompileResult {\n const diagnostics: Diagnostic[] = [...ast.diagnostics];\n const top = ast.body[diagramIndex];\n if (!top || top.type !== \"Sequence\") {\n diagnostics.push({\n severity: \"error\",\n code: \"FM100\",\n message: \"No sequence diagram found at index\",\n range: { start: { line: 1, column: 1, offset: 0 }, end: { line: 1, column: 1, offset: 0 } },\n });\n return {\n graph: {\n id: \"empty\",\n diagramKind: \"sequence\",\n nodes: [],\n edges: [],\n groups: [],\n styles: [],\n animations: [],\n diagnostics,\n },\n layoutHints: {},\n routingHints: {},\n renderHints: {},\n diagnostics,\n };\n }\n\n const seq = top as SequenceAst;\n const ctx: SeqCtx = {\n nodes: new Map(),\n edges: [],\n styles: [],\n diagnostics,\n participantOrder: [],\n messages: [],\n activations: [],\n fragments: [],\n notes: [],\n dividers: [],\n autonumber: false,\n order: 0,\n edgeCounter: 0,\n openActivations: new Map(),\n callStack: [],\n nextActId: 0,\n nextFragId: 0,\n nextNoteId: 0,\n nextDivId: 0,\n };\n\n collectSequenceStatements(seq.statements, ctx);\n finalizeOpenActivations(ctx);\n\n const sequence: SequenceIR = {\n autonumber: ctx.autonumber,\n messages: ctx.messages,\n activations: ctx.activations,\n fragments: ctx.fragments,\n notes: ctx.notes,\n dividers: ctx.dividers,\n participantOrder: ctx.participantOrder,\n };\n\n const graph: GraphModel = {\n id: seq.name ? seq.name.toLowerCase().replace(/\\s+/g, \"-\") : \"sequence\",\n title: seq.name,\n diagramKind: \"sequence\",\n sequence,\n nodes: ctx.participantOrder.map((id) => ctx.nodes.get(id)!).filter(Boolean),\n edges: ctx.edges,\n groups: [],\n styles: ctx.styles,\n animations: compileAnimationBlocks(\n collectAnimationBlocks(seq.statements),\n ctx.nodes,\n diagnostics,\n ),\n diagnostics,\n };\n\n const hints = extractSequenceHints(seq);\n diagnostics.push(...hints.diagnostics);\n const { diagnostics: _d, ...hintFields } = hints;\n hintFields.layoutHints = {\n ...hintFields.layoutHints,\n direction: hintFields.layoutHints.direction ?? \"TD\",\n };\n\n return { graph, ...hintFields, diagnostics };\n}\n\nfunction extractSequenceHints(seq: SequenceAst): {\n layoutHints: LayoutOptions;\n routingHints: RoutingOptions;\n renderHints: RenderOptions;\n diagnostics: Diagnostic[];\n} {\n const layoutHints: LayoutOptions = {};\n const routingHints: RoutingOptions = {};\n const renderHints: RenderOptions = {};\n const diagnostics: Diagnostic[] = [];\n let presentationLayers: PresentationOptions[] = [];\n\n for (const stmt of seq.statements) {\n if (stmt.type === \"Directive\") {\n if (stmt.name === \"direction\" && stmt.value) {\n layoutHints.direction = normalizeDirection(String(stmt.value));\n }\n if (stmt.name === \"density\" && stmt.value) {\n const d = String(stmt.value);\n if (d === \"compact\" || d === \"normal\" || d === \"spacious\") {\n layoutHints.density = d;\n }\n }\n }\n if (stmt.type === \"LayoutBlock\") {\n if (stmt.properties.direction) {\n layoutHints.direction = normalizeDirection(String(stmt.properties.direction));\n }\n if (stmt.properties.density) {\n const d = String(stmt.properties.density);\n if (d === \"compact\" || d === \"normal\" || d === \"spacious\") {\n layoutHints.density = d;\n }\n }\n }\n if (stmt.type === \"EdgePolicyBlock\") {\n if (stmt.properties.route) {\n routingHints.route = String(stmt.properties.route) as RoutingOptions[\"route\"];\n }\n }\n if (stmt.type === \"RenderBlock\") {\n if (stmt.properties.theme) {\n renderHints.theme = String(stmt.properties.theme) as RenderOptions[\"theme\"];\n }\n }\n if (stmt.type === \"PresentationBlock\") {\n const layer = presentationFromProperties(stmt.properties);\n if (layer) presentationLayers.push(layer);\n }\n }\n\n const merged = mergePresentationOptions(...presentationLayers);\n if (merged) renderHints.presentation = merged;\n\n return { layoutHints, routingHints, renderHints, diagnostics };\n}\n","import type { Diagnostic } from \"../types/geometry.ts\";\nimport type {\n CompileResult,\n CellArrange,\n Density,\n EdgeKind,\n GraphEdge,\n GraphGroup,\n GraphModel,\n GraphNode,\n LayoutOptions,\n RegionAlign,\n RegionArrange,\n RenderOptions,\n RoutingOptions,\n StyleDefinition,\n TrackSpec,\n} from \"../types/graph.ts\";\nimport {\n mergePresentationOptions,\n presentationFromProperties,\n REMOVED_PRESENTATION_PROPS,\n type PresentationOptions,\n} from \"../types/presentation.ts\";\nimport type { SourceRange } from \"../types/geometry.ts\";\nimport { classifyBranch, normalizeBranch } from \"../types/branch.ts\";\nimport { fkCardinality, isPureCardinalityLabel, parseCardinality } from \"../types/cardinality.ts\";\nimport { findColumnIndex, parseTableColumns } from \"../types/table.ts\";\nimport type {\n DiagramAst,\n EdgeAst,\n KDiagramAst,\n StatementAst,\n AnimationBlockAst,\n} from \"../parser/ast.ts\";\nimport { getKindDefaults, BUILTIN_KIND_LIST } from \"./kinds.ts\";\nimport { normalizeDirection } from \"./direction.ts\";\nimport { isKnownShapeId, normalizeShapeId } from \"../types/shapes.ts\";\nimport { compileAnimationBlocks } from \"./compile-animations.ts\";\nimport { compileSequence } from \"./compile-sequence.ts\";\n\nfunction suggestKindName(kind: string): string | undefined {\n const target = kind.toLowerCase();\n let best: string | undefined;\n let bestDist = 3;\n for (const candidate of BUILTIN_KIND_LIST) {\n const d = levenshtein(target, candidate.toLowerCase());\n if (d < bestDist) {\n bestDist = d;\n best = candidate;\n }\n }\n return best;\n}\n\nfunction levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n const dp = Array.from({ length: m + 1 }, () => Array.from({ length: n + 1 }, () => 0));\n for (let i = 0; i <= m; i++) dp[i]![0] = i;\n for (let j = 0; j <= n; j++) dp[0]![j] = j;\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i]![j] = Math.min(dp[i - 1]![j]! + 1, dp[i]![j - 1]! + 1, dp[i - 1]![j - 1]! + cost);\n }\n }\n return dp[m]![n]!;\n}\n\nfunction collectStyleRefsFromProperties(properties: Record<string, unknown>): string[] {\n const refs: string[] = [];\n const styles = properties.styles;\n if (Array.isArray(styles)) {\n for (const s of styles) refs.push(String(s));\n }\n return refs;\n}\n\nfunction collectUnresolvedVars(\n properties: Record<string, unknown>,\n): Record<string, string> | undefined {\n const vars: Record<string, string> = {};\n for (const [k, v] of Object.entries(properties)) {\n if (k.startsWith(\"--\")) vars[k] = String(v);\n }\n return Object.keys(vars).length ? vars : undefined;\n}\n\nfunction edgeOpToKind(op: EdgeAst[\"op\"]): EdgeKind {\n switch (op) {\n case \"=>\":\n case \"<=\":\n return \"async\";\n case \"~>\":\n case \"<~\":\n return \"eventual\";\n case \"..>\":\n case \"<..\":\n case \"-->\":\n return \"dependency\";\n case \"-x\":\n case \"x-\":\n return \"failure\";\n case \"--\":\n return \"association\";\n default:\n return \"sync\";\n }\n}\n\n/** Reverse ops are authored target-first; compile swaps endpoints so routing stays from→to. */\nfunction edgeOpIsReverse(op: EdgeAst[\"op\"]): boolean {\n return op === \"<-\" || op === \"<=\" || op === \"<..\" || op === \"x-\" || op === \"<~\";\n}\n\nfunction edgeOpArrows(op: EdgeAst[\"op\"]): GraphEdge[\"arrows\"] {\n if (op === \"<->\") return \"both\";\n if (op === \"--\") return \"none\";\n return \"end\";\n}\n\nfunction normalizePriority(value: unknown): GraphEdge[\"priority\"] | undefined {\n if (value === \"low\" || value === \"normal\" || value === \"high\") return value;\n return undefined;\n}\n\n/** Along-path label bias — `labelPosition` or alias `labelAt`. */\nfunction normalizeLabelPosition(value: unknown): GraphEdge[\"labelPosition\"] | undefined {\n if (typeof value !== \"string\" && typeof value !== \"number\" && typeof value !== \"boolean\") {\n return undefined;\n }\n const raw = String(value).trim().toLowerCase();\n if (raw === \"start\" || raw === \"begin\" || raw === \"source\") return \"start\";\n if (raw === \"middle\" || raw === \"mid\" || raw === \"center\") return \"middle\";\n if (raw === \"end\" || raw === \"target\") return \"end\";\n return undefined;\n}\n\nfunction normalizeGroupLayout(value: unknown): LayoutOptions[\"groupLayout\"] | undefined {\n if (value === \"auto\" || value === \"flat\" || value === \"compound\" || value === \"swimlane\") {\n return value;\n }\n return undefined;\n}\n\n/** Normalize DSL nodePlacement to public values (no obscure ELK nicknames). */\nfunction normalizeNodePlacement(value: unknown): LayoutOptions[\"nodePlacement\"] | undefined {\n switch (value) {\n case \"straight\":\n case \"balanced\":\n case \"basic\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction normalizeDensity(value: unknown): Density | undefined {\n if (value === \"compact\" || value === \"normal\" || value === \"spacious\") return value;\n return undefined;\n}\n\nfunction isRemovedDensityAlias(value: unknown): boolean {\n return value === \"mid\" || value === \"comfortable\" || value === \"roomy\";\n}\n\n/** Prefer `gaps`; accept singular `gap`. */\nfunction normalizeCrossings(value: unknown): RoutingOptions[\"crossings\"] | undefined {\n if (value === \"none\" || value === \"gaps\" || value === \"jumps\" || value === \"smart\") return value;\n if (value === \"gap\") return \"gaps\";\n return undefined;\n}\n\nfunction normalizeBool(value: unknown): boolean | undefined {\n if (value === true || value === false) return value;\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n return undefined;\n}\n\nfunction optionalNumber(value: unknown): number | undefined {\n if (value == null || value === \"\") return undefined;\n const n = Number(value);\n return Number.isFinite(n) ? n : undefined;\n}\n\n/** Presentation scale — clamp so layout stays sane. */\nfunction normalizeScale(value: unknown): number | undefined {\n const n = optionalNumber(value);\n if (n == null || n <= 0) return undefined;\n return Math.min(2, Math.max(0.75, n));\n}\n\nfunction collectStatements(\n statements: StatementAst[],\n ctx: {\n nodes: Map<string, GraphNode>;\n edges: GraphEdge[];\n groups: GraphGroup[];\n styles: StyleDefinition[];\n diagnostics: Diagnostic[];\n groupStack: string[];\n edgeCounter: number;\n pendingGroupMembers: Array<{\n nodeId: string;\n groupId: string;\n range: import(\"../types/geometry.ts\").SourceRange;\n }>;\n },\n): void {\n for (const stmt of statements) {\n switch (stmt.type) {\n case \"Node\": {\n if (ctx.nodes.has(stmt.id)) {\n ctx.diagnostics.push({\n severity: \"error\",\n code: \"FM101\",\n message: `Duplicate node id \"${stmt.id}\"`,\n range: stmt.range,\n });\n break;\n }\n const { defaults, isBuiltin } = getKindDefaults(stmt.kind);\n if (!isBuiltin) {\n const suggestion = suggestKindName(stmt.kind);\n ctx.diagnostics.push({\n severity: \"warning\",\n code: \"FM102\",\n message: `Unknown node kind \"${stmt.kind}\" — using generic defaults`,\n range: stmt.range,\n hint: suggestion\n ? `Did you mean \"${suggestion}\"?`\n : \"See built-in kinds (service, database, event, process, …) or keep an open kind.\",\n });\n }\n const columns = parseTableColumns(stmt.properties.columns);\n const hasErdColumns = columns.length > 0;\n const rawShape = stmt.properties.shape != null ? String(stmt.properties.shape) : undefined;\n const shapeOverride = rawShape ? normalizeShapeId(rawShape) : undefined;\n if (rawShape && !isKnownShapeId(shapeOverride)) {\n ctx.diagnostics.push({\n severity: \"warning\",\n code: \"FM111\",\n message: `Unknown shape \"${rawShape}\" — rendering falls back to rounded unless a custom shape is registered`,\n range: stmt.range,\n hint: `Known shapes: rectangle, rounded, pill, diamond, hexagon, cylinder, queue, cloud, document, …`,\n });\n }\n // Tables/entities with columns become ERD cards unless the author overrides shape.\n // Kind capability `erd-table` marks kinds that participate in this rule.\n const erdKind =\n defaults.capabilities.includes(\"erd-table\") ||\n stmt.kind === \"table\" ||\n stmt.kind === \"entity\";\n const shape = shapeOverride ?? (hasErdColumns && erdKind ? \"table\" : defaults.shape);\n const styleRefs = [...collectStyleRefsFromProperties(stmt.properties), ...stmt.styleRefs];\n const unresolvedVars = {\n ...defaults.cssVars,\n ...collectUnresolvedVars(stmt.properties),\n };\n const erdMinWidth = hasErdColumns\n ? Math.max(defaults.defaultMinWidth, 200)\n : defaults.defaultMinWidth;\n const erdMaxWidth = hasErdColumns\n ? Math.max(defaults.defaultMaxWidth, 360)\n : defaults.defaultMaxWidth;\n // Icons: author `icon: …`, `icon: none` to suppress, else kind catalog default.\n // Person silhouettes already have a head glyph — skip catalog defaults there.\n const rawIcon = stmt.properties.icon != null ? String(stmt.properties.icon) : undefined;\n const icon =\n rawIcon === \"none\"\n ? undefined\n : rawIcon !== undefined\n ? rawIcon\n : shape === \"person\"\n ? undefined\n : defaults.icon;\n const authoredPaint =\n stmt.properties.iconPaint != null\n ? String(stmt.properties.iconPaint).toLowerCase()\n : undefined;\n const iconPaint =\n authoredPaint === \"theme\" || authoredPaint === \"brand\" ? authoredPaint : undefined;\n const iconColor =\n stmt.properties.iconColor != null && String(stmt.properties.iconColor).length > 0\n ? String(stmt.properties.iconColor)\n : undefined;\n const nodeVars = {\n ...unresolvedVars,\n ...(iconColor ? { \"--icon-color\": iconColor } : {}),\n };\n const parentGroupId = ctx.groupStack.at(-1);\n ctx.nodes.set(stmt.id, {\n id: stmt.id,\n label: stmt.label ?? stmt.id,\n labelAuthored: stmt.label != null,\n kind: stmt.kind,\n shape,\n icon,\n iconPaint,\n iconColor,\n groupId: parentGroupId,\n styleRefs,\n unresolvedVars: Object.keys(nodeVars).length ? nodeVars : undefined,\n note: stmt.properties.note != null ? String(stmt.properties.note) : undefined,\n // subtitle: true → show kind eyebrow; subtitle: \"…\" → authored caption.\n showSubtitle: stmt.properties.subtitle === true,\n subtitle:\n typeof stmt.properties.subtitle === \"string\" && stmt.properties.subtitle.length > 0\n ? String(stmt.properties.subtitle)\n : undefined,\n technology:\n stmt.properties.technology != null && String(stmt.properties.technology).length > 0\n ? String(stmt.properties.technology)\n : undefined,\n description:\n stmt.properties.description != null && String(stmt.properties.description).length > 0\n ? String(stmt.properties.description)\n : undefined,\n columns: hasErdColumns ? columns : undefined,\n minWidth: (stmt.properties.minWidth as number) ?? erdMinWidth,\n maxWidth: (stmt.properties.maxWidth as number) ?? erdMaxWidth,\n depth: (stmt.properties.depth as number) ?? defaults.defaultDepth,\n scale: normalizeScale(stmt.properties.scale),\n sourceRange: stmt.range,\n });\n if (parentGroupId) {\n const parent = ctx.groups.find((g) => g.id === parentGroupId);\n parent?.members?.push({ kind: \"node\", id: stmt.id });\n }\n break;\n }\n case \"Edge\": {\n ctx.edgeCounter++;\n const fromColumn =\n stmt.fromColumn ??\n (stmt.properties.fromColumn != null\n ? String(stmt.properties.fromColumn)\n : stmt.properties.fromCol != null\n ? String(stmt.properties.fromCol)\n : undefined);\n const toColumn =\n stmt.toColumn ??\n (stmt.properties.toColumn != null\n ? String(stmt.properties.toColumn)\n : stmt.properties.toCol != null\n ? String(stmt.properties.toCol)\n : undefined);\n const cardinality =\n parseCardinality(stmt.properties.cardinality ?? stmt.properties.rel) ??\n parseCardinality(stmt.label) ??\n (fromColumn || toColumn\n ? { from: \"one\" as const, to: \"zeroOrMany\" as const }\n : undefined);\n // Pure cardinality labels (\"1:N\") are relationship markers, not branch cues.\n const branch =\n normalizeBranch(stmt.properties.branch) ??\n (cardinality && isPureCardinalityLabel(stmt.label)\n ? undefined\n : classifyBranch(stmt.label));\n const identifying = normalizeBool(stmt.properties.identifying);\n const rawIcon = stmt.properties.icon != null ? String(stmt.properties.icon) : undefined;\n const icon = rawIcon && rawIcon !== \"none\" ? rawIcon : undefined;\n const authoredPaint =\n stmt.properties.iconPaint != null\n ? String(stmt.properties.iconPaint).toLowerCase()\n : undefined;\n const iconPaint =\n authoredPaint === \"theme\" || authoredPaint === \"brand\" ? authoredPaint : undefined;\n const iconColor =\n stmt.properties.iconColor != null && String(stmt.properties.iconColor).length > 0\n ? String(stmt.properties.iconColor)\n : undefined;\n const reverse = edgeOpIsReverse(stmt.op);\n const arrowsProp = String(stmt.properties.arrows ?? \"\").toLowerCase();\n const arrows: GraphEdge[\"arrows\"] =\n arrowsProp === \"both\" ||\n arrowsProp === \"start\" ||\n arrowsProp === \"end\" ||\n arrowsProp === \"none\"\n ? arrowsProp\n : edgeOpArrows(stmt.op);\n ctx.edges.push({\n id: `e${ctx.edgeCounter}`,\n from: reverse ? stmt.to : stmt.from,\n to: reverse ? stmt.from : stmt.to,\n fromColumn: reverse ? toColumn : fromColumn,\n toColumn: reverse ? fromColumn : toColumn,\n label: stmt.label,\n labelAuthored: stmt.label != null,\n kind: edgeOpToKind(stmt.op),\n arrows,\n styleRefs: [...collectStyleRefsFromProperties(stmt.properties), ...stmt.styleRefs],\n icon,\n iconPaint,\n iconColor,\n priority: normalizePriority(stmt.properties.priority),\n labelPosition: normalizeLabelPosition(\n stmt.properties.labelPosition ?? stmt.properties.labelAt,\n ),\n branch,\n cardinality,\n identifying: identifying ?? undefined,\n sourceRange: stmt.range,\n });\n break;\n }\n case \"Group\": {\n const groupId = stmt.id ?? `group_${ctx.groups.length + 1}`;\n const hints = extractGroupArrangeHints(stmt.statements);\n const rawIcon = hints.icon;\n const icon = rawIcon && rawIcon !== \"none\" ? rawIcon : undefined;\n const group: GraphGroup = {\n id: groupId,\n label: stmt.label ?? groupId,\n labelAuthored: stmt.label != null,\n kind: stmt.groupKind,\n parentId: ctx.groupStack.at(-1),\n nodeIds: [],\n childGroupIds: [],\n members: [],\n styleRefs: [],\n paddingHint: hints.paddingHint,\n chrome: hints.chrome,\n icon,\n iconPaint: hints.iconPaint,\n iconColor: hints.iconColor,\n arrange: hints.arrange,\n align: hints.align,\n gap: hints.gap,\n columns: hints.columns,\n rows: hints.rows,\n column: hints.column,\n row: hints.row,\n span: hints.span,\n colSpan: hints.colSpan,\n rowSpan: hints.rowSpan,\n cellArrange: hints.cellArrange,\n };\n if (ctx.groupStack.length > 0) {\n const parent = ctx.groups.find((g) => g.id === ctx.groupStack.at(-1));\n parent?.childGroupIds.push(groupId);\n parent?.members?.push({ kind: \"group\", id: groupId });\n }\n ctx.groups.push(group);\n ctx.groupStack.push(groupId);\n collectStatements(stmt.statements, ctx);\n for (const n of ctx.nodes.values()) {\n if (n.groupId === groupId && !group.nodeIds.includes(n.id)) {\n group.nodeIds.push(n.id);\n }\n }\n // `arrange: stack` on a leaf (nodes only) means in-cell stack, not region tracks.\n if (\n group.arrange === \"stack\" &&\n group.childGroupIds.length === 0 &&\n group.cellArrange == null\n ) {\n group.cellArrange = \"stack\";\n group.arrange = undefined;\n }\n ctx.groupStack.pop();\n break;\n }\n case \"Style\": {\n const props: Record<string, string> = {};\n for (const [k, v] of Object.entries(stmt.properties)) {\n props[k] = String(v);\n }\n ctx.styles.push({ name: stmt.name, target: stmt.target, properties: props });\n break;\n }\n case \"StyleRef\": {\n const styleDef = ctx.styles.find((s) => s.name === stmt.styleName);\n for (const id of stmt.targetIds) {\n const node = ctx.nodes.get(id);\n if (node) {\n if (!node.styleRefs.includes(stmt.styleName)) node.styleRefs.push(stmt.styleName);\n } else {\n ctx.diagnostics.push({\n severity: \"warning\",\n code: \"FM105\",\n message:\n styleDef?.target === \"edge\"\n ? `Style \"${stmt.styleName}\" targets edges — use \\`a -> b is ${stmt.styleName}\\` or styles: […] on the edge`\n : `Style ref \"${stmt.styleName}\" references unknown node \"${id}\"`,\n range: stmt.range,\n });\n }\n }\n break;\n }\n case \"GroupMember\": {\n const groupId = ctx.groupStack.at(-1);\n if (!groupId) break;\n const group = ctx.groups.find((g) => g.id === groupId);\n for (const nodeId of stmt.nodeIds) {\n const node = ctx.nodes.get(nodeId);\n if (node) {\n node.groupId = groupId;\n if (group && !group.nodeIds.includes(nodeId)) group.nodeIds.push(nodeId);\n if (group && !group.members?.some((m) => m.kind === \"node\" && m.id === nodeId)) {\n group.members?.push({ kind: \"node\", id: nodeId });\n }\n } else {\n ctx.pendingGroupMembers.push({ nodeId, groupId, range: stmt.range });\n }\n }\n break;\n }\n default:\n break;\n }\n }\n}\n\nfunction extractGroupPaddingHint(statements: StatementAst[]): string | undefined {\n for (const stmt of statements) {\n if (stmt.type === \"Directive\" && stmt.name === \"padding\" && stmt.value != null) {\n return String(stmt.value);\n }\n }\n return undefined;\n}\n\ntype GroupArrangeHints = {\n paddingHint?: string;\n chrome?: boolean;\n icon?: string;\n iconPaint?: \"theme\" | \"brand\";\n iconColor?: string;\n arrange?: RegionArrange;\n align?: RegionAlign;\n gap?: string | number;\n columns?: TrackSpec;\n rows?: TrackSpec;\n column?: number | string;\n row?: number | string;\n span?: number;\n colSpan?: number;\n rowSpan?: number;\n cellArrange?: CellArrange;\n};\n\nfunction normalizeGroupChrome(value: unknown): boolean | undefined {\n if (value === true || value === \"true\" || value === \"on\") return true;\n if (value === false || value === \"false\" || value === \"none\" || value === \"off\") return false;\n return undefined;\n}\n\nfunction normalizeRegionArrange(value: unknown): RegionArrange | undefined {\n if (value === \"stack\" || value === \"row\" || value === \"grid\") return value;\n return undefined;\n}\n\nfunction normalizeRegionAlign(value: unknown): RegionAlign | undefined {\n if (value === \"stretch\" || value === \"start\" || value === \"center\" || value === \"end\") {\n return value;\n }\n return undefined;\n}\n\nfunction normalizeCellArrange(value: unknown): CellArrange | undefined {\n if (value === \"flow\" || value === \"pack\" || value === \"stack\") return value;\n return undefined;\n}\n\nfunction normalizeTrackSpec(value: unknown): TrackSpec | undefined {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 1) {\n return Math.floor(value);\n }\n if (typeof value === \"string\") {\n const n = Number(value);\n if (Number.isFinite(n) && n >= 1) return Math.floor(n);\n return undefined;\n }\n if (Array.isArray(value) && value.length > 0 && value.every((v) => typeof v === \"string\")) {\n return value.map(String);\n }\n return undefined;\n}\n\nfunction normalizeTrackRef(value: unknown): number | string | undefined {\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 1) {\n return Math.floor(value);\n }\n if (typeof value === \"string\") {\n const n = Number(value);\n if (Number.isFinite(n) && n >= 1 && String(n) === value.trim()) return Math.floor(n);\n if (value.trim()) return value.trim();\n }\n return undefined;\n}\n\nfunction normalizePositiveInt(value: unknown): number | undefined {\n const n = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(n) || n < 1) return undefined;\n return Math.floor(n);\n}\n\nfunction normalizeGap(value: unknown): string | number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) return value;\n if (typeof value === \"string\" && value.trim()) {\n const n = Number(value);\n if (Number.isFinite(n)) return n;\n const named = value.trim();\n if (named === \"compact\" || named === \"normal\" || named === \"spacious\") return named;\n return undefined;\n }\n return undefined;\n}\n\nfunction extractGroupArrangeHints(statements: StatementAst[]): GroupArrangeHints {\n const hints: GroupArrangeHints = {\n paddingHint: extractGroupPaddingHint(statements),\n };\n for (const stmt of statements) {\n if (stmt.type !== \"Directive\" || stmt.value == null) continue;\n switch (stmt.name) {\n case \"chrome\": {\n const chrome = normalizeGroupChrome(stmt.value);\n if (chrome != null) hints.chrome = chrome;\n break;\n }\n case \"icon\": {\n hints.icon = String(stmt.value);\n break;\n }\n case \"iconPaint\": {\n const paint = String(stmt.value).toLowerCase();\n if (paint === \"theme\" || paint === \"brand\") hints.iconPaint = paint;\n break;\n }\n case \"iconColor\": {\n const color = String(stmt.value).trim();\n if (color.length > 0) hints.iconColor = color;\n break;\n }\n case \"arrange\": {\n // Parent track arrange vs in-cell arrange: stack|row|grid are region;\n // flow|pack are cell-only; bare `stack` on a leaf with no children is cell.\n const region = normalizeRegionArrange(stmt.value);\n const cell = normalizeCellArrange(stmt.value);\n if (region) hints.arrange = region;\n else if (cell) hints.cellArrange = cell;\n break;\n }\n case \"align\": {\n const align = normalizeRegionAlign(stmt.value);\n if (align) hints.align = align;\n break;\n }\n case \"gap\": {\n const gap = normalizeGap(stmt.value);\n if (gap != null) hints.gap = gap;\n break;\n }\n case \"columns\": {\n const tracks = normalizeTrackSpec(stmt.value);\n if (tracks != null) hints.columns = tracks;\n break;\n }\n case \"rows\": {\n const tracks = normalizeTrackSpec(stmt.value);\n if (tracks != null) hints.rows = tracks;\n break;\n }\n case \"column\": {\n const ref = normalizeTrackRef(stmt.value);\n if (ref != null) hints.column = ref;\n break;\n }\n case \"row\": {\n const ref = normalizeTrackRef(stmt.value);\n if (ref != null) hints.row = ref;\n break;\n }\n case \"span\": {\n const n = normalizePositiveInt(stmt.value);\n if (n != null) hints.span = n;\n break;\n }\n case \"colSpan\": {\n const n = normalizePositiveInt(stmt.value);\n if (n != null) hints.colSpan = n;\n break;\n }\n case \"rowSpan\": {\n const n = normalizePositiveInt(stmt.value);\n if (n != null) hints.rowSpan = n;\n break;\n }\n default:\n break;\n }\n }\n return hints;\n}\n\nfunction removedPresentationDiagnostics(\n props: Record<string, unknown>,\n range: SourceRange,\n): Diagnostic[] {\n const out: Diagnostic[] = [];\n for (const key of REMOVED_PRESENTATION_PROPS) {\n if (!(key in props)) continue;\n out.push({\n severity: \"warning\",\n code: \"FM210\",\n message: `presentation.${key} was removed — SVG is chromeless by default; set title, legend, padding, groupAccent, etc. explicitly`,\n range,\n hint:\n key === \"preset\"\n ? \"Presets (document/slide/print/embed) no longer exist.\"\n : `Drop ${key}; backgrounds, grids, and frames are not part of the SVG embed model.`,\n });\n }\n return out;\n}\n\nfunction extractHints(diagram: DiagramAst): {\n layoutHints: LayoutOptions;\n routingHints: RoutingOptions;\n renderHints: RenderOptions;\n diagnostics: Diagnostic[];\n} {\n const layoutHints: LayoutOptions = {};\n const routingHints: RoutingOptions = {};\n const renderHints: RenderOptions = {};\n const diagnostics: Diagnostic[] = [];\n let presentationLayers: PresentationOptions[] = [];\n\n for (const stmt of diagram.statements) {\n if (stmt.type === \"Directive\") {\n if (stmt.name === \"direction\" && stmt.value)\n layoutHints.direction = normalizeDirection(String(stmt.value));\n if (stmt.name === \"density\" && stmt.value) {\n if (isRemovedDensityAlias(stmt.value)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM112\",\n message: `density \"${String(stmt.value)}\" is not supported`,\n range: stmt.range,\n hint: \"Use density compact, normal, or spacious\",\n });\n }\n const density = normalizeDensity(stmt.value);\n if (density) layoutHints.density = density;\n }\n }\n if (stmt.type === \"LayoutBlock\") {\n if (stmt.properties.direction)\n layoutHints.direction = normalizeDirection(String(stmt.properties.direction));\n if (stmt.properties.density) {\n if (isRemovedDensityAlias(stmt.properties.density)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM112\",\n message: `density \"${String(stmt.properties.density)}\" is not supported`,\n range: stmt.range,\n hint: \"Use density compact, normal, or spacious\",\n });\n }\n const density = normalizeDensity(stmt.properties.density);\n if (density) layoutHints.density = density;\n }\n if (stmt.properties.spacingScale != null) {\n const spacingScale = optionalNumber(stmt.properties.spacingScale);\n if (spacingScale != null) layoutHints.spacingScale = spacingScale;\n }\n const groupLayout = normalizeGroupLayout(stmt.properties.groupLayout);\n if (groupLayout) layoutHints.groupLayout = groupLayout;\n const nodePlacement = normalizeNodePlacement(stmt.properties.nodePlacement);\n if (nodePlacement) layoutHints.nodePlacement = nodePlacement;\n const considerModelOrder = normalizeBool(stmt.properties.considerModelOrder);\n if (considerModelOrder != null) layoutHints.considerModelOrder = considerModelOrder;\n const groupGap = optionalNumber(stmt.properties.groupGap);\n if (groupGap != null) layoutHints.groupGap = groupGap;\n const edgeNodeSpacing = optionalNumber(stmt.properties.edgeNodeSpacing);\n if (edgeNodeSpacing != null) layoutHints.edgeNodeSpacing = edgeNodeSpacing;\n const edgeEdgeSpacing = optionalNumber(stmt.properties.edgeEdgeSpacing);\n if (edgeEdgeSpacing != null) layoutHints.edgeEdgeSpacing = edgeEdgeSpacing;\n const edgeLabelSpacing = optionalNumber(stmt.properties.edgeLabelSpacing);\n if (edgeLabelSpacing != null) layoutHints.edgeLabelSpacing = edgeLabelSpacing;\n const arrange = normalizeRegionArrange(stmt.properties.arrange);\n if (arrange) layoutHints.arrange = arrange;\n const align = normalizeRegionAlign(stmt.properties.align);\n if (align) layoutHints.align = align;\n const gap = normalizeGap(stmt.properties.gap);\n if (gap != null) layoutHints.gap = gap;\n const columns = normalizeTrackSpec(stmt.properties.columns);\n if (columns != null) layoutHints.columns = columns;\n const rows = normalizeTrackSpec(stmt.properties.rows);\n if (rows != null) layoutHints.rows = rows;\n // Convenience: edgeGap tight|normal|wide → edge/edge-node spacing only\n // (does not crush layer gap — reverse edges still need arrow room).\n const edgeGap = stmt.properties.edgeGap != null ? String(stmt.properties.edgeGap) : \"\";\n if (edgeGap === \"tight\" || edgeGap === \"normal\" || edgeGap === \"wide\") {\n const presets = {\n // Keep a stub+arrow budget even on \"tight\" (layout floors at 28).\n tight: { edgeNodeSpacing: 28, edgeEdgeSpacing: 14, edgeLabelSpacing: 10 },\n normal: { edgeNodeSpacing: 36, edgeEdgeSpacing: 28, edgeLabelSpacing: 16 },\n wide: { edgeNodeSpacing: 72, edgeEdgeSpacing: 56, edgeLabelSpacing: 28 },\n } as const;\n const p = presets[edgeGap];\n if (layoutHints.edgeNodeSpacing == null) layoutHints.edgeNodeSpacing = p.edgeNodeSpacing;\n if (layoutHints.edgeEdgeSpacing == null) layoutHints.edgeEdgeSpacing = p.edgeEdgeSpacing;\n if (layoutHints.edgeLabelSpacing == null) layoutHints.edgeLabelSpacing = p.edgeLabelSpacing;\n }\n }\n if (stmt.type === \"EdgePolicyBlock\") {\n if (stmt.properties.route)\n routingHints.route = String(stmt.properties.route) as RoutingOptions[\"route\"];\n if (stmt.properties.crossings) {\n const crossings = normalizeCrossings(stmt.properties.crossings);\n if (crossings) routingHints.crossings = crossings;\n }\n if (stmt.properties.cornerRadius != null)\n routingHints.cornerRadius = Number(stmt.properties.cornerRadius);\n if (stmt.properties.parallel)\n routingHints.parallel = String(stmt.properties.parallel) as RoutingOptions[\"parallel\"];\n if (stmt.properties.arrowheads != null)\n routingHints.arrowheads = stmt.properties.arrowheads !== false;\n }\n if (stmt.type === \"PresentationBlock\") {\n diagnostics.push(...removedPresentationDiagnostics(stmt.properties, stmt.range));\n presentationLayers.push(presentationFromProperties(stmt.properties));\n }\n if (stmt.type === \"RenderBlock\") {\n if (stmt.properties.theme)\n renderHints.theme = String(stmt.properties.theme) as RenderOptions[\"theme\"];\n if (stmt.properties.shadows != null) renderHints.shadows = stmt.properties.shadows !== false;\n if (stmt.properties.roundedCorners != null)\n renderHints.roundedCorners = stmt.properties.roundedCorners !== false;\n const presentationPreset = stmt.properties.presentation;\n if (typeof presentationPreset === \"string\") {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM210\",\n message: `render.presentation: \"${presentationPreset}\" presets were removed — SVG is chromeless by default`,\n range: stmt.range,\n hint: \"Use presentation { title, padding, groupAccent, … } for opt-in chrome.\",\n });\n } else {\n diagnostics.push(...removedPresentationDiagnostics(stmt.properties, stmt.range));\n presentationLayers.push(presentationFromProperties(stmt.properties));\n }\n }\n }\n\n const mergedPresentation = mergePresentationOptions(...presentationLayers);\n if (mergedPresentation) renderHints.presentation = mergedPresentation;\n\n return { layoutHints, routingHints, renderHints, diagnostics };\n}\n\nexport function compile(ast: KDiagramAst, diagramIndex = 0): CompileResult {\n const top = ast.body[diagramIndex];\n if (top?.type === \"Sequence\") {\n return compileSequence(ast, diagramIndex);\n }\n\n const diagnostics: Diagnostic[] = [...ast.diagnostics];\n const diagram = top;\n if (!diagram || diagram.type !== \"Diagram\") {\n diagnostics.push({\n severity: \"error\",\n code: \"FM100\",\n message: \"No diagram found in document\",\n range: { start: { line: 1, column: 1, offset: 0 }, end: { line: 1, column: 1, offset: 0 } },\n });\n return {\n graph: {\n id: \"empty\",\n nodes: [],\n edges: [],\n groups: [],\n styles: [],\n animations: [],\n diagnostics,\n },\n layoutHints: {},\n routingHints: {},\n renderHints: {},\n diagnostics,\n };\n }\n\n const nodes = new Map<string, GraphNode>();\n const edges: GraphEdge[] = [];\n const groups: GraphGroup[] = [];\n const styles: StyleDefinition[] = [];\n\n const pendingGroupMembers: Array<{\n nodeId: string;\n groupId: string;\n range: import(\"../types/geometry.ts\").SourceRange;\n }> = [];\n\n collectStatements(diagram.statements, {\n nodes,\n edges,\n groups,\n styles,\n diagnostics,\n groupStack: [],\n edgeCounter: 0,\n pendingGroupMembers,\n });\n\n for (const pending of pendingGroupMembers) {\n const node = nodes.get(pending.nodeId);\n const group = groups.find((g) => g.id === pending.groupId);\n if (node && group) {\n node.groupId = pending.groupId;\n if (!group.nodeIds.includes(pending.nodeId)) group.nodeIds.push(pending.nodeId);\n if (!group.members?.some((m) => m.kind === \"node\" && m.id === pending.nodeId)) {\n group.members?.push({ kind: \"node\", id: pending.nodeId });\n }\n } else {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM106\",\n message: `Group membership references unknown node \"${pending.nodeId}\"`,\n range: pending.range,\n });\n }\n }\n\n for (const edge of edges) {\n if (!nodes.has(edge.from)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM103\",\n message: `Edge references unknown node \"${edge.from}\"`,\n range: edge.sourceRange ?? diagram.range,\n });\n }\n if (!nodes.has(edge.to)) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM104\",\n message: `Edge references unknown node \"${edge.to}\"`,\n range: edge.sourceRange ?? diagram.range,\n });\n }\n }\n\n // Materialize FK column refs (`-> customers.id`) into column-anchored relationships.\n let edgeCounter = edges.length;\n for (const node of nodes.values()) {\n if (!node.columns) continue;\n for (const col of node.columns) {\n const ref = col.references;\n if (!ref) continue;\n const target = nodes.get(ref.table);\n if (!target) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM107\",\n message: `FK \"${node.id}.${col.name}\" references unknown table \"${ref.table}\"`,\n range: node.sourceRange ?? diagram.range,\n });\n continue;\n }\n if (findColumnIndex(target.columns, ref.column) < 0 && target.columns?.length) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM108\",\n message: `FK \"${node.id}.${col.name}\" references unknown column \"${ref.table}.${ref.column}\"`,\n range: node.sourceRange ?? diagram.range,\n });\n }\n\n const card = fkCardinality(col.notNull);\n const existing = edges.find(\n (e) =>\n e.from === ref.table &&\n e.to === node.id &&\n (e.fromColumn == null || e.fromColumn === ref.column) &&\n (e.toColumn == null || e.toColumn === col.name),\n );\n if (existing) {\n existing.fromColumn ??= ref.column;\n existing.toColumn ??= col.name;\n existing.cardinality ??= card;\n // Column-anchored FKs default to non-identifying unless author set it.\n if (existing.identifying == null) existing.identifying = false;\n continue;\n }\n\n // Reverse-authored edge (FK → PK): enrich rather than duplicate.\n const reverse = edges.find(\n (e) =>\n e.from === node.id &&\n e.to === ref.table &&\n (e.fromColumn == null || e.fromColumn === col.name) &&\n (e.toColumn == null || e.toColumn === ref.column),\n );\n if (reverse) {\n reverse.fromColumn ??= col.name;\n reverse.toColumn ??= ref.column;\n // Flip IE ends: authored child→parent, card is parent→child.\n reverse.cardinality ??= { from: card.to, to: card.from };\n if (reverse.identifying == null) reverse.identifying = false;\n continue;\n }\n\n edgeCounter++;\n edges.push({\n id: `e${edgeCounter}`,\n from: ref.table,\n to: node.id,\n fromColumn: ref.column,\n toColumn: col.name,\n kind: \"sync\",\n styleRefs: [],\n cardinality: card,\n identifying: false,\n sourceRange: node.sourceRange,\n });\n }\n }\n\n for (const edge of edges) {\n const fromNode = nodes.get(edge.from);\n const toNode = nodes.get(edge.to);\n if (edge.fromColumn && fromNode) {\n if (findColumnIndex(fromNode.columns, edge.fromColumn) < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM109\",\n message: `Edge column \"${edge.from}.${edge.fromColumn}\" not found on table`,\n range: edge.sourceRange ?? diagram.range,\n });\n }\n }\n if (edge.toColumn && toNode) {\n if (findColumnIndex(toNode.columns, edge.toColumn) < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM110\",\n message: `Edge column \"${edge.to}.${edge.toColumn}\" not found on table`,\n range: edge.sourceRange ?? diagram.range,\n });\n }\n }\n\n // Refine default column-edge cardinality from FK nullability (IE: optional parent when FK nullable).\n if (edge.fromColumn && edge.toColumn && !parseCardinality(edge.label)) {\n const toFk = toNode?.columns?.find((c) => c.name === edge.toColumn && c.keys.includes(\"fk\"));\n const fromFk = fromNode?.columns?.find(\n (c) => c.name === edge.fromColumn && c.keys.includes(\"fk\"),\n );\n const refined = toFk\n ? fkCardinality(toFk.notNull)\n : fromFk\n ? (() => {\n const c = fkCardinality(fromFk.notNull);\n return { from: c.to, to: c.from };\n })()\n : undefined;\n if (refined) {\n const looksLikeGenericDefault =\n edge.cardinality?.from === \"one\" && edge.cardinality?.to === \"zeroOrMany\";\n if (!edge.cardinality || looksLikeGenericDefault) {\n edge.cardinality = refined;\n }\n }\n }\n\n // Only column-anchored FK relationships default to non-identifying (dashed).\n if (\n edge.identifying == null &&\n (edge.fromColumn || edge.toColumn) &&\n fromNode?.shape === \"table\" &&\n toNode?.shape === \"table\"\n ) {\n edge.identifying = false;\n }\n }\n\n if (diagram.diagramKind === \"state\") {\n const initialNodes = [...nodes.values()].filter((node) => node.kind === \"initial\");\n const finalNodes = [...nodes.values()].filter((node) => node.kind === \"final\");\n if (initialNodes.length !== 1) {\n diagnostics.push({\n severity: initialNodes.length === 0 ? \"warning\" : \"error\",\n code: \"FM150\",\n message:\n initialNodes.length === 0\n ? \"State diagram has no initial pseudostate\"\n : \"State diagram must have exactly one initial pseudostate\",\n range: initialNodes[1]?.sourceRange ?? diagram.range,\n hint: 'Declare one symbolic entry node, for example `entry: initial \"Start\"`.',\n });\n }\n if (finalNodes.length === 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM151\",\n message: \"State diagram has no final state\",\n range: diagram.range,\n hint: 'Declare at least one terminal node, for example `done: final \"Completed\"`.',\n });\n }\n for (const node of initialNodes) {\n const incoming = edges.filter((edge) => edge.to === node.id);\n const outgoing = edges.filter((edge) => edge.from === node.id);\n if (incoming.length > 0) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM152\",\n message: `Initial pseudostate \"${node.id}\" cannot have incoming transitions`,\n range: incoming[0]?.sourceRange ?? node.sourceRange ?? diagram.range,\n });\n }\n if (outgoing.length !== 1) {\n diagnostics.push({\n severity: \"warning\",\n code: \"FM153\",\n message: `Initial pseudostate \"${node.id}\" should have exactly one outgoing transition`,\n range: node.sourceRange ?? diagram.range,\n });\n }\n }\n for (const node of finalNodes) {\n const outgoing = edges.find((edge) => edge.from === node.id);\n if (outgoing) {\n diagnostics.push({\n severity: \"error\",\n code: \"FM154\",\n message: `Final state \"${node.id}\" cannot have outgoing transitions`,\n range: outgoing.sourceRange ?? node.sourceRange ?? diagram.range,\n });\n }\n }\n }\n\n const graph: GraphModel = {\n id: diagram.name ? diagram.name.toLowerCase().replace(/\\s+/g, \"-\") : \"diagram\",\n title: diagram.name,\n diagramKind: diagram.diagramKind,\n nodes: [...nodes.values()],\n edges,\n groups,\n styles,\n animations: compileAnimationBlocks(\n collectAnimationBlocks(diagram.statements),\n nodes,\n diagnostics,\n ),\n diagnostics,\n };\n\n const hints = extractHints(diagram);\n diagnostics.push(...hints.diagnostics);\n const { diagnostics: _hintDiags, ...hintFields } = hints;\n if (diagram.diagramKind === \"state\") {\n hintFields.layoutHints = {\n ...hintFields.layoutHints,\n direction: hintFields.layoutHints.direction ?? \"TD\",\n };\n }\n return { graph, ...hintFields, diagnostics };\n}\n\nfunction collectAnimationBlocks(statements: StatementAst[]): AnimationBlockAst[] {\n const blocks: AnimationBlockAst[] = [];\n for (const stmt of statements) {\n if (stmt.type === \"AnimationBlock\") blocks.push(stmt);\n if (stmt.type === \"Group\") blocks.push(...collectAnimationBlocks(stmt.statements));\n }\n return blocks;\n}\n","import { parse } from \"../parser/parser.ts\";\nimport type {\n DiagramAst,\n KDiagramAst,\n GroupAst,\n SequenceAst,\n SequenceStatementAst,\n StatementAst,\n TopLevelNode,\n} from \"../parser/ast.ts\";\nimport { formatTableColumnLine, parseTableColumnSpec } from \"../types/table.ts\";\n\nconst INDENT = \" \";\n\nexport function formatSource(source: string): string {\n const ast = parse(source);\n if (ast.diagnostics.some((d) => d.severity === \"error\")) {\n return source.trimEnd() + \"\\n\";\n }\n return printDocument(ast);\n}\n\nfunction printDocument(ast: KDiagramAst): string {\n const parts: string[] = [];\n if (ast.version != null) parts.push(`kdiagram ${ast.version}`);\n parts.push(...ast.body.map(printTopLevel));\n return parts.join(\"\\n\\n\") + \"\\n\";\n}\n\nfunction printTopLevel(node: TopLevelNode): string {\n if (node.type === \"Sequence\") return printSequence(node);\n return printDiagram(node);\n}\n\nfunction printDiagram(diagram: DiagramAst): string {\n const keyword = diagram.diagramKind === \"state\" ? \"state\" : \"diagram\";\n const head = diagram.name != null ? `${keyword} \"${diagram.name}\" {` : `${keyword} {`;\n const lines: string[] = [head];\n // Hoist policy as a unit, but retain its authored order: direction/density shorthand and layout\n // blocks can target the same field, so sorting those statements could change which value wins.\n const policy = diagram.statements.filter(isDiagramPolicyStatement);\n const content = diagram.statements.filter((statement) => !isDiagramPolicyStatement(statement));\n\n for (const statement of policy) printStatement(statement, 1, lines);\n if (policy.length > 0 && content.length > 0) lines.push(\"\");\n let previousContent: StatementAst | undefined;\n for (const statement of content) {\n const adjacentInSource =\n previousContent != null &&\n diagram.statements.indexOf(statement) === diagram.statements.indexOf(previousContent) + 1;\n if (previousContent && adjacentInSource && hasBlankLineBetween(previousContent, statement)) {\n lines.push(\"\");\n }\n printStatement(statement, 1, lines);\n previousContent = statement;\n }\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\nfunction isDiagramPolicyStatement(statement: StatementAst): boolean {\n return diagramPolicyRank(statement) < Number.POSITIVE_INFINITY;\n}\n\nfunction diagramPolicyRank(statement: StatementAst): number {\n if (statement.type === \"Directive\" && statement.name === \"direction\") return 0;\n if (statement.type === \"Directive\" && statement.name === \"density\") return 1;\n if (statement.type === \"LayoutBlock\") return 2;\n if (statement.type === \"EdgePolicyBlock\") return 3;\n if (statement.type === \"RenderBlock\") return 4;\n if (statement.type === \"PresentationBlock\") return 5;\n return Number.POSITIVE_INFINITY;\n}\n\nfunction printSequence(seq: SequenceAst): string {\n const head = seq.name != null ? `sequence \"${seq.name}\" {` : \"sequence {\";\n const lines: string[] = [head];\n printSeparated(seq.statements, lines, (stmt) => printSequenceStatement(stmt, 1, lines));\n lines.push(\"}\");\n return lines.join(\"\\n\");\n}\n\nfunction printSequenceStatement(stmt: SequenceStatementAst, depth: number, lines: string[]): void {\n const pad = INDENT.repeat(depth);\n switch (stmt.type) {\n case \"SequenceActivate\":\n lines.push(`${pad}activate ${stmt.participantId}`);\n break;\n case \"SequenceDeactivate\":\n lines.push(`${pad}deactivate ${stmt.participantId}`);\n break;\n case \"SequenceCreate\": {\n const n = stmt.node;\n const isSuffix = n.styleRefs.map((s) => ` is ${s}`).join(\"\");\n const head = `${pad}create ${n.id}: ${n.kind}${n.label ? ` \"${n.label}\"` : \"\"}${isSuffix}`;\n printPropsBlock(head, n.properties, depth, lines);\n break;\n }\n case \"SequenceDestroy\":\n lines.push(`${pad}destroy ${stmt.participantId}`);\n break;\n case \"SequenceNote\": {\n const ids = stmt.participantIds.join(\", \");\n const place =\n stmt.placement === \"over\"\n ? `over ${ids}`\n : stmt.placement === \"left\"\n ? `left of ${ids}`\n : `right of ${ids}`;\n lines.push(`${pad}note ${place} \"${stmt.text}\"`);\n break;\n }\n case \"SequenceDivider\":\n lines.push(stmt.label ? `${pad}divider \"${stmt.label}\"` : `${pad}divider`);\n break;\n case \"SequenceAutonumber\":\n lines.push(`${pad}autonumber`);\n break;\n case \"SequenceFragment\": {\n const label = stmt.label ? ` \"${stmt.label}\"` : \"\";\n for (let i = 0; i < stmt.operands.length; i++) {\n const op = stmt.operands[i]!;\n const keyword = i === 0 ? stmt.operator : stmt.operator === \"parallel\" ? \"and\" : \"else\";\n const opLabel = i === 0 ? label : op.label ? ` \"${op.label}\"` : \"\";\n const styleSuffix = op.styleRefs.map((s) => ` is ${s}`).join(\"\");\n lines.push(`${pad}${keyword}${opLabel}${styleSuffix} {`);\n printSeparated(op.statements, lines, (inner) =>\n printSequenceStatement(inner, depth + 1, lines),\n );\n lines.push(`${pad}}`);\n }\n break;\n }\n default:\n printStatement(stmt as StatementAst, depth, lines);\n break;\n }\n}\n\nfunction printStatement(stmt: StatementAst, depth: number, lines: string[]): void {\n const pad = INDENT.repeat(depth);\n switch (stmt.type) {\n case \"Directive\":\n lines.push(`${pad}${printDirective(stmt)}`);\n break;\n case \"Node\": {\n const isSuffix = stmt.styleRefs.map((s) => ` is ${s}`).join(\"\");\n const head = `${pad}${stmt.id}: ${stmt.kind}${stmt.label ? ` \"${stmt.label}\"` : \"\"}${isSuffix}`;\n printPropsBlock(head, stmt.properties, depth, lines);\n break;\n }\n case \"Edge\": {\n const from = stmt.fromColumn ? `${stmt.from}.${stmt.fromColumn}` : stmt.from;\n const to = stmt.toColumn ? `${stmt.to}.${stmt.toColumn}` : stmt.to;\n const label = stmt.label ? ` \"${stmt.label}\"` : \"\";\n const isSuffix = stmt.styleRefs.map((s) => ` is ${s}`).join(\"\");\n const head = `${pad}${from} ${stmt.op} ${to}${label}`;\n printPropsBlock(head, stmt.properties, depth, lines, isSuffix);\n break;\n }\n case \"Group\":\n printGroup(stmt, depth, lines);\n break;\n case \"Style\": {\n const forTarget =\n stmt.target === \"edge\" ? \" for edge\" : stmt.target === \"fragment\" ? \" for fragment\" : \"\";\n printPropertyBlock(`${pad}style ${stmt.name}${forTarget}`, stmt.properties, depth, lines);\n break;\n }\n case \"StyleRef\":\n lines.push(`${pad}${stmt.targetIds.join(\", \")} is ${stmt.styleName}`);\n break;\n case \"GroupMember\":\n lines.push(`${pad}${stmt.nodeIds.join(\", \")}`);\n break;\n case \"LayoutBlock\":\n printPropertyBlock(`${pad}layout`, stmt.properties, depth, lines);\n break;\n case \"EdgePolicyBlock\":\n printPropertyBlock(`${pad}edges`, stmt.properties, depth, lines);\n break;\n case \"RenderBlock\":\n printPropertyBlock(`${pad}render`, stmt.properties, depth, lines);\n break;\n case \"PresentationBlock\":\n printPropertyBlock(`${pad}presentation`, stmt.properties, depth, lines);\n break;\n case \"AnimationBlock\": {\n lines.push(`${pad}animation \"${stmt.name}\" {`);\n printSeparated(stmt.cues, lines, (cue) => {\n for (const line of formatAnimationCueLines(cue)) {\n lines.push(line ? `${pad}${INDENT}${line}` : \"\");\n }\n });\n lines.push(`${pad}}`);\n break;\n }\n }\n}\n\nfunction printDirective(stmt: Extract<StatementAst, { type: \"Directive\" }>): string {\n const value = Array.isArray(stmt.value) ? stmt.value.join(\", \") : (stmt.value ?? \"\");\n // Top-level layout shorthand is intentionally whitespace-delimited. A colon makes the parser\n // treat `direction` or `density` as a node id; group layout hints retain property syntax.\n return stmt.name === \"direction\" || stmt.name === \"density\"\n ? `${stmt.name} ${value}`\n : `${stmt.name}: ${value}`;\n}\n\nfunction formatAnimationCueLines(cue: import(\"../parser/ast.ts\").AnimationCueAst): string[] {\n if (cue.type === \"parallel\") {\n const lines = [\"parallel {\"];\n let previous: (typeof cue.cues)[number] | undefined;\n for (const child of cue.cues) {\n if (previous && hasBlankLineBetween(previous, child)) lines.push(\"\");\n for (const line of formatAnimationCueLines(child)) {\n lines.push(line ? `${INDENT}${line}` : \"\");\n }\n previous = child;\n }\n lines.push(\"}\");\n return lines;\n }\n return [formatAnimationCue(cue)];\n}\n\nfunction formatAnimationCue(cue: import(\"../parser/ast.ts\").AnimationCueAst): string {\n switch (cue.type) {\n case \"loop\":\n return \"loop\";\n case \"wait\":\n return `wait ${formatDuration(cue.durationMs)}`;\n case \"dim\":\n case \"activate\":\n return `${cue.type} ${cue.targets.map(formatAnimationTarget).join(\", \")}`;\n case \"pulse\": {\n const dur = cue.durationMs != null ? ` for ${formatDuration(cue.durationMs)}` : \"\";\n return `pulse ${cue.targets.map(formatAnimationTarget).join(\", \")}${dur}`;\n }\n case \"flow\": {\n const dur = cue.durationMs != null ? ` for ${formatDuration(cue.durationMs)}` : \"\";\n return `flow ${cue.path.join(\" -> \")}${dur}`;\n }\n case \"parallel\":\n return \"parallel { … }\";\n }\n}\n\nfunction formatAnimationTarget(t: import(\"../parser/ast.ts\").AnimationTargetAst): string {\n if (t.type === \"all\") return \"*\";\n if (t.type === \"node\") return t.id;\n return `${t.from} -> ${t.to}`;\n}\n\nfunction formatDuration(ms: number): string {\n if (ms >= 1000 && ms % 100 === 0) {\n const s = ms / 1000;\n return `${s}s`;\n }\n return `${ms}ms`;\n}\n\nfunction printPropsBlock(\n head: string,\n properties: Record<string, string | number | boolean | string[]>,\n depth: number,\n lines: string[],\n tail = \"\",\n): void {\n const pad = INDENT.repeat(depth);\n const entries = Object.entries(properties);\n if (entries.length === 0) {\n lines.push(`${head}${tail}`);\n return;\n }\n if (entries.length === 1 && entries[0]![0] !== \"columns\") {\n const [key, value] = entries[0]!;\n lines.push(`${head} { ${key}: ${formatValue(value)} }${tail}`);\n return;\n }\n lines.push(`${head} {`);\n for (const [k, v] of entries) {\n if (k === \"columns\" && Array.isArray(v)) {\n lines.push(`${pad}${INDENT}columns {`);\n for (const raw of v) {\n const col = parseTableColumnSpec(String(raw));\n const line = col ? formatTableColumnLine(col) : String(raw);\n lines.push(`${pad}${INDENT}${INDENT}${line}`);\n }\n lines.push(`${pad}${INDENT}}`);\n continue;\n }\n lines.push(`${pad}${INDENT}${k}: ${formatValue(v)}`);\n }\n lines.push(`${pad}}${tail}`);\n}\n\nfunction printGroup(group: GroupAst, depth: number, lines: string[]): void {\n const pad = INDENT.repeat(depth);\n const id = group.id ? `${group.id} ` : \"\";\n const label = group.label != null ? `\"${group.label}\" ` : \"\";\n lines.push(`${pad}${group.groupKind} ${id}${label}{`);\n printSeparated(group.statements, lines, (stmt) => printStatement(stmt, depth + 1, lines));\n lines.push(`${pad}}`);\n}\n\nfunction printPropertyBlock(\n head: string,\n properties: Record<string, string | number | boolean | string[]>,\n depth: number,\n lines: string[],\n): void {\n const entries = Object.entries(properties);\n if (entries.length === 0) {\n lines.push(`${head} {}`);\n return;\n }\n if (entries.length === 1) {\n const [key, value] = entries[0]!;\n lines.push(`${head} { ${key}: ${formatValue(value)} }`);\n return;\n }\n\n const pad = INDENT.repeat(depth);\n lines.push(`${head} {`);\n for (const [key, value] of entries) {\n lines.push(`${pad}${INDENT}${key}: ${formatValue(value)}`);\n }\n lines.push(`${pad}}`);\n}\n\nfunction printSeparated<T extends { range: { start: { line: number }; end: { line: number } } }>(\n items: T[],\n lines: string[],\n print: (item: T) => void,\n): void {\n let previous: T | undefined;\n for (const item of items) {\n if (previous && hasBlankLineBetween(previous, item)) {\n lines.push(\"\");\n }\n print(item);\n previous = item;\n }\n}\n\nfunction hasBlankLineBetween(\n previous: { range: { end: { line: number } } },\n next: { range: { start: { line: number } } },\n): boolean {\n return next.range.start.line > previous.range.end.line + 1;\n}\n\nfunction formatValue(v: string | number | boolean | string[]): string {\n if (Array.isArray(v)) return `[${v.map((x) => `\"${x}\"`).join(\", \")}]`;\n if (typeof v === \"string\") {\n return /^[A-Za-z_][A-Za-z0-9_-]*$/.test(v) ? v : JSON.stringify(v);\n }\n return String(v);\n}\n","import type { Diagnostic, SourceRange } from \"./geometry.ts\";\nimport type { BranchKind } from \"./branch.ts\";\nimport type { EdgeCardinality } from \"./cardinality.ts\";\nimport type { TableColumn } from \"./table.ts\";\nimport type { ShapeId } from \"./shapes.ts\";\nimport type { AnimationDefinition } from \"../animation/types.ts\";\n\nexport type { AnimationTarget, AnimationCue, AnimationDefinition } from \"../animation/types.ts\";\n\nexport type { BranchKind } from \"./branch.ts\";\nexport type { Cardinality, EdgeCardinality } from \"./cardinality.ts\";\nexport type { TableColumn, TableColumnKey } from \"./table.ts\";\nexport type { ShapeId, BuiltinShapeId } from \"./shapes.ts\";\nexport {\n BUILTIN_SHAPE_IDS,\n normalizeShapeId,\n isKnownShapeId,\n listBuiltinShapeIds,\n} from \"./shapes.ts\";\n\nexport type EdgeKind = \"sync\" | \"async\" | \"eventual\" | \"dependency\" | \"failure\" | \"association\";\n/** Where arrowheads attach after layout (path always runs from → to). */\nexport type EdgeArrows = \"end\" | \"start\" | \"both\" | \"none\";\nexport type GroupKind = \"group\" | \"boundary\" | \"zone\" | \"swimlane\";\nexport type Direction = \"LR\" | \"RL\" | \"TD\" | \"BT\";\n/** Whole-diagram spacing preset. Local `gap` / `padding` prefer px numbers. */\nexport type Density = \"compact\" | \"normal\" | \"spacious\";\nexport type RouteMode = \"straight\" | \"bezier\" | \"orthogonal\" | \"rounded\" | \"metro\";\nexport type CrossingMode = \"none\" | \"gaps\" | \"jumps\" | \"smart\";\nexport type BuiltinThemeMode = \"dark\" | \"light\";\n/** Built-in themes or names passed to `registerTheme()`. */\nexport type ThemeMode = BuiltinThemeMode | (string & {});\n\nexport type StyleDefinition = {\n name: string;\n /** Defaults to node when omitted (authored `style name { }` / builtins). */\n target?: \"node\" | \"edge\" | \"fragment\";\n properties: Record<string, string>;\n};\n\nexport type GraphNode = {\n id: string;\n label: string;\n /**\n * True when `label` came from a quoted string literal in source.\n * False when the label was derived from the bare id.\n * Authored labels must render verbatim (aside from XML/SVG escaping).\n */\n labelAuthored?: boolean;\n kind: string;\n /** Geometry id from the shared shape library (normalized at compile). */\n shape?: ShapeId;\n icon?: string;\n /** Paint policy for icons: brand (embedded fills, default) or theme (currentColor). */\n iconPaint?: \"theme\" | \"brand\";\n /**\n * Icon-only ink (CSS color). Compiles to `--icon-color` and themes the glyph\n * without changing the node shell stroke/fill.\n */\n iconColor?: string;\n depth?: number;\n minWidth?: number;\n maxWidth?: number;\n /** Presentation scale for measure + label size (1 = default). */\n scale?: number;\n groupId?: string;\n styleRefs: string[];\n unresolvedVars?: Record<string, string>;\n note?: string;\n /**\n * When true, show the built-in kind eyebrow (e.g. \"Service\") for this node.\n * Prefer authored `subtitle` text when you want a custom line.\n */\n showSubtitle?: boolean;\n /** Optional author-provided subtitle under the title (not the kind name). */\n subtitle?: string;\n /** C4 / architecture technology tag (e.g. \"Spring Boot\", \"[Java]\"). */\n technology?: string;\n /** Longer body text under the title (C4 description). */\n description?: string;\n /** ERD columns — when present on a `table` kind, shape becomes an entity card. */\n columns?: TableColumn[];\n sourceRange?: SourceRange;\n};\n\nexport type GraphEdge = {\n id: string;\n from: string;\n to: string;\n label?: string;\n /**\n * True when `label` came from a quoted string literal in source.\n * Edge labels are only present when authored; keep the flag for render policy.\n */\n labelAuthored?: boolean;\n kind: EdgeKind;\n /**\n * Arrowhead placement on the routed path (`from` → `to`).\n * Reverse DSL ops (`<-`, …) swap endpoints at compile so arrows stay `\"end\"`.\n * Bidirectional `<->` compiles to `\"both\"`.\n */\n arrows?: EdgeArrows;\n styleRefs: string[];\n /** Optional icon shown beside the edge label (same id vocabulary as nodes). */\n icon?: string;\n /** Paint policy for edge icons: brand (embedded fills) or theme (currentColor). */\n iconPaint?: \"theme\" | \"brand\";\n /** Icon-only ink (CSS color) for the edge label glyph. */\n iconColor?: string;\n priority?: \"low\" | \"normal\" | \"high\";\n /**\n * Prefer the label near the start, middle, or end of the routed path.\n * Auto placement still avoids nodes/crossings; this biases the scorer.\n */\n labelPosition?: \"start\" | \"middle\" | \"end\";\n /** Yes/no/neutral branch cue — explicit DSL or compiled from label. */\n branch?: BranchKind;\n /** ERD relationship multiplicity (crow's-foot markers). */\n cardinality?: EdgeCardinality;\n /** Source column name for ERD column-anchored edges. */\n fromColumn?: string;\n /** Target column name for ERD column-anchored edges. */\n toColumn?: string;\n /**\n * Identifying relationship (solid) vs non-identifying (dashed).\n * Column-anchored FK edges default to `false` (non-identifying).\n * Plain table edges without column anchors stay solid unless set explicitly.\n */\n identifying?: boolean;\n /** Sequence message order (0-based) when diagramKind is sequence. */\n sequenceOrder?: number;\n /** Sequence message kind when diagramKind is sequence. */\n sequenceKind?: import(\"./sequence.ts\").SequenceMessageKind;\n sourceRange?: SourceRange;\n};\n\nexport type RegionArrange = \"stack\" | \"row\" | \"grid\";\nexport type RegionAlign = \"stretch\" | \"start\" | \"center\" | \"end\";\nexport type CellArrange = \"flow\" | \"pack\" | \"stack\";\n/** Track spec: count, or named tracks for column/row assignment. */\nexport type TrackSpec = number | string[];\n\n/** Declaration-order member of a group (node or nested group/zone). */\nexport type GroupMemberRef = { kind: \"node\"; id: string } | { kind: \"group\"; id: string };\n\nexport type GraphGroup = {\n id: string;\n label: string;\n /**\n * True when `label` came from a quoted string literal in source.\n * False when the label was derived from the bare group id.\n */\n labelAuthored?: boolean;\n kind: GroupKind;\n parentId?: string;\n nodeIds: string[];\n childGroupIds: string[];\n /**\n * Source order of direct members (nodes + child groups).\n * Used by region arrange so interleaved nodes stay on the track.\n */\n members?: GroupMemberRef[];\n styleRefs: string[];\n paddingHint?: string;\n /**\n * When false, skip border/fill/label (layout-only plane).\n * Default true — dashed group chrome.\n */\n chrome?: boolean;\n /** Optional glyph beside the group label (same id vocabulary as nodes). */\n icon?: string;\n /** Paint policy for group icons: brand (default for logos) or theme. */\n iconPaint?: \"theme\" | \"brand\";\n /** Tint the group glyph without changing the group rim. */\n iconColor?: string;\n /**\n * How this group places its child groups/zones.\n * `stack` / `row` / `grid` = region tracks; omit = ELK ownership.\n */\n arrange?: RegionArrange;\n /** Cross-axis alignment of child regions (default stretch). */\n align?: RegionAlign;\n /** Gap between child regions (`compact` | `normal` | `spacious` or px). */\n gap?: string | number;\n /** Grid column tracks (count or names). */\n columns?: TrackSpec;\n /** Grid row tracks (count or names). */\n rows?: TrackSpec;\n /** This region's column (1-based index or track name). */\n column?: number | string;\n /** This region's row (1-based index or track name). */\n row?: number | string;\n /** Span along the main axis (stack/row) or shorthand for colSpan. */\n span?: number;\n colSpan?: number;\n rowSpan?: number;\n /** How nodes inside this region are laid out (default flow = ELK). */\n cellArrange?: CellArrange;\n};\n\nexport type GraphModel = {\n id: string;\n title?: string;\n /** Flow (ELK) vs sequence (time-axis). Default `\"flow\"` when omitted. */\n diagramKind?: import(\"./sequence.ts\").DiagramKind;\n /** Present when `diagramKind === \"sequence\"`. */\n sequence?: import(\"./sequence.ts\").SequenceIR;\n nodes: GraphNode[];\n edges: GraphEdge[];\n groups: GraphGroup[];\n styles: StyleDefinition[];\n /** Authored `animation` blocks compiled onto the graph (auto is inferred separately). */\n animations?: AnimationDefinition[];\n diagnostics: Diagnostic[];\n};\n\nexport type LayoutOptions = {\n direction?: Direction;\n density?: Density;\n spacingScale?: number;\n algorithmVersion?: \"elk-layered-v1\";\n groupGap?: number;\n /**\n * Nested group handling for ELK.\n * - `compound` / `auto` → INCLUDE_CHILDREN (default)\n * - `flat` → SEPARATE_CHILDREN\n * - `swimlane` → INCLUDE_CHILDREN (DSL group kind still distinct)\n */\n groupLayout?: \"auto\" | \"flat\" | \"compound\" | \"swimlane\";\n /**\n * How layered layout places nodes along each rank.\n * - `straight` — prefer aligned/straight edges (ELK Brandes–Köpf)\n * - `balanced` — more even packing (ELK network simplex; default)\n * - `basic` — fastest / simplest placement (often cleaner for ERDs)\n *\n * The compiler also accepts common short aliases (`brandes`, `network`, `simple`)\n * and ELK strategy spellings (`BRANDES_KOEPF`, …) and maps them to these values.\n */\n nodePlacement?: \"straight\" | \"balanced\" | \"basic\";\n /** Prefer source order when ranking/ordering. */\n considerModelOrder?: boolean;\n /** Edge–node clearance override (defaults from density). */\n edgeNodeSpacing?: number;\n /** Parallel-edge clearance override. */\n edgeEdgeSpacing?: number;\n /** Clearance between edge labels and other edges/nodes. */\n edgeLabelSpacing?: number;\n /**\n * Arrange ungrouped nodes and top-level groups/zones into tracks (stack / row / grid).\n * Per-group `arrange` wins when set on a parent.\n */\n arrange?: RegionArrange;\n /** Cross-axis alignment for diagram-level arrange (default stretch). */\n align?: RegionAlign;\n /** Gap between top-level regions when `arrange` is set. */\n gap?: string | number;\n /** Grid columns when diagram `arrange: grid`. */\n columns?: TrackSpec;\n /** Grid rows when diagram `arrange: grid`. */\n rows?: TrackSpec;\n};\n\nexport type RoutingOptions = {\n /** Paint style for edge polylines (geometry always comes from ELK orthogonal). */\n route?: RouteMode;\n crossings?: CrossingMode;\n cornerRadius?: number;\n /** DSL-accepted; ignored by ELK (orthogonal routes are independent). */\n parallel?: \"separate\" | \"shared\";\n arrowheads?: boolean;\n algorithmVersion?: string;\n};\n\nimport type { PresentationOptions } from \"./presentation.ts\";\n\nexport type RenderOptions = {\n theme?: ThemeMode;\n snapshotTheme?: boolean;\n /** Additive presentation chrome — default chromeless transparent SVG. */\n presentation?: PresentationOptions;\n debug?: DebugOptions;\n /** Opt-in drop shadows / glow. Default off. */\n shadows?: boolean;\n /**\n * Opt-in corner radius on rectangular node shells (rounded/rectangle/pill,\n * ERD tables, groups, edge labels). Default off — sharp corners.\n */\n roundedCorners?: boolean;\n};\n\nexport type DebugOptions = {\n /** Draw circles at ELK edge attachment points (source + target). */\n showPorts?: boolean;\n showBounds?: boolean;\n showKindLabels?: boolean;\n};\n\nexport type CompileOptions = Record<string, never>;\n\nexport type InteractiveRenderOptions = RenderOptions & {\n layout?: LayoutOptions;\n edges?: RoutingOptions;\n};\n\nexport type RenderStats = {\n parseMs: number;\n compileMs: number;\n measureMs: number;\n layoutMs: number;\n routeMs: number;\n renderMs: number;\n totalMs: number;\n nodeCount: number;\n edgeCount: number;\n layoutAlgorithm: string;\n routerAlgorithm: string;\n};\n\nexport type CompileResult = {\n graph: GraphModel;\n layoutHints: LayoutOptions;\n routingHints: RoutingOptions;\n renderHints: RenderOptions;\n diagnostics: Diagnostic[];\n};\n\nexport type ParseResult = {\n ast: import(\"../parser/ast.ts\").KDiagramAst;\n diagnostics: Diagnostic[];\n};\n\nexport type RenderResult = {\n ok: boolean;\n svg?: string;\n ast?: import(\"../parser/ast.ts\").KDiagramAst;\n graph?: GraphModel;\n layout?: unknown;\n routing?: unknown;\n diagnostics: Diagnostic[];\n stats: RenderStats;\n};\n\nexport type AnimationListItem = {\n id: string;\n name: string;\n source: \"auto\" | \"authored\";\n};\n\nexport type AnimationPlayerState = {\n id: string | null;\n playing: boolean;\n timeMs: number;\n durationMs: number;\n loop: boolean;\n /** Playback rate in [0.5, 2]. */\n speed: number;\n};\n\nexport type AnimationController = {\n list(): AnimationListItem[];\n play(id?: string): void;\n pause(): void;\n stop(): void;\n seek(ms: number): void;\n step(delta: -1 | 1): void;\n setLoop(on: boolean): void;\n /** Clamp playback rate to [0.5, 2]. */\n setSpeed(rate: number): void;\n subscribe(listener: (state: AnimationPlayerState) => void): () => void;\n getState(): AnimationPlayerState;\n};\n\nexport type RenderController = {\n update(source: string, options?: Partial<InteractiveRenderOptions>): Promise<RenderResult>;\n setTheme(theme: ThemeMode): Promise<RenderResult>;\n /** Resolves after the initial paint (and first fit). */\n ready(): Promise<RenderResult>;\n fit(): void;\n zoomIn(): void;\n zoomOut(): void;\n /** Reset pan/zoom to the fitted natural view (not a model/view switch). */\n resetView(): void;\n /** Diagram animation player (auto path or authored `animation` blocks). */\n animations: AnimationController;\n destroy(): void;\n};\n\nexport function mergeOptions<T extends Record<string, unknown>>(\n defaults: T,\n ...layers: (Partial<T> | undefined)[]\n): T {\n const result = { ...defaults };\n for (const layer of layers) {\n if (!layer) continue;\n for (const [k, v] of Object.entries(layer)) {\n if (v !== undefined) (result as Record<string, unknown>)[k] = v;\n }\n }\n return result;\n}\n","/** Core geometry and shared primitives — no AST types here. */\n\nexport type Point = { x: number; y: number };\nexport type Vec2 = { x: number; y: number };\nexport type Rect = { x: number; y: number; width: number; height: number };\nexport type BoxPadding = { top: number; right: number; bottom: number; left: number };\n\nexport type SourceRange = {\n start: { line: number; column: number; offset: number };\n end: { line: number; column: number; offset: number };\n};\n\nexport type Diagnostic = {\n severity: \"error\" | \"warning\" | \"info\";\n code: string;\n message: string;\n range: SourceRange;\n hint?: string;\n};\n\nexport function rectCenter(r: Rect): Point {\n return { x: r.x + r.width / 2, y: r.y + r.height / 2 };\n}\n\nexport function rectRight(r: Rect): number {\n return r.x + r.width;\n}\n\nexport function rectBottom(r: Rect): number {\n return r.y + r.height;\n}\n\nexport function rectsOverlap(a: Rect, b: Rect, gap = 0): boolean {\n return !(\n a.x + a.width + gap <= b.x ||\n b.x + b.width + gap <= a.x ||\n a.y + a.height + gap <= b.y ||\n b.y + b.height + gap <= a.y\n );\n}\n\nexport function expandRect(r: Rect, pad: number): Rect {\n return {\n x: r.x - pad,\n y: r.y - pad,\n width: r.width + pad * 2,\n height: r.height + pad * 2,\n };\n}\n\nexport function manhattan(a: Point, b: Point): number {\n return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n"],"mappings":"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"}
|