merslim 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/diagrams/layout/dagreLayout.ts","../src/components/diagrams/shared/theme.ts","../src/utils/diagrams/svgBuilders.ts","../src/components/diagrams/FlowchartRenderer.tsx","../src/components/diagrams/ERRenderer.tsx","../src/components/diagrams/PieRenderer.tsx","../src/components/diagrams/QuadrantRenderer.tsx","../src/components/diagrams/JourneyRenderer.tsx","../src/components/diagrams/SequenceRenderer.tsx","../src/components/diagrams/ClassRenderer.tsx","../src/components/diagrams/StateRenderer.tsx","../src/components/diagrams/GanttRenderer.tsx","../src/components/diagrams/TimelineRenderer.tsx","../src/components/diagrams/MindmapRenderer.tsx","../src/components/diagrams/ArchitectureRenderer.tsx","../src/components/diagrams/C4Renderer.tsx","../src/components/diagrams/GitGraphRenderer.tsx","../src/utils/diagrams/parser.ts","../src/utils/diagrams/registry.ts","../src/components/diagrams/DiagramRenderer.tsx","../src/utils/diagrams/export.ts","../src/components/diagrams/DiagramExportToolbar.tsx","../src/index.ts","../src/components/diagrams/bootstrap.ts","../src/utils/diagrams/convenience.ts","../src/components/diagrams/darkMode.ts"],"names":["dagre","len","lines","cx","cy","minX","minY","maxX","maxY","useEffect","jsx","useRef","useMemo","jsxs","source","useState","flowchartNodeSize"],"mappings":"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","file":"index.js","sourcesContent":["// Dagre-based DAG layout for FlowchartIR.\r\n//\r\n// Takes a FlowchartIR + per-node dimensions and returns absolute positions\r\n// for every node. Renderer-agnostic — produces plain { x, y } coordinates.\r\n\r\nimport dagre from 'dagre';\r\nimport type { FlowchartIR, FlowDirection } from '../types';\r\n\r\nexport interface NodeSize {\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface LayoutResult {\r\n /** Absolute top-left coordinates per node id. */\r\n nodePositions: Map<string, { x: number; y: number }>;\r\n /** Bounding box of the entire graph (post-padding). */\r\n width: number;\r\n height: number;\r\n}\r\n\r\nexport interface DagreLayoutOptions {\r\n /** Default node size when not provided per-node. */\r\n defaultNodeSize?: NodeSize;\r\n /** Map of nodeId → { width, height }. Falls back to defaultNodeSize. */\r\n nodeSizes?: Map<string, NodeSize>;\r\n /** Spacing between sibling nodes in the same rank. Default: 60. */\r\n nodeSeparation?: number;\r\n /** Spacing between ranks. Default: 80. */\r\n rankSeparation?: number;\r\n /** Outer margin. Default: 24. */\r\n margin?: number;\r\n}\r\n\r\nconst DAGRE_RANK_DIR: Record<FlowDirection, string> = {\r\n TB: 'TB',\r\n BT: 'BT',\r\n LR: 'LR',\r\n RL: 'RL',\r\n};\r\n\r\nexport function layoutFlowchart(ir: FlowchartIR, options: DagreLayoutOptions = {}): LayoutResult {\r\n const defaultSize = options.defaultNodeSize ?? { width: 180, height: 60 };\r\n const nodeSizes = options.nodeSizes ?? new Map<string, NodeSize>();\r\n const nodeSep = options.nodeSeparation ?? 60;\r\n const rankSep = options.rankSeparation ?? 80;\r\n const margin = options.margin ?? 24;\r\n\r\n const g = new dagre.graphlib.Graph({ multigraph: true, compound: true });\r\n g.setGraph({\r\n rankdir: DAGRE_RANK_DIR[ir.direction],\r\n nodesep: nodeSep,\r\n ranksep: rankSep,\r\n marginx: margin,\r\n marginy: margin,\r\n });\r\n g.setDefaultEdgeLabel(() => ({}));\r\n\r\n // Subgraph parents (compound graph)\r\n const subgraphIds = new Set<string>();\r\n if (ir.subgraphs) {\r\n for (const sg of ir.subgraphs) {\r\n g.setNode(sg.id, { label: sg.label, clusterLabelPos: 'top' });\r\n subgraphIds.add(sg.id);\r\n }\r\n }\r\n\r\n // Nodes — also track one representative child per subgraph so that any\r\n // edges pointing at the subgraph itself can be redirected. Dagre's\r\n // compound layout crashes with \"Cannot set properties of undefined\r\n // (setting 'rank')\" if an edge endpoint is the cluster node.\r\n const representativeChild = new Map<string, string>();\r\n for (const node of ir.nodes) {\r\n const size = nodeSizes.get(node.id) ?? defaultSize;\r\n g.setNode(node.id, { ...size, label: node.label });\r\n if (node.subgraph) {\r\n g.setParent(node.id, node.subgraph);\r\n if (!representativeChild.has(node.subgraph)) {\r\n representativeChild.set(node.subgraph, node.id);\r\n }\r\n }\r\n }\r\n\r\n // Edges — redirect any endpoint that is itself a subgraph (cluster) to\r\n // one of its children. Drop the edge if the cluster has no children.\r\n const resolveEndpoint = (id: string): string | null => {\r\n if (!subgraphIds.has(id)) return id;\r\n return representativeChild.get(id) ?? null;\r\n };\r\n for (const edge of ir.edges) {\r\n const source = resolveEndpoint(edge.source);\r\n const target = resolveEndpoint(edge.target);\r\n if (!source || !target) continue;\r\n if (!g.hasNode(source) || !g.hasNode(target)) continue;\r\n g.setEdge(source, target, edge.label ? { label: edge.label } : {});\r\n }\r\n\r\n dagre.layout(g);\r\n\r\n const nodePositions = new Map<string, { x: number; y: number }>();\r\n let maxX = 0;\r\n let maxY = 0;\r\n for (const node of ir.nodes) {\r\n const { x, y } = g.node(node.id) as { x: number; y: number };\r\n const size = nodeSizes.get(node.id) ?? defaultSize;\r\n // dagre returns the CENTER of the node — convert to top-left\r\n const topLeft = { x: x - size.width / 2, y: y - size.height / 2 };\r\n nodePositions.set(node.id, topLeft);\r\n maxX = Math.max(maxX, topLeft.x + size.width);\r\n maxY = Math.max(maxY, topLeft.y + size.height);\r\n }\r\n\r\n return {\r\n nodePositions,\r\n width: maxX + margin,\r\n height: maxY + margin,\r\n };\r\n}\r\n","// Color tokens + per-node-kind styling for the native ReactFlow renderers.\r\n//\r\n// Each NodeKind maps to a 4-color palette (border / header bg / accent /\r\n// text) for both light and dark themes. Renderers and the SVG export\r\n// pipeline read from this file so the live diagram and the exported SVG\r\n// use identical colors.\r\n\r\nimport type { NodeKind } from '../../../utils/diagrams/types';\r\n\r\nexport interface KindStyle {\r\n border: string;\r\n headerBg: string;\r\n accent: string;\r\n bodyBg: string;\r\n text: string;\r\n iconColor: string;\r\n}\r\n\r\ninterface ThemePalette {\r\n canvasBg: string;\r\n edgeColor: string;\r\n edgeLabel: string;\r\n edgeLabelBg: string;\r\n subgraphBg: string;\r\n subgraphBorder: string;\r\n subgraphLabel: string;\r\n nodeShadow: string;\r\n byKind: Record<NodeKind, KindStyle>;\r\n}\r\n\r\n// Light palette\r\nconst LIGHT: ThemePalette = {\r\n canvasBg: '#f8fafc', // slate-50\r\n edgeColor: '#94a3b8', // slate-400\r\n edgeLabel: '#475569', // slate-600\r\n edgeLabelBg: '#ffffff',\r\n subgraphBg: 'rgba(241, 245, 249, 0.5)', // slate-100/50\r\n subgraphBorder: '#cbd5e1', // slate-300\r\n subgraphLabel: '#475569',\r\n nodeShadow: 'rgba(15, 23, 42, 0.08)',\r\n byKind: {\r\n service: {\r\n border: '#86efac',\r\n headerBg: '#ecfdf5',\r\n accent: '#10b981',\r\n bodyBg: '#ffffff',\r\n text: '#064e3b',\r\n iconColor: '#10b981',\r\n },\r\n database: {\r\n border: '#fcd34d',\r\n headerBg: '#fffbeb',\r\n accent: '#f59e0b',\r\n bodyBg: '#ffffff',\r\n text: '#78350f',\r\n iconColor: '#f59e0b',\r\n },\r\n queue: {\r\n border: '#fda4af',\r\n headerBg: '#fff1f2',\r\n accent: '#f43f5e',\r\n bodyBg: '#ffffff',\r\n text: '#881337',\r\n iconColor: '#f43f5e',\r\n },\r\n storage: {\r\n border: '#67e8f9',\r\n headerBg: '#ecfeff',\r\n accent: '#06b6d4',\r\n bodyBg: '#ffffff',\r\n text: '#164e63',\r\n iconColor: '#06b6d4',\r\n },\r\n user: {\r\n border: '#93c5fd',\r\n headerBg: '#eff6ff',\r\n accent: '#3b82f6',\r\n bodyBg: '#ffffff',\r\n text: '#1e3a8a',\r\n iconColor: '#3b82f6',\r\n },\r\n client: {\r\n border: '#c4b5fd',\r\n headerBg: '#f5f3ff',\r\n accent: '#8b5cf6',\r\n bodyBg: '#ffffff',\r\n text: '#4c1d95',\r\n iconColor: '#8b5cf6',\r\n },\r\n external: {\r\n border: '#cbd5e1',\r\n headerBg: '#f1f5f9',\r\n accent: '#64748b',\r\n bodyBg: '#ffffff',\r\n text: '#334155',\r\n iconColor: '#64748b',\r\n },\r\n process: {\r\n border: '#bfdbfe',\r\n headerBg: '#eff6ff',\r\n accent: '#60a5fa',\r\n bodyBg: '#ffffff',\r\n text: '#1e3a8a',\r\n iconColor: '#60a5fa',\r\n },\r\n decision: {\r\n border: '#c4b5fd',\r\n headerBg: '#f5f3ff',\r\n accent: '#8b5cf6',\r\n bodyBg: '#faf5ff',\r\n text: '#4c1d95',\r\n iconColor: '#8b5cf6',\r\n },\r\n start: {\r\n border: '#86efac',\r\n headerBg: '#ecfdf5',\r\n accent: '#10b981',\r\n bodyBg: '#ffffff',\r\n text: '#064e3b',\r\n iconColor: '#10b981',\r\n },\r\n end: {\r\n border: '#fda4af',\r\n headerBg: '#fff1f2',\r\n accent: '#f43f5e',\r\n bodyBg: '#ffffff',\r\n text: '#881337',\r\n iconColor: '#f43f5e',\r\n },\r\n icon: {\r\n border: '#cbd5e1',\r\n headerBg: '#ffffff',\r\n accent: '#64748b',\r\n bodyBg: '#ffffff',\r\n text: '#1e293b',\r\n iconColor: '#64748b',\r\n },\r\n plain: {\r\n border: '#cbd5e1',\r\n headerBg: '#f8fafc',\r\n accent: '#64748b',\r\n bodyBg: '#ffffff',\r\n text: '#1e293b',\r\n iconColor: '#64748b',\r\n },\r\n },\r\n};\r\n\r\n// Dark palette — slightly muted backgrounds, brighter borders/accents\r\nconst DARK: ThemePalette = {\r\n canvasBg: '#0f172a',\r\n edgeColor: '#64748b',\r\n edgeLabel: '#cbd5e1',\r\n edgeLabelBg: '#1e293b',\r\n subgraphBg: 'rgba(30, 41, 59, 0.5)',\r\n subgraphBorder: '#475569',\r\n subgraphLabel: '#94a3b8',\r\n nodeShadow: 'rgba(0, 0, 0, 0.30)',\r\n byKind: {\r\n service: {\r\n border: '#10b981',\r\n headerBg: 'rgba(16, 185, 129, 0.12)',\r\n accent: '#34d399',\r\n bodyBg: '#1e293b',\r\n text: '#a7f3d0',\r\n iconColor: '#34d399',\r\n },\r\n database: {\r\n border: '#f59e0b',\r\n headerBg: 'rgba(245, 158, 11, 0.12)',\r\n accent: '#fbbf24',\r\n bodyBg: '#1e293b',\r\n text: '#fde68a',\r\n iconColor: '#fbbf24',\r\n },\r\n queue: {\r\n border: '#f43f5e',\r\n headerBg: 'rgba(244, 63, 94, 0.12)',\r\n accent: '#fb7185',\r\n bodyBg: '#1e293b',\r\n text: '#fecdd3',\r\n iconColor: '#fb7185',\r\n },\r\n storage: {\r\n border: '#06b6d4',\r\n headerBg: 'rgba(6, 182, 212, 0.12)',\r\n accent: '#22d3ee',\r\n bodyBg: '#1e293b',\r\n text: '#a5f3fc',\r\n iconColor: '#22d3ee',\r\n },\r\n user: {\r\n border: '#3b82f6',\r\n headerBg: 'rgba(59, 130, 246, 0.12)',\r\n accent: '#60a5fa',\r\n bodyBg: '#1e293b',\r\n text: '#bfdbfe',\r\n iconColor: '#60a5fa',\r\n },\r\n client: {\r\n border: '#8b5cf6',\r\n headerBg: 'rgba(139, 92, 246, 0.12)',\r\n accent: '#a78bfa',\r\n bodyBg: '#1e293b',\r\n text: '#ddd6fe',\r\n iconColor: '#a78bfa',\r\n },\r\n external: {\r\n border: '#64748b',\r\n headerBg: 'rgba(100, 116, 139, 0.12)',\r\n accent: '#94a3b8',\r\n bodyBg: '#1e293b',\r\n text: '#cbd5e1',\r\n iconColor: '#94a3b8',\r\n },\r\n process: {\r\n border: '#60a5fa',\r\n headerBg: 'rgba(96, 165, 250, 0.12)',\r\n accent: '#93c5fd',\r\n bodyBg: '#1e293b',\r\n text: '#bfdbfe',\r\n iconColor: '#93c5fd',\r\n },\r\n decision: {\r\n border: '#8b5cf6',\r\n headerBg: 'rgba(139, 92, 246, 0.12)',\r\n accent: '#a78bfa',\r\n bodyBg: '#1e293b',\r\n text: '#ddd6fe',\r\n iconColor: '#a78bfa',\r\n },\r\n start: {\r\n border: '#10b981',\r\n headerBg: 'rgba(16, 185, 129, 0.12)',\r\n accent: '#34d399',\r\n bodyBg: '#1e293b',\r\n text: '#a7f3d0',\r\n iconColor: '#34d399',\r\n },\r\n end: {\r\n border: '#f43f5e',\r\n headerBg: 'rgba(244, 63, 94, 0.12)',\r\n accent: '#fb7185',\r\n bodyBg: '#1e293b',\r\n text: '#fecdd3',\r\n iconColor: '#fb7185',\r\n },\r\n icon: {\r\n border: '#475569',\r\n headerBg: '#1e293b',\r\n accent: '#94a3b8',\r\n bodyBg: '#1e293b',\r\n text: '#e2e8f0',\r\n iconColor: '#94a3b8',\r\n },\r\n plain: {\r\n border: '#475569',\r\n headerBg: '#1e293b',\r\n accent: '#94a3b8',\r\n bodyBg: '#1e293b',\r\n text: '#e2e8f0',\r\n iconColor: '#94a3b8',\r\n },\r\n },\r\n};\r\n\r\nexport function getDiagramTheme(dark: boolean): ThemePalette {\r\n return dark ? DARK : LIGHT;\r\n}\r\n","// Hand-built standalone SVG generators for each diagram type.\n//\n// The export pipeline previously cloned the live ReactFlow / vis-timeline DOM\n// into a <foreignObject>. Browsers rasterize that unreliably (security\n// constraints when an SVG-as-image references foreign HTML), so PNG export\n// produced blank or partial output.\n//\n// db-schema solved the same problem by drawing the SVG by hand from its IR\n// + dagre positions (see components/DbSchemaFlow.tsx#buildSvg). These\n// builders apply the same approach to every native renderer:\n// - Pure SVG primitives (rect, line, path, text). No HTML, no foreignObject.\n// - Self-contained: ships with its own font-family and inline colors.\n// - Identical visual style to the on-screen renderer — colors, shapes, and\n// layout positions all match.\n\nimport type {\n ArchitectureIR,\n ArchitectureNode,\n C4Element,\n C4ElementKind,\n C4IR,\n ClassDiagramIR,\n ClassMember,\n ClassNode,\n ERDiagramIR,\n EdgeIR,\n FlowchartIR,\n GanttDiagramIR,\n GitGraphIR,\n JourneyIR,\n MindmapIR,\n MindmapNode,\n NodeIR,\n NodeKind,\n PieChartIR,\n QuadrantChartIR,\n StateDiagramIR,\n StateNode,\n TimelineIR,\n} from './types';\nimport dagre from 'dagre';\n\n// ── XML escaping ────────────────────────────────────────────────────────\n\nfunction escXml(s: string): string {\n return s\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\n}\n\n// ── Color palettes (kept in sync with components/diagrams/shared/theme.ts) ─\n\ninterface KindColors {\n border: string;\n headerBg: string;\n accent: string;\n bodyBg: string;\n text: string;\n}\n\nconst LIGHT_KIND: Record<NodeKind, KindColors> = {\n service: { border: '#86efac', headerBg: '#ecfdf5', accent: '#10b981', bodyBg: '#ffffff', text: '#064e3b' },\n database: { border: '#fcd34d', headerBg: '#fffbeb', accent: '#f59e0b', bodyBg: '#ffffff', text: '#78350f' },\n queue: { border: '#fda4af', headerBg: '#fff1f2', accent: '#f43f5e', bodyBg: '#ffffff', text: '#881337' },\n storage: { border: '#67e8f9', headerBg: '#ecfeff', accent: '#06b6d4', bodyBg: '#ffffff', text: '#164e63' },\n user: { border: '#93c5fd', headerBg: '#eff6ff', accent: '#3b82f6', bodyBg: '#ffffff', text: '#1e3a8a' },\n client: { border: '#c4b5fd', headerBg: '#f5f3ff', accent: '#8b5cf6', bodyBg: '#ffffff', text: '#4c1d95' },\n external: { border: '#cbd5e1', headerBg: '#f1f5f9', accent: '#64748b', bodyBg: '#ffffff', text: '#334155' },\n process: { border: '#bfdbfe', headerBg: '#eff6ff', accent: '#60a5fa', bodyBg: '#ffffff', text: '#1e3a8a' },\n decision: { border: '#c4b5fd', headerBg: '#f5f3ff', accent: '#8b5cf6', bodyBg: '#faf5ff', text: '#4c1d95' },\n start: { border: '#86efac', headerBg: '#ecfdf5', accent: '#10b981', bodyBg: '#ffffff', text: '#064e3b' },\n end: { border: '#fda4af', headerBg: '#fff1f2', accent: '#f43f5e', bodyBg: '#ffffff', text: '#881337' },\n icon: { border: '#cbd5e1', headerBg: '#ffffff', accent: '#64748b', bodyBg: '#ffffff', text: '#1e293b' },\n plain: { border: '#cbd5e1', headerBg: '#f8fafc', accent: '#64748b', bodyBg: '#ffffff', text: '#1e293b' },\n};\n\nconst DARK_KIND: Record<NodeKind, KindColors> = {\n service: { border: '#10b981', headerBg: 'rgba(16,185,129,0.12)', accent: '#34d399', bodyBg: '#1e293b', text: '#a7f3d0' },\n database: { border: '#f59e0b', headerBg: 'rgba(245,158,11,0.12)', accent: '#fbbf24', bodyBg: '#1e293b', text: '#fde68a' },\n queue: { border: '#f43f5e', headerBg: 'rgba(244,63,94,0.12)', accent: '#fb7185', bodyBg: '#1e293b', text: '#fecdd3' },\n storage: { border: '#06b6d4', headerBg: 'rgba(6,182,212,0.12)', accent: '#22d3ee', bodyBg: '#1e293b', text: '#a5f3fc' },\n user: { border: '#3b82f6', headerBg: 'rgba(59,130,246,0.12)', accent: '#60a5fa', bodyBg: '#1e293b', text: '#bfdbfe' },\n client: { border: '#8b5cf6', headerBg: 'rgba(139,92,246,0.12)', accent: '#a78bfa', bodyBg: '#1e293b', text: '#ddd6fe' },\n external: { border: '#64748b', headerBg: 'rgba(100,116,139,0.12)', accent: '#94a3b8', bodyBg: '#1e293b', text: '#cbd5e1' },\n process: { border: '#60a5fa', headerBg: 'rgba(96,165,250,0.12)', accent: '#93c5fd', bodyBg: '#1e293b', text: '#bfdbfe' },\n decision: { border: '#8b5cf6', headerBg: 'rgba(139,92,246,0.12)', accent: '#a78bfa', bodyBg: '#1e293b', text: '#ddd6fe' },\n start: { border: '#10b981', headerBg: 'rgba(16,185,129,0.12)', accent: '#34d399', bodyBg: '#1e293b', text: '#a7f3d0' },\n end: { border: '#f43f5e', headerBg: 'rgba(244,63,94,0.12)', accent: '#fb7185', bodyBg: '#1e293b', text: '#fecdd3' },\n icon: { border: '#475569', headerBg: '#1e293b', accent: '#94a3b8', bodyBg: '#1e293b', text: '#e2e8f0' },\n plain: { border: '#475569', headerBg: '#1e293b', accent: '#94a3b8', bodyBg: '#1e293b', text: '#e2e8f0' },\n};\n\ninterface PaletteCommon {\n canvasBg: string;\n edgeColor: string;\n edgeLabel: string;\n edgeLabelBg: string;\n text: string;\n subtle: string;\n border: string;\n}\nconst LIGHT_COMMON: PaletteCommon = {\n canvasBg: '#ffffff',\n edgeColor: '#94a3b8',\n edgeLabel: '#475569',\n edgeLabelBg: '#ffffff',\n text: '#1e293b',\n subtle: '#64748b',\n border: '#cbd5e1',\n};\nconst DARK_COMMON: PaletteCommon = {\n canvasBg: '#0f172a',\n edgeColor: '#64748b',\n edgeLabel: '#cbd5e1',\n edgeLabelBg: '#1e293b',\n text: '#e2e8f0',\n subtle: '#94a3b8',\n border: '#475569',\n};\n\nfunction palette(dark: boolean) {\n return {\n common: dark ? DARK_COMMON : LIGHT_COMMON,\n byKind: dark ? DARK_KIND : LIGHT_KIND,\n };\n}\n\nconst FONT_FAMILY = '\"Inter\", ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", sans-serif';\nconst MONO_FAMILY = '\"Fira Code\", ui-monospace, SFMono-Regular, Menlo, monospace';\n\n// ── Sizing helpers (kept in sync with renderers) ────────────────────────\n\nfunction flowchartNodeSize(node: NodeIR): { width: number; height: number } {\n if (node.kind === 'user' || node.kind === 'start' || node.kind === 'end') {\n return { width: 84, height: 84 };\n }\n if (node.kind === 'icon') return { width: 100, height: 96 };\n if (node.kind === 'decision') {\n const len = node.label.length;\n return {\n width: Math.max(140, Math.min(280, len * 11 + 60)),\n height: Math.max(96, Math.min(160, Math.ceil(len / 16) * 32 + 64)),\n };\n }\n if (node.kind === 'queue') return { width: 220, height: 64 };\n // rect (default)\n const len = node.label.length;\n const lines = Math.max(1, Math.ceil(len / 24));\n return {\n width: Math.max(160, Math.min(320, len * 8 + 40)),\n height: 48 + (lines - 1) * 18,\n };\n}\n\nfunction stateNodeSize(s: StateNode): { width: number; height: number } {\n if (s.kind === 'start' || s.kind === 'end') return { width: 24, height: 24 };\n const len = (s.label || s.id).length;\n return { width: Math.max(96, len * 9 + 40), height: 44 };\n}\n\n// Wrap text to multiple `<tspan>` lines for readability inside boxes.\nfunction wrapText(text: string, maxChars: number): string[] {\n if (text.length <= maxChars) return [text];\n const words = text.split(/\\s+/);\n const lines: string[] = [];\n let line = '';\n for (const w of words) {\n if ((line + ' ' + w).trim().length > maxChars && line) {\n lines.push(line);\n line = w;\n } else {\n line = (line + ' ' + w).trim();\n }\n }\n if (line) lines.push(line);\n return lines;\n}\n\nfunction tspans(lines: string[], x: number, lineHeight: number): string {\n return lines\n .map((l, i) => `<tspan x=\"${x}\" dy=\"${i === 0 ? 0 : lineHeight}\">${escXml(l)}</tspan>`)\n .join('');\n}\n\n// ── Edge geometry ───────────────────────────────────────────────────────\n\ninterface BBox { x: number; y: number; width: number; height: number; }\n\nfunction attachPoint(box: BBox, towards: { x: number; y: number }): { x: number; y: number } {\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n const dx = towards.x - cx;\n const dy = towards.y - cy;\n if (dx === 0 && dy === 0) return { x: cx, y: cy };\n // Find intersection with the box edge\n const halfW = box.width / 2;\n const halfH = box.height / 2;\n const tx = Math.abs(dx) > 0 ? halfW / Math.abs(dx) : Infinity;\n const ty = Math.abs(dy) > 0 ? halfH / Math.abs(dy) : Infinity;\n const t = Math.min(tx, ty);\n return { x: cx + dx * t, y: cy + dy * t };\n}\n\ninterface BuildOptions {\n dark?: boolean;\n /** Outer canvas padding around the bounding box. Default: 32. */\n padding?: number;\n}\n\n// ── Common SVG header / arrow marker ────────────────────────────────────\n\nfunction arrowDef(id: string, color: string): string {\n return `<marker id=\"${id}\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\"><path d=\"M 0 0 L 10 5 L 0 10 z\" fill=\"${color}\"/></marker>`;\n}\n\nfunction svgOpen(\n viewX: number,\n viewY: number,\n w: number,\n h: number,\n bg: string,\n title?: string,\n): string {\n const label = (title ?? 'Diagram').trim() || 'Diagram';\n const titleEl = `<title>${escXml(label)}</title>`;\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" viewBox=\"${viewX} ${viewY} ${w} ${h}\" width=\"${w}\" height=\"${h}\" font-family='${FONT_FAMILY}' role=\"img\" aria-label=\"${escXml(label)}\">${titleEl}<rect x=\"${viewX}\" y=\"${viewY}\" width=\"${w}\" height=\"${h}\" fill=\"${bg}\"/>`;\n}\n\n// ── Flowchart ────────────────────────────────────────────────────────────\n\nexport function buildFlowchartSvg(\n ir: FlowchartIR,\n positions: Map<string, { x: number; y: number }>,\n options: BuildOptions = {}\n): string {\n const { common, byKind } = palette(options.dark ?? false);\n const padding = options.padding ?? 40;\n\n const boxes = new Map<string, BBox>();\n for (const node of ir.nodes) {\n const pos = positions.get(node.id);\n if (!pos) continue;\n const size = flowchartNodeSize(node);\n boxes.set(node.id, { x: pos.x, y: pos.y, width: size.width, height: size.height });\n }\n\n if (boxes.size === 0) return svgOpen(0, 0, 100, 100, common.canvasBg) + '</svg>';\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const b of boxes.values()) {\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n minX -= padding; minY -= padding; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY);\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, minY, width, height, common.canvasBg, 'Flowchart diagram'));\n parts.push(`<defs>${arrowDef('arr', common.edgeColor)}</defs>`);\n\n // Edges\n for (const e of ir.edges) {\n const a = boxes.get(e.source);\n const b = boxes.get(e.target);\n if (!a || !b) continue;\n parts.push(buildEdgePath(a, b, e, common));\n }\n\n // Nodes\n for (const node of ir.nodes) {\n const box = boxes.get(node.id);\n if (!box) continue;\n parts.push(buildFlowNode(node, box, byKind[node.kind]));\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\nfunction buildEdgePath(a: BBox, b: BBox, edge: EdgeIR, common: PaletteCommon): string {\n const ac = { x: a.x + a.width / 2, y: a.y + a.height / 2 };\n const bc = { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n const p1 = attachPoint(a, bc);\n const p2 = attachPoint(b, ac);\n const dx = Math.abs(p2.x - p1.x);\n const dy = Math.abs(p2.y - p1.y);\n const horizontal = dx > dy;\n const cp = Math.max(30, (horizontal ? dx : dy) * 0.45);\n const c1 = horizontal ? { x: p1.x + Math.sign(p2.x - p1.x) * cp, y: p1.y } : { x: p1.x, y: p1.y + Math.sign(p2.y - p1.y) * cp };\n const c2 = horizontal ? { x: p2.x - Math.sign(p2.x - p1.x) * cp, y: p2.y } : { x: p2.x, y: p2.y - Math.sign(p2.y - p1.y) * cp };\n\n const dash = edge.kind === 'dashed' ? ' stroke-dasharray=\"6 4\"' : edge.kind === 'dotted' ? ' stroke-dasharray=\"2 3\"' : '';\n const sw = edge.kind === 'thick' ? 2.5 : 1.5;\n\n const path = `<path d=\"M ${p1.x} ${p1.y} C ${c1.x} ${c1.y}, ${c2.x} ${c2.y}, ${p2.x} ${p2.y}\" stroke=\"${common.edgeColor}\" stroke-width=\"${sw}\" fill=\"none\"${dash} marker-end=\"url(#arr)\"/>`;\n\n if (!edge.label) return path;\n // Label centered along the curve at t=0.5 (Bezier midpoint)\n const lx = 0.125 * p1.x + 0.375 * c1.x + 0.375 * c2.x + 0.125 * p2.x;\n const ly = 0.125 * p1.y + 0.375 * c1.y + 0.375 * c2.y + 0.125 * p2.y;\n const text = escXml(edge.label);\n // Approximate label background width\n const w = text.length * 6.5 + 12;\n return (\n path +\n `<rect x=\"${lx - w / 2}\" y=\"${ly - 9}\" width=\"${w}\" height=\"16\" fill=\"${common.edgeLabelBg}\" rx=\"3\"/>` +\n `<text x=\"${lx}\" y=\"${ly + 3}\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"500\" fill=\"${common.edgeLabel}\">${text}</text>`\n );\n}\n\nfunction buildFlowNode(node: NodeIR, box: BBox, c: KindColors): string {\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n\n if (node.kind === 'decision') {\n const left = box.x, right = box.x + box.width, top = box.y, bottom = box.y + box.height;\n const points = `${cx},${top} ${right},${cy} ${cx},${bottom} ${left},${cy}`;\n const lines = wrapText(node.label, 18);\n return (\n `<polygon points=\"${points}\" fill=\"${c.bodyBg}\" stroke=\"${c.accent}\" stroke-width=\"1.5\"/>` +\n `<text x=\"${cx}\" y=\"${cy - (lines.length - 1) * 7}\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"600\" fill=\"${c.text}\">${tspans(lines, cx, 14)}</text>`\n );\n }\n\n if (node.kind === 'database') {\n // cylinder\n const rx = box.width / 2;\n const ry = 8;\n const top = box.y;\n const bottom = box.y + box.height;\n const path = `M ${box.x} ${top + ry} A ${rx} ${ry} 0 0 0 ${box.x + box.width} ${top + ry} L ${box.x + box.width} ${bottom - ry} A ${rx} ${ry} 0 0 1 ${box.x} ${bottom - ry} Z`;\n const ellipse = `<ellipse cx=\"${cx}\" cy=\"${top + ry}\" rx=\"${rx}\" ry=\"${ry}\" fill=\"none\" stroke=\"${c.accent}\" stroke-width=\"2\"/>`;\n return (\n `<path d=\"${path}\" fill=\"${c.bodyBg}\" stroke=\"${c.border}\" stroke-width=\"1\"/>` +\n ellipse +\n `<text x=\"${cx}\" y=\"${cy + 6}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${c.text}\">${escXml(node.label)}</text>`\n );\n }\n\n if (node.kind === 'user' || node.kind === 'start' || node.kind === 'end') {\n const r = Math.min(box.width, box.height) / 2;\n const lines = wrapText(node.label, 12);\n return (\n `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${c.bodyBg}\" stroke=\"${c.accent}\" stroke-width=\"2\"/>` +\n `<text x=\"${cx}\" y=\"${cy + 4 - (lines.length - 1) * 7}\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"600\" fill=\"${c.text}\">${tspans(lines, cx, 14)}</text>`\n );\n }\n\n if (node.kind === 'queue') {\n // double-rect (subroutine)\n return (\n `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.width}\" height=\"${box.height}\" rx=\"8\" fill=\"${c.bodyBg}\" stroke=\"${c.accent}\" stroke-width=\"1\"/>` +\n `<rect x=\"${box.x + 4}\" y=\"${box.y + 4}\" width=\"${box.width - 8}\" height=\"${box.height - 8}\" rx=\"5\" fill=\"none\" stroke=\"${c.border}\" stroke-width=\"1\"/>` +\n `<text x=\"${cx}\" y=\"${cy + 5}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${c.text}\">${escXml(node.label)}</text>`\n );\n }\n\n // Default rect (with left accent stripe)\n const lines = wrapText(node.label, 24);\n return (\n `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.width}\" height=\"${box.height}\" rx=\"10\" fill=\"${c.bodyBg}\" stroke=\"${c.border}\" stroke-width=\"1\"/>` +\n `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"4\" height=\"${box.height}\" fill=\"${c.accent}\"/>` +\n `<text x=\"${cx}\" y=\"${cy + 4 - (lines.length - 1) * 8}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${c.text}\">${tspans(lines, cx, 16)}</text>`\n );\n}\n\n// ── State diagram ────────────────────────────────────────────────────────\n\nexport interface StateBuildPositions {\n /** Top-level nodes: absolute top-left. */\n topLevel: Map<string, { x: number; y: number; width: number; height: number }>;\n /** Children inside composites: position relative to composite top-left. */\n children: Map<string, { x: number; y: number; width: number; height: number; parent: string }>;\n}\n\nexport function buildStateSvg(\n ir: StateDiagramIR,\n positions: StateBuildPositions,\n options: BuildOptions = {}\n): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 40;\n\n const boxes = new Map<string, BBox>();\n for (const [id, p] of positions.topLevel) {\n boxes.set(id, p);\n }\n for (const [id, p] of positions.children) {\n const parent = boxes.get(p.parent);\n if (!parent) continue;\n boxes.set(id, { x: parent.x + p.x, y: parent.y + p.y, width: p.width, height: p.height });\n }\n\n if (boxes.size === 0) return svgOpen(0, 0, 100, 100, common.canvasBg) + '</svg>';\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const b of boxes.values()) {\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n minX -= padding; minY -= padding; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY);\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, minY, width, height, common.canvasBg, 'State diagram'));\n parts.push(`<defs>${arrowDef('arr', common.edgeColor)}</defs>`);\n\n // Composite frames first (so they sit BEHIND children)\n for (const s of ir.states) {\n if (s.kind !== 'composite') continue;\n const box = boxes.get(s.id);\n if (!box) continue;\n parts.push(\n `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.width}\" height=\"${box.height}\" rx=\"14\" fill=\"${dark ? 'rgba(15,23,42,0.5)' : '#ffffff'}\" stroke=\"${common.border}\" stroke-width=\"1.5\"/>` +\n `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.width}\" height=\"32\" rx=\"14\" fill=\"${dark ? '#1e293b' : '#f1f5f9'}\"/>` +\n `<rect x=\"${box.x}\" y=\"${box.y + 18}\" width=\"${box.width}\" height=\"14\" fill=\"${dark ? '#1e293b' : '#f1f5f9'}\"/>` +\n `<line x1=\"${box.x}\" y1=\"${box.y + 32}\" x2=\"${box.x + box.width}\" y2=\"${box.y + 32}\" stroke=\"${common.border}\" stroke-width=\"1\"/>` +\n `<text x=\"${box.x + box.width / 2}\" y=\"${box.y + 21}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"600\" fill=\"${common.text}\">${escXml(s.label || s.id)}</text>`\n );\n }\n\n // Edges\n for (const t of ir.transitions) {\n const a = boxes.get(t.source);\n const b = boxes.get(t.target);\n if (!a || !b) continue;\n parts.push(buildEdgePath(a, b, { source: t.source, target: t.target, label: t.label, kind: 'solid' }, common));\n }\n\n // Non-composite states\n for (const s of ir.states) {\n if (s.kind === 'composite') continue;\n const box = boxes.get(s.id);\n if (!box) continue;\n parts.push(buildStateBox(s, box, common, dark));\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\nfunction buildStateBox(s: StateNode, box: BBox, common: PaletteCommon, dark: boolean): string {\n if (s.kind === 'start' || s.kind === 'end') {\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n const r = 12;\n const fill = s.kind === 'start' ? (dark ? '#e2e8f0' : '#0f172a') : (dark ? '#0f172a' : '#ffffff');\n const stroke = dark ? '#e2e8f0' : '#0f172a';\n const inner = s.kind === 'end'\n ? `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r - 4}\" fill=\"${dark ? '#e2e8f0' : '#0f172a'}\"/>`\n : '';\n return `<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${r}\" fill=\"${fill}\" stroke=\"${stroke}\" stroke-width=\"2\"/>${inner}`;\n }\n const cx = box.x + box.width / 2;\n const cy = box.y + box.height / 2;\n return (\n `<rect x=\"${box.x}\" y=\"${box.y}\" width=\"${box.width}\" height=\"${box.height}\" rx=\"14\" fill=\"${dark ? '#1e293b' : '#ffffff'}\" stroke=\"${common.border}\" stroke-width=\"1.5\"/>` +\n `<text x=\"${cx}\" y=\"${cy + 5}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${common.text}\">${escXml(s.label || s.id)}</text>`\n );\n}\n\n// ── Class diagram ────────────────────────────────────────────────────────\n\nexport function buildClassSvg(\n ir: ClassDiagramIR,\n positions: Map<string, { x: number; y: number; width: number; height: number }>,\n options: BuildOptions = {}\n): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 40;\n\n if (positions.size === 0) return svgOpen(0, 0, 100, 100, common.canvasBg) + '</svg>';\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of positions.values()) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x + p.width);\n maxY = Math.max(maxY, p.y + p.height);\n }\n minX -= padding; minY -= padding; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY);\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, minY, width, height, common.canvasBg, 'Class diagram'));\n parts.push(`<defs>${arrowDef('arr', common.edgeColor)}</defs>`);\n\n // Edges\n for (const rel of ir.relations) {\n const a = positions.get(rel.source);\n const b = positions.get(rel.target);\n if (!a || !b) continue;\n const aBox: BBox = { x: a.x, y: a.y, width: a.width, height: a.height };\n const bBox: BBox = { x: b.x, y: b.y, width: b.width, height: b.height };\n const dashed = rel.kind === 'dependency' || rel.kind === 'realization';\n parts.push(buildEdgePath(aBox, bBox, { source: rel.source, target: rel.target, label: rel.label, kind: dashed ? 'dashed' : 'solid' }, common));\n }\n\n // Class nodes\n for (const cls of ir.classes) {\n const p = positions.get(cls.id);\n if (!p) continue;\n parts.push(buildClassNode(cls, p, common, dark));\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\nconst VIS_SYMBOL: Record<string, string> = { public: '+', private: '-', protected: '#', package: '~' };\n\nfunction buildClassNode(cls: ClassNode, p: { x: number; y: number; width: number; height: number }, common: PaletteCommon, dark: boolean): string {\n const headerH = 30;\n const rowH = 18;\n const attrs = cls.members.filter((m) => m.kind === 'attribute');\n const methods = cls.members.filter((m) => m.kind === 'method');\n\n const parts: string[] = [];\n parts.push(`<g transform=\"translate(${p.x},${p.y})\">`);\n parts.push(`<rect width=\"${p.width}\" height=\"${p.height}\" rx=\"8\" fill=\"${dark ? '#0f172a' : '#ffffff'}\" stroke=\"${common.border}\" stroke-width=\"1\"/>`);\n parts.push(`<rect width=\"${p.width}\" height=\"${headerH}\" rx=\"8\" fill=\"${dark ? '#1e293b' : '#f1f5f9'}\"/>`);\n parts.push(`<rect y=\"${headerH - 8}\" width=\"${p.width}\" height=\"8\" fill=\"${dark ? '#1e293b' : '#f1f5f9'}\"/>`);\n parts.push(`<line x1=\"0\" y1=\"${headerH}\" x2=\"${p.width}\" y2=\"${headerH}\" stroke=\"${common.border}\"/>`);\n parts.push(`<text x=\"${p.width / 2}\" y=\"${headerH / 2 + 5}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"600\" fill=\"${common.text}\">${escXml(cls.label)}</text>`);\n\n let y = headerH + 14;\n for (const m of attrs) {\n parts.push(buildClassMember(m, y, p.width, common));\n y += rowH;\n }\n if (attrs.length > 0 && methods.length > 0) {\n parts.push(`<line x1=\"6\" y1=\"${y - 6}\" x2=\"${p.width - 6}\" y2=\"${y - 6}\" stroke=\"${common.border}\" stroke-dasharray=\"3 2\"/>`);\n y += 4;\n }\n for (const m of methods) {\n parts.push(buildClassMember(m, y, p.width, common));\n y += rowH;\n }\n parts.push('</g>');\n return parts.join('');\n}\n\nfunction buildClassMember(m: ClassMember, y: number, width: number, common: PaletteCommon): string {\n const sym = m.visibility ? VIS_SYMBOL[m.visibility] ?? '' : '';\n const sig = m.kind === 'method'\n ? `${m.name}(${m.parameters ?? ''})${m.returnType ? `: ${m.returnType}` : ''}`\n : `${m.name}${m.returnType ? `: ${m.returnType}` : ''}`;\n return (\n `<text x=\"10\" y=\"${y}\" font-family='${MONO_FAMILY}' font-size=\"11\" fill=\"${common.subtle}\">${escXml(sym)}</text>` +\n `<text x=\"22\" y=\"${y}\" font-family='${MONO_FAMILY}' font-size=\"11\" fill=\"${common.text}\">${escXml(sig.length > 32 ? sig.slice(0, 31) + '…' : sig)}</text>`\n );\n void width;\n}\n\n// ── ER diagram ───────────────────────────────────────────────────────────\n//\n// Mirrors components/DbSchemaFlow.tsx#buildSvg, parameterized over a\n// position map and the dark flag.\n\nexport function buildErSvg(\n ir: ERDiagramIR,\n positions: Map<string, { x: number; y: number; width: number; height: number }>,\n options: BuildOptions = {}\n): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 40;\n const HEADER_H = 34;\n const ROW_H = 26;\n\n if (positions.size === 0) return svgOpen(0, 0, 100, 100, common.canvasBg) + '</svg>';\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of positions.values()) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x + p.width);\n maxY = Math.max(maxY, p.y + p.height);\n }\n minX -= padding; minY -= padding; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY);\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, minY, width, height, common.canvasBg, 'Entity-relationship diagram'));\n parts.push(`<defs>${arrowDef('arr', common.edgeColor)}</defs>`);\n\n // Edges (column-to-column when possible, else table-to-table)\n for (const rel of ir.schema.relations) {\n const fromTable = ir.schema.tables.find((t) => t.name === rel.fromTable);\n const toTable = ir.schema.tables.find((t) => t.name === rel.toTable);\n if (!fromTable || !toTable) continue;\n const fromPos = positions.get(rel.fromTable);\n const toPos = positions.get(rel.toTable);\n if (!fromPos || !toPos) continue;\n\n const fromColIdx = fromTable.columns.findIndex((c) => c.name === rel.fromCol);\n const toColIdx = toTable.columns.findIndex((c) => c.name === rel.toCol);\n const fy = fromColIdx >= 0\n ? fromPos.y + HEADER_H + fromColIdx * ROW_H + ROW_H / 2\n : fromPos.y + fromPos.height / 2;\n const ty = toColIdx >= 0\n ? toPos.y + HEADER_H + toColIdx * ROW_H + ROW_H / 2\n : toPos.y + toPos.height / 2;\n const goRight = (toPos.x + toPos.width / 2) > (fromPos.x + fromPos.width / 2);\n const fx = goRight ? fromPos.x + fromPos.width : fromPos.x;\n const tx = goRight ? toPos.x : toPos.x + toPos.width;\n const cp = Math.max(40, Math.abs(tx - fx) * 0.55);\n const c1x = goRight ? fx + cp : fx - cp;\n const c2x = goRight ? tx - cp : tx + cp;\n parts.push(`<path d=\"M ${fx} ${fy} C ${c1x} ${fy}, ${c2x} ${ty}, ${tx} ${ty}\" stroke=\"${common.edgeColor}\" stroke-width=\"1.4\" fill=\"none\" stroke-dasharray=\"5 4\" marker-end=\"url(#arr)\"/>`);\n const lx = (fx + tx) / 2;\n const ly = (fy + ty) / 2 - 5;\n parts.push(`<text x=\"${lx}\" y=\"${ly}\" font-size=\"9\" font-style=\"italic\" fill=\"${common.subtle}\" text-anchor=\"middle\">${escXml(fromColIdx >= 0 ? 'FK' : rel.fromCol)}</text>`);\n }\n\n // Tables\n for (const table of ir.schema.tables) {\n const p = positions.get(table.name);\n if (!p) continue;\n parts.push(`<g transform=\"translate(${p.x},${p.y})\">`);\n parts.push(`<rect width=\"${p.width}\" height=\"${p.height}\" rx=\"8\" fill=\"${dark ? '#0f172a' : '#ffffff'}\" stroke=\"${common.border}\" stroke-width=\"1\"/>`);\n parts.push(`<rect width=\"${p.width}\" height=\"${HEADER_H}\" rx=\"8\" fill=\"${dark ? '#1e293b' : '#f8fafc'}\"/>`);\n parts.push(`<rect y=\"${HEADER_H - 8}\" width=\"${p.width}\" height=\"8\" fill=\"${dark ? '#1e293b' : '#f8fafc'}\"/>`);\n parts.push(`<line x1=\"0\" y1=\"${HEADER_H}\" x2=\"${p.width}\" y2=\"${HEADER_H}\" stroke=\"${common.border}\"/>`);\n parts.push(`<text x=\"12\" y=\"${HEADER_H / 2 + 5}\" font-family='${MONO_FAMILY}' font-size=\"12\" font-weight=\"600\" fill=\"${common.text}\">${escXml(table.name)}</text>`);\n for (let i = 0; i < table.columns.length; i++) {\n const col = table.columns[i];\n const rowY = HEADER_H + i * ROW_H;\n const textY = rowY + ROW_H / 2 + 3;\n if (i > 0) {\n parts.push(`<line x1=\"8\" y1=\"${rowY}\" x2=\"${p.width - 8}\" y2=\"${rowY}\" stroke=\"${dark ? '#1e293b' : '#f1f5f9'}\"/>`);\n }\n const nameColor = col.isPK ? '#d97706' : col.isFK ? '#0284c7' : (dark ? '#cbd5e1' : '#475569');\n const marker = col.isPK ? '🔑' : col.isFK ? '↗' : '·';\n parts.push(`<text x=\"14\" y=\"${textY}\" font-size=\"10\" fill=\"${nameColor}\">${marker}</text>`);\n parts.push(`<text x=\"28\" y=\"${textY}\" font-family='${MONO_FAMILY}' font-size=\"11\" font-weight=\"${col.isPK ? '600' : '400'}\" fill=\"${nameColor}\">${escXml(col.name)}</text>`);\n parts.push(`<text x=\"${p.width - 12}\" y=\"${textY}\" text-anchor=\"end\" font-family='${MONO_FAMILY}' font-size=\"10\" fill=\"${common.subtle}\">${escXml(col.type)}</text>`);\n }\n parts.push('</g>');\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Mindmap ──────────────────────────────────────────────────────────────\n\nexport function buildMindmapSvg(\n ir: MindmapIR,\n positions: Map<string, { x: number; y: number; width: number; height: number; depth: number }>,\n options: BuildOptions = {}\n): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 60;\n\n if (positions.size === 0) return svgOpen(0, 0, 100, 100, common.canvasBg) + '</svg>';\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of positions.values()) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x + p.width);\n maxY = Math.max(maxY, p.y + p.height);\n }\n minX -= padding; minY -= padding; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY);\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, minY, width, height, common.canvasBg, ir.root.label || 'Mindmap'));\n\n // Edges (parent → child)\n const collect = (node: MindmapNode) => {\n const p = positions.get(node.id);\n if (!p) return;\n for (const c of node.children) {\n const cp = positions.get(c.id);\n if (!cp) continue;\n const fx = p.x + p.width / 2;\n const fy = p.y + p.height / 2;\n const tx = cp.x + cp.width / 2;\n const ty = cp.y + cp.height / 2;\n const c1x = fx + (tx - fx) * 0.4;\n const c2x = fx + (tx - fx) * 0.6;\n parts.push(`<path d=\"M ${fx} ${fy} C ${c1x} ${fy}, ${c2x} ${ty}, ${tx} ${ty}\" stroke=\"${common.edgeColor}\" stroke-width=\"1.5\" fill=\"none\"/>`);\n collect(c);\n }\n };\n collect(ir.root);\n\n const palettes = [\n dark\n ? { bg: '#e2e8f0', border: '#f8fafc', text: '#0f172a' }\n : { bg: '#1e293b', border: '#0f172a', text: '#f8fafc' },\n dark\n ? { bg: 'rgba(59,130,246,0.20)', border: '#60a5fa', text: '#bfdbfe' }\n : { bg: '#dbeafe', border: '#3b82f6', text: '#1e3a8a' },\n dark\n ? { bg: 'rgba(16,185,129,0.20)', border: '#34d399', text: '#a7f3d0' }\n : { bg: '#dcfce7', border: '#10b981', text: '#064e3b' },\n dark\n ? { bg: 'rgba(245,158,11,0.20)', border: '#fbbf24', text: '#fde68a' }\n : { bg: '#fef3c7', border: '#f59e0b', text: '#78350f' },\n dark\n ? { bg: 'rgba(244,63,94,0.20)', border: '#fb7185', text: '#fecdd3' }\n : { bg: '#fee2e2', border: '#f43f5e', text: '#881337' },\n dark\n ? { bg: 'rgba(139,92,246,0.20)', border: '#a78bfa', text: '#ddd6fe' }\n : { bg: '#ede9fe', border: '#8b5cf6', text: '#4c1d95' },\n ];\n\n // Nodes\n const renderNode = (node: MindmapNode) => {\n const p = positions.get(node.id);\n if (!p) return;\n const c = palettes[Math.min(p.depth, palettes.length - 1)];\n const isRoot = p.depth === 0;\n const radius = node.shape === 'circle' ? Math.min(p.width, p.height) / 2 : node.shape === 'rounded' ? 999 : node.shape === 'square' ? 4 : 12;\n parts.push(\n `<rect x=\"${p.x}\" y=\"${p.y}\" width=\"${p.width}\" height=\"${p.height}\" rx=\"${radius}\" ry=\"${radius}\" fill=\"${c.bg}\" stroke=\"${c.border}\" stroke-width=\"2\"/>`\n );\n parts.push(\n `<text x=\"${p.x + p.width / 2}\" y=\"${p.y + p.height / 2 + 4}\" text-anchor=\"middle\" font-size=\"${isRoot ? 14 : 12}\" font-weight=\"${isRoot ? 700 : 500}\" fill=\"${c.text}\">${escXml(node.label)}</text>`\n );\n for (const child of node.children) renderNode(child);\n };\n renderNode(ir.root);\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Gantt ────────────────────────────────────────────────────────────────\n\nexport function buildGanttSvg(ir: GanttDiagramIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 24;\n if (ir.tasks.length === 0) return svgOpen(0, 0, 200, 60, common.canvasBg) + '</svg>';\n\n const sections = new Map<string, typeof ir.tasks>();\n for (const t of ir.tasks) {\n const s = t.section ?? 'Tasks';\n if (!sections.has(s)) sections.set(s, []);\n sections.get(s)!.push(t);\n }\n\n const rowH = 30;\n const sectionHeaderH = 24;\n const labelW = 160;\n const chartW = 760;\n const headerH = 36;\n const totalRows = ir.tasks.length;\n const totalSections = sections.size;\n const titleH = ir.title ? 32 : 0;\n const bodyH = headerH + totalSections * sectionHeaderH + totalRows * rowH;\n const width = padding * 2 + labelW + chartW;\n const height = padding * 2 + titleH + bodyH;\n\n let minTime = Infinity, maxTime = -Infinity;\n for (const t of ir.tasks) {\n minTime = Math.min(minTime, new Date(t.start).getTime());\n maxTime = Math.max(maxTime, new Date(t.end).getTime());\n }\n if (!isFinite(minTime) || !isFinite(maxTime) || maxTime === minTime) maxTime = minTime + 86400000;\n const timeToX = (t: number) => padding + labelW + ((t - minTime) / (maxTime - minTime)) * chartW;\n\n const colors: Record<string, { fill: string; stroke: string; text: string }> = dark\n ? {\n default: { fill: 'rgba(59,130,246,0.30)', stroke: '#60a5fa', text: '#bfdbfe' },\n active: { fill: 'rgba(245,158,11,0.30)', stroke: '#fbbf24', text: '#fde68a' },\n done: { fill: 'rgba(16,185,129,0.30)', stroke: '#34d399', text: '#a7f3d0' },\n crit: { fill: 'rgba(244,63,94,0.30)', stroke: '#fb7185', text: '#fecdd3' },\n milestone: { fill: 'rgba(139,92,246,0.40)', stroke: '#a78bfa', text: '#ddd6fe' },\n }\n : {\n default: { fill: '#bfdbfe', stroke: '#3b82f6', text: '#1e3a8a' },\n active: { fill: '#fde68a', stroke: '#f59e0b', text: '#78350f' },\n done: { fill: '#a7f3d0', stroke: '#10b981', text: '#064e3b' },\n crit: { fill: '#fecaca', stroke: '#f43f5e', text: '#881337' },\n milestone: { fill: '#ddd6fe', stroke: '#8b5cf6', text: '#4c1d95' },\n };\n\n const parts: string[] = [];\n parts.push(svgOpen(0, 0, width, height, common.canvasBg, ir.title || 'Gantt chart'));\n if (ir.title) {\n parts.push(`<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"600\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n // Time axis (start, mid, end)\n const axisY = padding + titleH + headerH - 4;\n for (const ratio of [0, 0.5, 1]) {\n const x = padding + labelW + ratio * chartW;\n const time = minTime + (maxTime - minTime) * ratio;\n const date = new Date(time);\n const label = `${date.getMonth() + 1}/${date.getDate()}/${String(date.getFullYear()).slice(2)}`;\n parts.push(`<text x=\"${x}\" y=\"${axisY}\" text-anchor=\"middle\" font-size=\"10\" fill=\"${common.subtle}\">${escXml(label)}</text>`);\n parts.push(`<line x1=\"${x}\" y1=\"${axisY + 4}\" x2=\"${x}\" y2=\"${padding + titleH + bodyH}\" stroke=\"${common.border}\" stroke-dasharray=\"2 3\"/>`);\n }\n\n let cy = padding + titleH + headerH;\n for (const [section, tasks] of sections) {\n parts.push(`<rect x=\"${padding}\" y=\"${cy}\" width=\"${labelW + chartW}\" height=\"${sectionHeaderH}\" fill=\"${dark ? '#1e293b' : '#f8fafc'}\"/>`);\n parts.push(`<text x=\"${padding + 8}\" y=\"${cy + 16}\" font-size=\"11\" font-weight=\"600\" fill=\"${common.text}\">${escXml(section)}</text>`);\n cy += sectionHeaderH;\n for (const t of tasks) {\n const x1 = timeToX(new Date(t.start).getTime());\n const x2 = timeToX(new Date(t.end).getTime());\n const c = colors[t.status] ?? colors.default;\n parts.push(`<text x=\"${padding + 8}\" y=\"${cy + rowH / 2 + 4}\" font-size=\"11\" fill=\"${common.text}\">${escXml(t.label)}</text>`);\n if (t.status === 'milestone') {\n const cx = x1;\n const my = cy + rowH / 2;\n parts.push(`<polygon points=\"${cx},${my - 7} ${cx + 7},${my} ${cx},${my + 7} ${cx - 7},${my}\" fill=\"${c.fill}\" stroke=\"${c.stroke}\" stroke-width=\"1.5\"/>`);\n } else {\n const w = Math.max(4, x2 - x1);\n parts.push(`<rect x=\"${x1}\" y=\"${cy + 6}\" width=\"${w}\" height=\"${rowH - 12}\" rx=\"4\" fill=\"${c.fill}\" stroke=\"${c.stroke}\" stroke-width=\"1\"/>`);\n }\n cy += rowH;\n }\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Timeline ─────────────────────────────────────────────────────────────\n\nexport function buildTimelineSvg(ir: TimelineIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 24;\n\n if (ir.events.length === 0) return svgOpen(0, 0, 200, 60, common.canvasBg) + '</svg>';\n\n // Group events by section (preserving order)\n const sectionsMap = new Map<string, typeof ir.events>();\n for (const e of ir.events) {\n const s = e.section ?? '';\n if (!sectionsMap.has(s)) sectionsMap.set(s, []);\n sectionsMap.get(s)!.push(e);\n }\n\n const titleH = ir.title ? 32 : 0;\n const sectionHeaderH = 28;\n const eventH = 56;\n const rows: { type: 'section' | 'event'; data: string | typeof ir.events[number] }[] = [];\n for (const [section, events] of sectionsMap) {\n if (section) rows.push({ type: 'section', data: section });\n for (const e of events) rows.push({ type: 'event', data: e });\n }\n\n const lineX = padding + 80;\n const eventBoxX = lineX + 24;\n const eventBoxW = 480;\n const width = padding * 2 + 80 + 24 + eventBoxW;\n let height = padding * 2 + titleH;\n for (const r of rows) height += r.type === 'section' ? sectionHeaderH : eventH;\n height += 20;\n\n const sectionColors = ['#3b82f6', '#10b981', '#f59e0b', '#f43f5e', '#8b5cf6', '#06b6d4'];\n\n const parts: string[] = [];\n parts.push(svgOpen(0, 0, width, height, common.canvasBg, ir.title || 'Timeline'));\n if (ir.title) {\n parts.push(`<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"600\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n // Vertical timeline line\n parts.push(`<line x1=\"${lineX}\" y1=\"${padding + titleH}\" x2=\"${lineX}\" y2=\"${height - padding}\" stroke=\"${common.border}\" stroke-width=\"2\"/>`);\n\n let cy = padding + titleH + 8;\n let sectionIndex = -1;\n for (const r of rows) {\n if (r.type === 'section') {\n sectionIndex++;\n parts.push(`<text x=\"${padding}\" y=\"${cy + 16}\" font-size=\"11\" font-weight=\"700\" fill=\"${common.subtle}\">${escXml(r.data as string)}</text>`);\n cy += sectionHeaderH;\n } else {\n const e = r.data as (typeof ir.events)[number];\n const color = sectionColors[Math.max(0, sectionIndex) % sectionColors.length];\n // Period dot\n parts.push(`<circle cx=\"${lineX}\" cy=\"${cy + eventH / 2}\" r=\"6\" fill=\"${color}\" stroke=\"${common.canvasBg}\" stroke-width=\"2\"/>`);\n parts.push(`<text x=\"${lineX - 12}\" y=\"${cy + eventH / 2 + 4}\" text-anchor=\"end\" font-size=\"11\" font-weight=\"600\" fill=\"${common.text}\">${escXml(e.period)}</text>`);\n // Event card\n parts.push(`<rect x=\"${eventBoxX}\" y=\"${cy + 4}\" width=\"${eventBoxW}\" height=\"${eventH - 12}\" rx=\"8\" fill=\"${dark ? 'rgba(30,41,59,0.6)' : '#f8fafc'}\" stroke=\"${color}\" stroke-width=\"1\"/>`);\n const lines = wrapText(e.text, 60);\n for (let i = 0; i < Math.min(lines.length, 3); i++) {\n parts.push(`<text x=\"${eventBoxX + 12}\" y=\"${cy + 22 + i * 14}\" font-size=\"11\" fill=\"${common.text}\">${escXml(lines[i])}</text>`);\n }\n cy += eventH;\n }\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Pie chart ────────────────────────────────────────────────────────────\n\nconst PIE_PALETTE = [\n '#3b82f6', '#10b981', '#f59e0b', '#ef4444', '#8b5cf6', '#06b6d4',\n '#ec4899', '#84cc16', '#f97316', '#6366f1', '#14b8a6', '#d946ef',\n];\n\nexport function buildPieSvg(ir: PieChartIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const padding = options.padding ?? 20;\n const titleH = ir.title ? 32 : 0;\n const legendW = 200;\n const radius = 160;\n const cx = padding + radius + 16;\n const cy = padding + titleH + radius + 16;\n const width = padding * 2 + radius * 2 + 32 + legendW;\n const height = padding * 2 + titleH + radius * 2 + 32;\n\n const total = ir.slices.reduce((s, sl) => s + sl.value, 0);\n const parts: string[] = [];\n parts.push(svgOpen(0, 0, width, height, common.canvasBg, ir.title || 'Pie chart'));\n if (ir.title) {\n parts.push(`<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"600\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n\n if (total === 0 || ir.slices.length === 0) {\n parts.push(`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${radius}\" fill=\"${common.border}\"/>`);\n parts.push('</svg>');\n return parts.join('');\n }\n\n // Slices\n let startAngle = -Math.PI / 2;\n ir.slices.forEach((slice, i) => {\n const fraction = slice.value / total;\n const endAngle = startAngle + fraction * Math.PI * 2;\n const fill = PIE_PALETTE[i % PIE_PALETTE.length];\n if (fraction >= 0.999) {\n parts.push(`<circle cx=\"${cx}\" cy=\"${cy}\" r=\"${radius}\" fill=\"${fill}\" stroke=\"${common.canvasBg}\" stroke-width=\"2\"/>`);\n } else {\n const x1 = cx + Math.cos(startAngle) * radius;\n const y1 = cy + Math.sin(startAngle) * radius;\n const x2 = cx + Math.cos(endAngle) * radius;\n const y2 = cy + Math.sin(endAngle) * radius;\n const largeArc = fraction > 0.5 ? 1 : 0;\n parts.push(\n `<path d=\"M ${cx} ${cy} L ${x1} ${y1} A ${radius} ${radius} 0 ${largeArc} 1 ${x2} ${y2} Z\" fill=\"${fill}\" stroke=\"${common.canvasBg}\" stroke-width=\"2\"/>`\n );\n }\n // In-slice percentage label (only if slice is big enough to fit text)\n if (ir.showData && fraction >= 0.04) {\n const mid = (startAngle + endAngle) / 2;\n const lx = cx + Math.cos(mid) * radius * 0.65;\n const ly = cy + Math.sin(mid) * radius * 0.65;\n parts.push(\n `<text x=\"${lx}\" y=\"${ly + 4}\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"600\" fill=\"#ffffff\">${(fraction * 100).toFixed(1)}%</text>`\n );\n }\n startAngle = endAngle;\n });\n\n // Legend\n const legendX = cx + radius + 24;\n let legendY = padding + titleH + 16;\n ir.slices.forEach((slice, i) => {\n const fill = PIE_PALETTE[i % PIE_PALETTE.length];\n const pct = ((slice.value / total) * 100).toFixed(1);\n parts.push(`<rect x=\"${legendX}\" y=\"${legendY - 10}\" width=\"14\" height=\"14\" rx=\"2\" fill=\"${fill}\"/>`);\n parts.push(`<text x=\"${legendX + 22}\" y=\"${legendY + 1}\" font-size=\"12\" fill=\"${common.text}\">${escXml(slice.label)}</text>`);\n parts.push(`<text x=\"${legendX + 22}\" y=\"${legendY + 16}\" font-size=\"10\" fill=\"${common.subtle}\">${slice.value} · ${pct}%</text>`);\n legendY += 32;\n });\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Quadrant chart ───────────────────────────────────────────────────────\n\nexport function buildQuadrantSvg(ir: QuadrantChartIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 60;\n const titleH = ir.title ? 32 : 0;\n const chartW = 700;\n const chartH = 500;\n // Reserve extra horizontal space for the Y-axis endpoint labels (e.g.\n // \"High Impact\" / \"Low Impact\"), which extend leftward from the chart's\n // left edge with text-anchor=\"end\".\n const yAxis = ir.yAxisLabel ?? { low: 'Low', high: 'High' };\n const xAxis = ir.xAxisLabel ?? { low: 'Low', high: 'High' };\n const longestYLabel = Math.max(yAxis.low.length, yAxis.high.length);\n const leftPadding = Math.max(padding, longestYLabel * 7 + 24);\n const width = leftPadding + chartW + padding;\n const height = padding * 2 + titleH + chartH;\n const x0 = leftPadding;\n const y0 = padding + titleH;\n\n const tints = dark\n ? { q1: 'rgba(16,185,129,0.18)', q2: 'rgba(245,158,11,0.18)', q3: 'rgba(244,63,94,0.18)', q4: 'rgba(59,130,246,0.18)' }\n : { q1: '#10b98120', q2: '#f59e0b20', q3: '#ef444420', q4: '#3b82f620' };\n\n const parts: string[] = [];\n parts.push(svgOpen(0, 0, width, height, common.canvasBg, ir.title || 'Quadrant chart'));\n if (ir.title) {\n parts.push(`<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"600\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n\n const halfW = chartW / 2;\n const halfH = chartH / 2;\n // Quadrant fills (Q3 bottom-left, Q4 bottom-right, Q2 top-left, Q1 top-right)\n parts.push(`<rect x=\"${x0}\" y=\"${y0 + halfH}\" width=\"${halfW}\" height=\"${halfH}\" fill=\"${tints.q3}\"/>`);\n parts.push(`<rect x=\"${x0 + halfW}\" y=\"${y0 + halfH}\" width=\"${halfW}\" height=\"${halfH}\" fill=\"${tints.q4}\"/>`);\n parts.push(`<rect x=\"${x0}\" y=\"${y0}\" width=\"${halfW}\" height=\"${halfH}\" fill=\"${tints.q2}\"/>`);\n parts.push(`<rect x=\"${x0 + halfW}\" y=\"${y0}\" width=\"${halfW}\" height=\"${halfH}\" fill=\"${tints.q1}\"/>`);\n\n // Cross axes\n parts.push(`<line x1=\"${x0}\" y1=\"${y0 + halfH}\" x2=\"${x0 + chartW}\" y2=\"${y0 + halfH}\" stroke=\"${common.border}\" stroke-width=\"1\"/>`);\n parts.push(`<line x1=\"${x0 + halfW}\" y1=\"${y0}\" x2=\"${x0 + halfW}\" y2=\"${y0 + chartH}\" stroke=\"${common.border}\" stroke-width=\"1\"/>`);\n\n // Quadrant labels\n const labels = ir.quadrantLabels ?? {};\n if (labels.q1) parts.push(`<text x=\"${x0 + halfW + halfW / 2}\" y=\"${y0 + halfH / 2}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${common.text}\">${escXml(labels.q1)}</text>`);\n if (labels.q2) parts.push(`<text x=\"${x0 + halfW / 2}\" y=\"${y0 + halfH / 2}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${common.text}\">${escXml(labels.q2)}</text>`);\n if (labels.q3) parts.push(`<text x=\"${x0 + halfW / 2}\" y=\"${y0 + halfH + halfH / 2}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${common.text}\">${escXml(labels.q3)}</text>`);\n if (labels.q4) parts.push(`<text x=\"${x0 + halfW + halfW / 2}\" y=\"${y0 + halfH + halfH / 2}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"500\" fill=\"${common.text}\">${escXml(labels.q4)}</text>`);\n\n // Axis endpoint labels (outside the chart). `leftPadding` was sized to\n // fit the widest Y-axis label so they don't get clipped at viewBox edge.\n parts.push(`<text x=\"${x0}\" y=\"${y0 + chartH + 24}\" text-anchor=\"start\" font-size=\"12\" fill=\"${common.text}\">${escXml(xAxis.low)}</text>`);\n parts.push(`<text x=\"${x0 + chartW}\" y=\"${y0 + chartH + 24}\" text-anchor=\"end\" font-size=\"12\" fill=\"${common.text}\">${escXml(xAxis.high)}</text>`);\n parts.push(`<text x=\"${x0 - 12}\" y=\"${y0 + chartH}\" text-anchor=\"end\" font-size=\"12\" fill=\"${common.text}\">${escXml(yAxis.low)}</text>`);\n parts.push(`<text x=\"${x0 - 12}\" y=\"${y0 + 12}\" text-anchor=\"end\" font-size=\"12\" fill=\"${common.text}\">${escXml(yAxis.high)}</text>`);\n\n // Points\n for (const p of ir.points) {\n const px = x0 + p.x * chartW;\n const py = y0 + (1 - p.y) * chartH; // y is inverted (1 = top)\n parts.push(`<circle cx=\"${px}\" cy=\"${py}\" r=\"6\" fill=\"#3b82f6\" stroke=\"${common.canvasBg}\" stroke-width=\"2\"/>`);\n parts.push(`<text x=\"${px}\" y=\"${py - 12}\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"500\" fill=\"${common.text}\">${escXml(p.label)}</text>`);\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Journey ──────────────────────────────────────────────────────────────\n\nexport function buildJourneySvg(ir: JourneyIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const padding = options.padding ?? 40;\n const titleH = ir.title ? 32 : 0;\n const SECTION_HEADER_H = 32;\n const TASK_H = 36;\n const labelW = 200;\n const chartW = 600;\n const SCORE_MAX = 7;\n\n const allTasks: { sectionTitle: string; sectionIdx: number; label: string; score: number; actors: string[] }[] = [];\n ir.sections.forEach((s, idx) => {\n s.tasks.forEach((t) => allTasks.push({ sectionTitle: s.title, sectionIdx: idx, label: t.label, score: t.score, actors: t.actors }));\n });\n\n const totalH = padding * 2 + titleH + ir.sections.length * SECTION_HEADER_H + allTasks.length * TASK_H + 40;\n const width = padding * 2 + labelW + chartW;\n const height = totalH;\n\n const sectionColors = ['#3b82f6', '#10b981', '#f59e0b', '#f43f5e', '#8b5cf6', '#06b6d4'];\n\n const parts: string[] = [];\n parts.push(svgOpen(0, 0, width, height, common.canvasBg, ir.title || 'User journey'));\n if (ir.title) {\n parts.push(`<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"600\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n\n // Score axis labels at top of chart area\n const chartX = padding + labelW;\n const axisY = padding + titleH + 14;\n for (let s = 1; s <= SCORE_MAX; s++) {\n const x = chartX + ((s - 1) / (SCORE_MAX - 1)) * chartW;\n parts.push(`<text x=\"${x}\" y=\"${axisY}\" text-anchor=\"middle\" font-size=\"10\" fill=\"${common.subtle}\">${s}</text>`);\n }\n\n let cy = padding + titleH + SECTION_HEADER_H;\n ir.sections.forEach((section, idx) => {\n const color = sectionColors[idx % sectionColors.length];\n parts.push(`<rect x=\"${padding}\" y=\"${cy - SECTION_HEADER_H + 4}\" width=\"${labelW + chartW}\" height=\"${SECTION_HEADER_H - 4}\" fill=\"${color}20\" rx=\"6\"/>`);\n parts.push(`<text x=\"${padding + 10}\" y=\"${cy - 12}\" font-size=\"12\" font-weight=\"600\" fill=\"${common.text}\">${escXml(section.title)}</text>`);\n\n section.tasks.forEach((task) => {\n // Task label on left\n parts.push(`<text x=\"${padding + 10}\" y=\"${cy + TASK_H / 2 + 4}\" font-size=\"12\" fill=\"${common.text}\">${escXml(task.label)}</text>`);\n // Score dot on the score axis\n const scoreClamped = Math.max(1, Math.min(SCORE_MAX, task.score));\n const dotX = chartX + ((scoreClamped - 1) / (SCORE_MAX - 1)) * chartW;\n const dotY = cy + TASK_H / 2;\n // Connecting line (gray) under the dot\n parts.push(`<line x1=\"${chartX}\" y1=\"${dotY}\" x2=\"${chartX + chartW}\" y2=\"${dotY}\" stroke=\"${common.border}\" stroke-dasharray=\"2 3\"/>`);\n parts.push(`<circle cx=\"${dotX}\" cy=\"${dotY}\" r=\"8\" fill=\"${color}\" stroke=\"${common.canvasBg}\" stroke-width=\"2\"/>`);\n parts.push(`<text x=\"${dotX}\" y=\"${dotY + 3}\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"700\" fill=\"#ffffff\">${task.score}</text>`);\n // Actors\n if (task.actors.length > 0) {\n const actorsText = task.actors.join(', ');\n parts.push(`<text x=\"${dotX + 14}\" y=\"${dotY + 4}\" font-size=\"10\" fill=\"${common.subtle}\">${escXml(actorsText)}</text>`);\n }\n cy += TASK_H;\n });\n cy += SECTION_HEADER_H;\n });\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Architecture-beta ────────────────────────────────────────────────────\n\nconst ARCH_ICON_TINT: Record<string, { fill: string; border: string }> = {\n aws: { fill: '#fff5e6', border: '#ff9900' },\n google: { fill: '#e8f0fe', border: '#4285f4' },\n azure: { fill: '#e3f2fd', border: '#0078d4' },\n cloudflare: { fill: '#fff4e0', border: '#f48120' },\n docker: { fill: '#e7f3ff', border: '#2496ed' },\n kubernetes: { fill: '#eaf1ff', border: '#326ce5' },\n redis: { fill: '#fde7e3', border: '#dc382d' },\n postgresql: { fill: '#e3f2fa', border: '#336791' },\n mongodb: { fill: '#e8f5e9', border: '#47a248' },\n cloud: { fill: '#f0f4ff', border: '#6366f1' },\n database: { fill: '#fff7ed', border: '#f59e0b' },\n disk: { fill: '#ecfeff', border: '#06b6d4' },\n server: { fill: '#ecfdf5', border: '#10b981' },\n internet: { fill: '#eff6ff', border: '#3b82f6' },\n};\n\nfunction archTint(icon: string | undefined, dark: boolean): { fill: string; border: string } {\n if (!icon) return dark ? { fill: '#1e293b', border: '#475569' } : { fill: '#ffffff', border: '#cbd5e1' };\n const key = Object.keys(ARCH_ICON_TINT).find((k) => icon.toLowerCase().includes(k));\n const base = key ? ARCH_ICON_TINT[key] : { fill: '#ffffff', border: '#cbd5e1' };\n if (!dark) return base;\n // Dark mode — use the border color tinted background\n return { fill: `${base.border}25`, border: base.border };\n}\n\nexport function buildArchitectureSvg(ir: ArchitectureIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 40;\n\n const SERVICE_W = 130;\n const SERVICE_H = 80;\n\n // Group children by parent\n const byParent = new Map<string | undefined, ArchitectureNode[]>();\n for (const n of ir.nodes) {\n const k = n.parent;\n if (!byParent.has(k)) byParent.set(k, []);\n byParent.get(k)!.push(n);\n }\n\n // Layout each group's children with dagre\n const groupBounds = new Map<string, { width: number; height: number; positions: Map<string, { x: number; y: number }> }>();\n for (const node of ir.nodes) {\n if (node.kind !== 'group') continue;\n const children = byParent.get(node.id) ?? [];\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'LR', nodesep: 30, ranksep: 50, marginx: 16, marginy: 16 });\n g.setDefaultEdgeLabel(() => ({}));\n for (const c of children) {\n g.setNode(c.id, { width: SERVICE_W, height: SERVICE_H });\n }\n // Include only edges where both endpoints are children of this group\n const childIds = new Set(children.map((c) => c.id));\n for (const e of ir.edges) {\n if (childIds.has(e.source) && childIds.has(e.target) && g.hasNode(e.source) && g.hasNode(e.target)) {\n g.setEdge(e.source, e.target);\n }\n }\n if (children.length > 0) dagre.layout(g);\n\n const positions = new Map<string, { x: number; y: number }>();\n let minLeft = Infinity, minTop = Infinity, maxRight = 0, maxBottom = 0;\n for (const c of children) {\n const { x, y } = g.node(c.id) as { x: number; y: number };\n const left = x - SERVICE_W / 2;\n const top = y - SERVICE_H / 2;\n positions.set(c.id, { x: left, y: top });\n minLeft = Math.min(minLeft, left);\n minTop = Math.min(minTop, top);\n maxRight = Math.max(maxRight, left + SERVICE_W);\n maxBottom = Math.max(maxBottom, top + SERVICE_H);\n }\n const HEADER = 28;\n const PAD = 16;\n const dx = PAD - (isFinite(minLeft) ? minLeft : 0);\n const dy = HEADER + PAD - (isFinite(minTop) ? minTop : 0);\n const offset = new Map<string, { x: number; y: number }>();\n for (const [id, p] of positions) offset.set(id, { x: p.x + dx, y: p.y + dy });\n groupBounds.set(node.id, {\n width: Math.max(220, (isFinite(maxRight - minLeft) ? maxRight - minLeft : 0) + PAD * 2),\n height: Math.max(120, (isFinite(maxBottom - minTop) ? maxBottom - minTop : 0) + HEADER + PAD * 2),\n positions: offset,\n });\n }\n\n // Outer layout: top-level services + groups\n const topLevel = ir.nodes.filter((n) => !n.parent);\n const outer = new dagre.graphlib.Graph();\n outer.setGraph({ rankdir: 'LR', nodesep: 50, ranksep: 80, marginx: 32, marginy: 32 });\n outer.setDefaultEdgeLabel(() => ({}));\n for (const n of topLevel) {\n if (n.kind === 'group') {\n const b = groupBounds.get(n.id)!;\n outer.setNode(n.id, { width: b.width, height: b.height });\n } else {\n outer.setNode(n.id, { width: SERVICE_W, height: SERVICE_H });\n }\n }\n for (const e of ir.edges) {\n // For inter-group / top-level edges\n if (outer.hasNode(e.source) && outer.hasNode(e.target)) outer.setEdge(e.source, e.target);\n }\n dagre.layout(outer);\n\n const abs = new Map<string, { x: number; y: number; width: number; height: number; kind: 'group' | 'service'; node: ArchitectureNode }>();\n for (const n of topLevel) {\n const { x, y } = outer.node(n.id) as { x: number; y: number };\n const w = n.kind === 'group' ? groupBounds.get(n.id)!.width : SERVICE_W;\n const h = n.kind === 'group' ? groupBounds.get(n.id)!.height : SERVICE_H;\n abs.set(n.id, { x: x - w / 2, y: y - h / 2, width: w, height: h, kind: n.kind, node: n });\n }\n // Children\n for (const n of ir.nodes) {\n if (!n.parent) continue;\n const parentBox = abs.get(n.parent);\n if (!parentBox) continue;\n const pos = groupBounds.get(n.parent)?.positions.get(n.id);\n if (!pos) continue;\n abs.set(n.id, { x: parentBox.x + pos.x, y: parentBox.y + pos.y, width: SERVICE_W, height: SERVICE_H, kind: n.kind, node: n });\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const b of abs.values()) {\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n minX -= padding; minY -= padding; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY);\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, minY, width, height, common.canvasBg, 'Architecture diagram'));\n parts.push(`<defs>${arrowDef('arr', common.edgeColor)}</defs>`);\n\n // Groups first (under children + edges)\n for (const n of ir.nodes) {\n if (n.kind !== 'group') continue;\n const b = abs.get(n.id);\n if (!b) continue;\n const tint = archTint(n.icon, dark);\n parts.push(\n `<rect x=\"${b.x}\" y=\"${b.y}\" width=\"${b.width}\" height=\"${b.height}\" rx=\"12\" fill=\"${tint.fill}\" stroke=\"${tint.border}\" stroke-width=\"1.5\" stroke-dasharray=\"6 4\"/>`\n );\n parts.push(`<text x=\"${b.x + 14}\" y=\"${b.y + 18}\" font-size=\"12\" font-weight=\"700\" fill=\"${common.text}\">${escXml(n.label)}</text>`);\n if (n.icon) {\n parts.push(`<text x=\"${b.x + b.width - 14}\" y=\"${b.y + 18}\" text-anchor=\"end\" font-size=\"9\" fill=\"${common.subtle}\">${escXml(n.icon)}</text>`);\n }\n }\n\n // Edges\n for (const e of ir.edges) {\n const a = abs.get(e.source);\n const b = abs.get(e.target);\n if (!a || !b) continue;\n parts.push(buildEdgePath(a, b, { source: e.source, target: e.target, label: e.label, kind: 'solid' }, common));\n }\n\n // Services\n for (const n of ir.nodes) {\n if (n.kind !== 'service') continue;\n const b = abs.get(n.id);\n if (!b) continue;\n const tint = archTint(n.icon, dark);\n parts.push(\n `<rect x=\"${b.x}\" y=\"${b.y}\" width=\"${b.width}\" height=\"${b.height}\" rx=\"10\" fill=\"${tint.fill}\" stroke=\"${tint.border}\" stroke-width=\"1.5\"/>`\n );\n // Icon placeholder badge (top-center)\n parts.push(`<circle cx=\"${b.x + b.width / 2}\" cy=\"${b.y + 22}\" r=\"14\" fill=\"${tint.border}\" opacity=\"0.85\"/>`);\n if (n.icon) {\n const short = n.icon.split(':').pop()!.slice(0, 3).toUpperCase();\n parts.push(`<text x=\"${b.x + b.width / 2}\" y=\"${b.y + 26}\" text-anchor=\"middle\" font-size=\"9\" font-weight=\"700\" fill=\"#ffffff\">${escXml(short)}</text>`);\n }\n parts.push(`<text x=\"${b.x + b.width / 2}\" y=\"${b.y + 56}\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"600\" fill=\"${common.text}\">${escXml(n.label)}</text>`);\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── C4 model ────────────────────────────────────────────────────────────\n\ninterface C4Style {\n fill: string;\n border: string;\n text: string;\n badge: string;\n badgeText: string;\n /** Cylinder / queue shape variant */\n shape: 'rect' | 'person' | 'cylinder' | 'queue' | 'boundary' | 'node';\n dashed?: boolean;\n}\n\nfunction c4StyleFor(kind: C4ElementKind, dark: boolean): C4Style {\n const isExternal = kind.endsWith('-external');\n // Color tiers — Person, System, Container, Component\n const base = kind.startsWith('person')\n ? { fill: dark ? 'rgba(8, 80, 134, 0.4)' : '#08427b', text: '#ffffff' }\n : kind.startsWith('system')\n ? { fill: dark ? 'rgba(17, 102, 187, 0.4)' : '#1168bd', text: '#ffffff' }\n : kind.startsWith('container')\n ? { fill: dark ? 'rgba(67, 130, 245, 0.4)' : '#438dd5', text: '#ffffff' }\n : kind.startsWith('component')\n ? { fill: dark ? 'rgba(133, 187, 245, 0.4)' : '#85bbf0', text: '#0f172a' }\n : { fill: dark ? 'rgba(148, 163, 184, 0.3)' : '#9ca3af', text: '#0f172a' };\n\n let shape: C4Style['shape'] = 'rect';\n if (kind.startsWith('person')) shape = 'person';\n else if (kind.endsWith('-db')) shape = 'cylinder';\n else if (kind.endsWith('-queue')) shape = 'queue';\n else if (kind.endsWith('boundary')) shape = 'boundary';\n else if (kind === 'node') shape = 'node';\n\n return {\n fill: isExternal ? (dark ? 'rgba(100, 116, 139, 0.4)' : '#999999') : base.fill,\n border: isExternal ? '#64748b' : '#073b6f',\n text: base.text,\n badge: '#0f172a40',\n badgeText: '#ffffff',\n shape,\n dashed: shape === 'boundary' || shape === 'node',\n };\n}\n\nfunction c4BadgeLabel(kind: C4ElementKind): string {\n if (kind.startsWith('person')) return 'Person';\n if (kind.endsWith('-external')) {\n if (kind.startsWith('system')) return 'External System';\n if (kind.startsWith('container')) return 'External Container';\n if (kind.startsWith('component')) return 'External Component';\n }\n if (kind.endsWith('-db')) return kind.startsWith('system') ? 'System' : kind.startsWith('container') ? 'Container' : 'Component';\n if (kind.endsWith('-queue')) return kind.startsWith('system') ? 'System' : kind.startsWith('container') ? 'Container' : 'Component';\n if (kind === 'system') return 'System';\n if (kind === 'container') return 'Container';\n if (kind === 'component') return 'Component';\n if (kind === 'node') return 'Deployment Node';\n return 'Boundary';\n}\n\nexport function buildC4Svg(ir: C4IR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 40;\n const titleH = ir.title ? 32 : 0;\n\n const ELEM_W = 200;\n const ELEM_H = 110;\n\n const nonBoundary = ir.elements.filter((e) => !c4StyleFor(e.kind, dark).shape.includes('boundary') && c4StyleFor(e.kind, dark).shape !== 'node');\n const boundaries = ir.elements.filter((e) => {\n const s = c4StyleFor(e.kind, dark);\n return s.shape === 'boundary' || s.shape === 'node';\n });\n\n // Outer dagre layout for all elements\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'TB', nodesep: 60, ranksep: 80, marginx: 32, marginy: 32 });\n g.setDefaultEdgeLabel(() => ({}));\n for (const el of nonBoundary) g.setNode(el.id, { width: ELEM_W, height: ELEM_H });\n for (const rel of ir.relations) {\n if (g.hasNode(rel.source) && g.hasNode(rel.target)) g.setEdge(rel.source, rel.target);\n }\n dagre.layout(g);\n\n const positions = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const el of nonBoundary) {\n const { x, y } = g.node(el.id) as { x: number; y: number };\n positions.set(el.id, { x: x - ELEM_W / 2, y: y - ELEM_H / 2, width: ELEM_W, height: ELEM_H });\n }\n\n // Compute boundary bounding boxes from their children\n for (const b of boundaries) {\n const children = ir.elements.filter((e) => e.parent === b.id);\n const childPositions = children.map((c) => positions.get(c.id)).filter((p): p is { x: number; y: number; width: number; height: number } => !!p);\n if (childPositions.length === 0) continue;\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of childPositions) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x + p.width);\n maxY = Math.max(maxY, p.y + p.height);\n }\n positions.set(b.id, { x: minX - 20, y: minY - 28, width: maxX - minX + 40, height: maxY - minY + 48 });\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n for (const p of positions.values()) {\n minX = Math.min(minX, p.x);\n minY = Math.min(minY, p.y);\n maxX = Math.max(maxX, p.x + p.width);\n maxY = Math.max(maxY, p.y + p.height);\n }\n minX -= padding; minY -= padding - titleH; maxX += padding; maxY += padding;\n const width = Math.round(maxX - minX);\n const height = Math.round(maxY - minY) + titleH;\n const viewMinY = minY - titleH;\n\n const parts: string[] = [];\n parts.push(svgOpen(minX, viewMinY, width, height, common.canvasBg, ir.title || `C4 ${ir.variant} diagram`));\n parts.push(`<defs>${arrowDef('arr', common.edgeColor)}</defs>`);\n if (ir.title) {\n parts.push(`<text x=\"${minX + width / 2}\" y=\"${viewMinY + 22}\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"700\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n\n // Boundaries first (under everything else)\n for (const b of boundaries) {\n const p = positions.get(b.id);\n if (!p) continue;\n const style = c4StyleFor(b.kind, dark);\n parts.push(\n `<rect x=\"${p.x}\" y=\"${p.y}\" width=\"${p.width}\" height=\"${p.height}\" rx=\"8\" fill=\"none\" stroke=\"${style.border}\" stroke-width=\"2\" stroke-dasharray=\"8 4\"/>`\n );\n parts.push(`<text x=\"${p.x + 12}\" y=\"${p.y + 18}\" font-size=\"11\" font-weight=\"700\" fill=\"${common.text}\">${escXml(b.label)}</text>`);\n parts.push(`<text x=\"${p.x + 12}\" y=\"${p.y + 32}\" font-size=\"9\" fill=\"${common.subtle}\" font-style=\"italic\">[${escXml(c4BadgeLabel(b.kind))}]</text>`);\n }\n\n // Relations\n for (const rel of ir.relations) {\n const a = positions.get(rel.source);\n const b = positions.get(rel.target);\n if (!a || !b) continue;\n const labelLine = rel.label ?? '';\n const techLine = rel.technology ? `[${rel.technology}]` : '';\n parts.push(\n buildEdgePath(a, b, { source: rel.source, target: rel.target, label: [labelLine, techLine].filter(Boolean).join(' '), kind: 'solid' }, common)\n );\n }\n\n // Elements (non-boundaries)\n for (const el of nonBoundary) {\n const p = positions.get(el.id);\n if (!p) continue;\n parts.push(buildC4Element(el, p, dark));\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\nfunction buildC4Element(el: C4Element, p: { x: number; y: number; width: number; height: number }, dark: boolean): string {\n const style = c4StyleFor(el.kind, dark);\n const cx = p.x + p.width / 2;\n const parts: string[] = [];\n\n if (style.shape === 'person') {\n // Head + body\n const headR = 14;\n parts.push(\n `<rect x=\"${p.x}\" y=\"${p.y + headR + 8}\" width=\"${p.width}\" height=\"${p.height - headR - 8}\" rx=\"10\" fill=\"${style.fill}\" stroke=\"${style.border}\" stroke-width=\"1.5\"/>`\n );\n parts.push(`<circle cx=\"${cx}\" cy=\"${p.y + headR + 4}\" r=\"${headR}\" fill=\"${style.fill}\" stroke=\"${style.border}\" stroke-width=\"1.5\"/>`);\n } else if (style.shape === 'cylinder') {\n const ry = 8;\n parts.push(\n `<path d=\"M ${p.x} ${p.y + ry} A ${p.width / 2} ${ry} 0 0 0 ${p.x + p.width} ${p.y + ry} L ${p.x + p.width} ${p.y + p.height - ry} A ${p.width / 2} ${ry} 0 0 1 ${p.x} ${p.y + p.height - ry} Z\" fill=\"${style.fill}\" stroke=\"${style.border}\" stroke-width=\"1.5\"/>`\n );\n parts.push(`<ellipse cx=\"${cx}\" cy=\"${p.y + ry}\" rx=\"${p.width / 2}\" ry=\"${ry}\" fill=\"none\" stroke=\"${style.border}\" stroke-width=\"1.5\"/>`);\n } else if (style.shape === 'queue') {\n parts.push(\n `<rect x=\"${p.x}\" y=\"${p.y}\" width=\"${p.width}\" height=\"${p.height}\" rx=\"${p.height / 2}\" fill=\"${style.fill}\" stroke=\"${style.border}\" stroke-width=\"1.5\"/>`\n );\n } else {\n parts.push(\n `<rect x=\"${p.x}\" y=\"${p.y}\" width=\"${p.width}\" height=\"${p.height}\" rx=\"8\" fill=\"${style.fill}\" stroke=\"${style.border}\" stroke-width=\"1.5\"/>`\n );\n }\n\n // Inner text: badge + label + tech + description\n const badgeY = p.y + (style.shape === 'person' ? 36 : 18);\n parts.push(`<text x=\"${cx}\" y=\"${badgeY}\" text-anchor=\"middle\" font-size=\"9\" font-style=\"italic\" font-weight=\"600\" fill=\"${style.text}\" opacity=\"0.85\">[${escXml(c4BadgeLabel(el.kind))}]</text>`);\n parts.push(`<text x=\"${cx}\" y=\"${badgeY + 18}\" text-anchor=\"middle\" font-size=\"13\" font-weight=\"700\" fill=\"${style.text}\">${escXml(el.label)}</text>`);\n if (el.technology) {\n parts.push(`<text x=\"${cx}\" y=\"${badgeY + 32}\" text-anchor=\"middle\" font-size=\"10\" font-style=\"italic\" fill=\"${style.text}\" opacity=\"0.85\">[${escXml(el.technology)}]</text>`);\n }\n if (el.description) {\n const lines = wrapText(el.description, 28);\n const startY = badgeY + (el.technology ? 48 : 36);\n for (let i = 0; i < Math.min(lines.length, 2); i++) {\n parts.push(`<text x=\"${cx}\" y=\"${startY + i * 12}\" text-anchor=\"middle\" font-size=\"10\" fill=\"${style.text}\" opacity=\"0.92\">${escXml(lines[i])}</text>`);\n }\n }\n return parts.join('');\n}\n\n// ── GitGraph ─────────────────────────────────────────────────────────────\n\ninterface GitCommit {\n id: string;\n branch: string;\n parents: string[];\n tag?: string;\n type: 'NORMAL' | 'REVERSE' | 'HIGHLIGHT';\n isMerge?: boolean;\n}\n\nexport function buildGitGraphSvg(ir: GitGraphIR, options: BuildOptions = {}): string {\n const { common } = palette(options.dark ?? false);\n const dark = options.dark ?? false;\n const padding = options.padding ?? 40;\n const titleH = ir.title ? 32 : 0;\n\n // Walk ops to compute commits + branches.\n const commits: GitCommit[] = [];\n const branchOrder: string[] = ['main'];\n const branchHead = new Map<string, string | null>(); // branch → latest commit id\n branchHead.set('main', null);\n let currentBranch = 'main';\n let counter = 0;\n\n for (const op of ir.ops) {\n if (op.kind === 'branch') {\n if (!branchOrder.includes(op.name)) branchOrder.push(op.name);\n branchHead.set(op.name, branchHead.get(currentBranch) ?? null);\n currentBranch = op.name;\n } else if (op.kind === 'checkout') {\n currentBranch = op.name;\n if (!branchOrder.includes(op.name)) branchOrder.push(op.name);\n if (!branchHead.has(op.name)) branchHead.set(op.name, null);\n } else if (op.kind === 'commit') {\n const id = op.id ?? `c${++counter}`;\n const parent = branchHead.get(currentBranch);\n const commit: GitCommit = {\n id,\n branch: currentBranch,\n parents: parent ? [parent] : [],\n tag: op.tag,\n type: op.type ?? 'NORMAL',\n };\n commits.push(commit);\n branchHead.set(currentBranch, id);\n } else if (op.kind === 'merge') {\n const id = `merge-${++counter}`;\n const a = branchHead.get(currentBranch);\n const b = branchHead.get(op.from);\n const commit: GitCommit = {\n id,\n branch: currentBranch,\n parents: [a, b].filter((p): p is string => !!p),\n tag: op.tag,\n type: 'NORMAL',\n isMerge: true,\n };\n commits.push(commit);\n branchHead.set(currentBranch, id);\n } else if (op.kind === 'cherry-pick') {\n const id = `cherry-${++counter}`;\n const parent = branchHead.get(currentBranch);\n commits.push({\n id,\n branch: currentBranch,\n parents: parent ? [parent] : [],\n type: 'HIGHLIGHT',\n });\n branchHead.set(currentBranch, id);\n }\n }\n\n const BRANCH_GAP = 60;\n const COMMIT_GAP = 70;\n const branchIdx = new Map<string, number>(branchOrder.map((b, i) => [b, i]));\n const branchX = (b: string) => padding + 90 + (branchIdx.get(b) ?? 0) * BRANCH_GAP;\n\n const commitPositions = new Map<string, { x: number; y: number }>();\n commits.forEach((c, i) => {\n commitPositions.set(c.id, { x: branchX(c.branch), y: padding + titleH + 40 + i * COMMIT_GAP });\n });\n\n const width = padding * 2 + 90 + branchOrder.length * BRANCH_GAP + 200;\n const height = padding * 2 + titleH + 60 + commits.length * COMMIT_GAP;\n\n const branchColors = ['#3b82f6', '#10b981', '#f59e0b', '#f43f5e', '#8b5cf6', '#06b6d4', '#ec4899'];\n const branchColor = (b: string) => branchColors[(branchIdx.get(b) ?? 0) % branchColors.length];\n\n const parts: string[] = [];\n parts.push(svgOpen(0, 0, width, height, common.canvasBg, ir.title || 'Git graph'));\n if (ir.title) {\n parts.push(`<text x=\"${width / 2}\" y=\"22\" text-anchor=\"middle\" font-size=\"15\" font-weight=\"600\" fill=\"${common.text}\">${escXml(ir.title)}</text>`);\n }\n // Branch labels at top\n for (const b of branchOrder) {\n const x = branchX(b);\n const y = padding + titleH + 16;\n parts.push(`<text x=\"${x}\" y=\"${y}\" text-anchor=\"middle\" font-size=\"11\" font-weight=\"700\" fill=\"${branchColor(b)}\">${escXml(b)}</text>`);\n // Branch swim-line\n parts.push(`<line x1=\"${x}\" y1=\"${y + 8}\" x2=\"${x}\" y2=\"${height - padding}\" stroke=\"${branchColor(b)}\" stroke-width=\"2\" opacity=\"0.3\"/>`);\n }\n\n // Parent connections\n for (const c of commits) {\n const cp = commitPositions.get(c.id);\n if (!cp) continue;\n for (const pid of c.parents) {\n const pp = commitPositions.get(pid);\n if (!pp) continue;\n const sameLane = pp.x === cp.x;\n const stroke = branchColor(c.branch);\n if (sameLane) {\n parts.push(`<line x1=\"${pp.x}\" y1=\"${pp.y}\" x2=\"${cp.x}\" y2=\"${cp.y}\" stroke=\"${stroke}\" stroke-width=\"2\"/>`);\n } else {\n // Curve from parent commit to child\n const midY = (pp.y + cp.y) / 2;\n parts.push(`<path d=\"M ${pp.x} ${pp.y} C ${pp.x} ${midY}, ${cp.x} ${midY}, ${cp.x} ${cp.y}\" stroke=\"${stroke}\" stroke-width=\"2\" fill=\"none\"/>`);\n }\n }\n }\n\n // Commit nodes\n for (const c of commits) {\n const cp = commitPositions.get(c.id);\n if (!cp) continue;\n const color = branchColor(c.branch);\n const r = 9;\n if (c.type === 'REVERSE') {\n parts.push(`<rect x=\"${cp.x - r}\" y=\"${cp.y - r}\" width=\"${r * 2}\" height=\"${r * 2}\" fill=\"${dark ? '#0f172a' : '#ffffff'}\" stroke=\"${color}\" stroke-width=\"2\"/>`);\n } else if (c.type === 'HIGHLIGHT') {\n parts.push(`<rect x=\"${cp.x - r}\" y=\"${cp.y - r}\" width=\"${r * 2}\" height=\"${r * 2}\" rx=\"3\" fill=\"${color}\" stroke=\"${color}\" stroke-width=\"2\"/>`);\n } else if (c.isMerge) {\n parts.push(`<circle cx=\"${cp.x}\" cy=\"${cp.y}\" r=\"${r}\" fill=\"${dark ? '#0f172a' : '#ffffff'}\" stroke=\"${color}\" stroke-width=\"2.5\"/>`);\n parts.push(`<circle cx=\"${cp.x}\" cy=\"${cp.y}\" r=\"${r - 4}\" fill=\"${color}\"/>`);\n } else {\n parts.push(`<circle cx=\"${cp.x}\" cy=\"${cp.y}\" r=\"${r}\" fill=\"${color}\" stroke=\"${dark ? '#0f172a' : '#ffffff'}\" stroke-width=\"2\"/>`);\n }\n // Commit id label\n const labelX = padding + 90 + branchOrder.length * BRANCH_GAP + 24;\n parts.push(`<text x=\"${labelX}\" y=\"${cp.y + 4}\" font-family='${MONO_FAMILY}' font-size=\"11\" fill=\"${common.text}\">${escXml(c.id)}</text>`);\n if (c.tag) {\n const tagX = labelX + c.id.length * 7 + 12;\n parts.push(`<rect x=\"${tagX}\" y=\"${cp.y - 8}\" width=\"${c.tag.length * 6.5 + 12}\" height=\"16\" rx=\"3\" fill=\"${color}\" opacity=\"0.85\"/>`);\n parts.push(`<text x=\"${tagX + 6}\" y=\"${cp.y + 4}\" font-size=\"10\" font-weight=\"700\" fill=\"#ffffff\">${escXml(c.tag)}</text>`);\n }\n }\n\n parts.push('</svg>');\n return parts.join('');\n}\n\n// ── Helper: parse SVG string into element ───────────────────────────────\n\n/** Parse an SVG string to an SVGSVGElement so it can flow through the\n * centralized export pipeline (which expects a DOM element). */\nexport function svgStringToElement(svg: string): SVGSVGElement | null {\n if (typeof window === 'undefined' || !window.DOMParser) return null;\n const doc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n const root = doc.documentElement;\n if (root.tagName !== 'svg') return null;\n // Import into the live document so the element behaves normally.\n const imported = document.importNode(root, true) as unknown as SVGSVGElement;\n return imported;\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport { layoutFlowchart, type NodeSize } from '../../utils/diagrams/layout/dagreLayout';\nimport type { RendererProps, RendererHandle } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildFlowchartSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\n// SVG-first rendering. The same builder produces both the on-screen view\n// and the SVG/PNG download — guaranteed WYSIWYG by construction. Drops\n// the ReactFlow runtime for flowcharts; dagre is still used for layout.\n\nconst NODE_SIZE = {\n circle: { width: 84, height: 84 },\n icon: { width: 100, height: 96 },\n subroutine: { width: 220, height: 64 },\n} as const;\n\nfunction rectSize(label: string): NodeSize {\n const width = Math.max(160, Math.min(320, label.length * 8 + 40));\n const lines = Math.max(1, Math.ceil(label.length / 24));\n return { width, height: 48 + (lines - 1) * 18 };\n}\n\nfunction diamondSize(label: string): NodeSize {\n return {\n width: Math.max(140, Math.min(280, label.length * 11 + 60)),\n height: Math.max(96, Math.min(160, Math.ceil(label.length / 16) * 32 + 64)),\n };\n}\n\ntype FlowchartRendererProps = RendererProps<'flowchart'>;\n\nexport default function FlowchartRenderer({ ir, dark = false, handleRef }: FlowchartRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => {\n const sizes = new Map<string, NodeSize>();\n for (const n of ir.nodes) {\n if (n.kind === 'user' || n.kind === 'start' || n.kind === 'end') sizes.set(n.id, NODE_SIZE.circle);\n else if (n.kind === 'icon') sizes.set(n.id, NODE_SIZE.icon);\n else if (n.kind === 'decision') sizes.set(n.id, diamondSize(n.label));\n else if (n.kind === 'queue') sizes.set(n.id, NODE_SIZE.subroutine);\n else sizes.set(n.id, rectSize(n.label));\n }\n const layout = layoutFlowchart(ir, { nodeSizes: sizes });\n return buildFlowchartSvg(ir, layout.nodePositions, { dark });\n }, [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"flowchart-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport dagre from 'dagre';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildErSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\n// Sizing constants — kept in sync with buildErSvg's table layout.\nconst TABLE_NODE_WIDTH = 240;\nconst TABLE_HEADER_HEIGHT = 34;\nconst TABLE_ROW_HEIGHT = 26;\n\ntype ERRendererProps = RendererProps<'er'>;\n\n// SVG-first ER renderer. Layout is computed with dagre; the rendered SVG\n// is the same one used for SVG/PNG download.\n\nexport default function ERRenderer({ ir, dark = false, handleRef }: ERRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => {\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'LR', nodesep: 60, ranksep: 100, marginx: 24, marginy: 24 });\n g.setDefaultEdgeLabel(() => ({}));\n\n const tableHeight = (cols: number) => TABLE_HEADER_HEIGHT + cols * TABLE_ROW_HEIGHT;\n\n for (const table of ir.schema.tables) {\n g.setNode(table.name, { width: TABLE_NODE_WIDTH, height: tableHeight(table.columns.length) });\n }\n for (const rel of ir.schema.relations) {\n if (g.hasNode(rel.fromTable) && g.hasNode(rel.toTable)) g.setEdge(rel.fromTable, rel.toTable);\n }\n dagre.layout(g);\n\n const positions = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const table of ir.schema.tables) {\n const { x, y } = g.node(table.name) as { x: number; y: number };\n const h = tableHeight(table.columns.length);\n positions.set(table.name, { x: x - TABLE_NODE_WIDTH / 2, y: y - h / 2, width: TABLE_NODE_WIDTH, height: h });\n }\n return buildErSvg(ir, positions, { dark });\n }, [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"er-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildPieSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype PieRendererProps = RendererProps<'pie'>;\n\nexport default function PieRenderer({ ir, dark = false, handleRef }: PieRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildPieSvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"pie-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildQuadrantSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype QuadrantRendererProps = RendererProps<'quadrant'>;\n\nexport default function QuadrantRenderer({ ir, dark = false, handleRef }: QuadrantRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildQuadrantSvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"quadrant-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildJourneySvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype JourneyRendererProps = RendererProps<'journey'>;\n\nexport default function JourneyRenderer({ ir, dark = false, handleRef }: JourneyRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildJourneySvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"journey-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { Fragment, useEffect, useMemo, useRef } from 'react';\r\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\r\nimport type { SequenceArrow, SequenceMessage, SequenceNote, SequenceParticipant, SequenceStep } from '../../utils/diagrams/types';\r\nimport { getDiagramTheme } from './shared/theme';\r\n\r\ntype SequenceRendererProps = RendererProps<'sequence'>;\r\n\r\n// Layout constants — tuned to read well at standard zoom levels.\r\nconst PARTICIPANT_GAP = 200; // horizontal distance between participant lifelines\r\nconst STEP_GAP = 56; // vertical distance between consecutive steps\r\nconst HEAD_HEIGHT = 50; // top participant box\r\nconst HEAD_PAD_Y = 20; // padding above the first step\r\nconst FOOT_HEIGHT = 36; // bottom participant box (mirror of head)\r\nconst SIDE_PAD = 40; // outer canvas padding\r\nconst PART_BOX_W = 150; // participant box width\r\nconst PART_BOX_H = 36; // participant box height\r\nconst NOTE_H = 38;\r\nconst TITLE_H = 28;\r\nconst SELF_LOOP_W = 60; // width of self-message loops\r\n\r\nexport default function SequenceRenderer({ ir, dark = false, handleRef }: SequenceRendererProps) {\r\n const theme = getDiagramTheme(dark);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const layout = useMemo(() => computeLayout(ir.participants, ir.steps), [ir.participants, ir.steps]);\r\n\r\n useEffect(() => {\r\n if (!handleRef) return;\r\n const handle: RendererHandle = {\r\n getSvgElement: () => containerRef.current?.querySelector('svg.sequence-svg') ?? null,\r\n };\r\n handleRef.current = handle;\r\n return () => {\r\n if (handleRef.current === handle) handleRef.current = null;\r\n };\r\n }, [handleRef, layout]);\r\n\r\n const lifelineColor = dark ? '#475569' : '#cbd5e1';\r\n const headFill = dark ? '#1e293b' : '#f1f5f9';\r\n const headBorder = dark ? '#475569' : '#cbd5e1';\r\n const headText = dark ? '#e2e8f0' : '#1e293b';\r\n const arrowColor = dark ? '#94a3b8' : '#64748b';\r\n const labelColor = dark ? '#cbd5e1' : '#334155';\r\n const noteFill = dark ? '#451a03' : '#fef3c7';\r\n const noteBorder = dark ? '#92400e' : '#fcd34d';\r\n const noteText = dark ? '#fde68a' : '#78350f';\r\n const titleY = ir.title ? TITLE_H : 0;\r\n const headTopY = titleY + HEAD_PAD_Y;\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className=\"sequence-renderer\"\r\n style={{\r\n width: '100%',\r\n background: theme.canvasBg,\r\n borderRadius: 12,\r\n padding: 16,\r\n overflow: 'auto',\r\n }}\r\n >\r\n <svg\r\n className=\"sequence-svg\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n width={layout.width}\r\n height={layout.height + titleY}\r\n viewBox={`0 0 ${layout.width} ${layout.height + titleY}`}\r\n style={{ display: 'block', minWidth: '100%', fontFamily: '\"Inter\", ui-sans-serif, system-ui, sans-serif' }}\r\n >\r\n {ir.title && (\r\n <text\r\n x={layout.width / 2}\r\n y={20}\r\n textAnchor=\"middle\"\r\n fontSize={15}\r\n fontWeight={600}\r\n fill={headText}\r\n >\r\n {ir.title}\r\n </text>\r\n )}\r\n\r\n {/* Lifelines (vertical dashed) */}\r\n {ir.participants.map((p) => {\r\n const x = layout.participantX.get(p.id);\r\n if (x === undefined) return null;\r\n return (\r\n <line\r\n key={`life-${p.id}`}\r\n x1={x}\r\n x2={x}\r\n y1={headTopY + PART_BOX_H}\r\n y2={headTopY + PART_BOX_H + layout.contentH + STEP_GAP}\r\n stroke={lifelineColor}\r\n strokeWidth={1}\r\n strokeDasharray=\"4 4\"\r\n />\r\n );\r\n })}\r\n\r\n {/* Participant heads */}\r\n {ir.participants.map((p) => {\r\n const x = layout.participantX.get(p.id);\r\n if (x === undefined) return null;\r\n return (\r\n <g key={`head-${p.id}`}>\r\n <rect\r\n x={x - PART_BOX_W / 2}\r\n y={headTopY}\r\n width={PART_BOX_W}\r\n height={PART_BOX_H}\r\n rx={6}\r\n fill={headFill}\r\n stroke={headBorder}\r\n strokeWidth={1}\r\n />\r\n <text\r\n x={x}\r\n y={headTopY + PART_BOX_H / 2 + 4}\r\n textAnchor=\"middle\"\r\n fontSize={12}\r\n fontWeight={600}\r\n fill={headText}\r\n >\r\n {truncate(p.label, 18)}\r\n </text>\r\n </g>\r\n );\r\n })}\r\n\r\n {/* Steps */}\r\n {layout.placedSteps.map((ps, i) => {\r\n if (ps.step.kind === 'message') {\r\n const fromX = layout.participantX.get(ps.step.from)!;\r\n // For self-messages on the rightmost participant, flip the loop\r\n // to grow leftward so the label stays inside the canvas.\r\n const isSelf = ps.step.from === ps.step.to;\r\n const isRightmost =\r\n isSelf && fromX === Math.max(...layout.participantX.values());\r\n return (\r\n <Fragment key={i}>\r\n <MessageStep\r\n msg={ps.step}\r\n fromX={fromX}\r\n toX={layout.participantX.get(ps.step.to)!}\r\n y={headTopY + PART_BOX_H + ps.y}\r\n arrowColor={arrowColor}\r\n labelColor={labelColor}\r\n selfDirection={isRightmost ? 'left' : 'right'}\r\n canvasWidth={layout.width}\r\n />\r\n </Fragment>\r\n );\r\n }\r\n return (\r\n <Fragment key={i}>\r\n <NoteStep\r\n note={ps.step}\r\n participantXs={ps.step.participants.map((id) => layout.participantX.get(id)!).filter((x) => x !== undefined)}\r\n y={headTopY + PART_BOX_H + ps.y}\r\n fill={noteFill}\r\n border={noteBorder}\r\n textColor={noteText}\r\n />\r\n </Fragment>\r\n );\r\n })}\r\n\r\n {/* Participant feet (mirror of heads) */}\r\n {ir.participants.map((p) => {\r\n const x = layout.participantX.get(p.id);\r\n if (x === undefined) return null;\r\n const footY = headTopY + PART_BOX_H + layout.contentH + STEP_GAP - PART_BOX_H / 2;\r\n return (\r\n <g key={`foot-${p.id}`}>\r\n <rect\r\n x={x - PART_BOX_W / 2}\r\n y={footY}\r\n width={PART_BOX_W}\r\n height={PART_BOX_H}\r\n rx={6}\r\n fill={headFill}\r\n stroke={headBorder}\r\n strokeWidth={1}\r\n />\r\n <text\r\n x={x}\r\n y={footY + PART_BOX_H / 2 + 4}\r\n textAnchor=\"middle\"\r\n fontSize={12}\r\n fontWeight={600}\r\n fill={headText}\r\n >\r\n {truncate(p.label, 18)}\r\n </text>\r\n </g>\r\n );\r\n })}\r\n\r\n <ArrowDefs arrowColor={arrowColor} />\r\n </svg>\r\n </div>\r\n );\r\n}\r\n\r\n// ── Message rendering ────────────────────────────────────────────────────\r\n\r\nfunction MessageStep({\r\n msg,\r\n fromX,\r\n toX,\r\n y,\r\n arrowColor,\r\n labelColor,\r\n selfDirection = 'right',\r\n canvasWidth,\r\n}: {\r\n msg: SequenceMessage;\r\n fromX: number;\r\n toX: number;\r\n y: number;\r\n arrowColor: string;\r\n labelColor: string;\r\n selfDirection?: 'left' | 'right';\r\n canvasWidth?: number;\r\n}) {\r\n const isReply = msg.arrow === 'reply';\r\n const isAsync = msg.arrow === 'async';\r\n const isCross = msg.arrow === 'cross';\r\n const dasharray = isReply ? '5 4' : isAsync ? '8 3' : undefined;\r\n const markerEnd = isCross ? 'url(#arr-cross)' : isAsync ? 'url(#arr-open)' : 'url(#arr-solid)';\r\n\r\n const labelX = (fromX + toX) / 2;\r\n const labelY = y - 8;\r\n const showSelf = fromX === toX;\r\n\r\n if (showSelf) {\r\n // Self-message — small loop. Direction picked by caller so loops on the\r\n // rightmost participant grow leftward (keeping the label inside canvas).\r\n const dir = selfDirection === 'left' ? -1 : 1;\r\n const loopEndX = fromX + dir * SELF_LOOP_W;\r\n // Place label on the side of the loop with more room.\r\n const labelText = truncate(msg.label, 28);\r\n const charW = 6.2;\r\n const approxLabelW = labelText.length * charW;\r\n const labelXPos =\r\n dir === 1\r\n ? // loop opens right; label sits to the right of the loop's edge\r\n Math.min(loopEndX + 8, (canvasWidth ?? Infinity) - approxLabelW - 4)\r\n : // loop opens left; label sits to the left of the loop's edge\r\n Math.max(loopEndX - approxLabelW - 8, 4);\r\n return (\r\n <g>\r\n <path\r\n d={`M ${fromX} ${y} h ${dir * SELF_LOOP_W} v 22 h ${-dir * SELF_LOOP_W}`}\r\n fill=\"none\"\r\n stroke={arrowColor}\r\n strokeWidth={1.4}\r\n strokeDasharray={dasharray}\r\n markerEnd={markerEnd}\r\n />\r\n <text\r\n x={labelXPos}\r\n y={y + 14}\r\n fontSize={11}\r\n fill={labelColor}\r\n textAnchor={dir === 1 ? 'start' : 'start'}\r\n >\r\n {labelText}\r\n </text>\r\n </g>\r\n );\r\n }\r\n\r\n return (\r\n <g>\r\n <text\r\n x={labelX}\r\n y={labelY}\r\n textAnchor=\"middle\"\r\n fontSize={11}\r\n fill={labelColor}\r\n fontWeight={500}\r\n >\r\n {truncate(msg.label, 60)}\r\n </text>\r\n <line\r\n x1={fromX}\r\n x2={toX}\r\n y1={y}\r\n y2={y}\r\n stroke={arrowColor}\r\n strokeWidth={1.4}\r\n strokeDasharray={dasharray}\r\n markerEnd={markerEnd}\r\n />\r\n </g>\r\n );\r\n}\r\n\r\n// ── Note rendering ───────────────────────────────────────────────────────\r\n\r\nfunction NoteStep({\r\n note,\r\n participantXs,\r\n y,\r\n fill,\r\n border,\r\n textColor,\r\n}: {\r\n note: SequenceNote;\r\n participantXs: number[];\r\n y: number;\r\n fill: string;\r\n border: string;\r\n textColor: string;\r\n}) {\r\n if (participantXs.length === 0) return null;\r\n\r\n let x = 0;\r\n let w = 160;\r\n if (note.side === 'over') {\r\n const min = Math.min(...participantXs);\r\n const max = Math.max(...participantXs);\r\n w = Math.max(160, max - min + 80);\r\n x = min - (w - (max - min)) / 2;\r\n } else if (note.side === 'left') {\r\n x = participantXs[0] - 90 - 60;\r\n w = 140;\r\n } else {\r\n x = participantXs[0] + 60;\r\n w = 140;\r\n }\r\n\r\n return (\r\n <g>\r\n <rect\r\n x={x}\r\n y={y - 6}\r\n width={w}\r\n height={NOTE_H}\r\n rx={4}\r\n fill={fill}\r\n stroke={border}\r\n strokeWidth={1}\r\n />\r\n <text x={x + w / 2} y={y + NOTE_H / 2 - 1} textAnchor=\"middle\" fontSize={11} fill={textColor}>\r\n {truncate(note.text, 50)}\r\n </text>\r\n </g>\r\n );\r\n}\r\n\r\n// ── Arrow head defs ──────────────────────────────────────────────────────\r\n\r\nfunction ArrowDefs({ arrowColor }: { arrowColor: string }) {\r\n return (\r\n <defs>\r\n <marker id=\"arr-solid\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"8\" markerHeight=\"8\" orient=\"auto-start-reverse\">\r\n <path d=\"M 0 0 L 10 5 L 0 10 z\" fill={arrowColor} />\r\n </marker>\r\n <marker id=\"arr-open\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"9\" markerHeight=\"9\" orient=\"auto-start-reverse\">\r\n <path d=\"M 0 0 L 10 5 L 0 10\" fill=\"none\" stroke={arrowColor} strokeWidth=\"1.5\" />\r\n </marker>\r\n <marker id=\"arr-cross\" viewBox=\"0 0 10 10\" refX=\"5\" refY=\"5\" markerWidth=\"9\" markerHeight=\"9\" orient=\"auto\">\r\n <path d=\"M 0 0 L 10 10 M 10 0 L 0 10\" stroke={arrowColor} strokeWidth=\"1.5\" />\r\n </marker>\r\n </defs>\r\n );\r\n}\r\n\r\n// ── Layout computation ──────────────────────────────────────────────────\r\n\r\ninterface PlacedStep {\r\n step: SequenceStep;\r\n y: number;\r\n}\r\n\r\ninterface LayoutResult {\r\n width: number;\r\n height: number;\r\n contentH: number;\r\n participantX: Map<string, number>;\r\n placedSteps: PlacedStep[];\r\n}\r\n\r\nfunction computeLayout(\r\n participants: SequenceParticipant[],\r\n steps: SequenceStep[]\r\n): LayoutResult {\r\n const participantX = new Map<string, number>();\r\n participants.forEach((p, i) => {\r\n participantX.set(p.id, SIDE_PAD + PART_BOX_W / 2 + i * PARTICIPANT_GAP);\r\n });\r\n\r\n const lastX = (participants.length - 1) * PARTICIPANT_GAP + SIDE_PAD * 2 + PART_BOX_W;\r\n\r\n const placedSteps: PlacedStep[] = [];\r\n // Push the first step well clear of the participant heads so the\r\n // arrow's label (drawn 8px above the line) doesn't sit on top of the\r\n // box border.\r\n let y = 36;\r\n for (const step of steps) {\r\n placedSteps.push({ step, y });\r\n y += step.kind === 'note' ? NOTE_H + 16 : STEP_GAP;\r\n }\r\n\r\n return {\r\n width: lastX,\r\n height: HEAD_PAD_Y + PART_BOX_H + y + STEP_GAP + PART_BOX_H + FOOT_HEIGHT,\r\n contentH: y,\r\n participantX,\r\n placedSteps,\r\n };\r\n}\r\n\r\nfunction truncate(s: string, max: number): string {\r\n return s.length <= max ? s : s.slice(0, max - 1) + '…';\r\n}\r\n\r\n// Re-export types for tooling convenience\r\nexport type { SequenceArrow };\r\n","import { useEffect, useMemo, useRef } from 'react';\nimport dagre from 'dagre';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildClassSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype ClassRendererProps = RendererProps<'class'>;\n\nfunction classBoxSize(memberCount: number) {\n return { width: 220, height: Math.max(64, 40 + memberCount * 18) };\n}\n\nexport default function ClassRenderer({ ir, dark = false, handleRef }: ClassRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => {\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'TB', nodesep: 50, ranksep: 80, marginx: 24, marginy: 24 });\n g.setDefaultEdgeLabel(() => ({}));\n for (const cls of ir.classes) g.setNode(cls.id, classBoxSize(cls.members.length));\n for (const rel of ir.relations) {\n if (g.hasNode(rel.source) && g.hasNode(rel.target)) g.setEdge(rel.source, rel.target);\n }\n dagre.layout(g);\n\n const positions = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const cls of ir.classes) {\n const { x, y } = g.node(cls.id) as { x: number; y: number };\n const size = classBoxSize(cls.members.length);\n positions.set(cls.id, { x: x - size.width / 2, y: y - size.height / 2, width: size.width, height: size.height });\n }\n return buildClassSvg(ir, positions, { dark });\n }, [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"class-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport dagre from 'dagre';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport type { StateDiagramIR, StateNode } from '../../utils/diagrams/types';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildStateSvg, svgStringToElement, type StateBuildPositions } from '../../utils/diagrams/svgBuilders';\n\ntype StateRendererProps = RendererProps<'state'>;\n\nconst COMPOSITE_HEADER_HEIGHT = 32;\nconst COMPOSITE_PAD = 18;\n\nfunction stateNodeSize(s: StateNode): { width: number; height: number } {\n if (s.kind === 'start' || s.kind === 'end') return { width: 80, height: 32 };\n const len = (s.label || s.id).length;\n return { width: Math.max(96, len * 9 + 40), height: 44 };\n}\n\ninterface InnerLayout {\n width: number;\n height: number;\n /** Per-child position relative to the composite top-left. */\n positions: Map<string, { x: number; y: number }>;\n}\n\nfunction layoutComposite(parentId: string, ir: StateDiagramIR): InnerLayout {\n const children = ir.states.filter((s) => s.parent === parentId);\n if (children.length === 0) {\n return { width: 200, height: COMPOSITE_HEADER_HEIGHT + 60, positions: new Map() };\n }\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'TB', nodesep: 60, ranksep: 70, marginx: 16, marginy: 16 });\n g.setDefaultEdgeLabel(() => ({}));\n for (const c of children) g.setNode(c.id, stateNodeSize(c));\n for (const t of ir.transitions) {\n if (t.parent !== parentId) continue;\n if (g.hasNode(t.source) && g.hasNode(t.target)) g.setEdge(t.source, t.target);\n }\n dagre.layout(g);\n\n let minLeft = Infinity, minTop = Infinity, maxRight = 0, maxBottom = 0;\n const tmp = new Map<string, { x: number; y: number }>();\n for (const c of children) {\n const { x, y } = g.node(c.id) as { x: number; y: number };\n const sz = stateNodeSize(c);\n const left = x - sz.width / 2;\n const top = y - sz.height / 2;\n tmp.set(c.id, { x: left, y: top });\n minLeft = Math.min(minLeft, left);\n minTop = Math.min(minTop, top);\n maxRight = Math.max(maxRight, left + sz.width);\n maxBottom = Math.max(maxBottom, top + sz.height);\n }\n\n // Translate so children start at (PAD, HEADER + PAD) inside the composite.\n const dx = COMPOSITE_PAD - minLeft;\n const dy = COMPOSITE_HEADER_HEIGHT + COMPOSITE_PAD - minTop;\n const positions = new Map<string, { x: number; y: number }>();\n for (const [id, p] of tmp) positions.set(id, { x: p.x + dx, y: p.y + dy });\n\n return {\n width: maxRight - minLeft + COMPOSITE_PAD * 2,\n height: maxBottom - minTop + COMPOSITE_HEADER_HEIGHT + COMPOSITE_PAD * 2,\n positions,\n };\n}\n\nexport default function StateRenderer({ ir, dark = false, handleRef }: StateRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => {\n const compositeIds = ir.states.filter((s) => s.kind === 'composite').map((s) => s.id);\n const innerLayouts = new Map<string, InnerLayout>();\n for (const id of compositeIds) innerLayouts.set(id, layoutComposite(id, ir));\n\n const buildPositions: StateBuildPositions = { topLevel: new Map(), children: new Map() };\n\n const topLevel = ir.states.filter((s) => !s.parent);\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'TB', nodesep: 80, ranksep: 90, marginx: 32, marginy: 32 });\n g.setDefaultEdgeLabel(() => ({}));\n for (const s of topLevel) {\n if (s.kind === 'composite') {\n const inner = innerLayouts.get(s.id)!;\n g.setNode(s.id, { width: inner.width, height: inner.height });\n } else {\n g.setNode(s.id, stateNodeSize(s));\n }\n }\n for (const t of ir.transitions) {\n if (t.parent) continue;\n if (g.hasNode(t.source) && g.hasNode(t.target)) g.setEdge(t.source, t.target);\n }\n dagre.layout(g);\n\n for (const s of topLevel) {\n const { x, y } = g.node(s.id) as { x: number; y: number };\n if (s.kind === 'composite') {\n const inner = innerLayouts.get(s.id)!;\n buildPositions.topLevel.set(s.id, {\n x: x - inner.width / 2,\n y: y - inner.height / 2,\n width: inner.width,\n height: inner.height,\n });\n } else {\n const size = stateNodeSize(s);\n buildPositions.topLevel.set(s.id, {\n x: x - size.width / 2,\n y: y - size.height / 2,\n width: size.width,\n height: size.height,\n });\n }\n }\n for (const compId of compositeIds) {\n const inner = innerLayouts.get(compId)!;\n const children = ir.states.filter((s) => s.parent === compId);\n for (const c of children) {\n const pos = inner.positions.get(c.id);\n if (!pos) continue;\n const size = stateNodeSize(c);\n buildPositions.children.set(c.id, {\n x: pos.x,\n y: pos.y,\n width: size.width,\n height: size.height,\n parent: compId,\n });\n }\n }\n\n return buildStateSvg(ir, buildPositions, { dark });\n }, [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"state-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildGanttSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype GanttRendererProps = RendererProps<'gantt'>;\n\n// On-screen rendering = export rendering. We reuse `buildGanttSvg` (the same\n// builder that produces SVG/PNG downloads) and inline the SVG markup. This\n// keeps \"what you see is what you export\" guaranteed by construction, and\n// drops the vis-timeline dependency for Gantt diagrams.\n\nexport default function GanttRenderer({ ir, dark = false, handleRef }: GanttRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildGanttSvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"gantt-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflowX: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildTimelineSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype TimelineRendererProps = RendererProps<'timeline'>;\n\n// On-screen rendering = export rendering. See GanttRenderer for the rationale.\n\nexport default function TimelineRenderer({ ir, dark = false, handleRef }: TimelineRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildTimelineSvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"timeline-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflowX: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport type { MindmapNode } from '../../utils/diagrams/types';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildMindmapSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype MindmapRendererProps = RendererProps<'mindmap'>;\n\ninterface PositionedNode {\n id: string;\n node: MindmapNode;\n x: number;\n y: number;\n depth: number;\n}\n\nfunction radialLayout(root: MindmapNode): { positioned: PositionedNode[]; bounds: { w: number; h: number } } {\n const positioned: PositionedNode[] = [];\n const RING_DISTANCE = 180;\n\n const place = (node: MindmapNode, depth: number, startAngle: number, endAngle: number) => {\n const angle = (startAngle + endAngle) / 2;\n const x = depth === 0 ? 0 : Math.cos(angle) * RING_DISTANCE * depth;\n const y = depth === 0 ? 0 : Math.sin(angle) * RING_DISTANCE * depth;\n positioned.push({ id: node.id, node, x, y, depth });\n if (node.children.length === 0) return;\n const span = endAngle - startAngle;\n const slice = span / node.children.length;\n for (let i = 0; i < node.children.length; i++) {\n place(node.children[i], depth + 1, startAngle + i * slice, startAngle + (i + 1) * slice);\n }\n };\n\n place(root, 0, 0, Math.PI * 2);\n\n let minX = 0, minY = 0, maxX = 0, maxY = 0;\n for (const p of positioned) {\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n for (const p of positioned) {\n p.x = p.x - minX + 200;\n p.y = p.y - minY + 100;\n }\n return { positioned, bounds: { w: maxX - minX + 400, h: maxY - minY + 200 } };\n}\n\nexport default function MindmapRenderer({ ir, dark = false, handleRef }: MindmapRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => {\n const { positioned } = radialLayout(ir.root);\n const positions = new Map<string, { x: number; y: number; width: number; height: number; depth: number }>();\n for (const p of positioned) {\n const isRoot = p.depth === 0;\n const labelLen = p.node.label.length;\n const w = Math.max(isRoot ? 100 : 70, labelLen * (isRoot ? 9 : 7) + 40);\n const h = isRoot ? 44 : 32;\n positions.set(p.id, { x: p.x, y: p.y, width: w, height: h, depth: p.depth });\n }\n return buildMindmapSvg(ir, positions, { dark });\n }, [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"mindmap-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildArchitectureSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype ArchitectureRendererProps = RendererProps<'architecture'>;\n\nexport default function ArchitectureRenderer({ ir, dark = false, handleRef }: ArchitectureRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildArchitectureSvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"architecture-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildC4Svg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype C4RendererProps = RendererProps<'c4'>;\n\nexport default function C4Renderer({ ir, dark = false, handleRef }: C4RendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildC4Svg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"c4-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","import { useEffect, useMemo, useRef } from 'react';\nimport type { RendererHandle, RendererProps } from '../../utils/diagrams/registry';\nimport { getDiagramTheme } from './shared/theme';\nimport { buildGitGraphSvg, svgStringToElement } from '../../utils/diagrams/svgBuilders';\n\ntype GitGraphRendererProps = RendererProps<'gitgraph'>;\n\nexport default function GitGraphRenderer({ ir, dark = false, handleRef }: GitGraphRendererProps) {\n const theme = getDiagramTheme(dark);\n const containerRef = useRef<HTMLDivElement>(null);\n\n const svg = useMemo(() => buildGitGraphSvg(ir, { dark }), [ir, dark]);\n\n useEffect(() => {\n if (!handleRef) return;\n const handle: RendererHandle = {\n getSvgElement: () => svgStringToElement(svg),\n };\n handleRef.current = handle;\n return () => {\n if (handleRef.current === handle) handleRef.current = null;\n };\n }, [handleRef, svg]);\n\n return (\n <div\n ref={containerRef}\n className=\"gitgraph-renderer\"\n style={{ width: '100%', background: theme.canvasBg, borderRadius: 12, padding: 12, overflow: 'auto' }}\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n );\n}\n","// Mermaid syntax → DiagramIR adapter.\r\n//\r\n// Strategy: use `mermaid.parse()` for type detection (cheap and reliable),\r\n// then for natively-supported types (flowchart) walk the source ourselves\r\n// with a focused recursive parser. We intentionally do NOT depend on\r\n// mermaid's internal AST API — that's unstable across versions.\r\n//\r\n// For types we don't natively render yet (sequence, gantt, ER from mermaid\r\n// syntax, etc.), we return `ir: null` and let the caller fall back to\r\n// `mermaid.render()`.\r\n//\r\n// Supported flowchart syntax (subset of mermaid v11):\r\n// - Header: flowchart TB|TD|BT|LR|RL / graph TB|TD|BT|LR|RL\r\n// - Basic nodes: id / id[Rect] / id(Round) / id((Circle))\r\n// id{Diamond} / id[(Cylinder)] / id>Tag]\r\n// - Edges: A --> B, A --- B, A -.-> B, A ==> B\r\n// Labeled: A -- text --> B / A -->|text| B\r\n// - Subgraphs: subgraph name [Title?] ... end\r\n// - Icon directive (project extension): Foo[Database]:::icon=logos:aws-rds\r\n//\r\n// Out of scope (caller can extend later):\r\n// - Multi-source/target shorthand (A & B --> C & D)\r\n// - `class`/`classDef`/`style`/`linkStyle`/`click`\r\n// - Asymmetric/parallelogram/trapezoid shapes\r\n\r\nimport type {\r\n ArchSide,\r\n ArchitectureEdge,\r\n ArchitectureIR,\r\n ArchitectureNode,\r\n C4Element,\r\n C4ElementKind,\r\n C4IR,\r\n C4Variant,\r\n ClassDiagramIR,\r\n ClassMember,\r\n ClassNode,\r\n ClassRelation,\r\n ClassRelationKind,\r\n ClassVisibility,\r\n ERDiagramIR,\r\n EdgeIR,\r\n EdgeKind,\r\n FlowDirection,\r\n FlowchartIR,\r\n GanttDiagramIR,\r\n GanttItemStatus,\r\n GanttTask,\r\n GitGraphIR,\r\n GitGraphOp,\r\n JourneyIR,\r\n JourneySection,\r\n MindmapIR,\r\n MindmapNode,\r\n MindmapShape,\r\n NodeIR,\r\n NodeKind,\r\n ParseResult,\r\n PieChartIR,\r\n QuadrantChartIR,\r\n QuadrantPoint,\r\n RecognizedDiagramType,\r\n SequenceArrow,\r\n SequenceIR,\r\n SequenceMessage,\r\n SequenceNote,\r\n SequenceStep,\r\n StateDiagramIR,\r\n StateNode,\r\n SubgraphIR,\r\n TimelineEvent,\r\n TimelineIR,\r\n} from './types';\r\nimport type { DbColumn, DbRelation, DbTable, ParsedSchema } from './types';\r\n\r\n// ── Type detection ───────────────────────────────────────────────────────\r\n\r\nconst HEADER_KEYWORDS: { re: RegExp; type: RecognizedDiagramType }[] = [\r\n { re: /^(flowchart|graph)\\b/i, type: 'flowchart' },\r\n { re: /^erdiagram\\b/i, type: 'er' },\r\n { re: /^sequencediagram\\b/i, type: 'sequence' },\r\n { re: /^classdiagram\\b/i, type: 'class' },\r\n { re: /^statediagram(-v2)?\\b/i, type: 'state' },\r\n { re: /^gantt\\b/i, type: 'gantt' },\r\n { re: /^pie\\b/i, type: 'pie' },\r\n { re: /^quadrantchart\\b/i, type: 'quadrant' },\r\n { re: /^mindmap\\b/i, type: 'mindmap' },\r\n { re: /^gitgraph\\b/i, type: 'gitgraph' },\r\n { re: /^timeline\\b/i, type: 'timeline' },\r\n { re: /^journey\\b/i, type: 'journey' },\r\n { re: /^c4(context|container|component|deployment)/i, type: 'c4' },\r\n { re: /^architecture(-beta)?\\b/i, type: 'architecture' },\r\n];\r\n\r\nexport async function detectDiagramType(source: string): Promise<RecognizedDiagramType | null> {\r\n // Strip BOM and leading directive lines (`%%{init: ...}%%`) before\r\n // looking at the first content line.\r\n const clean = source.replace(/^/, '');\r\n const firstLine = clean\r\n .split('\\n')\r\n .map((l) => l.trim())\r\n .find((l) => l.length > 0 && !l.startsWith('%%'));\r\n if (!firstLine) return null;\r\n for (const { re, type } of HEADER_KEYWORDS) {\r\n if (re.test(firstLine)) return type;\r\n }\r\n return 'unsupported';\r\n}\r\n\r\n// ── Public API ───────────────────────────────────────────────────────────\r\n\r\nexport async function parseToIR(source: string): Promise<ParseResult> {\r\n const type = await detectDiagramType(source);\r\n if (type === null) {\r\n return { ok: false, source, error: 'Empty or whitespace-only source' };\r\n }\r\n if (type === 'unsupported') {\r\n return { ok: false, source, error: 'Unrecognized diagram type' };\r\n }\r\n try {\r\n switch (type) {\r\n case 'flowchart':\r\n return { ok: true, type, ir: parseFlowchart(source) };\r\n case 'pie':\r\n return { ok: true, type, ir: parsePieChart(source) };\r\n case 'quadrant':\r\n return { ok: true, type, ir: parseQuadrantChart(source) };\r\n case 'journey':\r\n return { ok: true, type, ir: parseJourney(source) };\r\n case 'sequence':\r\n return { ok: true, type, ir: parseSequence(source) };\r\n case 'class':\r\n return { ok: true, type, ir: parseClassDiagram(source) };\r\n case 'state':\r\n return { ok: true, type, ir: parseStateDiagram(source) };\r\n case 'er':\r\n return { ok: true, type, ir: parseMermaidERDiagram(source) };\r\n case 'gantt':\r\n return { ok: true, type, ir: parseGantt(source) };\r\n case 'timeline':\r\n return { ok: true, type, ir: parseTimeline(source) };\r\n case 'mindmap':\r\n return { ok: true, type, ir: parseMindmap(source) };\r\n case 'architecture':\r\n return { ok: true, type, ir: parseArchitecture(source) };\r\n case 'c4':\r\n return { ok: true, type, ir: parseC4(source) };\r\n case 'gitgraph':\r\n return { ok: true, type, ir: parseGitGraph(source) };\r\n }\r\n return { ok: false, source, error: `Unhandled diagram type: ${String(type)}` };\r\n } catch (err) {\r\n return {\r\n ok: false,\r\n source,\r\n error: err instanceof Error ? err.message : String(err),\r\n };\r\n }\r\n}\r\n\r\n// ── Flowchart parser ─────────────────────────────────────────────────────\r\n\r\ninterface NodeDecl {\r\n id: string;\r\n label: string;\r\n kind: NodeKind;\r\n icon?: string;\r\n}\r\n\r\nconst HEADER_RE = /^(?:flowchart|graph)\\s+(TB|TD|BT|LR|RL)\\b/i;\r\nconst SUBGRAPH_OPEN_RE = /^subgraph\\s+([\\w-]+)(?:\\s*\\[(.+?)\\])?/i;\r\n// Gate for \"this line looks like an edge\". Includes the closing tail of\r\n// labeled-dotted edges (`A -. label .-> B`) — without it, the per-edge\r\n// regexes never get a chance to fire.\r\nconst EDGE_LINE_REGEX = /-{2,}>|-{2,}|-\\.-+>|\\.-+>|={2,}>|-{2,}-|=={2,}|~~~/;\r\n\r\nexport function parseFlowchart(source: string): FlowchartIR {\r\n const rawLines = source.split('\\n');\r\n if (rawLines.length === 0) throw new Error('Empty flowchart source');\r\n\r\n let direction: FlowDirection = 'TB';\r\n const nodes = new Map<string, NodeIR>();\r\n const edges: EdgeIR[] = [];\r\n const subgraphs: SubgraphIR[] = [];\r\n const subgraphStack: string[] = [];\r\n\r\n const ensureNode = (decl: NodeDecl): NodeIR => {\r\n const existing = nodes.get(decl.id);\r\n if (existing) {\r\n // Upgrade label / kind if better info shows up later\r\n if (decl.label && (decl.label !== decl.id || !existing.label)) existing.label = decl.label;\r\n if (decl.kind !== 'plain' && existing.kind === 'plain') existing.kind = decl.kind;\r\n if (decl.icon) {\r\n existing.icon = decl.icon;\r\n existing.kind = 'icon';\r\n }\r\n return existing;\r\n }\r\n const node: NodeIR = {\r\n id: decl.id,\r\n label: decl.label,\r\n kind: decl.icon ? 'icon' : decl.kind,\r\n };\r\n if (decl.icon) node.icon = decl.icon;\r\n if (subgraphStack.length > 0) node.subgraph = subgraphStack[subgraphStack.length - 1];\r\n nodes.set(decl.id, node);\r\n return node;\r\n };\r\n\r\n for (let i = 0; i < rawLines.length; i++) {\r\n const line = rawLines[i].trim();\r\n if (!line || line.startsWith('%%')) continue;\r\n\r\n // First non-empty line — header\r\n if (i === 0 || (nodes.size === 0 && edges.length === 0 && subgraphs.length === 0)) {\r\n const m = line.match(HEADER_RE);\r\n if (m) {\r\n const dir = m[1].toUpperCase();\r\n direction = (dir === 'TD' ? 'TB' : dir) as FlowDirection;\r\n continue;\r\n }\r\n }\r\n\r\n // Subgraph open\r\n const subOpen = line.match(SUBGRAPH_OPEN_RE);\r\n if (subOpen) {\r\n const id = subOpen[1];\r\n const label = subOpen[2] ?? id;\r\n subgraphs.push({ id, label });\r\n subgraphStack.push(id);\r\n continue;\r\n }\r\n if (/^end\\b/i.test(line)) {\r\n subgraphStack.pop();\r\n continue;\r\n }\r\n\r\n // Skip directives we don't model\r\n if (/^(direction|class|classDef|style|linkStyle|click)\\b/i.test(line)) continue;\r\n\r\n // Edge or lone node?\r\n if (EDGE_LINE_REGEX.test(line)) {\r\n const edge = parseEdge(line);\r\n if (edge) {\r\n // Expand `&` multi-source / multi-target shorthand:\r\n // `A & B & C --> D & E` → Cartesian product (6 edges).\r\n // `&` is not valid inside an id or shape-bracket, so splitting at\r\n // the top level is safe.\r\n const fromTokens = edge.from.split(/\\s*&\\s*/).filter(Boolean);\r\n const toTokens = edge.to.split(/\\s*&\\s*/).filter(Boolean);\r\n for (const f of fromTokens) {\r\n const fromDecl = parseNodeDecl(f);\r\n if (!fromDecl.id) continue;\r\n ensureNode(fromDecl);\r\n for (const t of toTokens) {\r\n const toDecl = parseNodeDecl(t);\r\n if (!toDecl.id) continue;\r\n ensureNode(toDecl);\r\n const e: EdgeIR = { source: fromDecl.id, target: toDecl.id, kind: edge.kind };\r\n if (edge.label) e.label = edge.label;\r\n edges.push(e);\r\n }\r\n }\r\n continue;\r\n }\r\n }\r\n\r\n // Lone node declaration\r\n const decl = parseNodeDecl(line);\r\n if (decl.id) ensureNode(decl);\r\n }\r\n\r\n // When a flowchart references a subgraph name as an edge endpoint\r\n // (`A --> SettlementLayer` where SettlementLayer is also `subgraph\r\n // SettlementLayer [...]`), the loop above will have created a node with\r\n // the cluster's id. Drop those duplicates — the edge still carries the\r\n // id, and the layout pass redirects it to a representative child.\r\n for (const sg of subgraphs) nodes.delete(sg.id);\r\n\r\n return {\r\n type: 'flowchart',\r\n direction,\r\n nodes: [...nodes.values()],\r\n edges,\r\n subgraphs,\r\n };\r\n}\r\n\r\n// ── Node-declaration parser (id + shape + optional :::modifier) ──────────\r\n\r\nfunction splitClassDirective(text: string): { core: string; icon?: string } {\r\n const idx = text.indexOf(':::');\r\n if (idx === -1) return { core: text };\r\n const core = text.slice(0, idx).trim();\r\n const rest = text.slice(idx + 3).trim();\r\n // Look for `icon=foo:bar` token\r\n const iconMatch = rest.match(/(?:^|[\\s,])icon\\s*=\\s*([\\w:_-]+)/);\r\n return { core, icon: iconMatch?.[1] };\r\n}\r\n\r\nfunction parseNodeDecl(text: string): NodeDecl {\r\n const trimmed = text.trim();\r\n const { core, icon } = splitClassDirective(trimmed);\r\n\r\n const shapes: { re: RegExp; kind: NodeKind }[] = [\r\n { re: /^([\\w-]+)\\(\\(([^)]*)\\)\\)$/, kind: 'user' }, // ((circle))\r\n { re: /^([\\w-]+)\\[\\(([^)]*)\\)\\]$/, kind: 'database' }, // [(cylinder)]\r\n { re: /^([\\w-]+)\\[\\[([^\\]]*)\\]\\]$/, kind: 'queue' }, // [[subroutine]]\r\n { re: /^([\\w-]+)\\[\\/([^/]*)\\/\\]$/, kind: 'process' }, // [/parallelogram/]\r\n { re: /^([\\w-]+)\\[\\\\([^\\\\]*)\\\\\\]$/, kind: 'process' }, // [\\..\\]\r\n { re: /^([\\w-]+)\\{([^}]*)\\}$/, kind: 'decision' }, // {decision}\r\n { re: /^([\\w-]+)>([^\\]]*)\\]$/, kind: 'plain' }, // >tag]\r\n { re: /^([\\w-]+)\\(([^)]*)\\)$/, kind: 'service' }, // (rounded)\r\n { re: /^([\\w-]+)\\[([^\\]]*)\\]$/, kind: 'process' }, // [rect]\r\n ];\r\n\r\n for (const { re, kind } of shapes) {\r\n const m = core.match(re);\r\n if (m) {\r\n return {\r\n id: m[1],\r\n label: stripQuotes(m[2]) || m[1],\r\n kind,\r\n icon,\r\n };\r\n }\r\n }\r\n\r\n // Bare id\r\n const bare = core.match(/^([\\w-]+)$/);\r\n if (bare) {\r\n return { id: bare[1], label: bare[1], kind: 'plain', icon };\r\n }\r\n\r\n // Couldn't parse — return placeholder so the parent loop can skip cleanly\r\n return { id: '', label: '', kind: 'plain' };\r\n}\r\n\r\nfunction stripQuotes(s: string): string {\r\n if ((s.startsWith('\"') && s.endsWith('\"')) || (s.startsWith(\"'\") && s.endsWith(\"'\"))) {\r\n return s.slice(1, -1);\r\n }\r\n return s;\r\n}\r\n\r\n// ── Edge parser ──────────────────────────────────────────────────────────\r\n\r\ninterface ParsedEdge {\r\n from: string;\r\n to: string;\r\n label?: string;\r\n kind: EdgeKind;\r\n}\r\n\r\nfunction parseEdge(line: string): ParsedEdge | null {\r\n // Order matters — most specific first.\r\n // Labeled with `-- label -->` / `-. label .->` / `== label ==>`\r\n const labeled: { re: RegExp; kind: EdgeKind }[] = [\r\n { re: /^(.+?)\\s*--\\s*([^-][^|]*?)\\s*-{1,2}>\\s*(.+)$/, kind: 'solid' },\r\n { re: /^(.+?)\\s*-\\.\\s*([^.][^|]*?)\\s*\\.-+>\\s*(.+)$/, kind: 'dashed' },\r\n { re: /^(.+?)\\s*==\\s*([^=][^|]*?)\\s*={1,2}>\\s*(.+)$/, kind: 'thick' },\r\n ];\r\n for (const { re, kind } of labeled) {\r\n const m = line.match(re);\r\n if (m) return { from: m[1].trim(), to: m[3].trim(), label: m[2].trim(), kind };\r\n }\r\n\r\n // Unlabeled or `|label|` syntax: `A --> |label| B`\r\n const unlabeled: { re: RegExp; kind: EdgeKind }[] = [\r\n { re: /^(.+?)\\s*~~~\\s*(?:\\|([^|]+)\\|\\s*)?(.+)$/, kind: 'invisible' },\r\n { re: /^(.+?)\\s*-\\.-+>\\s*(?:\\|([^|]+)\\|\\s*)?(.+)$/, kind: 'dashed' },\r\n { re: /^(.+?)\\s*={2,}>\\s*(?:\\|([^|]+)\\|\\s*)?(.+)$/, kind: 'thick' },\r\n { re: /^(.+?)\\s*-{2,}>\\s*(?:\\|([^|]+)\\|\\s*)?(.+)$/, kind: 'solid' },\r\n { re: /^(.+?)\\s*-{2,}\\s*(?:\\|([^|]+)\\|\\s*)?(.+)$/, kind: 'solid' },\r\n ];\r\n for (const { re, kind } of unlabeled) {\r\n const m = line.match(re);\r\n if (m) {\r\n const label = m[2]?.trim();\r\n return { from: m[1].trim(), to: m[3].trim(), label: label || undefined, kind };\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n// ── Pie chart parser ─────────────────────────────────────────────────────\r\n// pie [showData]\r\n// title Some Title\r\n// \"Slice A\" : 42\r\n// \"Slice B\" : 17\r\n\r\nconst PIE_SLICE_RE = /^\"([^\"]+)\"\\s*:\\s*([\\d.]+)/;\r\n\r\nexport function parsePieChart(source: string): PieChartIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const ir: PieChartIR = { type: 'pie', slices: [] };\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^pie\\b/i.test(line)) {\r\n if (/\\bshowData\\b/i.test(line)) ir.showData = true;\r\n continue;\r\n }\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n ir.title = titleMatch[1].trim();\r\n continue;\r\n }\r\n const sliceMatch = line.match(PIE_SLICE_RE);\r\n if (sliceMatch) {\r\n const value = parseFloat(sliceMatch[2]);\r\n if (!isNaN(value)) ir.slices.push({ label: sliceMatch[1], value });\r\n }\r\n }\r\n return ir;\r\n}\r\n\r\n// ── Quadrant chart parser ────────────────────────────────────────────────\r\n\r\nconst QUADRANT_POINT_RE = /^([^:]+):\\s*\\[\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*\\]/;\r\n\r\nexport function parseQuadrantChart(source: string): QuadrantChartIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const ir: QuadrantChartIR = { type: 'quadrant', points: [] };\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^quadrantchart\\b/i.test(line)) continue;\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n ir.title = titleMatch[1].trim();\r\n continue;\r\n }\r\n const xAxisMatch = line.match(/^x-axis\\s+(.+?)\\s*-->\\s*(.+)$/i);\r\n if (xAxisMatch) {\r\n ir.xAxisLabel = { low: xAxisMatch[1].trim(), high: xAxisMatch[2].trim() };\r\n continue;\r\n }\r\n const yAxisMatch = line.match(/^y-axis\\s+(.+?)\\s*-->\\s*(.+)$/i);\r\n if (yAxisMatch) {\r\n ir.yAxisLabel = { low: yAxisMatch[1].trim(), high: yAxisMatch[2].trim() };\r\n continue;\r\n }\r\n const qMatch = line.match(/^quadrant-([1-4])\\s+(.+)$/i);\r\n if (qMatch) {\r\n ir.quadrantLabels = ir.quadrantLabels ?? {};\r\n ir.quadrantLabels[`q${qMatch[1]}` as 'q1' | 'q2' | 'q3' | 'q4'] = qMatch[2].trim();\r\n continue;\r\n }\r\n const pt = line.match(QUADRANT_POINT_RE);\r\n if (pt) {\r\n const x = parseFloat(pt[2]);\r\n const y = parseFloat(pt[3]);\r\n if (!isNaN(x) && !isNaN(y)) {\r\n ir.points.push({ label: pt[1].trim(), x, y } satisfies QuadrantPoint);\r\n }\r\n }\r\n }\r\n return ir;\r\n}\r\n\r\n// ── Journey parser ───────────────────────────────────────────────────────\r\n\r\nconst JOURNEY_TASK_RE = /^([^:]+?)\\s*:\\s*([\\d.]+)\\s*:\\s*(.+)$/;\r\n\r\nexport function parseJourney(source: string): JourneyIR {\r\n const lines = source.split('\\n').map((l) => l.replace(/^\\s+/, ''));\r\n const ir: JourneyIR = { type: 'journey', sections: [] };\r\n let currentSection: JourneySection | null = null;\r\n for (const rawLine of lines) {\r\n const line = rawLine.trimEnd();\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^journey\\b/i.test(line)) continue;\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n ir.title = titleMatch[1].trim();\r\n continue;\r\n }\r\n const sectionMatch = line.match(/^section\\s+(.+)$/i);\r\n if (sectionMatch) {\r\n currentSection = { title: sectionMatch[1].trim(), tasks: [] };\r\n ir.sections.push(currentSection);\r\n continue;\r\n }\r\n const taskMatch = line.match(JOURNEY_TASK_RE);\r\n if (taskMatch && currentSection) {\r\n const score = parseFloat(taskMatch[2]);\r\n const actors = taskMatch[3]\r\n .split(',')\r\n .map((a) => a.trim())\r\n .filter(Boolean);\r\n currentSection.tasks.push({ label: taskMatch[1].trim(), score, actors });\r\n }\r\n }\r\n return ir;\r\n}\r\n\r\n// ── Sequence parser ──────────────────────────────────────────────────────\r\n//\r\n// Parses a permissive subset of mermaid's sequenceDiagram syntax. Covers:\r\n// - participant / actor declarations (with `as` aliases, optional quotes)\r\n// - arrows: ->, -->, ->>, -->>, -x, -)\r\n// - activation modifiers (`A->>+B: msg` / `A->>-B: msg`)\r\n// - notes: `Note over A,B: text` / left of / right of\r\n// - control-flow keywords (loop/alt/opt/par/end/activate/deactivate) — skipped\r\n//\r\n// Arrows are matched by SCANNING for the arrow token rather than via a strict\r\n// id regex so participants with spaces in their name (`Order Service`) work\r\n// even when the source uses the spaceful name as the id.\r\n\r\n// Ordered most-specific (longest) first so `-->>` doesn't get misread as `->`.\r\nconst SEQ_ARROW_TOKENS: { token: string; arrow: SequenceArrow }[] = [\r\n { token: '-->>', arrow: 'reply' },\r\n { token: '->>', arrow: 'sync' },\r\n { token: '-->', arrow: 'reply' },\r\n { token: '->', arrow: 'sync' },\r\n { token: '-x', arrow: 'cross' },\r\n { token: '-)', arrow: 'async' },\r\n];\r\n\r\ninterface SequenceArrowMatch {\r\n from: string;\r\n to: string;\r\n arrow: SequenceArrow;\r\n label: string;\r\n}\r\n\r\nfunction matchSequenceArrow(line: string): SequenceArrowMatch | null {\r\n // Find the FIRST arrow token in the line. Try longest tokens first so\r\n // `-->>` matches before `->>` / `-->` / `->`.\r\n let bestIdx = -1;\r\n let bestToken: (typeof SEQ_ARROW_TOKENS)[number] | null = null;\r\n for (const t of SEQ_ARROW_TOKENS) {\r\n const idx = line.indexOf(t.token);\r\n if (idx === -1) continue;\r\n if (bestIdx === -1 || idx < bestIdx || (idx === bestIdx && t.token.length > (bestToken?.token.length ?? 0))) {\r\n bestIdx = idx;\r\n bestToken = t;\r\n }\r\n }\r\n if (bestIdx === -1 || !bestToken) return null;\r\n\r\n const from = line.slice(0, bestIdx).trim();\r\n const rest = line.slice(bestIdx + bestToken.token.length);\r\n const colonIdx = rest.indexOf(':');\r\n if (colonIdx === -1) return null;\r\n let to = rest.slice(0, colonIdx).trim();\r\n const label = rest.slice(colonIdx + 1).trim();\r\n if (!from || !to || !label) return null;\r\n\r\n // Strip leading activation modifier from `to` (e.g. `+Auth` → `Auth`).\r\n if (to.startsWith('+') || to.startsWith('-')) to = to.slice(1).trim();\r\n return { from, to, arrow: bestToken.arrow, label };\r\n}\r\n\r\nexport function parseSequence(source: string): SequenceIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const ir: SequenceIR = { type: 'sequence', participants: [], steps: [] };\r\n const ensureParticipant = (id: string, label?: string) => {\r\n const existing = ir.participants.find((p) => p.id === id);\r\n if (existing) {\r\n if (label && existing.label === existing.id) existing.label = label;\r\n return;\r\n }\r\n ir.participants.push({ id, label: label ?? id });\r\n };\r\n\r\n for (const line of lines) {\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^sequencediagram\\b/i.test(line)) continue;\r\n\r\n // Skip control-flow keywords / activations — we don't model them yet but\r\n // we shouldn't try to parse them as messages either.\r\n if (/^(loop|alt|opt|par|else|critical|break|rect|end|activate|deactivate|autonumber|box)\\b/i.test(line)) continue;\r\n\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n ir.title = titleMatch[1].trim();\r\n continue;\r\n }\r\n\r\n // Participant: `participant ID` or `participant ID as Label` or\r\n // `participant \"Quoted Name\"` or `actor User`.\r\n const partMatch = line.match(/^(?:participant|actor)\\s+(.+)$/i);\r\n if (partMatch) {\r\n const rest = partMatch[1].trim();\r\n const asMatch = rest.match(/^(.+?)\\s+as\\s+(.+)$/i);\r\n if (asMatch) {\r\n ensureParticipant(stripQuotes(asMatch[1].trim()), stripQuotes(asMatch[2].trim()));\r\n } else {\r\n ensureParticipant(stripQuotes(rest));\r\n }\r\n continue;\r\n }\r\n\r\n const noteMatch = line.match(/^note\\s+(left of|right of|over)\\s+([^:]+)\\s*:\\s*(.+)$/i);\r\n if (noteMatch) {\r\n const sideRaw = noteMatch[1].toLowerCase();\r\n const side = sideRaw.startsWith('left') ? 'left' : sideRaw.startsWith('right') ? 'right' : 'over';\r\n const participants = noteMatch[2]\r\n .split(',')\r\n .map((p) => p.trim())\r\n .filter(Boolean);\r\n participants.forEach((p) => ensureParticipant(p));\r\n const note: SequenceNote = { kind: 'note', side, participants, text: noteMatch[3].trim() };\r\n ir.steps.push(note);\r\n continue;\r\n }\r\n\r\n const arrowMatch = matchSequenceArrow(line);\r\n if (arrowMatch) {\r\n ensureParticipant(arrowMatch.from);\r\n ensureParticipant(arrowMatch.to);\r\n const msg: SequenceMessage = {\r\n kind: 'message',\r\n from: arrowMatch.from,\r\n to: arrowMatch.to,\r\n arrow: arrowMatch.arrow,\r\n label: arrowMatch.label,\r\n };\r\n ir.steps.push(msg);\r\n }\r\n }\r\n return ir;\r\n}\r\n\r\n// Re-export Step type for renderer convenience\r\nexport type { SequenceStep };\r\n\r\n// ── Class diagram parser ─────────────────────────────────────────────────\r\n// classDiagram\r\n// Animal <|-- Duck\r\n// class Animal {\r\n// +int age\r\n// +String gender\r\n// +isMammal()\r\n// }\r\n\r\nconst CLASS_VISIBILITY: Record<string, ClassVisibility> = {\r\n '+': 'public',\r\n '-': 'private',\r\n '#': 'protected',\r\n '~': 'package',\r\n};\r\n\r\nconst CLASS_REL_PATTERNS: { re: RegExp; kind: ClassRelationKind; reversed?: boolean }[] = [\r\n { re: /^([\\w-]+)\\s*<\\|--\\s*([\\w-]+)$/, kind: 'inheritance', reversed: true },\r\n { re: /^([\\w-]+)\\s*--\\|>\\s*([\\w-]+)$/, kind: 'inheritance' },\r\n { re: /^([\\w-]+)\\s*<\\|\\.\\.\\s*([\\w-]+)$/, kind: 'realization', reversed: true },\r\n { re: /^([\\w-]+)\\s*\\.\\.\\|>\\s*([\\w-]+)$/, kind: 'realization' },\r\n { re: /^([\\w-]+)\\s*\\*--\\s*([\\w-]+)$/, kind: 'composition' },\r\n { re: /^([\\w-]+)\\s*o--\\s*([\\w-]+)$/, kind: 'aggregation' },\r\n { re: /^([\\w-]+)\\s*<\\.\\.\\s*([\\w-]+)$/, kind: 'dependency', reversed: true },\r\n { re: /^([\\w-]+)\\s*\\.\\.>\\s*([\\w-]+)$/, kind: 'dependency' },\r\n { re: /^([\\w-]+)\\s*--\\s*([\\w-]+)$/, kind: 'association' },\r\n];\r\n\r\nexport function parseClassDiagram(source: string): ClassDiagramIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const classes = new Map<string, ClassNode>();\r\n const relations: ClassRelation[] = [];\r\n\r\n const ensureClass = (id: string): ClassNode => {\r\n let cls = classes.get(id);\r\n if (!cls) {\r\n cls = { id, label: id, members: [] };\r\n classes.set(id, cls);\r\n }\r\n return cls;\r\n };\r\n\r\n // Track open `class X { ... }` block\r\n let currentClassBody: string | null = null;\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^classdiagram\\b/i.test(line)) continue;\r\n\r\n if (currentClassBody) {\r\n if (/^\\}\\s*$/.test(line)) {\r\n currentClassBody = null;\r\n continue;\r\n }\r\n const stereotype = matchStereotype(line);\r\n if (stereotype) {\r\n ensureClass(currentClassBody).stereotype = stereotype;\r\n continue;\r\n }\r\n const member = parseClassMember(line);\r\n if (member) ensureClass(currentClassBody).members.push(member);\r\n continue;\r\n }\r\n\r\n // class X { ... } — same-line opening\r\n const sameLine = line.match(/^class\\s+([\\w-]+)\\s*\\{(.*)\\}\\s*$/);\r\n if (sameLine) {\r\n const cls = ensureClass(sameLine[1]);\r\n const inner = sameLine[2].split(/[;\\n]/).map((s) => s.trim()).filter(Boolean);\r\n for (const part of inner) {\r\n const stereotype = matchStereotype(part);\r\n if (stereotype) {\r\n cls.stereotype = stereotype;\r\n continue;\r\n }\r\n const m = parseClassMember(part);\r\n if (m) cls.members.push(m);\r\n }\r\n continue;\r\n }\r\n\r\n // class X { — multi-line\r\n const open = line.match(/^class\\s+([\\w-]+)\\s*\\{$/);\r\n if (open) {\r\n ensureClass(open[1]);\r\n currentClassBody = open[1];\r\n continue;\r\n }\r\n\r\n // class X — declaration only\r\n const decl = line.match(/^class\\s+([\\w-]+)$/);\r\n if (decl) {\r\n ensureClass(decl[1]);\r\n continue;\r\n }\r\n\r\n // X : +member / X : <<interface>> — mermaid-style shorthand\r\n const memberDecl = line.match(/^([\\w-]+)\\s*:\\s*(.+)$/);\r\n if (memberDecl && !line.includes('-->') && !line.includes('--')) {\r\n const stereotype = matchStereotype(memberDecl[2]);\r\n if (stereotype) {\r\n ensureClass(memberDecl[1]).stereotype = stereotype;\r\n continue;\r\n }\r\n const m = parseClassMember(memberDecl[2]);\r\n if (m) ensureClass(memberDecl[1]).members.push(m);\r\n continue;\r\n }\r\n\r\n // Try relations (most specific first)\r\n let labelPart: string | undefined;\r\n let relLine = line;\r\n const labelMatch = line.match(/^(.+?)\\s*:\\s*(.+)$/);\r\n if (labelMatch && /(<\\|--|--\\|>|<\\|\\.\\.|\\.\\.\\|>|\\*--|o--|<\\.\\.|\\.\\.>|--)/.test(labelMatch[1])) {\r\n relLine = labelMatch[1];\r\n labelPart = labelMatch[2].trim();\r\n }\r\n for (const { re, kind, reversed } of CLASS_REL_PATTERNS) {\r\n const m = relLine.match(re);\r\n if (m) {\r\n const a = m[1];\r\n const b = m[2];\r\n ensureClass(a);\r\n ensureClass(b);\r\n relations.push({\r\n source: reversed ? b : a,\r\n target: reversed ? a : b,\r\n kind,\r\n label: labelPart,\r\n });\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return { type: 'class', classes: [...classes.values()], relations };\r\n}\r\n\r\nfunction matchStereotype(text: string): string | undefined {\r\n const m = text.trim().match(/^<<\\s*([^>]+?)\\s*>>$/);\r\n return m ? m[1] : undefined;\r\n}\r\n\r\nfunction parseClassMember(text: string): ClassMember | null {\r\n const t = text.trim();\r\n if (!t) return null;\r\n let visibility: ClassVisibility | undefined;\r\n let body = t;\r\n const first = body[0];\r\n if (first in CLASS_VISIBILITY) {\r\n visibility = CLASS_VISIBILITY[first];\r\n body = body.slice(1).trim();\r\n }\r\n // Method: ends with parens (with optional return type after)\r\n const methodMatch = body.match(/^([\\w-]+)\\(([^)]*)\\)(?:\\s*([\\w<>[\\]]+))?$/);\r\n if (methodMatch) {\r\n return {\r\n kind: 'method',\r\n visibility,\r\n name: methodMatch[1],\r\n parameters: methodMatch[2] || undefined,\r\n returnType: methodMatch[3] || undefined,\r\n };\r\n }\r\n // Attribute: \"Type name\" OR \"name : Type\"\r\n const colonMatch = body.match(/^([\\w-]+)\\s*:\\s*([\\w<>[\\]]+)$/);\r\n if (colonMatch) {\r\n return { kind: 'attribute', visibility, name: colonMatch[1], returnType: colonMatch[2] };\r\n }\r\n const typeNameMatch = body.match(/^([\\w<>[\\]]+)\\s+([\\w-]+)$/);\r\n if (typeNameMatch) {\r\n return { kind: 'attribute', visibility, name: typeNameMatch[2], returnType: typeNameMatch[1] };\r\n }\r\n // Bare name fallback\r\n return { kind: 'attribute', visibility, name: body };\r\n}\r\n\r\n// ── State diagram parser ─────────────────────────────────────────────────\r\n// stateDiagram-v2\r\n// [*] --> Still\r\n// Still --> Moving : start\r\n// Moving --> [*]\r\n\r\nexport function parseStateDiagram(source: string): StateDiagramIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const states = new Map<string, StateNode>();\r\n const transitions: StateDiagramIR['transitions'] = [];\r\n // Stack of composite-state ids; top of stack is the current parent.\r\n const parentStack: string[] = [];\r\n\r\n const currentParent = (): string | undefined =>\r\n parentStack.length > 0 ? parentStack[parentStack.length - 1] : undefined;\r\n\r\n // Markers are scoped per composite so each composite gets its own\r\n // start/end (otherwise [*] inside a composite collapses onto the global\r\n // start marker and the diagram's structure breaks).\r\n const markerId = (kind: 'start' | 'end', parent?: string) =>\r\n parent ? `__${kind}_${parent}` : `__${kind}`;\r\n\r\n const ensureMarker = (kind: 'start' | 'end'): StateNode => {\r\n const parent = currentParent();\r\n const id = markerId(kind, parent);\r\n let s = states.get(id);\r\n if (!s) {\r\n s = { id, label: '', kind, parent };\r\n states.set(id, s);\r\n }\r\n return s;\r\n };\r\n\r\n const ensureState = (id: string): StateNode => {\r\n let s = states.get(id);\r\n if (s) return s;\r\n s = { id, label: id, kind: 'state', parent: currentParent() };\r\n states.set(id, s);\r\n return s;\r\n };\r\n\r\n for (const line of lines) {\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^statediagram(-v2)?\\b/i.test(line)) continue;\r\n\r\n // Composite state opening: `state X {`\r\n const compositeOpen = line.match(/^state\\s+([\\w-]+)\\s*\\{$/);\r\n if (compositeOpen) {\r\n const id = compositeOpen[1];\r\n const existing = states.get(id);\r\n if (existing) {\r\n existing.kind = 'composite';\r\n } else {\r\n states.set(id, { id, label: id, kind: 'composite', parent: currentParent() });\r\n }\r\n parentStack.push(id);\r\n continue;\r\n }\r\n // Composite close\r\n if (line === '}') {\r\n parentStack.pop();\r\n continue;\r\n }\r\n\r\n const arrow = line.match(/^(\\[\\*\\]|[\\w-]+)\\s*-->\\s*(\\[\\*\\]|[\\w-]+)(?:\\s*:\\s*(.+))?$/);\r\n if (arrow) {\r\n const src = arrow[1] === '[*]' ? ensureMarker('start') : ensureState(arrow[1]);\r\n const tgt = arrow[2] === '[*]' ? ensureMarker('end') : ensureState(arrow[2]);\r\n transitions.push({\r\n source: src.id,\r\n target: tgt.id,\r\n label: arrow[3]?.trim(),\r\n parent: currentParent(),\r\n });\r\n continue;\r\n }\r\n\r\n // State: stateName : description\r\n const stateLabel = line.match(/^([\\w-]+)\\s*:\\s*(.+)$/);\r\n if (stateLabel) {\r\n const s = ensureState(stateLabel[1]);\r\n s.label = stateLabel[2].trim();\r\n continue;\r\n }\r\n\r\n // Bare state declaration\r\n if (/^[\\w-]+$/.test(line)) ensureState(line);\r\n }\r\n\r\n return { type: 'state', states: [...states.values()], transitions };\r\n}\r\n\r\n// ── Mermaid erDiagram parser → ParsedSchema ──────────────────────────────\r\n// erDiagram\r\n// CUSTOMER ||--o{ ORDER : places\r\n// CUSTOMER {\r\n// string name\r\n// string email PK\r\n// }\r\n\r\nexport function parseMermaidERDiagram(source: string): ERDiagramIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const tables = new Map<string, DbTable>();\r\n const relations: DbRelation[] = [];\r\n\r\n const ensureTable = (name: string): DbTable => {\r\n let t = tables.get(name);\r\n if (!t) {\r\n t = { name, columns: [] };\r\n tables.set(name, t);\r\n }\r\n return t;\r\n };\r\n\r\n let currentTableBody: string | null = null;\r\n\r\n for (const line of lines) {\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^erdiagram\\b/i.test(line)) continue;\r\n\r\n if (currentTableBody) {\r\n if (/^\\}\\s*$/.test(line)) {\r\n currentTableBody = null;\r\n continue;\r\n }\r\n // Column: \"type name [PK|FK]\" or \"type name PK,FK\"\r\n const col = line.match(/^([\\w-]+)\\s+([\\w-]+)(?:\\s+(.+))?$/);\r\n if (col) {\r\n const flags = (col[3] ?? '').toUpperCase();\r\n const column: DbColumn = {\r\n name: col[2],\r\n type: col[1],\r\n isPK: /\\bPK\\b/.test(flags),\r\n isFK: /\\bFK\\b/.test(flags),\r\n isNullable: !/\\bNOT NULL\\b/.test(flags),\r\n isUnique: /\\bUK\\b/.test(flags) || /\\bUNIQUE\\b/.test(flags),\r\n };\r\n ensureTable(currentTableBody).columns.push(column);\r\n }\r\n continue;\r\n }\r\n\r\n // Table block opening: TABLE { ... }\r\n const blockOpen = line.match(/^([A-Z][\\w-]*)\\s*\\{$/);\r\n if (blockOpen) {\r\n ensureTable(blockOpen[1]);\r\n currentTableBody = blockOpen[1];\r\n continue;\r\n }\r\n\r\n // Relation: CUSTOMER ||--o{ ORDER : places\r\n const rel = line.match(/^([A-Z][\\w-]*)\\s+([|}{o\\-.]+)\\s+([A-Z][\\w-]*)\\s*:\\s*(.+)$/);\r\n if (rel) {\r\n const fromTable = rel[1];\r\n const toTable = rel[3];\r\n const cardinality = rel[2];\r\n ensureTable(fromTable);\r\n ensureTable(toTable);\r\n // Use the relation label as the FK column name surrogate\r\n relations.push({\r\n fromTable,\r\n fromCol: rel[4].trim(),\r\n toTable,\r\n toCol: rel[4].trim(),\r\n nullable: cardinality.includes('o'),\r\n });\r\n }\r\n }\r\n\r\n const schema: ParsedSchema = {\r\n tables: [...tables.values()],\r\n relations,\r\n inputFormat: 'unknown',\r\n };\r\n return { type: 'er', schema };\r\n}\r\n\r\n// ── Gantt parser ─────────────────────────────────────────────────────────\r\n// gantt\r\n// title A Gantt Diagram\r\n// dateFormat YYYY-MM-DD\r\n// section Section\r\n// Task A :a1, 2026-01-01, 30d\r\n// Task B :after a1, 20d\r\n// Done task :done, des2, 2026-01-08, 5d\r\n// Active task :active, des3, after des2, 10d\r\n// Critical :crit, des4, 2026-01-22, 2d\r\n// Milestone :milestone, m1, 2026-02-01, 0d\r\n\r\nconst GANTT_TASK_LINE_RE = /^([^:]+?)\\s*:\\s*(.+)$/;\r\n\r\ninterface GanttIntermediate {\r\n id: string;\r\n label: string;\r\n status: GanttItemStatus;\r\n /** Either an ISO date or `after <id>`; resolved in pass 2. */\r\n startSpec: string;\r\n /** `<n>d`, `<n>h`, or an ISO date marking the end. */\r\n durationOrEnd: string;\r\n section?: string;\r\n}\r\n\r\nconst STATUS_TOKENS: Record<string, GanttItemStatus> = {\r\n done: 'done',\r\n active: 'active',\r\n crit: 'crit',\r\n milestone: 'milestone',\r\n};\r\n\r\nexport function parseGantt(source: string): GanttDiagramIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const ir: GanttDiagramIR = { type: 'gantt', tasks: [] };\r\n const intermediates: GanttIntermediate[] = [];\r\n let currentSection: string | undefined;\r\n let anonCounter = 0;\r\n\r\n for (const line of lines) {\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^gantt\\b/i.test(line)) continue;\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n ir.title = titleMatch[1].trim();\r\n continue;\r\n }\r\n const dateMatch = line.match(/^dateFormat\\s+(.+)$/i);\r\n if (dateMatch) {\r\n ir.dateFormat = dateMatch[1].trim();\r\n continue;\r\n }\r\n const axisMatch = line.match(/^axisFormat\\s+(.+)$/i);\r\n if (axisMatch) {\r\n ir.axisFormat = axisMatch[1].trim();\r\n continue;\r\n }\r\n const sectionMatch = line.match(/^section\\s+(.+)$/i);\r\n if (sectionMatch) {\r\n currentSection = sectionMatch[1].trim();\r\n continue;\r\n }\r\n // Skip directives we don't model\r\n if (/^(excludes|includes|todayMarker|click|tickInterval|weekday)\\b/i.test(line)) continue;\r\n\r\n const taskMatch = line.match(GANTT_TASK_LINE_RE);\r\n if (!taskMatch) continue;\r\n const label = taskMatch[1].trim();\r\n const parts = taskMatch[2].split(',').map((p) => p.trim()).filter(Boolean);\r\n if (parts.length === 0) continue;\r\n\r\n let status: GanttItemStatus = 'default';\r\n let id: string | undefined;\r\n let startSpec: string | undefined;\r\n let durationOrEnd: string | undefined;\r\n\r\n for (const part of parts) {\r\n const lower = part.toLowerCase();\r\n if (lower in STATUS_TOKENS) {\r\n status = STATUS_TOKENS[lower];\r\n continue;\r\n }\r\n if (id === undefined && /^[\\w-]+$/.test(part) && !isDateLike(part) && !/^\\d/.test(part)) {\r\n id = part;\r\n continue;\r\n }\r\n if (startSpec === undefined) {\r\n startSpec = part;\r\n continue;\r\n }\r\n if (durationOrEnd === undefined) {\r\n durationOrEnd = part;\r\n continue;\r\n }\r\n }\r\n if (!startSpec || !durationOrEnd) continue;\r\n intermediates.push({\r\n id: id ?? `__gantt_${anonCounter++}`,\r\n label,\r\n status,\r\n startSpec,\r\n durationOrEnd,\r\n section: currentSection,\r\n });\r\n }\r\n\r\n // Pass 2: resolve `after <id>` and durations into ISO start/end.\r\n const byId = new Map<string, GanttTask>();\r\n for (const it of intermediates) {\r\n const start = resolveGanttDate(it.startSpec, byId);\r\n if (!start) continue;\r\n let end = resolveGanttDate(it.durationOrEnd, byId);\r\n if (!end) {\r\n end = applyGanttDuration(start, it.durationOrEnd);\r\n }\r\n if (!end) continue;\r\n if (it.status === 'milestone') end = start;\r\n const task: GanttTask = {\r\n id: it.id,\r\n label: it.label,\r\n start: toIsoDay(start),\r\n end: toIsoDay(end),\r\n status: it.status,\r\n section: it.section,\r\n };\r\n ir.tasks.push(task);\r\n byId.set(it.id, task);\r\n }\r\n return ir;\r\n}\r\n\r\nfunction isDateLike(s: string): boolean {\r\n return /^\\d{4}-\\d{2}-\\d{2}/.test(s);\r\n}\r\n\r\nfunction resolveGanttDate(spec: string, byId: Map<string, GanttTask>): Date | null {\r\n if (isDateLike(spec)) {\r\n const d = new Date(spec);\r\n return isNaN(d.getTime()) ? null : d;\r\n }\r\n const after = spec.match(/^after\\s+(.+)$/i);\r\n if (after) {\r\n const refIds = after[1].split(/\\s+/);\r\n let max: Date | null = null;\r\n for (const refId of refIds) {\r\n const ref = byId.get(refId);\r\n if (!ref) continue;\r\n const d = new Date(ref.end);\r\n if (!max || d.getTime() > max.getTime()) max = d;\r\n }\r\n return max;\r\n }\r\n return null;\r\n}\r\n\r\nfunction applyGanttDuration(start: Date, dur: string): Date | null {\r\n const m = dur.match(/^(\\d+(?:\\.\\d+)?)\\s*(d|h|w|m|y)$/i);\r\n if (!m) return null;\r\n const n = parseFloat(m[1]);\r\n const unit = m[2].toLowerCase();\r\n const result = new Date(start);\r\n switch (unit) {\r\n case 'h':\r\n result.setHours(result.getHours() + n);\r\n break;\r\n case 'd':\r\n result.setDate(result.getDate() + n);\r\n break;\r\n case 'w':\r\n result.setDate(result.getDate() + n * 7);\r\n break;\r\n case 'm':\r\n result.setMonth(result.getMonth() + n);\r\n break;\r\n case 'y':\r\n result.setFullYear(result.getFullYear() + n);\r\n break;\r\n default:\r\n return null;\r\n }\r\n return result;\r\n}\r\n\r\nfunction toIsoDay(d: Date): string {\r\n return d.toISOString();\r\n}\r\n\r\n// ── Timeline parser ──────────────────────────────────────────────────────\r\n// timeline\r\n// title History of Web\r\n// section Pre-2000\r\n// 1989 : Tim Berners-Lee invents the Web\r\n// 1993 : Mosaic browser\r\n// section 2000s\r\n// 2003 : MySpace\r\n// 2004 : Facebook : Gmail\r\n\r\nexport function parseTimeline(source: string): TimelineIR {\r\n const lines = source.split('\\n');\r\n const ir: TimelineIR = { type: 'timeline', events: [] };\r\n let currentSection: string | undefined;\r\n let counter = 0;\r\n\r\n for (const rawLine of lines) {\r\n const line = rawLine.trim();\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^timeline\\b/i.test(line)) continue;\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n ir.title = titleMatch[1].trim();\r\n continue;\r\n }\r\n const sectionMatch = line.match(/^section\\s+(.+)$/i);\r\n if (sectionMatch) {\r\n currentSection = sectionMatch[1].trim();\r\n continue;\r\n }\r\n // `period : event [: event2 : event3]`\r\n const parts = line.split(':').map((p) => p.trim()).filter(Boolean);\r\n if (parts.length < 2) continue;\r\n const period = parts[0];\r\n for (let i = 1; i < parts.length; i++) {\r\n const event: TimelineEvent = {\r\n id: `__tl_${counter++}`,\r\n period,\r\n text: parts[i],\r\n section: currentSection,\r\n };\r\n ir.events.push(event);\r\n }\r\n }\r\n return ir;\r\n}\r\n\r\n// ── Mindmap parser ───────────────────────────────────────────────────────\r\n// mindmap\r\n// root((Mindmap))\r\n// Origins\r\n// Long history\r\n// Popularisation\r\n// British popular psychology author Tony Buzan\r\n// Research\r\n// On effectiveness<br/>and features\r\n// On Automatic creation\r\n//\r\n// Uses leading-whitespace indentation to determine parent/child links.\r\n\r\nconst MINDMAP_SHAPE_PATTERNS: { re: RegExp; shape: MindmapShape }[] = [\r\n { re: /^([\\w-]*)\\(\\(([^)]*)\\)\\)$/, shape: 'circle' }, // ((text))\r\n { re: /^([\\w-]*)\\)\\)([^(]*)\\(\\($/, shape: 'bang' }, // ))text(( bang\r\n { re: /^([\\w-]*)\\)([^(]*)\\($/, shape: 'cloud' }, // )text( cloud\r\n { re: /^([\\w-]*)\\{\\{([^}]*)\\}\\}$/, shape: 'hexagon' }, // {{text}}\r\n { re: /^([\\w-]*)\\(([^)]*)\\)$/, shape: 'rounded' }, // (text)\r\n { re: /^([\\w-]*)\\[([^\\]]*)\\]$/, shape: 'square' }, // [text]\r\n];\r\n\r\ninterface RawMindmapLine {\r\n indent: number;\r\n raw: string;\r\n}\r\n\r\nexport function parseMindmap(source: string): MindmapIR {\r\n const rawLines = source.split('\\n');\r\n const stripped: RawMindmapLine[] = [];\r\n\r\n let inHeader = true;\r\n for (const line of rawLines) {\r\n if (line.trim().length === 0) continue;\r\n if (inHeader && /^\\s*mindmap\\b/i.test(line)) {\r\n inHeader = false;\r\n continue;\r\n }\r\n inHeader = false;\r\n if (line.trim().startsWith('%%')) continue;\r\n const indent = (line.match(/^\\s*/)?.[0]?.length ?? 0);\r\n stripped.push({ indent, raw: line.trim() });\r\n }\r\n\r\n if (stripped.length === 0) {\r\n return {\r\n type: 'mindmap',\r\n root: { id: '__mm_0', label: 'Mindmap', shape: 'default', children: [] },\r\n };\r\n }\r\n\r\n let counter = 0;\r\n const makeNode = (raw: string): MindmapNode => {\r\n let label = raw;\r\n let shape: MindmapShape = 'default';\r\n let icon: string | undefined;\r\n\r\n // Strip `::icon(...)` suffix (mermaid icon syntax)\r\n const iconMatch = label.match(/^(.*?)\\s*::icon\\(([^)]+)\\)\\s*$/);\r\n if (iconMatch) {\r\n label = iconMatch[1].trim();\r\n icon = iconMatch[2].trim();\r\n }\r\n\r\n for (const { re, shape: s } of MINDMAP_SHAPE_PATTERNS) {\r\n const m = label.match(re);\r\n if (m) {\r\n label = m[2].trim() || m[1].trim();\r\n shape = s;\r\n break;\r\n }\r\n }\r\n const node: MindmapNode = {\r\n id: `__mm_${counter++}`,\r\n label,\r\n shape,\r\n children: [],\r\n };\r\n if (icon) node.icon = icon;\r\n return node;\r\n };\r\n\r\n // Build tree using indent levels. Root = first line's indent.\r\n const rootEntry = stripped[0];\r\n const root = makeNode(rootEntry.raw);\r\n const stack: { indent: number; node: MindmapNode }[] = [{ indent: rootEntry.indent, node: root }];\r\n\r\n for (let i = 1; i < stripped.length; i++) {\r\n const { indent, raw } = stripped[i];\r\n while (stack.length > 0 && stack[stack.length - 1].indent >= indent) stack.pop();\r\n const parent = stack.length > 0 ? stack[stack.length - 1].node : root;\r\n const node = makeNode(raw);\r\n parent.children.push(node);\r\n stack.push({ indent, node });\r\n }\r\n\r\n return { type: 'mindmap', root };\r\n}\r\n\r\n// ── Architecture-beta parser ─────────────────────────────────────────────\r\n// architecture-beta\r\n// group api(cloud)[API]\r\n// service db(database)[Postgres] in api\r\n// service web(server)[Web]\r\n// db:L --> R:web\r\n\r\nconst ARCH_DECL_RE =\r\n /^(group|service)\\s+([\\w-]+)\\s*(?:\\(([^)]+)\\))?\\s*(?:\\[([^\\]]+)\\])?\\s*(?:in\\s+([\\w-]+))?\\s*$/i;\r\nconst ARCH_EDGE_RE =\r\n /^([\\w-]+)(?::([LRTB]))?\\s*(?:--|<-->|<--|-->|<-|->)\\s*(?:([LRTB]):)?([\\w-]+)(?:\\s*\\[([^\\]]+)\\])?$/i;\r\n\r\nexport function parseArchitecture(source: string): ArchitectureIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const nodes: ArchitectureNode[] = [];\r\n const edges: ArchitectureEdge[] = [];\r\n\r\n for (const line of lines) {\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^architecture(-beta)?\\b/i.test(line)) continue;\r\n if (/^title\\b/i.test(line)) continue;\r\n\r\n const decl = line.match(ARCH_DECL_RE);\r\n if (decl) {\r\n const [, kind, id, icon, label, parent] = decl;\r\n nodes.push({\r\n id,\r\n kind: kind.toLowerCase() === 'group' ? 'group' : 'service',\r\n label: label?.trim() || id,\r\n icon: icon?.trim() || undefined,\r\n parent: parent?.trim() || undefined,\r\n });\r\n continue;\r\n }\r\n const edge = line.match(ARCH_EDGE_RE);\r\n if (edge) {\r\n const [, source, sourceSide, targetSide, target, label] = edge;\r\n edges.push({\r\n source,\r\n target,\r\n sourceSide: (sourceSide?.toUpperCase() as ArchSide | undefined) ?? undefined,\r\n targetSide: (targetSide?.toUpperCase() as ArchSide | undefined) ?? undefined,\r\n label: label?.trim() || undefined,\r\n });\r\n }\r\n }\r\n return { type: 'architecture', nodes, edges };\r\n}\r\n\r\n// ── C4 parser ────────────────────────────────────────────────────────────\r\n// C4Context / C4Container / C4Component / C4Deployment\r\n// title System Context Diagram\r\n// Person(user, \"User\", \"End user\")\r\n// System(app, \"App\", \"Main app\")\r\n// System_Ext(ext, \"External\", \"3rd party\")\r\n// Rel(user, app, \"Uses\", \"HTTPS\")\r\n// System_Boundary(b1, \"Org\") { ... }\r\n\r\nconst C4_VARIANT_RE = /^C4(Context|Container|Component|Deployment)\\b/i;\r\nconst C4_ELEMENT_RE =\r\n /^([A-Z][\\w_]*)\\s*\\(\\s*([^,)]+)(?:\\s*,\\s*\"([^\"]*)\")?(?:\\s*,\\s*\"([^\"]*)\")?(?:\\s*,\\s*\"([^\"]*)\")?(?:\\s*,\\s*\"([^\"]*)\")?\\s*\\)\\s*\\{?\\s*$/;\r\nconst C4_REL_RE =\r\n /^(Rel|BiRel|Rel_Back|Rel_Up|Rel_Down|Rel_Left|Rel_Right)\\s*\\(\\s*([\\w_]+)\\s*,\\s*([\\w_]+)\\s*(?:,\\s*\"([^\"]*)\")?(?:\\s*,\\s*\"([^\"]*)\")?\\s*\\)\\s*$/i;\r\n\r\nconst C4_KIND_MAP: Record<string, C4ElementKind> = {\r\n Person: 'person',\r\n Person_Ext: 'person-external',\r\n System: 'system',\r\n System_Ext: 'system-external',\r\n SystemDb: 'system-db',\r\n SystemDb_Ext: 'system-db',\r\n SystemQueue: 'system-queue',\r\n SystemQueue_Ext: 'system-queue',\r\n Container: 'container',\r\n Container_Ext: 'container-external',\r\n ContainerDb: 'container-db',\r\n ContainerDb_Ext: 'container-db',\r\n ContainerQueue: 'container-queue',\r\n Component: 'component',\r\n Component_Ext: 'component-external',\r\n ComponentDb: 'component-db',\r\n ComponentQueue: 'component-queue',\r\n Boundary: 'boundary',\r\n System_Boundary: 'system-boundary',\r\n Container_Boundary: 'container-boundary',\r\n Enterprise_Boundary: 'enterprise-boundary',\r\n Node: 'node',\r\n Deployment_Node: 'node',\r\n};\r\n\r\nexport function parseC4(source: string): C4IR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const elements: C4Element[] = [];\r\n const relations: C4IR['relations'] = [];\r\n let variant: C4Variant = 'context';\r\n let title: string | undefined;\r\n const boundaryStack: string[] = [];\r\n\r\n for (const rawLine of lines) {\r\n let line = rawLine;\r\n if (!line || line.startsWith('%%')) continue;\r\n const v = line.match(C4_VARIANT_RE);\r\n if (v) {\r\n const t = v[1].toLowerCase();\r\n variant = (t === 'context' ? 'context'\r\n : t === 'container' ? 'container'\r\n : t === 'component' ? 'component'\r\n : 'deployment');\r\n continue;\r\n }\r\n const titleMatch = line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n title = titleMatch[1].trim();\r\n continue;\r\n }\r\n\r\n // Boundary close\r\n if (line === '}') {\r\n boundaryStack.pop();\r\n continue;\r\n }\r\n\r\n const rel = line.match(C4_REL_RE);\r\n if (rel) {\r\n const [, , src, tgt, label, technology] = rel;\r\n relations.push({ source: src, target: tgt, label, technology });\r\n continue;\r\n }\r\n\r\n const el = line.match(C4_ELEMENT_RE);\r\n if (el) {\r\n const [, type, id, ...rest] = el;\r\n const kind = C4_KIND_MAP[type] ?? 'system';\r\n const label = rest[0] ?? id;\r\n // For boundaries: label is the only string after id\r\n // For elements with tech: order is label, technology, description\r\n const isBoundary = kind.endsWith('boundary') || kind === 'node';\r\n const technology = !isBoundary ? rest[1] : undefined;\r\n const description = !isBoundary ? rest[2] : rest[1];\r\n elements.push({\r\n id,\r\n kind,\r\n label: label.trim(),\r\n technology: technology?.trim(),\r\n description: description?.trim(),\r\n parent: boundaryStack.length > 0 ? boundaryStack[boundaryStack.length - 1] : undefined,\r\n });\r\n // If this line opens a boundary (ends with `{`), push it.\r\n if (line.endsWith('{') && isBoundary) {\r\n boundaryStack.push(id);\r\n }\r\n }\r\n }\r\n return { type: 'c4', variant, title, elements, relations };\r\n}\r\n\r\n// ── GitGraph parser ──────────────────────────────────────────────────────\r\n// gitGraph\r\n// commit\r\n// branch develop\r\n// checkout develop\r\n// commit id: \"fix\"\r\n// commit tag: \"v1.0\"\r\n// checkout main\r\n// merge develop\r\n\r\nexport function parseGitGraph(source: string): GitGraphIR {\r\n const lines = source.split('\\n').map((l) => l.trim());\r\n const ops: GitGraphOp[] = [];\r\n let title: string | undefined;\r\n\r\n for (const line of lines) {\r\n if (!line || line.startsWith('%%')) continue;\r\n if (/^gitgraph\\b/i.test(line) || /^---/.test(line)) continue;\r\n const titleMatch = line.match(/^title:\\s*(.+)$/i) || line.match(/^title\\s+(.+)$/i);\r\n if (titleMatch) {\r\n title = titleMatch[1].trim();\r\n continue;\r\n }\r\n\r\n // commit [id: \"x\"] [tag: \"y\"] [type: HIGHLIGHT|REVERSE|NORMAL]\r\n const commit = line.match(/^commit\\b(.*)$/i);\r\n if (commit) {\r\n const rest = commit[1];\r\n const idMatch = rest.match(/id:\\s*\"([^\"]+)\"/);\r\n const tagMatch = rest.match(/tag:\\s*\"([^\"]+)\"/);\r\n const typeMatch = rest.match(/type:\\s*(HIGHLIGHT|REVERSE|NORMAL)/);\r\n ops.push({\r\n kind: 'commit',\r\n id: idMatch?.[1],\r\n tag: tagMatch?.[1],\r\n type: typeMatch ? (typeMatch[1] as 'NORMAL' | 'REVERSE' | 'HIGHLIGHT') : 'NORMAL',\r\n });\r\n continue;\r\n }\r\n const branch = line.match(/^branch\\s+([\\w/-]+)/i);\r\n if (branch) {\r\n ops.push({ kind: 'branch', name: branch[1] });\r\n continue;\r\n }\r\n const checkout = line.match(/^(?:checkout|switch)\\s+([\\w/-]+)/i);\r\n if (checkout) {\r\n ops.push({ kind: 'checkout', name: checkout[1] });\r\n continue;\r\n }\r\n const merge = line.match(/^merge\\s+([\\w/-]+)(?:\\s+tag:\\s*\"([^\"]+)\")?/i);\r\n if (merge) {\r\n ops.push({ kind: 'merge', from: merge[1], tag: merge[2] });\r\n continue;\r\n }\r\n const cherry = line.match(/^cherry-pick\\s+id:\\s*\"([^\"]+)\"/i);\r\n if (cherry) {\r\n ops.push({ kind: 'cherry-pick', commitId: cherry[1] });\r\n }\r\n }\r\n return { type: 'gitgraph', title, ops };\r\n}\r\n","// Diagram-renderer registry.\r\n//\r\n// Maps each `DiagramType` to a lazy-loadable renderer factory. The dispatch\r\n// component (<DiagramRenderer/>) looks up the renderer for the parsed IR\r\n// and falls through to mermaid if none is registered.\r\n//\r\n// React types are imported `type`-only so this module stays free of React\r\n// at runtime — registry consumers just shuttle data, not JSX. Renderer\r\n// implementations live alongside the React tree in components/diagrams/.\r\n\r\nimport type { ComponentType, RefObject } from 'react';\r\nimport type {\r\n ArchitectureIR,\r\n C4IR,\r\n ClassDiagramIR,\r\n DiagramIR,\r\n DiagramType,\r\n ERDiagramIR,\r\n FlowchartIR,\r\n GanttDiagramIR,\r\n GitGraphIR,\r\n JourneyIR,\r\n MindmapIR,\r\n PieChartIR,\r\n QuadrantChartIR,\r\n SequenceIR,\r\n StateDiagramIR,\r\n TimelineIR,\r\n} from './types';\r\n\r\n/** What every renderer exposes via a forwarded ref so the export pipeline\r\n * can serialize the diagram to SVG/PNG without knowing the renderer's\r\n * internals. */\r\nexport interface RendererHandle {\r\n /** Returns an SVG element representing the diagram. For renderers that\r\n * produce a single inclusive <svg> (Sequence, Recharts, mermaid fallback)\r\n * this is the live element; for renderers that mix HTML + SVG (ReactFlow,\r\n * vis-timeline) it's a synthetic <svg> wrapping the HTML as foreignObject. */\r\n getSvgElement(): SVGSVGElement | null;\r\n /** Optional HTML container reference, used by the export pipeline as a\r\n * more reliable source for PNG rasterization (canvas + foreignObject is\r\n * unreliable across browsers). */\r\n getHtmlContainer?(): HTMLElement | null;\r\n}\r\n\r\n/** Narrow DiagramIR to the IR variant a particular renderer accepts. */\r\nexport type IRForType<T extends DiagramType> = T extends 'flowchart'\r\n ? FlowchartIR\r\n : T extends 'er'\r\n ? ERDiagramIR\r\n : T extends 'pie'\r\n ? PieChartIR\r\n : T extends 'quadrant'\r\n ? QuadrantChartIR\r\n : T extends 'journey'\r\n ? JourneyIR\r\n : T extends 'sequence'\r\n ? SequenceIR\r\n : T extends 'class'\r\n ? ClassDiagramIR\r\n : T extends 'state'\r\n ? StateDiagramIR\r\n : T extends 'gantt'\r\n ? GanttDiagramIR\r\n : T extends 'timeline'\r\n ? TimelineIR\r\n : T extends 'mindmap'\r\n ? MindmapIR\r\n : T extends 'architecture'\r\n ? ArchitectureIR\r\n : T extends 'c4'\r\n ? C4IR\r\n : T extends 'gitgraph'\r\n ? GitGraphIR\r\n : DiagramIR;\r\n\r\nexport interface RendererProps<T extends DiagramType = DiagramType> {\r\n ir: IRForType<T>;\r\n /** Dark-mode flag; renderers honor it for color tokens. */\r\n dark?: boolean;\r\n /** Ref the renderer will populate with a RendererHandle on mount. */\r\n handleRef?: RefObject<RendererHandle | null>;\r\n}\r\n\r\nexport interface RendererEntry<T extends DiagramType = DiagramType> {\r\n type: T;\r\n /** Lazy loader — only resolved when an IR of this type needs to render. */\r\n loader: () => Promise<{ default: ComponentType<RendererProps<T>> }>;\r\n}\r\n\r\nconst REGISTRY = new Map<DiagramType, RendererEntry>();\r\n\r\nexport function register<T extends DiagramType>(entry: RendererEntry<T>): void {\r\n REGISTRY.set(entry.type, entry as RendererEntry);\r\n}\r\n\r\nexport function getRenderer(type: DiagramType): RendererEntry | null {\r\n return REGISTRY.get(type) ?? null;\r\n}\r\n\r\nexport function hasRenderer(type: DiagramType): boolean {\r\n return REGISTRY.has(type);\r\n}\r\n\r\n/** Reset the registry. Test-only. */\r\nexport function _resetRegistry(): void {\r\n REGISTRY.clear();\r\n}\r\n","import {\n useEffect,\n useState,\n lazy,\n Suspense,\n type LazyExoticComponent,\n type ComponentType,\n type RefObject,\n} from 'react';\nimport { parseToIR } from '../../utils/diagrams/parser';\nimport {\n getRenderer,\n type RendererHandle,\n type RendererProps,\n} from '../../utils/diagrams/registry';\nimport type { DiagramIR, DiagramType, ParseResult } from '../../utils/diagrams/types';\n\n// Cache lazy-loaded renderer components by diagram type so React.lazy is\n// invoked exactly once per type, not every render.\nconst LAZY_RENDERERS = new Map<DiagramType, LazyExoticComponent<ComponentType<RendererProps>>>();\n\nfunction getLazyRenderer(type: DiagramType) {\n let lazyComp = LAZY_RENDERERS.get(type);\n if (lazyComp) return lazyComp;\n const entry = getRenderer(type);\n if (!entry) return null;\n lazyComp = lazy(entry.loader as () => Promise<{ default: ComponentType<RendererProps> }>);\n LAZY_RENDERERS.set(type, lazyComp);\n return lazyComp;\n}\n\ninterface DiagramRendererProps {\n /** Mermaid-syntax source string. */\n source: string;\n /** Dark-mode flag; threaded through to the underlying renderer. */\n dark?: boolean;\n /** Ref to populate with a RendererHandle so the export toolbar can grab the SVG. */\n handleRef?: RefObject<RendererHandle | null>;\n /** Optional `onError` for parse / render failures. */\n onError?: (message: string) => void;\n}\n\n/**\n * Dispatch component. Parses the source to a DiagramIR, then delegates to\n * the matching renderer in the registry.\n *\n * Every diagram type the registry knows about renders natively — there is\n * no mermaid fallback. Unrecognized sources surface a clear error.\n */\nexport default function DiagramRenderer({ source, dark, handleRef, onError }: DiagramRendererProps) {\n const [parsed, setParsed] = useState<ParseResult | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n setParsed(null);\n parseToIR(source).then((result) => {\n if (cancelled) return;\n if (!result.ok && onError) onError(result.error);\n setParsed(result);\n });\n return () => {\n cancelled = true;\n };\n }, [source, onError]);\n\n if (!parsed) {\n return <div className=\"my-4 text-slate-400 text-xs italic\">Parsing diagram…</div>;\n }\n\n if (!parsed.ok) {\n return (\n <div className=\"my-4 p-3 bg-red-50 border border-red-200 rounded-lg text-red-600 text-xs font-mono\">\n Diagram parse error: {parsed.error}\n </div>\n );\n }\n\n const ir: DiagramIR = parsed.ir;\n const lazyRenderer = getLazyRenderer(ir.type);\n if (!lazyRenderer) {\n return (\n <div className=\"my-4 p-3 bg-amber-50 border border-amber-200 rounded-lg text-amber-700 text-xs font-mono\">\n No renderer registered for \"{ir.type}\".\n </div>\n );\n }\n\n const Component = lazyRenderer;\n return (\n <Suspense fallback={<div className=\"my-4 text-slate-400 text-xs italic\">Loading renderer…</div>}>\n <Component ir={ir} dark={dark} handleRef={handleRef} />\n </Suspense>\n );\n}\n","// Centralized SVG/PNG export pipeline for diagrams.\r\n//\r\n// Single source of truth — replaces the parallel implementations that used\r\n// to live inline in MarkdownPreview's MermaidBlock and DiagramGenerator.\r\n// Renderer-agnostic by design: anything that produces a live <svg> element\r\n// or a serialized SVG string can plug in.\r\n//\r\n// \"Same look and feel\" guarantee: when the source is a live DOM element,\r\n// computed CSS styles are walked and copied to inline `style=\"…\"` attributes\r\n// on a cloned tree before serialization. The exported file therefore renders\r\n// identically in any viewer (browser, Inkscape, Office) without depending on\r\n// the host page's stylesheet.\r\n\r\nexport type SvgSource =\r\n | string\r\n | SVGSVGElement\r\n | (() => SVGSVGElement | null);\r\n\r\nexport interface PngOptions {\r\n /** Canvas resolution multiplier. Default: 2 (Retina-friendly). */\r\n scale?: number;\r\n /** Background color. Pass `null` for transparent. Default: `'#ffffff'`. */\r\n background?: string | null;\r\n}\r\n\r\nexport interface SvgStringOptions {\r\n /**\r\n * When the source is a DOM element, copy `getComputedStyle()` values onto\r\n * inline `style=\"…\"` attributes so the standalone SVG carries its own\r\n * presentation. Set to `false` if the source is already self-contained\r\n * (e.g. SVG built by a custom renderer that emits inline attributes).\r\n * Default: true.\r\n */\r\n inlineStyles?: boolean;\r\n /**\r\n * Strip <foreignObject> elements from the output. Required for canvas-based\r\n * PNG conversion (browsers can't rasterize foreignObject). Default: true.\r\n */\r\n stripForeignObject?: boolean;\r\n}\r\n\r\n// Visual-only CSS properties we capture during style inlining. Conservative\r\n// list — animations, transitions, and event-related properties are excluded.\r\n// Order matters loosely (later properties win in some CSS rules), but for\r\n// plain `style=\"…\"` attribute output the order is presentational only.\r\nexport const INLINEABLE_STYLE_PROPS: readonly string[] = [\r\n 'fill',\r\n 'fill-opacity',\r\n 'stroke',\r\n 'stroke-width',\r\n 'stroke-opacity',\r\n 'stroke-dasharray',\r\n 'stroke-linecap',\r\n 'stroke-linejoin',\r\n 'stroke-miterlimit',\r\n 'opacity',\r\n 'visibility',\r\n 'display',\r\n 'font-family',\r\n 'font-size',\r\n 'font-weight',\r\n 'font-style',\r\n 'text-anchor',\r\n 'dominant-baseline',\r\n 'alignment-baseline',\r\n 'letter-spacing',\r\n 'color',\r\n 'cursor',\r\n];\r\n\r\nconst SVG_NS = 'http://www.w3.org/2000/svg';\r\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\r\n\r\nfunction resolveSource(source: SvgSource): SVGSVGElement | string {\r\n if (typeof source === 'string') return source;\r\n if (typeof source === 'function') {\r\n const el = source();\r\n if (!el) throw new Error('SVG source resolver returned null');\r\n return el;\r\n }\r\n return source;\r\n}\r\n\r\n// Walks `live` and `clone` in parallel (they have identical structure because\r\n// `clone` was just produced by cloneNode(true) on `live`). Reads computed\r\n// styles from the live element and writes them as inline `style` attributes\r\n// on the matching clone element. Mutates `clone`; never mutates `live`.\r\nfunction inlineStylesOnClone(live: Element, clone: Element): void {\r\n if (typeof window === 'undefined' || !window.getComputedStyle) return;\r\n\r\n const visit = (l: Element, c: Element) => {\r\n const computed = window.getComputedStyle(l);\r\n const decls: string[] = [];\r\n for (const prop of INLINEABLE_STYLE_PROPS) {\r\n const value = computed.getPropertyValue(prop);\r\n if (value && value !== '' && value !== 'none' && value !== 'normal') {\r\n // Skip default values that bloat output without changing rendering\r\n decls.push(`${prop}: ${value}`);\r\n }\r\n }\r\n if (decls.length > 0) {\r\n const existing = c.getAttribute('style') ?? '';\r\n const merged = existing ? `${existing}; ${decls.join('; ')}` : decls.join('; ');\r\n c.setAttribute('style', merged);\r\n }\r\n const liveChildren = l.children;\r\n const cloneChildren = c.children;\r\n const n = Math.min(liveChildren.length, cloneChildren.length);\r\n for (let i = 0; i < n; i++) visit(liveChildren[i], cloneChildren[i]);\r\n };\r\n\r\n visit(live, clone);\r\n}\r\n\r\n/**\r\n * Convert any `SvgSource` to a self-contained SVG string.\r\n *\r\n * Pipeline for DOM sources:\r\n * 1. Clone the element (no live-DOM mutation)\r\n * 2. Ensure xmlns / xmlns:xlink namespace declarations are present\r\n * 3. Walk live + clone in parallel and inline computed styles onto the clone\r\n * 4. Strip <foreignObject> children (break canvas-based PNG conversion)\r\n * 5. Serialize via XMLSerializer\r\n */\r\nexport function toSvgString(source: SvgSource, options: SvgStringOptions = {}): string {\r\n const inlineStyles = options.inlineStyles !== false;\r\n const stripForeignObject = options.stripForeignObject !== false;\r\n\r\n const resolved = resolveSource(source);\r\n if (typeof resolved === 'string') return resolved;\r\n\r\n const clone = resolved.cloneNode(true) as SVGSVGElement;\r\n if (!clone.getAttribute('xmlns')) clone.setAttribute('xmlns', SVG_NS);\r\n if (!clone.getAttribute('xmlns:xlink')) clone.setAttribute('xmlns:xlink', XLINK_NS);\r\n\r\n if (inlineStyles) inlineStylesOnClone(resolved, clone);\r\n if (stripForeignObject) clone.querySelectorAll('foreignObject').forEach((el) => el.remove());\r\n\r\n return new XMLSerializer().serializeToString(clone);\r\n}\r\n\r\n/**\r\n * Extracts intrinsic dimensions from an SVG string.\r\n * Preference: viewBox → width/height attributes → fallback (800×600).\r\n *\r\n * Uses regex rather than DOMParser to stay bulletproof across XML namespace\r\n * quirks (jsdom's DOMParser is fussier than browser DOMParser about\r\n * `image/svg+xml` parse mode + querySelector).\r\n */\r\nexport function getSvgDimensions(svg: string): { width: number; height: number } {\r\n const fallback = { width: 800, height: 600 };\r\n\r\n const vbMatch = svg.match(/viewBox\\s*=\\s*[\"']([^\"']+)[\"']/);\r\n if (vbMatch) {\r\n const parts = vbMatch[1]\r\n .split(/[\\s,]+/)\r\n .map((p) => parseFloat(p))\r\n .filter((n) => !isNaN(n));\r\n if (parts.length === 4 && parts[2] > 0 && parts[3] > 0) {\r\n return { width: parts[2], height: parts[3] };\r\n }\r\n }\r\n\r\n // width / height attributes on the root <svg> element. The negative\r\n // lookbehind isn't supported in older engines, so we anchor to `<svg`.\r\n const rootMatch = svg.match(/<svg\\b[^>]*>/);\r\n if (rootMatch) {\r\n const root = rootMatch[0];\r\n const wMatch = root.match(/\\swidth\\s*=\\s*[\"']([^\"']+)[\"']/);\r\n const hMatch = root.match(/\\sheight\\s*=\\s*[\"']([^\"']+)[\"']/);\r\n const w = wMatch ? parseFloat(wMatch[1]) : NaN;\r\n const h = hMatch ? parseFloat(hMatch[1]) : NaN;\r\n return {\r\n width: !isNaN(w) && w > 0 ? w : fallback.width,\r\n height: !isNaN(h) && h > 0 ? h : fallback.height,\r\n };\r\n }\r\n\r\n return fallback;\r\n}\r\n\r\n/** Convert an SVG string to a PNG `Blob` via an offscreen `<canvas>`. */\r\nexport async function svgToPngBlob(svg: string, options: PngOptions = {}): Promise<Blob> {\r\n const scale = options.scale ?? 2;\r\n const background = options.background === undefined ? '#ffffff' : options.background;\r\n const { width, height } = getSvgDimensions(svg);\r\n\r\n const blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\r\n const url = URL.createObjectURL(blob);\r\n try {\r\n const img = new Image();\r\n img.crossOrigin = 'anonymous';\r\n await new Promise<void>((resolve, reject) => {\r\n img.onload = () => resolve();\r\n img.onerror = () => reject(new Error('Failed to load SVG image for PNG conversion'));\r\n img.src = url;\r\n });\r\n\r\n const canvas = document.createElement('canvas');\r\n canvas.width = Math.round(width * scale);\r\n canvas.height = Math.round(height * scale);\r\n const ctx = canvas.getContext('2d');\r\n if (!ctx) throw new Error('Canvas 2D context unavailable');\r\n\r\n if (background !== null) {\r\n ctx.fillStyle = background;\r\n ctx.fillRect(0, 0, canvas.width, canvas.height);\r\n }\r\n ctx.drawImage(img, 0, 0, canvas.width, canvas.height);\r\n\r\n return await new Promise<Blob>((resolve, reject) =>\r\n canvas.toBlob(\r\n (b) => (b ? resolve(b) : reject(new Error('canvas.toBlob() returned null'))),\r\n 'image/png'\r\n )\r\n );\r\n } finally {\r\n URL.revokeObjectURL(url);\r\n }\r\n}\r\n\r\nfunction triggerDownload(blob: Blob, filename: string): void {\r\n const url = URL.createObjectURL(blob);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = filename;\r\n a.rel = 'noopener';\r\n document.body.appendChild(a);\r\n a.click();\r\n // Defer cleanup — `a.click()` schedules the download asynchronously, and\r\n // revoking the blob URL synchronously cancels it in some browsers.\r\n setTimeout(() => {\r\n document.body.removeChild(a);\r\n URL.revokeObjectURL(url);\r\n }, 1500);\r\n}\r\n\r\n/** Download the SVG as a file. Preserves <foreignObject> so renderers that\r\n * embed HTML (ReactFlow nodes, vis-timeline) export their full visual,\r\n * not just the edges layer. */\r\nexport async function downloadSvg(source: SvgSource, filename: string): Promise<void> {\r\n const svg = toSvgString(source, { stripForeignObject: false });\r\n const blob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });\r\n triggerDownload(blob, filename);\r\n}\r\n\r\n/** Download the diagram as PNG. */\r\nexport async function downloadPng(\r\n source: SvgSource,\r\n filename: string,\r\n options: PngOptions = {}\r\n): Promise<void> {\r\n const svg = toSvgString(source);\r\n const blob = await svgToPngBlob(svg, options);\r\n triggerDownload(blob, filename);\r\n}\r\n\r\n/** Copy the SVG markup to the clipboard as plain text. */\r\nexport async function copySvgToClipboard(source: SvgSource): Promise<void> {\r\n const svg = toSvgString(source, { stripForeignObject: false });\r\n await navigator.clipboard.writeText(svg);\r\n}\r\n\r\n/** Copy the diagram to the clipboard as a PNG image. */\r\nexport async function copyPngToClipboard(source: SvgSource, options: PngOptions = {}): Promise<void> {\r\n const svg = toSvgString(source);\r\n const blob = await svgToPngBlob(svg, options);\r\n if (typeof ClipboardItem === 'undefined' || !navigator.clipboard?.write) {\r\n throw new Error('Clipboard image write not supported in this environment');\r\n }\r\n await navigator.clipboard.write([new ClipboardItem({ 'image/png': blob })]);\r\n}\r\n","import { useState, type MouseEvent } from 'react';\nimport {\n copySvgToClipboard,\n copyPngToClipboard,\n downloadSvg,\n downloadPng,\n type SvgSource,\n} from '../../utils/diagrams/export';\n\n// Shared 4-button toolbar (Copy SVG, Copy PNG, Download SVG, Download PNG)\n// for any diagram-rendering surface. Renderer-agnostic: accepts any\n// SvgSource (string, SVGSVGElement, or function returning one).\n//\n// Icons are inlined as <svg> rather than imported from an icon library so\n// pure-headless consumers don't pull in a ~1.5MB transitive dependency.\n\ninterface DiagramExportToolbarProps {\n source: SvgSource;\n /** Filename prefix (no extension). Default: \"diagram\". */\n filenameBase?: string;\n /** PNG canvas resolution multiplier. Default: 2. */\n pngScale?: number;\n /** PNG background color. Pass `null` for transparent. Default: white. */\n pngBackground?: string | null;\n /** Outer container class (positioning, opacity, etc.). */\n className?: string;\n /** Called when an export operation throws. Default: silent. */\n onError?: (error: Error) => void;\n}\n\ntype FlashState = 'idle' | 'svg-copied' | 'png-copied';\n\n// ── Inline icons (Lucide stroke style, 11px) ──────────────────────────────\nconst ICON_PROPS = {\n width: 11,\n height: 11,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n 'aria-hidden': true,\n};\n\nconst IconCopy = () => (\n <svg {...ICON_PROPS}>\n <rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\" />\n <path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\" />\n </svg>\n);\n\nconst IconCheck = (props: { color?: string }) => (\n <svg {...ICON_PROPS} stroke={props.color ?? 'currentColor'}>\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n);\n\nconst IconDownload = () => (\n <svg {...ICON_PROPS}>\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n);\n\nconst IconFileImage = () => (\n <svg {...ICON_PROPS}>\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <circle cx=\"10\" cy=\"13\" r=\"2\" />\n <path d=\"m20 17-1.09-1.09a2 2 0 0 0-2.82 0L10 22\" />\n </svg>\n);\n\nconst IconImageDown = () => (\n <svg {...ICON_PROPS}>\n <path d=\"M10.3 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2v5.3\" />\n <path d=\"m14 19 3 3 3-3\" />\n <path d=\"M17 22V13\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n </svg>\n);\n\nexport default function DiagramExportToolbar({\n source,\n filenameBase = 'diagram',\n pngScale = 2,\n pngBackground,\n className = '',\n onError,\n}: DiagramExportToolbarProps) {\n const [flash, setFlash] = useState<FlashState>('idle');\n\n const flashAndReset = (state: Exclude<FlashState, 'idle'>) => {\n setFlash(state);\n setTimeout(() => setFlash('idle'), 2000);\n };\n\n const safe = async (fn: () => Promise<void>, e: MouseEvent) => {\n e.stopPropagation();\n try {\n await fn();\n } catch (err) {\n onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n };\n\n const handleCopySvg = (e: MouseEvent) =>\n safe(async () => {\n await copySvgToClipboard(source);\n flashAndReset('svg-copied');\n }, e);\n\n const handleCopyPng = (e: MouseEvent) =>\n safe(async () => {\n await copyPngToClipboard(source, { scale: pngScale, background: pngBackground });\n flashAndReset('png-copied');\n }, e);\n\n const handleDownloadSvg = (e: MouseEvent) =>\n safe(() => downloadSvg(source, `${filenameBase}.svg`), e);\n\n const handleDownloadPng = (e: MouseEvent) =>\n safe(\n () => downloadPng(source, `${filenameBase}.png`, { scale: pngScale, background: pngBackground }),\n e\n );\n\n const buttonClass =\n 'flex items-center gap-1 px-2 py-1 rounded-md bg-white border border-slate-200 text-slate-500 hover:text-blue-600 hover:border-blue-300 text-[10px] font-bold shadow-sm transition-colors';\n\n return (\n <div className={`flex gap-1 ${className}`} role=\"toolbar\" aria-label=\"Diagram export\">\n <button\n type=\"button\"\n onClick={handleCopySvg}\n className={buttonClass}\n aria-label=\"Copy SVG markup to clipboard\"\n title=\"Copy SVG markup\"\n >\n {flash === 'svg-copied' ? <IconCheck color=\"#22c55e\" /> : <IconCopy />}\n {flash === 'svg-copied' ? 'Copied!' : 'SVG'}\n </button>\n <button\n type=\"button\"\n onClick={handleCopyPng}\n className={buttonClass}\n aria-label=\"Copy diagram as PNG to clipboard\"\n title=\"Copy as PNG image\"\n >\n {flash === 'png-copied' ? <IconCheck color=\"#22c55e\" /> : <IconFileImage />}\n {flash === 'png-copied' ? 'Copied!' : 'PNG'}\n </button>\n <button\n type=\"button\"\n onClick={handleDownloadSvg}\n className={buttonClass}\n aria-label=\"Download diagram as SVG file\"\n title=\"Download SVG\"\n >\n <IconDownload /> SVG\n </button>\n <button\n type=\"button\"\n onClick={handleDownloadPng}\n className={buttonClass}\n aria-label=\"Download diagram as PNG file\"\n title=\"Download PNG\"\n >\n <IconImageDown /> PNG\n </button>\n </div>\n );\n}\n","// Public API for `merslim`.\n//\n// Three entry points by use case:\n//\n// 1. Drop-in React component — give it a mermaid-style source string and\n// it renders the diagram natively:\n// <DiagramRenderer source={mermaidSource} dark={isDark} />\n//\n// 2. Programmatic IR → SVG (headless / SSR / build-time):\n// const ir = await parseToIR(source);\n// const svgString = buildFlowchartSvg(ir.ir as FlowchartIR);\n//\n// 3. Renderer registry — extend with custom diagram types:\n// register({ type: 'myCustom', loader: () => import('./MyRenderer') });\n//\n// Call `bootstrapDiagramRenderers()` once at app startup before mounting\n// any <DiagramRenderer/> instance. It lazily registers every built-in\n// renderer; each one's code is only fetched the first time a diagram of\n// that type appears.\n\n// ── Components ───────────────────────────────────────────────────────────\nexport { default as DiagramRenderer } from './components/diagrams/DiagramRenderer';\nexport { default as DiagramExportToolbar } from './components/diagrams/DiagramExportToolbar';\n\n// Individual renderers, exported so callers who already have an IR can\n// skip the source-string parsing step entirely. Static imports here mean\n// the consumer's bundler will tree-shake renderers they don't reference.\nexport { default as FlowchartRenderer } from './components/diagrams/FlowchartRenderer';\nexport { default as ERRenderer } from './components/diagrams/ERRenderer';\nexport { default as PieRenderer } from './components/diagrams/PieRenderer';\nexport { default as QuadrantRenderer } from './components/diagrams/QuadrantRenderer';\nexport { default as JourneyRenderer } from './components/diagrams/JourneyRenderer';\nexport { default as SequenceRenderer } from './components/diagrams/SequenceRenderer';\nexport { default as ClassRenderer } from './components/diagrams/ClassRenderer';\nexport { default as StateRenderer } from './components/diagrams/StateRenderer';\nexport { default as GanttRenderer } from './components/diagrams/GanttRenderer';\nexport { default as TimelineRenderer } from './components/diagrams/TimelineRenderer';\nexport { default as MindmapRenderer } from './components/diagrams/MindmapRenderer';\nexport { default as ArchitectureRenderer } from './components/diagrams/ArchitectureRenderer';\nexport { default as C4Renderer } from './components/diagrams/C4Renderer';\nexport { default as GitGraphRenderer } from './components/diagrams/GitGraphRenderer';\n\n// ── Registry + bootstrap ─────────────────────────────────────────────────\nexport { bootstrapDiagramRenderers } from './components/diagrams/bootstrap';\nexport {\n register,\n getRenderer,\n hasRenderer,\n _resetRegistry,\n} from './utils/diagrams/registry';\nexport type {\n RendererHandle,\n RendererProps,\n RendererEntry,\n IRForType,\n} from './utils/diagrams/registry';\n\n// ── Parser ───────────────────────────────────────────────────────────────\nexport { parseToIR, detectDiagramType } from './utils/diagrams/parser';\n\n// ── SVG builders (use directly for headless / SSR) ───────────────────────\n//\n// Two flavors:\n// - One-call convenience builders for graph diagrams that need layout\n// (`flowchartToSvg`, `classToSvg`, `erToSvg`). Internally run dagre.\n// - Position-taking power-user builders (`buildFlowchartSvg(ir, positions)`\n// etc.) for callers who want to compute layout themselves.\n//\n// Chart-shaped builders (pie, quadrant, journey, gantt, timeline, c4,\n// architecture, gitgraph) don't need layout — they're one-call already.\nexport {\n flowchartToSvg,\n classToSvg,\n erToSvg,\n} from './utils/diagrams/convenience';\nexport {\n buildFlowchartSvg,\n buildErSvg,\n buildPieSvg,\n buildQuadrantSvg,\n buildJourneySvg,\n buildClassSvg,\n buildStateSvg,\n buildGanttSvg,\n buildTimelineSvg,\n buildMindmapSvg,\n buildArchitectureSvg,\n buildC4Svg,\n buildGitGraphSvg,\n svgStringToElement,\n} from './utils/diagrams/svgBuilders';\nexport type { StateBuildPositions } from './utils/diagrams/svgBuilders';\n\n// ── Export pipeline (clipboard / download / serialize) ──────────────────\nexport {\n toSvgString,\n svgToPngBlob,\n getSvgDimensions,\n downloadSvg,\n downloadPng,\n copySvgToClipboard,\n copyPngToClipboard,\n INLINEABLE_STYLE_PROPS,\n} from './utils/diagrams/export';\nexport type {\n SvgSource,\n PngOptions,\n SvgStringOptions,\n} from './utils/diagrams/export';\n\n// ── Layout primitive ─────────────────────────────────────────────────────\nexport { layoutFlowchart } from './utils/diagrams/layout/dagreLayout';\nexport type { NodeSize } from './utils/diagrams/layout/dagreLayout';\n\n// ── Dark-mode helpers ────────────────────────────────────────────────────\nexport { isDarkMode, watchDarkMode } from './components/diagrams/darkMode';\n\n// ── Theme tokens ─────────────────────────────────────────────────────────\nexport { getDiagramTheme } from './components/diagrams/shared/theme';\n\n// ── All IR / domain types ────────────────────────────────────────────────\nexport type * from './utils/diagrams/types';\n","// One-time registration of native renderers.\r\n//\r\n// Imported by every consumer that wants registry dispatch (MarkdownPreview,\r\n// DiagramGenerator). Loaders are dynamic — the actual renderer modules\r\n// (and their ReactFlow / dagre / iconify dependencies) are not pulled into\r\n// the importing chunk until a diagram of that type renders.\r\n\r\nimport { register } from '../../utils/diagrams/registry';\r\n\r\nlet bootstrapped = false;\r\n\r\nexport function bootstrapDiagramRenderers(): void {\r\n if (bootstrapped) return;\r\n bootstrapped = true;\r\n\r\n register({\r\n type: 'flowchart',\r\n loader: () => import('./FlowchartRenderer'),\r\n });\r\n\r\n register({\r\n type: 'er',\r\n loader: () => import('./ERRenderer'),\r\n });\r\n\r\n register({\r\n type: 'pie',\r\n loader: () => import('./PieRenderer'),\r\n });\r\n\r\n register({\r\n type: 'quadrant',\r\n loader: () => import('./QuadrantRenderer'),\r\n });\r\n\r\n register({\r\n type: 'journey',\r\n loader: () => import('./JourneyRenderer'),\r\n });\r\n\r\n register({\r\n type: 'sequence',\r\n loader: () => import('./SequenceRenderer'),\r\n });\r\n\r\n register({\r\n type: 'class',\r\n loader: () => import('./ClassRenderer'),\r\n });\r\n\r\n register({\r\n type: 'state',\r\n loader: () => import('./StateRenderer'),\r\n });\r\n\r\n register({\r\n type: 'gantt',\r\n loader: () => import('./GanttRenderer'),\r\n });\r\n\r\n register({\r\n type: 'timeline',\r\n loader: () => import('./TimelineRenderer'),\r\n });\r\n\r\n register({\r\n type: 'mindmap',\r\n loader: () => import('./MindmapRenderer'),\r\n });\r\n\r\n register({\r\n type: 'architecture',\r\n loader: () => import('./ArchitectureRenderer'),\r\n });\r\n\r\n register({\r\n type: 'c4',\r\n loader: () => import('./C4Renderer'),\r\n });\r\n\r\n register({\r\n type: 'gitgraph',\r\n loader: () => import('./GitGraphRenderer'),\r\n });\r\n}\r\n","// Convenience builders — one-call IR → SVG for the graph-shaped diagrams\n// that otherwise require the caller to compute a position map first.\n//\n// Power users who need custom layout can still call the position-taking\n// builders (`buildFlowchartSvg`, `buildClassSvg`, `buildErSvg`) directly.\n\nimport dagre from 'dagre';\nimport { layoutFlowchart, type NodeSize } from './layout/dagreLayout';\nimport {\n buildClassSvg,\n buildErSvg,\n buildFlowchartSvg,\n} from './svgBuilders';\nimport type {\n ClassDiagramIR,\n ERDiagramIR,\n FlowchartIR,\n} from './types';\n\ninterface BuildOptions {\n dark?: boolean;\n padding?: number;\n}\n\n// Sizing constants — must stay in sync with the renderer components.\nconst FLOW_DEFAULT_SIZE: NodeSize = { width: 180, height: 60 };\nconst CLASS_NODE_WIDTH = 220;\nconst ER_NODE_WIDTH = 240;\nconst ER_HEADER_H = 34;\nconst ER_ROW_H = 26;\n\nfunction flowchartNodeSize(label: string): NodeSize {\n const len = label.length;\n return {\n width: Math.max(160, Math.min(320, len * 8 + 40)),\n height: 48,\n };\n}\n\n/** One-call flowchart → SVG. Internally runs dagre layout. */\nexport function flowchartToSvg(ir: FlowchartIR, options: BuildOptions = {}): string {\n const nodeSizes = new Map<string, NodeSize>();\n for (const node of ir.nodes) {\n nodeSizes.set(node.id, flowchartNodeSize(node.label || node.id));\n }\n const { nodePositions } = layoutFlowchart(ir, {\n defaultNodeSize: FLOW_DEFAULT_SIZE,\n nodeSizes,\n });\n return buildFlowchartSvg(ir, nodePositions, options);\n}\n\n/** One-call class diagram → SVG. */\nexport function classToSvg(ir: ClassDiagramIR, options: BuildOptions = {}): string {\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'TB', nodesep: 50, ranksep: 80, marginx: 24, marginy: 24 });\n g.setDefaultEdgeLabel(() => ({}));\n const sizeFor = (memberCount: number) => ({\n width: CLASS_NODE_WIDTH,\n height: Math.max(64, 40 + memberCount * 18),\n });\n for (const cls of ir.classes) g.setNode(cls.id, sizeFor(cls.members.length));\n for (const rel of ir.relations) {\n if (g.hasNode(rel.source) && g.hasNode(rel.target)) g.setEdge(rel.source, rel.target);\n }\n dagre.layout(g);\n const positions = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const cls of ir.classes) {\n const { x, y } = g.node(cls.id) as { x: number; y: number };\n const size = sizeFor(cls.members.length);\n positions.set(cls.id, {\n x: x - size.width / 2,\n y: y - size.height / 2,\n width: size.width,\n height: size.height,\n });\n }\n return buildClassSvg(ir, positions, options);\n}\n\n/** One-call ER diagram → SVG. */\nexport function erToSvg(ir: ERDiagramIR, options: BuildOptions = {}): string {\n const g = new dagre.graphlib.Graph();\n g.setGraph({ rankdir: 'LR', nodesep: 60, ranksep: 100, marginx: 24, marginy: 24 });\n g.setDefaultEdgeLabel(() => ({}));\n const tableHeight = (cols: number) => ER_HEADER_H + cols * ER_ROW_H;\n\n for (const table of ir.schema.tables) {\n g.setNode(table.name, {\n width: ER_NODE_WIDTH,\n height: tableHeight(table.columns.length),\n });\n }\n for (const rel of ir.schema.relations) {\n if (g.hasNode(rel.fromTable) && g.hasNode(rel.toTable)) {\n g.setEdge(rel.fromTable, rel.toTable);\n }\n }\n dagre.layout(g);\n\n const positions = new Map<string, { x: number; y: number; width: number; height: number }>();\n for (const table of ir.schema.tables) {\n const { x, y } = g.node(table.name) as { x: number; y: number };\n const h = tableHeight(table.columns.length);\n positions.set(table.name, {\n x: x - ER_NODE_WIDTH / 2,\n y: y - h / 2,\n width: ER_NODE_WIDTH,\n height: h,\n });\n }\n return buildErSvg(ir, positions, options);\n}\n","// Dark-mode detection + observation. Replaces the old mermaidTheme.ts —\n// now that all renderers are native (no mermaid runtime), we don't need\n// `initMermaid()` or the theme-change event bus. Components can just\n// observe the `<html>` `.dark` class directly.\n\n/** Reads the current dark-mode flag from the `<html>` `.dark` class. */\nexport function isDarkMode(): boolean {\n if (typeof document === 'undefined') return false;\n return document.documentElement.classList.contains('dark');\n}\n\n/**\n * Observes class changes on the `<html>` element and invokes the callback\n * whenever the `.dark` class toggles. Returns a disposer.\n */\nexport function watchDarkMode(callback: (dark: boolean) => void): () => void {\n if (typeof MutationObserver === 'undefined' || typeof document === 'undefined') {\n return () => {};\n }\n let last = isDarkMode();\n const observer = new MutationObserver(() => {\n const next = isDarkMode();\n if (next !== last) {\n last = next;\n callback(next);\n }\n });\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n return () => observer.disconnect();\n}\n"]}