@aranzatech/diagrams-bpmn 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/{catalog-DNIyjHbl.d.ts → catalog-CYZHikuU.d.ts} +1 -1
  2. package/dist/{catalog-DG-sz0VM.d.cts → catalog-C_S9hyyn.d.cts} +1 -1
  3. package/dist/{chunk-CPFUQM6H.js → chunk-EMTO53AN.js} +54 -73
  4. package/dist/chunk-EMTO53AN.js.map +1 -0
  5. package/dist/chunk-G22XQD6H.js +64 -0
  6. package/dist/chunk-G22XQD6H.js.map +1 -0
  7. package/dist/{chunk-NYIYQUGX.js → chunk-OFOTX3LA.js} +124 -20
  8. package/dist/chunk-OFOTX3LA.js.map +1 -0
  9. package/dist/{chunk-YAYZW45I.js → chunk-SRUWPELT.js} +80 -3
  10. package/dist/chunk-SRUWPELT.js.map +1 -0
  11. package/dist/edges/index.cjs +75 -35
  12. package/dist/edges/index.cjs.map +1 -1
  13. package/dist/edges/index.js +2 -1
  14. package/dist/elements/index.d.cts +3 -3
  15. package/dist/elements/index.d.ts +3 -3
  16. package/dist/extensions/index.d.cts +2 -2
  17. package/dist/extensions/index.d.ts +2 -2
  18. package/dist/index.cjs +196 -53
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +4 -4
  21. package/dist/index.d.ts +4 -4
  22. package/dist/index.js +4 -3
  23. package/dist/index.js.map +1 -1
  24. package/dist/layout/index.cjs +1280 -889
  25. package/dist/layout/index.cjs.map +1 -1
  26. package/dist/layout/index.d.cts +4 -4
  27. package/dist/layout/index.d.ts +4 -4
  28. package/dist/layout/index.js +694 -106
  29. package/dist/layout/index.js.map +1 -1
  30. package/dist/modeling/index.cjs +78 -0
  31. package/dist/modeling/index.cjs.map +1 -1
  32. package/dist/modeling/index.d.cts +10 -5
  33. package/dist/modeling/index.d.ts +10 -5
  34. package/dist/modeling/index.js +1 -1
  35. package/dist/{types-nvF59RGF.d.cts → types--x9aoecw.d.cts} +5 -0
  36. package/dist/{types-nvF59RGF.d.ts → types--x9aoecw.d.ts} +5 -0
  37. package/dist/{types-dQUuSnV5.d.cts → types-CrFDTGo9.d.cts} +1 -1
  38. package/dist/{types-CuDL2YGL.d.ts → types-DoPv3m7u.d.ts} +2 -2
  39. package/dist/{types-X5FyP8oS.d.ts → types-DteJykQG.d.ts} +1 -1
  40. package/dist/{types-CDp9kWQ4.d.cts → types-YZ4sj3Ih.d.cts} +2 -2
  41. package/dist/validation/index.d.cts +3 -3
  42. package/dist/validation/index.d.ts +3 -3
  43. package/dist/xml/index.cjs +162 -18
  44. package/dist/xml/index.cjs.map +1 -1
  45. package/dist/xml/index.d.cts +4 -4
  46. package/dist/xml/index.d.ts +4 -4
  47. package/dist/xml/index.js +2 -1
  48. package/package.json +1 -1
  49. package/dist/chunk-CPFUQM6H.js.map +0 -1
  50. package/dist/chunk-FFWJA5BV.js +0 -163
  51. package/dist/chunk-FFWJA5BV.js.map +0 -1
  52. package/dist/chunk-NYIYQUGX.js.map +0 -1
  53. package/dist/chunk-YAYZW45I.js.map +0 -1
  54. package/dist/elk-QT7H4252.js +0 -6
  55. package/dist/elk-QT7H4252.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types-nvF59RGF.js';
1
+ import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types--x9aoecw.js';
2
2
 
3
3
  declare const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta>;
4
4
  declare function getElementMeta(type: BpmnElementType): BpmnElementMeta;
@@ -1,4 +1,4 @@
1
- import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types-nvF59RGF.cjs';
1
+ import { f as BpmnElementType, d as BpmnElementMeta, e as BpmnElementSize } from './types--x9aoecw.cjs';
2
2
 
3
3
  declare const BPMN_ELEMENT_CATALOG: Record<BpmnElementType, BpmnElementMeta>;
4
4
  declare function getElementMeta(type: BpmnElementType): BpmnElementMeta;
@@ -1,57 +1,11 @@
1
1
  import { BPMN_THEME } from './chunk-PDTXM32P.js';
2
+ import { getPreferredLabelAnchor, getDefaultFlowMarkerPath } from './chunk-G22XQD6H.js';
2
3
  import { useRef, useCallback } from 'react';
3
4
  import { useReactFlow, BaseEdge, EdgeLabelRenderer, getStraightPath } from '@xyflow/react';
4
5
  import { pointsToSvgPath, getOrthogonalPath } from '@aranzatech/diagrams-core/routing';
5
6
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
7
 
7
- // src/edges/path.ts
8
- function getPreferredLabelAnchor(points) {
9
- if (points.length === 0) return { x: 0, y: 0 };
10
- if (points.length === 1) return points[0];
11
- let bestIndex = 1;
12
- let bestLength = -1;
13
- for (let i = 1; i < points.length; i += 1) {
14
- const dx2 = points[i].x - points[i - 1].x;
15
- const dy2 = points[i].y - points[i - 1].y;
16
- const length = Math.hypot(dx2, dy2);
17
- if (length > bestLength) {
18
- bestLength = length;
19
- bestIndex = i;
20
- }
21
- }
22
- const from = points[bestIndex - 1];
23
- const to = points[bestIndex];
24
- const midpoint = {
25
- x: from.x + (to.x - from.x) / 2,
26
- y: from.y + (to.y - from.y) / 2
27
- };
28
- const dx = to.x - from.x;
29
- const dy = to.y - from.y;
30
- if (Math.abs(dx) >= Math.abs(dy)) {
31
- return { x: midpoint.x, y: midpoint.y - 12 };
32
- }
33
- return { x: midpoint.x + 12, y: midpoint.y };
34
- }
35
- function getSegmentAngle(points) {
36
- if (points.length < 2) return 0;
37
- const from = points[0];
38
- const to = points[1];
39
- return Math.atan2(to.y - from.y, to.x - from.x);
40
- }
41
- function getDefaultFlowMarkerPath(points) {
42
- if (points.length < 2) return null;
43
- const start = points[0];
44
- const angle = getSegmentAngle(points);
45
- const anchorX = start.x + Math.cos(angle) * 16;
46
- const anchorY = start.y + Math.sin(angle) * 16;
47
- const normalAngle = angle + Math.PI / 2;
48
- const half = 7;
49
- const x1 = anchorX + Math.cos(normalAngle) * half;
50
- const y1 = anchorY + Math.sin(normalAngle) * half;
51
- const x2 = anchorX - Math.cos(normalAngle) * half;
52
- const y2 = anchorY - Math.sin(normalAngle) * half;
53
- return `M ${x1} ${y1} L ${x2} ${y2}`;
54
- }
8
+ var BPMN_EDGE_LABEL_Z_INDEX = 1e3;
55
9
  function SequenceFlowEdge({
56
10
  id,
57
11
  sourceX,
@@ -74,7 +28,7 @@ function SequenceFlowEdge({
74
28
  const defaultMarkerPath = d?.isDefault ? getDefaultFlowMarkerPath(polyline) : null;
75
29
  const labelX = labelAnchor.x + (d?.labelOffsetX ?? 0);
76
30
  const labelY = labelAnchor.y + (d?.labelOffsetY ?? 0);
77
- const strokeColor = selected ? "#1a56db" : "#404040";
31
+ const strokeColor = d?.color?.stroke ?? (selected ? "#1a56db" : "#404040");
78
32
  const strokeWidth = selected ? 2.25 : 1.5;
79
33
  const haloWidth = selected ? 7 : 5;
80
34
  const { updateEdgeData, getViewport } = useReactFlow();
@@ -122,9 +76,9 @@ function SequenceFlowEdge({
122
76
  ...d?.conditionExpression ? { markerStart: "url(#bpmn-diamond-open)" } : {},
123
77
  markerEnd: markerEnd ?? "url(#bpmn-arrow)",
124
78
  style: {
79
+ ...style ?? {},
125
80
  stroke: strokeColor,
126
- strokeWidth,
127
- ...style ?? {}
81
+ strokeWidth
128
82
  }
129
83
  }
130
84
  ),
@@ -150,16 +104,17 @@ function SequenceFlowEdge({
150
104
  transform: `translate(-50%,-50%) translate(${labelX}px,${labelY}px)`,
151
105
  fontSize: 11,
152
106
  fontFamily: '"IBM Plex Sans", Inter, system-ui, sans-serif',
153
- background: "rgba(255,255,255,0.96)",
154
- color: "#1f2937",
107
+ background: d?.color?.fill ?? "rgba(255,255,255,0.96)",
108
+ color: strokeColor,
155
109
  padding: "2px 6px",
156
110
  borderRadius: 999,
157
- border: "1px solid rgba(148, 163, 184, 0.45)",
111
+ border: `1px solid ${d?.color?.stroke ?? "rgba(148, 163, 184, 0.45)"}`,
158
112
  boxShadow: "0 1px 2px rgba(15, 23, 42, 0.10)",
159
113
  pointerEvents: "all",
160
114
  cursor: "grab",
161
115
  userSelect: "none",
162
- whiteSpace: "nowrap"
116
+ whiteSpace: "nowrap",
117
+ zIndex: BPMN_EDGE_LABEL_Z_INDEX
163
118
  },
164
119
  className: "nodrag nopan",
165
120
  children: label ?? d?.label
@@ -167,6 +122,7 @@ function SequenceFlowEdge({
167
122
  ) })
168
123
  ] });
169
124
  }
125
+ var BPMN_EDGE_LABEL_Z_INDEX2 = 1e3;
170
126
  function MessageFlowEdge({
171
127
  id,
172
128
  sourceX,
@@ -186,7 +142,7 @@ function MessageFlowEdge({
186
142
  const polyline = points && points.length >= 2 ? [{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }] : [{ x: sourceX, y: sourceY }, { x: targetX, y: targetY }];
187
143
  const path = points && points.length >= 2 ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }]) : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);
188
144
  const labelAnchor = getPreferredLabelAnchor(polyline);
189
- const strokeColor = selected ? "#1a56db" : "#404040";
145
+ const strokeColor = d?.color?.stroke ?? (selected ? "#1a56db" : "#404040");
190
146
  const strokeWidth = selected ? 2.25 : 1.5;
191
147
  const haloWidth = selected ? 7 : 5;
192
148
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -209,10 +165,10 @@ function MessageFlowEdge({
209
165
  markerStart: "url(#bpmn-circle-open)",
210
166
  markerEnd: markerEnd ?? "url(#bpmn-arrow-open)",
211
167
  style: {
212
- stroke: strokeColor,
213
- strokeWidth,
214
168
  strokeDasharray: "6 3",
215
- ...style ?? {}
169
+ ...style ?? {},
170
+ stroke: strokeColor,
171
+ strokeWidth
216
172
  }
217
173
  }
218
174
  ),
@@ -224,14 +180,15 @@ function MessageFlowEdge({
224
180
  transform: `translate(-50%,-50%) translate(${labelAnchor.x}px,${labelAnchor.y}px)`,
225
181
  fontSize: 11,
226
182
  fontFamily: '"IBM Plex Sans", Inter, system-ui, sans-serif',
227
- background: "rgba(255,255,255,0.96)",
228
- color: "#1f2937",
183
+ background: d?.color?.fill ?? "rgba(255,255,255,0.96)",
184
+ color: strokeColor,
229
185
  padding: "2px 6px",
230
186
  borderRadius: 999,
231
- border: "1px solid rgba(148, 163, 184, 0.45)",
187
+ border: `1px solid ${d?.color?.stroke ?? "rgba(148, 163, 184, 0.45)"}`,
232
188
  boxShadow: "0 1px 2px rgba(15, 23, 42, 0.10)",
233
189
  pointerEvents: "all",
234
- whiteSpace: "nowrap"
190
+ whiteSpace: "nowrap",
191
+ zIndex: BPMN_EDGE_LABEL_Z_INDEX2
235
192
  },
236
193
  className: "nodrag nopan",
237
194
  children: label ?? d?.label
@@ -254,6 +211,7 @@ function AssociationEdge({
254
211
  const d = data;
255
212
  const points = d?.routingPoints;
256
213
  const direction = d?.associationDirection ?? "none";
214
+ const strokeColor = d?.color?.stroke ?? (selected ? "#1a56db" : "#888");
257
215
  const path = points && points.length >= 2 ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }]) : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);
258
216
  return /* @__PURE__ */ jsx(
259
217
  BaseEdge,
@@ -263,10 +221,10 @@ function AssociationEdge({
263
221
  ...direction === "both" ? { markerStart: "url(#bpmn-arrow-open)" } : {},
264
222
  ...direction === "one" || direction === "both" ? { markerEnd: "url(#bpmn-arrow-open)" } : {},
265
223
  style: {
266
- stroke: selected ? "#1a56db" : "#888",
224
+ ...style ?? {},
225
+ stroke: strokeColor,
267
226
  strokeWidth: 1,
268
- strokeDasharray: "3 3",
269
- ...style ?? {}
227
+ strokeDasharray: "3 3"
270
228
  }
271
229
  }
272
230
  );
@@ -285,6 +243,7 @@ function DataAssociationEdge({
285
243
  }) {
286
244
  const d = data;
287
245
  const points = d?.routingPoints;
246
+ const strokeColor = d?.color?.stroke ?? (selected ? "#1a56db" : "#888");
288
247
  const path = points && points.length >= 2 ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }]) : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);
289
248
  return /* @__PURE__ */ jsx(
290
249
  BaseEdge,
@@ -293,14 +252,15 @@ function DataAssociationEdge({
293
252
  path,
294
253
  markerEnd: "url(#bpmn-arrow-open)",
295
254
  style: {
296
- stroke: selected ? "#1a56db" : "#888",
255
+ ...style ?? {},
256
+ stroke: strokeColor,
297
257
  strokeWidth: 1,
298
- strokeDasharray: "3 3",
299
- ...style ?? {}
258
+ strokeDasharray: "3 3"
300
259
  }
301
260
  }
302
261
  );
303
262
  }
263
+ var BPMN_EDGE_LABEL_Z_INDEX3 = 1e3;
304
264
  function ConversationLinkEdge({
305
265
  sourceX,
306
266
  sourceY,
@@ -310,7 +270,7 @@ function ConversationLinkEdge({
310
270
  markerEnd
311
271
  }) {
312
272
  const d = data;
313
- const stroke = BPMN_THEME.stroke;
273
+ const stroke = d?.color?.stroke ?? BPMN_THEME.stroke;
314
274
  const [path] = getStraightPath({ sourceX, sourceY, targetX, targetY });
315
275
  return /* @__PURE__ */ jsxs("g", { children: [
316
276
  /* @__PURE__ */ jsx(
@@ -328,7 +288,28 @@ function ConversationLinkEdge({
328
288
  style: { stroke: "#ffffff", strokeWidth: 2, fill: "none" }
329
289
  }
330
290
  ),
331
- d?.label && /* @__PURE__ */ jsx("text", { fontSize: BPMN_THEME.fontSize, fontFamily: BPMN_THEME.fontFamily, fill: stroke, children: /* @__PURE__ */ jsx("textPath", { href: `#${path}`, startOffset: "50%", textAnchor: "middle", children: d.label }) })
291
+ d?.label && /* @__PURE__ */ jsx(EdgeLabelRenderer, { children: /* @__PURE__ */ jsx(
292
+ "div",
293
+ {
294
+ style: {
295
+ position: "absolute",
296
+ transform: `translate(-50%,-50%) translate(${(sourceX + targetX) / 2}px,${(sourceY + targetY) / 2}px)`,
297
+ fontSize: BPMN_THEME.fontSize,
298
+ fontFamily: BPMN_THEME.fontFamily,
299
+ background: d?.color?.fill ?? "rgba(255,255,255,0.96)",
300
+ color: stroke,
301
+ padding: "2px 6px",
302
+ borderRadius: 999,
303
+ border: `1px solid ${d?.color?.stroke ?? "rgba(148, 163, 184, 0.45)"}`,
304
+ boxShadow: "0 1px 2px rgba(15, 23, 42, 0.10)",
305
+ pointerEvents: "all",
306
+ whiteSpace: "nowrap",
307
+ zIndex: BPMN_EDGE_LABEL_Z_INDEX3
308
+ },
309
+ className: "nodrag nopan",
310
+ children: d.label
311
+ }
312
+ ) })
332
313
  ] });
333
314
  }
334
315
 
@@ -342,5 +323,5 @@ var BPMN_EDGE_TYPES = {
342
323
  };
343
324
 
344
325
  export { AssociationEdge, BPMN_EDGE_TYPES, ConversationLinkEdge, DataAssociationEdge, MessageFlowEdge, SequenceFlowEdge };
345
- //# sourceMappingURL=chunk-CPFUQM6H.js.map
346
- //# sourceMappingURL=chunk-CPFUQM6H.js.map
326
+ //# sourceMappingURL=chunk-EMTO53AN.js.map
327
+ //# sourceMappingURL=chunk-EMTO53AN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edges/SequenceFlowEdge.tsx","../src/edges/MessageFlowEdge.tsx","../src/edges/AssociationEdge.tsx","../src/edges/DataAssociationEdge.tsx","../src/edges/ConversationLinkEdge.tsx","../src/edges/edgeTypes.ts"],"names":["BPMN_EDGE_LABEL_Z_INDEX","pointsToSvgPath","getOrthogonalPath","jsxs","Fragment","jsx","BaseEdge","EdgeLabelRenderer"],"mappings":"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","file":"chunk-EMTO53AN.js","sourcesContent":["import { useCallback, useRef } from \"react\";\nimport { BaseEdge, EdgeLabelRenderer, useReactFlow, type EdgeProps } from \"@xyflow/react\";\nimport { getOrthogonalPath, pointsToSvgPath } from \"@aranzatech/diagrams-core/routing\";\nimport type { BpmnEdgeData } from \"../elements/types\";\nimport { getDefaultFlowMarkerPath, getPreferredLabelAnchor } from \"./path\";\n\nconst BPMN_EDGE_LABEL_Z_INDEX = 1000;\n\nexport function SequenceFlowEdge({\n id,\n sourceX, sourceY, targetX, targetY,\n sourcePosition, targetPosition,\n data, label, markerEnd, style, selected,\n}: EdgeProps) {\n const d = data as BpmnEdgeData | undefined;\n const points = d?.routingPoints;\n const polyline = points && points.length >= 2\n ? [{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }]\n : [{ x: sourceX, y: sourceY }, { x: targetX, y: targetY }];\n\n const path = points && points.length >= 2\n ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }])\n : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);\n\n const labelAnchor = getPreferredLabelAnchor(polyline);\n const defaultMarkerPath = d?.isDefault ? getDefaultFlowMarkerPath(polyline) : null;\n\n const labelX = labelAnchor.x + (d?.labelOffsetX ?? 0);\n const labelY = labelAnchor.y + (d?.labelOffsetY ?? 0);\n\n const strokeColor = d?.color?.stroke ?? (selected ? \"#1a56db\" : \"#404040\");\n const strokeWidth = selected ? 2.25 : 1.5;\n const haloWidth = selected ? 7 : 5;\n\n const { updateEdgeData, getViewport } = useReactFlow();\n const dragStartRef = useRef<{ mx: number; my: number; ox: number; oy: number } | null>(null);\n\n const handleLabelPointerDown = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n e.stopPropagation();\n e.currentTarget.setPointerCapture(e.pointerId);\n dragStartRef.current = {\n mx: e.clientX,\n my: e.clientY,\n ox: d?.labelOffsetX ?? 0,\n oy: d?.labelOffsetY ?? 0,\n };\n }, [d?.labelOffsetX, d?.labelOffsetY]);\n\n const handleLabelPointerMove = useCallback((e: React.PointerEvent<HTMLDivElement>) => {\n if (!dragStartRef.current) return;\n const { zoom } = getViewport();\n const dx = (e.clientX - dragStartRef.current.mx) / zoom;\n const dy = (e.clientY - dragStartRef.current.my) / zoom;\n updateEdgeData(id, {\n labelOffsetX: dragStartRef.current.ox + dx,\n labelOffsetY: dragStartRef.current.oy + dy,\n });\n }, [id, updateEdgeData, getViewport]);\n\n const handleLabelPointerUp = useCallback(() => {\n dragStartRef.current = null;\n }, []);\n\n return (\n <>\n <BaseEdge\n id={`${id}__halo`}\n path={path}\n style={{\n stroke: \"rgba(255,255,255,0.92)\",\n strokeWidth: haloWidth,\n }}\n />\n <BaseEdge\n id={id}\n path={path}\n {...(d?.conditionExpression ? { markerStart: \"url(#bpmn-diamond-open)\" } : {})}\n markerEnd={markerEnd ?? \"url(#bpmn-arrow)\"}\n style={{\n ...(style ?? {}),\n stroke: strokeColor,\n strokeWidth,\n }}\n />\n {defaultMarkerPath && (\n <path\n d={defaultMarkerPath}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n data-testid=\"bpmn-default-flow-marker\"\n />\n )}\n {(label ?? d?.label) && (\n <EdgeLabelRenderer>\n <div\n onPointerDown={handleLabelPointerDown}\n onPointerMove={handleLabelPointerMove}\n onPointerUp={handleLabelPointerUp}\n style={{\n position: \"absolute\",\n transform: `translate(-50%,-50%) translate(${labelX}px,${labelY}px)`,\n fontSize: 11,\n fontFamily: \"\\\"IBM Plex Sans\\\", Inter, system-ui, sans-serif\",\n background: d?.color?.fill ?? \"rgba(255,255,255,0.96)\",\n color: strokeColor,\n padding: \"2px 6px\",\n borderRadius: 999,\n border: `1px solid ${d?.color?.stroke ?? \"rgba(148, 163, 184, 0.45)\"}`,\n boxShadow: \"0 1px 2px rgba(15, 23, 42, 0.10)\",\n pointerEvents: \"all\",\n cursor: \"grab\",\n userSelect: \"none\",\n whiteSpace: \"nowrap\",\n zIndex: BPMN_EDGE_LABEL_Z_INDEX,\n }}\n className=\"nodrag nopan\"\n >\n {label ?? d?.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n}\n","import { BaseEdge, EdgeLabelRenderer, type EdgeProps } from \"@xyflow/react\";\nimport { getOrthogonalPath, pointsToSvgPath } from \"@aranzatech/diagrams-core/routing\";\nimport type { BpmnEdgeData } from \"../elements/types\";\nimport { getPreferredLabelAnchor } from \"./path\";\n\nconst BPMN_EDGE_LABEL_Z_INDEX = 1000;\n\nexport function MessageFlowEdge({\n id,\n sourceX, sourceY, targetX, targetY,\n sourcePosition, targetPosition,\n data, label, markerEnd, style, selected,\n}: EdgeProps) {\n const d = data as BpmnEdgeData | undefined;\n const points = d?.routingPoints;\n const polyline = points && points.length >= 2\n ? [{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }]\n : [{ x: sourceX, y: sourceY }, { x: targetX, y: targetY }];\n\n const path = points && points.length >= 2\n ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }])\n : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);\n\n const labelAnchor = getPreferredLabelAnchor(polyline);\n const strokeColor = d?.color?.stroke ?? (selected ? \"#1a56db\" : \"#404040\");\n const strokeWidth = selected ? 2.25 : 1.5;\n const haloWidth = selected ? 7 : 5;\n\n return (\n <>\n <BaseEdge\n id={`${id}__halo`}\n path={path}\n style={{\n stroke: \"rgba(255,255,255,0.92)\",\n strokeWidth: haloWidth,\n }}\n />\n <BaseEdge\n id={id}\n path={path}\n markerStart=\"url(#bpmn-circle-open)\"\n markerEnd={markerEnd ?? \"url(#bpmn-arrow-open)\"}\n style={{\n strokeDasharray: \"6 3\",\n ...(style ?? {}),\n stroke: strokeColor,\n strokeWidth,\n }}\n />\n {(label ?? d?.label) && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: \"absolute\",\n transform: `translate(-50%,-50%) translate(${labelAnchor.x}px,${labelAnchor.y}px)`,\n fontSize: 11,\n fontFamily: \"\\\"IBM Plex Sans\\\", Inter, system-ui, sans-serif\",\n background: d?.color?.fill ?? \"rgba(255,255,255,0.96)\",\n color: strokeColor,\n padding: \"2px 6px\",\n borderRadius: 999,\n border: `1px solid ${d?.color?.stroke ?? \"rgba(148, 163, 184, 0.45)\"}`,\n boxShadow: \"0 1px 2px rgba(15, 23, 42, 0.10)\",\n pointerEvents: \"all\",\n whiteSpace: \"nowrap\",\n zIndex: BPMN_EDGE_LABEL_Z_INDEX,\n }}\n className=\"nodrag nopan\"\n >\n {label ?? d?.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </>\n );\n}\n","import { BaseEdge, type EdgeProps } from \"@xyflow/react\";\nimport { getOrthogonalPath, pointsToSvgPath } from \"@aranzatech/diagrams-core/routing\";\nimport type { BpmnEdgeData } from \"../elements/types\";\n\nexport function AssociationEdge({\n id,\n sourceX, sourceY, targetX, targetY,\n sourcePosition, targetPosition,\n data, style, selected,\n}: EdgeProps) {\n const d = data as BpmnEdgeData | undefined;\n const points = d?.routingPoints;\n const direction = d?.associationDirection ?? \"none\";\n const strokeColor = d?.color?.stroke ?? (selected ? \"#1a56db\" : \"#888\");\n\n const path = points && points.length >= 2\n ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }])\n : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);\n\n return (\n <BaseEdge\n id={id}\n path={path}\n {...(direction === \"both\" ? { markerStart: \"url(#bpmn-arrow-open)\" } : {})}\n {...(direction === \"one\" || direction === \"both\" ? { markerEnd: \"url(#bpmn-arrow-open)\" } : {})}\n style={{\n ...(style ?? {}),\n stroke: strokeColor,\n strokeWidth: 1,\n strokeDasharray: \"3 3\",\n }}\n />\n );\n}\n","import { BaseEdge, type EdgeProps } from \"@xyflow/react\";\nimport { getOrthogonalPath, pointsToSvgPath } from \"@aranzatech/diagrams-core/routing\";\nimport type { BpmnEdgeData } from \"../elements/types\";\n\nexport function DataAssociationEdge({\n id,\n sourceX, sourceY, targetX, targetY,\n sourcePosition, targetPosition,\n data, style, selected,\n}: EdgeProps) {\n const d = data as BpmnEdgeData | undefined;\n const points = d?.routingPoints;\n const strokeColor = d?.color?.stroke ?? (selected ? \"#1a56db\" : \"#888\");\n\n const path = points && points.length >= 2\n ? pointsToSvgPath([{ x: sourceX, y: sourceY }, ...points.slice(1, -1), { x: targetX, y: targetY }])\n : getOrthogonalPath(sourceX, sourceY, targetX, targetY, sourcePosition, targetPosition);\n\n return (\n <BaseEdge\n id={id}\n path={path}\n markerEnd=\"url(#bpmn-arrow-open)\"\n style={{\n ...(style ?? {}),\n stroke: strokeColor,\n strokeWidth: 1,\n strokeDasharray: \"3 3\",\n }}\n />\n );\n}\n","import type { EdgeProps } from \"@xyflow/react\";\nimport { BaseEdge, EdgeLabelRenderer, getStraightPath } from \"@xyflow/react\";\nimport type { BpmnEdgeData } from \"../elements/types\";\nimport { BPMN_THEME } from \"../nodes/shared/theme\";\n\n// BPMN 2.0 §12.2 — ConversationLink is rendered as a double line.\n// Technique: draw the path twice — wide stroke then narrower background —\n// to produce a parallel-line effect without complex path offsets.\n\nconst BPMN_EDGE_LABEL_Z_INDEX = 1000;\n\nexport function ConversationLinkEdge({\n sourceX, sourceY, targetX, targetY,\n data, markerEnd,\n}: EdgeProps) {\n const d = data as BpmnEdgeData | undefined;\n const stroke = d?.color?.stroke ?? BPMN_THEME.stroke;\n\n const [path] = getStraightPath({ sourceX, sourceY, targetX, targetY });\n\n return (\n <g>\n {/* Outer (wide) stroke */}\n <BaseEdge\n path={path}\n {...(markerEnd ? { markerEnd } : {})}\n style={{ stroke, strokeWidth: 5, fill: \"none\" }}\n />\n {/* Inner white gap — creates double-line visual */}\n <BaseEdge\n path={path}\n style={{ stroke: \"#ffffff\", strokeWidth: 2, fill: \"none\" }}\n />\n {/* Label */}\n {d?.label && (\n <EdgeLabelRenderer>\n <div\n style={{\n position: \"absolute\",\n transform: `translate(-50%,-50%) translate(${(sourceX + targetX) / 2}px,${(sourceY + targetY) / 2}px)`,\n fontSize: BPMN_THEME.fontSize,\n fontFamily: BPMN_THEME.fontFamily,\n background: d?.color?.fill ?? \"rgba(255,255,255,0.96)\",\n color: stroke,\n padding: \"2px 6px\",\n borderRadius: 999,\n border: `1px solid ${d?.color?.stroke ?? \"rgba(148, 163, 184, 0.45)\"}`,\n boxShadow: \"0 1px 2px rgba(15, 23, 42, 0.10)\",\n pointerEvents: \"all\",\n whiteSpace: \"nowrap\",\n zIndex: BPMN_EDGE_LABEL_Z_INDEX,\n }}\n className=\"nodrag nopan\"\n >\n {d.label}\n </div>\n </EdgeLabelRenderer>\n )}\n </g>\n );\n}\n","import type { EdgeTypes } from \"@xyflow/react\";\nimport { SequenceFlowEdge } from \"./SequenceFlowEdge\";\nimport { MessageFlowEdge } from \"./MessageFlowEdge\";\nimport { AssociationEdge } from \"./AssociationEdge\";\nimport { DataAssociationEdge } from \"./DataAssociationEdge\";\nimport { ConversationLinkEdge } from \"./ConversationLinkEdge\";\n\n/** Pass this object to `DiagramCanvas` as `edgeTypes`. */\nexport const BPMN_EDGE_TYPES: EdgeTypes = {\n sequenceFlow: SequenceFlowEdge,\n messageFlow: MessageFlowEdge,\n association: AssociationEdge,\n dataAssociation: DataAssociationEdge,\n conversationLink: ConversationLinkEdge,\n};\n"]}
@@ -0,0 +1,64 @@
1
+ // src/edges/path.ts
2
+ var LABEL_MIN_SEGMENT = 40;
3
+ var LABEL_EXIT_DISTANCE = 28;
4
+ function getPreferredLabelAnchor(points) {
5
+ if (points.length === 0) return { x: 0, y: 0 };
6
+ if (points.length === 1) return points[0];
7
+ let bestIndex = -1;
8
+ for (let i = 1; i < points.length; i += 1) {
9
+ const length = Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);
10
+ if (length >= LABEL_MIN_SEGMENT) {
11
+ bestIndex = i;
12
+ break;
13
+ }
14
+ }
15
+ if (bestIndex === -1) {
16
+ let bestLength = -1;
17
+ bestIndex = 1;
18
+ for (let i = 1; i < points.length; i += 1) {
19
+ const length = Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);
20
+ if (length > bestLength) {
21
+ bestLength = length;
22
+ bestIndex = i;
23
+ }
24
+ }
25
+ }
26
+ const from = points[bestIndex - 1];
27
+ const to = points[bestIndex];
28
+ const segLength = Math.hypot(to.x - from.x, to.y - from.y);
29
+ const t = segLength > 0 ? Math.min(0.5, LABEL_EXIT_DISTANCE / segLength) : 0.5;
30
+ const anchor = {
31
+ x: from.x + (to.x - from.x) * t,
32
+ y: from.y + (to.y - from.y) * t
33
+ };
34
+ const dx = to.x - from.x;
35
+ const dy = to.y - from.y;
36
+ if (Math.abs(dx) >= Math.abs(dy)) {
37
+ return { x: anchor.x, y: anchor.y - 12 };
38
+ }
39
+ return { x: anchor.x + 12, y: anchor.y };
40
+ }
41
+ function getSegmentAngle(points) {
42
+ if (points.length < 2) return 0;
43
+ const from = points[0];
44
+ const to = points[1];
45
+ return Math.atan2(to.y - from.y, to.x - from.x);
46
+ }
47
+ function getDefaultFlowMarkerPath(points) {
48
+ if (points.length < 2) return null;
49
+ const start = points[0];
50
+ const angle = getSegmentAngle(points);
51
+ const anchorX = start.x + Math.cos(angle) * 16;
52
+ const anchorY = start.y + Math.sin(angle) * 16;
53
+ const normalAngle = angle + Math.PI / 2;
54
+ const half = 7;
55
+ const x1 = anchorX + Math.cos(normalAngle) * half;
56
+ const y1 = anchorY + Math.sin(normalAngle) * half;
57
+ const x2 = anchorX - Math.cos(normalAngle) * half;
58
+ const y2 = anchorY - Math.sin(normalAngle) * half;
59
+ return `M ${x1} ${y1} L ${x2} ${y2}`;
60
+ }
61
+
62
+ export { getDefaultFlowMarkerPath, getPreferredLabelAnchor };
63
+ //# sourceMappingURL=chunk-G22XQD6H.js.map
64
+ //# sourceMappingURL=chunk-G22XQD6H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/edges/path.ts"],"names":[],"mappings":"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","file":"chunk-G22XQD6H.js","sourcesContent":["import type { Position } from \"@xyflow/react\";\n\nexport interface EdgePoint {\n x: number;\n y: number;\n}\n\nexport interface EdgeLabelAnchor {\n x: number;\n y: number;\n}\n\nexport function getEdgePoints(\n sourceX: number,\n sourceY: number,\n targetX: number,\n targetY: number,\n routingPoints?: EdgePoint[],\n): EdgePoint[] {\n if (routingPoints && routingPoints.length >= 2) {\n return routingPoints;\n }\n\n return [\n { x: sourceX, y: sourceY },\n { x: targetX, y: targetY },\n ];\n}\n\nexport function getPolylineMidpoint(points: EdgePoint[]): EdgePoint {\n if (points.length === 0) return { x: 0, y: 0 };\n if (points.length === 1) return points[0];\n\n let total = 0;\n const lengths: number[] = [];\n\n for (let i = 1; i < points.length; i += 1) {\n const dx = points[i].x - points[i - 1].x;\n const dy = points[i].y - points[i - 1].y;\n const length = Math.hypot(dx, dy);\n lengths.push(length);\n total += length;\n }\n\n const halfway = total / 2;\n let traversed = 0;\n\n for (let i = 1; i < points.length; i += 1) {\n const length = lengths[i - 1];\n if (traversed + length >= halfway) {\n const ratio = length === 0 ? 0 : (halfway - traversed) / length;\n return {\n x: points[i - 1].x + (points[i].x - points[i - 1].x) * ratio,\n y: points[i - 1].y + (points[i].y - points[i - 1].y) * ratio,\n };\n }\n traversed += length;\n }\n\n return points[points.length - 1];\n}\n\n// BPMN convention (Camunda/Bizagi): a sequence-flow label (Sí/No) belongs at\n// the SOURCE exit — where the decision is read — not at the midpoint of the\n// longest segment, which on long routes leaves the label orphaned far from\n// its gateway.\nconst LABEL_MIN_SEGMENT = 40; // first segment long enough to host a label\nconst LABEL_EXIT_DISTANCE = 28; // px along the segment, measured from the exit\n\nexport function getPreferredLabelAnchor(points: EdgePoint[]): EdgeLabelAnchor {\n if (points.length === 0) return { x: 0, y: 0 };\n if (points.length === 1) return points[0];\n\n // Prefer the first segment (closest to the source) that can host a label;\n // fall back to the longest segment when every segment is tiny.\n let bestIndex = -1;\n for (let i = 1; i < points.length; i += 1) {\n const length = Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);\n if (length >= LABEL_MIN_SEGMENT) {\n bestIndex = i;\n break;\n }\n }\n\n if (bestIndex === -1) {\n let bestLength = -1;\n bestIndex = 1;\n for (let i = 1; i < points.length; i += 1) {\n const length = Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);\n if (length > bestLength) {\n bestLength = length;\n bestIndex = i;\n }\n }\n }\n\n const from = points[bestIndex - 1];\n const to = points[bestIndex];\n const segLength = Math.hypot(to.x - from.x, to.y - from.y);\n const t = segLength > 0 ? Math.min(0.5, LABEL_EXIT_DISTANCE / segLength) : 0.5;\n const anchor = {\n x: from.x + (to.x - from.x) * t,\n y: from.y + (to.y - from.y) * t,\n };\n\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n\n if (Math.abs(dx) >= Math.abs(dy)) {\n return { x: anchor.x, y: anchor.y - 12 };\n }\n\n return { x: anchor.x + 12, y: anchor.y };\n}\n\nexport function getSegmentAngle(points: EdgePoint[]): number {\n if (points.length < 2) return 0;\n const from = points[0];\n const to = points[1];\n return Math.atan2(to.y - from.y, to.x - from.x);\n}\n\nexport function getDefaultFlowMarkerPath(points: EdgePoint[]): string | null {\n if (points.length < 2) return null;\n\n const start = points[0];\n const angle = getSegmentAngle(points);\n const anchorX = start.x + Math.cos(angle) * 16;\n const anchorY = start.y + Math.sin(angle) * 16;\n const normalAngle = angle + Math.PI / 2;\n const half = 7;\n\n const x1 = anchorX + Math.cos(normalAngle) * half;\n const y1 = anchorY + Math.sin(normalAngle) * half;\n const x2 = anchorX - Math.cos(normalAngle) * half;\n const y2 = anchorY - Math.sin(normalAngle) * half;\n\n return `M ${x1} ${y1} L ${x2} ${y2}`;\n}\n\nexport function fallbackAssociationDirection(\n sourcePosition?: Position,\n targetPosition?: Position,\n): \"horizontal\" | \"vertical\" {\n if (sourcePosition === \"left\" || sourcePosition === \"right\" || targetPosition === \"left\" || targetPosition === \"right\") {\n return \"horizontal\";\n }\n\n return \"vertical\";\n}\n"]}
@@ -1,3 +1,4 @@
1
+ import { getPreferredLabelAnchor } from './chunk-G22XQD6H.js';
1
2
  import { ARANZA_DESCRIPTOR, getBpmnMessageFlowExecutionExtensions, getBpmnTaskExecutionExtensions } from './chunk-TB6V4S5N.js';
2
3
  import { BPMN_ELEMENT_CATALOG } from './chunk-L5Z22RLX.js';
3
4
 
@@ -653,10 +654,21 @@ async function parseBpmnXml(xml) {
653
654
  warnings,
654
655
  autoX: { value: 50 }
655
656
  };
657
+ const participantProcessIds = /* @__PURE__ */ new Set();
658
+ for (const rootEl of asElements(rootElement.rootElements)) {
659
+ if (rootEl.$type !== "bpmn:Collaboration") continue;
660
+ for (const participant of asElements(rootEl.participants)) {
661
+ const processRef = participant.processRef;
662
+ const processId = processRef ? asString(processRef.id) : void 0;
663
+ if (processId) participantProcessIds.add(processId);
664
+ }
665
+ }
656
666
  for (const rootEl of asElements(rootElement.rootElements)) {
657
667
  if (rootEl.$type === "bpmn:Collaboration") {
658
668
  handleCollaboration(rootEl, ctx, nodes, edges);
659
669
  } else if (rootEl.$type === "bpmn:Process") {
670
+ const processId = asString(rootEl.id);
671
+ if (processId && participantProcessIds.has(processId)) continue;
660
672
  const laneMembership = extractLaneMembership(rootEl);
661
673
  const laneSets = asLaneSets(rootEl.laneSets);
662
674
  if (laneSets.length > 0) {
@@ -1306,6 +1318,24 @@ function buildEdgeElement(moddle, edge, nodeById) {
1306
1318
  }
1307
1319
  return moddle.create(moddleType, attrs);
1308
1320
  }
1321
+ var DI_EXTERNAL_LABEL_TYPES = /* @__PURE__ */ new Set([
1322
+ "ExclusiveGateway",
1323
+ "InclusiveGateway",
1324
+ "ParallelGateway",
1325
+ "EventBasedGateway",
1326
+ "ComplexGateway",
1327
+ "StartEvent",
1328
+ "EndEvent",
1329
+ "IntermediateCatchEvent",
1330
+ "IntermediateThrowEvent",
1331
+ "BoundaryEvent"
1332
+ ]);
1333
+ var DI_LABEL_CHAR_W = 6.5;
1334
+ var DI_LABEL_MAX_W = 150;
1335
+ var DI_LABEL_H = 14;
1336
+ function diLabelWidth(label) {
1337
+ return Math.min(Math.ceil(label.length * DI_LABEL_CHAR_W), DI_LABEL_MAX_W);
1338
+ }
1309
1339
  function buildBpmnDI(moddle, definitions, nodes, edges) {
1310
1340
  const shapes = [];
1311
1341
  const edgeShapes = [];
@@ -1328,19 +1358,47 @@ function buildBpmnDI(moddle, definitions, nodes, edges) {
1328
1358
  if (node.data.isExpanded !== void 0) {
1329
1359
  shape.isExpanded = node.data.isExpanded;
1330
1360
  }
1361
+ const nodeLabel = typeof node.data.label === "string" ? node.data.label : "";
1362
+ if (nodeLabel && DI_EXTERNAL_LABEL_TYPES.has(node.data.elementType)) {
1363
+ const absPos = absolutePositionById.get(node.id) ?? node.position;
1364
+ const labelW = diLabelWidth(nodeLabel);
1365
+ shape.label = moddle.create("bpmndi:BPMNLabel", {
1366
+ bounds: moddle.create("dc:Bounds", {
1367
+ x: absPos.x + w / 2 - labelW / 2,
1368
+ y: absPos.y + h + 4,
1369
+ width: labelW,
1370
+ height: DI_LABEL_H
1371
+ })
1372
+ });
1373
+ }
1331
1374
  shapes.push(shape);
1332
1375
  }
1333
1376
  for (const edge of edges) {
1334
- const waypoints = resolveEdgeWaypoints(edge, nodes, absolutePositionById).map(
1377
+ const waypointPts = resolveEdgeWaypoints(edge, nodes, absolutePositionById);
1378
+ const waypoints = waypointPts.map(
1335
1379
  (p) => moddle.create("dc:Point", { x: p.x, y: p.y })
1336
1380
  );
1337
- edgeShapes.push(
1338
- moddle.create("bpmndi:BPMNEdge", {
1339
- id: uid("BPMNEdge", edge.id),
1340
- bpmnElement: { id: edge.id },
1341
- waypoint: waypoints
1342
- })
1343
- );
1381
+ const bpmnEdge = moddle.create("bpmndi:BPMNEdge", {
1382
+ id: uid("BPMNEdge", edge.id),
1383
+ bpmnElement: { id: edge.id },
1384
+ waypoint: waypoints
1385
+ });
1386
+ const edgeLabel = typeof edge.data?.label === "string" ? edge.data.label : "";
1387
+ if (edgeLabel && waypointPts.length >= 2) {
1388
+ const anchor = getPreferredLabelAnchor(waypointPts);
1389
+ const offsetX = typeof edge.data?.labelOffsetX === "number" ? edge.data.labelOffsetX : 0;
1390
+ const offsetY = typeof edge.data?.labelOffsetY === "number" ? edge.data.labelOffsetY : 0;
1391
+ const labelW = diLabelWidth(edgeLabel);
1392
+ bpmnEdge.label = moddle.create("bpmndi:BPMNLabel", {
1393
+ bounds: moddle.create("dc:Bounds", {
1394
+ x: anchor.x + offsetX - labelW / 2,
1395
+ y: anchor.y + offsetY - DI_LABEL_H / 2,
1396
+ width: labelW,
1397
+ height: DI_LABEL_H
1398
+ })
1399
+ });
1400
+ }
1401
+ edgeShapes.push(bpmnEdge);
1344
1402
  }
1345
1403
  const rootEls = definitions.rootElements;
1346
1404
  const planeElement = rootEls?.find((element) => element.$type === "bpmn:Collaboration") ?? rootEls?.find((element) => element.$type === "bpmn:Process") ?? rootEls?.[0];
@@ -1364,17 +1422,63 @@ function resolveEdgeWaypoints(edge, nodes, absolutePositionById) {
1364
1422
  if (!source || !target) return [];
1365
1423
  const sourceMeta = BPMN_ELEMENT_CATALOG[source.data.elementType];
1366
1424
  const targetMeta = BPMN_ELEMENT_CATALOG[target.data.elementType];
1367
- const sourcePosition = absolutePositionById.get(source.id) ?? source.position;
1368
- const targetPosition = absolutePositionById.get(target.id) ?? target.position;
1425
+ const sPos = absolutePositionById.get(source.id) ?? source.position;
1426
+ const tPos = absolutePositionById.get(target.id) ?? target.position;
1427
+ const sW = source.width ?? sourceMeta.defaultWidth;
1428
+ const sH = source.height ?? sourceMeta.defaultHeight;
1429
+ const tW = target.width ?? targetMeta.defaultWidth;
1430
+ const tH = target.height ?? targetMeta.defaultHeight;
1431
+ const sCX = sPos.x + sW / 2;
1432
+ const sCY = sPos.y + sH / 2;
1433
+ const tCX = tPos.x + tW / 2;
1434
+ const tCY = tPos.y + tH / 2;
1435
+ if (Math.abs(sCY - tCY) <= 1) {
1436
+ if (tPos.x >= sPos.x + sW) return [{ x: sPos.x + sW, y: sCY }, { x: tPos.x, y: sCY }];
1437
+ if (sPos.x >= tPos.x + tW) return [{ x: sPos.x, y: sCY }, { x: tPos.x + tW, y: sCY }];
1438
+ }
1439
+ if (Math.abs(sCX - tCX) <= 1) {
1440
+ if (tPos.y >= sPos.y + sH) return [{ x: sCX, y: sPos.y + sH }, { x: sCX, y: tPos.y }];
1441
+ if (sPos.y >= tPos.y + tH) return [{ x: sCX, y: sPos.y }, { x: sCX, y: tPos.y + tH }];
1442
+ }
1443
+ if (tPos.x >= sPos.x + sW) {
1444
+ const midX = (sPos.x + sW + tPos.x) / 2;
1445
+ return [
1446
+ { x: sPos.x + sW, y: sCY },
1447
+ { x: midX, y: sCY },
1448
+ { x: midX, y: tCY },
1449
+ { x: tPos.x, y: tCY }
1450
+ ];
1451
+ }
1452
+ if (sPos.x >= tPos.x + tW) {
1453
+ const midX = (tPos.x + tW + sPos.x) / 2;
1454
+ return [
1455
+ { x: sPos.x, y: sCY },
1456
+ { x: midX, y: sCY },
1457
+ { x: midX, y: tCY },
1458
+ { x: tPos.x + tW, y: tCY }
1459
+ ];
1460
+ }
1461
+ if (tPos.y >= sPos.y + sH) {
1462
+ const midY = (sPos.y + sH + tPos.y) / 2;
1463
+ return [
1464
+ { x: sCX, y: sPos.y + sH },
1465
+ { x: sCX, y: midY },
1466
+ { x: tCX, y: midY },
1467
+ { x: tCX, y: tPos.y }
1468
+ ];
1469
+ }
1470
+ if (sPos.y >= tPos.y + tH) {
1471
+ const midY = (tPos.y + tH + sPos.y) / 2;
1472
+ return [
1473
+ { x: sCX, y: sPos.y },
1474
+ { x: sCX, y: midY },
1475
+ { x: tCX, y: midY },
1476
+ { x: tCX, y: tPos.y + tH }
1477
+ ];
1478
+ }
1369
1479
  return [
1370
- {
1371
- x: sourcePosition.x + (source.width ?? sourceMeta.defaultWidth) / 2,
1372
- y: sourcePosition.y + (source.height ?? sourceMeta.defaultHeight) / 2
1373
- },
1374
- {
1375
- x: targetPosition.x + (target.width ?? targetMeta.defaultWidth) / 2,
1376
- y: targetPosition.y + (target.height ?? targetMeta.defaultHeight) / 2
1377
- }
1480
+ { x: sCX, y: sCY },
1481
+ { x: tCX, y: tCY }
1378
1482
  ];
1379
1483
  }
1380
1484
  function buildAbsolutePositionMap(nodes) {
@@ -1525,5 +1629,5 @@ async function serializeBpmnXml(nodes, edges, opts = {}) {
1525
1629
  }
1526
1630
 
1527
1631
  export { parseBpmnXml, serializeBpmnXml };
1528
- //# sourceMappingURL=chunk-NYIYQUGX.js.map
1529
- //# sourceMappingURL=chunk-NYIYQUGX.js.map
1632
+ //# sourceMappingURL=chunk-OFOTX3LA.js.map
1633
+ //# sourceMappingURL=chunk-OFOTX3LA.js.map