@avodado/render 0.1.0 → 0.1.2
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.d.ts +1 -1
- package/dist/index.js +2076 -382
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.js
CHANGED
|
@@ -14,8 +14,8 @@ html{scroll-behavior:smooth;}
|
|
|
14
14
|
--positive:#3f7d4e; --positive-soft:#e3efe2; --negative:#a13b2e; --negative-soft:#f4e0db;
|
|
15
15
|
--purple:#5b4a8a; --purple-soft:#ebe6f3; --teal:#2f6f6a; --teal-soft:#e0eeec; --white:#fcfbf7;
|
|
16
16
|
--radius:4px;
|
|
17
|
-
--font-display:"
|
|
18
|
-
--font-body:
|
|
17
|
+
--font-display:"Inter","SF Pro Display",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
|
|
18
|
+
--font-body:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
|
|
19
19
|
--font-mono:"SF Mono",ui-monospace,Menlo,Consolas,"Courier New",monospace;
|
|
20
20
|
}
|
|
21
21
|
body{background:var(--white);color:var(--charcoal);font-family:var(--font-body);font-size:15px;line-height:1.6;}
|
|
@@ -414,67 +414,1746 @@ function renderCallout(data) {
|
|
|
414
414
|
return `<div class="callout ${tone}"><div class="callout-title">${escapeHtml(title)}</div><div class="callout-body">${escapeHtml(body)}</div></div>`;
|
|
415
415
|
}
|
|
416
416
|
|
|
417
|
+
// ../../node_modules/.pnpm/@dagrejs+dagre@3.0.0/node_modules/@dagrejs/dagre/dist/dagre.esm.js
|
|
418
|
+
var ge = Object.defineProperty;
|
|
419
|
+
var hn = (e, n, t) => n in e ? ge(e, n, { enumerable: true, configurable: true, writable: true, value: t }) : e[n] = t;
|
|
420
|
+
var fn = (e, n) => {
|
|
421
|
+
for (var t in n) ge(e, t, { get: n[t], enumerable: true });
|
|
422
|
+
};
|
|
423
|
+
var pe = (e, n, t) => hn(e, n + "" , t);
|
|
424
|
+
var z = {};
|
|
425
|
+
fn(z, { Graph: () => p, alg: () => R, json: () => ye, version: () => pn });
|
|
426
|
+
var bn = Object.defineProperty;
|
|
427
|
+
var Le = (e, n) => {
|
|
428
|
+
for (var t in n) bn(e, t, { get: n[t], enumerable: true });
|
|
429
|
+
};
|
|
430
|
+
var p = class {
|
|
431
|
+
constructor(e) {
|
|
432
|
+
this._isDirected = true, this._isMultigraph = false, this._isCompound = false, this._nodes = {}, this._in = {}, this._preds = {}, this._out = {}, this._sucs = {}, this._edgeObjs = {}, this._edgeLabels = {}, this._nodeCount = 0, this._edgeCount = 0, this._defaultNodeLabelFn = () => {
|
|
433
|
+
}, this._defaultEdgeLabelFn = () => {
|
|
434
|
+
}, e && (this._isDirected = "directed" in e ? e.directed : true, this._isMultigraph = "multigraph" in e ? e.multigraph : false, this._isCompound = "compound" in e ? e.compound : false), this._isCompound && (this._parent = {}, this._children = {}, this._children["\0"] = {});
|
|
435
|
+
}
|
|
436
|
+
isDirected() {
|
|
437
|
+
return this._isDirected;
|
|
438
|
+
}
|
|
439
|
+
isMultigraph() {
|
|
440
|
+
return this._isMultigraph;
|
|
441
|
+
}
|
|
442
|
+
isCompound() {
|
|
443
|
+
return this._isCompound;
|
|
444
|
+
}
|
|
445
|
+
setGraph(e) {
|
|
446
|
+
return this._label = e, this;
|
|
447
|
+
}
|
|
448
|
+
graph() {
|
|
449
|
+
return this._label;
|
|
450
|
+
}
|
|
451
|
+
setDefaultNodeLabel(e) {
|
|
452
|
+
return typeof e != "function" ? this._defaultNodeLabelFn = () => e : this._defaultNodeLabelFn = e, this;
|
|
453
|
+
}
|
|
454
|
+
nodeCount() {
|
|
455
|
+
return this._nodeCount;
|
|
456
|
+
}
|
|
457
|
+
nodes() {
|
|
458
|
+
return Object.keys(this._nodes);
|
|
459
|
+
}
|
|
460
|
+
sources() {
|
|
461
|
+
return this.nodes().filter((e) => Object.keys(this._in[e]).length === 0);
|
|
462
|
+
}
|
|
463
|
+
sinks() {
|
|
464
|
+
return this.nodes().filter((e) => Object.keys(this._out[e]).length === 0);
|
|
465
|
+
}
|
|
466
|
+
setNodes(e, n) {
|
|
467
|
+
return e.forEach((t) => {
|
|
468
|
+
n !== void 0 ? this.setNode(t, n) : this.setNode(t);
|
|
469
|
+
}), this;
|
|
470
|
+
}
|
|
471
|
+
setNode(e, n) {
|
|
472
|
+
return e in this._nodes ? (arguments.length > 1 && (this._nodes[e] = n), this) : (this._nodes[e] = arguments.length > 1 ? n : this._defaultNodeLabelFn(e), this._isCompound && (this._parent[e] = "\0", this._children[e] = {}, this._children["\0"][e] = true), this._in[e] = {}, this._preds[e] = {}, this._out[e] = {}, this._sucs[e] = {}, ++this._nodeCount, this);
|
|
473
|
+
}
|
|
474
|
+
node(e) {
|
|
475
|
+
return this._nodes[e];
|
|
476
|
+
}
|
|
477
|
+
hasNode(e) {
|
|
478
|
+
return e in this._nodes;
|
|
479
|
+
}
|
|
480
|
+
removeNode(e) {
|
|
481
|
+
if (e in this._nodes) {
|
|
482
|
+
let n = (t) => this.removeEdge(this._edgeObjs[t]);
|
|
483
|
+
delete this._nodes[e], this._isCompound && (this._removeFromParentsChildList(e), delete this._parent[e], this.children(e).forEach((t) => {
|
|
484
|
+
this.setParent(t);
|
|
485
|
+
}), delete this._children[e]), Object.keys(this._in[e]).forEach(n), delete this._in[e], delete this._preds[e], Object.keys(this._out[e]).forEach(n), delete this._out[e], delete this._sucs[e], --this._nodeCount;
|
|
486
|
+
}
|
|
487
|
+
return this;
|
|
488
|
+
}
|
|
489
|
+
setParent(e, n) {
|
|
490
|
+
if (!this._isCompound) throw new Error("Cannot set parent in a non-compound graph");
|
|
491
|
+
if (n === void 0) n = "\0";
|
|
492
|
+
else {
|
|
493
|
+
n += "";
|
|
494
|
+
for (let t = n; t !== void 0; t = this.parent(t)) if (t === e) throw new Error("Setting " + n + " as parent of " + e + " would create a cycle");
|
|
495
|
+
this.setNode(n);
|
|
496
|
+
}
|
|
497
|
+
return this.setNode(e), this._removeFromParentsChildList(e), this._parent[e] = n, this._children[n][e] = true, this;
|
|
498
|
+
}
|
|
499
|
+
parent(e) {
|
|
500
|
+
if (this._isCompound) {
|
|
501
|
+
let n = this._parent[e];
|
|
502
|
+
if (n !== "\0") return n;
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
children(e = "\0") {
|
|
506
|
+
if (this._isCompound) {
|
|
507
|
+
let n = this._children[e];
|
|
508
|
+
if (n) return Object.keys(n);
|
|
509
|
+
} else {
|
|
510
|
+
if (e === "\0") return this.nodes();
|
|
511
|
+
if (this.hasNode(e)) return [];
|
|
512
|
+
}
|
|
513
|
+
return [];
|
|
514
|
+
}
|
|
515
|
+
predecessors(e) {
|
|
516
|
+
let n = this._preds[e];
|
|
517
|
+
if (n) return Object.keys(n);
|
|
518
|
+
}
|
|
519
|
+
successors(e) {
|
|
520
|
+
let n = this._sucs[e];
|
|
521
|
+
if (n) return Object.keys(n);
|
|
522
|
+
}
|
|
523
|
+
neighbors(e) {
|
|
524
|
+
let n = this.predecessors(e);
|
|
525
|
+
if (n) {
|
|
526
|
+
let t = new Set(n);
|
|
527
|
+
for (let r of this.successors(e)) t.add(r);
|
|
528
|
+
return Array.from(t.values());
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
isLeaf(e) {
|
|
532
|
+
let n;
|
|
533
|
+
return this.isDirected() ? n = this.successors(e) : n = this.neighbors(e), n.length === 0;
|
|
534
|
+
}
|
|
535
|
+
filterNodes(e) {
|
|
536
|
+
let n = new this.constructor({ directed: this._isDirected, multigraph: this._isMultigraph, compound: this._isCompound });
|
|
537
|
+
n.setGraph(this.graph()), Object.entries(this._nodes).forEach(([o, i]) => {
|
|
538
|
+
e(o) && n.setNode(o, i);
|
|
539
|
+
}), Object.values(this._edgeObjs).forEach((o) => {
|
|
540
|
+
n.hasNode(o.v) && n.hasNode(o.w) && n.setEdge(o, this.edge(o));
|
|
541
|
+
});
|
|
542
|
+
let t = {}, r = (o) => {
|
|
543
|
+
let i = this.parent(o);
|
|
544
|
+
return !i || n.hasNode(i) ? (t[o] = i != null ? i : void 0, i != null ? i : void 0) : i in t ? t[i] : r(i);
|
|
545
|
+
};
|
|
546
|
+
return this._isCompound && n.nodes().forEach((o) => n.setParent(o, r(o))), n;
|
|
547
|
+
}
|
|
548
|
+
setDefaultEdgeLabel(e) {
|
|
549
|
+
return typeof e != "function" ? this._defaultEdgeLabelFn = () => e : this._defaultEdgeLabelFn = e, this;
|
|
550
|
+
}
|
|
551
|
+
edgeCount() {
|
|
552
|
+
return this._edgeCount;
|
|
553
|
+
}
|
|
554
|
+
edges() {
|
|
555
|
+
return Object.values(this._edgeObjs);
|
|
556
|
+
}
|
|
557
|
+
setPath(e, n) {
|
|
558
|
+
return e.reduce((t, r) => (n !== void 0 ? this.setEdge(t, r, n) : this.setEdge(t, r), r)), this;
|
|
559
|
+
}
|
|
560
|
+
setEdge(e, n, t, r) {
|
|
561
|
+
let o, i, s, a, d = false;
|
|
562
|
+
typeof e == "object" && e !== null && "v" in e ? (o = e.v, i = e.w, s = e.name, arguments.length === 2 && (a = n, d = true)) : (o = e, i = n, s = r, arguments.length > 2 && (a = t, d = true)), o = "" + o, i = "" + i, s !== void 0 && (s = "" + s);
|
|
563
|
+
let l = C(this._isDirected, o, i, s);
|
|
564
|
+
if (l in this._edgeLabels) return d && (this._edgeLabels[l] = a), this;
|
|
565
|
+
if (s !== void 0 && !this._isMultigraph) throw new Error("Cannot set a named edge when isMultigraph = false");
|
|
566
|
+
this.setNode(o), this.setNode(i), this._edgeLabels[l] = d ? a : this._defaultEdgeLabelFn(o, i, s);
|
|
567
|
+
let u = gn(this._isDirected, o, i, s);
|
|
568
|
+
return o = u.v, i = u.w, Object.freeze(u), this._edgeObjs[l] = u, me(this._preds[i], o), me(this._sucs[o], i), this._in[i][l] = u, this._out[o][l] = u, this._edgeCount++, this;
|
|
569
|
+
}
|
|
570
|
+
edge(e, n, t) {
|
|
571
|
+
let r = arguments.length === 1 ? Y(this._isDirected, e) : C(this._isDirected, e, n, t);
|
|
572
|
+
return this._edgeLabels[r];
|
|
573
|
+
}
|
|
574
|
+
edgeAsObj(e, n, t) {
|
|
575
|
+
let r = arguments.length === 1 ? this.edge(e) : this.edge(e, n, t);
|
|
576
|
+
return typeof r != "object" ? { label: r } : r;
|
|
577
|
+
}
|
|
578
|
+
hasEdge(e, n, t) {
|
|
579
|
+
return (arguments.length === 1 ? Y(this._isDirected, e) : C(this._isDirected, e, n, t)) in this._edgeLabels;
|
|
580
|
+
}
|
|
581
|
+
removeEdge(e, n, t) {
|
|
582
|
+
let r = arguments.length === 1 ? Y(this._isDirected, e) : C(this._isDirected, e, n, t), o = this._edgeObjs[r];
|
|
583
|
+
if (o) {
|
|
584
|
+
let i = o.v, s = o.w;
|
|
585
|
+
delete this._edgeLabels[r], delete this._edgeObjs[r], Ee(this._preds[s], i), Ee(this._sucs[i], s), delete this._in[s][r], delete this._out[i][r], this._edgeCount--;
|
|
586
|
+
}
|
|
587
|
+
return this;
|
|
588
|
+
}
|
|
589
|
+
inEdges(e, n) {
|
|
590
|
+
return this.isDirected() ? this.filterEdges(this._in[e], e, n) : this.nodeEdges(e, n);
|
|
591
|
+
}
|
|
592
|
+
outEdges(e, n) {
|
|
593
|
+
return this.isDirected() ? this.filterEdges(this._out[e], e, n) : this.nodeEdges(e, n);
|
|
594
|
+
}
|
|
595
|
+
nodeEdges(e, n) {
|
|
596
|
+
if (e in this._nodes) return this.filterEdges({ ...this._in[e], ...this._out[e] }, e, n);
|
|
597
|
+
}
|
|
598
|
+
_removeFromParentsChildList(e) {
|
|
599
|
+
delete this._children[this._parent[e]][e];
|
|
600
|
+
}
|
|
601
|
+
filterEdges(e, n, t) {
|
|
602
|
+
if (!e) return;
|
|
603
|
+
let r = Object.values(e);
|
|
604
|
+
return t ? r.filter((o) => o.v === n && o.w === t || o.v === t && o.w === n) : r;
|
|
605
|
+
}
|
|
606
|
+
};
|
|
607
|
+
function me(e, n) {
|
|
608
|
+
e[n] ? e[n]++ : e[n] = 1;
|
|
609
|
+
}
|
|
610
|
+
function Ee(e, n) {
|
|
611
|
+
e[n] !== void 0 && !--e[n] && delete e[n];
|
|
612
|
+
}
|
|
613
|
+
function C(e, n, t, r) {
|
|
614
|
+
let o = "" + n, i = "" + t;
|
|
615
|
+
if (!e && o > i) {
|
|
616
|
+
let s = o;
|
|
617
|
+
o = i, i = s;
|
|
618
|
+
}
|
|
619
|
+
return o + "" + i + "" + (r === void 0 ? "\0" : r);
|
|
620
|
+
}
|
|
621
|
+
function gn(e, n, t, r) {
|
|
622
|
+
let o = "" + n, i = "" + t;
|
|
623
|
+
if (!e && o > i) {
|
|
624
|
+
let a = o;
|
|
625
|
+
o = i, i = a;
|
|
626
|
+
}
|
|
627
|
+
let s = { v: o, w: i };
|
|
628
|
+
return r && (s.name = r), s;
|
|
629
|
+
}
|
|
630
|
+
function Y(e, n) {
|
|
631
|
+
return C(e, n.v, n.w, n.name);
|
|
632
|
+
}
|
|
633
|
+
var pn = "4.0.1";
|
|
634
|
+
var ye = {};
|
|
635
|
+
Le(ye, { read: () => yn, write: () => mn });
|
|
636
|
+
function mn(e) {
|
|
637
|
+
let n = { options: { directed: e.isDirected(), multigraph: e.isMultigraph(), compound: e.isCompound() }, nodes: En(e), edges: Ln(e) }, t = e.graph();
|
|
638
|
+
return t !== void 0 && (n.value = structuredClone(t)), n;
|
|
639
|
+
}
|
|
640
|
+
function En(e) {
|
|
641
|
+
return e.nodes().map((n) => {
|
|
642
|
+
let t = e.node(n), r = e.parent(n), o = { v: n };
|
|
643
|
+
return t !== void 0 && (o.value = t), r !== void 0 && (o.parent = r), o;
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
function Ln(e) {
|
|
647
|
+
return e.edges().map((n) => {
|
|
648
|
+
let t = e.edge(n), r = { v: n.v, w: n.w };
|
|
649
|
+
return n.name !== void 0 && (r.name = n.name), t !== void 0 && (r.value = t), r;
|
|
650
|
+
});
|
|
651
|
+
}
|
|
652
|
+
function yn(e) {
|
|
653
|
+
let n = new p(e.options);
|
|
654
|
+
return e.value !== void 0 && n.setGraph(e.value), e.nodes.forEach((t) => {
|
|
655
|
+
n.setNode(t.v, t.value), t.parent && n.setParent(t.v, t.parent);
|
|
656
|
+
}), e.edges.forEach((t) => {
|
|
657
|
+
n.setEdge({ v: t.v, w: t.w, name: t.name }, t.value);
|
|
658
|
+
}), n;
|
|
659
|
+
}
|
|
660
|
+
var R = {};
|
|
661
|
+
Le(R, { CycleException: () => D, bellmanFord: () => we, components: () => Gn, dijkstra: () => F, dijkstraAll: () => _n, findCycles: () => xn, floydWarshall: () => On, isAcyclic: () => Cn, postorder: () => Pn, preorder: () => Mn, prim: () => jn, shortestPaths: () => Sn, tarjan: () => Ge, topsort: () => ke });
|
|
662
|
+
var wn = () => 1;
|
|
663
|
+
function we(e, n, t, r) {
|
|
664
|
+
return Nn(e, String(n), t || wn, r || function(o) {
|
|
665
|
+
return e.outEdges(o);
|
|
666
|
+
});
|
|
667
|
+
}
|
|
668
|
+
function Nn(e, n, t, r) {
|
|
669
|
+
let o = {}, i, s = 0, a = e.nodes(), d = function(c) {
|
|
670
|
+
let h = t(c);
|
|
671
|
+
o[c.v].distance + h < o[c.w].distance && (o[c.w] = { distance: o[c.v].distance + h, predecessor: c.v }, i = true);
|
|
672
|
+
}, l = function() {
|
|
673
|
+
a.forEach(function(c) {
|
|
674
|
+
r(c).forEach(function(h) {
|
|
675
|
+
let f = h.v === c ? h.v : h.w, g = f === h.v ? h.w : h.v;
|
|
676
|
+
d({ v: f, w: g });
|
|
677
|
+
});
|
|
678
|
+
});
|
|
679
|
+
};
|
|
680
|
+
a.forEach(function(c) {
|
|
681
|
+
let h = c === n ? 0 : Number.POSITIVE_INFINITY;
|
|
682
|
+
o[c] = { distance: h, predecessor: "" };
|
|
683
|
+
});
|
|
684
|
+
let u = a.length;
|
|
685
|
+
for (let c = 1; c < u && (i = false, s++, l(), !!i); c++) ;
|
|
686
|
+
if (s === u - 1 && (i = false, l(), i)) throw new Error("The graph contains a negative weight cycle");
|
|
687
|
+
return o;
|
|
688
|
+
}
|
|
689
|
+
function Gn(e) {
|
|
690
|
+
let n = {}, t = [], r;
|
|
691
|
+
function o(i) {
|
|
692
|
+
i in n || (n[i] = true, r.push(i), e.successors(i).forEach(o), e.predecessors(i).forEach(o));
|
|
693
|
+
}
|
|
694
|
+
return e.nodes().forEach(function(i) {
|
|
695
|
+
r = [], o(i), r.length && t.push(r);
|
|
696
|
+
}), t;
|
|
697
|
+
}
|
|
698
|
+
var Ne = class {
|
|
699
|
+
constructor() {
|
|
700
|
+
this._arr = [], this._keyIndices = {};
|
|
701
|
+
}
|
|
702
|
+
size() {
|
|
703
|
+
return this._arr.length;
|
|
704
|
+
}
|
|
705
|
+
keys() {
|
|
706
|
+
return this._arr.map((e) => e.key);
|
|
707
|
+
}
|
|
708
|
+
has(e) {
|
|
709
|
+
return e in this._keyIndices;
|
|
710
|
+
}
|
|
711
|
+
priority(e) {
|
|
712
|
+
let n = this._keyIndices[e];
|
|
713
|
+
if (n !== void 0) return this._arr[n].priority;
|
|
714
|
+
}
|
|
715
|
+
min() {
|
|
716
|
+
if (this.size() === 0) throw new Error("Queue underflow");
|
|
717
|
+
return this._arr[0].key;
|
|
718
|
+
}
|
|
719
|
+
add(e, n) {
|
|
720
|
+
let t = this._keyIndices, r = String(e);
|
|
721
|
+
if (!(r in t)) {
|
|
722
|
+
let o = this._arr, i = o.length;
|
|
723
|
+
return t[r] = i, o.push({ key: r, priority: n }), this._decrease(i), true;
|
|
724
|
+
}
|
|
725
|
+
return false;
|
|
726
|
+
}
|
|
727
|
+
removeMin() {
|
|
728
|
+
this._swap(0, this._arr.length - 1);
|
|
729
|
+
let e = this._arr.pop();
|
|
730
|
+
return delete this._keyIndices[e.key], this._heapify(0), e.key;
|
|
731
|
+
}
|
|
732
|
+
decrease(e, n) {
|
|
733
|
+
let t = this._keyIndices[e];
|
|
734
|
+
if (t === void 0) throw new Error(`Key not found: ${e}`);
|
|
735
|
+
let r = this._arr[t].priority;
|
|
736
|
+
if (n > r) throw new Error(`New priority is greater than current priority. Key: ${e} Old: ${r} New: ${n}`);
|
|
737
|
+
this._arr[t].priority = n, this._decrease(t);
|
|
738
|
+
}
|
|
739
|
+
_heapify(e) {
|
|
740
|
+
let n = this._arr, t = 2 * e, r = t + 1, o = e;
|
|
741
|
+
t < n.length && (o = n[t].priority < n[o].priority ? t : o, r < n.length && (o = n[r].priority < n[o].priority ? r : o), o !== e && (this._swap(e, o), this._heapify(o)));
|
|
742
|
+
}
|
|
743
|
+
_decrease(e) {
|
|
744
|
+
let n = this._arr, t = n[e].priority, r;
|
|
745
|
+
for (; e !== 0 && (r = e >> 1, !(n[r].priority < t)); ) this._swap(e, r), e = r;
|
|
746
|
+
}
|
|
747
|
+
_swap(e, n) {
|
|
748
|
+
let t = this._arr, r = this._keyIndices, o = t[e], i = t[n];
|
|
749
|
+
t[e] = i, t[n] = o, r[i.key] = e, r[o.key] = n;
|
|
750
|
+
}
|
|
751
|
+
};
|
|
752
|
+
var kn = () => 1;
|
|
753
|
+
function F(e, n, t, r) {
|
|
754
|
+
let o = function(i) {
|
|
755
|
+
return e.outEdges(i);
|
|
756
|
+
};
|
|
757
|
+
return vn(e, String(n), t || kn, r || o);
|
|
758
|
+
}
|
|
759
|
+
function vn(e, n, t, r) {
|
|
760
|
+
let o = {}, i = new Ne(), s, a, d = function(l) {
|
|
761
|
+
let u = l.v !== s ? l.v : l.w, c = o[u], h = t(l), f = a.distance + h;
|
|
762
|
+
if (h < 0) throw new Error("dijkstra does not allow negative edge weights. Bad edge: " + l + " Weight: " + h);
|
|
763
|
+
f < c.distance && (c.distance = f, c.predecessor = s, i.decrease(u, f));
|
|
764
|
+
};
|
|
765
|
+
for (e.nodes().forEach(function(l) {
|
|
766
|
+
let u = l === n ? 0 : Number.POSITIVE_INFINITY;
|
|
767
|
+
o[l] = { distance: u, predecessor: "" }, i.add(l, u);
|
|
768
|
+
}); i.size() > 0 && (s = i.removeMin(), a = o[s], a.distance !== Number.POSITIVE_INFINITY); ) r(s).forEach(d);
|
|
769
|
+
return o;
|
|
770
|
+
}
|
|
771
|
+
function _n(e, n, t) {
|
|
772
|
+
return e.nodes().reduce(function(r, o) {
|
|
773
|
+
return r[o] = F(e, o, n, t), r;
|
|
774
|
+
}, {});
|
|
775
|
+
}
|
|
776
|
+
function Ge(e) {
|
|
777
|
+
let n = 0, t = [], r = {}, o = [];
|
|
778
|
+
function i(s) {
|
|
779
|
+
let a = r[s] = { onStack: true, lowlink: n, index: n++ };
|
|
780
|
+
if (t.push(s), e.successors(s).forEach(function(d) {
|
|
781
|
+
d in r ? r[d].onStack && (a.lowlink = Math.min(a.lowlink, r[d].index)) : (i(d), a.lowlink = Math.min(a.lowlink, r[d].lowlink));
|
|
782
|
+
}), a.lowlink === a.index) {
|
|
783
|
+
let d = [], l;
|
|
784
|
+
do
|
|
785
|
+
l = t.pop(), r[l].onStack = false, d.push(l);
|
|
786
|
+
while (s !== l);
|
|
787
|
+
o.push(d);
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
return e.nodes().forEach(function(s) {
|
|
791
|
+
s in r || i(s);
|
|
792
|
+
}), o;
|
|
793
|
+
}
|
|
794
|
+
function xn(e) {
|
|
795
|
+
return Ge(e).filter(function(n) {
|
|
796
|
+
return n.length > 1 || n.length === 1 && e.hasEdge(n[0], n[0]);
|
|
797
|
+
});
|
|
798
|
+
}
|
|
799
|
+
var Tn = () => 1;
|
|
800
|
+
function On(e, n, t) {
|
|
801
|
+
return In(e, n || Tn, t || function(r) {
|
|
802
|
+
return e.outEdges(r);
|
|
803
|
+
});
|
|
804
|
+
}
|
|
805
|
+
function In(e, n, t) {
|
|
806
|
+
let r = {}, o = e.nodes();
|
|
807
|
+
return o.forEach(function(i) {
|
|
808
|
+
r[i] = {}, r[i][i] = { distance: 0, predecessor: "" }, o.forEach(function(s) {
|
|
809
|
+
i !== s && (r[i][s] = { distance: Number.POSITIVE_INFINITY, predecessor: "" });
|
|
810
|
+
}), t(i).forEach(function(s) {
|
|
811
|
+
let a = s.v === i ? s.w : s.v, d = n(s);
|
|
812
|
+
r[i][a] = { distance: d, predecessor: i };
|
|
813
|
+
});
|
|
814
|
+
}), o.forEach(function(i) {
|
|
815
|
+
let s = r[i];
|
|
816
|
+
o.forEach(function(a) {
|
|
817
|
+
let d = r[a];
|
|
818
|
+
o.forEach(function(l) {
|
|
819
|
+
let u = d[i], c = s[l], h = d[l], f = u.distance + c.distance;
|
|
820
|
+
f < h.distance && (h.distance = f, h.predecessor = c.predecessor);
|
|
821
|
+
});
|
|
822
|
+
});
|
|
823
|
+
}), r;
|
|
824
|
+
}
|
|
825
|
+
var D = class extends Error {
|
|
826
|
+
constructor(...e) {
|
|
827
|
+
super(...e);
|
|
828
|
+
}
|
|
829
|
+
};
|
|
830
|
+
function ke(e) {
|
|
831
|
+
let n = {}, t = {}, r = [];
|
|
832
|
+
function o(i) {
|
|
833
|
+
if (i in t) throw new D();
|
|
834
|
+
i in n || (t[i] = true, n[i] = true, e.predecessors(i).forEach(o), delete t[i], r.push(i));
|
|
835
|
+
}
|
|
836
|
+
if (e.sinks().forEach(o), Object.keys(n).length !== e.nodeCount()) throw new D();
|
|
837
|
+
return r;
|
|
838
|
+
}
|
|
839
|
+
function Cn(e) {
|
|
840
|
+
try {
|
|
841
|
+
ke(e);
|
|
842
|
+
} catch (n) {
|
|
843
|
+
if (n instanceof D) return false;
|
|
844
|
+
throw n;
|
|
845
|
+
}
|
|
846
|
+
return true;
|
|
847
|
+
}
|
|
848
|
+
function Rn(e, n, t, r, o) {
|
|
849
|
+
Array.isArray(n) || (n = [n]);
|
|
850
|
+
let i = ((a) => {
|
|
851
|
+
var d;
|
|
852
|
+
return (d = e.isDirected() ? e.successors(a) : e.neighbors(a)) != null ? d : [];
|
|
853
|
+
}), s = {};
|
|
854
|
+
return n.forEach(function(a) {
|
|
855
|
+
if (!e.hasNode(a)) throw new Error("Graph does not have node: " + a);
|
|
856
|
+
o = ve(e, a, t === "post", s, i, r, o);
|
|
857
|
+
}), o;
|
|
858
|
+
}
|
|
859
|
+
function ve(e, n, t, r, o, i, s) {
|
|
860
|
+
return n in r || (r[n] = true, t || (s = i(s, n)), o(n).forEach(function(a) {
|
|
861
|
+
s = ve(e, a, t, r, o, i, s);
|
|
862
|
+
}), t && (s = i(s, n))), s;
|
|
863
|
+
}
|
|
864
|
+
function _e(e, n, t) {
|
|
865
|
+
return Rn(e, n, t, function(r, o) {
|
|
866
|
+
return r.push(o), r;
|
|
867
|
+
}, []);
|
|
868
|
+
}
|
|
869
|
+
function Pn(e, n) {
|
|
870
|
+
return _e(e, n, "post");
|
|
871
|
+
}
|
|
872
|
+
function Mn(e, n) {
|
|
873
|
+
return _e(e, n, "pre");
|
|
874
|
+
}
|
|
875
|
+
function jn(e, n) {
|
|
876
|
+
let t = new p(), r = {}, o = new Ne(), i;
|
|
877
|
+
function s(d) {
|
|
878
|
+
let l = d.v === i ? d.w : d.v, u = o.priority(l);
|
|
879
|
+
if (u !== void 0) {
|
|
880
|
+
let c = n(d);
|
|
881
|
+
c < u && (r[l] = i, o.decrease(l, c));
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
if (e.nodeCount() === 0) return t;
|
|
885
|
+
e.nodes().forEach(function(d) {
|
|
886
|
+
o.add(d, Number.POSITIVE_INFINITY), t.setNode(d);
|
|
887
|
+
}), o.decrease(e.nodes()[0], 0);
|
|
888
|
+
let a = false;
|
|
889
|
+
for (; o.size() > 0; ) {
|
|
890
|
+
if (i = o.removeMin(), i in r) t.setEdge(i, r[i]);
|
|
891
|
+
else {
|
|
892
|
+
if (a) throw new Error("Input graph is not connected: " + e);
|
|
893
|
+
a = true;
|
|
894
|
+
}
|
|
895
|
+
e.nodeEdges(i).forEach(s);
|
|
896
|
+
}
|
|
897
|
+
return t;
|
|
898
|
+
}
|
|
899
|
+
function Sn(e, n, t, r) {
|
|
900
|
+
return Fn(e, n, t, r != null ? r : ((o) => {
|
|
901
|
+
let i = e.outEdges(o);
|
|
902
|
+
return i != null ? i : [];
|
|
903
|
+
}));
|
|
904
|
+
}
|
|
905
|
+
function Fn(e, n, t, r) {
|
|
906
|
+
if (t === void 0) return F(e, n, t, r);
|
|
907
|
+
let o = false, i = e.nodes();
|
|
908
|
+
for (let s = 0; s < i.length; s++) {
|
|
909
|
+
let a = r(i[s]);
|
|
910
|
+
for (let d = 0; d < a.length; d++) {
|
|
911
|
+
let l = a[d], u = l.v === i[s] ? l.v : l.w, c = u === l.v ? l.w : l.v;
|
|
912
|
+
t({ v: u, w: c }) < 0 && (o = true);
|
|
913
|
+
}
|
|
914
|
+
if (o) return we(e, n, t, r);
|
|
915
|
+
}
|
|
916
|
+
return F(e, n, t, r);
|
|
917
|
+
}
|
|
918
|
+
function w(e, n, t, r) {
|
|
919
|
+
let o = r;
|
|
920
|
+
for (; e.hasNode(o); ) o = j(r);
|
|
921
|
+
return t.dummy = n, e.setNode(o, t), o;
|
|
922
|
+
}
|
|
923
|
+
function xe(e) {
|
|
924
|
+
let n = new p().setGraph(e.graph());
|
|
925
|
+
return e.nodes().forEach((t) => n.setNode(t, e.node(t))), e.edges().forEach((t) => {
|
|
926
|
+
let r = n.edge(t.v, t.w) || { weight: 0, minlen: 1 }, o = e.edge(t);
|
|
927
|
+
n.setEdge(t.v, t.w, { weight: r.weight + o.weight, minlen: Math.max(r.minlen, o.minlen) });
|
|
928
|
+
}), n;
|
|
929
|
+
}
|
|
930
|
+
function A(e) {
|
|
931
|
+
let n = new p({ multigraph: e.isMultigraph() }).setGraph(e.graph());
|
|
932
|
+
return e.nodes().forEach((t) => {
|
|
933
|
+
e.children(t).length || n.setNode(t, e.node(t));
|
|
934
|
+
}), e.edges().forEach((t) => {
|
|
935
|
+
n.setEdge(t, e.edge(t));
|
|
936
|
+
}), n;
|
|
937
|
+
}
|
|
938
|
+
function H(e, n) {
|
|
939
|
+
let t = e.x, r = e.y, o = n.x - t, i = n.y - r, s = e.width / 2, a = e.height / 2;
|
|
940
|
+
if (!o && !i) throw new Error("Not possible to find intersection inside of the rectangle");
|
|
941
|
+
let d, l;
|
|
942
|
+
return Math.abs(i) * s > Math.abs(o) * a ? (i < 0 && (a = -a), d = a * o / i, l = a) : (o < 0 && (s = -s), d = s, l = s * i / o), { x: t + d, y: r + l };
|
|
943
|
+
}
|
|
944
|
+
function N(e) {
|
|
945
|
+
let n = k(X(e) + 1).map(() => []);
|
|
946
|
+
return e.nodes().forEach((t) => {
|
|
947
|
+
let r = e.node(t), o = r.rank;
|
|
948
|
+
o !== void 0 && (n[o] || (n[o] = []), n[o][r.order] = t);
|
|
949
|
+
}), n;
|
|
950
|
+
}
|
|
951
|
+
function Te(e) {
|
|
952
|
+
let n = e.nodes().map((r) => {
|
|
953
|
+
let o = e.node(r).rank;
|
|
954
|
+
return o === void 0 ? Number.MAX_VALUE : o;
|
|
955
|
+
}), t = L(Math.min, n);
|
|
956
|
+
e.nodes().forEach((r) => {
|
|
957
|
+
let o = e.node(r);
|
|
958
|
+
Object.hasOwn(o, "rank") && (o.rank -= t);
|
|
959
|
+
});
|
|
960
|
+
}
|
|
961
|
+
function Oe(e) {
|
|
962
|
+
let n = e.nodes().map((s) => e.node(s).rank).filter((s) => s !== void 0), t = L(Math.min, n), r = [];
|
|
963
|
+
e.nodes().forEach((s) => {
|
|
964
|
+
let a = e.node(s).rank - t;
|
|
965
|
+
r[a] || (r[a] = []), r[a].push(s);
|
|
966
|
+
});
|
|
967
|
+
let o = 0, i = e.graph().nodeRankFactor;
|
|
968
|
+
Array.from(r).forEach((s, a) => {
|
|
969
|
+
s === void 0 && a % i !== 0 ? --o : s !== void 0 && o && s.forEach((d) => e.node(d).rank += o);
|
|
970
|
+
});
|
|
971
|
+
}
|
|
972
|
+
function q(e, n, t, r) {
|
|
973
|
+
let o = { width: 0, height: 0 };
|
|
974
|
+
return arguments.length >= 4 && (o.rank = t, o.order = r), w(e, "border", o, n);
|
|
975
|
+
}
|
|
976
|
+
function Dn(e, n = Ie) {
|
|
977
|
+
let t = [];
|
|
978
|
+
for (let r = 0; r < e.length; r += n) {
|
|
979
|
+
let o = e.slice(r, r + n);
|
|
980
|
+
t.push(o);
|
|
981
|
+
}
|
|
982
|
+
return t;
|
|
983
|
+
}
|
|
984
|
+
var Ie = 65535;
|
|
985
|
+
function L(e, n) {
|
|
986
|
+
if (n.length > Ie) {
|
|
987
|
+
let t = Dn(n);
|
|
988
|
+
return e(...t.map((r) => e(...r)));
|
|
989
|
+
} else return e(...n);
|
|
990
|
+
}
|
|
991
|
+
function X(e) {
|
|
992
|
+
let t = e.nodes().map((r) => {
|
|
993
|
+
let o = e.node(r).rank;
|
|
994
|
+
return o === void 0 ? Number.MIN_VALUE : o;
|
|
995
|
+
});
|
|
996
|
+
return L(Math.max, t);
|
|
997
|
+
}
|
|
998
|
+
function Ce(e, n) {
|
|
999
|
+
let t = { lhs: [], rhs: [] };
|
|
1000
|
+
return e.forEach((r) => {
|
|
1001
|
+
n(r) ? t.lhs.push(r) : t.rhs.push(r);
|
|
1002
|
+
}), t;
|
|
1003
|
+
}
|
|
1004
|
+
function P(e, n) {
|
|
1005
|
+
let t = Date.now();
|
|
1006
|
+
try {
|
|
1007
|
+
return n();
|
|
1008
|
+
} finally {
|
|
1009
|
+
console.log(e + " time: " + (Date.now() - t) + "ms");
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
function M(e, n) {
|
|
1013
|
+
return n();
|
|
1014
|
+
}
|
|
1015
|
+
var An = 0;
|
|
1016
|
+
function j(e) {
|
|
1017
|
+
let n = ++An;
|
|
1018
|
+
return e + ("" + n);
|
|
1019
|
+
}
|
|
1020
|
+
function k(e, n, t = 1) {
|
|
1021
|
+
n == null && (n = e, e = 0);
|
|
1022
|
+
let r = (i) => i < n;
|
|
1023
|
+
t < 0 && (r = (i) => n < i);
|
|
1024
|
+
let o = [];
|
|
1025
|
+
for (let i = e; r(i); i += t) o.push(i);
|
|
1026
|
+
return o;
|
|
1027
|
+
}
|
|
1028
|
+
function T(e, n) {
|
|
1029
|
+
let t = {};
|
|
1030
|
+
for (let r of n) e[r] !== void 0 && (t[r] = e[r]);
|
|
1031
|
+
return t;
|
|
1032
|
+
}
|
|
1033
|
+
function O(e, n) {
|
|
1034
|
+
let t;
|
|
1035
|
+
return typeof n == "string" ? t = (r) => r[n] : t = n, Object.entries(e).reduce((r, [o, i]) => (r[o] = t(i, o), r), {});
|
|
1036
|
+
}
|
|
1037
|
+
function Re(e, n) {
|
|
1038
|
+
return e.reduce((t, r, o) => (t[r] = n[o], t), {});
|
|
1039
|
+
}
|
|
1040
|
+
var _ = "\0";
|
|
1041
|
+
var U = "3.0.0";
|
|
1042
|
+
var K = class {
|
|
1043
|
+
constructor() {
|
|
1044
|
+
pe(this, "_sentinel");
|
|
1045
|
+
let n = {};
|
|
1046
|
+
n._next = n._prev = n, this._sentinel = n;
|
|
1047
|
+
}
|
|
1048
|
+
dequeue() {
|
|
1049
|
+
let n = this._sentinel, t = n._prev;
|
|
1050
|
+
if (t !== n) return Pe(t), t;
|
|
1051
|
+
}
|
|
1052
|
+
enqueue(n) {
|
|
1053
|
+
let t = this._sentinel;
|
|
1054
|
+
n._prev && n._next && Pe(n), n._next = t._next, t._next._prev = n, t._next = n, n._prev = t;
|
|
1055
|
+
}
|
|
1056
|
+
toString() {
|
|
1057
|
+
let n = [], t = this._sentinel, r = t._prev;
|
|
1058
|
+
for (; r !== t; ) n.push(JSON.stringify(r, Vn)), r = r._prev;
|
|
1059
|
+
return "[" + n.join(", ") + "]";
|
|
1060
|
+
}
|
|
1061
|
+
};
|
|
1062
|
+
function Pe(e) {
|
|
1063
|
+
e._prev._next = e._next, e._next._prev = e._prev, delete e._next, delete e._prev;
|
|
1064
|
+
}
|
|
1065
|
+
function Vn(e, n) {
|
|
1066
|
+
if (e !== "_next" && e !== "_prev") return n;
|
|
1067
|
+
}
|
|
1068
|
+
var Me = K;
|
|
1069
|
+
var Wn = () => 1;
|
|
1070
|
+
function Q(e, n) {
|
|
1071
|
+
if (e.nodeCount() <= 1) return [];
|
|
1072
|
+
let t = Yn(e, n || Wn);
|
|
1073
|
+
return Bn(t.graph, t.buckets, t.zeroIdx).flatMap((o) => e.outEdges(o.v, o.w) || []);
|
|
1074
|
+
}
|
|
1075
|
+
function Bn(e, n, t) {
|
|
1076
|
+
var a;
|
|
1077
|
+
let r = [], o = n[n.length - 1], i = n[0], s;
|
|
1078
|
+
for (; e.nodeCount(); ) {
|
|
1079
|
+
for (; s = i.dequeue(); ) $(e, n, t, s);
|
|
1080
|
+
for (; s = o.dequeue(); ) $(e, n, t, s);
|
|
1081
|
+
if (e.nodeCount()) {
|
|
1082
|
+
for (let d = n.length - 2; d > 0; --d) if (s = (a = n[d]) == null ? void 0 : a.dequeue(), s) {
|
|
1083
|
+
r = r.concat($(e, n, t, s, true) || []);
|
|
1084
|
+
break;
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
return r;
|
|
1089
|
+
}
|
|
1090
|
+
function $(e, n, t, r, o) {
|
|
1091
|
+
let i = [], s = o ? i : void 0;
|
|
1092
|
+
return (e.inEdges(r.v) || []).forEach((a) => {
|
|
1093
|
+
let d = e.edge(a), l = e.node(a.v);
|
|
1094
|
+
o && i.push({ v: a.v, w: a.w }), l.out -= d, J(n, t, l);
|
|
1095
|
+
}), (e.outEdges(r.v) || []).forEach((a) => {
|
|
1096
|
+
let d = e.edge(a), l = a.w, u = e.node(l);
|
|
1097
|
+
u.in -= d, J(n, t, u);
|
|
1098
|
+
}), e.removeNode(r.v), s;
|
|
1099
|
+
}
|
|
1100
|
+
function Yn(e, n) {
|
|
1101
|
+
let t = new p(), r = 0, o = 0;
|
|
1102
|
+
e.nodes().forEach((a) => {
|
|
1103
|
+
t.setNode(a, { v: a, in: 0, out: 0 });
|
|
1104
|
+
}), e.edges().forEach((a) => {
|
|
1105
|
+
let d = t.edge(a.v, a.w) || 0, l = n(a), u = d + l;
|
|
1106
|
+
t.setEdge(a.v, a.w, u);
|
|
1107
|
+
let c = t.node(a.v), h = t.node(a.w);
|
|
1108
|
+
o = Math.max(o, c.out += l), r = Math.max(r, h.in += l);
|
|
1109
|
+
});
|
|
1110
|
+
let i = zn(o + r + 3).map(() => new Me()), s = r + 1;
|
|
1111
|
+
return t.nodes().forEach((a) => {
|
|
1112
|
+
J(i, s, t.node(a));
|
|
1113
|
+
}), { graph: t, buckets: i, zeroIdx: s };
|
|
1114
|
+
}
|
|
1115
|
+
function J(e, n, t) {
|
|
1116
|
+
var r, o, i;
|
|
1117
|
+
t.out ? t.in ? (i = e[t.out - t.in + n]) == null || i.enqueue(t) : (o = e[e.length - 1]) == null || o.enqueue(t) : (r = e[0]) == null || r.enqueue(t);
|
|
1118
|
+
}
|
|
1119
|
+
function zn(e) {
|
|
1120
|
+
let n = [];
|
|
1121
|
+
for (let t = 0; t < e; t++) n.push(t);
|
|
1122
|
+
return n;
|
|
1123
|
+
}
|
|
1124
|
+
function je(e) {
|
|
1125
|
+
(e.graph().acyclicer === "greedy" ? Q(e, t(e)) : Hn(e)).forEach((r) => {
|
|
1126
|
+
let o = e.edge(r);
|
|
1127
|
+
e.removeEdge(r), o.forwardName = r.name, o.reversed = true, e.setEdge(r.w, r.v, o, j("rev"));
|
|
1128
|
+
});
|
|
1129
|
+
function t(r) {
|
|
1130
|
+
return (o) => r.edge(o).weight;
|
|
1131
|
+
}
|
|
1132
|
+
}
|
|
1133
|
+
function Hn(e) {
|
|
1134
|
+
let n = [], t = {}, r = {};
|
|
1135
|
+
function o(i) {
|
|
1136
|
+
Object.hasOwn(r, i) || (r[i] = true, t[i] = true, e.outEdges(i).forEach((s) => {
|
|
1137
|
+
Object.hasOwn(t, s.w) ? n.push(s) : o(s.w);
|
|
1138
|
+
}), delete t[i]);
|
|
1139
|
+
}
|
|
1140
|
+
return e.nodes().forEach(o), n;
|
|
1141
|
+
}
|
|
1142
|
+
function Se(e) {
|
|
1143
|
+
e.edges().forEach((n) => {
|
|
1144
|
+
let t = e.edge(n);
|
|
1145
|
+
if (t.reversed) {
|
|
1146
|
+
e.removeEdge(n);
|
|
1147
|
+
let r = t.forwardName;
|
|
1148
|
+
delete t.reversed, delete t.forwardName, e.setEdge(n.w, n.v, t, r);
|
|
1149
|
+
}
|
|
1150
|
+
});
|
|
1151
|
+
}
|
|
1152
|
+
function Fe(e) {
|
|
1153
|
+
e.graph().dummyChains = [], e.edges().forEach((n) => Xn(e, n));
|
|
1154
|
+
}
|
|
1155
|
+
function Xn(e, n) {
|
|
1156
|
+
let t = n.v, r = e.node(t).rank, o = n.w, i = e.node(o).rank, s = n.name, a = e.edge(n), d = a.labelRank;
|
|
1157
|
+
if (i === r + 1) return;
|
|
1158
|
+
e.removeEdge(n);
|
|
1159
|
+
let l, u, c;
|
|
1160
|
+
for (c = 0, ++r; r < i; ++c, ++r) a.points = [], u = { width: 0, height: 0, edgeLabel: a, edgeObj: n, rank: r }, l = w(e, "edge", u, "_d"), r === d && (u.width = a.width, u.height = a.height, u.dummy = "edge-label", u.labelpos = a.labelpos), e.setEdge(t, l, { weight: a.weight }, s), c === 0 && e.graph().dummyChains.push(l), t = l;
|
|
1161
|
+
e.setEdge(t, o, { weight: a.weight }, s);
|
|
1162
|
+
}
|
|
1163
|
+
function De(e) {
|
|
1164
|
+
e.graph().dummyChains.forEach((n) => {
|
|
1165
|
+
let t = e.node(n), r = t.edgeLabel, o;
|
|
1166
|
+
for (e.setEdge(t.edgeObj, r); t.dummy; ) o = e.successors(n)[0], e.removeNode(n), r.points.push({ x: t.x, y: t.y }), t.dummy === "edge-label" && (r.x = t.x, r.y = t.y, r.width = t.width, r.height = t.height), n = o, t = e.node(n);
|
|
1167
|
+
});
|
|
1168
|
+
}
|
|
1169
|
+
function S(e) {
|
|
1170
|
+
let n = {};
|
|
1171
|
+
function t(r) {
|
|
1172
|
+
let o = e.node(r);
|
|
1173
|
+
if (Object.hasOwn(n, r)) return o.rank;
|
|
1174
|
+
n[r] = true;
|
|
1175
|
+
let i = e.outEdges(r), s = i ? i.map((d) => d == null ? Number.POSITIVE_INFINITY : t(d.w) - e.edge(d).minlen) : [], a = L(Math.min, s);
|
|
1176
|
+
return a === Number.POSITIVE_INFINITY && (a = 0), o.rank = a;
|
|
1177
|
+
}
|
|
1178
|
+
e.sources().forEach(t);
|
|
1179
|
+
}
|
|
1180
|
+
function v(e, n) {
|
|
1181
|
+
return e.node(n.w).rank - e.node(n.v).rank - e.edge(n).minlen;
|
|
1182
|
+
}
|
|
1183
|
+
var V = Kn;
|
|
1184
|
+
function Kn(e) {
|
|
1185
|
+
let n = new p({ directed: false }), t = e.nodes();
|
|
1186
|
+
if (t.length === 0) throw new Error("Graph must have at least one node");
|
|
1187
|
+
let r = t[0], o = e.nodeCount();
|
|
1188
|
+
n.setNode(r, {});
|
|
1189
|
+
let i, s;
|
|
1190
|
+
for (; $n(n, e) < o && (i = Jn(n, e), !!i); ) s = n.hasNode(i.v) ? v(e, i) : -v(e, i), Qn(n, e, s);
|
|
1191
|
+
return n;
|
|
1192
|
+
}
|
|
1193
|
+
function $n(e, n) {
|
|
1194
|
+
function t(r) {
|
|
1195
|
+
let o = n.nodeEdges(r);
|
|
1196
|
+
o && o.forEach((i) => {
|
|
1197
|
+
let s = i.v, a = r === s ? i.w : s;
|
|
1198
|
+
!e.hasNode(a) && !v(n, i) && (e.setNode(a, {}), e.setEdge(r, a, {}), t(a));
|
|
1199
|
+
});
|
|
1200
|
+
}
|
|
1201
|
+
return e.nodes().forEach(t), e.nodeCount();
|
|
1202
|
+
}
|
|
1203
|
+
function Jn(e, n) {
|
|
1204
|
+
return n.edges().reduce((r, o) => {
|
|
1205
|
+
let i = Number.POSITIVE_INFINITY;
|
|
1206
|
+
return e.hasNode(o.v) !== e.hasNode(o.w) && (i = v(n, o)), i < r[0] ? [i, o] : r;
|
|
1207
|
+
}, [Number.POSITIVE_INFINITY, null])[1];
|
|
1208
|
+
}
|
|
1209
|
+
function Qn(e, n, t) {
|
|
1210
|
+
e.nodes().forEach((r) => n.node(r).rank += t);
|
|
1211
|
+
}
|
|
1212
|
+
var { preorder: Zn, postorder: et } = R;
|
|
1213
|
+
var Ve = x;
|
|
1214
|
+
x.initLowLimValues = ee;
|
|
1215
|
+
x.initCutValues = Z;
|
|
1216
|
+
x.calcCutValue = We;
|
|
1217
|
+
x.leaveEdge = Ye;
|
|
1218
|
+
x.enterEdge = ze;
|
|
1219
|
+
x.exchangeEdges = He;
|
|
1220
|
+
function x(e) {
|
|
1221
|
+
e = xe(e), S(e);
|
|
1222
|
+
let n = V(e);
|
|
1223
|
+
ee(n), Z(n, e);
|
|
1224
|
+
let t, r;
|
|
1225
|
+
for (; t = Ye(n); ) r = ze(n, e, t), He(n, e, t, r);
|
|
1226
|
+
}
|
|
1227
|
+
function Z(e, n) {
|
|
1228
|
+
let t = et(e, e.nodes());
|
|
1229
|
+
t = t.slice(0, t.length - 1), t.forEach((r) => nt(e, n, r));
|
|
1230
|
+
}
|
|
1231
|
+
function nt(e, n, t) {
|
|
1232
|
+
let o = e.node(t).parent, i = e.edge(t, o);
|
|
1233
|
+
i.cutvalue = We(e, n, t);
|
|
1234
|
+
}
|
|
1235
|
+
function We(e, n, t) {
|
|
1236
|
+
let o = e.node(t).parent, i = true, s = n.edge(t, o), a = 0;
|
|
1237
|
+
s || (i = false, s = n.edge(o, t)), a = s.weight;
|
|
1238
|
+
let d = n.nodeEdges(t);
|
|
1239
|
+
return d && d.forEach((l) => {
|
|
1240
|
+
let u = l.v === t, c = u ? l.w : l.v;
|
|
1241
|
+
if (c !== o) {
|
|
1242
|
+
let h = u === i, f = n.edge(l).weight;
|
|
1243
|
+
if (a += h ? f : -f, rt(e, t, c)) {
|
|
1244
|
+
let b = e.edge(t, c).cutvalue;
|
|
1245
|
+
a += h ? -b : b;
|
|
1246
|
+
}
|
|
1247
|
+
}
|
|
1248
|
+
}), a;
|
|
1249
|
+
}
|
|
1250
|
+
function ee(e, n) {
|
|
1251
|
+
arguments.length < 2 && (n = e.nodes()[0]), Be(e, {}, 1, n);
|
|
1252
|
+
}
|
|
1253
|
+
function Be(e, n, t, r, o) {
|
|
1254
|
+
let i = t, s = e.node(r);
|
|
1255
|
+
n[r] = true;
|
|
1256
|
+
let a = e.neighbors(r);
|
|
1257
|
+
return a && a.forEach((d) => {
|
|
1258
|
+
Object.hasOwn(n, d) || (t = Be(e, n, t, d, r));
|
|
1259
|
+
}), s.low = i, s.lim = t++, o ? s.parent = o : delete s.parent, t;
|
|
1260
|
+
}
|
|
1261
|
+
function Ye(e) {
|
|
1262
|
+
return e.edges().find((n) => e.edge(n).cutvalue < 0);
|
|
1263
|
+
}
|
|
1264
|
+
function ze(e, n, t) {
|
|
1265
|
+
let r = t.v, o = t.w;
|
|
1266
|
+
n.hasEdge(r, o) || (r = t.w, o = t.v);
|
|
1267
|
+
let i = e.node(r), s = e.node(o), a = i, d = false;
|
|
1268
|
+
return i.lim > s.lim && (a = s, d = true), n.edges().filter((u) => d === Ae(e, e.node(u.v), a) && d !== Ae(e, e.node(u.w), a)).reduce((u, c) => v(n, c) < v(n, u) ? c : u);
|
|
1269
|
+
}
|
|
1270
|
+
function He(e, n, t, r) {
|
|
1271
|
+
let o = t.v, i = t.w;
|
|
1272
|
+
e.removeEdge(o, i), e.setEdge(r.v, r.w, {}), ee(e), Z(e, n), tt(e, n);
|
|
1273
|
+
}
|
|
1274
|
+
function tt(e, n) {
|
|
1275
|
+
let t = e.nodes().find((o) => !e.node(o).parent);
|
|
1276
|
+
if (!t) return;
|
|
1277
|
+
let r = Zn(e, [t]);
|
|
1278
|
+
r = r.slice(1), r.forEach((o) => {
|
|
1279
|
+
let s = e.node(o).parent, a = n.edge(o, s), d = false;
|
|
1280
|
+
a || (a = n.edge(s, o), d = true), n.node(o).rank = n.node(s).rank + (d ? a.minlen : -a.minlen);
|
|
1281
|
+
});
|
|
1282
|
+
}
|
|
1283
|
+
function rt(e, n, t) {
|
|
1284
|
+
return e.hasEdge(n, t);
|
|
1285
|
+
}
|
|
1286
|
+
function Ae(e, n, t) {
|
|
1287
|
+
return t.low <= n.lim && n.lim <= t.lim;
|
|
1288
|
+
}
|
|
1289
|
+
var Xe = ot;
|
|
1290
|
+
function ot(e) {
|
|
1291
|
+
let n = e.graph().ranker;
|
|
1292
|
+
if (typeof n == "function") return n(e);
|
|
1293
|
+
switch (n) {
|
|
1294
|
+
case "network-simplex":
|
|
1295
|
+
qe(e);
|
|
1296
|
+
break;
|
|
1297
|
+
case "tight-tree":
|
|
1298
|
+
st(e);
|
|
1299
|
+
break;
|
|
1300
|
+
case "longest-path":
|
|
1301
|
+
it(e);
|
|
1302
|
+
break;
|
|
1303
|
+
case "none":
|
|
1304
|
+
break;
|
|
1305
|
+
default:
|
|
1306
|
+
qe(e);
|
|
1307
|
+
}
|
|
1308
|
+
}
|
|
1309
|
+
var it = S;
|
|
1310
|
+
function st(e) {
|
|
1311
|
+
S(e), V(e);
|
|
1312
|
+
}
|
|
1313
|
+
function qe(e) {
|
|
1314
|
+
Ve(e);
|
|
1315
|
+
}
|
|
1316
|
+
var Ue = at;
|
|
1317
|
+
function at(e) {
|
|
1318
|
+
let n = lt(e);
|
|
1319
|
+
e.graph().dummyChains.forEach((t) => {
|
|
1320
|
+
let r = e.node(t), o = r.edgeObj, i = dt(e, n, o.v, o.w), s = i.path, a = i.lca, d = 0, l = s[d], u = true;
|
|
1321
|
+
for (; t !== o.w; ) {
|
|
1322
|
+
if (r = e.node(t), u) {
|
|
1323
|
+
for (; (l = s[d]) !== a && e.node(l).maxRank < r.rank; ) d++;
|
|
1324
|
+
l === a && (u = false);
|
|
1325
|
+
}
|
|
1326
|
+
if (!u) {
|
|
1327
|
+
for (; d < s.length - 1 && e.node(s[d + 1]).minRank <= r.rank; ) d++;
|
|
1328
|
+
l = s[d];
|
|
1329
|
+
}
|
|
1330
|
+
l !== void 0 && e.setParent(t, l), t = e.successors(t)[0];
|
|
1331
|
+
}
|
|
1332
|
+
});
|
|
1333
|
+
}
|
|
1334
|
+
function dt(e, n, t, r) {
|
|
1335
|
+
let o = [], i = [], s = Math.min(n[t].low, n[r].low), a = Math.max(n[t].lim, n[r].lim), d;
|
|
1336
|
+
d = t;
|
|
1337
|
+
do
|
|
1338
|
+
d = e.parent(d), o.push(d);
|
|
1339
|
+
while (d && (n[d].low > s || a > n[d].lim));
|
|
1340
|
+
let l = d, u = r;
|
|
1341
|
+
for (; (u = e.parent(u)) !== l; ) i.push(u);
|
|
1342
|
+
return { path: o.concat(i.reverse()), lca: l };
|
|
1343
|
+
}
|
|
1344
|
+
function lt(e) {
|
|
1345
|
+
let n = {}, t = 0;
|
|
1346
|
+
function r(o) {
|
|
1347
|
+
let i = t;
|
|
1348
|
+
e.children(o).forEach(r), n[o] = { low: i, lim: t++ };
|
|
1349
|
+
}
|
|
1350
|
+
return e.children(_).forEach(r), n;
|
|
1351
|
+
}
|
|
1352
|
+
function Ke(e) {
|
|
1353
|
+
let n = w(e, "root", {}, "_root"), t = ut(e), r = Object.values(t), o = L(Math.max, r) - 1, i = 2 * o + 1;
|
|
1354
|
+
e.graph().nestingRoot = n, e.edges().forEach((a) => e.edge(a).minlen *= i);
|
|
1355
|
+
let s = ct(e) + 1;
|
|
1356
|
+
e.children(_).forEach((a) => $e(e, n, i, s, o, t, a)), e.graph().nodeRankFactor = i;
|
|
1357
|
+
}
|
|
1358
|
+
function $e(e, n, t, r, o, i, s) {
|
|
1359
|
+
var c;
|
|
1360
|
+
let a = e.children(s);
|
|
1361
|
+
if (!a.length) {
|
|
1362
|
+
s !== n && e.setEdge(n, s, { weight: 0, minlen: t });
|
|
1363
|
+
return;
|
|
1364
|
+
}
|
|
1365
|
+
let d = q(e, "_bt"), l = q(e, "_bb"), u = e.node(s);
|
|
1366
|
+
e.setParent(d, s), u.borderTop = d, e.setParent(l, s), u.borderBottom = l, a.forEach((h) => {
|
|
1367
|
+
var y;
|
|
1368
|
+
$e(e, n, t, r, o, i, h);
|
|
1369
|
+
let f = e.node(h), g = f.borderTop ? f.borderTop : h, b = f.borderBottom ? f.borderBottom : h, m = f.borderTop ? r : 2 * r, E = g !== b ? 1 : o - ((y = i[s]) != null ? y : 0) + 1;
|
|
1370
|
+
e.setEdge(d, g, { weight: m, minlen: E, nestingEdge: true }), e.setEdge(b, l, { weight: m, minlen: E, nestingEdge: true });
|
|
1371
|
+
}), e.parent(s) || e.setEdge(n, d, { weight: 0, minlen: o + ((c = i[s]) != null ? c : 0) });
|
|
1372
|
+
}
|
|
1373
|
+
function ut(e) {
|
|
1374
|
+
let n = {};
|
|
1375
|
+
function t(r, o) {
|
|
1376
|
+
let i = e.children(r);
|
|
1377
|
+
i && i.length && i.forEach((s) => t(s, o + 1)), n[r] = o;
|
|
1378
|
+
}
|
|
1379
|
+
return e.children(_).forEach((r) => t(r, 1)), n;
|
|
1380
|
+
}
|
|
1381
|
+
function ct(e) {
|
|
1382
|
+
return e.edges().reduce((n, t) => n + e.edge(t).weight, 0);
|
|
1383
|
+
}
|
|
1384
|
+
function Je(e) {
|
|
1385
|
+
let n = e.graph();
|
|
1386
|
+
e.removeNode(n.nestingRoot), delete n.nestingRoot, e.edges().forEach((t) => {
|
|
1387
|
+
e.edge(t).nestingEdge && e.removeEdge(t);
|
|
1388
|
+
});
|
|
1389
|
+
}
|
|
1390
|
+
var Ze = ft;
|
|
1391
|
+
function ft(e) {
|
|
1392
|
+
function n(t) {
|
|
1393
|
+
let r = e.children(t), o = e.node(t);
|
|
1394
|
+
if (r.length && r.forEach(n), Object.hasOwn(o, "minRank")) {
|
|
1395
|
+
o.borderLeft = [], o.borderRight = [];
|
|
1396
|
+
for (let i = o.minRank, s = o.maxRank + 1; i < s; ++i) Qe(e, "borderLeft", "_bl", t, o, i), Qe(e, "borderRight", "_br", t, o, i);
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
e.children(_).forEach(n);
|
|
1400
|
+
}
|
|
1401
|
+
function Qe(e, n, t, r, o, i) {
|
|
1402
|
+
let s = { width: 0, height: 0, rank: i, borderType: n }, a = o[n][i - 1], d = w(e, "border", s, t);
|
|
1403
|
+
o[n][i] = d, e.setParent(d, r), a && e.setEdge(a, d, { weight: 1 });
|
|
1404
|
+
}
|
|
1405
|
+
function nn(e) {
|
|
1406
|
+
var t;
|
|
1407
|
+
let n = (t = e.graph().rankdir) == null ? void 0 : t.toLowerCase();
|
|
1408
|
+
(n === "lr" || n === "rl") && rn(e);
|
|
1409
|
+
}
|
|
1410
|
+
function tn(e) {
|
|
1411
|
+
var t;
|
|
1412
|
+
let n = (t = e.graph().rankdir) == null ? void 0 : t.toLowerCase();
|
|
1413
|
+
(n === "bt" || n === "rl") && bt(e), (n === "lr" || n === "rl") && (gt(e), rn(e));
|
|
1414
|
+
}
|
|
1415
|
+
function rn(e) {
|
|
1416
|
+
e.nodes().forEach((n) => en(e.node(n))), e.edges().forEach((n) => en(e.edge(n)));
|
|
1417
|
+
}
|
|
1418
|
+
function en(e) {
|
|
1419
|
+
let n = e.width;
|
|
1420
|
+
e.width = e.height, e.height = n;
|
|
1421
|
+
}
|
|
1422
|
+
function bt(e) {
|
|
1423
|
+
e.nodes().forEach((n) => ne(e.node(n))), e.edges().forEach((n) => {
|
|
1424
|
+
var r;
|
|
1425
|
+
let t = e.edge(n);
|
|
1426
|
+
(r = t.points) == null || r.forEach(ne), Object.hasOwn(t, "y") && ne(t);
|
|
1427
|
+
});
|
|
1428
|
+
}
|
|
1429
|
+
function ne(e) {
|
|
1430
|
+
e.y = -e.y;
|
|
1431
|
+
}
|
|
1432
|
+
function gt(e) {
|
|
1433
|
+
e.nodes().forEach((n) => te(e.node(n))), e.edges().forEach((n) => {
|
|
1434
|
+
var r;
|
|
1435
|
+
let t = e.edge(n);
|
|
1436
|
+
(r = t.points) == null || r.forEach(te), Object.hasOwn(t, "x") && te(t);
|
|
1437
|
+
});
|
|
1438
|
+
}
|
|
1439
|
+
function te(e) {
|
|
1440
|
+
let n = e.x;
|
|
1441
|
+
e.x = e.y, e.y = n;
|
|
1442
|
+
}
|
|
1443
|
+
function re(e) {
|
|
1444
|
+
let n = {}, t = e.nodes().filter((d) => !e.children(d).length), r = t.map((d) => e.node(d).rank), o = L(Math.max, r), i = k(o + 1).map(() => []);
|
|
1445
|
+
function s(d) {
|
|
1446
|
+
if (n[d]) return;
|
|
1447
|
+
n[d] = true;
|
|
1448
|
+
let l = e.node(d);
|
|
1449
|
+
i[l.rank].push(d);
|
|
1450
|
+
let u = e.successors(d);
|
|
1451
|
+
u && u.forEach(s);
|
|
1452
|
+
}
|
|
1453
|
+
return t.sort((d, l) => e.node(d).rank - e.node(l).rank).forEach(s), i;
|
|
1454
|
+
}
|
|
1455
|
+
function oe(e, n) {
|
|
1456
|
+
let t = 0;
|
|
1457
|
+
for (let r = 1; r < n.length; ++r) t += mt(e, n[r - 1], n[r]);
|
|
1458
|
+
return t;
|
|
1459
|
+
}
|
|
1460
|
+
function mt(e, n, t) {
|
|
1461
|
+
let r = Re(t, t.map((l, u) => u)), o = n.flatMap((l) => {
|
|
1462
|
+
let u = e.outEdges(l);
|
|
1463
|
+
return u ? u.map((c) => ({ pos: r[c.w], weight: e.edge(c).weight })).sort((c, h) => c.pos - h.pos) : [];
|
|
1464
|
+
}), i = 1;
|
|
1465
|
+
for (; i < t.length; ) i <<= 1;
|
|
1466
|
+
let s = 2 * i - 1;
|
|
1467
|
+
i -= 1;
|
|
1468
|
+
let a = new Array(s).fill(0), d = 0;
|
|
1469
|
+
return o.forEach((l) => {
|
|
1470
|
+
let u = l.pos + i;
|
|
1471
|
+
a[u] += l.weight;
|
|
1472
|
+
let c = 0;
|
|
1473
|
+
for (; u > 0; ) u % 2 && (c += a[u + 1]), u = u - 1 >> 1, a[u] += l.weight;
|
|
1474
|
+
d += l.weight * c;
|
|
1475
|
+
}), d;
|
|
1476
|
+
}
|
|
1477
|
+
function ie(e, n = []) {
|
|
1478
|
+
return n.map((t) => {
|
|
1479
|
+
let r = e.inEdges(t);
|
|
1480
|
+
if (!r || !r.length) return { v: t };
|
|
1481
|
+
{
|
|
1482
|
+
let o = r.reduce((i, s) => {
|
|
1483
|
+
let a = e.edge(s), d = e.node(s.v);
|
|
1484
|
+
return { sum: i.sum + a.weight * d.order, weight: i.weight + a.weight };
|
|
1485
|
+
}, { sum: 0, weight: 0 });
|
|
1486
|
+
return { v: t, barycenter: o.sum / o.weight, weight: o.weight };
|
|
1487
|
+
}
|
|
1488
|
+
});
|
|
1489
|
+
}
|
|
1490
|
+
function se(e, n) {
|
|
1491
|
+
let t = {};
|
|
1492
|
+
e.forEach((o, i) => {
|
|
1493
|
+
let s = { indegree: 0, in: [], out: [], vs: [o.v], i };
|
|
1494
|
+
o.barycenter !== void 0 && (s.barycenter = o.barycenter, s.weight = o.weight), t[o.v] = s;
|
|
1495
|
+
}), n.edges().forEach((o) => {
|
|
1496
|
+
let i = t[o.v], s = t[o.w];
|
|
1497
|
+
i !== void 0 && s !== void 0 && (s.indegree++, i.out.push(s));
|
|
1498
|
+
});
|
|
1499
|
+
let r = Object.values(t).filter((o) => !o.indegree);
|
|
1500
|
+
return Et(r);
|
|
1501
|
+
}
|
|
1502
|
+
function Et(e) {
|
|
1503
|
+
let n = [];
|
|
1504
|
+
function t(o) {
|
|
1505
|
+
return (i) => {
|
|
1506
|
+
i.merged || (i.barycenter === void 0 || o.barycenter === void 0 || i.barycenter >= o.barycenter) && Lt(o, i);
|
|
1507
|
+
};
|
|
1508
|
+
}
|
|
1509
|
+
function r(o) {
|
|
1510
|
+
return (i) => {
|
|
1511
|
+
i.in.push(o), --i.indegree === 0 && e.push(i);
|
|
1512
|
+
};
|
|
1513
|
+
}
|
|
1514
|
+
for (; e.length; ) {
|
|
1515
|
+
let o = e.pop();
|
|
1516
|
+
n.push(o), o.in.reverse().forEach(t(o)), o.out.forEach(r(o));
|
|
1517
|
+
}
|
|
1518
|
+
return n.filter((o) => !o.merged).map((o) => T(o, ["vs", "i", "barycenter", "weight"]));
|
|
1519
|
+
}
|
|
1520
|
+
function Lt(e, n) {
|
|
1521
|
+
let t = 0, r = 0;
|
|
1522
|
+
e.weight && (t += e.barycenter * e.weight, r += e.weight), n.weight && (t += n.barycenter * n.weight, r += n.weight), e.vs = n.vs.concat(e.vs), e.barycenter = t / r, e.weight = r, e.i = Math.min(n.i, e.i), n.merged = true;
|
|
1523
|
+
}
|
|
1524
|
+
function ae(e, n) {
|
|
1525
|
+
let t = Ce(e, (u) => Object.hasOwn(u, "barycenter")), r = t.lhs, o = t.rhs.sort((u, c) => c.i - u.i), i = [], s = 0, a = 0, d = 0;
|
|
1526
|
+
r.sort(yt(!!n)), d = on(i, o, d), r.forEach((u) => {
|
|
1527
|
+
d += u.vs.length, i.push(u.vs), s += u.barycenter * u.weight, a += u.weight, d = on(i, o, d);
|
|
1528
|
+
});
|
|
1529
|
+
let l = { vs: i.flat(1) };
|
|
1530
|
+
return a && (l.barycenter = s / a, l.weight = a), l;
|
|
1531
|
+
}
|
|
1532
|
+
function on(e, n, t) {
|
|
1533
|
+
let r;
|
|
1534
|
+
for (; n.length && (r = n[n.length - 1]).i <= t; ) n.pop(), e.push(r.vs), t++;
|
|
1535
|
+
return t;
|
|
1536
|
+
}
|
|
1537
|
+
function yt(e) {
|
|
1538
|
+
return (n, t) => n.barycenter < t.barycenter ? -1 : n.barycenter > t.barycenter ? 1 : e ? t.i - n.i : n.i - t.i;
|
|
1539
|
+
}
|
|
1540
|
+
function W(e, n, t, r) {
|
|
1541
|
+
let o = e.children(n), i = e.node(n), s = i ? i.borderLeft : void 0, a = i ? i.borderRight : void 0, d = {};
|
|
1542
|
+
s && (o = o.filter((h) => h !== s && h !== a));
|
|
1543
|
+
let l = ie(e, o);
|
|
1544
|
+
l.forEach((h) => {
|
|
1545
|
+
if (e.children(h.v).length) {
|
|
1546
|
+
let f = W(e, h.v, t, r);
|
|
1547
|
+
d[h.v] = f, Object.hasOwn(f, "barycenter") && Nt(h, f);
|
|
1548
|
+
}
|
|
1549
|
+
});
|
|
1550
|
+
let u = se(l, t);
|
|
1551
|
+
wt(u, d);
|
|
1552
|
+
let c = ae(u, r);
|
|
1553
|
+
if (s && a) {
|
|
1554
|
+
c.vs = [s, c.vs, a].flat(1);
|
|
1555
|
+
let h = e.predecessors(s);
|
|
1556
|
+
if (h && h.length) {
|
|
1557
|
+
let f = e.node(h[0]), g = e.predecessors(a), b = e.node(g[0]);
|
|
1558
|
+
Object.hasOwn(c, "barycenter") || (c.barycenter = 0, c.weight = 0), c.barycenter = (c.barycenter * c.weight + f.order + b.order) / (c.weight + 2), c.weight += 2;
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
return c;
|
|
1562
|
+
}
|
|
1563
|
+
function wt(e, n) {
|
|
1564
|
+
e.forEach((t) => {
|
|
1565
|
+
t.vs = t.vs.flatMap((r) => n[r] ? n[r].vs : r);
|
|
1566
|
+
});
|
|
1567
|
+
}
|
|
1568
|
+
function Nt(e, n) {
|
|
1569
|
+
e.barycenter !== void 0 ? (e.barycenter = (e.barycenter * e.weight + n.barycenter * n.weight) / (e.weight + n.weight), e.weight += n.weight) : (e.barycenter = n.barycenter, e.weight = n.weight);
|
|
1570
|
+
}
|
|
1571
|
+
function de(e, n, t, r) {
|
|
1572
|
+
r || (r = e.nodes());
|
|
1573
|
+
let o = Gt(e), i = new p({ compound: true }).setGraph({ root: o }).setDefaultNodeLabel((s) => e.node(s));
|
|
1574
|
+
return r.forEach((s) => {
|
|
1575
|
+
let a = e.node(s), d = e.parent(s);
|
|
1576
|
+
if (a.rank === n || a.minRank <= n && n <= a.maxRank) {
|
|
1577
|
+
i.setNode(s), i.setParent(s, d || o);
|
|
1578
|
+
let l = e[t](s);
|
|
1579
|
+
l && l.forEach((u) => {
|
|
1580
|
+
let c = u.v === s ? u.w : u.v, h = i.edge(c, s), f = h !== void 0 ? h.weight : 0;
|
|
1581
|
+
i.setEdge(c, s, { weight: e.edge(u).weight + f });
|
|
1582
|
+
}), Object.hasOwn(a, "minRank") && i.setNode(s, { borderLeft: a.borderLeft[n], borderRight: a.borderRight[n] });
|
|
1583
|
+
}
|
|
1584
|
+
}), i;
|
|
1585
|
+
}
|
|
1586
|
+
function Gt(e) {
|
|
1587
|
+
let n;
|
|
1588
|
+
for (; e.hasNode(n = j("_root")); ) ;
|
|
1589
|
+
return n;
|
|
1590
|
+
}
|
|
1591
|
+
function le(e, n, t) {
|
|
1592
|
+
let r = {}, o;
|
|
1593
|
+
t.forEach((i) => {
|
|
1594
|
+
let s = e.parent(i), a, d;
|
|
1595
|
+
for (; s; ) {
|
|
1596
|
+
if (a = e.parent(s), a ? (d = r[a], r[a] = s) : (d = o, o = s), d && d !== s) {
|
|
1597
|
+
n.setEdge(d, s);
|
|
1598
|
+
return;
|
|
1599
|
+
}
|
|
1600
|
+
s = a;
|
|
1601
|
+
}
|
|
1602
|
+
});
|
|
1603
|
+
}
|
|
1604
|
+
function B(e, n = {}) {
|
|
1605
|
+
if (typeof n.customOrder == "function") {
|
|
1606
|
+
n.customOrder(e, B);
|
|
1607
|
+
return;
|
|
1608
|
+
}
|
|
1609
|
+
let t = X(e), r = sn(e, k(1, t + 1), "inEdges"), o = sn(e, k(t - 1, -1, -1), "outEdges"), i = re(e);
|
|
1610
|
+
if (an(e, i), n.disableOptimalOrderHeuristic) return;
|
|
1611
|
+
let s = Number.POSITIVE_INFINITY, a, d = n.constraints || [];
|
|
1612
|
+
for (let l = 0, u = 0; u < 4; ++l, ++u) {
|
|
1613
|
+
kt(l % 2 ? r : o, l % 4 >= 2, d), i = N(e);
|
|
1614
|
+
let c = oe(e, i);
|
|
1615
|
+
c < s ? (u = 0, a = Object.assign({}, i), s = c) : c === s && (a = structuredClone(i));
|
|
1616
|
+
}
|
|
1617
|
+
an(e, a);
|
|
1618
|
+
}
|
|
1619
|
+
function sn(e, n, t) {
|
|
1620
|
+
let r = /* @__PURE__ */ new Map(), o = (i, s) => {
|
|
1621
|
+
r.has(i) || r.set(i, []), r.get(i).push(s);
|
|
1622
|
+
};
|
|
1623
|
+
for (let i of e.nodes()) {
|
|
1624
|
+
let s = e.node(i);
|
|
1625
|
+
if (typeof s.rank == "number" && o(s.rank, i), typeof s.minRank == "number" && typeof s.maxRank == "number") for (let a = s.minRank; a <= s.maxRank; a++) a !== s.rank && o(a, i);
|
|
1626
|
+
}
|
|
1627
|
+
return n.map(function(i) {
|
|
1628
|
+
return de(e, i, t, r.get(i) || []);
|
|
1629
|
+
});
|
|
1630
|
+
}
|
|
1631
|
+
function kt(e, n, t) {
|
|
1632
|
+
let r = new p();
|
|
1633
|
+
e.forEach(function(o) {
|
|
1634
|
+
t.forEach((a) => r.setEdge(a.left, a.right));
|
|
1635
|
+
let i = o.graph().root, s = W(o, i, r, n);
|
|
1636
|
+
s.vs.forEach((a, d) => o.node(a).order = d), le(o, r, s.vs);
|
|
1637
|
+
});
|
|
1638
|
+
}
|
|
1639
|
+
function an(e, n) {
|
|
1640
|
+
Object.values(n).forEach((t) => t.forEach((r, o) => e.node(r).order = o));
|
|
1641
|
+
}
|
|
1642
|
+
function vt(e, n) {
|
|
1643
|
+
let t = {};
|
|
1644
|
+
function r(o, i) {
|
|
1645
|
+
let s = 0, a = 0, d = o.length, l = i[i.length - 1];
|
|
1646
|
+
return i.forEach((u, c) => {
|
|
1647
|
+
let h = xt(e, u), f = h ? e.node(h).order : d;
|
|
1648
|
+
(h || u === l) && (i.slice(a, c + 1).forEach((g) => {
|
|
1649
|
+
let b = e.predecessors(g);
|
|
1650
|
+
b && b.forEach((m) => {
|
|
1651
|
+
let E = e.node(m), y = E.order;
|
|
1652
|
+
(y < s || f < y) && !(E.dummy && e.node(g).dummy) && dn(t, m, g);
|
|
1653
|
+
});
|
|
1654
|
+
}), a = c + 1, s = f);
|
|
1655
|
+
}), i;
|
|
1656
|
+
}
|
|
1657
|
+
return n.length && n.reduce(r), t;
|
|
1658
|
+
}
|
|
1659
|
+
function _t(e, n) {
|
|
1660
|
+
let t = {};
|
|
1661
|
+
function r(i, s, a, d, l) {
|
|
1662
|
+
k(s, a).forEach((u) => {
|
|
1663
|
+
let c = i[u];
|
|
1664
|
+
if (c !== void 0 && e.node(c).dummy) {
|
|
1665
|
+
let h = e.predecessors(c);
|
|
1666
|
+
h && h.forEach((f) => {
|
|
1667
|
+
if (f === void 0) return;
|
|
1668
|
+
let g = e.node(f);
|
|
1669
|
+
g.dummy && (g.order < d || g.order > l) && dn(t, f, c);
|
|
1670
|
+
});
|
|
1671
|
+
}
|
|
1672
|
+
});
|
|
1673
|
+
}
|
|
1674
|
+
function o(i, s) {
|
|
1675
|
+
let a = -1, d = -1, l = 0;
|
|
1676
|
+
return s.forEach((u, c) => {
|
|
1677
|
+
if (e.node(u).dummy === "border") {
|
|
1678
|
+
let h = e.predecessors(u);
|
|
1679
|
+
if (h && h.length) {
|
|
1680
|
+
let f = h[0];
|
|
1681
|
+
if (f === void 0) return;
|
|
1682
|
+
d = e.node(f).order, r(s, l, c, a, d), l = c, a = d;
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
r(s, l, s.length, d, i.length);
|
|
1686
|
+
}), s;
|
|
1687
|
+
}
|
|
1688
|
+
return n.length && n.reduce(o), t;
|
|
1689
|
+
}
|
|
1690
|
+
function xt(e, n) {
|
|
1691
|
+
if (e.node(n).dummy) {
|
|
1692
|
+
let t = e.predecessors(n);
|
|
1693
|
+
if (t) return t.find((r) => e.node(r).dummy);
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
function dn(e, n, t) {
|
|
1697
|
+
if (n > t) {
|
|
1698
|
+
let o = n;
|
|
1699
|
+
n = t, t = o;
|
|
1700
|
+
}
|
|
1701
|
+
let r = e[n];
|
|
1702
|
+
r || (e[n] = r = {}), r[t] = true;
|
|
1703
|
+
}
|
|
1704
|
+
function Tt(e, n, t) {
|
|
1705
|
+
if (n > t) {
|
|
1706
|
+
let o = n;
|
|
1707
|
+
n = t, t = o;
|
|
1708
|
+
}
|
|
1709
|
+
let r = e[n];
|
|
1710
|
+
return r !== void 0 && Object.hasOwn(r, t);
|
|
1711
|
+
}
|
|
1712
|
+
function Ot(e, n, t, r) {
|
|
1713
|
+
let o = {}, i = {}, s = {};
|
|
1714
|
+
return n.forEach((a) => {
|
|
1715
|
+
a.forEach((d, l) => {
|
|
1716
|
+
o[d] = d, i[d] = d, s[d] = l;
|
|
1717
|
+
});
|
|
1718
|
+
}), n.forEach((a) => {
|
|
1719
|
+
let d = -1;
|
|
1720
|
+
a.forEach((l) => {
|
|
1721
|
+
let u = r(l);
|
|
1722
|
+
if (u && u.length) {
|
|
1723
|
+
let c = u.sort((f, g) => {
|
|
1724
|
+
let b = s[f], m = s[g];
|
|
1725
|
+
return (b !== void 0 ? b : 0) - (m !== void 0 ? m : 0);
|
|
1726
|
+
}), h = (c.length - 1) / 2;
|
|
1727
|
+
for (let f = Math.floor(h), g = Math.ceil(h); f <= g; ++f) {
|
|
1728
|
+
let b = c[f];
|
|
1729
|
+
if (b === void 0) continue;
|
|
1730
|
+
let m = s[b];
|
|
1731
|
+
if (m !== void 0 && i[l] === l && d < m && !Tt(t, l, b)) {
|
|
1732
|
+
let E = o[b];
|
|
1733
|
+
E !== void 0 && (i[b] = l, i[l] = o[l] = E, d = m);
|
|
1734
|
+
}
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
});
|
|
1738
|
+
}), { root: o, align: i };
|
|
1739
|
+
}
|
|
1740
|
+
function It(e, n, t, r, o = false) {
|
|
1741
|
+
let i = {}, s = Ct(e, n, t, o), a = o ? "borderLeft" : "borderRight";
|
|
1742
|
+
function d(f, g) {
|
|
1743
|
+
let b = s.nodes().slice(), m = {}, E = b.pop();
|
|
1744
|
+
for (; E; ) {
|
|
1745
|
+
if (m[E]) f(E);
|
|
1746
|
+
else {
|
|
1747
|
+
m[E] = true, b.push(E);
|
|
1748
|
+
for (let y of g(E)) b.push(y);
|
|
1749
|
+
}
|
|
1750
|
+
E = b.pop();
|
|
1751
|
+
}
|
|
1752
|
+
}
|
|
1753
|
+
function l(f) {
|
|
1754
|
+
let g = s.inEdges(f);
|
|
1755
|
+
g ? i[f] = g.reduce((b, m) => {
|
|
1756
|
+
var I;
|
|
1757
|
+
let E = (I = i[m.v]) != null ? I : 0, y = s.edge(m);
|
|
1758
|
+
return Math.max(b, E + (y !== void 0 ? y : 0));
|
|
1759
|
+
}, 0) : i[f] = 0;
|
|
1760
|
+
}
|
|
1761
|
+
function u(f) {
|
|
1762
|
+
let g = s.outEdges(f), b = Number.POSITIVE_INFINITY;
|
|
1763
|
+
g && (b = g.reduce((E, y) => {
|
|
1764
|
+
let I = i[y.w], be = s.edge(y);
|
|
1765
|
+
return Math.min(E, (I !== void 0 ? I : 0) - (be !== void 0 ? be : 0));
|
|
1766
|
+
}, Number.POSITIVE_INFINITY));
|
|
1767
|
+
let m = e.node(f);
|
|
1768
|
+
b !== Number.POSITIVE_INFINITY && m.borderType !== a && (i[f] = Math.max(i[f] !== void 0 ? i[f] : 0, b));
|
|
1769
|
+
}
|
|
1770
|
+
function c(f) {
|
|
1771
|
+
return s.predecessors(f) || [];
|
|
1772
|
+
}
|
|
1773
|
+
function h(f) {
|
|
1774
|
+
return s.successors(f) || [];
|
|
1775
|
+
}
|
|
1776
|
+
return d(l, c), d(u, h), Object.keys(r).forEach((f) => {
|
|
1777
|
+
var b;
|
|
1778
|
+
let g = t[f];
|
|
1779
|
+
g !== void 0 && (i[f] = (b = i[g]) != null ? b : 0);
|
|
1780
|
+
}), i;
|
|
1781
|
+
}
|
|
1782
|
+
function Ct(e, n, t, r) {
|
|
1783
|
+
let o = new p(), i = e.graph(), s = jt(i.nodesep, i.edgesep, r);
|
|
1784
|
+
return n.forEach((a) => {
|
|
1785
|
+
let d;
|
|
1786
|
+
a.forEach((l) => {
|
|
1787
|
+
let u = t[l];
|
|
1788
|
+
if (u !== void 0) {
|
|
1789
|
+
if (o.setNode(u), d !== void 0) {
|
|
1790
|
+
let c = t[d];
|
|
1791
|
+
if (c !== void 0) {
|
|
1792
|
+
let h = o.edge(c, u);
|
|
1793
|
+
o.setEdge(c, u, Math.max(s(e, l, d), h || 0));
|
|
1794
|
+
}
|
|
1795
|
+
}
|
|
1796
|
+
d = l;
|
|
1797
|
+
}
|
|
1798
|
+
});
|
|
1799
|
+
}), o;
|
|
1800
|
+
}
|
|
1801
|
+
function Rt(e, n) {
|
|
1802
|
+
return Object.values(n).reduce((t, r) => {
|
|
1803
|
+
let o = Number.NEGATIVE_INFINITY, i = Number.POSITIVE_INFINITY;
|
|
1804
|
+
Object.entries(r).forEach(([a, d]) => {
|
|
1805
|
+
let l = St(e, a) / 2;
|
|
1806
|
+
o = Math.max(d + l, o), i = Math.min(d - l, i);
|
|
1807
|
+
});
|
|
1808
|
+
let s = o - i;
|
|
1809
|
+
return s < t[0] && (t = [s, r]), t;
|
|
1810
|
+
}, [Number.POSITIVE_INFINITY, null])[1];
|
|
1811
|
+
}
|
|
1812
|
+
function Pt(e, n) {
|
|
1813
|
+
let t = Object.values(n), r = L(Math.min, t), o = L(Math.max, t);
|
|
1814
|
+
["u", "d"].forEach((i) => {
|
|
1815
|
+
["l", "r"].forEach((s) => {
|
|
1816
|
+
let a = i + s, d = e[a];
|
|
1817
|
+
if (!d || d === n) return;
|
|
1818
|
+
let l = Object.values(d), u = r - L(Math.min, l);
|
|
1819
|
+
s !== "l" && (u = o - L(Math.max, l)), u && (e[a] = O(d, (c) => c + u));
|
|
1820
|
+
});
|
|
1821
|
+
});
|
|
1822
|
+
}
|
|
1823
|
+
function Mt(e, n = void 0) {
|
|
1824
|
+
let t = e.ul;
|
|
1825
|
+
return t ? O(t, (r, o) => {
|
|
1826
|
+
var s, a;
|
|
1827
|
+
if (n) {
|
|
1828
|
+
let d = n.toLowerCase(), l = e[d];
|
|
1829
|
+
if (l && l[o] !== void 0) return l[o];
|
|
1830
|
+
}
|
|
1831
|
+
let i = Object.values(e).map((d) => {
|
|
1832
|
+
let l = d[o];
|
|
1833
|
+
return l !== void 0 ? l : 0;
|
|
1834
|
+
}).sort((d, l) => d - l);
|
|
1835
|
+
return (((s = i[1]) != null ? s : 0) + ((a = i[2]) != null ? a : 0)) / 2;
|
|
1836
|
+
}) : {};
|
|
1837
|
+
}
|
|
1838
|
+
function ln(e) {
|
|
1839
|
+
let n = N(e), t = Object.assign(vt(e, n), _t(e, n)), r = {}, o;
|
|
1840
|
+
["u", "d"].forEach((s) => {
|
|
1841
|
+
o = s === "u" ? n : Object.values(n).reverse(), ["l", "r"].forEach((a) => {
|
|
1842
|
+
a === "r" && (o = o.map((c) => Object.values(c).reverse()));
|
|
1843
|
+
let l = Ot(e, o, t, (c) => (s === "u" ? e.predecessors(c) : e.successors(c)) || []), u = It(e, o, l.root, l.align, a === "r");
|
|
1844
|
+
a === "r" && (u = O(u, (c) => -c)), r[s + a] = u;
|
|
1845
|
+
});
|
|
1846
|
+
});
|
|
1847
|
+
let i = Rt(e, r);
|
|
1848
|
+
return Pt(r, i), Mt(r, e.graph().align);
|
|
1849
|
+
}
|
|
1850
|
+
function jt(e, n, t) {
|
|
1851
|
+
return (r, o, i) => {
|
|
1852
|
+
let s = r.node(o), a = r.node(i), d = 0, l;
|
|
1853
|
+
if (d += s.width / 2, Object.hasOwn(s, "labelpos")) switch (s.labelpos.toLowerCase()) {
|
|
1854
|
+
case "l":
|
|
1855
|
+
l = -s.width / 2;
|
|
1856
|
+
break;
|
|
1857
|
+
case "r":
|
|
1858
|
+
l = s.width / 2;
|
|
1859
|
+
break;
|
|
1860
|
+
}
|
|
1861
|
+
if (l && (d += t ? l : -l), l = void 0, d += (s.dummy ? n : e) / 2, d += (a.dummy ? n : e) / 2, d += a.width / 2, Object.hasOwn(a, "labelpos")) switch (a.labelpos.toLowerCase()) {
|
|
1862
|
+
case "l":
|
|
1863
|
+
l = a.width / 2;
|
|
1864
|
+
break;
|
|
1865
|
+
case "r":
|
|
1866
|
+
l = -a.width / 2;
|
|
1867
|
+
break;
|
|
1868
|
+
}
|
|
1869
|
+
return l && (d += t ? l : -l), d;
|
|
1870
|
+
};
|
|
1871
|
+
}
|
|
1872
|
+
function St(e, n) {
|
|
1873
|
+
return e.node(n).width;
|
|
1874
|
+
}
|
|
1875
|
+
function un(e) {
|
|
1876
|
+
e = A(e), Ft(e), Object.entries(ln(e)).forEach(([n, t]) => e.node(n).x = t);
|
|
1877
|
+
}
|
|
1878
|
+
function Ft(e) {
|
|
1879
|
+
let n = N(e), t = e.graph(), r = t.ranksep, o = t.rankalign, i = 0;
|
|
1880
|
+
n.forEach((s) => {
|
|
1881
|
+
let a = s.reduce((d, l) => {
|
|
1882
|
+
var c;
|
|
1883
|
+
let u = (c = e.node(l).height) != null ? c : 0;
|
|
1884
|
+
return d > u ? d : u;
|
|
1885
|
+
}, 0);
|
|
1886
|
+
s.forEach((d) => {
|
|
1887
|
+
let l = e.node(d);
|
|
1888
|
+
o === "top" ? l.y = i + l.height / 2 : o === "bottom" ? l.y = i + a - l.height / 2 : l.y = i + a / 2;
|
|
1889
|
+
}), i += a + r;
|
|
1890
|
+
});
|
|
1891
|
+
}
|
|
1892
|
+
function he(e, n = {}) {
|
|
1893
|
+
let t = n.debugTiming ? P : M;
|
|
1894
|
+
return t("layout", () => {
|
|
1895
|
+
let r = t(" buildLayoutGraph", () => Xt(e));
|
|
1896
|
+
return t(" runLayout", () => Dt(r, t, n)), t(" updateInputGraph", () => At(e, r)), r;
|
|
1897
|
+
});
|
|
1898
|
+
}
|
|
1899
|
+
function Dt(e, n, t) {
|
|
1900
|
+
n(" makeSpaceForEdgeLabels", () => Ut(e)), n(" removeSelfEdges", () => rr(e)), n(" acyclic", () => je(e)), n(" nestingGraph.run", () => Ke(e)), n(" rank", () => Xe(A(e))), n(" injectEdgeLabelProxies", () => Kt(e)), n(" removeEmptyRanks", () => Oe(e)), n(" nestingGraph.cleanup", () => Je(e)), n(" normalizeRanks", () => Te(e)), n(" assignRankMinMax", () => $t(e)), n(" removeEdgeLabelProxies", () => Jt(e)), n(" normalize.run", () => Fe(e)), n(" parentDummyChains", () => Ue(e)), n(" addBorderSegments", () => Ze(e)), n(" order", () => B(e, t)), n(" insertSelfEdges", () => or(e)), n(" adjustCoordinateSystem", () => nn(e)), n(" position", () => un(e)), n(" positionSelfEdges", () => ir(e)), n(" removeBorderNodes", () => tr(e)), n(" normalize.undo", () => De(e)), n(" fixupEdgeLabelCoords", () => er(e)), n(" undoCoordinateSystem", () => tn(e)), n(" translateGraph", () => Qt(e)), n(" assignNodeIntersects", () => Zt(e)), n(" reversePoints", () => nr(e)), n(" acyclic.undo", () => Se(e));
|
|
1901
|
+
}
|
|
1902
|
+
function At(e, n) {
|
|
1903
|
+
e.nodes().forEach((t) => {
|
|
1904
|
+
let r = e.node(t), o = n.node(t);
|
|
1905
|
+
r && (r.x = o.x, r.y = o.y, r.order = o.order, r.rank = o.rank, n.children(t).length && (r.width = o.width, r.height = o.height));
|
|
1906
|
+
}), e.edges().forEach((t) => {
|
|
1907
|
+
let r = e.edge(t), o = n.edge(t);
|
|
1908
|
+
r.points = o.points, Object.hasOwn(o, "x") && (r.x = o.x, r.y = o.y);
|
|
1909
|
+
}), e.graph().width = n.graph().width, e.graph().height = n.graph().height;
|
|
1910
|
+
}
|
|
1911
|
+
var Vt = ["nodesep", "edgesep", "ranksep", "marginx", "marginy"];
|
|
1912
|
+
var Wt = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: "TB", rankalign: "center" };
|
|
1913
|
+
var Bt = ["acyclicer", "ranker", "rankdir", "align", "rankalign"];
|
|
1914
|
+
var Yt = ["width", "height", "rank"];
|
|
1915
|
+
var cn = { width: 0, height: 0 };
|
|
1916
|
+
var zt = ["minlen", "weight", "width", "height", "labeloffset"];
|
|
1917
|
+
var Ht = { minlen: 1, weight: 1, width: 0, height: 0, labeloffset: 10, labelpos: "r" };
|
|
1918
|
+
var qt = ["labelpos"];
|
|
1919
|
+
function Xt(e) {
|
|
1920
|
+
let n = new p({ multigraph: true, compound: true }), t = ce(e.graph());
|
|
1921
|
+
return n.setGraph(Object.assign({}, Wt, ue(t, Vt), T(t, Bt))), e.nodes().forEach((r) => {
|
|
1922
|
+
let o = ce(e.node(r)), i = ue(o, Yt);
|
|
1923
|
+
Object.keys(cn).forEach((a) => {
|
|
1924
|
+
i[a] === void 0 && (i[a] = cn[a]);
|
|
1925
|
+
}), n.setNode(r, i);
|
|
1926
|
+
let s = e.parent(r);
|
|
1927
|
+
s !== void 0 && n.setParent(r, s);
|
|
1928
|
+
}), e.edges().forEach((r) => {
|
|
1929
|
+
let o = ce(e.edge(r));
|
|
1930
|
+
n.setEdge(r, Object.assign({}, Ht, ue(o, zt), T(o, qt)));
|
|
1931
|
+
}), n;
|
|
1932
|
+
}
|
|
1933
|
+
function Ut(e) {
|
|
1934
|
+
let n = e.graph();
|
|
1935
|
+
n.ranksep /= 2, e.edges().forEach((t) => {
|
|
1936
|
+
let r = e.edge(t);
|
|
1937
|
+
r.minlen *= 2, r.labelpos.toLowerCase() !== "c" && (n.rankdir === "TB" || n.rankdir === "BT" ? r.width += r.labeloffset : r.height += r.labeloffset);
|
|
1938
|
+
});
|
|
1939
|
+
}
|
|
1940
|
+
function Kt(e) {
|
|
1941
|
+
e.edges().forEach((n) => {
|
|
1942
|
+
let t = e.edge(n);
|
|
1943
|
+
if (t.width && t.height) {
|
|
1944
|
+
let r = e.node(n.v), i = { rank: (e.node(n.w).rank - r.rank) / 2 + r.rank, e: n };
|
|
1945
|
+
w(e, "edge-proxy", i, "_ep");
|
|
1946
|
+
}
|
|
1947
|
+
});
|
|
1948
|
+
}
|
|
1949
|
+
function $t(e) {
|
|
1950
|
+
let n = 0;
|
|
1951
|
+
e.nodes().forEach((t) => {
|
|
1952
|
+
let r = e.node(t);
|
|
1953
|
+
r.borderTop && (r.minRank = e.node(r.borderTop).rank, r.maxRank = e.node(r.borderBottom).rank, n = Math.max(n, r.maxRank));
|
|
1954
|
+
}), e.graph().maxRank = n;
|
|
1955
|
+
}
|
|
1956
|
+
function Jt(e) {
|
|
1957
|
+
e.nodes().forEach((n) => {
|
|
1958
|
+
let t = e.node(n);
|
|
1959
|
+
if (t.dummy === "edge-proxy") {
|
|
1960
|
+
let r = t;
|
|
1961
|
+
e.edge(r.e).labelRank = t.rank, e.removeNode(n);
|
|
1962
|
+
}
|
|
1963
|
+
});
|
|
1964
|
+
}
|
|
1965
|
+
function Qt(e) {
|
|
1966
|
+
let n = Number.POSITIVE_INFINITY, t = 0, r = Number.POSITIVE_INFINITY, o = 0, i = e.graph(), s = i.marginx || 0, a = i.marginy || 0;
|
|
1967
|
+
function d(l) {
|
|
1968
|
+
let u = l.x, c = l.y, h = l.width, f = l.height;
|
|
1969
|
+
n = Math.min(n, u - h / 2), t = Math.max(t, u + h / 2), r = Math.min(r, c - f / 2), o = Math.max(o, c + f / 2);
|
|
1970
|
+
}
|
|
1971
|
+
e.nodes().forEach((l) => d(e.node(l))), e.edges().forEach((l) => {
|
|
1972
|
+
let u = e.edge(l);
|
|
1973
|
+
Object.hasOwn(u, "x") && d(u);
|
|
1974
|
+
}), n -= s, r -= a, e.nodes().forEach((l) => {
|
|
1975
|
+
let u = e.node(l);
|
|
1976
|
+
u.x -= n, u.y -= r;
|
|
1977
|
+
}), e.edges().forEach((l) => {
|
|
1978
|
+
let u = e.edge(l);
|
|
1979
|
+
u.points.forEach((c) => {
|
|
1980
|
+
c.x -= n, c.y -= r;
|
|
1981
|
+
}), Object.hasOwn(u, "x") && (u.x -= n), Object.hasOwn(u, "y") && (u.y -= r);
|
|
1982
|
+
}), i.width = t - n + s, i.height = o - r + a;
|
|
1983
|
+
}
|
|
1984
|
+
function Zt(e) {
|
|
1985
|
+
e.edges().forEach((n) => {
|
|
1986
|
+
let t = e.edge(n), r = e.node(n.v), o = e.node(n.w), i, s;
|
|
1987
|
+
t.points ? (i = t.points[0], s = t.points[t.points.length - 1]) : (t.points = [], i = o, s = r), t.points.unshift(H(r, i)), t.points.push(H(o, s));
|
|
1988
|
+
});
|
|
1989
|
+
}
|
|
1990
|
+
function er(e) {
|
|
1991
|
+
e.edges().forEach((n) => {
|
|
1992
|
+
let t = e.edge(n);
|
|
1993
|
+
if (Object.hasOwn(t, "x")) switch ((t.labelpos === "l" || t.labelpos === "r") && (t.width -= t.labeloffset), t.labelpos) {
|
|
1994
|
+
case "l":
|
|
1995
|
+
t.x -= t.width / 2 + t.labeloffset;
|
|
1996
|
+
break;
|
|
1997
|
+
case "r":
|
|
1998
|
+
t.x += t.width / 2 + t.labeloffset;
|
|
1999
|
+
break;
|
|
2000
|
+
}
|
|
2001
|
+
});
|
|
2002
|
+
}
|
|
2003
|
+
function nr(e) {
|
|
2004
|
+
e.edges().forEach((n) => {
|
|
2005
|
+
let t = e.edge(n);
|
|
2006
|
+
t.reversed && t.points.reverse();
|
|
2007
|
+
});
|
|
2008
|
+
}
|
|
2009
|
+
function tr(e) {
|
|
2010
|
+
e.nodes().forEach((n) => {
|
|
2011
|
+
if (e.children(n).length) {
|
|
2012
|
+
let t = e.node(n), r = e.node(t.borderTop), o = e.node(t.borderBottom), i = e.node(t.borderLeft[t.borderLeft.length - 1]), s = e.node(t.borderRight[t.borderRight.length - 1]);
|
|
2013
|
+
t.width = Math.abs(s.x - i.x), t.height = Math.abs(o.y - r.y), t.x = i.x + t.width / 2, t.y = r.y + t.height / 2;
|
|
2014
|
+
}
|
|
2015
|
+
}), e.nodes().forEach((n) => {
|
|
2016
|
+
e.node(n).dummy === "border" && e.removeNode(n);
|
|
2017
|
+
});
|
|
2018
|
+
}
|
|
2019
|
+
function rr(e) {
|
|
2020
|
+
e.edges().forEach((n) => {
|
|
2021
|
+
if (n.v === n.w) {
|
|
2022
|
+
let t = e.node(n.v);
|
|
2023
|
+
t.selfEdges || (t.selfEdges = []), t.selfEdges.push({ e: n, label: e.edge(n) }), e.removeEdge(n);
|
|
2024
|
+
}
|
|
2025
|
+
});
|
|
2026
|
+
}
|
|
2027
|
+
function or(e) {
|
|
2028
|
+
N(e).forEach((t) => {
|
|
2029
|
+
let r = 0;
|
|
2030
|
+
t.forEach((o, i) => {
|
|
2031
|
+
let s = e.node(o);
|
|
2032
|
+
s.order = i + r, (s.selfEdges || []).forEach((a) => {
|
|
2033
|
+
w(e, "selfedge", { width: a.label.width, height: a.label.height, rank: s.rank, order: i + ++r, e: a.e, label: a.label }, "_se");
|
|
2034
|
+
}), delete s.selfEdges;
|
|
2035
|
+
});
|
|
2036
|
+
});
|
|
2037
|
+
}
|
|
2038
|
+
function ir(e) {
|
|
2039
|
+
e.nodes().forEach((n) => {
|
|
2040
|
+
let t = e.node(n);
|
|
2041
|
+
if (t.dummy === "selfedge") {
|
|
2042
|
+
let r = t, o = e.node(r.e.v), i = o.x + o.width / 2, s = o.y, a = t.x - i, d = o.height / 2;
|
|
2043
|
+
e.setEdge(r.e, r.label), e.removeNode(n), r.label.points = [{ x: i + 2 * a / 3, y: s - d }, { x: i + 5 * a / 6, y: s - d }, { x: i + a, y: s }, { x: i + 5 * a / 6, y: s + d }, { x: i + 2 * a / 3, y: s + d }], r.label.x = t.x, r.label.y = t.y;
|
|
2044
|
+
}
|
|
2045
|
+
});
|
|
2046
|
+
}
|
|
2047
|
+
function ue(e, n) {
|
|
2048
|
+
return O(T(e, n), Number);
|
|
2049
|
+
}
|
|
2050
|
+
function ce(e) {
|
|
2051
|
+
let n = {};
|
|
2052
|
+
return e && Object.entries(e).forEach(([t, r]) => {
|
|
2053
|
+
typeof t == "string" && (t = t.toLowerCase()), n[t] = r;
|
|
2054
|
+
}), n;
|
|
2055
|
+
}
|
|
2056
|
+
function fe(e) {
|
|
2057
|
+
let n = N(e), t = new p({ compound: true, multigraph: true }).setGraph({});
|
|
2058
|
+
return e.nodes().forEach((r) => {
|
|
2059
|
+
t.setNode(r, { label: r }), t.setParent(r, "layer" + e.node(r).rank);
|
|
2060
|
+
}), e.edges().forEach((r) => t.setEdge(r.v, r.w, {}, r.name)), n.forEach((r, o) => {
|
|
2061
|
+
let i = "layer" + o;
|
|
2062
|
+
t.setNode(i, { rank: "same" }), r.reduce((s, a) => (t.setEdge(s, a, { style: "invis" }), a));
|
|
2063
|
+
}), t;
|
|
2064
|
+
}
|
|
2065
|
+
var sr = { graphlib: z, version: U, layout: he, debug: fe, util: { time: P, notime: M } };
|
|
2066
|
+
var To = sr;
|
|
2067
|
+
|
|
417
2068
|
// src/blocks/erd.ts
|
|
2069
|
+
var MAX_ROWS = 10;
|
|
2070
|
+
var COL_W = 216;
|
|
2071
|
+
var ROW_H = 24;
|
|
2072
|
+
var HEAD_H = 32;
|
|
2073
|
+
var BOT_PAD = 8;
|
|
418
2074
|
function renderErd(data) {
|
|
419
2075
|
const ents = data.entities ?? [];
|
|
420
2076
|
const rels = data.relations ?? [];
|
|
421
|
-
const colW = 200;
|
|
422
|
-
const rowH = 22;
|
|
423
|
-
const headH = 30;
|
|
424
|
-
const gapX = 80;
|
|
425
|
-
const top = 14;
|
|
426
|
-
const pad = 16;
|
|
427
|
-
let x = pad;
|
|
428
|
-
let maxH = 0;
|
|
429
2077
|
const boxes = ents.map((e) => {
|
|
430
2078
|
const cols = e.columns ?? [];
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
2079
|
+
let rows = cols;
|
|
2080
|
+
let hidden = 0;
|
|
2081
|
+
if (cols.length > MAX_ROWS) {
|
|
2082
|
+
rows = cols.slice(0, MAX_ROWS - 1);
|
|
2083
|
+
hidden = cols.length - rows.length;
|
|
2084
|
+
}
|
|
2085
|
+
const bodyRows = rows.length + (hidden > 0 ? 1 : 0);
|
|
2086
|
+
return {
|
|
2087
|
+
name: e.name,
|
|
2088
|
+
cols,
|
|
2089
|
+
rows,
|
|
2090
|
+
hidden,
|
|
2091
|
+
pkIdx: cols.findIndex((c) => c.pk === true),
|
|
2092
|
+
w: COL_W,
|
|
2093
|
+
h: HEAD_H + bodyRows * ROW_H + BOT_PAD
|
|
2094
|
+
};
|
|
436
2095
|
});
|
|
437
|
-
const
|
|
438
|
-
const
|
|
439
|
-
const
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
const
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
const
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
const
|
|
456
|
-
|
|
2096
|
+
const byName = new Map(boxes.map((b) => [b.name, b]));
|
|
2097
|
+
const validRels = rels.filter((r) => byName.has(r.from) && byName.has(r.to));
|
|
2098
|
+
const g = new To.graphlib.Graph({ multigraph: true });
|
|
2099
|
+
g.setGraph({ rankdir: "LR", nodesep: 38, ranksep: 96, marginx: 18, marginy: 18 });
|
|
2100
|
+
g.setDefaultEdgeLabel(() => ({}));
|
|
2101
|
+
for (const b of boxes) g.setNode(b.name, { width: b.w, height: b.h });
|
|
2102
|
+
validRels.forEach((r, i) => g.setEdge(r.from, r.to, {}, `e${i}`));
|
|
2103
|
+
To.layout(g);
|
|
2104
|
+
const graph = g.graph();
|
|
2105
|
+
const W2 = Math.ceil(graph.width ?? 0);
|
|
2106
|
+
const H2 = Math.ceil(graph.height ?? 0);
|
|
2107
|
+
const at2 = /* @__PURE__ */ new Map();
|
|
2108
|
+
for (const b of boxes) {
|
|
2109
|
+
const n = g.node(b.name);
|
|
2110
|
+
at2.set(b.name, { x: n.x - b.w / 2, y: n.y - b.h / 2 });
|
|
2111
|
+
}
|
|
2112
|
+
let s = `<svg viewBox="0 0 ${W2} ${H2}" role="img"><title>Entity-relationship diagram</title>`;
|
|
2113
|
+
validRels.forEach((r) => {
|
|
2114
|
+
const src = byName.get(r.from);
|
|
2115
|
+
const tgt = byName.get(r.to);
|
|
2116
|
+
const sp = at2.get(r.from);
|
|
2117
|
+
const tp = at2.get(r.to);
|
|
2118
|
+
if (!src || !tgt || !sp || !tp) return;
|
|
2119
|
+
const fkY = rowAnchorY(src, sp.y, pickFkIndex(src.cols, tgt.name));
|
|
2120
|
+
const pkY = rowAnchorY(tgt, tp.y, tgt.pkIdx);
|
|
2121
|
+
const rightward = tp.x + tgt.w / 2 >= sp.x + src.w / 2;
|
|
2122
|
+
const sx = rightward ? sp.x + src.w : sp.x;
|
|
2123
|
+
const tx = rightward ? tp.x : tp.x + tgt.w;
|
|
2124
|
+
const lo = Math.min(sx, tx) + 10;
|
|
2125
|
+
const hi = Math.max(sx, tx) - 10;
|
|
2126
|
+
const midX = hi > lo ? clamp((sx + tx) / 2, lo, hi) : (sx + tx) / 2;
|
|
2127
|
+
s += `<path d="M${round(sx)},${round(fkY)} H${round(midX)} V${round(pkY)} H${round(tx)}" fill="none" stroke="var(--gray)" stroke-width="1.5"/><circle cx="${round(sx)}" cy="${round(fkY)}" r="2.6" fill="var(--gray)"/>` + arrowHeadH(tx, pkY, rightward);
|
|
457
2128
|
if (r.card !== void 0) {
|
|
458
|
-
const
|
|
459
|
-
const cy = (
|
|
460
|
-
s += `<rect x="${
|
|
2129
|
+
const w2 = 30;
|
|
2130
|
+
const cy = (fkY + pkY) / 2;
|
|
2131
|
+
s += `<rect x="${round(midX - w2 / 2)}" y="${round(cy - 9)}" width="${w2}" height="18" rx="9" fill="var(--white)" stroke="var(--rule)"/><text x="${round(midX)}" y="${round(cy + 3)}" class="edge-label">${escapeHtml(r.card)}</text>`;
|
|
461
2132
|
}
|
|
462
|
-
}
|
|
2133
|
+
});
|
|
463
2134
|
for (const b of boxes) {
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
2135
|
+
const p2 = at2.get(b.name);
|
|
2136
|
+
if (!p2) continue;
|
|
2137
|
+
const { x: x2, y } = p2;
|
|
2138
|
+
s += `<rect x="${round(x2)}" y="${round(y)}" width="${b.w}" height="${b.h}" rx="5" fill="var(--white)" stroke="var(--navy)"/><path d="M${round(x2)},${round(y + HEAD_H)} v${ -27} a5,5 0 0 1 5,-5 h${b.w - 10} a5,5 0 0 1 5,5 v${HEAD_H - 5} z" fill="var(--navy)"/><text x="${round(x2 + b.w / 2)}" y="${round(y + 21)}" class="er-head-text">${escapeHtml(b.name)}</text>`;
|
|
2139
|
+
b.rows.forEach((f, j2) => {
|
|
2140
|
+
const rowTop = y + HEAD_H + j2 * ROW_H;
|
|
2141
|
+
const ty = rowTop + 16;
|
|
2142
|
+
if (j2 > 0) {
|
|
2143
|
+
s += `<line x1="${round(x2)}" y1="${round(rowTop)}" x2="${round(x2 + b.w)}" y2="${round(rowTop)}" class="er-rowline"/>`;
|
|
470
2144
|
}
|
|
2145
|
+
const nameX = f.pk === true || f.fk === true ? x2 + 40 : x2 + 13;
|
|
471
2146
|
if (f.pk === true) {
|
|
472
|
-
s += `<text x="${
|
|
2147
|
+
s += `<text x="${round(x2 + 13)}" y="${round(ty)}" class="er-key">PK</text>`;
|
|
473
2148
|
} else if (f.fk === true) {
|
|
474
|
-
s += `<text x="${
|
|
2149
|
+
s += `<text x="${round(x2 + 13)}" y="${round(ty)}" class="er-key fk">FK</text>`;
|
|
475
2150
|
}
|
|
476
|
-
s += `<text x="${nameX}" y="${
|
|
2151
|
+
s += `<text x="${round(nameX)}" y="${round(ty)}" class="er-col">${escapeHtml(f.name)}</text><text x="${round(x2 + b.w - 13)}" y="${round(ty)}" class="er-col dim" text-anchor="end">${escapeHtml(f.type ?? "")}</text>`;
|
|
477
2152
|
});
|
|
2153
|
+
if (b.hidden > 0) {
|
|
2154
|
+
const rowTop = y + HEAD_H + b.rows.length * ROW_H;
|
|
2155
|
+
s += `<line x1="${round(x2)}" y1="${round(rowTop)}" x2="${round(x2 + b.w)}" y2="${round(rowTop)}" class="er-rowline"/><text x="${round(x2 + b.w / 2)}" y="${round(rowTop + 16)}" class="er-col dim" text-anchor="middle">\u2026 +${b.hidden} more</text>`;
|
|
2156
|
+
}
|
|
478
2157
|
}
|
|
479
2158
|
s += `</svg>`;
|
|
480
2159
|
const opts = {
|
|
@@ -485,18 +2164,28 @@ function renderErd(data) {
|
|
|
485
2164
|
};
|
|
486
2165
|
return diagramFrame(opts, s);
|
|
487
2166
|
}
|
|
2167
|
+
function rowAnchorY(box, topY, idx) {
|
|
2168
|
+
if (idx >= 0 && idx < box.rows.length) return topY + HEAD_H + idx * ROW_H + ROW_H / 2;
|
|
2169
|
+
return topY + box.h / 2;
|
|
2170
|
+
}
|
|
488
2171
|
function pickFkIndex(columns, toName) {
|
|
489
|
-
const fks = columns.map((c, i) => ({ c, i })).filter((
|
|
2172
|
+
const fks = columns.map((c, i) => ({ c, i })).filter((x2) => x2.c.fk === true);
|
|
490
2173
|
const first = fks[0];
|
|
491
2174
|
if (first === void 0) return -1;
|
|
492
2175
|
const t = toName.toLowerCase();
|
|
493
2176
|
const singular = t.replace(/s$/, "");
|
|
494
|
-
const match = fks.find((
|
|
495
|
-
const n =
|
|
2177
|
+
const match = fks.find((x2) => {
|
|
2178
|
+
const n = x2.c.name.toLowerCase();
|
|
496
2179
|
return n.includes(t) || n.includes(singular);
|
|
497
2180
|
});
|
|
498
2181
|
return (match ?? first).i;
|
|
499
2182
|
}
|
|
2183
|
+
function arrowHeadH(x2, y, pointRight) {
|
|
2184
|
+
const dx = pointRight ? -10 : 10;
|
|
2185
|
+
return `<path d="M${round(x2 + dx)},${round(y - 5)} L${round(x2)},${round(y)} L${round(x2 + dx)},${round(y + 5)}" fill="none" stroke="var(--navy)" stroke-width="1.6" stroke-linejoin="round" stroke-linecap="round"/>`;
|
|
2186
|
+
}
|
|
2187
|
+
var clamp = (n, lo, hi) => Math.max(lo, Math.min(hi, n));
|
|
2188
|
+
var round = (n) => Math.round(n * 10) / 10;
|
|
500
2189
|
|
|
501
2190
|
// src/blocks/kanban.ts
|
|
502
2191
|
function renderKanban(data) {
|
|
@@ -544,21 +2233,21 @@ function renderFoot(foot) {
|
|
|
544
2233
|
function renderSequence(data) {
|
|
545
2234
|
const actors = data.actors ?? [];
|
|
546
2235
|
const messages = data.messages ?? [];
|
|
547
|
-
const
|
|
2236
|
+
const N2 = Math.max(actors.length, 1);
|
|
548
2237
|
const leftPad = 24;
|
|
549
2238
|
const laneW = 168;
|
|
550
2239
|
const gap = 58;
|
|
551
2240
|
const headY = 16;
|
|
552
2241
|
const headH = 42;
|
|
553
2242
|
const cx = (i) => leftPad + laneW / 2 + i * (laneW + gap);
|
|
554
|
-
const width = leftPad * 2 +
|
|
2243
|
+
const width = leftPad * 2 + N2 * laneW + (N2 - 1) * gap;
|
|
555
2244
|
const idx = (id) => actors.findIndex((a) => a.id === id);
|
|
556
2245
|
const msgStartY = 92;
|
|
557
2246
|
const step = 42;
|
|
558
|
-
const rows = messages.map((m,
|
|
2247
|
+
const rows = messages.map((m, k2) => {
|
|
559
2248
|
const base = {
|
|
560
|
-
n:
|
|
561
|
-
y: msgStartY +
|
|
2249
|
+
n: k2 + 1,
|
|
2250
|
+
y: msgStartY + k2 * step,
|
|
562
2251
|
fromI: idx(m.from),
|
|
563
2252
|
toI: idx(m.to),
|
|
564
2253
|
kind: m.kind ?? "sync",
|
|
@@ -582,8 +2271,8 @@ function renderSequence(data) {
|
|
|
582
2271
|
});
|
|
583
2272
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>Sequence diagram</title><defs><marker id="sqArrow" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#1a1a2e"/></marker><marker id="sqOpen" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10" fill="none" stroke="#1a1a2e" stroke-width="1.2"/></marker><marker id="sqErr" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse"><path d="M0,0 L10,5 L0,10 z" fill="#991b1b"/></marker></defs>`;
|
|
584
2273
|
for (let i = 0; i < actors.length; i++) {
|
|
585
|
-
const
|
|
586
|
-
s += `<line x1="${
|
|
2274
|
+
const x2 = cx(i);
|
|
2275
|
+
s += `<line x1="${x2}" y1="${headY + headH}" x2="${x2}" y2="${bottom}" class="lifeline"/>`;
|
|
587
2276
|
}
|
|
588
2277
|
for (const ac of activations) {
|
|
589
2278
|
if (!ac) continue;
|
|
@@ -595,17 +2284,17 @@ function renderSequence(data) {
|
|
|
595
2284
|
s += `<g><rect x="${cx(i) - laneW / 2}" y="${headY}" width="${laneW}" height="${headH}" class="lane-head${extCls}"/><text x="${cx(i)}" y="${headY + 22}" class="lane-head-text">${escapeHtml(a.name)}</text>` + sub + `</g>`;
|
|
596
2285
|
});
|
|
597
2286
|
for (const r of rows) {
|
|
598
|
-
const
|
|
2287
|
+
const k2 = KIND[r.kind];
|
|
599
2288
|
if (r.kind === "note" || r.toI < 0) {
|
|
600
2289
|
if (r.fromI < 0) continue;
|
|
601
|
-
const
|
|
602
|
-
s += `<g><circle cx="${
|
|
2290
|
+
const x3 = cx(r.fromI);
|
|
2291
|
+
s += `<g><circle cx="${x3 + 18}" cy="${r.y - 10}" r="10" class="step-badge"/><text x="${x3 + 18}" y="${r.y - 6.5}" class="step-badge-text">${r.n}</text><text x="${x3 + 34}" y="${r.y - 6}" class="msg-text note">${escapeHtml(r.label)}</text></g>`;
|
|
603
2292
|
continue;
|
|
604
2293
|
}
|
|
605
2294
|
if (r.fromI === r.toI) {
|
|
606
|
-
const
|
|
2295
|
+
const x3 = cx(r.fromI);
|
|
607
2296
|
const errCls = r.kind === "error" ? " err" : "";
|
|
608
|
-
s += `<g><circle cx="${
|
|
2297
|
+
s += `<g><circle cx="${x3 + 18}" cy="${r.y - 10}" r="10" class="step-badge${errCls}"/><text x="${x3 + 18}" y="${r.y - 6.5}" class="step-badge-text">${r.n}</text><text x="${x3 + 34}" y="${r.y - 6}" class="msg-text note">${escapeHtml(r.label)}</text></g>`;
|
|
609
2298
|
continue;
|
|
610
2299
|
}
|
|
611
2300
|
const x1 = cx(r.fromI);
|
|
@@ -616,8 +2305,8 @@ function renderSequence(data) {
|
|
|
616
2305
|
const badgeX = ltr ? x1 + 18 : x1 - 18;
|
|
617
2306
|
const labelX = ltr ? badgeX + 16 : badgeX - 16;
|
|
618
2307
|
const labelAnchor = ltr ? "start" : "end";
|
|
619
|
-
const markerAttr =
|
|
620
|
-
s += `<line x1="${x1}" y1="${r.y}" x2="${end}" y2="${r.y}" class="${
|
|
2308
|
+
const markerAttr = k2.marker !== null ? ` marker-end="url(#${k2.marker})"` : "";
|
|
2309
|
+
s += `<line x1="${x1}" y1="${r.y}" x2="${end}" y2="${r.y}" class="${k2.cls}"${markerAttr}/><circle cx="${badgeX}" cy="${r.y - 10}" r="10" class="step-badge${errBadge}"/><text x="${badgeX}" y="${r.y - 6.5}" class="step-badge-text">${r.n}</text><text x="${labelX}" y="${r.y - 6}" class="${k2.txt}" text-anchor="${labelAnchor}">${escapeHtml(r.label)}</text>`;
|
|
621
2310
|
}
|
|
622
2311
|
s += `</svg>`;
|
|
623
2312
|
const actorById = /* @__PURE__ */ new Map();
|
|
@@ -690,11 +2379,11 @@ function renderTable(data) {
|
|
|
690
2379
|
function renderTimeline(data) {
|
|
691
2380
|
const items = data.items ?? [];
|
|
692
2381
|
let h = `<div class="tl">`;
|
|
693
|
-
for (const
|
|
694
|
-
const
|
|
695
|
-
const date =
|
|
696
|
-
const desc =
|
|
697
|
-
h += `<div class="tl-item"><span class="tl-dot ${
|
|
2382
|
+
for (const it2 of items) {
|
|
2383
|
+
const st2 = it2.status ?? "future";
|
|
2384
|
+
const date = it2.date !== void 0 ? `<div class="tl-date">${escapeHtml(it2.date)}</div>` : "";
|
|
2385
|
+
const desc = it2.desc !== void 0 ? `<div class="tl-desc">${escapeHtml(it2.desc)}</div>` : "";
|
|
2386
|
+
h += `<div class="tl-item"><span class="tl-dot ${st2}"></span>` + date + `<div class="tl-label">${escapeHtml(it2.label)}</div>` + desc + `</div>`;
|
|
698
2387
|
}
|
|
699
2388
|
return h + `</div>`;
|
|
700
2389
|
}
|
|
@@ -708,18 +2397,18 @@ function renderTracker(data) {
|
|
|
708
2397
|
if (hasOwner) headCells.push("<th>Owner</th>");
|
|
709
2398
|
if (hasDue) headCells.push("<th>Due</th>");
|
|
710
2399
|
let h = `<table class="trk"><thead><tr>${headCells.join("")}</tr></thead><tbody>`;
|
|
711
|
-
for (const
|
|
712
|
-
const
|
|
713
|
-
const pr =
|
|
2400
|
+
for (const it2 of items) {
|
|
2401
|
+
const st2 = it2.status ?? "todo";
|
|
2402
|
+
const pr = it2.priority;
|
|
714
2403
|
const prCell = pr !== void 0 ? `<span class="pri ${pr}">${escapeHtml(pr)}</span>` : "";
|
|
715
|
-
const rowCls =
|
|
2404
|
+
const rowCls = st2 === "done" ? ' class="done"' : "";
|
|
716
2405
|
const cells = [
|
|
717
|
-
`<td class="trk-task">${escapeHtml(
|
|
718
|
-
`<td><span class="st ${
|
|
2406
|
+
`<td class="trk-task">${escapeHtml(it2.task)}</td>`,
|
|
2407
|
+
`<td><span class="st ${st2}">${escapeHtml(st2)}</span></td>`,
|
|
719
2408
|
`<td>${prCell}</td>`
|
|
720
2409
|
];
|
|
721
|
-
if (hasOwner) cells.push(`<td>${escapeHtml(
|
|
722
|
-
if (hasDue) cells.push(`<td>${escapeHtml(
|
|
2410
|
+
if (hasOwner) cells.push(`<td>${escapeHtml(it2.owner ?? "")}</td>`);
|
|
2411
|
+
if (hasDue) cells.push(`<td>${escapeHtml(it2.due ?? "")}</td>`);
|
|
723
2412
|
h += `<tr${rowCls}>${cells.join("")}</tr>`;
|
|
724
2413
|
}
|
|
725
2414
|
return h + `</tbody></table>`;
|
|
@@ -767,11 +2456,11 @@ function renderProseBlock(data) {
|
|
|
767
2456
|
if (t === "h") return `<h3>${escapeHtml(text)}</h3>`;
|
|
768
2457
|
if (t === "quote") return `<blockquote>${escapeHtml(text)}</blockquote>`;
|
|
769
2458
|
if (t === "ul") {
|
|
770
|
-
const items = (b.items ?? []).map((
|
|
2459
|
+
const items = (b.items ?? []).map((x2) => `<li>${escapeHtml(x2)}</li>`).join("");
|
|
771
2460
|
return `<ul>${items}</ul>`;
|
|
772
2461
|
}
|
|
773
2462
|
if (t === "ol") {
|
|
774
|
-
const items = (b.items ?? []).map((
|
|
2463
|
+
const items = (b.items ?? []).map((x2) => `<li>${escapeHtml(x2)}</li>`).join("");
|
|
775
2464
|
return `<ol>${items}</ol>`;
|
|
776
2465
|
}
|
|
777
2466
|
return `<p>${escapeHtml(text)}</p>`;
|
|
@@ -792,7 +2481,7 @@ function renderGlossary(data) {
|
|
|
792
2481
|
function renderProsCons(data) {
|
|
793
2482
|
const prosLabel = data.prosLabel ?? "Pros";
|
|
794
2483
|
const consLabel = data.consLabel ?? "Cons";
|
|
795
|
-
const pros = (data.pros ?? []).map((
|
|
2484
|
+
const pros = (data.pros ?? []).map((p2) => `<div class="pc-item">${escapeHtml(p2)}</div>`).join("");
|
|
796
2485
|
const cons = (data.cons ?? []).map((c) => `<div class="pc-item">${escapeHtml(c)}</div>`).join("");
|
|
797
2486
|
return `<div class="pc"><div class="pc-col pro"><div class="pc-head">${escapeHtml(prosLabel)}</div>` + pros + `</div><div class="pc-col con"><div class="pc-head">${escapeHtml(consLabel)}</div>` + cons + `</div></div>`;
|
|
798
2487
|
}
|
|
@@ -801,8 +2490,8 @@ function renderProsCons(data) {
|
|
|
801
2490
|
function renderCvt(data) {
|
|
802
2491
|
const cur = data.current ?? {};
|
|
803
2492
|
const tgt = data.target ?? {};
|
|
804
|
-
const curItems = (cur.items ?? []).map((
|
|
805
|
-
const tgtItems = (tgt.items ?? []).map((
|
|
2493
|
+
const curItems = (cur.items ?? []).map((x2) => `<div class="ct-item">${escapeHtml(x2)}</div>`).join("");
|
|
2494
|
+
const tgtItems = (tgt.items ?? []).map((x2) => `<div class="ct-item">${escapeHtml(x2)}</div>`).join("");
|
|
806
2495
|
const curLabel = cur.label ?? "Current";
|
|
807
2496
|
const tgtLabel = tgt.label ?? "Target";
|
|
808
2497
|
const note = data.note !== void 0 ? `<div class="tbl-note">${escapeHtml(data.note)}</div>` : "";
|
|
@@ -846,9 +2535,9 @@ function highlightCode(code) {
|
|
|
846
2535
|
} else if (m[3] !== void 0) {
|
|
847
2536
|
out += `<span class="num">${escapeHtml(t)}</span>`;
|
|
848
2537
|
} else {
|
|
849
|
-
const
|
|
850
|
-
if (KW.has(
|
|
851
|
-
else if (TY.has(
|
|
2538
|
+
const lt2 = t.toLowerCase();
|
|
2539
|
+
if (KW.has(lt2)) out += `<span class="kw">${escapeHtml(t)}</span>`;
|
|
2540
|
+
else if (TY.has(lt2)) out += `<span class="ty">${escapeHtml(t)}</span>`;
|
|
852
2541
|
else if (src[TOKEN_RE.lastIndex] === "(")
|
|
853
2542
|
out += `<span class="fn">${escapeHtml(t)}</span>`;
|
|
854
2543
|
else out += escapeHtml(t);
|
|
@@ -870,12 +2559,12 @@ function renderCode(data) {
|
|
|
870
2559
|
// src/blocks/agenda.ts
|
|
871
2560
|
function renderAgenda(data) {
|
|
872
2561
|
const items = data.items ?? [];
|
|
873
|
-
const rows = items.map((
|
|
874
|
-
const dur =
|
|
875
|
-
const owner =
|
|
876
|
-
const desc =
|
|
877
|
-
const time =
|
|
878
|
-
return `<div class="agenda-row"><div>${time}${dur}</div><div><div class="agenda-title">${escapeHtml(
|
|
2562
|
+
const rows = items.map((it2) => {
|
|
2563
|
+
const dur = it2.duration !== void 0 ? `<div class="agenda-dur">${escapeHtml(it2.duration)}</div>` : "";
|
|
2564
|
+
const owner = it2.owner !== void 0 ? `<span class="agenda-owner">${escapeHtml(it2.owner)}</span>` : "";
|
|
2565
|
+
const desc = it2.desc !== void 0 ? `<div class="agenda-desc">${escapeHtml(it2.desc)}</div>` : "";
|
|
2566
|
+
const time = it2.time !== void 0 ? `<div class="agenda-time">${escapeHtml(it2.time)}</div>` : "";
|
|
2567
|
+
return `<div class="agenda-row"><div>${time}${dur}</div><div><div class="agenda-title">${escapeHtml(it2.title)}${owner}</div>` + desc + `</div></div>`;
|
|
879
2568
|
}).join("");
|
|
880
2569
|
return `<div class="agenda">${rows}</div>`;
|
|
881
2570
|
}
|
|
@@ -923,78 +2612,78 @@ var CHART_COLORS = ["#0e54a1", "#1a6dbe", "#0f766e", "#1f9747", "#6b21a8", "#f79
|
|
|
923
2612
|
function renderPyramid(data) {
|
|
924
2613
|
const levels = data.levels ?? [];
|
|
925
2614
|
const n = Math.max(levels.length, 1);
|
|
926
|
-
const
|
|
2615
|
+
const W2 = 520;
|
|
927
2616
|
const top = 16;
|
|
928
2617
|
const rowH = Math.min(72, Math.floor(280 / n));
|
|
929
2618
|
const gap = 4;
|
|
930
|
-
const apex =
|
|
2619
|
+
const apex = W2 / 2;
|
|
931
2620
|
const pad = 16;
|
|
932
2621
|
const maxW = 430;
|
|
933
|
-
const
|
|
934
|
-
const polygons = levels.map((
|
|
2622
|
+
const H2 = top + n * (rowH + gap) + pad;
|
|
2623
|
+
const polygons = levels.map((L2, i) => {
|
|
935
2624
|
const y = top + i * (rowH + gap);
|
|
936
2625
|
const wTop = maxW * (i / n);
|
|
937
2626
|
const wBot = maxW * ((i + 1) / n);
|
|
938
2627
|
const fill = CHART_COLORS[i % CHART_COLORS.length] ?? "#0e54a1";
|
|
939
|
-
const desc =
|
|
940
|
-
return `<g><polygon points="${apex - wTop / 2},${y} ${apex + wTop / 2},${y} ${apex + wBot / 2},${y + rowH} ${apex - wBot / 2},${y + rowH}" fill="${fill}"/><text x="${apex}" y="${y + rowH / 2 - 1}" class="pyr-label">${escapeHtml(
|
|
2628
|
+
const desc = L2.desc !== void 0 ? `<text x="${apex}" y="${y + rowH / 2 + 14}" class="pyr-desc">${escapeHtml(L2.desc)}</text>` : "";
|
|
2629
|
+
return `<g><polygon points="${apex - wTop / 2},${y} ${apex + wTop / 2},${y} ${apex + wBot / 2},${y + rowH} ${apex - wBot / 2},${y + rowH}" fill="${fill}"/><text x="${apex}" y="${y + rowH / 2 - 1}" class="pyr-label">${escapeHtml(L2.label)}</text>` + desc + `</g>`;
|
|
941
2630
|
}).join("");
|
|
942
|
-
return `<svg viewBox="0 0 ${
|
|
2631
|
+
return `<svg viewBox="0 0 ${W2} ${H2}" role="img"><title>Pyramid</title>${polygons}</svg>`;
|
|
943
2632
|
}
|
|
944
2633
|
|
|
945
2634
|
// src/blocks/funnel.ts
|
|
946
2635
|
var CHART_COLORS2 = ["#0e54a1", "#1a6dbe", "#0f766e", "#1f9747", "#6b21a8", "#f7952c"];
|
|
947
|
-
function toNum(
|
|
948
|
-
if (typeof
|
|
949
|
-
const n = parseFloat(
|
|
2636
|
+
function toNum(v2) {
|
|
2637
|
+
if (typeof v2 === "number") return v2;
|
|
2638
|
+
const n = parseFloat(v2.replace(/[, _]/g, ""));
|
|
950
2639
|
return Number.isFinite(n) ? n : 0;
|
|
951
2640
|
}
|
|
952
|
-
function fmt(
|
|
953
|
-
return typeof
|
|
2641
|
+
function fmt(v2) {
|
|
2642
|
+
return typeof v2 === "number" ? v2.toLocaleString() : v2;
|
|
954
2643
|
}
|
|
955
2644
|
function renderFunnel(data) {
|
|
956
2645
|
const stages = (data.stages ?? []).filter(Boolean);
|
|
957
|
-
const
|
|
2646
|
+
const W2 = 560;
|
|
958
2647
|
const top = 14;
|
|
959
2648
|
const rowH = 62;
|
|
960
2649
|
const maxW = 420;
|
|
961
2650
|
const pad = 14;
|
|
962
|
-
const cx =
|
|
963
|
-
const
|
|
2651
|
+
const cx = W2 / 2;
|
|
2652
|
+
const H2 = top + stages.length * rowH + pad;
|
|
964
2653
|
const vals = stages.map((s) => toNum(s.value));
|
|
965
2654
|
const first = vals[0] ?? 0;
|
|
966
2655
|
const max = Math.max(1, ...vals);
|
|
967
|
-
const wOf = (
|
|
2656
|
+
const wOf = (v2) => Math.max(78, maxW * (v2 / max));
|
|
968
2657
|
const groups = stages.map((s, i) => {
|
|
969
|
-
const
|
|
970
|
-
const vNext = i < stages.length - 1 ? vals[i + 1] ?? 0 :
|
|
971
|
-
const wTop = wOf(
|
|
2658
|
+
const v2 = vals[i] ?? 0;
|
|
2659
|
+
const vNext = i < stages.length - 1 ? vals[i + 1] ?? 0 : v2 * 0.82;
|
|
2660
|
+
const wTop = wOf(v2);
|
|
972
2661
|
const wBot = wOf(vNext);
|
|
973
2662
|
const y = top + i * rowH;
|
|
974
2663
|
const fill = CHART_COLORS2[i % CHART_COLORS2.length] ?? "#0e54a1";
|
|
975
|
-
const pct = first > 0 ? Math.round(
|
|
2664
|
+
const pct = first > 0 ? Math.round(v2 / first * 100) : 0;
|
|
976
2665
|
const sub = i > 0 && first > 0 ? ` \xB7 ${pct}%` : "";
|
|
977
2666
|
return `<g><polygon points="${cx - wTop / 2},${y} ${cx + wTop / 2},${y} ${cx + wBot / 2},${y + rowH} ${cx - wBot / 2},${y + rowH}" fill="${fill}" stroke="#fff" stroke-width="2"/><text x="${cx}" y="${y + rowH / 2 - 3}" class="funnel-label">${escapeHtml(s.label)}</text><text x="${cx}" y="${y + rowH / 2 + 15}" class="funnel-val">${escapeHtml(fmt(s.value))}${sub}</text></g>`;
|
|
978
2667
|
}).join("");
|
|
979
|
-
return `<svg viewBox="0 0 ${
|
|
2668
|
+
return `<svg viewBox="0 0 ${W2} ${H2}" role="img"><title>Funnel</title>${groups}</svg>`;
|
|
980
2669
|
}
|
|
981
2670
|
|
|
982
2671
|
// src/svg/ortho.ts
|
|
983
|
-
function ortho(
|
|
984
|
-
const a = { x:
|
|
985
|
-
const b = { x:
|
|
2672
|
+
function ortho(A2, B2) {
|
|
2673
|
+
const a = { x: A2.x + A2.w / 2, y: A2.y + A2.h / 2 };
|
|
2674
|
+
const b = { x: B2.x + B2.w / 2, y: B2.y + B2.h / 2 };
|
|
986
2675
|
const dx = b.x - a.x;
|
|
987
2676
|
const dy = b.y - a.y;
|
|
988
2677
|
if (Math.abs(dx) >= Math.abs(dy)) {
|
|
989
|
-
const sx2 = dx >= 0 ?
|
|
990
|
-
const ex2 = dx >= 0 ?
|
|
2678
|
+
const sx2 = dx >= 0 ? A2.x + A2.w : A2.x;
|
|
2679
|
+
const ex2 = dx >= 0 ? B2.x : B2.x + B2.w;
|
|
991
2680
|
const sy2 = a.y;
|
|
992
2681
|
const ey2 = b.y;
|
|
993
2682
|
const mx = (sx2 + ex2) / 2;
|
|
994
2683
|
return { d: `M ${sx2} ${sy2} H ${mx} V ${ey2} H ${ex2}`, lx: mx, ly: (sy2 + ey2) / 2 };
|
|
995
2684
|
}
|
|
996
|
-
const sy = dy >= 0 ?
|
|
997
|
-
const ey = dy >= 0 ?
|
|
2685
|
+
const sy = dy >= 0 ? A2.y + A2.h : A2.y;
|
|
2686
|
+
const ey = dy >= 0 ? B2.y : B2.y + B2.h;
|
|
998
2687
|
const sx = a.x;
|
|
999
2688
|
const ex = b.x;
|
|
1000
2689
|
const my = (sy + ey) / 2;
|
|
@@ -1007,16 +2696,16 @@ function wrapText(text, max, maxLines) {
|
|
|
1007
2696
|
const words = String(text).split(/\s+/);
|
|
1008
2697
|
const lines = [];
|
|
1009
2698
|
let cur = "";
|
|
1010
|
-
for (const
|
|
2699
|
+
for (const w2 of words) {
|
|
1011
2700
|
if (!cur) {
|
|
1012
|
-
cur =
|
|
2701
|
+
cur = w2;
|
|
1013
2702
|
continue;
|
|
1014
2703
|
}
|
|
1015
|
-
if ((cur + " " +
|
|
1016
|
-
cur += " " +
|
|
2704
|
+
if ((cur + " " + w2).length <= max) {
|
|
2705
|
+
cur += " " + w2;
|
|
1017
2706
|
} else {
|
|
1018
2707
|
lines.push(cur);
|
|
1019
|
-
cur =
|
|
2708
|
+
cur = w2;
|
|
1020
2709
|
if (lines.length === maxLines) break;
|
|
1021
2710
|
}
|
|
1022
2711
|
}
|
|
@@ -1025,11 +2714,11 @@ function wrapText(text, max, maxLines) {
|
|
|
1025
2714
|
}
|
|
1026
2715
|
|
|
1027
2716
|
// src/svg/edgePill.ts
|
|
1028
|
-
function edgePill(
|
|
2717
|
+
function edgePill(p2, label, err = false) {
|
|
1029
2718
|
if (label === void 0 || label === "") return "";
|
|
1030
|
-
const
|
|
2719
|
+
const w2 = Math.max(26, label.length * 5.4);
|
|
1031
2720
|
const errClass = err ? " err" : "";
|
|
1032
|
-
return `<g><rect x="${
|
|
2721
|
+
return `<g><rect x="${p2.lx - w2 / 2}" y="${p2.ly - 9}" width="${w2}" height="18" rx="9" fill="#fff" stroke="#d1d5db"/><text x="${p2.lx}" y="${p2.ly + 3}" class="edge-label${errClass}">${escapeHtml(label)}</text></g>`;
|
|
1033
2722
|
}
|
|
1034
2723
|
|
|
1035
2724
|
// src/blocks/flow.ts
|
|
@@ -1071,32 +2760,32 @@ function renderFlowSvg(data) {
|
|
|
1071
2760
|
const height = padTop + rows * cellH + (rows - 1) * gapY + padBot;
|
|
1072
2761
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>Flowchart</title>`;
|
|
1073
2762
|
for (const e of edges) {
|
|
1074
|
-
const
|
|
1075
|
-
const
|
|
1076
|
-
if (!
|
|
1077
|
-
const
|
|
2763
|
+
const A2 = byId.get(e.from);
|
|
2764
|
+
const B2 = byId.get(e.to);
|
|
2765
|
+
if (!A2 || !B2) continue;
|
|
2766
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
1078
2767
|
const isErr = e.kind === "error" || ERR_LABEL_RE.test(e.label ?? "");
|
|
1079
2768
|
const stroke = isErr ? "#991b1b" : "#1a1a2e";
|
|
1080
2769
|
const marker = isErr ? "gErr" : "gArrow";
|
|
1081
2770
|
const sw = isErr ? 1.6 : 1.4;
|
|
1082
|
-
s += `<g><path d="${
|
|
2771
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="${stroke}" stroke-width="${sw}" marker-end="url(#${marker})"/>` + edgePill(p2, e.label, isErr) + `</g>`;
|
|
1083
2772
|
}
|
|
1084
2773
|
for (const n of nodes) {
|
|
1085
2774
|
const r = rectFor2(n);
|
|
1086
|
-
const
|
|
2775
|
+
const st2 = flowStyle(n.kind);
|
|
1087
2776
|
const cx = r.x + r.w / 2;
|
|
1088
2777
|
const cy = r.y + r.h / 2;
|
|
1089
2778
|
let shape;
|
|
1090
|
-
if (
|
|
1091
|
-
shape = `<polygon points="${cx},${r.y} ${r.x + r.w},${cy} ${cx},${r.y + r.h} ${r.x},${cy}" fill="${
|
|
1092
|
-
} else if (
|
|
1093
|
-
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="${r.h / 2}" fill="${
|
|
2779
|
+
if (st2.shape === "diamond") {
|
|
2780
|
+
shape = `<polygon points="${cx},${r.y} ${r.x + r.w},${cy} ${cx},${r.y + r.h} ${r.x},${cy}" fill="${st2.fill}" stroke="${st2.stroke}" stroke-width="1.5"/>`;
|
|
2781
|
+
} else if (st2.shape === "stadium") {
|
|
2782
|
+
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="${r.h / 2}" fill="${st2.fill}" stroke="${st2.stroke}" stroke-width="1.5"/>`;
|
|
1094
2783
|
} else {
|
|
1095
|
-
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="7" fill="${
|
|
2784
|
+
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="7" fill="${st2.fill}" stroke="${st2.stroke}" stroke-width="1.4"/>`;
|
|
1096
2785
|
}
|
|
1097
2786
|
const lines = wrapText(n.label, 22, 2);
|
|
1098
2787
|
const texts = lines.map(
|
|
1099
|
-
(
|
|
2788
|
+
(ln2, j2) => `<text x="${cx}" y="${cy + 4 - (lines.length - 1) * 7 + j2 * 14}" class="fc-label" fill="${st2.text}">${escapeHtml(ln2)}</text>`
|
|
1100
2789
|
).join("");
|
|
1101
2790
|
s += `<g filter="url(#gshadow)">${shape}${texts}</g>`;
|
|
1102
2791
|
}
|
|
@@ -1155,31 +2844,31 @@ function renderState(data) {
|
|
|
1155
2844
|
const byId = new Map(states.map((s2) => [s2.id, s2]));
|
|
1156
2845
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>State machine</title>`;
|
|
1157
2846
|
for (const t of trans) {
|
|
1158
|
-
const
|
|
1159
|
-
const
|
|
1160
|
-
if (!
|
|
2847
|
+
const A2 = byId.get(t.from);
|
|
2848
|
+
const B2 = byId.get(t.to);
|
|
2849
|
+
if (!A2 || !B2) continue;
|
|
1161
2850
|
const label = t.event + (t.guard !== void 0 ? ` ${t.guard}` : "");
|
|
1162
2851
|
if (t.from === t.to) {
|
|
1163
|
-
const r = rectFor(
|
|
2852
|
+
const r = rectFor(A2, cellW, cellH, gapX, gapY, padX, padTop);
|
|
1164
2853
|
s += `<g><path d="M ${r.cx - 12} ${r.y} C ${r.cx - 30} ${r.y - 32}, ${r.cx + 30} ${r.y - 32}, ${r.cx + 12} ${r.y}" fill="none" stroke="#1a1a2e" stroke-width="1.3" marker-end="url(#gArrow)"/>` + edgePill({ lx: r.cx, ly: r.y - 28 }, label) + `</g>`;
|
|
1165
2854
|
continue;
|
|
1166
2855
|
}
|
|
1167
|
-
const
|
|
1168
|
-
rectFor(
|
|
1169
|
-
rectFor(
|
|
2856
|
+
const p2 = ortho(
|
|
2857
|
+
rectFor(A2, cellW, cellH, gapX, gapY, padX, padTop),
|
|
2858
|
+
rectFor(B2, cellW, cellH, gapX, gapY, padX, padTop)
|
|
1170
2859
|
);
|
|
1171
|
-
s += `<g><path d="${
|
|
2860
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="#1a1a2e" stroke-width="1.3" marker-end="url(#gArrow)"/>` + edgePill(p2, label) + `</g>`;
|
|
1172
2861
|
}
|
|
1173
|
-
for (const
|
|
1174
|
-
const r = rectFor(
|
|
1175
|
-
if (
|
|
2862
|
+
for (const st2 of states) {
|
|
2863
|
+
const r = rectFor(st2, cellW, cellH, gapX, gapY, padX, padTop);
|
|
2864
|
+
if (st2.kind === "start") {
|
|
1176
2865
|
s += `<circle cx="${r.cx}" cy="${r.cy}" r="10" fill="#1a1a2e"/>`;
|
|
1177
|
-
} else if (
|
|
2866
|
+
} else if (st2.kind === "terminal") {
|
|
1178
2867
|
s += `<g><circle cx="${r.cx}" cy="${r.cy}" r="12" fill="#fff" stroke="#1a1a2e" stroke-width="1.5"/><circle cx="${r.cx}" cy="${r.cy}" r="6" fill="#1a1a2e"/></g>`;
|
|
1179
2868
|
} else {
|
|
1180
|
-
const fill =
|
|
1181
|
-
const stroke =
|
|
1182
|
-
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="23" fill="${fill}" stroke="${stroke}" stroke-width="1.5"/><text x="${r.cx}" y="${r.cy + 4.5}" class="sm-name" fill="#1a1a2e">${escapeHtml(
|
|
2869
|
+
const fill = st2.kind === "wait" ? "#fde7cd" : "#dcf1e2";
|
|
2870
|
+
const stroke = st2.kind === "wait" ? "#f7952c" : "#1f9747";
|
|
2871
|
+
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="23" fill="${fill}" stroke="${stroke}" stroke-width="1.5"/><text x="${r.cx}" y="${r.cy + 4.5}" class="sm-name" fill="#1a1a2e">${escapeHtml(st2.name ?? "")}</text></g>`;
|
|
1183
2872
|
}
|
|
1184
2873
|
}
|
|
1185
2874
|
s += `</svg>`;
|
|
@@ -1231,26 +2920,26 @@ function renderDfd(data) {
|
|
|
1231
2920
|
const height = padTop + rows * cellH + (rows - 1) * gapY + padBot;
|
|
1232
2921
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>Data-flow diagram</title>`;
|
|
1233
2922
|
for (const e of edges) {
|
|
1234
|
-
const
|
|
1235
|
-
const
|
|
1236
|
-
if (!
|
|
1237
|
-
const
|
|
1238
|
-
s += `<g><path d="${
|
|
2923
|
+
const A2 = byId.get(e.from);
|
|
2924
|
+
const B2 = byId.get(e.to);
|
|
2925
|
+
if (!A2 || !B2) continue;
|
|
2926
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
2927
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="#1a1a2e" stroke-width="1.4" marker-end="url(#gArrow)"/>` + edgePill(p2, e.label) + `</g>`;
|
|
1239
2928
|
}
|
|
1240
2929
|
for (const n of nodes) {
|
|
1241
2930
|
const r = rectFor2(n);
|
|
1242
|
-
const
|
|
1243
|
-
const
|
|
2931
|
+
const st2 = dfdStyle(n.kind);
|
|
2932
|
+
const k2 = (n.kind ?? "process").toLowerCase();
|
|
1244
2933
|
let shape;
|
|
1245
|
-
if (
|
|
1246
|
-
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="16" fill="${
|
|
1247
|
-
} else if (
|
|
1248
|
-
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" fill="${
|
|
2934
|
+
if (k2 === "process") {
|
|
2935
|
+
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="16" fill="${st2.fill}" stroke="${st2.stroke}" stroke-width="1.4"/>`;
|
|
2936
|
+
} else if (k2 === "store" || k2 === "datastore") {
|
|
2937
|
+
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" fill="${st2.fill}" stroke="none"/><line x1="${r.x}" y1="${r.y}" x2="${r.x + r.w}" y2="${r.y}" stroke="${st2.stroke}" stroke-width="1.6"/><line x1="${r.x}" y1="${r.y + r.h}" x2="${r.x + r.w}" y2="${r.y + r.h}" stroke="${st2.stroke}" stroke-width="1.6"/><line x1="${r.x}" y1="${r.y}" x2="${r.x}" y2="${r.y + r.h}" stroke="${st2.stroke}" stroke-width="1.6"/>`;
|
|
1249
2938
|
} else {
|
|
1250
|
-
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" fill="${
|
|
2939
|
+
shape = `<rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" fill="${st2.fill}" stroke="${st2.stroke}" stroke-width="1.4"/>`;
|
|
1251
2940
|
}
|
|
1252
|
-
const num = n.num !== void 0 &&
|
|
1253
|
-
s += `<g filter="url(#gshadow)">${shape}${num}<text x="${r.x + r.w / 2}" y="${r.y + r.h / 2 + 4}" class="dfd-name" fill="${
|
|
2941
|
+
const num = n.num !== void 0 && k2 === "process" ? `<text x="${r.x + 12}" y="${r.y + 18}" class="dfd-num" fill="${st2.text}">${escapeHtml(n.num)}</text>` : "";
|
|
2942
|
+
s += `<g filter="url(#gshadow)">${shape}${num}<text x="${r.x + r.w / 2}" y="${r.y + r.h / 2 + 4}" class="dfd-name" fill="${st2.text}">${escapeHtml(n.name)}</text></g>`;
|
|
1254
2943
|
}
|
|
1255
2944
|
s += `</svg>`;
|
|
1256
2945
|
return diagramFrame(
|
|
@@ -1265,34 +2954,34 @@ function renderDfd(data) {
|
|
|
1265
2954
|
}
|
|
1266
2955
|
|
|
1267
2956
|
// src/blocks/journey.ts
|
|
1268
|
-
function clamp01(
|
|
1269
|
-
if (
|
|
1270
|
-
if (
|
|
1271
|
-
return
|
|
2957
|
+
function clamp01(v2) {
|
|
2958
|
+
if (v2 < 0) return 0;
|
|
2959
|
+
if (v2 > 1) return 1;
|
|
2960
|
+
return v2;
|
|
1272
2961
|
}
|
|
1273
2962
|
function renderJourney(data) {
|
|
1274
2963
|
const stages = data.stages ?? [];
|
|
1275
2964
|
const rows = data.rows ?? [];
|
|
1276
2965
|
const emotion = data.emotion ?? [];
|
|
1277
2966
|
const n = Math.max(stages.length, 1);
|
|
1278
|
-
const
|
|
1279
|
-
const
|
|
2967
|
+
const W2 = Math.max(380, n * 150);
|
|
2968
|
+
const H2 = 92;
|
|
1280
2969
|
const pad = 20;
|
|
1281
|
-
const colW = (
|
|
2970
|
+
const colW = (W2 - pad * 2) / n;
|
|
1282
2971
|
const ex = (i) => pad + colW * (i + 0.5);
|
|
1283
|
-
const ey = (
|
|
2972
|
+
const ey = (v2) => H2 - 14 - (H2 - 30) * clamp01(v2);
|
|
1284
2973
|
const head = `<tr><th></th>` + stages.map((s) => `<th class="c">${escapeHtml(s.label)}</th>`).join("") + `</tr>`;
|
|
1285
2974
|
const body = rows.map(
|
|
1286
2975
|
(r) => `<tr><td class="lead">${escapeHtml(r.label)}</td>` + (r.cells ?? []).map((c) => `<td class="c">${escapeHtml(c)}</td>`).join("") + `</tr>`
|
|
1287
2976
|
).join("");
|
|
1288
2977
|
let svg = "";
|
|
1289
2978
|
if (emotion.length > 0) {
|
|
1290
|
-
const points = emotion.map((
|
|
1291
|
-
const dots = emotion.map((
|
|
1292
|
-
const fill =
|
|
1293
|
-
return `<circle cx="${ex(i)}" cy="${ey(
|
|
2979
|
+
const points = emotion.map((v2, i) => `${ex(i)},${ey(v2)}`).join(" ");
|
|
2980
|
+
const dots = emotion.map((v2, i) => {
|
|
2981
|
+
const fill = v2 >= 0.6 ? "#1f9747" : v2 <= 0.35 ? "#991b1b" : "#f7952c";
|
|
2982
|
+
return `<circle cx="${ex(i)}" cy="${ey(v2)}" r="5" fill="${fill}" stroke="#fff" stroke-width="1.5"/>`;
|
|
1294
2983
|
}).join("");
|
|
1295
|
-
svg = `<div style="margin-top:10px"><div style="font-size:10px;color:#6b7280;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px">Emotion</div><svg viewBox="0 0 ${
|
|
2984
|
+
svg = `<div style="margin-top:10px"><div style="font-size:10px;color:#6b7280;font-weight:700;text-transform:uppercase;letter-spacing:.08em;margin-bottom:4px">Emotion</div><svg viewBox="0 0 ${W2} ${H2}" style="width:100%" role="img"><title>Emotion curve</title><polyline points="${points}" fill="none" stroke="#0e54a1" stroke-width="2"/>` + dots + `</svg></div>`;
|
|
1296
2985
|
}
|
|
1297
2986
|
return `<div><table class="pres-table"><thead>${head}</thead><tbody>${body}</tbody></table>` + svg + `</div>`;
|
|
1298
2987
|
}
|
|
@@ -1314,7 +3003,7 @@ function ganttColor(kind) {
|
|
|
1314
3003
|
function renderGantt(data) {
|
|
1315
3004
|
const periods = data.periods ?? [];
|
|
1316
3005
|
const tasks = data.tasks ?? [];
|
|
1317
|
-
const
|
|
3006
|
+
const P2 = Math.max(periods.length, 1);
|
|
1318
3007
|
const labelW = 156;
|
|
1319
3008
|
const padX = 20;
|
|
1320
3009
|
const padTop = 34;
|
|
@@ -1322,14 +3011,14 @@ function renderGantt(data) {
|
|
|
1322
3011
|
const barH = 18;
|
|
1323
3012
|
const colW = 64;
|
|
1324
3013
|
const padBot = 14;
|
|
1325
|
-
const width = labelW + padX * 2 +
|
|
3014
|
+
const width = labelW + padX * 2 + P2 * colW;
|
|
1326
3015
|
const height = padTop + tasks.length * rowH + padBot;
|
|
1327
3016
|
const xCol = (i) => labelW + padX + i * colW;
|
|
1328
3017
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>Schedule</title>`;
|
|
1329
3018
|
for (let i = 0; i < periods.length; i++) {
|
|
1330
3019
|
s += `<g><line x1="${xCol(i)}" y1="${padTop - 6}" x2="${xCol(i)}" y2="${height - padBot}" stroke="#eef0f3" stroke-width="1"/><text x="${xCol(i) + colW / 2}" y="${padTop - 12}" class="gantt-head">${escapeHtml(periods[i] ?? "")}</text></g>`;
|
|
1331
3020
|
}
|
|
1332
|
-
s += `<line x1="${xCol(
|
|
3021
|
+
s += `<line x1="${xCol(P2)}" y1="${padTop - 6}" x2="${xCol(P2)}" y2="${height - padBot}" stroke="#eef0f3" stroke-width="1"/>`;
|
|
1333
3022
|
for (let i = 0; i < tasks.length; i++) {
|
|
1334
3023
|
const t = tasks[i];
|
|
1335
3024
|
if (t === void 0) continue;
|
|
@@ -1362,21 +3051,21 @@ function renderGraph(data) {
|
|
|
1362
3051
|
const rectFor2 = (n) => {
|
|
1363
3052
|
const cx = cxOf(n.col);
|
|
1364
3053
|
const cy = cyOf(n.row);
|
|
1365
|
-
const
|
|
1366
|
-
return { x: cx -
|
|
3054
|
+
const w2 = Math.max(98, n.label.length * 8 + 26);
|
|
3055
|
+
return { x: cx - w2 / 2, y: cy - 20, w: w2, h: 40, cx, cy };
|
|
1367
3056
|
};
|
|
1368
3057
|
const byId = new Map(nodes.map((n) => [n.id, n]));
|
|
1369
3058
|
const width = padX * 2 + cols * cellW + (cols - 1) * gapX;
|
|
1370
3059
|
const height = padTop + rows * cellH + (rows - 1) * gapY + padBot;
|
|
1371
3060
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>Graph</title>`;
|
|
1372
3061
|
for (const e of edges) {
|
|
1373
|
-
const
|
|
1374
|
-
const
|
|
1375
|
-
if (!
|
|
1376
|
-
const
|
|
3062
|
+
const A2 = byId.get(e.from);
|
|
3063
|
+
const B2 = byId.get(e.to);
|
|
3064
|
+
if (!A2 || !B2) continue;
|
|
3065
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
1377
3066
|
const directed = (e.dir ?? "directed") !== "undirected";
|
|
1378
3067
|
const markerAttr = directed ? ` marker-end="url(#gArrow)"` : "";
|
|
1379
|
-
s += `<g><path d="${
|
|
3068
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="#6b7280" stroke-width="1.4"${markerAttr}/>` + edgePill(p2, e.label) + `</g>`;
|
|
1380
3069
|
}
|
|
1381
3070
|
for (const n of nodes) {
|
|
1382
3071
|
const r = rectFor2(n);
|
|
@@ -1396,28 +3085,28 @@ function renderGraph(data) {
|
|
|
1396
3085
|
}
|
|
1397
3086
|
|
|
1398
3087
|
// src/blocks/quadrant.ts
|
|
1399
|
-
function clamp012(
|
|
1400
|
-
if (
|
|
1401
|
-
if (
|
|
1402
|
-
if (
|
|
1403
|
-
return
|
|
3088
|
+
function clamp012(v2) {
|
|
3089
|
+
if (v2 === void 0 || Number.isNaN(v2)) return 0.5;
|
|
3090
|
+
if (v2 < 0) return 0;
|
|
3091
|
+
if (v2 > 1) return 1;
|
|
3092
|
+
return v2;
|
|
1404
3093
|
}
|
|
1405
3094
|
function renderQuadrant(data) {
|
|
1406
|
-
const
|
|
1407
|
-
const
|
|
3095
|
+
const W2 = 580;
|
|
3096
|
+
const H2 = 440;
|
|
1408
3097
|
const pad = 56;
|
|
1409
3098
|
const x0 = pad;
|
|
1410
|
-
const x1 =
|
|
3099
|
+
const x1 = W2 - pad;
|
|
1411
3100
|
const y0 = pad - 16;
|
|
1412
|
-
const y1 =
|
|
3101
|
+
const y1 = H2 - pad;
|
|
1413
3102
|
const mx = (x0 + x1) / 2;
|
|
1414
3103
|
const my = (y0 + y1) / 2;
|
|
1415
|
-
const px = (
|
|
1416
|
-
const py = (
|
|
3104
|
+
const px = (v2) => x0 + (x1 - x0) * clamp012(v2);
|
|
3105
|
+
const py = (v2) => y1 - (y1 - y0) * clamp012(v2);
|
|
1417
3106
|
const items = data.items ?? [];
|
|
1418
3107
|
const xA = data.xAxis ?? {};
|
|
1419
3108
|
const yA = data.yAxis ?? {};
|
|
1420
|
-
let s = `<svg viewBox="0 0 ${
|
|
3109
|
+
let s = `<svg viewBox="0 0 ${W2} ${H2}" role="img"><title>Quadrant</title>`;
|
|
1421
3110
|
s += `<rect x="${x0}" y="${y0}" width="${x1 - x0}" height="${y1 - y0}" fill="#fafbfc" stroke="#e5e7eb"/>`;
|
|
1422
3111
|
s += `<rect x="${mx}" y="${y0}" width="${x1 - mx}" height="${my - y0}" fill="#0e54a1" fill-opacity="0.04"/>`;
|
|
1423
3112
|
s += `<line x1="${x0}" y1="${my}" x2="${x1}" y2="${my}" class="quad-axis" marker-end="url(#gArrow)"/>`;
|
|
@@ -1434,13 +3123,13 @@ function renderQuadrant(data) {
|
|
|
1434
3123
|
s += `<text x="${x0 - 10}" y="${y0 + 6}" class="quad-end" text-anchor="end">${escapeHtml(yA.high)}</text>`;
|
|
1435
3124
|
if (yA.low !== void 0)
|
|
1436
3125
|
s += `<text x="${x0 - 10}" y="${y1}" class="quad-end" text-anchor="end">${escapeHtml(yA.low)}</text>`;
|
|
1437
|
-
for (const
|
|
1438
|
-
const cx = px(
|
|
1439
|
-
const cy = py(
|
|
3126
|
+
for (const it2 of items) {
|
|
3127
|
+
const cx = px(it2.x);
|
|
3128
|
+
const cy = py(it2.y);
|
|
1440
3129
|
const left = cx > mx;
|
|
1441
3130
|
const tx = cx + (left ? -12 : 12);
|
|
1442
3131
|
const anchor = left ? "end" : "start";
|
|
1443
|
-
s += `<g filter="url(#gshadow)"><circle cx="${cx}" cy="${cy}" r="7" fill="#f7952c" stroke="#fff" stroke-width="1.5"/><text x="${tx}" y="${cy + 4}" class="quad-pt-label" text-anchor="${anchor}">${escapeHtml(
|
|
3132
|
+
s += `<g filter="url(#gshadow)"><circle cx="${cx}" cy="${cy}" r="7" fill="#f7952c" stroke="#fff" stroke-width="1.5"/><text x="${tx}" y="${cy + 4}" class="quad-pt-label" text-anchor="${anchor}">${escapeHtml(it2.label)}</text></g>`;
|
|
1444
3133
|
}
|
|
1445
3134
|
s += `</svg>`;
|
|
1446
3135
|
return diagramFrame(
|
|
@@ -1495,23 +3184,23 @@ function renderSwimlane(data) {
|
|
|
1495
3184
|
const height = padTop + lanes.length * laneH + padBot;
|
|
1496
3185
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>Swimlane</title>`;
|
|
1497
3186
|
for (let i = 0; i < lanes.length; i++) {
|
|
1498
|
-
const
|
|
1499
|
-
if (
|
|
1500
|
-
s += `<g><rect x="${padX}" y="${yLane(i)}" width="${width - padX * 2}" height="${laneH}" fill="${i % 2 ? "#fafafa" : "#fff"}" stroke="#e5e7eb"/><rect x="${padX}" y="${yLane(i)}" width="${labelW}" height="${laneH}" fill="#0e54a1"/><text x="${padX + 14}" y="${yLane(i) + laneH / 2 + 4}" class="sl-lane-label">${escapeHtml(
|
|
3187
|
+
const L2 = lanes[i];
|
|
3188
|
+
if (L2 === void 0) continue;
|
|
3189
|
+
s += `<g><rect x="${padX}" y="${yLane(i)}" width="${width - padX * 2}" height="${laneH}" fill="${i % 2 ? "#fafafa" : "#fff"}" stroke="#e5e7eb"/><rect x="${padX}" y="${yLane(i)}" width="${labelW}" height="${laneH}" fill="#0e54a1"/><text x="${padX + 14}" y="${yLane(i) + laneH / 2 + 4}" class="sl-lane-label">${escapeHtml(L2.label)}</text></g>`;
|
|
1501
3190
|
}
|
|
1502
3191
|
for (const lk of links) {
|
|
1503
|
-
const
|
|
1504
|
-
const
|
|
1505
|
-
if (!
|
|
1506
|
-
const
|
|
1507
|
-
s += `<g><path d="${
|
|
1508
|
-
}
|
|
1509
|
-
for (const
|
|
1510
|
-
const r = rectFor2(
|
|
1511
|
-
const c = laneColor(
|
|
1512
|
-
const lines = wrapText(
|
|
3192
|
+
const A2 = byId.get(lk.from);
|
|
3193
|
+
const B2 = byId.get(lk.to);
|
|
3194
|
+
if (!A2 || !B2) continue;
|
|
3195
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
3196
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="#1a1a2e" stroke-width="1.4" marker-end="url(#gArrow)"/>` + edgePill(p2, lk.label) + `</g>`;
|
|
3197
|
+
}
|
|
3198
|
+
for (const st2 of steps) {
|
|
3199
|
+
const r = rectFor2(st2);
|
|
3200
|
+
const c = laneColor(st2.kind);
|
|
3201
|
+
const lines = wrapText(st2.label, 20, 2);
|
|
1513
3202
|
const texts = lines.map(
|
|
1514
|
-
(
|
|
3203
|
+
(ln2, j2) => `<text x="${r.x + r.w / 2}" y="${r.y + r.h / 2 + 4 - (lines.length - 1) * 7 + j2 * 14}" class="sl-step" fill="${c.text}">${escapeHtml(ln2)}</text>`
|
|
1515
3204
|
).join("");
|
|
1516
3205
|
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="7" fill="${c.fill}" stroke="${c.stroke}" stroke-width="1.3"/>` + texts + `</g>`;
|
|
1517
3206
|
}
|
|
@@ -1575,35 +3264,35 @@ function blockStyle(kind) {
|
|
|
1575
3264
|
return { accent: "#374151", fill: "#fff", text: "#1a1a2e" };
|
|
1576
3265
|
}
|
|
1577
3266
|
}
|
|
1578
|
-
function nodeGlyph(kind,
|
|
1579
|
-
const
|
|
1580
|
-
if (
|
|
1581
|
-
return `<g stroke="${c}" stroke-width="1.3" fill="none"><ellipse cx="${
|
|
3267
|
+
function nodeGlyph(kind, x2, y, c) {
|
|
3268
|
+
const k2 = (kind ?? "").toLowerCase();
|
|
3269
|
+
if (k2 === "store" || k2 === "db" || k2 === "database") {
|
|
3270
|
+
return `<g stroke="${c}" stroke-width="1.3" fill="none"><ellipse cx="${x2 + 8}" cy="${y + 3}" rx="7" ry="3"/><path d="M${x2 + 1} ${y + 3} V ${y + 13}"/><path d="M${x2 + 15} ${y + 3} V ${y + 13}"/><path d="M${x2 + 1} ${y + 13} a 7 3 0 0 0 14 0"/></g>`;
|
|
1582
3271
|
}
|
|
1583
|
-
if (
|
|
1584
|
-
return `<g stroke="${c}" stroke-width="1.3" fill="none"><ellipse cx="${
|
|
3272
|
+
if (k2 === "bucket" || k2 === "blob" || k2 === "object") {
|
|
3273
|
+
return `<g stroke="${c}" stroke-width="1.3" fill="none"><ellipse cx="${x2 + 8}" cy="${y + 3}" rx="7" ry="2.5"/><path d="M${x2 + 1.5} ${y + 3} L ${x2 + 3.5} ${y + 14} L ${x2 + 12.5} ${y + 14} L ${x2 + 14.5} ${y + 3}"/></g>`;
|
|
1585
3274
|
}
|
|
1586
|
-
if (
|
|
1587
|
-
return `<g stroke="${c}" stroke-width="1.6"><path d="M${
|
|
3275
|
+
if (k2 === "queue" || k2 === "topic") {
|
|
3276
|
+
return `<g stroke="${c}" stroke-width="1.6"><path d="M${x2 + 2} ${y + 1} V ${y + 14}"/><path d="M${x2 + 8} ${y + 1} V ${y + 14}"/><path d="M${x2 + 14} ${y + 1} V ${y + 14}"/></g>`;
|
|
1588
3277
|
}
|
|
1589
|
-
if (
|
|
1590
|
-
return `<path d="M${
|
|
3278
|
+
if (k2 === "firewall") {
|
|
3279
|
+
return `<path d="M${x2 + 8} ${y} L ${x2 + 15} ${y + 3} V ${y + 9} Q ${x2 + 15} ${y + 14} ${x2 + 8} ${y + 16} Q ${x2 + 1} ${y + 14} ${x2 + 1} ${y + 9} V ${y + 3} Z" fill="none" stroke="${c}" stroke-width="1.3"/>`;
|
|
1591
3280
|
}
|
|
1592
|
-
if (
|
|
1593
|
-
const slab = (dy) => `<path d="M${
|
|
3281
|
+
if (k2 === "cache") {
|
|
3282
|
+
const slab = (dy) => `<path d="M${x2 + 1} ${y + 5 + dy} L${x2 + 8} ${y + 2 + dy} L${x2 + 15} ${y + 5 + dy} L${x2 + 8} ${y + 8 + dy} Z" fill="none" stroke="${c}" stroke-width="1.2"/>`;
|
|
1594
3283
|
return `<g>${slab(0)}${slab(3.5)}${slab(7)}</g>`;
|
|
1595
3284
|
}
|
|
1596
|
-
if (
|
|
1597
|
-
return `<text x="${
|
|
3285
|
+
if (k2 === "function" || k2 === "lambda") {
|
|
3286
|
+
return `<text x="${x2 + 7}" y="${y + 14}" font-family="Georgia, serif" font-size="17" font-style="italic" font-weight="700" fill="${c}" text-anchor="middle">\u0192</text>`;
|
|
1598
3287
|
}
|
|
1599
|
-
if (
|
|
1600
|
-
return `<path d="M${
|
|
3288
|
+
if (k2 === "cdn" || k2 === "external") {
|
|
3289
|
+
return `<path d="M${x2 + 3} ${y + 13} a 4 4 0 0 1 0.5 -8 a 5 5 0 0 1 9.5 1.2 a 3 3 0 0 1 1 6.8 z" fill="none" stroke="${c}" stroke-width="1.3"/>`;
|
|
1601
3290
|
}
|
|
1602
|
-
if (
|
|
1603
|
-
return `<g stroke="${c}" stroke-width="1.5" fill="none"><path d="M${
|
|
3291
|
+
if (k2 === "gateway" || k2 === "lb") {
|
|
3292
|
+
return `<g stroke="${c}" stroke-width="1.5" fill="none"><path d="M${x2 + 2} ${y + 1} L ${x2 + 8} ${y + 7} L ${x2 + 2} ${y + 13}"/><path d="M${x2 + 8} ${y + 1} L ${x2 + 14} ${y + 7} L ${x2 + 8} ${y + 13}"/></g>`;
|
|
1604
3293
|
}
|
|
1605
|
-
if (
|
|
1606
|
-
return `<g stroke="${c}" stroke-width="1.3"><rect x="${
|
|
3294
|
+
if (k2 === "service" || k2 === "microservice" || k2 === "compute" || k2 === "container") {
|
|
3295
|
+
return `<g stroke="${c}" stroke-width="1.3"><rect x="${x2 + 4}" y="${y + 1}" width="11" height="11" rx="1.5" fill="none"/><rect x="${x2 + 1}" y="${y + 4}" width="11" height="11" rx="1.5" fill="#fff"/></g>`;
|
|
1607
3296
|
}
|
|
1608
3297
|
return "";
|
|
1609
3298
|
}
|
|
@@ -1763,42 +3452,42 @@ function renderC4(data) {
|
|
|
1763
3452
|
const minY = Math.min(...internals.map((r) => r.y)) - 26;
|
|
1764
3453
|
const maxX = Math.max(...internals.map((r) => r.x + r.w)) + 16;
|
|
1765
3454
|
const maxY = Math.max(...internals.map((r) => r.y + r.h)) + 16;
|
|
1766
|
-
const
|
|
1767
|
-
boundarySvg = `<g><rect x="${minX}" y="${minY}" width="${maxX - minX}" height="${maxY - minY}" rx="12" class="c4-boundary"/><rect x="${minX + 12}" y="${minY - 8}" width="${
|
|
3455
|
+
const w2 = Math.max(120, data.boundary.label.length * 6.2);
|
|
3456
|
+
boundarySvg = `<g><rect x="${minX}" y="${minY}" width="${maxX - minX}" height="${maxY - minY}" rx="12" class="c4-boundary"/><rect x="${minX + 12}" y="${minY - 8}" width="${w2}" height="16" fill="#fff"/><text x="${minX + 16}" y="${minY + 4}" class="c4-boundary-label">${escapeHtml(data.boundary.label)}</text></g>`;
|
|
1768
3457
|
}
|
|
1769
3458
|
}
|
|
1770
3459
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>C4 diagram</title>${boundarySvg}`;
|
|
1771
3460
|
for (const e of edges) {
|
|
1772
|
-
const
|
|
1773
|
-
const
|
|
1774
|
-
if (!
|
|
1775
|
-
const
|
|
1776
|
-
const
|
|
3461
|
+
const A2 = byId.get(e.from);
|
|
3462
|
+
const B2 = byId.get(e.to);
|
|
3463
|
+
if (!A2 || !B2) continue;
|
|
3464
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
3465
|
+
const st2 = GEDGE[e.kind ?? "solid"] ?? GEDGE["solid"] ?? {
|
|
1777
3466
|
stroke: "#1a1a2e",
|
|
1778
3467
|
sw: 1.4,
|
|
1779
3468
|
dash: "",
|
|
1780
3469
|
marker: "gArrow",
|
|
1781
3470
|
err: false
|
|
1782
3471
|
};
|
|
1783
|
-
s += `<g><path d="${
|
|
3472
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="${st2.stroke}" stroke-width="${st2.sw}" stroke-dasharray="${st2.dash}" marker-end="url(#${st2.marker})"/>` + edgePill(p2, e.label, st2.err) + `</g>`;
|
|
1784
3473
|
}
|
|
1785
3474
|
for (const n of nodes) {
|
|
1786
3475
|
const r = rectFor2(n);
|
|
1787
|
-
const
|
|
3476
|
+
const st2 = c4Style(n);
|
|
1788
3477
|
const px = r.x + 16;
|
|
1789
3478
|
const desc = wrapText(n.desc, 30, 2);
|
|
1790
|
-
const strokeWidth =
|
|
1791
|
-
const strokeAttr =
|
|
1792
|
-
const dashAttr =
|
|
1793
|
-
const stripe =
|
|
1794
|
-
const personGlyph = n.kind === "person" ? `<g fill="${
|
|
3479
|
+
const strokeWidth = st2.solid === true ? 0 : 1.2;
|
|
3480
|
+
const strokeAttr = st2.solid === true ? "none" : st2.accent;
|
|
3481
|
+
const dashAttr = st2.dash !== void 0 ? ` stroke-dasharray="${st2.dash}"` : "";
|
|
3482
|
+
const stripe = st2.solid === true ? "" : `<rect x="${r.x}" y="${r.y}" width="5" height="${r.h}" rx="2" fill="${st2.accent}"/>`;
|
|
3483
|
+
const personGlyph = n.kind === "person" ? `<g fill="${st2.text}"><circle cx="${px + 6}" cy="${r.y + 19}" r="6"/><path d="M ${px} ${r.y + 34} a 6 7 0 0 1 12 0 z"/></g>` : "";
|
|
1795
3484
|
const chipX = n.kind === "person" ? px + 22 : px;
|
|
1796
|
-
const chipFill =
|
|
1797
|
-
const techLine = n.tech !== void 0 ? `<text x="${px}" y="${r.y + 60}" class="c4-tech" fill="${
|
|
3485
|
+
const chipFill = st2.solid === true ? st2.sub : st2.accent;
|
|
3486
|
+
const techLine = n.tech !== void 0 ? `<text x="${px}" y="${r.y + 60}" class="c4-tech" fill="${st2.sub}">${escapeHtml(n.tech)}</text>` : "";
|
|
1798
3487
|
const descLines = desc.map(
|
|
1799
|
-
(
|
|
3488
|
+
(ln2, j2) => `<text x="${px}" y="${r.y + 77 + j2 * 13}" class="c4-desc" fill="${st2.sub}">${escapeHtml(ln2)}</text>`
|
|
1800
3489
|
).join("");
|
|
1801
|
-
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="10" fill="${
|
|
3490
|
+
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="10" fill="${st2.fill}" stroke="${strokeAttr}" stroke-width="${strokeWidth}"${dashAttr}/>` + stripe + personGlyph + `<text x="${chipX}" y="${r.y + 22}" class="c4-chip" fill="${chipFill}">${escapeHtml(st2.chip)}</text><text x="${px}" y="${r.y + 44}" class="c4-name" fill="${st2.text}">${escapeHtml(n.name)}</text>` + techLine + descLines + `</g>`;
|
|
1802
3491
|
}
|
|
1803
3492
|
s += `</svg>`;
|
|
1804
3493
|
const legend = `<div class="legend">` + LEGEND.map(
|
|
@@ -1871,14 +3560,14 @@ function renderUml(data) {
|
|
|
1871
3560
|
const height = acc - gapY + padBot;
|
|
1872
3561
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>UML class diagram</title><defs><marker id="umlTri" viewBox="0 0 14 14" refX="13" refY="7" markerWidth="15" markerHeight="15" orient="auto-start-reverse"><path d="M1,1 L13,7 L1,13 z" fill="#fff" stroke="#1a1a2e" stroke-width="1.2"/></marker><marker id="umlDiaF" viewBox="0 0 20 12" refX="19" refY="6" markerWidth="20" markerHeight="12" orient="auto-start-reverse"><path d="M1,6 L10,1 L19,6 L10,11 z" fill="#1a1a2e"/></marker><marker id="umlDiaH" viewBox="0 0 20 12" refX="19" refY="6" markerWidth="20" markerHeight="12" orient="auto-start-reverse"><path d="M1,6 L10,1 L19,6 L10,11 z" fill="#fff" stroke="#1a1a2e" stroke-width="1.2"/></marker><marker id="umlOpen" viewBox="0 0 12 12" refX="10" refY="6" markerWidth="12" markerHeight="12" orient="auto-start-reverse"><path d="M1,1 L11,6 L1,11" fill="none" stroke="#1a1a2e" stroke-width="1.3"/></marker></defs>`;
|
|
1873
3562
|
for (const rl of rels) {
|
|
1874
|
-
const
|
|
1875
|
-
const
|
|
1876
|
-
if (!
|
|
1877
|
-
const
|
|
1878
|
-
const
|
|
1879
|
-
const start =
|
|
1880
|
-
const end =
|
|
1881
|
-
s += `<g><path d="${
|
|
3563
|
+
const A2 = byId.get(rl.from);
|
|
3564
|
+
const B2 = byId.get(rl.to);
|
|
3565
|
+
if (!A2 || !B2) continue;
|
|
3566
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
3567
|
+
const st2 = umlRel(rl.kind);
|
|
3568
|
+
const start = st2.start !== void 0 ? ` marker-start="url(#${st2.start})"` : "";
|
|
3569
|
+
const end = st2.end !== void 0 ? ` marker-end="url(#${st2.end})"` : "";
|
|
3570
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="#1a1a2e" stroke-width="1.3" stroke-dasharray="${st2.dash}"${start}${end}/>` + edgePill(p2, rl.label) + `</g>`;
|
|
1882
3571
|
}
|
|
1883
3572
|
for (const c of classes) {
|
|
1884
3573
|
const r = rectFor2(c);
|
|
@@ -1887,10 +3576,10 @@ function renderUml(data) {
|
|
|
1887
3576
|
const nameY = r.y + (c.stereotype !== void 0 ? 24 : 19);
|
|
1888
3577
|
const stereo = c.stereotype !== void 0 ? `<text x="${r.x + r.w / 2}" y="${r.y + 13}" class="uml-stereo">\xAB${escapeHtml(c.stereotype)}\xBB</text>` : "";
|
|
1889
3578
|
const attrs = (c.attrs ?? []).map(
|
|
1890
|
-
(a,
|
|
3579
|
+
(a, j2) => `<text x="${r.x + 10}" y="${r.y + hh + 14 + j2 * rowH}" class="uml-row">${escapeHtml(a)}</text>`
|
|
1891
3580
|
).join("");
|
|
1892
3581
|
const methods = (c.methods ?? []).map(
|
|
1893
|
-
(m,
|
|
3582
|
+
(m, j2) => `<text x="${r.x + 10}" y="${r.y + hh + aH + 14 + j2 * rowH}" class="uml-row">${escapeHtml(m)}</text>`
|
|
1894
3583
|
).join("");
|
|
1895
3584
|
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="3" fill="#fff" stroke="#0e54a1" stroke-width="1.3"/>` + stereo + `<text x="${r.x + r.w / 2}" y="${nameY}" class="uml-name">${escapeHtml(c.name)}</text><line x1="${r.x}" y1="${r.y + hh}" x2="${r.x + r.w}" y2="${r.y + hh}" class="uml-sep"/>` + attrs + `<line x1="${r.x}" y1="${r.y + hh + aH}" x2="${r.x + r.w}" y2="${r.y + hh + aH}" class="uml-sep"/>` + methods + `</g>`;
|
|
1896
3585
|
}
|
|
@@ -1971,20 +3660,20 @@ function renderMece(data) {
|
|
|
1971
3660
|
}
|
|
1972
3661
|
for (const n of nodes) {
|
|
1973
3662
|
if (!pos.has(n.id)) continue;
|
|
1974
|
-
const
|
|
3663
|
+
const x2 = xOf(n.id);
|
|
1975
3664
|
const y = yOf(n.id);
|
|
1976
|
-
const
|
|
1977
|
-
const stroke =
|
|
1978
|
-
const stripe =
|
|
1979
|
-
const labelX =
|
|
1980
|
-
const anchor =
|
|
1981
|
-
const lines = wrapText(n.label,
|
|
3665
|
+
const st2 = meceStyle(depth.get(n.id) ?? 0);
|
|
3666
|
+
const stroke = st2.solid === true ? "none" : st2.accent;
|
|
3667
|
+
const stripe = st2.solid === true ? "" : `<rect x="${x2}" y="${y}" width="5" height="${nodeH}" rx="2" fill="${st2.accent}"/>`;
|
|
3668
|
+
const labelX = x2 + (st2.solid === true ? nodeW / 2 : 14);
|
|
3669
|
+
const anchor = st2.solid === true ? "middle" : "start";
|
|
3670
|
+
const lines = wrapText(n.label, st2.solid === true ? 22 : 20, n.note !== void 0 ? 1 : 2);
|
|
1982
3671
|
const startY = lines.length === 2 ? y + 22 : y + (n.note !== void 0 ? 22 : 30);
|
|
1983
3672
|
const labelTexts = lines.map(
|
|
1984
|
-
(
|
|
3673
|
+
(ln2, j2) => `<text x="${labelX}" y="${startY + j2 * 14}" class="blk-name" fill="${st2.text}" text-anchor="${anchor}">${escapeHtml(ln2)}</text>`
|
|
1985
3674
|
).join("");
|
|
1986
|
-
const note = n.note !== void 0 ? `<text x="${labelX}" y="${y + 38}" class="ft-note" fill="${
|
|
1987
|
-
s += `<g filter="url(#gshadow)"><rect x="${
|
|
3675
|
+
const note = n.note !== void 0 ? `<text x="${labelX}" y="${y + 38}" class="ft-note" fill="${st2.solid === true ? "#cfe0f3" : st2.accent}" text-anchor="${anchor}">${escapeHtml(n.note)}</text>` : "";
|
|
3676
|
+
s += `<g filter="url(#gshadow)"><rect x="${x2}" y="${y}" width="${nodeW}" height="${nodeH}" rx="6" fill="${st2.fill}" stroke="${stroke}" stroke-width="1.3"/>` + stripe + labelTexts + note + `</g>`;
|
|
1988
3677
|
}
|
|
1989
3678
|
s += `</svg>`;
|
|
1990
3679
|
return diagramFrame(
|
|
@@ -2082,20 +3771,20 @@ function renderFrontend(data) {
|
|
|
2082
3771
|
}
|
|
2083
3772
|
for (const n of nodes) {
|
|
2084
3773
|
if (!pos.has(n.id)) continue;
|
|
2085
|
-
const
|
|
3774
|
+
const x2 = xOf(n.id);
|
|
2086
3775
|
const y = yOf(n.id);
|
|
2087
|
-
const
|
|
2088
|
-
const stroke =
|
|
2089
|
-
const stripe =
|
|
2090
|
-
const labelX =
|
|
2091
|
-
const anchor =
|
|
2092
|
-
const lines = wrapText(n.name,
|
|
3776
|
+
const st2 = ftStyle(n.kind);
|
|
3777
|
+
const stroke = st2.solid === true ? "none" : st2.accent;
|
|
3778
|
+
const stripe = st2.solid === true ? "" : `<rect x="${x2}" y="${y}" width="5" height="${nodeH}" rx="2" fill="${st2.accent}"/>`;
|
|
3779
|
+
const labelX = x2 + (st2.solid === true ? nodeW / 2 : 14);
|
|
3780
|
+
const anchor = st2.solid === true ? "middle" : "start";
|
|
3781
|
+
const lines = wrapText(n.name, st2.solid === true ? 20 : 18, n.note !== void 0 ? 1 : 2);
|
|
2093
3782
|
const startY = lines.length === 2 ? y + 25 : y + (n.note !== void 0 ? 25 : 33);
|
|
2094
3783
|
const labelTexts = lines.map(
|
|
2095
|
-
(
|
|
3784
|
+
(ln2, j2) => `<text x="${labelX}" y="${startY + j2 * 14}" class="blk-name" fill="${st2.text}" text-anchor="${anchor}">${escapeHtml(ln2)}</text>`
|
|
2096
3785
|
).join("");
|
|
2097
|
-
const note = n.note !== void 0 ? `<text x="${labelX}" y="${y + 41}" class="ft-note" fill="${
|
|
2098
|
-
s += `<g filter="url(#gshadow)"><rect x="${
|
|
3786
|
+
const note = n.note !== void 0 ? `<text x="${labelX}" y="${y + 41}" class="ft-note" fill="${st2.solid === true ? "#cfe0f3" : st2.accent}" text-anchor="${anchor}">${escapeHtml(n.note)}</text>` : "";
|
|
3787
|
+
s += `<g filter="url(#gshadow)"><rect x="${x2}" y="${y}" width="${nodeW}" height="${nodeH}" rx="8" fill="${st2.fill}" stroke="${stroke}" stroke-width="1.2"/>` + stripe + labelTexts + note + `</g>`;
|
|
2099
3788
|
}
|
|
2100
3789
|
s += `</svg>`;
|
|
2101
3790
|
return diagramFrame(
|
|
@@ -2164,36 +3853,36 @@ function renderCluster(data) {
|
|
|
2164
3853
|
s += `<g><rect x="${cb.x}" y="${cb.y}" width="${cb.w}" height="${cb.h}" rx="12" fill="#0e54a1" fill-opacity="0.035" stroke="#0e54a1" stroke-width="1.4" stroke-dasharray="8 5"/><rect x="${cb.x}" y="${cb.y}" width="${cb.w}" height="${cHeader}" rx="12" fill="#0e54a1"/><rect x="${cb.x}" y="${cb.y + cHeader - 12}" width="${cb.w}" height="12" fill="#0e54a1"/><text x="${cb.x + 16}" y="${cb.y + 21}" class="cl-head">${escapeHtml(cb.c.label)}</text>` + kindLabel + `</g>`;
|
|
2165
3854
|
}
|
|
2166
3855
|
for (const e of edges) {
|
|
2167
|
-
const
|
|
2168
|
-
const
|
|
2169
|
-
if (!
|
|
2170
|
-
const
|
|
2171
|
-
const
|
|
3856
|
+
const A2 = rects.get(e.from);
|
|
3857
|
+
const B2 = rects.get(e.to);
|
|
3858
|
+
if (!A2 || !B2) continue;
|
|
3859
|
+
const p2 = ortho(A2, B2);
|
|
3860
|
+
const st2 = GEDGE[e.kind ?? "solid"] ?? GEDGE["solid"] ?? {
|
|
2172
3861
|
stroke: "#1a1a2e",
|
|
2173
3862
|
sw: 1.4,
|
|
2174
3863
|
dash: "",
|
|
2175
3864
|
marker: "gArrow",
|
|
2176
3865
|
err: false
|
|
2177
3866
|
};
|
|
2178
|
-
s += `<g><path d="${
|
|
3867
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="${st2.stroke}" stroke-width="${st2.sw}" stroke-dasharray="${st2.dash}" marker-end="url(#${st2.marker})"/>` + edgePill(p2, e.label, st2.err) + `</g>`;
|
|
2179
3868
|
}
|
|
2180
3869
|
for (const sv of services) {
|
|
2181
3870
|
const r = rects.get(sv.id);
|
|
2182
3871
|
if (r === void 0) continue;
|
|
2183
|
-
const
|
|
2184
|
-
const gl = nodeGlyph(sv.kind, r.x + 14, r.y + 14,
|
|
3872
|
+
const st2 = blockStyle(sv.kind);
|
|
3873
|
+
const gl = nodeGlyph(sv.kind, r.x + 14, r.y + 14, st2.accent);
|
|
2185
3874
|
const nx = gl.length > 0 ? r.x + 38 : r.x + 14;
|
|
2186
3875
|
const reps = sv.replicas ?? 0;
|
|
2187
|
-
const techLine = sv.tech !== void 0 ? `<text x="${nx}" y="${r.y + 42}" class="blk-tech" fill="${
|
|
3876
|
+
const techLine = sv.tech !== void 0 ? `<text x="${nx}" y="${r.y + 42}" class="blk-tech" fill="${st2.accent}">${escapeHtml(sv.tech)}</text>` : "";
|
|
2188
3877
|
const repIndicator = reps > 0 ? (() => {
|
|
2189
3878
|
const shown = Math.min(reps, 5);
|
|
2190
3879
|
let bars = "";
|
|
2191
|
-
for (let
|
|
2192
|
-
bars += `<rect x="${r.x + 12 +
|
|
3880
|
+
for (let j2 = 0; j2 < shown; j2++) {
|
|
3881
|
+
bars += `<rect x="${r.x + 12 + j2 * 8}" y="${r.y + r.h - 14}" width="5" height="8" rx="1" fill="${st2.accent}" opacity="0.7"/>`;
|
|
2193
3882
|
}
|
|
2194
|
-
return `<g>` + bars + `<text x="${r.x + 12 + shown * 8 + 4}" y="${r.y + r.h - 7}" class="blk-tech" fill="${
|
|
3883
|
+
return `<g>` + bars + `<text x="${r.x + 12 + shown * 8 + 4}" y="${r.y + r.h - 7}" class="blk-tech" fill="${st2.accent}">\xD7${reps}</text></g>`;
|
|
2195
3884
|
})() : "";
|
|
2196
|
-
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="8" fill="${
|
|
3885
|
+
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="8" fill="${st2.fill}" stroke="${st2.accent}" stroke-width="1.2"/><rect x="${r.x}" y="${r.y}" width="5" height="${r.h}" rx="2" fill="${st2.accent}"/>` + gl + `<text x="${nx}" y="${r.y + (sv.tech !== void 0 ? 26 : 30)}" class="blk-name" fill="${st2.text}" style="font-size:12px">${escapeHtml(sv.label)}</text>` + techLine + repIndicator + `</g>`;
|
|
2197
3886
|
}
|
|
2198
3887
|
s += `</svg>`;
|
|
2199
3888
|
return diagramFrame(
|
|
@@ -2267,21 +3956,21 @@ function renderGrid(data) {
|
|
|
2267
3956
|
s += `<g>${zone}${label}</g>`;
|
|
2268
3957
|
}
|
|
2269
3958
|
for (const e of edges) {
|
|
2270
|
-
const
|
|
2271
|
-
const
|
|
2272
|
-
if (!
|
|
2273
|
-
const
|
|
2274
|
-
const
|
|
2275
|
-
s += `<g><path d="${
|
|
3959
|
+
const A2 = byId.get(e.from);
|
|
3960
|
+
const B2 = byId.get(e.to);
|
|
3961
|
+
if (!A2 || !B2) continue;
|
|
3962
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
3963
|
+
const st2 = GEDGE[e.kind ?? "solid"] ?? GEDGE["solid"] ?? FALLBACK_EDGE;
|
|
3964
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="${st2.stroke}" stroke-width="${st2.sw}" stroke-dasharray="${st2.dash}" marker-end="url(#${st2.marker})"/>` + edgePill(p2, e.label, st2.err) + `</g>`;
|
|
2276
3965
|
}
|
|
2277
3966
|
for (const n of nodes) {
|
|
2278
3967
|
const r = rectFor2(n);
|
|
2279
|
-
const
|
|
2280
|
-
const gl = nodeGlyph(n.kind, r.x + 16, r.y + 16,
|
|
3968
|
+
const st2 = blockStyle(n.kind);
|
|
3969
|
+
const gl = nodeGlyph(n.kind, r.x + 16, r.y + 16, st2.accent);
|
|
2281
3970
|
const nx = gl.length > 0 ? r.x + 42 : r.x + 16;
|
|
2282
|
-
const chip = gl.length === 0 && n.kind !== void 0 ? `<text x="${r.x + 16}" y="${r.y + 22}" class="blk-chip" fill="${
|
|
2283
|
-
const tech = n.tech !== void 0 ? `<text x="${nx}" y="${r.y + (gl.length > 0 ? 50 : 60)}" class="blk-tech" fill="${
|
|
2284
|
-
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="9" fill="${
|
|
3971
|
+
const chip = gl.length === 0 && n.kind !== void 0 ? `<text x="${r.x + 16}" y="${r.y + 22}" class="blk-chip" fill="${st2.accent}">${escapeHtml(n.kind)}</text>` : "";
|
|
3972
|
+
const tech = n.tech !== void 0 ? `<text x="${nx}" y="${r.y + (gl.length > 0 ? 50 : 60)}" class="blk-tech" fill="${st2.accent}">${escapeHtml(n.tech)}</text>` : "";
|
|
3973
|
+
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="9" fill="${st2.fill}" stroke="${st2.accent}" stroke-width="1.2"/><rect x="${r.x}" y="${r.y}" width="5" height="${r.h}" rx="2" fill="${st2.accent}"/>` + gl + chip + `<text x="${nx}" y="${r.y + (gl.length > 0 ? 34 : 44)}" class="blk-name" fill="${st2.text}">${escapeHtml(n.name)}</text>` + tech + `</g>`;
|
|
2285
3974
|
}
|
|
2286
3975
|
s += `</svg>`;
|
|
2287
3976
|
return s;
|
|
@@ -2291,7 +3980,7 @@ function renderLayered(data) {
|
|
|
2291
3980
|
const nodes = data.nodes ?? [];
|
|
2292
3981
|
const edges = data.edges ?? [];
|
|
2293
3982
|
const byLayer = layers.map(
|
|
2294
|
-
(
|
|
3983
|
+
(_2, i) => nodes.filter((n) => (n.layer ?? 0) === i)
|
|
2295
3984
|
);
|
|
2296
3985
|
const outerPad = 28;
|
|
2297
3986
|
const titleH = data.systemLabel !== void 0 ? 32 : 16;
|
|
@@ -2315,9 +4004,9 @@ function renderLayered(data) {
|
|
|
2315
4004
|
const rects = /* @__PURE__ */ new Map();
|
|
2316
4005
|
byLayer.forEach((arr, i) => {
|
|
2317
4006
|
const startX = contentX + (bandInnerW - rowW(arr.length)) / 2;
|
|
2318
|
-
arr.forEach((n,
|
|
4007
|
+
arr.forEach((n, j2) => {
|
|
2319
4008
|
rects.set(n.id, {
|
|
2320
|
-
x: startX +
|
|
4009
|
+
x: startX + j2 * (nodeW + nodeGap),
|
|
2321
4010
|
y: bandY(i) + bandPadY,
|
|
2322
4011
|
w: nodeW,
|
|
2323
4012
|
h: nodeH
|
|
@@ -2329,26 +4018,26 @@ function renderLayered(data) {
|
|
|
2329
4018
|
s += `<text x="${outerPad + 14}" y="${outerPad + 18}" class="grp-label" fill="#0e54a1">${escapeHtml(data.systemLabel)}</text>`;
|
|
2330
4019
|
}
|
|
2331
4020
|
for (let i = 0; i < layers.length; i++) {
|
|
2332
|
-
const
|
|
2333
|
-
if (
|
|
2334
|
-
s += `<g><rect x="${innerX}" y="${bandY(i)}" width="${labelW + bandInnerW}" height="${bandH}" rx="6" fill="#f3f4f6" stroke="#d1d5db"/><rect x="${innerX}" y="${bandY(i)}" width="${labelW}" height="${bandH}" rx="6" fill="#0e54a1"/><rect x="${innerX + labelW - 8}" y="${bandY(i)}" width="8" height="${bandH}" fill="#0e54a1"/><text x="${innerX + 14}" y="${bandY(i) + bandH / 2 + 4}" class="layer-label">${escapeHtml(
|
|
4021
|
+
const L2 = layers[i];
|
|
4022
|
+
if (L2 === void 0) continue;
|
|
4023
|
+
s += `<g><rect x="${innerX}" y="${bandY(i)}" width="${labelW + bandInnerW}" height="${bandH}" rx="6" fill="#f3f4f6" stroke="#d1d5db"/><rect x="${innerX}" y="${bandY(i)}" width="${labelW}" height="${bandH}" rx="6" fill="#0e54a1"/><rect x="${innerX + labelW - 8}" y="${bandY(i)}" width="8" height="${bandH}" fill="#0e54a1"/><text x="${innerX + 14}" y="${bandY(i) + bandH / 2 + 4}" class="layer-label">${escapeHtml(L2.label)}</text></g>`;
|
|
2335
4024
|
}
|
|
2336
4025
|
for (const e of edges) {
|
|
2337
|
-
const
|
|
2338
|
-
const
|
|
2339
|
-
if (!
|
|
2340
|
-
const
|
|
2341
|
-
const
|
|
2342
|
-
s += `<g><path d="${
|
|
4026
|
+
const A2 = rects.get(e.from);
|
|
4027
|
+
const B2 = rects.get(e.to);
|
|
4028
|
+
if (!A2 || !B2) continue;
|
|
4029
|
+
const p2 = ortho(A2, B2);
|
|
4030
|
+
const st2 = GEDGE[e.kind ?? "solid"] ?? GEDGE["solid"] ?? FALLBACK_EDGE;
|
|
4031
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="${st2.stroke}" stroke-width="${st2.sw}" stroke-dasharray="${st2.dash}" marker-end="url(#${st2.marker})"/>` + edgePill(p2, e.label, st2.err) + `</g>`;
|
|
2343
4032
|
}
|
|
2344
4033
|
for (const n of nodes) {
|
|
2345
4034
|
const r = rects.get(n.id);
|
|
2346
4035
|
if (r === void 0) continue;
|
|
2347
|
-
const
|
|
2348
|
-
const gl = nodeGlyph(n.kind, r.x + 12, r.y + 12,
|
|
4036
|
+
const st2 = blockStyle(n.kind);
|
|
4037
|
+
const gl = nodeGlyph(n.kind, r.x + 12, r.y + 12, st2.accent);
|
|
2349
4038
|
const nx = gl.length > 0 ? r.x + 34 : r.x + 14;
|
|
2350
|
-
const tech = n.tech !== void 0 ? `<text x="${nx}" y="${r.y + 42}" class="blk-tech" fill="${
|
|
2351
|
-
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="8" fill="${
|
|
4039
|
+
const tech = n.tech !== void 0 ? `<text x="${nx}" y="${r.y + 42}" class="blk-tech" fill="${st2.accent}">${escapeHtml(n.tech)}</text>` : "";
|
|
4040
|
+
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="8" fill="${st2.fill}" stroke="${st2.accent}" stroke-width="1.2"/><rect x="${r.x}" y="${r.y}" width="5" height="${r.h}" rx="2" fill="${st2.accent}"/>` + gl + `<text x="${nx}" y="${r.y + (n.tech !== void 0 ? 26 : 33)}" class="blk-name" fill="${st2.text}">${escapeHtml(n.name)}</text>` + tech + `</g>`;
|
|
2352
4041
|
}
|
|
2353
4042
|
s += `</svg>`;
|
|
2354
4043
|
return s;
|
|
@@ -2528,28 +4217,28 @@ function renderFelogicGraph(data, frame) {
|
|
|
2528
4217
|
s += `<g><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="10" fill="${col}" fill-opacity="0.05" stroke="${col}" stroke-opacity="0.5" stroke-width="1.2" stroke-dasharray="7 5"/><text x="${r.x + 14}" y="${r.y + 15}" class="grp-label" fill="${col}">${escapeHtml(g.label)}</text></g>`;
|
|
2529
4218
|
}
|
|
2530
4219
|
for (const e of edges) {
|
|
2531
|
-
const
|
|
2532
|
-
const
|
|
2533
|
-
if (!
|
|
2534
|
-
const
|
|
2535
|
-
const
|
|
2536
|
-
s += `<g><path d="${
|
|
4220
|
+
const A2 = byId.get(e.from);
|
|
4221
|
+
const B2 = byId.get(e.to);
|
|
4222
|
+
if (!A2 || !B2) continue;
|
|
4223
|
+
const p2 = ortho(rectFor2(A2), rectFor2(B2));
|
|
4224
|
+
const st2 = feEdge(e.kind);
|
|
4225
|
+
s += `<g><path d="${p2.d}" fill="none" stroke="${st2.stroke}" stroke-width="${st2.sw}" stroke-dasharray="${st2.dash}" marker-end="url(#${st2.marker})"/>` + edgePill(p2, e.label) + `</g>`;
|
|
2537
4226
|
}
|
|
2538
4227
|
for (const n of nodes) {
|
|
2539
4228
|
const r = rectFor2(n);
|
|
2540
|
-
const
|
|
2541
|
-
const
|
|
2542
|
-
const gl = GLYPH_KINDS.has(
|
|
2543
|
-
const nx =
|
|
2544
|
-
const anchor =
|
|
2545
|
-
const nameY = r.y + (
|
|
2546
|
-
const noteY = r.y + (
|
|
2547
|
-
const stroke =
|
|
2548
|
-
const dashAttr =
|
|
2549
|
-
const stripe =
|
|
2550
|
-
const stereo =
|
|
2551
|
-
const note = n.note !== void 0 ? `<text x="${nx}" y="${noteY}" class="blk-tech" fill="${
|
|
2552
|
-
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="9" fill="${
|
|
4229
|
+
const st2 = feStyle(n.kind);
|
|
4230
|
+
const k2 = (n.kind ?? "").toLowerCase();
|
|
4231
|
+
const gl = GLYPH_KINDS.has(k2) ? nodeGlyph(GLYPH_REMAP[k2] ?? k2, r.x + 16, r.y + 16, st2.accent) : "";
|
|
4232
|
+
const nx = st2.solid === true ? r.x + r.w / 2 : gl.length > 0 ? r.x + 42 : r.x + 16;
|
|
4233
|
+
const anchor = st2.solid === true ? "middle" : "start";
|
|
4234
|
+
const nameY = r.y + (st2.stereo !== void 0 ? 38 : n.note !== void 0 ? 36 : 44);
|
|
4235
|
+
const noteY = r.y + (st2.stereo !== void 0 ? 56 : 52);
|
|
4236
|
+
const stroke = st2.solid === true ? "none" : st2.accent;
|
|
4237
|
+
const dashAttr = st2.dash !== void 0 ? ` stroke-dasharray="${st2.dash}"` : "";
|
|
4238
|
+
const stripe = st2.solid === true ? "" : `<rect x="${r.x}" y="${r.y}" width="5" height="${r.h}" rx="2" fill="${st2.accent}"/>`;
|
|
4239
|
+
const stereo = st2.stereo !== void 0 ? `<text x="${r.x + r.w / 2}" y="${r.y + 20}" class="uml-stereo">\xAB${escapeHtml(st2.stereo)}\xBB</text>` : "";
|
|
4240
|
+
const note = n.note !== void 0 ? `<text x="${nx}" y="${noteY}" class="blk-tech" fill="${st2.solid === true ? "#cfe0f3" : st2.accent}" text-anchor="${anchor}">${escapeHtml(n.note)}</text>` : "";
|
|
4241
|
+
s += `<g filter="url(#gshadow)"><rect x="${r.x}" y="${r.y}" width="${r.w}" height="${r.h}" rx="9" fill="${st2.fill}" stroke="${stroke}" stroke-width="1.2"${dashAttr}/>` + stripe + gl + stereo + `<text x="${nx}" y="${nameY}" class="blk-name" fill="${st2.text}" text-anchor="${anchor}">${escapeHtml(n.name)}</text>` + note + `</g>`;
|
|
2553
4242
|
}
|
|
2554
4243
|
s += `</svg>`;
|
|
2555
4244
|
return diagramFrame(
|
|
@@ -2613,11 +4302,11 @@ function elementHeight(el) {
|
|
|
2613
4302
|
}
|
|
2614
4303
|
}
|
|
2615
4304
|
var PH = 'fill="var(--light-gray)" stroke="var(--rule)" stroke-width="1"';
|
|
2616
|
-
function drawElement(el,
|
|
4305
|
+
function drawElement(el, x2, y, w2) {
|
|
2617
4306
|
const rows = Math.max(1, el.rows ?? 1);
|
|
2618
4307
|
const label = el.label ?? "";
|
|
2619
4308
|
const accent = el.tone === "danger" ? "var(--negative)" : el.tone === "muted" ? "var(--gray)" : "var(--navy)";
|
|
2620
|
-
const anchorX = el.align === "c" ?
|
|
4309
|
+
const anchorX = el.align === "c" ? x2 + w2 / 2 : el.align === "r" ? x2 + w2 : x2;
|
|
2621
4310
|
const anchor = el.align === "c" ? "middle" : el.align === "r" ? "end" : "start";
|
|
2622
4311
|
switch (el.type) {
|
|
2623
4312
|
case "header":
|
|
@@ -2627,69 +4316,69 @@ function drawElement(el, x, y, w) {
|
|
|
2627
4316
|
case "text": {
|
|
2628
4317
|
let s = "";
|
|
2629
4318
|
for (let i = 0; i < rows; i++) {
|
|
2630
|
-
const lw = i === rows - 1 ?
|
|
2631
|
-
s += `<rect x="${
|
|
4319
|
+
const lw = i === rows - 1 ? w2 * 0.66 : w2;
|
|
4320
|
+
s += `<rect x="${x2}" y="${y + i * 12}" width="${lw}" height="6" rx="3" fill="var(--rule)"/>`;
|
|
2632
4321
|
}
|
|
2633
4322
|
return s;
|
|
2634
4323
|
}
|
|
2635
4324
|
case "button":
|
|
2636
|
-
return `<rect x="${
|
|
4325
|
+
return `<rect x="${x2}" y="${y}" width="${w2}" height="34" rx="8" fill="${accent}"/><text x="${x2 + w2 / 2}" y="${y + 22}" class="wf-btn" text-anchor="middle">${escapeHtml(label || "Button")}</text>`;
|
|
2637
4326
|
case "input":
|
|
2638
4327
|
case "search": {
|
|
2639
|
-
const icon = el.type === "search" ? `<circle cx="${
|
|
2640
|
-
const tx = el.type === "search" ?
|
|
2641
|
-
return `<rect x="${
|
|
4328
|
+
const icon = el.type === "search" ? `<circle cx="${x2 + 16}" cy="${y + 17}" r="5" fill="none" stroke="var(--gray)" stroke-width="1.4"/><path d="M${x2 + 20} ${y + 21} l4 4" stroke="var(--gray)" stroke-width="1.4"/>` : "";
|
|
4329
|
+
const tx = el.type === "search" ? x2 + 30 : x2 + 12;
|
|
4330
|
+
return `<rect x="${x2}" y="${y}" width="${w2}" height="34" rx="8" fill="var(--white)" stroke="var(--rule)" stroke-width="1.2"/>` + icon + `<text x="${tx}" y="${y + 21}" class="wf-ph-text">${escapeHtml(label || "Type here\u2026")}</text>`;
|
|
2642
4331
|
}
|
|
2643
4332
|
case "image":
|
|
2644
|
-
return `<rect x="${
|
|
4333
|
+
return `<rect x="${x2}" y="${y}" width="${w2}" height="88" rx="8" ${PH}/><path d="M${x2} ${y + 88} L${x2 + w2 * 0.4} ${y + 40} L${x2 + w2 * 0.62} ${y + 66} L${x2 + w2 * 0.78} ${y + 50} L${x2 + w2} ${y + 88}" fill="none" stroke="var(--gray)" stroke-width="1.3"/><circle cx="${x2 + w2 * 0.74} " cy="${y + 26}" r="7" fill="none" stroke="var(--gray)" stroke-width="1.3"/>`;
|
|
2645
4334
|
case "avatar":
|
|
2646
|
-
return `<circle cx="${
|
|
4335
|
+
return `<circle cx="${x2 + 22}" cy="${y + 22}" r="20" ${PH}/><circle cx="${x2 + 22}" cy="${y + 17}" r="7" fill="var(--gray)"/><path d="M${x2 + 9} ${y + 40} a13 11 0 0 1 26 0" fill="var(--gray)"/>` + (label ? `<text x="${x2 + 52}" y="${y + 27}" class="wf-sub" fill="var(--charcoal)">${escapeHtml(label)}</text>` : "");
|
|
2647
4336
|
case "card": {
|
|
2648
4337
|
let s = "";
|
|
2649
4338
|
for (let i = 0; i < rows; i++) {
|
|
2650
4339
|
const cy = y + i * 74;
|
|
2651
|
-
s += `<rect x="${
|
|
4340
|
+
s += `<rect x="${x2}" y="${cy}" width="${w2}" height="64" rx="10" fill="var(--white)" stroke="var(--rule)" stroke-width="1.2"/><rect x="${x2 + 12}" y="${cy + 12}" width="40" height="40" rx="8" ${PH}/><rect x="${x2 + 64}" y="${cy + 16}" width="${w2 - 92}" height="7" rx="3.5" fill="var(--rule)"/><rect x="${x2 + 64}" y="${cy + 34}" width="${(w2 - 92) * 0.6}" height="6" rx="3" fill="var(--rule)"/>`;
|
|
2652
4341
|
}
|
|
2653
|
-
const cap = label ? `<text x="${
|
|
4342
|
+
const cap = label ? `<text x="${x2 + 64}" y="${y + 30}" class="wf-ph-text"></text>` : "";
|
|
2654
4343
|
return s + cap;
|
|
2655
4344
|
}
|
|
2656
4345
|
case "list": {
|
|
2657
4346
|
let s = "";
|
|
2658
4347
|
for (let i = 0; i < rows; i++) {
|
|
2659
4348
|
const ly = y + i * 40;
|
|
2660
|
-
s += `<circle cx="${
|
|
4349
|
+
s += `<circle cx="${x2 + 16}" cy="${ly + 20}" r="12" ${PH}/><rect x="${x2 + 38}" y="${ly + 12}" width="${w2 - 76}" height="6" rx="3" fill="var(--rule)"/><rect x="${x2 + 38}" y="${ly + 24}" width="${(w2 - 76) * 0.55}" height="5" rx="2.5" fill="var(--rule)"/><path d="M${x2 + w2 - 14} ${ly + 15} l5 5 l-5 5" fill="none" stroke="var(--gray)" stroke-width="1.4"/>` + (i < rows - 1 ? `<line x1="${x2 + 38}" y1="${ly + 40}" x2="${x2 + w2}" y2="${ly + 40}" stroke="var(--light-gray)" stroke-width="1"/>` : "");
|
|
2661
4350
|
}
|
|
2662
4351
|
return s;
|
|
2663
4352
|
}
|
|
2664
4353
|
case "nav": {
|
|
2665
4354
|
const items = (label || "Home, Docs, Pricing, About").split(",").map((t) => t.trim());
|
|
2666
4355
|
let s = "";
|
|
2667
|
-
let nx =
|
|
2668
|
-
for (const
|
|
2669
|
-
const pw = 16 +
|
|
2670
|
-
s += `<rect x="${nx}" y="${y + 4}" width="${pw}" height="22" rx="11" fill="var(--light-gray)"/><text x="${nx + pw / 2}" y="${y + 19}" class="wf-ph-text" text-anchor="middle">${escapeHtml(
|
|
4356
|
+
let nx = x2;
|
|
4357
|
+
for (const it2 of items) {
|
|
4358
|
+
const pw = 16 + it2.length * 6.2;
|
|
4359
|
+
s += `<rect x="${nx}" y="${y + 4}" width="${pw}" height="22" rx="11" fill="var(--light-gray)"/><text x="${nx + pw / 2}" y="${y + 19}" class="wf-ph-text" text-anchor="middle">${escapeHtml(it2)}</text>`;
|
|
2671
4360
|
nx += pw + 8;
|
|
2672
4361
|
}
|
|
2673
4362
|
return s;
|
|
2674
4363
|
}
|
|
2675
4364
|
case "tabs": {
|
|
2676
4365
|
const items = (label || "Home, Search, Bell, Profile").split(",").map((t) => t.trim());
|
|
2677
|
-
const seg =
|
|
2678
|
-
let s = `<line x1="${
|
|
2679
|
-
items.forEach((
|
|
2680
|
-
const cx =
|
|
2681
|
-
s += `<circle cx="${cx}" cy="${y + 18}" r="8" fill="none" stroke="${i === 0 ? accent : "var(--gray)"}" stroke-width="1.6"/><text x="${cx}" y="${y + 42}" class="wf-tab" text-anchor="middle" fill="${i === 0 ? accent : "var(--gray)"}">${escapeHtml(
|
|
4366
|
+
const seg = w2 / items.length;
|
|
4367
|
+
let s = `<line x1="${x2}" y1="${y}" x2="${x2 + w2}" y2="${y}" stroke="var(--rule)" stroke-width="1"/>`;
|
|
4368
|
+
items.forEach((it2, i) => {
|
|
4369
|
+
const cx = x2 + seg * i + seg / 2;
|
|
4370
|
+
s += `<circle cx="${cx}" cy="${y + 18}" r="8" fill="none" stroke="${i === 0 ? accent : "var(--gray)"}" stroke-width="1.6"/><text x="${cx}" y="${y + 42}" class="wf-tab" text-anchor="middle" fill="${i === 0 ? accent : "var(--gray)"}">${escapeHtml(it2)}</text>`;
|
|
2682
4371
|
});
|
|
2683
4372
|
return s;
|
|
2684
4373
|
}
|
|
2685
4374
|
case "divider":
|
|
2686
|
-
return `<line x1="${
|
|
4375
|
+
return `<line x1="${x2}" y1="${y + 7}" x2="${x2 + w2}" y2="${y + 7}" stroke="var(--rule)" stroke-width="1"/>`;
|
|
2687
4376
|
case "badge": {
|
|
2688
4377
|
const pw = 22 + label.length * 6.4;
|
|
2689
4378
|
return `<rect x="${anchorX - (anchor === "middle" ? pw / 2 : anchor === "end" ? pw : 0)}" y="${y}" width="${pw}" height="22" rx="11" fill="${accent}"/><text x="${anchorX - (anchor === "middle" ? 0 : anchor === "end" ? pw / 2 : -pw / 2)}" y="${y + 15}" class="wf-btn" text-anchor="middle">${escapeHtml(label || "New")}</text>`;
|
|
2690
4379
|
}
|
|
2691
4380
|
case "toggle":
|
|
2692
|
-
return (label ? `<text x="${
|
|
4381
|
+
return (label ? `<text x="${x2}" y="${y + 19}" class="wf-sub" fill="var(--charcoal)">${escapeHtml(label)}</text>` : "") + `<rect x="${x2 + w2 - 44}" y="${y + 6}" width="44" height="22" rx="11" fill="${accent}"/><circle cx="${x2 + w2 - 16}" cy="${y + 17}" r="8" fill="#fff"/>`;
|
|
2693
4382
|
case "spacer":
|
|
2694
4383
|
return "";
|
|
2695
4384
|
default:
|
|
@@ -2758,18 +4447,18 @@ function renderWireframe(data) {
|
|
|
2758
4447
|
const width = totalW + padX * 2;
|
|
2759
4448
|
const height = maxH + capH + padY * 2;
|
|
2760
4449
|
let s = `<svg viewBox="0 0 ${width} ${height}" role="img"><title>${escapeHtml(data.title ?? "UI mockup")}</title>`;
|
|
2761
|
-
let
|
|
4450
|
+
let x2 = padX;
|
|
2762
4451
|
drawn.forEach((d, i) => {
|
|
2763
4452
|
const screen = screens[i];
|
|
2764
|
-
s += `<g transform="translate(${
|
|
4453
|
+
s += `<g transform="translate(${x2}, ${padY})">${d.svg}</g>`;
|
|
2765
4454
|
const cap = screen?.label;
|
|
2766
4455
|
if (cap !== void 0 && cap.length > 0) {
|
|
2767
4456
|
const lines = wrapText(cap, Math.floor(d.width / 6), 2);
|
|
2768
|
-
lines.forEach((
|
|
2769
|
-
s += `<text x="${
|
|
4457
|
+
lines.forEach((ln2, j2) => {
|
|
4458
|
+
s += `<text x="${x2 + d.width / 2}" y="${padY + maxH + 16 + j2 * 12}" class="wf-caption" text-anchor="middle">${escapeHtml(ln2)}</text>`;
|
|
2770
4459
|
});
|
|
2771
4460
|
}
|
|
2772
|
-
|
|
4461
|
+
x2 += d.width + gap;
|
|
2773
4462
|
});
|
|
2774
4463
|
s += `</svg>`;
|
|
2775
4464
|
return diagramFrame(
|
|
@@ -2946,7 +4635,7 @@ var themes = {
|
|
|
2946
4635
|
function themeStyle(name) {
|
|
2947
4636
|
const vars = themes[name].vars;
|
|
2948
4637
|
const parts = [];
|
|
2949
|
-
for (const
|
|
4638
|
+
for (const k2 of Object.keys(vars)) parts.push(`${k2}:${vars[k2]};`);
|
|
2950
4639
|
return parts.join("");
|
|
2951
4640
|
}
|
|
2952
4641
|
|
|
@@ -2969,8 +4658,8 @@ function renderSectionHead(num, kind, title, lede) {
|
|
|
2969
4658
|
return `<div class="section-head"><div class="section-num">SECTION ${pad2(num)} \xB7 ${escapeHtml(label)}</div>` + titleHtml + ledeHtml + `</div>`;
|
|
2970
4659
|
}
|
|
2971
4660
|
function dispatchBlock(kind, data) {
|
|
2972
|
-
const
|
|
2973
|
-
return
|
|
4661
|
+
const fn2 = htmlRenderers[kind];
|
|
4662
|
+
return fn2(data);
|
|
2974
4663
|
}
|
|
2975
4664
|
function renderTypedSegment(seg, ctx) {
|
|
2976
4665
|
if (seg.kind === "meta") return "";
|
|
@@ -3000,7 +4689,7 @@ function renderSegment(seg, ctx) {
|
|
|
3000
4689
|
function buildThemeVars(theme, vars) {
|
|
3001
4690
|
let css = themeStyle(theme);
|
|
3002
4691
|
if (vars !== void 0) {
|
|
3003
|
-
for (const
|
|
4692
|
+
for (const k2 of Object.keys(vars)) css += `${k2}:${vars[k2]};`;
|
|
3004
4693
|
}
|
|
3005
4694
|
return css;
|
|
3006
4695
|
}
|
|
@@ -3033,6 +4722,11 @@ function renderDocument(doc, opts = {}) {
|
|
|
3033
4722
|
</html>
|
|
3034
4723
|
`;
|
|
3035
4724
|
}
|
|
4725
|
+
/*! Bundled license information:
|
|
4726
|
+
|
|
4727
|
+
@dagrejs/dagre/dist/dagre.esm.js:
|
|
4728
|
+
(*! For license information please see dagre.esm.js.LEGAL.txt *)
|
|
4729
|
+
*/
|
|
3036
4730
|
|
|
3037
4731
|
export { DEFAULT_THEME, buildThemeVars, edgePill, escapeHtml, globalDefsSvg, houseCss, htmlRenderers, ortho, renderDocument, renderDocumentParts, renderProse, safeColor, safeUrl, themeStyle, themes, wrapText };
|
|
3038
4732
|
//# sourceMappingURL=index.js.map
|