@floegence/floe-webapp-core 0.86.10 → 0.86.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,48 +1,49 @@
1
- import { applyGraphPositions as b } from "./positions.js";
1
+ import { applyGraphPositions as G } from "./positions.js";
2
2
  import { computePackedGraphLayout as k } from "./packing.js";
3
- function $(a) {
4
- const o = /* @__PURE__ */ new Set(), c = (t) => {
5
- if (!t || o.has(t)) throw new Error(`Duplicate or empty graph ID: ${t}`);
6
- o.add(t);
7
- }, i = new Map(a.nodes.map((t) => [t.id, t]));
8
- for (const t of a.nodes) {
3
+ function $(d) {
4
+ const r = /* @__PURE__ */ new Set(), c = (t) => {
5
+ if (!t || r.has(t)) throw new Error(`Duplicate or empty graph ID: ${t}`);
6
+ r.add(t);
7
+ }, i = new Map(d.nodes.map((t) => [t.id, t]));
8
+ for (const t of d.nodes) {
9
9
  if (c(t.id), ![t.width, t.height].every((n) => Number.isFinite(n) && n > 0))
10
10
  throw new Error(`Invalid dimensions for graph node: ${t.id}`);
11
11
  for (const n of t.ports ?? []) c(n.id);
12
12
  const s = /* @__PURE__ */ new Set([t.id]);
13
- let r = t.parentId;
14
- for (; r !== void 0; ) {
15
- const n = i.get(r);
13
+ let o = t.parentId;
14
+ for (; o !== void 0; ) {
15
+ const n = i.get(o);
16
16
  if (!n || n.kind !== "group")
17
17
  throw new Error(`Invalid parent for graph node: ${t.id}`);
18
- if (s.has(r)) throw new Error(`Cyclic graph containment: ${t.id}`);
19
- s.add(r), r = n.parentId;
18
+ if (s.has(o)) throw new Error(`Cyclic graph containment: ${t.id}`);
19
+ s.add(o), o = n.parentId;
20
20
  }
21
21
  }
22
- for (const t of a.edges) {
22
+ for (const t of d.edges) {
23
23
  c(t.id);
24
- for (const [s, r] of [
24
+ for (const [s, o] of [
25
25
  [t.source, t.sourcePort],
26
26
  [t.target, t.targetPort]
27
27
  ]) {
28
28
  const n = i.get(s);
29
- if (!n || r !== void 0 && !n.ports?.some((h) => h.id === r))
29
+ if (!n || o !== void 0 && !n.ports?.some((h) => h.id === o))
30
30
  throw new Error(`Invalid endpoint for graph edge: ${t.id}`);
31
31
  }
32
32
  }
33
33
  }
34
- async function P(a, o, c) {
35
- $(a);
36
- const i = O(a, o);
37
- if (o.aspectRatio !== void 0 && (!Number.isFinite(o.aspectRatio) || o.aspectRatio <= 0))
34
+ async function P(d, r, c) {
35
+ if ($(d), r.edgeClearance !== void 0 && (!Number.isFinite(r.edgeClearance) || r.edgeClearance < 0))
36
+ throw new Error("Graph edge clearance must be finite and nonnegative");
37
+ const i = N(d, r);
38
+ if (r.aspectRatio !== void 0 && (!Number.isFinite(r.aspectRatio) || r.aspectRatio <= 0))
38
39
  throw new Error("Graph layout aspect ratio must be finite and positive");
39
- const t = o.groupPadding ?? { top: 64, right: 28, bottom: 28, left: 28 };
40
- if (![...Object.values(t), o.spacing ?? 64].every((e) => Number.isFinite(e) && e >= 0))
40
+ const t = r.groupPadding ?? { top: 64, right: 28, bottom: 28, left: 28 };
41
+ if (![...Object.values(t), r.spacing ?? 64].every((e) => Number.isFinite(e) && e >= 0))
41
42
  throw new Error("Graph layout spacing must be finite and nonnegative");
42
- if (o.layers && (M(a, o.layers), o.positionMode === "fixed" && o.positions?.length))
43
+ if (r.layers && (O(d, r.layers), r.positionMode === "fixed" && r.positions?.length))
43
44
  throw new Error("Fixed positions cannot be combined with graph layers");
44
- if (o.aspectRatio !== void 0 || o.layers)
45
- return k(i, o, c);
45
+ if (r.aspectRatio !== void 0 || r.layers)
46
+ return k(i, r, c);
46
47
  const s = /* @__PURE__ */ new Map();
47
48
  for (const e of i.nodes)
48
49
  s.set(e.id, {
@@ -50,29 +51,29 @@ async function P(a, o, c) {
50
51
  width: e.width,
51
52
  height: e.height,
52
53
  ...e.kind === "group" ? { children: [] } : {},
53
- ports: e.ports?.map((d) => ({
54
- id: d.id,
54
+ ports: e.ports?.map((a) => ({
55
+ id: a.id,
55
56
  width: 1,
56
57
  height: 1,
57
- layoutOptions: { "elk.port.side": d.side }
58
+ layoutOptions: { "elk.port.side": a.side }
58
59
  })),
59
60
  layoutOptions: {
60
61
  "elk.portConstraints": "FIXED_ORDER",
61
62
  "elk.padding": `[top=${t.top},left=${t.left},bottom=${t.bottom},right=${t.right}]`
62
63
  }
63
64
  });
64
- const r = [];
65
+ const o = [];
65
66
  for (const e of i.nodes)
66
- (e.parentId ? s.get(e.parentId).children : r).push(s.get(e.id));
67
+ (e.parentId ? s.get(e.parentId).children : o).push(s.get(e.id));
67
68
  const n = /* @__PURE__ */ new Set([
68
- ...i.nodes.flatMap((e) => [e.id, ...(e.ports ?? []).map((d) => d.id)]),
69
+ ...i.nodes.flatMap((e) => [e.id, ...(e.ports ?? []).map((a) => a.id)]),
69
70
  ...i.edges.map((e) => e.id)
70
71
  ]);
71
72
  let h = "$graph";
72
73
  for (; n.has(h); ) h += "$";
73
74
  const p = await c.layout({
74
75
  id: h,
75
- children: r,
76
+ children: o,
76
77
  edges: i.edges.map((e) => ({
77
78
  id: e.id,
78
79
  sources: [e.sourcePort ?? e.source],
@@ -80,20 +81,20 @@ async function P(a, o, c) {
80
81
  })),
81
82
  layoutOptions: {
82
83
  "elk.algorithm": "layered",
83
- "elk.direction": o.direction ?? "RIGHT",
84
+ "elk.direction": r.direction ?? "RIGHT",
84
85
  "elk.edgeRouting": "ORTHOGONAL",
85
86
  "elk.hierarchyHandling": "INCLUDE_CHILDREN",
86
- "elk.spacing.nodeNode": String(o.spacing ?? 64),
87
- "elk.layered.spacing.nodeNodeBetweenLayers": String(o.spacing ?? 64),
87
+ "elk.spacing.nodeNode": String(r.spacing ?? 64),
88
+ "elk.layered.spacing.nodeNodeBetweenLayers": String(r.spacing ?? 64),
88
89
  "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES",
89
90
  "elk.randomSeed": "1"
90
91
  }
91
- }), y = /* @__PURE__ */ new Map(), x = /* @__PURE__ */ new Map(), E = (e) => {
92
- for (const d of e.edges ?? []) {
93
- const g = d.container ?? e.id, f = y.get(g) ?? { x: 0, y: 0 };
94
- x.set(
95
- d.id,
96
- (d.sections ?? []).map(
92
+ }), y = /* @__PURE__ */ new Map(), E = /* @__PURE__ */ new Map(), x = (e) => {
93
+ for (const a of e.edges ?? []) {
94
+ const g = a.container ?? e.id, f = y.get(g) ?? { x: 0, y: 0 };
95
+ E.set(
96
+ a.id,
97
+ (a.sections ?? []).map(
97
98
  (l) => [l.startPoint, ...l.bendPoints ?? [], l.endPoint].map((m) => ({
98
99
  x: m.x + f.x,
99
100
  y: m.y + f.y
@@ -101,55 +102,55 @@ async function P(a, o, c) {
101
102
  )
102
103
  );
103
104
  }
104
- for (const d of e.children ?? []) E(d);
105
- }, v = (e, d, g) => {
106
- const f = d + (e.x ?? 0), l = g + (e.y ?? 0);
105
+ for (const a of e.children ?? []) x(a);
106
+ }, v = (e, a, g) => {
107
+ const f = a + (e.x ?? 0), l = g + (e.y ?? 0);
107
108
  y.set(e.id, { x: f, y: l, width: e.width ?? 0, height: e.height ?? 0 });
108
109
  for (const m of e.children ?? []) v(m, f, l);
109
110
  };
110
111
  for (const e of p.children ?? []) v(e, 0, 0);
111
- E(p);
112
- const w = (!o.positions?.length || o.positionMode === "compact") && o.anchor && y.get(o.anchor.nodeId), u = w ? o.anchor.position.x - w.x : 0, I = w ? o.anchor.position.y - w.y : 0, G = i.nodes.map((e) => {
113
- const d = y.get(e.id);
114
- return { ...e, ...d, x: d.x + u, y: d.y + I };
112
+ x(p);
113
+ const w = (!r.positions?.length || r.positionMode === "compact") && r.anchor && y.get(r.anchor.nodeId), u = w ? r.anchor.position.x - w.x : 0, I = w ? r.anchor.position.y - w.y : 0, b = i.nodes.map((e) => {
114
+ const a = y.get(e.id);
115
+ return { ...e, ...a, x: a.x + u, y: a.y + I };
115
116
  });
116
- return b(
117
+ return G(
117
118
  {
118
- nodes: G,
119
+ nodes: b,
119
120
  edges: i.edges.map((e) => ({
120
121
  ...e,
121
- sections: (x.get(e.id) ?? []).map(
122
- (d) => d.map((g) => ({ x: g.x + u, y: g.y + I }))
122
+ sections: (E.get(e.id) ?? []).map(
123
+ (a) => a.map((g) => ({ x: g.x + u, y: g.y + I }))
123
124
  )
124
125
  })),
125
126
  bounds: { x: u, y: I, width: p.width ?? 0, height: p.height ?? 0 }
126
127
  },
127
- o,
128
+ r,
128
129
  i.nodes
129
130
  );
130
131
  }
131
- function O(a, o) {
132
- if (o.positionMode !== "compact" || !o.positions?.length) return a;
133
- const c = o.direction ?? "RIGHT", i = new Map(
134
- o.positions.map((r) => [
135
- r.nodeId,
136
- c === "RIGHT" || c === "LEFT" ? r.y : r.x
132
+ function N(d, r) {
133
+ if (r.positionMode !== "compact" || !r.positions?.length) return d;
134
+ const c = r.direction ?? "RIGHT", i = new Map(
135
+ r.positions.map((o) => [
136
+ o.nodeId,
137
+ c === "RIGHT" || c === "LEFT" ? o.y : o.x
137
138
  ])
138
- ), t = new Map(a.nodes.map((r, n) => [r.id, n]));
139
- return { nodes: [...a.nodes].sort((r, n) => {
140
- const h = (r.parentId ?? "").localeCompare(n.parentId ?? ""), p = o.layers && !r.parentId && !n.parentId ? 0 : (i.get(r.id) ?? 1 / 0) - (i.get(n.id) ?? 1 / 0);
141
- return h || p || t.get(r.id) - t.get(n.id);
142
- }), edges: a.edges };
139
+ ), t = new Map(d.nodes.map((o, n) => [o.id, n]));
140
+ return { nodes: [...d.nodes].sort((o, n) => {
141
+ const h = (o.parentId ?? "").localeCompare(n.parentId ?? ""), p = r.layers && !o.parentId && !n.parentId ? 0 : (i.get(o.id) ?? 1 / 0) - (i.get(n.id) ?? 1 / 0);
142
+ return h || p || t.get(o.id) - t.get(n.id);
143
+ }), edges: d.edges };
143
144
  }
144
- function M(a, o) {
145
- const c = new Map(a.nodes.map((t) => [t.id, t])), i = /* @__PURE__ */ new Set();
146
- for (const [t, s] of o.entries()) {
145
+ function O(d, r) {
146
+ const c = new Map(d.nodes.map((t) => [t.id, t])), i = /* @__PURE__ */ new Set();
147
+ for (const [t, s] of r.entries()) {
147
148
  if (!s.length) throw new Error(`Graph layer must not be empty: ${t}`);
148
- for (const r of s) {
149
- const n = c.get(r);
150
- if (!n || n.parentId) throw new Error(`Graph layer object must be a root node: ${r}`);
151
- if (i.has(r)) throw new Error(`Graph object appears in multiple layers: ${r}`);
152
- i.add(r);
149
+ for (const o of s) {
150
+ const n = c.get(o);
151
+ if (!n || n.parentId) throw new Error(`Graph layer object must be a root node: ${o}`);
152
+ if (i.has(o)) throw new Error(`Graph object appears in multiple layers: ${o}`);
153
+ i.add(o);
153
154
  }
154
155
  }
155
156
  }
@@ -1,6 +1,6 @@
1
1
  import { applyGraphPositions as $ } from "./positions.js";
2
2
  import { routeGraphGeometry as P } from "./routing.js";
3
- async function j(f, i, S) {
3
+ async function j(f, s, S) {
4
4
  const y = new Map(f.nodes.map((e) => [e.id, { ...e, x: 0, y: 0 }])), O = new Map(f.nodes.map((e, d) => [e.id, d])), m = /* @__PURE__ */ new Map();
5
5
  for (const e of y.values()) {
6
6
  const d = m.get(e.parentId) ?? [];
@@ -12,22 +12,22 @@ async function j(f, i, S) {
12
12
  ]);
13
13
  let T = "$packed";
14
14
  for (; p.has(T); ) T += "$";
15
- const k = i.groupPadding ?? { top: 64, right: 28, bottom: 28, left: 28 }, E = i.direction ?? "RIGHT", w = new Map(
16
- (i.positions ?? []).map((e) => [
15
+ const k = s.groupPadding ?? { top: 64, right: 28, bottom: 28, left: 28 }, E = s.direction ?? "RIGHT", w = new Map(
16
+ (s.positions ?? []).map((e) => [
17
17
  e.nodeId,
18
18
  E === "RIGHT" || E === "LEFT" ? e.y : e.x
19
19
  ])
20
- ), I = (e, d, s) => {
21
- e.x += d, e.y += s;
22
- for (const v of m.get(e.id) ?? []) I(v, d, s);
20
+ ), I = (e, d, i) => {
21
+ e.x += d, e.y += i;
22
+ for (const v of m.get(e.id) ?? []) I(v, d, i);
23
23
  }, x = (e, d) => {
24
- let s = y.get(e);
25
- for (; s && s.parentId !== d; )
26
- s = s.parentId ? y.get(s.parentId) : void 0;
27
- return s;
24
+ let i = y.get(e);
25
+ for (; i && i.parentId !== d; )
26
+ i = i.parentId ? y.get(i.parentId) : void 0;
27
+ return i;
28
28
  }, G = async (e) => {
29
29
  const d = [...m.get(e) ?? []];
30
- (e !== void 0 || !i.layers) && d.sort(
30
+ (e !== void 0 || !s.layers) && d.sort(
31
31
  (o, a) => (w.get(o.id) ?? 1 / 0) - (w.get(a.id) ?? 1 / 0) || O.get(o.id) - O.get(a.id)
32
32
  );
33
33
  for (const o of d) {
@@ -36,28 +36,28 @@ async function j(f, i, S) {
36
36
  o.width = Math.max(o.width, a.width), o.height = Math.max(o.height, a.height);
37
37
  }
38
38
  if (!d.length) return { width: 0, height: 0 };
39
- if (e === void 0 && i.layers)
40
- return z(d, f, i, x, I);
41
- const s = /* @__PURE__ */ new Map();
39
+ if (e === void 0 && s.layers)
40
+ return z(d, f, s, x, I);
41
+ const i = /* @__PURE__ */ new Map();
42
42
  for (const o of f.edges) {
43
43
  const a = x(o.source, e), M = x(o.target, e);
44
44
  if (!a || !M || a.id === M.id) continue;
45
45
  const H = JSON.stringify([a.id, M.id]);
46
- s.has(H) || s.set(H, { id: o.id, sources: [a.id], targets: [M.id] });
46
+ i.has(H) || i.set(H, { id: o.id, sources: [a.id], targets: [M.id] });
47
47
  }
48
48
  const v = await S.layout({
49
49
  id: e ?? T,
50
50
  children: d.map((o) => ({ id: o.id, width: o.width, height: o.height })),
51
- edges: [...s.values()],
51
+ edges: [...i.values()],
52
52
  layoutOptions: {
53
- "elk.algorithm": s.size ? "layered" : "rectpacking",
53
+ "elk.algorithm": i.size ? "layered" : "rectpacking",
54
54
  "elk.direction": E,
55
55
  "elk.edgeRouting": "ORTHOGONAL",
56
56
  "elk.separateConnectedComponents": "true",
57
- ...i.aspectRatio !== void 0 ? { "elk.aspectRatio": String(i.aspectRatio) } : {},
58
- "elk.spacing.componentComponent": String(i.spacing ?? 64),
59
- "elk.spacing.nodeNode": String(i.spacing ?? 64),
60
- "elk.layered.spacing.nodeNodeBetweenLayers": String(i.spacing ?? 64),
57
+ ...s.aspectRatio !== void 0 ? { "elk.aspectRatio": String(s.aspectRatio) } : {},
58
+ "elk.spacing.componentComponent": String(s.spacing ?? 64),
59
+ "elk.spacing.nodeNode": String(s.spacing ?? 64),
60
+ "elk.layered.spacing.nodeNodeBetweenLayers": String(s.spacing ?? 64),
61
61
  "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES",
62
62
  "elk.padding": e ? `[top=${k.top},left=${k.left},bottom=${k.bottom},right=${k.right}]` : "[top=12,left=12,bottom=12,right=12]",
63
63
  "elk.randomSeed": "1"
@@ -68,23 +68,23 @@ async function j(f, i, S) {
68
68
  I(a, (o.x ?? 0) - a.x, (o.y ?? 0) - a.y);
69
69
  }
70
70
  return { width: v.width ?? 0, height: v.height ?? 0 };
71
- }, u = await G(), R = (!i.positions?.length || i.positionMode === "compact" || i.layers) && i.anchor && y.get(i.anchor.nodeId);
71
+ }, u = await G(), R = (!s.positions?.length || s.positionMode === "compact" || s.layers) && s.anchor && y.get(s.anchor.nodeId);
72
72
  if (R) {
73
- const e = i.anchor.position.x - R.x, d = i.anchor.position.y - R.y;
74
- for (const s of m.get(void 0) ?? []) I(s, e, d);
73
+ const e = s.anchor.position.x - R.x, d = s.anchor.position.y - R.y;
74
+ for (const i of m.get(void 0) ?? []) I(i, e, d);
75
75
  }
76
76
  const C = {
77
77
  nodes: [...y.values()],
78
78
  edges: f.edges.map((e) => ({ ...e, sections: [] })),
79
79
  bounds: { x: 0, y: 0, ...u }
80
80
  };
81
- return i.positions?.length && i.positionMode !== "compact" && !i.layers ? $(C, i, f.nodes) : P(C);
81
+ return s.positions?.length && s.positionMode !== "compact" && !s.layers ? $(C, s, f.nodes) : P(C, s);
82
82
  }
83
- function z(f, i, S, y, O) {
83
+ function z(f, s, S, y, O) {
84
84
  const m = S.direction ?? "RIGHT", p = m === "RIGHT" || m === "LEFT", T = m === "RIGHT" || m === "DOWN", k = new Map(f.map((t, n) => [t.id, n])), E = new Map(
85
85
  (S.positions ?? []).filter((t) => k.has(t.nodeId)).map((t) => [t.nodeId, p ? t.y : t.x])
86
86
  ), w = (t, n) => k.get(t) - k.get(n) || t.localeCompare(n), I = (t, n) => (E.get(t) ?? 1 / 0) - (E.get(n) ?? 1 / 0) || w(t, n), x = new Map(f.map((t) => [t.id, /* @__PURE__ */ new Set()]));
87
- for (const t of i.edges) {
87
+ for (const t of s.edges) {
88
88
  const n = y(t.source, void 0)?.id, r = y(t.target, void 0)?.id;
89
89
  n && r && n !== r && (x.get(n)?.add(r), x.get(r)?.add(n));
90
90
  }
@@ -118,25 +118,25 @@ function z(f, i, S, y, O) {
118
118
  r.has(l) || (r.set(l, r.get(h) + 1), u.set(l, u.get(h)), c.push(l));
119
119
  }
120
120
  }
121
- const d = Math.max(G.length, e), s = Array.from({ length: d }, () => []);
122
- for (const t of f) s[u.get(t.id)].push(t);
123
- for (const t of s) t.sort((n, r) => I(n.id, r.id));
121
+ const d = Math.max(G.length, e), i = Array.from({ length: d }, () => []);
122
+ for (const t of f) i[u.get(t.id)].push(t);
123
+ for (const t of i) t.sort((n, r) => I(n.id, r.id));
124
124
  const v = (t, n) => {
125
- const r = new Map(s[n].map((h, l) => [h.id, l])), c = new Map(s[t].map((h, l) => [h.id, l])), g = (h) => {
125
+ const r = new Map(i[n].map((h, l) => [h.id, l])), c = new Map(i[t].map((h, l) => [h.id, l])), g = (h) => {
126
126
  const l = [...x.get(h) ?? []].flatMap((N) => {
127
127
  const b = r.get(N);
128
128
  return u.get(N) === n && b !== void 0 ? [b] : [];
129
129
  });
130
130
  return l.length ? l.reduce((N, b) => N + b, 0) / l.length : c.get(h);
131
131
  };
132
- s[t].sort((h, l) => g(h.id) - g(l.id) || I(h.id, l.id));
132
+ i[t].sort((h, l) => g(h.id) - g(l.id) || I(h.id, l.id));
133
133
  };
134
- for (let t = 1; t < s.length; t++) v(t, t - 1);
135
- for (let t = s.length - 2; t >= 0; t--) v(t, t + 1);
134
+ for (let t = 1; t < i.length; t++) v(t, t - 1);
135
+ for (let t = i.length - 2; t >= 0; t--) v(t, t + 1);
136
136
  const o = S.spacing ?? 64;
137
137
  let a = 0, M = 0;
138
138
  const H = [], L = [];
139
- for (const t of s) {
139
+ for (const t of i) {
140
140
  let n = 0;
141
141
  const r = Math.max(0, ...t.map((c) => p ? c.width : c.height));
142
142
  H.push(a), L.push(r);
@@ -1,75 +1,76 @@
1
- import { routeGraphGeometry as G } from "./routing.js";
2
- function E(d, p, v) {
3
- if (!p.positions?.length || p.positionMode === "compact") return d;
4
- const f = new Map(d.nodes.map((t) => [t.id, { ...t }])), l = /* @__PURE__ */ new Map();
5
- for (const t of p.positions) {
6
- if (!f.has(t.nodeId) || l.has(t.nodeId) || !Number.isFinite(t.x) || !Number.isFinite(t.y))
1
+ import { routeGraphGeometry as v } from "./routing.js";
2
+ function C(l, x, G) {
3
+ if (!x.positions?.length || x.positionMode === "compact")
4
+ return x.edgeClearance === void 0 ? l : v(l, x);
5
+ const f = new Map(l.nodes.map((t) => [t.id, { ...t }])), M = /* @__PURE__ */ new Map();
6
+ for (const t of x.positions) {
7
+ if (!f.has(t.nodeId) || M.has(t.nodeId) || !Number.isFinite(t.x) || !Number.isFinite(t.y))
7
8
  throw new Error(`Invalid graph position: ${t.nodeId}`);
8
- l.set(t.nodeId, t);
9
+ M.set(t.nodeId, t);
9
10
  }
10
11
  const y = /* @__PURE__ */ new Map();
11
12
  for (const t of f.values())
12
13
  if (t.parentId) {
13
- const m = y.get(t.parentId) ?? [];
14
- m.push(t), y.set(t.parentId, m);
14
+ const c = y.get(t.parentId) ?? [];
15
+ c.push(t), y.set(t.parentId, c);
15
16
  }
16
- const x = p.groupPadding ?? { top: 64, left: 28, right: 28, bottom: 28 }, u = p.positionMode === "preferred", I = new Map(v.map((t) => [t.id, t])), b = (t, m, M) => {
17
- const g = { x: t.x, y: t.y }, c = l.get(t.id);
18
- t.x = c?.x ?? t.x + m, t.y = c?.y ?? t.y + M;
17
+ const m = x.groupPadding ?? { top: 64, left: 28, right: 28, bottom: 28 }, u = x.positionMode === "preferred", I = new Map(G.map((t) => [t.id, t])), b = (t, c, d) => {
18
+ const g = { x: t.x, y: t.y }, p = M.get(t.id);
19
+ t.x = p?.x ?? t.x + c, t.y = p?.y ?? t.y + d;
19
20
  const i = y.get(t.id) ?? [];
20
- for (const a of i) b(a, t.x - g.x, t.y - g.y);
21
+ for (const o of i) b(o, t.x - g.x, t.y - g.y);
21
22
  if (!i.length || u) return;
22
- const r = Math.min(...i.map((a) => a.x)) - x.left, h = Math.min(...i.map((a) => a.y)) - x.top;
23
- if (c && (r < t.x || h < t.y))
23
+ const a = Math.min(...i.map((o) => o.x)) - m.left, h = Math.min(...i.map((o) => o.y)) - m.top;
24
+ if (p && (a < t.x || h < t.y))
24
25
  throw new Error(`Pinned child lies outside group content: ${t.id}`);
25
- const s = Math.max(
26
+ const e = Math.max(
26
27
  t.x + t.width,
27
- ...i.map((a) => a.x + a.width + x.right)
28
+ ...i.map((o) => o.x + o.width + m.right)
28
29
  ), n = Math.max(
29
30
  t.y + t.height,
30
- ...i.map((a) => a.y + a.height + x.bottom)
31
+ ...i.map((o) => o.y + o.height + m.bottom)
31
32
  );
32
- c || (t.x = Math.min(t.x, r), t.y = Math.min(t.y, h)), t.width = s - t.x, t.height = n - t.y;
33
+ p || (t.x = Math.min(t.x, a), t.y = Math.min(t.y, h)), t.width = e - t.x, t.height = n - t.y;
33
34
  };
34
35
  for (const t of f.values()) t.parentId || b(t, 0, 0);
35
36
  if (u) {
36
- const t = Math.max(16, p.spacing ?? 64), m = (i, r, h) => {
37
- i.x += r, i.y += h;
38
- for (const s of y.get(i.id) ?? []) m(s, r, h);
39
- }, M = (i) => {
40
- const r = [];
37
+ const t = Math.max(16, x.spacing ?? 64), c = (i, a, h) => {
38
+ i.x += a, i.y += h;
39
+ for (const e of y.get(i.id) ?? []) c(e, a, h);
40
+ }, d = (i) => {
41
+ const a = [];
41
42
  for (const h of [...i].sort(
42
- (s, n) => s.y - n.y || s.x - n.x || s.id.localeCompare(n.id)
43
+ (e, n) => e.y - n.y || e.x - n.x || e.id.localeCompare(n.id)
43
44
  )) {
44
- const s = { x: h.x, y: h.y };
45
- for (const o of [...r].sort((e, w) => e.x - w.x))
46
- h.y < o.y + o.height + t && h.y + h.height + t > o.y && s.x < o.x + o.width + t && s.x + h.width + t > o.x && (s.x = o.x + o.width + t);
45
+ const e = { x: h.x, y: h.y };
46
+ for (const r of [...a].sort((s, w) => s.x - w.x))
47
+ h.y < r.y + r.height + t && h.y + h.height + t > r.y && e.x < r.x + r.width + t && e.x + h.width + t > r.x && (e.x = r.x + r.width + t);
47
48
  const n = { x: h.x, y: h.y };
48
- for (const o of [...r].sort((e, w) => e.y - w.y))
49
- h.x < o.x + o.width + t && h.x + h.width + t > o.x && n.y < o.y + o.height + t && n.y + h.height + t > o.y && (n.y = o.y + o.height + t);
50
- const a = s.x - h.x < n.y - h.y ? s : n;
51
- m(h, a.x - h.x, a.y - h.y), r.push(h);
49
+ for (const r of [...a].sort((s, w) => s.y - w.y))
50
+ h.x < r.x + r.width + t && h.x + h.width + t > r.x && n.y < r.y + r.height + t && n.y + h.height + t > r.y && (n.y = r.y + r.height + t);
51
+ const o = e.x - h.x < n.y - h.y ? e : n;
52
+ c(h, o.x - h.x, o.y - h.y), a.push(h);
52
53
  }
53
54
  }, g = (i) => {
54
- const r = y.get(i.id) ?? [];
55
- if (!r.length) return;
56
- for (const e of r) g(e);
57
- M(r);
58
- const h = Math.max(12, x.left), s = Math.max(12, x.top), n = Math.max(12, x.right), a = Math.max(12, x.bottom), o = l.get(i.id);
59
- i.x = Math.min(o?.x ?? 1 / 0, Math.min(...r.map((e) => e.x)) - h), i.y = Math.min(o?.y ?? 1 / 0, Math.min(...r.map((e) => e.y)) - s), i.width = Math.max(
55
+ const a = y.get(i.id) ?? [];
56
+ if (!a.length) return;
57
+ for (const s of a) g(s);
58
+ d(a);
59
+ const h = Math.max(12, m.left), e = Math.max(12, m.top), n = Math.max(12, m.right), o = Math.max(12, m.bottom), r = M.get(i.id);
60
+ i.x = Math.min(r?.x ?? 1 / 0, Math.min(...a.map((s) => s.x)) - h), i.y = Math.min(r?.y ?? 1 / 0, Math.min(...a.map((s) => s.y)) - e), i.width = Math.max(
60
61
  I.get(i.id).width,
61
- Math.max(...r.map((e) => e.x + e.width)) + n - i.x
62
+ Math.max(...a.map((s) => s.x + s.width)) + n - i.x
62
63
  ), i.height = Math.max(
63
64
  I.get(i.id).height,
64
- Math.max(...r.map((e) => e.y + e.height)) + a - i.y
65
+ Math.max(...a.map((s) => s.y + s.height)) + o - i.y
65
66
  );
66
- }, c = [...f.values()].filter((i) => !i.parentId);
67
- for (const i of c) g(i);
68
- M(c);
67
+ }, p = [...f.values()].filter((i) => !i.parentId);
68
+ for (const i of p) g(i);
69
+ d(p);
69
70
  }
70
- return G({ ...d, nodes: [...f.values()] });
71
+ return v({ ...l, nodes: [...f.values()] }, x);
71
72
  }
72
73
  export {
73
- E as applyGraphPositions,
74
- G as routeGraphGeometry
74
+ C as applyGraphPositions,
75
+ v as routeGraphGeometry
75
76
  };
@@ -1,3 +1,3 @@
1
- import type { GraphLayout } from './types';
1
+ import type { GraphLayout, GraphLayoutOptions } from './types';
2
2
  /** Joint orthogonal routing through the final rectangular geometry. */
3
- export declare function routeGraphGeometry(layout: GraphLayout): Promise<GraphLayout>;
3
+ export declare function routeGraphGeometry(layout: GraphLayout, options?: Pick<GraphLayoutOptions, 'edgeClearance'>): Promise<GraphLayout>;