@zukhruf/diagram 0.3.28 → 0.3.30

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.
@@ -1 +1 @@
1
- {"version":3,"file":"graph-layout.js","names":["centeredBaselineOffset","textAscent","textLineBox","textWidth","widestLine","COL_W","ROW_H","NODE_W","NODE_H","NODE_RX","NODE_PAD","GROUP_PAD","GROUP_LABEL_H","GROUP_TITLE_GAP","TITLE_TOP_PAD","SVG_PAD_X","SVG_PAD_Y","ROUTE_CELL","TURN_PENALTY","STUB","ENTRY_GAP","CONTENT_VIEWBOX_PAD","PARALLEL_SPACING","SELF_LOOP_OFFSET","SELF_LOOP_DEPTH","ROUTE_RESERVATION_CELLS","EDGE_LABEL_FONT_SIZE","EDGE_BADGE_FONT_SIZE","EDGE_BADGE_ICON","EDGE_LABEL_LINE_H","EDGE_LABEL_LINE_GAP","EDGE_LABEL_BOX_PAD","EDGE_LABEL_GAP","GROUP_LABEL_LINE_H","NODE_CAPTION_FONT_SIZE","NODE_CAPTION_LINE_H","NODE_CAPTION_OFFSET","NODE_CAPTION_FRAME_PAD_X_EM","NODE_CAPTION_FRAME_PAD_Y_EM","ANNOTATION_LINE_GAP","nodeFrameRadius","node","rx","frame","nodeFrameStrokeWidth","graphLayout","layout","colWidth","rowHeight","columns","rows","padX","padY","titleTopPad","trackSize","axis","index","resolved","tracks","fallback","assertTrackStart","value","Math","floor","Error","trackPosition","fraction","position","i","trackSpan","start","end","graphPadX","graphPadY","nodeBox","row","positionedValue","col","colSpan","innerWidth","defaultWidth","w","width","min","max","h","height","x","y","nodeStackCount","stack","nodeStackOffset","stackOffset","id","nodeStackVector","offset","dx","stackDx","dy","stackDy","direction","stackDirection","xSign","endsWith","ySign","startsWith","nodeStackWidthStep","step","stackWidthStep","nodeStackHeightStep","stackHeightStep","nodeStackFrameBox","box","level","stackVector","nodeVisualBox","stackCount","hidden","boxes","Array","from","length","_","minX","map","candidate","minY","maxX","maxY","nodeCaptionLines","caption","undefined","isArray","line","trim","filter","Boolean","nodeCaptionPlacement","lines","side","captionSide","captionOffset","captionFrame","fontSize","captionFontSize","lineHeight","centerX","centerY","center","captionBlockHeight","captionBlockAscent","align","captionFramePad","lineCount","nodeCaptionBounds","placement","resolveGraphLayout","spec","needsAutoLayout","nodes","some","hasRow","hasCol","ids","nodeIds","Set","adjacency","Map","indegree","set","edge","edges","endpointNodeId","to","has","get","push","queue","rank","order","usedRowsByCol","add","nextOpenRow","groups","resolveGraphGroupBounds","changed","resolving","resolve","group","cached","childGroups","parent","next","bounds","inferResolvedGroupBounds","delete","nextGroups","grouped","emptyBounds","includeBounds","rowStart","rowEnd","colStart","colEnd","childGroup","requireGroupBounds","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","target","source","groupCornerInset","groupBox","padding","groupPadding","contained","n","childBoxes","tightX","tightY","tight","minChildX","b","maxChildX","left","right","topPad","groupTopPadding","bottom","reserveTightLabel","titleGutterHeight","groupTitleGutterHeight","childOverhang","groupChildTopOverhang","tightLabelReserve","groupLabelHeight","top","rowTop","containedNodes","groupLabelLines","label","titleGap","labelHeight","titleBand","groupDividerLines","dividers","x1","y1","x2","y2","accent","cols","svgDimensions","maxRow","maxCol","lastCol","g","point","resolveEdgeWaypoints","waypoints","annotation","resolveGraphAnnotations","annotationTextBounds","annotationLeaderBoundaryPoints","gridW","gridH","graphContentViewBox","routedEdges","includePoint","includeBox","captionBounds","port","nodePortPlacements","labelX","labelY","groupPortPlacements","routedEdge","points","labelPlacement","edgeLabelFrameBox","badgePlacement","edgeBadgeBounds","isFinite","ceil","portPlacements","ownerId","ports","pointOnBoxSide","labelGap","labelAlign","annotations","resolveGraphAnnotation","targets","guide","targetBoxes","targetBoxForAnnotation","targetBox","unionBoxes","anchor","annotationGuidePoint","anchorPoint","resolvedPoint","leaders","leader","annotationLeaderPoints","defaultAnnotationAlign","leaderFrom","leaderTo","guideId","guideForId","resolveGuideLine","targetPoint","orientation","find","textPoint","gap","leaderGap","route","leaderRoute","finish","annotationLeaderRoutePoints","compactLeaderPoints","previous","lineGap","text","flatMap","MinHeap","data","item","priority","bubbleUp","pop","last","bubbleDown","empty","entry","parentEntry","smallest","smallestEntry","manhattan","a","abs","dirCode","snapToGrid","v","round","buildObstacles","blocked","x0","y0","pickDiagramSidesByGap","tIsRight","tIsLeft","tIsBelow","tIsAbove","horizontalGap","verticalGap","useVertical","exitSide","entrySide","endpointsForDiagramSides","exitOffset","entryOffset","entryGap","sCenter","tCenter","exit","pickEndpoints","hint","sides","computeStub","distance","tryStraightLine","gy","gx","reserveRoutedEdge","isEndpointStub","reserveSegment","aStar","goal","startKey","goalKey","open","gScore","cameFrom","pt","dir","DIRS","current","cur","curKey","path","k","prev","unshift","lastDir","nx","ny","nKey","newDir","turnCost","tentativeG","existingG","f","simplifyPath","first","at","result","cross","pathToSvg","radius","second","parts","dpx","dpy","dnx","dny","lp","hypot","ln","r","cs","ce","join","computeLabelPlacement","labelSegment","segmentIndex","resolveLabelSegmentIndex","edgeLabelPlacementForSegment","labelT","pathAnchorAtFraction","labelSide","edgeLabelPlacementFromHint","isHorizontal","bestI","bestLen","len","segment","isInteger","maxSegment","midX","midY","computeBadgePlacement","badgeIcon","badgeLabel","pointAtPathFraction","badgeT","badgeSide","badgeOffset","badgeDx","badgeDy","beforeLast","clamped","segments","slice","total","reduce","sum","ratio","labelOffset","labelDx","labelDy","deconflictLabelPlacements","occupied","nextPlacement","placeLabel","edgeLabelBounds","maxAttempts","labelOffsetCandidates","offsetLabelPlacement","other","labelBoundsOverlap","size","edgeLabelSize","candidates","primary","edgeLabelFontSize","labelFontSize","edgeLabelFramePad","labelFramePadding","pad","edgeLabelLineHeight","edgeLabelAscent","labelLineGap","edgeBadgeSize","labelWidth","iconWidth","waypoint","resolveGuideWaypoint","targetAnchorPoint","guideWaypointCrossAxis","consumer","matches","guides","match","duplicates","resolveGuideMainAxis","targetBoxForWaypoint","routeEdge","routeOffset","stubDistance","stubExit","stubEntry","staggerLabel","d","startG","goalG","pixelPath","p","fullPath","simplified","pointOutsideBoxSide","routeSelfLoop","axisOffset","entryAxisOffset","loopPoints","resolveDiagramSides","hasReciprocal","edgeIsUnhinted","sourceCenter","targetCenter","horizontalDelta","verticalDelta","hasReciprocalEdge","computeParallelOffsets","resolvedSides","exitOffsets","fill","entryOffsets","routeOffsets","nodesById","nodeBoxes","groupsById","groupBoxes","lookup","exitGroups","entryGroups","sameSideRouteGroups","fanOutRouteGroups","forEach","sourceEndpoint","resolveEndpoint","targetEndpoint","exitKey","ref","entryKey","exitArr","entryArr","routeKey","routeArr","indices","values","offsets","computeSideOffsets","cornerInset","idx","sorted","span","edgeGridSpan","sort","routed","targetIds","edgeTargetAxisPosition","count","maxIndexOffset","sideSpan","maxOffset","spacing","nodeCornerInset","computePaths","svgW","svgH","assertConnectableEndpoint","separator","indexOf","endpointPortId","portId","kind","connectable","endpoint","role","relation"],"sources":["../../../../src/lib/layouts/graph/graph-layout.ts"],"sourcesContent":["import type {\n Box,\n DiagramAnchor,\n DiagramAnnotation,\n DiagramAnnotationLeader,\n DiagramEdge,\n DiagramGraphLayout,\n DiagramGroup,\n DiagramGuide,\n DiagramGuideOrientation,\n DiagramNode,\n DiagramNodePort,\n DiagramSide,\n DiagramWaypoint,\n GraphLayoutSpec,\n Point,\n} from '../../model/diagram-ir.ts';\nimport {\n centeredBaselineOffset,\n textAscent,\n textLineBox,\n textWidth,\n widestLine,\n} from '../text-metrics.ts';\n\nexport type {\n DiagramAnnotation,\n DiagramAnnotationLeader,\n DiagramAnchor,\n DiagramEdge,\n DiagramEdgeLabelSide,\n DiagramGraphLayout,\n DiagramGroup,\n DiagramGuide,\n DiagramGuideOrientation,\n DiagramLabelLine,\n DiagramNode,\n DiagramNodeIcon,\n DiagramNodePort,\n DiagramWaypoint,\n GraphLayoutSpec,\n Box,\n Point,\n DiagramSide,\n} from '../../model/diagram-ir.ts';\n\nexport const COL_W = 240;\nexport const ROW_H = 128;\nexport const NODE_W = 176;\nexport const NODE_H = 64;\nexport const NODE_RX = 16;\nexport const NODE_PAD = 16;\nexport const GROUP_PAD = 24;\nexport const GROUP_LABEL_H = 28;\nexport const GROUP_TITLE_GAP = 8;\nexport const TITLE_TOP_PAD = 32;\nexport const SVG_PAD_X = 60;\nexport const SVG_PAD_Y = 32;\nexport const ROUTE_CELL = 4;\nexport const TURN_PENALTY = 14;\nexport const STUB = NODE_PAD + ROUTE_CELL;\nexport const ENTRY_GAP = 10;\nexport const CONTENT_VIEWBOX_PAD = 40;\n\nexport const PARALLEL_SPACING = 28;\nconst SELF_LOOP_OFFSET = 28;\nconst SELF_LOOP_DEPTH = 48;\nconst ROUTE_RESERVATION_CELLS = 0;\nconst EDGE_LABEL_FONT_SIZE = 10;\nconst EDGE_BADGE_FONT_SIZE = 10;\nexport const EDGE_BADGE_ICON = 22;\nconst EDGE_LABEL_LINE_H = 12;\nconst EDGE_LABEL_LINE_GAP = 2;\nconst EDGE_LABEL_BOX_PAD = 4;\nconst EDGE_LABEL_GAP = 4;\nconst GROUP_LABEL_LINE_H = 14;\nconst NODE_CAPTION_FONT_SIZE = 11;\nconst NODE_CAPTION_LINE_H = 14;\nconst NODE_CAPTION_OFFSET = 12;\nconst NODE_CAPTION_FRAME_PAD_X_EM = 0.9;\nconst NODE_CAPTION_FRAME_PAD_Y_EM = 0.55;\nconst ANNOTATION_LINE_GAP = 4;\n\nexport function nodeFrameRadius(node: DiagramNode) {\n return node.rx ?? (node.frame === 'flat' ? 4 : NODE_RX);\n}\n\nexport function nodeFrameStrokeWidth(node: DiagramNode) {\n return node.frame === 'flat' ? 0 : 1.5;\n}\n\ntype Axis = 'col' | 'row';\n\nfunction graphLayout(\n layout?: DiagramGraphLayout,\n): Required<DiagramGraphLayout> {\n return {\n colWidth: layout?.colWidth ?? COL_W,\n rowHeight: layout?.rowHeight ?? ROW_H,\n columns: layout?.columns ?? [],\n rows: layout?.rows ?? [],\n padX: layout?.padX ?? SVG_PAD_X,\n padY: layout?.padY ?? SVG_PAD_Y,\n titleTopPad: layout?.titleTopPad ?? TITLE_TOP_PAD,\n };\n}\n\nfunction trackSize(\n axis: Axis,\n index: number,\n layout?: DiagramGraphLayout,\n): number {\n const resolved = graphLayout(layout);\n const tracks = axis === 'col' ? resolved.columns : resolved.rows;\n const fallback = axis === 'col' ? resolved.colWidth : resolved.rowHeight;\n return tracks[index] ?? fallback;\n}\n\nfunction assertTrackStart(axis: Axis, value: number) {\n if (Math.floor(value) < 0) {\n throw new Error(\n `Diagram ${axis === 'col' ? 'column' : 'row'} ${value} resolves before the first track.`,\n );\n }\n}\n\nfunction trackPosition(\n axis: Axis,\n value: number,\n layout?: DiagramGraphLayout,\n): number {\n assertTrackStart(axis, value);\n const index = Math.floor(value);\n const fraction = value - index;\n let position = 0;\n for (let i = 0; i < index; i++) {\n position += trackSize(axis, i, layout);\n }\n if (fraction > 0) position += trackSize(axis, index, layout) * fraction;\n return position;\n}\n\nfunction trackSpan(\n axis: Axis,\n start: number,\n end: number,\n layout?: DiagramGraphLayout,\n): number {\n return trackPosition(axis, end, layout) - trackPosition(axis, start, layout);\n}\n\nfunction graphPadX(layout?: DiagramGraphLayout) {\n return graphLayout(layout).padX;\n}\n\nfunction graphPadY(layout?: DiagramGraphLayout) {\n const resolved = graphLayout(layout);\n return resolved.padY + resolved.titleTopPad;\n}\n\nexport type ViewBox = {\n x: number;\n y: number;\n w: number;\n h: number;\n};\n\nexport type GroupDividerLine = {\n axis: 'row' | 'col';\n value: number;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n accent: boolean;\n};\n\nexport type ResolvedDiagramAnnotation = DiagramAnnotation & {\n x: number;\n y: number;\n leaderFrom?: Point | undefined;\n leaderTo?: Point | undefined;\n leaders?: DiagramAnnotationLeader[] | undefined;\n};\n\nexport type PortPlacement = DiagramNodePort & {\n ownerId: string;\n x: number;\n y: number;\n labelX: number;\n labelY: number;\n labelAlign: 'start' | 'middle' | 'end';\n};\n\nexport type NodeCaptionPlacement = {\n lines: string[];\n x: number;\n y: number;\n align: 'start' | 'middle' | 'end';\n fontSize: number;\n lineHeight: number;\n};\n\ntype EndpointRef = {\n ref: string;\n id: string;\n kind: 'node' | 'group';\n box: Box;\n cornerInset: number;\n connectable: boolean;\n port?: DiagramNodePort;\n};\n\ntype EndpointLookup = {\n nodesById: Map<string, DiagramNode>;\n nodeBoxes: Map<string, Box>;\n groupsById: Map<string, DiagramGroup>;\n groupBoxes: Map<string, Box>;\n};\n\nexport function nodeBox(node: DiagramNode, layout?: DiagramGraphLayout): Box {\n const row = positionedValue(node, 'row');\n const col = positionedValue(node, 'col');\n const colSpan = node.colSpan ?? 1;\n const innerWidth = trackSpan('col', col, col + colSpan, layout);\n const defaultWidth = NODE_W + (colSpan - 1) * graphLayout(layout).colWidth;\n const w =\n node.width ?? Math.min(defaultWidth, Math.max(NODE_W, innerWidth - 24));\n const h = node.height ?? NODE_H;\n const x =\n graphPadX(layout) +\n trackPosition('col', col, layout) +\n (innerWidth - w) / 2;\n const rowHeight = trackSize('row', Math.floor(row), layout);\n const y =\n graphPadY(layout) + trackPosition('row', row, layout) + (rowHeight - h) / 2;\n return { x, y, w, h };\n}\n\nexport function nodeStackCount(node: DiagramNode): number {\n return Math.max(1, Math.floor(node.stack ?? 1));\n}\n\nexport function nodeStackOffset(node: DiagramNode): number {\n const stackOffset = node.stackOffset ?? 12;\n if (stackOffset < 0) {\n throw new Error(\n `Diagram node \"${node.id}\" stackOffset must be non-negative.`,\n );\n }\n return stackOffset;\n}\n\nexport function nodeStackVector(node: DiagramNode): Point {\n const offset = nodeStackOffset(node);\n const dx = node.stackDx ?? offset;\n const dy = node.stackDy ?? offset;\n if (dx < 0) {\n throw new Error(`Diagram node \"${node.id}\" stackDx must be non-negative.`);\n }\n if (dy < 0) {\n throw new Error(`Diagram node \"${node.id}\" stackDy must be non-negative.`);\n }\n const direction = node.stackDirection ?? 'up-left';\n const xSign = direction.endsWith('left') ? -1 : 1;\n const ySign = direction.startsWith('up') ? -1 : 1;\n return { x: xSign * dx, y: ySign * dy };\n}\n\nexport function nodeStackWidthStep(node: DiagramNode): number {\n const step = node.stackWidthStep ?? 0;\n if (step < 0) {\n throw new Error(\n `Diagram node \"${node.id}\" stackWidthStep must be non-negative.`,\n );\n }\n return step;\n}\n\nexport function nodeStackHeightStep(node: DiagramNode): number {\n const step = node.stackHeightStep ?? 0;\n if (step < 0) {\n throw new Error(\n `Diagram node \"${node.id}\" stackHeightStep must be non-negative.`,\n );\n }\n return step;\n}\n\nexport function nodeStackFrameBox(\n node: DiagramNode,\n box: Box,\n level: number,\n): Box {\n const stackVector = nodeStackVector(node);\n return {\n x: box.x + level * stackVector.x,\n y: box.y + level * stackVector.y,\n w: box.w + level * nodeStackWidthStep(node),\n h: box.h + level * nodeStackHeightStep(node),\n };\n}\n\nexport function nodeVisualBox(node: DiagramNode, box = nodeBox(node)): Box {\n const stackCount = nodeStackCount(node);\n if (stackCount <= 1 || node.hidden || node.frame === 'none') return box;\n const boxes = [\n box,\n ...Array.from({ length: stackCount - 1 }, (_, i) =>\n nodeStackFrameBox(node, box, i + 1),\n ),\n ];\n const minX = Math.min(...boxes.map((candidate) => candidate.x));\n const minY = Math.min(...boxes.map((candidate) => candidate.y));\n const maxX = Math.max(...boxes.map((candidate) => candidate.x + candidate.w));\n const maxY = Math.max(...boxes.map((candidate) => candidate.y + candidate.h));\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function nodeCaptionLines(node: DiagramNode): string[] {\n if (node.caption === undefined) return [];\n return (Array.isArray(node.caption) ? node.caption : [node.caption])\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nexport function nodeCaptionPlacement(\n node: DiagramNode,\n box = nodeBox(node),\n): NodeCaptionPlacement | null {\n const lines = nodeCaptionLines(node);\n if (node.hidden || lines.length === 0) return null;\n const side = node.captionSide ?? 'bottom';\n const offset =\n node.captionOffset ?? (node.captionFrame ? 0 : NODE_CAPTION_OFFSET);\n const fontSize = node.captionFontSize ?? NODE_CAPTION_FONT_SIZE;\n const lineHeight = Math.max(fontSize + 2, NODE_CAPTION_LINE_H);\n const centerX = box.x + box.w / 2;\n const centerY = box.y + box.h / 2;\n if (node.captionFrame) {\n const center =\n side === 'top'\n ? { x: centerX, y: box.y - offset }\n : side === 'bottom'\n ? { x: centerX, y: box.y + box.h + offset }\n : side === 'left'\n ? { x: box.x - offset, y: centerY }\n : { x: box.x + box.w + offset, y: centerY };\n return {\n lines,\n x: center.x,\n y:\n center.y -\n captionBlockHeight(node, fontSize, lines.length, lineHeight) / 2 +\n captionBlockAscent(node, fontSize),\n align: 'middle',\n fontSize,\n lineHeight,\n };\n }\n if (side === 'top') {\n return {\n lines,\n x: centerX,\n y: box.y - offset - (lines.length - 1) * lineHeight,\n align: 'middle',\n fontSize,\n lineHeight,\n };\n }\n if (side === 'left') {\n return {\n lines,\n x: box.x - offset,\n y: centerY - ((lines.length - 1) * lineHeight) / 2 + fontSize / 3,\n align: 'end',\n fontSize,\n lineHeight,\n };\n }\n if (side === 'right') {\n return {\n lines,\n x: box.x + box.w + offset,\n y: centerY - ((lines.length - 1) * lineHeight) / 2 + fontSize / 3,\n align: 'start',\n fontSize,\n lineHeight,\n };\n }\n return {\n lines,\n x: centerX,\n y: box.y + box.h + offset + fontSize,\n align: 'middle',\n fontSize,\n lineHeight,\n };\n}\n\nfunction captionFramePad(node: DiagramNode, fontSize: number) {\n return node.captionFrame ? fontSize * NODE_CAPTION_FRAME_PAD_Y_EM : 0;\n}\n\nfunction captionBlockAscent(node: DiagramNode, fontSize: number) {\n return textAscent(fontSize, 'sans') + captionFramePad(node, fontSize);\n}\n\nfunction captionBlockHeight(\n node: DiagramNode,\n fontSize: number,\n lineCount: number,\n lineHeight: number,\n) {\n return (\n textLineBox(fontSize, 'sans') +\n (lineCount - 1) * lineHeight +\n captionFramePad(node, fontSize) * 2\n );\n}\n\nexport function nodeCaptionBounds(\n node: DiagramNode,\n box = nodeBox(node),\n): Box | null {\n const placement = nodeCaptionPlacement(node, box);\n if (!placement) return null;\n const w =\n widestLine(placement.lines, placement.fontSize, 'sans') +\n (node.captionFrame\n ? placement.fontSize * NODE_CAPTION_FRAME_PAD_X_EM * 2\n : 0);\n const h = captionBlockHeight(\n node,\n placement.fontSize,\n placement.lines.length,\n placement.lineHeight,\n );\n const x =\n placement.align === 'middle'\n ? placement.x - w / 2\n : placement.align === 'end'\n ? placement.x - w\n : placement.x;\n return {\n x,\n y: placement.y - captionBlockAscent(node, placement.fontSize),\n w,\n h,\n };\n}\n\nfunction positionedValue(node: DiagramNode, axis: 'row' | 'col') {\n const value = node[axis];\n if (value === undefined) {\n throw new Error(\n `Diagram node \"${node.id}\" needs a ${axis}; resolve automatic graph layout before measuring nodes.`,\n );\n }\n return value;\n}\n\nexport function resolveGraphLayout(spec: GraphLayoutSpec): GraphLayoutSpec {\n const needsAutoLayout = spec.nodes.some(\n (node) => node.row === undefined || node.col === undefined,\n );\n let nodes = spec.nodes;\n\n if (needsAutoLayout) {\n for (const node of spec.nodes) {\n const hasRow = node.row !== undefined;\n const hasCol = node.col !== undefined;\n if (hasRow !== hasCol) {\n throw new Error(\n `Diagram node \"${node.id}\" needs both row and col, or neither for automatic graph layout.`,\n );\n }\n }\n\n const ids = spec.nodes.map((node) => node.id);\n const nodeIds = new Set(ids);\n const adjacency = new Map<string, string[]>();\n const indegree = new Map<string, number>();\n for (const id of ids) {\n adjacency.set(id, []);\n indegree.set(id, 0);\n }\n\n for (const edge of spec.edges) {\n const from = endpointNodeId(edge.from);\n const to = endpointNodeId(edge.to);\n if (!nodeIds.has(from) || !nodeIds.has(to) || from === to) continue;\n adjacency.get(from)?.push(to);\n indegree.set(to, (indegree.get(to) ?? 0) + 1);\n }\n\n const queue = ids.filter((id) => (indegree.get(id) ?? 0) === 0);\n const rank = new Map(ids.map((id) => [id, 0]));\n const order: string[] = [];\n // The loop visits the ids that it pushes onto the queue.\n for (const id of queue) {\n order.push(id);\n for (const to of adjacency.get(id) ?? []) {\n rank.set(to, Math.max(rank.get(to) ?? 0, (rank.get(id) ?? 0) + 1));\n indegree.set(to, (indegree.get(to) ?? 0) - 1);\n if (indegree.get(to) === 0) queue.push(to);\n }\n }\n\n if (order.length !== ids.length) {\n throw new Error(\n 'Diagram automatic graph layout requires an acyclic graph. Set row and col manually for cycles.',\n );\n }\n\n const usedRowsByCol = new Map<number, Set<number>>();\n for (const node of spec.nodes) {\n if (node.row === undefined || node.col === undefined) continue;\n const rows = usedRowsByCol.get(node.col) ?? new Set<number>();\n rows.add(node.row);\n usedRowsByCol.set(node.col, rows);\n }\n\n const nextOpenRow = (col: number) => {\n const rows = usedRowsByCol.get(col) ?? new Set<number>();\n let row = 0;\n while (rows.has(row)) row += 1;\n rows.add(row);\n usedRowsByCol.set(col, rows);\n return row;\n };\n\n nodes = spec.nodes.map((node) => {\n if (node.row !== undefined && node.col !== undefined) return node;\n const col = rank.get(node.id) ?? 0;\n return {\n ...node,\n col,\n row: nextOpenRow(col),\n };\n });\n }\n\n const groups = resolveGraphGroupBounds(spec.groups, nodes);\n if (nodes === spec.nodes && groups === spec.groups) return spec;\n return { ...spec, nodes, groups };\n}\n\nfunction resolveGraphGroupBounds(\n groups: DiagramGroup[] | undefined,\n nodes: DiagramNode[],\n): DiagramGroup[] | undefined {\n if (!groups?.length) return groups;\n let changed = false;\n const resolved = new Map<string, DiagramGroup>();\n const resolving = new Set<string>();\n\n const resolve = (group: DiagramGroup): DiagramGroup => {\n const cached = resolved.get(group.id);\n if (cached) return cached;\n if (resolving.has(group.id)) {\n throw new Error(\n `Diagram.Group \"${group.id}\" has a cyclic parent relationship.`,\n );\n }\n\n resolving.add(group.id);\n const childGroups = groups\n .filter((candidate) => candidate.parent === group.id)\n .map(resolve);\n\n let next = group;\n if (!group.bounds) {\n changed = true;\n next = {\n ...group,\n bounds: inferResolvedGroupBounds(group, nodes, childGroups),\n };\n }\n\n resolving.delete(group.id);\n resolved.set(group.id, next);\n return next;\n };\n\n const nextGroups = groups.map(resolve);\n return changed ? nextGroups : groups;\n}\n\nfunction inferResolvedGroupBounds(\n group: DiagramGroup,\n nodes: DiagramNode[],\n childGroups: DiagramGroup[] = [],\n): NonNullable<DiagramGroup['bounds']> {\n const grouped = nodes.filter((node) => node.group === group.id);\n if (grouped.length === 0 && childGroups.length === 0) {\n throw new Error(\n `Diagram.Group \"${group.id}\" needs bounds or direct node/group children so bounds can be inferred.`,\n );\n }\n const bounds = emptyBounds();\n for (const node of grouped) {\n const row = positionedValue(node, 'row');\n const col = positionedValue(node, 'col');\n includeBounds(bounds, {\n rowStart: row,\n rowEnd: row,\n colStart: col,\n colEnd: col + (node.colSpan ?? 1) - 1,\n });\n }\n for (const childGroup of childGroups) {\n includeBounds(bounds, requireGroupBounds(childGroup));\n }\n return bounds;\n}\n\nfunction emptyBounds(): NonNullable<DiagramGroup['bounds']> {\n return {\n rowStart: Number.POSITIVE_INFINITY,\n rowEnd: Number.NEGATIVE_INFINITY,\n colStart: Number.POSITIVE_INFINITY,\n colEnd: Number.NEGATIVE_INFINITY,\n };\n}\n\nfunction includeBounds(\n target: NonNullable<DiagramGroup['bounds']>,\n source: NonNullable<DiagramGroup['bounds']>,\n) {\n target.rowStart = Math.min(target.rowStart, source.rowStart);\n target.rowEnd = Math.max(target.rowEnd, source.rowEnd);\n target.colStart = Math.min(target.colStart, source.colStart);\n target.colEnd = Math.max(target.colEnd, source.colEnd);\n}\n\nfunction groupCornerInset(group: DiagramGroup) {\n const frame = group.frame ?? 'solid';\n if (frame === 'none') return 0;\n return group.rx ?? 12;\n}\n\nexport function groupBox(\n group: DiagramGroup,\n nodes?: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n): Box {\n const bounds = requireGroupBounds(group);\n const padding = groupPadding(group);\n const contained = nodes?.filter((n) => n.group === group.id) ?? [];\n const childGroups =\n groups?.filter((candidate) => candidate.parent === group.id) ?? [];\n const childBoxes = nodes\n ? [\n ...contained.map((node) => nodeVisualBox(node, nodeBox(node, layout))),\n ...childGroups.map((childGroup) =>\n groupBox(childGroup, nodes, layout, groups),\n ),\n ]\n : [];\n const tightX = group.tightX && childBoxes.length > 0;\n const tightY = (group.tight || group.tightY) && childBoxes.length > 0;\n const minChildX =\n childBoxes.length > 0 ? Math.min(...childBoxes.map((b) => b.x)) : 0;\n const maxChildX =\n childBoxes.length > 0 ? Math.max(...childBoxes.map((b) => b.x + b.w)) : 0;\n const x = tightX\n ? minChildX - padding.left\n : graphPadX(layout) +\n trackPosition('col', bounds.colStart, layout) -\n padding.left;\n const w = tightX\n ? maxChildX - minChildX + padding.left + padding.right\n : trackSpan('col', bounds.colStart, bounds.colEnd + 1, layout) +\n padding.left +\n padding.right;\n\n if (tightY && nodes) {\n const boxes = childBoxes;\n if (boxes.length > 0) {\n const minY = Math.min(...boxes.map((b) => b.y));\n const maxY = Math.max(...boxes.map((b) => b.y + b.h));\n const topPad = groupTopPadding(group, padding, true, bounds);\n const y = minY - topPad;\n const h = maxY - minY + topPad + padding.bottom;\n return { x, y, w, h };\n }\n }\n\n const y =\n graphPadY(layout) +\n trackPosition('row', bounds.rowStart, layout) -\n groupTopPadding(group, padding, false, bounds, nodes, layout, groups);\n const h =\n trackSpan('row', bounds.rowStart, bounds.rowEnd + 1, layout) +\n groupTopPadding(group, padding, false, bounds, nodes, layout, groups) +\n padding.bottom;\n return { x, y, w, h };\n}\n\nfunction groupTopPadding(\n group: DiagramGroup,\n padding: ReturnType<typeof groupPadding>,\n reserveTightLabel: boolean,\n bounds: NonNullable<DiagramGroup['bounds']>,\n nodes?: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n) {\n const titleGutterHeight = groupTitleGutterHeight(group);\n const childOverhang =\n titleGutterHeight > 0 && nodes\n ? groupChildTopOverhang(group, bounds, nodes, layout, groups)\n : 0;\n const tightLabelReserve =\n reserveTightLabel && groupLabelHeight(group) > 0\n ? groupLabelHeight(group) + GROUP_TITLE_GAP\n : 0;\n return Math.max(\n padding.top,\n titleGutterHeight + childOverhang,\n tightLabelReserve,\n );\n}\n\nfunction groupChildTopOverhang(\n group: DiagramGroup,\n bounds: NonNullable<DiagramGroup['bounds']>,\n nodes: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n) {\n const rowTop =\n graphPadY(layout) + trackPosition('row', bounds.rowStart, layout);\n const containedNodes = nodes.filter((node) => node.group === group.id);\n const childGroups =\n groups?.filter((candidate) => candidate.parent === group.id) ?? [];\n const childBoxes = [\n ...containedNodes.map((node) => nodeVisualBox(node, nodeBox(node, layout))),\n ...childGroups.map((childGroup) =>\n groupBox(childGroup, nodes, layout, groups),\n ),\n ];\n if (childBoxes.length === 0) return 0;\n return Math.max(0, ...childBoxes.map((box) => rowTop - box.y));\n}\n\nfunction groupPadding(group: DiagramGroup) {\n const padding = group.padding ?? GROUP_PAD;\n if (typeof padding === 'number') {\n return {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding,\n };\n }\n return {\n top: padding.top ?? GROUP_PAD,\n right: padding.right ?? GROUP_PAD,\n bottom: padding.bottom ?? GROUP_PAD,\n left: padding.left ?? GROUP_PAD,\n };\n}\n\nexport function groupLabelLines(group: DiagramGroup): string[] {\n if (Array.isArray(group.label)) return group.label;\n return group.label ? [group.label] : [];\n}\n\nexport function groupLabelHeight(group: DiagramGroup): number {\n const lines = groupLabelLines(group);\n if (lines.length === 0) return 0;\n return GROUP_LABEL_H + (lines.length - 1) * GROUP_LABEL_LINE_H;\n}\n\nexport function groupTitleGutterHeight(group: DiagramGroup): number {\n if (group.titleGap !== undefined && group.titleGap < 0) {\n throw new Error(\n `Diagram.Group \"${group.id}\" titleGap must be non-negative.`,\n );\n }\n const labelHeight = groupLabelHeight(group);\n if (labelHeight === 0) return 0;\n if (!group.titleBand && group.titleGap === undefined) return 0;\n return labelHeight + (group.titleGap ?? GROUP_TITLE_GAP);\n}\n\nfunction requireGroupBounds(\n group: DiagramGroup,\n): NonNullable<DiagramGroup['bounds']> {\n if (!group.bounds) {\n throw new Error(\n `Diagram.Group \"${group.id}\" needs bounds; resolve automatic graph layout before measuring groups.`,\n );\n }\n return group.bounds;\n}\n\nexport function groupDividerLines(\n group: DiagramGroup,\n nodes?: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n): GroupDividerLine[] {\n const bounds = requireGroupBounds(group);\n const box = groupBox(group, nodes, layout, groups);\n const lines: GroupDividerLine[] = [];\n\n for (const row of group.dividers?.rows ?? []) {\n if (row <= bounds.rowStart || row > bounds.rowEnd) {\n throw new Error(\n `Diagram.Group \"${group.id}\" row divider ${row} is outside group bounds.`,\n );\n }\n const y = graphPadY(layout) + trackPosition('row', row, layout);\n lines.push({\n axis: 'row',\n value: row,\n x1: box.x,\n y1: y,\n x2: box.x + box.w,\n y2: y,\n accent: group.accent ?? false,\n });\n }\n\n for (const col of group.dividers?.cols ?? []) {\n if (col <= bounds.colStart || col > bounds.colEnd) {\n throw new Error(\n `Diagram.Group \"${group.id}\" column divider ${col} is outside group bounds.`,\n );\n }\n const x = graphPadX(layout) + trackPosition('col', col, layout);\n lines.push({\n axis: 'col',\n value: col,\n x1: x,\n y1: box.y,\n x2: x,\n y2: box.y + box.h,\n accent: group.accent ?? false,\n });\n }\n\n return lines;\n}\n\nexport function svgDimensions(spec: GraphLayoutSpec) {\n spec = resolveGraphLayout(spec);\n const layout = spec.layout;\n let maxRow = 0;\n let maxCol = 0;\n let maxX = 0;\n let maxY = 0;\n for (const n of spec.nodes) {\n const row = positionedValue(n, 'row');\n const col = positionedValue(n, 'col');\n if (row > maxRow) maxRow = row;\n const lastCol = col + (n.colSpan ?? 1) - 1;\n if (lastCol > maxCol) maxCol = lastCol;\n }\n for (const g of spec.groups ?? []) {\n const bounds = requireGroupBounds(g);\n if (bounds.rowEnd > maxRow) maxRow = bounds.rowEnd;\n if (bounds.colEnd > maxCol) maxCol = bounds.colEnd;\n }\n for (const edge of spec.edges) {\n for (const point of resolveEdgeWaypoints(edge.waypoints, spec)) {\n if (point.x > maxX) maxX = point.x;\n if (point.y > maxY) maxY = point.y;\n }\n }\n for (const annotation of resolveGraphAnnotations(spec)) {\n const bounds = annotationTextBounds(annotation);\n if (bounds.x + bounds.w > maxX) maxX = bounds.x + bounds.w;\n if (bounds.y + bounds.h > maxY) maxY = bounds.y + bounds.h;\n for (const point of annotationLeaderBoundaryPoints(annotation)) {\n if (point.x > maxX) maxX = point.x;\n if (point.y > maxY) maxY = point.y;\n }\n }\n const resolved = graphLayout(layout);\n const gridW = resolved.padX * 2 + trackPosition('col', maxCol + 1, layout);\n const gridH =\n resolved.padY * 2 +\n resolved.titleTopPad +\n trackPosition('row', maxRow + 1, layout) +\n GROUP_PAD;\n const w = Math.max(gridW, maxX + resolved.padX);\n const h = Math.max(gridH, maxY + resolved.padY);\n return { w, h };\n}\n\nexport function graphContentViewBox(\n spec: GraphLayoutSpec,\n routedEdges: RoutedEdge[],\n padding = CONTENT_VIEWBOX_PAD,\n): ViewBox {\n spec = resolveGraphLayout(spec);\n const layout = spec.layout;\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n const includePoint = (point: Point) => {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n };\n const includeBox = (box: Box) => {\n includePoint({ x: box.x, y: box.y });\n includePoint({ x: box.x + box.w, y: box.y + box.h });\n };\n\n for (const node of spec.nodes) {\n if (!node.hidden) {\n const box = nodeBox(node, layout);\n includeBox(nodeVisualBox(node, box));\n const captionBounds = nodeCaptionBounds(node, box);\n if (captionBounds) includeBox(captionBounds);\n for (const port of nodePortPlacements(node, box)) {\n includePoint({ x: port.x, y: port.y });\n includePoint({ x: port.labelX, y: port.labelY });\n }\n }\n }\n for (const group of spec.groups ?? []) {\n const box = groupBox(group, spec.nodes, layout, spec.groups);\n includeBox(box);\n for (const port of groupPortPlacements(group, box)) {\n includePoint({ x: port.x, y: port.y });\n includePoint({ x: port.labelX, y: port.labelY });\n }\n for (const line of groupDividerLines(\n group,\n spec.nodes,\n layout,\n spec.groups,\n )) {\n includePoint({ x: line.x1, y: line.y1 });\n includePoint({ x: line.x2, y: line.y2 });\n }\n }\n for (const routedEdge of routedEdges) {\n for (const point of routedEdge.points) includePoint(point);\n if (routedEdge.labelPlacement) {\n includePoint({\n x: routedEdge.labelPlacement.x,\n y: routedEdge.labelPlacement.y,\n });\n if (routedEdge.edge.label) {\n includeBox(\n edgeLabelFrameBox(routedEdge.edge, routedEdge.labelPlacement),\n );\n }\n }\n if (routedEdge.badgePlacement) {\n includeBox(edgeBadgeBounds(routedEdge.edge, routedEdge.badgePlacement));\n }\n }\n for (const annotation of resolveGraphAnnotations(spec)) {\n includeBox(annotationTextBounds(annotation));\n for (const point of annotationLeaderBoundaryPoints(annotation)) {\n includePoint(point);\n }\n }\n\n if (\n !Number.isFinite(minX) ||\n !Number.isFinite(minY) ||\n !Number.isFinite(maxX) ||\n !Number.isFinite(maxY)\n ) {\n const { w, h } = svgDimensions(spec);\n return { x: 0, y: 0, w, h };\n }\n\n const x = Math.floor(minX - padding);\n const y = Math.floor(minY - padding);\n const w = Math.ceil(maxX - minX + padding * 2);\n const h = Math.ceil(maxY - minY + padding * 2);\n return { x, y, w, h };\n}\n\nfunction portPlacements(\n ownerId: string,\n ports: DiagramNodePort[] | undefined,\n box: Box,\n): PortPlacement[] {\n return (ports ?? []).map((port) => {\n const point = pointOnBoxSide(box, port.side, port.offset ?? 0);\n const labelGap = 10;\n if (port.side === 'left') {\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x - labelGap,\n labelY: point.y + 4,\n labelAlign: 'end',\n };\n }\n if (port.side === 'right') {\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x + labelGap,\n labelY: point.y + 4,\n labelAlign: 'start',\n };\n }\n if (port.side === 'top') {\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x,\n labelY: point.y - 8,\n labelAlign: 'middle',\n };\n }\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x,\n labelY: point.y + 18,\n labelAlign: 'middle',\n };\n });\n}\n\nexport function nodePortPlacements(\n node: DiagramNode,\n box = nodeBox(node),\n): PortPlacement[] {\n return portPlacements(node.id, node.ports, box);\n}\n\nexport function groupPortPlacements(\n group: DiagramGroup,\n box = groupBox(group),\n): PortPlacement[] {\n return portPlacements(group.id, group.ports, box);\n}\n\nexport function resolveGraphAnnotations(\n spec: GraphLayoutSpec,\n): ResolvedDiagramAnnotation[] {\n return (spec.annotations ?? []).map((annotation) =>\n resolveGraphAnnotation(annotation, spec),\n );\n}\n\nexport function resolveGraphAnnotation(\n annotation: DiagramAnnotation,\n spec: GraphLayoutSpec,\n): ResolvedDiagramAnnotation {\n if (annotation.target && annotation.targets !== undefined) {\n throw new Error('Diagram.Text accepts either target or targets, not both.');\n }\n\n if (annotation.targets !== undefined && annotation.targets.length === 0) {\n throw new Error('Diagram.Text targets must include at least one id.');\n }\n\n if (annotation.guide && !annotation.target && !annotation.targets?.length) {\n throw new Error(\n `Diagram.Text guide \"${annotation.guide}\" needs a target node/group id to place a lane callout.`,\n );\n }\n\n if (annotation.targets?.length) {\n const targetBoxes = annotation.targets.map((target) => ({\n target,\n box: targetBoxForAnnotation(target, spec),\n }));\n const targetBox = unionBoxes(targetBoxes.map(({ box }) => box));\n const anchor = annotation.anchor ?? 'top';\n const point = annotation.guide\n ? annotationGuidePoint(annotation.guide, targetBox, anchor, spec)\n : anchorPoint(targetBox, anchor, annotation.offset ?? 16);\n const resolvedPoint = {\n x: point.x + (annotation.dx ?? 0),\n y: point.y + (annotation.dy ?? 0),\n };\n const leaders = annotation.leader\n ? targetBoxes.map(({ target, box }) => {\n const leader = annotationLeaderPoints(\n annotation,\n box,\n anchor,\n resolvedPoint,\n );\n return {\n target,\n anchor,\n ...leader,\n };\n })\n : undefined;\n return {\n ...annotation,\n x: resolvedPoint.x,\n y: resolvedPoint.y,\n align: annotation.align ?? defaultAnnotationAlign(anchor),\n leaders,\n };\n }\n\n if (annotation.target) {\n const targetBox = targetBoxForAnnotation(annotation.target, spec);\n const anchor = annotation.anchor ?? 'top';\n const point = annotation.guide\n ? annotationGuidePoint(annotation.guide, targetBox, anchor, spec)\n : anchorPoint(targetBox, anchor, annotation.offset ?? 16);\n const resolvedPoint = {\n x: point.x + (annotation.dx ?? 0),\n y: point.y + (annotation.dy ?? 0),\n };\n const leader = annotation.leader\n ? annotationLeaderPoints(annotation, targetBox, anchor, resolvedPoint)\n : null;\n return {\n ...annotation,\n x: resolvedPoint.x,\n y: resolvedPoint.y,\n align: annotation.align ?? defaultAnnotationAlign(anchor),\n leaderFrom: leader?.from,\n leaderTo: leader?.to,\n leaders: leader\n ? [\n {\n target: annotation.target,\n anchor,\n ...leader,\n },\n ]\n : undefined,\n };\n }\n\n if (annotation.x === undefined || annotation.y === undefined) {\n throw new Error(\n 'Diagram.Text needs x/y coordinates or a target node/group id.',\n );\n }\n\n return {\n ...annotation,\n x: annotation.x,\n y: annotation.y,\n };\n}\n\nfunction annotationGuidePoint(\n guideId: string,\n targetBox: Box,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n spec: GraphLayoutSpec,\n): Point {\n const guide = guideForId(guideId, spec, 'Diagram.Text');\n const line = resolveGuideLine(guide, spec, 'Diagram.Text');\n const targetPoint = anchorPoint(targetBox, anchor, 0);\n if (line.orientation === 'vertical') {\n return { x: line.x, y: targetPoint.y };\n }\n return { x: targetPoint.x, y: line.y };\n}\n\nfunction targetBoxForAnnotation(target: string, spec: GraphLayoutSpec): Box {\n const node = spec.nodes.find((candidate) => candidate.id === target);\n if (node) return nodeBox(node, spec.layout);\n const group = spec.groups?.find((candidate) => candidate.id === target);\n if (group) return groupBox(group, spec.nodes, spec.layout, spec.groups);\n throw new Error(\n `Diagram.Text target \"${target}\" does not match a node or group.`,\n );\n}\n\nfunction unionBoxes(boxes: Box[]): Box {\n const minX = Math.min(...boxes.map((box) => box.x));\n const minY = Math.min(...boxes.map((box) => box.y));\n const maxX = Math.max(...boxes.map((box) => box.x + box.w));\n const maxY = Math.max(...boxes.map((box) => box.y + box.h));\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n}\n\nfunction anchorPoint(\n box: Box,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n offset: number,\n): Point {\n const centerX = box.x + box.w / 2;\n const centerY = box.y + box.h / 2;\n if (anchor === 'top') return { x: centerX, y: box.y - offset };\n if (anchor === 'bottom') return { x: centerX, y: box.y + box.h + offset };\n if (anchor === 'left') return { x: box.x - offset, y: centerY };\n if (anchor === 'right') return { x: box.x + box.w + offset, y: centerY };\n return { x: centerX, y: centerY };\n}\n\nfunction annotationLeaderPoints(\n annotation: DiagramAnnotation,\n targetBox: Box,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n textPoint: Point,\n): Omit<DiagramAnnotationLeader, 'target' | 'anchor'> {\n const from = anchorPoint(targetBox, anchor, 0);\n const gap = annotation.leaderGap ?? 6;\n const fontSize = annotation.fontSize ?? 11;\n const route = annotation.leaderRoute ?? 'straight';\n const finish = (to: Point) => ({\n route,\n from,\n to,\n points: annotationLeaderRoutePoints(route, anchor, from, to),\n });\n if (anchor === 'right') {\n return finish({ x: textPoint.x - gap, y: textPoint.y });\n }\n if (anchor === 'left') {\n return finish({ x: textPoint.x + gap, y: textPoint.y });\n }\n if (anchor === 'top') {\n return finish({ x: textPoint.x, y: textPoint.y + fontSize + gap });\n }\n if (anchor === 'bottom') {\n return finish({ x: textPoint.x, y: textPoint.y - fontSize - gap });\n }\n return finish(textPoint);\n}\n\nfunction annotationLeaderRoutePoints(\n route: NonNullable<DiagramAnnotation['leaderRoute']>,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n from: Point,\n to: Point,\n): Point[] {\n if (route === 'straight') return [from, to];\n if (anchor === 'center') return [from, to];\n return compactLeaderPoints([from, { x: from.x, y: to.y }, to]);\n}\n\nfunction compactLeaderPoints(points: Point[]): Point[] {\n return points.filter((point, index) => {\n const previous = points[index - 1];\n return !previous || previous.x !== point.x || previous.y !== point.y;\n });\n}\n\nfunction defaultAnnotationAlign(\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n): NonNullable<DiagramAnnotation['align']> {\n if (anchor === 'left') return 'end';\n if (anchor === 'right') return 'start';\n return 'middle';\n}\n\nfunction annotationTextBounds(annotation: ResolvedDiagramAnnotation): Box {\n const fontSize = annotation.fontSize ?? 11;\n const lineHeight = fontSize + (annotation.lineGap ?? ANNOTATION_LINE_GAP);\n const width = widestLine(annotation.text, fontSize, 'sans');\n const height =\n textLineBox(fontSize, 'sans') +\n Math.max(0, annotation.text.length - 1) * lineHeight;\n const align = annotation.align ?? 'middle';\n let x = annotation.x - width / 2;\n if (align === 'start') x = annotation.x;\n if (align === 'end') x = annotation.x - width;\n return {\n x,\n y: annotation.y - fontSize,\n w: width,\n h: height,\n };\n}\n\nfunction annotationLeaderBoundaryPoints(\n annotation: ResolvedDiagramAnnotation,\n): Point[] {\n if (annotation.leaders?.length) {\n return annotation.leaders.flatMap((leader) => leader.points);\n }\n return [annotation.leaderFrom, annotation.leaderTo].filter(\n (point): point is Point => point !== undefined,\n );\n}\n\nclass MinHeap<T> {\n private data: { item: T; priority: number }[] = [];\n push(item: T, priority: number) {\n this.data.push({ item, priority });\n this.bubbleUp(this.data.length - 1);\n }\n pop(): T | undefined {\n const top = this.data[0];\n if (!top) return undefined;\n const last = this.data.pop();\n if (last && this.data.length > 0) {\n this.data[0] = last;\n this.bubbleDown(0);\n }\n return top.item;\n }\n empty() {\n return this.data.length === 0;\n }\n private bubbleUp(i: number) {\n while (i > 0) {\n const parent = (i - 1) >> 1;\n const entry = this.data[i];\n const parentEntry = this.data[parent];\n if (!entry || !parentEntry || entry.priority >= parentEntry.priority)\n break;\n this.data[i] = parentEntry;\n this.data[parent] = entry;\n i = parent;\n }\n }\n private bubbleDown(i: number) {\n while (true) {\n const entry = this.data[i];\n if (!entry) break;\n let smallest = i;\n let smallestEntry = entry;\n const left = this.data[2 * i + 1];\n if (left && left.priority < smallestEntry.priority) {\n smallest = 2 * i + 1;\n smallestEntry = left;\n }\n const right = this.data[2 * i + 2];\n if (right && right.priority < smallestEntry.priority) {\n smallest = 2 * i + 2;\n smallestEntry = right;\n }\n if (smallest === i) break;\n this.data[i] = smallestEntry;\n this.data[smallest] = entry;\n i = smallest;\n }\n }\n}\n\nfunction manhattan(a: Point, b: Point): number {\n return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction dirCode(from: Point, to: Point): number {\n if (to.x > from.x) return 0;\n if (to.x < from.x) return 1;\n if (to.y > from.y) return 2;\n return 3;\n}\n\nexport function snapToGrid(v: number): number {\n return Math.round(v / ROUTE_CELL) * ROUTE_CELL;\n}\n\nexport function buildObstacles(\n nodes: DiagramNode[],\n gridW: number,\n gridH: number,\n layout?: DiagramGraphLayout,\n): Set<number> {\n const blocked = new Set<number>();\n for (const n of nodes) {\n if (n.hidden) continue;\n const b = nodeVisualBox(n, nodeBox(n, layout));\n const x0 = Math.floor((b.x - NODE_PAD) / ROUTE_CELL);\n const y0 = Math.floor((b.y - NODE_PAD) / ROUTE_CELL);\n const x1 = Math.ceil((b.x + b.w + NODE_PAD) / ROUTE_CELL);\n const y1 = Math.ceil((b.y + b.h + NODE_PAD) / ROUTE_CELL);\n for (let y = y0; y <= y1; y++) {\n for (let x = x0; x <= x1; x++) {\n if (x < 0 || x >= gridW || y < 0 || y >= gridH) continue;\n blocked.add(y * gridW + x);\n }\n }\n }\n return blocked;\n}\n\nfunction pickDiagramSidesByGap(\n source: Box,\n target: Box,\n): {\n exitSide: DiagramSide;\n entrySide: DiagramSide;\n} {\n const tIsRight = target.x >= source.x + source.w;\n const tIsLeft = target.x + target.w <= source.x;\n const tIsBelow = target.y >= source.y + source.h;\n const tIsAbove = target.y + target.h <= source.y;\n\n const horizontalGap = tIsRight\n ? target.x - (source.x + source.w)\n : tIsLeft\n ? source.x - (target.x + target.w)\n : null;\n const verticalGap = tIsBelow\n ? target.y - (source.y + source.h)\n : tIsAbove\n ? source.y - (target.y + target.h)\n : null;\n\n const useVertical =\n verticalGap !== null &&\n (horizontalGap === null || verticalGap <= horizontalGap);\n\n if (useVertical) {\n return tIsBelow\n ? { exitSide: 'bottom', entrySide: 'top' }\n : { exitSide: 'top', entrySide: 'bottom' };\n }\n return tIsRight\n ? { exitSide: 'right', entrySide: 'left' }\n : { exitSide: 'left', entrySide: 'right' };\n}\n\nexport function endpointsForDiagramSides(\n source: Box,\n target: Box,\n exitSide: DiagramSide,\n entrySide: DiagramSide,\n exitOffset = 0,\n entryOffset = 0,\n entryGap = ENTRY_GAP,\n): {\n exit: Point;\n entry: Point;\n exitSide: DiagramSide;\n entrySide: DiagramSide;\n} {\n const sCenter = { x: source.x + source.w / 2, y: source.y + source.h / 2 };\n const tCenter = { x: target.x + target.w / 2, y: target.y + target.h / 2 };\n\n let exit: Point;\n if (exitSide === 'top') {\n exit = { x: snapToGrid(sCenter.x + exitOffset), y: source.y };\n } else if (exitSide === 'bottom') {\n exit = { x: snapToGrid(sCenter.x + exitOffset), y: source.y + source.h };\n } else if (exitSide === 'left') {\n exit = { x: source.x, y: snapToGrid(sCenter.y + exitOffset) };\n } else {\n exit = { x: source.x + source.w, y: snapToGrid(sCenter.y + exitOffset) };\n }\n\n let entry: Point;\n if (entrySide === 'top') {\n entry = {\n x: snapToGrid(tCenter.x + entryOffset),\n y: target.y - entryGap,\n };\n } else if (entrySide === 'bottom') {\n entry = {\n x: snapToGrid(tCenter.x + entryOffset),\n y: target.y + target.h + entryGap,\n };\n } else if (entrySide === 'left') {\n entry = {\n x: target.x - entryGap,\n y: snapToGrid(tCenter.y + entryOffset),\n };\n } else {\n entry = {\n x: target.x + target.w + entryGap,\n y: snapToGrid(tCenter.y + entryOffset),\n };\n }\n\n return { exit, entry, exitSide, entrySide };\n}\n\nexport function pickEndpoints(\n source: Box,\n target: Box,\n hint?: { exitSide?: DiagramSide; entrySide?: DiagramSide },\n exitOffset = 0,\n entryOffset = 0,\n entryGap = ENTRY_GAP,\n): {\n exit: Point;\n entry: Point;\n exitSide: DiagramSide;\n entrySide: DiagramSide;\n} {\n const sides =\n hint?.exitSide && hint?.entrySide\n ? { exitSide: hint.exitSide, entrySide: hint.entrySide }\n : pickDiagramSidesByGap(source, target);\n\n return endpointsForDiagramSides(\n source,\n target,\n sides.exitSide,\n sides.entrySide,\n exitOffset,\n entryOffset,\n entryGap,\n );\n}\n\nexport function computeStub(\n point: Point,\n side: DiagramSide,\n distance = STUB,\n): Point {\n if (side === 'top') return { x: point.x, y: point.y - distance };\n if (side === 'bottom') return { x: point.x, y: point.y + distance };\n if (side === 'left') return { x: point.x - distance, y: point.y };\n return { x: point.x + distance, y: point.y };\n}\n\nfunction tryStraightLine(\n from: Point,\n to: Point,\n blocked: Set<number>,\n gridW: number,\n): boolean {\n if (from.x === to.x) {\n const x = Math.round(from.x / ROUTE_CELL);\n const y0 = Math.min(from.y, to.y);\n const y1 = Math.max(from.y, to.y);\n for (let y = y0; y <= y1; y += ROUTE_CELL) {\n const gy = Math.round(y / ROUTE_CELL);\n if (blocked.has(gy * gridW + x)) return false;\n }\n return true;\n }\n if (from.y === to.y) {\n const y = Math.round(from.y / ROUTE_CELL);\n const x0 = Math.min(from.x, to.x);\n const x1 = Math.max(from.x, to.x);\n for (let x = x0; x <= x1; x += ROUTE_CELL) {\n const gx = Math.round(x / ROUTE_CELL);\n if (blocked.has(y * gridW + gx)) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction reserveRoutedEdge(\n blocked: Set<number>,\n points: Point[],\n gridW: number,\n gridH: number,\n) {\n if (points.length < 2) return;\n for (let i = 0; i < points.length - 1; i++) {\n const isEndpointStub =\n points.length > 2 && (i === 0 || i === points.length - 2);\n const from = points[i];\n const to = points[i + 1];\n if (isEndpointStub || !from || !to) continue;\n reserveSegment(blocked, from, to, gridW, gridH);\n }\n}\n\nfunction reserveSegment(\n blocked: Set<number>,\n from: Point,\n to: Point,\n gridW: number,\n gridH: number,\n) {\n if (from.x !== to.x && from.y !== to.y) return;\n const x0 = Math.round(Math.min(from.x, to.x) / ROUTE_CELL);\n const x1 = Math.round(Math.max(from.x, to.x) / ROUTE_CELL);\n const y0 = Math.round(Math.min(from.y, to.y) / ROUTE_CELL);\n const y1 = Math.round(Math.max(from.y, to.y) / ROUTE_CELL);\n for (let y = y0; y <= y1; y++) {\n for (let x = x0; x <= x1; x++) {\n for (\n let dy = -ROUTE_RESERVATION_CELLS;\n dy <= ROUTE_RESERVATION_CELLS;\n dy++\n ) {\n for (\n let dx = -ROUTE_RESERVATION_CELLS;\n dx <= ROUTE_RESERVATION_CELLS;\n dx++\n ) {\n const gx = x + dx;\n const gy = y + dy;\n if (gx < 0 || gx >= gridW || gy < 0 || gy >= gridH) continue;\n blocked.add(gy * gridW + gx);\n }\n }\n }\n }\n}\n\nfunction aStar(\n start: Point,\n goal: Point,\n blocked: Set<number>,\n gridW: number,\n gridH: number,\n): Point[] | null {\n const startKey = start.y * gridW + start.x;\n const goalKey = goal.y * gridW + goal.x;\n if (startKey === goalKey) return [start];\n\n type Node = { pt: Point; dir: number | null };\n const open = new MinHeap<Node>();\n const gScore = new Map<number, number>();\n const cameFrom = new Map<number, Point>();\n\n gScore.set(startKey, 0);\n open.push({ pt: start, dir: null }, manhattan(start, goal));\n\n const DIRS: [number, number][] = [\n [1, 0],\n [-1, 0],\n [0, 1],\n [0, -1],\n ];\n\n while (!open.empty()) {\n const current = open.pop();\n if (!current) break;\n const cur = current.pt;\n const curKey = cur.y * gridW + cur.x;\n if (curKey === goalKey) {\n const path: Point[] = [cur];\n let k = curKey;\n while (cameFrom.has(k)) {\n const prev = cameFrom.get(k);\n if (!prev) break;\n path.unshift(prev);\n k = prev.y * gridW + prev.x;\n }\n return path;\n }\n\n const lastDir = current.dir;\n\n for (const [dx, dy] of DIRS) {\n const nx = cur.x + dx;\n const ny = cur.y + dy;\n if (nx < 0 || nx >= gridW || ny < 0 || ny >= gridH) continue;\n const nKey = ny * gridW + nx;\n if (blocked.has(nKey) && nKey !== goalKey) continue;\n const newDir = dirCode(cur, { x: nx, y: ny });\n const turnCost =\n lastDir !== null && newDir !== lastDir ? TURN_PENALTY : 0;\n const tentativeG = (gScore.get(curKey) ?? 0) + 1 + turnCost;\n const existingG = gScore.get(nKey);\n if (existingG !== undefined && tentativeG >= existingG) continue;\n gScore.set(nKey, tentativeG);\n cameFrom.set(nKey, cur);\n const f = tentativeG + manhattan({ x: nx, y: ny }, goal);\n open.push({ pt: { x: nx, y: ny }, dir: newDir }, f);\n }\n }\n return null;\n}\n\nexport function simplifyPath(path: Point[]): Point[] {\n const first = path[0];\n const last = path.at(-1);\n if (path.length < 3 || !first || !last) return path;\n const result: Point[] = [first];\n let prev = first;\n for (let i = 1; i < path.length - 1; i++) {\n const cur = path[i];\n const next = path[i + 1];\n if (!cur || !next) continue;\n const cross =\n (cur.x - prev.x) * (next.y - cur.y) - (cur.y - prev.y) * (next.x - cur.x);\n if (cross === 0) continue;\n result.push(cur);\n prev = cur;\n }\n result.push(last);\n return result;\n}\n\nexport function pathToSvg(points: Point[], radius = 8): string {\n const [first, second] = points;\n const last = points.at(-1);\n if (!first || !last) return '';\n if (!second) return `M ${first.x} ${first.y}`;\n if (points.length === 2)\n return `M ${first.x} ${first.y} L ${second.x} ${second.y}`;\n\n const parts = [`M ${first.x} ${first.y}`];\n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const cur = points[i];\n const next = points[i + 1];\n if (!prev || !cur || !next) continue;\n const dpx = cur.x - prev.x;\n const dpy = cur.y - prev.y;\n const dnx = next.x - cur.x;\n const dny = next.y - cur.y;\n const lp = Math.hypot(dpx, dpy);\n const ln = Math.hypot(dnx, dny);\n const r = Math.min(radius, lp / 2, ln / 2);\n const cs = {\n x: cur.x - (dpx / lp) * r,\n y: cur.y - (dpy / lp) * r,\n };\n const ce = {\n x: cur.x + (dnx / ln) * r,\n y: cur.y + (dny / ln) * r,\n };\n parts.push(`L ${cs.x} ${cs.y}`);\n parts.push(`Q ${cur.x} ${cur.y} ${ce.x} ${ce.y}`);\n }\n parts.push(`L ${last.x} ${last.y}`);\n return parts.join(' ');\n}\n\nexport type LabelPlacement = {\n x: number;\n y: number;\n align: NonNullable<DiagramEdge['labelAlign']>;\n side: 'above' | 'below' | 'left' | 'right';\n segmentIndex?: number;\n};\n\nexport type BadgePlacement = {\n x: number;\n y: number;\n side: 'above' | 'below' | 'left' | 'right';\n};\n\ntype LabelBounds = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n};\n\nfunction computeLabelPlacement(\n points: Point[],\n edge?: DiagramEdge,\n): LabelPlacement | null {\n if (points.length < 2) return null;\n if (edge?.labelSegment !== undefined) {\n const segmentIndex = resolveLabelSegmentIndex(edge.labelSegment, points);\n const a = points[segmentIndex];\n const b = points[segmentIndex + 1];\n if (!a || !b) return null;\n return {\n ...edgeLabelPlacementForSegment(a, b, edge),\n segmentIndex,\n };\n }\n if (edge?.labelT !== undefined) {\n const anchor = pathAnchorAtFraction(points, edge.labelT);\n if (!anchor) return null;\n if (edge.labelSide && edge.labelSide !== 'auto') {\n return edgeLabelPlacementFromHint(anchor.point.x, anchor.point.y, edge);\n }\n const isHorizontal = anchor.from.y === anchor.to.y;\n if (isHorizontal) {\n return {\n x: anchor.point.x,\n y: anchor.point.y - 10,\n align: 'middle',\n side: 'above',\n };\n }\n return {\n x: anchor.point.x + 10,\n y: anchor.point.y,\n align: 'start',\n side: 'right',\n };\n }\n\n let bestI = 0;\n let bestLen = -1;\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i];\n const b = points[i + 1];\n if (!a || !b) continue;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len > bestLen) {\n bestLen = len;\n bestI = i;\n }\n }\n const a = points[bestI];\n const b = points[bestI + 1];\n if (!a || !b) return null;\n return {\n ...edgeLabelPlacementForSegment(a, b, edge),\n segmentIndex: bestI,\n };\n}\n\nfunction resolveLabelSegmentIndex(segment: number, points: Point[]) {\n if (!Number.isInteger(segment) || segment < 0) {\n throw new Error(\n `Diagram edge labelSegment must be a non-negative integer, got ${segment}.`,\n );\n }\n const maxSegment = points.length - 2;\n if (segment > maxSegment) {\n throw new Error(\n `Diagram edge labelSegment ${segment} is outside routed path segments 0-${maxSegment}.`,\n );\n }\n return segment;\n}\n\nfunction edgeLabelPlacementForSegment(\n a: Point,\n b: Point,\n edge?: DiagramEdge,\n): LabelPlacement {\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n if (edge?.labelSide && edge.labelSide !== 'auto') {\n return edgeLabelPlacementFromHint(midX, midY, edge);\n }\n\n const isHorizontal = a.y === b.y;\n if (isHorizontal) {\n return { x: midX, y: midY - 10, align: 'middle', side: 'above' };\n }\n return { x: midX + 10, y: midY, align: 'start', side: 'right' };\n}\n\nfunction computeBadgePlacement(\n points: Point[],\n edge: DiagramEdge,\n): BadgePlacement | null {\n if (!edge.badgeIcon && !edge.badgeLabel?.length) return null;\n const anchor = pointAtPathFraction(points, edge.badgeT ?? 0.5);\n if (!anchor) return null;\n const side =\n edge.badgeSide && edge.badgeSide !== 'auto' ? edge.badgeSide : 'above';\n const offset = edge.badgeOffset ?? 22;\n const dx = edge.badgeDx ?? 0;\n const dy = edge.badgeDy ?? 0;\n\n if (side === 'above') {\n return { x: anchor.x + dx, y: anchor.y - offset + dy, side };\n }\n if (side === 'below') {\n return { x: anchor.x + dx, y: anchor.y + offset + dy, side };\n }\n if (side === 'left') {\n return { x: anchor.x - offset + dx, y: anchor.y + dy, side };\n }\n return { x: anchor.x + offset + dx, y: anchor.y + dy, side };\n}\n\nfunction pointAtPathFraction(points: Point[], fraction: number): Point | null {\n return pathAnchorAtFraction(points, fraction)?.point ?? null;\n}\n\nfunction pathAnchorAtFraction(\n points: Point[],\n fraction: number,\n): { point: Point; from: Point; to: Point } | null {\n const first = points[0];\n const last = points.at(-1);\n const beforeLast = points.at(-2);\n if (!first || !last) return null;\n if (!beforeLast) {\n return { point: first, from: first, to: first };\n }\n const clamped = Math.max(0, Math.min(1, fraction));\n const segments: { from: Point; to: Point; length: number }[] = [];\n let from = first;\n for (const to of points.slice(1)) {\n segments.push({\n from,\n to,\n length: Math.hypot(to.x - from.x, to.y - from.y),\n });\n from = to;\n }\n const total = segments.reduce((sum, segment) => sum + segment.length, 0);\n if (total === 0) {\n return { point: first, from: first, to: first };\n }\n let target = total * clamped;\n for (const segment of segments) {\n if (target > segment.length) {\n target -= segment.length;\n continue;\n }\n const ratio = segment.length === 0 ? 0 : target / segment.length;\n return {\n point: {\n x: segment.from.x + (segment.to.x - segment.from.x) * ratio,\n y: segment.from.y + (segment.to.y - segment.from.y) * ratio,\n },\n from: segment.from,\n to: segment.to,\n };\n }\n return {\n point: last,\n from: beforeLast,\n to: last,\n };\n}\n\nfunction edgeLabelPlacementFromHint(\n midX: number,\n midY: number,\n edge: DiagramEdge,\n): LabelPlacement {\n const side = edge.labelSide;\n if (!side || side === 'auto') {\n throw new Error('Diagram edge label side must be resolved before use.');\n }\n const offset = edge.labelOffset ?? 10;\n const dx = edge.labelDx ?? 0;\n const dy = edge.labelDy ?? 0;\n const align =\n edge.labelAlign ??\n (side === 'left' ? 'end' : side === 'right' ? 'start' : 'middle');\n\n if (side === 'above') {\n return { x: midX + dx, y: midY - offset + dy, align, side };\n }\n if (side === 'below') {\n return { x: midX + dx, y: midY + offset + dy, align, side };\n }\n if (side === 'left') {\n return { x: midX - offset + dx, y: midY + dy, align, side };\n }\n return { x: midX + offset + dx, y: midY + dy, align, side };\n}\n\nfunction deconflictLabelPlacements(routedEdges: RoutedEdge[]): RoutedEdge[] {\n const occupied: LabelBounds[] = [];\n return routedEdges.map((routedEdge) => {\n const placement = routedEdge.labelPlacement;\n const label = routedEdge.edge.label;\n if (!placement || !label?.length) return routedEdge;\n\n const nextPlacement = placeLabel(placement, routedEdge.edge, occupied);\n occupied.push(edgeLabelBounds(routedEdge.edge, nextPlacement));\n if (nextPlacement === placement) return routedEdge;\n return {\n ...routedEdge,\n labelPlacement: nextPlacement,\n };\n });\n}\n\nfunction placeLabel(\n placement: LabelPlacement,\n edge: DiagramEdge,\n occupied: LabelBounds[],\n): LabelPlacement {\n const maxAttempts = Math.max(12, occupied.length * 2 + 8);\n for (const offset of labelOffsetCandidates(placement, edge, maxAttempts)) {\n const candidate = offsetLabelPlacement(placement, offset);\n const bounds = edgeLabelBounds(edge, candidate);\n if (!occupied.some((other) => labelBoundsOverlap(bounds, other))) {\n return candidate;\n }\n }\n\n throw new Error(\n 'Diagram edge labels could not be placed without overlap. Add waypoints or split the diagram.',\n );\n}\n\nfunction labelOffsetCandidates(\n placement: LabelPlacement,\n edge: DiagramEdge,\n maxAttempts: number,\n): Point[] {\n const size = edgeLabelSize(edge);\n const step =\n placement.side === 'above' || placement.side === 'below'\n ? size.h + EDGE_LABEL_GAP\n : size.w + EDGE_LABEL_GAP;\n const candidates: Point[] = [{ x: 0, y: 0 }];\n\n for (let i = 1; candidates.length < maxAttempts; i++) {\n const primary = i * step;\n if (placement.side === 'above') {\n candidates.push({ x: 0, y: -primary }, { x: 0, y: primary });\n } else if (placement.side === 'below') {\n candidates.push({ x: 0, y: primary }, { x: 0, y: -primary });\n } else if (placement.side === 'left') {\n candidates.push({ x: -primary, y: 0 }, { x: primary, y: 0 });\n } else {\n candidates.push({ x: primary, y: 0 }, { x: -primary, y: 0 });\n }\n }\n\n return candidates.slice(0, maxAttempts);\n}\n\nfunction offsetLabelPlacement(\n placement: LabelPlacement,\n offset: Point,\n): LabelPlacement {\n if (offset.x === 0 && offset.y === 0) return placement;\n return {\n ...placement,\n x: placement.x + offset.x,\n y: placement.y + offset.y,\n };\n}\n\nexport function edgeLabelFontSize(edge: DiagramEdge) {\n return edge.labelFontSize ?? EDGE_LABEL_FONT_SIZE;\n}\n\nexport function edgeLabelFramePad(edge: DiagramEdge) {\n return edge.labelFramePadding ?? EDGE_LABEL_BOX_PAD;\n}\n\nexport function edgeLabelSize(edge: DiagramEdge) {\n const label = edge.label ?? [];\n const pad = edgeLabelFramePad(edge);\n return {\n w: widestLine(label, edgeLabelFontSize(edge), 'mono') + pad * 2,\n h:\n textLineBox(edgeLabelFontSize(edge), 'mono') +\n Math.max(0, label.length - 1) * edgeLabelLineHeight(edge) +\n pad * 2,\n };\n}\n\nexport function edgeLabelAscent(edge: DiagramEdge) {\n return textAscent(edgeLabelFontSize(edge), 'mono') + edgeLabelFramePad(edge);\n}\n\nexport function edgeLabelLineHeight(edge: DiagramEdge) {\n return edgeLabelFontSize(edge) + (edge.labelLineGap ?? EDGE_LABEL_LINE_GAP);\n}\n\nexport function edgeBadgeSize(edge: DiagramEdge) {\n const label = edge.badgeLabel ?? [];\n const labelWidth = widestLine(label, EDGE_BADGE_FONT_SIZE, 'sans');\n const iconWidth = edge.badgeIcon ? EDGE_BADGE_ICON : 0;\n const gap = edge.badgeIcon && label.length > 0 ? 8 : 0;\n return {\n w: Math.max(24, iconWidth + gap + labelWidth) + 16,\n h: Math.max(24, label.length * EDGE_LABEL_LINE_H) + 12,\n };\n}\n\nfunction edgeBadgeBounds(edge: DiagramEdge, placement: BadgePlacement): Box {\n const { w, h } = edgeBadgeSize(edge);\n return {\n x: placement.x - w / 2,\n y: placement.y - h / 2,\n w,\n h,\n };\n}\n\nfunction edgeLabelBounds(\n edge: DiagramEdge,\n placement: LabelPlacement,\n): LabelBounds {\n const box = edgeLabelFrameBox(edge, placement);\n return {\n x1: box.x,\n y1: box.y,\n x2: box.x + box.w,\n y2: box.y + box.h,\n };\n}\n\nexport function edgeLabelFrameBox(\n edge: DiagramEdge,\n placement: LabelPlacement,\n): Box {\n const { w, h } = edgeLabelSize(edge);\n const y = placement.y - edgeLabelAscent(edge);\n if (placement.align === 'middle') return { x: placement.x - w / 2, y, w, h };\n if (placement.align === 'end') return { x: placement.x - w, y, w, h };\n return { x: placement.x, y, w, h };\n}\n\nfunction labelBoundsOverlap(a: LabelBounds, b: LabelBounds) {\n return a.x1 < b.x2 && a.x2 > b.x1 && a.y1 < b.y2 && a.y2 > b.y1;\n}\n\nfunction resolveEdgeWaypoints(\n waypoints: DiagramWaypoint[] | undefined,\n spec: GraphLayoutSpec,\n): Point[] {\n const layout = spec.layout;\n return (waypoints ?? []).map((waypoint) => {\n if ('guide' in waypoint) return resolveGuideWaypoint(waypoint, spec);\n if ('x' in waypoint && 'y' in waypoint) return waypoint;\n if ('target' in waypoint) {\n const point = targetAnchorPoint(\n waypoint.target,\n waypoint.anchor ?? 'center',\n waypoint.gap ?? 0,\n spec,\n );\n return {\n x: snapToGrid(point.x + (waypoint.dx ?? 0)),\n y: snapToGrid(point.y + (waypoint.dy ?? 0)),\n };\n }\n return {\n x: snapToGrid(\n graphPadX(layout) +\n trackPosition('col', waypoint.col, layout) +\n (waypoint.dx ?? 0),\n ),\n y: snapToGrid(\n graphPadY(layout) +\n trackPosition('row', waypoint.row, layout) +\n (waypoint.dy ?? 0),\n ),\n };\n });\n}\n\ntype GuideWaypoint = Extract<DiagramWaypoint, { guide: string }>;\n\ntype ResolvedGuideLine =\n | { orientation: 'vertical'; x: number }\n | { orientation: 'horizontal'; y: number };\n\nfunction resolveGuideWaypoint(\n waypoint: GuideWaypoint,\n spec: GraphLayoutSpec,\n): Point {\n const guide = guideForId(waypoint.guide, spec, 'Diagram.Waypoint');\n const line = resolveGuideLine(guide, spec, 'Diagram.Waypoint');\n if (line.orientation === 'vertical') {\n return {\n x: snapToGrid(line.x + (waypoint.dx ?? 0)),\n y: snapToGrid(\n guideWaypointCrossAxis('y', waypoint, spec) + (waypoint.dy ?? 0),\n ),\n };\n }\n return {\n x: snapToGrid(\n guideWaypointCrossAxis('x', waypoint, spec) + (waypoint.dx ?? 0),\n ),\n y: snapToGrid(line.y + (waypoint.dy ?? 0)),\n };\n}\n\nfunction guideForId(\n guideId: string,\n spec: GraphLayoutSpec,\n consumer: string,\n): DiagramGuide {\n const matches = (spec.guides ?? []).filter(\n (candidate) => candidate.id === guideId,\n );\n const [match, ...duplicates] = matches;\n if (!match) {\n throw new Error(\n `${consumer} guide \"${guideId}\" does not match a Diagram.Guide id.`,\n );\n }\n if (duplicates.length > 0) {\n throw new Error(`Duplicate Diagram guide id \"${guideId}\".`);\n }\n return match;\n}\n\nfunction resolveGuideLine(\n guide: DiagramGuide,\n spec: GraphLayoutSpec,\n consumer: string,\n): ResolvedGuideLine {\n const orientation = guide.orientation;\n if (!orientation) {\n throw new Error(\n `Diagram.Guide \"${guide.id}\" needs an orientation before ${consumer} can use it.`,\n );\n }\n if (orientation === 'vertical') {\n return {\n orientation,\n x: resolveGuideMainAxis(guide, orientation, spec),\n };\n }\n return {\n orientation,\n y: resolveGuideMainAxis(guide, orientation, spec),\n };\n}\n\nfunction resolveGuideMainAxis(\n guide: DiagramGuide,\n orientation: DiagramGuideOrientation,\n spec: GraphLayoutSpec,\n): number {\n if (orientation === 'vertical') {\n if (guide.x !== undefined) return snapToGrid(guide.x + (guide.dx ?? 0));\n if (guide.col !== undefined) {\n return snapToGrid(\n graphPadX(spec.layout) +\n trackPosition('col', guide.col, spec.layout) +\n (guide.dx ?? 0),\n );\n }\n if (guide.target) {\n const point = targetAnchorPoint(\n guide.target,\n guide.anchor ?? 'center',\n guide.gap ?? 0,\n spec,\n );\n return snapToGrid(point.x + (guide.dx ?? 0));\n }\n throw new Error(\n `Diagram.Guide \"${guide.id}\" needs x, col, or target to define a vertical corridor.`,\n );\n }\n\n if (guide.y !== undefined) return snapToGrid(guide.y + (guide.dy ?? 0));\n if (guide.row !== undefined) {\n return snapToGrid(\n graphPadY(spec.layout) +\n trackPosition('row', guide.row, spec.layout) +\n (guide.dy ?? 0),\n );\n }\n if (guide.target) {\n const point = targetAnchorPoint(\n guide.target,\n guide.anchor ?? 'center',\n guide.gap ?? 0,\n spec,\n );\n return snapToGrid(point.y + (guide.dy ?? 0));\n }\n throw new Error(\n `Diagram.Guide \"${guide.id}\" needs y, row, or target to define a horizontal corridor.`,\n );\n}\n\nfunction guideWaypointCrossAxis(\n axis: 'x' | 'y',\n waypoint: GuideWaypoint,\n spec: GraphLayoutSpec,\n) {\n if (axis === 'x') {\n if (waypoint.x !== undefined) return waypoint.x;\n if (waypoint.col !== undefined) {\n return (\n graphPadX(spec.layout) + trackPosition('col', waypoint.col, spec.layout)\n );\n }\n if (waypoint.target) {\n return targetAnchorPoint(\n waypoint.target,\n waypoint.anchor ?? 'center',\n waypoint.gap ?? 0,\n spec,\n ).x;\n }\n throw new Error(\n `Diagram.Waypoint guide \"${waypoint.guide}\" needs target, x, or col to place a point on a horizontal guide.`,\n );\n }\n\n if (waypoint.y !== undefined) return waypoint.y;\n if (waypoint.row !== undefined) {\n return (\n graphPadY(spec.layout) + trackPosition('row', waypoint.row, spec.layout)\n );\n }\n if (waypoint.target) {\n return targetAnchorPoint(\n waypoint.target,\n waypoint.anchor ?? 'center',\n waypoint.gap ?? 0,\n spec,\n ).y;\n }\n throw new Error(\n `Diagram.Waypoint guide \"${waypoint.guide}\" needs target, y, or row to place a point on a vertical guide.`,\n );\n}\n\nfunction targetAnchorPoint(\n target: string,\n anchor: DiagramAnchor,\n gap: number,\n spec: GraphLayoutSpec,\n): Point {\n return anchorPoint(targetBoxForWaypoint(target, spec), anchor, gap);\n}\n\nfunction targetBoxForWaypoint(target: string, spec: GraphLayoutSpec): Box {\n const node = spec.nodes.find((candidate) => candidate.id === target);\n if (node) return nodeBox(node, spec.layout);\n const group = spec.groups?.find((candidate) => candidate.id === target);\n if (group) return groupBox(group, spec.nodes, spec.layout, spec.groups);\n throw new Error(\n `Diagram.Waypoint target \"${target}\" does not match a node or group.`,\n );\n}\n\nexport function routeEdge(\n edge: DiagramEdge,\n source: Box,\n target: Box,\n blocked: Set<number>,\n gridW: number,\n gridH: number,\n hint?: { exitSide?: DiagramSide; entrySide?: DiagramSide },\n exitOffset = 0,\n entryOffset = 0,\n waypoints?: Point[],\n entryGap = ENTRY_GAP,\n routeOffset = 0,\n): {\n d: string;\n entry: Point;\n points: Point[];\n labelPlacement: LabelPlacement | null;\n badgePlacement: BadgePlacement | null;\n} {\n const { exit, entry, exitSide, entrySide } = pickEndpoints(\n source,\n target,\n hint,\n exitOffset,\n entryOffset,\n entryGap,\n );\n const stubDistance = (edge.stubDistance ?? STUB) + routeOffset;\n const stubExit = computeStub(exit, exitSide, stubDistance);\n const stubEntry = computeStub(entry, entrySide, stubDistance);\n\n const staggerLabel = (placement: LabelPlacement | null) => {\n if (!placement) return null;\n if (\n (exitSide === 'top' || exitSide === 'bottom') &&\n (placement.side === 'left' || placement.side === 'right')\n ) {\n return { ...placement, y: placement.y + exitOffset };\n }\n return placement;\n };\n\n if (edge.route === 'straight') {\n const points = [exit, entry];\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: staggerLabel(computeLabelPlacement(points, edge)),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n }\n\n if (waypoints?.length) {\n const points = simplifyPath([\n exit,\n stubExit,\n ...waypoints,\n stubEntry,\n entry,\n ]);\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: staggerLabel(computeLabelPlacement(points, edge)),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n }\n\n if (tryStraightLine(stubExit, stubEntry, blocked, gridW)) {\n const points = simplifyPath([exit, stubExit, stubEntry, entry]);\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: staggerLabel(computeLabelPlacement(points, edge)),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n }\n\n const startG = {\n x: Math.round(stubExit.x / ROUTE_CELL),\n y: Math.round(stubExit.y / ROUTE_CELL),\n };\n const goalG = {\n x: Math.round(stubEntry.x / ROUTE_CELL),\n y: Math.round(stubEntry.y / ROUTE_CELL),\n };\n\n const path = aStar(startG, goalG, blocked, gridW, gridH);\n if (!path) {\n const fallback = [exit, entry];\n return {\n d: pathToSvg(fallback),\n entry,\n points: fallback,\n labelPlacement: staggerLabel(computeLabelPlacement(fallback, edge)),\n badgePlacement: computeBadgePlacement(fallback, edge),\n };\n }\n\n const pixelPath = path.map((p) => ({\n x: p.x * ROUTE_CELL,\n y: p.y * ROUTE_CELL,\n }));\n\n const fullPath = [exit, ...pixelPath, entry];\n const simplified = simplifyPath(fullPath);\n return {\n d: pathToSvg(simplified),\n entry,\n points: simplified,\n labelPlacement: staggerLabel(computeLabelPlacement(simplified, edge)),\n badgePlacement: computeBadgePlacement(simplified, edge),\n };\n}\n\nexport function pointOnBoxSide(box: Box, side: DiagramSide, offset = 0): Point {\n const center = { x: box.x + box.w / 2, y: box.y + box.h / 2 };\n if (side === 'top') return { x: snapToGrid(center.x + offset), y: box.y };\n if (side === 'bottom') {\n return { x: snapToGrid(center.x + offset), y: box.y + box.h };\n }\n if (side === 'left') return { x: box.x, y: snapToGrid(center.y + offset) };\n return { x: box.x + box.w, y: snapToGrid(center.y + offset) };\n}\n\nfunction pointOutsideBoxSide(\n box: Box,\n side: DiagramSide,\n offset = 0,\n gap = ENTRY_GAP,\n): Point {\n const point = pointOnBoxSide(box, side, offset);\n if (side === 'top') return { ...point, y: box.y - gap };\n if (side === 'bottom') return { ...point, y: box.y + box.h + gap };\n if (side === 'left') return { ...point, x: box.x - gap };\n return { ...point, x: box.x + box.w + gap };\n}\n\nfunction routeSelfLoop(\n edge: DiagramEdge,\n source: Box,\n side: DiagramSide,\n waypoints?: Point[],\n entryGap = ENTRY_GAP,\n): {\n d: string;\n entry: Point;\n points: Point[];\n labelPlacement: LabelPlacement | null;\n badgePlacement: BadgePlacement | null;\n} {\n const axisOffset =\n side === 'top' || side === 'bottom' ? SELF_LOOP_OFFSET : -SELF_LOOP_OFFSET;\n const entryAxisOffset = -axisOffset;\n const exit = pointOnBoxSide(source, side, axisOffset);\n const entry = pointOutsideBoxSide(source, side, entryAxisOffset, entryGap);\n\n let loopPoints: Point[];\n if (waypoints?.length) {\n loopPoints = [exit, computeStub(exit, side), ...waypoints, entry];\n } else if (side === 'top') {\n const y = source.y - SELF_LOOP_DEPTH;\n loopPoints = [exit, { x: exit.x, y }, { x: entry.x, y }, entry];\n } else if (side === 'bottom') {\n const y = source.y + source.h + SELF_LOOP_DEPTH;\n loopPoints = [exit, { x: exit.x, y }, { x: entry.x, y }, entry];\n } else if (side === 'left') {\n const x = source.x - SELF_LOOP_DEPTH;\n loopPoints = [exit, { x, y: exit.y }, { x, y: entry.y }, entry];\n } else {\n const x = source.x + source.w + SELF_LOOP_DEPTH;\n loopPoints = [exit, { x, y: exit.y }, { x, y: entry.y }, entry];\n }\n\n const points = simplifyPath(loopPoints);\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: computeLabelPlacement(points, edge),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n}\n\nexport type RoutedEdge = {\n edge: DiagramEdge;\n d: string;\n entry: Point;\n points: Point[];\n labelPlacement: LabelPlacement | null;\n badgePlacement: BadgePlacement | null;\n};\n\nfunction resolveDiagramSides(\n edge: DiagramEdge,\n source: Box,\n target: Box,\n hasReciprocal = false,\n): { exitSide: DiagramSide; entrySide: DiagramSide } {\n if (edge.exitSide && edge.entrySide) {\n return { exitSide: edge.exitSide, entrySide: edge.entrySide };\n }\n const edgeIsUnhinted =\n !edge.exitSide && !edge.entrySide && !edge.waypoints?.length;\n if (edgeIsUnhinted && hasReciprocal) {\n const sourceCenter = {\n x: source.x + source.w / 2,\n y: source.y + source.h / 2,\n };\n const targetCenter = {\n x: target.x + target.w / 2,\n y: target.y + target.h / 2,\n };\n const horizontalDelta = targetCenter.x - sourceCenter.x;\n const verticalDelta = targetCenter.y - sourceCenter.y;\n if (Math.abs(horizontalDelta) >= Math.abs(verticalDelta)) {\n return horizontalDelta < 0\n ? { exitSide: 'bottom', entrySide: 'bottom' }\n : { exitSide: 'right', entrySide: 'left' };\n }\n return verticalDelta < 0\n ? { exitSide: 'right', entrySide: 'right' }\n : { exitSide: 'bottom', entrySide: 'top' };\n }\n if (edgeIsUnhinted) {\n const sourceCenter = {\n x: source.x + source.w / 2,\n y: source.y + source.h / 2,\n };\n const targetCenter = {\n x: target.x + target.w / 2,\n y: target.y + target.h / 2,\n };\n const horizontalDelta = targetCenter.x - sourceCenter.x;\n const verticalDelta = targetCenter.y - sourceCenter.y;\n if (horizontalDelta < 0 && verticalDelta === 0) {\n return { exitSide: 'bottom', entrySide: 'bottom' };\n }\n if (horizontalDelta > 0 && horizontalDelta >= Math.abs(verticalDelta)) {\n return { exitSide: 'right', entrySide: 'left' };\n }\n }\n return pickDiagramSidesByGap(source, target);\n}\n\nfunction hasReciprocalEdge(spec: GraphLayoutSpec, edge: DiagramEdge) {\n if (edge.from === edge.to) return false;\n return spec.edges.some((candidate) => {\n return (\n endpointNodeId(candidate.from) === endpointNodeId(edge.to) &&\n endpointNodeId(candidate.to) === endpointNodeId(edge.from)\n );\n });\n}\n\nfunction computeParallelOffsets(\n spec: GraphLayoutSpec,\n resolvedSides: { exitSide: DiagramSide; entrySide: DiagramSide }[],\n): { exitOffsets: number[]; entryOffsets: number[]; routeOffsets: number[] } {\n const exitOffsets = new Array(spec.edges.length).fill(0);\n const entryOffsets = new Array(spec.edges.length).fill(0);\n const routeOffsets = new Array(spec.edges.length).fill(0);\n const nodesById = new Map(spec.nodes.map((node) => [node.id, node]));\n const nodeBoxes = new Map(\n spec.nodes.map((node) => [node.id, nodeBox(node, spec.layout)]),\n );\n const groupsById = new Map(\n (spec.groups ?? []).map((group) => [group.id, group]),\n );\n const groupBoxes = new Map(\n (spec.groups ?? []).map((group) => [\n group.id,\n groupBox(group, spec.nodes, spec.layout, spec.groups),\n ]),\n );\n const lookup: EndpointLookup = {\n nodesById,\n nodeBoxes,\n groupsById,\n groupBoxes,\n };\n\n const exitGroups = new Map<string, number[]>();\n const entryGroups = new Map<string, number[]>();\n const sameSideRouteGroups = new Map<string, number[]>();\n const fanOutRouteGroups = new Map<string, number[]>();\n\n spec.edges.forEach((edge, i) => {\n const sides = resolvedSides[i];\n const sourceEndpoint = resolveEndpoint(edge.from, lookup);\n const targetEndpoint = resolveEndpoint(edge.to, lookup);\n if (!sides || !sourceEndpoint || !targetEndpoint) return;\n const exitKey = `${sourceEndpoint.ref}|${sides.exitSide}`;\n const entryKey = `${targetEndpoint.ref}|${sides.entrySide}`;\n const exitArr = exitGroups.get(exitKey) ?? [];\n exitArr.push(i);\n exitGroups.set(exitKey, exitArr);\n const entryArr = entryGroups.get(entryKey) ?? [];\n entryArr.push(i);\n entryGroups.set(entryKey, entryArr);\n if (edge.from !== edge.to && !edge.waypoints?.length) {\n if (sides.exitSide === sides.entrySide) {\n const routeKey = `${sourceEndpoint.id}|${sides.exitSide}`;\n const routeArr = sameSideRouteGroups.get(routeKey) ?? [];\n routeArr.push(i);\n sameSideRouteGroups.set(routeKey, routeArr);\n } else {\n const routeKey = `${sourceEndpoint.id}|${sides.exitSide}|${sides.entrySide}`;\n const routeArr = fanOutRouteGroups.get(routeKey) ?? [];\n routeArr.push(i);\n fanOutRouteGroups.set(routeKey, routeArr);\n }\n }\n });\n\n for (const indices of exitGroups.values()) {\n const n = indices.length;\n const first = indices[0];\n if (n <= 1 || first === undefined) continue;\n const edge = spec.edges[first];\n const sides = resolvedSides[first];\n if (!edge || !sides) continue;\n const source = resolveEndpoint(edge.from, lookup);\n const offsets = computeSideOffsets(\n n,\n source?.box,\n sides.exitSide,\n source?.cornerInset,\n );\n indices.forEach((idx, i) => {\n exitOffsets[idx] = offsets[i];\n });\n }\n for (const indices of entryGroups.values()) {\n const n = indices.length;\n const first = indices[0];\n if (n <= 1 || first === undefined) continue;\n const edge = spec.edges[first];\n const sides = resolvedSides[first];\n if (!edge || !sides) continue;\n const target = resolveEndpoint(edge.to, lookup);\n const offsets = computeSideOffsets(\n n,\n target?.box,\n sides.entrySide,\n target?.cornerInset,\n );\n indices.forEach((idx, i) => {\n entryOffsets[idx] = offsets[i];\n });\n }\n\n for (const indices of sameSideRouteGroups.values()) {\n const n = indices.length;\n if (n <= 1) continue;\n const sorted = indices\n .flatMap((idx) => {\n const edge = spec.edges[idx];\n return edge ? [{ idx, span: edgeGridSpan(edge, nodesById) }] : [];\n })\n .sort((a, b) => a.span - b.span)\n .map(({ idx }) => idx);\n sorted.forEach((idx, i) => {\n routeOffsets[idx] = i * PARALLEL_SPACING;\n });\n }\n\n for (const indices of fanOutRouteGroups.values()) {\n const routed = indices.flatMap((idx) => {\n const edge = spec.edges[idx];\n const sides = resolvedSides[idx];\n return edge && sides ? [{ idx, edge, sides }] : [];\n });\n const targetIds = new Set(routed.map(({ edge }) => edge.to));\n const n = targetIds.size;\n if (n <= 1) continue;\n const sorted = routed\n .map(({ idx, edge, sides }) => ({\n idx,\n axis: edgeTargetAxisPosition(edge, lookup, sides.exitSide),\n }))\n .sort((a, b) => a.axis - b.axis)\n .map(({ idx }) => idx);\n sorted.forEach((idx, i) => {\n routeOffsets[idx] = i * PARALLEL_SPACING;\n });\n }\n\n return { exitOffsets, entryOffsets, routeOffsets };\n}\n\nfunction computeSideOffsets(\n count: number,\n box: Box | undefined,\n side: DiagramSide,\n cornerInset = 0,\n) {\n const maxIndexOffset = (count - 1) / 2;\n const sideSpan = side === 'top' || side === 'bottom' ? box?.w : box?.h;\n const maxOffset =\n sideSpan === undefined\n ? maxIndexOffset * PARALLEL_SPACING\n : Math.max(0, sideSpan / 2 - cornerInset - ROUTE_CELL);\n const spacing =\n maxIndexOffset === 0\n ? 0\n : Math.min(PARALLEL_SPACING, maxOffset / maxIndexOffset);\n return Array.from({ length: count }, (_, i) => {\n return (i - maxIndexOffset) * spacing;\n });\n}\n\nfunction nodeCornerInset(node: DiagramNode) {\n if (node.frame === 'none') return 0;\n return nodeFrameRadius(node);\n}\n\nfunction edgeGridSpan(edge: DiagramEdge, nodesById: Map<string, DiagramNode>) {\n const source = nodesById.get(endpointNodeId(edge.from));\n const target = nodesById.get(endpointNodeId(edge.to));\n if (!source || !target) {\n return 0;\n }\n return (\n Math.abs(positionedValue(source, 'col') - positionedValue(target, 'col')) +\n Math.abs(positionedValue(source, 'row') - positionedValue(target, 'row'))\n );\n}\n\nfunction edgeTargetAxisPosition(\n edge: DiagramEdge,\n lookup: EndpointLookup,\n exitSide: DiagramSide,\n) {\n const target = resolveEndpoint(edge.to, lookup);\n if (!target) return 0;\n const box = target.box;\n if (exitSide === 'top' || exitSide === 'bottom') {\n return box.x + box.w / 2;\n }\n return box.y + box.h / 2;\n}\n\nexport function computePaths(spec: GraphLayoutSpec): RoutedEdge[] {\n spec = resolveGraphLayout(spec);\n const { w: svgW, h: svgH } = svgDimensions(spec);\n const gridW = Math.ceil(svgW / ROUTE_CELL) + 2;\n const gridH = Math.ceil(svgH / ROUTE_CELL) + 2;\n\n const nodesById = new Map<string, DiagramNode>();\n const nodeBoxes = new Map<string, Box>();\n for (const n of spec.nodes) {\n nodesById.set(n.id, n);\n nodeBoxes.set(n.id, nodeBox(n, spec.layout));\n }\n const groupsById = new Map(\n (spec.groups ?? []).map((group) => [group.id, group]),\n );\n const groupBoxes = new Map(\n (spec.groups ?? []).map((group) => [\n group.id,\n groupBox(group, spec.nodes, spec.layout, spec.groups),\n ]),\n );\n const lookup: EndpointLookup = {\n nodesById,\n nodeBoxes,\n groupsById,\n groupBoxes,\n };\n\n const blocked = buildObstacles(spec.nodes, gridW, gridH, spec.layout);\n\n const resolvedSides = spec.edges.map((edge) => {\n const sourceEndpoint = resolveEndpoint(edge.from, lookup);\n const targetEndpoint = resolveEndpoint(edge.to, lookup);\n if (!sourceEndpoint || !targetEndpoint) {\n return {\n exitSide: 'right',\n entrySide: 'left',\n } satisfies { exitSide: DiagramSide; entrySide: DiagramSide };\n }\n assertConnectableEndpoint(edge, sourceEndpoint, 'source');\n assertConnectableEndpoint(edge, targetEndpoint, 'target');\n const sides = resolveDiagramSides(\n edge,\n sourceEndpoint.box,\n targetEndpoint.box,\n hasReciprocalEdge(spec, edge),\n );\n return {\n exitSide: sourceEndpoint?.port?.side ?? sides.exitSide,\n entrySide: targetEndpoint?.port?.side ?? sides.entrySide,\n };\n });\n\n const { exitOffsets, entryOffsets, routeOffsets } = computeParallelOffsets(\n spec,\n resolvedSides,\n );\n\n const routedEdges = spec.edges.map((edge, i) => {\n const sourceEndpoint = resolveEndpoint(edge.from, lookup);\n const targetEndpoint = resolveEndpoint(edge.to, lookup);\n const waypoints = resolveEdgeWaypoints(edge.waypoints, spec);\n const sides = resolvedSides[i];\n const exitOffset = exitOffsets[i];\n const entryOffset = entryOffsets[i];\n if (\n !sourceEndpoint ||\n !targetEndpoint ||\n !sides ||\n exitOffset === undefined ||\n entryOffset === undefined\n ) {\n return {\n edge,\n d: '',\n entry: { x: 0, y: 0 },\n points: [],\n labelPlacement: null,\n badgePlacement: null,\n };\n }\n assertConnectableEndpoint(edge, sourceEndpoint, 'source');\n assertConnectableEndpoint(edge, targetEndpoint, 'target');\n if (edge.from === edge.to) {\n const side = edge.exitSide ?? edge.entrySide ?? 'top';\n const result = routeSelfLoop(\n edge,\n sourceEndpoint.box,\n side,\n waypoints,\n edge.entryGap,\n );\n reserveRoutedEdge(blocked, result.points, gridW, gridH);\n return { edge, ...result };\n }\n const result = routeEdge(\n edge,\n sourceEndpoint.box,\n targetEndpoint.box,\n blocked,\n gridW,\n gridH,\n {\n exitSide: sides.exitSide,\n entrySide: sides.entrySide,\n },\n (sourceEndpoint?.port?.offset ?? 0) + (edge.exitOffset ?? exitOffset),\n (targetEndpoint?.port?.offset ?? 0) + (edge.entryOffset ?? entryOffset),\n waypoints,\n edge.entryGap,\n routeOffsets[i],\n );\n reserveRoutedEdge(blocked, result.points, gridW, gridH);\n return { edge, ...result };\n });\n\n return deconflictLabelPlacements(routedEdges);\n}\n\nfunction endpointNodeId(ref: string) {\n const separator = ref.indexOf(':');\n if (separator === -1) return ref;\n return ref.slice(0, separator);\n}\n\nfunction endpointPortId(ref: string) {\n const separator = ref.indexOf(':');\n if (separator === -1) return undefined;\n return ref.slice(separator + 1);\n}\n\nfunction resolveEndpoint(\n ref: string,\n lookup: EndpointLookup,\n): EndpointRef | null {\n const id = endpointNodeId(ref);\n const node = lookup.nodesById.get(id);\n const group = lookup.groupsById.get(id);\n const box = node ? lookup.nodeBoxes.get(id) : lookup.groupBoxes.get(id);\n const cornerInset = node\n ? nodeCornerInset(node)\n : group && groupCornerInset(group);\n if (cornerInset === undefined || !box) {\n return null;\n }\n\n const portId = endpointPortId(ref);\n const ports = node?.ports ?? group?.ports;\n const port = portId\n ? ports?.find((candidate) => candidate.id === portId)\n : undefined;\n\n if (portId && !port) {\n throw new Error(\n `Diagram endpoint \"${ref}\" references missing port \"${portId}\" on \"${id}\".`,\n );\n }\n\n return {\n ref: port ? `${id}:${port.id}` : id,\n id,\n kind: node ? 'node' : 'group',\n box,\n cornerInset,\n connectable: node ? node.connectable !== false : true,\n ...(port ? { port } : {}),\n };\n}\n\nfunction assertConnectableEndpoint(\n edge: DiagramEdge,\n endpoint: EndpointRef,\n role: 'source' | 'target',\n) {\n if (endpoint.connectable) return;\n const relation = role === 'source' ? 'start from' : 'end at';\n throw new Error(\n `Diagram edge ${edge.from}->${edge.to} cannot ${relation} non-connectable node \"${endpoint.id}\". Use Diagram.Label, Diagram.Port, Diagram.Box, or Diagram.Phantom for routed endpoints; Diagram.Float is display-only.`,\n );\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"graph-layout.js","names":["parseEndpointRef","centeredBaselineOffset","textAscent","textLineBox","textWidth","widestLine","COL_W","ROW_H","NODE_W","NODE_H","NODE_RX","NODE_PAD","GROUP_PAD","GROUP_LABEL_H","GROUP_TITLE_GAP","TITLE_TOP_PAD","SVG_PAD_X","SVG_PAD_Y","ROUTE_CELL","TURN_PENALTY","STUB","ENTRY_GAP","CONTENT_VIEWBOX_PAD","PARALLEL_SPACING","SELF_LOOP_OFFSET","SELF_LOOP_DEPTH","ROUTE_RESERVATION_CELLS","EDGE_LABEL_FONT_SIZE","EDGE_BADGE_FONT_SIZE","EDGE_BADGE_ICON","EDGE_LABEL_LINE_H","EDGE_LABEL_LINE_GAP","EDGE_LABEL_BOX_PAD","EDGE_LABEL_GAP","GROUP_LABEL_LINE_H","NODE_CAPTION_FONT_SIZE","NODE_CAPTION_LINE_H","NODE_CAPTION_OFFSET","NODE_CAPTION_FRAME_PAD_X_EM","NODE_CAPTION_FRAME_PAD_Y_EM","ANNOTATION_LINE_GAP","nodeFrameRadius","node","rx","frame","nodeFrameStrokeWidth","graphLayout","layout","colWidth","rowHeight","columns","rows","padX","padY","titleTopPad","trackSize","axis","index","resolved","tracks","fallback","assertTrackStart","value","Math","floor","Error","trackPosition","fraction","position","i","trackSpan","start","end","graphPadX","graphPadY","nodeBox","row","positionedValue","col","colSpan","innerWidth","defaultWidth","w","width","min","max","h","height","x","y","nodeStackCount","stack","nodeStackOffset","stackOffset","id","nodeStackVector","offset","dx","stackDx","dy","stackDy","direction","stackDirection","xSign","endsWith","ySign","startsWith","nodeStackWidthStep","step","stackWidthStep","nodeStackHeightStep","stackHeightStep","nodeStackFrameBox","box","level","stackVector","nodeVisualBox","stackCount","hidden","boxes","Array","from","length","_","minX","map","candidate","minY","maxX","maxY","nodeCaptionLines","caption","undefined","isArray","line","trim","filter","Boolean","nodeCaptionPlacement","lines","side","captionSide","captionOffset","captionFrame","fontSize","captionFontSize","lineHeight","centerX","centerY","center","captionBlockHeight","captionBlockAscent","align","captionFramePad","lineCount","nodeCaptionBounds","placement","resolveGraphLayout","spec","needsAutoLayout","nodes","some","hasRow","hasCol","ids","nodeIds","Set","adjacency","Map","indegree","set","edge","edges","nodeId","to","has","get","push","queue","rank","order","usedRowsByCol","add","nextOpenRow","groups","resolveGraphGroupBounds","changed","resolving","resolve","group","cached","childGroups","parent","next","bounds","inferResolvedGroupBounds","delete","nextGroups","grouped","emptyBounds","includeBounds","rowStart","rowEnd","colStart","colEnd","childGroup","requireGroupBounds","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","target","source","groupCornerInset","groupBox","padding","groupPadding","contained","n","childBoxes","tightX","tightY","tight","minChildX","b","maxChildX","left","right","topPad","groupTopPadding","bottom","reserveTightLabel","titleGutterHeight","groupTitleGutterHeight","childOverhang","groupChildTopOverhang","tightLabelReserve","groupLabelHeight","top","rowTop","containedNodes","groupLabelLines","label","titleGap","labelHeight","titleBand","groupDividerLines","dividers","x1","y1","x2","y2","accent","cols","svgDimensions","maxRow","maxCol","lastCol","g","point","resolveEdgeWaypoints","waypoints","annotation","resolveGraphAnnotations","annotationTextBounds","annotationLeaderBoundaryPoints","gridW","gridH","graphContentViewBox","routedEdges","includePoint","includeBox","captionBounds","port","nodePortPlacements","labelX","labelY","groupPortPlacements","routedEdge","points","labelPlacement","edgeLabelFrameBox","badgePlacement","edgeBadgeBounds","isFinite","ceil","portPlacements","ownerId","ports","pointOnBoxSide","labelGap","labelAlign","annotations","resolveGraphAnnotation","targets","guide","targetBoxes","targetBoxForAnnotation","targetBox","unionBoxes","anchor","annotationGuidePoint","anchorPoint","resolvedPoint","leaders","leader","annotationLeaderPoints","defaultAnnotationAlign","leaderFrom","leaderTo","guideId","guideForId","resolveGuideLine","targetPoint","orientation","find","textPoint","gap","leaderGap","route","leaderRoute","finish","annotationLeaderRoutePoints","compactLeaderPoints","previous","lineGap","text","flatMap","MinHeap","data","item","priority","bubbleUp","pop","last","bubbleDown","empty","entry","parentEntry","smallest","smallestEntry","manhattan","a","abs","dirCode","snapToGrid","v","round","buildObstacles","blocked","x0","y0","pickDiagramSidesByGap","tIsRight","tIsLeft","tIsBelow","tIsAbove","horizontalGap","verticalGap","useVertical","exitSide","entrySide","endpointsForDiagramSides","exitOffset","entryOffset","entryGap","sCenter","tCenter","exit","pickEndpoints","hint","sides","computeStub","distance","tryStraightLine","gy","gx","reserveRoutedEdge","isEndpointStub","reserveSegment","aStar","goal","startKey","goalKey","open","gScore","cameFrom","pt","dir","DIRS","current","cur","curKey","path","k","prev","unshift","lastDir","nx","ny","nKey","newDir","turnCost","tentativeG","existingG","f","simplifyPath","first","at","result","cross","pathToSvg","radius","second","parts","dpx","dpy","dnx","dny","lp","hypot","ln","r","cs","ce","join","computeLabelPlacement","labelSegment","segmentIndex","resolveLabelSegmentIndex","edgeLabelPlacementForSegment","labelT","pathAnchorAtFraction","labelSide","edgeLabelPlacementFromHint","isHorizontal","bestI","bestLen","len","segment","isInteger","maxSegment","midX","midY","computeBadgePlacement","badgeIcon","badgeLabel","pointAtPathFraction","badgeT","badgeSide","badgeOffset","badgeDx","badgeDy","beforeLast","clamped","segments","slice","total","reduce","sum","ratio","labelOffset","labelDx","labelDy","deconflictLabelPlacements","occupied","nextPlacement","placeLabel","edgeLabelBounds","maxAttempts","labelOffsetCandidates","offsetLabelPlacement","other","labelBoundsOverlap","size","edgeLabelSize","candidates","primary","edgeLabelFontSize","labelFontSize","edgeLabelFramePad","labelFramePadding","pad","edgeLabelLineHeight","edgeLabelAscent","labelLineGap","edgeBadgeSize","labelWidth","iconWidth","waypoint","resolveGuideWaypoint","targetAnchorPoint","guideWaypointCrossAxis","consumer","matches","guides","match","duplicates","resolveGuideMainAxis","targetBoxForWaypoint","routeEdge","routeOffset","stubDistance","stubExit","stubEntry","staggerLabel","d","startG","goalG","pixelPath","p","fullPath","simplified","pointOutsideBoxSide","routeSelfLoop","axisOffset","entryAxisOffset","loopPoints","resolveDiagramSides","hasReciprocal","edgeIsUnhinted","sourceCenter","targetCenter","horizontalDelta","verticalDelta","hasReciprocalEdge","computeParallelOffsets","resolvedSides","exitOffsets","fill","entryOffsets","routeOffsets","nodesById","nodeBoxes","groupsById","groupBoxes","lookup","exitGroups","entryGroups","sameSideRouteGroups","fanOutRouteGroups","forEach","sourceEndpoint","resolveEndpoint","targetEndpoint","exitKey","ref","entryKey","exitArr","entryArr","routeKey","routeArr","indices","values","offsets","computeSideOffsets","cornerInset","idx","sorted","span","edgeGridSpan","sort","routed","targetIds","edgeTargetAxisPosition","count","maxIndexOffset","sideSpan","maxOffset","spacing","nodeCornerInset","computePaths","svgW","svgH","assertConnectableEndpoint","portId","kind","connectable","endpoint","role","relation"],"sources":["../../../../src/lib/layouts/graph/graph-layout.ts"],"sourcesContent":["import type {\n Box,\n DiagramAnchor,\n DiagramAnnotation,\n DiagramAnnotationLeader,\n DiagramEdge,\n DiagramGraphLayout,\n DiagramGroup,\n DiagramGuide,\n DiagramGuideOrientation,\n DiagramNode,\n DiagramNodePort,\n DiagramSide,\n DiagramWaypoint,\n GraphLayoutSpec,\n Point,\n} from '../../model/diagram-ir.ts';\nimport { parseEndpointRef } from '../../model/endpoint-ref.ts';\nimport {\n centeredBaselineOffset,\n textAscent,\n textLineBox,\n textWidth,\n widestLine,\n} from '../text-metrics.ts';\n\nexport type {\n DiagramAnnotation,\n DiagramAnnotationLeader,\n DiagramAnchor,\n DiagramEdge,\n DiagramEdgeLabelSide,\n DiagramGraphLayout,\n DiagramGroup,\n DiagramGuide,\n DiagramGuideOrientation,\n DiagramLabelLine,\n DiagramNode,\n DiagramNodeIcon,\n DiagramNodePort,\n DiagramWaypoint,\n GraphLayoutSpec,\n Box,\n Point,\n DiagramSide,\n} from '../../model/diagram-ir.ts';\n\nexport const COL_W = 240;\nexport const ROW_H = 128;\nexport const NODE_W = 176;\nexport const NODE_H = 64;\nexport const NODE_RX = 16;\nexport const NODE_PAD = 16;\nexport const GROUP_PAD = 24;\nexport const GROUP_LABEL_H = 28;\nexport const GROUP_TITLE_GAP = 8;\nexport const TITLE_TOP_PAD = 32;\nexport const SVG_PAD_X = 60;\nexport const SVG_PAD_Y = 32;\nexport const ROUTE_CELL = 4;\nexport const TURN_PENALTY = 14;\nexport const STUB = NODE_PAD + ROUTE_CELL;\nexport const ENTRY_GAP = 10;\nexport const CONTENT_VIEWBOX_PAD = 40;\n\nexport const PARALLEL_SPACING = 28;\nconst SELF_LOOP_OFFSET = 28;\nconst SELF_LOOP_DEPTH = 48;\nconst ROUTE_RESERVATION_CELLS = 0;\nconst EDGE_LABEL_FONT_SIZE = 10;\nconst EDGE_BADGE_FONT_SIZE = 10;\nexport const EDGE_BADGE_ICON = 22;\nconst EDGE_LABEL_LINE_H = 12;\nconst EDGE_LABEL_LINE_GAP = 2;\nconst EDGE_LABEL_BOX_PAD = 4;\nconst EDGE_LABEL_GAP = 4;\nconst GROUP_LABEL_LINE_H = 14;\nconst NODE_CAPTION_FONT_SIZE = 11;\nconst NODE_CAPTION_LINE_H = 14;\nconst NODE_CAPTION_OFFSET = 12;\nconst NODE_CAPTION_FRAME_PAD_X_EM = 0.9;\nconst NODE_CAPTION_FRAME_PAD_Y_EM = 0.55;\nconst ANNOTATION_LINE_GAP = 4;\n\nexport function nodeFrameRadius(node: DiagramNode) {\n return node.rx ?? (node.frame === 'flat' ? 4 : NODE_RX);\n}\n\nexport function nodeFrameStrokeWidth(node: DiagramNode) {\n return node.frame === 'flat' ? 0 : 1.5;\n}\n\ntype Axis = 'col' | 'row';\n\nfunction graphLayout(\n layout?: DiagramGraphLayout,\n): Required<DiagramGraphLayout> {\n return {\n colWidth: layout?.colWidth ?? COL_W,\n rowHeight: layout?.rowHeight ?? ROW_H,\n columns: layout?.columns ?? [],\n rows: layout?.rows ?? [],\n padX: layout?.padX ?? SVG_PAD_X,\n padY: layout?.padY ?? SVG_PAD_Y,\n titleTopPad: layout?.titleTopPad ?? TITLE_TOP_PAD,\n };\n}\n\nfunction trackSize(\n axis: Axis,\n index: number,\n layout?: DiagramGraphLayout,\n): number {\n const resolved = graphLayout(layout);\n const tracks = axis === 'col' ? resolved.columns : resolved.rows;\n const fallback = axis === 'col' ? resolved.colWidth : resolved.rowHeight;\n return tracks[index] ?? fallback;\n}\n\nfunction assertTrackStart(axis: Axis, value: number) {\n if (Math.floor(value) < 0) {\n throw new Error(\n `Diagram ${axis === 'col' ? 'column' : 'row'} ${value} resolves before the first track.`,\n );\n }\n}\n\nfunction trackPosition(\n axis: Axis,\n value: number,\n layout?: DiagramGraphLayout,\n): number {\n assertTrackStart(axis, value);\n const index = Math.floor(value);\n const fraction = value - index;\n let position = 0;\n for (let i = 0; i < index; i++) {\n position += trackSize(axis, i, layout);\n }\n if (fraction > 0) position += trackSize(axis, index, layout) * fraction;\n return position;\n}\n\nfunction trackSpan(\n axis: Axis,\n start: number,\n end: number,\n layout?: DiagramGraphLayout,\n): number {\n return trackPosition(axis, end, layout) - trackPosition(axis, start, layout);\n}\n\nfunction graphPadX(layout?: DiagramGraphLayout) {\n return graphLayout(layout).padX;\n}\n\nfunction graphPadY(layout?: DiagramGraphLayout) {\n const resolved = graphLayout(layout);\n return resolved.padY + resolved.titleTopPad;\n}\n\nexport type ViewBox = {\n x: number;\n y: number;\n w: number;\n h: number;\n};\n\nexport type GroupDividerLine = {\n axis: 'row' | 'col';\n value: number;\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n accent: boolean;\n};\n\nexport type ResolvedDiagramAnnotation = DiagramAnnotation & {\n x: number;\n y: number;\n leaderFrom?: Point | undefined;\n leaderTo?: Point | undefined;\n leaders?: DiagramAnnotationLeader[] | undefined;\n};\n\nexport type PortPlacement = DiagramNodePort & {\n ownerId: string;\n x: number;\n y: number;\n labelX: number;\n labelY: number;\n labelAlign: 'start' | 'middle' | 'end';\n};\n\nexport type NodeCaptionPlacement = {\n lines: string[];\n x: number;\n y: number;\n align: 'start' | 'middle' | 'end';\n fontSize: number;\n lineHeight: number;\n};\n\ntype EndpointRef = {\n ref: string;\n id: string;\n kind: 'node' | 'group';\n box: Box;\n cornerInset: number;\n connectable: boolean;\n port?: DiagramNodePort;\n};\n\ntype EndpointLookup = {\n nodesById: Map<string, DiagramNode>;\n nodeBoxes: Map<string, Box>;\n groupsById: Map<string, DiagramGroup>;\n groupBoxes: Map<string, Box>;\n};\n\nexport function nodeBox(node: DiagramNode, layout?: DiagramGraphLayout): Box {\n const row = positionedValue(node, 'row');\n const col = positionedValue(node, 'col');\n const colSpan = node.colSpan ?? 1;\n const innerWidth = trackSpan('col', col, col + colSpan, layout);\n const defaultWidth = NODE_W + (colSpan - 1) * graphLayout(layout).colWidth;\n const w =\n node.width ?? Math.min(defaultWidth, Math.max(NODE_W, innerWidth - 24));\n const h = node.height ?? NODE_H;\n const x =\n graphPadX(layout) +\n trackPosition('col', col, layout) +\n (innerWidth - w) / 2;\n const rowHeight = trackSize('row', Math.floor(row), layout);\n const y =\n graphPadY(layout) + trackPosition('row', row, layout) + (rowHeight - h) / 2;\n return { x, y, w, h };\n}\n\nexport function nodeStackCount(node: DiagramNode): number {\n return Math.max(1, Math.floor(node.stack ?? 1));\n}\n\nexport function nodeStackOffset(node: DiagramNode): number {\n const stackOffset = node.stackOffset ?? 12;\n if (stackOffset < 0) {\n throw new Error(\n `Diagram node \"${node.id}\" stackOffset must be non-negative.`,\n );\n }\n return stackOffset;\n}\n\nexport function nodeStackVector(node: DiagramNode): Point {\n const offset = nodeStackOffset(node);\n const dx = node.stackDx ?? offset;\n const dy = node.stackDy ?? offset;\n if (dx < 0) {\n throw new Error(`Diagram node \"${node.id}\" stackDx must be non-negative.`);\n }\n if (dy < 0) {\n throw new Error(`Diagram node \"${node.id}\" stackDy must be non-negative.`);\n }\n const direction = node.stackDirection ?? 'up-left';\n const xSign = direction.endsWith('left') ? -1 : 1;\n const ySign = direction.startsWith('up') ? -1 : 1;\n return { x: xSign * dx, y: ySign * dy };\n}\n\nexport function nodeStackWidthStep(node: DiagramNode): number {\n const step = node.stackWidthStep ?? 0;\n if (step < 0) {\n throw new Error(\n `Diagram node \"${node.id}\" stackWidthStep must be non-negative.`,\n );\n }\n return step;\n}\n\nexport function nodeStackHeightStep(node: DiagramNode): number {\n const step = node.stackHeightStep ?? 0;\n if (step < 0) {\n throw new Error(\n `Diagram node \"${node.id}\" stackHeightStep must be non-negative.`,\n );\n }\n return step;\n}\n\nexport function nodeStackFrameBox(\n node: DiagramNode,\n box: Box,\n level: number,\n): Box {\n const stackVector = nodeStackVector(node);\n return {\n x: box.x + level * stackVector.x,\n y: box.y + level * stackVector.y,\n w: box.w + level * nodeStackWidthStep(node),\n h: box.h + level * nodeStackHeightStep(node),\n };\n}\n\nexport function nodeVisualBox(node: DiagramNode, box = nodeBox(node)): Box {\n const stackCount = nodeStackCount(node);\n if (stackCount <= 1 || node.hidden || node.frame === 'none') return box;\n const boxes = [\n box,\n ...Array.from({ length: stackCount - 1 }, (_, i) =>\n nodeStackFrameBox(node, box, i + 1),\n ),\n ];\n const minX = Math.min(...boxes.map((candidate) => candidate.x));\n const minY = Math.min(...boxes.map((candidate) => candidate.y));\n const maxX = Math.max(...boxes.map((candidate) => candidate.x + candidate.w));\n const maxY = Math.max(...boxes.map((candidate) => candidate.y + candidate.h));\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY,\n };\n}\n\nexport function nodeCaptionLines(node: DiagramNode): string[] {\n if (node.caption === undefined) return [];\n return (Array.isArray(node.caption) ? node.caption : [node.caption])\n .map((line) => line.trim())\n .filter(Boolean);\n}\n\nexport function nodeCaptionPlacement(\n node: DiagramNode,\n box = nodeBox(node),\n): NodeCaptionPlacement | null {\n const lines = nodeCaptionLines(node);\n if (node.hidden || lines.length === 0) return null;\n const side = node.captionSide ?? 'bottom';\n const offset =\n node.captionOffset ?? (node.captionFrame ? 0 : NODE_CAPTION_OFFSET);\n const fontSize = node.captionFontSize ?? NODE_CAPTION_FONT_SIZE;\n const lineHeight = Math.max(fontSize + 2, NODE_CAPTION_LINE_H);\n const centerX = box.x + box.w / 2;\n const centerY = box.y + box.h / 2;\n if (node.captionFrame) {\n const center =\n side === 'top'\n ? { x: centerX, y: box.y - offset }\n : side === 'bottom'\n ? { x: centerX, y: box.y + box.h + offset }\n : side === 'left'\n ? { x: box.x - offset, y: centerY }\n : { x: box.x + box.w + offset, y: centerY };\n return {\n lines,\n x: center.x,\n y:\n center.y -\n captionBlockHeight(node, fontSize, lines.length, lineHeight) / 2 +\n captionBlockAscent(node, fontSize),\n align: 'middle',\n fontSize,\n lineHeight,\n };\n }\n if (side === 'top') {\n return {\n lines,\n x: centerX,\n y: box.y - offset - (lines.length - 1) * lineHeight,\n align: 'middle',\n fontSize,\n lineHeight,\n };\n }\n if (side === 'left') {\n return {\n lines,\n x: box.x - offset,\n y: centerY - ((lines.length - 1) * lineHeight) / 2 + fontSize / 3,\n align: 'end',\n fontSize,\n lineHeight,\n };\n }\n if (side === 'right') {\n return {\n lines,\n x: box.x + box.w + offset,\n y: centerY - ((lines.length - 1) * lineHeight) / 2 + fontSize / 3,\n align: 'start',\n fontSize,\n lineHeight,\n };\n }\n return {\n lines,\n x: centerX,\n y: box.y + box.h + offset + fontSize,\n align: 'middle',\n fontSize,\n lineHeight,\n };\n}\n\nfunction captionFramePad(node: DiagramNode, fontSize: number) {\n return node.captionFrame ? fontSize * NODE_CAPTION_FRAME_PAD_Y_EM : 0;\n}\n\nfunction captionBlockAscent(node: DiagramNode, fontSize: number) {\n return textAscent(fontSize, 'sans') + captionFramePad(node, fontSize);\n}\n\nfunction captionBlockHeight(\n node: DiagramNode,\n fontSize: number,\n lineCount: number,\n lineHeight: number,\n) {\n return (\n textLineBox(fontSize, 'sans') +\n (lineCount - 1) * lineHeight +\n captionFramePad(node, fontSize) * 2\n );\n}\n\nexport function nodeCaptionBounds(\n node: DiagramNode,\n box = nodeBox(node),\n): Box | null {\n const placement = nodeCaptionPlacement(node, box);\n if (!placement) return null;\n const w =\n widestLine(placement.lines, placement.fontSize, 'sans') +\n (node.captionFrame\n ? placement.fontSize * NODE_CAPTION_FRAME_PAD_X_EM * 2\n : 0);\n const h = captionBlockHeight(\n node,\n placement.fontSize,\n placement.lines.length,\n placement.lineHeight,\n );\n const x =\n placement.align === 'middle'\n ? placement.x - w / 2\n : placement.align === 'end'\n ? placement.x - w\n : placement.x;\n return {\n x,\n y: placement.y - captionBlockAscent(node, placement.fontSize),\n w,\n h,\n };\n}\n\nfunction positionedValue(node: DiagramNode, axis: 'row' | 'col') {\n const value = node[axis];\n if (value === undefined) {\n throw new Error(\n `Diagram node \"${node.id}\" needs a ${axis}; resolve automatic graph layout before measuring nodes.`,\n );\n }\n return value;\n}\n\nexport function resolveGraphLayout(spec: GraphLayoutSpec): GraphLayoutSpec {\n const needsAutoLayout = spec.nodes.some(\n (node) => node.row === undefined || node.col === undefined,\n );\n let nodes = spec.nodes;\n\n if (needsAutoLayout) {\n for (const node of spec.nodes) {\n const hasRow = node.row !== undefined;\n const hasCol = node.col !== undefined;\n if (hasRow !== hasCol) {\n throw new Error(\n `Diagram node \"${node.id}\" needs both row and col, or neither for automatic graph layout.`,\n );\n }\n }\n\n const ids = spec.nodes.map((node) => node.id);\n const nodeIds = new Set(ids);\n const adjacency = new Map<string, string[]>();\n const indegree = new Map<string, number>();\n for (const id of ids) {\n adjacency.set(id, []);\n indegree.set(id, 0);\n }\n\n for (const edge of spec.edges) {\n const from = parseEndpointRef(edge.from).nodeId;\n const to = parseEndpointRef(edge.to).nodeId;\n if (!nodeIds.has(from) || !nodeIds.has(to) || from === to) continue;\n adjacency.get(from)?.push(to);\n indegree.set(to, (indegree.get(to) ?? 0) + 1);\n }\n\n const queue = ids.filter((id) => (indegree.get(id) ?? 0) === 0);\n const rank = new Map(ids.map((id) => [id, 0]));\n const order: string[] = [];\n // The loop visits the ids that it pushes onto the queue.\n for (const id of queue) {\n order.push(id);\n for (const to of adjacency.get(id) ?? []) {\n rank.set(to, Math.max(rank.get(to) ?? 0, (rank.get(id) ?? 0) + 1));\n indegree.set(to, (indegree.get(to) ?? 0) - 1);\n if (indegree.get(to) === 0) queue.push(to);\n }\n }\n\n if (order.length !== ids.length) {\n throw new Error(\n 'Diagram automatic graph layout requires an acyclic graph. Set row and col manually for cycles.',\n );\n }\n\n const usedRowsByCol = new Map<number, Set<number>>();\n for (const node of spec.nodes) {\n if (node.row === undefined || node.col === undefined) continue;\n const rows = usedRowsByCol.get(node.col) ?? new Set<number>();\n rows.add(node.row);\n usedRowsByCol.set(node.col, rows);\n }\n\n const nextOpenRow = (col: number) => {\n const rows = usedRowsByCol.get(col) ?? new Set<number>();\n let row = 0;\n while (rows.has(row)) row += 1;\n rows.add(row);\n usedRowsByCol.set(col, rows);\n return row;\n };\n\n nodes = spec.nodes.map((node) => {\n if (node.row !== undefined && node.col !== undefined) return node;\n const col = rank.get(node.id) ?? 0;\n return {\n ...node,\n col,\n row: nextOpenRow(col),\n };\n });\n }\n\n const groups = resolveGraphGroupBounds(spec.groups, nodes);\n if (nodes === spec.nodes && groups === spec.groups) return spec;\n return { ...spec, nodes, groups };\n}\n\nfunction resolveGraphGroupBounds(\n groups: DiagramGroup[] | undefined,\n nodes: DiagramNode[],\n): DiagramGroup[] | undefined {\n if (!groups?.length) return groups;\n let changed = false;\n const resolved = new Map<string, DiagramGroup>();\n const resolving = new Set<string>();\n\n const resolve = (group: DiagramGroup): DiagramGroup => {\n const cached = resolved.get(group.id);\n if (cached) return cached;\n if (resolving.has(group.id)) {\n throw new Error(\n `Diagram.Group \"${group.id}\" has a cyclic parent relationship.`,\n );\n }\n\n resolving.add(group.id);\n const childGroups = groups\n .filter((candidate) => candidate.parent === group.id)\n .map(resolve);\n\n let next = group;\n if (!group.bounds) {\n changed = true;\n next = {\n ...group,\n bounds: inferResolvedGroupBounds(group, nodes, childGroups),\n };\n }\n\n resolving.delete(group.id);\n resolved.set(group.id, next);\n return next;\n };\n\n const nextGroups = groups.map(resolve);\n return changed ? nextGroups : groups;\n}\n\nfunction inferResolvedGroupBounds(\n group: DiagramGroup,\n nodes: DiagramNode[],\n childGroups: DiagramGroup[] = [],\n): NonNullable<DiagramGroup['bounds']> {\n const grouped = nodes.filter((node) => node.group === group.id);\n if (grouped.length === 0 && childGroups.length === 0) {\n throw new Error(\n `Diagram.Group \"${group.id}\" needs bounds or direct node/group children so bounds can be inferred.`,\n );\n }\n const bounds = emptyBounds();\n for (const node of grouped) {\n const row = positionedValue(node, 'row');\n const col = positionedValue(node, 'col');\n includeBounds(bounds, {\n rowStart: row,\n rowEnd: row,\n colStart: col,\n colEnd: col + (node.colSpan ?? 1) - 1,\n });\n }\n for (const childGroup of childGroups) {\n includeBounds(bounds, requireGroupBounds(childGroup));\n }\n return bounds;\n}\n\nfunction emptyBounds(): NonNullable<DiagramGroup['bounds']> {\n return {\n rowStart: Number.POSITIVE_INFINITY,\n rowEnd: Number.NEGATIVE_INFINITY,\n colStart: Number.POSITIVE_INFINITY,\n colEnd: Number.NEGATIVE_INFINITY,\n };\n}\n\nfunction includeBounds(\n target: NonNullable<DiagramGroup['bounds']>,\n source: NonNullable<DiagramGroup['bounds']>,\n) {\n target.rowStart = Math.min(target.rowStart, source.rowStart);\n target.rowEnd = Math.max(target.rowEnd, source.rowEnd);\n target.colStart = Math.min(target.colStart, source.colStart);\n target.colEnd = Math.max(target.colEnd, source.colEnd);\n}\n\nfunction groupCornerInset(group: DiagramGroup) {\n const frame = group.frame ?? 'solid';\n if (frame === 'none') return 0;\n return group.rx ?? 12;\n}\n\nexport function groupBox(\n group: DiagramGroup,\n nodes?: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n): Box {\n const bounds = requireGroupBounds(group);\n const padding = groupPadding(group);\n const contained = nodes?.filter((n) => n.group === group.id) ?? [];\n const childGroups =\n groups?.filter((candidate) => candidate.parent === group.id) ?? [];\n const childBoxes = nodes\n ? [\n ...contained.map((node) => nodeVisualBox(node, nodeBox(node, layout))),\n ...childGroups.map((childGroup) =>\n groupBox(childGroup, nodes, layout, groups),\n ),\n ]\n : [];\n const tightX = group.tightX && childBoxes.length > 0;\n const tightY = (group.tight || group.tightY) && childBoxes.length > 0;\n const minChildX =\n childBoxes.length > 0 ? Math.min(...childBoxes.map((b) => b.x)) : 0;\n const maxChildX =\n childBoxes.length > 0 ? Math.max(...childBoxes.map((b) => b.x + b.w)) : 0;\n const x = tightX\n ? minChildX - padding.left\n : graphPadX(layout) +\n trackPosition('col', bounds.colStart, layout) -\n padding.left;\n const w = tightX\n ? maxChildX - minChildX + padding.left + padding.right\n : trackSpan('col', bounds.colStart, bounds.colEnd + 1, layout) +\n padding.left +\n padding.right;\n\n if (tightY && nodes) {\n const boxes = childBoxes;\n if (boxes.length > 0) {\n const minY = Math.min(...boxes.map((b) => b.y));\n const maxY = Math.max(...boxes.map((b) => b.y + b.h));\n const topPad = groupTopPadding(group, padding, true, bounds);\n const y = minY - topPad;\n const h = maxY - minY + topPad + padding.bottom;\n return { x, y, w, h };\n }\n }\n\n const y =\n graphPadY(layout) +\n trackPosition('row', bounds.rowStart, layout) -\n groupTopPadding(group, padding, false, bounds, nodes, layout, groups);\n const h =\n trackSpan('row', bounds.rowStart, bounds.rowEnd + 1, layout) +\n groupTopPadding(group, padding, false, bounds, nodes, layout, groups) +\n padding.bottom;\n return { x, y, w, h };\n}\n\nfunction groupTopPadding(\n group: DiagramGroup,\n padding: ReturnType<typeof groupPadding>,\n reserveTightLabel: boolean,\n bounds: NonNullable<DiagramGroup['bounds']>,\n nodes?: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n) {\n const titleGutterHeight = groupTitleGutterHeight(group);\n const childOverhang =\n titleGutterHeight > 0 && nodes\n ? groupChildTopOverhang(group, bounds, nodes, layout, groups)\n : 0;\n const tightLabelReserve =\n reserveTightLabel && groupLabelHeight(group) > 0\n ? groupLabelHeight(group) + GROUP_TITLE_GAP\n : 0;\n return Math.max(\n padding.top,\n titleGutterHeight + childOverhang,\n tightLabelReserve,\n );\n}\n\nfunction groupChildTopOverhang(\n group: DiagramGroup,\n bounds: NonNullable<DiagramGroup['bounds']>,\n nodes: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n) {\n const rowTop =\n graphPadY(layout) + trackPosition('row', bounds.rowStart, layout);\n const containedNodes = nodes.filter((node) => node.group === group.id);\n const childGroups =\n groups?.filter((candidate) => candidate.parent === group.id) ?? [];\n const childBoxes = [\n ...containedNodes.map((node) => nodeVisualBox(node, nodeBox(node, layout))),\n ...childGroups.map((childGroup) =>\n groupBox(childGroup, nodes, layout, groups),\n ),\n ];\n if (childBoxes.length === 0) return 0;\n return Math.max(0, ...childBoxes.map((box) => rowTop - box.y));\n}\n\nfunction groupPadding(group: DiagramGroup) {\n const padding = group.padding ?? GROUP_PAD;\n if (typeof padding === 'number') {\n return {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding,\n };\n }\n return {\n top: padding.top ?? GROUP_PAD,\n right: padding.right ?? GROUP_PAD,\n bottom: padding.bottom ?? GROUP_PAD,\n left: padding.left ?? GROUP_PAD,\n };\n}\n\nexport function groupLabelLines(group: DiagramGroup): string[] {\n if (Array.isArray(group.label)) return group.label;\n return group.label ? [group.label] : [];\n}\n\nexport function groupLabelHeight(group: DiagramGroup): number {\n const lines = groupLabelLines(group);\n if (lines.length === 0) return 0;\n return GROUP_LABEL_H + (lines.length - 1) * GROUP_LABEL_LINE_H;\n}\n\nexport function groupTitleGutterHeight(group: DiagramGroup): number {\n if (group.titleGap !== undefined && group.titleGap < 0) {\n throw new Error(\n `Diagram.Group \"${group.id}\" titleGap must be non-negative.`,\n );\n }\n const labelHeight = groupLabelHeight(group);\n if (labelHeight === 0) return 0;\n if (!group.titleBand && group.titleGap === undefined) return 0;\n return labelHeight + (group.titleGap ?? GROUP_TITLE_GAP);\n}\n\nfunction requireGroupBounds(\n group: DiagramGroup,\n): NonNullable<DiagramGroup['bounds']> {\n if (!group.bounds) {\n throw new Error(\n `Diagram.Group \"${group.id}\" needs bounds; resolve automatic graph layout before measuring groups.`,\n );\n }\n return group.bounds;\n}\n\nexport function groupDividerLines(\n group: DiagramGroup,\n nodes?: DiagramNode[],\n layout?: DiagramGraphLayout,\n groups?: DiagramGroup[],\n): GroupDividerLine[] {\n const bounds = requireGroupBounds(group);\n const box = groupBox(group, nodes, layout, groups);\n const lines: GroupDividerLine[] = [];\n\n for (const row of group.dividers?.rows ?? []) {\n if (row <= bounds.rowStart || row > bounds.rowEnd) {\n throw new Error(\n `Diagram.Group \"${group.id}\" row divider ${row} is outside group bounds.`,\n );\n }\n const y = graphPadY(layout) + trackPosition('row', row, layout);\n lines.push({\n axis: 'row',\n value: row,\n x1: box.x,\n y1: y,\n x2: box.x + box.w,\n y2: y,\n accent: group.accent ?? false,\n });\n }\n\n for (const col of group.dividers?.cols ?? []) {\n if (col <= bounds.colStart || col > bounds.colEnd) {\n throw new Error(\n `Diagram.Group \"${group.id}\" column divider ${col} is outside group bounds.`,\n );\n }\n const x = graphPadX(layout) + trackPosition('col', col, layout);\n lines.push({\n axis: 'col',\n value: col,\n x1: x,\n y1: box.y,\n x2: x,\n y2: box.y + box.h,\n accent: group.accent ?? false,\n });\n }\n\n return lines;\n}\n\nexport function svgDimensions(spec: GraphLayoutSpec) {\n spec = resolveGraphLayout(spec);\n const layout = spec.layout;\n let maxRow = 0;\n let maxCol = 0;\n let maxX = 0;\n let maxY = 0;\n for (const n of spec.nodes) {\n const row = positionedValue(n, 'row');\n const col = positionedValue(n, 'col');\n if (row > maxRow) maxRow = row;\n const lastCol = col + (n.colSpan ?? 1) - 1;\n if (lastCol > maxCol) maxCol = lastCol;\n }\n for (const g of spec.groups ?? []) {\n const bounds = requireGroupBounds(g);\n if (bounds.rowEnd > maxRow) maxRow = bounds.rowEnd;\n if (bounds.colEnd > maxCol) maxCol = bounds.colEnd;\n }\n for (const edge of spec.edges) {\n for (const point of resolveEdgeWaypoints(edge.waypoints, spec)) {\n if (point.x > maxX) maxX = point.x;\n if (point.y > maxY) maxY = point.y;\n }\n }\n for (const annotation of resolveGraphAnnotations(spec)) {\n const bounds = annotationTextBounds(annotation);\n if (bounds.x + bounds.w > maxX) maxX = bounds.x + bounds.w;\n if (bounds.y + bounds.h > maxY) maxY = bounds.y + bounds.h;\n for (const point of annotationLeaderBoundaryPoints(annotation)) {\n if (point.x > maxX) maxX = point.x;\n if (point.y > maxY) maxY = point.y;\n }\n }\n const resolved = graphLayout(layout);\n const gridW = resolved.padX * 2 + trackPosition('col', maxCol + 1, layout);\n const gridH =\n resolved.padY * 2 +\n resolved.titleTopPad +\n trackPosition('row', maxRow + 1, layout) +\n GROUP_PAD;\n const w = Math.max(gridW, maxX + resolved.padX);\n const h = Math.max(gridH, maxY + resolved.padY);\n return { w, h };\n}\n\nexport function graphContentViewBox(\n spec: GraphLayoutSpec,\n routedEdges: RoutedEdge[],\n padding = CONTENT_VIEWBOX_PAD,\n): ViewBox {\n spec = resolveGraphLayout(spec);\n const layout = spec.layout;\n let minX = Number.POSITIVE_INFINITY;\n let minY = Number.POSITIVE_INFINITY;\n let maxX = Number.NEGATIVE_INFINITY;\n let maxY = Number.NEGATIVE_INFINITY;\n\n const includePoint = (point: Point) => {\n minX = Math.min(minX, point.x);\n minY = Math.min(minY, point.y);\n maxX = Math.max(maxX, point.x);\n maxY = Math.max(maxY, point.y);\n };\n const includeBox = (box: Box) => {\n includePoint({ x: box.x, y: box.y });\n includePoint({ x: box.x + box.w, y: box.y + box.h });\n };\n\n for (const node of spec.nodes) {\n if (!node.hidden) {\n const box = nodeBox(node, layout);\n includeBox(nodeVisualBox(node, box));\n const captionBounds = nodeCaptionBounds(node, box);\n if (captionBounds) includeBox(captionBounds);\n for (const port of nodePortPlacements(node, box)) {\n includePoint({ x: port.x, y: port.y });\n includePoint({ x: port.labelX, y: port.labelY });\n }\n }\n }\n for (const group of spec.groups ?? []) {\n const box = groupBox(group, spec.nodes, layout, spec.groups);\n includeBox(box);\n for (const port of groupPortPlacements(group, box)) {\n includePoint({ x: port.x, y: port.y });\n includePoint({ x: port.labelX, y: port.labelY });\n }\n for (const line of groupDividerLines(\n group,\n spec.nodes,\n layout,\n spec.groups,\n )) {\n includePoint({ x: line.x1, y: line.y1 });\n includePoint({ x: line.x2, y: line.y2 });\n }\n }\n for (const routedEdge of routedEdges) {\n for (const point of routedEdge.points) includePoint(point);\n if (routedEdge.labelPlacement) {\n includePoint({\n x: routedEdge.labelPlacement.x,\n y: routedEdge.labelPlacement.y,\n });\n if (routedEdge.edge.label) {\n includeBox(\n edgeLabelFrameBox(routedEdge.edge, routedEdge.labelPlacement),\n );\n }\n }\n if (routedEdge.badgePlacement) {\n includeBox(edgeBadgeBounds(routedEdge.edge, routedEdge.badgePlacement));\n }\n }\n for (const annotation of resolveGraphAnnotations(spec)) {\n includeBox(annotationTextBounds(annotation));\n for (const point of annotationLeaderBoundaryPoints(annotation)) {\n includePoint(point);\n }\n }\n\n if (\n !Number.isFinite(minX) ||\n !Number.isFinite(minY) ||\n !Number.isFinite(maxX) ||\n !Number.isFinite(maxY)\n ) {\n const { w, h } = svgDimensions(spec);\n return { x: 0, y: 0, w, h };\n }\n\n const x = Math.floor(minX - padding);\n const y = Math.floor(minY - padding);\n const w = Math.ceil(maxX - minX + padding * 2);\n const h = Math.ceil(maxY - minY + padding * 2);\n return { x, y, w, h };\n}\n\nfunction portPlacements(\n ownerId: string,\n ports: DiagramNodePort[] | undefined,\n box: Box,\n): PortPlacement[] {\n return (ports ?? []).map((port) => {\n const point = pointOnBoxSide(box, port.side, port.offset ?? 0);\n const labelGap = 10;\n if (port.side === 'left') {\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x - labelGap,\n labelY: point.y + 4,\n labelAlign: 'end',\n };\n }\n if (port.side === 'right') {\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x + labelGap,\n labelY: point.y + 4,\n labelAlign: 'start',\n };\n }\n if (port.side === 'top') {\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x,\n labelY: point.y - 8,\n labelAlign: 'middle',\n };\n }\n return {\n ...port,\n ownerId,\n x: point.x,\n y: point.y,\n labelX: point.x,\n labelY: point.y + 18,\n labelAlign: 'middle',\n };\n });\n}\n\nexport function nodePortPlacements(\n node: DiagramNode,\n box = nodeBox(node),\n): PortPlacement[] {\n return portPlacements(node.id, node.ports, box);\n}\n\nexport function groupPortPlacements(\n group: DiagramGroup,\n box = groupBox(group),\n): PortPlacement[] {\n return portPlacements(group.id, group.ports, box);\n}\n\nexport function resolveGraphAnnotations(\n spec: GraphLayoutSpec,\n): ResolvedDiagramAnnotation[] {\n return (spec.annotations ?? []).map((annotation) =>\n resolveGraphAnnotation(annotation, spec),\n );\n}\n\nexport function resolveGraphAnnotation(\n annotation: DiagramAnnotation,\n spec: GraphLayoutSpec,\n): ResolvedDiagramAnnotation {\n if (annotation.target && annotation.targets !== undefined) {\n throw new Error('Diagram.Text accepts either target or targets, not both.');\n }\n\n if (annotation.targets !== undefined && annotation.targets.length === 0) {\n throw new Error('Diagram.Text targets must include at least one id.');\n }\n\n if (annotation.guide && !annotation.target && !annotation.targets?.length) {\n throw new Error(\n `Diagram.Text guide \"${annotation.guide}\" needs a target node/group id to place a lane callout.`,\n );\n }\n\n if (annotation.targets?.length) {\n const targetBoxes = annotation.targets.map((target) => ({\n target,\n box: targetBoxForAnnotation(target, spec),\n }));\n const targetBox = unionBoxes(targetBoxes.map(({ box }) => box));\n const anchor = annotation.anchor ?? 'top';\n const point = annotation.guide\n ? annotationGuidePoint(annotation.guide, targetBox, anchor, spec)\n : anchorPoint(targetBox, anchor, annotation.offset ?? 16);\n const resolvedPoint = {\n x: point.x + (annotation.dx ?? 0),\n y: point.y + (annotation.dy ?? 0),\n };\n const leaders = annotation.leader\n ? targetBoxes.map(({ target, box }) => {\n const leader = annotationLeaderPoints(\n annotation,\n box,\n anchor,\n resolvedPoint,\n );\n return {\n target,\n anchor,\n ...leader,\n };\n })\n : undefined;\n return {\n ...annotation,\n x: resolvedPoint.x,\n y: resolvedPoint.y,\n align: annotation.align ?? defaultAnnotationAlign(anchor),\n leaders,\n };\n }\n\n if (annotation.target) {\n const targetBox = targetBoxForAnnotation(annotation.target, spec);\n const anchor = annotation.anchor ?? 'top';\n const point = annotation.guide\n ? annotationGuidePoint(annotation.guide, targetBox, anchor, spec)\n : anchorPoint(targetBox, anchor, annotation.offset ?? 16);\n const resolvedPoint = {\n x: point.x + (annotation.dx ?? 0),\n y: point.y + (annotation.dy ?? 0),\n };\n const leader = annotation.leader\n ? annotationLeaderPoints(annotation, targetBox, anchor, resolvedPoint)\n : null;\n return {\n ...annotation,\n x: resolvedPoint.x,\n y: resolvedPoint.y,\n align: annotation.align ?? defaultAnnotationAlign(anchor),\n leaderFrom: leader?.from,\n leaderTo: leader?.to,\n leaders: leader\n ? [\n {\n target: annotation.target,\n anchor,\n ...leader,\n },\n ]\n : undefined,\n };\n }\n\n if (annotation.x === undefined || annotation.y === undefined) {\n throw new Error(\n 'Diagram.Text needs x/y coordinates or a target node/group id.',\n );\n }\n\n return {\n ...annotation,\n x: annotation.x,\n y: annotation.y,\n };\n}\n\nfunction annotationGuidePoint(\n guideId: string,\n targetBox: Box,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n spec: GraphLayoutSpec,\n): Point {\n const guide = guideForId(guideId, spec, 'Diagram.Text');\n const line = resolveGuideLine(guide, spec, 'Diagram.Text');\n const targetPoint = anchorPoint(targetBox, anchor, 0);\n if (line.orientation === 'vertical') {\n return { x: line.x, y: targetPoint.y };\n }\n return { x: targetPoint.x, y: line.y };\n}\n\nfunction targetBoxForAnnotation(target: string, spec: GraphLayoutSpec): Box {\n const node = spec.nodes.find((candidate) => candidate.id === target);\n if (node) return nodeBox(node, spec.layout);\n const group = spec.groups?.find((candidate) => candidate.id === target);\n if (group) return groupBox(group, spec.nodes, spec.layout, spec.groups);\n throw new Error(\n `Diagram.Text target \"${target}\" does not match a node or group.`,\n );\n}\n\nfunction unionBoxes(boxes: Box[]): Box {\n const minX = Math.min(...boxes.map((box) => box.x));\n const minY = Math.min(...boxes.map((box) => box.y));\n const maxX = Math.max(...boxes.map((box) => box.x + box.w));\n const maxY = Math.max(...boxes.map((box) => box.y + box.h));\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY };\n}\n\nfunction anchorPoint(\n box: Box,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n offset: number,\n): Point {\n const centerX = box.x + box.w / 2;\n const centerY = box.y + box.h / 2;\n if (anchor === 'top') return { x: centerX, y: box.y - offset };\n if (anchor === 'bottom') return { x: centerX, y: box.y + box.h + offset };\n if (anchor === 'left') return { x: box.x - offset, y: centerY };\n if (anchor === 'right') return { x: box.x + box.w + offset, y: centerY };\n return { x: centerX, y: centerY };\n}\n\nfunction annotationLeaderPoints(\n annotation: DiagramAnnotation,\n targetBox: Box,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n textPoint: Point,\n): Omit<DiagramAnnotationLeader, 'target' | 'anchor'> {\n const from = anchorPoint(targetBox, anchor, 0);\n const gap = annotation.leaderGap ?? 6;\n const fontSize = annotation.fontSize ?? 11;\n const route = annotation.leaderRoute ?? 'straight';\n const finish = (to: Point) => ({\n route,\n from,\n to,\n points: annotationLeaderRoutePoints(route, anchor, from, to),\n });\n if (anchor === 'right') {\n return finish({ x: textPoint.x - gap, y: textPoint.y });\n }\n if (anchor === 'left') {\n return finish({ x: textPoint.x + gap, y: textPoint.y });\n }\n if (anchor === 'top') {\n return finish({ x: textPoint.x, y: textPoint.y + fontSize + gap });\n }\n if (anchor === 'bottom') {\n return finish({ x: textPoint.x, y: textPoint.y - fontSize - gap });\n }\n return finish(textPoint);\n}\n\nfunction annotationLeaderRoutePoints(\n route: NonNullable<DiagramAnnotation['leaderRoute']>,\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n from: Point,\n to: Point,\n): Point[] {\n if (route === 'straight') return [from, to];\n if (anchor === 'center') return [from, to];\n return compactLeaderPoints([from, { x: from.x, y: to.y }, to]);\n}\n\nfunction compactLeaderPoints(points: Point[]): Point[] {\n return points.filter((point, index) => {\n const previous = points[index - 1];\n return !previous || previous.x !== point.x || previous.y !== point.y;\n });\n}\n\nfunction defaultAnnotationAlign(\n anchor: NonNullable<DiagramAnnotation['anchor']>,\n): NonNullable<DiagramAnnotation['align']> {\n if (anchor === 'left') return 'end';\n if (anchor === 'right') return 'start';\n return 'middle';\n}\n\nfunction annotationTextBounds(annotation: ResolvedDiagramAnnotation): Box {\n const fontSize = annotation.fontSize ?? 11;\n const lineHeight = fontSize + (annotation.lineGap ?? ANNOTATION_LINE_GAP);\n const width = widestLine(annotation.text, fontSize, 'sans');\n const height =\n textLineBox(fontSize, 'sans') +\n Math.max(0, annotation.text.length - 1) * lineHeight;\n const align = annotation.align ?? 'middle';\n let x = annotation.x - width / 2;\n if (align === 'start') x = annotation.x;\n if (align === 'end') x = annotation.x - width;\n return {\n x,\n y: annotation.y - fontSize,\n w: width,\n h: height,\n };\n}\n\nfunction annotationLeaderBoundaryPoints(\n annotation: ResolvedDiagramAnnotation,\n): Point[] {\n if (annotation.leaders?.length) {\n return annotation.leaders.flatMap((leader) => leader.points);\n }\n return [annotation.leaderFrom, annotation.leaderTo].filter(\n (point): point is Point => point !== undefined,\n );\n}\n\nclass MinHeap<T> {\n private data: { item: T; priority: number }[] = [];\n push(item: T, priority: number) {\n this.data.push({ item, priority });\n this.bubbleUp(this.data.length - 1);\n }\n pop(): T | undefined {\n const top = this.data[0];\n if (!top) return undefined;\n const last = this.data.pop();\n if (last && this.data.length > 0) {\n this.data[0] = last;\n this.bubbleDown(0);\n }\n return top.item;\n }\n empty() {\n return this.data.length === 0;\n }\n private bubbleUp(i: number) {\n while (i > 0) {\n const parent = (i - 1) >> 1;\n const entry = this.data[i];\n const parentEntry = this.data[parent];\n if (!entry || !parentEntry || entry.priority >= parentEntry.priority)\n break;\n this.data[i] = parentEntry;\n this.data[parent] = entry;\n i = parent;\n }\n }\n private bubbleDown(i: number) {\n while (true) {\n const entry = this.data[i];\n if (!entry) break;\n let smallest = i;\n let smallestEntry = entry;\n const left = this.data[2 * i + 1];\n if (left && left.priority < smallestEntry.priority) {\n smallest = 2 * i + 1;\n smallestEntry = left;\n }\n const right = this.data[2 * i + 2];\n if (right && right.priority < smallestEntry.priority) {\n smallest = 2 * i + 2;\n smallestEntry = right;\n }\n if (smallest === i) break;\n this.data[i] = smallestEntry;\n this.data[smallest] = entry;\n i = smallest;\n }\n }\n}\n\nfunction manhattan(a: Point, b: Point): number {\n return Math.abs(a.x - b.x) + Math.abs(a.y - b.y);\n}\n\nfunction dirCode(from: Point, to: Point): number {\n if (to.x > from.x) return 0;\n if (to.x < from.x) return 1;\n if (to.y > from.y) return 2;\n return 3;\n}\n\nexport function snapToGrid(v: number): number {\n return Math.round(v / ROUTE_CELL) * ROUTE_CELL;\n}\n\nexport function buildObstacles(\n nodes: DiagramNode[],\n gridW: number,\n gridH: number,\n layout?: DiagramGraphLayout,\n): Set<number> {\n const blocked = new Set<number>();\n for (const n of nodes) {\n if (n.hidden) continue;\n const b = nodeVisualBox(n, nodeBox(n, layout));\n const x0 = Math.floor((b.x - NODE_PAD) / ROUTE_CELL);\n const y0 = Math.floor((b.y - NODE_PAD) / ROUTE_CELL);\n const x1 = Math.ceil((b.x + b.w + NODE_PAD) / ROUTE_CELL);\n const y1 = Math.ceil((b.y + b.h + NODE_PAD) / ROUTE_CELL);\n for (let y = y0; y <= y1; y++) {\n for (let x = x0; x <= x1; x++) {\n if (x < 0 || x >= gridW || y < 0 || y >= gridH) continue;\n blocked.add(y * gridW + x);\n }\n }\n }\n return blocked;\n}\n\nfunction pickDiagramSidesByGap(\n source: Box,\n target: Box,\n): {\n exitSide: DiagramSide;\n entrySide: DiagramSide;\n} {\n const tIsRight = target.x >= source.x + source.w;\n const tIsLeft = target.x + target.w <= source.x;\n const tIsBelow = target.y >= source.y + source.h;\n const tIsAbove = target.y + target.h <= source.y;\n\n const horizontalGap = tIsRight\n ? target.x - (source.x + source.w)\n : tIsLeft\n ? source.x - (target.x + target.w)\n : null;\n const verticalGap = tIsBelow\n ? target.y - (source.y + source.h)\n : tIsAbove\n ? source.y - (target.y + target.h)\n : null;\n\n const useVertical =\n verticalGap !== null &&\n (horizontalGap === null || verticalGap <= horizontalGap);\n\n if (useVertical) {\n return tIsBelow\n ? { exitSide: 'bottom', entrySide: 'top' }\n : { exitSide: 'top', entrySide: 'bottom' };\n }\n return tIsRight\n ? { exitSide: 'right', entrySide: 'left' }\n : { exitSide: 'left', entrySide: 'right' };\n}\n\nexport function endpointsForDiagramSides(\n source: Box,\n target: Box,\n exitSide: DiagramSide,\n entrySide: DiagramSide,\n exitOffset = 0,\n entryOffset = 0,\n entryGap = ENTRY_GAP,\n): {\n exit: Point;\n entry: Point;\n exitSide: DiagramSide;\n entrySide: DiagramSide;\n} {\n const sCenter = { x: source.x + source.w / 2, y: source.y + source.h / 2 };\n const tCenter = { x: target.x + target.w / 2, y: target.y + target.h / 2 };\n\n let exit: Point;\n if (exitSide === 'top') {\n exit = { x: snapToGrid(sCenter.x + exitOffset), y: source.y };\n } else if (exitSide === 'bottom') {\n exit = { x: snapToGrid(sCenter.x + exitOffset), y: source.y + source.h };\n } else if (exitSide === 'left') {\n exit = { x: source.x, y: snapToGrid(sCenter.y + exitOffset) };\n } else {\n exit = { x: source.x + source.w, y: snapToGrid(sCenter.y + exitOffset) };\n }\n\n let entry: Point;\n if (entrySide === 'top') {\n entry = {\n x: snapToGrid(tCenter.x + entryOffset),\n y: target.y - entryGap,\n };\n } else if (entrySide === 'bottom') {\n entry = {\n x: snapToGrid(tCenter.x + entryOffset),\n y: target.y + target.h + entryGap,\n };\n } else if (entrySide === 'left') {\n entry = {\n x: target.x - entryGap,\n y: snapToGrid(tCenter.y + entryOffset),\n };\n } else {\n entry = {\n x: target.x + target.w + entryGap,\n y: snapToGrid(tCenter.y + entryOffset),\n };\n }\n\n return { exit, entry, exitSide, entrySide };\n}\n\nexport function pickEndpoints(\n source: Box,\n target: Box,\n hint?: { exitSide?: DiagramSide; entrySide?: DiagramSide },\n exitOffset = 0,\n entryOffset = 0,\n entryGap = ENTRY_GAP,\n): {\n exit: Point;\n entry: Point;\n exitSide: DiagramSide;\n entrySide: DiagramSide;\n} {\n const sides =\n hint?.exitSide && hint?.entrySide\n ? { exitSide: hint.exitSide, entrySide: hint.entrySide }\n : pickDiagramSidesByGap(source, target);\n\n return endpointsForDiagramSides(\n source,\n target,\n sides.exitSide,\n sides.entrySide,\n exitOffset,\n entryOffset,\n entryGap,\n );\n}\n\nexport function computeStub(\n point: Point,\n side: DiagramSide,\n distance = STUB,\n): Point {\n if (side === 'top') return { x: point.x, y: point.y - distance };\n if (side === 'bottom') return { x: point.x, y: point.y + distance };\n if (side === 'left') return { x: point.x - distance, y: point.y };\n return { x: point.x + distance, y: point.y };\n}\n\nfunction tryStraightLine(\n from: Point,\n to: Point,\n blocked: Set<number>,\n gridW: number,\n): boolean {\n if (from.x === to.x) {\n const x = Math.round(from.x / ROUTE_CELL);\n const y0 = Math.min(from.y, to.y);\n const y1 = Math.max(from.y, to.y);\n for (let y = y0; y <= y1; y += ROUTE_CELL) {\n const gy = Math.round(y / ROUTE_CELL);\n if (blocked.has(gy * gridW + x)) return false;\n }\n return true;\n }\n if (from.y === to.y) {\n const y = Math.round(from.y / ROUTE_CELL);\n const x0 = Math.min(from.x, to.x);\n const x1 = Math.max(from.x, to.x);\n for (let x = x0; x <= x1; x += ROUTE_CELL) {\n const gx = Math.round(x / ROUTE_CELL);\n if (blocked.has(y * gridW + gx)) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction reserveRoutedEdge(\n blocked: Set<number>,\n points: Point[],\n gridW: number,\n gridH: number,\n) {\n if (points.length < 2) return;\n for (let i = 0; i < points.length - 1; i++) {\n const isEndpointStub =\n points.length > 2 && (i === 0 || i === points.length - 2);\n const from = points[i];\n const to = points[i + 1];\n if (isEndpointStub || !from || !to) continue;\n reserveSegment(blocked, from, to, gridW, gridH);\n }\n}\n\nfunction reserveSegment(\n blocked: Set<number>,\n from: Point,\n to: Point,\n gridW: number,\n gridH: number,\n) {\n if (from.x !== to.x && from.y !== to.y) return;\n const x0 = Math.round(Math.min(from.x, to.x) / ROUTE_CELL);\n const x1 = Math.round(Math.max(from.x, to.x) / ROUTE_CELL);\n const y0 = Math.round(Math.min(from.y, to.y) / ROUTE_CELL);\n const y1 = Math.round(Math.max(from.y, to.y) / ROUTE_CELL);\n for (let y = y0; y <= y1; y++) {\n for (let x = x0; x <= x1; x++) {\n for (\n let dy = -ROUTE_RESERVATION_CELLS;\n dy <= ROUTE_RESERVATION_CELLS;\n dy++\n ) {\n for (\n let dx = -ROUTE_RESERVATION_CELLS;\n dx <= ROUTE_RESERVATION_CELLS;\n dx++\n ) {\n const gx = x + dx;\n const gy = y + dy;\n if (gx < 0 || gx >= gridW || gy < 0 || gy >= gridH) continue;\n blocked.add(gy * gridW + gx);\n }\n }\n }\n }\n}\n\nfunction aStar(\n start: Point,\n goal: Point,\n blocked: Set<number>,\n gridW: number,\n gridH: number,\n): Point[] | null {\n const startKey = start.y * gridW + start.x;\n const goalKey = goal.y * gridW + goal.x;\n if (startKey === goalKey) return [start];\n\n type Node = { pt: Point; dir: number | null };\n const open = new MinHeap<Node>();\n const gScore = new Map<number, number>();\n const cameFrom = new Map<number, Point>();\n\n gScore.set(startKey, 0);\n open.push({ pt: start, dir: null }, manhattan(start, goal));\n\n const DIRS: [number, number][] = [\n [1, 0],\n [-1, 0],\n [0, 1],\n [0, -1],\n ];\n\n while (!open.empty()) {\n const current = open.pop();\n if (!current) break;\n const cur = current.pt;\n const curKey = cur.y * gridW + cur.x;\n if (curKey === goalKey) {\n const path: Point[] = [cur];\n let k = curKey;\n while (cameFrom.has(k)) {\n const prev = cameFrom.get(k);\n if (!prev) break;\n path.unshift(prev);\n k = prev.y * gridW + prev.x;\n }\n return path;\n }\n\n const lastDir = current.dir;\n\n for (const [dx, dy] of DIRS) {\n const nx = cur.x + dx;\n const ny = cur.y + dy;\n if (nx < 0 || nx >= gridW || ny < 0 || ny >= gridH) continue;\n const nKey = ny * gridW + nx;\n if (blocked.has(nKey) && nKey !== goalKey) continue;\n const newDir = dirCode(cur, { x: nx, y: ny });\n const turnCost =\n lastDir !== null && newDir !== lastDir ? TURN_PENALTY : 0;\n const tentativeG = (gScore.get(curKey) ?? 0) + 1 + turnCost;\n const existingG = gScore.get(nKey);\n if (existingG !== undefined && tentativeG >= existingG) continue;\n gScore.set(nKey, tentativeG);\n cameFrom.set(nKey, cur);\n const f = tentativeG + manhattan({ x: nx, y: ny }, goal);\n open.push({ pt: { x: nx, y: ny }, dir: newDir }, f);\n }\n }\n return null;\n}\n\nexport function simplifyPath(path: Point[]): Point[] {\n const first = path[0];\n const last = path.at(-1);\n if (path.length < 3 || !first || !last) return path;\n const result: Point[] = [first];\n let prev = first;\n for (let i = 1; i < path.length - 1; i++) {\n const cur = path[i];\n const next = path[i + 1];\n if (!cur || !next) continue;\n const cross =\n (cur.x - prev.x) * (next.y - cur.y) - (cur.y - prev.y) * (next.x - cur.x);\n if (cross === 0) continue;\n result.push(cur);\n prev = cur;\n }\n result.push(last);\n return result;\n}\n\nexport function pathToSvg(points: Point[], radius = 8): string {\n const [first, second] = points;\n const last = points.at(-1);\n if (!first || !last) return '';\n if (!second) return `M ${first.x} ${first.y}`;\n if (points.length === 2)\n return `M ${first.x} ${first.y} L ${second.x} ${second.y}`;\n\n const parts = [`M ${first.x} ${first.y}`];\n for (let i = 1; i < points.length - 1; i++) {\n const prev = points[i - 1];\n const cur = points[i];\n const next = points[i + 1];\n if (!prev || !cur || !next) continue;\n const dpx = cur.x - prev.x;\n const dpy = cur.y - prev.y;\n const dnx = next.x - cur.x;\n const dny = next.y - cur.y;\n const lp = Math.hypot(dpx, dpy);\n const ln = Math.hypot(dnx, dny);\n const r = Math.min(radius, lp / 2, ln / 2);\n const cs = {\n x: cur.x - (dpx / lp) * r,\n y: cur.y - (dpy / lp) * r,\n };\n const ce = {\n x: cur.x + (dnx / ln) * r,\n y: cur.y + (dny / ln) * r,\n };\n parts.push(`L ${cs.x} ${cs.y}`);\n parts.push(`Q ${cur.x} ${cur.y} ${ce.x} ${ce.y}`);\n }\n parts.push(`L ${last.x} ${last.y}`);\n return parts.join(' ');\n}\n\nexport type LabelPlacement = {\n x: number;\n y: number;\n align: NonNullable<DiagramEdge['labelAlign']>;\n side: 'above' | 'below' | 'left' | 'right';\n segmentIndex?: number;\n};\n\nexport type BadgePlacement = {\n x: number;\n y: number;\n side: 'above' | 'below' | 'left' | 'right';\n};\n\ntype LabelBounds = {\n x1: number;\n y1: number;\n x2: number;\n y2: number;\n};\n\nfunction computeLabelPlacement(\n points: Point[],\n edge?: DiagramEdge,\n): LabelPlacement | null {\n if (points.length < 2) return null;\n if (edge?.labelSegment !== undefined) {\n const segmentIndex = resolveLabelSegmentIndex(edge.labelSegment, points);\n const a = points[segmentIndex];\n const b = points[segmentIndex + 1];\n if (!a || !b) return null;\n return {\n ...edgeLabelPlacementForSegment(a, b, edge),\n segmentIndex,\n };\n }\n if (edge?.labelT !== undefined) {\n const anchor = pathAnchorAtFraction(points, edge.labelT);\n if (!anchor) return null;\n if (edge.labelSide && edge.labelSide !== 'auto') {\n return edgeLabelPlacementFromHint(anchor.point.x, anchor.point.y, edge);\n }\n const isHorizontal = anchor.from.y === anchor.to.y;\n if (isHorizontal) {\n return {\n x: anchor.point.x,\n y: anchor.point.y - 10,\n align: 'middle',\n side: 'above',\n };\n }\n return {\n x: anchor.point.x + 10,\n y: anchor.point.y,\n align: 'start',\n side: 'right',\n };\n }\n\n let bestI = 0;\n let bestLen = -1;\n for (let i = 0; i < points.length - 1; i++) {\n const a = points[i];\n const b = points[i + 1];\n if (!a || !b) continue;\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n if (len > bestLen) {\n bestLen = len;\n bestI = i;\n }\n }\n const a = points[bestI];\n const b = points[bestI + 1];\n if (!a || !b) return null;\n return {\n ...edgeLabelPlacementForSegment(a, b, edge),\n segmentIndex: bestI,\n };\n}\n\nfunction resolveLabelSegmentIndex(segment: number, points: Point[]) {\n if (!Number.isInteger(segment) || segment < 0) {\n throw new Error(\n `Diagram edge labelSegment must be a non-negative integer, got ${segment}.`,\n );\n }\n const maxSegment = points.length - 2;\n if (segment > maxSegment) {\n throw new Error(\n `Diagram edge labelSegment ${segment} is outside routed path segments 0-${maxSegment}.`,\n );\n }\n return segment;\n}\n\nfunction edgeLabelPlacementForSegment(\n a: Point,\n b: Point,\n edge?: DiagramEdge,\n): LabelPlacement {\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n if (edge?.labelSide && edge.labelSide !== 'auto') {\n return edgeLabelPlacementFromHint(midX, midY, edge);\n }\n\n const isHorizontal = a.y === b.y;\n if (isHorizontal) {\n return { x: midX, y: midY - 10, align: 'middle', side: 'above' };\n }\n return { x: midX + 10, y: midY, align: 'start', side: 'right' };\n}\n\nfunction computeBadgePlacement(\n points: Point[],\n edge: DiagramEdge,\n): BadgePlacement | null {\n if (!edge.badgeIcon && !edge.badgeLabel?.length) return null;\n const anchor = pointAtPathFraction(points, edge.badgeT ?? 0.5);\n if (!anchor) return null;\n const side =\n edge.badgeSide && edge.badgeSide !== 'auto' ? edge.badgeSide : 'above';\n const offset = edge.badgeOffset ?? 22;\n const dx = edge.badgeDx ?? 0;\n const dy = edge.badgeDy ?? 0;\n\n if (side === 'above') {\n return { x: anchor.x + dx, y: anchor.y - offset + dy, side };\n }\n if (side === 'below') {\n return { x: anchor.x + dx, y: anchor.y + offset + dy, side };\n }\n if (side === 'left') {\n return { x: anchor.x - offset + dx, y: anchor.y + dy, side };\n }\n return { x: anchor.x + offset + dx, y: anchor.y + dy, side };\n}\n\nfunction pointAtPathFraction(points: Point[], fraction: number): Point | null {\n return pathAnchorAtFraction(points, fraction)?.point ?? null;\n}\n\nfunction pathAnchorAtFraction(\n points: Point[],\n fraction: number,\n): { point: Point; from: Point; to: Point } | null {\n const first = points[0];\n const last = points.at(-1);\n const beforeLast = points.at(-2);\n if (!first || !last) return null;\n if (!beforeLast) {\n return { point: first, from: first, to: first };\n }\n const clamped = Math.max(0, Math.min(1, fraction));\n const segments: { from: Point; to: Point; length: number }[] = [];\n let from = first;\n for (const to of points.slice(1)) {\n segments.push({\n from,\n to,\n length: Math.hypot(to.x - from.x, to.y - from.y),\n });\n from = to;\n }\n const total = segments.reduce((sum, segment) => sum + segment.length, 0);\n if (total === 0) {\n return { point: first, from: first, to: first };\n }\n let target = total * clamped;\n for (const segment of segments) {\n if (target > segment.length) {\n target -= segment.length;\n continue;\n }\n const ratio = segment.length === 0 ? 0 : target / segment.length;\n return {\n point: {\n x: segment.from.x + (segment.to.x - segment.from.x) * ratio,\n y: segment.from.y + (segment.to.y - segment.from.y) * ratio,\n },\n from: segment.from,\n to: segment.to,\n };\n }\n return {\n point: last,\n from: beforeLast,\n to: last,\n };\n}\n\nfunction edgeLabelPlacementFromHint(\n midX: number,\n midY: number,\n edge: DiagramEdge,\n): LabelPlacement {\n const side = edge.labelSide;\n if (!side || side === 'auto') {\n throw new Error('Diagram edge label side must be resolved before use.');\n }\n const offset = edge.labelOffset ?? 10;\n const dx = edge.labelDx ?? 0;\n const dy = edge.labelDy ?? 0;\n const align =\n edge.labelAlign ??\n (side === 'left' ? 'end' : side === 'right' ? 'start' : 'middle');\n\n if (side === 'above') {\n return { x: midX + dx, y: midY - offset + dy, align, side };\n }\n if (side === 'below') {\n return { x: midX + dx, y: midY + offset + dy, align, side };\n }\n if (side === 'left') {\n return { x: midX - offset + dx, y: midY + dy, align, side };\n }\n return { x: midX + offset + dx, y: midY + dy, align, side };\n}\n\nfunction deconflictLabelPlacements(routedEdges: RoutedEdge[]): RoutedEdge[] {\n const occupied: LabelBounds[] = [];\n return routedEdges.map((routedEdge) => {\n const placement = routedEdge.labelPlacement;\n const label = routedEdge.edge.label;\n if (!placement || !label?.length) return routedEdge;\n\n const nextPlacement = placeLabel(placement, routedEdge.edge, occupied);\n occupied.push(edgeLabelBounds(routedEdge.edge, nextPlacement));\n if (nextPlacement === placement) return routedEdge;\n return {\n ...routedEdge,\n labelPlacement: nextPlacement,\n };\n });\n}\n\nfunction placeLabel(\n placement: LabelPlacement,\n edge: DiagramEdge,\n occupied: LabelBounds[],\n): LabelPlacement {\n const maxAttempts = Math.max(12, occupied.length * 2 + 8);\n for (const offset of labelOffsetCandidates(placement, edge, maxAttempts)) {\n const candidate = offsetLabelPlacement(placement, offset);\n const bounds = edgeLabelBounds(edge, candidate);\n if (!occupied.some((other) => labelBoundsOverlap(bounds, other))) {\n return candidate;\n }\n }\n\n throw new Error(\n 'Diagram edge labels could not be placed without overlap. Add waypoints or split the diagram.',\n );\n}\n\nfunction labelOffsetCandidates(\n placement: LabelPlacement,\n edge: DiagramEdge,\n maxAttempts: number,\n): Point[] {\n const size = edgeLabelSize(edge);\n const step =\n placement.side === 'above' || placement.side === 'below'\n ? size.h + EDGE_LABEL_GAP\n : size.w + EDGE_LABEL_GAP;\n const candidates: Point[] = [{ x: 0, y: 0 }];\n\n for (let i = 1; candidates.length < maxAttempts; i++) {\n const primary = i * step;\n if (placement.side === 'above') {\n candidates.push({ x: 0, y: -primary }, { x: 0, y: primary });\n } else if (placement.side === 'below') {\n candidates.push({ x: 0, y: primary }, { x: 0, y: -primary });\n } else if (placement.side === 'left') {\n candidates.push({ x: -primary, y: 0 }, { x: primary, y: 0 });\n } else {\n candidates.push({ x: primary, y: 0 }, { x: -primary, y: 0 });\n }\n }\n\n return candidates.slice(0, maxAttempts);\n}\n\nfunction offsetLabelPlacement(\n placement: LabelPlacement,\n offset: Point,\n): LabelPlacement {\n if (offset.x === 0 && offset.y === 0) return placement;\n return {\n ...placement,\n x: placement.x + offset.x,\n y: placement.y + offset.y,\n };\n}\n\nexport function edgeLabelFontSize(edge: DiagramEdge) {\n return edge.labelFontSize ?? EDGE_LABEL_FONT_SIZE;\n}\n\nexport function edgeLabelFramePad(edge: DiagramEdge) {\n return edge.labelFramePadding ?? EDGE_LABEL_BOX_PAD;\n}\n\nexport function edgeLabelSize(edge: DiagramEdge) {\n const label = edge.label ?? [];\n const pad = edgeLabelFramePad(edge);\n return {\n w: widestLine(label, edgeLabelFontSize(edge), 'mono') + pad * 2,\n h:\n textLineBox(edgeLabelFontSize(edge), 'mono') +\n Math.max(0, label.length - 1) * edgeLabelLineHeight(edge) +\n pad * 2,\n };\n}\n\nexport function edgeLabelAscent(edge: DiagramEdge) {\n return textAscent(edgeLabelFontSize(edge), 'mono') + edgeLabelFramePad(edge);\n}\n\nexport function edgeLabelLineHeight(edge: DiagramEdge) {\n return edgeLabelFontSize(edge) + (edge.labelLineGap ?? EDGE_LABEL_LINE_GAP);\n}\n\nexport function edgeBadgeSize(edge: DiagramEdge) {\n const label = edge.badgeLabel ?? [];\n const labelWidth = widestLine(label, EDGE_BADGE_FONT_SIZE, 'sans');\n const iconWidth = edge.badgeIcon ? EDGE_BADGE_ICON : 0;\n const gap = edge.badgeIcon && label.length > 0 ? 8 : 0;\n return {\n w: Math.max(24, iconWidth + gap + labelWidth) + 16,\n h: Math.max(24, label.length * EDGE_LABEL_LINE_H) + 12,\n };\n}\n\nfunction edgeBadgeBounds(edge: DiagramEdge, placement: BadgePlacement): Box {\n const { w, h } = edgeBadgeSize(edge);\n return {\n x: placement.x - w / 2,\n y: placement.y - h / 2,\n w,\n h,\n };\n}\n\nfunction edgeLabelBounds(\n edge: DiagramEdge,\n placement: LabelPlacement,\n): LabelBounds {\n const box = edgeLabelFrameBox(edge, placement);\n return {\n x1: box.x,\n y1: box.y,\n x2: box.x + box.w,\n y2: box.y + box.h,\n };\n}\n\nexport function edgeLabelFrameBox(\n edge: DiagramEdge,\n placement: LabelPlacement,\n): Box {\n const { w, h } = edgeLabelSize(edge);\n const y = placement.y - edgeLabelAscent(edge);\n if (placement.align === 'middle') return { x: placement.x - w / 2, y, w, h };\n if (placement.align === 'end') return { x: placement.x - w, y, w, h };\n return { x: placement.x, y, w, h };\n}\n\nfunction labelBoundsOverlap(a: LabelBounds, b: LabelBounds) {\n return a.x1 < b.x2 && a.x2 > b.x1 && a.y1 < b.y2 && a.y2 > b.y1;\n}\n\nfunction resolveEdgeWaypoints(\n waypoints: DiagramWaypoint[] | undefined,\n spec: GraphLayoutSpec,\n): Point[] {\n const layout = spec.layout;\n return (waypoints ?? []).map((waypoint) => {\n if ('guide' in waypoint) return resolveGuideWaypoint(waypoint, spec);\n if ('x' in waypoint && 'y' in waypoint) return waypoint;\n if ('target' in waypoint) {\n const point = targetAnchorPoint(\n waypoint.target,\n waypoint.anchor ?? 'center',\n waypoint.gap ?? 0,\n spec,\n );\n return {\n x: snapToGrid(point.x + (waypoint.dx ?? 0)),\n y: snapToGrid(point.y + (waypoint.dy ?? 0)),\n };\n }\n return {\n x: snapToGrid(\n graphPadX(layout) +\n trackPosition('col', waypoint.col, layout) +\n (waypoint.dx ?? 0),\n ),\n y: snapToGrid(\n graphPadY(layout) +\n trackPosition('row', waypoint.row, layout) +\n (waypoint.dy ?? 0),\n ),\n };\n });\n}\n\ntype GuideWaypoint = Extract<DiagramWaypoint, { guide: string }>;\n\ntype ResolvedGuideLine =\n | { orientation: 'vertical'; x: number }\n | { orientation: 'horizontal'; y: number };\n\nfunction resolveGuideWaypoint(\n waypoint: GuideWaypoint,\n spec: GraphLayoutSpec,\n): Point {\n const guide = guideForId(waypoint.guide, spec, 'Diagram.Waypoint');\n const line = resolveGuideLine(guide, spec, 'Diagram.Waypoint');\n if (line.orientation === 'vertical') {\n return {\n x: snapToGrid(line.x + (waypoint.dx ?? 0)),\n y: snapToGrid(\n guideWaypointCrossAxis('y', waypoint, spec) + (waypoint.dy ?? 0),\n ),\n };\n }\n return {\n x: snapToGrid(\n guideWaypointCrossAxis('x', waypoint, spec) + (waypoint.dx ?? 0),\n ),\n y: snapToGrid(line.y + (waypoint.dy ?? 0)),\n };\n}\n\nfunction guideForId(\n guideId: string,\n spec: GraphLayoutSpec,\n consumer: string,\n): DiagramGuide {\n const matches = (spec.guides ?? []).filter(\n (candidate) => candidate.id === guideId,\n );\n const [match, ...duplicates] = matches;\n if (!match) {\n throw new Error(\n `${consumer} guide \"${guideId}\" does not match a Diagram.Guide id.`,\n );\n }\n if (duplicates.length > 0) {\n throw new Error(`Duplicate Diagram guide id \"${guideId}\".`);\n }\n return match;\n}\n\nfunction resolveGuideLine(\n guide: DiagramGuide,\n spec: GraphLayoutSpec,\n consumer: string,\n): ResolvedGuideLine {\n const orientation = guide.orientation;\n if (!orientation) {\n throw new Error(\n `Diagram.Guide \"${guide.id}\" needs an orientation before ${consumer} can use it.`,\n );\n }\n if (orientation === 'vertical') {\n return {\n orientation,\n x: resolveGuideMainAxis(guide, orientation, spec),\n };\n }\n return {\n orientation,\n y: resolveGuideMainAxis(guide, orientation, spec),\n };\n}\n\nfunction resolveGuideMainAxis(\n guide: DiagramGuide,\n orientation: DiagramGuideOrientation,\n spec: GraphLayoutSpec,\n): number {\n if (orientation === 'vertical') {\n if (guide.x !== undefined) return snapToGrid(guide.x + (guide.dx ?? 0));\n if (guide.col !== undefined) {\n return snapToGrid(\n graphPadX(spec.layout) +\n trackPosition('col', guide.col, spec.layout) +\n (guide.dx ?? 0),\n );\n }\n if (guide.target) {\n const point = targetAnchorPoint(\n guide.target,\n guide.anchor ?? 'center',\n guide.gap ?? 0,\n spec,\n );\n return snapToGrid(point.x + (guide.dx ?? 0));\n }\n throw new Error(\n `Diagram.Guide \"${guide.id}\" needs x, col, or target to define a vertical corridor.`,\n );\n }\n\n if (guide.y !== undefined) return snapToGrid(guide.y + (guide.dy ?? 0));\n if (guide.row !== undefined) {\n return snapToGrid(\n graphPadY(spec.layout) +\n trackPosition('row', guide.row, spec.layout) +\n (guide.dy ?? 0),\n );\n }\n if (guide.target) {\n const point = targetAnchorPoint(\n guide.target,\n guide.anchor ?? 'center',\n guide.gap ?? 0,\n spec,\n );\n return snapToGrid(point.y + (guide.dy ?? 0));\n }\n throw new Error(\n `Diagram.Guide \"${guide.id}\" needs y, row, or target to define a horizontal corridor.`,\n );\n}\n\nfunction guideWaypointCrossAxis(\n axis: 'x' | 'y',\n waypoint: GuideWaypoint,\n spec: GraphLayoutSpec,\n) {\n if (axis === 'x') {\n if (waypoint.x !== undefined) return waypoint.x;\n if (waypoint.col !== undefined) {\n return (\n graphPadX(spec.layout) + trackPosition('col', waypoint.col, spec.layout)\n );\n }\n if (waypoint.target) {\n return targetAnchorPoint(\n waypoint.target,\n waypoint.anchor ?? 'center',\n waypoint.gap ?? 0,\n spec,\n ).x;\n }\n throw new Error(\n `Diagram.Waypoint guide \"${waypoint.guide}\" needs target, x, or col to place a point on a horizontal guide.`,\n );\n }\n\n if (waypoint.y !== undefined) return waypoint.y;\n if (waypoint.row !== undefined) {\n return (\n graphPadY(spec.layout) + trackPosition('row', waypoint.row, spec.layout)\n );\n }\n if (waypoint.target) {\n return targetAnchorPoint(\n waypoint.target,\n waypoint.anchor ?? 'center',\n waypoint.gap ?? 0,\n spec,\n ).y;\n }\n throw new Error(\n `Diagram.Waypoint guide \"${waypoint.guide}\" needs target, y, or row to place a point on a vertical guide.`,\n );\n}\n\nfunction targetAnchorPoint(\n target: string,\n anchor: DiagramAnchor,\n gap: number,\n spec: GraphLayoutSpec,\n): Point {\n return anchorPoint(targetBoxForWaypoint(target, spec), anchor, gap);\n}\n\nfunction targetBoxForWaypoint(target: string, spec: GraphLayoutSpec): Box {\n const node = spec.nodes.find((candidate) => candidate.id === target);\n if (node) return nodeBox(node, spec.layout);\n const group = spec.groups?.find((candidate) => candidate.id === target);\n if (group) return groupBox(group, spec.nodes, spec.layout, spec.groups);\n throw new Error(\n `Diagram.Waypoint target \"${target}\" does not match a node or group.`,\n );\n}\n\nexport function routeEdge(\n edge: DiagramEdge,\n source: Box,\n target: Box,\n blocked: Set<number>,\n gridW: number,\n gridH: number,\n hint?: { exitSide?: DiagramSide; entrySide?: DiagramSide },\n exitOffset = 0,\n entryOffset = 0,\n waypoints?: Point[],\n entryGap = ENTRY_GAP,\n routeOffset = 0,\n): {\n d: string;\n entry: Point;\n points: Point[];\n labelPlacement: LabelPlacement | null;\n badgePlacement: BadgePlacement | null;\n} {\n const { exit, entry, exitSide, entrySide } = pickEndpoints(\n source,\n target,\n hint,\n exitOffset,\n entryOffset,\n entryGap,\n );\n const stubDistance = (edge.stubDistance ?? STUB) + routeOffset;\n const stubExit = computeStub(exit, exitSide, stubDistance);\n const stubEntry = computeStub(entry, entrySide, stubDistance);\n\n const staggerLabel = (placement: LabelPlacement | null) => {\n if (!placement) return null;\n if (\n (exitSide === 'top' || exitSide === 'bottom') &&\n (placement.side === 'left' || placement.side === 'right')\n ) {\n return { ...placement, y: placement.y + exitOffset };\n }\n return placement;\n };\n\n if (edge.route === 'straight') {\n const points = [exit, entry];\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: staggerLabel(computeLabelPlacement(points, edge)),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n }\n\n if (waypoints?.length) {\n const points = simplifyPath([\n exit,\n stubExit,\n ...waypoints,\n stubEntry,\n entry,\n ]);\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: staggerLabel(computeLabelPlacement(points, edge)),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n }\n\n if (tryStraightLine(stubExit, stubEntry, blocked, gridW)) {\n const points = simplifyPath([exit, stubExit, stubEntry, entry]);\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: staggerLabel(computeLabelPlacement(points, edge)),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n }\n\n const startG = {\n x: Math.round(stubExit.x / ROUTE_CELL),\n y: Math.round(stubExit.y / ROUTE_CELL),\n };\n const goalG = {\n x: Math.round(stubEntry.x / ROUTE_CELL),\n y: Math.round(stubEntry.y / ROUTE_CELL),\n };\n\n const path = aStar(startG, goalG, blocked, gridW, gridH);\n if (!path) {\n const fallback = [exit, entry];\n return {\n d: pathToSvg(fallback),\n entry,\n points: fallback,\n labelPlacement: staggerLabel(computeLabelPlacement(fallback, edge)),\n badgePlacement: computeBadgePlacement(fallback, edge),\n };\n }\n\n const pixelPath = path.map((p) => ({\n x: p.x * ROUTE_CELL,\n y: p.y * ROUTE_CELL,\n }));\n\n const fullPath = [exit, ...pixelPath, entry];\n const simplified = simplifyPath(fullPath);\n return {\n d: pathToSvg(simplified),\n entry,\n points: simplified,\n labelPlacement: staggerLabel(computeLabelPlacement(simplified, edge)),\n badgePlacement: computeBadgePlacement(simplified, edge),\n };\n}\n\nexport function pointOnBoxSide(box: Box, side: DiagramSide, offset = 0): Point {\n const center = { x: box.x + box.w / 2, y: box.y + box.h / 2 };\n if (side === 'top') return { x: snapToGrid(center.x + offset), y: box.y };\n if (side === 'bottom') {\n return { x: snapToGrid(center.x + offset), y: box.y + box.h };\n }\n if (side === 'left') return { x: box.x, y: snapToGrid(center.y + offset) };\n return { x: box.x + box.w, y: snapToGrid(center.y + offset) };\n}\n\nfunction pointOutsideBoxSide(\n box: Box,\n side: DiagramSide,\n offset = 0,\n gap = ENTRY_GAP,\n): Point {\n const point = pointOnBoxSide(box, side, offset);\n if (side === 'top') return { ...point, y: box.y - gap };\n if (side === 'bottom') return { ...point, y: box.y + box.h + gap };\n if (side === 'left') return { ...point, x: box.x - gap };\n return { ...point, x: box.x + box.w + gap };\n}\n\nfunction routeSelfLoop(\n edge: DiagramEdge,\n source: Box,\n side: DiagramSide,\n waypoints?: Point[],\n entryGap = ENTRY_GAP,\n): {\n d: string;\n entry: Point;\n points: Point[];\n labelPlacement: LabelPlacement | null;\n badgePlacement: BadgePlacement | null;\n} {\n const axisOffset =\n side === 'top' || side === 'bottom' ? SELF_LOOP_OFFSET : -SELF_LOOP_OFFSET;\n const entryAxisOffset = -axisOffset;\n const exit = pointOnBoxSide(source, side, axisOffset);\n const entry = pointOutsideBoxSide(source, side, entryAxisOffset, entryGap);\n\n let loopPoints: Point[];\n if (waypoints?.length) {\n loopPoints = [exit, computeStub(exit, side), ...waypoints, entry];\n } else if (side === 'top') {\n const y = source.y - SELF_LOOP_DEPTH;\n loopPoints = [exit, { x: exit.x, y }, { x: entry.x, y }, entry];\n } else if (side === 'bottom') {\n const y = source.y + source.h + SELF_LOOP_DEPTH;\n loopPoints = [exit, { x: exit.x, y }, { x: entry.x, y }, entry];\n } else if (side === 'left') {\n const x = source.x - SELF_LOOP_DEPTH;\n loopPoints = [exit, { x, y: exit.y }, { x, y: entry.y }, entry];\n } else {\n const x = source.x + source.w + SELF_LOOP_DEPTH;\n loopPoints = [exit, { x, y: exit.y }, { x, y: entry.y }, entry];\n }\n\n const points = simplifyPath(loopPoints);\n return {\n d: pathToSvg(points),\n entry,\n points,\n labelPlacement: computeLabelPlacement(points, edge),\n badgePlacement: computeBadgePlacement(points, edge),\n };\n}\n\nexport type RoutedEdge = {\n edge: DiagramEdge;\n d: string;\n entry: Point;\n points: Point[];\n labelPlacement: LabelPlacement | null;\n badgePlacement: BadgePlacement | null;\n};\n\nfunction resolveDiagramSides(\n edge: DiagramEdge,\n source: Box,\n target: Box,\n hasReciprocal = false,\n): { exitSide: DiagramSide; entrySide: DiagramSide } {\n if (edge.exitSide && edge.entrySide) {\n return { exitSide: edge.exitSide, entrySide: edge.entrySide };\n }\n const edgeIsUnhinted =\n !edge.exitSide && !edge.entrySide && !edge.waypoints?.length;\n if (edgeIsUnhinted && hasReciprocal) {\n const sourceCenter = {\n x: source.x + source.w / 2,\n y: source.y + source.h / 2,\n };\n const targetCenter = {\n x: target.x + target.w / 2,\n y: target.y + target.h / 2,\n };\n const horizontalDelta = targetCenter.x - sourceCenter.x;\n const verticalDelta = targetCenter.y - sourceCenter.y;\n if (Math.abs(horizontalDelta) >= Math.abs(verticalDelta)) {\n return horizontalDelta < 0\n ? { exitSide: 'bottom', entrySide: 'bottom' }\n : { exitSide: 'right', entrySide: 'left' };\n }\n return verticalDelta < 0\n ? { exitSide: 'right', entrySide: 'right' }\n : { exitSide: 'bottom', entrySide: 'top' };\n }\n if (edgeIsUnhinted) {\n const sourceCenter = {\n x: source.x + source.w / 2,\n y: source.y + source.h / 2,\n };\n const targetCenter = {\n x: target.x + target.w / 2,\n y: target.y + target.h / 2,\n };\n const horizontalDelta = targetCenter.x - sourceCenter.x;\n const verticalDelta = targetCenter.y - sourceCenter.y;\n if (horizontalDelta < 0 && verticalDelta === 0) {\n return { exitSide: 'bottom', entrySide: 'bottom' };\n }\n if (horizontalDelta > 0 && horizontalDelta >= Math.abs(verticalDelta)) {\n return { exitSide: 'right', entrySide: 'left' };\n }\n }\n return pickDiagramSidesByGap(source, target);\n}\n\nfunction hasReciprocalEdge(spec: GraphLayoutSpec, edge: DiagramEdge) {\n if (edge.from === edge.to) return false;\n return spec.edges.some((candidate) => {\n return (\n parseEndpointRef(candidate.from).nodeId ===\n parseEndpointRef(edge.to).nodeId &&\n parseEndpointRef(candidate.to).nodeId ===\n parseEndpointRef(edge.from).nodeId\n );\n });\n}\n\nfunction computeParallelOffsets(\n spec: GraphLayoutSpec,\n resolvedSides: { exitSide: DiagramSide; entrySide: DiagramSide }[],\n): { exitOffsets: number[]; entryOffsets: number[]; routeOffsets: number[] } {\n const exitOffsets = new Array(spec.edges.length).fill(0);\n const entryOffsets = new Array(spec.edges.length).fill(0);\n const routeOffsets = new Array(spec.edges.length).fill(0);\n const nodesById = new Map(spec.nodes.map((node) => [node.id, node]));\n const nodeBoxes = new Map(\n spec.nodes.map((node) => [node.id, nodeBox(node, spec.layout)]),\n );\n const groupsById = new Map(\n (spec.groups ?? []).map((group) => [group.id, group]),\n );\n const groupBoxes = new Map(\n (spec.groups ?? []).map((group) => [\n group.id,\n groupBox(group, spec.nodes, spec.layout, spec.groups),\n ]),\n );\n const lookup: EndpointLookup = {\n nodesById,\n nodeBoxes,\n groupsById,\n groupBoxes,\n };\n\n const exitGroups = new Map<string, number[]>();\n const entryGroups = new Map<string, number[]>();\n const sameSideRouteGroups = new Map<string, number[]>();\n const fanOutRouteGroups = new Map<string, number[]>();\n\n spec.edges.forEach((edge, i) => {\n const sides = resolvedSides[i];\n const sourceEndpoint = resolveEndpoint(edge.from, lookup);\n const targetEndpoint = resolveEndpoint(edge.to, lookup);\n if (!sides || !sourceEndpoint || !targetEndpoint) return;\n const exitKey = `${sourceEndpoint.ref}|${sides.exitSide}`;\n const entryKey = `${targetEndpoint.ref}|${sides.entrySide}`;\n const exitArr = exitGroups.get(exitKey) ?? [];\n exitArr.push(i);\n exitGroups.set(exitKey, exitArr);\n const entryArr = entryGroups.get(entryKey) ?? [];\n entryArr.push(i);\n entryGroups.set(entryKey, entryArr);\n if (edge.from !== edge.to && !edge.waypoints?.length) {\n if (sides.exitSide === sides.entrySide) {\n const routeKey = `${sourceEndpoint.id}|${sides.exitSide}`;\n const routeArr = sameSideRouteGroups.get(routeKey) ?? [];\n routeArr.push(i);\n sameSideRouteGroups.set(routeKey, routeArr);\n } else {\n const routeKey = `${sourceEndpoint.id}|${sides.exitSide}|${sides.entrySide}`;\n const routeArr = fanOutRouteGroups.get(routeKey) ?? [];\n routeArr.push(i);\n fanOutRouteGroups.set(routeKey, routeArr);\n }\n }\n });\n\n for (const indices of exitGroups.values()) {\n const n = indices.length;\n const first = indices[0];\n if (n <= 1 || first === undefined) continue;\n const edge = spec.edges[first];\n const sides = resolvedSides[first];\n if (!edge || !sides) continue;\n const source = resolveEndpoint(edge.from, lookup);\n const offsets = computeSideOffsets(\n n,\n source?.box,\n sides.exitSide,\n source?.cornerInset,\n );\n indices.forEach((idx, i) => {\n exitOffsets[idx] = offsets[i];\n });\n }\n for (const indices of entryGroups.values()) {\n const n = indices.length;\n const first = indices[0];\n if (n <= 1 || first === undefined) continue;\n const edge = spec.edges[first];\n const sides = resolvedSides[first];\n if (!edge || !sides) continue;\n const target = resolveEndpoint(edge.to, lookup);\n const offsets = computeSideOffsets(\n n,\n target?.box,\n sides.entrySide,\n target?.cornerInset,\n );\n indices.forEach((idx, i) => {\n entryOffsets[idx] = offsets[i];\n });\n }\n\n for (const indices of sameSideRouteGroups.values()) {\n const n = indices.length;\n if (n <= 1) continue;\n const sorted = indices\n .flatMap((idx) => {\n const edge = spec.edges[idx];\n return edge ? [{ idx, span: edgeGridSpan(edge, nodesById) }] : [];\n })\n .sort((a, b) => a.span - b.span)\n .map(({ idx }) => idx);\n sorted.forEach((idx, i) => {\n routeOffsets[idx] = i * PARALLEL_SPACING;\n });\n }\n\n for (const indices of fanOutRouteGroups.values()) {\n const routed = indices.flatMap((idx) => {\n const edge = spec.edges[idx];\n const sides = resolvedSides[idx];\n return edge && sides ? [{ idx, edge, sides }] : [];\n });\n const targetIds = new Set(routed.map(({ edge }) => edge.to));\n const n = targetIds.size;\n if (n <= 1) continue;\n const sorted = routed\n .map(({ idx, edge, sides }) => ({\n idx,\n axis: edgeTargetAxisPosition(edge, lookup, sides.exitSide),\n }))\n .sort((a, b) => a.axis - b.axis)\n .map(({ idx }) => idx);\n sorted.forEach((idx, i) => {\n routeOffsets[idx] = i * PARALLEL_SPACING;\n });\n }\n\n return { exitOffsets, entryOffsets, routeOffsets };\n}\n\nfunction computeSideOffsets(\n count: number,\n box: Box | undefined,\n side: DiagramSide,\n cornerInset = 0,\n) {\n const maxIndexOffset = (count - 1) / 2;\n const sideSpan = side === 'top' || side === 'bottom' ? box?.w : box?.h;\n const maxOffset =\n sideSpan === undefined\n ? maxIndexOffset * PARALLEL_SPACING\n : Math.max(0, sideSpan / 2 - cornerInset - ROUTE_CELL);\n const spacing =\n maxIndexOffset === 0\n ? 0\n : Math.min(PARALLEL_SPACING, maxOffset / maxIndexOffset);\n return Array.from({ length: count }, (_, i) => {\n return (i - maxIndexOffset) * spacing;\n });\n}\n\nfunction nodeCornerInset(node: DiagramNode) {\n if (node.frame === 'none') return 0;\n return nodeFrameRadius(node);\n}\n\nfunction edgeGridSpan(edge: DiagramEdge, nodesById: Map<string, DiagramNode>) {\n const source = nodesById.get(parseEndpointRef(edge.from).nodeId);\n const target = nodesById.get(parseEndpointRef(edge.to).nodeId);\n if (!source || !target) {\n return 0;\n }\n return (\n Math.abs(positionedValue(source, 'col') - positionedValue(target, 'col')) +\n Math.abs(positionedValue(source, 'row') - positionedValue(target, 'row'))\n );\n}\n\nfunction edgeTargetAxisPosition(\n edge: DiagramEdge,\n lookup: EndpointLookup,\n exitSide: DiagramSide,\n) {\n const target = resolveEndpoint(edge.to, lookup);\n if (!target) return 0;\n const box = target.box;\n if (exitSide === 'top' || exitSide === 'bottom') {\n return box.x + box.w / 2;\n }\n return box.y + box.h / 2;\n}\n\nexport function computePaths(spec: GraphLayoutSpec): RoutedEdge[] {\n spec = resolveGraphLayout(spec);\n const { w: svgW, h: svgH } = svgDimensions(spec);\n const gridW = Math.ceil(svgW / ROUTE_CELL) + 2;\n const gridH = Math.ceil(svgH / ROUTE_CELL) + 2;\n\n const nodesById = new Map<string, DiagramNode>();\n const nodeBoxes = new Map<string, Box>();\n for (const n of spec.nodes) {\n nodesById.set(n.id, n);\n nodeBoxes.set(n.id, nodeBox(n, spec.layout));\n }\n const groupsById = new Map(\n (spec.groups ?? []).map((group) => [group.id, group]),\n );\n const groupBoxes = new Map(\n (spec.groups ?? []).map((group) => [\n group.id,\n groupBox(group, spec.nodes, spec.layout, spec.groups),\n ]),\n );\n const lookup: EndpointLookup = {\n nodesById,\n nodeBoxes,\n groupsById,\n groupBoxes,\n };\n\n const blocked = buildObstacles(spec.nodes, gridW, gridH, spec.layout);\n\n const resolvedSides = spec.edges.map((edge) => {\n const sourceEndpoint = resolveEndpoint(edge.from, lookup);\n const targetEndpoint = resolveEndpoint(edge.to, lookup);\n if (!sourceEndpoint || !targetEndpoint) {\n return {\n exitSide: 'right',\n entrySide: 'left',\n } satisfies { exitSide: DiagramSide; entrySide: DiagramSide };\n }\n assertConnectableEndpoint(edge, sourceEndpoint, 'source');\n assertConnectableEndpoint(edge, targetEndpoint, 'target');\n const sides = resolveDiagramSides(\n edge,\n sourceEndpoint.box,\n targetEndpoint.box,\n hasReciprocalEdge(spec, edge),\n );\n return {\n exitSide: sourceEndpoint?.port?.side ?? sides.exitSide,\n entrySide: targetEndpoint?.port?.side ?? sides.entrySide,\n };\n });\n\n const { exitOffsets, entryOffsets, routeOffsets } = computeParallelOffsets(\n spec,\n resolvedSides,\n );\n\n const routedEdges = spec.edges.map((edge, i) => {\n const sourceEndpoint = resolveEndpoint(edge.from, lookup);\n const targetEndpoint = resolveEndpoint(edge.to, lookup);\n const waypoints = resolveEdgeWaypoints(edge.waypoints, spec);\n const sides = resolvedSides[i];\n const exitOffset = exitOffsets[i];\n const entryOffset = entryOffsets[i];\n if (\n !sourceEndpoint ||\n !targetEndpoint ||\n !sides ||\n exitOffset === undefined ||\n entryOffset === undefined\n ) {\n return {\n edge,\n d: '',\n entry: { x: 0, y: 0 },\n points: [],\n labelPlacement: null,\n badgePlacement: null,\n };\n }\n assertConnectableEndpoint(edge, sourceEndpoint, 'source');\n assertConnectableEndpoint(edge, targetEndpoint, 'target');\n if (edge.from === edge.to) {\n const side = edge.exitSide ?? edge.entrySide ?? 'top';\n const result = routeSelfLoop(\n edge,\n sourceEndpoint.box,\n side,\n waypoints,\n edge.entryGap,\n );\n reserveRoutedEdge(blocked, result.points, gridW, gridH);\n return { edge, ...result };\n }\n const result = routeEdge(\n edge,\n sourceEndpoint.box,\n targetEndpoint.box,\n blocked,\n gridW,\n gridH,\n {\n exitSide: sides.exitSide,\n entrySide: sides.entrySide,\n },\n (sourceEndpoint?.port?.offset ?? 0) + (edge.exitOffset ?? exitOffset),\n (targetEndpoint?.port?.offset ?? 0) + (edge.entryOffset ?? entryOffset),\n waypoints,\n edge.entryGap,\n routeOffsets[i],\n );\n reserveRoutedEdge(blocked, result.points, gridW, gridH);\n return { edge, ...result };\n });\n\n return deconflictLabelPlacements(routedEdges);\n}\n\nfunction resolveEndpoint(\n ref: string,\n lookup: EndpointLookup,\n): EndpointRef | null {\n const { nodeId: id, portId } = parseEndpointRef(ref);\n const node = lookup.nodesById.get(id);\n const group = lookup.groupsById.get(id);\n const box = node ? lookup.nodeBoxes.get(id) : lookup.groupBoxes.get(id);\n const cornerInset = node\n ? nodeCornerInset(node)\n : group && groupCornerInset(group);\n if (cornerInset === undefined || !box) {\n return null;\n }\n\n const ports = node?.ports ?? group?.ports;\n const port = portId\n ? ports?.find((candidate) => candidate.id === portId)\n : undefined;\n\n if (portId && !port) {\n throw new Error(\n `Diagram endpoint \"${ref}\" references missing port \"${portId}\" on \"${id}\".`,\n );\n }\n\n return {\n ref: port ? `${id}:${port.id}` : id,\n id,\n kind: node ? 'node' : 'group',\n box,\n cornerInset,\n connectable: node ? node.connectable !== false : true,\n ...(port ? { port } : {}),\n };\n}\n\nfunction assertConnectableEndpoint(\n edge: DiagramEdge,\n endpoint: EndpointRef,\n role: 'source' | 'target',\n) {\n if (endpoint.connectable) return;\n const relation = role === 'source' ? 'start from' : 'end at';\n throw new Error(\n `Diagram edge ${edge.from}->${edge.to} cannot ${relation} non-connectable node \"${endpoint.id}\". Use Diagram.Label, Diagram.Port, Diagram.Box, or Diagram.Phantom for routed endpoints; Diagram.Float is display-only.`,\n );\n}\n"],"mappings":"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","ignoreList":[]}