@p10node/graphviz 0.0.0-stage → 0.9.0

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/index.js ADDED
@@ -0,0 +1,1882 @@
1
+ function e(e, t, n, r) {
2
+ let i = e.length, a = n.length, o = Array.from({ length: i }, () => []), s = Array(i).fill(!0);
3
+ t.forEach((e, t) => {
4
+ e.v !== e.w && (o[e.v].push(t), s[e.w] = !1);
5
+ });
6
+ let c = Array(t.length).fill(!1), l = new Uint8Array(i), u = [...Array.from({ length: i }, (e, t) => t).filter((e) => s[e]), ...Array.from({ length: i }, (e, t) => t)];
7
+ for (let e of u) {
8
+ if (l[e]) continue;
9
+ l[e] = 1;
10
+ let n = [[e, 0]];
11
+ for (; n.length;) {
12
+ let e = n[n.length - 1], r = e[0];
13
+ if (e[1] < o[r].length) {
14
+ let i = o[r][e[1]++], a = t[i].w;
15
+ l[a] === 1 ? c[i] = !0 : l[a] || (l[a] = 1, n.push([a, 0]));
16
+ } else l[r] = 2, n.pop();
17
+ }
18
+ }
19
+ let d = /* @__PURE__ */ new Map();
20
+ r.sameRank?.forEach((e, t) => e.forEach((e) => d.set(e, t)));
21
+ let f = t.map((e, t) => {
22
+ let n = d.has(e.v) && d.get(e.v) === d.get(e.w);
23
+ return c[t] ? {
24
+ v: e.w,
25
+ w: e.v,
26
+ minlen: n ? 0 : e.minlen,
27
+ weight: e.weight
28
+ } : {
29
+ v: e.v,
30
+ w: e.w,
31
+ minlen: n ? 0 : e.minlen,
32
+ weight: e.weight
33
+ };
34
+ }), p = Array.from({ length: i }, () => []), m = Array.from({ length: i }, () => []);
35
+ f.forEach((e, t) => {
36
+ e.v !== e.w && (m[e.v].push(t), p[e.w].push(t));
37
+ });
38
+ let h = [];
39
+ {
40
+ let e = p.map((e) => e.length), t = Array.from({ length: i }, (e, t) => t).filter((t) => !e[t]);
41
+ for (; t.length;) {
42
+ let n = t.shift();
43
+ h.push(n);
44
+ for (let r of m[n]) --e[f[r].w] || t.push(f[r].w);
45
+ }
46
+ if (h.length < i) for (let e = 0; e < i; e++) h.includes(e) || h.push(e);
47
+ }
48
+ let g = Array(i).fill(0), _ = () => {
49
+ for (let e of h) for (let t of m[e]) g[f[t].w] = Math.max(g[f[t].w], g[e] + f[t].minlen);
50
+ };
51
+ _();
52
+ for (let e = 0; e < 60; e++) {
53
+ let t = !1, n = e % 2 ? [...h].reverse() : h;
54
+ for (let e of n) {
55
+ if (d.has(e)) continue;
56
+ let n = -Infinity, r = Infinity, i = 0, a = 0;
57
+ for (let t of p[e]) n = Math.max(n, g[f[t].v] + f[t].minlen), i += f[t].weight;
58
+ for (let t of m[e]) r = Math.min(r, g[f[t].w] - f[t].minlen), a += f[t].weight;
59
+ let o = g[e];
60
+ i > a && n > -Infinity ? o = n : a > i && r < Infinity && (o = r), o !== g[e] && (g[e] = o, t = !0);
61
+ }
62
+ if (!t) break;
63
+ }
64
+ if (r.sameRank?.length) for (let e = 0; e < 12; e++) {
65
+ let e = !1;
66
+ for (let t of r.sameRank) {
67
+ let n = Math.max(...t.map((e) => g[e]));
68
+ for (let r of t) g[r] !== n && (g[r] = n, e = !0);
69
+ }
70
+ if (_(), !e) break;
71
+ }
72
+ let v = g.reduce((e, t) => Math.min(e, t), 0);
73
+ for (let e = 0; e < i; e++) g[e] -= v;
74
+ let y = g.reduce((e, t) => Math.max(e, t), 0), b = (e) => {
75
+ let t = [];
76
+ for (let r = e; r >= 0; r = n[r].parent) t.unshift(r);
77
+ return t;
78
+ }, x = (e, t) => {
79
+ let n = b(e), r = b(t), i = 0;
80
+ for (; i < n.length && i < r.length && n[i] === r[i];) i++;
81
+ return i ? n[i - 1] : -1;
82
+ }, S = e.map((e) => e.w), C = e.map((e) => e.h), w = e.map(() => 0), T = e.map((e) => e.cluster), E = [...g], D = e.map((e) => e.loop ?? 0), O = e.map(() => -1), ee = (e, t, n, r, i) => (S.push(e), C.push(t), w.push(n), T.push(r), E.push(i), D.push(0), O.push(n === 2 || n === 3 ? r : -1), S.length - 1), k = [], A = [], te = (e, t, n) => {
83
+ for (; k.length < S.length;) k.push([]), A.push([]);
84
+ A[e].push([t, n]), k[t].push([e, n]);
85
+ }, ne = 6e4;
86
+ for (let e of f) ne -= Math.max(0, Math.abs(g[e.w] - g[e.v]) - 1);
87
+ if (ne < 0) throw Error("The diagram is too large to draw");
88
+ let re = [], j = [];
89
+ f.forEach((e, n) => {
90
+ if (e.v === e.w) {
91
+ re.push(null), j.push(-1);
92
+ return;
93
+ }
94
+ let r = [e.v], i = g[e.w] - g[e.v], a = t[n].label, o = a && i >= 2 ? g[e.v] + Math.floor(i / 2) : -1, s = x(T[e.v], T[e.w]), c = -1;
95
+ for (let t = g[e.v] + 1; t < g[e.w]; t++) {
96
+ let e = t === o ? ee(a.w, a.h, 1, s, t) : ee(0, 0, 1, s, t);
97
+ t === o && (c = e), r.push(e);
98
+ }
99
+ r.push(e.w), re.push(i > 0 ? r : null), j.push(c);
100
+ for (let t = 0; t + 1 < r.length && !(i <= 0); t++) {
101
+ let n = r[t], i = r[t + 1], a = +(w[n] === 1) + +(w[i] === 1);
102
+ te(n, i, e.weight * (a === 2 ? 8 : a === 1 ? 2 : 1));
103
+ }
104
+ });
105
+ let ie = f.map((e, t) => e.v !== e.w && g[e.v] === g[e.w] && !re[t]), M = Array(a).fill(Infinity), N = Array(a).fill(-Infinity);
106
+ for (let e = 0; e < S.length; e++) for (let t of b(T[e])) M[t] = Math.min(M[t], E[e]), N[t] = Math.max(N[t], E[e]);
107
+ let P = Array.from({ length: a }, () => []), F = Array.from({ length: a }, () => []), I = [];
108
+ for (let e = 0; e < a; e++) if (!(M[e] > N[e])) for (let t = M[e]; t <= N[e]; t++) P[e][t] = ee(0, 0, 2, e, t), F[e][t] = ee(0, 0, 3, e, t);
109
+ for (; k.length < S.length;) k.push([]), A.push([]);
110
+ for (let e = 0; e < S.length; e++) I.push([]);
111
+ for (let e = 0; e < a; e++) for (let t = M[e]; t < N[e]; t++) I[P[e][t]].push([P[e][t + 1], 1]), I[P[e][t + 1]].push([P[e][t], 1]), I[F[e][t]].push([F[e][t + 1], 1]), I[F[e][t + 1]].push([F[e][t], 1]);
112
+ let L = S.length;
113
+ y = E.reduce((e, t) => Math.max(e, t), y);
114
+ let R = Array.from({ length: y + 1 }, () => []);
115
+ {
116
+ let e = new Uint8Array(L), t = Array.from({ length: L }, (e, t) => t).filter((e) => w[e] !== 2 && w[e] !== 3).sort((e, t) => E[e] - E[t] || e - t);
117
+ for (let n of t) {
118
+ if (e[n]) continue;
119
+ let t = [n];
120
+ for (; t.length;) {
121
+ let n = t.pop();
122
+ if (!e[n]) {
123
+ e[n] = 1, R[E[n]].push(n);
124
+ for (let r = A[n].length - 1; r >= 0; r--) e[A[n][r][0]] || t.push(A[n][r][0]);
125
+ }
126
+ }
127
+ }
128
+ for (let e = 0; e < L; e++) (w[e] === 2 || w[e] === 3) && R[E[e]].push(e);
129
+ }
130
+ let z = new Float64Array(L), B = () => R.forEach((e) => e.forEach((e, t) => z[e] = t));
131
+ B();
132
+ let V = new Float64Array(L), H = new Float64Array(a), U = () => {
133
+ for (let e = 0; e < a; e++) {
134
+ if (M[e] > N[e]) continue;
135
+ let t = 0;
136
+ for (let n = M[e]; n <= N[e]; n++) t += z[P[e][n]] / Math.max(1, R[n].length);
137
+ H[e] = t / (N[e] - M[e] + 1);
138
+ }
139
+ }, W = (e, t) => {
140
+ if (!a) return [...e].sort((e, t) => V[e] - V[t] || z[e] - z[t]);
141
+ let r = {
142
+ node: -1,
143
+ cluster: -1,
144
+ key: 0,
145
+ idx: 0,
146
+ items: []
147
+ }, i = /* @__PURE__ */ new Map(), o = (e) => {
148
+ if (e < 0) return r;
149
+ let a = i.get(e);
150
+ return a || (a = {
151
+ node: -1,
152
+ cluster: e,
153
+ key: 0,
154
+ idx: z[P[e][t]] ?? 0,
155
+ items: []
156
+ }, i.set(e, a), o(n[e].parent).items.push(a)), a;
157
+ };
158
+ for (let t of e) w[t] === 2 ? o(O[t]) : w[t] !== 3 && o(T[t]).items.push({
159
+ node: t,
160
+ cluster: -1,
161
+ key: V[t],
162
+ idx: z[t],
163
+ items: []
164
+ });
165
+ let s = (e) => {
166
+ let n = 0, r = 0;
167
+ for (let t of e.items) if (t.node >= 0) n += t.key, r++;
168
+ else {
169
+ let [e, i] = s(t);
170
+ n += e, r += i;
171
+ }
172
+ e.cluster >= 0 && (e.key = r ? n / r : V[P[e.cluster][t]]), e.items.sort((e, t) => e.key - t.key || e.idx - t.idx);
173
+ let i = e.items.map((e, t) => e.cluster >= 0 ? t : -1).filter((e) => e >= 0), a = i.map((t) => e.items[t]).sort((e, t) => H[e.cluster] - H[t.cluster]);
174
+ return i.forEach((t, n) => e.items[t] = a[n]), [n, r];
175
+ };
176
+ s(r);
177
+ let c = [], l = (e) => {
178
+ for (let n of e.items) n.node >= 0 ? c.push(n.node) : (c.push(P[n.cluster][t]), l(n), c.push(F[n.cluster][t]));
179
+ };
180
+ return l(r), c;
181
+ }, ae = (e) => {
182
+ let t = 0;
183
+ for (let n = 0; n + 1 < e.length; n++) {
184
+ let r = [];
185
+ for (let t of e[n]) for (let [e] of A[t]) r.push([z[t], z[e]]);
186
+ r.sort((e, t) => e[0] - t[0] || e[1] - t[1]);
187
+ let i = e[n + 1].length + 1, a = new Float64Array(i + 1);
188
+ for (let e = 0; e < r.length; e++) {
189
+ let n = 0;
190
+ for (let t = r[e][1] + 1; t > 0; t -= t & -t) n += a[t];
191
+ t += e - n;
192
+ for (let t = r[e][1] + 1; t <= i; t += t & -t) a[t]++;
193
+ }
194
+ }
195
+ return t;
196
+ }, G = (e, t) => {
197
+ let n = 0, r = 0;
198
+ for (let [i, a] of t[e]) n += z[i] * a, r += a;
199
+ return r ? n / r : z[e];
200
+ };
201
+ for (let e of R) for (let t of e) V[t] = z[t];
202
+ U(), R = R.map((e, t) => W(e, t)), B();
203
+ let oe = R.map((e) => [...e]), K = ae(R);
204
+ for (let e = 0; e < 24 && K > 0; e++) {
205
+ U();
206
+ let t = e % 2 == 0;
207
+ for (let e = 1; e <= y; e++) {
208
+ let n = t ? e : y - e, r = t ? k : A;
209
+ for (let e of R[n]) V[e] = G(e, r);
210
+ R[n] = W(R[n], n), R[n].forEach((e, t) => z[e] = t);
211
+ }
212
+ let n = ae(R);
213
+ n < K && (K = n, oe = R.map((e) => [...e]));
214
+ }
215
+ R = oe, B();
216
+ let q = R.map((e) => e.reduce((e, t) => Math.max(e, C[t]), 0)), se = Array.from({ length: a }, () => []);
217
+ n.forEach((e, t) => e.parent >= 0 && se[e.parent].push(t));
218
+ let ce = (e) => n[e].pad[2] + Math.max(0, ...se[e].filter((t) => M[t] === M[e]).map(ce)), le = (e) => n[e].pad[3] + Math.max(0, ...se[e].filter((t) => N[t] === N[e]).map(le)), J = Array(y + 1).fill(0), ue = Array(y + 1).fill(0);
219
+ for (let e = 0; e < a; e++) M[e] > N[e] || (J[M[e]] = Math.max(J[M[e]], ce(e)), ue[N[e]] = Math.max(ue[N[e]], le(e)));
220
+ let Y = [];
221
+ for (let e = 0; e <= y; e++) Y[e] = e === 0 ? q[0] / 2 + J[0] : Y[e - 1] + q[e - 1] / 2 + ue[e - 1] + r.ranksep + J[e] + q[e] / 2;
222
+ let de = Y[y] + q[y] / 2 + ue[y], fe = (e) => w[e] === 2 || w[e] === 3 ? 0 : S[e] / 2, pe = (e, t) => {
223
+ let i = D[e], a = w[e], o = w[t];
224
+ return a === 2 && (i += n[O[e]].pad[0]), a === 3 && (i += r.nodesep / 2), o === 3 && (i += n[O[t]].pad[1]), o === 2 && (i += r.nodesep / 2), a < 2 && o < 2 && (i += a === 1 && o === 1 ? r.edgesep : a === 1 || o === 1 ? (r.nodesep + r.edgesep) / 2 : r.nodesep), fe(e) + fe(t) + i;
225
+ }, X = new Float64Array(L);
226
+ for (let e of R) for (let t = 1; t < e.length; t++) X[e[t]] = X[e[t - 1]] + pe(e[t - 1], e[t]);
227
+ let me = (e, t, n) => {
228
+ let r = e.length, i = [0];
229
+ for (let t = 1; t < r; t++) i[t] = i[t - 1] + pe(e[t - 1], e[t]);
230
+ let a = [];
231
+ for (let e = 0; e < r; e++) for (a.push({
232
+ s: e,
233
+ e,
234
+ w: n[e],
235
+ wt: n[e] * (t[e] - i[e])
236
+ }); a.length > 1;) {
237
+ let e = a[a.length - 2], t = a[a.length - 1];
238
+ if (e.wt / e.w < t.wt / t.w) break;
239
+ e.e = t.e, e.w += t.w, e.wt += t.wt, a.pop();
240
+ }
241
+ for (let t of a) for (let n = t.s; n <= t.e; n++) X[e[n]] = t.wt / t.w + i[n];
242
+ };
243
+ for (let e = 0; e < 10; e++) {
244
+ let t = e >= 8, n = e % 2 == 0;
245
+ for (let e = 0; e <= y; e++) {
246
+ let r = n ? e : y - e, i = R[r];
247
+ if (!i.length) continue;
248
+ let a = [], o = [];
249
+ for (let e of i) {
250
+ let r = 0, i = 0, s = (e) => {
251
+ for (let [t, n] of e) r += X[t] * n, i += n;
252
+ };
253
+ (t || n) && s(k[e]), (t || !n) && s(A[e]), s(I[e]), a.push(i ? r / i : X[e]), o.push(i || .01);
254
+ }
255
+ me(i, a, o);
256
+ }
257
+ }
258
+ let he = L, Z = (e) => w[e] === 2 ? he + 2 * O[e] : w[e] === 3 ? he + 2 * O[e] + 1 : e;
259
+ if (a) {
260
+ let e = L + 2 * a, t = new Float64Array(e);
261
+ for (let e = 0; e < L; e++) t[e] = X[e];
262
+ for (let e = 0; e < a; e++) t[he + 2 * e] = Infinity, t[he + 2 * e + 1] = -Infinity;
263
+ for (let e = 0; e < L; e++) w[e] === 2 && (t[Z(e)] = Math.min(t[Z(e)], X[e])), w[e] === 3 && (t[Z(e)] = Math.max(t[Z(e)], X[e]));
264
+ let r = Array.from({ length: e }, () => []), i = new Int32Array(e), o = (e, t, n) => {
265
+ r[e].push([t, n]), i[t]++;
266
+ };
267
+ for (let e of R) for (let t = 1; t < e.length; t++) o(Z(e[t - 1]), Z(e[t]), pe(e[t - 1], e[t]));
268
+ for (let e = 0; e < a; e++) M[e] <= N[e] && o(he + 2 * e, he + 2 * e + 1, Math.max(n[e].minW, n[e].pad[0] + n[e].pad[1]));
269
+ let s = [];
270
+ for (let t = 0; t < e; t++) i[t] || s.push(t);
271
+ let c = 0, l = new Float64Array(t);
272
+ for (; s.length;) {
273
+ let e = s.pop();
274
+ c++;
275
+ for (let [t, n] of r[e]) Number.isFinite(l[e]) && (l[t] = Math.max(l[t], l[e] + n)), --i[t] || s.push(t);
276
+ }
277
+ if (c === e) for (let e = 0; e < L; e++) X[e] = l[Z(e)];
278
+ }
279
+ let Q = Infinity, ge = -Infinity;
280
+ for (let e = 0; e < L; e++) Q = Math.min(Q, X[e] - fe(e)), ge = Math.max(ge, X[e] + fe(e) + D[e]);
281
+ Number.isFinite(Q) || (Q = ge = 0);
282
+ for (let e = 0; e < L; e++) X[e] -= Q;
283
+ let $ = (e) => ({
284
+ x: X[e],
285
+ y: Y[E[e]]
286
+ }), _e = /* @__PURE__ */ new Map();
287
+ {
288
+ let t = /* @__PURE__ */ new Map(), n = (e, n, r) => {
289
+ let i = t.get(e);
290
+ i || t.set(e, i = []), i.push({
291
+ i: n,
292
+ nx: r
293
+ });
294
+ };
295
+ f.forEach((t, r) => {
296
+ let i = re[r];
297
+ i && !ie[r] && (e[i[0]]?.spread && n(`${i[0]}:b`, r, X[i[1]]), e[i[i.length - 1]]?.spread && n(`${i[i.length - 1]}:t`, r, X[i[i.length - 2]]));
298
+ });
299
+ for (let [e, n] of t) {
300
+ if (n.length < 2) continue;
301
+ let t = Number(e.split(":")[0]);
302
+ n.sort((e, t) => e.nx - t.nx || e.i - t.i);
303
+ let r = Math.min(36, S[t] * .7 / (n.length - 1));
304
+ n.forEach((i, a) => _e.set(`${e}:${i.i}`, X[t] + (a - (n.length - 1) / 2) * r));
305
+ }
306
+ }
307
+ let ve = f.map((e, n) => {
308
+ if (e.v === e.w) return null;
309
+ if (ie[n]) {
310
+ let r = $(e.v), i = $(e.w), a = Math.sign(i.x - r.x) || 1, o = {
311
+ x: r.x + a * S[e.v] / 2,
312
+ y: r.y
313
+ }, s = {
314
+ x: i.x - a * S[e.w] / 2,
315
+ y: i.y
316
+ }, [l, u] = c[n] ? [s, o] : [o, s];
317
+ return {
318
+ start: l,
319
+ segs: [{
320
+ c: "L",
321
+ p: [u]
322
+ }],
323
+ label: t[n].label ? {
324
+ x: (l.x + u.x) / 2,
325
+ y: l.y - 10
326
+ } : void 0
327
+ };
328
+ }
329
+ let r = re[n];
330
+ if (!r) return null;
331
+ let i = [], a = [], o = $(r[0]);
332
+ i.push({
333
+ x: _e.get(`${r[0]}:b:${n}`) ?? o.x,
334
+ y: o.y + C[r[0]] / 2
335
+ });
336
+ for (let e = 1; e + 1 < r.length; e++) {
337
+ let t = $(r[e]), n = q[E[r[e]]] / 2;
338
+ n > .5 ? (i.push({
339
+ x: t.x,
340
+ y: t.y - n
341
+ }, {
342
+ x: t.x,
343
+ y: t.y + n
344
+ }), a.push(!1, !0)) : (i.push(t), a.push(!1));
345
+ }
346
+ let s = $(r[r.length - 1]);
347
+ i.push({
348
+ x: _e.get(`${r[r.length - 1]}:t:${n}`) ?? s.x,
349
+ y: s.y - C[r[r.length - 1]] / 2
350
+ }), a.push(!1), c[n] && (i.reverse(), a.reverse());
351
+ let l = [];
352
+ for (let e = 1; e < i.length; e++) {
353
+ let t = i[e - 1], n = i[e];
354
+ if (a[e - 1] || Math.abs(t.x - n.x) < .5) l.push({
355
+ c: "L",
356
+ p: [n]
357
+ });
358
+ else {
359
+ let e = (t.y + n.y) / 2;
360
+ l.push({
361
+ c: "C",
362
+ p: [
363
+ {
364
+ x: t.x,
365
+ y: e
366
+ },
367
+ {
368
+ x: n.x,
369
+ y: e
370
+ },
371
+ n
372
+ ]
373
+ });
374
+ }
375
+ }
376
+ return {
377
+ start: i[0],
378
+ segs: l,
379
+ label: j[n] >= 0 ? $(j[n]) : void 0
380
+ };
381
+ }), ye = n.map((e, t) => {
382
+ if (M[t] > N[t]) return null;
383
+ let n = Infinity, r = -Infinity;
384
+ for (let e = M[t]; e <= N[t]; e++) n = Math.min(n, X[P[t][e]]), r = Math.max(r, X[F[t][e]]);
385
+ let i = Y[M[t]] - q[M[t]] / 2 - ce(t), a = Y[N[t]] + q[N[t]] / 2 + le(t);
386
+ return {
387
+ x: n,
388
+ y: i,
389
+ w: r - n,
390
+ h: a - i
391
+ };
392
+ });
393
+ return {
394
+ nodes: Array.from({ length: i }, (e, t) => $(t)),
395
+ edges: ve,
396
+ clusters: ye,
397
+ w: ge - Q,
398
+ h: de
399
+ };
400
+ }
401
+ // src/core/diagram/svg.ts
402
+ var t = [
403
+ 278,
404
+ 278,
405
+ 355,
406
+ 556,
407
+ 556,
408
+ 889,
409
+ 667,
410
+ 191,
411
+ 333,
412
+ 333,
413
+ 389,
414
+ 584,
415
+ 278,
416
+ 333,
417
+ 278,
418
+ 278,
419
+ 556,
420
+ 556,
421
+ 556,
422
+ 556,
423
+ 556,
424
+ 556,
425
+ 556,
426
+ 556,
427
+ 556,
428
+ 556,
429
+ 278,
430
+ 278,
431
+ 584,
432
+ 584,
433
+ 584,
434
+ 556,
435
+ 1015,
436
+ 667,
437
+ 667,
438
+ 722,
439
+ 722,
440
+ 667,
441
+ 611,
442
+ 778,
443
+ 722,
444
+ 278,
445
+ 500,
446
+ 667,
447
+ 556,
448
+ 833,
449
+ 722,
450
+ 778,
451
+ 667,
452
+ 778,
453
+ 722,
454
+ 667,
455
+ 611,
456
+ 722,
457
+ 667,
458
+ 944,
459
+ 667,
460
+ 667,
461
+ 611,
462
+ 278,
463
+ 278,
464
+ 278,
465
+ 469,
466
+ 556,
467
+ 333,
468
+ 556,
469
+ 556,
470
+ 500,
471
+ 556,
472
+ 556,
473
+ 278,
474
+ 556,
475
+ 556,
476
+ 222,
477
+ 222,
478
+ 500,
479
+ 222,
480
+ 833,
481
+ 556,
482
+ 556,
483
+ 556,
484
+ 556,
485
+ 333,
486
+ 500,
487
+ 278,
488
+ 556,
489
+ 500,
490
+ 722,
491
+ 500,
492
+ 500,
493
+ 500,
494
+ 334,
495
+ 260,
496
+ 334,
497
+ 584
498
+ ];
499
+ function n(e) {
500
+ return e >= 32 && e <= 126 ? t[e - 32] : e >= 768 && e <= 879 || e >= 8203 && e <= 8207 || e === 65039 ? 0 : e >= 4352 && e <= 4447 || e >= 11904 && e <= 42191 || e >= 44032 && e <= 55203 || e >= 63744 && e <= 64255 || e >= 65072 && e <= 65103 || e >= 65280 && e <= 65376 || e >= 126976 ? 1e3 : 580;
501
+ }
502
+ function r(e, t = 14, r = !1, i = !1) {
503
+ let a = 0;
504
+ if (i) for (let t of e) a += n(t.codePointAt(0)) ? 600 : 0;
505
+ else for (let t of e) a += n(t.codePointAt(0));
506
+ return a * t * (r ? 1.08 : 1) / 1e3;
507
+ }
508
+ var i = (e) => Math.round(e * 1.3);
509
+ function a(e, t = 14, n = !1) {
510
+ let a = 0;
511
+ for (let i of e) a = Math.max(a, r(i, t, n));
512
+ return {
513
+ w: a,
514
+ h: e.length * i(t)
515
+ };
516
+ }
517
+ function o(e, t, n = 14, i = !1) {
518
+ let a = [];
519
+ for (let o of e) {
520
+ if (r(o, n, i) <= t) {
521
+ a.push(o);
522
+ continue;
523
+ }
524
+ let e = "";
525
+ for (let s of o.split(/ +/)) {
526
+ let o = e ? e + " " + s : s;
527
+ e && r(o, n, i) > t ? (a.push(e), e = s) : e = o;
528
+ }
529
+ a.push(e);
530
+ }
531
+ return a;
532
+ }
533
+ var s = (e) => e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;"), c = /^[a-z]{3,24}$/;
534
+ function l(e) {
535
+ if (!e) return;
536
+ let t = e.trim().toLowerCase();
537
+ if (/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/.test(t)) return t;
538
+ if (/^[0-9a-f]{6}$/.test(t)) return "#" + t;
539
+ if (/^rgba?\(\s*[\d.]+%?\s*,\s*[\d.]+%?\s*,\s*[\d.]+%?\s*(,\s*[\d.]+%?\s*)?\)$/.test(t) || /^rgba?\(\s*[\d.]+%?\s+[\d.]+%?\s+[\d.]+%?\s*(\/\s*[\d.]+%?\s*)?\)$/.test(t)) return t;
540
+ if (c.test(t)) return t === "transparent" ? "none" : t;
541
+ }
542
+ var u = {
543
+ ink: "#1f2937",
544
+ line: "#4b5563",
545
+ fill: "#eef2fb",
546
+ stroke: "#5b6f9a",
547
+ muted: "#6b7280",
548
+ cluster: "#f7f8fb",
549
+ clusterStroke: "#a3adc2",
550
+ note: "#fff6c8",
551
+ noteStroke: "#c9a227",
552
+ label: "#ffffff",
553
+ dark: "#2d3748",
554
+ series: [
555
+ "#5b8def",
556
+ "#f2994a",
557
+ "#3fb68b",
558
+ "#e5596b",
559
+ "#9b6be0",
560
+ "#d4b33a",
561
+ "#3bb3c9",
562
+ "#e07bb8",
563
+ "#8c9aaf",
564
+ "#7cbd4a"
565
+ ]
566
+ }, d = (e) => Number.isFinite(e) ? Math.round(e * 100) / 100 : 0;
567
+ function f(e) {
568
+ let t = ` fill="${e.fill ?? "none"}"`;
569
+ return e.stroke && (t += ` stroke="${e.stroke}" stroke-width="${d(e.sw ?? 1)}"`), e.stroke && e.dash && (t += ` stroke-dasharray="${e.dash}"`), e.opacity !== void 0 && (t += ` opacity="${d(e.opacity)}"`), t;
570
+ }
571
+ var p = class {
572
+ out = [];
573
+ rect(e, t, n, r, i, a = 0) {
574
+ return this.out.push(`<rect x="${d(e)}" y="${d(t)}" width="${d(n)}" height="${d(r)}"${a ? ` rx="${d(a)}"` : ""}${f(i)}/>`), this;
575
+ }
576
+ circle(e, t, n, r) {
577
+ return this.out.push(`<circle cx="${d(e)}" cy="${d(t)}" r="${d(n)}"${f(r)}/>`), this;
578
+ }
579
+ ellipse(e, t, n, r, i) {
580
+ return this.out.push(`<ellipse cx="${d(e)}" cy="${d(t)}" rx="${d(n)}" ry="${d(r)}"${f(i)}/>`), this;
581
+ }
582
+ line(e, t, n, r, i) {
583
+ return this.out.push(`<line x1="${d(e)}" y1="${d(t)}" x2="${d(n)}" y2="${d(r)}"${f(i)}/>`), this;
584
+ }
585
+ poly(e, t, n = !0) {
586
+ let r = e.map(([e, t]) => `${d(e)},${d(t)}`).join(" ");
587
+ return this.out.push(`<${n ? "polygon" : "polyline"} points="${r}"${f(t)}/>`), this;
588
+ }
589
+ path(e, t) {
590
+ return this.out.push(`<path d="${e}"${f(t)}/>`), this;
591
+ }
592
+ text(e, t, n, r = {}) {
593
+ let a = typeof n == "string" ? [n] : n, o = r.size ?? 14, c = i(o), l = t - a.length * c / 2, f = ` font-family="${s(r.mono ? "Menlo, Consolas, \"Courier New\", monospace" : "Helvetica, Arial, sans-serif")}" font-size="${o}" fill="${r.color ?? u.ink}"`;
594
+ return r.anchor && r.anchor !== "start" && (f += ` text-anchor="${r.anchor}"`), r.bold && (f += " font-weight=\"bold\""), r.italic && (f += " font-style=\"italic\""), r.underline && (f += " text-decoration=\"underline\""), a.forEach((t, n) => {
595
+ t && this.out.push(`<text x="${d(e)}" y="${d(l + n * c + c / 2 + o * .35)}"${f}>${s(t)}</text>`);
596
+ }), this;
597
+ }
598
+ raw(e) {
599
+ return this.out.push(e), this;
600
+ }
601
+ body() {
602
+ return this.out.join("");
603
+ }
604
+ toString(e, t, n = "#ffffff") {
605
+ let r = Math.ceil(e), i = Math.ceil(t);
606
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${r}" height="${i}" viewBox="0 0 ${r} ${i}">` + (n ? `<rect x="0" y="0" width="${r}" height="${i}" fill="${n}"/>` : "") + this.out.join("") + "</svg>";
607
+ }
608
+ };
609
+ function m(e) {
610
+ return e.map((e) => e.c + e.p.map((e) => `${d(e.x)} ${d(e.y)}`).join(" ")).join(" ");
611
+ }
612
+ function h(e) {
613
+ return e.replace(/<br\s*\/?>/gi, "\n").replace(/\\n/g, "\n").replace(/<\/?[a-z][^>]*>/gi, "").replace(/#(\d+);/g, (e, t) => String.fromCodePoint(Math.min(Number(t), 1114111))).replace(/#([a-z]+);/gi, (e, t) => ({
614
+ quot: "\"",
615
+ amp: "&",
616
+ lt: "<",
617
+ gt: ">",
618
+ nbsp: " ",
619
+ apos: "'"
620
+ })[t.toLowerCase()] ?? e).replace(/&(quot|amp|lt|gt|nbsp|apos|#\d+);/g, (e, t) => t[0] === "#" ? String.fromCodePoint(Math.min(Number(t.slice(1)), 1114111)) : {
621
+ quot: "\"",
622
+ amp: "&",
623
+ lt: "<",
624
+ gt: ">",
625
+ nbsp: " ",
626
+ apos: "'"
627
+ }[t] ?? e);
628
+ }
629
+ var g = class extends Error {}, _ = class {
630
+ defShape;
631
+ g;
632
+ byId = /* @__PURE__ */ new Map();
633
+ clusterIds = /* @__PURE__ */ new Map();
634
+ constructor(e = "TB", t = "rect") {
635
+ this.defShape = t, this.g = {
636
+ dir: e,
637
+ nodes: [],
638
+ edges: [],
639
+ clusters: []
640
+ };
641
+ }
642
+ has(e) {
643
+ return this.byId.has(e);
644
+ }
645
+ get(e) {
646
+ return this.byId.get(e);
647
+ }
648
+ node(e, t = {}, n) {
649
+ let r = this.byId.get(e);
650
+ r || (r = {
651
+ id: e,
652
+ label: e,
653
+ shape: this.defShape,
654
+ cluster: n
655
+ }, this.byId.set(e, r), this.g.nodes.push(r));
656
+ for (let [e, n] of Object.entries(t)) n !== void 0 && (r[e] = n);
657
+ return r;
658
+ }
659
+ edge(e, t) {
660
+ return this.clusterIds.has(e.from) || this.node(e.from, {}, t), this.clusterIds.has(e.to) || this.node(e.to, {}, t), this.g.edges.push(e), e;
661
+ }
662
+ cluster(e, t, n) {
663
+ let r = this.clusterIds.get(e);
664
+ r ? t && (r.label = t) : (r = {
665
+ id: e,
666
+ label: t,
667
+ parent: n
668
+ }, this.clusterIds.set(e, r), this.g.clusters.push(r));
669
+ let i = this.byId.get(e);
670
+ return i && (this.byId.delete(e), this.g.nodes.splice(this.g.nodes.indexOf(i), 1)), r;
671
+ }
672
+ isCluster(e) {
673
+ return this.clusterIds.has(e);
674
+ }
675
+ }, v = 14, y = 13, b = 14, x = 9, S = i(v), C = (e) => e.split("\n"), w = (e) => Math.round(e * 100) / 100;
676
+ function T(e) {
677
+ let t = [];
678
+ for (let n of e.rows) n.forEach((n, i) => t[i] = Math.max(t[i] ?? 0, r(n, y, e.bold)));
679
+ return {
680
+ w: t.reduce((e, t) => e + t, 0) + Math.max(0, t.length - 1) * 12,
681
+ h: e.rows.length ? e.rows.length * i(y) + 10 : 8,
682
+ cols: t
683
+ };
684
+ }
685
+ function E(e, t) {
686
+ let n = e.shape === "none" || e.label === "" ? C(e.label) : o(C(e.label), 260, v, e.style?.bold), r = e.label === "" ? {
687
+ w: 0,
688
+ h: 0
689
+ } : a(n, v, e.style?.bold), i = t === "TB" || t === "BT";
690
+ if (e.sections?.length) {
691
+ let t = e.sections.map(T);
692
+ return {
693
+ w: Math.max(90, ...t.map((e) => e.w + 28)),
694
+ h: t.reduce((e, t) => e + t.h, 0),
695
+ text: n
696
+ };
697
+ }
698
+ let s = r.w + 28, c = r.h + 18;
699
+ switch (e.shape) {
700
+ case "start": return {
701
+ w: 20,
702
+ h: 20,
703
+ text: []
704
+ };
705
+ case "end": return {
706
+ w: 22,
707
+ h: 22,
708
+ text: []
709
+ };
710
+ case "point": return {
711
+ w: 8,
712
+ h: 8,
713
+ text: []
714
+ };
715
+ case "bar": return i ? {
716
+ w: 80,
717
+ h: 7,
718
+ text: []
719
+ } : {
720
+ w: 7,
721
+ h: 80,
722
+ text: []
723
+ };
724
+ case "none": return {
725
+ w: r.w + 8,
726
+ h: r.h + 6,
727
+ text: n
728
+ };
729
+ case "circle": {
730
+ let e = Math.max(r.w, r.h) + 18 + 4;
731
+ return {
732
+ w: e,
733
+ h: e,
734
+ text: n
735
+ };
736
+ }
737
+ case "doublecircle": {
738
+ let e = Math.max(r.w, r.h) + 18 + 14;
739
+ return {
740
+ w: e,
741
+ h: e,
742
+ text: n
743
+ };
744
+ }
745
+ case "ellipse": return {
746
+ w: Math.max(50, (r.w + b) * 1.42),
747
+ h: Math.max(36, (r.h + x) * 1.42),
748
+ text: n
749
+ };
750
+ case "diamond": {
751
+ let e = s + c / .6;
752
+ return {
753
+ w: e,
754
+ h: .6 * e,
755
+ text: n
756
+ };
757
+ }
758
+ case "stadium": return {
759
+ w: r.w + c + b,
760
+ h: c,
761
+ text: n
762
+ };
763
+ case "hexagon":
764
+ case "octagon": return {
765
+ w: s + c / 2,
766
+ h: c,
767
+ text: n
768
+ };
769
+ case "lean-r":
770
+ case "lean-l": return {
771
+ w: s + c / 2,
772
+ h: c,
773
+ text: n
774
+ };
775
+ case "trap-b":
776
+ case "trap-t": return {
777
+ w: s + c * .7,
778
+ h: c,
779
+ text: n
780
+ };
781
+ case "flag": return {
782
+ w: s + c / 3,
783
+ h: c,
784
+ text: n
785
+ };
786
+ case "cylinder": return {
787
+ w: Math.max(s, 50),
788
+ h: c + 16,
789
+ text: n
790
+ };
791
+ case "subroutine":
792
+ case "component": return {
793
+ w: s + 16,
794
+ h: c,
795
+ text: n
796
+ };
797
+ case "note":
798
+ case "folder": return {
799
+ w: s + 8,
800
+ h: c + (e.shape === "folder" ? 8 : 0),
801
+ text: n
802
+ };
803
+ case "box3d": return {
804
+ w: s + 8,
805
+ h: c + 8,
806
+ text: n
807
+ };
808
+ case "triangle": return {
809
+ w: s * 1.6,
810
+ h: c * 1.7,
811
+ text: n
812
+ };
813
+ case "actor": return {
814
+ w: Math.max(36, r.w + 8),
815
+ h: 46 + r.h,
816
+ text: n
817
+ };
818
+ default: return {
819
+ w: Math.max(s, 40),
820
+ h: c,
821
+ text: n
822
+ };
823
+ }
824
+ }
825
+ function D(e) {
826
+ let t = e.style ?? {};
827
+ return {
828
+ fill: t.fill ?? u.fill,
829
+ stroke: t.stroke ?? u.stroke,
830
+ sw: t.sw ?? 1.3,
831
+ dash: t.dash
832
+ };
833
+ }
834
+ function O(e, t, n, r, i) {
835
+ let { w: a, h: o } = n, s = r - a / 2, c = i - o / 2, l = D(t), d = t.style?.color ?? u.ink, f = (a = r, o = i) => e.text(a, o, n.text, {
836
+ anchor: "middle",
837
+ color: d,
838
+ bold: t.style?.bold,
839
+ italic: t.style?.italic
840
+ }), p = (t) => e.poly(t, l);
841
+ switch (t.shape) {
842
+ case "start":
843
+ e.circle(r, i, a / 2, { fill: t.style?.fill ?? u.dark });
844
+ return;
845
+ case "end":
846
+ e.circle(r, i, a / 2, {
847
+ fill: "#ffffff",
848
+ stroke: t.style?.stroke ?? u.dark,
849
+ sw: 1.5
850
+ }).circle(r, i, a / 2 - 4, { fill: t.style?.fill ?? u.dark });
851
+ return;
852
+ case "point":
853
+ e.circle(r, i, a / 2, { fill: t.style?.fill ?? u.dark });
854
+ return;
855
+ case "bar":
856
+ e.rect(s, c, a, o, { fill: t.style?.fill ?? u.dark }, 2);
857
+ return;
858
+ case "none":
859
+ f();
860
+ return;
861
+ case "round":
862
+ e.rect(s, c, a, o, l, 6);
863
+ break;
864
+ case "stadium":
865
+ e.rect(s, c, a, o, l, o / 2);
866
+ break;
867
+ case "subroutine":
868
+ e.rect(s, c, a, o, l).line(s + 8, c, s + 8, c + o, l).line(s + a - 8, c, s + a - 8, c + o, l);
869
+ break;
870
+ case "component":
871
+ e.rect(s + 6, c, a - 6, o, l), e.rect(s, c + o / 2 - 11, 12, 7, l).rect(s, c + o / 2 + 4, 12, 7, l), f(r + 4);
872
+ return;
873
+ case "cylinder":
874
+ e.path(`M${w(s)} ${w(c + 7)} A${w(a / 2)} 7 0 0 1 ${w(s + a)} ${w(c + 7)} L${w(s + a)} ${w(c + o - 7)} A${w(a / 2)} 7 0 0 1 ${w(s)} ${w(c + o - 7)} Z`, l), e.path(`M${w(s)} ${w(c + 7)} A${w(a / 2)} 7 0 0 0 ${w(s + a)} ${w(c + 7)}`, {
875
+ ...l,
876
+ fill: "none"
877
+ }), f(r, i + 7 / 2);
878
+ return;
879
+ case "circle":
880
+ e.circle(r, i, a / 2, l);
881
+ break;
882
+ case "doublecircle":
883
+ e.circle(r, i, a / 2, l).circle(r, i, a / 2 - 5, {
884
+ ...l,
885
+ fill: "none"
886
+ });
887
+ break;
888
+ case "ellipse":
889
+ e.ellipse(r, i, a / 2, o / 2, l);
890
+ break;
891
+ case "diamond":
892
+ p([
893
+ [r, c],
894
+ [s + a, i],
895
+ [r, c + o],
896
+ [s, i]
897
+ ]);
898
+ break;
899
+ case "hexagon": {
900
+ let e = o / 4;
901
+ p([
902
+ [s + e, c],
903
+ [s + a - e, c],
904
+ [s + a, i],
905
+ [s + a - e, c + o],
906
+ [s + e, c + o],
907
+ [s, i]
908
+ ]);
909
+ break;
910
+ }
911
+ case "octagon": {
912
+ let e = o / 4;
913
+ p([
914
+ [s + e, c],
915
+ [s + a - e, c],
916
+ [s + a, c + e],
917
+ [s + a, c + o - e],
918
+ [s + a - e, c + o],
919
+ [s + e, c + o],
920
+ [s, c + o - e],
921
+ [s, c + e]
922
+ ]);
923
+ break;
924
+ }
925
+ case "lean-r":
926
+ case "lean-l": {
927
+ let e = o / 2, n = t.shape === "lean-r";
928
+ p([
929
+ [n ? s + e : s, c],
930
+ [n ? s + a : s + a - e, c],
931
+ [n ? s + a - e : s + a, c + o],
932
+ [n ? s : s + e, c + o]
933
+ ]);
934
+ break;
935
+ }
936
+ case "trap-b":
937
+ case "trap-t": {
938
+ let e = o * .35, n = t.shape === "trap-b";
939
+ p([
940
+ [n ? s + e : s, c],
941
+ [n ? s + a - e : s + a, c],
942
+ [n ? s + a : s + a - e, c + o],
943
+ [n ? s : s + e, c + o]
944
+ ]);
945
+ break;
946
+ }
947
+ case "flag": {
948
+ let e = o / 3;
949
+ p([
950
+ [s, c],
951
+ [s + a, c],
952
+ [s + a, c + o],
953
+ [s, c + o],
954
+ [s + e, i]
955
+ ]), f(r + e / 2);
956
+ return;
957
+ }
958
+ case "note":
959
+ p([
960
+ [s, c],
961
+ [s + a - 10, c],
962
+ [s + a, c + 10],
963
+ [s + a, c + o],
964
+ [s, c + o]
965
+ ]), e.poly([
966
+ [s + a - 10, c],
967
+ [s + a - 10, c + 10],
968
+ [s + a, c + 10]
969
+ ], {
970
+ ...l,
971
+ fill: "none"
972
+ }, !1);
973
+ break;
974
+ case "folder":
975
+ e.rect(s, c, Math.min(a * .4, 40), 10, l, 2).rect(s, c + 8, a, o - 8, l), f(r, i + 4);
976
+ return;
977
+ case "box3d":
978
+ p([
979
+ [s, c + 8],
980
+ [s + 8, c],
981
+ [s + a, c],
982
+ [s + a, c + o - 8],
983
+ [s + a - 8, c + o],
984
+ [s, c + o]
985
+ ]), e.poly([
986
+ [s, c + 8],
987
+ [s + a - 8, c + 8],
988
+ [s + a, c]
989
+ ], {
990
+ ...l,
991
+ fill: "none"
992
+ }, !1).line(s + a - 8, c + 8, s + a - 8, c + o, l), f(r - 4, i + 4);
993
+ return;
994
+ case "cloud":
995
+ e.rect(s, c, a, o, l, Math.min(o / 2, 20));
996
+ break;
997
+ case "triangle":
998
+ p([
999
+ [r, c],
1000
+ [s + a, c + o],
1001
+ [s, c + o]
1002
+ ]), f(r, i + o / 6);
1003
+ return;
1004
+ case "actor": {
1005
+ let i = {
1006
+ fill: "none",
1007
+ stroke: t.style?.stroke ?? u.dark,
1008
+ sw: 1.5
1009
+ }, a = c + 2;
1010
+ e.circle(r, a + 7, 7, {
1011
+ ...i,
1012
+ fill: t.style?.fill ?? u.fill
1013
+ }), e.line(r, a + 14, r, a + 28, i).line(r - 11, a + 19, r + 11, a + 19, i), e.line(r, a + 28, r - 9, a + 40, i).line(r, a + 28, r + 9, a + 40, i), e.text(r, a + 44 + n.text.length * S / 2, n.text, {
1014
+ anchor: "middle",
1015
+ color: d
1016
+ });
1017
+ return;
1018
+ }
1019
+ default:
1020
+ if (t.sections?.length) return ee(e, t, s, c, a);
1021
+ e.rect(s, c, a, o, l);
1022
+ }
1023
+ f();
1024
+ }
1025
+ function ee(e, t, n, r, a) {
1026
+ let o = D(t), s = t.sections.map(T), c = s.reduce((e, t) => e + t.h, 0);
1027
+ e.rect(n, r, a, c, o, t.shape === "round" ? 6 : 0);
1028
+ let l = r;
1029
+ t.sections.forEach((r, c) => {
1030
+ c && e.line(n, l, n + a, l, {
1031
+ stroke: o.stroke,
1032
+ sw: 1
1033
+ });
1034
+ let u = i(y);
1035
+ r.rows.forEach((i, o) => {
1036
+ let d = l + 5 + o * u + u / 2;
1037
+ if (r.center || i.length === 1 && c === 0) {
1038
+ e.text(n + a / 2, d, i.join(" "), {
1039
+ anchor: "middle",
1040
+ size: y,
1041
+ bold: r.bold,
1042
+ italic: r.italic,
1043
+ color: t.style?.color
1044
+ });
1045
+ return;
1046
+ }
1047
+ let f = n + b;
1048
+ i.forEach((n, i) => {
1049
+ e.text(f, d, n, {
1050
+ size: y,
1051
+ bold: r.bold,
1052
+ italic: r.italic,
1053
+ color: t.style?.color
1054
+ }), f += s[c].cols[i] + 12;
1055
+ });
1056
+ }), l += s[c].h;
1057
+ });
1058
+ }
1059
+ var k = {
1060
+ arrow: 10,
1061
+ triangle: 13,
1062
+ diamond: 15,
1063
+ odiamond: 15,
1064
+ circle: 8,
1065
+ ocircle: 8
1066
+ };
1067
+ function A(e, t) {
1068
+ let n = t.x - e.x, r = t.y - e.y, i = Math.hypot(n, r) || 1;
1069
+ return {
1070
+ x: n / i,
1071
+ y: r / i
1072
+ };
1073
+ }
1074
+ function te(e, t, n, r, i) {
1075
+ let a = -r.y, o = r.x, s = (e, t) => [n.x - r.x * e + a * t, n.y - r.y * e + o * t], c = (t, n) => e.line(t[0], t[1], n[0], n[1], {
1076
+ stroke: i,
1077
+ sw: 1.3
1078
+ });
1079
+ switch (t) {
1080
+ case "arrow":
1081
+ e.poly([
1082
+ s(0, 0),
1083
+ s(10, 4.5),
1084
+ s(10, -4.5)
1085
+ ], {
1086
+ fill: i,
1087
+ stroke: i,
1088
+ sw: 1
1089
+ });
1090
+ break;
1091
+ case "open":
1092
+ e.poly([
1093
+ s(10, 5),
1094
+ s(0, 0),
1095
+ s(10, -5)
1096
+ ], {
1097
+ stroke: i,
1098
+ sw: 1.4
1099
+ }, !1);
1100
+ break;
1101
+ case "triangle":
1102
+ e.poly([
1103
+ s(0, 0),
1104
+ s(13, 7),
1105
+ s(13, -7)
1106
+ ], {
1107
+ fill: "#ffffff",
1108
+ stroke: i,
1109
+ sw: 1.2
1110
+ });
1111
+ break;
1112
+ case "diamond":
1113
+ case "odiamond":
1114
+ e.poly([
1115
+ s(0, 0),
1116
+ s(7.5, 5),
1117
+ s(15, 0),
1118
+ s(7.5, -5)
1119
+ ], {
1120
+ fill: t === "diamond" ? i : "#ffffff",
1121
+ stroke: i,
1122
+ sw: 1.2
1123
+ });
1124
+ break;
1125
+ case "circle":
1126
+ case "ocircle": {
1127
+ let [n, r] = s(4, 0);
1128
+ e.circle(n, r, 4, {
1129
+ fill: t === "circle" ? i : "#ffffff",
1130
+ stroke: i,
1131
+ sw: 1.2
1132
+ });
1133
+ break;
1134
+ }
1135
+ case "cross":
1136
+ c(s(1, 5), s(11, -5)), c(s(1, -5), s(11, 5));
1137
+ break;
1138
+ case "one":
1139
+ case "zero-one":
1140
+ case "one-many":
1141
+ case "zero-many":
1142
+ case "many": {
1143
+ let n = t.endsWith("many");
1144
+ if (n && (c(s(0, 7), s(12, 0)), c(s(0, -7), s(12, 0))), (t === "one" || t === "one-many") && c(s(n ? 16 : 7, 6), s(n ? 16 : 7, -6)), t === "one" && c(s(12, 6), s(12, -6)), t === "zero-one" || t === "zero-many") {
1145
+ let [t, r] = s(n ? 20 : 17, 0);
1146
+ e.circle(t, r, 4.5, {
1147
+ fill: "#ffffff",
1148
+ stroke: i,
1149
+ sw: 1.2
1150
+ });
1151
+ }
1152
+ t === "zero-one" && c(s(7, 6), s(7, -6));
1153
+ break;
1154
+ }
1155
+ }
1156
+ }
1157
+ function ne(e, t, n) {
1158
+ let r = t[t.length - 1], i = r.p[r.p.length - 1], a = A(r.c === "C" ? r.p[1] : t.length > 1 ? t[t.length - 2].p[t[t.length - 2].p.length - 1] : e, i);
1159
+ if (n) {
1160
+ let e = {
1161
+ x: i.x - a.x * n,
1162
+ y: i.y - a.y * n
1163
+ };
1164
+ r.p[r.p.length - 1] = e, r.c === "C" && (r.p[1] = {
1165
+ x: r.p[1].x - a.x * Math.min(n, 6),
1166
+ y: r.p[1].y - a.y * Math.min(n, 6)
1167
+ });
1168
+ }
1169
+ return a;
1170
+ }
1171
+ function re(e) {
1172
+ return e.color ?? u.line;
1173
+ }
1174
+ var j = 16, ie = 3e3, M = 6e3;
1175
+ function N(t) {
1176
+ if (!t.nodes.length) throw new g("The diagram has no nodes");
1177
+ if (t.nodes.length > ie || t.edges.length > M) throw new g(`The diagram is too large to draw (${t.nodes.length} nodes, ${t.edges.length} edges)`);
1178
+ let n = t.dir, o = n === "TB" || n === "BT", s = new p(), c = new Map(t.clusters.map((e, t) => [e.id, t])), l = new Map(t.nodes.map((e, t) => [e.id, t])), d = (e) => t.clusters[e].parent === void 0 ? -1 : c.get(t.clusters[e].parent) ?? -1, f = (e, n) => {
1179
+ for (let r = t.nodes[e].cluster === void 0 ? -1 : c.get(t.nodes[e].cluster) ?? -1; r >= 0; r = d(r)) if (r === n) return !0;
1180
+ return !1;
1181
+ }, h = (e, n) => {
1182
+ let r = l.get(e);
1183
+ if (r !== void 0) return r;
1184
+ let i = c.get(e);
1185
+ if (i === void 0) return -1;
1186
+ if (!n) return t.nodes.findIndex((e, t) => f(t, i));
1187
+ for (let e = t.nodes.length - 1; e >= 0; e--) if (f(e, i)) return e;
1188
+ return -1;
1189
+ }, _ = t.nodes.map((e) => E(e, n)), v = t.edges.map((e) => ({
1190
+ e,
1191
+ v: h(e.from, !0),
1192
+ w: h(e.to, !1),
1193
+ cv: l.has(e.from) ? -1 : c.get(e.from) ?? -1,
1194
+ cw: l.has(e.to) ? -1 : c.get(e.to) ?? -1
1195
+ })).filter((e) => e.v >= 0 && e.w >= 0), b = v.some((e) => e.e.label), x = (e) => e ? a(C(e), y) : void 0, S = /* @__PURE__ */ new Map();
1196
+ for (let { e, v: t, w: n } of v) {
1197
+ if (t !== n) continue;
1198
+ let r = x(e.label);
1199
+ S.set(t, Math.max(S.get(t) ?? 0, 40 + (r ? (o ? r.w : r.h) + 6 : 0)));
1200
+ }
1201
+ let w = t.nodes.map((e, t) => {
1202
+ let n = _[t], r = e.cluster === void 0 ? -1 : c.get(e.cluster) ?? -1, i = !!e.sections?.length || F.has(e.shape);
1203
+ return o ? {
1204
+ w: n.w,
1205
+ h: n.h,
1206
+ cluster: r,
1207
+ loop: S.get(t),
1208
+ spread: i
1209
+ } : {
1210
+ w: n.h,
1211
+ h: n.w,
1212
+ cluster: r,
1213
+ loop: S.get(t),
1214
+ spread: i
1215
+ };
1216
+ }), T = v.map(({ e, v: t, w: n }) => {
1217
+ let r = x(e.label), i = r ? {
1218
+ w: r.w + 8,
1219
+ h: r.h + 4
1220
+ } : void 0;
1221
+ return {
1222
+ v: t,
1223
+ w: n,
1224
+ minlen: (e.minlen ?? 1) * (b ? 2 : 1),
1225
+ weight: 1,
1226
+ label: i ? o ? i : {
1227
+ w: i.h,
1228
+ h: i.w
1229
+ } : void 0
1230
+ };
1231
+ }), D = t.clusters.map((e, t) => {
1232
+ let r = e.label ? a(C(e.label), y, !0) : {
1233
+ w: 0,
1234
+ h: 0
1235
+ }, i = 12 + (e.label ? r.h + 6 : 0), s = n === "TB" ? [
1236
+ 12,
1237
+ 12,
1238
+ i,
1239
+ 12
1240
+ ] : n === "BT" ? [
1241
+ 12,
1242
+ 12,
1243
+ 12,
1244
+ i
1245
+ ] : [
1246
+ i,
1247
+ 12,
1248
+ 12,
1249
+ 12
1250
+ ];
1251
+ return {
1252
+ parent: d(t),
1253
+ pad: s,
1254
+ minW: o ? r.w + 24 : r.h + i + 12
1255
+ };
1256
+ }), ee = t.sameRank?.map((e) => e.map((e) => l.get(e)).filter((e) => e !== void 0)).filter((e) => e.length > 1), N = e(w, T, D, {
1257
+ nodesep: o ? 40 : 28,
1258
+ ranksep: (o ? 50 : 60) / (b ? 2 : 1),
1259
+ edgesep: 14,
1260
+ sameRank: ee
1261
+ }), R = t.title ? 32 : 0, z = N.w, B = N.h, V = (e) => {
1262
+ let t = n === "TB" ? e : n === "BT" ? {
1263
+ x: e.x,
1264
+ y: B - e.y
1265
+ } : n === "LR" ? {
1266
+ x: e.y,
1267
+ y: e.x
1268
+ } : {
1269
+ x: B - e.y,
1270
+ y: e.x
1271
+ };
1272
+ return {
1273
+ x: t.x + j,
1274
+ y: t.y + j + R
1275
+ };
1276
+ }, H = (o ? z : B) + 32, U = (o ? B : z) + 32 + R, W = (e) => {
1277
+ let t = 0;
1278
+ for (let n = d(e); n >= 0; n = d(n)) t++;
1279
+ return t;
1280
+ }, ae = t.clusters.map((e, t) => t).sort((e, t) => W(e) - W(t)), G = t.clusters.map(() => null), oe = [];
1281
+ for (let e of ae) {
1282
+ let r = N.clusters[e];
1283
+ if (!r) continue;
1284
+ let a = t.clusters[e], o = V({
1285
+ x: r.x,
1286
+ y: r.y
1287
+ }), c = V({
1288
+ x: r.x + r.w,
1289
+ y: r.y + r.h
1290
+ }), l = Math.min(o.x, c.x), d = Math.min(o.y, c.y), f = Math.abs(c.x - o.x), p = Math.abs(c.y - o.y), m = a.style ?? {};
1291
+ if (G[e] = {
1292
+ x: l,
1293
+ y: d,
1294
+ w: f,
1295
+ h: p
1296
+ }, s.rect(l, d, f, p, {
1297
+ fill: m.fill ?? u.cluster,
1298
+ stroke: m.stroke ?? u.clusterStroke,
1299
+ sw: m.sw ?? 1,
1300
+ dash: m.dash
1301
+ }, 4), a.label) {
1302
+ let e = C(a.label), t = n === "BT" ? d + p - 8 - e.length * i(y) / 2 : d + 8 + e.length * i(y) / 2;
1303
+ oe.push({
1304
+ x: l + f / 2,
1305
+ y: t,
1306
+ text: e,
1307
+ color: m.color ?? u.ink,
1308
+ bg: m.fill && m.fill !== "none" ? m.fill : u.cluster
1309
+ });
1310
+ }
1311
+ }
1312
+ let K = [];
1313
+ v.forEach(({ e, v: t }, n) => {
1314
+ if (e.line === "hidden") return;
1315
+ let r = re(e), i = {
1316
+ stroke: r,
1317
+ sw: e.sw ?? (e.line === "thick" ? 3 : 1.4),
1318
+ dash: e.line === "dashed" ? "6 4" : e.line === "dotted" ? "2 3" : void 0
1319
+ }, c = N.edges[n];
1320
+ if (!c) {
1321
+ if (v[n].v !== v[n].w) return;
1322
+ let c = V(N.nodes[t]), l = _[t], u, d, f, p, h;
1323
+ o ? (u = {
1324
+ x: c.x + l.w / 2,
1325
+ y: c.y - l.h / 4
1326
+ }, p = {
1327
+ x: c.x + l.w / 2,
1328
+ y: c.y + l.h / 4
1329
+ }, d = {
1330
+ x: u.x + 34,
1331
+ y: u.y - 12
1332
+ }, f = {
1333
+ x: p.x + 34,
1334
+ y: p.y + 12
1335
+ }, h = {
1336
+ x: c.x + l.w / 2 + 34,
1337
+ y: c.y
1338
+ }) : (u = {
1339
+ x: c.x - l.w / 4,
1340
+ y: c.y + l.h / 2
1341
+ }, p = {
1342
+ x: c.x + l.w / 4,
1343
+ y: c.y + l.h / 2
1344
+ }, d = {
1345
+ x: u.x - 12,
1346
+ y: u.y + 34
1347
+ }, f = {
1348
+ x: p.x + 12,
1349
+ y: p.y + 34
1350
+ }, h = {
1351
+ x: c.x,
1352
+ y: c.y + l.h / 2 + 34
1353
+ });
1354
+ let g = [{
1355
+ c: "C",
1356
+ p: [
1357
+ d,
1358
+ f,
1359
+ p
1360
+ ]
1361
+ }], b = e.head ?? "arrow", x = ne(u, g, k[b] ?? 0);
1362
+ if (s.path(m([{
1363
+ c: "M",
1364
+ p: [u]
1365
+ }, ...g.map((e) => ({
1366
+ c: e.c,
1367
+ p: e.p
1368
+ }))]), i), te(s, b, p, x, r), e.label) {
1369
+ let t = a(C(e.label), y);
1370
+ K.push({
1371
+ p: o ? {
1372
+ x: h.x + t.w / 2 + 4,
1373
+ y: h.y
1374
+ } : {
1375
+ x: h.x,
1376
+ y: h.y + t.h / 2 + 4
1377
+ },
1378
+ text: C(e.label)
1379
+ });
1380
+ }
1381
+ return;
1382
+ }
1383
+ let l = {
1384
+ start: V(c.start),
1385
+ segs: c.segs.map((e) => ({
1386
+ c: e.c,
1387
+ p: e.p.map(V)
1388
+ })),
1389
+ label: c.label && V(c.label)
1390
+ }, { cv: u, cw: d } = v[n];
1391
+ if (u >= 0 && !f(v[n].w, u) || d >= 0 && !f(v[n].v, d)) {
1392
+ let e = I(l.start, l.segs);
1393
+ u >= 0 && G[u] && (e = L(e, G[u], !0)), d >= 0 && G[d] && (e = L(e, G[d], !1)), e.length > 1 && (l = {
1394
+ start: e[0],
1395
+ segs: e.slice(1).map((e) => ({
1396
+ c: "L",
1397
+ p: [e]
1398
+ })),
1399
+ label: l.label
1400
+ });
1401
+ }
1402
+ let p = e.head ?? "none", h = e.tail ?? "none", g = l.segs[l.segs.length - 1].p[l.segs[l.segs.length - 1].p.length - 1], b = ne(l.start, l.segs, k[p] ?? 0), x = l.segs[0], S = A((x.c, x.p[0]), l.start), w = l.start, T = k[h] ?? 0, E = T ? {
1403
+ x: l.start.x - S.x * T,
1404
+ y: l.start.y - S.y * T
1405
+ } : l.start;
1406
+ if (T && x.c === "C" && (x.p[0] = {
1407
+ x: x.p[0].x - S.x * Math.min(T, 6),
1408
+ y: x.p[0].y - S.y * Math.min(T, 6)
1409
+ }), s.path(m([{
1410
+ c: "M",
1411
+ p: [E]
1412
+ }, ...l.segs.map((e) => ({
1413
+ c: e.c,
1414
+ p: e.p
1415
+ }))]), i), p !== "none" && te(s, p, g, b, r), h !== "none" && te(s, h, w, S, r), e.label) {
1416
+ let t = l.label ?? P(l.start, g);
1417
+ K.push({
1418
+ p: t,
1419
+ text: C(e.label)
1420
+ });
1421
+ }
1422
+ let D = (e, t, n) => {
1423
+ let r = a(C(n), y), i = -t.y, o = t.x, s = Math.abs(i) * (r.w / 2 + 5) + Math.abs(o) * (r.h / 2 + 3);
1424
+ K.push({
1425
+ p: {
1426
+ x: e.x - t.x * (16 + r.h / 2) + i * s,
1427
+ y: e.y - t.y * (14 + r.h / 2) + o * s
1428
+ },
1429
+ text: C(n),
1430
+ plain: !0
1431
+ });
1432
+ };
1433
+ e.headLabel && D(g, b, e.headLabel), e.tailLabel && D(w, S, e.tailLabel);
1434
+ });
1435
+ for (let e of oe) {
1436
+ let t = a(e.text, y, !0);
1437
+ s.rect(e.x - t.w / 2 - 4, e.y - t.h / 2 - 1, t.w + 8, t.h + 2, { fill: e.bg }, 2), s.text(e.x, e.y, e.text, {
1438
+ anchor: "middle",
1439
+ size: y,
1440
+ bold: !0,
1441
+ color: e.color
1442
+ });
1443
+ }
1444
+ t.nodes.forEach((e, t) => {
1445
+ if (e.style?.hidden) return;
1446
+ let n = V(N.nodes[t]);
1447
+ O(s, e, _[t], n.x, n.y);
1448
+ });
1449
+ for (let e of K) {
1450
+ let t = a(e.text, y);
1451
+ e.plain || s.rect(e.p.x - t.w / 2 - 3, e.p.y - t.h / 2 - 1, t.w + 6, t.h + 2, {
1452
+ fill: u.label,
1453
+ opacity: .92
1454
+ }, 2), s.text(e.p.x, e.p.y, e.text, {
1455
+ anchor: "middle",
1456
+ size: y,
1457
+ color: e.color ?? u.ink
1458
+ });
1459
+ }
1460
+ return t.title && (H = Math.max(H, r(t.title, 16, !0) + 32), s.text(H / 2, 27, t.title, {
1461
+ anchor: "middle",
1462
+ size: 16,
1463
+ bold: !0
1464
+ })), {
1465
+ svg: s.toString(H, U),
1466
+ w: Math.ceil(H),
1467
+ h: Math.ceil(U)
1468
+ };
1469
+ }
1470
+ var P = (e, t) => ({
1471
+ x: (e.x + t.x) / 2,
1472
+ y: (e.y + t.y) / 2
1473
+ }), F = /* @__PURE__ */ new Set([
1474
+ "rect",
1475
+ "round",
1476
+ "subroutine",
1477
+ "component",
1478
+ "note",
1479
+ "folder",
1480
+ "box3d",
1481
+ "cylinder",
1482
+ "stadium",
1483
+ "cloud"
1484
+ ]);
1485
+ function I(e, t) {
1486
+ let n = [e], r = e;
1487
+ for (let e of t) {
1488
+ if (e.c === "L") n.push(e.p[0]);
1489
+ else {
1490
+ let [t, i, a] = e.p;
1491
+ for (let e = 1; e <= 12; e++) {
1492
+ let o = e / 12, s = 1 - o;
1493
+ n.push({
1494
+ x: s * s * s * r.x + 3 * s * s * o * t.x + 3 * s * o * o * i.x + o * o * o * a.x,
1495
+ y: s * s * s * r.y + 3 * s * s * o * t.y + 3 * s * o * o * i.y + o * o * o * a.y
1496
+ });
1497
+ }
1498
+ }
1499
+ r = n[n.length - 1];
1500
+ }
1501
+ return n;
1502
+ }
1503
+ function L(e, t, n) {
1504
+ let r = (e) => e.x > t.x && e.x < t.x + t.w && e.y > t.y && e.y < t.y + t.h, i = n ? e : [...e].reverse(), a = i.findIndex((e) => !r(e));
1505
+ if (a <= 0) return e;
1506
+ let o = i[a - 1], s = i[a], c = 1, l = s.x - o.x, u = s.y - o.y;
1507
+ l > 0 && (c = Math.min(c, (t.x + t.w - o.x) / l)), l < 0 && (c = Math.min(c, (t.x - o.x) / l)), u > 0 && (c = Math.min(c, (t.y + t.h - o.y) / u)), u < 0 && (c = Math.min(c, (t.y - o.y) / u));
1508
+ let d = [{
1509
+ x: o.x + l * c,
1510
+ y: o.y + u * c
1511
+ }, ...i.slice(a)];
1512
+ return n ? d : d.reverse();
1513
+ }
1514
+ // src/core/diagram/dot.ts
1515
+ function R(e) {
1516
+ let t = [], n = e.length, r = 0, i = !0;
1517
+ for (; r < n;) {
1518
+ let a = e[r];
1519
+ if (a === "\n") {
1520
+ i = !0, r++;
1521
+ continue;
1522
+ }
1523
+ if (a === " " || a === " " || a === "\r" || a === "") {
1524
+ r++;
1525
+ continue;
1526
+ }
1527
+ if (i && a === "#" || (i = !1, a === "/" && e[r + 1] === "/")) {
1528
+ for (; r < n && e[r] !== "\n";) r++;
1529
+ continue;
1530
+ }
1531
+ if (a === "/" && e[r + 1] === "*") {
1532
+ let t = e.indexOf("*/", r + 2);
1533
+ r = t < 0 ? n : t + 2;
1534
+ continue;
1535
+ }
1536
+ if (a === "\"") {
1537
+ let i = "";
1538
+ for (r++; r < n && e[r] !== "\"";) e[r] === "\\" && e[r + 1] === "\"" ? (i += "\"", r += 2) : e[r] === "\\" && e[r + 1] === "\n" ? r += 2 : i += e[r++];
1539
+ r++;
1540
+ let a = t[t.length - 1], o = t[t.length - 2];
1541
+ a?.t === "p" && a.v === "+" && o?.t === "str" ? (t.pop(), o.v += i) : t.push({
1542
+ t: "str",
1543
+ v: i
1544
+ });
1545
+ continue;
1546
+ }
1547
+ if (a === "<") {
1548
+ let i = 0, a = r;
1549
+ for (; r < n; r++) if (e[r] === "<") i++;
1550
+ else if (e[r] === ">" && --i === 0) break;
1551
+ t.push({
1552
+ t: "html",
1553
+ v: e.slice(a + 1, r)
1554
+ }), r++;
1555
+ continue;
1556
+ }
1557
+ if (a === "-" && (e[r + 1] === ">" || e[r + 1] === "-")) {
1558
+ t.push({
1559
+ t: "p",
1560
+ v: e.slice(r, r + 2)
1561
+ }), r += 2;
1562
+ continue;
1563
+ }
1564
+ if ("{}[]=;,:+".includes(a)) {
1565
+ t.push({
1566
+ t: "p",
1567
+ v: a
1568
+ }), r++;
1569
+ continue;
1570
+ }
1571
+ let o = /^(-?(?:\.\d+|\d+(?:\.\d*)?)|[A-Za-z_\u0080-￿][\w\u0080-￿]*)/.exec(e.slice(r, r + 256));
1572
+ o ? (t.push({
1573
+ t: "id",
1574
+ v: o[0]
1575
+ }), r += o[0].length) : r++;
1576
+ }
1577
+ return t;
1578
+ }
1579
+ var z = {
1580
+ box: "rect",
1581
+ rect: "rect",
1582
+ rectangle: "rect",
1583
+ square: "rect",
1584
+ msquare: "rect",
1585
+ ellipse: "ellipse",
1586
+ oval: "ellipse",
1587
+ egg: "ellipse",
1588
+ circle: "circle",
1589
+ doublecircle: "doublecircle",
1590
+ point: "point",
1591
+ plaintext: "none",
1592
+ plain: "none",
1593
+ none: "none",
1594
+ underline: "none",
1595
+ diamond: "diamond",
1596
+ mdiamond: "diamond",
1597
+ hexagon: "hexagon",
1598
+ octagon: "octagon",
1599
+ doubleoctagon: "octagon",
1600
+ tripleoctagon: "octagon",
1601
+ triangle: "triangle",
1602
+ invtriangle: "triangle",
1603
+ parallelogram: "lean-r",
1604
+ trapezium: "trap-b",
1605
+ invtrapezium: "trap-t",
1606
+ house: "trap-b",
1607
+ invhouse: "trap-t",
1608
+ cylinder: "cylinder",
1609
+ note: "note",
1610
+ tab: "folder",
1611
+ folder: "folder",
1612
+ box3d: "box3d",
1613
+ component: "component",
1614
+ cds: "flag",
1615
+ larrow: "flag",
1616
+ rarrow: "flag",
1617
+ lpromoter: "flag",
1618
+ rpromoter: "flag",
1619
+ star: "circle",
1620
+ record: "rect",
1621
+ mrecord: "round",
1622
+ underlinebox: "rect"
1623
+ }, B = {
1624
+ normal: "arrow",
1625
+ inv: "arrow",
1626
+ empty: "triangle",
1627
+ onormal: "triangle",
1628
+ invempty: "triangle",
1629
+ oinv: "triangle",
1630
+ vee: "open",
1631
+ open: "open",
1632
+ halfopen: "open",
1633
+ diamond: "diamond",
1634
+ odiamond: "odiamond",
1635
+ ediamond: "odiamond",
1636
+ box: "diamond",
1637
+ obox: "odiamond",
1638
+ dot: "circle",
1639
+ odot: "ocircle",
1640
+ invdot: "circle",
1641
+ invodot: "ocircle",
1642
+ none: "none",
1643
+ crow: "many",
1644
+ tee: "one",
1645
+ curve: "open",
1646
+ icurve: "open"
1647
+ };
1648
+ function V(e, t) {
1649
+ if (!e) return t;
1650
+ let n = e.toLowerCase().replace(/^[lr](?=[a-z])/, "");
1651
+ return B[n] ?? B[n.replace(/^o/, "")] ?? t;
1652
+ }
1653
+ function H(e) {
1654
+ if (!e) return;
1655
+ let t = e.split(/[:;]/)[0].trim(), n = /^([\d.]+)[ ,]+([\d.]+)[ ,]+([\d.]+)$/.exec(t);
1656
+ if (n) {
1657
+ let [e, t, r] = [
1658
+ Number(n[1]),
1659
+ Number(n[2]),
1660
+ Number(n[3])
1661
+ ], i = (n) => {
1662
+ let i = (n + e * 6) % 6;
1663
+ return Math.round((r - r * t * Math.max(0, Math.min(i, 4 - i, 1))) * 255);
1664
+ };
1665
+ return "#" + [
1666
+ i(5),
1667
+ i(3),
1668
+ i(1)
1669
+ ].map((e) => e.toString(16).padStart(2, "0")).join("");
1670
+ }
1671
+ let r = t.replace(/^\/\w+\//, "").toLowerCase(), i = /^gr[ae]y(\d{1,3})$/.exec(r);
1672
+ if (i) {
1673
+ let e = Math.round(Math.min(100, Number(i[1])) * 255 / 100).toString(16).padStart(2, "0");
1674
+ return `#${e}${e}${e}`;
1675
+ }
1676
+ return l(/^[a-z]+\d+$/.test(r) ? r.replace(/\d+$/, "") : r);
1677
+ }
1678
+ function U(e) {
1679
+ return h(e.replace(/<br\s*\/?>/gi, "\n").replace(/<\/tr>/gi, "\n").replace(/<\/td>\s*<td/gi, " <td").replace(/<[^>]+>/g, "").replace(/\n\s*\n/g, "\n")).split("\n").map((e) => e.trim()).filter(Boolean).join("\n");
1680
+ }
1681
+ function W(e, t, n = "") {
1682
+ return e.replace(/\\[nlr]/g, "\n").replace(/\\N/g, t).replace(/\\G/g, n).replace(/\\(.)/g, "$1").replace(/\n$/, "");
1683
+ }
1684
+ function ae(e, t) {
1685
+ return W(e, t).replace(/<[^>]*>/g, "").split(/[|{}]/).map((e) => e.trim()).filter(Boolean);
1686
+ }
1687
+ function G(e) {
1688
+ let t = R(e), n = 0, r = (e = 0) => t[n + e], i = (e, t = 0) => r(t)?.t === "p" && r(t).v === e, a = (e) => i(e) ? (n++, !0) : !1, o = (e) => r()?.t === "id" && r().v.toLowerCase() === e, s = [];
1689
+ for (; n < t.length;) {
1690
+ if (o("strict") && n++, !o("graph") && !o("digraph")) {
1691
+ n++;
1692
+ continue;
1693
+ }
1694
+ let e = r().v.toLowerCase() === "digraph";
1695
+ n++;
1696
+ let c = r()?.t === "p" ? "" : t[n++].v;
1697
+ if (!a("{")) throw new g("Graphviz: “{” expected after the graph name");
1698
+ let l = new _("TB", "ellipse"), u = /* @__PURE__ */ new Map(), d = [], f = [], p = 0, m = {}, h = /* @__PURE__ */ new Map(), v = () => {
1699
+ let e = {};
1700
+ for (; a("[");) {
1701
+ for (; n < t.length && !i("]");) {
1702
+ let r = t[n++];
1703
+ if (r.t !== "p") {
1704
+ if (a("=")) {
1705
+ let i = t[n++];
1706
+ i && (e[r.v.toLowerCase()] = i.t === "html" ? "<" + i.v + ">" : i.v);
1707
+ } else e[r.v.toLowerCase()] = "true";
1708
+ }
1709
+ }
1710
+ a("]");
1711
+ }
1712
+ return e;
1713
+ }, y = (e) => {
1714
+ let r = t[n++].v;
1715
+ for (; i(":");) n += 2;
1716
+ return u.has(r) ? e.cluster && l.get(r) && l.get(r).cluster === void 0 && (l.get(r).cluster = e.cluster) : (u.set(r, { ...e.node }), l.node(r, {}, e.cluster)), e.members.add(r), r;
1717
+ }, b = (e) => {
1718
+ for (; n < t.length && !i("}");) {
1719
+ if (a(";") || a(",")) continue;
1720
+ let s = r();
1721
+ if (s.t === "id" && [
1722
+ "graph",
1723
+ "node",
1724
+ "edge"
1725
+ ].includes(s.v.toLowerCase()) && i("[", 1)) {
1726
+ n++;
1727
+ let t = v(), r = s.v.toLowerCase();
1728
+ r === "node" ? Object.assign(e.node, t) : r === "edge" ? Object.assign(e.edge, t) : x(e, t);
1729
+ continue;
1730
+ }
1731
+ if (s.t !== "p" && i("=", 1)) {
1732
+ let r = s.v.toLowerCase();
1733
+ n += 2;
1734
+ let i = t[n++];
1735
+ x(e, { [r]: i ? i.t === "html" ? "<" + i.v + ">" : i.v : "" });
1736
+ continue;
1737
+ }
1738
+ let c = [];
1739
+ for (;;) {
1740
+ if (o("subgraph") || i("{")) c.push([...S(e)]);
1741
+ else if (r() && r().t !== "p") c.push([y(e)]);
1742
+ else {
1743
+ n++;
1744
+ break;
1745
+ }
1746
+ if (i("->") || i("--")) n++;
1747
+ else break;
1748
+ }
1749
+ let l = v();
1750
+ if (c.length === 1) {
1751
+ for (let e of c[0]) Object.keys(l).length && u.has(e) && Object.assign(u.get(e), l);
1752
+ continue;
1753
+ }
1754
+ let f = {
1755
+ ...e.edge,
1756
+ ...l
1757
+ };
1758
+ for (let e = 0; e + 1 < c.length; e++) for (let t of c[e]) for (let n of c[e + 1]) d.push({
1759
+ e: {
1760
+ from: t,
1761
+ to: n
1762
+ },
1763
+ attrs: f
1764
+ });
1765
+ }
1766
+ }, x = (e, t) => {
1767
+ e.cluster ? Object.assign(h.get(e.cluster), t) : e.name || Object.assign(m, t), t.rank && e.name !== void 0 && (e.rank = t.rank);
1768
+ }, S = (e) => {
1769
+ let i;
1770
+ o("subgraph") && (n++, r() && r().t !== "p" && (i = t[n++].v));
1771
+ let s = !!i && /^cluster/i.test(i), c = {
1772
+ node: { ...e.node },
1773
+ edge: { ...e.edge },
1774
+ cluster: e.cluster,
1775
+ members: /* @__PURE__ */ new Set(),
1776
+ name: i ?? `__anon${p++}`
1777
+ };
1778
+ if (s) {
1779
+ let t = `${i}`;
1780
+ l.cluster(t, "", e.cluster), h.set(t, {}), c.cluster = t;
1781
+ }
1782
+ a("{") && (b(c), a("}")), c.rank && /^(same|min|max|source|sink)$/.test(c.rank) && c.members.size > 1 && f.push([...c.members]);
1783
+ for (let t of c.members) e.members.add(t);
1784
+ return c.members;
1785
+ };
1786
+ b({
1787
+ node: {},
1788
+ edge: {},
1789
+ members: /* @__PURE__ */ new Set()
1790
+ }), a("}");
1791
+ let C = {
1792
+ LR: "LR",
1793
+ RL: "RL",
1794
+ BT: "BT",
1795
+ TB: "TB"
1796
+ }[(m.rankdir ?? "TB").toUpperCase()] ?? "TB";
1797
+ l.g.dir = C, m.label && (l.g.title = m.label.startsWith("<") ? U(m.label.slice(1, -1)) : W(m.label, "", c));
1798
+ for (let e of l.g.nodes) oe(e, u.get(e.id) ?? {});
1799
+ for (let e of l.g.clusters) {
1800
+ let t = h.get(e.id) ?? {};
1801
+ e.label = t.label ? t.label.startsWith("<") ? U(t.label.slice(1, -1)) : W(t.label, "", e.id) : "";
1802
+ let n = {}, r = (t.style ?? "").toLowerCase();
1803
+ r.includes("filled") ? n.fill = H(t.fillcolor ?? t.color ?? t.bgcolor) ?? "#d3d3d3" : t.bgcolor && (n.fill = H(t.bgcolor)), (t.color || t.pencolor) && (n.stroke = H(t.pencolor ?? t.color)), r.includes("dashed") && (n.dash = "6 4"), r.includes("dotted") && (n.dash = "2 3"), t.fontcolor && (n.color = H(t.fontcolor)), r.includes("invis") && (n.stroke = n.fill = "none"), e.style = n;
1804
+ }
1805
+ for (let { e: t, attrs: n } of d) l.g.edges.push(K(t, n, e));
1806
+ l.g.sameRank = f, s.push(l.g);
1807
+ }
1808
+ if (!s.length) throw new g("No “graph” or “digraph” found");
1809
+ return s;
1810
+ }
1811
+ function oe(e, t) {
1812
+ let n = (t.shape ?? "ellipse").toLowerCase();
1813
+ e.shape = z[n] ?? "ellipse";
1814
+ let r = t.label;
1815
+ if (r !== void 0) {
1816
+ if (r.startsWith("<") && r.endsWith(">")) e.label = U(r.slice(1, -1));
1817
+ else if (n === "record" || n === "mrecord") {
1818
+ let t = ae(r, e.id);
1819
+ e.label = t.join("\n"), t.length > 1 && (e.sections = t.map((e) => ({
1820
+ rows: [[e]],
1821
+ center: !0
1822
+ })));
1823
+ } else e.label = W(r, e.id);
1824
+ }
1825
+ e.shape === "point" && (e.label = "");
1826
+ let i = {}, a = (t.style ?? "").toLowerCase();
1827
+ a.includes("filled") || t.fillcolor ? i.fill = H(t.fillcolor ?? t.color) ?? "#d3d3d3" : e.shape !== "point" && (i.fill = "#ffffff"), i.stroke = t.color ? H(t.color) : "#000000", t.fontcolor && (i.color = H(t.fontcolor)), a.includes("dashed") && (i.dash = "6 4"), a.includes("dotted") && (i.dash = "2 3"), a.includes("bold") && (i.sw = 2.4), t.penwidth && (i.sw = Math.min(8, Number(t.penwidth) || 1)), a.includes("invis") && (i.hidden = !0), a.includes("rounded") && e.shape === "rect" && (e.shape = "round"), e.shape === "none" && (i.fill = void 0), e.style = i;
1828
+ }
1829
+ function K(e, t, n) {
1830
+ let r = (t.style ?? "").toLowerCase(), i = (t.dir ?? (n ? "forward" : "none")).toLowerCase(), a = V(t.arrowhead, "arrow"), o = V(t.arrowtail, "arrow");
1831
+ e.head = i === "forward" || i === "both" ? a : "none", e.tail = i === "back" || i === "both" ? o : "none";
1832
+ let s = t.label ?? t.xlabel;
1833
+ return s && (e.label = s.startsWith("<") && s.endsWith(">") ? U(s.slice(1, -1)) : W(s, "")), t.headlabel && (e.headLabel = W(t.headlabel, "")), t.taillabel && (e.tailLabel = W(t.taillabel, "")), e.line = r.includes("invis") ? "hidden" : r.includes("dashed") ? "dashed" : r.includes("dotted") ? "dotted" : r.includes("bold") ? "thick" : "solid", e.color = H(t.color) ?? "#000000", t.penwidth && (e.sw = Math.min(8, Number(t.penwidth) || 1)), t.minlen && (e.minlen = Math.max(1, Math.min(6, Math.round(Number(t.minlen)) || 1))), e;
1834
+ }
1835
+ function q(e) {
1836
+ return G(e).map(N);
1837
+ }
1838
+ // packages/diagram/src/dom.ts
1839
+ async function se(e, t = 2) {
1840
+ let n = (t) => Number(RegExp(`<svg[^>]*\\s${t}="([\\d.]+)"`).exec(e)?.[1] ?? 0), r = n("width"), i = n("height");
1841
+ if (!r || !i) throw Error("Not a picture with a size");
1842
+ let a = new Image();
1843
+ a.src = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(e)}`, await a.decode();
1844
+ let o = document.createElement("canvas");
1845
+ o.width = Math.max(1, Math.round(r * t)), o.height = Math.max(1, Math.round(i * t));
1846
+ let s = o.getContext("2d");
1847
+ if (!s) throw Error("No 2D canvas");
1848
+ return s.scale(t, t), s.drawImage(a, 0, 0, r, i), new Promise((e, t) => o.toBlob((n) => n ? e(n) : t(/* @__PURE__ */ Error("PNG export failed")), "image/png"));
1849
+ }
1850
+ function ce(e, t) {
1851
+ e.innerHTML = t.join("");
1852
+ }
1853
+ // packages/graphviz/src/index.ts
1854
+ var le = class extends Error {
1855
+ constructor(e) {
1856
+ super(e), this.name = "DiagramError";
1857
+ }
1858
+ };
1859
+ function J(e) {
1860
+ try {
1861
+ return q(e).map((e) => ({
1862
+ svg: e.svg,
1863
+ width: e.w,
1864
+ height: e.h
1865
+ }));
1866
+ } catch (e) {
1867
+ throw new le(e.message);
1868
+ }
1869
+ }
1870
+ function ue(e) {
1871
+ return J(e)[0];
1872
+ }
1873
+ function Y(e, t) {
1874
+ let n = J(t);
1875
+ return ce(e, n.map((e) => e.svg)), n;
1876
+ }
1877
+ function de(e, t = 2) {
1878
+ return se(e, t);
1879
+ }
1880
+ export { le as DiagramError, ue as render, J as renderEach, Y as renderTo, de as toPng };
1881
+
1882
+ //# sourceMappingURL=index.js.map