@krainovsd/graph 0.13.0-beta1 → 0.14.0-beta-7.1

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.
Files changed (80) hide show
  1. package/lib/cjs/index.cjs +1297 -606
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/constants/force-controls.js +4 -2
  4. package/lib/esm/constants/force-controls.js.map +1 -1
  5. package/lib/esm/constants/highlight-controls.js +9 -16
  6. package/lib/esm/constants/highlight-controls.js.map +1 -1
  7. package/lib/esm/constants/link-controls.js +17 -30
  8. package/lib/esm/constants/link-controls.js.map +1 -1
  9. package/lib/esm/constants/node-controls.js +4 -2
  10. package/lib/esm/constants/node-controls.js.map +1 -1
  11. package/lib/esm/index.js +8 -7
  12. package/lib/esm/index.js.map +1 -1
  13. package/lib/esm/module/GraphCanvas/GraphCanvas.js +305 -81
  14. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  15. package/lib/esm/module/GraphCanvas/constants/force-settings.js +11 -1
  16. package/lib/esm/module/GraphCanvas/constants/force-settings.js.map +1 -1
  17. package/lib/esm/module/GraphCanvas/constants/graph-settings.js +17 -5
  18. package/lib/esm/module/GraphCanvas/constants/graph-settings.js.map +1 -1
  19. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js +5 -3
  20. package/lib/esm/module/GraphCanvas/constants/highlight-settings.js.map +1 -1
  21. package/lib/esm/module/GraphCanvas/constants/index.js +5 -2
  22. package/lib/esm/module/GraphCanvas/constants/index.js.map +1 -1
  23. package/lib/esm/module/GraphCanvas/constants/link-settings.js +19 -9
  24. package/lib/esm/module/GraphCanvas/constants/link-settings.js.map +1 -1
  25. package/lib/esm/module/GraphCanvas/constants/node-settings.js +13 -3
  26. package/lib/esm/module/GraphCanvas/constants/node-settings.js.map +1 -1
  27. package/lib/esm/module/GraphCanvas/lib/settings/force-settings-getter.js +4 -2
  28. package/lib/esm/module/GraphCanvas/lib/settings/force-settings-getter.js.map +1 -1
  29. package/lib/esm/module/GraphCanvas/lib/settings/graph-settings-getter.js +4 -0
  30. package/lib/esm/module/GraphCanvas/lib/settings/graph-settings-getter.js.map +1 -1
  31. package/lib/esm/module/GraphCanvas/lib/settings/highlight-settings-getter.js +4 -2
  32. package/lib/esm/module/GraphCanvas/lib/settings/highlight-settings-getter.js.map +1 -1
  33. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js +8 -5
  34. package/lib/esm/module/GraphCanvas/lib/settings/link-settings-getter.js.map +1 -1
  35. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +14 -2
  36. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
  37. package/lib/esm/module/GraphCanvas/lib/utils/calculate-curve-link-position-by-node.js +45 -0
  38. package/lib/esm/module/GraphCanvas/lib/utils/calculate-curve-link-position-by-node.js.map +1 -0
  39. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +42 -37
  40. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js.map +1 -1
  41. package/lib/esm/module/GraphCanvas/lib/utils/compute-graph-bounds.js +26 -0
  42. package/lib/esm/module/GraphCanvas/lib/utils/compute-graph-bounds.js.map +1 -0
  43. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js +40 -30
  44. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
  45. package/lib/esm/module/GraphCanvas/lib/utils/is-empty-object.js +11 -0
  46. package/lib/esm/module/GraphCanvas/lib/utils/is-empty-object.js.map +1 -0
  47. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +5 -2
  48. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
  49. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js +72 -26
  50. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js.map +1 -1
  51. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js +1 -5
  52. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js.map +1 -1
  53. package/lib/esm/module/GraphCanvas/lib/utils/pointer-getter.js +16 -8
  54. package/lib/esm/module/GraphCanvas/lib/utils/pointer-getter.js.map +1 -1
  55. package/lib/esm/module/GraphCanvas/slices/draw-links.js +115 -77
  56. package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -1
  57. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +9 -4
  58. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -1
  59. package/lib/esm/module/GraphCanvas/slices/init-area.js +1 -1
  60. package/lib/esm/module/GraphCanvas/slices/init-area.js.map +1 -1
  61. package/lib/esm/module/GraphCanvas/slices/init-dnd.js +20 -13
  62. package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -1
  63. package/lib/esm/module/GraphCanvas/slices/init-draw.js +14 -52
  64. package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -1
  65. package/lib/esm/module/GraphCanvas/slices/init-pointer.js +51 -72
  66. package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -1
  67. package/lib/esm/module/GraphCanvas/slices/init-resize.js +11 -0
  68. package/lib/esm/module/GraphCanvas/slices/init-resize.js.map +1 -1
  69. package/lib/esm/module/GraphCanvas/slices/init-selection.js +152 -0
  70. package/lib/esm/module/GraphCanvas/slices/init-selection.js.map +1 -0
  71. package/lib/esm/module/GraphCanvas/slices/init-simulation.js +12 -2
  72. package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -1
  73. package/lib/esm/module/GraphCanvas/slices/init-zoom.js +88 -16
  74. package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -1
  75. package/lib/esm/module/GraphCanvas/slices/update-link-cache.js +63 -3
  76. package/lib/esm/module/GraphCanvas/slices/update-link-cache.js.map +1 -1
  77. package/lib/esm/module/GraphCanvas/slices/update-node-cache.js +61 -16
  78. package/lib/esm/module/GraphCanvas/slices/update-node-cache.js.map +1 -1
  79. package/lib/index.d.ts +127 -62
  80. package/package.json +3 -2
@@ -1,51 +1,56 @@
1
1
  import { COMMON_SETTINGS } from '../../constants/common-settings.js';
2
- import '@krainovsd/js-helpers';
3
- import 'd3-array';
2
+ import '../../constants/force-settings.js';
3
+ import '../../constants/graph-settings.js';
4
+ import '../../constants/highlight-settings.js';
5
+ import '../../constants/link-settings.js';
6
+ import '../../constants/node-settings.js';
4
7
 
5
- function calculateLinkPositionByNode(link, arrowSize = 0) {
6
- const source = link.source;
7
- const target = link.target;
8
- if (typeof source != "object" || typeof target != "object")
9
- return null;
8
+ function calculateLinkPositionByNode(xStart, yStart, xEnd, yEnd, sourceNode, targetNode, arrowSize = 0) {
10
9
  const sourcePoint = getLinkPoint({
10
+ xStart,
11
+ yStart,
12
+ xEnd,
13
+ yEnd,
11
14
  arrowSize: 0,
12
- node: source,
13
- oppositeNode: target,
14
- });
15
+ node: sourceNode});
15
16
  const targetPoint = getLinkPoint({
16
- arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,
17
- node: target,
18
- oppositeNode: source,
19
- });
20
- if (!sourcePoint || !targetPoint)
21
- return null;
17
+ xStart: xEnd,
18
+ yStart: yEnd,
19
+ xEnd: xStart,
20
+ yEnd: yStart,
21
+ arrowSize: arrowSize > 0 ? arrowSize * 0.9 : 0,
22
+ node: targetNode});
23
+ const targetPointArrow = getLinkPoint({
24
+ xStart: xEnd,
25
+ yStart: yEnd,
26
+ xEnd: xStart,
27
+ yEnd: yStart,
28
+ arrowSize: 0,
29
+ node: targetNode});
22
30
  const distance = targetPoint && sourcePoint
23
31
  ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)
24
32
  : 0;
25
33
  return {
26
- x1: sourcePoint.x,
27
- y1: sourcePoint.y,
28
- x2: targetPoint.x,
29
- y2: targetPoint.y,
34
+ xStart: sourcePoint.x,
35
+ yStart: sourcePoint.y,
36
+ xEnd: targetPoint.x,
37
+ yEnd: targetPoint.y,
38
+ xEndArrow: targetPointArrow.x,
39
+ yEndArrow: targetPointArrow.y,
30
40
  distance,
31
41
  };
32
42
  }
33
43
  function getLinkPoint(opts) {
34
- if (opts.node.x == undefined ||
35
- opts.node.y == undefined ||
36
- opts.oppositeNode.x == undefined ||
37
- opts.oppositeNode.y == undefined)
38
- return null;
39
44
  let nodePoint;
40
45
  switch (opts.node._shape) {
41
46
  case "circle": {
42
47
  nodePoint = getCircleIntersection({
43
- x: opts.node.x,
44
- y: opts.node.y,
48
+ x: opts.xStart,
49
+ y: opts.yStart,
45
50
  radius: (opts.node._radius ?? COMMON_SETTINGS.nodeRadius) +
46
51
  (opts.node._borderWidth ? opts.node._borderWidth / 2 : 0),
47
- oppositeX: opts.oppositeNode.x,
48
- oppositeY: opts.oppositeNode.y,
52
+ oppositeX: opts.xEnd,
53
+ oppositeY: opts.yEnd,
49
54
  arrowSize: opts.arrowSize,
50
55
  });
51
56
  break;
@@ -54,23 +59,23 @@ function getLinkPoint(opts) {
54
59
  case "text": {
55
60
  nodePoint = getRectangleIntersection({
56
61
  arrowSize: opts.arrowSize,
57
- x: opts.node.x,
58
- y: opts.node.y,
62
+ x: opts.xStart,
63
+ y: opts.yStart,
59
64
  height: (opts.node._height ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),
60
65
  width: (opts.node._width ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),
61
- oppositeX: opts.oppositeNode.x,
62
- oppositeY: opts.oppositeNode.y,
66
+ oppositeX: opts.xEnd,
67
+ oppositeY: opts.yEnd,
63
68
  borderRadius: opts.node._shape === "text" ? 0 : (opts.node._borderRadius ?? 0),
64
69
  });
65
70
  break;
66
71
  }
67
72
  default: {
68
73
  nodePoint = getCircleIntersection({
69
- x: opts.node.x,
70
- y: opts.node.y,
74
+ x: opts.xStart,
75
+ y: opts.yStart,
71
76
  radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,
72
- oppositeX: opts.oppositeNode.x,
73
- oppositeY: opts.oppositeNode.y,
77
+ oppositeX: opts.xEnd,
78
+ oppositeY: opts.yEnd,
74
79
  arrowSize: opts.arrowSize,
75
80
  });
76
81
  }
@@ -1 +1 @@
1
- {"version":3,"file":"calculate-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-node.ts"],"sourcesContent":["import { COMMON_SETTINGS } from \"../../constants\";\nimport type { LinkInterface, NodeInterface } from \"../../types\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport function calculateLinkPositionByNode<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(link: LinkInterface<NodeData, LinkData>, arrowSize = 0) {\n const source = link.source;\n const target = link.target;\n\n if (typeof source != \"object\" || typeof target != \"object\") return null;\n\n const sourcePoint = getLinkPoint({\n arrowSize: 0,\n node: source,\n oppositeNode: target,\n });\n const targetPoint = getLinkPoint({\n arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,\n node: target,\n oppositeNode: source,\n });\n\n if (!sourcePoint || !targetPoint) return null;\n\n const distance =\n targetPoint && sourcePoint\n ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)\n : 0;\n\n return {\n x1: sourcePoint.x,\n y1: sourcePoint.y,\n x2: targetPoint.x,\n y2: targetPoint.y,\n distance,\n };\n}\n\ntype GetLinkPointProps<NodeData extends Record<string, unknown>> = {\n arrowSize: number;\n node: NodeInterface<NodeData>;\n oppositeNode: NodeInterface<NodeData>;\n};\nfunction getLinkPoint<NodeData extends Record<string, unknown>>(opts: GetLinkPointProps<NodeData>) {\n if (\n opts.node.x == undefined ||\n opts.node.y == undefined ||\n opts.oppositeNode.x == undefined ||\n opts.oppositeNode.y == undefined\n )\n return null;\n\n let nodePoint: Point;\n switch (opts.node._shape) {\n case \"circle\": {\n nodePoint = getCircleIntersection({\n x: opts.node.x,\n y: opts.node.y,\n radius:\n (opts.node._radius ?? COMMON_SETTINGS.nodeRadius) +\n (opts.node._borderWidth ? opts.node._borderWidth / 2 : 0),\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n arrowSize: opts.arrowSize,\n });\n break;\n }\n case \"square\":\n case \"text\": {\n nodePoint = getRectangleIntersection({\n arrowSize: opts.arrowSize,\n x: opts.node.x,\n y: opts.node.y,\n height: (opts.node._height ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n width: (opts.node._width ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n borderRadius: opts.node._shape === \"text\" ? 0 : (opts.node._borderRadius ?? 0),\n });\n break;\n }\n default: {\n nodePoint = getCircleIntersection({\n x: opts.node.x,\n y: opts.node.y,\n radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\n oppositeX: opts.oppositeNode.x,\n oppositeY: opts.oppositeNode.y,\n arrowSize: opts.arrowSize,\n });\n }\n }\n\n return nodePoint;\n}\n\ntype GetCircleIntersection = {\n x: number;\n y: number;\n radius: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n};\n\nfunction getCircleIntersection(opts: GetCircleIntersection): Point {\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n const dr = Math.sqrt(dx * dx + dy * dy);\n\n const radius = opts.radius + opts.arrowSize;\n\n return {\n x: opts.x + (dx * radius) / dr,\n y: opts.y + (dy * radius) / dr,\n };\n}\n\ntype GetRectangleIntersection = {\n x: number;\n y: number;\n width: number;\n height: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n borderRadius: number;\n};\n\nfunction getRectangleIntersection(opts: GetRectangleIntersection): Point {\n const halfWidth = opts.width / 2;\n const halfHeight = opts.height / 2;\n\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n\n let relX: number, relY: number;\n\n if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {\n const distToRight = halfWidth - dx;\n const distToLeft = halfWidth + dx;\n const distToTop = halfHeight - dy;\n const distToBottom = halfHeight + dy;\n\n const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);\n\n relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;\n relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;\n } else {\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n if (halfWidth * absDy < halfHeight * absDx) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n if (Math.abs(relY) > halfHeight) {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n }\n } else {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n if (Math.abs(relX) > halfWidth) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n }\n }\n }\n\n if (opts.borderRadius != undefined) {\n const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);\n if (x != undefined) relX = x;\n if (y != undefined) relY = y;\n }\n\n if (opts.arrowSize > 0) {\n const edgeDist = Math.sqrt(relX * relX + relY * relY);\n const scale = (edgeDist + opts.arrowSize) / edgeDist;\n relX *= scale;\n relY *= scale;\n }\n\n return {\n x: opts.x + relX,\n y: opts.y + relY,\n };\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Need upgrade\nfunction squareRadiusFix(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const epsilon = 1e-6;\n const absX = Math.abs(relX);\n const absY = Math.abs(relY);\n\n let side: string | null = null;\n if (absX >= halfWidth - epsilon) {\n side = relX > 0 ? \"right\" : \"left\";\n } else if (absY >= halfHeight - epsilon) {\n side = relY > 0 ? \"top\" : \"bottom\";\n }\n\n if (side) {\n const topBound = halfHeight - borderRadius;\n const bottomBound = -topBound;\n const rightBound = halfWidth - borderRadius;\n const leftBound = -rightBound;\n\n switch (side) {\n case \"right\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-bottom\");\n }\n break;\n case \"left\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-bottom\");\n }\n break;\n case \"top\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-left\");\n }\n break;\n case \"bottom\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-left\");\n }\n break;\n default:\n break;\n }\n }\n\n return { x: undefined, y: undefined };\n}\n\nfunction checkIntersection(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner: Parameters<typeof intersectWithCircle>[5],\n) {\n const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);\n\n return intersect ?? { x: undefined, y: undefined };\n}\n\nfunction intersectWithCircle(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner:\n | \"right-top\"\n | \"right-bottom\"\n | \"left-top\"\n | \"left-bottom\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom-right\"\n | \"bottom-left\",\n) {\n switch (corner) {\n case \"top-right\":\n corner = \"right-top\";\n break;\n case \"bottom-right\":\n corner = \"right-bottom\";\n break;\n case \"top-left\":\n corner = \"left-top\";\n break;\n case \"bottom-left\":\n corner = \"left-bottom\";\n break;\n default:\n break;\n }\n\n let cx: number, cy: number;\n switch (corner) {\n case \"right-top\":\n cx = halfWidth - r;\n cy = halfHeight - r;\n break;\n case \"right-bottom\":\n cx = halfWidth - r;\n cy = -halfHeight + r;\n break;\n case \"left-top\":\n cx = -halfWidth + r;\n cy = halfHeight - r;\n break;\n case \"left-bottom\":\n cx = -halfWidth + r;\n cy = -halfHeight + r;\n break;\n default:\n return null;\n }\n\n const a = relX ** 2 + relY ** 2;\n if (a === 0) return null;\n\n const b = -2 * (relX * cx + relY * cy);\n const c = cx ** 2 + cy ** 2 - r ** 2;\n const discriminant = b ** 2 - 4 * a * c;\n\n if (discriminant < 0) return null;\n const sqrtD = Math.sqrt(discriminant);\n\n const t2 = (-b - sqrtD) / (2 * a);\n const t1 = (-b + sqrtD) / (2 * a);\n const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;\n\n if (t === null || t >= 1) return null;\n\n const x = t * relX;\n const y = t * relY;\n\n let valid = false;\n switch (corner) {\n case \"right-top\":\n valid = x >= cx && y >= cy;\n break;\n case \"right-bottom\":\n valid = x >= cx && y <= cy;\n break;\n case \"left-top\":\n valid = x <= cx && y >= cy;\n break;\n case \"left-bottom\":\n valid = x <= cx && y <= cy;\n break;\n default:\n break;\n }\n\n return valid ? { x, y } : null;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"calculate-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-node.ts"],"sourcesContent":["import { COMMON_SETTINGS } from \"../../constants\";\nimport type { NodeInterface } from \"../../types\";\n\ntype Point = {\n x: number;\n y: number;\n};\n\nexport function calculateLinkPositionByNode<NodeData extends Record<string, unknown>>(\n xStart: number,\n yStart: number,\n xEnd: number,\n yEnd: number,\n sourceNode: NodeInterface<NodeData>,\n targetNode: NodeInterface<NodeData>,\n arrowSize = 0,\n) {\n const sourcePoint = getLinkPoint({\n xStart,\n yStart,\n xEnd,\n yEnd,\n arrowSize: 0,\n node: sourceNode,\n oppositeNode: targetNode,\n });\n const targetPoint = getLinkPoint({\n xStart: xEnd,\n yStart: yEnd,\n xEnd: xStart,\n yEnd: yStart,\n arrowSize: arrowSize > 0 ? arrowSize * 0.9 : 0,\n node: targetNode,\n oppositeNode: sourceNode,\n });\n const targetPointArrow = getLinkPoint({\n xStart: xEnd,\n yStart: yEnd,\n xEnd: xStart,\n yEnd: yStart,\n arrowSize: 0,\n node: targetNode,\n oppositeNode: sourceNode,\n });\n\n const distance =\n targetPoint && sourcePoint\n ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)\n : 0;\n\n return {\n xStart: sourcePoint.x,\n yStart: sourcePoint.y,\n xEnd: targetPoint.x,\n yEnd: targetPoint.y,\n xEndArrow: targetPointArrow.x,\n yEndArrow: targetPointArrow.y,\n distance,\n };\n}\n\ntype GetLinkPointProps<NodeData extends Record<string, unknown>> = {\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n arrowSize: number;\n node: NodeInterface<NodeData>;\n oppositeNode: NodeInterface<NodeData>;\n};\nfunction getLinkPoint<NodeData extends Record<string, unknown>>(opts: GetLinkPointProps<NodeData>) {\n let nodePoint: Point;\n switch (opts.node._shape) {\n case \"circle\": {\n nodePoint = getCircleIntersection({\n x: opts.xStart,\n y: opts.yStart,\n radius:\n (opts.node._radius ?? COMMON_SETTINGS.nodeRadius) +\n (opts.node._borderWidth ? opts.node._borderWidth / 2 : 0),\n oppositeX: opts.xEnd,\n oppositeY: opts.yEnd,\n arrowSize: opts.arrowSize,\n });\n break;\n }\n case \"square\":\n case \"text\": {\n nodePoint = getRectangleIntersection({\n arrowSize: opts.arrowSize,\n x: opts.xStart,\n y: opts.yStart,\n height: (opts.node._height ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n width: (opts.node._width ?? COMMON_SETTINGS.nodeSize) + (opts.node._borderWidth ?? 0),\n oppositeX: opts.xEnd,\n oppositeY: opts.yEnd,\n borderRadius: opts.node._shape === \"text\" ? 0 : (opts.node._borderRadius ?? 0),\n });\n break;\n }\n default: {\n nodePoint = getCircleIntersection({\n x: opts.xStart,\n y: opts.yStart,\n radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\n oppositeX: opts.xEnd,\n oppositeY: opts.yEnd,\n arrowSize: opts.arrowSize,\n });\n }\n }\n\n return nodePoint;\n}\n\ntype GetCircleIntersection = {\n x: number;\n y: number;\n radius: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n};\n\nfunction getCircleIntersection(opts: GetCircleIntersection): Point {\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n const dr = Math.sqrt(dx * dx + dy * dy);\n\n const radius = opts.radius + opts.arrowSize;\n\n return {\n x: opts.x + (dx * radius) / dr,\n y: opts.y + (dy * radius) / dr,\n };\n}\n\ntype GetRectangleIntersection = {\n x: number;\n y: number;\n width: number;\n height: number;\n oppositeX: number;\n oppositeY: number;\n arrowSize: number;\n borderRadius: number;\n};\n\nfunction getRectangleIntersection(opts: GetRectangleIntersection): Point {\n const halfWidth = opts.width / 2;\n const halfHeight = opts.height / 2;\n\n const dx = opts.oppositeX - opts.x;\n const dy = opts.oppositeY - opts.y;\n\n let relX: number, relY: number;\n\n if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {\n const distToRight = halfWidth - dx;\n const distToLeft = halfWidth + dx;\n const distToTop = halfHeight - dy;\n const distToBottom = halfHeight + dy;\n\n const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);\n\n relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;\n relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;\n } else {\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n if (halfWidth * absDy < halfHeight * absDx) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n if (Math.abs(relY) > halfHeight) {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n }\n } else {\n relY = dy > 0 ? halfHeight : -halfHeight;\n relX = (relY * dx) / dy;\n if (Math.abs(relX) > halfWidth) {\n relX = dx > 0 ? halfWidth : -halfWidth;\n relY = (relX * dy) / dx;\n }\n }\n }\n\n if (opts.borderRadius != undefined) {\n const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);\n if (x != undefined) relX = x;\n if (y != undefined) relY = y;\n }\n\n if (opts.arrowSize > 0) {\n const edgeDist = Math.sqrt(relX * relX + relY * relY);\n const scale = (edgeDist + opts.arrowSize) / edgeDist;\n relX *= scale;\n relY *= scale;\n }\n\n return {\n x: opts.x + relX,\n y: opts.y + relY,\n };\n}\n\n// eslint-disable-next-line no-warning-comments\n// TODO: Need upgrade\nfunction squareRadiusFix(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const epsilon = 1e-6;\n const absX = Math.abs(relX);\n const absY = Math.abs(relY);\n\n let side: string | null = null;\n if (absX >= halfWidth - epsilon) {\n side = relX > 0 ? \"right\" : \"left\";\n } else if (absY >= halfHeight - epsilon) {\n side = relY > 0 ? \"top\" : \"bottom\";\n }\n\n if (side) {\n const topBound = halfHeight - borderRadius;\n const bottomBound = -topBound;\n const rightBound = halfWidth - borderRadius;\n const leftBound = -rightBound;\n\n switch (side) {\n case \"right\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"right-bottom\");\n }\n break;\n case \"left\":\n if (relY > topBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-top\");\n } else if (relY < bottomBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"left-bottom\");\n }\n break;\n case \"top\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"top-left\");\n }\n break;\n case \"bottom\":\n if (relX > rightBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-right\");\n } else if (relX < leftBound) {\n return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, \"bottom-left\");\n }\n break;\n default:\n break;\n }\n }\n\n return { x: undefined, y: undefined };\n}\n\nfunction checkIntersection(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner: Parameters<typeof intersectWithCircle>[5],\n) {\n const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);\n\n return intersect ?? { x: undefined, y: undefined };\n}\n\nfunction intersectWithCircle(\n relX: number,\n relY: number,\n halfWidth: number,\n halfHeight: number,\n r: number,\n corner:\n | \"right-top\"\n | \"right-bottom\"\n | \"left-top\"\n | \"left-bottom\"\n | \"top-right\"\n | \"top-left\"\n | \"bottom-right\"\n | \"bottom-left\",\n) {\n switch (corner) {\n case \"top-right\":\n corner = \"right-top\";\n break;\n case \"bottom-right\":\n corner = \"right-bottom\";\n break;\n case \"top-left\":\n corner = \"left-top\";\n break;\n case \"bottom-left\":\n corner = \"left-bottom\";\n break;\n default:\n break;\n }\n\n let cx: number, cy: number;\n switch (corner) {\n case \"right-top\":\n cx = halfWidth - r;\n cy = halfHeight - r;\n break;\n case \"right-bottom\":\n cx = halfWidth - r;\n cy = -halfHeight + r;\n break;\n case \"left-top\":\n cx = -halfWidth + r;\n cy = halfHeight - r;\n break;\n case \"left-bottom\":\n cx = -halfWidth + r;\n cy = -halfHeight + r;\n break;\n default:\n return null;\n }\n\n const a = relX ** 2 + relY ** 2;\n if (a === 0) return null;\n\n const b = -2 * (relX * cx + relY * cy);\n const c = cx ** 2 + cy ** 2 - r ** 2;\n const discriminant = b ** 2 - 4 * a * c;\n\n if (discriminant < 0) return null;\n const sqrtD = Math.sqrt(discriminant);\n\n const t2 = (-b - sqrtD) / (2 * a);\n const t1 = (-b + sqrtD) / (2 * a);\n const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;\n\n if (t === null || t >= 1) return null;\n\n const x = t * relX;\n const y = t * relY;\n\n let valid = false;\n switch (corner) {\n case \"right-top\":\n valid = x >= cx && y >= cy;\n break;\n case \"right-bottom\":\n valid = x >= cx && y <= cy;\n break;\n case \"left-top\":\n valid = x <= cx && y >= cy;\n break;\n case \"left-bottom\":\n valid = x <= cx && y <= cy;\n break;\n default:\n break;\n }\n\n return valid ? { x, y } : null;\n}\n"],"names":[],"mappings":";;;;;;;SAQgB,2BAA2B,CACzC,MAAc,EACd,MAAc,EACd,IAAY,EACZ,IAAY,EACZ,UAAmC,EACnC,UAAmC,EACnC,SAAS,GAAG,CAAC,EAAA;IAEb,MAAM,WAAW,GAAG,YAAY,CAAC;QAC/B,MAAM;QACN,MAAM;QACN,IAAI;QACJ,IAAI;AACJ,QAAA,SAAS,EAAE,CAAC;AACZ,QAAA,IAAI,EAAE,UAEP,CAAA,CAAC;IACF,MAAM,WAAW,GAAG,YAAY,CAAC;AAC/B,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,SAAS,EAAE,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,GAAG,GAAG,CAAC;AAC9C,QAAA,IAAI,EAAE,UAEP,CAAA,CAAC;IACF,MAAM,gBAAgB,GAAG,YAAY,CAAC;AACpC,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,SAAS,EAAE,CAAC;AACZ,QAAA,IAAI,EAAE,UAEP,CAAA,CAAC;AAEF,IAAA,MAAM,QAAQ,GACZ,WAAW,IAAI;AACb,UAAE,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,KAAK,CAAC;UACrF,CAAC;IAEP,OAAO;QACL,MAAM,EAAE,WAAW,CAAC,CAAC;QACrB,MAAM,EAAE,WAAW,CAAC,CAAC;QACrB,IAAI,EAAE,WAAW,CAAC,CAAC;QACnB,IAAI,EAAE,WAAW,CAAC,CAAC;QACnB,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC7B,SAAS,EAAE,gBAAgB,CAAC,CAAC;QAC7B,QAAQ;KACT;AACH;AAWA,SAAS,YAAY,CAA2C,IAAiC,EAAA;AAC/F,IAAA,IAAI,SAAgB;AACpB,IAAA,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QACtB,KAAK,QAAQ,EAAE;YACb,SAAS,GAAG,qBAAqB,CAAC;gBAChC,CAAC,EAAE,IAAI,CAAC,MAAM;gBACd,CAAC,EAAE,IAAI,CAAC,MAAM;gBACd,MAAM,EACJ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;AAChD,qBAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC3D,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,aAAA,CAAC;YACF;;AAEF,QAAA,KAAK,QAAQ;QACb,KAAK,MAAM,EAAE;YACX,SAAS,GAAG,wBAAwB,CAAC;gBACnC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,CAAC,EAAE,IAAI,CAAC,MAAM;gBACd,CAAC,EAAE,IAAI,CAAC,MAAM;gBACd,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;gBACvF,KAAK,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;gBACrF,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC;AAC/E,aAAA,CAAC;YACF;;QAEF,SAAS;YACP,SAAS,GAAG,qBAAqB,CAAC;gBAChC,CAAC,EAAE,IAAI,CAAC,MAAM;gBACd,CAAC,EAAE,IAAI,CAAC,MAAM;gBACd,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;gBACvD,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,aAAA,CAAC;;;AAIN,IAAA,OAAO,SAAS;AAClB;AAWA,SAAS,qBAAqB,CAAC,IAA2B,EAAA;IACxD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAEvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS;IAE3C,OAAO;QACL,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,IAAI,EAAE;QAC9B,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,IAAI,EAAE;KAC/B;AACH;AAaA,SAAS,wBAAwB,CAAC,IAA8B,EAAA;AAC9D,IAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC;AAChC,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC;IAElC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAElC,IAAI,IAAY,EAAE,IAAY;AAE9B,IAAA,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,UAAU,EAAE;AAC3D,QAAA,MAAM,WAAW,GAAG,SAAS,GAAG,EAAE;AAClC,QAAA,MAAM,UAAU,GAAG,SAAS,GAAG,EAAE;AACjC,QAAA,MAAM,SAAS,GAAG,UAAU,GAAG,EAAE;AACjC,QAAA,MAAM,YAAY,GAAG,UAAU,GAAG,EAAE;AAEpC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,CAAC;QAE1E,IAAI,GAAG,OAAO,KAAK,WAAW,GAAG,SAAS,GAAG,OAAO,KAAK,UAAU,GAAG,CAAC,SAAS,GAAG,EAAE;QACrF,IAAI,GAAG,OAAO,KAAK,SAAS,GAAG,UAAU,GAAG,OAAO,KAAK,YAAY,GAAG,CAAC,UAAU,GAAG,EAAE;;SAClF;QACL,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAE1B,IAAI,SAAS,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,EAAE;AAC1C,YAAA,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;YACtC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,UAAU,EAAE;AAC/B,gBAAA,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,UAAU;gBACxC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE;;;aAEpB;AACL,YAAA,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,UAAU;YACxC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE;YACvB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE;AAC9B,gBAAA,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS;gBACtC,IAAI,GAAG,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE;;;;AAK7B,IAAA,IAAI,IAAI,CAAC,YAAY,IAAI,SAAS,EAAE;QAClC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;QACtF,IAAI,CAAC,IAAI,SAAS;YAAE,IAAI,GAAG,CAAC;QAC5B,IAAI,CAAC,IAAI,SAAS;YAAE,IAAI,GAAG,CAAC;;AAG9B,IAAA,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ;QACpD,IAAI,IAAI,KAAK;QACb,IAAI,IAAI,KAAK;;IAGf,OAAO;AACL,QAAA,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;AAChB,QAAA,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;KACjB;AACH;AAEA;AACA;AACA,SAAS,eAAe,CACtB,IAAY,EACZ,IAAY,EACZ,SAAiB,EACjB,UAAkB,EAClB,YAAoB,EAAA;IAEpB,MAAM,OAAO,GAAG,IAAI;IACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IAE3B,IAAI,IAAI,GAAkB,IAAI;AAC9B,IAAA,IAAI,IAAI,IAAI,SAAS,GAAG,OAAO,EAAE;AAC/B,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,GAAG,MAAM;;AAC7B,SAAA,IAAI,IAAI,IAAI,UAAU,GAAG,OAAO,EAAE;AACvC,QAAA,IAAI,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,GAAG,QAAQ;;IAGpC,IAAI,IAAI,EAAE;AACR,QAAA,MAAM,QAAQ,GAAG,UAAU,GAAG,YAAY;AAC1C,QAAA,MAAM,WAAW,GAAG,CAAC,QAAQ;AAC7B,QAAA,MAAM,UAAU,GAAG,SAAS,GAAG,YAAY;AAC3C,QAAA,MAAM,SAAS,GAAG,CAAC,UAAU;QAE7B,QAAQ,IAAI;AACV,YAAA,KAAK,OAAO;AACV,gBAAA,IAAI,IAAI,GAAG,QAAQ,EAAE;AACnB,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;;AACjF,qBAAA,IAAI,IAAI,GAAG,WAAW,EAAE;AAC7B,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC;;gBAE3F;AACF,YAAA,KAAK,MAAM;AACT,gBAAA,IAAI,IAAI,GAAG,QAAQ,EAAE;AACnB,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;;AAChF,qBAAA,IAAI,IAAI,GAAG,WAAW,EAAE;AAC7B,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC;;gBAE1F;AACF,YAAA,KAAK,KAAK;AACR,gBAAA,IAAI,IAAI,GAAG,UAAU,EAAE;AACrB,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;;AACjF,qBAAA,IAAI,IAAI,GAAG,SAAS,EAAE;AAC3B,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,CAAC;;gBAEvF;AACF,YAAA,KAAK,QAAQ;AACX,gBAAA,IAAI,IAAI,GAAG,UAAU,EAAE;AACrB,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,CAAC;;AACpF,qBAAA,IAAI,IAAI,GAAG,SAAS,EAAE;AAC3B,oBAAA,OAAO,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,CAAC;;gBAE1F;;;IAMN,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE;AACvC;AAEA,SAAS,iBAAiB,CACxB,IAAY,EACZ,IAAY,EACZ,SAAiB,EACjB,UAAkB,EAClB,CAAS,EACT,MAAiD,EAAA;AAEjD,IAAA,MAAM,SAAS,GAAG,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC;IAEnF,OAAO,SAAS,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE;AACpD;AAEA,SAAS,mBAAmB,CAC1B,IAAY,EACZ,IAAY,EACZ,SAAiB,EACjB,UAAkB,EAClB,CAAS,EACT,MAQiB,EAAA;IAEjB,QAAQ,MAAM;AACZ,QAAA,KAAK,WAAW;YACd,MAAM,GAAG,WAAW;YACpB;AACF,QAAA,KAAK,cAAc;YACjB,MAAM,GAAG,cAAc;YACvB;AACF,QAAA,KAAK,UAAU;YACb,MAAM,GAAG,UAAU;YACnB;AACF,QAAA,KAAK,aAAa;YAChB,MAAM,GAAG,aAAa;YACtB;;IAKJ,IAAI,EAAU,EAAE,EAAU;IAC1B,QAAQ,MAAM;AACZ,QAAA,KAAK,WAAW;AACd,YAAA,EAAE,GAAG,SAAS,GAAG,CAAC;AAClB,YAAA,EAAE,GAAG,UAAU,GAAG,CAAC;YACnB;AACF,QAAA,KAAK,cAAc;AACjB,YAAA,EAAE,GAAG,SAAS,GAAG,CAAC;AAClB,YAAA,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC;YACpB;AACF,QAAA,KAAK,UAAU;AACb,YAAA,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;AACnB,YAAA,EAAE,GAAG,UAAU,GAAG,CAAC;YACnB;AACF,QAAA,KAAK,aAAa;AAChB,YAAA,EAAE,GAAG,CAAC,SAAS,GAAG,CAAC;AACnB,YAAA,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC;YACpB;AACF,QAAA;AACE,YAAA,OAAO,IAAI;;IAGf,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;AAExB,IAAA,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,EAAE,CAAC;AACtC,IAAA,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IAEvC,IAAI,YAAY,GAAG,CAAC;AAAE,QAAA,OAAO,IAAI;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;AAErC,IAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;AACjC,IAAA,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;AAE1C,IAAA,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;AAErC,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;AAClB,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI;IAElB,IAAI,KAAK,GAAG,KAAK;IACjB,QAAQ,MAAM;AACZ,QAAA,KAAK,WAAW;YACd,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAC1B;AACF,QAAA,KAAK,cAAc;YACjB,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAC1B;AACF,QAAA,KAAK,UAAU;YACb,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAC1B;AACF,QAAA,KAAK,aAAa;YAChB,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YAC1B;;AAKJ,IAAA,OAAO,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI;AAChC;;;;"}
@@ -0,0 +1,26 @@
1
+ function computeGraphBounds(nodes) {
2
+ if (!nodes.length)
3
+ return null;
4
+ let minX = Infinity;
5
+ let minY = Infinity;
6
+ let maxX = -Infinity;
7
+ let maxY = -Infinity;
8
+ for (const node of nodes) {
9
+ if (node.x === null || node.x === undefined || node.y === null || node.y === undefined)
10
+ continue;
11
+ if (node.visible === false)
12
+ continue;
13
+ let radius = node._radius;
14
+ radius ??= Math.max(node._width ?? 0, node._height ?? 0) / 2;
15
+ minX = Math.min(minX, node.x - radius);
16
+ minY = Math.min(minY, node.y - radius);
17
+ maxX = Math.max(maxX, node.x + radius);
18
+ maxY = Math.max(maxY, node.y + radius);
19
+ }
20
+ if (!isFinite(minX))
21
+ return null;
22
+ return { minX, minY, maxX, maxY };
23
+ }
24
+
25
+ export { computeGraphBounds };
26
+ //# sourceMappingURL=compute-graph-bounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-graph-bounds.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/compute-graph-bounds.ts"],"sourcesContent":["import type { NodeInterface } from \"../../types\";\n\nexport interface GraphBounds {\n minX: number;\n minY: number;\n maxX: number;\n maxY: number;\n}\n\nexport function computeGraphBounds<NodeData extends Record<string, unknown>>(\n nodes: NodeInterface<NodeData>[],\n): GraphBounds | null {\n if (!nodes.length) return null;\n\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const node of nodes) {\n if (node.x === null || node.x === undefined || node.y === null || node.y === undefined)\n continue;\n if (node.visible === false) continue;\n\n let radius = node._radius;\n radius ??= Math.max(node._width ?? 0, node._height ?? 0) / 2;\n minX = Math.min(minX, node.x - radius);\n minY = Math.min(minY, node.y - radius);\n maxX = Math.max(maxX, node.x + radius);\n maxY = Math.max(maxY, node.y + radius);\n }\n\n if (!isFinite(minX)) return null;\n\n return { minX, minY, maxX, maxY };\n}\n"],"names":[],"mappings":"AASM,SAAU,kBAAkB,CAChC,KAAgC,EAAA;IAEhC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,QAAA,OAAO,IAAI;IAE9B,IAAI,IAAI,GAAG,QAAQ;IACnB,IAAI,IAAI,GAAG,QAAQ;AACnB,IAAA,IAAI,IAAI,GAAG,CAAC,QAAQ;AACpB,IAAA,IAAI,IAAI,GAAG,CAAC,QAAQ;AAEpB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,KAAK,SAAS;YACpF;AACF,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK;YAAE;AAE5B,QAAA,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO;AACzB,QAAA,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC;AAC5D,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;AACtC,QAAA,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;;AAGxC,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;IAEhC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AACnC;;;;"}
@@ -1,39 +1,49 @@
1
+ const FRAME_INTERVAL = 1000 / 60;
1
2
  function getParticlePosition(opts) {
2
- const prevStepDifference = opts.particle.step - (opts.particle.prev?.step ?? 0);
3
- const nextStepDifference = (opts.particle.next?.step ?? 0) - opts.particle.step;
4
- const needWait = opts.particle.next &&
5
- opts.particle.next.step > opts.particle.step &&
6
- nextStepDifference <= opts.distance;
7
- const needSpeed = opts.particle.prev &&
8
- opts.particle.prev.step !== 0 &&
9
- opts.particle.prev.step < opts.particle.step &&
10
- prevStepDifference < opts.distance;
11
- if (opts.particle.step === 0 && needWait) {
12
- opts.particle.x = undefined;
13
- opts.particle.y = undefined;
14
- return;
3
+ const now = performance.now();
4
+ const particle = opts.particle;
5
+ if (particle._lastTime == undefined) {
6
+ particle._distanceTraveled = (opts.distance / opts.totalCount) * particle.index;
7
+ particle._lastTime = now;
8
+ particle._lastDistance = opts.distance;
15
9
  }
16
- const remainingSteps = opts.totalSteps - opts.particle.step;
17
- const progress = opts.particle.step / opts.totalSteps;
18
- if (remainingSteps <= 0) {
19
- opts.particle.x = opts.xEnd;
20
- opts.particle.y = opts.yEnd;
21
- opts.particle.step = 0;
22
- return;
10
+ const lastDistance = particle._lastDistance ?? 0;
11
+ if (lastDistance !== opts.distance && lastDistance > 0) {
12
+ const scale = opts.distance / lastDistance;
13
+ particle._distanceTraveled = ((particle._distanceTraveled ?? 0) * scale) % opts.distance;
14
+ particle._lastDistance = opts.distance;
23
15
  }
24
- const dx = opts.xEnd - opts.xStart;
25
- const dy = opts.yEnd - opts.yStart;
26
- const newX = opts.xStart + dx * progress;
27
- const newY = opts.yStart + dy * progress;
28
- opts.particle.x = newX;
29
- opts.particle.y = newY;
30
- if (needSpeed) {
31
- opts.particle.step += prevStepDifference <= 3 ? prevStepDifference : 3;
16
+ const delta = Math.min(now - particle._lastTime, FRAME_INTERVAL);
17
+ particle._lastTime = now;
18
+ particle._distanceTraveled =
19
+ ((particle._distanceTraveled ?? 0) + opts.speed * delta) % opts.distance;
20
+ const progress = particle._distanceTraveled / opts.distance;
21
+ if (opts.xControl !== 0 && opts.yControl !== 0) {
22
+ const t = 1 - progress;
23
+ particle.x =
24
+ t * t * opts.xStart + 2 * t * progress * opts.xControl + progress * progress * opts.xEnd;
25
+ particle.y =
26
+ t * t * opts.yStart + 2 * t * progress * opts.yControl + progress * progress * opts.yEnd;
32
27
  }
33
28
  else {
34
- opts.particle.step++;
29
+ const dx = opts.xEnd - opts.xStart;
30
+ const dy = opts.yEnd - opts.yStart;
31
+ particle.x = opts.xStart + dx * progress;
32
+ particle.y = opts.yStart + dy * progress;
35
33
  }
36
34
  }
35
+ function approximateQuadraticBezierLength(x0, y0, x1, y1, x2, y2) {
36
+ const dx01 = x1 - x0;
37
+ const dy01 = y1 - y0;
38
+ const dx12 = x2 - x1;
39
+ const dy12 = y2 - y1;
40
+ const dx02 = x2 - x0;
41
+ const dy02 = y2 - y0;
42
+ const a = Math.sqrt(dx01 * dx01 + dy01 * dy01);
43
+ const b = Math.sqrt(dx12 * dx12 + dy12 * dy12);
44
+ const c = Math.sqrt(dx02 * dx02 + dy02 * dy02);
45
+ return (a + b + c) / 2;
46
+ }
37
47
 
38
- export { getParticlePosition };
48
+ export { approximateQuadraticBezierLength, getParticlePosition };
39
49
  //# sourceMappingURL=get-particle-position.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { LinkParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: LinkParticle;\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n totalSteps: number;\n totalCount: number;\n distance: number;\n};\n\nexport function getParticlePosition(opts: GetParticlePositionOptions) {\n const prevStepDifference = opts.particle.step - (opts.particle.prev?.step ?? 0);\n const nextStepDifference = (opts.particle.next?.step ?? 0) - opts.particle.step;\n\n const needWait =\n opts.particle.next &&\n opts.particle.next.step > opts.particle.step &&\n nextStepDifference <= opts.distance;\n const needSpeed =\n opts.particle.prev &&\n opts.particle.prev.step !== 0 &&\n opts.particle.prev.step < opts.particle.step &&\n prevStepDifference < opts.distance;\n\n if (opts.particle.step === 0 && needWait) {\n opts.particle.x = undefined;\n opts.particle.y = undefined;\n\n return;\n }\n\n const remainingSteps = opts.totalSteps - opts.particle.step;\n const progress = opts.particle.step / opts.totalSteps;\n\n if (remainingSteps <= 0) {\n opts.particle.x = opts.xEnd;\n opts.particle.y = opts.yEnd;\n opts.particle.step = 0;\n\n return;\n }\n\n const dx = opts.xEnd - opts.xStart;\n const dy = opts.yEnd - opts.yStart;\n\n const newX = opts.xStart + dx * progress;\n const newY = opts.yStart + dy * progress;\n\n opts.particle.x = newX;\n opts.particle.y = newY;\n\n if (needSpeed) {\n opts.particle.step += prevStepDifference <= 3 ? prevStepDifference : 3;\n } else {\n opts.particle.step++;\n }\n}\n"],"names":[],"mappings":"AAaM,SAAU,mBAAmB,CAAC,IAAgC,EAAA;AAClE,IAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,CAAC;AAC/E,IAAA,MAAM,kBAAkB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI;AAE/E,IAAA,MAAM,QAAQ,GACZ,IAAI,CAAC,QAAQ,CAAC,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;AAC5C,QAAA,kBAAkB,IAAI,IAAI,CAAC,QAAQ;AACrC,IAAA,MAAM,SAAS,GACb,IAAI,CAAC,QAAQ,CAAC,IAAI;AAClB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;AAC5C,QAAA,kBAAkB,GAAG,IAAI,CAAC,QAAQ;IAEpC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,QAAQ,EAAE;AACxC,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,SAAS;QAE3B;;IAGF,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI;IAC3D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU;AAErD,IAAA,IAAI,cAAc,IAAI,CAAC,EAAE;QACvB,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;QAC3B,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;AAC3B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;QAEtB;;IAGF,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;IAClC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM;IAElC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,QAAQ;AAExC,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;AACtB,IAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI;IAEtB,IAAI,SAAS,EAAE;AACb,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,kBAAkB,IAAI,CAAC,GAAG,kBAAkB,GAAG,CAAC;;SACjE;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;;AAExB;;;;"}
1
+ {"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { LinkParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: LinkParticle;\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n xControl: number;\n yControl: number;\n distance: number;\n totalCount: number;\n speed: number;\n};\n\nconst FRAME_INTERVAL = 1000 / 60;\n\nexport function getParticlePosition(opts: GetParticlePositionOptions) {\n const now = performance.now();\n const particle = opts.particle;\n\n if (particle._lastTime == undefined) {\n particle._distanceTraveled = (opts.distance / opts.totalCount) * particle.index;\n particle._lastTime = now;\n particle._lastDistance = opts.distance;\n }\n\n const lastDistance = particle._lastDistance ?? 0;\n if (lastDistance !== opts.distance && lastDistance > 0) {\n const scale = opts.distance / lastDistance;\n particle._distanceTraveled = ((particle._distanceTraveled ?? 0) * scale) % opts.distance;\n particle._lastDistance = opts.distance;\n }\n\n const delta = Math.min(now - particle._lastTime, FRAME_INTERVAL);\n particle._lastTime = now;\n particle._distanceTraveled =\n ((particle._distanceTraveled ?? 0) + opts.speed * delta) % opts.distance;\n\n const progress = particle._distanceTraveled / opts.distance;\n if (opts.xControl !== 0 && opts.yControl !== 0) {\n const t = 1 - progress;\n particle.x =\n t * t * opts.xStart + 2 * t * progress * opts.xControl + progress * progress * opts.xEnd;\n particle.y =\n t * t * opts.yStart + 2 * t * progress * opts.yControl + progress * progress * opts.yEnd;\n } else {\n const dx = opts.xEnd - opts.xStart;\n const dy = opts.yEnd - opts.yStart;\n particle.x = opts.xStart + dx * progress;\n particle.y = opts.yStart + dy * progress;\n }\n}\n\nexport function approximateQuadraticBezierLength(\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): number {\n const dx01 = x1 - x0;\n const dy01 = y1 - y0;\n const dx12 = x2 - x1;\n const dy12 = y2 - y1;\n const dx02 = x2 - x0;\n const dy02 = y2 - y0;\n const a = Math.sqrt(dx01 * dx01 + dy01 * dy01);\n const b = Math.sqrt(dx12 * dx12 + dy12 * dy12);\n const c = Math.sqrt(dx02 * dx02 + dy02 * dy02);\n\n return (a + b + c) / 2;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ function isEmptyObject(obj) {
2
+ for (const key in obj) {
3
+ if (Object.hasOwn(obj, key)) {
4
+ return false;
5
+ }
6
+ }
7
+ return true;
8
+ }
9
+
10
+ export { isEmptyObject };
11
+ //# sourceMappingURL=is-empty-object.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-empty-object.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-empty-object.ts"],"sourcesContent":["export function isEmptyObject(obj: Record<string, unknown>) {\n for (const key in obj) {\n if (Object.hasOwn(obj, key)) {\n return false;\n }\n }\n return true;\n}\n"],"names":[],"mappings":"AAAM,SAAU,aAAa,CAAC,GAA4B,EAAA;AACxD,IAAA,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE;QACrB,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;AAC3B,YAAA,OAAO,KAAK;;;AAGhB,IAAA,OAAO,IAAI;AACb;;;;"}
@@ -1,6 +1,9 @@
1
1
  import { COMMON_SETTINGS } from '../../constants/common-settings.js';
2
- import '@krainovsd/js-helpers';
3
- import 'd3-array';
2
+ import '../../constants/force-settings.js';
3
+ import '../../constants/graph-settings.js';
4
+ import '../../constants/highlight-settings.js';
5
+ import '../../constants/link-settings.js';
6
+ import '../../constants/node-settings.js';
4
7
 
5
8
  const ADDITIONAL_VIEWPORT = 10;
6
9
  function isNodeVisible(opts) {
@@ -1 +1 @@
1
- {"version":3,"file":"is-node-visible.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-node-visible.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\nimport { COMMON_SETTINGS } from \"../../constants\";\nimport type { NodeInterface } from \"../../types\";\n\ntype IsNodeVisibleOptions<NodeData extends Record<string, unknown>> = {\n width: number;\n height: number;\n transform: ZoomTransform;\n node: NodeInterface<NodeData>;\n};\n\nconst ADDITIONAL_VIEWPORT = 10;\n\nexport function isNodeVisible<NodeData extends Record<string, unknown>>(\n opts: IsNodeVisibleOptions<NodeData>,\n) {\n const left = -opts.transform.x / opts.transform.k;\n const right = (opts.width - opts.transform.x) / opts.transform.k;\n const top = -opts.transform.y / opts.transform.k;\n const bottom = (opts.height - opts.transform.y) / opts.transform.k;\n\n if (opts.node.x == undefined || opts.node.y == undefined) return false;\n\n switch (opts.node._shape) {\n case \"circle\": {\n const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;\n\n return (\n left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&\n opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&\n opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom\n );\n }\n case \"square\":\n case \"text\": {\n const width = opts.node._width ?? COMMON_SETTINGS.nodeSize;\n const height = opts.node._height ?? COMMON_SETTINGS.nodeSize;\n\n return (\n left < opts.node.x + width + ADDITIONAL_VIEWPORT &&\n opts.node.x - width - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + height + ADDITIONAL_VIEWPORT &&\n opts.node.y - height - ADDITIONAL_VIEWPORT < bottom\n );\n }\n default: {\n const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;\n\n return (\n left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&\n opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&\n opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom\n );\n }\n }\n}\n"],"names":[],"mappings":";;;;AAWA,MAAM,mBAAmB,GAAG,EAAE;AAExB,SAAU,aAAa,CAC3B,IAAoC,EAAA;AAEpC,IAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACjD,IAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAChE,IAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAElE,IAAA,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS;AAAE,QAAA,OAAO,KAAK;AAEtE,IAAA,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QACtB,KAAK,QAAQ,EAAE;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;YAE9D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBACjD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,KAAK;gBAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;AAGvD,QAAA,KAAK,QAAQ;QACb,KAAK,MAAM,EAAE;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,QAAQ;YAE5D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,mBAAmB,GAAG,KAAK;gBACjD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;QAGvD,SAAS;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;YAE9D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBACjD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,KAAK;gBAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;;AAI3D;;;;"}
1
+ {"version":3,"file":"is-node-visible.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-node-visible.ts"],"sourcesContent":["import type { ZoomTransform } from \"d3-zoom\";\nimport { COMMON_SETTINGS } from \"../../constants\";\nimport type { NodeInterface } from \"../../types\";\n\ntype IsNodeVisibleOptions<NodeData extends Record<string, unknown>> = {\n width: number;\n height: number;\n transform: ZoomTransform;\n node: NodeInterface<NodeData>;\n};\n\nconst ADDITIONAL_VIEWPORT = 10;\n\nexport function isNodeVisible<NodeData extends Record<string, unknown>>(\n opts: IsNodeVisibleOptions<NodeData>,\n) {\n const left = -opts.transform.x / opts.transform.k;\n const right = (opts.width - opts.transform.x) / opts.transform.k;\n const top = -opts.transform.y / opts.transform.k;\n const bottom = (opts.height - opts.transform.y) / opts.transform.k;\n\n if (opts.node.x == undefined || opts.node.y == undefined) return false;\n\n switch (opts.node._shape) {\n case \"circle\": {\n const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;\n\n return (\n left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&\n opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&\n opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom\n );\n }\n case \"square\":\n case \"text\": {\n const width = opts.node._width ?? COMMON_SETTINGS.nodeSize;\n const height = opts.node._height ?? COMMON_SETTINGS.nodeSize;\n\n return (\n left < opts.node.x + width + ADDITIONAL_VIEWPORT &&\n opts.node.x - width - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + height + ADDITIONAL_VIEWPORT &&\n opts.node.y - height - ADDITIONAL_VIEWPORT < bottom\n );\n }\n default: {\n const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;\n\n return (\n left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&\n opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&\n opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom\n );\n }\n }\n}\n"],"names":[],"mappings":";;;;;;;AAWA,MAAM,mBAAmB,GAAG,EAAE;AAExB,SAAU,aAAa,CAC3B,IAAoC,EAAA;AAEpC,IAAA,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AACjD,IAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAChE,IAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;AAChD,IAAA,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;AAElE,IAAA,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS;AAAE,QAAA,OAAO,KAAK;AAEtE,IAAA,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QACtB,KAAK,QAAQ,EAAE;YACb,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;YAE9D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBACjD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,KAAK;gBAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;AAGvD,QAAA,KAAK,QAAQ;QACb,KAAK,MAAM,EAAE;YACX,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC,QAAQ;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,QAAQ;YAE5D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,mBAAmB,GAAG,KAAK;gBACjD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;QAGvD,SAAS;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,eAAe,CAAC,UAAU;YAE9D,QACE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBACjD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,KAAK;gBAClD,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB;gBAChD,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,mBAAmB,GAAG,MAAM;;;AAI3D;;;;"}
@@ -1,32 +1,31 @@
1
1
  import { isObject } from '@krainovsd/js-helpers';
2
2
  import { greatest } from 'd3-array';
3
- import { pointerGetter } from './pointer-getter.js';
4
3
 
5
- function linkByPointerGetter({ areaRect, areaTransform, mouseEvent, links, linkHoverExtraZone, }) {
6
- if (!areaRect)
7
- return undefined;
8
- const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);
4
+ function linkByPointerGetter({ pointerX, pointerY, links, linkHoverExtraZone, curve, }) {
9
5
  return greatest(links, (link) => {
10
- if (isNearLink(pointerX, pointerY, link, linkHoverExtraZone))
11
- return link.index;
6
+ if (!isObject(link.source) ||
7
+ !isObject(link.target) ||
8
+ link.source.visible === false ||
9
+ link.target.visible === false)
10
+ return;
11
+ const x1 = (link._x1 ?? link.source.x);
12
+ const y1 = (link._y1 ?? link.source.y);
13
+ const x2 = (link._x2 ?? link.target.x);
14
+ const y2 = (link._y2 ?? link.target.y);
15
+ const cx = link._cx ?? 0;
16
+ const cy = link._cy ?? 0;
17
+ return curve
18
+ ? hitTestQuadratic(pointerX, pointerY, x1, y1, cx, cy, x2, y2, linkHoverExtraZone)
19
+ ? link.index
20
+ : undefined
21
+ : isNearLink(pointerX, pointerY, x1, y1, x2, y2, linkHoverExtraZone)
22
+ ? link.index
23
+ : undefined;
12
24
  });
13
25
  }
14
- function isNearLink(mouseX, mouseY, link, threshold = 2) {
15
- if (!isObject(link.source) ||
16
- !isObject(link.target) ||
17
- link.source.visible === false ||
18
- link.target.visible === false)
19
- return false;
20
- const x1 = link.source.x;
21
- const y1 = link.source.y;
22
- const x2 = link.target.x;
23
- const y2 = link.target.y;
24
- const distance = distanceToLine(mouseX, mouseY, x1, y1, x2, y2);
25
- return distance <= threshold;
26
- }
27
- function distanceToLine(x, y, x1, y1, x2, y2) {
28
- const A = x - x1;
29
- const B = y - y1;
26
+ function isNearLink(px, py, x1, y1, x2, y2, threshold = 2) {
27
+ const A = px - x1;
28
+ const B = py - y1;
30
29
  const C = x2 - x1;
31
30
  const D = y2 - y1;
32
31
  const dot = A * C + B * D;
@@ -48,9 +47,56 @@ function distanceToLine(x, y, x1, y1, x2, y2) {
48
47
  xx = x1 + param * C;
49
48
  yy = y1 + param * D;
50
49
  }
51
- const dx = x - xx;
52
- const dy = y - yy;
53
- return Math.sqrt(dx * dx + dy * dy);
50
+ const dx = px - xx;
51
+ const dy = py - yy;
52
+ return Math.sqrt(dx * dx + dy * dy) <= threshold;
53
+ }
54
+ function hitTestQuadratic(px, py, x0, y0, xc, yc, x2, y2, tol) {
55
+ const bb = bezierBBox(x0, y0, xc, yc, x2, y2);
56
+ if (px < bb.minX - tol || px > bb.maxX + tol || py < bb.minY - tol || py > bb.maxY + tol) {
57
+ return false;
58
+ }
59
+ const chord = Math.hypot(x2 - x0, y2 - y0);
60
+ const contLen = Math.hypot(xc - x0, yc - y0) + Math.hypot(x2 - xc, y2 - yc);
61
+ const approxLen = (chord + contLen) / 2;
62
+ const steps = Math.max(16, Math.ceil(approxLen / 1));
63
+ const tol2 = tol * tol;
64
+ for (let i = 0; i <= steps; i++) {
65
+ const t = i / steps;
66
+ const mt = 1 - t;
67
+ const x = mt * mt * x0 + 2 * mt * t * xc + t * t * x2;
68
+ const y = mt * mt * y0 + 2 * mt * t * yc + t * t * y2;
69
+ const dx = px - x;
70
+ const dy = py - y;
71
+ if (dx * dx + dy * dy <= tol2)
72
+ return true;
73
+ }
74
+ return false;
75
+ }
76
+ function bezierBBox(x0, y0, x1, y1, x2, y2) {
77
+ function extrema(p0, p1, p2) {
78
+ const denom = p0 - 2 * p1 + p2;
79
+ if (denom === 0)
80
+ return [];
81
+ const t = (p0 - p1) / denom;
82
+ return t > 0 && t < 1 ? [t] : [];
83
+ }
84
+ const ts = [...extrema(x0, x1, x2), ...extrema(y0, y1, y2), 0, 1];
85
+ let maxX = -Infinity, maxY = -Infinity, minX = Infinity, minY = Infinity;
86
+ for (const t of ts) {
87
+ const mt = 1 - t;
88
+ const x = mt * mt * x0 + 2 * mt * t * x1 + t * t * x2;
89
+ const y = mt * mt * y0 + 2 * mt * t * y1 + t * t * y2;
90
+ if (x < minX)
91
+ minX = x;
92
+ if (x > maxX)
93
+ maxX = x;
94
+ if (y < minY)
95
+ minY = y;
96
+ if (y > maxY)
97
+ maxY = y;
98
+ }
99
+ return { minX, minY, maxX, maxY };
54
100
  }
55
101
 
56
102
  export { linkByPointerGetter };
@@ -1 +1 @@
1
- {"version":3,"file":"link-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-by-pointer-getter.ts"],"sourcesContent":["import { isObject } from \"@krainovsd/js-helpers\";\nimport { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { LinkInterface } from \"../../types\";\nimport { pointerGetter } from \"./pointer-getter\";\n\nexport type LinkByPointerGetterOptions<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> = {\n mouseEvent: MouseEvent | TouchEvent;\n areaRect: DOMRect | undefined;\n areaTransform: ZoomTransform;\n links: LinkInterface<NodeData, LinkData>[];\n linkHoverExtraZone: number;\n};\n\nexport function linkByPointerGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>({\n areaRect,\n areaTransform,\n mouseEvent,\n links,\n linkHoverExtraZone,\n}: LinkByPointerGetterOptions<NodeData, LinkData>): LinkInterface<NodeData, LinkData> | undefined {\n if (!areaRect) return undefined;\n\n const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);\n\n return greatest(links, (link) => {\n if (isNearLink(pointerX, pointerY, link, linkHoverExtraZone)) return link.index;\n });\n}\n\nfunction isNearLink<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>(mouseX: number, mouseY: number, link: LinkInterface<NodeData, LinkData>, threshold = 2) {\n if (\n !isObject(link.source) ||\n !isObject(link.target) ||\n link.source.visible === false ||\n link.target.visible === false\n )\n return false;\n\n const x1 = link.source.x as number;\n const y1 = link.source.y as number;\n const x2 = link.target.x as number;\n const y2 = link.target.y as number;\n\n const distance = distanceToLine(mouseX, mouseY, x1, y1, x2, y2);\n\n return distance <= threshold;\n}\n\nfunction distanceToLine(x: number, y: number, x1: number, y1: number, x2: number, y2: number) {\n const A = x - x1;\n const B = y - y1;\n const C = x2 - x1;\n const D = y2 - y1;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n\n if (lenSq !== 0) {\n param = dot / lenSq;\n }\n\n let xx, yy;\n\n if (param < 0) {\n xx = x1;\n yy = y1;\n } else if (param > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + param * C;\n yy = y1 + param * D;\n }\n\n const dx = x - xx;\n const dy = y - yy;\n\n return Math.sqrt(dx * dx + dy * dy);\n}\n"],"names":[],"mappings":";;;;AAiBgB,SAAA,mBAAmB,CAGjC,EACA,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,EACL,kBAAkB,GAC6B,EAAA;AAC/C,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,SAAS;AAE/B,IAAA,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC;AAE/E,IAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,KAAI;QAC9B,IAAI,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,kBAAkB,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AACjF,KAAC,CAAC;AACJ;AAEA,SAAS,UAAU,CAGjB,MAAc,EAAE,MAAc,EAAE,IAAuC,EAAE,SAAS,GAAG,CAAC,EAAA;AACtF,IAAA,IACE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACtB,QAAA,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK;AAC7B,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK;AAE7B,QAAA,OAAO,KAAK;AAEd,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAClC,IAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAW;AAElC,IAAA,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;IAE/D,OAAO,QAAQ,IAAI,SAAS;AAC9B;AAEA,SAAS,cAAc,CAAC,CAAS,EAAE,CAAS,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAA;AAC1F,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AAChB,IAAA,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;AAChB,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;AACjB,IAAA,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE;IAEjB,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;IACzB,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3B,IAAA,IAAI,KAAK,GAAG,EAAE;AAEd,IAAA,IAAI,KAAK,KAAK,CAAC,EAAE;AACf,QAAA,KAAK,GAAG,GAAG,GAAG,KAAK;;IAGrB,IAAI,EAAE,EAAE,EAAE;AAEV,IAAA,IAAI,KAAK,GAAG,CAAC,EAAE;QACb,EAAE,GAAG,EAAE;QACP,EAAE,GAAG,EAAE;;AACF,SAAA,IAAI,KAAK,GAAG,CAAC,EAAE;QACpB,EAAE,GAAG,EAAE;QACP,EAAE,GAAG,EAAE;;SACF;AACL,QAAA,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;AACnB,QAAA,EAAE,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC;;AAGrB,IAAA,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;AACjB,IAAA,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE;AAEjB,IAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACrC;;;;"}
1
+ {"version":3,"file":"link-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-by-pointer-getter.ts"],"sourcesContent":["import { isObject } from \"@krainovsd/js-helpers\";\nimport { greatest } from \"d3-array\";\nimport type { LinkInterface } from \"../../types\";\n\nexport type LinkByPointerGetterOptions<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n> = {\n pointerX: number;\n pointerY: number;\n links: LinkInterface<NodeData, LinkData>[];\n linkHoverExtraZone: number;\n curve: boolean;\n};\n\nexport function linkByPointerGetter<\n NodeData extends Record<string, unknown>,\n LinkData extends Record<string, unknown>,\n>({\n pointerX,\n pointerY,\n links,\n linkHoverExtraZone,\n curve,\n}: LinkByPointerGetterOptions<NodeData, LinkData>): LinkInterface<NodeData, LinkData> | undefined {\n return greatest(links, (link) => {\n if (\n !isObject(link.source) ||\n !isObject(link.target) ||\n link.source.visible === false ||\n link.target.visible === false\n )\n return;\n\n const x1 = (link._x1 ?? link.source.x) as number;\n const y1 = (link._y1 ?? link.source.y) as number;\n const x2 = (link._x2 ?? link.target.x) as number;\n const y2 = (link._y2 ?? link.target.y) as number;\n const cx = link._cx ?? 0;\n const cy = link._cy ?? 0;\n\n return curve\n ? hitTestQuadratic(pointerX, pointerY, x1, y1, cx, cy, x2, y2, linkHoverExtraZone)\n ? link.index\n : undefined\n : isNearLink(pointerX, pointerY, x1, y1, x2, y2, linkHoverExtraZone)\n ? link.index\n : undefined;\n });\n}\n\nfunction isNearLink(\n px: number,\n py: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n threshold = 2,\n) {\n const A = px - x1;\n const B = py - y1;\n const C = x2 - x1;\n const D = y2 - y1;\n\n const dot = A * C + B * D;\n const lenSq = C * C + D * D;\n let param = -1;\n\n if (lenSq !== 0) {\n param = dot / lenSq;\n }\n\n let xx, yy;\n\n if (param < 0) {\n xx = x1;\n yy = y1;\n } else if (param > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + param * C;\n yy = y1 + param * D;\n }\n\n const dx = px - xx;\n const dy = py - yy;\n\n return Math.sqrt(dx * dx + dy * dy) <= threshold;\n}\n\nfunction hitTestQuadratic(\n px: number,\n py: number,\n x0: number,\n y0: number,\n xc: number,\n yc: number,\n x2: number,\n y2: number,\n tol: number,\n): boolean {\n const bb = bezierBBox(x0, y0, xc, yc, x2, y2);\n if (px < bb.minX - tol || px > bb.maxX + tol || py < bb.minY - tol || py > bb.maxY + tol) {\n return false;\n }\n\n const chord = Math.hypot(x2 - x0, y2 - y0);\n const contLen = Math.hypot(xc - x0, yc - y0) + Math.hypot(x2 - xc, y2 - yc);\n const approxLen = (chord + contLen) / 2;\n const steps = Math.max(16, Math.ceil(approxLen / 1));\n\n const tol2 = tol * tol;\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const mt = 1 - t;\n const x = mt * mt * x0 + 2 * mt * t * xc + t * t * x2;\n const y = mt * mt * y0 + 2 * mt * t * yc + t * t * y2;\n const dx = px - x;\n const dy = py - y;\n if (dx * dx + dy * dy <= tol2) return true;\n }\n return false;\n}\n\nfunction bezierBBox(\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n): { minX: number; maxX: number; minY: number; maxY: number } {\n function extrema(p0: number, p1: number, p2: number): number[] {\n const denom = p0 - 2 * p1 + p2;\n if (denom === 0) return [];\n const t = (p0 - p1) / denom;\n return t > 0 && t < 1 ? [t] : [];\n }\n\n const ts = [...extrema(x0, x1, x2), ...extrema(y0, y1, y2), 0, 1];\n\n let maxX = -Infinity,\n maxY = -Infinity,\n minX = Infinity,\n minY = Infinity;\n\n for (const t of ts) {\n const mt = 1 - t;\n const x = mt * mt * x0 + 2 * mt * t * x1 + t * t * x2;\n const y = mt * mt * y0 + 2 * mt * t * y1 + t * t * y2;\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n }\n\n return { minX, minY, maxX, maxY };\n}\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,7 @@
1
1
  import { greatest } from 'd3-array';
2
2
  import { isOverlapsNode } from './is-overlaps-node.js';
3
- import { pointerGetter } from './pointer-getter.js';
4
3
 
5
- function nodeByPointerGetter({ areaRect, areaTransform, mouseEvent, nodes, }) {
6
- if (!areaRect)
7
- return undefined;
8
- const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);
4
+ function nodeByPointerGetter({ pointerX, pointerY, nodes, }) {
9
5
  return greatest(nodes, (node) => {
10
6
  if (isOverlapsNode(node, pointerX, pointerY, undefined))
11
7
  return node.index;
@@ -1 +1 @@
1
- {"version":3,"file":"node-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-by-pointer-getter.ts"],"sourcesContent":["import { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { NodeInterface } from \"../../types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\nimport { pointerGetter } from \"./pointer-getter\";\n\nexport type NodeByPointerGetterOptions<NodeData extends Record<string, unknown>> = {\n mouseEvent: MouseEvent | TouchEvent;\n areaRect: DOMRect | undefined;\n areaTransform: ZoomTransform;\n nodes: NodeInterface<NodeData>[];\n};\n\nexport function nodeByPointerGetter<NodeData extends Record<string, unknown>>({\n areaRect,\n areaTransform,\n mouseEvent,\n nodes,\n}: NodeByPointerGetterOptions<NodeData>): NodeInterface<NodeData> | undefined {\n if (!areaRect) return undefined;\n\n const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);\n\n return greatest(nodes, (node) => {\n if (isOverlapsNode(node, pointerX, pointerY, undefined)) return node.index;\n });\n}\n"],"names":[],"mappings":";;;;AAaM,SAAU,mBAAmB,CAA2C,EAC5E,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,GACgC,EAAA;AACrC,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,SAAS;AAE/B,IAAA,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,aAAa,CAAC,UAAU,EAAE,QAAQ,EAAE,aAAa,CAAC;AAE/E,IAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,KAAI;QAC9B,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AAC5E,KAAC,CAAC;AACJ;;;;"}
1
+ {"version":3,"file":"node-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/node-by-pointer-getter.ts"],"sourcesContent":["import { greatest } from \"d3-array\";\nimport type { NodeInterface } from \"../../types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\n\nexport type NodeByPointerGetterOptions<NodeData extends Record<string, unknown>> = {\n pointerX: number;\n pointerY: number;\n nodes: NodeInterface<NodeData>[];\n};\n\nexport function nodeByPointerGetter<NodeData extends Record<string, unknown>>({\n pointerX,\n pointerY,\n nodes,\n}: NodeByPointerGetterOptions<NodeData>): NodeInterface<NodeData> | undefined {\n return greatest(nodes, (node) => {\n if (isOverlapsNode(node, pointerX, pointerY, undefined)) return node.index;\n });\n}\n"],"names":[],"mappings":";;;AAUM,SAAU,mBAAmB,CAA2C,EAC5E,QAAQ,EACR,QAAQ,EACR,KAAK,GACgC,EAAA;AACrC,IAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,KAAI;QAC9B,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AAC5E,KAAC,CAAC;AACJ;;;;"}