@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.
- package/dist/components/graph/layout.js +72 -71
- package/dist/components/graph/packing.js +35 -35
- package/dist/components/graph/positions.js +47 -46
- package/dist/components/graph/routing.d.ts +2 -2
- package/dist/components/graph/routing.js +188 -185
- package/dist/components/graph/types.d.ts +2 -0
- package/dist/remote-input.d.ts +2 -0
- package/dist/remote-input.js +86 -71
- package/dist/remote-pointer.js +135 -127
- package/package.json +1 -1
|
@@ -1,274 +1,277 @@
|
|
|
1
|
-
import { AvoidLib as
|
|
2
|
-
import
|
|
3
|
-
let
|
|
4
|
-
const
|
|
5
|
-
async function
|
|
6
|
-
|
|
7
|
-
if (!
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { AvoidLib as J } from "../../node_modules/.pnpm/libavoid-js@0.5.0-beta.5/node_modules/libavoid-js/dist/index.js";
|
|
2
|
+
import Y from "../../node_modules/.pnpm/libavoid-js@0.5.0-beta.5/node_modules/libavoid-js/dist/libavoid.wasm.js";
|
|
3
|
+
let j;
|
|
4
|
+
const V = { NORTH: 1, SOUTH: 2, WEST: 4, EAST: 8 }, b = ["NORTH", "EAST", "SOUTH", "WEST"], E = (t) => t.delete();
|
|
5
|
+
async function I(t, c = {}) {
|
|
6
|
+
const p = c.edgeClearance ?? 4;
|
|
7
|
+
if (!Number.isFinite(p) || p < 0)
|
|
8
|
+
throw new Error("Graph edge clearance must be finite and nonnegative");
|
|
9
|
+
if (!t.nodes.length) return t;
|
|
10
|
+
if (!t.edges.length) return X(t);
|
|
11
|
+
await (j ??= J.load(Y).catch((o) => {
|
|
12
|
+
throw j = void 0, o;
|
|
10
13
|
}));
|
|
11
|
-
const s =
|
|
12
|
-
const
|
|
13
|
-
for (let i = r.get(
|
|
14
|
-
|
|
15
|
-
return
|
|
16
|
-
},
|
|
17
|
-
for (const
|
|
18
|
-
const
|
|
19
|
-
|
|
14
|
+
const s = J.getInstance(), r = new Map(t.nodes.map((o) => [o.id, o])), m = (o) => {
|
|
15
|
+
const e = [];
|
|
16
|
+
for (let i = r.get(o).parentId; i; i = r.get(i).parentId)
|
|
17
|
+
e.push(i);
|
|
18
|
+
return e;
|
|
19
|
+
}, d = /* @__PURE__ */ new Map();
|
|
20
|
+
for (const o of t.edges) {
|
|
21
|
+
const e = /* @__PURE__ */ new Set([...m(o.source), ...m(o.target)]), i = JSON.stringify([...e].sort()), u = d.get(i) ?? { open: e, edges: [] };
|
|
22
|
+
u.edges.push(o), d.set(i, u);
|
|
20
23
|
}
|
|
21
|
-
const
|
|
22
|
-
for (const { open:
|
|
24
|
+
const S = /* @__PURE__ */ new Map();
|
|
25
|
+
for (const { open: o, edges: e } of d.values()) {
|
|
23
26
|
const i = new s.Router(2);
|
|
24
27
|
try {
|
|
25
|
-
i.setRoutingParameter(s.RoutingParameter.shapeBufferDistance,
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
return
|
|
28
|
+
i.setRoutingParameter(s.RoutingParameter.shapeBufferDistance, p), i.setRoutingParameter(s.RoutingParameter.idealNudgingDistance, 8), i.setRoutingParameter(s.RoutingParameter.crossingPenalty, 80), i.setRoutingParameter(s.RoutingParameter.fixedSharedPathPenalty, 120), i.setRoutingParameter(s.RoutingParameter.portDirectionPenalty, 0), i.setRoutingOption(s.RoutingOption.nudgeOrthogonalSegmentsConnectedToShapes, !1), i.setRoutingOption(s.RoutingOption.nudgeSharedPathsWithCommonEndPoint, !0);
|
|
29
|
+
const u = new Map(
|
|
30
|
+
t.nodes.filter((n) => !o.has(n.id) && m(n.id).every((x) => o.has(x))).map((n) => {
|
|
31
|
+
const x = new s.Point(n.x, n.y), y = new s.Point(n.x + n.width, n.y + n.height), a = new s.Rectangle(x, y), h = new s.ShapeRef(i, a);
|
|
32
|
+
return E(x), E(y), E(a), [n.id, h];
|
|
30
33
|
})
|
|
31
|
-
),
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
const M =
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
), v = /* @__PURE__ */ new Map(), l = t.nodes.filter((n) => u.has(n.id)), G = /* @__PURE__ */ new Map();
|
|
35
|
+
e.forEach((n) => {
|
|
36
|
+
const x = r.get(n.source), y = r.get(n.target), a = z(x, y), h = n.sourcePort ? x.ports.find((T) => T.id === n.sourcePort).side : n.targetPort ? D(y.ports.find((T) => T.id === n.targetPort).side) : a.source, g = n.targetPort ? y.ports.find((T) => T.id === n.targetPort).side : n.sourcePort ? D(x.ports.find((T) => T.id === n.sourcePort).side) : a.target, f = [n.source, n.target].sort().join("\0"), w = G.get(f) ?? 0;
|
|
37
|
+
G.set(f, w + 1);
|
|
38
|
+
const M = w % 2 === 0 ? -6 : 6, R = n.source === n.target ? void 0 : _(
|
|
39
|
+
x,
|
|
40
|
+
y,
|
|
41
|
+
l,
|
|
39
42
|
a,
|
|
40
43
|
M,
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
n.sourcePort ? h : void 0,
|
|
45
|
+
n.targetPort ? g : void 0
|
|
43
46
|
);
|
|
44
|
-
|
|
47
|
+
v.set(n.id, {
|
|
45
48
|
sourceSide: R?.source ?? h,
|
|
46
|
-
targetSide: R?.target ??
|
|
49
|
+
targetSide: R?.target ?? g,
|
|
47
50
|
offset: M
|
|
48
51
|
});
|
|
49
52
|
});
|
|
50
|
-
let
|
|
51
|
-
const
|
|
52
|
-
for (const
|
|
53
|
-
const
|
|
54
|
-
if (!
|
|
55
|
-
const
|
|
53
|
+
let U = b.length + 2;
|
|
54
|
+
const O = /* @__PURE__ */ new Map(), P = (n, x) => Math.max(0, Math.min(1, n / x));
|
|
55
|
+
for (const n of t.nodes) {
|
|
56
|
+
const x = u.get(n.id);
|
|
57
|
+
if (!x) continue;
|
|
58
|
+
const y = (a, h, g, f, w) => {
|
|
56
59
|
const M = new s.ShapeConnectionPin(
|
|
57
|
-
|
|
60
|
+
x,
|
|
58
61
|
a,
|
|
59
|
-
|
|
60
|
-
|
|
62
|
+
P(h, n.width),
|
|
63
|
+
P(g, n.height),
|
|
61
64
|
!0,
|
|
62
65
|
0,
|
|
63
|
-
|
|
66
|
+
f
|
|
64
67
|
);
|
|
65
|
-
M.setExclusive(
|
|
66
|
-
|
|
68
|
+
M.setExclusive(w), M.setConnectionCost(
|
|
69
|
+
n.width / 2 + n.height / 2 - Math.abs(h - n.width / 2) - Math.abs(g - n.height / 2)
|
|
67
70
|
);
|
|
68
71
|
};
|
|
69
|
-
for (const a of new Set(
|
|
70
|
-
const { x: h, y:
|
|
71
|
-
|
|
72
|
+
for (const a of new Set(n.ports?.map((h) => h.side))) {
|
|
73
|
+
const { x: h, y: g } = W(n, a), f = b.indexOf(a) + 2;
|
|
74
|
+
y(f, h - n.x, g - n.y, V[a], !1), O.set(
|
|
72
75
|
JSON.stringify([
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
n.id,
|
|
77
|
+
P(h - n.x, n.width),
|
|
78
|
+
P(g - n.y, n.height),
|
|
76
79
|
a
|
|
77
80
|
]),
|
|
78
|
-
|
|
81
|
+
f
|
|
79
82
|
);
|
|
80
83
|
}
|
|
81
84
|
}
|
|
82
|
-
const
|
|
83
|
-
const h = r.get(
|
|
84
|
-
if (
|
|
85
|
+
const C = (n, x, y, a) => {
|
|
86
|
+
const h = r.get(n), g = u.get(n);
|
|
87
|
+
if (g && x)
|
|
85
88
|
return new s.ConnEnd(
|
|
86
|
-
|
|
87
|
-
|
|
89
|
+
g,
|
|
90
|
+
b.indexOf(h.ports.find((R) => R.id === x).side) + 2
|
|
88
91
|
);
|
|
89
|
-
if (
|
|
90
|
-
const R =
|
|
91
|
-
if (
|
|
92
|
-
const
|
|
93
|
-
return
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
if (g) {
|
|
93
|
+
const R = P(y.x - h.x, h.width), T = P(y.y - h.y, h.height), A = JSON.stringify([n, R, T, a]), F = O.get(A);
|
|
94
|
+
if (F !== void 0) return new s.ConnEnd(g, F);
|
|
95
|
+
const B = U++;
|
|
96
|
+
return O.set(A, B), new s.ShapeConnectionPin(
|
|
97
|
+
g,
|
|
98
|
+
B,
|
|
96
99
|
R,
|
|
97
|
-
|
|
100
|
+
T,
|
|
98
101
|
!0,
|
|
99
102
|
0,
|
|
100
|
-
|
|
101
|
-
).setExclusive(!1), new s.ConnEnd(
|
|
103
|
+
V[a]
|
|
104
|
+
).setExclusive(!1), new s.ConnEnd(g, B);
|
|
102
105
|
}
|
|
103
|
-
const
|
|
104
|
-
return
|
|
105
|
-
},
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
),
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
x:
|
|
116
|
-
y:
|
|
117
|
-
} :
|
|
118
|
-
|
|
119
|
-
),
|
|
120
|
-
if (
|
|
121
|
-
const
|
|
122
|
-
for (const R of [
|
|
123
|
-
const
|
|
124
|
-
M.push_back(
|
|
106
|
+
const f = x ? W(h, h.ports.find((R) => R.id === x).side) : y, w = new s.Point(f.x, f.y), M = new s.ConnEnd(w);
|
|
107
|
+
return E(w), M;
|
|
108
|
+
}, N = e.map((n) => {
|
|
109
|
+
const x = r.get(n.source), y = r.get(n.target), a = v.get(n.id), h = C(
|
|
110
|
+
n.source,
|
|
111
|
+
n.sourcePort,
|
|
112
|
+
n.source === n.target ? { x: x.x + x.width, y: x.y + x.height / 3 } : k(x, a.sourceSide, y, a.offset),
|
|
113
|
+
n.source === n.target ? "EAST" : a.sourceSide
|
|
114
|
+
), g = C(
|
|
115
|
+
n.target,
|
|
116
|
+
n.targetPort,
|
|
117
|
+
n.source === n.target ? {
|
|
118
|
+
x: y.x + y.width,
|
|
119
|
+
y: y.y + y.height * 2 / 3
|
|
120
|
+
} : k(y, a.targetSide, x, a.offset),
|
|
121
|
+
n.source === n.target ? "EAST" : a.targetSide
|
|
122
|
+
), f = new s.ConnRef(i, h, g);
|
|
123
|
+
if (E(h), E(g), n.source === n.target) {
|
|
124
|
+
const w = r.get(n.source), M = new s.CheckpointVector();
|
|
125
|
+
for (const R of [w.y + w.height / 3, w.y + w.height * 2 / 3]) {
|
|
126
|
+
const T = new s.Point(w.x + w.width + Math.max(24, p + 4), R), A = new s.Checkpoint(T);
|
|
127
|
+
M.push_back(A), E(T), E(A);
|
|
125
128
|
}
|
|
126
|
-
|
|
129
|
+
f.setRoutingCheckpoints(M), E(M);
|
|
127
130
|
}
|
|
128
|
-
return { edge:
|
|
131
|
+
return { edge: n, connection: f };
|
|
129
132
|
});
|
|
130
133
|
i.processTransaction();
|
|
131
|
-
for (const { edge:
|
|
132
|
-
const
|
|
133
|
-
const
|
|
134
|
-
return
|
|
134
|
+
for (const { edge: n, connection: x } of N) {
|
|
135
|
+
const y = x.displayRoute(), a = Array.from({ length: y.size() }, (h, g) => {
|
|
136
|
+
const f = y.at(g), w = { x: f.x, y: f.y };
|
|
137
|
+
return E(f), w;
|
|
135
138
|
});
|
|
136
|
-
if (
|
|
137
|
-
throw new Error(`Graph edge cannot be routed: ${
|
|
138
|
-
|
|
139
|
+
if (E(y), !x.hasValidRoute() || a.length < 2 || a.some((h) => !Number.isFinite(h.x) || !Number.isFinite(h.y)) || a.some((h, g) => g > 0 && h.x !== a[g - 1].x && h.y !== a[g - 1].y))
|
|
140
|
+
throw new Error(`Graph edge cannot be routed: ${n.id}`);
|
|
141
|
+
S.set(n.id, a);
|
|
139
142
|
}
|
|
140
143
|
} finally {
|
|
141
144
|
i.delete();
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
|
-
const
|
|
145
|
-
return
|
|
146
|
-
nodes:
|
|
147
|
-
edges:
|
|
148
|
-
bounds:
|
|
147
|
+
const H = t.edges.map((o) => ({ ...o, sections: [S.get(o.id)] }));
|
|
148
|
+
return X({
|
|
149
|
+
nodes: t.nodes,
|
|
150
|
+
edges: H,
|
|
151
|
+
bounds: t.bounds
|
|
149
152
|
});
|
|
150
153
|
}
|
|
151
|
-
function
|
|
152
|
-
const
|
|
153
|
-
...
|
|
154
|
-
{ x:
|
|
155
|
-
{ x:
|
|
154
|
+
function X(t) {
|
|
155
|
+
const c = [
|
|
156
|
+
...t.nodes.flatMap((r) => [
|
|
157
|
+
{ x: r.x, y: r.y },
|
|
158
|
+
{ x: r.x + r.width, y: r.y + r.height }
|
|
156
159
|
]),
|
|
157
|
-
...
|
|
158
|
-
],
|
|
160
|
+
...t.edges.flatMap((r) => r.sections.flat())
|
|
161
|
+
], p = Math.min(...c.map((r) => r.x)), s = Math.min(...c.map((r) => r.y));
|
|
159
162
|
return {
|
|
160
|
-
nodes:
|
|
161
|
-
edges:
|
|
163
|
+
nodes: t.nodes,
|
|
164
|
+
edges: t.edges,
|
|
162
165
|
bounds: {
|
|
163
|
-
x:
|
|
164
|
-
y:
|
|
165
|
-
width: Math.max(...
|
|
166
|
-
height: Math.max(...
|
|
166
|
+
x: p,
|
|
167
|
+
y: s,
|
|
168
|
+
width: Math.max(...c.map((r) => r.x)) - p,
|
|
169
|
+
height: Math.max(...c.map((r) => r.y)) - s
|
|
167
170
|
}
|
|
168
171
|
};
|
|
169
172
|
}
|
|
170
|
-
function
|
|
173
|
+
function W(t, c) {
|
|
171
174
|
return {
|
|
172
|
-
x:
|
|
173
|
-
y:
|
|
175
|
+
x: c === "WEST" ? t.x : c === "EAST" ? t.x + t.width : t.x + t.width / 2,
|
|
176
|
+
y: c === "NORTH" ? t.y : c === "SOUTH" ? t.y + t.height : t.y + t.height / 2
|
|
174
177
|
};
|
|
175
178
|
}
|
|
176
|
-
function
|
|
179
|
+
function D(t) {
|
|
177
180
|
return {
|
|
178
181
|
NORTH: "SOUTH",
|
|
179
182
|
EAST: "WEST",
|
|
180
183
|
SOUTH: "NORTH",
|
|
181
184
|
WEST: "EAST"
|
|
182
|
-
}[
|
|
185
|
+
}[t];
|
|
183
186
|
}
|
|
184
|
-
function
|
|
185
|
-
let
|
|
186
|
-
const
|
|
187
|
-
for (const
|
|
188
|
-
for (const e of
|
|
189
|
-
const
|
|
190
|
-
[
|
|
191
|
-
[
|
|
187
|
+
function _(t, c, p, s, r, m, d) {
|
|
188
|
+
let S;
|
|
189
|
+
const H = (o, e, i) => i === "NORTH" ? e.x === o.x && e.y < o.y : i === "SOUTH" ? e.x === o.x && e.y > o.y : i === "WEST" ? e.y === o.y && e.x < o.x : e.y === o.y && e.x > o.x;
|
|
190
|
+
for (const o of m ? [m] : b)
|
|
191
|
+
for (const e of d ? [d] : b) {
|
|
192
|
+
const i = m ? W(t, o) : k(t, o, c, r), u = d ? W(c, e) : k(c, e, t, r), v = i.x === u.x || i.y === u.y ? [[i, u]] : [
|
|
193
|
+
[i, { x: u.x, y: i.y }, u],
|
|
194
|
+
[i, { x: i.x, y: u.y }, u]
|
|
192
195
|
];
|
|
193
|
-
for (const l of
|
|
194
|
-
if (
|
|
195
|
-
const
|
|
196
|
-
return
|
|
197
|
-
(
|
|
196
|
+
for (const l of v) {
|
|
197
|
+
if (p.includes(t) && !H(i, l[1], o) || p.includes(c) && !H(u, l.at(-2), e) || l.slice(1).some((O, P) => {
|
|
198
|
+
const C = l[P];
|
|
199
|
+
return p.some(
|
|
200
|
+
(N) => Math.max(C.x, O.x) > N.x && Math.min(C.x, O.x) < N.x + N.width && Math.max(C.y, O.y) > N.y && Math.min(C.y, O.y) < N.y + N.height
|
|
198
201
|
);
|
|
199
202
|
}))
|
|
200
203
|
continue;
|
|
201
|
-
const
|
|
202
|
-
(
|
|
204
|
+
const U = l.slice(1).reduce(
|
|
205
|
+
(O, P, C) => O + Math.abs(P.x - l[C].x) + Math.abs(P.y - l[C].y),
|
|
203
206
|
0
|
|
204
|
-
) + (l.length - 2) * 32 + (
|
|
205
|
-
(!
|
|
207
|
+
) + (l.length - 2) * 32 + (o === s.source ? 0 : 16) + (e === s.target ? 0 : 16);
|
|
208
|
+
(!S || U < S.score) && (S = { source: o, target: e, score: U });
|
|
206
209
|
}
|
|
207
210
|
}
|
|
208
|
-
return
|
|
211
|
+
return S;
|
|
209
212
|
}
|
|
210
|
-
function
|
|
211
|
-
const
|
|
212
|
-
if (
|
|
213
|
-
const e =
|
|
214
|
-
NORTH: e.y -
|
|
215
|
-
EAST:
|
|
216
|
-
SOUTH:
|
|
217
|
-
WEST: e.x -
|
|
218
|
-
},
|
|
219
|
-
return { source:
|
|
213
|
+
function z(t, c) {
|
|
214
|
+
const p = (e, i) => i.x >= e.x && i.y >= e.y && i.x + i.width <= e.x + e.width && i.y + i.height <= e.y + e.height, s = p(t, c) ? t : p(c, t) ? c : void 0;
|
|
215
|
+
if (s) {
|
|
216
|
+
const e = s === t ? c : t, i = {
|
|
217
|
+
NORTH: e.y - s.y,
|
|
218
|
+
EAST: s.x + s.width - e.x - e.width,
|
|
219
|
+
SOUTH: s.y + s.height - e.y - e.height,
|
|
220
|
+
WEST: e.x - s.x
|
|
221
|
+
}, u = [...b].sort((v, l) => i[v] - i[l])[0];
|
|
222
|
+
return { source: u, target: u };
|
|
220
223
|
}
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
224
|
+
const r = c.x + c.width / 2 - (t.x + t.width / 2), m = c.y + c.height / 2 - (t.y + t.height / 2), d = Math.max(t.x - (c.x + c.width), c.x - (t.x + t.width), 0), S = Math.max(
|
|
225
|
+
t.y - (c.y + c.height),
|
|
226
|
+
c.y - (t.y + t.height),
|
|
224
227
|
0
|
|
225
|
-
),
|
|
226
|
-
return { source:
|
|
228
|
+
), o = (S === 0 && d > 0 ? !0 : d === 0 && S > 0 ? !1 : d === 0 && S === 0 ? Math.abs(r) >= Math.abs(m) : d <= S) ? r >= 0 ? "EAST" : "WEST" : m >= 0 ? "SOUTH" : "NORTH";
|
|
229
|
+
return { source: o, target: D(o) };
|
|
227
230
|
}
|
|
228
|
-
function
|
|
229
|
-
const
|
|
230
|
-
const
|
|
231
|
-
return
|
|
232
|
-
},
|
|
233
|
-
switch (
|
|
231
|
+
function k(t, c, p, s = 0) {
|
|
232
|
+
const r = (o) => Math.min(8, o / 4), m = (o, e, i) => Math.max(e + r(i), Math.min(e + i - r(i), o)), d = (o, e, i, u) => {
|
|
233
|
+
const v = Math.max(o, i), l = Math.min(o + e, i + u);
|
|
234
|
+
return v < l ? (v + l) / 2 + s : void 0;
|
|
235
|
+
}, S = p.x + p.width / 2, H = p.y + p.height / 2;
|
|
236
|
+
switch (c) {
|
|
234
237
|
case "NORTH":
|
|
235
238
|
return {
|
|
236
|
-
x:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
239
|
+
x: m(
|
|
240
|
+
d(t.x, t.width, p.x, p.width) ?? S + s,
|
|
241
|
+
t.x,
|
|
242
|
+
t.width
|
|
240
243
|
),
|
|
241
|
-
y:
|
|
244
|
+
y: t.y
|
|
242
245
|
};
|
|
243
246
|
case "EAST":
|
|
244
247
|
return {
|
|
245
|
-
x:
|
|
246
|
-
y:
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
x: t.x + t.width,
|
|
249
|
+
y: m(
|
|
250
|
+
d(t.y, t.height, p.y, p.height) ?? H + s,
|
|
251
|
+
t.y,
|
|
252
|
+
t.height
|
|
250
253
|
)
|
|
251
254
|
};
|
|
252
255
|
case "SOUTH":
|
|
253
256
|
return {
|
|
254
|
-
x:
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
257
|
+
x: m(
|
|
258
|
+
d(t.x, t.width, p.x, p.width) ?? S + s,
|
|
259
|
+
t.x,
|
|
260
|
+
t.width
|
|
258
261
|
),
|
|
259
|
-
y:
|
|
262
|
+
y: t.y + t.height
|
|
260
263
|
};
|
|
261
264
|
case "WEST":
|
|
262
265
|
return {
|
|
263
|
-
x:
|
|
264
|
-
y:
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
266
|
+
x: t.x,
|
|
267
|
+
y: m(
|
|
268
|
+
d(t.y, t.height, p.y, p.height) ?? H + s,
|
|
269
|
+
t.y,
|
|
270
|
+
t.height
|
|
268
271
|
)
|
|
269
272
|
};
|
|
270
273
|
}
|
|
271
274
|
}
|
|
272
275
|
export {
|
|
273
|
-
|
|
276
|
+
I as routeGraphGeometry
|
|
274
277
|
};
|
|
@@ -46,6 +46,8 @@ export interface GraphLayout {
|
|
|
46
46
|
bounds: GraphBounds;
|
|
47
47
|
}
|
|
48
48
|
export interface GraphLayoutOptions {
|
|
49
|
+
/** Clearance around routing obstacles in world units. Defaults to 4; never changes node geometry. */
|
|
50
|
+
edgeClearance?: number;
|
|
49
51
|
/** Desired width/height when packing disconnected objects, including group members. */
|
|
50
52
|
aspectRatio?: number;
|
|
51
53
|
/** Absolute world positions. Descendants move with their group. Invalid positions always fail. */
|
package/dist/remote-input.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface RemoteInputOptions<T> {
|
|
|
23
23
|
export interface RemoteInputController<T> {
|
|
24
24
|
readonly element: HTMLTextAreaElement;
|
|
25
25
|
bindTarget(target: T | null): void;
|
|
26
|
+
/** Physical preserves the host layout; text uses every local confirmed edit. */
|
|
27
|
+
setTextInputMode(mode: 'physical' | 'text'): void;
|
|
26
28
|
setAnchor(clientX: number, clientY: number): void;
|
|
27
29
|
focus(): void;
|
|
28
30
|
setKeyboardVisible(visible: boolean): void;
|