force-graph 1.42.2 → 1.42.6

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 CHANGED
@@ -3,7 +3,7 @@ force-graph
3
3
 
4
4
  [![NPM package][npm-img]][npm-url]
5
5
  [![Build Size][build-size-img]][build-size-url]
6
- [![Dependencies][dependencies-img]][dependencies-url]
6
+ [![NPM Downloads][npm-downloads-img]][npm-downloads-url]
7
7
 
8
8
  Force-directed graph rendered on HTML5 canvas.
9
9
 
@@ -52,22 +52,22 @@ And check out the [React bindings](https://github.com/vasturiano/react-force-gra
52
52
 
53
53
  ## Quick start
54
54
 
55
- ```
55
+ ```js
56
56
  import ForceGraph from 'force-graph';
57
57
  ```
58
58
  or
59
- ```
60
- var ForceGraph = require('force-graph');
59
+ ```js
60
+ const ForceGraph = require('force-graph');
61
61
  ```
62
62
  or even
63
- ```
63
+ ```html
64
64
  <script src="//unpkg.com/force-graph"></script>
65
65
  ```
66
66
  then
67
- ```
68
- var myGraph = ForceGraph();
67
+ ```js
68
+ const myGraph = ForceGraph();
69
69
  myGraph(<myDOMElement>)
70
- .graphData(<myData>);
70
+ .graphData(<myData>);
71
71
  ```
72
72
 
73
73
  ## API reference
@@ -191,7 +191,7 @@ myGraph(<myDOMElement>)
191
191
  | <b>graph2ScreenCoords</b>(<i>x</i>, <i>y</i>) | Utility method to translate node coordinates to the viewport domain. Given a pair of `x`,`y` graph coordinates, returns the current equivalent `{x, y}` in viewport coordinates. |
192
192
 
193
193
  ### Input JSON syntax
194
- ```
194
+ ```json
195
195
  {
196
196
  "nodes": [
197
197
  {
@@ -204,14 +204,14 @@ myGraph(<myDOMElement>)
204
204
  "name": "name2",
205
205
  "val": 10
206
206
  },
207
- (...)
207
+ ...
208
208
  ],
209
209
  "links": [
210
210
  {
211
211
  "source": "id1",
212
212
  "target": "id2"
213
213
  },
214
- (...)
214
+ ...
215
215
  ]
216
216
  }
217
217
  ```
@@ -220,9 +220,9 @@ myGraph(<myDOMElement>)
220
220
 
221
221
  [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_SM.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=L398E7PKP47E8&currency_code=USD&source=url) If this project has helped you and you'd like to contribute back, you can always [buy me a ☕](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=L398E7PKP47E8&currency_code=USD&source=url)!
222
222
 
223
- [npm-img]: https://img.shields.io/npm/v/force-graph.svg
223
+ [npm-img]: https://img.shields.io/npm/v/force-graph
224
224
  [npm-url]: https://npmjs.org/package/force-graph
225
- [build-size-img]: https://img.shields.io/bundlephobia/minzip/force-graph.svg
225
+ [build-size-img]: https://img.shields.io/bundlephobia/minzip/force-graph
226
226
  [build-size-url]: https://bundlephobia.com/result?p=force-graph
227
- [dependencies-img]: https://img.shields.io/david/vasturiano/force-graph.svg
228
- [dependencies-url]: https://david-dm.org/vasturiano/force-graph
227
+ [npm-downloads-img]: https://img.shields.io/npm/dt/force-graph
228
+ [npm-downloads-url]: https://www.npmtrends.com/force-graph
@@ -61,14 +61,9 @@ function ownKeys(object, enumerableOnly) {
61
61
 
62
62
  if (Object.getOwnPropertySymbols) {
63
63
  var symbols = Object.getOwnPropertySymbols(object);
64
-
65
- if (enumerableOnly) {
66
- symbols = symbols.filter(function (sym) {
67
- return Object.getOwnPropertyDescriptor(object, sym).enumerable;
68
- });
69
- }
70
-
71
- keys.push.apply(keys, symbols);
64
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
65
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
66
+ })), keys.push.apply(keys, symbols);
72
67
  }
73
68
 
74
69
  return keys;
@@ -76,19 +71,12 @@ function ownKeys(object, enumerableOnly) {
76
71
 
77
72
  function _objectSpread2(target) {
78
73
  for (var i = 1; i < arguments.length; i++) {
79
- var source = arguments[i] != null ? arguments[i] : {};
80
-
81
- if (i % 2) {
82
- ownKeys(Object(source), true).forEach(function (key) {
83
- _defineProperty(target, key, source[key]);
84
- });
85
- } else if (Object.getOwnPropertyDescriptors) {
86
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
87
- } else {
88
- ownKeys(Object(source)).forEach(function (key) {
89
- Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
90
- });
91
- }
74
+ var source = null != arguments[i] ? arguments[i] : {};
75
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
76
+ _defineProperty(target, key, source[key]);
77
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
78
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
79
+ });
92
80
  }
93
81
 
94
82
  return target;
@@ -97,17 +85,11 @@ function _objectSpread2(target) {
97
85
  function _typeof(obj) {
98
86
  "@babel/helpers - typeof";
99
87
 
100
- if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
101
- _typeof = function (obj) {
102
- return typeof obj;
103
- };
104
- } else {
105
- _typeof = function (obj) {
106
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
107
- };
108
- }
109
-
110
- return _typeof(obj);
88
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
89
+ return typeof obj;
90
+ } : function (obj) {
91
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
92
+ }, _typeof(obj);
111
93
  }
112
94
 
113
95
  function _defineProperty(obj, key, value) {
@@ -350,7 +332,7 @@ var notifyRedraw = function notifyRedraw(_, state) {
350
332
  return state.onNeedsRedraw && state.onNeedsRedraw();
351
333
  };
352
334
 
353
- var CanvasForceGraph = Kapsule__default['default']({
335
+ var CanvasForceGraph = Kapsule__default["default"]({
354
336
  props: {
355
337
  graphData: {
356
338
  "default": {
@@ -604,10 +586,10 @@ var CanvasForceGraph = Kapsule__default['default']({
604
586
  }
605
587
 
606
588
  function paintNodes() {
607
- var getVisibility = accessorFn__default['default'](state.nodeVisibility);
608
- var getVal = accessorFn__default['default'](state.nodeVal);
609
- var getColor = accessorFn__default['default'](state.nodeColor);
610
- var getNodeCanvasObjectMode = accessorFn__default['default'](state.nodeCanvasObjectMode);
589
+ var getVisibility = accessorFn__default["default"](state.nodeVisibility);
590
+ var getVal = accessorFn__default["default"](state.nodeVal);
591
+ var getColor = accessorFn__default["default"](state.nodeColor);
592
+ var getNodeCanvasObjectMode = accessorFn__default["default"](state.nodeCanvasObjectMode);
611
593
  var ctx = state.ctx; // Draw wider nodes by 1px on shadow canvas for more precise hovering (due to boundary anti-aliasing)
612
594
 
613
595
  var padAmount = state.isShadow / state.globalScale;
@@ -642,12 +624,12 @@ var CanvasForceGraph = Kapsule__default['default']({
642
624
  }
643
625
 
644
626
  function paintLinks() {
645
- var getVisibility = accessorFn__default['default'](state.linkVisibility);
646
- var getColor = accessorFn__default['default'](state.linkColor);
647
- var getWidth = accessorFn__default['default'](state.linkWidth);
648
- var getLineDash = accessorFn__default['default'](state.linkLineDash);
649
- var getCurvature = accessorFn__default['default'](state.linkCurvature);
650
- var getLinkCanvasObjectMode = accessorFn__default['default'](state.linkCanvasObjectMode);
627
+ var getVisibility = accessorFn__default["default"](state.linkVisibility);
628
+ var getColor = accessorFn__default["default"](state.linkColor);
629
+ var getWidth = accessorFn__default["default"](state.linkWidth);
630
+ var getLineDash = accessorFn__default["default"](state.linkLineDash);
631
+ var getCurvature = accessorFn__default["default"](state.linkCurvature);
632
+ var getLinkCanvasObjectMode = accessorFn__default["default"](state.linkCanvasObjectMode);
651
633
  var ctx = state.ctx; // Draw wider lines by 2px on shadow canvas for more precise hovering (due to boundary anti-aliasing)
652
634
 
653
635
  var padAmount = state.isShadow * 2;
@@ -679,7 +661,7 @@ var CanvasForceGraph = Kapsule__default['default']({
679
661
  });
680
662
  ctx.restore(); // Bundle strokes per unique color/width/dash for performance optimization
681
663
 
682
- var linksPerColor = indexBy__default['default'](defaultPaintLinks, [getColor, getWidth, getLineDash]);
664
+ var linksPerColor = indexBy__default["default"](defaultPaintLinks, [getColor, getWidth, getLineDash]);
683
665
  ctx.save();
684
666
  Object.entries(linksPerColor).forEach(function (_ref) {
685
667
  var _ref2 = _slicedToArray(_ref, 2),
@@ -769,11 +751,11 @@ var CanvasForceGraph = Kapsule__default['default']({
769
751
  function paintArrows() {
770
752
  var ARROW_WH_RATIO = 1.6;
771
753
  var ARROW_VLEN_RATIO = 0.2;
772
- var getLength = accessorFn__default['default'](state.linkDirectionalArrowLength);
773
- var getRelPos = accessorFn__default['default'](state.linkDirectionalArrowRelPos);
774
- var getVisibility = accessorFn__default['default'](state.linkVisibility);
775
- var getColor = accessorFn__default['default'](state.linkDirectionalArrowColor || state.linkColor);
776
- var getNodeVal = accessorFn__default['default'](state.nodeVal);
754
+ var getLength = accessorFn__default["default"](state.linkDirectionalArrowLength);
755
+ var getRelPos = accessorFn__default["default"](state.linkDirectionalArrowRelPos);
756
+ var getVisibility = accessorFn__default["default"](state.linkVisibility);
757
+ var getColor = accessorFn__default["default"](state.linkDirectionalArrowColor || state.linkColor);
758
+ var getNodeVal = accessorFn__default["default"](state.nodeVal);
777
759
  var ctx = state.ctx;
778
760
  ctx.save();
779
761
  state.graphData.links.filter(getVisibility).forEach(function (link) {
@@ -819,11 +801,11 @@ var CanvasForceGraph = Kapsule__default['default']({
819
801
  }
820
802
 
821
803
  function paintPhotons() {
822
- var getNumPhotons = accessorFn__default['default'](state.linkDirectionalParticles);
823
- var getSpeed = accessorFn__default['default'](state.linkDirectionalParticleSpeed);
824
- var getDiameter = accessorFn__default['default'](state.linkDirectionalParticleWidth);
825
- var getVisibility = accessorFn__default['default'](state.linkVisibility);
826
- var getColor = accessorFn__default['default'](state.linkDirectionalParticleColor || state.linkColor);
804
+ var getNumPhotons = accessorFn__default["default"](state.linkDirectionalParticles);
805
+ var getSpeed = accessorFn__default["default"](state.linkDirectionalParticleSpeed);
806
+ var getDiameter = accessorFn__default["default"](state.linkDirectionalParticleWidth);
807
+ var getVisibility = accessorFn__default["default"](state.linkVisibility);
808
+ var getColor = accessorFn__default["default"](state.linkDirectionalParticleColor || state.linkColor);
827
809
  var ctx = state.ctx;
828
810
  ctx.save();
829
811
  state.graphData.links.filter(getVisibility).forEach(function (link) {
@@ -915,12 +897,12 @@ var CanvasForceGraph = Kapsule__default['default']({
915
897
 
916
898
  if (state.nodeAutoColorBy !== null) {
917
899
  // Auto add color to uncolored nodes
918
- autoColorObjects(state.graphData.nodes, accessorFn__default['default'](state.nodeAutoColorBy), state.nodeColor);
900
+ autoColorObjects(state.graphData.nodes, accessorFn__default["default"](state.nodeAutoColorBy), state.nodeColor);
919
901
  }
920
902
 
921
903
  if (state.linkAutoColorBy !== null) {
922
904
  // Auto add color to uncolored links
923
- autoColorObjects(state.graphData.links, accessorFn__default['default'](state.linkAutoColorBy), state.linkColor);
905
+ autoColorObjects(state.graphData.links, accessorFn__default["default"](state.linkAutoColorBy), state.linkColor);
924
906
  } // parse links
925
907
 
926
908
 
@@ -931,7 +913,7 @@ var CanvasForceGraph = Kapsule__default['default']({
931
913
 
932
914
  if (!state.isShadow) {
933
915
  // Add photon particles
934
- var linkParticlesAccessor = accessorFn__default['default'](state.linkDirectionalParticles);
916
+ var linkParticlesAccessor = accessorFn__default["default"](state.linkDirectionalParticles);
935
917
  state.graphData.links.forEach(function (link) {
936
918
  var numPhotons = Math.round(Math.abs(linkParticlesAccessor(link)));
937
919
 
@@ -1102,7 +1084,7 @@ function clearCanvas(ctx, width, height) {
1102
1084
  } //
1103
1085
 
1104
1086
 
1105
- var forceGraph = Kapsule__default['default']({
1087
+ var forceGraph = Kapsule__default["default"]({
1106
1088
  props: _objectSpread2({
1107
1089
  width: {
1108
1090
  "default": window.innerWidth,
@@ -1263,11 +1245,9 @@ var forceGraph = Kapsule__default['default']({
1263
1245
  triggerUpdate: false
1264
1246
  },
1265
1247
  onZoom: {
1266
- "default": function _default() {},
1267
1248
  triggerUpdate: false
1268
1249
  },
1269
1250
  onZoomEnd: {
1270
- "default": function _default() {},
1271
1251
  triggerUpdate: false
1272
1252
  },
1273
1253
  onRenderFramePre: {
@@ -1311,7 +1291,7 @@ var forceGraph = Kapsule__default['default']({
1311
1291
  // no animation
1312
1292
  setCenter(finalPos);
1313
1293
  } else {
1314
- new TWEEN__default['default'].Tween(getCenter()).to(finalPos, transitionDuration).easing(TWEEN__default['default'].Easing.Quadratic.Out).onUpdate(setCenter).start();
1294
+ new TWEEN__default["default"].Tween(getCenter()).to(finalPos, transitionDuration).easing(TWEEN__default["default"].Easing.Quadratic.Out).onUpdate(setCenter).start();
1315
1295
  }
1316
1296
 
1317
1297
  return this;
@@ -1344,11 +1324,11 @@ var forceGraph = Kapsule__default['default']({
1344
1324
  // no animation
1345
1325
  setZoom(k);
1346
1326
  } else {
1347
- new TWEEN__default['default'].Tween({
1327
+ new TWEEN__default["default"].Tween({
1348
1328
  k: getZoom()
1349
1329
  }).to({
1350
1330
  k: k
1351
- }, transitionDuration).easing(TWEEN__default['default'].Easing.Quadratic.Out).onUpdate(function (_ref6) {
1331
+ }, transitionDuration).easing(TWEEN__default["default"].Easing.Quadratic.Out).onUpdate(function (_ref6) {
1352
1332
  var k = _ref6.k;
1353
1333
  return setZoom(k);
1354
1334
  }).start();
@@ -1395,7 +1375,7 @@ var forceGraph = Kapsule__default['default']({
1395
1375
  var nodeFilter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
1396
1376
  return true;
1397
1377
  };
1398
- var getVal = accessorFn__default['default'](state.nodeVal);
1378
+ var getVal = accessorFn__default["default"](state.nodeVal);
1399
1379
 
1400
1380
  var getR = function getR(node) {
1401
1381
  return Math.sqrt(Math.max(0, getVal(node) || 1)) * state.nodeRelSize;
@@ -1450,11 +1430,13 @@ var forceGraph = Kapsule__default['default']({
1450
1430
  zoom: d3Zoom.zoom(),
1451
1431
  forceGraph: new CanvasForceGraph(),
1452
1432
  shadowGraph: new CanvasForceGraph().cooldownTicks(0).nodeColor('__indexColor').linkColor('__indexColor').isShadow(true),
1453
- colorTracker: new ColorTracker__default['default']() // indexed objects for rgb lookup
1433
+ colorTracker: new ColorTracker__default["default"]() // indexed objects for rgb lookup
1454
1434
 
1455
1435
  };
1456
1436
  },
1457
1437
  init: function init(domNode, state) {
1438
+ var _this = this;
1439
+
1458
1440
  // Wipe DOM
1459
1441
  domNode.innerHTML = ''; // Container anchor for canvas and tooltip
1460
1442
 
@@ -1548,9 +1530,12 @@ var forceGraph = Kapsule__default['default']({
1548
1530
  }
1549
1531
 
1550
1532
  delete obj.__initialDragPos;
1551
- state.forceGraph.d3AlphaTarget(0) // release engine low intensity
1552
- .resetCountdown(); // let the engine readjust after releasing fixed nodes
1553
- // drag cursor
1533
+
1534
+ if (state.forceGraph.d3AlphaTarget()) {
1535
+ state.forceGraph.d3AlphaTarget(0) // release engine low intensity
1536
+ .resetCountdown(); // let the engine readjust after releasing fixed nodes
1537
+ } // drag cursor
1538
+
1554
1539
 
1555
1540
  state.canvas.classList.remove('grabbable');
1556
1541
  state.isPointerDragging = false;
@@ -1577,10 +1562,11 @@ var forceGraph = Kapsule__default['default']({
1577
1562
  c.translate(t.x, t.y);
1578
1563
  c.scale(t.k, t.k);
1579
1564
  });
1580
- state.onZoom(_objectSpread2({}, t));
1565
+ state.onZoom && state.onZoom(_objectSpread2(_objectSpread2({}, t), _this.centerAt())); // report x,y coordinates relative to canvas center
1566
+
1581
1567
  state.needsRedraw = true;
1582
1568
  }).on('end', function (ev) {
1583
- return state.onZoomEnd(_objectSpread2({}, ev.transform));
1569
+ return state.onZoomEnd && state.onZoomEnd(_objectSpread2(_objectSpread2({}, ev.transform), _this.centerAt()));
1584
1570
  });
1585
1571
  adjustCanvasSize(state);
1586
1572
  state.forceGraph.onNeedsRedraw(function () {
@@ -1677,12 +1663,12 @@ var forceGraph = Kapsule__default['default']({
1677
1663
  state.forceGraph(ctx);
1678
1664
  state.shadowGraph(shadowCtx); //
1679
1665
 
1680
- var refreshShadowCanvas = throttle__default['default'](function () {
1666
+ var refreshShadowCanvas = throttle__default["default"](function () {
1681
1667
  // wipe canvas
1682
1668
  clearCanvas(shadowCtx, state.width, state.height); // Adjust link hover area
1683
1669
 
1684
1670
  state.shadowGraph.linkWidth(function (l) {
1685
- return accessorFn__default['default'](state.linkWidth)(l) + state.linkHoverPrecision;
1671
+ return accessorFn__default["default"](state.linkWidth)(l) + state.linkHoverPrecision;
1686
1672
  }); // redraw
1687
1673
 
1688
1674
  var t = d3Zoom.zoomTransform(state.canvas);
@@ -1719,7 +1705,7 @@ var forceGraph = Kapsule__default['default']({
1719
1705
  _fn2 && _fn2(obj.d, prevObjType === objType ? prevObj.d : null);
1720
1706
  }
1721
1707
 
1722
- var tooltipContent = obj ? accessorFn__default['default'](state["".concat(obj.type.toLowerCase(), "Label")])(obj.d) || '' : '';
1708
+ var tooltipContent = obj ? accessorFn__default["default"](state["".concat(obj.type.toLowerCase(), "Label")])(obj.d) || '' : '';
1723
1709
  toolTipElem.style.visibility = tooltipContent ? 'visible' : 'hidden';
1724
1710
  toolTipElem.innerHTML = tooltipContent; // set pointer if hovered object is clickable
1725
1711
 
@@ -1740,7 +1726,7 @@ var forceGraph = Kapsule__default['default']({
1740
1726
  state.onRenderFramePost && state.onRenderFramePost(ctx, globalScale);
1741
1727
  }
1742
1728
 
1743
- TWEEN__default['default'].update(); // update canvas animation tweens
1729
+ TWEEN__default["default"].update(); // update canvas animation tweens
1744
1730
 
1745
1731
  state.animationFrameRequestId = requestAnimationFrame(animate);
1746
1732
  })();
@@ -30,7 +30,7 @@ type DagMode = 'td' | 'bu' | 'lr' | 'rl' | 'radialout' | 'radialin';
30
30
 
31
31
  interface ForceFn {
32
32
  (alpha: number): void;
33
- initialize?: (nodes: NodeObject[]) => void;
33
+ initialize?: (nodes: NodeObject[], ...args: any[]) => void;
34
34
  [key: string]: any;
35
35
  }
36
36