@aranzatech/diagrams-bpmn 0.3.6 → 0.3.7

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,"sources":["../../src/layout/elk.ts","../../src/layout/bpmn-layout-graph.ts","../../src/layout/bpmn-custom-layout.ts","../../src/layout/index.ts"],"names":["positionedBoundaries","resultNodes","routedEdges"],"mappings":"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","file":"index.js","sourcesContent":["import { elkLayout } from \"@aranzatech/diagrams-core/layout\";\nimport type { DiagramNode, DiagramEdge } from \"@aranzatech/diagrams-core/types\";\nimport type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport type { BpmnElementType } from \"../elements/types\";\nimport { getBpmnNodeSize } from \"../modeling\";\n\n// Container types that ELK auto-sizes based on their children.\nconst BPMN_CONTAINER_TYPES = new Set<BpmnElementType>([\n \"Pool\",\n \"Lane\",\n \"SubProcess\",\n \"Transaction\",\n \"EventSubProcess\",\n \"AdHocSubProcess\",\n]);\n\nconst CONTAINER_MIN_SIZE: Partial<Record<BpmnElementType, { w: number; h: number }>> = {\n Pool: { w: 720, h: 200 },\n Lane: { w: 600, h: 160 },\n SubProcess: { w: 240, h: 140 },\n Transaction: { w: 240, h: 140 },\n EventSubProcess: { w: 240, h: 140 },\n AdHocSubProcess: { w: 240, h: 140 },\n};\n\n// Padding inside each container type.\n// Left padding for Pool/Lane accounts for the vertical label strip (~30px) + breathing room.\nconst CONTAINER_PADDING: Partial<Record<BpmnElementType, string>> = {\n Pool: \"[top=30,left=60,bottom=30,right=50]\",\n Lane: \"[top=40,left=70,bottom=40,right=50]\",\n SubProcess: \"[top=30,left=40,bottom=30,right=40]\",\n Transaction: \"[top=30,left=40,bottom=30,right=40]\",\n EventSubProcess: \"[top=30,left=40,bottom=30,right=40]\",\n AdHocSubProcess: \"[top=30,left=40,bottom=30,right=40]\",\n};\n\n/**\n * ELK-based auto-layout for BPMN diagrams.\n *\n * Spacing philosophy: fixed, generous values that scale consistently\n * regardless of diagram size. \"Air\" between elements is not waste —\n * it is what makes the flow readable to the human eye.\n *\n * Direction policy:\n * - Root: RIGHT — free nodes and pools flow LR on the canvas.\n * - Pool with Lanes: DOWN internally so lanes stack top-to-bottom;\n * the pool itself is placed LR on the canvas.\n * - Lane / SubProcess / Pool-without-lanes: RIGHT — content flows LR.\n * - Each container runs its own INCLUDE_CHILDREN pass (per-container\n * hierarchyHandling) so cross-lane edges are routed correctly without\n * the global RIGHT direction forcing Lane containers sideways.\n * - Root uses INHERIT so each pool is laid out independently.\n * - Post-processing equalises Lane widths within each Pool so all Lanes\n * span the full Pool width.\n */\nexport async function bpmnElkLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): Promise<{ nodes: BpmnRFNode[]; edges: BpmnRFEdge[] }> {\n // Pools that directly contain at least one Lane.\n const poolsWithLanes = new Set<string>();\n for (const node of nodes) {\n if (node.data.elementType === \"Lane\" && node.parentId) {\n poolsWithLanes.add(node.parentId);\n }\n }\n\n const result = await elkLayout(\n nodes as unknown as DiagramNode[],\n edges as unknown as DiagramEdge[],\n {\n direction: \"LR\",\n getNodeSize: (node) => {\n const bNode = node as unknown as BpmnRFNode;\n if (BPMN_CONTAINER_TYPES.has(bNode.data.elementType)) return undefined;\n return getBpmnNodeSize(bNode);\n },\n isContainerNode: (node) =>\n BPMN_CONTAINER_TYPES.has((node as unknown as BpmnRFNode).data.elementType),\n getNodeLayoutOptions: (node) => {\n const bNode = node as unknown as BpmnRFNode;\n const type = bNode.data.elementType;\n if (!BPMN_CONTAINER_TYPES.has(type)) return undefined;\n\n const min = CONTAINER_MIN_SIZE[type];\n const isPoolWithLanes = type === \"Pool\" && poolsWithLanes.has(node.id);\n\n // Pool with Lanes stacks Lanes top-to-bottom (standard horizontal BPMN).\n // Everything else flows left-to-right.\n const dir = isPoolWithLanes ? \"DOWN\" : \"RIGHT\";\n\n return {\n \"elk.direction\": dir,\n \"elk.nodeSize.constraints\": \"MINIMUM_SIZE\",\n // Each container handles its own layout pass so cross-lane edges\n // participate in the internal layout without the global direction\n // forcing Lane containers to align sideways.\n \"elk.hierarchyHandling\": \"INCLUDE_CHILDREN\",\n // Lanes within a Pool share a border — zero gap between them.\n // Other containers keep the tighter inner spacing.\n ...(isPoolWithLanes\n ? { \"elk.spacing.nodeNode\": \"0\", \"elk.spacing.componentComponent\": \"0\" }\n : {\n \"elk.layered.spacing.nodeNodeBetweenLayers\": \"100\",\n \"elk.layered.spacing.edgeNodeBetweenLayers\": \"45\",\n \"elk.spacing.nodeNode\": \"50\",\n }),\n ...(min ? { \"elk.nodeSize.minimum\": `[w=${min.w},h=${min.h}]` } : {}),\n ...(CONTAINER_PADDING[type] ? { \"elk.padding\": CONTAINER_PADDING[type] } : {}),\n };\n },\n elk: {\n \"elk.algorithm\": \"layered\",\n \"elk.direction\": \"RIGHT\",\n // INHERIT: each container handles its own INCLUDE_CHILDREN pass so\n // the global RIGHT direction does not force Lane containers sideways.\n \"elk.hierarchyHandling\": \"INHERIT\",\n \"elk.edgeRouting\": \"ORTHOGONAL\",\n // Global spacing — generous values for visual breathing room.\n \"elk.layered.spacing.nodeNodeBetweenLayers\": \"120\",\n \"elk.layered.spacing.edgeNodeBetweenLayers\": \"50\",\n \"elk.spacing.nodeNode\": \"70\",\n \"elk.spacing.componentComponent\": \"100\",\n },\n },\n );\n\n const nodeMap = new Map(result.nodes.map((n) => [n.id, n]));\n const edgeMap = new Map(result.edges.map((e) => [e.id, e]));\n\n // ── Fix 1: Preserve original vertical order of root nodes (Pools, free nodes) ──\n // ELK may reorder disconnected components based on cross-pool edge direction.\n // We restore the original top-to-bottom order so Pools never swap positions.\n const COMPONENT_GAP = 100;\n const rootNodeOrder = nodes\n .filter((n) => !n.parentId)\n .map((n) => n.id);\n\n // Compute ELK heights for each root node, then re-stack top-to-bottom.\n const rootHeights = new Map<string, number>();\n for (const id of rootNodeOrder) {\n const laid = nodeMap.get(id);\n const orig = nodes.find((n) => n.id === id);\n rootHeights.set(id, laid?.height ?? orig?.height ?? 200);\n }\n let stackY = 0;\n const rootY = new Map<string, number>();\n for (const id of rootNodeOrder) {\n rootY.set(id, stackY);\n stackY += (rootHeights.get(id) ?? 200) + COMPONENT_GAP;\n }\n\n const updatedNodes = nodes.map((node) => {\n const laid = nodeMap.get(node.id);\n if (!laid) return node;\n const pos = node.parentId\n ? laid.position // children: ELK relative position\n : { x: laid.position.x, y: rootY.get(node.id) ?? laid.position.y }; // root: preserved order\n return { ...node, position: pos, width: laid.width, height: laid.height };\n });\n\n // Post-processing: equalise Lane widths within each Pool so all Lanes\n // span the full Pool width regardless of their individual content width.\n const lanesByPool = new Map<string, string[]>();\n for (const node of updatedNodes) {\n if (node.data.elementType === \"Lane\" && node.parentId) {\n const arr = lanesByPool.get(node.parentId) ?? [];\n arr.push(node.id);\n lanesByPool.set(node.parentId, arr);\n }\n }\n const nodeIndex = new Map(updatedNodes.map((n, i) => [n.id, i]));\n for (const laneIds of lanesByPool.values()) {\n const widths = laneIds.map((id) => updatedNodes[nodeIndex.get(id)!]?.width ?? 0);\n const maxWidth = Math.max(...widths);\n if (maxWidth <= 0) continue;\n for (const id of laneIds) {\n const idx = nodeIndex.get(id);\n if (idx !== undefined) {\n updatedNodes[idx] = { ...updatedNodes[idx], width: maxWidth };\n }\n }\n }\n\n // ── Fix 2: Identify cross-pool edges (source and target live in different root containers) ──\n // ELK routes them incorrectly when pools are laid out independently.\n // Clear their routingPoints so ReactFlow renders smooth default curves instead.\n const nodeRootContainer = new Map<string, string | null>();\n for (const node of updatedNodes) {\n nodeRootContainer.set(node.id, node.parentId ?? null);\n }\n const getRootContainer = (nodeId: string): string | null => {\n let current: string | null = nodeId;\n const visited = new Set<string>();\n while (current) {\n if (visited.has(current)) break;\n visited.add(current);\n const parent = nodeRootContainer.get(current);\n if (!parent) return current;\n current = parent;\n }\n return null;\n };\n\n const updatedEdges = edges.map((edge) => {\n const laid = edgeMap.get(edge.id);\n if (!laid) return edge;\n const nextData = { ...edge.data };\n const sourceRoot = getRootContainer(edge.source);\n const targetRoot = getRootContainer(edge.target);\n const isCrossPool = sourceRoot !== targetRoot;\n if (!isCrossPool && laid.points && laid.points.length > 0) {\n nextData.routingPoints = laid.points;\n } else {\n delete nextData.routingPoints;\n }\n return { ...edge, data: nextData };\n });\n\n return { nodes: updatedNodes, edges: updatedEdges as BpmnRFEdge[] };\n}\n","import type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport type { BpmnElementType } from \"../elements/types\";\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\nexport const LAYOUT_CONTAINER_TYPES = new Set<BpmnElementType>([\n \"Pool\", \"Lane\", \"SubProcess\", \"Transaction\", \"EventSubProcess\", \"AdHocSubProcess\",\n]);\n\nexport const LAYOUT_GATEWAY_TYPES = new Set<BpmnElementType>([\n \"ExclusiveGateway\", \"InclusiveGateway\", \"ParallelGateway\",\n \"EventBasedGateway\", \"ComplexGateway\",\n]);\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface LayoutEdgeInfo {\n id: string;\n source: string;\n target: string;\n /** ReactFlow handle id, e.g. \"source-top\" | \"source-right\" | \"source-bottom\" | \"source-left\" */\n sourceHandle?: string | null;\n}\n\n// ── Phase 1A: Back-edge detection (DFS) ───────────────────────────────────\n//\n// An edge A→B is a back-edge if B is in the \"gray\" (currently open) DFS stack\n// when A is processed — meaning B is an ancestor of A, creating a cycle.\n// Back-edges are excluded from column assignment so loops don't generate\n// infinite vertical layers.\n\nexport function detectBackEdges(\n nodeIds: string[],\n seqEdges: LayoutEdgeInfo[],\n): Set<string> {\n // Deterministic traversal: DFS start order and adjacency order are sorted by\n // id so the same graph always yields the same back-edge classification,\n // regardless of the order nodes/edges arrive in (load order, collab sync).\n const sortedIds = [...nodeIds].sort();\n const backEdgeIds = new Set<string>();\n const state = new Map<string, 0 | 1 | 2>(); // 0=unvisited 1=open 2=done\n for (const id of sortedIds) state.set(id, 0);\n\n const adj = new Map<string, Array<{ target: string; edgeId: string }>>();\n for (const id of sortedIds) adj.set(id, []);\n for (const e of seqEdges) {\n adj.get(e.source)?.push({ target: e.target, edgeId: e.id });\n }\n for (const list of adj.values()) {\n list.sort((a, b) =>\n a.target < b.target ? -1 : a.target > b.target ? 1 :\n a.edgeId < b.edgeId ? -1 : a.edgeId > b.edgeId ? 1 : 0,\n );\n }\n\n // Iterative DFS to avoid call-stack overflow on large diagrams.\n for (const startId of sortedIds) {\n if (state.get(startId) !== 0) continue;\n // Stack entries: [nodeId, iteratorIndex] — simulates recursive DFS\n const stack: Array<{ id: string; idx: number }> = [{ id: startId, idx: 0 }];\n state.set(startId, 1);\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n const neighbors = adj.get(top.id) ?? [];\n if (top.idx >= neighbors.length) {\n state.set(top.id, 2);\n stack.pop();\n continue;\n }\n const { target, edgeId } = neighbors[top.idx++];\n const tState = state.get(target);\n if (tState === 1) {\n backEdgeIds.add(edgeId); // gray → back-edge\n } else if (tState === 0) {\n state.set(target, 1);\n stack.push({ id: target, idx: 0 });\n }\n }\n }\n\n return backEdgeIds;\n}\n\n// ── Phase 1B: Sequence-flow extraction ────────────────────────────────────\n\nexport function extractSeqEdges(\n edges: BpmnRFEdge[],\n nodeIds: Set<string>,\n): LayoutEdgeInfo[] {\n return edges\n .filter(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return t === \"sequenceFlow\" && nodeIds.has(e.source) && nodeIds.has(e.target);\n })\n .map(e => ({ id: e.id, source: e.source, target: e.target, sourceHandle: e.sourceHandle ?? null }));\n}\n\n// ── Phase 2: Topological sort (Kahn) ──────────────────────────────────────\n\nexport function topologicalSort(\n nodeIds: string[],\n forwardEdges: LayoutEdgeInfo[],\n): string[] {\n const inDeg = new Map<string, number>(nodeIds.map(id => [id, 0]));\n const adj = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n\n for (const e of forwardEdges) {\n if (!inDeg.has(e.source) || !inDeg.has(e.target)) continue;\n adj.get(e.source)!.push(e.target);\n inDeg.set(e.target, (inDeg.get(e.target) ?? 0) + 1);\n }\n\n const queue = nodeIds.filter(id => (inDeg.get(id) ?? 0) === 0);\n const result: string[] = [];\n\n while (queue.length > 0) {\n const id = queue.shift()!;\n result.push(id);\n for (const next of adj.get(id) ?? []) {\n const d = (inDeg.get(next) ?? 1) - 1;\n inDeg.set(next, d);\n if (d === 0) queue.push(next);\n }\n }\n\n // Nodes not reached (isolated or residual cycles) appended at end.\n const seen = new Set(result);\n for (const id of nodeIds) {\n if (!seen.has(id)) result.push(id);\n }\n\n return result;\n}\n\n// ── Phase 2: Column assignment (longest-path on DAG) ──────────────────────\n//\n// column(node) = max(column(predecessors)) + 1\n// Start events / nodes with no predecessors get column 0.\n// Ensures nodes that depend on each other are in increasing columns.\n\nexport function assignColumns(\n nodeIds: string[],\n forwardEdges: LayoutEdgeInfo[],\n): Map<string, number> {\n const order = topologicalSort(nodeIds, forwardEdges);\n const col = new Map<string, number>(nodeIds.map(id => [id, 0]));\n\n const preds = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n for (const e of forwardEdges) {\n preds.get(e.target)?.push(e.source);\n }\n\n for (const id of order) {\n const predCols = (preds.get(id) ?? []).map(p => col.get(p) ?? 0);\n col.set(id, predCols.length > 0 ? Math.max(...predCols) + 1 : 0);\n }\n\n return col;\n}\n\n// ── Phase 1C: Split/merge pair detection ──────────────────────────────────\n//\n// Finds (split node) → (merge node) pairs.\n// The merge is the earliest node reachable by ALL branches of the split.\n// This defines the \"expansion zone\" for vertical branching.\n//\n// ANY node with 2+ outgoing forward edges is a split — not only gateways.\n// BPMN allows implicit splits (an activity with multiple outgoing sequence\n// flows); without this their successors collapse onto the same column+row.\n\nexport function detectGatewayPairs(\n nodes: BpmnRFNode[],\n forwardEdges: LayoutEdgeInfo[],\n): Map<string, string> {\n const pairs = new Map<string, string>();\n const nodeIds = nodes.map(n => n.id);\n\n const succs = new Map<string, string[]>(nodes.map(n => [n.id, []]));\n for (const e of forwardEdges) {\n succs.get(e.source)?.push(e.target);\n }\n\n const order = topologicalSort(nodeIds, forwardEdges);\n const topoPos = new Map(order.map((id, i) => [id, i]));\n\n const splits = nodes.filter(n => (succs.get(n.id)?.length ?? 0) > 1);\n\n for (const split of splits) {\n const branches = succs.get(split.id) ?? [];\n if (branches.length < 2) continue;\n\n // BFS reachability per branch (stops at nodes already visited to stay fast)\n const branchSets: Set<string>[] = branches.map(start => {\n const visited = new Set<string>();\n const q = [start];\n while (q.length) {\n const curr = q.shift()!;\n if (visited.has(curr)) continue;\n visited.add(curr);\n for (const next of succs.get(curr) ?? []) q.push(next);\n }\n return visited;\n });\n\n // Intersection: nodes reachable from ALL branches\n const common = [...branchSets[0]].filter(id =>\n branchSets.every(s => s.has(id))\n );\n if (common.length === 0) continue;\n\n // Pick the topologically earliest common node as the merge gateway\n const merge = common.reduce((a, b) =>\n (topoPos.get(a) ?? Infinity) < (topoPos.get(b) ?? Infinity) ? a : b\n );\n\n pairs.set(split.id, merge);\n }\n\n return pairs;\n}\n\n// ── Phase 3: Row assignment ────────────────────────────────────────────────\n//\n// The main flow stays at row 0. Each branch of a split gateway gets a row\n// offset: primary branch → 0, secondary → +1, tertiary → -1, etc.\n// Nested gateways inherit their parent branch's base row.\n//\n// Secondary row offsets alternate around the trunk:\n// -1, +1, -2, +2, -3, +3 ...\n\nfunction createSecondaryOffsets(count: number): number[] {\n if (count <= 0) return [];\n const offsets: number[] = [];\n let step = 1;\n while (offsets.length < count) {\n offsets.push(-step);\n if (offsets.length < count) offsets.push(step);\n step++;\n }\n return offsets;\n}\n\n// Maps a sourceHandle string (e.g. \"source-top\") to a preferred row direction.\n// \"right\" → 0 (main horizontal flow), \"bottom\" → +1, \"top\" → -1, \"left\" → 0.\nfunction handleToRowBias(handle: string | null | undefined): number | null {\n if (!handle) return null;\n if (handle.includes(\"top\")) return -1;\n if (handle.includes(\"bottom\")) return 1;\n if (handle.includes(\"right\")) return 0;\n return null;\n}\n\n// Build a map: sourceId → Map<targetId, sourceHandle>\nfunction buildHandleMap(edges: LayoutEdgeInfo[]): Map<string, Map<string, string | null>> {\n const map = new Map<string, Map<string, string | null>>();\n for (const e of edges) {\n if (!map.has(e.source)) map.set(e.source, new Map());\n map.get(e.source)!.set(e.target, e.sourceHandle ?? null);\n }\n return map;\n}\n\ninterface BranchRowData {\n start: string;\n nodeIds: string[];\n bias: number | null;\n}\n\n/** Aggregated vertical pull of a branch from per-node bias values (e.g.\n * cross-lane handoffs: +1 pulls toward the lane below, -1 above). Returns\n * null when the branch has no net pull. */\nfunction branchPullBias(\n nodeIds: string[],\n nodeBias: Map<string, number> | undefined,\n): number | null {\n if (!nodeBias) return null;\n let sum = 0;\n for (const id of nodeIds) sum += nodeBias.get(id) ?? 0;\n if (sum === 0) return null;\n return sum > 0 ? 1 : -1;\n}\n\nfunction pickMainBranch(branchData: BranchRowData[]): string | undefined {\n if (branchData.length === 0) return undefined;\n return [...branchData].sort((a, b) => {\n // Rank: explicit \"right\" handle (bias 0) > no bias > vertically-biased.\n // A branch the user routed top/bottom (or an exception flow, which is\n // bottom-biased) must never become the horizontal trunk.\n const rank = (branch: BranchRowData) =>\n branch.bias === 0 ? 2 : branch.bias === null ? 1 : 0;\n if (rank(a) !== rank(b)) return rank(b) - rank(a);\n if (a.nodeIds.length !== b.nodeIds.length) return b.nodeIds.length - a.nodeIds.length;\n return a.start.localeCompare(b.start);\n })[0]?.start;\n}\n\nfunction resolveDirectionalRow(\n splitRow: number,\n preferredOffset: number,\n usedRows: Set<number>,\n): number {\n if (preferredOffset === 0 && !usedRows.has(splitRow)) return splitRow;\n const direction = preferredOffset < 0 ? -1 : 1;\n let distance = Math.max(1, Math.abs(preferredOffset));\n while (usedRows.has(splitRow + direction * distance)) distance++;\n return splitRow + direction * distance;\n}\n\nfunction assignBranchRowsAroundMain(\n branchData: BranchRowData[],\n splitRow: number,\n): Map<string, number> {\n const assigned = new Map<string, number>();\n const mainBranchStart = pickMainBranch(branchData);\n if (mainBranchStart) assigned.set(mainBranchStart, splitRow);\n\n const usedRows = new Set<number>(assigned.values());\n const remaining = branchData.filter((branch) => branch.start !== mainBranchStart);\n const withBias = remaining\n .filter((branch) => branch.bias !== null && branch.bias !== 0)\n .sort((a, b) => {\n const aMag = Math.abs(a.bias ?? 0);\n const bMag = Math.abs(b.bias ?? 0);\n if (aMag !== bMag) return aMag - bMag;\n return a.start.localeCompare(b.start);\n });\n const withoutBias = remaining\n .filter((branch) => branch.bias === null || branch.bias === 0)\n .sort((a, b) => b.nodeIds.length - a.nodeIds.length || a.start.localeCompare(b.start));\n\n for (const branch of withBias) {\n const row = resolveDirectionalRow(splitRow, branch.bias ?? 0, usedRows);\n assigned.set(branch.start, row);\n usedRows.add(row);\n }\n\n const preferredOffsets = createSecondaryOffsets(withoutBias.length);\n for (let i = 0; i < withoutBias.length; i++) {\n let row = splitRow + preferredOffsets[i];\n if (usedRows.has(row)) {\n row = resolveDirectionalRow(splitRow, preferredOffsets[i], usedRows);\n }\n assigned.set(withoutBias[i].start, row);\n usedRows.add(row);\n }\n\n return assigned;\n}\n\nexport function assignRows(\n nodes: BpmnRFNode[],\n forwardEdges: LayoutEdgeInfo[],\n columns: Map<string, number>,\n gatewayPairs: Map<string, string>,\n nodeBias?: Map<string, number>,\n): Map<string, number> {\n const rows = new Map<string, number>(nodes.map(n => [n.id, 0]));\n\n const succs = new Map<string, string[]>(nodes.map(n => [n.id, []]));\n for (const e of forwardEdges) {\n succs.get(e.source)?.push(e.target);\n }\n\n // sourceHandle lookup: for each gateway, which handle connects to each branch start.\n const handleMap = buildHandleMap(forwardEdges);\n\n // Process pairs from shallowest (leftmost column) to deepest: the outer\n // split assigns base rows to entire branches first, then each inner split\n // re-fans its own branches around the row it inherited. Processing deepest\n // first let the outer pass overwrite (flatten) inner fan-outs — bug 1.\n const sortedPairs = [...gatewayPairs.entries()].sort(\n (a, b) => (columns.get(a[0]) ?? 0) - (columns.get(b[0]) ?? 0)\n );\n\n for (const [splitId, mergeId] of sortedPairs) {\n const branches = succs.get(splitId) ?? [];\n if (branches.length < 2) continue;\n\n const splitRow = rows.get(splitId) ?? 0;\n\n // Collect nodes strictly between this split and its merge for each branch.\n const getBranchNodes = (branchStart: string): string[] => {\n const result: string[] = [];\n const visited = new Set<string>();\n const q = [branchStart];\n while (q.length) {\n const curr = q.shift()!;\n if (visited.has(curr) || curr === mergeId) continue;\n visited.add(curr);\n result.push(curr);\n for (const next of succs.get(curr) ?? []) q.push(next);\n }\n return result;\n };\n\n const splitHandles = handleMap.get(splitId);\n const branchData = branches.map(start => {\n const nodeIds = getBranchNodes(start);\n return {\n start,\n nodeIds,\n bias: handleToRowBias(splitHandles?.get(start) ?? null)\n ?? branchPullBias(nodeIds, nodeBias),\n };\n });\n\n const assigned = assignBranchRowsAroundMain(branchData, splitRow);\n\n for (const b of branchData) {\n const row = assigned.get(b.start) ?? splitRow;\n for (const id of b.nodeIds) {\n rows.set(id, row);\n }\n }\n rows.set(mergeId, splitRow);\n }\n\n // ── Second pass: terminal splits (no merge detected) ──────────────────────\n // Splits whose branches all terminate at End Events (no common successor)\n // don't appear in gatewayPairs. Without this pass they'd all share row 0,\n // causing their terminal nodes to overlap. Includes implicit splits\n // (non-gateway nodes with 2+ outgoing flows) — bug 10.\n const pairedSplits = new Set(gatewayPairs.keys());\n\n const unpairedSplits = nodes.filter(n =>\n !pairedSplits.has(n.id) &&\n (succs.get(n.id)?.length ?? 0) > 1\n );\n\n for (const split of unpairedSplits) {\n const branches = succs.get(split.id) ?? [];\n if (branches.length < 2) continue;\n\n const splitRow = rows.get(split.id) ?? 0;\n\n // Collect all reachable nodes for each branch (no merge to stop at).\n const getAllReachable = (start: string): string[] => {\n const result: string[] = [];\n const visited = new Set<string>();\n const q = [start];\n while (q.length) {\n const curr = q.shift()!;\n if (visited.has(curr)) continue;\n visited.add(curr);\n result.push(curr);\n for (const next of succs.get(curr) ?? []) q.push(next);\n }\n return result;\n };\n\n const splitHandles2 = handleMap.get(split.id);\n const branchData = branches.map(start => {\n const nodeIds = getAllReachable(start);\n return {\n start,\n nodeIds,\n bias: handleToRowBias(splitHandles2?.get(start) ?? null)\n ?? branchPullBias(nodeIds, nodeBias),\n };\n });\n\n const assigned2 = assignBranchRowsAroundMain(branchData, splitRow);\n\n for (const b of branchData) {\n const row = assigned2.get(b.start) ?? splitRow;\n for (const id of b.nodeIds) rows.set(id, row);\n }\n }\n\n return rows;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nexport function buildSuccessors(\n nodeIds: string[],\n edges: LayoutEdgeInfo[],\n): Map<string, string[]> {\n const map = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n for (const e of edges) {\n map.get(e.source)?.push(e.target);\n }\n return map;\n}\n\nexport function buildPredecessors(\n nodeIds: string[],\n edges: LayoutEdgeInfo[],\n): Map<string, string[]> {\n const map = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n for (const e of edges) {\n map.get(e.target)?.push(e.source);\n }\n return map;\n}\n","import type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport type { BpmnElementType } from \"../elements/types\";\nimport {\n LAYOUT_CONTAINER_TYPES,\n LAYOUT_GATEWAY_TYPES,\n detectBackEdges,\n extractSeqEdges,\n assignColumns,\n detectGatewayPairs,\n assignRows,\n} from \"./bpmn-layout-graph\";\n\n// ── Layout constants ───────────────────────────────────────────────────────\n//\n// Calibrated against professional BPMN tools (Bizagi, Appian, Camunda).\n// The guiding principle: the pool should be wide enough to be readable but\n// compact enough to feel organized — not \"airy\".\n//\n// Key ratios (approximate):\n// task_width / col_step = 120 / (120+60) ≈ 0.67 (node takes 2/3 of each step)\n// row_slot / row_step = 90 / (90+50) ≈ 0.64 (similar balance vertically)\n\nconst LANE_LABEL_W = 28; // left vertical label strip\nconst LANE_H_PAD = 32; // gap between label strip and first node column\nconst COL_GAP = 60; // routing corridor between columns\nconst ROW_HEIGHT = 90; // vertical slot per row (fits any node type)\nconst ROW_GAP = 50; // gap between parallel rows in a branch\nconst LANE_V_PAD = 48; // top/bottom breathing room inside each lane\nconst POOL_H_PAD = 64; // padding for nodes placed directly in pool\nconst POOL_V_GAP = 48; // vertical gap between separate pools\nconst LANE_MIN_H = 180; // minimum lane height\nconst POOL_MIN_W = 720; // minimum pool width\nconst POOL_INNER_PAD = 10; // pool border → lane edge gap\nconst BACK_EDGE_CLEARANCE = 56; // px above topmost node for loop arcs\nconst EDGE_ROUTE_PAD = 28; // horizontal/vertical breathing room for elbow routes\n\n// ── Element-type sets ──────────────────────────────────────────────────────\n\n/**\n * Artifact types that do NOT participate in sequence-flow column/row assignment.\n * They are positioned after the main layout, near the node they are associated\n * with via an association or dataAssociation edge.\n */\nconst LAYOUT_ARTIFACT_TYPES = new Set<BpmnElementType>([\n \"DataObject\", \"DataObjectReference\", \"DataInput\", \"DataOutput\",\n \"DataStore\", \"DataStoreReference\", \"Annotation\", \"Group\",\n]);\n\n/**\n * Sub-process variants that are treated as large task nodes (content) when\n * collapsed. They participate in column/row assignment and get positioned in\n * the flow. When expanded their children have a different parentId and are\n * handled separately.\n */\nconst COLLAPSED_SUBPROCESS_TYPES = new Set<BpmnElementType>([\n \"SubProcess\", \"Transaction\", \"EventSubProcess\", \"AdHocSubProcess\",\n]);\n\n// ── Task minimum layout sizes ──────────────────────────────────────────────\n//\n// BPMN catalog defaults are 120×60 — readable in isolation but cramped when\n// multiple tasks share lanes and labels have two or more words. The layout\n// engine enforces a larger minimum for SPACING and COLUMN-WIDTH purposes.\n// Nodes whose stored size is already larger are never shrunk.\n//\n// applyLayoutMinSize() stamps the minimum onto the output node so ReactFlow\n// renders the task at a comfortable size after auto-layout.\n\nconst LAYOUT_TASK_TYPES = new Set<BpmnElementType>([\n \"Task\", \"UserTask\", \"ServiceTask\", \"ScriptTask\",\n \"ManualTask\", \"BusinessRuleTask\", \"ReceiveTask\", \"SendTask\", \"CallActivity\",\n]);\n\nconst TASK_LAYOUT_MIN_W = 130; // minimum for two-word labels (catalog default is 120)\nconst TASK_LAYOUT_MIN_H = 80; // taller than 60 — closer to Appian/Bizagi proportions\n\n// Collapsed subprocesses use the catalog default as their floor. AI-generated\n// diagrams have produced 209×25 subprocess shapes — without this floor the\n// layout renders them as unreadable slivers next to full-size tasks.\nconst SUBPROCESS_LAYOUT_MIN_W = 160;\nconst SUBPROCESS_LAYOUT_MIN_H = 80;\n\n/** Layout-minimum size for a node, or null when no floor applies.\n * Expanded subprocesses are excluded — layoutSubProcess computes their size. */\nfunction layoutMinSize(node: BpmnRFNode): { w: number; h: number } | null {\n if (LAYOUT_TASK_TYPES.has(node.data.elementType)) {\n return { w: TASK_LAYOUT_MIN_W, h: TASK_LAYOUT_MIN_H };\n }\n if (COLLAPSED_SUBPROCESS_TYPES.has(node.data.elementType) && !node.data.isExpanded) {\n return { w: SUBPROCESS_LAYOUT_MIN_W, h: SUBPROCESS_LAYOUT_MIN_H };\n }\n return null;\n}\n\n// ── Node size helpers ──────────────────────────────────────────────────────\n\nfunction nW(node: BpmnRFNode): number {\n return node.width ?? (node.measured as { width?: number } | undefined)?.width ?? 120;\n}\nfunction nH(node: BpmnRFNode): number {\n return node.height ?? (node.measured as { height?: number } | undefined)?.height ?? 60;\n}\n\n/** Width used for column-width computation and centering within a slot.\n * Floored nodes (tasks, collapsed subprocesses) get a comfortably wide\n * column even if their stored width is smaller. */\nfunction layoutW(node: BpmnRFNode): number {\n const min = layoutMinSize(node);\n return min ? Math.max(nW(node), min.w) : nW(node);\n}\n\n/** Height used for row-height computation. Mirrors layoutW. */\nfunction layoutH(node: BpmnRFNode): number {\n const min = layoutMinSize(node);\n return min ? Math.max(nH(node), min.h) : nH(node);\n}\n\n// ── Column width with label reservation ──────────────────────────────────────\n//\n// Gateways and events render their label OUTSIDE the shape (below it), so a\n// 44px diamond with \"¿El cliente es Flat?\" needs far more column width than\n// its geometry suggests — otherwise neighboring columns sit on the text.\n\nconst LABEL_RESERVE_TYPES = new Set<BpmnElementType>([\n ...LAYOUT_GATEWAY_TYPES,\n \"StartEvent\", \"EndEvent\", \"IntermediateCatchEvent\", \"IntermediateThrowEvent\",\n]);\nconst LABEL_CHAR_W = 6.5; // rough average label glyph width at canvas font size\nconst LABEL_RESERVE_MAX = 150; // labels longer than this wrap — don't widen further\n\n/** Width a node needs for COLUMN sizing: its layout width, or the estimated\n * width of its external label, whichever is larger. */\nfunction columnW(node: BpmnRFNode): number {\n const base = layoutW(node);\n if (!LABEL_RESERVE_TYPES.has(node.data.elementType)) return base;\n const label = typeof node.data.label === \"string\" ? node.data.label : \"\";\n if (!label) return base;\n const reserve = Math.min(Math.ceil(label.length * LABEL_CHAR_W), LABEL_RESERVE_MAX);\n return Math.max(base, reserve);\n}\n\n/** Stamps the layout-minimum dimensions onto the output node so ReactFlow\n * renders tasks at a readable size after auto-layout. Nodes already larger\n * than the minimum are returned unchanged. */\nfunction applyLayoutMinSize(node: BpmnRFNode): BpmnRFNode {\n if (!layoutMinSize(node)) return node;\n const w = layoutW(node);\n const h = layoutH(node);\n if (w === nW(node) && h === nH(node)) return node;\n return { ...node, width: w, height: h, measured: { width: w, height: h } };\n}\n\n// ── Row metrics: per-row heights that respect tall nodes ─────────────────────\n//\n// A row slot is at least ROW_HEIGHT, but grows to the tallest node assigned\n// to that row (e.g. an expanded SubProcess with several internal rows).\n// Fixed-height slots made tall nodes overflow their lane/subprocess — bug 7.\n\ninterface RowMetrics {\n minRow: number;\n maxRow: number;\n rowH: Map<number, number>; // slot height per row\n rowY: Map<number, number>; // row top offset within the content block\n contentH: number;\n}\n\nfunction computeRowMetrics(\n contextNodes: BpmnRFNode[],\n rows: Map<string, number>,\n includeRowZero: boolean,\n): RowMetrics {\n const vals = contextNodes.map(n => rows.get(n.id) ?? 0);\n const base = includeRowZero ? [0, ...vals] : vals;\n const minRow = Math.min(...base);\n const maxRow = Math.max(...base);\n\n const rowH = new Map<number, number>();\n for (let r = minRow; r <= maxRow; r++) rowH.set(r, ROW_HEIGHT);\n for (const node of contextNodes) {\n const r = rows.get(node.id) ?? 0;\n rowH.set(r, Math.max(rowH.get(r) ?? ROW_HEIGHT, layoutH(node)));\n }\n\n const rowY = new Map<number, number>();\n let y = 0;\n for (let r = minRow; r <= maxRow; r++) {\n rowY.set(r, y);\n y += (rowH.get(r) ?? ROW_HEIGHT) + ROW_GAP;\n }\n\n return { minRow, maxRow, rowH, rowY, contentH: y - ROW_GAP };\n}\n\n// ── Exception-flow edge re-anchoring ───────────────────────────────────────\n//\n// BoundaryEvents are excluded from column/row assignment, which used to drop\n// their outgoing edges entirely — exception-handler chains fell back to\n// column 0. For GRAPH purposes (columns/rows only, not rendering), edges\n// leaving a BoundaryEvent are re-anchored to the boundary's HOST with a\n// bottom bias: the handler chain gets a column after the host and fans out\n// downward, like any other branch.\n\nfunction reanchorBoundaryEdges(\n edges: BpmnRFEdge[],\n boundaryEvents: BpmnRFNode[],\n contentIds: Set<string>,\n): BpmnRFEdge[] {\n if (boundaryEvents.length === 0) return edges;\n const hostByBoundaryId = new Map<string, string>();\n for (const be of boundaryEvents) {\n if (be.data.attachedToRef) hostByBoundaryId.set(be.id, be.data.attachedToRef);\n }\n if (hostByBoundaryId.size === 0) return edges;\n\n return edges.map(edge => {\n const host = hostByBoundaryId.get(edge.source);\n return host && contentIds.has(host)\n ? { ...edge, source: host, sourceHandle: \"source-bottom\" }\n : edge;\n });\n}\n\n// ── BoundaryEvent repositioning ────────────────────────────────────────────\n//\n// BoundaryEvents are excluded from column/row assignment (they have no\n// independent position in the sequence flow — they are anchored to their host).\n// After the main content is positioned, this function places each BoundaryEvent\n// at the bottom border of its host task, spacing multiple events horizontally.\n\nconst BOUNDARY_SPACING = 10; // px gap between multiple boundary events on same host\n\nfunction repositionBoundaryEvents(\n boundaryEvents: BpmnRFNode[],\n positionedContent: BpmnRFNode[],\n): BpmnRFNode[] {\n if (boundaryEvents.length === 0) return [];\n\n const hostById = new Map(positionedContent.map(n => [n.id, n]));\n\n // Group boundary events by their host.\n const byHost = new Map<string, BpmnRFNode[]>();\n for (const be of boundaryEvents) {\n const hostId = be.data.attachedToRef;\n if (!hostId) continue;\n if (!byHost.has(hostId)) byHost.set(hostId, []);\n byHost.get(hostId)!.push(be);\n }\n\n const result: BpmnRFNode[] = [];\n\n for (const be of boundaryEvents) {\n const hostId = be.data.attachedToRef;\n if (!hostId) { result.push(be); continue; }\n\n const host = hostById.get(hostId);\n if (!host) { result.push(be); continue; }\n\n const hostGroup = byHost.get(hostId)!;\n const siblingIdx = hostGroup.findIndex(n => n.id === be.id);\n\n const hostW = layoutW(host);\n const hostH = layoutH(host);\n const beH = nH(be);\n\n // Center the group horizontally on the host's bottom edge.\n const totalGroupW = hostGroup.reduce((s, b) => s + nW(b), 0) +\n (hostGroup.length - 1) * BOUNDARY_SPACING;\n const groupStartX = host.position.x + hostW / 2 - totalGroupW / 2;\n const offsetX = hostGroup\n .slice(0, siblingIdx)\n .reduce((s, b) => s + nW(b) + BOUNDARY_SPACING, 0);\n\n // Center the boundary event circle on the host's bottom border.\n result.push({\n ...be,\n position: {\n x: groupStartX + offsetX,\n y: host.position.y + hostH - beH / 2,\n },\n });\n }\n\n return result;\n}\n\n// ── SubProcess expanded layout ─────────────────────────────────────────────\n//\n// When a SubProcess (or Transaction / EventSubProcess / AdHocSubProcess) is\n// expanded, its children must be laid out inside it using the same column/row\n// algorithm as the pool layout. This function:\n// 1. Runs column/row assignment on the direct children.\n// 2. Computes the SubProcess container size to fit all children.\n// 3. Returns children with SubProcess-relative positions.\n//\n// The result is pre-computed BEFORE the main pool layout so the SubProcess's\n// final size is available for column-width calculation.\n\nconst SP_PAD = 48; // padding inside a SubProcess on every side\n\ninterface SubProcessResult {\n children: BpmnRFNode[]; // repositioned with SubProcess-relative coordinates\n width: number;\n height: number;\n}\n\nfunction layoutSubProcess(\n children: BpmnRFNode[], // direct children of the SubProcess\n edges: BpmnRFEdge[],\n): SubProcessResult {\n if (children.length === 0) {\n return { children: [], width: 280, height: 160 };\n }\n\n // Separate BoundaryEvents — they are anchored after content is positioned.\n const boundaryEvents = children.filter(n => n.data.elementType === \"BoundaryEvent\");\n const mainChildren = children.filter(n => n.data.elementType !== \"BoundaryEvent\");\n\n if (mainChildren.length === 0) {\n return {\n children: repositionBoundaryEvents(boundaryEvents, []),\n width: 280,\n height: 160,\n };\n }\n\n // ── Column assignment ──────────────────────────────────────────────────────\n const contentIds = new Set(mainChildren.map(n => n.id));\n const graphEdges = reanchorBoundaryEdges(edges, boundaryEvents, contentIds);\n const seqEdges = extractSeqEdges(graphEdges, contentIds);\n const backIds = detectBackEdges([...contentIds], seqEdges);\n const fwdEdges = seqEdges.filter(e => !backIds.has(e.id));\n\n const columns = assignColumns([...contentIds], fwdEdges);\n\n // ── Row assignment (single-context — no lanes inside a SubProcess) ─────────\n const pairs = detectGatewayPairs(mainChildren, fwdEdges);\n const rows = assignRows(mainChildren, fwdEdges, columns, pairs);\n\n // ── Column widths and X offsets (columnW = layout width + label reserve) ───\n const maxCol = Math.max(0, ...[...columns.values()]);\n const colW = new Map<number, number>();\n for (let c = 0; c <= maxCol; c++) colW.set(c, 0);\n for (const node of mainChildren) {\n const c = columns.get(node.id) ?? 0;\n colW.set(c, Math.max(colW.get(c) ?? 0, columnW(node)));\n }\n\n const colX = new Map<number, number>();\n let cumX = 0;\n for (let c = 0; c <= maxCol; c++) {\n colX.set(c, cumX);\n cumX += (colW.get(c) ?? 120) + COL_GAP;\n }\n const contentW = cumX - COL_GAP;\n\n // ── Row stats (per-row heights respect tall nodes) ────────────────────────\n const rowMetrics = computeRowMetrics(mainChildren, rows, true);\n\n // ── Container size ─────────────────────────────────────────────────────────\n const spW = Math.max(280, SP_PAD * 2 + contentW);\n const spH = Math.max(160, SP_PAD * 2 + rowMetrics.contentH);\n\n // ── Position children ─────────────────────────────────────────────────────\n const positionedChildren = mainChildren.map(node => {\n const c = columns.get(node.id) ?? 0;\n const r = rows.get(node.id) ?? 0;\n const lw = layoutW(node);\n const lh = layoutH(node);\n\n const colOffset = (colX.get(c) ?? 0) + (colW.get(c) ?? 120) / 2 - lw / 2;\n const rowOffset = (rowMetrics.rowY.get(r) ?? 0) + (rowMetrics.rowH.get(r) ?? ROW_HEIGHT) / 2 - lh / 2;\n\n return applyLayoutMinSize({ ...node, position: { x: SP_PAD + colOffset, y: SP_PAD + rowOffset } });\n });\n\n const positionedBoundaries = repositionBoundaryEvents(boundaryEvents, positionedChildren);\n\n return {\n children: [...positionedChildren, ...positionedBoundaries],\n width: spW,\n height: spH,\n };\n}\n\n// ── Per-pool layout ────────────────────────────────────────────────────────\n\ninterface PoolResult {\n nodes: BpmnRFNode[];\n width: number;\n height: number;\n}\n\nfunction layoutPool(\n pool: BpmnRFNode,\n lanes: BpmnRFNode[],\n content: BpmnRFNode[], // full pool content — may include BoundaryEvents\n allEdges: BpmnRFEdge[],\n): PoolResult {\n\n // ── Separate BoundaryEvents from the main flow content ────────────────────\n // BoundaryEvents are anchored to their host node — they do not participate\n // in column/row assignment. They are repositioned after layout completes.\n\n const boundaryEvents = content.filter(n => n.data.elementType === \"BoundaryEvent\");\n const mainContent = content.filter(n => n.data.elementType !== \"BoundaryEvent\");\n\n // ── Empty pool ────────────────────────────────────────────────────────────\n\n if (mainContent.length === 0) {\n const positionedBoundaries = repositionBoundaryEvents(boundaryEvents, []);\n if (lanes.length === 0) {\n return { nodes: positionedBoundaries, width: 300, height: 140 };\n }\n const laneH = LANE_MIN_H;\n const h = POOL_INNER_PAD * 2 + lanes.length * laneH +\n Math.max(0, lanes.length - 1) * POOL_INNER_PAD;\n return {\n nodes: [\n ...positionedBoundaries,\n ...lanes.map((lane, i) => ({\n ...lane,\n position: { x: POOL_INNER_PAD, y: POOL_INNER_PAD + i * (laneH + POOL_INNER_PAD) },\n width: POOL_MIN_W - POOL_INNER_PAD * 2,\n height: laneH,\n })),\n ],\n width: POOL_MIN_W,\n height: h,\n };\n }\n\n // ── Lane ordering ─────────────────────────────────────────────────────────\n // Always sort by pool-relative Y so manual lane reordering is respected.\n // If the user dragged Lane B above Lane A, B has the smaller position.y and\n // must come first — the old conditional check could silently ignore that.\n // When lanes are freshly created at y=0 the sort is stable (creation order).\n\n const sortedLanes = [...lanes].sort((a, b) => a.position.y - b.position.y);\n const hasLanes = sortedLanes.length > 0;\n\n const laneIdSet = new Set(sortedLanes.map(l => l.id));\n const nodeLaneId = new Map<string, string>();\n for (const node of mainContent) {\n const lId = hasLanes && node.parentId && laneIdSet.has(node.parentId)\n ? node.parentId\n : \"_pool_\";\n nodeLaneId.set(node.id, lId);\n }\n\n // ── Phase 1: Global column assignment ────────────────────────────────────\n // Cross-lane edges participate so nodes in different lanes are aligned\n // horizontally when they are sequentially connected.\n\n const contentIds = new Set(mainContent.map(n => n.id));\n const graphEdges = reanchorBoundaryEdges(allEdges, boundaryEvents, contentIds);\n const seqEdges = extractSeqEdges(graphEdges, contentIds);\n const backIds = detectBackEdges([...contentIds], seqEdges);\n const fwdEdges = seqEdges.filter(e => !backIds.has(e.id));\n\n const columns = assignColumns([...contentIds], fwdEdges);\n\n // ── Phase 2: Per-lane row assignment ─────────────────────────────────────\n // Rows are computed independently per lane using only intra-lane edges.\n // This prevents cross-lane gateway branches from inflating lane heights.\n\n const rows = new Map<string, number>();\n\n const contentByLane = new Map<string, BpmnRFNode[]>();\n for (const node of mainContent) {\n const lId = nodeLaneId.get(node.id) ?? \"_pool_\";\n if (!contentByLane.has(lId)) contentByLane.set(lId, []);\n contentByLane.get(lId)!.push(node);\n }\n\n // Cross-lane pull: a branch whose flow hands off to another lane should sit\n // on THAT side of the trunk, so the handoff edge leaves without crossing\n // the main row. +1 pulls toward lanes below, -1 toward lanes above.\n const laneStackIndex = new Map<string, number>();\n sortedLanes.forEach((laneNode, index) => laneStackIndex.set(laneNode.id, index));\n laneStackIndex.set(\"_pool_\", sortedLanes.length);\n const crossLanePull = new Map<string, number>();\n for (const e of fwdEdges) {\n const sLane = nodeLaneId.get(e.source) ?? \"_pool_\";\n const tLane = nodeLaneId.get(e.target) ?? \"_pool_\";\n if (sLane === tLane) continue;\n const dir = Math.sign((laneStackIndex.get(tLane) ?? 0) - (laneStackIndex.get(sLane) ?? 0));\n crossLanePull.set(e.source, (crossLanePull.get(e.source) ?? 0) + dir);\n crossLanePull.set(e.target, (crossLanePull.get(e.target) ?? 0) - dir);\n }\n\n for (const [, laneNodes] of contentByLane) {\n const laneNodeIds = new Set(laneNodes.map(n => n.id));\n const intraEdges = fwdEdges.filter(\n e => laneNodeIds.has(e.source) && laneNodeIds.has(e.target),\n );\n const lanePairs = detectGatewayPairs(laneNodes, intraEdges);\n const laneRows = assignRows(laneNodes, intraEdges, columns, lanePairs, crossLanePull);\n for (const [id, row] of laneRows) rows.set(id, row);\n }\n\n // Event subprocesses have no sequence flows — left in the graph they land\n // on column 0 / row 0, colliding with the start event. Convention (Camunda)\n // places them BELOW the lane's main flow, so drop each one to a row under\n // its lane's content.\n const seqTouched = new Set<string>();\n for (const e of seqEdges) { seqTouched.add(e.source); seqTouched.add(e.target); }\n for (const [, laneNodes] of contentByLane) {\n const eventSPs = laneNodes.filter(\n n => n.data.elementType === \"EventSubProcess\" && !seqTouched.has(n.id),\n );\n if (eventSPs.length === 0) continue;\n const eventSpIds = new Set(eventSPs.map(n => n.id));\n const otherRows = laneNodes\n .filter(n => !eventSpIds.has(n.id))\n .map(n => rows.get(n.id) ?? 0);\n const laneMaxRow = otherRows.length > 0 ? Math.max(...otherRows) : -1;\n for (const sp of eventSPs) rows.set(sp.id, laneMaxRow + 1);\n }\n\n // ── Phase 3: Per-lane row statistics ──────────────────────────────────────\n // When lanes exist, nodes that are DIRECT pool children map to the virtual\n // \"_pool_\" context. It must be part of laneIds so it gets stats/columns and\n // its band stacks below the real lanes — omitting it crashed Phase 6.\n\n const hasPoolDirectContent = [...nodeLaneId.values()].includes(\"_pool_\");\n const laneIds = hasLanes\n ? [...sortedLanes.map(l => l.id), ...(hasPoolDirectContent ? [\"_pool_\"] : [])]\n : [\"_pool_\"];\n\n interface LaneStat {\n minRow: number; maxRow: number; height: number; contentH: number;\n rowH: Map<number, number>; rowY: Map<number, number>;\n }\n const laneStats = new Map<string, LaneStat>();\n\n for (const laneId of laneIds) {\n const laneNodes = mainContent.filter(n => nodeLaneId.get(n.id) === laneId);\n\n if (laneNodes.length === 0) {\n laneStats.set(laneId, {\n minRow: 0, maxRow: 0, height: LANE_MIN_H, contentH: ROW_HEIGHT,\n rowH: new Map([[0, ROW_HEIGHT]]), rowY: new Map([[0, 0]]),\n });\n } else {\n const m = computeRowMetrics(laneNodes, rows, false);\n const height = Math.max(LANE_MIN_H, LANE_V_PAD * 2 + m.contentH);\n laneStats.set(laneId, {\n minRow: m.minRow, maxRow: m.maxRow, height,\n contentH: m.contentH, rowH: m.rowH, rowY: m.rowY,\n });\n }\n }\n\n // ── Phase 4: Per-lane compacted columns ───────────────────────────────────\n // We keep the global DAG column numbers for ordering semantics, but compact\n // each lane independently so empty columns caused by other lanes do not\n // create large visual gaps.\n\n interface LaneColumnLayout {\n colW: Map<number, number>;\n colX: Map<number, number>;\n contentW: number;\n }\n\n const laneColumnLayouts = new Map<string, LaneColumnLayout>();\n\n for (const laneId of laneIds) {\n const laneNodes = mainContent.filter(\n (node) => (nodeLaneId.get(node.id) ?? \"_pool_\") === laneId,\n );\n const usedCols = [...new Set(laneNodes.map((node) => columns.get(node.id) ?? 0))]\n .sort((a, b) => a - b);\n\n const colW = new Map<number, number>();\n for (const col of usedCols) colW.set(col, 0);\n for (const node of laneNodes) {\n const col = columns.get(node.id) ?? 0;\n colW.set(col, Math.max(colW.get(col) ?? 0, columnW(node)));\n }\n\n const colX = new Map<number, number>();\n let laneCumX = 0;\n for (const col of usedCols) {\n colX.set(col, laneCumX);\n laneCumX += (colW.get(col) ?? 120) + COL_GAP;\n }\n\n laneColumnLayouts.set(laneId, {\n colW,\n colX,\n contentW: usedCols.length > 0 ? laneCumX - COL_GAP : 0,\n });\n }\n\n // ── Phase 5: Pool and lane dimensions ─────────────────────────────────────\n\n const baseLaneInnerW = Math.max(\n 0,\n ...laneIds\n .filter((laneId) => laneId !== \"_pool_\")\n .map((laneId) => {\n const contentW = laneColumnLayouts.get(laneId)?.contentW ?? 0;\n return LANE_LABEL_W + LANE_H_PAD + contentW + LANE_H_PAD;\n }),\n );\n const basePoolInnerW = Math.max(\n 0,\n ...laneIds\n .filter((laneId) => laneId === \"_pool_\")\n .map((laneId) => (laneColumnLayouts.get(laneId)?.contentW ?? 0) + POOL_H_PAD * 2),\n );\n\n const innerW = Math.max(baseLaneInnerW, basePoolInnerW);\n const poolW = Math.max(POOL_MIN_W, innerW + POOL_INNER_PAD * 2);\n let laneW = poolW - POOL_INNER_PAD * 2;\n\n const laneY = new Map<string, number>();\n let cumY = POOL_INNER_PAD;\n for (let i = 0; i < laneIds.length; i++) {\n const laneId = laneIds[i];\n laneY.set(laneId, cumY);\n cumY += laneStats.get(laneId)?.height ?? LANE_MIN_H;\n if (i < laneIds.length - 1) cumY += POOL_INNER_PAD;\n }\n const poolH = cumY + POOL_INNER_PAD;\n\n // ── Phase 6: Position content nodes ───────────────────────────────────────\n\n const positionedContent = mainContent.map(node => {\n const c = columns.get(node.id) ?? 0;\n const r = rows.get(node.id) ?? 0;\n const laneId = nodeLaneId.get(node.id) ?? \"_pool_\";\n const stat = laneStats.get(laneId)!;\n const laneLayout = laneColumnLayouts.get(laneId);\n const lYOff = laneY.get(laneId) ?? 0;\n const lw = layoutW(node);\n const lh = layoutH(node);\n\n const colOffset = (laneLayout?.colX.get(c) ?? 0) + (laneLayout?.colW.get(c) ?? 120) / 2 - lw / 2;\n const rowOffset = (stat.rowY.get(r) ?? 0) + (stat.rowH.get(r) ?? ROW_HEIGHT) / 2 - lh / 2;\n\n const vertTopOffset = Math.max(LANE_V_PAD, (stat.height - stat.contentH) / 2);\n\n const isLaneChild = hasLanes && !!node.parentId && node.parentId !== pool.id;\n\n const x = isLaneChild\n ? LANE_LABEL_W + LANE_H_PAD + colOffset\n : POOL_H_PAD + colOffset;\n\n const y = isLaneChild\n ? vertTopOffset + rowOffset\n : lYOff + vertTopOffset + rowOffset;\n\n // Apply layout-minimum dimensions so tasks render at a readable size.\n return applyLayoutMinSize({ ...node, position: { x, y } });\n });\n\n // ── Phase 6B: Cross-lane handoff relaxation ──────────────────────────────\n // Per-lane compaction is good for density, but a target in another lane\n // still needs to read as a successor to a source on the left. We therefore\n // push cross-lane targets (and the segment to their right) just enough to\n // preserve left-to-right causality without reintroducing a full global grid.\n\n const handoffAdjustedContent = [...positionedContent];\n const nodeIndexById = new Map(handoffAdjustedContent.map((node, index) => [node.id, index]));\n const outgoingBySource = new Map<string, typeof fwdEdges>();\n for (const edge of fwdEdges) {\n if (!outgoingBySource.has(edge.source)) outgoingBySource.set(edge.source, []);\n outgoingBySource.get(edge.source)!.push(edge);\n }\n const crossLaneEdges = fwdEdges\n .filter((edge) => {\n const srcLane = nodeLaneId.get(edge.source) ?? \"_pool_\";\n const tgtLane = nodeLaneId.get(edge.target) ?? \"_pool_\";\n return srcLane !== tgtLane;\n })\n .sort(\n (a, b) =>\n (columns.get(a.target) ?? 0) - (columns.get(b.target) ?? 0) ||\n (columns.get(a.source) ?? 0) - (columns.get(b.source) ?? 0),\n );\n\n for (const edge of crossLaneEdges) {\n const srcIndex = nodeIndexById.get(edge.source);\n const tgtIndex = nodeIndexById.get(edge.target);\n if (srcIndex == null || tgtIndex == null) continue;\n\n const srcNode = handoffAdjustedContent[srcIndex];\n const tgtNode = handoffAdjustedContent[tgtIndex];\n const tgtLaneId = nodeLaneId.get(tgtNode.id) ?? \"_pool_\";\n const tgtCol = columns.get(tgtNode.id) ?? 0;\n const siblingTargets = (outgoingBySource.get(edge.source) ?? [])\n .filter((candidate) => (columns.get(candidate.target) ?? 0) === tgtCol)\n .map((candidate) => handoffAdjustedContent[nodeIndexById.get(candidate.target) ?? -1])\n .filter((node): node is BpmnRFNode => !!node);\n const siblingAlignedX = siblingTargets.reduce(\n (max, node) => Math.max(max, node.position.x),\n Number.NEGATIVE_INFINITY,\n );\n const minTargetX = Math.max(\n siblingAlignedX,\n srcNode.position.x +\n layoutW(srcNode) / 2 +\n layoutW(tgtNode) / 2 +\n COL_GAP,\n );\n\n if (tgtNode.position.x >= minTargetX) continue;\n\n const delta = minTargetX - tgtNode.position.x;\n for (let i = 0; i < handoffAdjustedContent.length; i++) {\n const candidate = handoffAdjustedContent[i];\n if ((nodeLaneId.get(candidate.id) ?? \"_pool_\") !== tgtLaneId) continue;\n if ((columns.get(candidate.id) ?? 0) < tgtCol) continue;\n handoffAdjustedContent[i] = {\n ...candidate,\n position: {\n x: candidate.position.x + delta,\n y: candidate.position.y,\n },\n };\n }\n }\n\n for (const [sourceId, outgoing] of outgoingBySource) {\n if (outgoing.length < 2) continue;\n const hasCrossLaneSibling = outgoing.some((edge) => {\n const srcLane = nodeLaneId.get(edge.source) ?? \"_pool_\";\n const tgtLane = nodeLaneId.get(edge.target) ?? \"_pool_\";\n return srcLane !== tgtLane;\n });\n if (!hasCrossLaneSibling) continue;\n\n const siblingsByCol = new Map<number, BpmnRFNode[]>();\n for (const edge of outgoing) {\n const col = columns.get(edge.target) ?? 0;\n const node = handoffAdjustedContent[nodeIndexById.get(edge.target) ?? -1];\n if (!node) continue;\n if (!siblingsByCol.has(col)) siblingsByCol.set(col, []);\n siblingsByCol.get(col)!.push(node);\n }\n\n for (const [col, siblings] of siblingsByCol) {\n if (siblings.length < 2) continue;\n const alignedX = Math.max(...siblings.map((node) => node.position.x));\n for (let i = 0; i < handoffAdjustedContent.length; i++) {\n const candidate = handoffAdjustedContent[i];\n if (!siblings.some((node) => node.id === candidate.id)) continue;\n const laneId = nodeLaneId.get(candidate.id) ?? \"_pool_\";\n for (let j = 0; j < handoffAdjustedContent.length; j++) {\n const maybeShift = handoffAdjustedContent[j];\n if ((nodeLaneId.get(maybeShift.id) ?? \"_pool_\") !== laneId) continue;\n if ((columns.get(maybeShift.id) ?? 0) < col) continue;\n const delta = alignedX - candidate.position.x;\n if (delta <= 0) continue;\n handoffAdjustedContent[j] = {\n ...maybeShift,\n position: {\n x: maybeShift.position.x + delta,\n y: maybeShift.position.y,\n },\n };\n }\n }\n }\n void sourceId;\n }\n\n // ── Phase 7: Overlap resolution ───────────────────────────────────────────\n\n const NODE_MIN_GAP = 24;\n const resolvedContent = [...handoffAdjustedContent];\n\n for (const laneId of laneIds) {\n const laneNodeIndices = resolvedContent\n .map((n, i) => ({ n, i }))\n .filter(({ n }) => (nodeLaneId.get(n.id) ?? \"_pool_\") === laneId)\n .sort((a, b) => a.n.position.x - b.n.position.x);\n\n for (let k = 1; k < laneNodeIndices.length; k++) {\n const prev = resolvedContent[laneNodeIndices[k - 1].i];\n const curr = resolvedContent[laneNodeIndices[k].i];\n\n // Use layoutW/layoutH so the overlap check matches the final rendered sizes.\n const prevBottom = prev.position.y + layoutH(prev);\n const currTop = curr.position.y;\n const prevTop = prev.position.y;\n const currBottom = curr.position.y + layoutH(curr);\n const yOverlap =\n prevBottom + NODE_MIN_GAP > currTop &&\n currBottom + NODE_MIN_GAP > prevTop;\n\n if (!yOverlap) continue;\n\n const prevRight = prev.position.x + layoutW(prev);\n if (prevRight + NODE_MIN_GAP > curr.position.x) {\n resolvedContent[laneNodeIndices[k].i] = {\n ...curr,\n position: { x: prevRight + NODE_MIN_GAP, y: curr.position.y },\n };\n }\n }\n }\n\n // ── Phase 8: Reposition BoundaryEvents onto their host nodes ──────────────\n\n const positionedBoundaries = repositionBoundaryEvents(boundaryEvents, resolvedContent);\n\n // ── Phase 8B: Final container width after overlap resolution ─────────────\n // Nodes can be pushed right during overlap resolution, so containers must be\n // measured against the final positions, not the preliminary column grid.\n\n const laneChildRight = resolvedContent\n .filter((node) => hasLanes && !!node.parentId && node.parentId !== pool.id)\n .reduce((max, node) => Math.max(max, node.position.x + nW(node) + LANE_H_PAD), 0);\n const poolChildRight = resolvedContent\n .filter((node) => !hasLanes || !node.parentId || node.parentId === pool.id)\n .reduce((max, node) => Math.max(max, node.position.x + nW(node) + POOL_H_PAD), 0);\n const boundaryRight = positionedBoundaries.reduce(\n (max, node) => Math.max(max, node.position.x + nW(node) + (hasLanes ? LANE_H_PAD : POOL_H_PAD)),\n 0,\n );\n\n const finalInnerW = Math.max(innerW, laneChildRight, poolChildRight, boundaryRight);\n const finalPoolW = Math.max(POOL_MIN_W, finalInnerW + POOL_INNER_PAD * 2);\n laneW = finalPoolW - POOL_INNER_PAD * 2;\n\n // ── Phase 9: Position lanes ────────────────────────────────────────────────\n\n const positionedLanes = hasLanes\n ? sortedLanes.map(lane => ({\n ...lane,\n position: { x: POOL_INNER_PAD, y: laneY.get(lane.id) ?? POOL_INNER_PAD },\n width: laneW,\n height: laneStats.get(lane.id)?.height ?? LANE_MIN_H,\n }))\n : [];\n\n return {\n nodes: [...resolvedContent, ...positionedBoundaries, ...positionedLanes],\n width: finalPoolW,\n height: poolH,\n };\n}\n\n// ── Virtual context: pool-less / free-node layout without ELK ───────────────\n//\n// Phase 4: the custom engine is the only layout engine. Diagrams without\n// pools — and free-node clusters in mixed diagrams — run through layoutPool\n// with a zero-positioned virtual pool: same column/row assignment, handoff\n// relaxation, overlap resolution and boundary anchoring as pooled content.\n// Positions come out origin-relative (the virtual pool sits at 0,0) and the\n// virtual pool itself is never emitted.\n\nfunction layoutVirtualContext(\n contextNodes: BpmnRFNode[], // flow content + boundary events, no containers\n allEdges: BpmnRFEdge[],\n offsetY: number,\n): BpmnRFNode[] {\n if (contextNodes.length === 0) return [];\n const virtualPool: BpmnRFNode = {\n id: \"__bpmn_virtual_pool__\",\n type: \"Pool\",\n position: { x: 0, y: 0 },\n data: { elementType: \"Pool\" },\n };\n const result = layoutPool(virtualPool, [], contextNodes, allEdges);\n if (offsetY === 0) return result.nodes;\n return result.nodes.map(n => ({\n ...n,\n position: { x: n.position.x, y: n.position.y + offsetY },\n }));\n}\n\n// ── Geometry helpers ───────────────────────────────────────────────────────\n\ntype Pt = { x: number; y: number };\ntype Rect = { x: number; y: number; width: number; height: number };\n\nfunction absolutePos(\n nodeId: string,\n byId: Map<string, BpmnRFNode>,\n cache: Map<string, Pt>,\n): Pt {\n const cached = cache.get(nodeId);\n if (cached) return cached;\n const node = byId.get(nodeId);\n if (!node) return { x: 0, y: 0 };\n const own = { ...node.position };\n if (!node.parentId) { cache.set(nodeId, own); return own; }\n const parent = absolutePos(node.parentId, byId, cache);\n const abs = { x: parent.x + own.x, y: parent.y + own.y };\n cache.set(nodeId, abs);\n return abs;\n}\n\nfunction findAncestorNodeId(\n node: BpmnRFNode | undefined,\n candidateIds: Set<string>,\n byId: Map<string, BpmnRFNode>,\n): string | undefined {\n let current = node;\n while (current?.parentId) {\n if (candidateIds.has(current.parentId)) return current.parentId;\n current = byId.get(current.parentId);\n }\n return undefined;\n}\n\nfunction laneOf(\n node: BpmnRFNode,\n laneIds: Set<string>,\n byId: Map<string, BpmnRFNode>,\n): string | undefined {\n return findAncestorNodeId(node, laneIds, byId);\n}\n\nfunction poolOf(\n node: BpmnRFNode,\n poolIds: Set<string>,\n byId: Map<string, BpmnRFNode>,\n): string | undefined {\n if (poolIds.has(node.id)) return node.id;\n return findAncestorNodeId(node, poolIds, byId);\n}\n\nfunction nodeRect(\n node: BpmnRFNode,\n byId: Map<string, BpmnRFNode>,\n cache: Map<string, Pt>,\n): Rect {\n const pos = absolutePos(node.id, byId, cache);\n return { x: pos.x, y: pos.y, width: nW(node), height: nH(node) };\n}\n\nfunction rectContainsRect(outer: Rect, inner: Rect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.width <= outer.x + outer.width &&\n inner.y + inner.height <= outer.y + outer.height\n );\n}\n\nfunction sortNodesParentFirst(nodes: BpmnRFNode[]): BpmnRFNode[] {\n const byId = new Map(nodes.map((node) => [node.id, node]));\n const memo = new Map<string, number>();\n\n const depthOf = (node: BpmnRFNode): number => {\n const cached = memo.get(node.id);\n if (cached != null) return cached;\n if (!node.parentId) {\n memo.set(node.id, 0);\n return 0;\n }\n const parent = byId.get(node.parentId);\n const depth = parent ? depthOf(parent) + 1 : 0;\n memo.set(node.id, depth);\n return depth;\n };\n\n return [...nodes].sort((a, b) => {\n const depthDiff = depthOf(a) - depthOf(b);\n if (depthDiff !== 0) return depthDiff;\n const ay = a.position?.y ?? 0;\n const by = b.position?.y ?? 0;\n if (ay !== by) return ay - by;\n const ax = a.position?.x ?? 0;\n const bx = b.position?.x ?? 0;\n if (ax !== bx) return ax - bx;\n return a.id.localeCompare(b.id);\n });\n}\n\n/** Midpoint of the column gap — guaranteed in empty space between the two nodes.\n * Used for cross-lane routing where we want the vertical segment centered. */\nfunction gapMidX(sAbs: Pt, sW: number, tAbs: Pt, tW: number): number {\n const leftRightEdge = Math.min(sAbs.x + sW, tAbs.x + tW);\n const rightLeftEdge = Math.max(sAbs.x, tAbs.x);\n return leftRightEdge < rightLeftEdge\n ? (leftRightEdge + rightLeftEdge) / 2\n : sAbs.x + sW / 2;\n}\n\n/** Biased routing X — 35 % from the source exit, 65 % from the target entry.\n * Used for same-lane cross-row L-shapes where the vertical segment runs\n * adjacent to sibling nodes in the target column. Keeping the line closer\n * to the source column gives more visual clearance from those siblings. */\nfunction routeMidX(sAbs: Pt, sW: number, tAbs: Pt, tW: number): number {\n const leftEdge = Math.min(sAbs.x + sW, tAbs.x + tW); // source right edge\n const rightEdge = Math.max(sAbs.x, tAbs.x); // target left edge\n return leftEdge < rightEdge\n ? leftEdge + (rightEdge - leftEdge) * 0.35\n : sAbs.x + sW / 2;\n}\n\n// ── Orthogonal edge routing ────────────────────────────────────────────────\n\nconst SAME_ROW_THRESHOLD = 15;\n\nfunction routeEdges(\n edges: BpmnRFEdge[],\n layoutNodes: BpmnRFNode[],\n backEdgeIds: Set<string>,\n laneIds: Set<string>,\n poolIds: Set<string>,\n): BpmnRFEdge[] {\n const byId = new Map(layoutNodes.map(n => [n.id, n]));\n const cache = new Map<string, Pt>();\n const abs = (id: string) => absolutePos(id, byId, cache);\n\n const sortedLanes = [...laneIds]\n .map(id => byId.get(id))\n .filter((n): n is BpmnRFNode => !!n)\n .sort((a, b) => abs(a.id).y - abs(b.id).y);\n\n // Content rects per pool — used so back-edge arcs clear every node they\n // travel over, and so vertical corridors can dodge blocking nodes.\n const contentInfos = layoutNodes\n .filter(n => !poolIds.has(n.id) && !laneIds.has(n.id))\n .map(n => {\n const p = abs(n.id);\n return { id: n.id, x: p.x, y: p.y, w: nW(n), h: nH(n), poolId: poolOf(n, poolIds, byId) ?? null };\n });\n\n /** Finds an X for a vertical corridor segment spanning [y0,y1] that does\n * not cut through any content node — best effort within [minX,maxX]. */\n const findClearX = (\n desiredX: number,\n y0: number,\n y1: number,\n minX: number,\n maxX: number,\n excludeA: string,\n excludeB: string,\n poolId: string | null,\n ): number => {\n if (minX > maxX) return desiredX;\n const clampX = (x: number) => Math.min(maxX, Math.max(minX, x));\n const blockers = contentInfos.filter(c =>\n c.poolId === poolId &&\n c.id !== excludeA && c.id !== excludeB &&\n c.y < y1 && c.y + c.h > y0,\n );\n const isFree = (x: number) => blockers.every(c => x < c.x - 4 || x > c.x + c.w + 4);\n const clamped = clampX(desiredX);\n if (isFree(clamped)) return clamped;\n const candidates: number[] = [];\n for (const c of blockers) candidates.push(c.x - 8, c.x + c.w + 8);\n const free = candidates\n .map(clampX)\n .filter(isFree)\n .sort((a, b) => Math.abs(a - desiredX) - Math.abs(b - desiredX));\n return free.length > 0 ? free[0] : clamped;\n };\n\n // Back-edges are staggered so two loops over the same span don't share the\n // exact same arc height. Deterministic: ordered by edge id.\n const backEdgeOrder = new Map<string, number>();\n for (const edge of [...edges].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))) {\n if (backEdgeIds.has(edge.id)) backEdgeOrder.set(edge.id, backEdgeOrder.size);\n }\n\n /** Orthogonal cross-pool route for a message flow: leave through the source\n * pool's facing border, run along the corridor between the pools, enter\n * the target from its facing border. Returns null when the pools don't\n * stack vertically (fall back to the default renderer). */\n const routeMessageFlow = (edge: BpmnRFEdge): Pt[] | null => {\n const src = byId.get(edge.source);\n const tgt = byId.get(edge.target);\n if (!src || !tgt) return null;\n const srcPoolId = poolOf(src, poolIds, byId);\n const tgtPoolId = poolOf(tgt, poolIds, byId);\n if (!srcPoolId || !tgtPoolId || srcPoolId === tgtPoolId) return null;\n const srcPoolNode = byId.get(srcPoolId);\n const tgtPoolNode = byId.get(tgtPoolId);\n if (!srcPoolNode || !tgtPoolNode) return null;\n\n const sAbs = abs(src.id);\n const tAbs = abs(tgt.id);\n const sCX = sAbs.x + nW(src) / 2;\n const tCX = tAbs.x + nW(tgt) / 2;\n const srcPoolAbs = abs(srcPoolId);\n const tgtPoolAbs = abs(tgtPoolId);\n const srcPoolBottom = srcPoolAbs.y + nH(srcPoolNode);\n const tgtPoolBottom = tgtPoolAbs.y + nH(tgtPoolNode);\n\n if (tgtPoolAbs.y >= srcPoolBottom) {\n // Target pool below: exit bottom, cross the inter-pool corridor, enter top.\n const corridorY = (srcPoolBottom + tgtPoolAbs.y) / 2;\n return [\n { x: sCX, y: sAbs.y + nH(src) },\n { x: sCX, y: corridorY },\n { x: tCX, y: corridorY },\n { x: tCX, y: tAbs.y },\n ];\n }\n if (srcPoolAbs.y >= tgtPoolBottom) {\n // Target pool above: exit top, enter bottom.\n const corridorY = (tgtPoolBottom + srcPoolAbs.y) / 2;\n return [\n { x: sCX, y: sAbs.y },\n { x: sCX, y: corridorY },\n { x: tCX, y: corridorY },\n { x: tCX, y: tAbs.y + nH(tgt) },\n ];\n }\n return null; // overlapping/side-by-side pools — default rendering\n };\n\n const routed = edges.map(edge => {\n const edgeType = (edge.data?.edgeType ?? edge.type) as string;\n\n if (edgeType !== \"sequenceFlow\") {\n if (edgeType === \"messageFlow\") {\n const pts = routeMessageFlow(edge);\n if (pts) {\n return { ...edge, data: { ...edge.data, routingPoints: pts } } as unknown as BpmnRFEdge;\n }\n }\n const d = { ...edge.data };\n delete d.routingPoints;\n return { ...edge, data: d } as unknown as BpmnRFEdge;\n }\n\n const src = byId.get(edge.source);\n const tgt = byId.get(edge.target);\n if (!src || !tgt) return edge;\n\n const sAbs = abs(src.id);\n const tAbs = abs(tgt.id);\n const sW = nW(src), sH = nH(src);\n const tW = nW(tgt), tH = nH(tgt);\n\n const sCX = sAbs.x + sW / 2;\n const tCX = tAbs.x + tW / 2;\n const sCY = sAbs.y + sH / 2;\n const tCY = tAbs.y + tH / 2;\n\n // Cross-pool → no routing, let ReactFlow draw default.\n const srcPool = poolOf(src, poolIds, byId) ?? null;\n const tgtPool = poolOf(tgt, poolIds, byId) ?? null;\n if (srcPool !== tgtPool) {\n const d = { ...edge.data };\n delete d.routingPoints;\n return { ...edge, data: d } as unknown as BpmnRFEdge;\n }\n\n let routingPoints: Pt[];\n\n // ── Back-edge: U-arc above the flow ────────────────────────────────────\n if (backEdgeIds.has(edge.id)) {\n // Clear every node the arc travels over (same pool, intersecting the\n // horizontal span), staggering multiple loops so arcs never coincide.\n const spanMinX = Math.min(tAbs.x, sAbs.x) - EDGE_ROUTE_PAD;\n const spanMaxX = Math.max(tAbs.x + tW, sAbs.x + sW) + EDGE_ROUTE_PAD;\n let topMost = Math.min(sAbs.y, tAbs.y);\n for (const cand of contentInfos) {\n if (cand.poolId !== srcPool) continue;\n if (cand.x + cand.w < spanMinX || cand.x > spanMaxX) continue;\n topMost = Math.min(topMost, cand.y);\n }\n const stagger = (backEdgeOrder.get(edge.id) ?? 0) * 14;\n const topY = topMost - BACK_EDGE_CLEARANCE - stagger;\n routingPoints = [\n { x: sAbs.x + sW, y: sCY },\n { x: sAbs.x + sW + EDGE_ROUTE_PAD, y: sCY },\n { x: sAbs.x + sW + EDGE_ROUTE_PAD, y: topY },\n { x: tAbs.x - EDGE_ROUTE_PAD, y: topY },\n { x: tAbs.x - EDGE_ROUTE_PAD, y: tCY },\n { x: tAbs.x, y: tCY },\n ];\n }\n\n // ── Cross-lane: orthogonal routing through every lane border ────────────\n //\n // For each lane border crossed a waypoint is added — including non-adjacent\n // lanes (Lane 1 → Lane 3 produces intermediate waypoints at Lane 1 and\n // Lane 2 bottom borders so the edge never cuts diagonally through Lane 2).\n //\n // Format: [discarded, horiz_exit, ...border_Ys, horiz_entry, discarded]\n\n else if (laneOf(src, laneIds, byId) !== laneOf(tgt, laneIds, byId)) {\n const srcLane = byId.get(laneOf(src, laneIds, byId) ?? \"\");\n const tgtLane = byId.get(laneOf(tgt, laneIds, byId) ?? \"\");\n\n if (srcLane && tgtLane && laneIds.has(srcLane.id) && laneIds.has(tgtLane.id)) {\n const goingDown = tAbs.y > sAbs.y;\n const sharedX = findClearX(\n gapMidX(sAbs, sW, tAbs, tW),\n Math.min(sCY, tCY), Math.max(sCY, tCY),\n sAbs.x + sW + 6, tAbs.x - EDGE_ROUTE_PAD - 4,\n src.id, tgt.id, srcPool,\n );\n const srcLaneIdx = sortedLanes.findIndex(l => l.id === srcLane.id);\n const tgtLaneIdx = sortedLanes.findIndex(l => l.id === tgtLane.id);\n\n const pts: Pt[] = [];\n\n if (goingDown) {\n pts.push({ x: sAbs.x + sW, y: sCY }); // exit at right side\n pts.push({ x: sharedX, y: sCY }); // horizontal exit corridor\n\n const fromIdx = Math.min(srcLaneIdx, tgtLaneIdx);\n const toIdx = Math.max(srcLaneIdx, tgtLaneIdx);\n for (let i = fromIdx; i < toIdx; i++) {\n const lane = sortedLanes[i];\n const laneBot = abs(lane.id).y + (lane.height ?? LANE_MIN_H);\n pts.push({ x: sharedX, y: laneBot }); // each lane border\n }\n\n const lastY = pts[pts.length - 1].y;\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: lastY }); // horizontal entry corridor\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: tCY });\n pts.push({ x: tAbs.x, y: tCY });\n } else {\n pts.push({ x: sAbs.x + sW, y: sCY });\n pts.push({ x: sharedX, y: sCY });\n\n const fromIdx = Math.min(srcLaneIdx, tgtLaneIdx);\n const toIdx = Math.max(srcLaneIdx, tgtLaneIdx);\n for (let i = toIdx; i > fromIdx; i--) {\n const lane = sortedLanes[i];\n const laneTop = abs(lane.id).y;\n pts.push({ x: sharedX, y: laneTop });\n }\n\n const lastY = pts[pts.length - 1].y;\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: lastY });\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: tCY });\n pts.push({ x: tAbs.x, y: tCY });\n }\n\n routingPoints = pts;\n } else {\n const sharedX = findClearX(\n gapMidX(sAbs, sW, tAbs, tW),\n Math.min(sCY, tCY), Math.max(sCY, tCY),\n sAbs.x + sW + 6, tAbs.x - 6,\n src.id, tgt.id, srcPool,\n );\n routingPoints = [\n { x: sAbs.x + sW, y: sCY },\n { x: sharedX, y: sCY },\n { x: sharedX, y: tCY },\n { x: tAbs.x, y: tCY },\n ];\n }\n }\n\n // ── Same lane, same row: straight ──────────────────────────────────────\n else if (Math.abs(sCY - tCY) <= SAME_ROW_THRESHOLD) {\n const d = { ...edge.data };\n delete d.routingPoints;\n return { ...edge, data: d } as unknown as BpmnRFEdge;\n }\n\n // ── Same lane, different row: L-shape ──────────────────────────────────\n else {\n const handle = edge.sourceHandle ?? \"\";\n const exitsTop = handle.includes(\"top\");\n const exitsBottom = handle.includes(\"bottom\");\n\n if (exitsTop || exitsBottom) {\n const exitY = exitsTop ? sAbs.y : sAbs.y + sH;\n const entryY = exitsTop ? tAbs.y + tH : tAbs.y;\n const corridorY = exitsTop\n ? Math.min(exitY, entryY) - EDGE_ROUTE_PAD\n : Math.max(exitY, entryY) + EDGE_ROUTE_PAD;\n routingPoints = [\n { x: sCX, y: exitY },\n { x: sCX, y: corridorY },\n { x: tCX, y: corridorY },\n { x: tCX, y: entryY },\n ];\n } else {\n // routeMidX biases 35 % from source exit — keeps the vertical segment\n // away from sibling nodes stacked in the target column (row above/below).\n const midX = routeMidX(sAbs, sW, tAbs, tW);\n const exitX = sAbs.x + sW;\n const entryX = tAbs.x;\n const corridorX = findClearX(\n Math.max(midX, exitX + EDGE_ROUTE_PAD),\n Math.min(sCY, tCY), Math.max(sCY, tCY),\n exitX + 6, entryX - 6,\n src.id, tgt.id, srcPool,\n );\n routingPoints = [\n { x: exitX, y: sCY },\n { x: corridorX, y: sCY },\n { x: corridorX, y: tCY },\n { x: entryX, y: tCY },\n ];\n }\n }\n\n return { ...edge, data: { ...edge.data, routingPoints } } as unknown as BpmnRFEdge;\n });\n\n return spreadVerticalChannels(routed);\n}\n\n// ── Edge channels: spread overlapping vertical corridors ────────────────────\n//\n// Several routed edges often share the exact same vertical corridor (e.g. two\n// branches converging on the same column, or parallel cross-lane handoffs).\n// Drawn on top of each other they read as ONE edge. This post-pass clusters\n// interior vertical runs by X, and nudges overlapping runs apart by a small\n// per-edge offset, keeping each run inside its routing corridor.\n\nconst CHANNEL_GAP = 10; // px between parallel edges in a corridor\nconst CHANNEL_CLUSTER_TOL = 8; // runs within this X distance share a corridor\n\ninterface VerticalRun {\n edgeIdx: number;\n fromIdx: number; // first point index of the run\n toIdx: number; // last point index of the run\n x: number;\n y0: number;\n y1: number;\n}\n\nfunction spreadVerticalChannels(edges: BpmnRFEdge[]): BpmnRFEdge[] {\n const runs: VerticalRun[] = [];\n\n edges.forEach((edge, edgeIdx) => {\n const pts = edge.data?.routingPoints as Pt[] | undefined;\n if (!pts || pts.length < 4) return;\n let i = 1;\n while (i < pts.length) {\n // Detect a maximal vertical run starting at i-1.\n let j = i;\n while (j < pts.length && Math.abs(pts[j].x - pts[j - 1].x) <= 0.5) j++;\n if (j > i) {\n const fromIdx = i - 1;\n const toIdx = j - 1;\n // Only interior runs are safe to shift — runs touching the first or\n // last point would detach the edge from its node border.\n if (fromIdx > 0 && toIdx < pts.length - 1) {\n const ys = pts.slice(fromIdx, toIdx + 1).map(p => p.y);\n const y0 = Math.min(...ys);\n const y1 = Math.max(...ys);\n if (y1 - y0 >= 4) {\n runs.push({ edgeIdx, fromIdx, toIdx, x: pts[fromIdx].x, y0, y1 });\n }\n }\n i = j + 1;\n } else {\n i++;\n }\n }\n });\n\n if (runs.length < 2) return edges;\n\n // Cluster runs by X proximity.\n runs.sort((a, b) => a.x - b.x);\n const clusters: VerticalRun[][] = [];\n for (const run of runs) {\n const last = clusters[clusters.length - 1];\n if (last && run.x - last[0].x <= CHANNEL_CLUSTER_TOL) last.push(run);\n else clusters.push([run]);\n }\n\n const offsets = new Map<VerticalRun, number>();\n for (const cluster of clusters) {\n if (cluster.length < 2) continue;\n // Only runs that overlap vertically with another in the cluster collide.\n const colliding = cluster.filter(run =>\n cluster.some(other => other !== run && run.y0 < other.y1 && other.y0 < run.y1),\n );\n if (colliding.length < 2) continue;\n const ordered = [...colliding].sort((a, b) => {\n const idA = edges[a.edgeIdx].id;\n const idB = edges[b.edgeIdx].id;\n return idA < idB ? -1 : idA > idB ? 1 : a.fromIdx - b.fromIdx;\n });\n ordered.forEach((run, k) => {\n const off = Math.round((k - (ordered.length - 1) / 2) * CHANNEL_GAP);\n if (off !== 0) offsets.set(run, off);\n });\n }\n\n if (offsets.size === 0) return edges;\n\n const runsByEdge = new Map<number, VerticalRun[]>();\n for (const [run, off] of offsets) {\n void off;\n if (!runsByEdge.has(run.edgeIdx)) runsByEdge.set(run.edgeIdx, []);\n runsByEdge.get(run.edgeIdx)!.push(run);\n }\n\n return edges.map((edge, edgeIdx) => {\n const edgeRuns = runsByEdge.get(edgeIdx);\n if (!edgeRuns) return edge;\n const pts = (edge.data?.routingPoints as Pt[]).map(p => ({ ...p }));\n for (const run of edgeRuns) {\n const off = offsets.get(run)!;\n for (let p = run.fromIdx; p <= run.toIdx; p++) pts[p].x += off;\n }\n return { ...edge, data: { ...edge.data, routingPoints: pts } } as unknown as BpmnRFEdge;\n });\n}\n\n// ── Artifact positioning ───────────────────────────────────────────────────\n//\n// Artifacts (DataObjects, Annotations, Groups) do not participate in the main\n// flow layout. After the pool layout is complete, each artifact is placed\n// above the node it is connected to via an association or dataAssociation edge.\n//\n// Coordinate spaces: artifacts and their connected nodes are assumed to share\n// the same parentId (both in the same lane or both direct pool children).\n// If parentIds differ, the artifact keeps its original position.\n\nconst ARTIFACT_ABOVE_GAP = 16; // px between artifact bottom and connected node top\nconst ARTIFACT_H_SPACING = 12; // px between multiple artifacts on the same node\nconst ARTIFACT_EDGE_PAD = 4; // min clearance between artifact and container border\n\nfunction positionArtifacts(\n artifacts: BpmnRFNode[],\n resultNodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n originalNodes: BpmnRFNode[],\n): BpmnRFNode[] {\n if (artifacts.length === 0) return [];\n\n const byId = new Map(resultNodes.map(n => [n.id, n]));\n const cache = new Map<string, Pt>();\n const absPos = (id: string) => absolutePos(id, byId, cache);\n const originalById = new Map(originalNodes.map(n => [n.id, n]));\n const originalCache = new Map<string, Pt>();\n\n // Build: connectedNodeId → artifacts[] (Groups are ungrouped — keep original).\n const artifactsByNode = new Map<string, BpmnRFNode[]>();\n const ungrouped: BpmnRFNode[] = [];\n const groups: BpmnRFNode[] = [];\n\n for (const artifact of artifacts) {\n if (artifact.data.elementType === \"Group\") {\n groups.push(artifact);\n continue;\n }\n\n const connEdge = edges.find(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return (\n (t === \"association\" || t === \"dataAssociation\") &&\n (e.source === artifact.id || e.target === artifact.id)\n );\n });\n\n if (!connEdge) { ungrouped.push(artifact); continue; }\n\n const connId = connEdge.source === artifact.id\n ? connEdge.target\n : connEdge.source;\n\n if (!byId.has(connId)) { ungrouped.push(artifact); continue; }\n\n if (!artifactsByNode.has(connId)) artifactsByNode.set(connId, []);\n artifactsByNode.get(connId)!.push(artifact);\n }\n\n const positioned: BpmnRFNode[] = [...ungrouped];\n\n for (const [connId, arts] of artifactsByNode) {\n const connNode = byId.get(connId)!;\n const connAbsP = absPos(connId);\n\n // Desired absolute position: spread horizontally above connected node.\n const totalW = arts.reduce((s, a) => s + nW(a), 0) +\n (arts.length - 1) * ARTIFACT_H_SPACING;\n const desiredAbsY = connAbsP.y - ARTIFACT_ABOVE_GAP - Math.max(...arts.map(nH));\n let desiredAbsX = connAbsP.x + nW(connNode) / 2 - totalW / 2;\n\n for (const artifact of arts) {\n // Convert from absolute to artifact-relative (same coordinate space as\n // its parent). If artifact and connected node have different parents,\n // the absolute computation still works — the result is relative to the\n // artifact's own parent.\n const parentAbsP = artifact.parentId\n ? absPos(artifact.parentId)\n : { x: 0, y: 0 };\n\n // Keep the artifact inside its container vertically: prefer the slot\n // above the connected node; when the node sits on the container's top\n // row there is no headroom — fall back to below the node, and clamp to\n // the container's bottom border (bug 6).\n let relY = desiredAbsY - parentAbsP.y;\n const parentNode = artifact.parentId ? byId.get(artifact.parentId) : undefined;\n if (parentNode) {\n if (relY < ARTIFACT_EDGE_PAD) {\n const belowAbsY = connAbsP.y + nH(connNode) + ARTIFACT_ABOVE_GAP;\n relY = belowAbsY - parentAbsP.y;\n }\n relY = Math.min(relY, nH(parentNode) - nH(artifact) - ARTIFACT_EDGE_PAD);\n relY = Math.max(relY, ARTIFACT_EDGE_PAD);\n }\n\n positioned.push({\n ...artifact,\n position: {\n x: desiredAbsX - parentAbsP.x,\n y: relY,\n },\n });\n desiredAbsX += nW(artifact) + ARTIFACT_H_SPACING;\n }\n }\n\n const nonArtifactOriginalNodes = originalNodes.filter(\n (node) => !LAYOUT_ARTIFACT_TYPES.has(node.data.elementType),\n );\n\n for (const group of groups) {\n const originalGroup = originalById.get(group.id);\n if (!originalGroup) {\n positioned.push(group);\n continue;\n }\n\n const groupRect = nodeRect(originalGroup, originalById, originalCache);\n const containedOriginalIds = nonArtifactOriginalNodes\n .filter((node) => node.id !== group.id)\n .filter((node) => {\n if (node.parentId !== group.parentId) return false;\n return rectContainsRect(groupRect, nodeRect(node, originalById, originalCache));\n })\n .map((node) => node.id);\n\n if (containedOriginalIds.length === 0) {\n positioned.push(group);\n continue;\n }\n\n const containedLaidOut = containedOriginalIds\n .map((id) => byId.get(id))\n .filter((node): node is BpmnRFNode => !!node);\n\n if (containedLaidOut.length === 0) {\n positioned.push(group);\n continue;\n }\n\n const GROUP_PAD_X = 24;\n const GROUP_PAD_Y = 20;\n const bounds = containedLaidOut.reduce(\n (acc, node) => {\n const rect = nodeRect(node, byId, cache);\n return {\n left: Math.min(acc.left, rect.x),\n top: Math.min(acc.top, rect.y),\n right: Math.max(acc.right, rect.x + rect.width),\n bottom: Math.max(acc.bottom, rect.y + rect.height),\n };\n },\n { left: Number.POSITIVE_INFINITY, top: Number.POSITIVE_INFINITY, right: Number.NEGATIVE_INFINITY, bottom: Number.NEGATIVE_INFINITY },\n );\n\n const parentAbsP = group.parentId ? absPos(group.parentId) : { x: 0, y: 0 };\n positioned.push({\n ...group,\n position: {\n x: bounds.left - GROUP_PAD_X - parentAbsP.x,\n y: bounds.top - GROUP_PAD_Y - parentAbsP.y,\n },\n width: bounds.right - bounds.left + GROUP_PAD_X * 2,\n height: bounds.bottom - bounds.top + GROUP_PAD_Y * 2,\n measured: {\n width: bounds.right - bounds.left + GROUP_PAD_X * 2,\n height: bounds.bottom - bounds.top + GROUP_PAD_Y * 2,\n },\n });\n }\n\n return positioned;\n}\n\n// ── Main entry point ───────────────────────────────────────────────────────\n\nexport async function bpmnCustomLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): Promise<{ nodes: BpmnRFNode[]; edges: BpmnRFEdge[] }> {\n\n // ── 1. Separate artifacts from the main layout nodes ──────────────────────\n // Artifacts do not participate in sequence flow — they are positioned after\n // the main layout using association edges as placement hints.\n\n const artifacts = nodes.filter(n => LAYOUT_ARTIFACT_TYPES.has(n.data.elementType));\n const mainNodes = nodes.filter(n => !LAYOUT_ARTIFACT_TYPES.has(n.data.elementType));\n\n // ── 2. Derive structural sets from main nodes ─────────────────────────────\n\n const pools = mainNodes.filter(n => n.data.elementType === \"Pool\");\n const lanes = mainNodes.filter(n => n.data.elementType === \"Lane\");\n\n // ── 3. Pre-compute expanded SubProcess layouts ────────────────────────────\n // Expanded SubProcesses must have their final size known BEFORE the main\n // pool layout so column-width calculation uses the correct width.\n // layoutSubProcess() runs column/row assignment on the children and returns\n // both child positions (SubProcess-relative) and the container size.\n\n // Sorted DEEPEST-FIRST: a nested expanded SubProcess must be laid out (and\n // sized) before its parent, so the parent's column-width calculation sees\n // the inner's final dimensions instead of its stale stored size.\n const nodeDepthById = new Map<string, number>();\n const mainById = new Map(mainNodes.map(n => [n.id, n]));\n const depthOf = (node: BpmnRFNode): number => {\n const cached = nodeDepthById.get(node.id);\n if (cached != null) return cached;\n const parent = node.parentId ? mainById.get(node.parentId) : undefined;\n const depth = parent ? depthOf(parent) + 1 : 0;\n nodeDepthById.set(node.id, depth);\n return depth;\n };\n\n const expandedSubProcesses = mainNodes\n .filter(n => COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType) && n.data.isExpanded)\n .sort((a, b) => depthOf(b) - depthOf(a));\n\n const subProcessLayouts = new Map<string, SubProcessResult>();\n\n // Mutable copy — we update expanded SubProcess sizes before the main layout.\n const workingMainNodes = [...mainNodes];\n\n for (const sp of expandedSubProcesses) {\n const spChildren = workingMainNodes.filter(n => n.parentId === sp.id);\n const result = layoutSubProcess(spChildren, edges);\n subProcessLayouts.set(sp.id, result);\n\n const spIdx = workingMainNodes.findIndex(n => n.id === sp.id);\n if (spIdx >= 0) {\n workingMainNodes[spIdx] = {\n ...workingMainNodes[spIdx],\n width: result.width,\n height: result.height,\n measured: { width: result.width, height: result.height },\n };\n }\n }\n\n // Both collapsed AND expanded SubProcesses participate in the main flow as\n // content nodes (they get a column and row in the pool/lane). Their\n // children have parentId === sp.id and are excluded from poolContent\n // automatically, then added via subProcessLayouts after the pool loop.\n // BoundaryEvents are excluded here — they enter the pool layout exclusively\n // through poolBoundaries below (including them in both lists duplicated\n // every BoundaryEvent in the output and doubled the anchoring group width).\n const content = workingMainNodes.filter(n => {\n if (n.data.elementType === \"BoundaryEvent\") return false;\n if (!LAYOUT_CONTAINER_TYPES.has(n.data.elementType)) return true;\n if (COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType)) return true;\n return false;\n });\n\n // ── No pools → native virtual context (the custom engine handles it) ──────\n if (pools.length === 0) {\n // Top-level context: everything except children of expanded subprocesses\n // (those carry SP-relative positions from layoutSubProcess).\n const isSpChild = (n: BpmnRFNode) => !!n.parentId && subProcessLayouts.has(n.parentId);\n const freeContent = content.filter(n => !isSpChild(n));\n const freeBoundaries = workingMainNodes.filter(\n n => n.data.elementType === \"BoundaryEvent\" && !isSpChild(n),\n );\n\n const resultNodes = layoutVirtualContext([...freeContent, ...freeBoundaries], edges, 0);\n for (const [, spLayout] of subProcessLayouts) {\n for (const child of spLayout.children) resultNodes.push(child);\n }\n\n const contentIds = new Set(freeContent.map(n => n.id));\n const seqEdges = extractSeqEdges(edges, contentIds);\n const backIds = detectBackEdges([...contentIds], seqEdges);\n\n const routedEdges = routeEdges(edges, resultNodes, backIds, new Set(), new Set());\n const posArtifacts = positionArtifacts(artifacts, resultNodes, edges, nodes);\n return {\n nodes: sortNodesParentFirst([...resultNodes, ...posArtifacts]),\n edges: routedEdges,\n };\n }\n\n const poolIds = new Set(pools.map(p => p.id));\n const allLaneIds = new Set(lanes.map(l => l.id));\n\n // Back-edges for routing (computed across all pools).\n const allContentIds = new Set(content.map(n => n.id));\n const allSeqEdges = edges\n .filter(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return t === \"sequenceFlow\" &&\n allContentIds.has(e.source) &&\n allContentIds.has(e.target);\n })\n .map(e => ({ id: e.id, source: e.source, target: e.target }));\n const allBackEdgeIds = detectBackEdges([...allContentIds], allSeqEdges);\n\n // Sort pools by Y only when they have distinct positions.\n const poolPositionsDistinct = pools.some(p => Math.abs(p.position.y) > 10);\n const sortedPools = poolPositionsDistinct\n ? [...pools].sort((a, b) => a.position.y - b.position.y)\n : [...pools];\n\n const resultNodes: BpmnRFNode[] = [];\n let stackY = 0;\n\n for (const pool of sortedPools) {\n const poolLanes = lanes.filter(l => l.parentId === pool.id);\n const laneIds = new Set(poolLanes.map(l => l.id));\n\n // Pool content = content nodes whose parent is the pool or one of its lanes.\n // BoundaryEvents are included here (same parentId as their host task).\n const poolContent = content.filter(\n n => n.parentId === pool.id ||\n (n.parentId != null && laneIds.has(n.parentId)),\n );\n // Also include BoundaryEvents for this pool\n const poolBoundaries = workingMainNodes.filter(\n n => n.data.elementType === \"BoundaryEvent\" &&\n (n.parentId === pool.id || (n.parentId != null && laneIds.has(n.parentId))),\n );\n\n const result = layoutPool(pool, poolLanes, [...poolContent, ...poolBoundaries], edges);\n\n resultNodes.push({\n ...pool,\n position: { x: 0, y: stackY },\n width: result.width,\n height: result.height,\n });\n\n for (const node of result.nodes) {\n resultNodes.push(node);\n }\n\n stackY += result.height + POOL_V_GAP;\n }\n\n // ── Add SubProcess children with pre-computed positions ───────────────────\n // Children carry SubProcess-relative coordinates from layoutSubProcess().\n // ReactFlow renders them at subProcess.position + child.position correctly\n // since their parentId still points to the expanded SubProcess.\n for (const [, spLayout] of subProcessLayouts) {\n for (const child of spLayout.children) {\n resultNodes.push(child);\n }\n }\n\n // ── Layout free nodes (mixed diagrams: pools + nodes outside any pool) ─────\n // Nodes that are not children of any pool, lane, or expanded SubProcess are\n // \"free\" nodes. They run through the same engine as a virtual context and\n // are placed below the last pool with a gap.\n const layoutted = new Set(resultNodes.map(n => n.id));\n const freeNodes = workingMainNodes.filter(n => !layoutted.has(n.id));\n\n if (freeNodes.length > 0) {\n const freeFlow = freeNodes.filter(\n n =>\n n.data.elementType === \"BoundaryEvent\" ||\n !LAYOUT_CONTAINER_TYPES.has(n.data.elementType) ||\n COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType),\n );\n const freeRest = freeNodes.filter(n => !freeFlow.includes(n)); // orphan containers\n\n // stackY already includes last pool height + gap.\n for (const node of layoutVirtualContext(freeFlow, edges, stackY)) {\n resultNodes.push(node);\n }\n for (const node of freeRest) resultNodes.push(node);\n }\n\n // Route sequence flow edges with final node positions.\n const routedEdges = routeEdges(edges, resultNodes, allBackEdgeIds, allLaneIds, poolIds);\n\n // Position artifacts above their associated nodes and append.\n const positionedArtifacts = positionArtifacts(artifacts, resultNodes, edges, nodes);\n\n return {\n nodes: sortNodesParentFirst([...resultNodes, ...positionedArtifacts]),\n edges: routedEdges,\n };\n}\n","import type { DiagramEdge, LayoutOptions, LayoutResult } from \"@aranzatech/diagrams-core/types\";\nimport { dagreLayout, applyLayoutResultToDiagram } from \"@aranzatech/diagrams-core/layout\";\nimport type { DiagramNode } from \"@aranzatech/diagrams-core/types\";\nimport type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport { getBpmnNodeSize } from \"../modeling\";\nimport type { BpmnDiagramState } from \"../modeling\";\n\nexport { applyLayoutResultToDiagram };\n/** @deprecated bpmnCustomLayout maneja todos los casos (incluyendo diagramas\n * sin pools y nodos libres) de forma nativa desde la Fase 4. Este export se\n * conserva solo por compatibilidad y se eliminará en una versión mayor. */\nexport { bpmnElkLayout } from \"./elk\";\nexport { bpmnCustomLayout } from \"./bpmn-custom-layout\";\n\n/**\n * Dagre layout pre-configured for BPMN diagrams.\n * Uses BPMN-specific node sizes (events 52×52, gateways 64×64, tasks 192×64, etc.)\n * instead of the generic fallback, which prevents overlaps and poor spacing.\n */\nexport async function bpmnDagreLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n options: LayoutOptions = {},\n): Promise<LayoutResult> {\n return dagreLayout(nodes as DiagramNode[], edges as DiagramEdge[], {\n ...options,\n getNodeSize: (node) => getBpmnNodeSize(node as BpmnRFNode),\n });\n}\n\n/**\n * Applies a bpmn dagre layout result back to the diagram state.\n * Convenience wrapper so callers only need one import.\n */\nexport function applyBpmnLayoutResult(\n state: BpmnDiagramState,\n result: LayoutResult,\n): BpmnDiagramState {\n return applyLayoutResultToDiagram(state, result) as BpmnDiagramState;\n}\n"]}
1
+ {"version":3,"sources":["../../src/layout/elk.ts","../../src/layout/bpmn-layout-graph.ts","../../src/layout/bpmn-custom-layout.ts","../../src/layout/index.ts"],"names":["positionedBoundaries","resultNodes","routedEdges"],"mappings":"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","file":"index.js","sourcesContent":["import { elkLayout } from \"@aranzatech/diagrams-core/layout\";\nimport type { DiagramNode, DiagramEdge } from \"@aranzatech/diagrams-core/types\";\nimport type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport type { BpmnElementType } from \"../elements/types\";\nimport { getBpmnNodeSize } from \"../modeling\";\n\n// Container types that ELK auto-sizes based on their children.\nconst BPMN_CONTAINER_TYPES = new Set<BpmnElementType>([\n \"Pool\",\n \"Lane\",\n \"SubProcess\",\n \"Transaction\",\n \"EventSubProcess\",\n \"AdHocSubProcess\",\n]);\n\nconst CONTAINER_MIN_SIZE: Partial<Record<BpmnElementType, { w: number; h: number }>> = {\n Pool: { w: 720, h: 200 },\n Lane: { w: 600, h: 160 },\n SubProcess: { w: 240, h: 140 },\n Transaction: { w: 240, h: 140 },\n EventSubProcess: { w: 240, h: 140 },\n AdHocSubProcess: { w: 240, h: 140 },\n};\n\n// Padding inside each container type.\n// Left padding for Pool/Lane accounts for the vertical label strip (~30px) + breathing room.\nconst CONTAINER_PADDING: Partial<Record<BpmnElementType, string>> = {\n Pool: \"[top=30,left=60,bottom=30,right=50]\",\n Lane: \"[top=40,left=70,bottom=40,right=50]\",\n SubProcess: \"[top=30,left=40,bottom=30,right=40]\",\n Transaction: \"[top=30,left=40,bottom=30,right=40]\",\n EventSubProcess: \"[top=30,left=40,bottom=30,right=40]\",\n AdHocSubProcess: \"[top=30,left=40,bottom=30,right=40]\",\n};\n\n/**\n * ELK-based auto-layout for BPMN diagrams.\n *\n * Spacing philosophy: fixed, generous values that scale consistently\n * regardless of diagram size. \"Air\" between elements is not waste —\n * it is what makes the flow readable to the human eye.\n *\n * Direction policy:\n * - Root: RIGHT — free nodes and pools flow LR on the canvas.\n * - Pool with Lanes: DOWN internally so lanes stack top-to-bottom;\n * the pool itself is placed LR on the canvas.\n * - Lane / SubProcess / Pool-without-lanes: RIGHT — content flows LR.\n * - Each container runs its own INCLUDE_CHILDREN pass (per-container\n * hierarchyHandling) so cross-lane edges are routed correctly without\n * the global RIGHT direction forcing Lane containers sideways.\n * - Root uses INHERIT so each pool is laid out independently.\n * - Post-processing equalises Lane widths within each Pool so all Lanes\n * span the full Pool width.\n */\nexport async function bpmnElkLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): Promise<{ nodes: BpmnRFNode[]; edges: BpmnRFEdge[] }> {\n // Pools that directly contain at least one Lane.\n const poolsWithLanes = new Set<string>();\n for (const node of nodes) {\n if (node.data.elementType === \"Lane\" && node.parentId) {\n poolsWithLanes.add(node.parentId);\n }\n }\n\n const result = await elkLayout(\n nodes as unknown as DiagramNode[],\n edges as unknown as DiagramEdge[],\n {\n direction: \"LR\",\n getNodeSize: (node) => {\n const bNode = node as unknown as BpmnRFNode;\n if (BPMN_CONTAINER_TYPES.has(bNode.data.elementType)) return undefined;\n return getBpmnNodeSize(bNode);\n },\n isContainerNode: (node) =>\n BPMN_CONTAINER_TYPES.has((node as unknown as BpmnRFNode).data.elementType),\n getNodeLayoutOptions: (node) => {\n const bNode = node as unknown as BpmnRFNode;\n const type = bNode.data.elementType;\n if (!BPMN_CONTAINER_TYPES.has(type)) return undefined;\n\n const min = CONTAINER_MIN_SIZE[type];\n const isPoolWithLanes = type === \"Pool\" && poolsWithLanes.has(node.id);\n\n // Pool with Lanes stacks Lanes top-to-bottom (standard horizontal BPMN).\n // Everything else flows left-to-right.\n const dir = isPoolWithLanes ? \"DOWN\" : \"RIGHT\";\n\n return {\n \"elk.direction\": dir,\n \"elk.nodeSize.constraints\": \"MINIMUM_SIZE\",\n // Each container handles its own layout pass so cross-lane edges\n // participate in the internal layout without the global direction\n // forcing Lane containers to align sideways.\n \"elk.hierarchyHandling\": \"INCLUDE_CHILDREN\",\n // Lanes within a Pool share a border — zero gap between them.\n // Other containers keep the tighter inner spacing.\n ...(isPoolWithLanes\n ? { \"elk.spacing.nodeNode\": \"0\", \"elk.spacing.componentComponent\": \"0\" }\n : {\n \"elk.layered.spacing.nodeNodeBetweenLayers\": \"100\",\n \"elk.layered.spacing.edgeNodeBetweenLayers\": \"45\",\n \"elk.spacing.nodeNode\": \"50\",\n }),\n ...(min ? { \"elk.nodeSize.minimum\": `[w=${min.w},h=${min.h}]` } : {}),\n ...(CONTAINER_PADDING[type] ? { \"elk.padding\": CONTAINER_PADDING[type] } : {}),\n };\n },\n elk: {\n \"elk.algorithm\": \"layered\",\n \"elk.direction\": \"RIGHT\",\n // INHERIT: each container handles its own INCLUDE_CHILDREN pass so\n // the global RIGHT direction does not force Lane containers sideways.\n \"elk.hierarchyHandling\": \"INHERIT\",\n \"elk.edgeRouting\": \"ORTHOGONAL\",\n // Global spacing — generous values for visual breathing room.\n \"elk.layered.spacing.nodeNodeBetweenLayers\": \"120\",\n \"elk.layered.spacing.edgeNodeBetweenLayers\": \"50\",\n \"elk.spacing.nodeNode\": \"70\",\n \"elk.spacing.componentComponent\": \"100\",\n },\n },\n );\n\n const nodeMap = new Map(result.nodes.map((n) => [n.id, n]));\n const edgeMap = new Map(result.edges.map((e) => [e.id, e]));\n\n // ── Fix 1: Preserve original vertical order of root nodes (Pools, free nodes) ──\n // ELK may reorder disconnected components based on cross-pool edge direction.\n // We restore the original top-to-bottom order so Pools never swap positions.\n const COMPONENT_GAP = 100;\n const rootNodeOrder = nodes\n .filter((n) => !n.parentId)\n .map((n) => n.id);\n\n // Compute ELK heights for each root node, then re-stack top-to-bottom.\n const rootHeights = new Map<string, number>();\n for (const id of rootNodeOrder) {\n const laid = nodeMap.get(id);\n const orig = nodes.find((n) => n.id === id);\n rootHeights.set(id, laid?.height ?? orig?.height ?? 200);\n }\n let stackY = 0;\n const rootY = new Map<string, number>();\n for (const id of rootNodeOrder) {\n rootY.set(id, stackY);\n stackY += (rootHeights.get(id) ?? 200) + COMPONENT_GAP;\n }\n\n const updatedNodes = nodes.map((node) => {\n const laid = nodeMap.get(node.id);\n if (!laid) return node;\n const pos = node.parentId\n ? laid.position // children: ELK relative position\n : { x: laid.position.x, y: rootY.get(node.id) ?? laid.position.y }; // root: preserved order\n return { ...node, position: pos, width: laid.width, height: laid.height };\n });\n\n // Post-processing: equalise Lane widths within each Pool so all Lanes\n // span the full Pool width regardless of their individual content width.\n const lanesByPool = new Map<string, string[]>();\n for (const node of updatedNodes) {\n if (node.data.elementType === \"Lane\" && node.parentId) {\n const arr = lanesByPool.get(node.parentId) ?? [];\n arr.push(node.id);\n lanesByPool.set(node.parentId, arr);\n }\n }\n const nodeIndex = new Map(updatedNodes.map((n, i) => [n.id, i]));\n for (const laneIds of lanesByPool.values()) {\n const widths = laneIds.map((id) => updatedNodes[nodeIndex.get(id)!]?.width ?? 0);\n const maxWidth = Math.max(...widths);\n if (maxWidth <= 0) continue;\n for (const id of laneIds) {\n const idx = nodeIndex.get(id);\n if (idx !== undefined) {\n updatedNodes[idx] = { ...updatedNodes[idx], width: maxWidth };\n }\n }\n }\n\n // ── Fix 2: Identify cross-pool edges (source and target live in different root containers) ──\n // ELK routes them incorrectly when pools are laid out independently.\n // Clear their routingPoints so ReactFlow renders smooth default curves instead.\n const nodeRootContainer = new Map<string, string | null>();\n for (const node of updatedNodes) {\n nodeRootContainer.set(node.id, node.parentId ?? null);\n }\n const getRootContainer = (nodeId: string): string | null => {\n let current: string | null = nodeId;\n const visited = new Set<string>();\n while (current) {\n if (visited.has(current)) break;\n visited.add(current);\n const parent = nodeRootContainer.get(current);\n if (!parent) return current;\n current = parent;\n }\n return null;\n };\n\n const updatedEdges = edges.map((edge) => {\n const laid = edgeMap.get(edge.id);\n if (!laid) return edge;\n const nextData = { ...edge.data };\n const sourceRoot = getRootContainer(edge.source);\n const targetRoot = getRootContainer(edge.target);\n const isCrossPool = sourceRoot !== targetRoot;\n if (!isCrossPool && laid.points && laid.points.length > 0) {\n nextData.routingPoints = laid.points;\n } else {\n delete nextData.routingPoints;\n }\n return { ...edge, data: nextData };\n });\n\n return { nodes: updatedNodes, edges: updatedEdges as BpmnRFEdge[] };\n}\n","import type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport type { BpmnElementType } from \"../elements/types\";\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\nexport const LAYOUT_CONTAINER_TYPES = new Set<BpmnElementType>([\n \"Pool\", \"Lane\", \"SubProcess\", \"Transaction\", \"EventSubProcess\", \"AdHocSubProcess\",\n]);\n\nexport const LAYOUT_GATEWAY_TYPES = new Set<BpmnElementType>([\n \"ExclusiveGateway\", \"InclusiveGateway\", \"ParallelGateway\",\n \"EventBasedGateway\", \"ComplexGateway\",\n]);\n\n// ── Types ──────────────────────────────────────────────────────────────────\n\nexport interface LayoutEdgeInfo {\n id: string;\n source: string;\n target: string;\n /** ReactFlow handle id, e.g. \"source-top\" | \"source-right\" | \"source-bottom\" | \"source-left\" */\n sourceHandle?: string | null;\n}\n\n// ── Phase 1A: Back-edge detection (DFS) ───────────────────────────────────\n//\n// An edge A→B is a back-edge if B is in the \"gray\" (currently open) DFS stack\n// when A is processed — meaning B is an ancestor of A, creating a cycle.\n// Back-edges are excluded from column assignment so loops don't generate\n// infinite vertical layers.\n\nexport function detectBackEdges(\n nodeIds: string[],\n seqEdges: LayoutEdgeInfo[],\n): Set<string> {\n // Deterministic traversal: DFS start order and adjacency order are sorted by\n // id so the same graph always yields the same back-edge classification,\n // regardless of the order nodes/edges arrive in (load order, collab sync).\n const sortedIds = [...nodeIds].sort();\n const backEdgeIds = new Set<string>();\n const state = new Map<string, 0 | 1 | 2>(); // 0=unvisited 1=open 2=done\n for (const id of sortedIds) state.set(id, 0);\n\n const adj = new Map<string, Array<{ target: string; edgeId: string }>>();\n for (const id of sortedIds) adj.set(id, []);\n for (const e of seqEdges) {\n adj.get(e.source)?.push({ target: e.target, edgeId: e.id });\n }\n for (const list of adj.values()) {\n list.sort((a, b) =>\n a.target < b.target ? -1 : a.target > b.target ? 1 :\n a.edgeId < b.edgeId ? -1 : a.edgeId > b.edgeId ? 1 : 0,\n );\n }\n\n // Iterative DFS to avoid call-stack overflow on large diagrams.\n for (const startId of sortedIds) {\n if (state.get(startId) !== 0) continue;\n // Stack entries: [nodeId, iteratorIndex] — simulates recursive DFS\n const stack: Array<{ id: string; idx: number }> = [{ id: startId, idx: 0 }];\n state.set(startId, 1);\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n const neighbors = adj.get(top.id) ?? [];\n if (top.idx >= neighbors.length) {\n state.set(top.id, 2);\n stack.pop();\n continue;\n }\n const { target, edgeId } = neighbors[top.idx++];\n const tState = state.get(target);\n if (tState === 1) {\n backEdgeIds.add(edgeId); // gray → back-edge\n } else if (tState === 0) {\n state.set(target, 1);\n stack.push({ id: target, idx: 0 });\n }\n }\n }\n\n return backEdgeIds;\n}\n\n// ── Phase 1B: Sequence-flow extraction ────────────────────────────────────\n\nexport function extractSeqEdges(\n edges: BpmnRFEdge[],\n nodeIds: Set<string>,\n): LayoutEdgeInfo[] {\n return edges\n .filter(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return t === \"sequenceFlow\" && nodeIds.has(e.source) && nodeIds.has(e.target);\n })\n .map(e => ({ id: e.id, source: e.source, target: e.target, sourceHandle: e.sourceHandle ?? null }));\n}\n\n// ── Phase 2: Topological sort (Kahn) ──────────────────────────────────────\n\nexport function topologicalSort(\n nodeIds: string[],\n forwardEdges: LayoutEdgeInfo[],\n): string[] {\n const inDeg = new Map<string, number>(nodeIds.map(id => [id, 0]));\n const adj = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n\n for (const e of forwardEdges) {\n if (!inDeg.has(e.source) || !inDeg.has(e.target)) continue;\n adj.get(e.source)!.push(e.target);\n inDeg.set(e.target, (inDeg.get(e.target) ?? 0) + 1);\n }\n\n const queue = nodeIds.filter(id => (inDeg.get(id) ?? 0) === 0);\n const result: string[] = [];\n\n while (queue.length > 0) {\n const id = queue.shift()!;\n result.push(id);\n for (const next of adj.get(id) ?? []) {\n const d = (inDeg.get(next) ?? 1) - 1;\n inDeg.set(next, d);\n if (d === 0) queue.push(next);\n }\n }\n\n // Nodes not reached (isolated or residual cycles) appended at end.\n const seen = new Set(result);\n for (const id of nodeIds) {\n if (!seen.has(id)) result.push(id);\n }\n\n return result;\n}\n\n// ── Phase 2: Column assignment (longest-path on DAG) ──────────────────────\n//\n// column(node) = max(column(predecessors)) + 1\n// Start events / nodes with no predecessors get column 0.\n// Ensures nodes that depend on each other are in increasing columns.\n\nexport function assignColumns(\n nodeIds: string[],\n forwardEdges: LayoutEdgeInfo[],\n): Map<string, number> {\n const order = topologicalSort(nodeIds, forwardEdges);\n const col = new Map<string, number>(nodeIds.map(id => [id, 0]));\n\n const preds = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n for (const e of forwardEdges) {\n preds.get(e.target)?.push(e.source);\n }\n\n for (const id of order) {\n const predCols = (preds.get(id) ?? []).map(p => col.get(p) ?? 0);\n col.set(id, predCols.length > 0 ? Math.max(...predCols) + 1 : 0);\n }\n\n return col;\n}\n\n// ── Phase 1C: Split/merge pair detection ──────────────────────────────────\n//\n// Finds (split node) → (merge node) pairs.\n// The merge is the earliest node reachable by ALL branches of the split.\n// This defines the \"expansion zone\" for vertical branching.\n//\n// ANY node with 2+ outgoing forward edges is a split — not only gateways.\n// BPMN allows implicit splits (an activity with multiple outgoing sequence\n// flows); without this their successors collapse onto the same column+row.\n\nexport function detectGatewayPairs(\n nodes: BpmnRFNode[],\n forwardEdges: LayoutEdgeInfo[],\n): Map<string, string> {\n const pairs = new Map<string, string>();\n const nodeIds = nodes.map(n => n.id);\n\n const succs = new Map<string, string[]>(nodes.map(n => [n.id, []]));\n for (const e of forwardEdges) {\n succs.get(e.source)?.push(e.target);\n }\n\n const order = topologicalSort(nodeIds, forwardEdges);\n const topoPos = new Map(order.map((id, i) => [id, i]));\n\n const splits = nodes.filter(n => (succs.get(n.id)?.length ?? 0) > 1);\n\n for (const split of splits) {\n const branches = succs.get(split.id) ?? [];\n if (branches.length < 2) continue;\n\n // BFS reachability per branch (stops at nodes already visited to stay fast)\n const branchSets: Set<string>[] = branches.map(start => {\n const visited = new Set<string>();\n const q = [start];\n while (q.length) {\n const curr = q.shift()!;\n if (visited.has(curr)) continue;\n visited.add(curr);\n for (const next of succs.get(curr) ?? []) q.push(next);\n }\n return visited;\n });\n\n // Intersection: nodes reachable from ALL branches\n const common = [...branchSets[0]].filter(id =>\n branchSets.every(s => s.has(id))\n );\n if (common.length === 0) continue;\n\n // Pick the topologically earliest common node as the merge gateway\n const merge = common.reduce((a, b) =>\n (topoPos.get(a) ?? Infinity) < (topoPos.get(b) ?? Infinity) ? a : b\n );\n\n pairs.set(split.id, merge);\n }\n\n return pairs;\n}\n\n// ── Phase 3: Row assignment ────────────────────────────────────────────────\n//\n// The main flow stays at row 0. Each branch of a split gateway gets a row\n// offset: primary branch → 0, secondary → +1, tertiary → -1, etc.\n// Nested gateways inherit their parent branch's base row.\n//\n// Secondary row offsets alternate around the trunk:\n// -1, +1, -2, +2, -3, +3 ...\n\nfunction createSecondaryOffsets(count: number): number[] {\n if (count <= 0) return [];\n const offsets: number[] = [];\n let step = 1;\n while (offsets.length < count) {\n offsets.push(-step);\n if (offsets.length < count) offsets.push(step);\n step++;\n }\n return offsets;\n}\n\n// Maps a sourceHandle string (e.g. \"source-top\") to a preferred row direction.\n// \"right\" → 0 (main horizontal flow), \"bottom\" → +1, \"top\" → -1, \"left\" → 0.\nfunction handleToRowBias(handle: string | null | undefined): number | null {\n if (!handle) return null;\n if (handle.includes(\"top\")) return -1;\n if (handle.includes(\"bottom\")) return 1;\n if (handle.includes(\"right\")) return 0;\n return null;\n}\n\n// Build a map: sourceId → Map<targetId, sourceHandle>\nfunction buildHandleMap(edges: LayoutEdgeInfo[]): Map<string, Map<string, string | null>> {\n const map = new Map<string, Map<string, string | null>>();\n for (const e of edges) {\n if (!map.has(e.source)) map.set(e.source, new Map());\n map.get(e.source)!.set(e.target, e.sourceHandle ?? null);\n }\n return map;\n}\n\ninterface BranchRowData {\n start: string;\n nodeIds: string[];\n bias: number | null;\n}\n\n/** Aggregated vertical pull of a branch from per-node bias values (e.g.\n * cross-lane handoffs: +1 pulls toward the lane below, -1 above). Returns\n * null when the branch has no net pull. */\nfunction branchPullBias(\n nodeIds: string[],\n nodeBias: Map<string, number> | undefined,\n): number | null {\n if (!nodeBias) return null;\n let sum = 0;\n for (const id of nodeIds) sum += nodeBias.get(id) ?? 0;\n if (sum === 0) return null;\n return sum > 0 ? 1 : -1;\n}\n\nfunction pickMainBranch(branchData: BranchRowData[]): string | undefined {\n if (branchData.length === 0) return undefined;\n return [...branchData].sort((a, b) => {\n // Rank: explicit \"right\" handle (bias 0) > no bias > vertically-biased.\n // A branch the user routed top/bottom (or an exception flow, which is\n // bottom-biased) must never become the horizontal trunk.\n const rank = (branch: BranchRowData) =>\n branch.bias === 0 ? 2 : branch.bias === null ? 1 : 0;\n if (rank(a) !== rank(b)) return rank(b) - rank(a);\n if (a.nodeIds.length !== b.nodeIds.length) return b.nodeIds.length - a.nodeIds.length;\n return a.start.localeCompare(b.start);\n })[0]?.start;\n}\n\nfunction resolveDirectionalRow(\n splitRow: number,\n preferredOffset: number,\n usedRows: Set<number>,\n): number {\n if (preferredOffset === 0 && !usedRows.has(splitRow)) return splitRow;\n const direction = preferredOffset < 0 ? -1 : 1;\n let distance = Math.max(1, Math.abs(preferredOffset));\n while (usedRows.has(splitRow + direction * distance)) distance++;\n return splitRow + direction * distance;\n}\n\nfunction assignBranchRowsAroundMain(\n branchData: BranchRowData[],\n splitRow: number,\n): Map<string, number> {\n const assigned = new Map<string, number>();\n const mainBranchStart = pickMainBranch(branchData);\n if (mainBranchStart) assigned.set(mainBranchStart, splitRow);\n\n const usedRows = new Set<number>(assigned.values());\n const remaining = branchData.filter((branch) => branch.start !== mainBranchStart);\n const withBias = remaining\n .filter((branch) => branch.bias !== null && branch.bias !== 0)\n .sort((a, b) => {\n const aMag = Math.abs(a.bias ?? 0);\n const bMag = Math.abs(b.bias ?? 0);\n if (aMag !== bMag) return aMag - bMag;\n return a.start.localeCompare(b.start);\n });\n const withoutBias = remaining\n .filter((branch) => branch.bias === null || branch.bias === 0)\n .sort((a, b) => b.nodeIds.length - a.nodeIds.length || a.start.localeCompare(b.start));\n\n for (const branch of withBias) {\n const row = resolveDirectionalRow(splitRow, branch.bias ?? 0, usedRows);\n assigned.set(branch.start, row);\n usedRows.add(row);\n }\n\n const preferredOffsets = createSecondaryOffsets(withoutBias.length);\n for (let i = 0; i < withoutBias.length; i++) {\n let row = splitRow + preferredOffsets[i];\n if (usedRows.has(row)) {\n row = resolveDirectionalRow(splitRow, preferredOffsets[i], usedRows);\n }\n assigned.set(withoutBias[i].start, row);\n usedRows.add(row);\n }\n\n return assigned;\n}\n\nexport function assignRows(\n nodes: BpmnRFNode[],\n forwardEdges: LayoutEdgeInfo[],\n columns: Map<string, number>,\n gatewayPairs: Map<string, string>,\n nodeBias?: Map<string, number>,\n): Map<string, number> {\n const rows = new Map<string, number>(nodes.map(n => [n.id, 0]));\n\n const succs = new Map<string, string[]>(nodes.map(n => [n.id, []]));\n for (const e of forwardEdges) {\n succs.get(e.source)?.push(e.target);\n }\n\n // sourceHandle lookup: for each gateway, which handle connects to each branch start.\n const handleMap = buildHandleMap(forwardEdges);\n\n // Process pairs from shallowest (leftmost column) to deepest: the outer\n // split assigns base rows to entire branches first, then each inner split\n // re-fans its own branches around the row it inherited. Processing deepest\n // first let the outer pass overwrite (flatten) inner fan-outs — bug 1.\n const sortedPairs = [...gatewayPairs.entries()].sort(\n (a, b) => (columns.get(a[0]) ?? 0) - (columns.get(b[0]) ?? 0)\n );\n\n for (const [splitId, mergeId] of sortedPairs) {\n const branches = succs.get(splitId) ?? [];\n if (branches.length < 2) continue;\n\n const splitRow = rows.get(splitId) ?? 0;\n\n // Collect nodes strictly between this split and its merge for each branch.\n const getBranchNodes = (branchStart: string): string[] => {\n const result: string[] = [];\n const visited = new Set<string>();\n const q = [branchStart];\n while (q.length) {\n const curr = q.shift()!;\n if (visited.has(curr) || curr === mergeId) continue;\n visited.add(curr);\n result.push(curr);\n for (const next of succs.get(curr) ?? []) q.push(next);\n }\n return result;\n };\n\n const splitHandles = handleMap.get(splitId);\n const branchData = branches.map(start => {\n const nodeIds = getBranchNodes(start);\n return {\n start,\n nodeIds,\n bias: handleToRowBias(splitHandles?.get(start) ?? null)\n ?? branchPullBias(nodeIds, nodeBias),\n };\n });\n\n const assigned = assignBranchRowsAroundMain(branchData, splitRow);\n\n for (const b of branchData) {\n const row = assigned.get(b.start) ?? splitRow;\n for (const id of b.nodeIds) {\n rows.set(id, row);\n }\n }\n rows.set(mergeId, splitRow);\n }\n\n // ── Second pass: terminal splits (no merge detected) ──────────────────────\n // Splits whose branches all terminate at End Events (no common successor)\n // don't appear in gatewayPairs. Without this pass they'd all share row 0,\n // causing their terminal nodes to overlap. Includes implicit splits\n // (non-gateway nodes with 2+ outgoing flows) — bug 10.\n const pairedSplits = new Set(gatewayPairs.keys());\n\n const unpairedSplits = nodes.filter(n =>\n !pairedSplits.has(n.id) &&\n (succs.get(n.id)?.length ?? 0) > 1\n );\n\n for (const split of unpairedSplits) {\n const branches = succs.get(split.id) ?? [];\n if (branches.length < 2) continue;\n\n const splitRow = rows.get(split.id) ?? 0;\n\n // Collect all reachable nodes for each branch (no merge to stop at).\n const getAllReachable = (start: string): string[] => {\n const result: string[] = [];\n const visited = new Set<string>();\n const q = [start];\n while (q.length) {\n const curr = q.shift()!;\n if (visited.has(curr)) continue;\n visited.add(curr);\n result.push(curr);\n for (const next of succs.get(curr) ?? []) q.push(next);\n }\n return result;\n };\n\n const splitHandles2 = handleMap.get(split.id);\n const branchData = branches.map(start => {\n const nodeIds = getAllReachable(start);\n return {\n start,\n nodeIds,\n bias: handleToRowBias(splitHandles2?.get(start) ?? null)\n ?? branchPullBias(nodeIds, nodeBias),\n };\n });\n\n const assigned2 = assignBranchRowsAroundMain(branchData, splitRow);\n\n for (const b of branchData) {\n const row = assigned2.get(b.start) ?? splitRow;\n for (const id of b.nodeIds) rows.set(id, row);\n }\n }\n\n return rows;\n}\n\n// ── Helpers ────────────────────────────────────────────────────────────────\n\nexport function buildSuccessors(\n nodeIds: string[],\n edges: LayoutEdgeInfo[],\n): Map<string, string[]> {\n const map = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n for (const e of edges) {\n map.get(e.source)?.push(e.target);\n }\n return map;\n}\n\nexport function buildPredecessors(\n nodeIds: string[],\n edges: LayoutEdgeInfo[],\n): Map<string, string[]> {\n const map = new Map<string, string[]>(nodeIds.map(id => [id, []]));\n for (const e of edges) {\n map.get(e.target)?.push(e.source);\n }\n return map;\n}\n","import type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport type { BpmnElementType } from \"../elements/types\";\nimport {\n LAYOUT_CONTAINER_TYPES,\n LAYOUT_GATEWAY_TYPES,\n detectBackEdges,\n extractSeqEdges,\n assignColumns,\n detectGatewayPairs,\n assignRows,\n} from \"./bpmn-layout-graph\";\n\n// ── Layout constants ───────────────────────────────────────────────────────\n//\n// Calibrated against professional BPMN tools (Bizagi, Appian, Camunda).\n// The guiding principle: the pool should be wide enough to be readable but\n// compact enough to feel organized — not \"airy\".\n//\n// Key ratios (approximate):\n// task_width / col_step = 120 / (120+60) ≈ 0.67 (node takes 2/3 of each step)\n// row_slot / row_step = 90 / (90+50) ≈ 0.64 (similar balance vertically)\n\nconst LANE_LABEL_W = 28; // left vertical label strip\nconst LANE_H_PAD = 32; // gap between label strip and first node column\nconst COL_GAP = 60; // routing corridor between columns\nconst ROW_HEIGHT = 90; // vertical slot per row (fits any node type)\nconst ROW_GAP = 50; // gap between parallel rows in a branch\nconst LANE_V_PAD = 48; // top/bottom breathing room inside each lane\nconst POOL_H_PAD = 64; // padding for nodes placed directly in pool\nconst POOL_V_GAP = 48; // vertical gap between separate pools\nconst LANE_MIN_H = 180; // minimum lane height\nconst POOL_MIN_W = 720; // minimum pool width\nconst POOL_INNER_PAD = 10; // pool border → lane edge gap\nconst BACK_EDGE_CLEARANCE = 56; // px above topmost node for loop arcs\nconst EDGE_ROUTE_PAD = 28; // horizontal/vertical breathing room for elbow routes\n\n// ── Element-type sets ──────────────────────────────────────────────────────\n\n/**\n * Artifact types that do NOT participate in sequence-flow column/row assignment.\n * They are positioned after the main layout, near the node they are associated\n * with via an association or dataAssociation edge.\n */\nconst LAYOUT_ARTIFACT_TYPES = new Set<BpmnElementType>([\n \"DataObject\", \"DataObjectReference\", \"DataInput\", \"DataOutput\",\n \"DataStore\", \"DataStoreReference\", \"Annotation\", \"Group\",\n]);\n\n/**\n * Sub-process variants that are treated as large task nodes (content) when\n * collapsed. They participate in column/row assignment and get positioned in\n * the flow. When expanded their children have a different parentId and are\n * handled separately.\n */\nconst COLLAPSED_SUBPROCESS_TYPES = new Set<BpmnElementType>([\n \"SubProcess\", \"Transaction\", \"EventSubProcess\", \"AdHocSubProcess\",\n]);\n\n// ── Task minimum layout sizes ──────────────────────────────────────────────\n//\n// BPMN catalog defaults are 120×60 — readable in isolation but cramped when\n// multiple tasks share lanes and labels have two or more words. The layout\n// engine enforces a larger minimum for SPACING and COLUMN-WIDTH purposes.\n// Nodes whose stored size is already larger are never shrunk.\n//\n// applyLayoutMinSize() stamps the minimum onto the output node so ReactFlow\n// renders the task at a comfortable size after auto-layout.\n\nconst LAYOUT_TASK_TYPES = new Set<BpmnElementType>([\n \"Task\", \"UserTask\", \"ServiceTask\", \"ScriptTask\",\n \"ManualTask\", \"BusinessRuleTask\", \"ReceiveTask\", \"SendTask\", \"CallActivity\",\n]);\n\nconst TASK_LAYOUT_MIN_W = 130; // minimum for two-word labels (catalog default is 120)\nconst TASK_LAYOUT_MIN_H = 80; // taller than 60 — closer to Appian/Bizagi proportions\n\n// Collapsed subprocesses use the catalog default as their floor. AI-generated\n// diagrams have produced 209×25 subprocess shapes — without this floor the\n// layout renders them as unreadable slivers next to full-size tasks.\nconst SUBPROCESS_LAYOUT_MIN_W = 160;\nconst SUBPROCESS_LAYOUT_MIN_H = 80;\n\n/** Layout-minimum size for a node, or null when no floor applies.\n * Expanded subprocesses are excluded — layoutSubProcess computes their size. */\nfunction layoutMinSize(node: BpmnRFNode): { w: number; h: number } | null {\n if (LAYOUT_TASK_TYPES.has(node.data.elementType)) {\n return { w: TASK_LAYOUT_MIN_W, h: TASK_LAYOUT_MIN_H };\n }\n if (COLLAPSED_SUBPROCESS_TYPES.has(node.data.elementType) && !node.data.isExpanded) {\n return { w: SUBPROCESS_LAYOUT_MIN_W, h: SUBPROCESS_LAYOUT_MIN_H };\n }\n return null;\n}\n\n// ── Node size helpers ──────────────────────────────────────────────────────\n\nfunction nW(node: BpmnRFNode): number {\n return node.width ?? (node.measured as { width?: number } | undefined)?.width ?? 120;\n}\nfunction nH(node: BpmnRFNode): number {\n return node.height ?? (node.measured as { height?: number } | undefined)?.height ?? 60;\n}\n\n/** Width used for column-width computation and centering within a slot.\n * Floored nodes (tasks, collapsed subprocesses) get a comfortably wide\n * column even if their stored width is smaller. */\nfunction layoutW(node: BpmnRFNode): number {\n const min = layoutMinSize(node);\n return min ? Math.max(nW(node), min.w) : nW(node);\n}\n\n/** Height used for row-height computation. Mirrors layoutW. */\nfunction layoutH(node: BpmnRFNode): number {\n const min = layoutMinSize(node);\n return min ? Math.max(nH(node), min.h) : nH(node);\n}\n\n// ── Column width with label reservation ──────────────────────────────────────\n//\n// Gateways and events render their label OUTSIDE the shape (below it), so a\n// 44px diamond with \"¿El cliente es Flat?\" needs far more column width than\n// its geometry suggests — otherwise neighboring columns sit on the text.\n\nconst LABEL_RESERVE_TYPES = new Set<BpmnElementType>([\n ...LAYOUT_GATEWAY_TYPES,\n \"StartEvent\", \"EndEvent\", \"IntermediateCatchEvent\", \"IntermediateThrowEvent\",\n]);\nconst LABEL_CHAR_W = 6.5; // rough average label glyph width at canvas font size\nconst LABEL_RESERVE_MAX = 150; // labels longer than this wrap — don't widen further\n\n/** Width a node needs for COLUMN sizing: its layout width, or the estimated\n * width of its external label, whichever is larger. */\nfunction columnW(node: BpmnRFNode): number {\n const base = layoutW(node);\n if (!LABEL_RESERVE_TYPES.has(node.data.elementType)) return base;\n const label = typeof node.data.label === \"string\" ? node.data.label : \"\";\n if (!label) return base;\n const reserve = Math.min(Math.ceil(label.length * LABEL_CHAR_W), LABEL_RESERVE_MAX);\n return Math.max(base, reserve);\n}\n\n/** Stamps the layout-minimum dimensions onto the output node so ReactFlow\n * renders tasks at a readable size after auto-layout. Nodes already larger\n * than the minimum are returned unchanged. */\nfunction applyLayoutMinSize(node: BpmnRFNode): BpmnRFNode {\n if (!layoutMinSize(node)) return node;\n const w = layoutW(node);\n const h = layoutH(node);\n if (w === nW(node) && h === nH(node)) return node;\n return { ...node, width: w, height: h, measured: { width: w, height: h } };\n}\n\n// ── Row metrics: per-row heights that respect tall nodes ─────────────────────\n//\n// A row slot is at least ROW_HEIGHT, but grows to the tallest node assigned\n// to that row (e.g. an expanded SubProcess with several internal rows).\n// Fixed-height slots made tall nodes overflow their lane/subprocess — bug 7.\n\ninterface RowMetrics {\n minRow: number;\n maxRow: number;\n rowH: Map<number, number>; // slot height per row\n rowY: Map<number, number>; // row top offset within the content block\n contentH: number;\n}\n\nfunction computeRowMetrics(\n contextNodes: BpmnRFNode[],\n rows: Map<string, number>,\n includeRowZero: boolean,\n): RowMetrics {\n const vals = contextNodes.map(n => rows.get(n.id) ?? 0);\n const base = includeRowZero ? [0, ...vals] : vals;\n const minRow = Math.min(...base);\n const maxRow = Math.max(...base);\n\n const rowH = new Map<number, number>();\n for (let r = minRow; r <= maxRow; r++) rowH.set(r, ROW_HEIGHT);\n for (const node of contextNodes) {\n const r = rows.get(node.id) ?? 0;\n rowH.set(r, Math.max(rowH.get(r) ?? ROW_HEIGHT, layoutH(node)));\n }\n\n const rowY = new Map<number, number>();\n let y = 0;\n for (let r = minRow; r <= maxRow; r++) {\n rowY.set(r, y);\n y += (rowH.get(r) ?? ROW_HEIGHT) + ROW_GAP;\n }\n\n return { minRow, maxRow, rowH, rowY, contentH: y - ROW_GAP };\n}\n\n// ── Exception-flow edge re-anchoring ───────────────────────────────────────\n//\n// BoundaryEvents are excluded from column/row assignment, which used to drop\n// their outgoing edges entirely — exception-handler chains fell back to\n// column 0. For GRAPH purposes (columns/rows only, not rendering), edges\n// leaving a BoundaryEvent are re-anchored to the boundary's HOST with a\n// bottom bias: the handler chain gets a column after the host and fans out\n// downward, like any other branch.\n\nfunction reanchorBoundaryEdges(\n edges: BpmnRFEdge[],\n boundaryEvents: BpmnRFNode[],\n contentIds: Set<string>,\n): BpmnRFEdge[] {\n if (boundaryEvents.length === 0) return edges;\n const hostByBoundaryId = new Map<string, string>();\n for (const be of boundaryEvents) {\n if (be.data.attachedToRef) hostByBoundaryId.set(be.id, be.data.attachedToRef);\n }\n if (hostByBoundaryId.size === 0) return edges;\n\n return edges.map(edge => {\n const host = hostByBoundaryId.get(edge.source);\n return host && contentIds.has(host)\n ? { ...edge, source: host, sourceHandle: \"source-bottom\" }\n : edge;\n });\n}\n\n// ── BoundaryEvent repositioning ────────────────────────────────────────────\n//\n// BoundaryEvents are excluded from column/row assignment (they have no\n// independent position in the sequence flow — they are anchored to their host).\n// After the main content is positioned, this function places each BoundaryEvent\n// at the bottom border of its host task, spacing multiple events horizontally.\n\nconst BOUNDARY_SPACING = 10; // px gap between multiple boundary events on same host\n\nfunction repositionBoundaryEvents(\n boundaryEvents: BpmnRFNode[],\n positionedContent: BpmnRFNode[],\n): BpmnRFNode[] {\n if (boundaryEvents.length === 0) return [];\n\n const hostById = new Map(positionedContent.map(n => [n.id, n]));\n\n // Group boundary events by their host.\n const byHost = new Map<string, BpmnRFNode[]>();\n for (const be of boundaryEvents) {\n const hostId = be.data.attachedToRef;\n if (!hostId) continue;\n if (!byHost.has(hostId)) byHost.set(hostId, []);\n byHost.get(hostId)!.push(be);\n }\n\n const result: BpmnRFNode[] = [];\n\n for (const be of boundaryEvents) {\n const hostId = be.data.attachedToRef;\n if (!hostId) { result.push(be); continue; }\n\n const host = hostById.get(hostId);\n if (!host) { result.push(be); continue; }\n\n const hostGroup = byHost.get(hostId)!;\n const siblingIdx = hostGroup.findIndex(n => n.id === be.id);\n\n const hostW = layoutW(host);\n const hostH = layoutH(host);\n const beH = nH(be);\n\n // Center the group horizontally on the host's bottom edge.\n const totalGroupW = hostGroup.reduce((s, b) => s + nW(b), 0) +\n (hostGroup.length - 1) * BOUNDARY_SPACING;\n const groupStartX = host.position.x + hostW / 2 - totalGroupW / 2;\n const offsetX = hostGroup\n .slice(0, siblingIdx)\n .reduce((s, b) => s + nW(b) + BOUNDARY_SPACING, 0);\n\n // Center the boundary event circle on the host's bottom border.\n result.push({\n ...be,\n position: {\n x: groupStartX + offsetX,\n y: host.position.y + hostH - beH / 2,\n },\n });\n }\n\n return result;\n}\n\n// ── SubProcess expanded layout ─────────────────────────────────────────────\n//\n// When a SubProcess (or Transaction / EventSubProcess / AdHocSubProcess) is\n// expanded, its children must be laid out inside it using the same column/row\n// algorithm as the pool layout. This function:\n// 1. Runs column/row assignment on the direct children.\n// 2. Computes the SubProcess container size to fit all children.\n// 3. Returns children with SubProcess-relative positions.\n//\n// The result is pre-computed BEFORE the main pool layout so the SubProcess's\n// final size is available for column-width calculation.\n\nconst SP_PAD = 48; // padding inside a SubProcess on every side\n\ninterface SubProcessResult {\n children: BpmnRFNode[]; // repositioned with SubProcess-relative coordinates\n width: number;\n height: number;\n}\n\nfunction layoutSubProcess(\n children: BpmnRFNode[], // direct children of the SubProcess\n edges: BpmnRFEdge[],\n): SubProcessResult {\n if (children.length === 0) {\n return { children: [], width: 280, height: 160 };\n }\n\n // Separate BoundaryEvents — they are anchored after content is positioned.\n const boundaryEvents = children.filter(n => n.data.elementType === \"BoundaryEvent\");\n const mainChildren = children.filter(n => n.data.elementType !== \"BoundaryEvent\");\n\n if (mainChildren.length === 0) {\n return {\n children: repositionBoundaryEvents(boundaryEvents, []),\n width: 280,\n height: 160,\n };\n }\n\n // ── Column assignment ──────────────────────────────────────────────────────\n const contentIds = new Set(mainChildren.map(n => n.id));\n const graphEdges = reanchorBoundaryEdges(edges, boundaryEvents, contentIds);\n const seqEdges = extractSeqEdges(graphEdges, contentIds);\n const backIds = detectBackEdges([...contentIds], seqEdges);\n const fwdEdges = seqEdges.filter(e => !backIds.has(e.id));\n\n const columns = assignColumns([...contentIds], fwdEdges);\n\n // ── Row assignment (single-context — no lanes inside a SubProcess) ─────────\n const pairs = detectGatewayPairs(mainChildren, fwdEdges);\n const rows = assignRows(mainChildren, fwdEdges, columns, pairs);\n\n // ── Column widths and X offsets (columnW = layout width + label reserve) ───\n const maxCol = Math.max(0, ...[...columns.values()]);\n const colW = new Map<number, number>();\n for (let c = 0; c <= maxCol; c++) colW.set(c, 0);\n for (const node of mainChildren) {\n const c = columns.get(node.id) ?? 0;\n colW.set(c, Math.max(colW.get(c) ?? 0, columnW(node)));\n }\n\n const colX = new Map<number, number>();\n let cumX = 0;\n for (let c = 0; c <= maxCol; c++) {\n colX.set(c, cumX);\n cumX += (colW.get(c) ?? 120) + COL_GAP;\n }\n const contentW = cumX - COL_GAP;\n\n // ── Row stats (per-row heights respect tall nodes) ────────────────────────\n const rowMetrics = computeRowMetrics(mainChildren, rows, true);\n\n // ── Container size ─────────────────────────────────────────────────────────\n const spW = Math.max(280, SP_PAD * 2 + contentW);\n const spH = Math.max(160, SP_PAD * 2 + rowMetrics.contentH);\n\n // ── Position children ─────────────────────────────────────────────────────\n const positionedChildren = mainChildren.map(node => {\n const c = columns.get(node.id) ?? 0;\n const r = rows.get(node.id) ?? 0;\n const lw = layoutW(node);\n const lh = layoutH(node);\n\n const colOffset = (colX.get(c) ?? 0) + (colW.get(c) ?? 120) / 2 - lw / 2;\n const rowOffset = (rowMetrics.rowY.get(r) ?? 0) + (rowMetrics.rowH.get(r) ?? ROW_HEIGHT) / 2 - lh / 2;\n\n return applyLayoutMinSize({ ...node, position: { x: SP_PAD + colOffset, y: SP_PAD + rowOffset } });\n });\n\n const positionedBoundaries = repositionBoundaryEvents(boundaryEvents, positionedChildren);\n\n return {\n children: [...positionedChildren, ...positionedBoundaries],\n width: spW,\n height: spH,\n };\n}\n\n// ── Per-pool layout ────────────────────────────────────────────────────────\n\ninterface PoolResult {\n nodes: BpmnRFNode[];\n width: number;\n height: number;\n}\n\nfunction layoutPool(\n pool: BpmnRFNode,\n lanes: BpmnRFNode[],\n content: BpmnRFNode[], // full pool content — may include BoundaryEvents\n allEdges: BpmnRFEdge[],\n): PoolResult {\n\n // ── Separate BoundaryEvents from the main flow content ────────────────────\n // BoundaryEvents are anchored to their host node — they do not participate\n // in column/row assignment. They are repositioned after layout completes.\n\n const boundaryEvents = content.filter(n => n.data.elementType === \"BoundaryEvent\");\n const mainContent = content.filter(n => n.data.elementType !== \"BoundaryEvent\");\n\n // ── Empty pool ────────────────────────────────────────────────────────────\n\n if (mainContent.length === 0) {\n const positionedBoundaries = repositionBoundaryEvents(boundaryEvents, []);\n if (lanes.length === 0) {\n return { nodes: positionedBoundaries, width: 300, height: 140 };\n }\n const laneH = LANE_MIN_H;\n const h = POOL_INNER_PAD * 2 + lanes.length * laneH +\n Math.max(0, lanes.length - 1) * POOL_INNER_PAD;\n return {\n nodes: [\n ...positionedBoundaries,\n ...lanes.map((lane, i) => ({\n ...lane,\n position: { x: POOL_INNER_PAD, y: POOL_INNER_PAD + i * (laneH + POOL_INNER_PAD) },\n width: POOL_MIN_W - POOL_INNER_PAD * 2,\n height: laneH,\n })),\n ],\n width: POOL_MIN_W,\n height: h,\n };\n }\n\n // ── Lane ordering ─────────────────────────────────────────────────────────\n // Always sort by pool-relative Y so manual lane reordering is respected.\n // If the user dragged Lane B above Lane A, B has the smaller position.y and\n // must come first — the old conditional check could silently ignore that.\n // When lanes are freshly created at y=0 the sort is stable (creation order).\n\n const sortedLanes = [...lanes].sort((a, b) => a.position.y - b.position.y);\n const hasLanes = sortedLanes.length > 0;\n\n const laneIdSet = new Set(sortedLanes.map(l => l.id));\n const nodeLaneId = new Map<string, string>();\n for (const node of mainContent) {\n const lId = hasLanes && node.parentId && laneIdSet.has(node.parentId)\n ? node.parentId\n : \"_pool_\";\n nodeLaneId.set(node.id, lId);\n }\n\n // ── Phase 1: Global column assignment ────────────────────────────────────\n // Cross-lane edges participate so nodes in different lanes are aligned\n // horizontally when they are sequentially connected.\n\n const contentIds = new Set(mainContent.map(n => n.id));\n const graphEdges = reanchorBoundaryEdges(allEdges, boundaryEvents, contentIds);\n const seqEdges = extractSeqEdges(graphEdges, contentIds);\n const backIds = detectBackEdges([...contentIds], seqEdges);\n const fwdEdges = seqEdges.filter(e => !backIds.has(e.id));\n\n const columns = assignColumns([...contentIds], fwdEdges);\n\n // ── Phase 2: Per-lane row assignment ─────────────────────────────────────\n // Rows are computed independently per lane using only intra-lane edges.\n // This prevents cross-lane gateway branches from inflating lane heights.\n\n const rows = new Map<string, number>();\n\n const contentByLane = new Map<string, BpmnRFNode[]>();\n for (const node of mainContent) {\n const lId = nodeLaneId.get(node.id) ?? \"_pool_\";\n if (!contentByLane.has(lId)) contentByLane.set(lId, []);\n contentByLane.get(lId)!.push(node);\n }\n\n // Cross-lane pull: a branch whose flow hands off to another lane should sit\n // on THAT side of the trunk, so the handoff edge leaves without crossing\n // the main row. +1 pulls toward lanes below, -1 toward lanes above.\n const laneStackIndex = new Map<string, number>();\n sortedLanes.forEach((laneNode, index) => laneStackIndex.set(laneNode.id, index));\n laneStackIndex.set(\"_pool_\", sortedLanes.length);\n const crossLanePull = new Map<string, number>();\n for (const e of fwdEdges) {\n const sLane = nodeLaneId.get(e.source) ?? \"_pool_\";\n const tLane = nodeLaneId.get(e.target) ?? \"_pool_\";\n if (sLane === tLane) continue;\n const dir = Math.sign((laneStackIndex.get(tLane) ?? 0) - (laneStackIndex.get(sLane) ?? 0));\n crossLanePull.set(e.source, (crossLanePull.get(e.source) ?? 0) + dir);\n crossLanePull.set(e.target, (crossLanePull.get(e.target) ?? 0) - dir);\n }\n\n for (const [, laneNodes] of contentByLane) {\n const laneNodeIds = new Set(laneNodes.map(n => n.id));\n const intraEdges = fwdEdges.filter(\n e => laneNodeIds.has(e.source) && laneNodeIds.has(e.target),\n );\n const lanePairs = detectGatewayPairs(laneNodes, intraEdges);\n const laneRows = assignRows(laneNodes, intraEdges, columns, lanePairs, crossLanePull);\n for (const [id, row] of laneRows) rows.set(id, row);\n }\n\n // Event subprocesses have no sequence flows — left in the graph they land\n // on column 0 / row 0, colliding with the start event. Convention (Camunda)\n // places them BELOW the lane's main flow, so drop each one to a row under\n // its lane's content.\n const seqTouched = new Set<string>();\n for (const e of seqEdges) { seqTouched.add(e.source); seqTouched.add(e.target); }\n for (const [, laneNodes] of contentByLane) {\n const eventSPs = laneNodes.filter(\n n => n.data.elementType === \"EventSubProcess\" && !seqTouched.has(n.id),\n );\n if (eventSPs.length === 0) continue;\n const eventSpIds = new Set(eventSPs.map(n => n.id));\n const otherRows = laneNodes\n .filter(n => !eventSpIds.has(n.id))\n .map(n => rows.get(n.id) ?? 0);\n const laneMaxRow = otherRows.length > 0 ? Math.max(...otherRows) : -1;\n for (const sp of eventSPs) rows.set(sp.id, laneMaxRow + 1);\n }\n\n // ── Phase 3: Per-lane row statistics ──────────────────────────────────────\n // When lanes exist, nodes that are DIRECT pool children map to the virtual\n // \"_pool_\" context. It must be part of laneIds so it gets stats/columns and\n // its band stacks below the real lanes — omitting it crashed Phase 6.\n\n const hasPoolDirectContent = [...nodeLaneId.values()].includes(\"_pool_\");\n const laneIds = hasLanes\n ? [...sortedLanes.map(l => l.id), ...(hasPoolDirectContent ? [\"_pool_\"] : [])]\n : [\"_pool_\"];\n\n interface LaneStat {\n minRow: number; maxRow: number; height: number; contentH: number;\n rowH: Map<number, number>; rowY: Map<number, number>;\n }\n const laneStats = new Map<string, LaneStat>();\n\n for (const laneId of laneIds) {\n const laneNodes = mainContent.filter(n => nodeLaneId.get(n.id) === laneId);\n\n if (laneNodes.length === 0) {\n laneStats.set(laneId, {\n minRow: 0, maxRow: 0, height: LANE_MIN_H, contentH: ROW_HEIGHT,\n rowH: new Map([[0, ROW_HEIGHT]]), rowY: new Map([[0, 0]]),\n });\n } else {\n const m = computeRowMetrics(laneNodes, rows, false);\n const height = Math.max(LANE_MIN_H, LANE_V_PAD * 2 + m.contentH);\n laneStats.set(laneId, {\n minRow: m.minRow, maxRow: m.maxRow, height,\n contentH: m.contentH, rowH: m.rowH, rowY: m.rowY,\n });\n }\n }\n\n // ── Phase 4: Per-lane compacted columns ───────────────────────────────────\n // We keep the global DAG column numbers for ordering semantics, but compact\n // each lane independently so empty columns caused by other lanes do not\n // create large visual gaps.\n\n interface LaneColumnLayout {\n colW: Map<number, number>;\n colX: Map<number, number>;\n contentW: number;\n }\n\n const laneColumnLayouts = new Map<string, LaneColumnLayout>();\n\n for (const laneId of laneIds) {\n const laneNodes = mainContent.filter(\n (node) => (nodeLaneId.get(node.id) ?? \"_pool_\") === laneId,\n );\n const usedCols = [...new Set(laneNodes.map((node) => columns.get(node.id) ?? 0))]\n .sort((a, b) => a - b);\n\n const colW = new Map<number, number>();\n for (const col of usedCols) colW.set(col, 0);\n for (const node of laneNodes) {\n const col = columns.get(node.id) ?? 0;\n colW.set(col, Math.max(colW.get(col) ?? 0, columnW(node)));\n }\n\n const colX = new Map<number, number>();\n let laneCumX = 0;\n for (const col of usedCols) {\n colX.set(col, laneCumX);\n laneCumX += (colW.get(col) ?? 120) + COL_GAP;\n }\n\n laneColumnLayouts.set(laneId, {\n colW,\n colX,\n contentW: usedCols.length > 0 ? laneCumX - COL_GAP : 0,\n });\n }\n\n // ── Phase 5: Pool and lane dimensions ─────────────────────────────────────\n\n const baseLaneInnerW = Math.max(\n 0,\n ...laneIds\n .filter((laneId) => laneId !== \"_pool_\")\n .map((laneId) => {\n const contentW = laneColumnLayouts.get(laneId)?.contentW ?? 0;\n return LANE_LABEL_W + LANE_H_PAD + contentW + LANE_H_PAD;\n }),\n );\n const basePoolInnerW = Math.max(\n 0,\n ...laneIds\n .filter((laneId) => laneId === \"_pool_\")\n .map((laneId) => (laneColumnLayouts.get(laneId)?.contentW ?? 0) + POOL_H_PAD * 2),\n );\n\n const innerW = Math.max(baseLaneInnerW, basePoolInnerW);\n const poolW = Math.max(POOL_MIN_W, innerW + POOL_INNER_PAD * 2);\n let laneW = poolW - POOL_INNER_PAD * 2;\n\n const laneY = new Map<string, number>();\n let cumY = POOL_INNER_PAD;\n for (let i = 0; i < laneIds.length; i++) {\n const laneId = laneIds[i];\n laneY.set(laneId, cumY);\n cumY += laneStats.get(laneId)?.height ?? LANE_MIN_H;\n if (i < laneIds.length - 1) cumY += POOL_INNER_PAD;\n }\n const poolH = cumY + POOL_INNER_PAD;\n\n // ── Phase 6: Position content nodes ───────────────────────────────────────\n\n const positionedContent = mainContent.map(node => {\n const c = columns.get(node.id) ?? 0;\n const r = rows.get(node.id) ?? 0;\n const laneId = nodeLaneId.get(node.id) ?? \"_pool_\";\n const stat = laneStats.get(laneId)!;\n const laneLayout = laneColumnLayouts.get(laneId);\n const lYOff = laneY.get(laneId) ?? 0;\n const lw = layoutW(node);\n const lh = layoutH(node);\n\n const colOffset = (laneLayout?.colX.get(c) ?? 0) + (laneLayout?.colW.get(c) ?? 120) / 2 - lw / 2;\n const rowOffset = (stat.rowY.get(r) ?? 0) + (stat.rowH.get(r) ?? ROW_HEIGHT) / 2 - lh / 2;\n\n const vertTopOffset = Math.max(LANE_V_PAD, (stat.height - stat.contentH) / 2);\n\n const isLaneChild = hasLanes && !!node.parentId && node.parentId !== pool.id;\n\n const x = isLaneChild\n ? LANE_LABEL_W + LANE_H_PAD + colOffset\n : POOL_H_PAD + colOffset;\n\n const y = isLaneChild\n ? vertTopOffset + rowOffset\n : lYOff + vertTopOffset + rowOffset;\n\n // Apply layout-minimum dimensions so tasks render at a readable size.\n return applyLayoutMinSize({ ...node, position: { x, y } });\n });\n\n // ── Phase 6B: Cross-lane handoff relaxation ──────────────────────────────\n // Per-lane compaction is good for density, but a target in another lane\n // still needs to read as a successor to a source on the left. We therefore\n // push cross-lane targets (and the segment to their right) just enough to\n // preserve left-to-right causality without reintroducing a full global grid.\n\n const handoffAdjustedContent = [...positionedContent];\n const nodeIndexById = new Map(handoffAdjustedContent.map((node, index) => [node.id, index]));\n const outgoingBySource = new Map<string, typeof fwdEdges>();\n for (const edge of fwdEdges) {\n if (!outgoingBySource.has(edge.source)) outgoingBySource.set(edge.source, []);\n outgoingBySource.get(edge.source)!.push(edge);\n }\n const crossLaneEdges = fwdEdges\n .filter((edge) => {\n const srcLane = nodeLaneId.get(edge.source) ?? \"_pool_\";\n const tgtLane = nodeLaneId.get(edge.target) ?? \"_pool_\";\n return srcLane !== tgtLane;\n })\n .sort(\n (a, b) =>\n (columns.get(a.target) ?? 0) - (columns.get(b.target) ?? 0) ||\n (columns.get(a.source) ?? 0) - (columns.get(b.source) ?? 0),\n );\n\n for (const edge of crossLaneEdges) {\n const srcIndex = nodeIndexById.get(edge.source);\n const tgtIndex = nodeIndexById.get(edge.target);\n if (srcIndex == null || tgtIndex == null) continue;\n\n const srcNode = handoffAdjustedContent[srcIndex];\n const tgtNode = handoffAdjustedContent[tgtIndex];\n const tgtLaneId = nodeLaneId.get(tgtNode.id) ?? \"_pool_\";\n const tgtCol = columns.get(tgtNode.id) ?? 0;\n const siblingTargets = (outgoingBySource.get(edge.source) ?? [])\n .filter((candidate) => (columns.get(candidate.target) ?? 0) === tgtCol)\n .map((candidate) => handoffAdjustedContent[nodeIndexById.get(candidate.target) ?? -1])\n .filter((node): node is BpmnRFNode => !!node);\n const siblingAlignedX = siblingTargets.reduce(\n (max, node) => Math.max(max, node.position.x),\n Number.NEGATIVE_INFINITY,\n );\n const minTargetX = Math.max(\n siblingAlignedX,\n srcNode.position.x +\n layoutW(srcNode) / 2 +\n layoutW(tgtNode) / 2 +\n COL_GAP,\n );\n\n if (tgtNode.position.x >= minTargetX) continue;\n\n const delta = minTargetX - tgtNode.position.x;\n for (let i = 0; i < handoffAdjustedContent.length; i++) {\n const candidate = handoffAdjustedContent[i];\n if ((nodeLaneId.get(candidate.id) ?? \"_pool_\") !== tgtLaneId) continue;\n if ((columns.get(candidate.id) ?? 0) < tgtCol) continue;\n handoffAdjustedContent[i] = {\n ...candidate,\n position: {\n x: candidate.position.x + delta,\n y: candidate.position.y,\n },\n };\n }\n }\n\n for (const [sourceId, outgoing] of outgoingBySource) {\n if (outgoing.length < 2) continue;\n const hasCrossLaneSibling = outgoing.some((edge) => {\n const srcLane = nodeLaneId.get(edge.source) ?? \"_pool_\";\n const tgtLane = nodeLaneId.get(edge.target) ?? \"_pool_\";\n return srcLane !== tgtLane;\n });\n if (!hasCrossLaneSibling) continue;\n\n const siblingsByCol = new Map<number, BpmnRFNode[]>();\n for (const edge of outgoing) {\n const col = columns.get(edge.target) ?? 0;\n const node = handoffAdjustedContent[nodeIndexById.get(edge.target) ?? -1];\n if (!node) continue;\n if (!siblingsByCol.has(col)) siblingsByCol.set(col, []);\n siblingsByCol.get(col)!.push(node);\n }\n\n for (const [col, siblings] of siblingsByCol) {\n if (siblings.length < 2) continue;\n const alignedX = Math.max(...siblings.map((node) => node.position.x));\n for (let i = 0; i < handoffAdjustedContent.length; i++) {\n const candidate = handoffAdjustedContent[i];\n if (!siblings.some((node) => node.id === candidate.id)) continue;\n const laneId = nodeLaneId.get(candidate.id) ?? \"_pool_\";\n for (let j = 0; j < handoffAdjustedContent.length; j++) {\n const maybeShift = handoffAdjustedContent[j];\n if ((nodeLaneId.get(maybeShift.id) ?? \"_pool_\") !== laneId) continue;\n if ((columns.get(maybeShift.id) ?? 0) < col) continue;\n const delta = alignedX - candidate.position.x;\n if (delta <= 0) continue;\n handoffAdjustedContent[j] = {\n ...maybeShift,\n position: {\n x: maybeShift.position.x + delta,\n y: maybeShift.position.y,\n },\n };\n }\n }\n }\n void sourceId;\n }\n\n // ── Phase 7: Overlap resolution ───────────────────────────────────────────\n\n const NODE_MIN_GAP = 24;\n const resolvedContent = [...handoffAdjustedContent];\n\n for (const laneId of laneIds) {\n const laneNodeIndices = resolvedContent\n .map((n, i) => ({ n, i }))\n .filter(({ n }) => (nodeLaneId.get(n.id) ?? \"_pool_\") === laneId)\n .sort((a, b) => a.n.position.x - b.n.position.x);\n\n for (let k = 1; k < laneNodeIndices.length; k++) {\n const prev = resolvedContent[laneNodeIndices[k - 1].i];\n const curr = resolvedContent[laneNodeIndices[k].i];\n\n // Use layoutW/layoutH so the overlap check matches the final rendered sizes.\n const prevBottom = prev.position.y + layoutH(prev);\n const currTop = curr.position.y;\n const prevTop = prev.position.y;\n const currBottom = curr.position.y + layoutH(curr);\n const yOverlap =\n prevBottom + NODE_MIN_GAP > currTop &&\n currBottom + NODE_MIN_GAP > prevTop;\n\n if (!yOverlap) continue;\n\n const prevRight = prev.position.x + layoutW(prev);\n if (prevRight + NODE_MIN_GAP > curr.position.x) {\n resolvedContent[laneNodeIndices[k].i] = {\n ...curr,\n position: { x: prevRight + NODE_MIN_GAP, y: curr.position.y },\n };\n }\n }\n }\n\n // ── Phase 8: Reposition BoundaryEvents onto their host nodes ──────────────\n\n const positionedBoundaries = repositionBoundaryEvents(boundaryEvents, resolvedContent);\n\n // ── Phase 8B: Final container width after overlap resolution ─────────────\n // Nodes can be pushed right during overlap resolution, so containers must be\n // measured against the final positions, not the preliminary column grid.\n\n const laneChildRight = resolvedContent\n .filter((node) => hasLanes && !!node.parentId && node.parentId !== pool.id)\n .reduce((max, node) => Math.max(max, node.position.x + nW(node) + LANE_H_PAD), 0);\n const poolChildRight = resolvedContent\n .filter((node) => !hasLanes || !node.parentId || node.parentId === pool.id)\n .reduce((max, node) => Math.max(max, node.position.x + nW(node) + POOL_H_PAD), 0);\n const boundaryRight = positionedBoundaries.reduce(\n (max, node) => Math.max(max, node.position.x + nW(node) + (hasLanes ? LANE_H_PAD : POOL_H_PAD)),\n 0,\n );\n\n const finalInnerW = Math.max(innerW, laneChildRight, poolChildRight, boundaryRight);\n const finalPoolW = Math.max(POOL_MIN_W, finalInnerW + POOL_INNER_PAD * 2);\n laneW = finalPoolW - POOL_INNER_PAD * 2;\n\n // ── Phase 9: Position lanes ────────────────────────────────────────────────\n\n const positionedLanes = hasLanes\n ? sortedLanes.map(lane => ({\n ...lane,\n position: { x: POOL_INNER_PAD, y: laneY.get(lane.id) ?? POOL_INNER_PAD },\n width: laneW,\n height: laneStats.get(lane.id)?.height ?? LANE_MIN_H,\n }))\n : [];\n\n return {\n nodes: [...resolvedContent, ...positionedBoundaries, ...positionedLanes],\n width: finalPoolW,\n height: poolH,\n };\n}\n\n// ── Virtual context: pool-less / free-node layout without ELK ───────────────\n//\n// Phase 4: the custom engine is the only layout engine. Diagrams without\n// pools — and free-node clusters in mixed diagrams — run through layoutPool\n// with a zero-positioned virtual pool: same column/row assignment, handoff\n// relaxation, overlap resolution and boundary anchoring as pooled content.\n// Positions come out origin-relative (the virtual pool sits at 0,0) and the\n// virtual pool itself is never emitted.\n\nfunction layoutVirtualContext(\n contextNodes: BpmnRFNode[], // flow content + boundary events, no containers\n allEdges: BpmnRFEdge[],\n offsetY: number,\n): BpmnRFNode[] {\n if (contextNodes.length === 0) return [];\n const virtualPool: BpmnRFNode = {\n id: \"__bpmn_virtual_pool__\",\n type: \"Pool\",\n position: { x: 0, y: 0 },\n data: { elementType: \"Pool\" },\n };\n const result = layoutPool(virtualPool, [], contextNodes, allEdges);\n if (offsetY === 0) return result.nodes;\n return result.nodes.map(n => ({\n ...n,\n position: { x: n.position.x, y: n.position.y + offsetY },\n }));\n}\n\n// ── Geometry helpers ───────────────────────────────────────────────────────\n\ntype Pt = { x: number; y: number };\ntype Rect = { x: number; y: number; width: number; height: number };\n\nfunction absolutePos(\n nodeId: string,\n byId: Map<string, BpmnRFNode>,\n cache: Map<string, Pt>,\n): Pt {\n const cached = cache.get(nodeId);\n if (cached) return cached;\n const node = byId.get(nodeId);\n if (!node) return { x: 0, y: 0 };\n const own = { ...node.position };\n if (!node.parentId) { cache.set(nodeId, own); return own; }\n const parent = absolutePos(node.parentId, byId, cache);\n const abs = { x: parent.x + own.x, y: parent.y + own.y };\n cache.set(nodeId, abs);\n return abs;\n}\n\nfunction findAncestorNodeId(\n node: BpmnRFNode | undefined,\n candidateIds: Set<string>,\n byId: Map<string, BpmnRFNode>,\n): string | undefined {\n let current = node;\n while (current?.parentId) {\n if (candidateIds.has(current.parentId)) return current.parentId;\n current = byId.get(current.parentId);\n }\n return undefined;\n}\n\nfunction laneOf(\n node: BpmnRFNode,\n laneIds: Set<string>,\n byId: Map<string, BpmnRFNode>,\n): string | undefined {\n return findAncestorNodeId(node, laneIds, byId);\n}\n\nfunction poolOf(\n node: BpmnRFNode,\n poolIds: Set<string>,\n byId: Map<string, BpmnRFNode>,\n): string | undefined {\n if (poolIds.has(node.id)) return node.id;\n return findAncestorNodeId(node, poolIds, byId);\n}\n\nfunction nodeRect(\n node: BpmnRFNode,\n byId: Map<string, BpmnRFNode>,\n cache: Map<string, Pt>,\n): Rect {\n const pos = absolutePos(node.id, byId, cache);\n return { x: pos.x, y: pos.y, width: nW(node), height: nH(node) };\n}\n\nfunction rectContainsRect(outer: Rect, inner: Rect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.width <= outer.x + outer.width &&\n inner.y + inner.height <= outer.y + outer.height\n );\n}\n\nfunction sortNodesParentFirst(nodes: BpmnRFNode[]): BpmnRFNode[] {\n const byId = new Map(nodes.map((node) => [node.id, node]));\n const memo = new Map<string, number>();\n\n const depthOf = (node: BpmnRFNode): number => {\n const cached = memo.get(node.id);\n if (cached != null) return cached;\n if (!node.parentId) {\n memo.set(node.id, 0);\n return 0;\n }\n const parent = byId.get(node.parentId);\n const depth = parent ? depthOf(parent) + 1 : 0;\n memo.set(node.id, depth);\n return depth;\n };\n\n return [...nodes].sort((a, b) => {\n const depthDiff = depthOf(a) - depthOf(b);\n if (depthDiff !== 0) return depthDiff;\n const ay = a.position?.y ?? 0;\n const by = b.position?.y ?? 0;\n if (ay !== by) return ay - by;\n const ax = a.position?.x ?? 0;\n const bx = b.position?.x ?? 0;\n if (ax !== bx) return ax - bx;\n return a.id.localeCompare(b.id);\n });\n}\n\n/** Midpoint of the column gap — guaranteed in empty space between the two nodes.\n * Used for cross-lane routing where we want the vertical segment centered. */\nfunction gapMidX(sAbs: Pt, sW: number, tAbs: Pt, tW: number): number {\n const leftRightEdge = Math.min(sAbs.x + sW, tAbs.x + tW);\n const rightLeftEdge = Math.max(sAbs.x, tAbs.x);\n return leftRightEdge < rightLeftEdge\n ? (leftRightEdge + rightLeftEdge) / 2\n : sAbs.x + sW / 2;\n}\n\n/** Biased routing X — 35 % from the source exit, 65 % from the target entry.\n * Used for same-lane cross-row L-shapes where the vertical segment runs\n * adjacent to sibling nodes in the target column. Keeping the line closer\n * to the source column gives more visual clearance from those siblings. */\nfunction routeMidX(sAbs: Pt, sW: number, tAbs: Pt, tW: number): number {\n const leftEdge = Math.min(sAbs.x + sW, tAbs.x + tW); // source right edge\n const rightEdge = Math.max(sAbs.x, tAbs.x); // target left edge\n return leftEdge < rightEdge\n ? leftEdge + (rightEdge - leftEdge) * 0.35\n : sAbs.x + sW / 2;\n}\n\n// ── Edge handle derivation ──────────────────────────────────────────────────\n//\n// After routing, the handle (the connection point the edge docks to on the\n// node) must match the side the route actually leaves/enters from — otherwise\n// ReactFlow docks the endpoint on the stored handle's side and the edge kinks\n// to reach the first routing point. We derive the handle from which border of\n// the node rect the route's endpoint sits on (the truthful, geometry-first\n// source — it overrides whatever handle the AI agent or a draw-time guess set).\n\nconst HANDLE_SIDES = [\"right\", \"left\", \"top\", \"bottom\"] as const;\n\nfunction borderHandle(\n point: Pt,\n rect: { x: number; y: number; w: number; h: number },\n kind: \"source\" | \"target\",\n): string {\n const dist = {\n right: Math.abs(point.x - (rect.x + rect.w)),\n left: Math.abs(point.x - rect.x),\n top: Math.abs(point.y - rect.y),\n bottom: Math.abs(point.y - (rect.y + rect.h)),\n };\n let side: (typeof HANDLE_SIDES)[number] = \"right\";\n let best = Infinity;\n for (const s of HANDLE_SIDES) {\n if (dist[s] < best) { best = dist[s]; side = s; }\n }\n return `${kind}-${side}`;\n}\n\n// ── Orthogonal edge routing ────────────────────────────────────────────────\n\nconst SAME_ROW_THRESHOLD = 15;\n\nfunction routeEdges(\n edges: BpmnRFEdge[],\n layoutNodes: BpmnRFNode[],\n backEdgeIds: Set<string>,\n laneIds: Set<string>,\n poolIds: Set<string>,\n): BpmnRFEdge[] {\n const byId = new Map(layoutNodes.map(n => [n.id, n]));\n const cache = new Map<string, Pt>();\n const abs = (id: string) => absolutePos(id, byId, cache);\n\n /** Source/target handles derived from where a route's endpoints dock. */\n const handlesFor = (srcId: string, tgtId: string, pts: Pt[]):\n { sourceHandle?: string; targetHandle?: string } => {\n if (pts.length < 2) return {};\n const s = byId.get(srcId), t = byId.get(tgtId);\n if (!s || !t) return {};\n const sa = abs(srcId), ta = abs(tgtId);\n return {\n sourceHandle: borderHandle(pts[0], { x: sa.x, y: sa.y, w: nW(s), h: nH(s) }, \"source\"),\n targetHandle: borderHandle(pts[pts.length - 1], { x: ta.x, y: ta.y, w: nW(t), h: nH(t) }, \"target\"),\n };\n };\n\n const sortedLanes = [...laneIds]\n .map(id => byId.get(id))\n .filter((n): n is BpmnRFNode => !!n)\n .sort((a, b) => abs(a.id).y - abs(b.id).y);\n\n // Content rects per pool — used so back-edge arcs clear every node they\n // travel over, and so vertical corridors can dodge blocking nodes.\n const contentInfos = layoutNodes\n .filter(n => !poolIds.has(n.id) && !laneIds.has(n.id))\n .map(n => {\n const p = abs(n.id);\n return { id: n.id, x: p.x, y: p.y, w: nW(n), h: nH(n), poolId: poolOf(n, poolIds, byId) ?? null };\n });\n\n /** Finds an X for a vertical corridor segment spanning [y0,y1] that does\n * not cut through any content node — best effort within [minX,maxX]. */\n const findClearX = (\n desiredX: number,\n y0: number,\n y1: number,\n minX: number,\n maxX: number,\n excludeA: string,\n excludeB: string,\n poolId: string | null,\n ): number => {\n if (minX > maxX) return desiredX;\n const clampX = (x: number) => Math.min(maxX, Math.max(minX, x));\n const blockers = contentInfos.filter(c =>\n c.poolId === poolId &&\n c.id !== excludeA && c.id !== excludeB &&\n c.y < y1 && c.y + c.h > y0,\n );\n const isFree = (x: number) => blockers.every(c => x < c.x - 4 || x > c.x + c.w + 4);\n const clamped = clampX(desiredX);\n if (isFree(clamped)) return clamped;\n const candidates: number[] = [];\n for (const c of blockers) candidates.push(c.x - 8, c.x + c.w + 8);\n const free = candidates\n .map(clampX)\n .filter(isFree)\n .sort((a, b) => Math.abs(a - desiredX) - Math.abs(b - desiredX));\n return free.length > 0 ? free[0] : clamped;\n };\n\n // Back-edges are staggered so two loops over the same span don't share the\n // exact same arc height. Deterministic: ordered by edge id.\n const backEdgeOrder = new Map<string, number>();\n for (const edge of [...edges].sort((a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0))) {\n if (backEdgeIds.has(edge.id)) backEdgeOrder.set(edge.id, backEdgeOrder.size);\n }\n\n /** Orthogonal cross-pool route for a message flow: leave through the source\n * pool's facing border, run along the corridor between the pools, enter\n * the target from its facing border. Returns null when the pools don't\n * stack vertically (fall back to the default renderer). */\n const routeMessageFlow = (edge: BpmnRFEdge): Pt[] | null => {\n const src = byId.get(edge.source);\n const tgt = byId.get(edge.target);\n if (!src || !tgt) return null;\n const srcPoolId = poolOf(src, poolIds, byId);\n const tgtPoolId = poolOf(tgt, poolIds, byId);\n if (!srcPoolId || !tgtPoolId || srcPoolId === tgtPoolId) return null;\n const srcPoolNode = byId.get(srcPoolId);\n const tgtPoolNode = byId.get(tgtPoolId);\n if (!srcPoolNode || !tgtPoolNode) return null;\n\n const sAbs = abs(src.id);\n const tAbs = abs(tgt.id);\n const sCX = sAbs.x + nW(src) / 2;\n const tCX = tAbs.x + nW(tgt) / 2;\n const srcPoolAbs = abs(srcPoolId);\n const tgtPoolAbs = abs(tgtPoolId);\n const srcPoolBottom = srcPoolAbs.y + nH(srcPoolNode);\n const tgtPoolBottom = tgtPoolAbs.y + nH(tgtPoolNode);\n\n if (tgtPoolAbs.y >= srcPoolBottom) {\n // Target pool below: exit bottom, cross the inter-pool corridor, enter top.\n const corridorY = (srcPoolBottom + tgtPoolAbs.y) / 2;\n return [\n { x: sCX, y: sAbs.y + nH(src) },\n { x: sCX, y: corridorY },\n { x: tCX, y: corridorY },\n { x: tCX, y: tAbs.y },\n ];\n }\n if (srcPoolAbs.y >= tgtPoolBottom) {\n // Target pool above: exit top, enter bottom.\n const corridorY = (tgtPoolBottom + srcPoolAbs.y) / 2;\n return [\n { x: sCX, y: sAbs.y },\n { x: sCX, y: corridorY },\n { x: tCX, y: corridorY },\n { x: tCX, y: tAbs.y + nH(tgt) },\n ];\n }\n return null; // overlapping/side-by-side pools — default rendering\n };\n\n const routed = edges.map(edge => {\n const edgeType = (edge.data?.edgeType ?? edge.type) as string;\n\n if (edgeType !== \"sequenceFlow\") {\n if (edgeType === \"messageFlow\") {\n const pts = routeMessageFlow(edge);\n if (pts) {\n return {\n ...edge,\n ...handlesFor(edge.source, edge.target, pts),\n data: { ...edge.data, routingPoints: pts },\n } as unknown as BpmnRFEdge;\n }\n }\n const d = { ...edge.data };\n delete d.routingPoints;\n return { ...edge, data: d } as unknown as BpmnRFEdge;\n }\n\n const src = byId.get(edge.source);\n const tgt = byId.get(edge.target);\n if (!src || !tgt) return edge;\n\n const sAbs = abs(src.id);\n const tAbs = abs(tgt.id);\n const sW = nW(src), sH = nH(src);\n const tW = nW(tgt), tH = nH(tgt);\n\n const sCX = sAbs.x + sW / 2;\n const tCX = tAbs.x + tW / 2;\n const sCY = sAbs.y + sH / 2;\n const tCY = tAbs.y + tH / 2;\n\n // Cross-pool → no routing, let ReactFlow draw default.\n const srcPool = poolOf(src, poolIds, byId) ?? null;\n const tgtPool = poolOf(tgt, poolIds, byId) ?? null;\n if (srcPool !== tgtPool) {\n const d = { ...edge.data };\n delete d.routingPoints;\n return { ...edge, data: d } as unknown as BpmnRFEdge;\n }\n\n let routingPoints: Pt[];\n\n // ── Back-edge: U-arc above the flow ────────────────────────────────────\n if (backEdgeIds.has(edge.id)) {\n // Clear every node the arc travels over (same pool, intersecting the\n // horizontal span), staggering multiple loops so arcs never coincide.\n const spanMinX = Math.min(tAbs.x, sAbs.x) - EDGE_ROUTE_PAD;\n const spanMaxX = Math.max(tAbs.x + tW, sAbs.x + sW) + EDGE_ROUTE_PAD;\n let topMost = Math.min(sAbs.y, tAbs.y);\n for (const cand of contentInfos) {\n if (cand.poolId !== srcPool) continue;\n if (cand.x + cand.w < spanMinX || cand.x > spanMaxX) continue;\n topMost = Math.min(topMost, cand.y);\n }\n const stagger = (backEdgeOrder.get(edge.id) ?? 0) * 14;\n const topY = topMost - BACK_EDGE_CLEARANCE - stagger;\n routingPoints = [\n { x: sAbs.x + sW, y: sCY },\n { x: sAbs.x + sW + EDGE_ROUTE_PAD, y: sCY },\n { x: sAbs.x + sW + EDGE_ROUTE_PAD, y: topY },\n { x: tAbs.x - EDGE_ROUTE_PAD, y: topY },\n { x: tAbs.x - EDGE_ROUTE_PAD, y: tCY },\n { x: tAbs.x, y: tCY },\n ];\n }\n\n // ── Cross-lane: orthogonal routing through every lane border ────────────\n //\n // For each lane border crossed a waypoint is added — including non-adjacent\n // lanes (Lane 1 → Lane 3 produces intermediate waypoints at Lane 1 and\n // Lane 2 bottom borders so the edge never cuts diagonally through Lane 2).\n //\n // Format: [discarded, horiz_exit, ...border_Ys, horiz_entry, discarded]\n\n else if (laneOf(src, laneIds, byId) !== laneOf(tgt, laneIds, byId)) {\n const srcLane = byId.get(laneOf(src, laneIds, byId) ?? \"\");\n const tgtLane = byId.get(laneOf(tgt, laneIds, byId) ?? \"\");\n\n if (srcLane && tgtLane && laneIds.has(srcLane.id) && laneIds.has(tgtLane.id)) {\n const goingDown = tAbs.y > sAbs.y;\n const sharedX = findClearX(\n gapMidX(sAbs, sW, tAbs, tW),\n Math.min(sCY, tCY), Math.max(sCY, tCY),\n sAbs.x + sW + 6, tAbs.x - EDGE_ROUTE_PAD - 4,\n src.id, tgt.id, srcPool,\n );\n const srcLaneIdx = sortedLanes.findIndex(l => l.id === srcLane.id);\n const tgtLaneIdx = sortedLanes.findIndex(l => l.id === tgtLane.id);\n\n const pts: Pt[] = [];\n\n if (goingDown) {\n pts.push({ x: sAbs.x + sW, y: sCY }); // exit at right side\n pts.push({ x: sharedX, y: sCY }); // horizontal exit corridor\n\n const fromIdx = Math.min(srcLaneIdx, tgtLaneIdx);\n const toIdx = Math.max(srcLaneIdx, tgtLaneIdx);\n for (let i = fromIdx; i < toIdx; i++) {\n const lane = sortedLanes[i];\n const laneBot = abs(lane.id).y + (lane.height ?? LANE_MIN_H);\n pts.push({ x: sharedX, y: laneBot }); // each lane border\n }\n\n const lastY = pts[pts.length - 1].y;\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: lastY }); // horizontal entry corridor\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: tCY });\n pts.push({ x: tAbs.x, y: tCY });\n } else {\n pts.push({ x: sAbs.x + sW, y: sCY });\n pts.push({ x: sharedX, y: sCY });\n\n const fromIdx = Math.min(srcLaneIdx, tgtLaneIdx);\n const toIdx = Math.max(srcLaneIdx, tgtLaneIdx);\n for (let i = toIdx; i > fromIdx; i--) {\n const lane = sortedLanes[i];\n const laneTop = abs(lane.id).y;\n pts.push({ x: sharedX, y: laneTop });\n }\n\n const lastY = pts[pts.length - 1].y;\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: lastY });\n pts.push({ x: tAbs.x - EDGE_ROUTE_PAD, y: tCY });\n pts.push({ x: tAbs.x, y: tCY });\n }\n\n routingPoints = pts;\n } else {\n const sharedX = findClearX(\n gapMidX(sAbs, sW, tAbs, tW),\n Math.min(sCY, tCY), Math.max(sCY, tCY),\n sAbs.x + sW + 6, tAbs.x - 6,\n src.id, tgt.id, srcPool,\n );\n routingPoints = [\n { x: sAbs.x + sW, y: sCY },\n { x: sharedX, y: sCY },\n { x: sharedX, y: tCY },\n { x: tAbs.x, y: tCY },\n ];\n }\n }\n\n // ── Same lane, same row: straight ──────────────────────────────────────\n else if (Math.abs(sCY - tCY) <= SAME_ROW_THRESHOLD) {\n const d = { ...edge.data };\n delete d.routingPoints;\n // No routing points (ReactFlow draws the straight line from the docked\n // handles), so dock on the facing borders along the flow direction.\n const goesRight = tCX >= sCX;\n return {\n ...edge,\n sourceHandle: goesRight ? \"source-right\" : \"source-left\",\n targetHandle: goesRight ? \"target-left\" : \"target-right\",\n data: d,\n } as unknown as BpmnRFEdge;\n }\n\n // ── Same lane, different row: L-shape ──────────────────────────────────\n else {\n const handle = edge.sourceHandle ?? \"\";\n const exitsTop = handle.includes(\"top\");\n const exitsBottom = handle.includes(\"bottom\");\n\n if (exitsTop || exitsBottom) {\n const exitY = exitsTop ? sAbs.y : sAbs.y + sH;\n const entryY = exitsTop ? tAbs.y + tH : tAbs.y;\n const corridorY = exitsTop\n ? Math.min(exitY, entryY) - EDGE_ROUTE_PAD\n : Math.max(exitY, entryY) + EDGE_ROUTE_PAD;\n routingPoints = [\n { x: sCX, y: exitY },\n { x: sCX, y: corridorY },\n { x: tCX, y: corridorY },\n { x: tCX, y: entryY },\n ];\n } else {\n // routeMidX biases 35 % from source exit — keeps the vertical segment\n // away from sibling nodes stacked in the target column (row above/below).\n const midX = routeMidX(sAbs, sW, tAbs, tW);\n const exitX = sAbs.x + sW;\n const entryX = tAbs.x;\n const corridorX = findClearX(\n Math.max(midX, exitX + EDGE_ROUTE_PAD),\n Math.min(sCY, tCY), Math.max(sCY, tCY),\n exitX + 6, entryX - 6,\n src.id, tgt.id, srcPool,\n );\n routingPoints = [\n { x: exitX, y: sCY },\n { x: corridorX, y: sCY },\n { x: corridorX, y: tCY },\n { x: entryX, y: tCY },\n ];\n }\n }\n\n return {\n ...edge,\n ...handlesFor(edge.source, edge.target, routingPoints),\n data: { ...edge.data, routingPoints },\n } as unknown as BpmnRFEdge;\n });\n\n return spreadVerticalChannels(routed);\n}\n\n// ── Edge channels: spread overlapping vertical corridors ────────────────────\n//\n// Several routed edges often share the exact same vertical corridor (e.g. two\n// branches converging on the same column, or parallel cross-lane handoffs).\n// Drawn on top of each other they read as ONE edge. This post-pass clusters\n// interior vertical runs by X, and nudges overlapping runs apart by a small\n// per-edge offset, keeping each run inside its routing corridor.\n\nconst CHANNEL_GAP = 10; // px between parallel edges in a corridor\nconst CHANNEL_CLUSTER_TOL = 8; // runs within this X distance share a corridor\n\ninterface VerticalRun {\n edgeIdx: number;\n fromIdx: number; // first point index of the run\n toIdx: number; // last point index of the run\n x: number;\n y0: number;\n y1: number;\n}\n\nfunction spreadVerticalChannels(edges: BpmnRFEdge[]): BpmnRFEdge[] {\n const runs: VerticalRun[] = [];\n\n edges.forEach((edge, edgeIdx) => {\n const pts = edge.data?.routingPoints as Pt[] | undefined;\n if (!pts || pts.length < 4) return;\n let i = 1;\n while (i < pts.length) {\n // Detect a maximal vertical run starting at i-1.\n let j = i;\n while (j < pts.length && Math.abs(pts[j].x - pts[j - 1].x) <= 0.5) j++;\n if (j > i) {\n const fromIdx = i - 1;\n const toIdx = j - 1;\n // Only interior runs are safe to shift — runs touching the first or\n // last point would detach the edge from its node border.\n if (fromIdx > 0 && toIdx < pts.length - 1) {\n const ys = pts.slice(fromIdx, toIdx + 1).map(p => p.y);\n const y0 = Math.min(...ys);\n const y1 = Math.max(...ys);\n if (y1 - y0 >= 4) {\n runs.push({ edgeIdx, fromIdx, toIdx, x: pts[fromIdx].x, y0, y1 });\n }\n }\n i = j + 1;\n } else {\n i++;\n }\n }\n });\n\n if (runs.length < 2) return edges;\n\n // Cluster runs by X proximity.\n runs.sort((a, b) => a.x - b.x);\n const clusters: VerticalRun[][] = [];\n for (const run of runs) {\n const last = clusters[clusters.length - 1];\n if (last && run.x - last[0].x <= CHANNEL_CLUSTER_TOL) last.push(run);\n else clusters.push([run]);\n }\n\n const offsets = new Map<VerticalRun, number>();\n for (const cluster of clusters) {\n if (cluster.length < 2) continue;\n // Only runs that overlap vertically with another in the cluster collide.\n const colliding = cluster.filter(run =>\n cluster.some(other => other !== run && run.y0 < other.y1 && other.y0 < run.y1),\n );\n if (colliding.length < 2) continue;\n const ordered = [...colliding].sort((a, b) => {\n const idA = edges[a.edgeIdx].id;\n const idB = edges[b.edgeIdx].id;\n return idA < idB ? -1 : idA > idB ? 1 : a.fromIdx - b.fromIdx;\n });\n ordered.forEach((run, k) => {\n const off = Math.round((k - (ordered.length - 1) / 2) * CHANNEL_GAP);\n if (off !== 0) offsets.set(run, off);\n });\n }\n\n if (offsets.size === 0) return edges;\n\n const runsByEdge = new Map<number, VerticalRun[]>();\n for (const [run, off] of offsets) {\n void off;\n if (!runsByEdge.has(run.edgeIdx)) runsByEdge.set(run.edgeIdx, []);\n runsByEdge.get(run.edgeIdx)!.push(run);\n }\n\n return edges.map((edge, edgeIdx) => {\n const edgeRuns = runsByEdge.get(edgeIdx);\n if (!edgeRuns) return edge;\n const pts = (edge.data?.routingPoints as Pt[]).map(p => ({ ...p }));\n for (const run of edgeRuns) {\n const off = offsets.get(run)!;\n for (let p = run.fromIdx; p <= run.toIdx; p++) pts[p].x += off;\n }\n return { ...edge, data: { ...edge.data, routingPoints: pts } } as unknown as BpmnRFEdge;\n });\n}\n\n// ── Artifact positioning ───────────────────────────────────────────────────\n//\n// Artifacts (DataObjects, Annotations, Groups) do not participate in the main\n// flow layout. After the pool layout is complete, each artifact is placed\n// above the node it is connected to via an association or dataAssociation edge.\n//\n// Coordinate spaces: artifacts and their connected nodes are assumed to share\n// the same parentId (both in the same lane or both direct pool children).\n// If parentIds differ, the artifact keeps its original position.\n\nconst ARTIFACT_ABOVE_GAP = 16; // px between artifact bottom and connected node top\nconst ARTIFACT_H_SPACING = 12; // px between multiple artifacts on the same node\nconst ARTIFACT_EDGE_PAD = 4; // min clearance between artifact and container border\n\nfunction positionArtifacts(\n artifacts: BpmnRFNode[],\n resultNodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n originalNodes: BpmnRFNode[],\n): BpmnRFNode[] {\n if (artifacts.length === 0) return [];\n\n const byId = new Map(resultNodes.map(n => [n.id, n]));\n const cache = new Map<string, Pt>();\n const absPos = (id: string) => absolutePos(id, byId, cache);\n const originalById = new Map(originalNodes.map(n => [n.id, n]));\n const originalCache = new Map<string, Pt>();\n\n // Build: connectedNodeId → artifacts[] (Groups are ungrouped — keep original).\n const artifactsByNode = new Map<string, BpmnRFNode[]>();\n const ungrouped: BpmnRFNode[] = [];\n const groups: BpmnRFNode[] = [];\n\n for (const artifact of artifacts) {\n if (artifact.data.elementType === \"Group\") {\n groups.push(artifact);\n continue;\n }\n\n const connEdge = edges.find(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return (\n (t === \"association\" || t === \"dataAssociation\") &&\n (e.source === artifact.id || e.target === artifact.id)\n );\n });\n\n if (!connEdge) { ungrouped.push(artifact); continue; }\n\n const connId = connEdge.source === artifact.id\n ? connEdge.target\n : connEdge.source;\n\n if (!byId.has(connId)) { ungrouped.push(artifact); continue; }\n\n if (!artifactsByNode.has(connId)) artifactsByNode.set(connId, []);\n artifactsByNode.get(connId)!.push(artifact);\n }\n\n const positioned: BpmnRFNode[] = [...ungrouped];\n\n for (const [connId, arts] of artifactsByNode) {\n const connNode = byId.get(connId)!;\n const connAbsP = absPos(connId);\n\n // Desired absolute position: spread horizontally above connected node.\n const totalW = arts.reduce((s, a) => s + nW(a), 0) +\n (arts.length - 1) * ARTIFACT_H_SPACING;\n const desiredAbsY = connAbsP.y - ARTIFACT_ABOVE_GAP - Math.max(...arts.map(nH));\n let desiredAbsX = connAbsP.x + nW(connNode) / 2 - totalW / 2;\n\n for (const artifact of arts) {\n // Convert from absolute to artifact-relative (same coordinate space as\n // its parent). If artifact and connected node have different parents,\n // the absolute computation still works — the result is relative to the\n // artifact's own parent.\n const parentAbsP = artifact.parentId\n ? absPos(artifact.parentId)\n : { x: 0, y: 0 };\n\n // Keep the artifact inside its container vertically: prefer the slot\n // above the connected node; when the node sits on the container's top\n // row there is no headroom — fall back to below the node, and clamp to\n // the container's bottom border (bug 6).\n let relY = desiredAbsY - parentAbsP.y;\n const parentNode = artifact.parentId ? byId.get(artifact.parentId) : undefined;\n if (parentNode) {\n if (relY < ARTIFACT_EDGE_PAD) {\n const belowAbsY = connAbsP.y + nH(connNode) + ARTIFACT_ABOVE_GAP;\n relY = belowAbsY - parentAbsP.y;\n }\n relY = Math.min(relY, nH(parentNode) - nH(artifact) - ARTIFACT_EDGE_PAD);\n relY = Math.max(relY, ARTIFACT_EDGE_PAD);\n }\n\n positioned.push({\n ...artifact,\n position: {\n x: desiredAbsX - parentAbsP.x,\n y: relY,\n },\n });\n desiredAbsX += nW(artifact) + ARTIFACT_H_SPACING;\n }\n }\n\n const nonArtifactOriginalNodes = originalNodes.filter(\n (node) => !LAYOUT_ARTIFACT_TYPES.has(node.data.elementType),\n );\n\n for (const group of groups) {\n const originalGroup = originalById.get(group.id);\n if (!originalGroup) {\n positioned.push(group);\n continue;\n }\n\n const groupRect = nodeRect(originalGroup, originalById, originalCache);\n const containedOriginalIds = nonArtifactOriginalNodes\n .filter((node) => node.id !== group.id)\n .filter((node) => {\n if (node.parentId !== group.parentId) return false;\n return rectContainsRect(groupRect, nodeRect(node, originalById, originalCache));\n })\n .map((node) => node.id);\n\n if (containedOriginalIds.length === 0) {\n positioned.push(group);\n continue;\n }\n\n const containedLaidOut = containedOriginalIds\n .map((id) => byId.get(id))\n .filter((node): node is BpmnRFNode => !!node);\n\n if (containedLaidOut.length === 0) {\n positioned.push(group);\n continue;\n }\n\n const GROUP_PAD_X = 24;\n const GROUP_PAD_Y = 20;\n const bounds = containedLaidOut.reduce(\n (acc, node) => {\n const rect = nodeRect(node, byId, cache);\n return {\n left: Math.min(acc.left, rect.x),\n top: Math.min(acc.top, rect.y),\n right: Math.max(acc.right, rect.x + rect.width),\n bottom: Math.max(acc.bottom, rect.y + rect.height),\n };\n },\n { left: Number.POSITIVE_INFINITY, top: Number.POSITIVE_INFINITY, right: Number.NEGATIVE_INFINITY, bottom: Number.NEGATIVE_INFINITY },\n );\n\n const parentAbsP = group.parentId ? absPos(group.parentId) : { x: 0, y: 0 };\n positioned.push({\n ...group,\n position: {\n x: bounds.left - GROUP_PAD_X - parentAbsP.x,\n y: bounds.top - GROUP_PAD_Y - parentAbsP.y,\n },\n width: bounds.right - bounds.left + GROUP_PAD_X * 2,\n height: bounds.bottom - bounds.top + GROUP_PAD_Y * 2,\n measured: {\n width: bounds.right - bounds.left + GROUP_PAD_X * 2,\n height: bounds.bottom - bounds.top + GROUP_PAD_Y * 2,\n },\n });\n }\n\n return positioned;\n}\n\n// ── Main entry point ───────────────────────────────────────────────────────\n\nexport async function bpmnCustomLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): Promise<{ nodes: BpmnRFNode[]; edges: BpmnRFEdge[] }> {\n\n // ── 1. Separate artifacts from the main layout nodes ──────────────────────\n // Artifacts do not participate in sequence flow — they are positioned after\n // the main layout using association edges as placement hints.\n\n const artifacts = nodes.filter(n => LAYOUT_ARTIFACT_TYPES.has(n.data.elementType));\n const mainNodes = nodes.filter(n => !LAYOUT_ARTIFACT_TYPES.has(n.data.elementType));\n\n // ── 2. Derive structural sets from main nodes ─────────────────────────────\n\n const pools = mainNodes.filter(n => n.data.elementType === \"Pool\");\n const lanes = mainNodes.filter(n => n.data.elementType === \"Lane\");\n\n // ── 3. Pre-compute expanded SubProcess layouts ────────────────────────────\n // Expanded SubProcesses must have their final size known BEFORE the main\n // pool layout so column-width calculation uses the correct width.\n // layoutSubProcess() runs column/row assignment on the children and returns\n // both child positions (SubProcess-relative) and the container size.\n\n // Sorted DEEPEST-FIRST: a nested expanded SubProcess must be laid out (and\n // sized) before its parent, so the parent's column-width calculation sees\n // the inner's final dimensions instead of its stale stored size.\n const nodeDepthById = new Map<string, number>();\n const mainById = new Map(mainNodes.map(n => [n.id, n]));\n const depthOf = (node: BpmnRFNode): number => {\n const cached = nodeDepthById.get(node.id);\n if (cached != null) return cached;\n const parent = node.parentId ? mainById.get(node.parentId) : undefined;\n const depth = parent ? depthOf(parent) + 1 : 0;\n nodeDepthById.set(node.id, depth);\n return depth;\n };\n\n const expandedSubProcesses = mainNodes\n .filter(n => COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType) && n.data.isExpanded)\n .sort((a, b) => depthOf(b) - depthOf(a));\n\n const subProcessLayouts = new Map<string, SubProcessResult>();\n\n // Mutable copy — we update expanded SubProcess sizes before the main layout.\n const workingMainNodes = [...mainNodes];\n\n for (const sp of expandedSubProcesses) {\n const spChildren = workingMainNodes.filter(n => n.parentId === sp.id);\n const result = layoutSubProcess(spChildren, edges);\n subProcessLayouts.set(sp.id, result);\n\n const spIdx = workingMainNodes.findIndex(n => n.id === sp.id);\n if (spIdx >= 0) {\n workingMainNodes[spIdx] = {\n ...workingMainNodes[spIdx],\n width: result.width,\n height: result.height,\n measured: { width: result.width, height: result.height },\n };\n }\n }\n\n // Both collapsed AND expanded SubProcesses participate in the main flow as\n // content nodes (they get a column and row in the pool/lane). Their\n // children have parentId === sp.id and are excluded from poolContent\n // automatically, then added via subProcessLayouts after the pool loop.\n // BoundaryEvents are excluded here — they enter the pool layout exclusively\n // through poolBoundaries below (including them in both lists duplicated\n // every BoundaryEvent in the output and doubled the anchoring group width).\n const content = workingMainNodes.filter(n => {\n if (n.data.elementType === \"BoundaryEvent\") return false;\n if (!LAYOUT_CONTAINER_TYPES.has(n.data.elementType)) return true;\n if (COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType)) return true;\n return false;\n });\n\n // ── No pools → native virtual context (the custom engine handles it) ──────\n if (pools.length === 0) {\n // Top-level context: everything except children of expanded subprocesses\n // (those carry SP-relative positions from layoutSubProcess).\n const isSpChild = (n: BpmnRFNode) => !!n.parentId && subProcessLayouts.has(n.parentId);\n const freeContent = content.filter(n => !isSpChild(n));\n const freeBoundaries = workingMainNodes.filter(\n n => n.data.elementType === \"BoundaryEvent\" && !isSpChild(n),\n );\n\n const resultNodes = layoutVirtualContext([...freeContent, ...freeBoundaries], edges, 0);\n for (const [, spLayout] of subProcessLayouts) {\n for (const child of spLayout.children) resultNodes.push(child);\n }\n\n const contentIds = new Set(freeContent.map(n => n.id));\n const seqEdges = extractSeqEdges(edges, contentIds);\n const backIds = detectBackEdges([...contentIds], seqEdges);\n\n const routedEdges = routeEdges(edges, resultNodes, backIds, new Set(), new Set());\n const posArtifacts = positionArtifacts(artifacts, resultNodes, edges, nodes);\n return {\n nodes: sortNodesParentFirst([...resultNodes, ...posArtifacts]),\n edges: routedEdges,\n };\n }\n\n const poolIds = new Set(pools.map(p => p.id));\n const allLaneIds = new Set(lanes.map(l => l.id));\n\n // Back-edges for routing (computed across all pools).\n const allContentIds = new Set(content.map(n => n.id));\n const allSeqEdges = edges\n .filter(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return t === \"sequenceFlow\" &&\n allContentIds.has(e.source) &&\n allContentIds.has(e.target);\n })\n .map(e => ({ id: e.id, source: e.source, target: e.target }));\n const allBackEdgeIds = detectBackEdges([...allContentIds], allSeqEdges);\n\n // Sort pools by Y only when they have distinct positions.\n const poolPositionsDistinct = pools.some(p => Math.abs(p.position.y) > 10);\n const sortedPools = poolPositionsDistinct\n ? [...pools].sort((a, b) => a.position.y - b.position.y)\n : [...pools];\n\n const resultNodes: BpmnRFNode[] = [];\n let stackY = 0;\n\n for (const pool of sortedPools) {\n const poolLanes = lanes.filter(l => l.parentId === pool.id);\n const laneIds = new Set(poolLanes.map(l => l.id));\n\n // Pool content = content nodes whose parent is the pool or one of its lanes.\n // BoundaryEvents are included here (same parentId as their host task).\n const poolContent = content.filter(\n n => n.parentId === pool.id ||\n (n.parentId != null && laneIds.has(n.parentId)),\n );\n // Also include BoundaryEvents for this pool\n const poolBoundaries = workingMainNodes.filter(\n n => n.data.elementType === \"BoundaryEvent\" &&\n (n.parentId === pool.id || (n.parentId != null && laneIds.has(n.parentId))),\n );\n\n const result = layoutPool(pool, poolLanes, [...poolContent, ...poolBoundaries], edges);\n\n resultNodes.push({\n ...pool,\n position: { x: 0, y: stackY },\n width: result.width,\n height: result.height,\n });\n\n for (const node of result.nodes) {\n resultNodes.push(node);\n }\n\n stackY += result.height + POOL_V_GAP;\n }\n\n // ── Add SubProcess children with pre-computed positions ───────────────────\n // Children carry SubProcess-relative coordinates from layoutSubProcess().\n // ReactFlow renders them at subProcess.position + child.position correctly\n // since their parentId still points to the expanded SubProcess.\n for (const [, spLayout] of subProcessLayouts) {\n for (const child of spLayout.children) {\n resultNodes.push(child);\n }\n }\n\n // ── Layout free nodes (mixed diagrams: pools + nodes outside any pool) ─────\n // Nodes that are not children of any pool, lane, or expanded SubProcess are\n // \"free\" nodes. They run through the same engine as a virtual context and\n // are placed below the last pool with a gap.\n const layoutted = new Set(resultNodes.map(n => n.id));\n const freeNodes = workingMainNodes.filter(n => !layoutted.has(n.id));\n\n if (freeNodes.length > 0) {\n const freeFlow = freeNodes.filter(\n n =>\n n.data.elementType === \"BoundaryEvent\" ||\n !LAYOUT_CONTAINER_TYPES.has(n.data.elementType) ||\n COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType),\n );\n const freeRest = freeNodes.filter(n => !freeFlow.includes(n)); // orphan containers\n\n // stackY already includes last pool height + gap.\n for (const node of layoutVirtualContext(freeFlow, edges, stackY)) {\n resultNodes.push(node);\n }\n for (const node of freeRest) resultNodes.push(node);\n }\n\n // Route sequence flow edges with final node positions.\n const routedEdges = routeEdges(edges, resultNodes, allBackEdgeIds, allLaneIds, poolIds);\n\n // Position artifacts above their associated nodes and append.\n const positionedArtifacts = positionArtifacts(artifacts, resultNodes, edges, nodes);\n\n return {\n nodes: sortNodesParentFirst([...resultNodes, ...positionedArtifacts]),\n edges: routedEdges,\n };\n}\n","import type { DiagramEdge, LayoutOptions, LayoutResult } from \"@aranzatech/diagrams-core/types\";\nimport { dagreLayout, applyLayoutResultToDiagram } from \"@aranzatech/diagrams-core/layout\";\nimport type { DiagramNode } from \"@aranzatech/diagrams-core/types\";\nimport type { BpmnRFNode, BpmnRFEdge } from \"../xml/types\";\nimport { getBpmnNodeSize } from \"../modeling\";\nimport type { BpmnDiagramState } from \"../modeling\";\n\nexport { applyLayoutResultToDiagram };\n/** @deprecated bpmnCustomLayout maneja todos los casos (incluyendo diagramas\n * sin pools y nodos libres) de forma nativa desde la Fase 4. Este export se\n * conserva solo por compatibilidad y se eliminará en una versión mayor. */\nexport { bpmnElkLayout } from \"./elk\";\nexport { bpmnCustomLayout } from \"./bpmn-custom-layout\";\n\n/**\n * Dagre layout pre-configured for BPMN diagrams.\n * Uses BPMN-specific node sizes (events 52×52, gateways 64×64, tasks 192×64, etc.)\n * instead of the generic fallback, which prevents overlaps and poor spacing.\n */\nexport async function bpmnDagreLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n options: LayoutOptions = {},\n): Promise<LayoutResult> {\n return dagreLayout(nodes as DiagramNode[], edges as DiagramEdge[], {\n ...options,\n getNodeSize: (node) => getBpmnNodeSize(node as BpmnRFNode),\n });\n}\n\n/**\n * Applies a bpmn dagre layout result back to the diagram state.\n * Convenience wrapper so callers only need one import.\n */\nexport function applyBpmnLayoutResult(\n state: BpmnDiagramState,\n result: LayoutResult,\n): BpmnDiagramState {\n return applyLayoutResultToDiagram(state, result) as BpmnDiagramState;\n}\n"]}