@floegence/floe-webapp-core 0.86.15 → 0.86.18

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@floegence/floe-webapp-core",
3
- "version": "0.86.15",
3
+ "version": "0.86.18",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -139,17 +139,23 @@
139
139
  "types": "./dist/graph.d.ts",
140
140
  "import": "./dist/graph.js"
141
141
  },
142
- "./graph.css": "./dist/graph.css"
142
+ "./graph.css": "./dist/graph.css",
143
+ "./graph-assets": {
144
+ "types": "./scripts/graph-assets.d.mts",
145
+ "import": "./scripts/graph-assets.mjs"
146
+ }
143
147
  },
144
148
  "files": [
145
149
  "dist",
146
150
  "scripts/pdf-assets.mjs",
147
- "scripts/pdf-assets.d.mts"
151
+ "scripts/pdf-assets.d.mts",
152
+ "scripts/graph-assets.mjs",
153
+ "scripts/graph-assets.d.mts"
148
154
  ],
149
155
  "scripts": {
150
156
  "dev": "node ./scripts/dev.mjs",
151
157
  "build": "pnpm clean && pnpm build:shell-theme-css && vite build && tsc -p tsconfig.build.json && pnpm build:styles && pnpm build:assets",
152
- "build:assets": "node ./scripts/copy-style-assets.mjs && node ./scripts/build-pdf-styles.mjs",
158
+ "build:assets": "node ./scripts/normalize-graph-worker-urls.mjs && node ./scripts/copy-style-assets.mjs && node ./scripts/build-pdf-styles.mjs",
153
159
  "build:shell-theme-css": "node ./scripts/generate-shell-theme-css.mjs",
154
160
  "build:styles": "vite build -c vite.styles.config.ts",
155
161
  "typecheck": "tsc --noEmit",
@@ -0,0 +1,7 @@
1
+ /** Vite build plugin for offline file-origin hosts. Requires local file read
2
+ * access and CSP blob: permissions for scripts, workers, and connections. */
3
+ export declare function graphBlobWorkersPlugin(): {
4
+ name: string;
5
+ apply: 'build';
6
+ transform(this: { emitFile(asset: {type: 'asset'; fileName: string; source: Uint8Array}): string }, code: string, id: string): string | undefined;
7
+ };
@@ -0,0 +1,64 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { URL } from 'node:url';
3
+
4
+ /** Vite build adapter for offline file-origin hosts. Layout and ELK remain
5
+ * unchanged published modules; the raw LGPL WASM stays independently replaceable.
6
+ * The host must grant local read access and allow blob workers/scripts/connects.
7
+ */
8
+ export function graphBlobWorkersPlugin() {
9
+ const root = new URL('../dist/', import.meta.url);
10
+ const engine = readFileSync(new URL('components/graph/engine.js', root), 'utf8');
11
+ const entry = /new URL\("(\.\.\/\.\.\/assets\/[^"\n]+)", import\.meta\.url\)/.exec(engine)?.[1];
12
+ if (!entry) throw new Error('Unsupported graph layout worker entry');
13
+ const layoutURL = new URL(entry, new URL('components/graph/', root));
14
+ let layout = readFileSync(layoutURL, 'utf8');
15
+ const child = /new URL\("([^"\n]*elk-worker[^"\n]+)", import\.meta\.url\)/.exec(layout)?.[1];
16
+ if (!child) throw new Error('Unsupported graph ELK worker entry');
17
+ const elk = readFileSync(new URL(child, layoutURL), 'utf8');
18
+ // Every package-owned resource URL is substituted by a local blob URL.
19
+ layout = layout.replaceAll(`new URL("${child}", import.meta.url)`, 'new URL(__floeElkURL)');
20
+ layout = layout.replaceAll(/new URL\("[^"\n]*libavoid\.wasm(?:\?no-inline)?", import\.meta\.url\)/g, 'new URL(__floeWasmURL)');
21
+ const bootstrap = `
22
+ const queue = [];
23
+ self.onmessage = async ({data}) => {
24
+ if (!data.__floeGraphWasm) { queue.push(data); return; }
25
+ const __floeWasmURL = URL.createObjectURL(new Blob([data.__floeGraphWasm], {type:'application/wasm'}));
26
+ const __floeElkURL = URL.createObjectURL(new Blob([${JSON.stringify(elk)}], {type:'text/javascript'}));
27
+ const source = 'const __floeElkURL=' + JSON.stringify(__floeElkURL) + ',__floeWasmURL=' + JSON.stringify(__floeWasmURL) + ';\\n' + ${JSON.stringify(layout)};
28
+ try { await import(URL.createObjectURL(new Blob([source], {type:'text/javascript'}))); }
29
+ catch (error) { setTimeout(() => { throw error; }); return; }
30
+ for (const data of queue) self.onmessage({data});
31
+ queue.length = 0;
32
+ };
33
+ `;
34
+ return {
35
+ name: 'floe-graph-blob-workers',
36
+ apply: 'build',
37
+ transform(code, id) {
38
+ if (!id.endsWith('/components/graph/engine.js')) return;
39
+ const expression = /new Worker\(new URL\([\s\S]*?\), \{ type: "module" \}\)/;
40
+ if (!expression.test(code)) throw new Error('Unsupported graph layout worker factory');
41
+ const asset = this.emitFile({ type: 'asset', fileName: 'assets/libavoid.wasm', source: readFileSync(new URL('libavoid.wasm', root)) });
42
+ const factory = `(() => {
43
+ const url = URL.createObjectURL(new Blob([${JSON.stringify(bootstrap)}], {type:'text/javascript'}));
44
+ const worker = new Worker(url, {type:'module'});
45
+ URL.revokeObjectURL(url);
46
+ const request = new XMLHttpRequest();
47
+ request.open('GET', import.meta.ROLLUP_FILE_URL_${asset});
48
+ request.responseType = 'arraybuffer';
49
+ const fail = () => worker.dispatchEvent(new ErrorEvent('error', {message:'Unable to read graph routing WASM'}));
50
+ request.onload = () => {
51
+ if ((request.status === 0 || request.status === 200) && request.response?.byteLength) {
52
+ worker.postMessage({__floeGraphWasm:request.response}, [request.response]);
53
+ } else fail();
54
+ };
55
+ request.onerror = fail;
56
+ request.send();
57
+ const terminate = worker.terminate.bind(worker);
58
+ worker.terminate = () => { request.abort(); terminate(); };
59
+ return worker;
60
+ })()`;
61
+ return code.replace(expression, () => factory);
62
+ },
63
+ };
64
+ }
@@ -1,6 +0,0 @@
1
- function r(o) {
2
- throw new Error('Could not dynamically require "' + o + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
3
- }
4
- export {
5
- r as commonjsRequire
6
- };
@@ -1,6 +0,0 @@
1
- function e(t) {
2
- return t && t.__esModule && Object.prototype.hasOwnProperty.call(t, "default") ? t.default : t;
3
- }
4
- export {
5
- e as getDefaultExportFromCjs
6
- };
@@ -1,7 +0,0 @@
1
- import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.js";
2
- import { __require as e } from "../node_modules/.pnpm/elkjs@0.12.0/node_modules/elkjs/lib/elk-api.js";
3
- var o = e();
4
- const i = /* @__PURE__ */ r(o);
5
- export {
6
- i as default
7
- };
@@ -1,4 +0,0 @@
1
- var e = { exports: {} };
2
- export {
3
- e as __module
4
- };
@@ -1,160 +0,0 @@
1
- import { applyGraphPositions as G } from "./positions.js";
2
- import { computePackedGraphLayout as k } from "./packing.js";
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
- if (c(t.id), ![t.width, t.height].every((n) => Number.isFinite(n) && n > 0))
10
- throw new Error(`Invalid dimensions for graph node: ${t.id}`);
11
- for (const n of t.ports ?? []) c(n.id);
12
- const s = /* @__PURE__ */ new Set([t.id]);
13
- let o = t.parentId;
14
- for (; o !== void 0; ) {
15
- const n = i.get(o);
16
- if (!n || n.kind !== "group")
17
- throw new Error(`Invalid parent for graph node: ${t.id}`);
18
- if (s.has(o)) throw new Error(`Cyclic graph containment: ${t.id}`);
19
- s.add(o), o = n.parentId;
20
- }
21
- }
22
- for (const t of d.edges) {
23
- c(t.id);
24
- for (const [s, o] of [
25
- [t.source, t.sourcePort],
26
- [t.target, t.targetPort]
27
- ]) {
28
- const n = i.get(s);
29
- if (!n || o !== void 0 && !n.ports?.some((h) => h.id === o))
30
- throw new Error(`Invalid endpoint for graph edge: ${t.id}`);
31
- }
32
- }
33
- }
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))
39
- throw new Error("Graph layout aspect ratio must be finite and positive");
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))
42
- throw new Error("Graph layout spacing must be finite and nonnegative");
43
- if (r.layers && (O(d, r.layers), r.positionMode === "fixed" && r.positions?.length))
44
- throw new Error("Fixed positions cannot be combined with graph layers");
45
- if (r.aspectRatio !== void 0 || r.layers)
46
- return k(i, r, c);
47
- const s = /* @__PURE__ */ new Map();
48
- for (const e of i.nodes)
49
- s.set(e.id, {
50
- id: e.id,
51
- width: e.width,
52
- height: e.height,
53
- ...e.kind === "group" ? { children: [] } : {},
54
- ports: e.ports?.map((a) => ({
55
- id: a.id,
56
- width: 1,
57
- height: 1,
58
- layoutOptions: { "elk.port.side": a.side }
59
- })),
60
- layoutOptions: {
61
- "elk.portConstraints": "FIXED_ORDER",
62
- "elk.padding": `[top=${t.top},left=${t.left},bottom=${t.bottom},right=${t.right}]`
63
- }
64
- });
65
- const o = [];
66
- for (const e of i.nodes)
67
- (e.parentId ? s.get(e.parentId).children : o).push(s.get(e.id));
68
- const n = /* @__PURE__ */ new Set([
69
- ...i.nodes.flatMap((e) => [e.id, ...(e.ports ?? []).map((a) => a.id)]),
70
- ...i.edges.map((e) => e.id)
71
- ]);
72
- let h = "$graph";
73
- for (; n.has(h); ) h += "$";
74
- const p = await c.layout({
75
- id: h,
76
- children: o,
77
- edges: i.edges.map((e) => ({
78
- id: e.id,
79
- sources: [e.sourcePort ?? e.source],
80
- targets: [e.targetPort ?? e.target]
81
- })),
82
- layoutOptions: {
83
- "elk.algorithm": "layered",
84
- "elk.direction": r.direction ?? "RIGHT",
85
- "elk.edgeRouting": "ORTHOGONAL",
86
- "elk.hierarchyHandling": "INCLUDE_CHILDREN",
87
- "elk.spacing.nodeNode": String(r.spacing ?? 64),
88
- "elk.layered.spacing.nodeNodeBetweenLayers": String(r.spacing ?? 64),
89
- "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES",
90
- "elk.randomSeed": "1"
91
- }
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(
98
- (l) => [l.startPoint, ...l.bendPoints ?? [], l.endPoint].map((m) => ({
99
- x: m.x + f.x,
100
- y: m.y + f.y
101
- }))
102
- )
103
- );
104
- }
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);
108
- y.set(e.id, { x: f, y: l, width: e.width ?? 0, height: e.height ?? 0 });
109
- for (const m of e.children ?? []) v(m, f, l);
110
- };
111
- for (const e of p.children ?? []) v(e, 0, 0);
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 };
116
- });
117
- return G(
118
- {
119
- nodes: b,
120
- edges: i.edges.map((e) => ({
121
- ...e,
122
- sections: (E.get(e.id) ?? []).map(
123
- (a) => a.map((g) => ({ x: g.x + u, y: g.y + I }))
124
- )
125
- })),
126
- bounds: { x: u, y: I, width: p.width ?? 0, height: p.height ?? 0 }
127
- },
128
- r,
129
- i.nodes
130
- );
131
- }
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
138
- ])
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 };
144
- }
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()) {
148
- if (!s.length) throw new Error(`Graph layer must not be empty: ${t}`);
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);
154
- }
155
- }
156
- }
157
- export {
158
- P as computeGraphLayout,
159
- $ as validateGraphInput
160
- };
@@ -1,158 +0,0 @@
1
- import { applyGraphPositions as $ } from "./positions.js";
2
- import { routeGraphGeometry as P } from "./routing.js";
3
- async function j(f, s, S) {
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
- for (const e of y.values()) {
6
- const d = m.get(e.parentId) ?? [];
7
- d.push(e), m.set(e.parentId, d);
8
- }
9
- const p = /* @__PURE__ */ new Set([
10
- ...f.nodes.flatMap((e) => [e.id, ...(e.ports ?? []).map((d) => d.id)]),
11
- ...f.edges.map((e) => e.id)
12
- ]);
13
- let T = "$packed";
14
- for (; p.has(T); ) T += "$";
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
- e.nodeId,
18
- E === "RIGHT" || E === "LEFT" ? e.y : e.x
19
- ])
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
- }, x = (e, d) => {
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
- }, G = async (e) => {
29
- const d = [...m.get(e) ?? []];
30
- (e !== void 0 || !s.layers) && d.sort(
31
- (o, a) => (w.get(o.id) ?? 1 / 0) - (w.get(a.id) ?? 1 / 0) || O.get(o.id) - O.get(a.id)
32
- );
33
- for (const o of d) {
34
- if (!m.has(o.id)) continue;
35
- const a = await G(o.id);
36
- o.width = Math.max(o.width, a.width), o.height = Math.max(o.height, a.height);
37
- }
38
- if (!d.length) return { width: 0, height: 0 };
39
- if (e === void 0 && s.layers)
40
- return z(d, f, s, x, I);
41
- const i = /* @__PURE__ */ new Map();
42
- for (const o of f.edges) {
43
- const a = x(o.source, e), M = x(o.target, e);
44
- if (!a || !M || a.id === M.id) continue;
45
- const H = JSON.stringify([a.id, M.id]);
46
- i.has(H) || i.set(H, { id: o.id, sources: [a.id], targets: [M.id] });
47
- }
48
- const v = await S.layout({
49
- id: e ?? T,
50
- children: d.map((o) => ({ id: o.id, width: o.width, height: o.height })),
51
- edges: [...i.values()],
52
- layoutOptions: {
53
- "elk.algorithm": i.size ? "layered" : "rectpacking",
54
- "elk.direction": E,
55
- "elk.edgeRouting": "ORTHOGONAL",
56
- "elk.separateConnectedComponents": "true",
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
- "elk.layered.considerModelOrder.strategy": "NODES_AND_EDGES",
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
- "elk.randomSeed": "1"
64
- }
65
- });
66
- for (const o of v.children ?? []) {
67
- const a = y.get(o.id);
68
- I(a, (o.x ?? 0) - a.x, (o.y ?? 0) - a.y);
69
- }
70
- return { width: v.width ?? 0, height: v.height ?? 0 };
71
- }, u = await G(), R = (!s.positions?.length || s.positionMode === "compact" || s.layers) && s.anchor && y.get(s.anchor.nodeId);
72
- if (R) {
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
- }
76
- const C = {
77
- nodes: [...y.values()],
78
- edges: f.edges.map((e) => ({ ...e, sections: [] })),
79
- bounds: { x: 0, y: 0, ...u }
80
- };
81
- return s.positions?.length && s.positionMode !== "compact" && !s.layers ? $(C, s, f.nodes) : P(C, s);
82
- }
83
- function z(f, s, S, y, O) {
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
- (S.positions ?? []).filter((t) => k.has(t.nodeId)).map((t) => [t.nodeId, p ? t.y : t.x])
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 s.edges) {
88
- const n = y(t.source, void 0)?.id, r = y(t.target, void 0)?.id;
89
- n && r && n !== r && (x.get(n)?.add(r), x.get(r)?.add(n));
90
- }
91
- const G = S.layers ?? [], u = /* @__PURE__ */ new Map();
92
- G.forEach((t, n) => t.forEach((r) => u.set(r, n)));
93
- const R = new Set(f.map((t) => t.id)), C = [];
94
- for (const t of [...R].sort(w)) {
95
- if (!R.has(t)) continue;
96
- const n = [], r = [t];
97
- R.delete(t);
98
- for (let c = 0; c < r.length; c++) {
99
- const g = r[c];
100
- n.push(g);
101
- for (const h of [...x.get(g)].sort(w))
102
- R.delete(h) && r.push(h);
103
- }
104
- C.push(n);
105
- }
106
- let e = G.length;
107
- for (const t of C) {
108
- const n = t.filter((g) => u.has(g));
109
- if (!n.length) {
110
- t.sort(w).forEach((g) => u.set(g, e)), e++;
111
- continue;
112
- }
113
- const r = /* @__PURE__ */ new Map(), c = [...n].sort((g, h) => u.get(g) - u.get(h) || w(g, h));
114
- for (const g of c) r.set(g, 0);
115
- for (let g = 0; g < c.length; g++) {
116
- const h = c[g];
117
- for (const l of [...x.get(h)].sort(w))
118
- r.has(l) || (r.set(l, r.get(h) + 1), u.set(l, u.get(h)), c.push(l));
119
- }
120
- }
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
- const v = (t, n) => {
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
- const l = [...x.get(h) ?? []].flatMap((N) => {
127
- const b = r.get(N);
128
- return u.get(N) === n && b !== void 0 ? [b] : [];
129
- });
130
- return l.length ? l.reduce((N, b) => N + b, 0) / l.length : c.get(h);
131
- };
132
- i[t].sort((h, l) => g(h.id) - g(l.id) || I(h.id, l.id));
133
- };
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
- const o = S.spacing ?? 64;
137
- let a = 0, M = 0;
138
- const H = [], L = [];
139
- for (const t of i) {
140
- let n = 0;
141
- const r = Math.max(0, ...t.map((c) => p ? c.width : c.height));
142
- H.push(a), L.push(r);
143
- for (const c of t) {
144
- const g = a + (r - (p ? c.width : c.height)) / 2, h = p ? g : n, l = p ? n : g;
145
- O(c, h - c.x, l - c.y), n += (p ? c.height : c.width) + o;
146
- }
147
- M = Math.max(M, Math.max(0, n - o)), a += r + o;
148
- }
149
- if (a = Math.max(0, a - o), !T)
150
- for (const t of f) {
151
- const n = u.get(t.id), c = a - H[n] - L[n] + (L[n] - (p ? t.width : t.height)) / 2;
152
- O(t, p ? c - t.x : 0, p ? 0 : c - t.y);
153
- }
154
- return p ? { width: a, height: M } : { width: M, height: a };
155
- }
156
- export {
157
- j as computePackedGraphLayout
158
- };
@@ -1,76 +0,0 @@
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))
8
- throw new Error(`Invalid graph position: ${t.nodeId}`);
9
- M.set(t.nodeId, t);
10
- }
11
- const y = /* @__PURE__ */ new Map();
12
- for (const t of f.values())
13
- if (t.parentId) {
14
- const c = y.get(t.parentId) ?? [];
15
- c.push(t), y.set(t.parentId, c);
16
- }
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;
20
- const i = y.get(t.id) ?? [];
21
- for (const o of i) b(o, t.x - g.x, t.y - g.y);
22
- if (!i.length || u) return;
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))
25
- throw new Error(`Pinned child lies outside group content: ${t.id}`);
26
- const e = Math.max(
27
- t.x + t.width,
28
- ...i.map((o) => o.x + o.width + m.right)
29
- ), n = Math.max(
30
- t.y + t.height,
31
- ...i.map((o) => o.y + o.height + m.bottom)
32
- );
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;
34
- };
35
- for (const t of f.values()) t.parentId || b(t, 0, 0);
36
- if (u) {
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 = [];
42
- for (const h of [...i].sort(
43
- (e, n) => e.y - n.y || e.x - n.x || e.id.localeCompare(n.id)
44
- )) {
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);
48
- const n = { x: h.x, y: h.y };
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);
53
- }
54
- }, g = (i) => {
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(
61
- I.get(i.id).width,
62
- Math.max(...a.map((s) => s.x + s.width)) + n - i.x
63
- ), i.height = Math.max(
64
- I.get(i.id).height,
65
- Math.max(...a.map((s) => s.y + s.height)) + o - i.y
66
- );
67
- }, p = [...f.values()].filter((i) => !i.parentId);
68
- for (const i of p) g(i);
69
- d(p);
70
- }
71
- return v({ ...l, nodes: [...f.values()] }, x);
72
- }
73
- export {
74
- C as applyGraphPositions,
75
- v as routeGraphGeometry
76
- };