@krainovsd/graph 0.9.0 → 0.10.0-rc2

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 (53) hide show
  1. package/lib/cjs/index.cjs +2672 -1803
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/esm/index.js +12 -3
  4. package/lib/esm/index.js.map +1 -1
  5. package/lib/esm/lib/draw-time.js +5 -1
  6. package/lib/esm/lib/draw-time.js.map +1 -1
  7. package/lib/esm/lib/get-controls-info.js +451 -224
  8. package/lib/esm/lib/get-controls-info.js.map +1 -1
  9. package/lib/esm/module/GraphCanvas/GraphCanvas.js +44 -934
  10. package/lib/esm/module/GraphCanvas/GraphCanvas.js.map +1 -1
  11. package/lib/esm/module/GraphCanvas/constants/settings.js +70 -47
  12. package/lib/esm/module/GraphCanvas/constants/settings.js.map +1 -1
  13. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js +12 -1
  14. package/lib/esm/module/GraphCanvas/lib/settings/node-settings-getter.js.map +1 -1
  15. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js +270 -0
  16. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-node.js.map +1 -0
  17. package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js +2 -2
  18. package/lib/esm/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.js.map +1 -1
  19. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js +19 -4
  20. package/lib/esm/module/GraphCanvas/lib/utils/get-particle-position.js.map +1 -1
  21. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js +29 -4
  22. package/lib/esm/module/GraphCanvas/lib/utils/is-node-visible.js.map +1 -1
  23. package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js +53 -4
  24. package/lib/esm/module/GraphCanvas/lib/utils/is-overlaps-node.js.map +1 -1
  25. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js +2 -2
  26. package/lib/esm/module/GraphCanvas/lib/utils/link-by-pointer-getter.js.map +1 -1
  27. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js +3 -13
  28. package/lib/esm/module/GraphCanvas/lib/utils/node-by-pointer-getter.js.map +1 -1
  29. package/lib/esm/module/GraphCanvas/slices/draw-links.js +207 -0
  30. package/lib/esm/module/GraphCanvas/slices/draw-links.js.map +1 -0
  31. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js +367 -0
  32. package/lib/esm/module/GraphCanvas/slices/draw-nodes.js.map +1 -0
  33. package/lib/esm/module/GraphCanvas/{lib/utils → slices}/draw-text.js +30 -7
  34. package/lib/esm/module/GraphCanvas/slices/draw-text.js.map +1 -0
  35. package/lib/esm/module/GraphCanvas/slices/init-area.js +31 -0
  36. package/lib/esm/module/GraphCanvas/slices/init-area.js.map +1 -0
  37. package/lib/esm/module/GraphCanvas/slices/init-dnd.js +62 -0
  38. package/lib/esm/module/GraphCanvas/slices/init-dnd.js.map +1 -0
  39. package/lib/esm/module/GraphCanvas/slices/init-draw.js +84 -0
  40. package/lib/esm/module/GraphCanvas/slices/init-draw.js.map +1 -0
  41. package/lib/esm/module/GraphCanvas/slices/init-pointer.js +211 -0
  42. package/lib/esm/module/GraphCanvas/slices/init-pointer.js.map +1 -0
  43. package/lib/esm/module/GraphCanvas/slices/init-resize.js +28 -0
  44. package/lib/esm/module/GraphCanvas/slices/init-resize.js.map +1 -0
  45. package/lib/esm/module/GraphCanvas/slices/init-simulation.js +172 -0
  46. package/lib/esm/module/GraphCanvas/slices/init-simulation.js.map +1 -0
  47. package/lib/esm/module/GraphCanvas/slices/init-zoom.js +36 -0
  48. package/lib/esm/module/GraphCanvas/slices/init-zoom.js.map +1 -0
  49. package/lib/index.d.ts +197 -154
  50. package/package.json +1 -1
  51. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js +0 -20
  52. package/lib/esm/module/GraphCanvas/lib/utils/calculate-link-position-by-radius.js.map +0 -1
  53. package/lib/esm/module/GraphCanvas/lib/utils/draw-text.js.map +0 -1
@@ -0,0 +1,270 @@
1
+ import { COMMON_SETTINGS } from '../../constants/settings.js';
2
+
3
+ function calculateLinkPositionByNode(link, arrowSize = 0) {
4
+ const source = link.source;
5
+ const target = link.target;
6
+ if (typeof source != "object" || typeof target != "object")
7
+ return null;
8
+ const sourcePoint = getLinkPoint({
9
+ arrowSize: 0,
10
+ node: source,
11
+ oppositeNode: target,
12
+ });
13
+ const targetPoint = getLinkPoint({
14
+ arrowSize: arrowSize > 0 ? arrowSize * 0.85 : 0,
15
+ node: target,
16
+ oppositeNode: source,
17
+ });
18
+ if (!sourcePoint || !targetPoint)
19
+ return null;
20
+ const distance = targetPoint && sourcePoint
21
+ ? Math.sqrt((targetPoint.x - sourcePoint.x) ** 2 + (targetPoint.y - sourcePoint.y) ** 2)
22
+ : 0;
23
+ return {
24
+ x1: sourcePoint.x,
25
+ y1: sourcePoint.y,
26
+ x2: targetPoint.x,
27
+ y2: targetPoint.y,
28
+ distance,
29
+ };
30
+ }
31
+ function getLinkPoint(opts) {
32
+ if (opts.node.x == undefined ||
33
+ opts.node.y == undefined ||
34
+ opts.oppositeNode.x == undefined ||
35
+ opts.oppositeNode.y == undefined)
36
+ return null;
37
+ let nodePoint;
38
+ switch (opts.node._shape) {
39
+ case "circle": {
40
+ nodePoint = getCircleIntersection({
41
+ x: opts.node.x,
42
+ y: opts.node.y,
43
+ radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,
44
+ oppositeX: opts.oppositeNode.x,
45
+ oppositeY: opts.oppositeNode.y,
46
+ arrowSize: opts.arrowSize,
47
+ });
48
+ break;
49
+ }
50
+ case "square":
51
+ case "text": {
52
+ nodePoint = getRectangleIntersection({
53
+ arrowSize: opts.arrowSize,
54
+ x: opts.node.x,
55
+ y: opts.node.y,
56
+ height: opts.node._height ?? COMMON_SETTINGS.nodeSize,
57
+ width: opts.node._width ?? COMMON_SETTINGS.nodeSize,
58
+ oppositeX: opts.oppositeNode.x,
59
+ oppositeY: opts.oppositeNode.y,
60
+ borderRadius: opts.node._shape === "text" ? 0 : (opts.node._borderRadius ?? 0),
61
+ });
62
+ break;
63
+ }
64
+ default: {
65
+ nodePoint = getCircleIntersection({
66
+ x: opts.node.x,
67
+ y: opts.node.y,
68
+ radius: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,
69
+ oppositeX: opts.oppositeNode.x,
70
+ oppositeY: opts.oppositeNode.y,
71
+ arrowSize: opts.arrowSize,
72
+ });
73
+ }
74
+ }
75
+ return nodePoint;
76
+ }
77
+ function getCircleIntersection(opts) {
78
+ const dx = opts.oppositeX - opts.x;
79
+ const dy = opts.oppositeY - opts.y;
80
+ const dr = Math.sqrt(dx * dx + dy * dy);
81
+ const radius = opts.radius + opts.arrowSize;
82
+ return {
83
+ x: opts.x + (dx * radius) / dr,
84
+ y: opts.y + (dy * radius) / dr,
85
+ };
86
+ }
87
+ function getRectangleIntersection(opts) {
88
+ const halfWidth = opts.width / 2;
89
+ const halfHeight = opts.height / 2;
90
+ const dx = opts.oppositeX - opts.x;
91
+ const dy = opts.oppositeY - opts.y;
92
+ let relX, relY;
93
+ if (Math.abs(dx) <= halfWidth && Math.abs(dy) <= halfHeight) {
94
+ const distToRight = halfWidth - dx;
95
+ const distToLeft = halfWidth + dx;
96
+ const distToTop = halfHeight - dy;
97
+ const distToBottom = halfHeight + dy;
98
+ const minDist = Math.min(distToRight, distToLeft, distToTop, distToBottom);
99
+ relX = minDist === distToRight ? halfWidth : minDist === distToLeft ? -halfWidth : dx;
100
+ relY = minDist === distToTop ? halfHeight : minDist === distToBottom ? -halfHeight : dy;
101
+ }
102
+ else {
103
+ const absDx = Math.abs(dx);
104
+ const absDy = Math.abs(dy);
105
+ if (halfWidth * absDy < halfHeight * absDx) {
106
+ relX = dx > 0 ? halfWidth : -halfWidth;
107
+ relY = (relX * dy) / dx;
108
+ if (Math.abs(relY) > halfHeight) {
109
+ relY = dy > 0 ? halfHeight : -halfHeight;
110
+ relX = (relY * dx) / dy;
111
+ }
112
+ }
113
+ else {
114
+ relY = dy > 0 ? halfHeight : -halfHeight;
115
+ relX = (relY * dx) / dy;
116
+ if (Math.abs(relX) > halfWidth) {
117
+ relX = dx > 0 ? halfWidth : -halfWidth;
118
+ relY = (relX * dy) / dx;
119
+ }
120
+ }
121
+ }
122
+ if (opts.borderRadius != undefined) {
123
+ const { x, y } = squareRadiusFix(relX, relY, halfWidth, halfHeight, opts.borderRadius);
124
+ if (x != undefined)
125
+ relX = x;
126
+ if (y != undefined)
127
+ relY = y;
128
+ }
129
+ if (opts.arrowSize > 0) {
130
+ const edgeDist = Math.sqrt(relX * relX + relY * relY);
131
+ const scale = (edgeDist + opts.arrowSize) / edgeDist;
132
+ relX *= scale;
133
+ relY *= scale;
134
+ }
135
+ return {
136
+ x: opts.x + relX,
137
+ y: opts.y + relY,
138
+ };
139
+ }
140
+ // eslint-disable-next-line no-warning-comments
141
+ // TODO: Need upgrade
142
+ function squareRadiusFix(relX, relY, halfWidth, halfHeight, borderRadius) {
143
+ const epsilon = 1e-6;
144
+ const absX = Math.abs(relX);
145
+ const absY = Math.abs(relY);
146
+ let side = null;
147
+ if (absX >= halfWidth - epsilon) {
148
+ side = relX > 0 ? "right" : "left";
149
+ }
150
+ else if (absY >= halfHeight - epsilon) {
151
+ side = relY > 0 ? "top" : "bottom";
152
+ }
153
+ if (side) {
154
+ const topBound = halfHeight - borderRadius;
155
+ const bottomBound = -topBound;
156
+ const rightBound = halfWidth - borderRadius;
157
+ const leftBound = -rightBound;
158
+ switch (side) {
159
+ case "right":
160
+ if (relY > topBound) {
161
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "right-top");
162
+ }
163
+ else if (relY < bottomBound) {
164
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "right-bottom");
165
+ }
166
+ break;
167
+ case "left":
168
+ if (relY > topBound) {
169
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "left-top");
170
+ }
171
+ else if (relY < bottomBound) {
172
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "left-bottom");
173
+ }
174
+ break;
175
+ case "top":
176
+ if (relX > rightBound) {
177
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "top-right");
178
+ }
179
+ else if (relX < leftBound) {
180
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "top-left");
181
+ }
182
+ break;
183
+ case "bottom":
184
+ if (relX > rightBound) {
185
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "bottom-right");
186
+ }
187
+ else if (relX < leftBound) {
188
+ return checkIntersection(relX, relY, halfWidth, halfHeight, borderRadius, "bottom-left");
189
+ }
190
+ break;
191
+ }
192
+ }
193
+ return { x: undefined, y: undefined };
194
+ }
195
+ function checkIntersection(relX, relY, halfWidth, halfHeight, r, corner) {
196
+ const intersect = intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner);
197
+ return intersect ?? { x: undefined, y: undefined };
198
+ }
199
+ function intersectWithCircle(relX, relY, halfWidth, halfHeight, r, corner) {
200
+ switch (corner) {
201
+ case "top-right":
202
+ corner = "right-top";
203
+ break;
204
+ case "bottom-right":
205
+ corner = "right-bottom";
206
+ break;
207
+ case "top-left":
208
+ corner = "left-top";
209
+ break;
210
+ case "bottom-left":
211
+ corner = "left-bottom";
212
+ break;
213
+ }
214
+ let cx, cy;
215
+ switch (corner) {
216
+ case "right-top":
217
+ cx = halfWidth - r;
218
+ cy = halfHeight - r;
219
+ break;
220
+ case "right-bottom":
221
+ cx = halfWidth - r;
222
+ cy = -halfHeight + r;
223
+ break;
224
+ case "left-top":
225
+ cx = -halfWidth + r;
226
+ cy = halfHeight - r;
227
+ break;
228
+ case "left-bottom":
229
+ cx = -halfWidth + r;
230
+ cy = -halfHeight + r;
231
+ break;
232
+ default:
233
+ return null;
234
+ }
235
+ const a = relX ** 2 + relY ** 2;
236
+ if (a === 0)
237
+ return null;
238
+ const b = -2 * (relX * cx + relY * cy);
239
+ const c = cx ** 2 + cy ** 2 - r ** 2;
240
+ const discriminant = b ** 2 - 4 * a * c;
241
+ if (discriminant < 0)
242
+ return null;
243
+ const sqrtD = Math.sqrt(discriminant);
244
+ const t2 = (-b - sqrtD) / (2 * a);
245
+ const t1 = (-b + sqrtD) / (2 * a);
246
+ const t = t2 > 0 ? t2 : t1 > 0 ? t1 : null;
247
+ if (t === null || t >= 1)
248
+ return null;
249
+ const x = t * relX;
250
+ const y = t * relY;
251
+ let valid = false;
252
+ switch (corner) {
253
+ case "right-top":
254
+ valid = x >= cx && y >= cy;
255
+ break;
256
+ case "right-bottom":
257
+ valid = x >= cx && y <= cy;
258
+ break;
259
+ case "left-top":
260
+ valid = x <= cx && y >= cy;
261
+ break;
262
+ case "left-bottom":
263
+ valid = x <= cx && y <= cy;
264
+ break;
265
+ }
266
+ return valid ? { x, y } : null;
267
+ }
268
+
269
+ export { calculateLinkPositionByNode };
270
+ //# sourceMappingURL=calculate-link-position-by-node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calculate-link-position-by-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/calculate-link-position-by-node.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport type { LinkInterface, NodeInterface } from \"@/types\";\nimport { COMMON_SETTINGS } from \"../../constants\";\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: opts.node._radius ?? COMMON_SETTINGS.nodeRadius,\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,\n width: opts.node._width ?? COMMON_SETTINGS.nodeSize,\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,9 +1,9 @@
1
1
  import { isOverlapsNode } from './is-overlaps-node.js';
2
2
 
3
- function dragPlaceCoefficientGetter(node, pointerX, pointerY, radius) {
3
+ function dragPlaceCoefficientGetter(node, pointerX, pointerY) {
4
4
  if (!node.x || !node.y)
5
5
  return undefined;
6
- if (isOverlapsNode(node, radius, pointerX, pointerY))
6
+ if (isOverlapsNode(node, pointerX, pointerY, undefined))
7
7
  return node.index;
8
8
  }
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"drag-place-coefficient-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\n\nexport function dragPlaceCoefficientGetter<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n pointerX: number,\n pointerY: number,\n radius: number,\n): number | undefined {\n if (!node.x || !node.y) return undefined;\n\n if (isOverlapsNode(node, radius, pointerX, pointerY)) return node.index;\n}\n"],"names":[],"mappings":";;AAGM,SAAU,0BAA0B,CACxC,IAA6B,EAC7B,QAAgB,EAChB,QAAgB,EAChB,MAAc,EAAA;IAEd,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,SAAS;IAExC,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK;AACzE;;;;"}
1
+ {"version":3,"file":"drag-place-coefficient-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/drag-place-coefficient-getter.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\nimport { isOverlapsNode } from \"./is-overlaps-node\";\n\nexport function dragPlaceCoefficientGetter<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n pointerX: number,\n pointerY: number,\n): number | undefined {\n if (!node.x || !node.y) return undefined;\n\n if (isOverlapsNode(node, pointerX, pointerY, undefined)) return node.index;\n}\n"],"names":[],"mappings":";;SAGgB,0BAA0B,CACxC,IAA6B,EAC7B,QAAgB,EAChB,QAAgB,EAAA;IAEhB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAAE,QAAA,OAAO,SAAS;IAExC,IAAI,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,KAAK;AAC5E;;;;"}
@@ -1,11 +1,21 @@
1
1
  function getParticlePosition(opts) {
2
- if (opts.particle.wait > 0) {
3
- opts.particle.wait--;
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;
4
14
  return;
5
15
  }
6
16
  const remainingSteps = opts.totalSteps - opts.particle.step;
7
17
  const progress = opts.particle.step / opts.totalSteps;
8
- if (remainingSteps === 0) {
18
+ if (remainingSteps <= 0) {
9
19
  opts.particle.x = opts.xEnd;
10
20
  opts.particle.y = opts.yEnd;
11
21
  opts.particle.step = 0;
@@ -17,7 +27,12 @@ function getParticlePosition(opts) {
17
27
  const newY = opts.yStart + dy * progress;
18
28
  opts.particle.x = newX;
19
29
  opts.particle.y = newY;
20
- opts.particle.step++;
30
+ if (needSpeed) {
31
+ opts.particle.step += prevStepDifference <= 3 ? prevStepDifference : 3;
32
+ }
33
+ else {
34
+ opts.particle.step++;
35
+ }
21
36
  }
22
37
 
23
38
  export { getParticlePosition };
@@ -1 +1 @@
1
- {"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { GraphParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: GraphParticle;\n xStart: number;\n yStart: number;\n xEnd: number;\n yEnd: number;\n totalSteps: number;\n};\n\nexport function getParticlePosition(opts: GetParticlePositionOptions) {\n if (opts.particle.wait > 0) {\n opts.particle.wait--;\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 opts.particle.step++;\n}\n"],"names":[],"mappings":"AAWM,SAAU,mBAAmB,CAAC,IAAgC,EAAA;IAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;AAC1B,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAEpB;;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,KAAK,CAAC,EAAE;QACxB,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;AACtB,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;AACtB;;;;"}
1
+ {"version":3,"file":"get-particle-position.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/get-particle-position.ts"],"sourcesContent":["import type { GraphParticle } from \"../../types\";\n\ntype GetParticlePositionOptions = {\n particle: GraphParticle;\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,13 +1,38 @@
1
+ import { COMMON_SETTINGS } from '../../constants/settings.js';
2
+
1
3
  const ADDITIONAL_VIEWPORT = 10;
2
4
  function isNodeVisible(opts) {
3
5
  const left = -opts.transform.x / opts.transform.k;
4
6
  const right = (opts.width - opts.transform.x) / opts.transform.k;
5
7
  const top = -opts.transform.y / opts.transform.k;
6
8
  const bottom = (opts.height - opts.transform.y) / opts.transform.k;
7
- return (left < opts.x + opts.radius + ADDITIONAL_VIEWPORT &&
8
- opts.x - opts.radius - ADDITIONAL_VIEWPORT < right &&
9
- top < opts.y + opts.radius + ADDITIONAL_VIEWPORT &&
10
- opts.y - opts.radius - ADDITIONAL_VIEWPORT < bottom);
9
+ if (opts.node.x == undefined || opts.node.y == undefined)
10
+ return false;
11
+ switch (opts.node._shape) {
12
+ case "circle": {
13
+ const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;
14
+ return (left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&
15
+ opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&
16
+ top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&
17
+ opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom);
18
+ }
19
+ case "square":
20
+ case "text": {
21
+ const width = opts.node._width ?? COMMON_SETTINGS.nodeSize;
22
+ const height = opts.node._height ?? COMMON_SETTINGS.nodeSize;
23
+ return (left < opts.node.x + width + ADDITIONAL_VIEWPORT &&
24
+ opts.node.x - width - ADDITIONAL_VIEWPORT < right &&
25
+ top < opts.node.y + height + ADDITIONAL_VIEWPORT &&
26
+ opts.node.y - height - ADDITIONAL_VIEWPORT < bottom);
27
+ }
28
+ default: {
29
+ const radius = opts.node._radius ?? COMMON_SETTINGS.nodeRadius;
30
+ return (left < opts.node.x + radius + ADDITIONAL_VIEWPORT &&
31
+ opts.node.x - radius - ADDITIONAL_VIEWPORT < right &&
32
+ top < opts.node.y + radius + ADDITIONAL_VIEWPORT &&
33
+ opts.node.y - radius - ADDITIONAL_VIEWPORT < bottom);
34
+ }
35
+ }
11
36
  }
12
37
 
13
38
  export { isNodeVisible };
@@ -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\";\n\ntype IsNodeVisibleOptions = {\n x: number;\n y: number;\n radius: number;\n width: number;\n height: number;\n transform: ZoomTransform;\n};\n\nconst ADDITIONAL_VIEWPORT = 10;\n\nexport function isNodeVisible(opts: IsNodeVisibleOptions) {\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 return (\n left < opts.x + opts.radius + ADDITIONAL_VIEWPORT &&\n opts.x - opts.radius - ADDITIONAL_VIEWPORT < right &&\n top < opts.y + opts.radius + ADDITIONAL_VIEWPORT &&\n opts.y - opts.radius - ADDITIONAL_VIEWPORT < bottom\n );\n}\n"],"names":[],"mappings":"AAWA,MAAM,mBAAmB,GAAG,EAAE;AAExB,SAAU,aAAa,CAAC,IAA0B,EAAA;AACtD,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;IAElE,QACE,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB;QACjD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB,GAAG,KAAK;QAClD,GAAG,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB;QAChD,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,mBAAmB,GAAG,MAAM;AAEvD;;;;"}
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 type { NodeInterface } from \"@/types\";\nimport { COMMON_SETTINGS } from \"../../constants\";\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,9 +1,58 @@
1
- function isOverlapsNode(node, radius, pointerX, pointerY) {
1
+ function isOverlapsNode(node, pointerX, pointerY, radius) {
2
2
  if (node.x == undefined || node.y == undefined)
3
3
  return false;
4
- const isOverX = node.x - radius <= pointerX && pointerX <= node.x + radius;
5
- const isOverY = node.y - radius <= pointerY && pointerY <= node.y + radius;
6
- return isOverX && isOverY;
4
+ switch (node._shape) {
5
+ case "circle": {
6
+ const nodeRadius = node._radius ?? radius ?? 5;
7
+ const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;
8
+ const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;
9
+ return isOverX && isOverY;
10
+ }
11
+ case "square":
12
+ case "text": {
13
+ const width = node._width ?? 5;
14
+ const height = node._height ?? 5;
15
+ const borderRadius = node._borderRadius ?? 0;
16
+ const overlaps = Math.abs(pointerX - node.x) <= width / 2 && Math.abs(pointerY - node.y) <= height / 2;
17
+ if (node._shape !== "text" && borderRadius != undefined && borderRadius > 0 && overlaps) {
18
+ return isCursorOverRoundedRect(pointerX, pointerY, node.x, node.y, width / 2, height / 2, borderRadius);
19
+ }
20
+ return overlaps;
21
+ }
22
+ default: {
23
+ const nodeRadius = node._radius ?? radius ?? 5;
24
+ const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;
25
+ const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;
26
+ return isOverX && isOverY;
27
+ }
28
+ }
29
+ }
30
+ function isCursorOverRoundedRect(pointerX, pointerY, x, y, halfWidth, halfHeight, borderRadius) {
31
+ const left = x - halfWidth;
32
+ const right = x + halfWidth;
33
+ const top = y - halfHeight;
34
+ const bottom = y + halfHeight;
35
+ if (pointerX < left + borderRadius && pointerY < top + borderRadius) {
36
+ const dx = pointerX - (left + borderRadius);
37
+ const dy = pointerY - (top + borderRadius);
38
+ return dx * dx + dy * dy <= borderRadius * borderRadius;
39
+ }
40
+ else if (pointerX > right - borderRadius && pointerY < top + borderRadius) {
41
+ const dx = pointerX - (right - borderRadius);
42
+ const dy = pointerY - (top + borderRadius);
43
+ return dx * dx + dy * dy <= borderRadius * borderRadius;
44
+ }
45
+ else if (pointerX < left + borderRadius && pointerY > bottom - borderRadius) {
46
+ const dx = pointerX - (left + borderRadius);
47
+ const dy = pointerY - (bottom - borderRadius);
48
+ return dx * dx + dy * dy <= borderRadius * borderRadius;
49
+ }
50
+ else if (pointerX > right - borderRadius && pointerY > bottom - borderRadius) {
51
+ const dx = pointerX - (right - borderRadius);
52
+ const dy = pointerY - (bottom - borderRadius);
53
+ return dx * dx + dy * dy <= borderRadius * borderRadius;
54
+ }
55
+ return true;
7
56
  }
8
57
 
9
58
  export { isOverlapsNode };
@@ -1 +1 @@
1
- {"version":3,"file":"is-overlaps-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-overlaps-node.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\n\nexport function isOverlapsNode<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n radius: number,\n pointerX: number,\n pointerY: number,\n) {\n if (node.x == undefined || node.y == undefined) return false;\n\n const isOverX = node.x - radius <= pointerX && pointerX <= node.x + radius;\n const isOverY = node.y - radius <= pointerY && pointerY <= node.y + radius;\n\n return isOverX && isOverY;\n}\n"],"names":[],"mappings":"AAEM,SAAU,cAAc,CAC5B,IAA6B,EAC7B,MAAc,EACd,QAAgB,EAChB,QAAgB,EAAA;IAEhB,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS;AAAE,QAAA,OAAO,KAAK;AAE5D,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,MAAM;AAC1E,IAAA,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,MAAM;IAE1E,OAAO,OAAO,IAAI,OAAO;AAC3B;;;;"}
1
+ {"version":3,"file":"is-overlaps-node.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/is-overlaps-node.ts"],"sourcesContent":["import type { NodeInterface } from \"@/types\";\n\nexport function isOverlapsNode<NodeData extends Record<string, unknown>>(\n node: NodeInterface<NodeData>,\n pointerX: number,\n pointerY: number,\n radius: number | undefined,\n) {\n if (node.x == undefined || node.y == undefined) return false;\n\n switch (node._shape) {\n case \"circle\": {\n const nodeRadius = node._radius ?? radius ?? 5;\n const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;\n const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;\n\n return isOverX && isOverY;\n }\n case \"square\":\n case \"text\": {\n const width = node._width ?? 5;\n const height = node._height ?? 5;\n const borderRadius = node._borderRadius ?? 0;\n const overlaps =\n Math.abs(pointerX - node.x) <= width / 2 && Math.abs(pointerY - node.y) <= height / 2;\n\n if (node._shape !== \"text\" && borderRadius != undefined && borderRadius > 0 && overlaps) {\n return isCursorOverRoundedRect(\n pointerX,\n pointerY,\n node.x,\n node.y,\n width / 2,\n height / 2,\n borderRadius,\n );\n }\n\n return overlaps;\n }\n default: {\n const nodeRadius = node._radius ?? radius ?? 5;\n const isOverX = node.x - nodeRadius <= pointerX && pointerX <= node.x + nodeRadius;\n const isOverY = node.y - nodeRadius <= pointerY && pointerY <= node.y + nodeRadius;\n\n return isOverX && isOverY;\n }\n }\n}\n\nfunction isCursorOverRoundedRect(\n pointerX: number,\n pointerY: number,\n x: number,\n y: number,\n halfWidth: number,\n halfHeight: number,\n borderRadius: number,\n) {\n const left = x - halfWidth;\n const right = x + halfWidth;\n const top = y - halfHeight;\n const bottom = y + halfHeight;\n\n if (pointerX < left + borderRadius && pointerY < top + borderRadius) {\n const dx = pointerX - (left + borderRadius);\n const dy = pointerY - (top + borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n } else if (pointerX > right - borderRadius && pointerY < top + borderRadius) {\n const dx = pointerX - (right - borderRadius);\n const dy = pointerY - (top + borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n } else if (pointerX < left + borderRadius && pointerY > bottom - borderRadius) {\n const dx = pointerX - (left + borderRadius);\n const dy = pointerY - (bottom - borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n } else if (pointerX > right - borderRadius && pointerY > bottom - borderRadius) {\n const dx = pointerX - (right - borderRadius);\n const dy = pointerY - (bottom - borderRadius);\n\n return dx * dx + dy * dy <= borderRadius * borderRadius;\n }\n\n return true;\n}\n"],"names":[],"mappings":"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"}
@@ -3,12 +3,12 @@ import { greatest } from 'd3-array';
3
3
  import { pointerGetter } from './pointer-getter.js';
4
4
 
5
5
  /* eslint-disable id-length */
6
- function linkByPointerGetter({ areaRect, areaTransform, mouseEvent, links, graphSettings, }) {
6
+ function linkByPointerGetter({ areaRect, areaTransform, mouseEvent, links, linkSettings, }) {
7
7
  if (!areaRect)
8
8
  return undefined;
9
9
  const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);
10
10
  return greatest(links, (link) => {
11
- if (isNearLink(pointerX, pointerY, link, graphSettings.hoverLinkThreshold))
11
+ if (isNearLink(pointerX, pointerY, link, linkSettings.hoverLinkThreshold))
12
12
  return link.index;
13
13
  });
14
14
  }
@@ -1 +1 @@
1
- {"version":3,"file":"link-by-pointer-getter.js","sources":["../../../../../../src/module/GraphCanvas/lib/utils/link-by-pointer-getter.ts"],"sourcesContent":["/* eslint-disable id-length */\nimport { isObject } from \"@krainovsd/js-helpers\";\nimport { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { LinkInterface } from \"@/types\";\nimport type { GraphSettingsInterface } 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 graphSettings: Required<GraphSettingsInterface<NodeData>>;\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 graphSettings,\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, graphSettings.hoverLinkThreshold)) 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 (!isObject(link.source) || !isObject(link.target)) 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":";;;;AAAA;AAmBgB,SAAA,mBAAmB,CAGjC,EACA,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,EACL,aAAa,GACkC,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,aAAa,CAAC,kBAAkB,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AAC/F,KAAC,CAAC;AACJ;AAEA,SAAS,UAAU,CAGjB,MAAc,EAAE,MAAc,EAAE,IAAuC,EAAE,SAAS,GAAG,CAAC,EAAA;AACtF,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,KAAK;AAElE,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":["/* eslint-disable id-length */\nimport { isObject } from \"@krainovsd/js-helpers\";\nimport { greatest } from \"d3-array\";\nimport type { ZoomTransform } from \"d3-zoom\";\nimport type { LinkInterface } from \"@/types\";\nimport type { LinkSettingsInterface } 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 linkSettings: Required<Omit<LinkSettingsInterface<NodeData, LinkData>, \"options\">> &\n Pick<LinkSettingsInterface<NodeData, LinkData>, \"options\">;\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 linkSettings,\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, linkSettings.hoverLinkThreshold)) 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 (!isObject(link.source) || !isObject(link.target)) 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":";;;;AAAA;AAoBgB,SAAA,mBAAmB,CAGjC,EACA,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,EACL,YAAY,GACmC,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,YAAY,CAAC,kBAAkB,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AAC9F,KAAC,CAAC;AACJ;AAEA,SAAS,UAAU,CAGjB,MAAc,EAAE,MAAc,EAAE,IAAuC,EAAE,SAAS,GAAG,CAAC,EAAA;AACtF,IAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,KAAK;AAElE,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,23 +1,13 @@
1
1
  import { greatest } from 'd3-array';
2
- import { pointerGetter } from './pointer-getter.js';
3
2
  import { isOverlapsNode } from './is-overlaps-node.js';
4
- import '@krainovsd/js-helpers';
5
- import { nodeRadiusGetter } from '../settings/node-settings-getter.js';
3
+ import { pointerGetter } from './pointer-getter.js';
6
4
 
7
- function nodeByPointerGetter({ areaRect, areaTransform, mouseEvent, nodes, graphSettings, }) {
5
+ function nodeByPointerGetter({ areaRect, areaTransform, mouseEvent, nodes, }) {
8
6
  if (!areaRect)
9
7
  return undefined;
10
8
  const [pointerX, pointerY] = pointerGetter(mouseEvent, areaRect, areaTransform);
11
9
  return greatest(nodes, (node) => {
12
- const radius = node._radius ??
13
- nodeRadiusGetter({
14
- radiusFlexible: graphSettings.nodeRadiusFlexible,
15
- radiusInitial: graphSettings.nodeRadiusInitial,
16
- radiusCoefficient: graphSettings.nodeRadiusCoefficient,
17
- radiusFactor: graphSettings.nodeRadiusFactor,
18
- linkCount: node.linkCount,
19
- });
20
- if (isOverlapsNode(node, radius, pointerX, pointerY))
10
+ if (isOverlapsNode(node, pointerX, pointerY, undefined))
21
11
  return node.index;
22
12
  });
23
13
  }
@@ -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 type { GraphSettingsInterface } from \"../../types\";\nimport { nodeRadiusGetter } from \"../settings\";\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 graphSettings: Required<GraphSettingsInterface<NodeData>>;\n};\n\nexport function nodeByPointerGetter<NodeData extends Record<string, unknown>>({\n areaRect,\n areaTransform,\n mouseEvent,\n nodes,\n graphSettings,\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 const radius =\n node._radius ??\n nodeRadiusGetter({\n radiusFlexible: graphSettings.nodeRadiusFlexible,\n radiusInitial: graphSettings.nodeRadiusInitial,\n radiusCoefficient: graphSettings.nodeRadiusCoefficient,\n radiusFactor: graphSettings.nodeRadiusFactor,\n linkCount: node.linkCount,\n });\n\n if (isOverlapsNode(node, radius, pointerX, pointerY)) return node.index;\n });\n}\n"],"names":[],"mappings":";;;;;;AAgBgB,SAAA,mBAAmB,CAA2C,EAC5E,QAAQ,EACR,aAAa,EACb,UAAU,EACV,KAAK,EACL,aAAa,GACwB,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;AAC9B,QAAA,MAAM,MAAM,GACV,IAAI,CAAC,OAAO;AACZ,YAAA,gBAAgB,CAAC;gBACf,cAAc,EAAE,aAAa,CAAC,kBAAkB;gBAChD,aAAa,EAAE,aAAa,CAAC,iBAAiB;gBAC9C,iBAAiB,EAAE,aAAa,CAAC,qBAAqB;gBACtD,YAAY,EAAE,aAAa,CAAC,gBAAgB;gBAC5C,SAAS,EAAE,IAAI,CAAC,SAAS;AAC1B,aAAA,CAAC;QAEJ,IAAI,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK;AACzE,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 { 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;;;;"}