@falkordb/canvas 0.0.39 → 0.0.41
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/canvas.d.ts +2 -0
- package/dist/canvas.d.ts.map +1 -1
- package/dist/canvas.js +267 -70
- package/dist/canvas.js.map +1 -1
- package/package.json +1 -1
- package/src/canvas.ts +298 -77
package/dist/canvas.d.ts
CHANGED
|
@@ -51,7 +51,9 @@ declare class FalkorDBCanvas extends HTMLElement {
|
|
|
51
51
|
private initGraph;
|
|
52
52
|
private setupForces;
|
|
53
53
|
private drawNode;
|
|
54
|
+
private pointerNode;
|
|
54
55
|
private drawLink;
|
|
56
|
+
private pointerLink;
|
|
55
57
|
private updateLoadingState;
|
|
56
58
|
private handleEngineStop;
|
|
57
59
|
private updateEventHandlers;
|
package/dist/canvas.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,IAAI,EACJ,kBAAkB,EAClB,SAAS,EAET,SAAS,EACT,gBAAgB,EAChB,aAAa,EAId,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"canvas.d.ts","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,IAAI,EACJ,kBAAkB,EAClB,SAAS,EAET,SAAS,EACT,gBAAgB,EAChB,aAAa,EAId,MAAM,mBAAmB,CAAC;AAyD3B,cAAM,cAAe,SAAQ,WAAW;IACtC,OAAO,CAAC,KAAK,CAAqB;IAElC,OAAO,CAAC,SAAS,CAA+B;IAEhD,OAAO,CAAC,cAAc,CAA+B;IAErD,OAAO,CAAC,cAAc,CAA+B;IAErD,OAAO,CAAC,IAAI,CAAuC;IAEnD,OAAO,CAAC,YAAY,CAAkB;IAEtC,OAAO,CAAC,MAAM,CAKZ;IAEF,OAAO,CAAC,QAAQ,CAA+B;IAE/C,OAAO,CAAC,QAAQ,CAA+B;IAE/C,OAAO,CAAC,aAAa,CAAkC;IAEvD,OAAO,CAAC,sBAAsB,CAOhB;IAEd,OAAO,CAAC,QAAQ,CAAgB;;IAOhC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO;IAMzB;;;OAGG;IACH,OAAO,CAAC,GAAG;IAMX,iBAAiB;IAkBjB,oBAAoB;IAYpB,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAa3C,QAAQ,CAAC,KAAK,EAAE,MAAM;IAStB,SAAS,CAAC,MAAM,EAAE,MAAM;IASxB,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAahC,kBAAkB,CAAC,KAAK,EAAE,MAAM;IAQhC,YAAY,CAAC,SAAS,EAAE,OAAO;IAO/B,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;IAW1C,OAAO,IAAI,IAAI;IAIf,OAAO,CAAC,IAAI,EAAE,IAAI;IAmClB,WAAW,IAAI,aAAa;IAc5B,WAAW,CAAC,QAAQ,EAAE,aAAa;IAKnC,YAAY,IAAI,SAAS;IAIzB,YAAY,CAAC,IAAI,EAAE,SAAS;IAoB5B,QAAQ,IAAI,kBAAkB,GAAG,SAAS;IAInC,OAAO,IAAI,MAAM;IAIjB,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS;IAOvD,SAAS,CAAC,iBAAiB,SAAI,EAAE,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO;IAkB7E,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,+BAA+B;IAUvC,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,oBAAoB;IAmE5B,OAAO,CAAC,MAAM;IAuBd,OAAO,CAAC,mBAAmB;IAiB3B,OAAO,CAAC,SAAS;IAqHjB,OAAO,CAAC,WAAW;IAkDnB,OAAO,CAAC,QAAQ;IA8ChB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,QAAQ;IAiRhB,OAAO,CAAC,WAAW;IA2DnB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,gBAAgB;IA+CxB,OAAO,CAAC,mBAAmB;IAsF3B,OAAO,CAAC,mBAAmB;CAS5B;AAOD,eAAe,cAAc,CAAC"}
|
package/dist/canvas.js
CHANGED
|
@@ -3,6 +3,11 @@ import ForceGraph from "force-graph";
|
|
|
3
3
|
import * as d3 from "d3";
|
|
4
4
|
import { dataToGraphData, getContrastTextColor, getNodeDisplayText, graphDataToData, LINK_DISTANCE, wrapTextForCircularNode, } from "./canvas-utils.js";
|
|
5
5
|
const PADDING = 2;
|
|
6
|
+
// Arrow geometry constants (shared by self-loop and regular-link drawing paths)
|
|
7
|
+
const ARROW_WH_RATIO = 1.6;
|
|
8
|
+
const ARROW_VLEN_RATIO = 0.2;
|
|
9
|
+
// Multiplier to convert node size → cubic bezier control-point distance for self-loops
|
|
10
|
+
const SELF_LOOP_CURVE_FACTOR = 11.67;
|
|
6
11
|
// Force constants
|
|
7
12
|
const CHARGE_STRENGTH = -400;
|
|
8
13
|
const CENTER_STRENGTH = 0.03;
|
|
@@ -54,8 +59,8 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
54
59
|
captionsKeys: [],
|
|
55
60
|
showPropertyKeyPrefix: false,
|
|
56
61
|
};
|
|
57
|
-
this.nodeMode = '
|
|
58
|
-
this.linkMode = '
|
|
62
|
+
this.nodeMode = 'replace';
|
|
63
|
+
this.linkMode = 'replace';
|
|
59
64
|
this.nodeDegreeMap = new Map();
|
|
60
65
|
this.relationshipsTextCache = new Map();
|
|
61
66
|
this.attachShadow({ mode: "open" });
|
|
@@ -396,25 +401,12 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
396
401
|
.height(this.config.height || 600)
|
|
397
402
|
.backgroundColor(this.config.backgroundColor)
|
|
398
403
|
.graphData(this.data)
|
|
399
|
-
.nodeRelSize(1)
|
|
400
|
-
.nodeVal((node) => {
|
|
401
|
-
const strokeWidth = this.config.isNodeSelected?.(node) ? 1.5 : 1;
|
|
402
|
-
const radius = node.size + strokeWidth;
|
|
403
|
-
return radius * radius; // Return radius squared since force-graph does sqrt(val * relSize)
|
|
404
|
-
})
|
|
405
404
|
.nodeCanvasObjectMode(() => this.nodeMode)
|
|
406
405
|
.linkCanvasObjectMode(() => this.linkMode)
|
|
407
406
|
.nodeLabel((node) => getNodeDisplayText(node, this.config.captionsKeys, this.config.showPropertyKeyPrefix))
|
|
408
407
|
.linkLabel((link) => link.relationship)
|
|
409
|
-
.
|
|
410
|
-
.
|
|
411
|
-
if (link.source === link.target)
|
|
412
|
-
return 0;
|
|
413
|
-
return this.config.isLinkSelected?.(link) ? 4 : 2;
|
|
414
|
-
})
|
|
415
|
-
.linkDirectionalArrowColor((link) => link.color)
|
|
416
|
-
.linkWidth((link) => this.config.isLinkSelected?.(link) ? 2 : 1)
|
|
417
|
-
.linkLineDash((link) => this.config.linkLineDash?.(link) ?? null)
|
|
408
|
+
.linkDirectionalArrowLength(0)
|
|
409
|
+
.linkWidth(0)
|
|
418
410
|
.linkCurvature("curve")
|
|
419
411
|
.linkVisibility("visible")
|
|
420
412
|
.nodeVisibility("visible")
|
|
@@ -483,22 +475,30 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
483
475
|
this.drawNode(node, ctx);
|
|
484
476
|
}
|
|
485
477
|
})
|
|
486
|
-
.linkCanvasObject((link, ctx) => {
|
|
478
|
+
.linkCanvasObject((link, ctx, globalScale) => {
|
|
487
479
|
if (this.config.link) {
|
|
488
480
|
this.config.link.linkCanvasObject(link, ctx);
|
|
489
481
|
}
|
|
490
482
|
else {
|
|
491
|
-
this.drawLink(link, ctx);
|
|
483
|
+
this.drawLink(link, ctx, globalScale);
|
|
484
|
+
}
|
|
485
|
+
})
|
|
486
|
+
.nodePointerAreaPaint((node, color, ctx) => {
|
|
487
|
+
if (this.config.node) {
|
|
488
|
+
this.config.node.nodePointerAreaPaint(node, color, ctx);
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
this.pointerNode(node, color, ctx);
|
|
492
|
+
}
|
|
493
|
+
})
|
|
494
|
+
.linkPointerAreaPaint((link, color, ctx) => {
|
|
495
|
+
if (this.config.link) {
|
|
496
|
+
this.config.link.linkPointerAreaPaint(link, color, ctx);
|
|
497
|
+
}
|
|
498
|
+
else {
|
|
499
|
+
this.pointerLink(link, color, ctx);
|
|
492
500
|
}
|
|
493
501
|
});
|
|
494
|
-
// Only set pointer area paint if custom node/link configs are provided
|
|
495
|
-
if (this.config.node) {
|
|
496
|
-
this.graph?.nodePointerAreaPaint(this.config.node?.nodePointerAreaPaint);
|
|
497
|
-
}
|
|
498
|
-
if (this.config.link) {
|
|
499
|
-
this.graph?.linkPointerAreaPaint(this.config.link?.linkPointerAreaPaint);
|
|
500
|
-
}
|
|
501
|
-
;
|
|
502
502
|
// Setup forces
|
|
503
503
|
this.setupForces();
|
|
504
504
|
this.log('Force graph initialization complete');
|
|
@@ -541,11 +541,9 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
541
541
|
this.log('Force simulation setup complete');
|
|
542
542
|
}
|
|
543
543
|
drawNode(node, ctx) {
|
|
544
|
-
if (
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
}
|
|
548
|
-
ctx.lineWidth = this.config.isNodeSelected?.(node) ? 1.5 : 1;
|
|
544
|
+
if (node.x == null || node.y == null)
|
|
545
|
+
return;
|
|
546
|
+
ctx.lineWidth = this.config.isNodeSelected?.(node) ? 1 : 0.5;
|
|
549
547
|
ctx.strokeStyle = this.config.foregroundColor;
|
|
550
548
|
ctx.fillStyle = node.color;
|
|
551
549
|
const radius = node.size + ctx.lineWidth / 2;
|
|
@@ -578,28 +576,97 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
578
576
|
ctx.fillText(line2, node.x, node.y + halfTextHeight);
|
|
579
577
|
}
|
|
580
578
|
}
|
|
581
|
-
|
|
579
|
+
pointerNode(node, color, ctx) {
|
|
580
|
+
if (node.x == null || node.y == null)
|
|
581
|
+
return;
|
|
582
|
+
const radius = node.size + PADDING;
|
|
583
|
+
ctx.fillStyle = color;
|
|
584
|
+
ctx.beginPath();
|
|
585
|
+
ctx.arc(node.x, node.y, radius, 0, 2 * Math.PI, false);
|
|
586
|
+
ctx.fill();
|
|
587
|
+
}
|
|
588
|
+
drawLink(link, ctx, globalScale) {
|
|
582
589
|
const start = link.source;
|
|
583
590
|
const end = link.target;
|
|
584
|
-
if (
|
|
585
|
-
|
|
586
|
-
start.y = 0;
|
|
587
|
-
end.x = 0;
|
|
588
|
-
end.y = 0;
|
|
589
|
-
}
|
|
591
|
+
if (start.x == null || start.y == null || end.x == null || end.y == null)
|
|
592
|
+
return;
|
|
590
593
|
let textX;
|
|
591
594
|
let textY;
|
|
592
595
|
let angle;
|
|
593
596
|
if (start.id === end.id) {
|
|
594
597
|
const nodeSize = start.size || 6;
|
|
595
|
-
const d = (link.curve || 0) * nodeSize *
|
|
596
|
-
|
|
598
|
+
const d = (link.curve || 0) * nodeSize * SELF_LOOP_CURVE_FACTOR;
|
|
599
|
+
ctx.lineWidth = (this.config.isLinkSelected?.(link) ? 2 : 1) / globalScale;
|
|
600
|
+
ctx.setLineDash(this.config.linkLineDash?.(link) ?? []);
|
|
601
|
+
// The visible outer edge of the node border is nodeSize + strokeWidth
|
|
602
|
+
// (stroke is centered on nodeSize + strokeWidth/2, so outer edge = nodeSize + strokeWidth).
|
|
603
|
+
const nodeStrokeWidth = this.config.isNodeSelected?.(start) ? 1 : 0.5;
|
|
604
|
+
const borderRadius = nodeSize + nodeStrokeWidth;
|
|
605
|
+
// Binary search for tArrow near 1.0 where the curve is at distance borderRadius
|
|
606
|
+
// from the node center (i.e. on the outer edge of the node border stroke).
|
|
607
|
+
// Bezier parametric form: Bx(t)=sx+3(1-t)t²d, By(t)=sy-3(1-t)²td
|
|
608
|
+
// dist(t) = 3*(1-t)*t*|d|*sqrt(t² + (1-t)²)
|
|
609
|
+
const arrowLen = (this.config.isLinkSelected?.(link) ? 4 : 2) / globalScale;
|
|
610
|
+
const arrowHalfWidth = arrowLen / ARROW_WH_RATIO / 2;
|
|
611
|
+
let lo = 0.5, hi = 1.0;
|
|
612
|
+
const absD = Math.abs(d);
|
|
613
|
+
// Max reachable distance in [0.5, 1.0] is ≈ 0.53 * |d| (at t = 0.5).
|
|
614
|
+
// If |d| is too small to reach borderRadius, skip the arrowhead entirely.
|
|
615
|
+
const maxReachableDist = 3 * 0.5 * 0.5 * absD * Math.sqrt(0.5);
|
|
616
|
+
const canReachBorder = absD > 0 && maxReachableDist >= borderRadius;
|
|
617
|
+
if (canReachBorder) {
|
|
618
|
+
for (let i = 0; i < 20; i++) {
|
|
619
|
+
const mid = (lo + hi) / 2;
|
|
620
|
+
const um = 1 - mid;
|
|
621
|
+
const dist = 3 * um * mid * absD * Math.sqrt(mid * mid + um * um);
|
|
622
|
+
if (dist > borderRadius)
|
|
623
|
+
lo = mid;
|
|
624
|
+
else
|
|
625
|
+
hi = mid;
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
const tArrow = (lo + hi) / 2;
|
|
629
|
+
const uArrow = 1 - tArrow;
|
|
630
|
+
const tipX = start.x + 3 * uArrow * tArrow * tArrow * d;
|
|
631
|
+
const tipY = start.y - 3 * uArrow * uArrow * tArrow * d;
|
|
597
632
|
ctx.strokeStyle = link.color;
|
|
598
|
-
ctx.lineWidth = 0.5;
|
|
599
633
|
ctx.beginPath();
|
|
600
634
|
ctx.moveTo(start.x, start.y);
|
|
601
|
-
|
|
635
|
+
if (canReachBorder) {
|
|
636
|
+
// Clip the bezier stroke at tArrow using De Casteljau subdivision so
|
|
637
|
+
// the stroke stops exactly at the arrowhead tip and does not continue
|
|
638
|
+
// through it. Split control points for the [0, tArrow] segment:
|
|
639
|
+
// CP1 = (sx, sy - tArrow*d)
|
|
640
|
+
// CP2 = (sx + tArrow²*d, sy - 2*tArrow*(1-tArrow)*d)
|
|
641
|
+
// End = B(tArrow) = (tipX, tipY)
|
|
642
|
+
ctx.bezierCurveTo(start.x, start.y - tArrow * d, start.x + tArrow * tArrow * d, start.y - 2 * tArrow * uArrow * d, tipX, tipY);
|
|
643
|
+
}
|
|
644
|
+
else {
|
|
645
|
+
// d is too small to reach the node border — draw the full self-loop
|
|
646
|
+
// back to the source node (t=1.0) so the loop is always complete.
|
|
647
|
+
// Full bezier: P0=(sx,sy), P1=(sx,sy-d), P2=(sx+d,sy), P3=(sx,sy)
|
|
648
|
+
ctx.bezierCurveTo(start.x, start.y - d, start.x + d, start.y, start.x, start.y);
|
|
649
|
+
}
|
|
602
650
|
ctx.stroke();
|
|
651
|
+
ctx.setLineDash([]);
|
|
652
|
+
// Tangent at tArrow (direction the curve travels toward the node)
|
|
653
|
+
const tdx = 3 * d * tArrow * (2 - 3 * tArrow);
|
|
654
|
+
const tdy = -3 * d * uArrow * (1 - 3 * tArrow);
|
|
655
|
+
const tLen = Math.sqrt(tdx * tdx + tdy * tdy);
|
|
656
|
+
// Guard against zero-length tangent vector (e.g. when d ≈ 0) to avoid NaN
|
|
657
|
+
// normals and invalid arrowhead geometry. Also skip when d is too small to
|
|
658
|
+
// place the arrowhead at the node border (canReachBorder is false).
|
|
659
|
+
if (tLen !== 0 && canReachBorder) {
|
|
660
|
+
const nx = tdx / tLen;
|
|
661
|
+
const ny = tdy / tLen;
|
|
662
|
+
ctx.fillStyle = link.color;
|
|
663
|
+
ctx.beginPath();
|
|
664
|
+
ctx.moveTo(tipX, tipY);
|
|
665
|
+
ctx.lineTo(tipX - nx * arrowLen + ny * arrowHalfWidth, tipY - ny * arrowLen - nx * arrowHalfWidth);
|
|
666
|
+
ctx.lineTo(tipX - nx * arrowLen * (1 - ARROW_VLEN_RATIO), tipY - ny * arrowLen * (1 - ARROW_VLEN_RATIO));
|
|
667
|
+
ctx.lineTo(tipX - nx * arrowLen - ny * arrowHalfWidth, tipY - ny * arrowLen + nx * arrowHalfWidth);
|
|
668
|
+
ctx.fill();
|
|
669
|
+
}
|
|
603
670
|
// Midpoint of cubic bezier: P0=(sx,sy), P1=(sx,sy-d), P2=(sx+d,sy), P3=(sx,sy)
|
|
604
671
|
textX = start.x + 0.375 * d;
|
|
605
672
|
textY = start.y - 0.375 * d;
|
|
@@ -614,6 +681,11 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
614
681
|
const dx = end.x - start.x;
|
|
615
682
|
const dy = end.y - start.y;
|
|
616
683
|
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
684
|
+
// Guard: skip drawing when source and target are co-located (e.g. during
|
|
685
|
+
// simulation start-up). perpX/perpY would be NaN and propagate through
|
|
686
|
+
// all downstream bezier and arrowhead calculations.
|
|
687
|
+
if (distance === 0)
|
|
688
|
+
return;
|
|
617
689
|
const perpX = dy / distance;
|
|
618
690
|
const perpY = -dx / distance;
|
|
619
691
|
const curvature = link.curve || 0;
|
|
@@ -636,18 +708,91 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
636
708
|
angle = -(Math.PI - angle);
|
|
637
709
|
if (angle < -Math.PI / 2)
|
|
638
710
|
angle = -(-Math.PI - angle);
|
|
711
|
+
// --- Draw the regular link line and arrowhead ---
|
|
712
|
+
// Scale arrow geometry by 1/globalScale so arrowheads remain visually
|
|
713
|
+
// consistent across zoom levels, matching ctx.lineWidth / globalScale.
|
|
714
|
+
const baseArrowLen = this.config.isLinkSelected?.(link) ? 4 : 2;
|
|
715
|
+
const arrowLen = baseArrowLen / globalScale;
|
|
716
|
+
const arrowHalfWidth = arrowLen / ARROW_WH_RATIO / 2;
|
|
717
|
+
// Binary-search for tArrow near 1.0 where the quadratic bezier
|
|
718
|
+
// Q(t) = (1-t)²·start + 2(1-t)t·control + t²·end
|
|
719
|
+
// is at distance borderRadius from the target node centre.
|
|
720
|
+
const endNodeSize = end.size || 6;
|
|
721
|
+
const endNodeStrokeWidth = this.config.isNodeSelected?.(end) ? 1 : 0.5;
|
|
722
|
+
const borderRadius = endNodeSize + endNodeStrokeWidth;
|
|
723
|
+
const borderRadiusSq = borderRadius * borderRadius;
|
|
724
|
+
// When borderRadius is small relative to the chord length, the bezier and
|
|
725
|
+
// chord diverge only near t=1, so a linear approximation is accurate and
|
|
726
|
+
// avoids the per-frame search cost on large graphs.
|
|
727
|
+
let tArrow;
|
|
728
|
+
if (borderRadius / distance < 0.02) {
|
|
729
|
+
tArrow = Math.min(1, Math.max(0, 1 - borderRadius / distance));
|
|
730
|
+
}
|
|
731
|
+
else {
|
|
732
|
+
let lo = 0.5, hi = 1.0;
|
|
733
|
+
for (let i = 0; i < 10; i++) {
|
|
734
|
+
const mid = (lo + hi) / 2;
|
|
735
|
+
const um = 1 - mid;
|
|
736
|
+
const qx = um * um * start.x + 2 * um * mid * controlX + mid * mid * end.x;
|
|
737
|
+
const qy = um * um * start.y + 2 * um * mid * controlY + mid * mid * end.y;
|
|
738
|
+
const dxEnd = qx - end.x;
|
|
739
|
+
const dyEnd = qy - end.y;
|
|
740
|
+
if (dxEnd * dxEnd + dyEnd * dyEnd > borderRadiusSq)
|
|
741
|
+
lo = mid;
|
|
742
|
+
else
|
|
743
|
+
hi = mid;
|
|
744
|
+
if (hi - lo < 1e-3)
|
|
745
|
+
break;
|
|
746
|
+
}
|
|
747
|
+
tArrow = (lo + hi) / 2;
|
|
748
|
+
}
|
|
749
|
+
const uArrow = 1 - tArrow;
|
|
750
|
+
// Tip = Q(tArrow)
|
|
751
|
+
const tipX = uArrow * uArrow * start.x + 2 * uArrow * tArrow * controlX + tArrow * tArrow * end.x;
|
|
752
|
+
const tipY = uArrow * uArrow * start.y + 2 * uArrow * tArrow * controlY + tArrow * tArrow * end.y;
|
|
753
|
+
// Clipped quadratic bezier [0, tArrow] via De Casteljau:
|
|
754
|
+
// new control = lerp(start, control, tArrow)
|
|
755
|
+
const clippedCtrlX = start.x + tArrow * (controlX - start.x);
|
|
756
|
+
const clippedCtrlY = start.y + tArrow * (controlY - start.y);
|
|
757
|
+
ctx.strokeStyle = link.color;
|
|
758
|
+
ctx.lineWidth = (this.config.isLinkSelected?.(link) ? 2 : 1) / globalScale;
|
|
759
|
+
ctx.setLineDash(this.config.linkLineDash?.(link) ?? []);
|
|
760
|
+
ctx.beginPath();
|
|
761
|
+
ctx.moveTo(start.x, start.y);
|
|
762
|
+
ctx.quadraticCurveTo(clippedCtrlX, clippedCtrlY, tipX, tipY);
|
|
763
|
+
ctx.stroke();
|
|
764
|
+
ctx.setLineDash([]);
|
|
765
|
+
// Arrowhead tangent at tArrow: Q'(t) = 2(1-t)(control-start) + 2t(end-control)
|
|
766
|
+
const atx = 2 * uArrow * (controlX - start.x) + 2 * tArrow * (end.x - controlX);
|
|
767
|
+
const aty = 2 * uArrow * (controlY - start.y) + 2 * tArrow * (end.y - controlY);
|
|
768
|
+
const atLen = Math.sqrt(atx * atx + aty * aty);
|
|
769
|
+
if (atLen !== 0) {
|
|
770
|
+
const nx = atx / atLen;
|
|
771
|
+
const ny = aty / atLen;
|
|
772
|
+
ctx.fillStyle = link.color;
|
|
773
|
+
ctx.beginPath();
|
|
774
|
+
ctx.moveTo(tipX, tipY);
|
|
775
|
+
ctx.lineTo(tipX - nx * arrowLen + ny * arrowHalfWidth, tipY - ny * arrowLen - nx * arrowHalfWidth);
|
|
776
|
+
ctx.lineTo(tipX - nx * arrowLen * (1 - ARROW_VLEN_RATIO), tipY - ny * arrowLen * (1 - ARROW_VLEN_RATIO));
|
|
777
|
+
ctx.lineTo(tipX - nx * arrowLen - ny * arrowHalfWidth, tipY - ny * arrowLen + nx * arrowHalfWidth);
|
|
778
|
+
ctx.fill();
|
|
779
|
+
}
|
|
639
780
|
}
|
|
640
781
|
ctx.font = "400 2px SofiaSans";
|
|
641
782
|
ctx.textAlign = "center";
|
|
783
|
+
// Draw text with alphabetic baseline, positioned so visual center is at y=0
|
|
642
784
|
ctx.textBaseline = "alphabetic";
|
|
643
785
|
let cached = this.relationshipsTextCache.get(link.relationship);
|
|
644
786
|
if (!cached) {
|
|
645
|
-
const
|
|
646
|
-
//
|
|
647
|
-
const
|
|
787
|
+
const metrics = ctx.measureText(link.relationship);
|
|
788
|
+
// Use font-level metrics for consistent height across all texts
|
|
789
|
+
const fontAscent = metrics.fontBoundingBoxAscent ?? metrics.actualBoundingBoxAscent;
|
|
790
|
+
const fontDescent = metrics.fontBoundingBoxDescent ?? metrics.actualBoundingBoxDescent;
|
|
791
|
+
// Calculate visual center offset from baseline using font-level metrics
|
|
792
|
+
const visualCenter = (fontAscent - fontDescent) / 2;
|
|
648
793
|
cached = {
|
|
649
|
-
textWidth: width,
|
|
650
|
-
textHeight:
|
|
794
|
+
textWidth: metrics.width,
|
|
795
|
+
textHeight: fontAscent + fontDescent,
|
|
651
796
|
textYOffset: visualCenter,
|
|
652
797
|
};
|
|
653
798
|
this.relationshipsTextCache.set(link.relationship, cached);
|
|
@@ -658,16 +803,68 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
658
803
|
ctx.rotate(angle);
|
|
659
804
|
// Draw background centered on the link line (y=0)
|
|
660
805
|
ctx.fillStyle = this.config.backgroundColor;
|
|
661
|
-
const bgWidth = textWidth * 0.6;
|
|
662
|
-
const bgHeight = textHeight * 0.6;
|
|
663
806
|
// Offset background to match text visual center
|
|
664
|
-
|
|
665
|
-
ctx.fillRect(-bgWidth / 2, bgYOffset, bgWidth, bgHeight);
|
|
666
|
-
// Draw text with alphabetic baseline, positioned so visual center is at y=0
|
|
807
|
+
ctx.fillRect(-textWidth / 2, -textHeight / 2, textWidth, textHeight);
|
|
667
808
|
ctx.fillStyle = getContrastTextColor(this.config.backgroundColor);
|
|
668
809
|
ctx.fillText(link.relationship, 0, textYOffset);
|
|
669
810
|
ctx.restore();
|
|
670
811
|
}
|
|
812
|
+
pointerLink(link, color, ctx) {
|
|
813
|
+
const start = link.source;
|
|
814
|
+
const end = link.target;
|
|
815
|
+
if (start.x == null || start.y == null || end.x == null || end.y == null)
|
|
816
|
+
return;
|
|
817
|
+
ctx.strokeStyle = color;
|
|
818
|
+
const basePointerWidth = 10; // Desired on-screen pointer area thickness
|
|
819
|
+
const transform = typeof ctx.getTransform === 'function' ? ctx.getTransform() : null;
|
|
820
|
+
if (transform) {
|
|
821
|
+
const scaleX = Math.hypot(transform.a, transform.c);
|
|
822
|
+
const scaleY = Math.hypot(transform.b, transform.d);
|
|
823
|
+
const avgScale = (scaleX + scaleY) / 2 || 1;
|
|
824
|
+
ctx.lineWidth = basePointerWidth / avgScale;
|
|
825
|
+
}
|
|
826
|
+
else {
|
|
827
|
+
ctx.lineWidth = basePointerWidth;
|
|
828
|
+
}
|
|
829
|
+
ctx.beginPath();
|
|
830
|
+
if (start.id === end.id) {
|
|
831
|
+
// Self-loop: replicate the cubic bezier from drawLink
|
|
832
|
+
const nodeSize = start.size || 6;
|
|
833
|
+
const d = (link.curve || 0) * nodeSize * SELF_LOOP_CURVE_FACTOR;
|
|
834
|
+
ctx.moveTo(start.x, start.y);
|
|
835
|
+
ctx.bezierCurveTo(start.x, start.y - d, start.x + d, start.y, start.x, start.y);
|
|
836
|
+
}
|
|
837
|
+
else {
|
|
838
|
+
// Regular link: replicate the quadratic bezier from drawLink
|
|
839
|
+
const dx = end.x - start.x;
|
|
840
|
+
const dy = end.y - start.y;
|
|
841
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
842
|
+
const curvature = link.curve || 0;
|
|
843
|
+
if (distance === 0) {
|
|
844
|
+
ctx.moveTo(start.x, start.y);
|
|
845
|
+
ctx.lineTo(end.x, end.y);
|
|
846
|
+
}
|
|
847
|
+
else {
|
|
848
|
+
const perpX = dy / distance;
|
|
849
|
+
const perpY = -dx / distance;
|
|
850
|
+
const controlX = (start.x + end.x) / 2 + perpX * curvature * distance;
|
|
851
|
+
const controlY = (start.y + end.y) / 2 + perpY * curvature * distance;
|
|
852
|
+
// Clip the pointer path to the target node border so hit testing
|
|
853
|
+
// doesn't extend underneath the target node, matching what drawLink renders.
|
|
854
|
+
const targetRadius = (end.size || 6) + PADDING;
|
|
855
|
+
const clampedT = Math.min(1, Math.max(0, 1 - targetRadius / distance));
|
|
856
|
+
const ct = clampedT;
|
|
857
|
+
const cu = 1 - ct;
|
|
858
|
+
const clippedCtrlX = start.x + ct * (controlX - start.x);
|
|
859
|
+
const clippedCtrlY = start.y + ct * (controlY - start.y);
|
|
860
|
+
const tipX = cu * cu * start.x + 2 * cu * ct * controlX + ct * ct * end.x;
|
|
861
|
+
const tipY = cu * cu * start.y + 2 * cu * ct * controlY + ct * ct * end.y;
|
|
862
|
+
ctx.moveTo(start.x, start.y);
|
|
863
|
+
ctx.quadraticCurveTo(clippedCtrlX, clippedCtrlY, tipX, tipY);
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
ctx.stroke();
|
|
867
|
+
}
|
|
671
868
|
updateLoadingState() {
|
|
672
869
|
if (!this.loadingOverlay)
|
|
673
870
|
return;
|
|
@@ -788,30 +985,30 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
788
985
|
this.drawNode(node, ctx);
|
|
789
986
|
}
|
|
790
987
|
})
|
|
791
|
-
.linkCanvasObject((link, ctx) => {
|
|
988
|
+
.linkCanvasObject((link, ctx, globalScale) => {
|
|
792
989
|
if (this.config.link) {
|
|
793
990
|
this.config.link.linkCanvasObject(link, ctx);
|
|
794
991
|
}
|
|
795
992
|
else {
|
|
796
|
-
this.drawLink(link, ctx);
|
|
993
|
+
this.drawLink(link, ctx, globalScale);
|
|
797
994
|
}
|
|
798
|
-
})
|
|
799
|
-
|
|
800
|
-
this.
|
|
995
|
+
})
|
|
996
|
+
.nodePointerAreaPaint((node, color, ctx) => {
|
|
997
|
+
if (this.config.node) {
|
|
801
998
|
this.config.node.nodePointerAreaPaint(node, color, ctx);
|
|
802
|
-
}
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
}
|
|
807
|
-
|
|
808
|
-
this.
|
|
999
|
+
}
|
|
1000
|
+
else {
|
|
1001
|
+
this.pointerNode(node, color, ctx);
|
|
1002
|
+
}
|
|
1003
|
+
})
|
|
1004
|
+
.linkPointerAreaPaint((link, color, ctx) => {
|
|
1005
|
+
if (this.config.link) {
|
|
809
1006
|
this.config.link.linkPointerAreaPaint(link, color, ctx);
|
|
810
|
-
}
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
}
|
|
1007
|
+
}
|
|
1008
|
+
else {
|
|
1009
|
+
this.pointerLink(link, color, ctx);
|
|
1010
|
+
}
|
|
1011
|
+
});
|
|
815
1012
|
}
|
|
816
1013
|
updateTooltipStyles() {
|
|
817
1014
|
if (!this.shadowRoot)
|
package/dist/canvas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"canvas.js","sourceRoot":"","sources":["../src/canvas.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/canvas.ts
CHANGED
|
@@ -25,6 +25,12 @@ import {
|
|
|
25
25
|
|
|
26
26
|
const PADDING = 2;
|
|
27
27
|
|
|
28
|
+
// Arrow geometry constants (shared by self-loop and regular-link drawing paths)
|
|
29
|
+
const ARROW_WH_RATIO = 1.6;
|
|
30
|
+
const ARROW_VLEN_RATIO = 0.2;
|
|
31
|
+
// Multiplier to convert node size → cubic bezier control-point distance for self-loops
|
|
32
|
+
const SELF_LOOP_CURVE_FACTOR = 11.67;
|
|
33
|
+
|
|
28
34
|
// Force constants
|
|
29
35
|
const CHARGE_STRENGTH = -400;
|
|
30
36
|
const CENTER_STRENGTH = 0.03;
|
|
@@ -84,9 +90,9 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
84
90
|
showPropertyKeyPrefix: false,
|
|
85
91
|
};
|
|
86
92
|
|
|
87
|
-
private nodeMode: CanvasRenderMode = '
|
|
93
|
+
private nodeMode: CanvasRenderMode = 'replace';
|
|
88
94
|
|
|
89
|
-
private linkMode: CanvasRenderMode = '
|
|
95
|
+
private linkMode: CanvasRenderMode = 'replace';
|
|
90
96
|
|
|
91
97
|
private nodeDegreeMap: Map<number, number> = new Map();
|
|
92
98
|
|
|
@@ -501,28 +507,14 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
501
507
|
.height(this.config.height || 600)
|
|
502
508
|
.backgroundColor(this.config.backgroundColor)
|
|
503
509
|
.graphData(this.data)
|
|
504
|
-
.nodeRelSize(1)
|
|
505
|
-
.nodeVal((node: GraphNode) => {
|
|
506
|
-
const strokeWidth = this.config.isNodeSelected?.(node) ? 1.5 : 1;
|
|
507
|
-
const radius = node.size + strokeWidth;
|
|
508
|
-
return radius * radius; // Return radius squared since force-graph does sqrt(val * relSize)
|
|
509
|
-
})
|
|
510
510
|
.nodeCanvasObjectMode(() => this.nodeMode)
|
|
511
511
|
.linkCanvasObjectMode(() => this.linkMode)
|
|
512
512
|
.nodeLabel((node: GraphNode) =>
|
|
513
513
|
getNodeDisplayText(node, this.config.captionsKeys, this.config.showPropertyKeyPrefix)
|
|
514
514
|
)
|
|
515
515
|
.linkLabel((link: GraphLink) => link.relationship)
|
|
516
|
-
.
|
|
517
|
-
.
|
|
518
|
-
if (link.source === link.target) return 0;
|
|
519
|
-
return this.config.isLinkSelected?.(link) ? 4 : 2;
|
|
520
|
-
})
|
|
521
|
-
.linkDirectionalArrowColor((link: GraphLink) => link.color)
|
|
522
|
-
.linkWidth((link: GraphLink) =>
|
|
523
|
-
this.config.isLinkSelected?.(link) ? 2 : 1
|
|
524
|
-
)
|
|
525
|
-
.linkLineDash((link: GraphLink) => this.config.linkLineDash?.(link) ?? null)
|
|
516
|
+
.linkDirectionalArrowLength(0)
|
|
517
|
+
.linkWidth(0)
|
|
526
518
|
.linkCurvature("curve")
|
|
527
519
|
.linkVisibility("visible")
|
|
528
520
|
.nodeVisibility("visible")
|
|
@@ -590,22 +582,28 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
590
582
|
this.drawNode(node, ctx);
|
|
591
583
|
}
|
|
592
584
|
})
|
|
593
|
-
.linkCanvasObject((link: GraphLink, ctx: CanvasRenderingContext2D) => {
|
|
585
|
+
.linkCanvasObject((link: GraphLink, ctx: CanvasRenderingContext2D, globalScale: number) => {
|
|
594
586
|
if (this.config.link) {
|
|
595
587
|
this.config.link.linkCanvasObject(link, ctx);
|
|
596
588
|
} else {
|
|
597
|
-
this.drawLink(link, ctx);
|
|
589
|
+
this.drawLink(link, ctx, globalScale);
|
|
590
|
+
}
|
|
591
|
+
})
|
|
592
|
+
.nodePointerAreaPaint((node: GraphNode, color: string, ctx: CanvasRenderingContext2D) => {
|
|
593
|
+
if (this.config.node) {
|
|
594
|
+
this.config.node.nodePointerAreaPaint(node, color, ctx);
|
|
595
|
+
} else {
|
|
596
|
+
this.pointerNode(node, color, ctx);
|
|
597
|
+
}
|
|
598
|
+
})
|
|
599
|
+
.linkPointerAreaPaint((link: GraphLink, color: string, ctx: CanvasRenderingContext2D) => {
|
|
600
|
+
if (this.config.link) {
|
|
601
|
+
this.config.link.linkPointerAreaPaint(link, color, ctx);
|
|
602
|
+
} else {
|
|
603
|
+
this.pointerLink(link, color, ctx);
|
|
598
604
|
}
|
|
599
605
|
});
|
|
600
606
|
|
|
601
|
-
// Only set pointer area paint if custom node/link configs are provided
|
|
602
|
-
if (this.config.node) {
|
|
603
|
-
this.graph?.nodePointerAreaPaint(this.config.node?.nodePointerAreaPaint);
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
if (this.config.link) {
|
|
607
|
-
this.graph?.linkPointerAreaPaint(this.config.link?.linkPointerAreaPaint);
|
|
608
|
-
};
|
|
609
607
|
|
|
610
608
|
// Setup forces
|
|
611
609
|
this.setupForces();
|
|
@@ -663,13 +661,9 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
663
661
|
}
|
|
664
662
|
|
|
665
663
|
private drawNode(node: GraphNode, ctx: CanvasRenderingContext2D) {
|
|
664
|
+
if (node.x == null || node.y == null) return;
|
|
666
665
|
|
|
667
|
-
|
|
668
|
-
node.x = 0;
|
|
669
|
-
node.y = 0;
|
|
670
|
-
}
|
|
671
|
-
|
|
672
|
-
ctx.lineWidth = this.config.isNodeSelected?.(node) ? 1.5 : 1;
|
|
666
|
+
ctx.lineWidth = this.config.isNodeSelected?.(node) ? 1 : 0.5;
|
|
673
667
|
ctx.strokeStyle = this.config.foregroundColor;
|
|
674
668
|
ctx.fillStyle = node.color;
|
|
675
669
|
|
|
@@ -712,16 +706,22 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
712
706
|
}
|
|
713
707
|
}
|
|
714
708
|
|
|
715
|
-
private
|
|
709
|
+
private pointerNode(node: GraphNode, color: string, ctx: CanvasRenderingContext2D) {
|
|
710
|
+
if (node.x == null || node.y == null) return;
|
|
711
|
+
|
|
712
|
+
const radius = node.size + PADDING;
|
|
713
|
+
|
|
714
|
+
ctx.fillStyle = color;
|
|
715
|
+
ctx.beginPath();
|
|
716
|
+
ctx.arc(node.x, node.y, radius, 0, 2 * Math.PI, false);
|
|
717
|
+
ctx.fill();
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
private drawLink(link: GraphLink, ctx: CanvasRenderingContext2D, globalScale: number) {
|
|
716
721
|
const start = link.source;
|
|
717
722
|
const end = link.target;
|
|
718
723
|
|
|
719
|
-
if (
|
|
720
|
-
start.x = 0;
|
|
721
|
-
start.y = 0;
|
|
722
|
-
end.x = 0;
|
|
723
|
-
end.y = 0;
|
|
724
|
-
}
|
|
724
|
+
if (start.x == null || start.y == null || end.x == null || end.y == null) return;
|
|
725
725
|
|
|
726
726
|
let textX;
|
|
727
727
|
let textY;
|
|
@@ -729,15 +729,98 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
729
729
|
|
|
730
730
|
if (start.id === end.id) {
|
|
731
731
|
const nodeSize = start.size || 6;
|
|
732
|
-
const d = (link.curve || 0) * nodeSize *
|
|
732
|
+
const d = (link.curve || 0) * nodeSize * SELF_LOOP_CURVE_FACTOR;
|
|
733
|
+
|
|
734
|
+
ctx.lineWidth = (this.config.isLinkSelected?.(link) ? 2 : 1) / globalScale;
|
|
735
|
+
ctx.setLineDash(this.config.linkLineDash?.(link) ?? []);
|
|
736
|
+
|
|
737
|
+
// The visible outer edge of the node border is nodeSize + strokeWidth
|
|
738
|
+
// (stroke is centered on nodeSize + strokeWidth/2, so outer edge = nodeSize + strokeWidth).
|
|
739
|
+
const nodeStrokeWidth = this.config.isNodeSelected?.(start) ? 1 : 0.5;
|
|
740
|
+
const borderRadius = nodeSize + nodeStrokeWidth;
|
|
741
|
+
|
|
742
|
+
// Binary search for tArrow near 1.0 where the curve is at distance borderRadius
|
|
743
|
+
// from the node center (i.e. on the outer edge of the node border stroke).
|
|
744
|
+
// Bezier parametric form: Bx(t)=sx+3(1-t)t²d, By(t)=sy-3(1-t)²td
|
|
745
|
+
// dist(t) = 3*(1-t)*t*|d|*sqrt(t² + (1-t)²)
|
|
746
|
+
const arrowLen = (this.config.isLinkSelected?.(link) ? 4 : 2) / globalScale;
|
|
747
|
+
const arrowHalfWidth = arrowLen / ARROW_WH_RATIO / 2;
|
|
748
|
+
let lo = 0.5, hi = 1.0;
|
|
749
|
+
const absD = Math.abs(d);
|
|
750
|
+
// Max reachable distance in [0.5, 1.0] is ≈ 0.53 * |d| (at t = 0.5).
|
|
751
|
+
// If |d| is too small to reach borderRadius, skip the arrowhead entirely.
|
|
752
|
+
const maxReachableDist = 3 * 0.5 * 0.5 * absD * Math.sqrt(0.5);
|
|
753
|
+
const canReachBorder = absD > 0 && maxReachableDist >= borderRadius;
|
|
754
|
+
if (canReachBorder) {
|
|
755
|
+
for (let i = 0; i < 20; i++) {
|
|
756
|
+
const mid = (lo + hi) / 2;
|
|
757
|
+
const um = 1 - mid;
|
|
758
|
+
const dist = 3 * um * mid * absD * Math.sqrt(mid * mid + um * um);
|
|
759
|
+
if (dist > borderRadius) lo = mid;
|
|
760
|
+
else hi = mid;
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
const tArrow = (lo + hi) / 2;
|
|
764
|
+
const uArrow = 1 - tArrow;
|
|
765
|
+
const tipX = start.x + 3 * uArrow * tArrow * tArrow * d;
|
|
766
|
+
const tipY = start.y - 3 * uArrow * uArrow * tArrow * d;
|
|
733
767
|
|
|
734
|
-
// Draw the self-loop bezier curve
|
|
735
768
|
ctx.strokeStyle = link.color;
|
|
736
|
-
ctx.lineWidth = 0.5;
|
|
737
769
|
ctx.beginPath();
|
|
738
770
|
ctx.moveTo(start.x, start.y);
|
|
739
|
-
|
|
771
|
+
if (canReachBorder) {
|
|
772
|
+
// Clip the bezier stroke at tArrow using De Casteljau subdivision so
|
|
773
|
+
// the stroke stops exactly at the arrowhead tip and does not continue
|
|
774
|
+
// through it. Split control points for the [0, tArrow] segment:
|
|
775
|
+
// CP1 = (sx, sy - tArrow*d)
|
|
776
|
+
// CP2 = (sx + tArrow²*d, sy - 2*tArrow*(1-tArrow)*d)
|
|
777
|
+
// End = B(tArrow) = (tipX, tipY)
|
|
778
|
+
ctx.bezierCurveTo(
|
|
779
|
+
start.x,
|
|
780
|
+
start.y - tArrow * d,
|
|
781
|
+
start.x + tArrow * tArrow * d,
|
|
782
|
+
start.y - 2 * tArrow * uArrow * d,
|
|
783
|
+
tipX,
|
|
784
|
+
tipY,
|
|
785
|
+
);
|
|
786
|
+
} else {
|
|
787
|
+
// d is too small to reach the node border — draw the full self-loop
|
|
788
|
+
// back to the source node (t=1.0) so the loop is always complete.
|
|
789
|
+
// Full bezier: P0=(sx,sy), P1=(sx,sy-d), P2=(sx+d,sy), P3=(sx,sy)
|
|
790
|
+
ctx.bezierCurveTo(start.x, start.y - d, start.x + d, start.y, start.x, start.y);
|
|
791
|
+
}
|
|
740
792
|
ctx.stroke();
|
|
793
|
+
ctx.setLineDash([]);
|
|
794
|
+
|
|
795
|
+
// Tangent at tArrow (direction the curve travels toward the node)
|
|
796
|
+
const tdx = 3 * d * tArrow * (2 - 3 * tArrow);
|
|
797
|
+
const tdy = -3 * d * uArrow * (1 - 3 * tArrow);
|
|
798
|
+
const tLen = Math.sqrt(tdx * tdx + tdy * tdy);
|
|
799
|
+
|
|
800
|
+
// Guard against zero-length tangent vector (e.g. when d ≈ 0) to avoid NaN
|
|
801
|
+
// normals and invalid arrowhead geometry. Also skip when d is too small to
|
|
802
|
+
// place the arrowhead at the node border (canReachBorder is false).
|
|
803
|
+
if (tLen !== 0 && canReachBorder) {
|
|
804
|
+
const nx = tdx / tLen;
|
|
805
|
+
const ny = tdy / tLen;
|
|
806
|
+
|
|
807
|
+
ctx.fillStyle = link.color;
|
|
808
|
+
ctx.beginPath();
|
|
809
|
+
ctx.moveTo(tipX, tipY);
|
|
810
|
+
ctx.lineTo(
|
|
811
|
+
tipX - nx * arrowLen + ny * arrowHalfWidth,
|
|
812
|
+
tipY - ny * arrowLen - nx * arrowHalfWidth,
|
|
813
|
+
);
|
|
814
|
+
ctx.lineTo(
|
|
815
|
+
tipX - nx * arrowLen * (1 - ARROW_VLEN_RATIO),
|
|
816
|
+
tipY - ny * arrowLen * (1 - ARROW_VLEN_RATIO),
|
|
817
|
+
);
|
|
818
|
+
ctx.lineTo(
|
|
819
|
+
tipX - nx * arrowLen - ny * arrowHalfWidth,
|
|
820
|
+
tipY - ny * arrowLen + nx * arrowHalfWidth,
|
|
821
|
+
);
|
|
822
|
+
ctx.fill();
|
|
823
|
+
}
|
|
741
824
|
|
|
742
825
|
// Midpoint of cubic bezier: P0=(sx,sy), P1=(sx,sy-d), P2=(sx+d,sy), P3=(sx,sy)
|
|
743
826
|
textX = start.x + 0.375 * d;
|
|
@@ -751,6 +834,11 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
751
834
|
const dy = end.y - start.y;
|
|
752
835
|
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
753
836
|
|
|
837
|
+
// Guard: skip drawing when source and target are co-located (e.g. during
|
|
838
|
+
// simulation start-up). perpX/perpY would be NaN and propagate through
|
|
839
|
+
// all downstream bezier and arrowhead calculations.
|
|
840
|
+
if (distance === 0) return;
|
|
841
|
+
|
|
754
842
|
const perpX = dy / distance;
|
|
755
843
|
const perpY = -dx / distance;
|
|
756
844
|
|
|
@@ -779,22 +867,102 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
779
867
|
|
|
780
868
|
if (angle > Math.PI / 2) angle = -(Math.PI - angle);
|
|
781
869
|
if (angle < -Math.PI / 2) angle = -(-Math.PI - angle);
|
|
870
|
+
|
|
871
|
+
// --- Draw the regular link line and arrowhead ---
|
|
872
|
+
// Scale arrow geometry by 1/globalScale so arrowheads remain visually
|
|
873
|
+
// consistent across zoom levels, matching ctx.lineWidth / globalScale.
|
|
874
|
+
const baseArrowLen = this.config.isLinkSelected?.(link) ? 4 : 2;
|
|
875
|
+
const arrowLen = baseArrowLen / globalScale;
|
|
876
|
+
const arrowHalfWidth = arrowLen / ARROW_WH_RATIO / 2;
|
|
877
|
+
|
|
878
|
+
// Binary-search for tArrow near 1.0 where the quadratic bezier
|
|
879
|
+
// Q(t) = (1-t)²·start + 2(1-t)t·control + t²·end
|
|
880
|
+
// is at distance borderRadius from the target node centre.
|
|
881
|
+
const endNodeSize = end.size || 6;
|
|
882
|
+
const endNodeStrokeWidth = this.config.isNodeSelected?.(end) ? 1 : 0.5;
|
|
883
|
+
const borderRadius = endNodeSize + endNodeStrokeWidth;
|
|
884
|
+
const borderRadiusSq = borderRadius * borderRadius;
|
|
885
|
+
|
|
886
|
+
// When borderRadius is small relative to the chord length, the bezier and
|
|
887
|
+
// chord diverge only near t=1, so a linear approximation is accurate and
|
|
888
|
+
// avoids the per-frame search cost on large graphs.
|
|
889
|
+
let tArrow: number;
|
|
890
|
+
if (borderRadius / distance < 0.02) {
|
|
891
|
+
tArrow = Math.min(1, Math.max(0, 1 - borderRadius / distance));
|
|
892
|
+
} else {
|
|
893
|
+
let lo = 0.5, hi = 1.0;
|
|
894
|
+
for (let i = 0; i < 10; i++) {
|
|
895
|
+
const mid = (lo + hi) / 2;
|
|
896
|
+
const um = 1 - mid;
|
|
897
|
+
const qx = um * um * start.x + 2 * um * mid * controlX + mid * mid * end.x;
|
|
898
|
+
const qy = um * um * start.y + 2 * um * mid * controlY + mid * mid * end.y;
|
|
899
|
+
const dxEnd = qx - end.x;
|
|
900
|
+
const dyEnd = qy - end.y;
|
|
901
|
+
if (dxEnd * dxEnd + dyEnd * dyEnd > borderRadiusSq) lo = mid;
|
|
902
|
+
else hi = mid;
|
|
903
|
+
if (hi - lo < 1e-3) break;
|
|
904
|
+
}
|
|
905
|
+
tArrow = (lo + hi) / 2;
|
|
906
|
+
}
|
|
907
|
+
const uArrow = 1 - tArrow;
|
|
908
|
+
|
|
909
|
+
// Tip = Q(tArrow)
|
|
910
|
+
const tipX = uArrow * uArrow * start.x + 2 * uArrow * tArrow * controlX + tArrow * tArrow * end.x;
|
|
911
|
+
const tipY = uArrow * uArrow * start.y + 2 * uArrow * tArrow * controlY + tArrow * tArrow * end.y;
|
|
912
|
+
|
|
913
|
+
// Clipped quadratic bezier [0, tArrow] via De Casteljau:
|
|
914
|
+
// new control = lerp(start, control, tArrow)
|
|
915
|
+
const clippedCtrlX = start.x + tArrow * (controlX - start.x);
|
|
916
|
+
const clippedCtrlY = start.y + tArrow * (controlY - start.y);
|
|
917
|
+
|
|
918
|
+
ctx.strokeStyle = link.color;
|
|
919
|
+
ctx.lineWidth = (this.config.isLinkSelected?.(link) ? 2 : 1) / globalScale;
|
|
920
|
+
ctx.setLineDash(this.config.linkLineDash?.(link) ?? []);
|
|
921
|
+
ctx.beginPath();
|
|
922
|
+
ctx.moveTo(start.x, start.y);
|
|
923
|
+
ctx.quadraticCurveTo(clippedCtrlX, clippedCtrlY, tipX, tipY);
|
|
924
|
+
ctx.stroke();
|
|
925
|
+
ctx.setLineDash([]);
|
|
926
|
+
|
|
927
|
+
// Arrowhead tangent at tArrow: Q'(t) = 2(1-t)(control-start) + 2t(end-control)
|
|
928
|
+
const atx = 2 * uArrow * (controlX - start.x) + 2 * tArrow * (end.x - controlX);
|
|
929
|
+
const aty = 2 * uArrow * (controlY - start.y) + 2 * tArrow * (end.y - controlY);
|
|
930
|
+
const atLen = Math.sqrt(atx * atx + aty * aty);
|
|
931
|
+
|
|
932
|
+
if (atLen !== 0) {
|
|
933
|
+
const nx = atx / atLen;
|
|
934
|
+
const ny = aty / atLen;
|
|
935
|
+
|
|
936
|
+
ctx.fillStyle = link.color;
|
|
937
|
+
ctx.beginPath();
|
|
938
|
+
ctx.moveTo(tipX, tipY);
|
|
939
|
+
ctx.lineTo(tipX - nx * arrowLen + ny * arrowHalfWidth, tipY - ny * arrowLen - nx * arrowHalfWidth);
|
|
940
|
+
ctx.lineTo(
|
|
941
|
+
tipX - nx * arrowLen * (1 - ARROW_VLEN_RATIO),
|
|
942
|
+
tipY - ny * arrowLen * (1 - ARROW_VLEN_RATIO),
|
|
943
|
+
);
|
|
944
|
+
ctx.lineTo(tipX - nx * arrowLen - ny * arrowHalfWidth, tipY - ny * arrowLen + nx * arrowHalfWidth);
|
|
945
|
+
ctx.fill();
|
|
946
|
+
}
|
|
782
947
|
}
|
|
783
948
|
|
|
784
949
|
ctx.font = "400 2px SofiaSans";
|
|
785
950
|
ctx.textAlign = "center";
|
|
951
|
+
// Draw text with alphabetic baseline, positioned so visual center is at y=0
|
|
786
952
|
ctx.textBaseline = "alphabetic";
|
|
787
953
|
|
|
788
954
|
let cached = this.relationshipsTextCache.get(link.relationship);
|
|
789
955
|
|
|
790
956
|
if (!cached) {
|
|
791
|
-
const
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
const
|
|
957
|
+
const metrics = ctx.measureText(link.relationship);
|
|
958
|
+
// Use font-level metrics for consistent height across all texts
|
|
959
|
+
const fontAscent = metrics.fontBoundingBoxAscent ?? metrics.actualBoundingBoxAscent;
|
|
960
|
+
const fontDescent = metrics.fontBoundingBoxDescent ?? metrics.actualBoundingBoxDescent;
|
|
961
|
+
// Calculate visual center offset from baseline using font-level metrics
|
|
962
|
+
const visualCenter = (fontAscent - fontDescent) / 2;
|
|
795
963
|
cached = {
|
|
796
|
-
textWidth: width,
|
|
797
|
-
textHeight:
|
|
964
|
+
textWidth: metrics.width,
|
|
965
|
+
textHeight: fontAscent + fontDescent,
|
|
798
966
|
textYOffset: visualCenter,
|
|
799
967
|
};
|
|
800
968
|
this.relationshipsTextCache.set(link.relationship, cached);
|
|
@@ -809,23 +977,78 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
809
977
|
// Draw background centered on the link line (y=0)
|
|
810
978
|
ctx.fillStyle = this.config.backgroundColor;
|
|
811
979
|
|
|
812
|
-
const bgWidth = textWidth * 0.6;
|
|
813
|
-
const bgHeight = textHeight * 0.6;
|
|
814
980
|
// Offset background to match text visual center
|
|
815
|
-
const bgYOffset = textYOffset - textHeight / 2;
|
|
816
981
|
ctx.fillRect(
|
|
817
|
-
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
982
|
+
-textWidth / 2,
|
|
983
|
+
-textHeight / 2,
|
|
984
|
+
textWidth,
|
|
985
|
+
textHeight
|
|
821
986
|
);
|
|
822
987
|
|
|
823
|
-
// Draw text with alphabetic baseline, positioned so visual center is at y=0
|
|
824
988
|
ctx.fillStyle = getContrastTextColor(this.config.backgroundColor);
|
|
825
989
|
ctx.fillText(link.relationship, 0, textYOffset);
|
|
826
990
|
ctx.restore();
|
|
827
991
|
}
|
|
828
992
|
|
|
993
|
+
private pointerLink(link: GraphLink, color: string, ctx: CanvasRenderingContext2D) {
|
|
994
|
+
const start = link.source;
|
|
995
|
+
const end = link.target;
|
|
996
|
+
|
|
997
|
+
if (start.x == null || start.y == null || end.x == null || end.y == null) return;
|
|
998
|
+
|
|
999
|
+
ctx.strokeStyle = color;
|
|
1000
|
+
const basePointerWidth = 10; // Desired on-screen pointer area thickness
|
|
1001
|
+
const transform = typeof ctx.getTransform === 'function' ? ctx.getTransform() : null;
|
|
1002
|
+
if (transform) {
|
|
1003
|
+
const scaleX = Math.hypot(transform.a, transform.c);
|
|
1004
|
+
const scaleY = Math.hypot(transform.b, transform.d);
|
|
1005
|
+
const avgScale = (scaleX + scaleY) / 2 || 1;
|
|
1006
|
+
ctx.lineWidth = basePointerWidth / avgScale;
|
|
1007
|
+
} else {
|
|
1008
|
+
ctx.lineWidth = basePointerWidth;
|
|
1009
|
+
}
|
|
1010
|
+
ctx.beginPath();
|
|
1011
|
+
|
|
1012
|
+
if (start.id === end.id) {
|
|
1013
|
+
// Self-loop: replicate the cubic bezier from drawLink
|
|
1014
|
+
const nodeSize = start.size || 6;
|
|
1015
|
+
const d = (link.curve || 0) * nodeSize * SELF_LOOP_CURVE_FACTOR;
|
|
1016
|
+
ctx.moveTo(start.x, start.y);
|
|
1017
|
+
ctx.bezierCurveTo(start.x, start.y - d, start.x + d, start.y, start.x, start.y);
|
|
1018
|
+
} else {
|
|
1019
|
+
// Regular link: replicate the quadratic bezier from drawLink
|
|
1020
|
+
const dx = end.x - start.x;
|
|
1021
|
+
const dy = end.y - start.y;
|
|
1022
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
1023
|
+
const curvature = link.curve || 0;
|
|
1024
|
+
|
|
1025
|
+
if (distance === 0) {
|
|
1026
|
+
ctx.moveTo(start.x, start.y);
|
|
1027
|
+
ctx.lineTo(end.x, end.y);
|
|
1028
|
+
} else {
|
|
1029
|
+
const perpX = dy / distance;
|
|
1030
|
+
const perpY = -dx / distance;
|
|
1031
|
+
const controlX = (start.x + end.x) / 2 + perpX * curvature * distance;
|
|
1032
|
+
const controlY = (start.y + end.y) / 2 + perpY * curvature * distance;
|
|
1033
|
+
|
|
1034
|
+
// Clip the pointer path to the target node border so hit testing
|
|
1035
|
+
// doesn't extend underneath the target node, matching what drawLink renders.
|
|
1036
|
+
const targetRadius = (end.size || 6) + PADDING;
|
|
1037
|
+
const clampedT = Math.min(1, Math.max(0, 1 - targetRadius / distance));
|
|
1038
|
+
const ct = clampedT;
|
|
1039
|
+
const cu = 1 - ct;
|
|
1040
|
+
const clippedCtrlX = start.x + ct * (controlX - start.x);
|
|
1041
|
+
const clippedCtrlY = start.y + ct * (controlY - start.y);
|
|
1042
|
+
const tipX = cu * cu * start.x + 2 * cu * ct * controlX + ct * ct * end.x;
|
|
1043
|
+
const tipY = cu * cu * start.y + 2 * cu * ct * controlY + ct * ct * end.y;
|
|
1044
|
+
ctx.moveTo(start.x, start.y);
|
|
1045
|
+
ctx.quadraticCurveTo(clippedCtrlX, clippedCtrlY, tipX, tipY);
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
ctx.stroke();
|
|
1050
|
+
}
|
|
1051
|
+
|
|
829
1052
|
private updateLoadingState() {
|
|
830
1053
|
if (!this.loadingOverlay) return;
|
|
831
1054
|
|
|
@@ -948,29 +1171,27 @@ class FalkorDBCanvas extends HTMLElement {
|
|
|
948
1171
|
this.drawNode(node, ctx);
|
|
949
1172
|
}
|
|
950
1173
|
})
|
|
951
|
-
.linkCanvasObject((link: GraphLink, ctx: CanvasRenderingContext2D) => {
|
|
1174
|
+
.linkCanvasObject((link: GraphLink, ctx: CanvasRenderingContext2D, globalScale: number) => {
|
|
952
1175
|
if (this.config.link) {
|
|
953
1176
|
this.config.link.linkCanvasObject(link, ctx);
|
|
954
1177
|
} else {
|
|
955
|
-
this.drawLink(link, ctx);
|
|
1178
|
+
this.drawLink(link, ctx, globalScale);
|
|
1179
|
+
}
|
|
1180
|
+
})
|
|
1181
|
+
.nodePointerAreaPaint((node: GraphNode, color: string, ctx: CanvasRenderingContext2D) => {
|
|
1182
|
+
if (this.config.node) {
|
|
1183
|
+
this.config.node.nodePointerAreaPaint(node, color, ctx);
|
|
1184
|
+
} else {
|
|
1185
|
+
this.pointerNode(node, color, ctx);
|
|
1186
|
+
}
|
|
1187
|
+
})
|
|
1188
|
+
.linkPointerAreaPaint((link: GraphLink, color: string, ctx: CanvasRenderingContext2D) => {
|
|
1189
|
+
if (this.config.link) {
|
|
1190
|
+
this.config.link.linkPointerAreaPaint(link, color, ctx);
|
|
1191
|
+
} else {
|
|
1192
|
+
this.pointerLink(link, color, ctx);
|
|
956
1193
|
}
|
|
957
1194
|
});
|
|
958
|
-
|
|
959
|
-
if (this.config.node) {
|
|
960
|
-
this.graph.nodePointerAreaPaint((node: GraphNode, color: string, ctx: CanvasRenderingContext2D) => {
|
|
961
|
-
this.config.node!.nodePointerAreaPaint(node, color, ctx);
|
|
962
|
-
});
|
|
963
|
-
} else {
|
|
964
|
-
this.graph.nodePointerAreaPaint();
|
|
965
|
-
}
|
|
966
|
-
|
|
967
|
-
if (this.config.link) {
|
|
968
|
-
this.graph.linkPointerAreaPaint((link: GraphLink, color: string, ctx: CanvasRenderingContext2D) => {
|
|
969
|
-
this.config.link!.linkPointerAreaPaint(link, color, ctx);
|
|
970
|
-
});
|
|
971
|
-
} else {
|
|
972
|
-
this.graph.linkPointerAreaPaint();
|
|
973
|
-
}
|
|
974
1195
|
}
|
|
975
1196
|
|
|
976
1197
|
private updateTooltipStyles() {
|