force-graph 1.49.2 → 1.49.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/force-graph.js +100 -135
- package/dist/force-graph.js.map +1 -1
- package/dist/force-graph.min.js +3 -3
- package/dist/force-graph.mjs +17 -15
- package/package.json +7 -7
- package/src/force-graph.js +9 -6
package/dist/force-graph.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { select } from 'd3-selection';
|
|
2
|
-
import {
|
|
2
|
+
import { zoomTransform, zoom } from 'd3-zoom';
|
|
3
3
|
import { drag } from 'd3-drag';
|
|
4
4
|
import { sum, min, max } from 'd3-array';
|
|
5
5
|
import { throttle } from 'lodash-es';
|
|
@@ -8,14 +8,14 @@ import Kapsule from 'kapsule';
|
|
|
8
8
|
import accessorFn from 'accessor-fn';
|
|
9
9
|
import ColorTracker from 'canvas-color-tracker';
|
|
10
10
|
import Tooltip from 'float-tooltip';
|
|
11
|
-
import { forceSimulation, forceLink, forceManyBody, forceCenter
|
|
11
|
+
import { forceRadial, forceSimulation, forceLink, forceManyBody, forceCenter } from 'd3-force-3d';
|
|
12
12
|
import { Bezier } from 'bezier-js';
|
|
13
13
|
import indexBy from 'index-array-by';
|
|
14
14
|
import { scaleOrdinal } from 'd3-scale';
|
|
15
15
|
import { schemePaired } from 'd3-scale-chromatic';
|
|
16
16
|
|
|
17
17
|
function styleInject(css, ref) {
|
|
18
|
-
if (ref ===
|
|
18
|
+
if (ref === void 0) ref = {};
|
|
19
19
|
var insertAt = ref.insertAt;
|
|
20
20
|
if (typeof document === 'undefined') {
|
|
21
21
|
return;
|
|
@@ -139,8 +139,8 @@ function _toConsumableArray(r) {
|
|
|
139
139
|
function _toPrimitive(t, r) {
|
|
140
140
|
if ("object" != typeof t || !t) return t;
|
|
141
141
|
var e = t[Symbol.toPrimitive];
|
|
142
|
-
if (
|
|
143
|
-
var i = e.call(t, r
|
|
142
|
+
if (void 0 !== e) {
|
|
143
|
+
var i = e.call(t, r);
|
|
144
144
|
if ("object" != typeof i) return i;
|
|
145
145
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
146
146
|
}
|
|
@@ -163,7 +163,7 @@ function _unsupportedIterableToArray(r, a) {
|
|
|
163
163
|
if (r) {
|
|
164
164
|
if ("string" == typeof r) return _arrayLikeToArray(r, a);
|
|
165
165
|
var t = {}.toString.call(r).slice(8, -1);
|
|
166
|
-
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) :
|
|
166
|
+
return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;
|
|
167
167
|
}
|
|
168
168
|
}
|
|
169
169
|
|
|
@@ -186,11 +186,11 @@ function getDagDepths (_ref, idAccessor) {
|
|
|
186
186
|
links = _ref.links;
|
|
187
187
|
var _ref2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
|
|
188
188
|
_ref2$nodeFilter = _ref2.nodeFilter,
|
|
189
|
-
nodeFilter = _ref2$nodeFilter ===
|
|
189
|
+
nodeFilter = _ref2$nodeFilter === void 0 ? function () {
|
|
190
190
|
return true;
|
|
191
191
|
} : _ref2$nodeFilter,
|
|
192
192
|
_ref2$onLoopError = _ref2.onLoopError,
|
|
193
|
-
onLoopError = _ref2$onLoopError ===
|
|
193
|
+
onLoopError = _ref2$onLoopError === void 0 ? function (loopIds) {
|
|
194
194
|
throw "Invalid DAG structure! Found cycle in node path: ".concat(loopIds.join(' -> '), ".");
|
|
195
195
|
} : _ref2$onLoopError;
|
|
196
196
|
// linked graph
|
|
@@ -1414,6 +1414,10 @@ var forceGraph = Kapsule({
|
|
|
1414
1414
|
var initPos = obj.__initialDragPos;
|
|
1415
1415
|
var dragPos = ev;
|
|
1416
1416
|
var k = zoomTransform(state.canvas).k;
|
|
1417
|
+
var translate = {
|
|
1418
|
+
x: initPos.x + (dragPos.x - initPos.x) / k - obj.x,
|
|
1419
|
+
y: initPos.y + (dragPos.y - initPos.y) / k - obj.y
|
|
1420
|
+
};
|
|
1417
1421
|
|
|
1418
1422
|
// Move fx/fy (and x/y) of nodes based on the scaled drag distance since the drag start
|
|
1419
1423
|
['x', 'y'].forEach(function (c) {
|
|
@@ -1424,10 +1428,6 @@ var forceGraph = Kapsule({
|
|
|
1424
1428
|
if (!obj.__dragged && DRAG_CLICK_TOLERANCE_PX >= Math.sqrt(sum(['x', 'y'].map(function (k) {
|
|
1425
1429
|
return Math.pow(ev[k] - initPos[k], 2);
|
|
1426
1430
|
})))) return;
|
|
1427
|
-
var translate = {
|
|
1428
|
-
x: initPos.x + (dragPos.x - initPos.x) / k - obj.x,
|
|
1429
|
-
y: initPos.y + (dragPos.y - initPos.y) / k - obj.y
|
|
1430
|
-
};
|
|
1431
1431
|
state.forceGraph.d3AlphaTarget(0.3) // keep engine running at low intensity throughout drag
|
|
1432
1432
|
.resetCountdown(); // prevent freeze while dragging
|
|
1433
1433
|
|
|
@@ -1479,10 +1479,12 @@ var forceGraph = Kapsule({
|
|
|
1479
1479
|
c.translate(t.x, t.y);
|
|
1480
1480
|
c.scale(t.k, t.k);
|
|
1481
1481
|
});
|
|
1482
|
+
state.isPointerDragging = true;
|
|
1482
1483
|
state.onZoom && state.onZoom(_objectSpread2(_objectSpread2({}, t), _this.centerAt())); // report x,y coordinates relative to canvas center
|
|
1483
1484
|
state.needsRedraw = true;
|
|
1484
1485
|
}).on('end', function (ev) {
|
|
1485
|
-
|
|
1486
|
+
state.isPointerDragging = false;
|
|
1487
|
+
state.onZoomEnd && state.onZoomEnd(_objectSpread2(_objectSpread2({}, ev.transform), _this.centerAt()));
|
|
1486
1488
|
});
|
|
1487
1489
|
adjustCanvasSize(state);
|
|
1488
1490
|
state.forceGraph.onNeedsRedraw(function () {
|
|
@@ -1549,7 +1551,7 @@ var forceGraph = Kapsule({
|
|
|
1549
1551
|
// mouse left-click or touch
|
|
1550
1552
|
if (state.hoverObj) {
|
|
1551
1553
|
var fn = state["on".concat(state.hoverObj.type, "Click")];
|
|
1552
|
-
fn && fn.apply(
|
|
1554
|
+
fn && fn.apply(void 0, [state.hoverObj.d].concat(cbEvents));
|
|
1553
1555
|
} else {
|
|
1554
1556
|
state.onBackgroundClick && state.onBackgroundClick.apply(state, cbEvents);
|
|
1555
1557
|
}
|
|
@@ -1558,7 +1560,7 @@ var forceGraph = Kapsule({
|
|
|
1558
1560
|
// mouse right-click
|
|
1559
1561
|
if (state.hoverObj) {
|
|
1560
1562
|
var _fn = state["on".concat(state.hoverObj.type, "RightClick")];
|
|
1561
|
-
_fn && _fn.apply(
|
|
1563
|
+
_fn && _fn.apply(void 0, [state.hoverObj.d].concat(cbEvents));
|
|
1562
1564
|
} else {
|
|
1563
1565
|
state.onBackgroundRightClick && state.onBackgroundRightClick.apply(state, cbEvents);
|
|
1564
1566
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "force-graph",
|
|
3
|
-
"version": "1.49.
|
|
3
|
+
"version": "1.49.4",
|
|
4
4
|
"description": "2D force-directed graph rendered on HTML5 canvas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"unpkg": "dist/force-graph.min.js",
|
|
@@ -64,18 +64,18 @@
|
|
|
64
64
|
"lodash-es": "4"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@babel/core": "^7.26.
|
|
68
|
-
"@babel/preset-env": "^7.26.
|
|
67
|
+
"@babel/core": "^7.26.9",
|
|
68
|
+
"@babel/preset-env": "^7.26.9",
|
|
69
69
|
"@rollup/plugin-babel": "^6.0.4",
|
|
70
|
-
"@rollup/plugin-commonjs": "^28.0.
|
|
70
|
+
"@rollup/plugin-commonjs": "^28.0.3",
|
|
71
71
|
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
72
72
|
"@rollup/plugin-terser": "^0.4.4",
|
|
73
|
-
"postcss": "^8.5.
|
|
73
|
+
"postcss": "^8.5.3",
|
|
74
74
|
"rimraf": "^6.0.1",
|
|
75
|
-
"rollup": "^4.
|
|
75
|
+
"rollup": "^4.34.9",
|
|
76
76
|
"rollup-plugin-dts": "^6.1.1",
|
|
77
77
|
"rollup-plugin-postcss": "^4.0.2",
|
|
78
|
-
"typescript": "^5.
|
|
78
|
+
"typescript": "^5.8.2"
|
|
79
79
|
},
|
|
80
80
|
"engines": {
|
|
81
81
|
"node": ">=12"
|
package/src/force-graph.js
CHANGED
|
@@ -420,6 +420,10 @@ export default Kapsule({
|
|
|
420
420
|
const dragPos = ev;
|
|
421
421
|
|
|
422
422
|
const k = d3ZoomTransform(state.canvas).k;
|
|
423
|
+
const translate = {
|
|
424
|
+
x: (initPos.x + (dragPos.x - initPos.x) / k) - obj.x,
|
|
425
|
+
y: (initPos.y + (dragPos.y - initPos.y) / k) - obj.y
|
|
426
|
+
};
|
|
423
427
|
|
|
424
428
|
// Move fx/fy (and x/y) of nodes based on the scaled drag distance since the drag start
|
|
425
429
|
['x', 'y'].forEach(c => obj[`f${c}`] = obj[c] = initPos[c] + (dragPos[c] - initPos[c]) / k);
|
|
@@ -428,11 +432,6 @@ export default Kapsule({
|
|
|
428
432
|
if (!obj.__dragged && (DRAG_CLICK_TOLERANCE_PX >= Math.sqrt(d3Sum(['x', 'y'].map(k => (ev[k] - initPos[k])**2)))))
|
|
429
433
|
return;
|
|
430
434
|
|
|
431
|
-
const translate = {
|
|
432
|
-
x: (initPos.x + (dragPos.x - initPos.x) / k) - obj.x,
|
|
433
|
-
y: (initPos.y + (dragPos.y - initPos.y) / k) - obj.y
|
|
434
|
-
};
|
|
435
|
-
|
|
436
435
|
state.forceGraph
|
|
437
436
|
.d3AlphaTarget(0.3) // keep engine running at low intensity throughout drag
|
|
438
437
|
.resetCountdown(); // prevent freeze while dragging
|
|
@@ -489,10 +488,14 @@ export default Kapsule({
|
|
|
489
488
|
c.translate(t.x, t.y);
|
|
490
489
|
c.scale(t.k, t.k);
|
|
491
490
|
});
|
|
491
|
+
state.isPointerDragging = true;
|
|
492
492
|
state.onZoom && state.onZoom({ ...t, ...this.centerAt() }); // report x,y coordinates relative to canvas center
|
|
493
493
|
state.needsRedraw = true;
|
|
494
494
|
})
|
|
495
|
-
.on('end', ev =>
|
|
495
|
+
.on('end', ev => {
|
|
496
|
+
state.isPointerDragging = false;
|
|
497
|
+
state.onZoomEnd && state.onZoomEnd({ ...ev.transform, ...this.centerAt() });
|
|
498
|
+
});
|
|
496
499
|
|
|
497
500
|
adjustCanvasSize(state);
|
|
498
501
|
|