@aranzatech/diagrams-bpmn 0.2.13 → 0.2.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{catalog-Di2nzGs9.d.ts → catalog-CK3_4cOb.d.ts} +1 -1
- package/dist/{catalog-BiLXVn-2.d.cts → catalog-xOMF2ifW.d.cts} +1 -1
- package/dist/{chunk-UAWLUDKC.js → chunk-HOWK3ZOO.js} +105 -13
- package/dist/chunk-HOWK3ZOO.js.map +1 -0
- package/dist/{chunk-O3NWJ5H7.js → chunk-QSMP34CT.js} +38 -5
- package/dist/chunk-QSMP34CT.js.map +1 -0
- package/dist/{chunk-IMW6RG6F.js → chunk-X54NHLBA.js} +43 -190
- package/dist/chunk-X54NHLBA.js.map +1 -0
- package/dist/chunk-XMVV7FRZ.js +163 -0
- package/dist/chunk-XMVV7FRZ.js.map +1 -0
- package/dist/edges/index.cjs +35 -2
- package/dist/edges/index.cjs.map +1 -1
- package/dist/edges/index.js +1 -1
- package/dist/elements/index.d.cts +4 -4
- package/dist/elements/index.d.ts +4 -4
- package/dist/elk-FSFIEL6O.js +6 -0
- package/dist/elk-FSFIEL6O.js.map +1 -0
- package/dist/{guards-DPHXfpY8.d.cts → guards-C70uIY_O.d.cts} +1 -1
- package/dist/{guards-qgSeZEU4.d.ts → guards-foB6XIfZ.d.ts} +1 -1
- package/dist/index.cjs +180 -200
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +3 -3
- package/dist/layout/index.cjs +1428 -755
- package/dist/layout/index.cjs.map +1 -1
- package/dist/layout/index.d.cts +23 -12
- package/dist/layout/index.d.ts +23 -12
- package/dist/layout/index.js +547 -72
- package/dist/layout/index.js.map +1 -1
- package/dist/modeling/index.cjs +103 -10
- package/dist/modeling/index.cjs.map +1 -1
- package/dist/modeling/index.d.cts +23 -6
- package/dist/modeling/index.d.ts +23 -6
- package/dist/modeling/index.js +1 -1
- package/dist/nodes/index.cjs +42 -188
- package/dist/nodes/index.cjs.map +1 -1
- package/dist/nodes/index.d.cts +1 -1
- package/dist/nodes/index.d.ts +1 -1
- package/dist/nodes/index.js +1 -1
- package/dist/{types-rEfHsPr5.d.ts → types-DG5yPKld.d.ts} +1 -1
- package/dist/{types-s2_VvPGf.d.cts → types-jIDz306Y.d.cts} +1 -1
- package/dist/{types-Dfrt0wVs.d.cts → types-y-ZbX-ff.d.cts} +3 -0
- package/dist/{types-Dfrt0wVs.d.ts → types-y-ZbX-ff.d.ts} +3 -0
- package/dist/validation/index.d.cts +2 -2
- package/dist/validation/index.d.ts +2 -2
- package/dist/xml/index.d.cts +3 -3
- package/dist/xml/index.d.ts +3 -3
- package/package.json +2 -2
- package/dist/chunk-IMW6RG6F.js.map +0 -1
- package/dist/chunk-O3NWJ5H7.js.map +0 -1
- package/dist/chunk-UAWLUDKC.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/elements/catalog.ts","../../src/elements/guards.ts","../../src/modeling/index.ts","../../src/layout/elk.ts","../../src/layout/index.ts"],"names":["getNode","getNodeSize","getOutgoingEdges","getIncomingEdges","createModelingRules","elkLayout","dagreLayout","applyLayoutResultToDiagram"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { BpmnElementType, BpmnElementMeta, BpmnElementSize } from \"./types\";\n\nexport const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta> = {\n // ─── Events ──────────────────────────────────────────────────────────────────\n StartEvent: {\n label: \"Start Event\",\n icon: \"Circle\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"source\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"start\",\n canBeStart: true, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 1,\n },\n EndEvent: {\n label: \"End Event\",\n icon: \"CircleDot\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"target\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"end\",\n canBeStart: false, canBeEnd: true,\n maxOutgoing: 0,\n },\n IntermediateCatchEvent: {\n label: \"Intermediate Catch Event\",\n icon: \"Clock3\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"intermediateCatch\",\n canBeStart: false, canBeEnd: false,\n },\n IntermediateThrowEvent: {\n label: \"Intermediate Throw Event\",\n icon: \"Send\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"intermediateThrow\",\n canBeStart: false, canBeEnd: false,\n },\n BoundaryEvent: {\n label: \"Boundary Event\",\n icon: \"AlarmClock\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"source\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"boundary\",\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0,\n },\n\n // ─── Tasks ───────────────────────────────────────────────────────────────────\n Task: {\n label: \"Task\",\n icon: \"CheckSquare\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n UserTask: {\n label: \"User Task\",\n icon: \"UserRound\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ServiceTask: {\n label: \"Service Task\",\n icon: \"Cog\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ScriptTask: {\n label: \"Script Task\",\n icon: \"FileCode\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ManualTask: {\n label: \"Manual Task\",\n icon: \"Hand\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n BusinessRuleTask: {\n label: \"Business Rule Task\",\n icon: \"Table2\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ReceiveTask: {\n label: \"Receive Task\",\n icon: \"Inbox\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n SendTask: {\n label: \"Send Task\",\n icon: \"Send\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n CallActivity: {\n label: \"Call Activity\",\n icon: \"ExternalLink\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n\n // ─── Gateways ────────────────────────────────────────────────────────────────\n ExclusiveGateway: {\n label: \"Exclusive Gateway\",\n icon: \"X\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n InclusiveGateway: {\n label: \"Inclusive Gateway\",\n icon: \"Circle\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n ParallelGateway: {\n label: \"Parallel Gateway\",\n icon: \"Plus\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n EventBasedGateway: {\n label: \"Event-Based Gateway\",\n icon: \"Radio\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 1,\n },\n ComplexGateway: {\n label: \"Complex Gateway\",\n icon: \"Asterisk\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n\n // ─── Containers ───────────────────────────────────────────────────────────────\n SubProcess: {\n label: \"Sub-Process\",\n icon: \"PlusSquare\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: true,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n Transaction: {\n label: \"Transaction\",\n icon: \"Receipt\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: true,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n EventSubProcess: {\n label: \"Event Sub-Process\",\n icon: \"CircleDotDashed\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n AdHocSubProcess: {\n label: \"Ad-Hoc Sub-Process\",\n icon: \"Waves\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: true,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n Pool: {\n label: \"Pool\",\n icon: \"Rows3\",\n category: \"container\",\n defaultWidth: 600, defaultHeight: 200,\n handlePolicy: \"none\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n Lane: {\n label: \"Lane\",\n icon: \"PanelTop\",\n category: \"container\",\n defaultWidth: 600, defaultHeight: 120,\n handlePolicy: \"none\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n\n // ─── Artifacts ────────────────────────────────────────────────────────────────\n Annotation: {\n label: \"Text Annotation\",\n icon: \"StickyNote\",\n category: \"artifact\",\n defaultWidth: 100, defaultHeight: 60,\n handlePolicy: \"none\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n Group: {\n label: \"Group\",\n icon: \"Group\",\n category: \"artifact\",\n defaultWidth: 300, defaultHeight: 200,\n handlePolicy: \"none\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n\n // ─── Data (BPMN 2.0 §10.3) ───────────────────────────────────────────────────\n DataObject: {\n label: \"Data Object\",\n icon: \"File\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n DataObjectReference: {\n label: \"Data Object Reference\",\n icon: \"FileSymlink\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n DataInput: {\n label: \"Data Input\",\n icon: \"FileInput\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0,\n },\n DataOutput: {\n label: \"Data Output\",\n icon: \"FileOutput\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxOutgoing: 0,\n },\n DataStore: {\n label: \"Data Store\",\n icon: \"Database\",\n category: \"data\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n DataStoreReference: {\n label: \"Data Store Reference\",\n icon: \"DatabaseZap\",\n category: \"data\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n\n // ─── Conversation (BPMN 2.0 §12) ─────────────────────────────────────────────\n Conversation: {\n label: \"Conversation\",\n icon: \"MessageCircle\",\n category: \"conversation\",\n defaultWidth: 60, defaultHeight: 52,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n SubConversation: {\n label: \"Sub-Conversation\",\n icon: \"MessagesSquare\",\n category: \"conversation\",\n defaultWidth: 60, defaultHeight: 52,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: true, acceptsBoundaryEvents: false,\n supportsCollapse: true,\n canBeStart: false, canBeEnd: false,\n },\n CallConversation: {\n label: \"Call Conversation\",\n icon: \"PhoneCall\",\n category: \"conversation\",\n defaultWidth: 60, defaultHeight: 52,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n\n // ─── Choreography (BPMN 2.0 §11) ─────────────────────────────────────────────\n ChoreographyTask: {\n label: \"Choreography Task\",\n icon: \"ArrowLeftRight\",\n category: \"choreography\",\n defaultWidth: 120, defaultHeight: 80,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n SubChoreography: {\n label: \"Sub-Choreography\",\n icon: \"BoxSelect\",\n category: \"choreography\",\n defaultWidth: 120, defaultHeight: 80,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n supportsCollapse: true,\n canBeStart: false, canBeEnd: false,\n },\n CallChoreography: {\n label: \"Call Choreography\",\n icon: \"Phone\",\n category: \"choreography\",\n defaultWidth: 120, defaultHeight: 80,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n};\n\nexport function getElementMeta(type: BpmnElementType): BpmnElementMeta {\n return BPMN_ELEMENT_CATALOG[type];\n}\n\nexport const BPMN_RESIZABLE_ELEMENT_TYPES = [\n \"Task\",\n \"UserTask\",\n \"ServiceTask\",\n \"ScriptTask\",\n \"ManualTask\",\n \"BusinessRuleTask\",\n \"ReceiveTask\",\n \"SendTask\",\n \"CallActivity\",\n \"SubProcess\",\n \"Transaction\",\n \"EventSubProcess\",\n \"AdHocSubProcess\",\n \"Pool\",\n \"Lane\",\n \"Annotation\",\n \"Group\",\n \"SubConversation\",\n \"ChoreographyTask\",\n \"SubChoreography\",\n \"CallChoreography\",\n] satisfies BpmnElementType[];\n\nconst BPMN_MIN_SIZE_OVERRIDES: Partial<\n Record<BpmnElementType, Pick<BpmnElementSize, \"minWidth\" | \"minHeight\">>\n> = {\n Task: { minWidth: 80, minHeight: 48 },\n UserTask: { minWidth: 80, minHeight: 48 },\n ServiceTask: { minWidth: 80, minHeight: 48 },\n ScriptTask: { minWidth: 80, minHeight: 48 },\n ManualTask: { minWidth: 80, minHeight: 48 },\n BusinessRuleTask: { minWidth: 80, minHeight: 48 },\n ReceiveTask: { minWidth: 80, minHeight: 48 },\n SendTask: { minWidth: 80, minHeight: 48 },\n CallActivity: { minWidth: 80, minHeight: 48 },\n SubProcess: { minWidth: 160, minHeight: 100 },\n Transaction: { minWidth: 160, minHeight: 100 },\n EventSubProcess: { minWidth: 160, minHeight: 100 },\n AdHocSubProcess: { minWidth: 160, minHeight: 100 },\n Pool: { minWidth: 240, minHeight: 120 },\n Lane: { minWidth: 240, minHeight: 80 },\n Annotation: { minWidth: 80, minHeight: 40 },\n Group: { minWidth: 120, minHeight: 80 },\n SubConversation: { minWidth: 60, minHeight: 52 },\n ChoreographyTask: { minWidth: 100, minHeight: 70 },\n SubChoreography: { minWidth: 100, minHeight: 70 },\n CallChoreography: { minWidth: 100, minHeight: 70 },\n};\n\nconst resizableTypes = new Set<BpmnElementType>(BPMN_RESIZABLE_ELEMENT_TYPES);\n\nexport function isBpmnElementResizable(type: BpmnElementType): boolean {\n return resizableTypes.has(type);\n}\n\nexport function getBpmnElementSize(type: BpmnElementType): BpmnElementSize {\n const meta = getElementMeta(type);\n const min = BPMN_MIN_SIZE_OVERRIDES[type];\n return {\n width: meta.defaultWidth,\n height: meta.defaultHeight,\n minWidth: meta.minWidth ?? min?.minWidth ?? meta.defaultWidth,\n minHeight: meta.minHeight ?? min?.minHeight ?? meta.defaultHeight,\n resizable: meta.resizable ?? isBpmnElementResizable(type),\n };\n}\n","import { BPMN_ELEMENT_CATALOG } from \"./catalog\";\nimport type { BpmnElementType } from \"./types\";\n\nconst TASK_TYPES = new Set<BpmnElementType>([\n \"Task\", \"UserTask\", \"ServiceTask\", \"ScriptTask\",\n \"ManualTask\", \"BusinessRuleTask\", \"ReceiveTask\", \"SendTask\", \"CallActivity\",\n]);\n\nconst GATEWAY_TYPES = new Set<BpmnElementType>([\n \"ExclusiveGateway\", \"InclusiveGateway\", \"ParallelGateway\",\n \"EventBasedGateway\", \"ComplexGateway\",\n]);\n\nconst EVENT_TYPES = new Set<BpmnElementType>([\n \"StartEvent\", \"EndEvent\", \"IntermediateCatchEvent\",\n \"IntermediateThrowEvent\", \"BoundaryEvent\",\n]);\n\nconst DATA_TYPES = new Set<BpmnElementType>([\n \"DataObject\", \"DataObjectReference\", \"DataInput\", \"DataOutput\",\n \"DataStore\", \"DataStoreReference\",\n]);\n\nconst CONVERSATION_TYPES = new Set<BpmnElementType>([\n \"Conversation\", \"SubConversation\", \"CallConversation\",\n]);\n\nconst CHOREOGRAPHY_TYPES = new Set<BpmnElementType>([\n \"ChoreographyTask\", \"SubChoreography\", \"CallChoreography\",\n]);\n\nexport function isTaskType(type: BpmnElementType): boolean {\n return TASK_TYPES.has(type);\n}\n\nexport function isGatewayType(type: BpmnElementType): boolean {\n return GATEWAY_TYPES.has(type);\n}\n\nexport function isEventType(type: BpmnElementType): boolean {\n return EVENT_TYPES.has(type);\n}\n\nexport function isDataType(type: BpmnElementType): boolean {\n return DATA_TYPES.has(type);\n}\n\nexport function isConversationType(type: BpmnElementType): boolean {\n return CONVERSATION_TYPES.has(type);\n}\n\nexport function isChoreographyType(type: BpmnElementType): boolean {\n return CHOREOGRAPHY_TYPES.has(type);\n}\n\nexport function isContainerType(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].isContainer;\n}\n\nexport function acceptsBoundaryEvents(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].acceptsBoundaryEvents;\n}\n\nexport function getHandlePolicy(type: BpmnElementType) {\n return BPMN_ELEMENT_CATALOG[type].handlePolicy;\n}\n\nexport function getOrientation(type: BpmnElementType) {\n return BPMN_ELEMENT_CATALOG[type].orientation;\n}\n\nexport function supportsCollapse(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].supportsCollapse ?? false;\n}\n\nexport function supportsMarkers(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].supportsMarkers ?? false;\n}\n","import {\n addNode,\n connectNodes,\n copyElements,\n createModelingRules,\n createSelectionState,\n createUniqueId,\n DiagramEventBus,\n createDiagramEventBus,\n executeCommand,\n executeCommands,\n findContainingNode,\n getNode,\n getNodeAbsolutePosition,\n getNodeCenterPosition,\n getNodeSize,\n getOutgoingEdges,\n getIncomingEdges,\n groupNodes,\n getNodeTabOrder,\n normalizeDiagramState,\n pasteElements,\n patchEdge,\n patchNode,\n moveNode,\n persistCommandHistory,\n removeElements,\n replaceNode,\n reparentNode,\n resizeNode,\n resizeNodeByHandle,\n restoreCommandHistory,\n setSelection,\n toRelativeNodePosition,\n computeSmartGuides,\n LayoutCache,\n createLayoutCache,\n withLayoutCache,\n getEdgeLabelLayout,\n type CommandStackState,\n type ClipboardState,\n type ConnectionValidator,\n type DiagramCommand,\n type DiagramSnapshot,\n type DiagramState,\n type EdgeLabelLayout,\n type EdgeLabelOffsetOptions,\n type LayoutCacheOptions,\n type LayoutFn,\n type ModelingRules,\n type ResizeHandlePosition,\n type SelectionState,\n type SmartGuideResult,\n type Viewport,\n} from \"@aranzatech/diagrams-core\";\nimport {\n createDiagramDocument,\n deserializeDiagram,\n deserializeDiagramSnapshot,\n parseDiagramDocument,\n serializeDiagram,\n serializeDiagramSnapshot,\n type CreateDiagramDocumentOptions,\n type DiagramDocument,\n} from \"@aranzatech/diagrams-core/serialization\";\nimport {\n BPMN_ELEMENT_CATALOG,\n getBpmnElementSize,\n isBpmnElementResizable,\n} from \"../elements/catalog\";\nimport {\n acceptsBoundaryEvents,\n getHandlePolicy,\n isDataType,\n isEventType,\n isGatewayType,\n} from \"../elements/guards\";\nimport type { BpmnElementType, BpmnEdgeData, BpmnEdgeType, BpmnNodeData } from \"../elements/types\";\nimport type { BpmnRFEdge, BpmnRFNode } from \"../xml/types\";\n\nexport { getBpmnElementSize, isBpmnElementResizable } from \"../elements/catalog\";\n\nexport type BpmnDiagramState = DiagramState<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnClipboardState = ClipboardState<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnDiagramDocument = DiagramDocument<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnDiagramSnapshot = DiagramSnapshot<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnEventBus = DiagramEventBus<BpmnRFNode, BpmnRFEdge>;\n\nexport interface CreateBpmnNodeOptions {\n id: string;\n elementType: BpmnElementType;\n position: { x: number; y: number };\n label?: string;\n parentId?: string;\n width?: number;\n height?: number;\n data?: Partial<BpmnNodeData>;\n}\n\nexport interface ConnectBpmnOptions {\n id?: string;\n source: string;\n target: string;\n edgeType?: BpmnEdgeType;\n label?: string;\n sourceHandle?: string | null;\n targetHandle?: string | null;\n data?: Partial<BpmnEdgeData>;\n}\n\nexport interface ReplaceBpmnNodeOptions {\n id: string;\n elementType: BpmnElementType;\n label?: string;\n data?: Partial<BpmnNodeData>;\n width?: number;\n height?: number;\n}\n\nexport interface ReparentBpmnNodeOptions {\n id: string;\n parentId?: string;\n position?: { x: number; y: number };\n}\n\nexport interface FindBpmnContainerAtOptions {\n position: { x: number; y: number };\n excludeId?: string;\n}\n\nexport interface ReparentBpmnNodeAtPositionOptions {\n id: string;\n position: { x: number; y: number };\n}\n\nexport interface ResizeBpmnNodeOptions {\n id: string;\n width?: number;\n height?: number;\n}\n\nexport interface ReorderBpmnLaneOptions {\n poolId: string;\n laneId: string;\n index: number;\n}\n\nexport interface MoveBpmnLaneOptions {\n poolId: string;\n laneId: string;\n position: { x: number; y: number };\n}\n\nexport interface RouteBpmnEdgeOptions {\n id: string;\n routingPoints: Array<{ x: number; y: number }>;\n}\n\nexport interface PasteBpmnOptions {\n offset?: { x: number; y: number };\n position?: { x: number; y: number };\n}\n\nexport interface GroupAsBpmnSubProcessOptions {\n groupId?: string;\n nodeIds: string[];\n label?: string;\n padding?: number;\n data?: Partial<BpmnNodeData>;\n}\n\nexport interface ResizeBpmnNodeByHandleOptions {\n id: string;\n handle: ResizeHandlePosition;\n dx: number;\n dy: number;\n}\n\nexport function createBpmnNode(options: CreateBpmnNodeOptions): BpmnRFNode {\n const size = getBpmnElementSize(options.elementType);\n const meta = BPMN_ELEMENT_CATALOG[options.elementType];\n const orientation = options.data?.orientation ?? meta.orientation;\n const dragHandle = getBpmnDragHandleSelector(options.elementType);\n return {\n id: options.id,\n type: options.elementType,\n position: options.position,\n data: {\n elementType: options.elementType,\n orientation,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n width: options.width ?? size.width,\n height: options.height ?? size.height,\n zIndex: getBpmnNodeZIndex(options.elementType),\n ...(options.parentId ? { parentId: options.parentId } : {}),\n ...(options.elementType === \"Lane\" && options.parentId ? { extent: \"parent\" as const } : {}),\n ...(dragHandle ? { dragHandle } : {}),\n };\n}\n\nexport function getBpmnNodeZIndex(elementType: BpmnElementType): number {\n if (elementType === \"Pool\") return 0;\n if (elementType === \"Lane\") return 1;\n if (elementType === \"BoundaryEvent\") return 4;\n return 3;\n}\n\nexport function withBpmnNodeZIndexes(\n nodes: BpmnRFNode[],\n): BpmnRFNode[] {\n return nodes.map((node) => {\n const zIndex = getBpmnNodeZIndex(node.data.elementType);\n return node.zIndex === zIndex ? node : { ...node, zIndex };\n });\n}\n\nexport const BPMN_POOL_LANE_LAYOUT = {\n poolHeaderSize: 30,\n laneHeaderSize: 24,\n laneGap: 0,\n verticalPoolHeaderSize: 28,\n minLaneSize: 96,\n} as const;\n\nexport function getBpmnDragHandleSelector(\n elementType: BpmnElementType,\n): string | undefined {\n if (elementType === \"Pool\") return \".pool-drag-handle\";\n if (elementType === \"Lane\") return \".lane-drag-handle\";\n return undefined;\n}\n\nexport const BPMN_SELECTION_STYLE = {\n nodeOutline: \"#2563eb\",\n edgeStroke: \"#2563eb\",\n handleFill: \"#ffffff\",\n handleStroke: \"#2563eb\",\n resizeHandleSize: 8,\n routingPointRadius: 5,\n} as const;\n\nexport const BPMN_ROUTABLE_EDGE_TYPES = [\n \"sequenceFlow\",\n \"messageFlow\",\n \"association\",\n \"dataAssociation\",\n \"conversationLink\",\n] satisfies BpmnEdgeType[];\n\nexport interface BpmnConnectionRule {\n edgeType: BpmnEdgeType;\n sourceCategories: Array<BpmnRFNode[\"data\"][\"elementType\"] | \"flowNode\" | \"data\" | \"artifact\" | \"conversation\">;\n targetCategories: Array<BpmnRFNode[\"data\"][\"elementType\"] | \"flowNode\" | \"data\" | \"artifact\" | \"conversation\">;\n allowSameParent?: boolean;\n allowDifferentParent?: boolean;\n}\n\nexport const BPMN_EDGE_CONNECTION_RULES: Record<BpmnEdgeType, BpmnConnectionRule> = {\n sequenceFlow: {\n edgeType: \"sequenceFlow\",\n sourceCategories: [\"flowNode\"],\n targetCategories: [\"flowNode\"],\n allowSameParent: true,\n allowDifferentParent: false,\n },\n messageFlow: {\n edgeType: \"messageFlow\",\n sourceCategories: [\"flowNode\"],\n targetCategories: [\"flowNode\"],\n allowSameParent: false,\n allowDifferentParent: true,\n },\n association: {\n edgeType: \"association\",\n sourceCategories: [\"flowNode\", \"artifact\", \"data\"],\n targetCategories: [\"flowNode\", \"artifact\", \"data\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n dataAssociation: {\n edgeType: \"dataAssociation\",\n sourceCategories: [\"flowNode\", \"data\"],\n targetCategories: [\"flowNode\", \"data\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n conversationLink: {\n edgeType: \"conversationLink\",\n sourceCategories: [\"conversation\", \"flowNode\"],\n targetCategories: [\"conversation\", \"flowNode\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n};\n\nexport function inferBpmnEdgeType(\n state: BpmnDiagramState,\n sourceId: string,\n targetId: string,\n): BpmnEdgeType {\n const source = getNode(state, sourceId);\n const target = getNode(state, targetId);\n if (!source || !target) return \"sequenceFlow\";\n\n if (isDataType(source.data.elementType) || isDataType(target.data.elementType)) {\n return \"dataAssociation\";\n }\n if (\n source.data.elementType === \"Annotation\" ||\n target.data.elementType === \"Annotation\" ||\n source.data.elementType === \"Group\" ||\n target.data.elementType === \"Group\"\n ) {\n return \"association\";\n }\n if (\n source.data.elementType === \"Conversation\" ||\n source.data.elementType === \"SubConversation\" ||\n source.data.elementType === \"CallConversation\" ||\n target.data.elementType === \"Conversation\" ||\n target.data.elementType === \"SubConversation\" ||\n target.data.elementType === \"CallConversation\"\n ) {\n return \"conversationLink\";\n }\n if (source.parentId && target.parentId && source.parentId !== target.parentId) {\n return \"messageFlow\";\n }\n return \"sequenceFlow\";\n}\n\nfunction canUseSequenceFlow(type: BpmnElementType): boolean {\n const meta = BPMN_ELEMENT_CATALOG[type];\n return (\n meta.handlePolicy !== \"none\" &&\n !isDataType(type) &&\n type !== \"Annotation\" &&\n type !== \"Group\" &&\n meta.category !== \"conversation\"\n );\n}\n\nfunction matchesConnectionCategory(\n type: BpmnElementType,\n categories: BpmnConnectionRule[\"sourceCategories\"],\n): boolean {\n return categories.some((category) => {\n if (category === type) return true;\n if (category === \"flowNode\") return canUseSequenceFlow(type);\n if (category === \"data\") return isDataType(type);\n if (category === \"artifact\") return type === \"Annotation\" || type === \"Group\";\n if (category === \"conversation\") return BPMN_ELEMENT_CATALOG[type].category === \"conversation\";\n return false;\n });\n}\n\nexport function isBpmnEdgeRoutingEditable(edgeType: BpmnEdgeType): boolean {\n return BPMN_ROUTABLE_EDGE_TYPES.includes(edgeType);\n}\n\nexport function isBpmnProcessNode(type: BpmnElementType): boolean {\n return (\n isEventType(type) ||\n isGatewayType(type) ||\n type.includes(\"Task\") ||\n type === \"CallActivity\" ||\n type === \"SubProcess\" ||\n type === \"Transaction\" ||\n type === \"EventSubProcess\" ||\n type === \"AdHocSubProcess\"\n );\n}\n\n/** Returns true for every element type that can be dragged into a Pool or Lane container. */\nexport function isBpmnDroppableInContainer(type: BpmnElementType): boolean {\n return (\n isBpmnProcessNode(type) ||\n type === \"Annotation\" ||\n type === \"Group\" ||\n type === \"DataObject\" ||\n type === \"DataObjectReference\" ||\n type === \"DataStore\" ||\n type === \"DataStoreReference\"\n );\n}\n\nexport function canContainBpmnElement(\n parentType: BpmnElementType | undefined,\n childType: BpmnElementType,\n): true | string {\n if (!parentType) return true;\n if (parentType === \"Pool\") {\n return childType === \"Lane\" || isBpmnDroppableInContainer(childType)\n ? true\n : \"Pools can contain lanes, BPMN process nodes, annotations, groups, and data elements.\";\n }\n if (parentType === \"Lane\") {\n return isBpmnDroppableInContainer(childType)\n ? true\n : \"Lanes can only contain BPMN process nodes, annotations, groups, and data elements.\";\n }\n if (\n parentType === \"SubProcess\" ||\n parentType === \"Transaction\" ||\n parentType === \"EventSubProcess\" ||\n parentType === \"AdHocSubProcess\"\n ) {\n return isBpmnProcessNode(childType)\n ? true\n : \"Subprocesses can only contain BPMN process nodes.\";\n }\n return `${parentType} cannot contain BPMN child elements.`;\n}\n\nfunction getDirectBpmnChildren(\n state: BpmnDiagramState,\n parentId: string,\n): BpmnRFNode[] {\n return state.nodes.filter((node) => node.parentId === parentId);\n}\n\nexport function getBpmnPoolLanes(\n state: BpmnDiagramState,\n poolId: string,\n): BpmnRFNode[] {\n return getDirectBpmnChildren(state, poolId).filter(\n (node) => node.data.elementType === \"Lane\",\n );\n}\n\nfunction getNodeDimension(node: BpmnRFNode, axis: \"width\" | \"height\"): number {\n return node[axis] ?? node.measured?.[axis] ?? getBpmnElementSize(node.data.elementType)[axis];\n}\n\nfunction getBpmnLaneOrderPosition(\n lane: BpmnRFNode,\n orientation: \"horizontal\" | \"vertical\",\n): number {\n const size = getBpmnNodeSize(lane);\n return orientation === \"vertical\"\n ? lane.position.x + size.width / 2\n : lane.position.y + size.height / 2;\n}\n\nfunction resizeHorizontalBpmnLanes(lanes: BpmnRFNode[], pool: BpmnRFNode): BpmnRFNode[] {\n const poolSize = getBpmnNodeSize(pool);\n const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width - BPMN_POOL_LANE_LAYOUT.poolHeaderSize);\n const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height / Math.max(1, lanes.length));\n return lanes.map((lane, index) => ({\n ...lane,\n position: { x: BPMN_POOL_LANE_LAYOUT.poolHeaderSize, y: index * laneHeight },\n width: laneWidth,\n height: laneHeight,\n parentId: pool.id,\n extent: \"parent\" as const,\n zIndex: getBpmnNodeZIndex(\"Lane\"),\n data: { ...lane.data, orientation: \"horizontal\", laneIndex: index },\n }));\n}\n\nfunction resizeVerticalBpmnLanes(lanes: BpmnRFNode[], pool: BpmnRFNode): BpmnRFNode[] {\n const poolSize = getBpmnNodeSize(pool);\n const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width / Math.max(1, lanes.length));\n const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height - BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize);\n return lanes.map((lane, index) => ({\n ...lane,\n position: { x: index * laneWidth, y: BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize },\n width: laneWidth,\n height: laneHeight,\n parentId: pool.id,\n extent: \"parent\" as const,\n zIndex: getBpmnNodeZIndex(\"Lane\"),\n data: { ...lane.data, orientation: \"vertical\", laneIndex: index },\n }));\n}\n\nexport function layoutBpmnPoolLaneNodes(\n nodes: BpmnRFNode[],\n poolId: string,\n): BpmnRFNode[] {\n const pool = nodes.find((node) => node.id === poolId && node.data.elementType === \"Pool\");\n if (!pool) return nodes;\n\n const orientation = pool.data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const lanes = nodes\n .filter((node) => node.parentId === pool.id && node.data.elementType === \"Lane\")\n .sort((a, b) => {\n const aIndex = typeof a.data.laneIndex === \"number\" ? a.data.laneIndex : undefined;\n const bIndex = typeof b.data.laneIndex === \"number\" ? b.data.laneIndex : undefined;\n if (aIndex !== undefined || bIndex !== undefined) return (aIndex ?? 0) - (bIndex ?? 0);\n return getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation);\n });\n\n if (lanes.length === 0) return withBpmnNodeZIndexes(nodes);\n\n const laneMap = new Map(\n (orientation === \"vertical\" ? resizeVerticalBpmnLanes(lanes, pool) : resizeHorizontalBpmnLanes(lanes, pool))\n .map((lane) => [lane.id, lane]),\n );\n\n return withBpmnNodeZIndexes(nodes.map((node) => laneMap.get(node.id) ?? node));\n}\n\nexport function reorderBpmnLaneAfterDrop(\n nodes: BpmnRFNode[],\n laneId: string,\n): BpmnRFNode[] {\n const lane = nodes.find((node) => node.id === laneId && node.data.elementType === \"Lane\");\n if (!lane?.parentId) return nodes;\n\n const pool = nodes.find((node) => node.id === lane.parentId && node.data.elementType === \"Pool\");\n if (!pool) return nodes;\n\n const orientation = pool.data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const lanes = nodes\n .filter((node) => node.parentId === pool.id && node.data.elementType === \"Lane\")\n .sort((a, b) => getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation));\n\n const moved = lanes.find((candidate) => candidate.id === lane.id);\n if (!moved) return layoutBpmnPoolLaneNodes(nodes, pool.id);\n\n const withoutMoved = lanes.filter((candidate) => candidate.id !== lane.id);\n const movedCenter = getBpmnLaneOrderPosition(lane, orientation);\n const insertIndex = withoutMoved.findIndex(\n (candidate) => movedCenter < getBpmnLaneOrderPosition(candidate, orientation),\n );\n const ordered = [...withoutMoved];\n ordered.splice(insertIndex === -1 ? ordered.length : insertIndex, 0, moved);\n\n const orderedMap = new Map(ordered.map((candidate, index) => [candidate.id, index]));\n const sortedByDrop = nodes.map((node) => {\n if (node.parentId !== pool.id || node.data.elementType !== \"Lane\") return node;\n return { ...node, data: { ...node.data, laneIndex: orderedMap.get(node.id) ?? 0 } };\n });\n\n return layoutBpmnPoolLaneNodes(sortedByDrop, pool.id);\n}\n\nexport function getBpmnNodeSize(node: BpmnRFNode): { width: number; height: number } {\n return getNodeSize(node, getBpmnElementSize(node.data.elementType));\n}\n\nexport function getBpmnNodeAbsolutePosition(\n state: BpmnDiagramState,\n nodeOrId: BpmnRFNode | string,\n): { x: number; y: number } | undefined {\n const nodeId = typeof nodeOrId === \"string\" ? nodeOrId : nodeOrId.id;\n return getNodeAbsolutePosition(state, nodeId);\n}\n\nexport function toBpmnRelativePosition(\n state: BpmnDiagramState,\n absolutePosition: { x: number; y: number },\n parentOrId: BpmnRFNode | string,\n): { x: number; y: number } {\n return toRelativeNodePosition(state, absolutePosition, parentOrId);\n}\n\nconst BPMN_CONTAINER_PRIORITY: BpmnElementType[] = [\n \"Lane\",\n \"SubProcess\",\n \"EventSubProcess\",\n \"Transaction\",\n \"AdHocSubProcess\",\n \"Pool\",\n];\n\nexport function findBpmnContainerAt(\n state: BpmnDiagramState,\n options: FindBpmnContainerAtOptions,\n): BpmnRFNode | undefined {\n return findContainingNode(state, {\n point: options.position,\n excludeId: options.excludeId,\n fallbackSize: (node) => getBpmnElementSize(node.data.elementType),\n predicate: (node) => BPMN_CONTAINER_PRIORITY.includes(node.data.elementType),\n sort: (a, b) => {\n const aPriority = BPMN_CONTAINER_PRIORITY.indexOf(a.data.elementType);\n const bPriority = BPMN_CONTAINER_PRIORITY.indexOf(b.data.elementType);\n if (aPriority !== bPriority) return aPriority - bPriority;\n const aSize = getBpmnNodeSize(a);\n const bSize = getBpmnNodeSize(b);\n return aSize.width * aSize.height - bSize.width * bSize.height;\n },\n });\n}\n\nexport function getBpmnNodeCenter(\n node: BpmnRFNode,\n absolutePosition: { x: number; y: number },\n): { x: number; y: number } {\n return getNodeCenterPosition(absolutePosition, getBpmnNodeSize(node));\n}\n\nfunction resolvePoolLaneDirection(pool: BpmnRFNode): \"horizontal\" | \"vertical\" {\n return pool.data.orientation === \"vertical\" ? \"horizontal\" : \"vertical\";\n}\n\nexport function getBpmnLaneIndexAtPosition(\n state: BpmnDiagramState,\n poolId: string,\n position: { x: number; y: number },\n): number {\n const pool = getNode(state, poolId);\n if (!pool) return 0;\n const lanes = getBpmnPoolLanes(state, poolId);\n const direction = resolvePoolLaneDirection(pool);\n const axis = direction === \"vertical\" ? \"y\" : \"x\";\n const sizeKey = direction === \"vertical\" ? \"height\" : \"width\";\n\n for (let index = 0; index < lanes.length; index += 1) {\n const lane = lanes[index];\n const midpoint = lane.position[axis] + getNodeDimension(lane, sizeKey) / 2;\n if (position[axis] < midpoint) return index;\n }\n return lanes.length;\n}\n\nfunction sortBpmnLanes(\n state: BpmnDiagramState,\n poolId: string,\n laneId: string,\n index: number,\n): BpmnDiagramState {\n const lanes = getBpmnPoolLanes(state, poolId);\n const currentIndex = lanes.findIndex((lane) => lane.id === laneId);\n if (currentIndex < 0) return state;\n\n const orderedIds = lanes.map((lane) => lane.id);\n const [moved] = orderedIds.splice(currentIndex, 1);\n orderedIds.splice(Math.max(0, Math.min(index, orderedIds.length)), 0, moved);\n const order = new Map(orderedIds.map((id, laneIndex) => [id, laneIndex]));\n\n return {\n ...state,\n nodes: [...state.nodes].sort((a, b) => {\n const aOrder = order.get(a.id);\n const bOrder = order.get(b.id);\n if (aOrder === undefined && bOrder === undefined) return 0;\n if (aOrder === undefined) return -1;\n if (bOrder === undefined) return 1;\n return aOrder - bOrder;\n }),\n };\n}\n\nexport function layoutBpmnPoolLanes(\n state: BpmnDiagramState,\n poolId: string,\n): BpmnDiagramState {\n const pool = getNode(state, poolId);\n if (!pool) return state;\n const poolSize = getBpmnElementSize(\"Pool\");\n const direction = resolvePoolLaneDirection(pool);\n const lanes = getBpmnPoolLanes(state, poolId);\n let cursor = direction === \"vertical\" ? BPMN_POOL_LANE_LAYOUT.poolHeaderSize : 0;\n\n let next = state;\n for (const lane of lanes) {\n const laneSize = getBpmnElementSize(\"Lane\");\n const width =\n direction === \"vertical\"\n ? Math.max(poolSize.minWidth - BPMN_POOL_LANE_LAYOUT.poolHeaderSize, lane.width ?? laneSize.width)\n : lane.width ?? laneSize.width;\n const height =\n direction === \"vertical\"\n ? lane.height ?? laneSize.height\n : Math.max(poolSize.minHeight - BPMN_POOL_LANE_LAYOUT.poolHeaderSize, lane.height ?? laneSize.height);\n next = patchNode(next, lane.id, {\n position: direction === \"vertical\" ? { x: BPMN_POOL_LANE_LAYOUT.poolHeaderSize, y: cursor } : { x: cursor, y: BPMN_POOL_LANE_LAYOUT.poolHeaderSize },\n width,\n height,\n data: { orientation: pool.data.orientation ?? \"horizontal\" },\n });\n cursor += (direction === \"vertical\" ? height : width) + BPMN_POOL_LANE_LAYOUT.laneGap;\n }\n\n const minWidth =\n direction === \"vertical\"\n ? poolSize.minWidth\n : Math.max(poolSize.minWidth, cursor);\n const minHeight =\n direction === \"vertical\"\n ? Math.max(poolSize.minHeight, cursor)\n : poolSize.minHeight;\n return resizeNode(next, poolId, { width: minWidth, height: minHeight } as Parameters<typeof resizeNode<BpmnRFNode, BpmnRFEdge>>[2]);\n}\n\nexport function reorderBpmnLane(\n state: BpmnDiagramState,\n options: ReorderBpmnLaneOptions,\n): BpmnDiagramState {\n return layoutBpmnPoolLanes(\n sortBpmnLanes(state, options.poolId, options.laneId, options.index),\n options.poolId,\n );\n}\n\nexport function validateBpmnConnectionForEdgeType(\n state: BpmnDiagramState,\n edgeType: BpmnEdgeType,\n source: BpmnRFNode,\n target: BpmnRFNode,\n): true | string {\n const rule = BPMN_EDGE_CONNECTION_RULES[edgeType];\n if (!matchesConnectionCategory(source.data.elementType, rule.sourceCategories)) {\n return `${edgeType} cannot start from ${source.data.elementType}.`;\n }\n if (!matchesConnectionCategory(target.data.elementType, rule.targetCategories)) {\n return `${edgeType} cannot target ${target.data.elementType}.`;\n }\n const sameParent = (source.parentId ?? null) === (target.parentId ?? null);\n if (sameParent && rule.allowSameParent === false) {\n return `${edgeType} must connect BPMN elements in different participants/scopes.`;\n }\n if (!sameParent && rule.allowDifferentParent === false) {\n return `${edgeType} must stay inside the same BPMN participant/scope.`;\n }\n if (edgeType === \"sequenceFlow\") {\n if (source.data.elementType === \"EndEvent\") return \"End events cannot have outgoing sequence flows.\";\n if (target.data.elementType === \"StartEvent\") return \"Start events cannot have incoming sequence flows.\";\n return validateEdgeCardinality(state, edgeType, source, target);\n }\n return true;\n}\n\nfunction validateEdgeCardinality(\n state: BpmnDiagramState,\n edgeType: BpmnEdgeType,\n source: BpmnRFNode,\n target: BpmnRFNode,\n): true | string {\n if (edgeType !== \"sequenceFlow\") return true;\n\n const sourceMax = BPMN_ELEMENT_CATALOG[source.data.elementType].maxOutgoing;\n const targetMax = BPMN_ELEMENT_CATALOG[target.data.elementType].maxIncoming;\n const outgoing = getOutgoingEdges(state, source.id).filter(\n (edge) => edge.data?.edgeType === \"sequenceFlow\",\n );\n const incoming = getIncomingEdges(state, target.id).filter(\n (edge) => edge.data?.edgeType === \"sequenceFlow\",\n );\n\n if (sourceMax !== undefined && outgoing.length >= sourceMax) {\n return `${source.data.elementType} cannot have more than ${sourceMax} outgoing sequence flow(s).`;\n }\n if (targetMax !== undefined && incoming.length >= targetMax) {\n return `${target.data.elementType} cannot have more than ${targetMax} incoming sequence flow(s).`;\n }\n return true;\n}\n\nexport const bpmnConnectionValidators: Array<\n ConnectionValidator<BpmnRFNode, BpmnRFEdge>\n> = [\n ({ state, source, target }) => {\n if (source.id === target.id) return \"BPMN self-connections are not allowed.\";\n const edgeType = inferBpmnEdgeType(state, source.id, target.id);\n\n if (getHandlePolicy(source.data.elementType) === \"none\" || getHandlePolicy(target.data.elementType) === \"none\") {\n return \"Elements without BPMN connection handles cannot be directly connected.\";\n }\n\n if (edgeType === \"sequenceFlow\") {\n return validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n }\n\n return validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n },\n];\n\nexport const BPMN_MODELING_RULES: ModelingRules<BpmnRFNode, BpmnRFEdge> =\n createModelingRules({\n connect: [\n ({ state, source, target }) => {\n if (!source || !target) return false;\n for (const validator of bpmnConnectionValidators) {\n const result = validator({\n state,\n source,\n target,\n existingEdges: state.edges,\n });\n if (result !== true) return result;\n }\n return true;\n },\n ],\n drop: [\n ({ node, parent }) => {\n if (!node || !parent) return true;\n if (node.data.elementType === \"BoundaryEvent\") {\n return acceptsBoundaryEvents(parent.data.elementType)\n ? true\n : \"Boundary events can only be attached to tasks or subprocesses.\";\n }\n return canContainBpmnElement(parent.data.elementType, node.data.elementType);\n },\n ],\n reparent: [\n ({ node, parent }) => {\n if (!node || !parent) return true;\n if (node.data.elementType === \"BoundaryEvent\") {\n return acceptsBoundaryEvents(parent.data.elementType)\n ? true\n : \"Boundary events can only be reparented to tasks or subprocesses.\";\n }\n return canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n },\n ],\n delete: [() => true],\n resize: [\n ({ node }) =>\n !node || isBpmnElementResizable(node.data.elementType)\n ? true\n : `${node.data.elementType} is not resizable in BPMN.`,\n ],\n });\n\n/**\n * Create a {@link DiagramCommand} that adds a new BPMN element to the diagram.\n *\n * @param options - Element type, id, position, label, and optional parent/data overrides.\n * @returns Undoable command to be executed by {@link runBpmnCommand}.\n */\nexport function createBpmnNodeCommand(\n options: CreateBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.createNode.${options.id}`,\n label: `Create ${options.elementType}`,\n execute: (state) => addNode(state, createBpmnNode(options)),\n };\n}\n\n/**\n * Create a {@link DiagramCommand} that connects two BPMN elements with the\n * most appropriate edge type (auto-inferred when `edgeType` is omitted).\n * Validates the connection against BPMN 2.0 rules before executing.\n *\n * @param options - Source/target ids, optional edge type, label, and data overrides.\n * @returns Undoable command, throws when the connection violates BPMN rules.\n */\nexport function connectBpmnCommand(\n options: ConnectBpmnOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.connect.${options.id ?? `${options.source}-${options.target}`}`,\n label: \"Connect BPMN elements\",\n execute: (state) => {\n const edgeType = options.edgeType ?? inferBpmnEdgeType(state, options.source, options.target);\n const source = getNode(state, options.source);\n const target = getNode(state, options.target);\n if (!source) throw new Error(`Source node \"${options.source}\" does not exist.`);\n if (!target) throw new Error(`Target node \"${options.target}\" does not exist.`);\n const validation = validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n if (validation !== true) throw new Error(validation);\n return connectNodes(\n state,\n {\n source: options.source,\n target: options.target,\n type: edgeType,\n ...(options.sourceHandle !== undefined\n ? { sourceHandle: options.sourceHandle }\n : {}),\n ...(options.targetHandle !== undefined\n ? { targetHandle: options.targetHandle }\n : {}),\n ...(options.id ? { id: options.id } : {}),\n data: {\n edgeType,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n },\n [],\n );\n },\n };\n}\n\nexport function attachBoundaryEventCommand(\n boundaryId: string,\n hostId: string,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.attachBoundary.${boundaryId}.${hostId}`,\n label: \"Attach boundary event\",\n execute: (state) => {\n const host = getNode(state, hostId);\n if (!host || !acceptsBoundaryEvents(host.data.elementType)) {\n throw new Error(`Element \"${hostId}\" cannot host boundary events.`);\n }\n const boundary = getNode(state, boundaryId);\n if (!boundary || boundary.data.elementType !== \"BoundaryEvent\") {\n throw new Error(`Element \"${boundaryId}\" is not a boundary event.`);\n }\n const reparented = reparentNode(state, boundaryId, { parentId: hostId });\n return patchNode(reparented, boundaryId, {\n data: { attachedToRef: hostId },\n });\n },\n };\n}\n\nexport function replaceBpmnNodeCommand(\n options: ReplaceBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.replaceNode.${options.id}.${options.elementType}`,\n label: `Replace with ${options.elementType}`,\n execute: (state) => {\n const current = getNode(state, options.id);\n if (!current) throw new Error(`Element \"${options.id}\" does not exist.`);\n const meta = BPMN_ELEMENT_CATALOG[options.elementType];\n return replaceNode(state, options.id, {\n ...current,\n type: options.elementType,\n width: options.width ?? current.width ?? meta.defaultWidth,\n height: options.height ?? current.height ?? meta.defaultHeight,\n data: {\n ...current.data,\n elementType: options.elementType,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n });\n },\n };\n}\n\nexport function reparentBpmnNodeCommand(\n options: ReparentBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.reparent.${options.id}.${options.parentId ?? \"root\"}`,\n label: \"Reparent BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n const parent = options.parentId ? getNode(state, options.parentId) : undefined;\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n if (parent && node.data.elementType === \"BoundaryEvent\" && !acceptsBoundaryEvents(parent.data.elementType)) {\n throw new Error(\"Boundary events can only be reparented to tasks or subprocesses.\");\n }\n const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n if (containment !== true) throw new Error(containment);\n const reparented = reparentNode(state, options.id, {\n ...(options.parentId !== undefined ? { parentId: options.parentId } : {}),\n ...(options.position ? { position: options.position } : {}),\n });\n return parent?.data.elementType === \"Pool\" && node.data.elementType === \"Lane\"\n ? layoutBpmnPoolLanes(reparented, parent.id)\n : reparented;\n },\n };\n}\n\nexport function reparentBpmnNodeAtPosition(\n state: BpmnDiagramState,\n options: ReparentBpmnNodeAtPositionOptions,\n): BpmnDiagramState {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n\n const hitPoint = getBpmnNodeCenter(node, options.position);\n const parent = isBpmnProcessNode(node.data.elementType)\n ? findBpmnContainerAt(state, { position: hitPoint, excludeId: node.id })\n : undefined;\n const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n if (containment !== true) throw new Error(containment);\n\n const nextPosition = parent\n ? toBpmnRelativePosition(state, options.position, parent)\n : options.position;\n return reparentNode(state, node.id, {\n ...(parent ? { parentId: parent.id } : { parentId: undefined }),\n position: nextPosition,\n });\n}\n\n// Half-size of a BoundaryEvent (36×36) — used to convert center↔top-left coords.\nconst BE_HALF = 18;\n\nfunction clampBoundaryEventsAfterResize(\n state: Parameters<DiagramCommand<BpmnRFNode, BpmnRFEdge>[\"execute\"]>[0],\n hostId: string,\n oldW: number,\n oldH: number,\n newW: number,\n newH: number,\n): Parameters<DiagramCommand<BpmnRFNode, BpmnRFEdge>[\"execute\"]>[0] {\n const boundaryEvents = state.nodes.filter(\n (n) => n.data.elementType === \"BoundaryEvent\" && n.parentId === hostId,\n );\n\n let next = state;\n for (const be of boundaryEvents) {\n const px = be.position?.x ?? 0;\n const py = be.position?.y ?? 0;\n const cx = px + BE_HALF;\n const cy = py + BE_HALF;\n\n const distLeft = Math.abs(cx);\n const distRight = Math.abs(cx - oldW);\n const distTop = Math.abs(cy);\n const distBottom = Math.abs(cy - oldH);\n const minDist = Math.min(distLeft, distRight, distTop, distBottom);\n\n let newCx: number;\n let newCy: number;\n\n if (minDist === distBottom) {\n newCy = newH;\n newCx = Math.min(Math.max(cx, BE_HALF), newW - BE_HALF);\n } else if (minDist === distRight) {\n newCx = newW;\n newCy = Math.min(Math.max(cy, BE_HALF), newH - BE_HALF);\n } else if (minDist === distTop) {\n newCy = 0;\n newCx = Math.min(Math.max(cx, BE_HALF), newW - BE_HALF);\n } else {\n newCx = 0;\n newCy = Math.min(Math.max(cy, BE_HALF), newH - BE_HALF);\n }\n\n next = moveNode(next, be.id, { x: newCx - BE_HALF, y: newCy - BE_HALF });\n }\n\n return next;\n}\n\n/**\n * Create a {@link DiagramCommand} that resizes a BPMN element, enforcing\n * minimum dimensions per spec. Boundary events attached to the resized element\n * are automatically repositioned to stay on the new border.\n *\n * @param options - Target element id, optional new width/height.\n * @returns Undoable command, throws when the element is not resizable.\n */\nexport function resizeBpmnNodeCommand(\n options: ResizeBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.resize.${options.id}`,\n label: \"Resize BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n const size = getBpmnElementSize(node.data.elementType);\n if (!size.resizable) {\n throw new Error(`${node.data.elementType} is not resizable in BPMN.`);\n }\n\n const oldW = node.width ?? size.width;\n const oldH = node.height ?? size.height;\n const clampedW =\n options.width === undefined ? undefined : Math.max(size.minWidth, options.width);\n const clampedH =\n options.height === undefined ? undefined : Math.max(size.minHeight, options.height);\n\n const resized = resizeNode(state, options.id, {\n width: clampedW,\n height: clampedH,\n } as Parameters<typeof resizeNode<BpmnRFNode, BpmnRFEdge>>[2]);\n\n const updatedNode = getNode(resized, options.id);\n const newW = updatedNode?.width ?? clampedW ?? oldW;\n const newH = updatedNode?.height ?? clampedH ?? oldH;\n\n return clampBoundaryEventsAfterResize(resized, options.id, oldW, oldH, newW, newH);\n },\n };\n}\n\nexport function reorderBpmnLaneCommand(\n options: ReorderBpmnLaneOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.reorderLane.${options.poolId}.${options.laneId}`,\n label: \"Reorder BPMN lane\",\n execute: (state) => {\n const pool = getNode(state, options.poolId);\n const lane = getNode(state, options.laneId);\n if (!pool || pool.data.elementType !== \"Pool\") {\n throw new Error(`Element \"${options.poolId}\" is not a pool.`);\n }\n if (!lane || lane.data.elementType !== \"Lane\" || lane.parentId !== options.poolId) {\n throw new Error(`Element \"${options.laneId}\" is not a lane in pool \"${options.poolId}\".`);\n }\n return reorderBpmnLane(state, options);\n },\n };\n}\n\nexport function moveBpmnLaneCommand(\n options: MoveBpmnLaneOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.moveLane.${options.poolId}.${options.laneId}`,\n label: \"Move BPMN lane\",\n execute: (state) =>\n reorderBpmnLane(state, {\n poolId: options.poolId,\n laneId: options.laneId,\n index: getBpmnLaneIndexAtPosition(state, options.poolId, options.position),\n }),\n };\n}\n\nexport function routeBpmnEdgeCommand(\n options: RouteBpmnEdgeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.routeEdge.${options.id}`,\n label: \"Route BPMN edge\",\n execute: (state) => {\n const edge = state.edges.find((item) => item.id === options.id);\n if (!edge) throw new Error(`Edge \"${options.id}\" does not exist.`);\n const edgeType = edge.data?.edgeType;\n if (!edgeType || !isBpmnEdgeRoutingEditable(edgeType)) {\n throw new Error(`${edgeType ?? \"edge\"} routing points cannot be edited.`);\n }\n return patchEdge(state, options.id, {\n data: { routingPoints: options.routingPoints },\n } as Parameters<typeof patchEdge<BpmnRFNode, BpmnRFEdge>>[2]);\n },\n };\n}\n\nexport function deleteBpmnElementsCommand(\n ids: string[],\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.delete.${ids.join(\".\")}`,\n label: \"Delete BPMN elements\",\n execute: (state) => removeElements(state, ids),\n };\n}\n\nexport function copyBpmnElements(\n state: BpmnDiagramState,\n selection?: SelectionState,\n): BpmnClipboardState {\n return copyElements(state, selection);\n}\n\nexport function pasteBpmnElementsCommand(\n clipboard: BpmnClipboardState,\n options: PasteBpmnOptions = {},\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: \"bpmn.paste\",\n label: \"Paste BPMN elements\",\n execute: (state) => pasteElements(state, clipboard, options),\n };\n}\n\nexport function selectBpmnElementsCommand(\n selection: SelectionState,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: \"bpmn.select\",\n label: \"Select BPMN elements\",\n execute: (state) => setSelection(state, createSelectionState(selection.nodeIds, selection.edgeIds)),\n };\n}\n\nexport function createBpmnDiagramDocument(\n state: BpmnDiagramState,\n options: Omit<CreateDiagramDocumentOptions, \"diagramType\"> = {},\n): BpmnDiagramDocument {\n return createDiagramDocument(normalizeDiagramState(state), {\n ...options,\n diagramType: \"bpmn\",\n });\n}\n\nexport function serializeBpmnDiagram(\n state: BpmnDiagramState,\n options: Omit<CreateDiagramDocumentOptions, \"diagramType\"> & { viewport?: Viewport } = {},\n): string {\n const { viewport, ...docOptions } = options;\n const normalized = normalizeDiagramState(state);\n if (viewport) {\n return serializeDiagramSnapshot(\n { nodes: normalized.nodes, edges: normalized.edges, viewport },\n { ...docOptions, diagramType: \"bpmn\" },\n );\n }\n return serializeDiagram(normalized, { ...docOptions, diagramType: \"bpmn\" });\n}\n\nexport function parseBpmnDiagramDocument(json: string): BpmnDiagramDocument {\n const document = parseDiagramDocument<BpmnRFNode, BpmnRFEdge>(json);\n if (document.diagramType && document.diagramType !== \"bpmn\") {\n throw new Error(`Expected a BPMN diagram document, received \"${document.diagramType}\".`);\n }\n return document;\n}\n\nexport function deserializeBpmnDiagram(json: string): BpmnDiagramState {\n const document = parseBpmnDiagramDocument(json);\n return deserializeDiagram<BpmnRFNode, BpmnRFEdge>(JSON.stringify(document));\n}\n\n/**\n * Deserialize a BPMN diagram document to a snapshot that includes the persisted\n * viewport. Returns `viewport: { x:0, y:0, zoom:1 }` when none was saved.\n */\nexport function deserializeBpmnDiagramSnapshot(json: string): BpmnDiagramSnapshot {\n const document = parseBpmnDiagramDocument(json);\n return deserializeDiagramSnapshot<BpmnRFNode, BpmnRFEdge>(JSON.stringify(document));\n}\n\nexport function createBpmnEventBus(): BpmnEventBus {\n return createDiagramEventBus<BpmnRFNode, BpmnRFEdge>();\n}\n\nexport function runBpmnCommand(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n command: DiagramCommand<BpmnRFNode, BpmnRFEdge>,\n bus?: BpmnEventBus,\n): CommandStackState<BpmnRFNode, BpmnRFEdge> {\n const next = executeCommand(stack, command);\n bus?.emit(\"command:executed\", {\n commandId: command.id,\n ...(command.label !== undefined ? { label: command.label } : {}),\n state: next.current,\n });\n return next;\n}\n\nexport function runBpmnCommands(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n commands: Array<DiagramCommand<BpmnRFNode, BpmnRFEdge>>,\n options: { id?: string; label?: string; bus?: BpmnEventBus } = {},\n): CommandStackState<BpmnRFNode, BpmnRFEdge> {\n const { bus, ...execOptions } = options;\n const next = executeCommands(stack, commands, execOptions);\n bus?.emit(\"command:executed\", {\n commandId: execOptions.id ?? \"bpmn.batch\",\n ...(execOptions.label !== undefined ? { label: execOptions.label } : {}),\n state: next.current,\n });\n return next;\n}\n\n/**\n * Persist BPMN command history to localStorage under a per-diagram key.\n * Safe to call in SSR environments — writes are silently skipped.\n */\nexport function persistBpmnHistory(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n diagramId: string,\n): void {\n persistCommandHistory(stack, `bpmn.history.${diagramId}`);\n}\n\n/**\n * Restore BPMN command history from localStorage. Returns `null` when no\n * history exists for the given diagram id or when called server-side.\n */\nexport function restoreBpmnHistory(\n diagramId: string,\n): CommandStackState<BpmnRFNode, BpmnRFEdge> | null {\n return restoreCommandHistory<BpmnRFNode, BpmnRFEdge>(`bpmn.history.${diagramId}`);\n}\n\n/**\n * Compute smart alignment guides for nodes being dragged on a BPMN canvas.\n * Excludes boundary events, lanes, and pools from guide sources.\n * When `poolId` is given, only considers nodes within that pool as static references.\n */\nexport function computeBpmnSmartGuides(\n movingNodes: BpmnRFNode[],\n state: BpmnDiagramState,\n poolId?: string,\n): SmartGuideResult {\n const movingIds = new Set(movingNodes.map((n) => n.id));\n const staticNodes = state.nodes.filter((n) => {\n if (movingIds.has(n.id)) return false;\n const et = n.data.elementType;\n if (et === \"BoundaryEvent\" || et === \"Lane\" || et === \"Pool\") return false;\n if (poolId) {\n const inPool =\n n.parentId === poolId ||\n (n.parentId !== undefined && getNode(state, n.parentId)?.parentId === poolId);\n if (!inPool) return false;\n }\n return true;\n });\n return computeSmartGuides(movingNodes, staticNodes);\n}\n\n/**\n * Create a command that groups selected BPMN nodes into a new SubProcess element.\n * Validates that every node can be contained by a SubProcess before executing.\n */\nexport function groupAsBpmnSubProcessCommand(\n options: GroupAsBpmnSubProcessOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.groupAsSubProcess.${options.groupId ?? options.nodeIds.join(\".\")}`,\n label: \"Group as SubProcess\",\n execute: (state) => {\n for (const nodeId of options.nodeIds) {\n const node = getNode(state, nodeId);\n if (!node) continue;\n const result = canContainBpmnElement(\"SubProcess\", node.data.elementType);\n if (result !== true) throw new Error(result);\n }\n const groupId = options.groupId ?? createUniqueId(\"subprocess\", state.nodes.map((n) => n.id));\n const groupNode = createBpmnNode({\n id: groupId,\n elementType: \"SubProcess\",\n position: { x: 0, y: 0 },\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.data !== undefined ? { data: options.data } : {}),\n });\n return groupNodes(state, {\n groupNode,\n nodeIds: options.nodeIds,\n padding: options.padding ?? 20,\n });\n },\n };\n}\n\n/**\n * Return node IDs in logical tab order for keyboard navigation.\n * When `poolId` is given, scopes the order to nodes within that pool and its lanes.\n */\nexport function getBpmnTabOrder(\n state: BpmnDiagramState,\n poolId?: string,\n): string[] {\n if (!poolId) return getNodeTabOrder(state);\n const pool = getNode(state, poolId);\n if (!pool) return [];\n const scopeIds = state.nodes\n .filter((n) => {\n if (n.id === poolId) return false;\n if (n.parentId === poolId) return true;\n const parent = getNode(state, n.parentId ?? \"\");\n return parent?.parentId === poolId;\n })\n .map((n) => n.id);\n return getNodeTabOrder(state, scopeIds);\n}\n\n/**\n * Compute the label layout (position + angle) for a BPMN edge.\n * Uses the edge's stored routing points when available; falls back to\n * the straight line between source and target centers.\n */\nexport function getBpmnEdgeLabelLayout(\n edgeId: string,\n state: BpmnDiagramState,\n options?: EdgeLabelOffsetOptions,\n): EdgeLabelLayout | null {\n const edge = state.edges.find((e) => e.id === edgeId);\n if (!edge) return null;\n const routingPoints = (edge.data?.routingPoints ?? []) as Array<{ x: number; y: number }>;\n if (routingPoints.length >= 2) {\n return getEdgeLabelLayout(routingPoints, options);\n }\n const sourceNode = getNode(state, edge.source);\n const targetNode = getNode(state, edge.target);\n if (!sourceNode || !targetNode) return null;\n const sourceAbsPos = getBpmnNodeAbsolutePosition(state, edge.source) ?? sourceNode.position;\n const targetAbsPos = getBpmnNodeAbsolutePosition(state, edge.target) ?? targetNode.position;\n const sourceCenter = getNodeCenterPosition(sourceAbsPos, getBpmnNodeSize(sourceNode));\n const targetCenter = getNodeCenterPosition(targetAbsPos, getBpmnNodeSize(targetNode));\n return getEdgeLabelLayout([sourceCenter, targetCenter], options);\n}\n\n/**\n * Create a command that resizes a BPMN element by dragging one of its 8 handles.\n * Boundary events attached to the resized element are automatically repositioned.\n *\n * @param options - Target element id, handle position, and pixel delta.\n * @returns Undoable command.\n */\nexport function resizeBpmnNodeByHandleCommand(\n options: ResizeBpmnNodeByHandleOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.resizeByHandle.${options.id}`,\n label: \"Resize BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n const size = getBpmnElementSize(node.data.elementType);\n if (!size.resizable) {\n throw new Error(`${node.data.elementType} is not resizable in BPMN.`);\n }\n const oldW = node.width ?? size.width;\n const oldH = node.height ?? size.height;\n const resized = resizeNodeByHandle(state, {\n id: options.id,\n handle: options.handle,\n dx: options.dx,\n dy: options.dy,\n constraints: { minWidth: size.minWidth, minHeight: size.minHeight },\n });\n const updatedNode = getNode(resized, options.id);\n const newW = updatedNode?.width ?? oldW;\n const newH = updatedNode?.height ?? oldH;\n return clampBoundaryEventsAfterResize(resized, options.id, oldW, oldH, newW, newH);\n },\n };\n}\n\n/**\n * Create a layout cache for BPMN auto-layout calls.\n * Pass the returned cache to `withBpmnLayoutCache` to memoize identical topologies.\n */\nexport function createBpmnLayoutCache(options?: LayoutCacheOptions): LayoutCache {\n return createLayoutCache(options);\n}\n\n/**\n * Wrap an ELK-based layout function with BPMN topology caching so that diagrams\n * with unchanged node/edge structure are not re-laid-out unnecessarily.\n */\nexport function withBpmnLayoutCache(\n layoutFn: LayoutFn<BpmnRFNode, BpmnRFEdge>,\n cache?: LayoutCache,\n): LayoutFn<BpmnRFNode, BpmnRFEdge> {\n return withLayoutCache(layoutFn, cache ?? createLayoutCache());\n}\n","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: 560, h: 160 },\n Lane: { w: 480, h: 100 },\n SubProcess: { w: 200, h: 120 },\n Transaction: { w: 200, h: 120 },\n EventSubProcess: { w: 200, h: 120 },\n AdHocSubProcess: { w: 200, h: 120 },\n};\n\n// Left padding: label strip (≈30 px) + breathing room before first node.\nconst CONTAINER_PADDING: Partial<Record<BpmnElementType, string>> = {\n Pool: \"[top=30,left=55,bottom=30,right=40]\",\n Lane: \"[top=25,left=60,bottom=25,right=40]\",\n SubProcess: \"[top=25,left=35,bottom=25,right=35]\",\n Transaction: \"[top=25,left=35,bottom=25,right=35]\",\n EventSubProcess: \"[top=25,left=35,bottom=25,right=35]\",\n AdHocSubProcess: \"[top=25,left=35,bottom=25,right=35]\",\n};\n\n/**\n * ELK-based auto-layout for BPMN diagrams.\n *\n * Direction policy — always LEFT-TO-RIGHT to match screen anatomy:\n * - Root: RIGHT — free nodes and pools flow LR on the canvas.\n * - Pool that contains Lanes: DOWN internally so lanes stack top-to-bottom\n * (standard horizontal-pool anatomy); the pool itself is still placed LR.\n * - Pool without lanes, Lane, SubProcess, Transaction, AdHoc: RIGHT — content\n * flows left-to-right inside the container.\n * - All edges get ORTHOGONAL routing in a single INCLUDE_CHILDREN pass so\n * cross-pool and cross-lane edges are routed correctly.\n * - Containers auto-resize to fit their children.\n */\nexport async function bpmnElkLayout(\n nodes: BpmnRFNode[],\n edges: BpmnRFEdge[],\n): Promise<{ nodes: BpmnRFNode[]; edges: BpmnRFEdge[] }> {\n // Pools that contain at least one Lane child need DOWN internal direction so\n // the lanes stack vertically (standard horizontal BPMN pool).\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 type = (node as unknown as BpmnRFNode).data.elementType;\n if (!BPMN_CONTAINER_TYPES.has(type)) return undefined;\n const min = CONTAINER_MIN_SIZE[type];\n // Pool with Lanes: DOWN so lanes stack top-to-bottom inside the pool.\n // Everything else (Lane content, SubProcess, free tasks): RIGHT (LR).\n const dir = type === \"Pool\" && poolsWithLanes.has(node.id) ? \"DOWN\" : \"RIGHT\";\n return {\n \"elk.direction\": dir,\n \"elk.nodeSize.constraints\": \"MINIMUM_SIZE\",\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 \"elk.hierarchyHandling\": \"INCLUDE_CHILDREN\",\n \"elk.edgeRouting\": \"ORTHOGONAL\",\n \"elk.layered.spacing.nodeNodeBetweenLayers\": \"100\",\n \"elk.layered.spacing.edgeNodeBetweenLayers\": \"40\",\n \"elk.spacing.nodeNode\": \"60\",\n \"elk.spacing.componentComponent\": \"80\",\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 const updatedNodes = nodes.map((node) => {\n const laid = nodeMap.get(node.id);\n if (!laid) return node;\n return { ...node, position: laid.position, width: laid.width, height: laid.height };\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 if (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 { 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\";\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/elements/catalog.ts","../../src/elements/guards.ts","../../src/modeling/index.ts","../../src/layout/elk.ts","../../src/layout/index.ts","../../src/layout/bpmn-layout-graph.ts","../../src/layout/bpmn-custom-layout.ts"],"names":["getNode","getNodeSize","getOutgoingEdges","getIncomingEdges","createModelingRules","elkLayout","bpmnElkLayout","dagreLayout","applyLayoutResultToDiagram"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { BpmnElementType, BpmnElementMeta, BpmnElementSize } from \"./types\";\n\nexport const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta> = {\n // ─── Events ──────────────────────────────────────────────────────────────────\n StartEvent: {\n label: \"Start Event\",\n icon: \"Circle\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"source\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"start\",\n canBeStart: true, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 1,\n },\n EndEvent: {\n label: \"End Event\",\n icon: \"CircleDot\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"target\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"end\",\n canBeStart: false, canBeEnd: true,\n maxOutgoing: 0,\n },\n IntermediateCatchEvent: {\n label: \"Intermediate Catch Event\",\n icon: \"Clock3\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"intermediateCatch\",\n canBeStart: false, canBeEnd: false,\n },\n IntermediateThrowEvent: {\n label: \"Intermediate Throw Event\",\n icon: \"Send\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"intermediateThrow\",\n canBeStart: false, canBeEnd: false,\n },\n BoundaryEvent: {\n label: \"Boundary Event\",\n icon: \"AlarmClock\",\n category: \"event\",\n defaultWidth: 36, defaultHeight: 36,\n handlePolicy: \"source\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n eventSemantics: \"boundary\",\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0,\n },\n\n // ─── Tasks ───────────────────────────────────────────────────────────────────\n Task: {\n label: \"Task\",\n icon: \"CheckSquare\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n UserTask: {\n label: \"User Task\",\n icon: \"UserRound\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ServiceTask: {\n label: \"Service Task\",\n icon: \"Cog\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ScriptTask: {\n label: \"Script Task\",\n icon: \"FileCode\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ManualTask: {\n label: \"Manual Task\",\n icon: \"Hand\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n BusinessRuleTask: {\n label: \"Business Rule Task\",\n icon: \"Table2\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n ReceiveTask: {\n label: \"Receive Task\",\n icon: \"Inbox\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n SendTask: {\n label: \"Send Task\",\n icon: \"Send\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n CallActivity: {\n label: \"Call Activity\",\n icon: \"ExternalLink\",\n category: \"task\",\n defaultWidth: 120, defaultHeight: 60,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: true,\n supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n\n // ─── Gateways ────────────────────────────────────────────────────────────────\n ExclusiveGateway: {\n label: \"Exclusive Gateway\",\n icon: \"X\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n InclusiveGateway: {\n label: \"Inclusive Gateway\",\n icon: \"Circle\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n ParallelGateway: {\n label: \"Parallel Gateway\",\n icon: \"Plus\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n EventBasedGateway: {\n label: \"Event-Based Gateway\",\n icon: \"Radio\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 1,\n },\n ComplexGateway: {\n label: \"Complex Gateway\",\n icon: \"Asterisk\",\n category: \"gateway\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n\n // ─── Containers ───────────────────────────────────────────────────────────────\n SubProcess: {\n label: \"Sub-Process\",\n icon: \"PlusSquare\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: true,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n Transaction: {\n label: \"Transaction\",\n icon: \"Receipt\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: true,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n EventSubProcess: {\n label: \"Event Sub-Process\",\n icon: \"CircleDotDashed\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n AdHocSubProcess: {\n label: \"Ad-Hoc Sub-Process\",\n icon: \"Waves\",\n category: \"container\",\n defaultWidth: 350, defaultHeight: 200,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: true,\n supportsCollapse: true, supportsMarkers: true,\n canBeStart: false, canBeEnd: false,\n },\n Pool: {\n label: \"Pool\",\n icon: \"Rows3\",\n category: \"container\",\n defaultWidth: 600, defaultHeight: 200,\n handlePolicy: \"none\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n Lane: {\n label: \"Lane\",\n icon: \"PanelTop\",\n category: \"container\",\n defaultWidth: 600, defaultHeight: 120,\n handlePolicy: \"none\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n\n // ─── Artifacts ────────────────────────────────────────────────────────────────\n Annotation: {\n label: \"Text Annotation\",\n icon: \"StickyNote\",\n category: \"artifact\",\n defaultWidth: 100, defaultHeight: 60,\n handlePolicy: \"none\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n Group: {\n label: \"Group\",\n icon: \"Group\",\n category: \"artifact\",\n defaultWidth: 300, defaultHeight: 200,\n handlePolicy: \"none\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n\n // ─── Data (BPMN 2.0 §10.3) ───────────────────────────────────────────────────\n DataObject: {\n label: \"Data Object\",\n icon: \"File\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n DataObjectReference: {\n label: \"Data Object Reference\",\n icon: \"FileSymlink\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n DataInput: {\n label: \"Data Input\",\n icon: \"FileInput\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0,\n },\n DataOutput: {\n label: \"Data Output\",\n icon: \"FileOutput\",\n category: \"data\",\n defaultWidth: 36, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxOutgoing: 0,\n },\n DataStore: {\n label: \"Data Store\",\n icon: \"Database\",\n category: \"data\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n DataStoreReference: {\n label: \"Data Store Reference\",\n icon: \"DatabaseZap\",\n category: \"data\",\n defaultWidth: 50, defaultHeight: 50,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n maxIncoming: 0, maxOutgoing: 0,\n },\n\n // ─── Conversation (BPMN 2.0 §12) ─────────────────────────────────────────────\n Conversation: {\n label: \"Conversation\",\n icon: \"MessageCircle\",\n category: \"conversation\",\n defaultWidth: 60, defaultHeight: 52,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n SubConversation: {\n label: \"Sub-Conversation\",\n icon: \"MessagesSquare\",\n category: \"conversation\",\n defaultWidth: 60, defaultHeight: 52,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: true, acceptsBoundaryEvents: false,\n supportsCollapse: true,\n canBeStart: false, canBeEnd: false,\n },\n CallConversation: {\n label: \"Call Conversation\",\n icon: \"PhoneCall\",\n category: \"conversation\",\n defaultWidth: 60, defaultHeight: 52,\n handlePolicy: \"all\", orientation: \"free\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n\n // ─── Choreography (BPMN 2.0 §11) ─────────────────────────────────────────────\n ChoreographyTask: {\n label: \"Choreography Task\",\n icon: \"ArrowLeftRight\",\n category: \"choreography\",\n defaultWidth: 120, defaultHeight: 80,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n SubChoreography: {\n label: \"Sub-Choreography\",\n icon: \"BoxSelect\",\n category: \"choreography\",\n defaultWidth: 120, defaultHeight: 80,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: true, acceptsBoundaryEvents: false,\n supportsCollapse: true,\n canBeStart: false, canBeEnd: false,\n },\n CallChoreography: {\n label: \"Call Choreography\",\n icon: \"Phone\",\n category: \"choreography\",\n defaultWidth: 120, defaultHeight: 80,\n handlePolicy: \"all\", orientation: \"horizontal\",\n isContainer: false, acceptsBoundaryEvents: false,\n canBeStart: false, canBeEnd: false,\n },\n};\n\nexport function getElementMeta(type: BpmnElementType): BpmnElementMeta {\n return BPMN_ELEMENT_CATALOG[type];\n}\n\nexport const BPMN_RESIZABLE_ELEMENT_TYPES = [\n \"Task\",\n \"UserTask\",\n \"ServiceTask\",\n \"ScriptTask\",\n \"ManualTask\",\n \"BusinessRuleTask\",\n \"ReceiveTask\",\n \"SendTask\",\n \"CallActivity\",\n \"SubProcess\",\n \"Transaction\",\n \"EventSubProcess\",\n \"AdHocSubProcess\",\n \"Pool\",\n \"Lane\",\n \"Annotation\",\n \"Group\",\n \"SubConversation\",\n \"ChoreographyTask\",\n \"SubChoreography\",\n \"CallChoreography\",\n] satisfies BpmnElementType[];\n\nconst BPMN_MIN_SIZE_OVERRIDES: Partial<\n Record<BpmnElementType, Pick<BpmnElementSize, \"minWidth\" | \"minHeight\">>\n> = {\n Task: { minWidth: 80, minHeight: 48 },\n UserTask: { minWidth: 80, minHeight: 48 },\n ServiceTask: { minWidth: 80, minHeight: 48 },\n ScriptTask: { minWidth: 80, minHeight: 48 },\n ManualTask: { minWidth: 80, minHeight: 48 },\n BusinessRuleTask: { minWidth: 80, minHeight: 48 },\n ReceiveTask: { minWidth: 80, minHeight: 48 },\n SendTask: { minWidth: 80, minHeight: 48 },\n CallActivity: { minWidth: 80, minHeight: 48 },\n SubProcess: { minWidth: 160, minHeight: 100 },\n Transaction: { minWidth: 160, minHeight: 100 },\n EventSubProcess: { minWidth: 160, minHeight: 100 },\n AdHocSubProcess: { minWidth: 160, minHeight: 100 },\n Pool: { minWidth: 240, minHeight: 120 },\n Lane: { minWidth: 240, minHeight: 80 },\n Annotation: { minWidth: 80, minHeight: 40 },\n Group: { minWidth: 120, minHeight: 80 },\n SubConversation: { minWidth: 60, minHeight: 52 },\n ChoreographyTask: { minWidth: 100, minHeight: 70 },\n SubChoreography: { minWidth: 100, minHeight: 70 },\n CallChoreography: { minWidth: 100, minHeight: 70 },\n};\n\nconst resizableTypes = new Set<BpmnElementType>(BPMN_RESIZABLE_ELEMENT_TYPES);\n\nexport function isBpmnElementResizable(type: BpmnElementType): boolean {\n return resizableTypes.has(type);\n}\n\nexport function getBpmnElementSize(type: BpmnElementType): BpmnElementSize {\n const meta = getElementMeta(type);\n const min = BPMN_MIN_SIZE_OVERRIDES[type];\n return {\n width: meta.defaultWidth,\n height: meta.defaultHeight,\n minWidth: meta.minWidth ?? min?.minWidth ?? meta.defaultWidth,\n minHeight: meta.minHeight ?? min?.minHeight ?? meta.defaultHeight,\n resizable: meta.resizable ?? isBpmnElementResizable(type),\n };\n}\n","import { BPMN_ELEMENT_CATALOG } from \"./catalog\";\nimport type { BpmnElementType } from \"./types\";\n\nconst TASK_TYPES = new Set<BpmnElementType>([\n \"Task\", \"UserTask\", \"ServiceTask\", \"ScriptTask\",\n \"ManualTask\", \"BusinessRuleTask\", \"ReceiveTask\", \"SendTask\", \"CallActivity\",\n]);\n\nconst GATEWAY_TYPES = new Set<BpmnElementType>([\n \"ExclusiveGateway\", \"InclusiveGateway\", \"ParallelGateway\",\n \"EventBasedGateway\", \"ComplexGateway\",\n]);\n\nconst EVENT_TYPES = new Set<BpmnElementType>([\n \"StartEvent\", \"EndEvent\", \"IntermediateCatchEvent\",\n \"IntermediateThrowEvent\", \"BoundaryEvent\",\n]);\n\nconst DATA_TYPES = new Set<BpmnElementType>([\n \"DataObject\", \"DataObjectReference\", \"DataInput\", \"DataOutput\",\n \"DataStore\", \"DataStoreReference\",\n]);\n\nconst CONVERSATION_TYPES = new Set<BpmnElementType>([\n \"Conversation\", \"SubConversation\", \"CallConversation\",\n]);\n\nconst CHOREOGRAPHY_TYPES = new Set<BpmnElementType>([\n \"ChoreographyTask\", \"SubChoreography\", \"CallChoreography\",\n]);\n\nexport function isTaskType(type: BpmnElementType): boolean {\n return TASK_TYPES.has(type);\n}\n\nexport function isGatewayType(type: BpmnElementType): boolean {\n return GATEWAY_TYPES.has(type);\n}\n\nexport function isEventType(type: BpmnElementType): boolean {\n return EVENT_TYPES.has(type);\n}\n\nexport function isDataType(type: BpmnElementType): boolean {\n return DATA_TYPES.has(type);\n}\n\nexport function isConversationType(type: BpmnElementType): boolean {\n return CONVERSATION_TYPES.has(type);\n}\n\nexport function isChoreographyType(type: BpmnElementType): boolean {\n return CHOREOGRAPHY_TYPES.has(type);\n}\n\nexport function isContainerType(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].isContainer;\n}\n\nexport function acceptsBoundaryEvents(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].acceptsBoundaryEvents;\n}\n\nexport function getHandlePolicy(type: BpmnElementType) {\n return BPMN_ELEMENT_CATALOG[type].handlePolicy;\n}\n\nexport function getOrientation(type: BpmnElementType) {\n return BPMN_ELEMENT_CATALOG[type].orientation;\n}\n\nexport function supportsCollapse(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].supportsCollapse ?? false;\n}\n\nexport function supportsMarkers(type: BpmnElementType): boolean {\n return BPMN_ELEMENT_CATALOG[type].supportsMarkers ?? false;\n}\n","import {\n addNode,\n connectNodes,\n copyElements,\n createModelingRules,\n createSelectionState,\n createUniqueId,\n DiagramEventBus,\n createDiagramEventBus,\n executeCommand,\n executeCommands,\n findContainingNode,\n getNode,\n getNodeAbsolutePosition,\n getNodeCenterPosition,\n getNodeSize,\n getOutgoingEdges,\n getIncomingEdges,\n groupNodes,\n getNodeTabOrder,\n normalizeDiagramState,\n pasteElements,\n patchEdge,\n patchNode,\n moveNode,\n persistCommandHistory,\n removeElements,\n replaceNode,\n reparentNode,\n resizeNode,\n resizeNodeByHandle,\n restoreCommandHistory,\n setSelection,\n toRelativeNodePosition,\n computeSmartGuides,\n LayoutCache,\n createLayoutCache,\n withLayoutCache,\n getEdgeLabelLayout,\n type CommandStackState,\n type ClipboardState,\n type ConnectionValidator,\n type DiagramCommand,\n type DiagramSnapshot,\n type DiagramState,\n type EdgeLabelLayout,\n type EdgeLabelOffsetOptions,\n type LayoutCacheOptions,\n type LayoutFn,\n type ModelingRules,\n type ResizeHandlePosition,\n type SelectionState,\n type SmartGuideResult,\n type Viewport,\n} from \"@aranzatech/diagrams-core\";\nimport {\n createDiagramDocument,\n deserializeDiagram,\n deserializeDiagramSnapshot,\n parseDiagramDocument,\n serializeDiagram,\n serializeDiagramSnapshot,\n type CreateDiagramDocumentOptions,\n type DiagramDocument,\n} from \"@aranzatech/diagrams-core/serialization\";\nimport {\n BPMN_ELEMENT_CATALOG,\n getBpmnElementSize,\n isBpmnElementResizable,\n} from \"../elements/catalog\";\nimport {\n acceptsBoundaryEvents,\n getHandlePolicy,\n isDataType,\n isEventType,\n isGatewayType,\n} from \"../elements/guards\";\nimport type { BpmnElementType, BpmnEdgeData, BpmnEdgeType, BpmnNodeData } from \"../elements/types\";\nimport type { BpmnRFEdge, BpmnRFNode } from \"../xml/types\";\n\nexport { getBpmnElementSize, isBpmnElementResizable } from \"../elements/catalog\";\n\nexport type BpmnDiagramState = DiagramState<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnClipboardState = ClipboardState<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnDiagramDocument = DiagramDocument<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnDiagramSnapshot = DiagramSnapshot<BpmnRFNode, BpmnRFEdge>;\nexport type BpmnEventBus = DiagramEventBus<BpmnRFNode, BpmnRFEdge>;\n\nexport interface CreateBpmnNodeOptions {\n id: string;\n elementType: BpmnElementType;\n position: { x: number; y: number };\n label?: string;\n parentId?: string;\n width?: number;\n height?: number;\n data?: Partial<BpmnNodeData>;\n}\n\nexport interface ConnectBpmnOptions {\n id?: string;\n source: string;\n target: string;\n edgeType?: BpmnEdgeType;\n label?: string;\n sourceHandle?: string | null;\n targetHandle?: string | null;\n data?: Partial<BpmnEdgeData>;\n}\n\nexport interface ReplaceBpmnNodeOptions {\n id: string;\n elementType: BpmnElementType;\n label?: string;\n data?: Partial<BpmnNodeData>;\n width?: number;\n height?: number;\n}\n\nexport interface ReparentBpmnNodeOptions {\n id: string;\n parentId?: string;\n position?: { x: number; y: number };\n}\n\nexport interface FindBpmnContainerAtOptions {\n position: { x: number; y: number };\n excludeId?: string;\n}\n\nexport interface ReparentBpmnNodeAtPositionOptions {\n id: string;\n position: { x: number; y: number };\n}\n\nexport interface ResolveBpmnDropTargetOptions {\n elementType: BpmnElementType;\n position: { x: number; y: number };\n excludeId?: string;\n}\n\nexport interface BpmnDropTargetResolution {\n container?: BpmnRFNode | undefined;\n highlightedContainerId: string | null;\n invalidContainerId: string | null;\n isValid: boolean;\n}\n\nexport interface ResizeBpmnNodeOptions {\n id: string;\n width?: number;\n height?: number;\n}\n\nexport interface ReorderBpmnLaneOptions {\n poolId: string;\n laneId: string;\n index: number;\n}\n\nexport interface MoveBpmnLaneOptions {\n poolId: string;\n laneId: string;\n position: { x: number; y: number };\n}\n\nexport interface RouteBpmnEdgeOptions {\n id: string;\n routingPoints: Array<{ x: number; y: number }>;\n}\n\nexport interface PasteBpmnOptions {\n offset?: { x: number; y: number };\n position?: { x: number; y: number };\n}\n\nexport interface GroupAsBpmnSubProcessOptions {\n groupId?: string;\n nodeIds: string[];\n label?: string;\n padding?: number;\n data?: Partial<BpmnNodeData>;\n}\n\nexport interface ResizeBpmnNodeByHandleOptions {\n id: string;\n handle: ResizeHandlePosition;\n dx: number;\n dy: number;\n}\n\nexport function createBpmnNode(options: CreateBpmnNodeOptions): BpmnRFNode {\n const size = getBpmnElementSize(options.elementType);\n const meta = BPMN_ELEMENT_CATALOG[options.elementType];\n const orientation = options.data?.orientation ?? meta.orientation;\n const dragHandle = getBpmnDragHandleSelector(options.elementType);\n return {\n id: options.id,\n type: options.elementType,\n position: options.position,\n data: {\n elementType: options.elementType,\n orientation,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n width: options.width ?? size.width,\n height: options.height ?? size.height,\n zIndex: getBpmnNodeZIndex(options.elementType),\n ...(options.parentId ? { parentId: options.parentId } : {}),\n // extent:\"parent\" is intentionally omitted for Lane — it blocks resize beyond\n // the Pool boundary before the Pool/Lane coupling can expand the Pool.\n // Lane containment during drag is handled programmatically in handleNodeDragStop.\n ...(dragHandle ? { dragHandle } : {}),\n };\n}\n\nexport function getBpmnNodeZIndex(elementType: BpmnElementType): number {\n if (elementType === \"Pool\") return 0;\n if (elementType === \"Lane\") return 1;\n if (elementType === \"BoundaryEvent\") return 4;\n return 3;\n}\n\nexport function withBpmnNodeZIndexes(\n nodes: BpmnRFNode[],\n): BpmnRFNode[] {\n return nodes.map((node) => {\n const zIndex = getBpmnNodeZIndex(node.data.elementType);\n return node.zIndex === zIndex ? node : { ...node, zIndex };\n });\n}\n\nexport const BPMN_POOL_LANE_LAYOUT = {\n // Pool inner padding on all sides (no left label strip).\n // 8px = pool border (2px) + 6px visible gap.\n poolPad: 8,\n /** @deprecated use poolPad */\n poolHeaderSize: 8,\n // Lane left label strip (vertical text).\n laneHeaderSize: 28,\n laneGap: 0,\n verticalPoolHeaderSize: 28,\n minLaneSize: 96,\n} as const;\n\nexport function getBpmnDragHandleSelector(\n elementType: BpmnElementType,\n): string | undefined {\n if (elementType === \"Pool\") return \".pool-drag-handle\";\n if (elementType === \"Lane\") return \".lane-drag-handle\";\n return undefined;\n}\n\nexport const BPMN_SELECTION_STYLE = {\n nodeOutline: \"#2563eb\",\n edgeStroke: \"#2563eb\",\n handleFill: \"#ffffff\",\n handleStroke: \"#2563eb\",\n resizeHandleSize: 8,\n routingPointRadius: 5,\n} as const;\n\nexport const BPMN_ROUTABLE_EDGE_TYPES = [\n \"sequenceFlow\",\n \"messageFlow\",\n \"association\",\n \"dataAssociation\",\n \"conversationLink\",\n] satisfies BpmnEdgeType[];\n\nexport interface BpmnConnectionRule {\n edgeType: BpmnEdgeType;\n sourceCategories: Array<BpmnRFNode[\"data\"][\"elementType\"] | \"flowNode\" | \"data\" | \"artifact\" | \"conversation\">;\n targetCategories: Array<BpmnRFNode[\"data\"][\"elementType\"] | \"flowNode\" | \"data\" | \"artifact\" | \"conversation\">;\n allowSameParent?: boolean;\n allowDifferentParent?: boolean;\n}\n\nexport const BPMN_EDGE_CONNECTION_RULES: Record<BpmnEdgeType, BpmnConnectionRule> = {\n sequenceFlow: {\n edgeType: \"sequenceFlow\",\n sourceCategories: [\"flowNode\"],\n targetCategories: [\"flowNode\"],\n allowSameParent: true,\n allowDifferentParent: false,\n },\n messageFlow: {\n edgeType: \"messageFlow\",\n sourceCategories: [\"flowNode\"],\n targetCategories: [\"flowNode\"],\n allowSameParent: false,\n allowDifferentParent: true,\n },\n association: {\n edgeType: \"association\",\n sourceCategories: [\"flowNode\", \"artifact\", \"data\"],\n targetCategories: [\"flowNode\", \"artifact\", \"data\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n dataAssociation: {\n edgeType: \"dataAssociation\",\n sourceCategories: [\"flowNode\", \"data\"],\n targetCategories: [\"flowNode\", \"data\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n conversationLink: {\n edgeType: \"conversationLink\",\n sourceCategories: [\"conversation\", \"flowNode\"],\n targetCategories: [\"conversation\", \"flowNode\"],\n allowSameParent: true,\n allowDifferentParent: true,\n },\n};\n\nexport function inferBpmnEdgeType(\n state: BpmnDiagramState,\n sourceId: string,\n targetId: string,\n): BpmnEdgeType {\n const source = getNode(state, sourceId);\n const target = getNode(state, targetId);\n if (!source || !target) return \"sequenceFlow\";\n\n if (isDataType(source.data.elementType) || isDataType(target.data.elementType)) {\n return \"dataAssociation\";\n }\n if (\n source.data.elementType === \"Annotation\" ||\n target.data.elementType === \"Annotation\" ||\n source.data.elementType === \"Group\" ||\n target.data.elementType === \"Group\"\n ) {\n return \"association\";\n }\n if (\n source.data.elementType === \"Conversation\" ||\n source.data.elementType === \"SubConversation\" ||\n source.data.elementType === \"CallConversation\" ||\n target.data.elementType === \"Conversation\" ||\n target.data.elementType === \"SubConversation\" ||\n target.data.elementType === \"CallConversation\"\n ) {\n return \"conversationLink\";\n }\n if (source.parentId && target.parentId && source.parentId !== target.parentId) {\n return \"messageFlow\";\n }\n return \"sequenceFlow\";\n}\n\nfunction canUseSequenceFlow(type: BpmnElementType): boolean {\n const meta = BPMN_ELEMENT_CATALOG[type];\n return (\n meta.handlePolicy !== \"none\" &&\n !isDataType(type) &&\n type !== \"Annotation\" &&\n type !== \"Group\" &&\n meta.category !== \"conversation\"\n );\n}\n\nfunction matchesConnectionCategory(\n type: BpmnElementType,\n categories: BpmnConnectionRule[\"sourceCategories\"],\n): boolean {\n return categories.some((category) => {\n if (category === type) return true;\n if (category === \"flowNode\") return canUseSequenceFlow(type);\n if (category === \"data\") return isDataType(type);\n if (category === \"artifact\") return type === \"Annotation\" || type === \"Group\";\n if (category === \"conversation\") return BPMN_ELEMENT_CATALOG[type].category === \"conversation\";\n return false;\n });\n}\n\nexport function isBpmnEdgeRoutingEditable(edgeType: BpmnEdgeType): boolean {\n return BPMN_ROUTABLE_EDGE_TYPES.includes(edgeType);\n}\n\nexport function isBpmnProcessNode(type: BpmnElementType): boolean {\n return (\n isEventType(type) ||\n isGatewayType(type) ||\n type.includes(\"Task\") ||\n type === \"CallActivity\" ||\n type === \"SubProcess\" ||\n type === \"Transaction\" ||\n type === \"EventSubProcess\" ||\n type === \"AdHocSubProcess\"\n );\n}\n\n/** Returns true for every element type that can be dragged into a Pool or Lane container. */\nexport function isBpmnDroppableInContainer(type: BpmnElementType): boolean {\n return (\n isBpmnProcessNode(type) ||\n type === \"Annotation\" ||\n type === \"Group\" ||\n type === \"DataObject\" ||\n type === \"DataObjectReference\" ||\n type === \"DataStore\" ||\n type === \"DataStoreReference\"\n );\n}\n\nexport function canContainBpmnElement(\n parentType: BpmnElementType | undefined,\n childType: BpmnElementType,\n): true | string {\n if (!parentType) return true;\n if (parentType === \"Pool\") {\n return childType === \"Lane\" || isBpmnDroppableInContainer(childType)\n ? true\n : \"Pools can contain lanes, BPMN process nodes, annotations, groups, and data elements.\";\n }\n if (parentType === \"Lane\") {\n return isBpmnDroppableInContainer(childType)\n ? true\n : \"Lanes can only contain BPMN process nodes, annotations, groups, and data elements.\";\n }\n if (\n parentType === \"SubProcess\" ||\n parentType === \"Transaction\" ||\n parentType === \"EventSubProcess\" ||\n parentType === \"AdHocSubProcess\"\n ) {\n return isBpmnProcessNode(childType)\n ? true\n : \"Subprocesses can only contain BPMN process nodes.\";\n }\n return `${parentType} cannot contain BPMN child elements.`;\n}\n\nfunction getDirectBpmnChildren(\n state: BpmnDiagramState,\n parentId: string,\n): BpmnRFNode[] {\n return state.nodes.filter((node) => node.parentId === parentId);\n}\n\nexport function getBpmnPoolLanes(\n state: BpmnDiagramState,\n poolId: string,\n): BpmnRFNode[] {\n return getDirectBpmnChildren(state, poolId).filter(\n (node) => node.data.elementType === \"Lane\",\n );\n}\n\nfunction getBpmnNodeBounds(\n state: BpmnDiagramState,\n node: BpmnRFNode,\n): { x: number; y: number; width: number; height: number } {\n const position = getBpmnNodeAbsolutePosition(state, node) ?? node.position;\n const size = getBpmnNodeSize(node);\n return {\n ...position,\n width: size.width,\n height: size.height,\n };\n}\n\nfunction findBpmnLaneAt(\n state: BpmnDiagramState,\n position: { x: number; y: number },\n): BpmnRFNode | undefined {\n return state.nodes.find((node) => {\n if (node.data.elementType !== \"Lane\") return false;\n const bounds = getBpmnNodeBounds(state, node);\n return (\n position.x >= bounds.x &&\n position.x <= bounds.x + bounds.width &&\n position.y >= bounds.y &&\n position.y <= bounds.y + bounds.height\n );\n });\n}\n\nfunction getAncestorLaneId(\n state: BpmnDiagramState,\n node: BpmnRFNode | undefined,\n): string | undefined {\n let current = node;\n while (current) {\n if (current.data.elementType === \"Lane\") return current.id;\n current = current.parentId ? getNode(state, current.parentId) : undefined;\n }\n return undefined;\n}\n\nfunction getNodeDimension(node: BpmnRFNode, axis: \"width\" | \"height\"): number {\n return node[axis] ?? node.measured?.[axis] ?? getBpmnElementSize(node.data.elementType)[axis];\n}\n\nfunction getBpmnLaneOrderPosition(\n lane: BpmnRFNode,\n orientation: \"horizontal\" | \"vertical\",\n): number {\n const size = getBpmnNodeSize(lane);\n return orientation === \"vertical\"\n ? lane.position.x + size.width / 2\n : lane.position.y + size.height / 2;\n}\n\nfunction resizeHorizontalBpmnLanes(lanes: BpmnRFNode[], pool: BpmnRFNode): BpmnRFNode[] {\n const pad = BPMN_POOL_LANE_LAYOUT.poolPad; // 5px pool inner padding on all sides\n const poolSize = getBpmnNodeSize(pool);\n // Lane fills pool minus padding on both horizontal sides.\n const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width - pad * 2);\n // Lanes stack vertically; each gets an equal share of pool height minus top+bottom padding.\n const availH = Math.max(0, poolSize.height - pad * 2);\n const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, availH / Math.max(1, lanes.length));\n return lanes.map((lane, index) => ({\n ...lane,\n position: { x: pad, y: pad + index * laneHeight },\n width: laneWidth,\n height: laneHeight,\n parentId: pool.id,\n // extent:\"parent\" intentionally omitted — blocks resize→Pool coupling.\n zIndex: getBpmnNodeZIndex(\"Lane\"),\n data: { ...lane.data, orientation: \"horizontal\", laneIndex: index },\n }));\n}\n\nfunction resizeVerticalBpmnLanes(lanes: BpmnRFNode[], pool: BpmnRFNode): BpmnRFNode[] {\n const poolSize = getBpmnNodeSize(pool);\n const laneWidth = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.width / Math.max(1, lanes.length));\n const laneHeight = Math.max(BPMN_POOL_LANE_LAYOUT.minLaneSize, poolSize.height - BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize);\n return lanes.map((lane, index) => ({\n ...lane,\n position: { x: index * laneWidth, y: BPMN_POOL_LANE_LAYOUT.verticalPoolHeaderSize },\n width: laneWidth,\n height: laneHeight,\n parentId: pool.id,\n extent: \"parent\" as const,\n zIndex: getBpmnNodeZIndex(\"Lane\"),\n data: { ...lane.data, orientation: \"vertical\", laneIndex: index },\n }));\n}\n\nexport function layoutBpmnPoolLaneNodes(\n nodes: BpmnRFNode[],\n poolId: string,\n): BpmnRFNode[] {\n const pool = nodes.find((node) => node.id === poolId && node.data.elementType === \"Pool\");\n if (!pool) return nodes;\n\n const orientation = pool.data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const lanes = nodes\n .filter((node) => node.parentId === pool.id && node.data.elementType === \"Lane\")\n .sort((a, b) => {\n const aIndex = typeof a.data.laneIndex === \"number\" ? a.data.laneIndex : undefined;\n const bIndex = typeof b.data.laneIndex === \"number\" ? b.data.laneIndex : undefined;\n if (aIndex !== undefined || bIndex !== undefined) return (aIndex ?? 0) - (bIndex ?? 0);\n return getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation);\n });\n\n if (lanes.length === 0) return withBpmnNodeZIndexes(nodes);\n\n const resizedLanes = orientation === \"vertical\"\n ? resizeVerticalBpmnLanes(lanes, pool)\n : resizeHorizontalBpmnLanes(lanes, pool);\n\n const laneMap = new Map(resizedLanes.map((lane) => [lane.id, lane]));\n\n // Also update the Pool's height so it always wraps its lanes with the\n // correct inner padding on top and bottom (POOL_INNER_PAD = 5px each).\n const pad = BPMN_POOL_LANE_LAYOUT.poolPad;\n const totalLaneH = resizedLanes.reduce((sum, l) => sum + (l.height ?? 0), 0);\n const requiredPoolH = totalLaneH + pad * 2;\n const poolMap = new Map<string, BpmnRFNode>();\n if (orientation === \"horizontal\") {\n const currentH = getBpmnNodeSize(pool).height;\n poolMap.set(pool.id, {\n ...pool,\n height: Math.max(requiredPoolH, currentH),\n });\n }\n\n return withBpmnNodeZIndexes(\n nodes.map((node) => laneMap.get(node.id) ?? poolMap.get(node.id) ?? node),\n );\n}\n\nexport function reorderBpmnLaneAfterDrop(\n nodes: BpmnRFNode[],\n laneId: string,\n): BpmnRFNode[] {\n const lane = nodes.find((node) => node.id === laneId && node.data.elementType === \"Lane\");\n if (!lane?.parentId) return nodes;\n\n const pool = nodes.find((node) => node.id === lane.parentId && node.data.elementType === \"Pool\");\n if (!pool) return nodes;\n\n const orientation = pool.data.orientation === \"vertical\" ? \"vertical\" : \"horizontal\";\n const lanes = nodes\n .filter((node) => node.parentId === pool.id && node.data.elementType === \"Lane\")\n .sort((a, b) => getBpmnLaneOrderPosition(a, orientation) - getBpmnLaneOrderPosition(b, orientation));\n\n const moved = lanes.find((candidate) => candidate.id === lane.id);\n if (!moved) return layoutBpmnPoolLaneNodes(nodes, pool.id);\n\n const withoutMoved = lanes.filter((candidate) => candidate.id !== lane.id);\n const movedCenter = getBpmnLaneOrderPosition(lane, orientation);\n const insertIndex = withoutMoved.findIndex(\n (candidate) => movedCenter < getBpmnLaneOrderPosition(candidate, orientation),\n );\n const ordered = [...withoutMoved];\n ordered.splice(insertIndex === -1 ? ordered.length : insertIndex, 0, moved);\n\n const orderedMap = new Map(ordered.map((candidate, index) => [candidate.id, index]));\n const sortedByDrop = nodes.map((node) => {\n if (node.parentId !== pool.id || node.data.elementType !== \"Lane\") return node;\n return { ...node, data: { ...node.data, laneIndex: orderedMap.get(node.id) ?? 0 } };\n });\n\n return layoutBpmnPoolLaneNodes(sortedByDrop, pool.id);\n}\n\nexport function getBpmnNodeSize(node: BpmnRFNode): { width: number; height: number } {\n return getNodeSize(node, getBpmnElementSize(node.data.elementType));\n}\n\nexport function getBpmnNodeAbsolutePosition(\n state: BpmnDiagramState,\n nodeOrId: BpmnRFNode | string,\n): { x: number; y: number } | undefined {\n const nodeId = typeof nodeOrId === \"string\" ? nodeOrId : nodeOrId.id;\n return getNodeAbsolutePosition(state, nodeId);\n}\n\nexport function toBpmnRelativePosition(\n state: BpmnDiagramState,\n absolutePosition: { x: number; y: number },\n parentOrId: BpmnRFNode | string,\n): { x: number; y: number } {\n return toRelativeNodePosition(state, absolutePosition, parentOrId);\n}\n\nconst BPMN_CONTAINER_PRIORITY: BpmnElementType[] = [\n \"Lane\",\n \"SubProcess\",\n \"EventSubProcess\",\n \"Transaction\",\n \"AdHocSubProcess\",\n \"Pool\",\n];\n\nexport function findBpmnContainerAt(\n state: BpmnDiagramState,\n options: FindBpmnContainerAtOptions,\n): BpmnRFNode | undefined {\n return findContainingNode(state, {\n point: options.position,\n excludeId: options.excludeId,\n fallbackSize: (node) => getBpmnElementSize(node.data.elementType),\n predicate: (node) => BPMN_CONTAINER_PRIORITY.includes(node.data.elementType),\n sort: (a, b) => {\n const aPriority = BPMN_CONTAINER_PRIORITY.indexOf(a.data.elementType);\n const bPriority = BPMN_CONTAINER_PRIORITY.indexOf(b.data.elementType);\n if (aPriority !== bPriority) return aPriority - bPriority;\n const aSize = getBpmnNodeSize(a);\n const bSize = getBpmnNodeSize(b);\n return aSize.width * aSize.height - bSize.width * bSize.height;\n },\n });\n}\n\nexport function resolveBpmnDropTarget(\n state: BpmnDiagramState,\n options: ResolveBpmnDropTargetOptions,\n): BpmnDropTargetResolution {\n if (options.elementType === \"Pool\") {\n return { highlightedContainerId: null, invalidContainerId: null, isValid: true };\n }\n\n if (options.elementType === \"Lane\") {\n const pool = state.nodes.find((node) => {\n if (node.data.elementType !== \"Pool\") return false;\n const bounds = getBpmnNodeBounds(state, node);\n return (\n options.position.x >= bounds.x &&\n options.position.x <= bounds.x + bounds.width &&\n options.position.y >= bounds.y &&\n options.position.y <= bounds.y + bounds.height\n );\n });\n return {\n ...(pool ? { container: pool } : {}),\n highlightedContainerId: pool?.id ?? null,\n invalidContainerId: null,\n isValid: Boolean(pool),\n };\n }\n\n const lane = findBpmnLaneAt(state, options.position);\n if (lane) {\n return {\n container: lane,\n highlightedContainerId: lane.id,\n invalidContainerId: null,\n isValid: true,\n };\n }\n\n const container = findBpmnContainerAt(state, {\n position: options.position,\n ...(options.excludeId ? { excludeId: options.excludeId } : {}),\n });\n\n if (container?.data.elementType === \"Pool\") {\n const hasLanes = getBpmnPoolLanes(state, container.id).length > 0;\n if (hasLanes) {\n return {\n highlightedContainerId: null,\n invalidContainerId: container.id,\n isValid: false,\n };\n }\n }\n\n return {\n ...(container ? { container } : {}),\n highlightedContainerId: getAncestorLaneId(state, container) ?? container?.id ?? null,\n invalidContainerId: null,\n isValid: true,\n };\n}\n\nexport function getBpmnNodeCenter(\n node: BpmnRFNode,\n absolutePosition: { x: number; y: number },\n): { x: number; y: number } {\n return getNodeCenterPosition(absolutePosition, getBpmnNodeSize(node));\n}\n\nfunction resolvePoolLaneDirection(pool: BpmnRFNode): \"horizontal\" | \"vertical\" {\n return pool.data.orientation === \"vertical\" ? \"horizontal\" : \"vertical\";\n}\n\nexport function getBpmnLaneIndexAtPosition(\n state: BpmnDiagramState,\n poolId: string,\n position: { x: number; y: number },\n): number {\n const pool = getNode(state, poolId);\n if (!pool) return 0;\n const lanes = getBpmnPoolLanes(state, poolId);\n const direction = resolvePoolLaneDirection(pool);\n const axis = direction === \"vertical\" ? \"y\" : \"x\";\n const sizeKey = direction === \"vertical\" ? \"height\" : \"width\";\n\n for (let index = 0; index < lanes.length; index += 1) {\n const lane = lanes[index];\n const midpoint = lane.position[axis] + getNodeDimension(lane, sizeKey) / 2;\n if (position[axis] < midpoint) return index;\n }\n return lanes.length;\n}\n\nfunction sortBpmnLanes(\n state: BpmnDiagramState,\n poolId: string,\n laneId: string,\n index: number,\n): BpmnDiagramState {\n const lanes = getBpmnPoolLanes(state, poolId);\n const currentIndex = lanes.findIndex((lane) => lane.id === laneId);\n if (currentIndex < 0) return state;\n\n const orderedIds = lanes.map((lane) => lane.id);\n const [moved] = orderedIds.splice(currentIndex, 1);\n orderedIds.splice(Math.max(0, Math.min(index, orderedIds.length)), 0, moved);\n const order = new Map(orderedIds.map((id, laneIndex) => [id, laneIndex]));\n\n return {\n ...state,\n nodes: [...state.nodes].sort((a, b) => {\n const aOrder = order.get(a.id);\n const bOrder = order.get(b.id);\n if (aOrder === undefined && bOrder === undefined) return 0;\n if (aOrder === undefined) return -1;\n if (bOrder === undefined) return 1;\n return aOrder - bOrder;\n }),\n };\n}\n\nexport function layoutBpmnPoolLanes(\n state: BpmnDiagramState,\n poolId: string,\n): BpmnDiagramState {\n const pool = getNode(state, poolId);\n if (!pool) return state;\n const poolSize = getBpmnElementSize(\"Pool\");\n const direction = resolvePoolLaneDirection(pool);\n const lanes = getBpmnPoolLanes(state, poolId);\n let cursor = direction === \"vertical\" ? BPMN_POOL_LANE_LAYOUT.poolHeaderSize : 0;\n\n let next = state;\n for (const lane of lanes) {\n const laneSize = getBpmnElementSize(\"Lane\");\n const width =\n direction === \"vertical\"\n ? Math.max(poolSize.minWidth - BPMN_POOL_LANE_LAYOUT.poolHeaderSize, lane.width ?? laneSize.width)\n : lane.width ?? laneSize.width;\n const height =\n direction === \"vertical\"\n ? lane.height ?? laneSize.height\n : Math.max(poolSize.minHeight - BPMN_POOL_LANE_LAYOUT.poolHeaderSize, lane.height ?? laneSize.height);\n next = patchNode(next, lane.id, {\n position: direction === \"vertical\" ? { x: BPMN_POOL_LANE_LAYOUT.poolHeaderSize, y: cursor } : { x: cursor, y: BPMN_POOL_LANE_LAYOUT.poolHeaderSize },\n width,\n height,\n data: { orientation: pool.data.orientation ?? \"horizontal\" },\n });\n cursor += (direction === \"vertical\" ? height : width) + BPMN_POOL_LANE_LAYOUT.laneGap;\n }\n\n const minWidth =\n direction === \"vertical\"\n ? poolSize.minWidth\n : Math.max(poolSize.minWidth, cursor);\n const minHeight =\n direction === \"vertical\"\n ? Math.max(poolSize.minHeight, cursor)\n : poolSize.minHeight;\n return resizeNode(next, poolId, { width: minWidth, height: minHeight } as Parameters<typeof resizeNode<BpmnRFNode, BpmnRFEdge>>[2]);\n}\n\nexport function reorderBpmnLane(\n state: BpmnDiagramState,\n options: ReorderBpmnLaneOptions,\n): BpmnDiagramState {\n return layoutBpmnPoolLanes(\n sortBpmnLanes(state, options.poolId, options.laneId, options.index),\n options.poolId,\n );\n}\n\nexport function validateBpmnConnectionForEdgeType(\n state: BpmnDiagramState,\n edgeType: BpmnEdgeType,\n source: BpmnRFNode,\n target: BpmnRFNode,\n): true | string {\n const rule = BPMN_EDGE_CONNECTION_RULES[edgeType];\n if (!matchesConnectionCategory(source.data.elementType, rule.sourceCategories)) {\n return `${edgeType} cannot start from ${source.data.elementType}.`;\n }\n if (!matchesConnectionCategory(target.data.elementType, rule.targetCategories)) {\n return `${edgeType} cannot target ${target.data.elementType}.`;\n }\n const sameParent = (source.parentId ?? null) === (target.parentId ?? null);\n if (sameParent && rule.allowSameParent === false) {\n return `${edgeType} must connect BPMN elements in different participants/scopes.`;\n }\n if (!sameParent && rule.allowDifferentParent === false) {\n return `${edgeType} must stay inside the same BPMN participant/scope.`;\n }\n if (edgeType === \"sequenceFlow\") {\n if (source.data.elementType === \"EndEvent\") return \"End events cannot have outgoing sequence flows.\";\n if (target.data.elementType === \"StartEvent\") return \"Start events cannot have incoming sequence flows.\";\n return validateEdgeCardinality(state, edgeType, source, target);\n }\n return true;\n}\n\nfunction validateEdgeCardinality(\n state: BpmnDiagramState,\n edgeType: BpmnEdgeType,\n source: BpmnRFNode,\n target: BpmnRFNode,\n): true | string {\n if (edgeType !== \"sequenceFlow\") return true;\n\n const sourceMax = BPMN_ELEMENT_CATALOG[source.data.elementType].maxOutgoing;\n const targetMax = BPMN_ELEMENT_CATALOG[target.data.elementType].maxIncoming;\n const outgoing = getOutgoingEdges(state, source.id).filter(\n (edge) => edge.data?.edgeType === \"sequenceFlow\",\n );\n const incoming = getIncomingEdges(state, target.id).filter(\n (edge) => edge.data?.edgeType === \"sequenceFlow\",\n );\n\n if (sourceMax !== undefined && outgoing.length >= sourceMax) {\n return `${source.data.elementType} cannot have more than ${sourceMax} outgoing sequence flow(s).`;\n }\n if (targetMax !== undefined && incoming.length >= targetMax) {\n return `${target.data.elementType} cannot have more than ${targetMax} incoming sequence flow(s).`;\n }\n return true;\n}\n\nexport const bpmnConnectionValidators: Array<\n ConnectionValidator<BpmnRFNode, BpmnRFEdge>\n> = [\n ({ state, source, target }) => {\n if (source.id === target.id) return \"BPMN self-connections are not allowed.\";\n const edgeType = inferBpmnEdgeType(state, source.id, target.id);\n\n if (getHandlePolicy(source.data.elementType) === \"none\" || getHandlePolicy(target.data.elementType) === \"none\") {\n return \"Elements without BPMN connection handles cannot be directly connected.\";\n }\n\n if (edgeType === \"sequenceFlow\") {\n return validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n }\n\n return validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n },\n];\n\nexport const BPMN_MODELING_RULES: ModelingRules<BpmnRFNode, BpmnRFEdge> =\n createModelingRules({\n connect: [\n ({ state, source, target }) => {\n if (!source || !target) return false;\n for (const validator of bpmnConnectionValidators) {\n const result = validator({\n state,\n source,\n target,\n existingEdges: state.edges,\n });\n if (result !== true) return result;\n }\n return true;\n },\n ],\n drop: [\n ({ node, parent }) => {\n if (!node || !parent) return true;\n if (node.data.elementType === \"BoundaryEvent\") {\n return acceptsBoundaryEvents(parent.data.elementType)\n ? true\n : \"Boundary events can only be attached to tasks or subprocesses.\";\n }\n return canContainBpmnElement(parent.data.elementType, node.data.elementType);\n },\n ],\n reparent: [\n ({ node, parent }) => {\n if (!node || !parent) return true;\n if (node.data.elementType === \"BoundaryEvent\") {\n return acceptsBoundaryEvents(parent.data.elementType)\n ? true\n : \"Boundary events can only be reparented to tasks or subprocesses.\";\n }\n return canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n },\n ],\n delete: [() => true],\n resize: [\n ({ node }) =>\n !node || isBpmnElementResizable(node.data.elementType)\n ? true\n : `${node.data.elementType} is not resizable in BPMN.`,\n ],\n });\n\n/**\n * Create a {@link DiagramCommand} that adds a new BPMN element to the diagram.\n *\n * @param options - Element type, id, position, label, and optional parent/data overrides.\n * @returns Undoable command to be executed by {@link runBpmnCommand}.\n */\nexport function createBpmnNodeCommand(\n options: CreateBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.createNode.${options.id}`,\n label: `Create ${options.elementType}`,\n execute: (state) => addNode(state, createBpmnNode(options)),\n };\n}\n\n/**\n * Create a {@link DiagramCommand} that connects two BPMN elements with the\n * most appropriate edge type (auto-inferred when `edgeType` is omitted).\n * Validates the connection against BPMN 2.0 rules before executing.\n *\n * @param options - Source/target ids, optional edge type, label, and data overrides.\n * @returns Undoable command, throws when the connection violates BPMN rules.\n */\nexport function connectBpmnCommand(\n options: ConnectBpmnOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.connect.${options.id ?? `${options.source}-${options.target}`}`,\n label: \"Connect BPMN elements\",\n execute: (state) => {\n const edgeType = options.edgeType ?? inferBpmnEdgeType(state, options.source, options.target);\n const source = getNode(state, options.source);\n const target = getNode(state, options.target);\n if (!source) throw new Error(`Source node \"${options.source}\" does not exist.`);\n if (!target) throw new Error(`Target node \"${options.target}\" does not exist.`);\n const validation = validateBpmnConnectionForEdgeType(state, edgeType, source, target);\n if (validation !== true) throw new Error(validation);\n return connectNodes(\n state,\n {\n source: options.source,\n target: options.target,\n type: edgeType,\n ...(options.sourceHandle !== undefined\n ? { sourceHandle: options.sourceHandle }\n : {}),\n ...(options.targetHandle !== undefined\n ? { targetHandle: options.targetHandle }\n : {}),\n ...(options.id ? { id: options.id } : {}),\n data: {\n edgeType,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n },\n [],\n );\n },\n };\n}\n\nexport function attachBoundaryEventCommand(\n boundaryId: string,\n hostId: string,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.attachBoundary.${boundaryId}.${hostId}`,\n label: \"Attach boundary event\",\n execute: (state) => {\n const host = getNode(state, hostId);\n if (!host || !acceptsBoundaryEvents(host.data.elementType)) {\n throw new Error(`Element \"${hostId}\" cannot host boundary events.`);\n }\n const boundary = getNode(state, boundaryId);\n if (!boundary || boundary.data.elementType !== \"BoundaryEvent\") {\n throw new Error(`Element \"${boundaryId}\" is not a boundary event.`);\n }\n const reparented = reparentNode(state, boundaryId, { parentId: hostId });\n return patchNode(reparented, boundaryId, {\n data: { attachedToRef: hostId },\n });\n },\n };\n}\n\nexport function replaceBpmnNodeCommand(\n options: ReplaceBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.replaceNode.${options.id}.${options.elementType}`,\n label: `Replace with ${options.elementType}`,\n execute: (state) => {\n const current = getNode(state, options.id);\n if (!current) throw new Error(`Element \"${options.id}\" does not exist.`);\n const meta = BPMN_ELEMENT_CATALOG[options.elementType];\n return replaceNode(state, options.id, {\n ...current,\n type: options.elementType,\n width: options.width ?? current.width ?? meta.defaultWidth,\n height: options.height ?? current.height ?? meta.defaultHeight,\n data: {\n ...current.data,\n elementType: options.elementType,\n ...(options.label ? { label: options.label } : {}),\n ...(options.data ?? {}),\n },\n });\n },\n };\n}\n\nexport function reparentBpmnNodeCommand(\n options: ReparentBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.reparent.${options.id}.${options.parentId ?? \"root\"}`,\n label: \"Reparent BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n const parent = options.parentId ? getNode(state, options.parentId) : undefined;\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n if (parent && node.data.elementType === \"BoundaryEvent\" && !acceptsBoundaryEvents(parent.data.elementType)) {\n throw new Error(\"Boundary events can only be reparented to tasks or subprocesses.\");\n }\n const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n if (containment !== true) throw new Error(containment);\n const reparented = reparentNode(state, options.id, {\n ...(options.parentId !== undefined ? { parentId: options.parentId } : {}),\n ...(options.position ? { position: options.position } : {}),\n });\n return parent?.data.elementType === \"Pool\" && node.data.elementType === \"Lane\"\n ? layoutBpmnPoolLanes(reparented, parent.id)\n : reparented;\n },\n };\n}\n\nexport function reparentBpmnNodeAtPosition(\n state: BpmnDiagramState,\n options: ReparentBpmnNodeAtPositionOptions,\n): BpmnDiagramState {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n\n const hitPoint = getBpmnNodeCenter(node, options.position);\n const parent = isBpmnProcessNode(node.data.elementType)\n ? findBpmnContainerAt(state, { position: hitPoint, excludeId: node.id })\n : undefined;\n const containment = canContainBpmnElement(parent?.data.elementType, node.data.elementType);\n if (containment !== true) throw new Error(containment);\n\n const nextPosition = parent\n ? toBpmnRelativePosition(state, options.position, parent)\n : options.position;\n return reparentNode(state, node.id, {\n ...(parent ? { parentId: parent.id } : { parentId: undefined }),\n position: nextPosition,\n });\n}\n\n// Half-size of a BoundaryEvent (36×36) — used to convert center↔top-left coords.\nconst BE_HALF = 18;\n\nfunction clampBoundaryEventsAfterResize(\n state: Parameters<DiagramCommand<BpmnRFNode, BpmnRFEdge>[\"execute\"]>[0],\n hostId: string,\n oldW: number,\n oldH: number,\n newW: number,\n newH: number,\n): Parameters<DiagramCommand<BpmnRFNode, BpmnRFEdge>[\"execute\"]>[0] {\n const boundaryEvents = state.nodes.filter(\n (n) => n.data.elementType === \"BoundaryEvent\" && n.parentId === hostId,\n );\n\n let next = state;\n for (const be of boundaryEvents) {\n const px = be.position?.x ?? 0;\n const py = be.position?.y ?? 0;\n const cx = px + BE_HALF;\n const cy = py + BE_HALF;\n\n const distLeft = Math.abs(cx);\n const distRight = Math.abs(cx - oldW);\n const distTop = Math.abs(cy);\n const distBottom = Math.abs(cy - oldH);\n const minDist = Math.min(distLeft, distRight, distTop, distBottom);\n\n let newCx: number;\n let newCy: number;\n\n if (minDist === distBottom) {\n newCy = newH;\n newCx = Math.min(Math.max(cx, BE_HALF), newW - BE_HALF);\n } else if (minDist === distRight) {\n newCx = newW;\n newCy = Math.min(Math.max(cy, BE_HALF), newH - BE_HALF);\n } else if (minDist === distTop) {\n newCy = 0;\n newCx = Math.min(Math.max(cx, BE_HALF), newW - BE_HALF);\n } else {\n newCx = 0;\n newCy = Math.min(Math.max(cy, BE_HALF), newH - BE_HALF);\n }\n\n next = moveNode(next, be.id, { x: newCx - BE_HALF, y: newCy - BE_HALF });\n }\n\n return next;\n}\n\n/**\n * Create a {@link DiagramCommand} that resizes a BPMN element, enforcing\n * minimum dimensions per spec. Boundary events attached to the resized element\n * are automatically repositioned to stay on the new border.\n *\n * @param options - Target element id, optional new width/height.\n * @returns Undoable command, throws when the element is not resizable.\n */\nexport function resizeBpmnNodeCommand(\n options: ResizeBpmnNodeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.resize.${options.id}`,\n label: \"Resize BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n const size = getBpmnElementSize(node.data.elementType);\n if (!size.resizable) {\n throw new Error(`${node.data.elementType} is not resizable in BPMN.`);\n }\n\n const oldW = node.width ?? size.width;\n const oldH = node.height ?? size.height;\n const clampedW =\n options.width === undefined ? undefined : Math.max(size.minWidth, options.width);\n const clampedH =\n options.height === undefined ? undefined : Math.max(size.minHeight, options.height);\n\n const resized = resizeNode(state, options.id, {\n width: clampedW,\n height: clampedH,\n } as Parameters<typeof resizeNode<BpmnRFNode, BpmnRFEdge>>[2]);\n\n const updatedNode = getNode(resized, options.id);\n const newW = updatedNode?.width ?? clampedW ?? oldW;\n const newH = updatedNode?.height ?? clampedH ?? oldH;\n\n return clampBoundaryEventsAfterResize(resized, options.id, oldW, oldH, newW, newH);\n },\n };\n}\n\nexport function reorderBpmnLaneCommand(\n options: ReorderBpmnLaneOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.reorderLane.${options.poolId}.${options.laneId}`,\n label: \"Reorder BPMN lane\",\n execute: (state) => {\n const pool = getNode(state, options.poolId);\n const lane = getNode(state, options.laneId);\n if (!pool || pool.data.elementType !== \"Pool\") {\n throw new Error(`Element \"${options.poolId}\" is not a pool.`);\n }\n if (!lane || lane.data.elementType !== \"Lane\" || lane.parentId !== options.poolId) {\n throw new Error(`Element \"${options.laneId}\" is not a lane in pool \"${options.poolId}\".`);\n }\n return reorderBpmnLane(state, options);\n },\n };\n}\n\nexport function moveBpmnLaneCommand(\n options: MoveBpmnLaneOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.moveLane.${options.poolId}.${options.laneId}`,\n label: \"Move BPMN lane\",\n execute: (state) =>\n reorderBpmnLane(state, {\n poolId: options.poolId,\n laneId: options.laneId,\n index: getBpmnLaneIndexAtPosition(state, options.poolId, options.position),\n }),\n };\n}\n\nexport function routeBpmnEdgeCommand(\n options: RouteBpmnEdgeOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.routeEdge.${options.id}`,\n label: \"Route BPMN edge\",\n execute: (state) => {\n const edge = state.edges.find((item) => item.id === options.id);\n if (!edge) throw new Error(`Edge \"${options.id}\" does not exist.`);\n const edgeType = edge.data?.edgeType;\n if (!edgeType || !isBpmnEdgeRoutingEditable(edgeType)) {\n throw new Error(`${edgeType ?? \"edge\"} routing points cannot be edited.`);\n }\n return patchEdge(state, options.id, {\n data: { routingPoints: options.routingPoints },\n } as Parameters<typeof patchEdge<BpmnRFNode, BpmnRFEdge>>[2]);\n },\n };\n}\n\nexport function deleteBpmnElementsCommand(\n ids: string[],\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.delete.${ids.join(\".\")}`,\n label: \"Delete BPMN elements\",\n execute: (state) => removeElements(state, ids),\n };\n}\n\nexport function copyBpmnElements(\n state: BpmnDiagramState,\n selection?: SelectionState,\n): BpmnClipboardState {\n return copyElements(state, selection);\n}\n\nexport function pasteBpmnElementsCommand(\n clipboard: BpmnClipboardState,\n options: PasteBpmnOptions = {},\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: \"bpmn.paste\",\n label: \"Paste BPMN elements\",\n execute: (state) => pasteElements(state, clipboard, options),\n };\n}\n\nexport function selectBpmnElementsCommand(\n selection: SelectionState,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: \"bpmn.select\",\n label: \"Select BPMN elements\",\n execute: (state) => setSelection(state, createSelectionState(selection.nodeIds, selection.edgeIds)),\n };\n}\n\nexport function createBpmnDiagramDocument(\n state: BpmnDiagramState,\n options: Omit<CreateDiagramDocumentOptions, \"diagramType\"> = {},\n): BpmnDiagramDocument {\n return createDiagramDocument(normalizeDiagramState(state), {\n ...options,\n diagramType: \"bpmn\",\n });\n}\n\nexport function serializeBpmnDiagram(\n state: BpmnDiagramState,\n options: Omit<CreateDiagramDocumentOptions, \"diagramType\"> & { viewport?: Viewport } = {},\n): string {\n const { viewport, ...docOptions } = options;\n const normalized = normalizeDiagramState(state);\n if (viewport) {\n return serializeDiagramSnapshot(\n { nodes: normalized.nodes, edges: normalized.edges, viewport },\n { ...docOptions, diagramType: \"bpmn\" },\n );\n }\n return serializeDiagram(normalized, { ...docOptions, diagramType: \"bpmn\" });\n}\n\nexport function parseBpmnDiagramDocument(json: string): BpmnDiagramDocument {\n const document = parseDiagramDocument<BpmnRFNode, BpmnRFEdge>(json);\n if (document.diagramType && document.diagramType !== \"bpmn\") {\n throw new Error(`Expected a BPMN diagram document, received \"${document.diagramType}\".`);\n }\n return document;\n}\n\nexport function deserializeBpmnDiagram(json: string): BpmnDiagramState {\n const document = parseBpmnDiagramDocument(json);\n return deserializeDiagram<BpmnRFNode, BpmnRFEdge>(JSON.stringify(document));\n}\n\n/**\n * Deserialize a BPMN diagram document to a snapshot that includes the persisted\n * viewport. Returns `viewport: { x:0, y:0, zoom:1 }` when none was saved.\n */\nexport function deserializeBpmnDiagramSnapshot(json: string): BpmnDiagramSnapshot {\n const document = parseBpmnDiagramDocument(json);\n return deserializeDiagramSnapshot<BpmnRFNode, BpmnRFEdge>(JSON.stringify(document));\n}\n\nexport function createBpmnEventBus(): BpmnEventBus {\n return createDiagramEventBus<BpmnRFNode, BpmnRFEdge>();\n}\n\nexport function runBpmnCommand(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n command: DiagramCommand<BpmnRFNode, BpmnRFEdge>,\n bus?: BpmnEventBus,\n): CommandStackState<BpmnRFNode, BpmnRFEdge> {\n const next = executeCommand(stack, command);\n bus?.emit(\"command:executed\", {\n commandId: command.id,\n ...(command.label !== undefined ? { label: command.label } : {}),\n state: next.current,\n });\n return next;\n}\n\nexport function runBpmnCommands(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n commands: Array<DiagramCommand<BpmnRFNode, BpmnRFEdge>>,\n options: { id?: string; label?: string; bus?: BpmnEventBus } = {},\n): CommandStackState<BpmnRFNode, BpmnRFEdge> {\n const { bus, ...execOptions } = options;\n const next = executeCommands(stack, commands, execOptions);\n bus?.emit(\"command:executed\", {\n commandId: execOptions.id ?? \"bpmn.batch\",\n ...(execOptions.label !== undefined ? { label: execOptions.label } : {}),\n state: next.current,\n });\n return next;\n}\n\n/**\n * Persist BPMN command history to localStorage under a per-diagram key.\n * Safe to call in SSR environments — writes are silently skipped.\n */\nexport function persistBpmnHistory(\n stack: CommandStackState<BpmnRFNode, BpmnRFEdge>,\n diagramId: string,\n): void {\n persistCommandHistory(stack, `bpmn.history.${diagramId}`);\n}\n\n/**\n * Restore BPMN command history from localStorage. Returns `null` when no\n * history exists for the given diagram id or when called server-side.\n */\nexport function restoreBpmnHistory(\n diagramId: string,\n): CommandStackState<BpmnRFNode, BpmnRFEdge> | null {\n return restoreCommandHistory<BpmnRFNode, BpmnRFEdge>(`bpmn.history.${diagramId}`);\n}\n\n/**\n * Compute smart alignment guides for nodes being dragged on a BPMN canvas.\n * Excludes boundary events, lanes, and pools from guide sources.\n * When `poolId` is given, only considers nodes within that pool as static references.\n */\nexport function computeBpmnSmartGuides(\n movingNodes: BpmnRFNode[],\n state: BpmnDiagramState,\n poolId?: string,\n): SmartGuideResult {\n const movingIds = new Set(movingNodes.map((n) => n.id));\n const staticNodes = state.nodes.filter((n) => {\n if (movingIds.has(n.id)) return false;\n const et = n.data.elementType;\n if (et === \"BoundaryEvent\" || et === \"Lane\" || et === \"Pool\") return false;\n if (poolId) {\n const inPool =\n n.parentId === poolId ||\n (n.parentId !== undefined && getNode(state, n.parentId)?.parentId === poolId);\n if (!inPool) return false;\n }\n return true;\n });\n return computeSmartGuides(movingNodes, staticNodes);\n}\n\n/**\n * Create a command that groups selected BPMN nodes into a new SubProcess element.\n * Validates that every node can be contained by a SubProcess before executing.\n */\nexport function groupAsBpmnSubProcessCommand(\n options: GroupAsBpmnSubProcessOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.groupAsSubProcess.${options.groupId ?? options.nodeIds.join(\".\")}`,\n label: \"Group as SubProcess\",\n execute: (state) => {\n for (const nodeId of options.nodeIds) {\n const node = getNode(state, nodeId);\n if (!node) continue;\n const result = canContainBpmnElement(\"SubProcess\", node.data.elementType);\n if (result !== true) throw new Error(result);\n }\n const groupId = options.groupId ?? createUniqueId(\"subprocess\", state.nodes.map((n) => n.id));\n const groupNode = createBpmnNode({\n id: groupId,\n elementType: \"SubProcess\",\n position: { x: 0, y: 0 },\n ...(options.label !== undefined ? { label: options.label } : {}),\n ...(options.data !== undefined ? { data: options.data } : {}),\n });\n return groupNodes(state, {\n groupNode,\n nodeIds: options.nodeIds,\n padding: options.padding ?? 20,\n });\n },\n };\n}\n\n/**\n * Return node IDs in logical tab order for keyboard navigation.\n * When `poolId` is given, scopes the order to nodes within that pool and its lanes.\n */\nexport function getBpmnTabOrder(\n state: BpmnDiagramState,\n poolId?: string,\n): string[] {\n if (!poolId) return getNodeTabOrder(state);\n const pool = getNode(state, poolId);\n if (!pool) return [];\n const scopeIds = state.nodes\n .filter((n) => {\n if (n.id === poolId) return false;\n if (n.parentId === poolId) return true;\n const parent = getNode(state, n.parentId ?? \"\");\n return parent?.parentId === poolId;\n })\n .map((n) => n.id);\n return getNodeTabOrder(state, scopeIds);\n}\n\n/**\n * Compute the label layout (position + angle) for a BPMN edge.\n * Uses the edge's stored routing points when available; falls back to\n * the straight line between source and target centers.\n */\nexport function getBpmnEdgeLabelLayout(\n edgeId: string,\n state: BpmnDiagramState,\n options?: EdgeLabelOffsetOptions,\n): EdgeLabelLayout | null {\n const edge = state.edges.find((e) => e.id === edgeId);\n if (!edge) return null;\n const routingPoints = (edge.data?.routingPoints ?? []) as Array<{ x: number; y: number }>;\n if (routingPoints.length >= 2) {\n return getEdgeLabelLayout(routingPoints, options);\n }\n const sourceNode = getNode(state, edge.source);\n const targetNode = getNode(state, edge.target);\n if (!sourceNode || !targetNode) return null;\n const sourceAbsPos = getBpmnNodeAbsolutePosition(state, edge.source) ?? sourceNode.position;\n const targetAbsPos = getBpmnNodeAbsolutePosition(state, edge.target) ?? targetNode.position;\n const sourceCenter = getNodeCenterPosition(sourceAbsPos, getBpmnNodeSize(sourceNode));\n const targetCenter = getNodeCenterPosition(targetAbsPos, getBpmnNodeSize(targetNode));\n return getEdgeLabelLayout([sourceCenter, targetCenter], options);\n}\n\n/**\n * Create a command that resizes a BPMN element by dragging one of its 8 handles.\n * Boundary events attached to the resized element are automatically repositioned.\n *\n * @param options - Target element id, handle position, and pixel delta.\n * @returns Undoable command.\n */\nexport function resizeBpmnNodeByHandleCommand(\n options: ResizeBpmnNodeByHandleOptions,\n): DiagramCommand<BpmnRFNode, BpmnRFEdge> {\n return {\n id: `bpmn.resizeByHandle.${options.id}`,\n label: \"Resize BPMN element\",\n execute: (state) => {\n const node = getNode(state, options.id);\n if (!node) throw new Error(`Element \"${options.id}\" does not exist.`);\n const size = getBpmnElementSize(node.data.elementType);\n if (!size.resizable) {\n throw new Error(`${node.data.elementType} is not resizable in BPMN.`);\n }\n const oldW = node.width ?? size.width;\n const oldH = node.height ?? size.height;\n const resized = resizeNodeByHandle(state, {\n id: options.id,\n handle: options.handle,\n dx: options.dx,\n dy: options.dy,\n constraints: { minWidth: size.minWidth, minHeight: size.minHeight },\n });\n const updatedNode = getNode(resized, options.id);\n const newW = updatedNode?.width ?? oldW;\n const newH = updatedNode?.height ?? oldH;\n return clampBoundaryEventsAfterResize(resized, options.id, oldW, oldH, newW, newH);\n },\n };\n}\n\n/**\n * Create a layout cache for BPMN auto-layout calls.\n * Pass the returned cache to `withBpmnLayoutCache` to memoize identical topologies.\n */\nexport function createBpmnLayoutCache(options?: LayoutCacheOptions): LayoutCache {\n return createLayoutCache(options);\n}\n\n/**\n * Wrap an ELK-based layout function with BPMN topology caching so that diagrams\n * with unchanged node/edge structure are not re-laid-out unnecessarily.\n */\nexport function withBpmnLayoutCache(\n layoutFn: LayoutFn<BpmnRFNode, BpmnRFEdge>,\n cache?: LayoutCache,\n): LayoutFn<BpmnRFNode, BpmnRFEdge> {\n return withLayoutCache(layoutFn, cache ?? createLayoutCache());\n}\n","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 { 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","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"]}
|