@aranzatech/diagrams-bpmn 0.2.15 → 0.3.1

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.
Files changed (75) hide show
  1. package/README.md +34 -4
  2. package/dist/{catalog-xOMF2ifW.d.cts → catalog-DAGDhO-D.d.cts} +1 -1
  3. package/dist/{catalog-CK3_4cOb.d.ts → catalog-Q1QmKLDD.d.ts} +1 -1
  4. package/dist/{chunk-YUE5EM3W.js → chunk-334WN4JZ.js} +276 -107
  5. package/dist/chunk-334WN4JZ.js.map +1 -0
  6. package/dist/chunk-77L6O76M.js +3 -0
  7. package/dist/chunk-77L6O76M.js.map +1 -0
  8. package/dist/{chunk-QSMP34CT.js → chunk-CPFUQM6H.js} +80 -44
  9. package/dist/chunk-CPFUQM6H.js.map +1 -0
  10. package/dist/{chunk-XMVV7FRZ.js → chunk-FFWJA5BV.js} +3 -3
  11. package/dist/{chunk-XMVV7FRZ.js.map → chunk-FFWJA5BV.js.map} +1 -1
  12. package/dist/{chunk-FBTGIYZS.js → chunk-JEGYVEJO.js} +80 -3
  13. package/dist/{chunk-FBTGIYZS.js.map → chunk-JEGYVEJO.js.map} +1 -1
  14. package/dist/chunk-TB6V4S5N.js +104 -0
  15. package/dist/chunk-TB6V4S5N.js.map +1 -0
  16. package/dist/{chunk-HOWK3ZOO.js → chunk-YAYZW45I.js} +379 -16
  17. package/dist/chunk-YAYZW45I.js.map +1 -0
  18. package/dist/edges/index.cjs +78 -42
  19. package/dist/edges/index.cjs.map +1 -1
  20. package/dist/edges/index.js +1 -1
  21. package/dist/elements/index.cjs +78 -0
  22. package/dist/elements/index.cjs.map +1 -1
  23. package/dist/elements/index.d.cts +24 -5
  24. package/dist/elements/index.d.ts +24 -5
  25. package/dist/elements/index.js +1 -1
  26. package/dist/elk-QT7H4252.js +6 -0
  27. package/dist/elk-QT7H4252.js.map +1 -0
  28. package/dist/extensions/index.cjs +108 -0
  29. package/dist/extensions/index.cjs.map +1 -0
  30. package/dist/extensions/index.d.cts +145 -0
  31. package/dist/extensions/index.d.ts +145 -0
  32. package/dist/extensions/index.js +4 -0
  33. package/dist/extensions/index.js.map +1 -0
  34. package/dist/index.cjs +922 -160
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +7 -5
  37. package/dist/index.d.ts +7 -5
  38. package/dist/index.js +6 -4
  39. package/dist/index.js.map +1 -1
  40. package/dist/layout/index.cjs +366 -90
  41. package/dist/layout/index.cjs.map +1 -1
  42. package/dist/layout/index.d.cts +4 -3
  43. package/dist/layout/index.d.ts +4 -3
  44. package/dist/layout/index.js +358 -92
  45. package/dist/layout/index.js.map +1 -1
  46. package/dist/modeling/index.cjs +387 -13
  47. package/dist/modeling/index.cjs.map +1 -1
  48. package/dist/modeling/index.d.cts +62 -4
  49. package/dist/modeling/index.d.ts +62 -4
  50. package/dist/modeling/index.js +1 -1
  51. package/dist/types-BX_o95GC.d.cts +40 -0
  52. package/dist/{types-y-ZbX-ff.d.ts → types-BYN4Zuee.d.cts} +15 -1
  53. package/dist/{types-y-ZbX-ff.d.cts → types-BYN4Zuee.d.ts} +15 -1
  54. package/dist/{types-jIDz306Y.d.cts → types-CggktCqr.d.cts} +4 -1
  55. package/dist/types-D7zel9dq.d.ts +40 -0
  56. package/dist/{types-DG5yPKld.d.ts → types-DmDODKlh.d.ts} +4 -1
  57. package/dist/validation/index.cjs +81 -125
  58. package/dist/validation/index.cjs.map +1 -1
  59. package/dist/validation/index.d.cts +22 -5
  60. package/dist/validation/index.d.ts +22 -5
  61. package/dist/validation/index.js +82 -126
  62. package/dist/validation/index.js.map +1 -1
  63. package/dist/xml/index.cjs +319 -49
  64. package/dist/xml/index.cjs.map +1 -1
  65. package/dist/xml/index.d.cts +5 -3
  66. package/dist/xml/index.d.ts +5 -3
  67. package/dist/xml/index.js +2 -1
  68. package/package.json +6 -1
  69. package/dist/chunk-HOWK3ZOO.js.map +0 -1
  70. package/dist/chunk-QSMP34CT.js.map +0 -1
  71. package/dist/chunk-YUE5EM3W.js.map +0 -1
  72. package/dist/elk-FSFIEL6O.js +0 -6
  73. package/dist/elk-FSFIEL6O.js.map +0 -1
  74. package/dist/guards-C70uIY_O.d.cts +0 -16
  75. package/dist/guards-foB6XIfZ.d.ts +0 -16
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/layout/bpmn-layout-graph.ts","../../src/layout/bpmn-custom-layout.ts","../../src/layout/index.ts"],"names":["bpmnElkLayout"],"mappings":"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","file":"index.js","sourcesContent":["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 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 nodeIds) state.set(id, 0);\n\n const adj = new Map<string, Array<{ target: string; edgeId: string }>>();\n for (const id of nodeIds) adj.set(id, []);\n for (const e of seqEdges) {\n adj.get(e.source)?.push({ target: e.target, edgeId: e.id });\n }\n\n // Iterative DFS to avoid call-stack overflow on large diagrams.\n for (const startId of nodeIds) {\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: Gateway pair detection ──────────────────────────────────────\n//\n// Finds (split gateway) → (merge gateway) 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\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 =>\n LAYOUT_GATEWAY_TYPES.has(n.data.elementType) &&\n (succs.get(n.id)?.length ?? 0) > 1\n );\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// Row offsets are alternating so branches expand symmetrically:\n// 0, +1, -1, +2, -2, +3, -3 ...\n\nconst ROW_OFFSETS = [0, 1, -1, 2, -2, 3, -3, 4, -4];\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\nexport function assignRows(\n nodes: BpmnRFNode[],\n forwardEdges: LayoutEdgeInfo[],\n columns: Map<string, number>,\n gatewayPairs: Map<string, string>,\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 deepest (rightmost column) to shallowest so inner\n // gateways inherit the correct base row from their already-assigned nodes.\n const sortedPairs = [...gatewayPairs.entries()].sort(\n (a, b) => (columns.get(b[0]) ?? 0) - (columns.get(a[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 start,\n nodeIds: getBranchNodes(start),\n bias: handleToRowBias(splitHandles?.get(start) ?? null),\n }));\n\n // Assign rows: if a branch has a handle bias (top/bottom), use it directly.\n // Otherwise fall back to size-based ordering (largest = row 0).\n // Branches with bias=0 (right handle) or no bias are sorted by size.\n const withBias = branchData.filter(b => b.bias !== null && b.bias !== 0);\n const withoutBias = branchData.filter(b => b.bias === null || b.bias === 0)\n .sort((a, b) => b.nodeIds.length - a.nodeIds.length);\n\n // Place size-ordered branches at row 0, then fill remaining offsets.\n const assigned = new Map<string, number>();\n for (const b of withBias) {\n assigned.set(b.start, splitRow + b.bias!);\n }\n let nextOffset = 0;\n for (const b of withoutBias) {\n while ([...assigned.values()].includes(splitRow + nextOffset)) nextOffset++;\n assigned.set(b.start, splitRow + nextOffset);\n nextOffset++;\n }\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 }\n\n // ── Second pass: terminal splits (no merge detected) ──────────────────────\n // Gateways 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.\n const pairedSplits = new Set(gatewayPairs.keys());\n\n const unpairedSplits = nodes.filter(n =>\n LAYOUT_GATEWAY_TYPES.has(n.data.elementType) &&\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 start,\n nodeIds: getAllReachable(start),\n bias: handleToRowBias(splitHandles2?.get(start) ?? null),\n }));\n\n const withBias2 = branchData.filter(b => b.bias !== null && b.bias !== 0);\n const withoutBias2 = branchData.filter(b => b.bias === null || b.bias === 0)\n .sort((a, b) => b.nodeIds.length - a.nodeIds.length);\n\n const assigned2 = new Map<string, number>();\n for (const b of withBias2) assigned2.set(b.start, splitRow + b.bias!);\n let nextOff = 0;\n for (const b of withoutBias2) {\n while ([...assigned2.values()].includes(splitRow + nextOff)) nextOff++;\n assigned2.set(b.start, splitRow + nextOff);\n nextOff++;\n }\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 {\n LAYOUT_CONTAINER_TYPES,\n detectBackEdges,\n extractSeqEdges,\n assignColumns,\n detectGatewayPairs,\n assignRows,\n} from \"./bpmn-layout-graph\";\n\n// ── Layout constants ───────────────────────────────────────────────────────\n//\n// These values produce a generous, readable layout. The column gap gives\n// enough space for edge routing and labels. Row gap ensures branches don't\n// feel cramped. All values are in pixels.\n\nconst LANE_LABEL_W = 28; // Lane left label strip width (vertical text, like Bizagi)\nconst LANE_H_PAD = 20; // horizontal padding between lane label strip and first column\nconst COL_GAP = 80; // horizontal gap between columns\nconst ROW_HEIGHT = 80; // vertical slot height per row (fits a 60px task)\nconst ROW_GAP = 60; // gap between rows within a lane\nconst LANE_V_PAD = 50; // top/bottom breathing room inside a lane\nconst POOL_H_PAD = 60; // padding for nodes placed directly in pool (no lane parent)\nconst POOL_V_GAP = 50; // vertical gap between separate pools\nconst LANE_MIN_H = 160; // minimum lane height even when almost empty\nconst POOL_MIN_W = 720; // minimum pool width\nconst POOL_INNER_PAD = 8; // gap between Pool border and Lane on all sides.\n // 8px = pool border (2px) + 6px visible gap, enough to grab\n // the resize handle without selecting the Pool first.\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// ── Per-pool layout ────────────────────────────────────────────────────────\n\ninterface PoolResult {\n nodes: BpmnRFNode[]; // updated pool + lanes + content\n width: number;\n height: number;\n}\n\nfunction layoutPool(\n pool: BpmnRFNode,\n lanes: BpmnRFNode[], // Lane nodes whose parentId === pool.id\n content: BpmnRFNode[], // non-container nodes belonging to this pool\n allEdges: BpmnRFEdge[],\n): PoolResult {\n // ── Empty pool ────────────────────────────────────────────────────────────\n if (content.length === 0) {\n // Completely empty pool (no lanes, no content) → compact minimum size.\n if (lanes.length === 0) {\n return { nodes: [], width: 240, height: 120 };\n }\n // Pool with lanes but no content nodes — size to fit stacked empty lanes.\n const laneH = LANE_MIN_H;\n const h = POOL_INNER_PAD * 2 + lanes.length * laneH + Math.max(0, lanes.length - 1) * POOL_INNER_PAD;\n const w = POOL_MIN_W;\n return {\n nodes: lanes.map((lane, i) => ({\n ...lane,\n position: { x: POOL_INNER_PAD, y: POOL_INNER_PAD + i * (laneH + POOL_INNER_PAD) },\n width: w - POOL_INNER_PAD * 2,\n height: laneH,\n })),\n width: w,\n height: h,\n };\n }\n\n // ── Graph analysis (Phases 1-3) ───────────────────────────────────────────\n\n const contentIds = new Set(content.map(n => n.id));\n const seqEdges = extractSeqEdges(allEdges, 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 const pairs = detectGatewayPairs(content, fwdEdges);\n const rows = assignRows(content, fwdEdges, columns, pairs);\n\n // ── Lane ordering ─────────────────────────────────────────────────────────\n // Sort by stored pool-relative Y only when lanes have distinct positions\n // (i.e., after a previous layout pass). When all lanes are at y≈0 (freshly\n // created by AI or palette), preserve original array order (= creation order\n // = intended visual order: Usuario → Sistema → Equipo comercial etc).\n const lanePositionsDistinct = lanes.some(l => Math.abs(l.position.y) > 10);\n const sortedLanes = lanePositionsDistinct\n ? [...lanes].sort((a, b) => a.position.y - b.position.y)\n : [...lanes];\n const hasLanes = sortedLanes.length > 0;\n\n // Map each content node to its lane id (or a synthetic \"_pool_\" bucket).\n const nodeLaneId = new Map<string, string>();\n for (const node of content) {\n if (hasLanes && node.parentId && node.parentId !== pool.id) {\n nodeLaneId.set(node.id, node.parentId);\n } else {\n nodeLaneId.set(node.id, \"_pool_\");\n }\n }\n\n // ── Per-lane row statistics ────────────────────────────────────────────────\n // We need to know the min/max rows used in each lane to center the content.\n\n const laneIds = hasLanes ? sortedLanes.map(l => l.id) : [\"_pool_\"];\n\n interface LaneStat {\n minRow: number;\n maxRow: number;\n rowCount: number;\n height: number;\n }\n const laneStats = new Map<string, LaneStat>();\n\n for (const laneId of laneIds) {\n const laneRows = content\n .filter(n => nodeLaneId.get(n.id) === laneId)\n .map(n => rows.get(n.id) ?? 0);\n\n if (laneRows.length === 0) {\n laneStats.set(laneId, { minRow: 0, maxRow: 0, rowCount: 1, height: LANE_MIN_H });\n } else {\n const minRow = Math.min(...laneRows);\n const maxRow = Math.max(...laneRows);\n const rowCount = maxRow - minRow + 1;\n const contentH = rowCount * ROW_HEIGHT + Math.max(0, rowCount - 1) * ROW_GAP;\n // Lane label is now on the LEFT (vertical strip), not the top.\n // Total height = vertical padding + content.\n const height = Math.max(LANE_MIN_H, LANE_V_PAD * 2 + contentH);\n laneStats.set(laneId, { minRow, maxRow, rowCount, height });\n }\n }\n\n // ── Column widths ─────────────────────────────────────────────────────────\n // Each column is as wide as the widest node assigned to it.\n\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 content) {\n const c = columns.get(node.id) ?? 0;\n colW.set(c, Math.max(colW.get(c) ?? 0, nW(node)));\n }\n\n // Cumulative X offsets for each column.\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; // remove trailing gap\n\n // ── Pool/Lane dimensions ──────────────────────────────────────────────────\n\n // Pool has POOL_INNER_PAD (8px) on all sides — visible gap for resize handles.\n // Lane body has pointer-events:none so Pool border is always accessible.\n // Content within Lane starts after: Lane label strip (28px) + padding (20px).\n const innerW = LANE_LABEL_W + LANE_H_PAD + contentW + LANE_H_PAD;\n const poolW = Math.max(POOL_MIN_W, innerW + POOL_INNER_PAD * 2);\n const laneW = poolW - POOL_INNER_PAD * 2; // Lane fills pool minus 8px each side\n\n // Compute cumulative Y offsets for lanes (stacked, starting after top padding).\n // POOL_INNER_PAD (8px) is added between consecutive lanes to match the gap\n // that the manual lane-add flow produces.\n const laneY = new Map<string, number>();\n let cumY = POOL_INNER_PAD; // start after top padding\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; // 8px gap between lanes\n }\n const poolH = cumY + POOL_INNER_PAD; // add bottom padding\n\n // ── Position content nodes ────────────────────────────────────────────────\n\n const positionedContent = content.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 lYOff = laneY.get(laneId) ?? 0;\n\n const colOffset = (colX.get(c) ?? 0) + (colW.get(c) ?? 120) / 2 - nW(node) / 2;\n const rowOffset = (r - stat.minRow) * (ROW_HEIGHT + ROW_GAP) + ROW_HEIGHT / 2 - nH(node) / 2;\n\n // Positions must be RELATIVE TO THE NODE'S PARENT (Lane or Pool).\n // ReactFlow places children at parentAbsolutePos + childRelativePos.\n // Storing pool-absolute coords as lane-relative doubles the offsets when\n // the parent is dragged — which breaks all drag/move operations.\n const isLaneChild = hasLanes && !!node.parentId && node.parentId !== pool.id;\n\n // Lane label strip is on the LEFT (LANE_LABEL_W = 28px).\n // Content x (lane-relative): after label strip + horizontal padding.\n // Content y (lane-relative): centered vertically in the full lane height.\n const contentH_stat = stat.rowCount * ROW_HEIGHT + Math.max(0, stat.rowCount - 1) * ROW_GAP;\n const vertTopOffset = Math.max(LANE_V_PAD, (stat.height - contentH_stat) / 2);\n\n const x = isLaneChild\n ? LANE_LABEL_W + LANE_H_PAD + colOffset // Lane-relative: after left label strip + padding\n : POOL_H_PAD + colOffset; // Pool-relative (no lane parent)\n\n const y = isLaneChild\n ? vertTopOffset + rowOffset // Lane-relative: centered vertically\n : lYOff + vertTopOffset + rowOffset; // Pool-relative: lane offset + same\n\n return { ...node, position: { x, y } };\n });\n\n // ── Overlap resolution ────────────────────────────────────────────────────\n // After position assignment, sweep each lane left-to-right and nudge any\n // node that overlaps its left neighbour. This handles cases where nested\n // gateway branching assigns two nodes to the same (col, row) slot.\n\n const NODE_MIN_GAP = 20;\n const resolvedContent = [...positionedContent];\n\n for (const laneId of laneIds) {\n // Sort nodes in this lane by their computed X position.\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 // Only nudge if they are vertically close enough to visually collide.\n const prevBottom = prev.position.y + nH(prev);\n const currTop = curr.position.y;\n const prevTop = prev.position.y;\n const currBottom = curr.position.y + nH(curr);\n const yOverlap = prevBottom + NODE_MIN_GAP > currTop && currBottom + NODE_MIN_GAP > prevTop;\n\n if (!yOverlap) continue;\n\n const prevRight = prev.position.x + nW(prev);\n if (prevRight + NODE_MIN_GAP > curr.position.x) {\n resolvedContent[laneNodeIndices[k].i] = {\n ...curr,\n position: {\n x: prevRight + NODE_MIN_GAP,\n y: curr.position.y,\n },\n };\n }\n }\n }\n\n // ── Position lanes ────────────────────────────────────────────────────────\n\n const positionedLanes = hasLanes\n ? sortedLanes.map(lane => ({\n ...lane,\n // x: after pool label strip + left inner padding\n // y: laneY already includes top POOL_INNER_PAD offset\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 // ── Result ────────────────────────────────────────────────────────────────\n\n return {\n nodes: [...resolvedContent, ...positionedLanes],\n width: poolW,\n height: poolH,\n };\n}\n\n// ── Phase 5: Orthogonal edge routing ─────────────────────────────────────\n//\n// Computes precise bend points for each sequence flow edge so they render\n// as clean orthogonal paths instead of ReactFlow's default bezier curves.\n//\n// Routing rules:\n// Same lane, same row → straight horizontal (no bend points needed)\n// Same lane, cross row → L-shape through vertical connector in the column gap\n// Cross lane → exit bottom/top → vertical to lane border → enter top/bottom\n// Back-edge (loop) → U-arc above the flow\n// Cross-pool / other → clear routing points, let ReactFlow draw smooth curve\n\nconst BACK_EDGE_CLEARANCE = 50; // px above the topmost node for back-edge arcs\nconst SAME_ROW_THRESHOLD = 15; // px — Y difference below this = \"same row\"\n\n// Compute absolute (viewport) position of a node by walking up the parent chain.\nfunction absolutePos(\n nodeId: string,\n byId: Map<string, BpmnRFNode>,\n cache: Map<string, { x: number; y: number }>,\n): { x: number; y: number } {\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\n// Return the lane id a content node belongs to (undefined = directly in pool / no lane).\nfunction laneOf(node: BpmnRFNode, laneIds: Set<string>): string | undefined {\n return node.parentId && laneIds.has(node.parentId) ? node.parentId : undefined;\n}\n\ntype Pt = { x: number; y: number };\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 return edges.map(edge => {\n const edgeType = (edge.data?.edgeType ?? edge.type) as string;\n\n // Non-sequence edges: clear routing points, ReactFlow smooth curve handles them.\n if (edgeType !== \"sequenceFlow\") {\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 // Center points\n const sCX = sAbs.x + sW / 2, sCY = sAbs.y + sH / 2;\n const tCX = tAbs.x + tW / 2, tCY = tAbs.y + tH / 2;\n\n // Cross-pool edge → no routing, let ReactFlow handle it.\n const srcPool = poolIds.has(src.parentId ?? \"\") ? src.parentId\n : poolIds.has(byId.get(src.parentId ?? \"\")?.parentId ?? \"\") ? byId.get(src.parentId ?? \"\")?.parentId\n : src.parentId;\n const tgtPool = poolIds.has(tgt.parentId ?? \"\") ? tgt.parentId\n : poolIds.has(byId.get(tgt.parentId ?? \"\")?.parentId ?? \"\") ? byId.get(tgt.parentId ?? \"\")?.parentId\n : tgt.parentId;\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 routed ABOVE the flow ──────────────────────────────\n if (backEdgeIds.has(edge.id)) {\n const topY = Math.min(sAbs.y, tAbs.y) - BACK_EDGE_CLEARANCE;\n routingPoints = [\n { x: sCX, y: sAbs.y }, // [0] discarded\n { x: sCX, y: topY }, // [1] go up\n { x: tCX, y: topY }, // [2] go left/right\n { x: tCX, y: tAbs.y }, // [3] discarded\n ];\n }\n\n // ── Cross-lane: vertical routing through lane border ────────────────────\n else if (laneOf(src, laneIds) !== laneOf(tgt, laneIds)) {\n const goingDown = tAbs.y > sAbs.y;\n\n // Use the shared X midpoint between source and target columns if different,\n // otherwise use source center X to keep the path vertically clean.\n const sharedX = Math.abs(sCX - tCX) < 10 ? sCX : (sCX + tCX) / 2;\n\n const srcLane = byId.get(src.parentId ?? \"\");\n const tgtLane = byId.get(tgt.parentId ?? \"\");\n\n if (srcLane && tgtLane && laneIds.has(srcLane.id) && laneIds.has(tgtLane.id)) {\n const srcLaneAbs = abs(srcLane.id);\n const borderY = goingDown\n ? srcLaneAbs.y + (srcLane.height ?? 160)\n : srcLaneAbs.y;\n\n // SequenceFlowEdge uses pointsToSvgPath([sourceXY, ...points.slice(1,-1), targetXY])\n // so we need 4 points: first and last are discarded, middle two are the bend points.\n routingPoints = [\n { x: sCX, y: goingDown ? sAbs.y + sH : sAbs.y }, // [0] discarded\n { x: sharedX, y: goingDown ? sAbs.y + sH : sAbs.y }, // [1] bend: horizontal exit\n { x: sharedX, y: borderY }, // [2] bend: lane border\n { x: sharedX, y: goingDown ? tAbs.y : tAbs.y + tH }, // [3] discarded\n ];\n } else {\n routingPoints = [\n { x: sCX, y: sCY },\n { x: sharedX, y: sCY },\n { x: sharedX, y: tCY },\n { x: tCX, y: tCY },\n ];\n }\n }\n\n // ── Same lane, same row: straight — no bend points ─────────────────────\n else if (Math.abs(sCY - tCY) <= SAME_ROW_THRESHOLD) {\n // ReactFlow draws a straight edge when source and target handles align.\n const d = { ...edge.data };\n delete d.routingPoints;\n return { ...edge, data: d } as unknown as BpmnRFEdge;\n }\n\n // ── Same lane, cross-row: routing depends on source handle direction ───\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 // Handle exits vertically: go straight up/down then horizontal to target.\n // No horizontal exit segment needed — avoids the \"dips down before going up\" artefact.\n routingPoints = [\n { x: sCX, y: exitsTop ? sAbs.y : sAbs.y + sH }, // [0] discarded\n { x: sCX, y: tCY }, // [1] vertical to target row\n { x: tCX, y: tCY }, // [2] horizontal to target\n { x: tCX, y: exitsTop ? tAbs.y + tH : tAbs.y }, // [3] discarded\n ];\n } else {\n // Handle exits horizontally (right/left): classic L-shape.\n const goingRight = tAbs.x >= sAbs.x;\n const midX = goingRight\n ? sAbs.x + sW + COL_GAP / 2\n : sAbs.x - COL_GAP / 2;\n\n routingPoints = [\n { x: sAbs.x + sW, y: sCY }, // [0] discarded\n { x: midX, y: sCY }, // [1] horizontal exit\n { x: midX, y: tCY }, // [2] vertical to target row\n { x: tAbs.x, y: tCY }, // [3] discarded\n ];\n }\n }\n\n return { ...edge, data: { ...edge.data, routingPoints } } as unknown as BpmnRFEdge;\n });\n}\n\n// ── Main entry point ───────────────────────────────────────────────────────\n\nexport async function bpmnCustomLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): Promise<{ nodes: BpmnRFNode[]; edges: BpmnRFEdge[] }> {\n const pools = nodes.filter(n => n.data.elementType === \"Pool\");\n const lanes = nodes.filter(n => n.data.elementType === \"Lane\");\n const content = nodes.filter(n => !LAYOUT_CONTAINER_TYPES.has(n.data.elementType));\n\n // ── Fallback: no pools → use ELK for free-node diagrams ───────────────────\n if (pools.length === 0) {\n const { bpmnElkLayout } = await import(\"./elk\");\n return bpmnElkLayout(nodes, edges);\n }\n\n const poolIds = new Set(pools.map(p => p.id));\n const allLaneIds = new Set(lanes.map(l => l.id));\n\n // ── Collect back-edges across ALL pools for routing ───────────────────────\n const allContentIds = new Set(content.map(n => n.id));\n const allSeqEdges = edges.filter(e => {\n const t = (e.data?.edgeType ?? e.type) as string;\n return t === \"sequenceFlow\" && allContentIds.has(e.source) && allContentIds.has(e.target);\n }).map(e => ({ id: e.id, source: e.source, target: e.target }));\n const allBackEdgeIds = detectBackEdges([...allContentIds], allSeqEdges);\n\n // ── Sort pools by original Y position (preserve author intent) ────────────\n // Sort pools by stored Y only when they have distinct positions (after a\n // prior layout pass). When all are at y≈0 (AI-generated or new diagram),\n // preserve original array order = creation order = intended visual order.\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 const poolContent = content.filter(n =>\n n.parentId === pool.id || (n.parentId != null && laneIds.has(n.parentId))\n );\n\n const result = layoutPool(pool, poolLanes, poolContent, 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 // ── Append free nodes not belonging to any pool ───────────────────────────\n const layoutted = new Set(resultNodes.map(n => n.id));\n for (const node of nodes) {\n if (!layoutted.has(node.id)) resultNodes.push(node);\n }\n\n // ── Route edges with absolute positions from the final node layout ─────────\n const routedEdges = routeEdges(edges, resultNodes, allBackEdgeIds, allLaneIds, poolIds);\n\n return { nodes: resultNodes, edges: routedEdges };\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 };\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/bpmn-layout-graph.ts","../../src/layout/bpmn-custom-layout.ts","../../src/layout/index.ts"],"names":["positionedBoundaries","bpmnElkLayout"],"mappings":"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","file":"index.js","sourcesContent":["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 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 nodeIds) state.set(id, 0);\n\n const adj = new Map<string, Array<{ target: string; edgeId: string }>>();\n for (const id of nodeIds) adj.set(id, []);\n for (const e of seqEdges) {\n adj.get(e.source)?.push({ target: e.target, edgeId: e.id });\n }\n\n // Iterative DFS to avoid call-stack overflow on large diagrams.\n for (const startId of nodeIds) {\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: Gateway pair detection ──────────────────────────────────────\n//\n// Finds (split gateway) → (merge gateway) 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\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 =>\n LAYOUT_GATEWAY_TYPES.has(n.data.elementType) &&\n (succs.get(n.id)?.length ?? 0) > 1\n );\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// Row offsets are alternating so branches expand symmetrically:\n// 0, +1, -1, +2, -2, +3, -3 ...\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\nexport function assignRows(\n nodes: BpmnRFNode[],\n forwardEdges: LayoutEdgeInfo[],\n columns: Map<string, number>,\n gatewayPairs: Map<string, string>,\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 deepest (rightmost column) to shallowest so inner\n // gateways inherit the correct base row from their already-assigned nodes.\n const sortedPairs = [...gatewayPairs.entries()].sort(\n (a, b) => (columns.get(b[0]) ?? 0) - (columns.get(a[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 start,\n nodeIds: getBranchNodes(start),\n bias: handleToRowBias(splitHandles?.get(start) ?? null),\n }));\n\n // Assign rows: if a branch has a handle bias (top/bottom), use it directly.\n // Otherwise fall back to size-based ordering (largest = row 0).\n // Branches with bias=0 (right handle) or no bias are sorted by size.\n const withBias = branchData.filter(b => b.bias !== null && b.bias !== 0);\n const withoutBias = branchData.filter(b => b.bias === null || b.bias === 0)\n .sort((a, b) => b.nodeIds.length - a.nodeIds.length);\n\n // Place size-ordered branches at row 0, then fill remaining offsets.\n const assigned = new Map<string, number>();\n for (const b of withBias) {\n assigned.set(b.start, splitRow + b.bias!);\n }\n let nextOffset = 0;\n for (const b of withoutBias) {\n while ([...assigned.values()].includes(splitRow + nextOffset)) nextOffset++;\n assigned.set(b.start, splitRow + nextOffset);\n nextOffset++;\n }\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 }\n\n // ── Second pass: terminal splits (no merge detected) ──────────────────────\n // Gateways 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.\n const pairedSplits = new Set(gatewayPairs.keys());\n\n const unpairedSplits = nodes.filter(n =>\n LAYOUT_GATEWAY_TYPES.has(n.data.elementType) &&\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 start,\n nodeIds: getAllReachable(start),\n bias: handleToRowBias(splitHandles2?.get(start) ?? null),\n }));\n\n const withBias2 = branchData.filter(b => b.bias !== null && b.bias !== 0);\n const withoutBias2 = branchData.filter(b => b.bias === null || b.bias === 0)\n .sort((a, b) => b.nodeIds.length - a.nodeIds.length);\n\n const assigned2 = new Map<string, number>();\n for (const b of withBias2) assigned2.set(b.start, splitRow + b.bias!);\n let nextOff = 0;\n for (const b of withoutBias2) {\n while ([...assigned2.values()].includes(splitRow + nextOff)) nextOff++;\n assigned2.set(b.start, splitRow + nextOff);\n nextOff++;\n }\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 detectBackEdges,\n extractSeqEdges,\n assignColumns,\n detectGatewayPairs,\n assignRows,\n} from \"./bpmn-layout-graph\";\n\n// ── Layout constants ───────────────────────────────────────────────────────\n\nconst LANE_LABEL_W = 28;\nconst LANE_H_PAD = 40;\nconst COL_GAP = 100;\nconst ROW_HEIGHT = 100;\nconst ROW_GAP = 80;\nconst LANE_V_PAD = 60;\nconst POOL_H_PAD = 80;\nconst POOL_V_GAP = 60;\nconst LANE_MIN_H = 200;\nconst POOL_MIN_W = 840;\nconst POOL_INNER_PAD = 10;\nconst BACK_EDGE_CLEARANCE = 70;\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// ── 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// ── 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 = nW(host);\n const hostH = nH(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 seqEdges = extractSeqEdges(edges, 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 ───────────────────────────────────────────\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, nW(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 ─────────────────────────────────────────────────────────────\n const rowVals = [...rows.values()];\n const minRow = Math.min(0, ...rowVals);\n const maxRow = Math.max(0, ...rowVals);\n const rowCount = maxRow - minRow + 1;\n const contentH = rowCount * ROW_HEIGHT + Math.max(0, rowCount - 1) * ROW_GAP;\n\n // ── Container size ─────────────────────────────────────────────────────────\n const spW = Math.max(280, SP_PAD * 2 + contentW);\n const spH = Math.max(160, SP_PAD * 2 + 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\n const colOffset = (colX.get(c) ?? 0) + (colW.get(c) ?? 120) / 2 - nW(node) / 2;\n const rowOffset = (r - minRow) * (ROW_HEIGHT + ROW_GAP) + ROW_HEIGHT / 2 - nH(node) / 2;\n\n return {\n ...node,\n position: { x: SP_PAD + colOffset, y: SP_PAD + rowOffset },\n };\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\n const lanePositionsDistinct = lanes.some(l => Math.abs(l.position.y) > 10);\n const sortedLanes = lanePositionsDistinct\n ? [...lanes].sort((a, b) => a.position.y - b.position.y)\n : [...lanes];\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 seqEdges = extractSeqEdges(allEdges, 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 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);\n for (const [id, row] of laneRows) rows.set(id, row);\n }\n\n // ── Phase 3: Per-lane row statistics ──────────────────────────────────────\n\n const laneIds = hasLanes ? sortedLanes.map(l => l.id) : [\"_pool_\"];\n\n interface LaneStat {\n minRow: number; maxRow: number; rowCount: number; height: number;\n }\n const laneStats = new Map<string, LaneStat>();\n\n for (const laneId of laneIds) {\n const laneRows = mainContent\n .filter(n => nodeLaneId.get(n.id) === laneId)\n .map(n => rows.get(n.id) ?? 0);\n\n if (laneRows.length === 0) {\n laneStats.set(laneId, { minRow: 0, maxRow: 0, rowCount: 1, height: LANE_MIN_H });\n } else {\n const minRow = Math.min(...laneRows);\n const maxRow = Math.max(...laneRows);\n const rowCount = maxRow - minRow + 1;\n const contentH = rowCount * ROW_HEIGHT + Math.max(0, rowCount - 1) * ROW_GAP;\n const height = Math.max(LANE_MIN_H, LANE_V_PAD * 2 + contentH);\n laneStats.set(laneId, { minRow, maxRow, rowCount, height });\n }\n }\n\n // ── Phase 4: Column widths and cumulative X offsets ───────────────────────\n\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 mainContent) {\n const c = columns.get(node.id) ?? 0;\n colW.set(c, Math.max(colW.get(c) ?? 0, nW(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 // ── Phase 5: Pool and lane dimensions ─────────────────────────────────────\n\n const innerW = LANE_LABEL_W + LANE_H_PAD + contentW + LANE_H_PAD;\n const poolW = Math.max(POOL_MIN_W, innerW + POOL_INNER_PAD * 2);\n const 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 lYOff = laneY.get(laneId) ?? 0;\n\n const colOffset = (colX.get(c) ?? 0) + (colW.get(c) ?? 120) / 2 - nW(node) / 2;\n const rowOffset = (r - stat.minRow) * (ROW_HEIGHT + ROW_GAP) + ROW_HEIGHT / 2 - nH(node) / 2;\n\n const contentH_stat = stat.rowCount * ROW_HEIGHT + Math.max(0, stat.rowCount - 1) * ROW_GAP;\n const vertTopOffset = Math.max(LANE_V_PAD, (stat.height - contentH_stat) / 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 return { ...node, position: { x, y } };\n });\n\n // ── Phase 7: Overlap resolution ───────────────────────────────────────────\n\n const NODE_MIN_GAP = 24;\n const resolvedContent = [...positionedContent];\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 const prevBottom = prev.position.y + nH(prev);\n const currTop = curr.position.y;\n const prevTop = prev.position.y;\n const currBottom = curr.position.y + nH(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 + nW(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 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: poolW,\n height: poolH,\n };\n}\n\n// ── Geometry helpers ───────────────────────────────────────────────────────\n\ntype Pt = { x: number; y: 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 laneOf(node: BpmnRFNode, laneIds: Set<string>): string | undefined {\n return node.parentId && laneIds.has(node.parentId) ? node.parentId : undefined;\n}\n\n/** Midpoint of the column gap between two nodes — guaranteed in empty space. */\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; // same column fallback\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 return edges.map(edge => {\n const edgeType = (edge.data?.edgeType ?? edge.type) as string;\n\n if (edgeType !== \"sequenceFlow\") {\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 getPool = (nodeId: string): string | null => {\n const node = byId.get(nodeId);\n if (!node) return null;\n if (poolIds.has(nodeId)) return nodeId;\n if (node.parentId && poolIds.has(node.parentId)) return node.parentId;\n if (node.parentId) {\n const gp = byId.get(node.parentId)?.parentId ?? null;\n if (gp && poolIds.has(gp)) return gp;\n }\n return node.parentId ?? null;\n };\n if (getPool(edge.source) !== getPool(edge.target)) {\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 const topY = Math.min(sAbs.y, tAbs.y) - BACK_EDGE_CLEARANCE;\n routingPoints = [\n { x: sCX, y: sAbs.y },\n { x: sCX, y: topY },\n { x: tCX, y: topY },\n { x: tCX, y: tAbs.y + tH },\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) !== laneOf(tgt, laneIds)) {\n const srcLane = byId.get(src.parentId ?? \"\");\n const tgtLane = byId.get(tgt.parentId ?? \"\");\n\n if (srcLane && tgtLane && laneIds.has(srcLane.id) && laneIds.has(tgtLane.id)) {\n const goingDown = tAbs.y > sAbs.y;\n const sharedX = gapMidX(sAbs, sW, tAbs, tW);\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: sCX, y: sAbs.y + sH }); // [0] discarded\n pts.push({ x: sharedX, y: sAbs.y + sH }); // horizontal exit\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: tCX, y: lastY }); // horizontal entry\n pts.push({ x: tCX, y: tAbs.y + tH }); // [last] discarded\n } else {\n pts.push({ x: sCX, y: sAbs.y });\n pts.push({ x: sharedX, y: sAbs.y });\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: tCX, y: lastY });\n pts.push({ x: tCX, y: tAbs.y });\n }\n\n routingPoints = pts;\n } else {\n const sharedX = gapMidX(sAbs, sW, tAbs, tW);\n routingPoints = [\n { x: sCX, y: sCY },\n { x: sharedX, y: sCY },\n { x: sharedX, y: tCY },\n { x: tCX, 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 routingPoints = [\n { x: sCX, y: exitsTop ? sAbs.y : sAbs.y + sH },\n { x: sCX, y: tCY },\n { x: tCX, y: tCY },\n { x: tCX, y: exitsTop ? tAbs.y + tH : tAbs.y },\n ];\n } else {\n const midX = gapMidX(sAbs, sW, tAbs, tW);\n routingPoints = [\n { x: sAbs.x + sW, y: sCY },\n { x: midX, y: sCY },\n { x: midX, y: tCY },\n { x: tAbs.x, y: tCY },\n ];\n }\n }\n\n return { ...edge, data: { ...edge.data, routingPoints } } 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\n\nfunction positionArtifacts(\n artifacts: BpmnRFNode[],\n resultNodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\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\n // Build: connectedNodeId → artifacts[] (Groups are ungrouped — keep original).\n const artifactsByNode = new Map<string, BpmnRFNode[]>();\n const ungrouped: BpmnRFNode[] = [];\n\n for (const artifact of artifacts) {\n if (artifact.data.elementType === \"Group\") {\n ungrouped.push(artifact); // Groups are visual bounds — keep position.\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 positioned.push({\n ...artifact,\n position: {\n x: desiredAbsX - parentAbsP.x,\n y: desiredAbsY - parentAbsP.y,\n },\n });\n desiredAbsX += nW(artifact) + ARTIFACT_H_SPACING;\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 const expandedSubProcesses = mainNodes.filter(\n n => COLLAPSED_SUBPROCESS_TYPES.has(n.data.elementType) && n.data.isExpanded,\n );\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 const content = workingMainNodes.filter(n => {\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 // ── Fallback: no pools → ELK for free-node diagrams ──────────────────────\n if (pools.length === 0) {\n const { bpmnElkLayout } = await import(\"./elk\");\n const elkResult = await bpmnElkLayout(nodes.filter(n => !LAYOUT_ARTIFACT_TYPES.has(n.data.elementType)), edges);\n const posArtifacts = positionArtifacts(artifacts, elkResult.nodes, edges);\n return { nodes: [...elkResult.nodes, ...posArtifacts], edges: elkResult.edges };\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. Rather than preserving their original positions, run ELK on\n // them so they are organised and 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 freeEdges = edges.filter(\n e => freeNodes.some(n => n.id === e.source || n.id === e.target),\n );\n try {\n const { bpmnElkLayout } = await import(\"./elk\");\n const elkFree = await bpmnElkLayout(freeNodes, freeEdges);\n\n // Place the free-node cluster below all pools.\n const offsetY = stackY; // stackY already includes last pool height + gap\n for (const node of elkFree.nodes) {\n resultNodes.push({\n ...node,\n position: { x: node.position.x, y: node.position.y + offsetY },\n });\n }\n // Merge ELK-routed free edges back — keep pool edges unchanged.\n const freeEdgeIds = new Set(freeEdges.map(e => e.id));\n const elkEdgeMap = new Map(elkFree.edges.map(e => [e.id, e]));\n for (let i = 0; i < edges.length; i++) {\n if (freeEdgeIds.has(edges[i].id) && elkEdgeMap.has(edges[i].id)) {\n edges[i] = elkEdgeMap.get(edges[i].id)!;\n }\n }\n } catch {\n // ELK unavailable — fall back to appending at original positions.\n for (const node of freeNodes) resultNodes.push(node);\n }\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);\n\n return {\n nodes: [...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 };\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"]}