@react-fabric/graph 1.0.0-beta.63 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/context/context.js +16 -0
- package/dist/cjs/graph/index.js +58 -381
- package/dist/cjs/index.js +25 -21
- package/dist/cjs/utils/edge.js +76 -0
- package/dist/cjs/utils/node.js +93 -0
- package/dist/cjs/utils/sdfFolder.js +107 -0
- package/dist/cjs/viewer/Graph.js +174 -0
- package/dist/esm/context/context.js +15 -0
- package/dist/esm/graph/index.js +59 -382
- package/dist/esm/index.js +24 -20
- package/dist/esm/utils/edge.js +75 -0
- package/dist/esm/utils/node.js +92 -0
- package/dist/esm/utils/sdfFolder.js +107 -0
- package/dist/esm/viewer/Graph.js +174 -0
- package/dist/types/context/context.d.ts +35 -0
- package/dist/types/graph/index.d.ts +47 -24
- package/dist/types/index.d.ts +28 -2
- package/dist/types/types/index.d.ts +124 -175
- package/dist/types/utils/edge.d.ts +28 -0
- package/dist/types/utils/node.d.ts +28 -0
- package/dist/types/utils/sdfFolder.d.ts +75 -0
- package/dist/types/viewer/Graph.d.ts +31 -0
- package/package.json +19 -25
- package/src/context/context.tsx +43 -0
- package/src/graph/index.ts +76 -399
- package/src/index.ts +24 -26
- package/src/types/index.ts +139 -185
- package/src/utils/edge.ts +65 -0
- package/src/utils/node.ts +105 -0
- package/src/utils/sdfFolder.ts +141 -0
- package/src/viewer/Graph.tsx +159 -0
- package/css/styles.css +0 -56
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -35
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -11
- package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
- package/dist/cjs/_virtual/elk-worker.js +0 -8
- package/dist/cjs/components/ContextMenu.js +0 -133
- package/dist/cjs/components/Provider.js +0 -103
- package/dist/cjs/components/Tools.js +0 -205
- package/dist/cjs/components/Viewer.js +0 -59
- package/dist/cjs/components/context.js +0 -34
- package/dist/cjs/constants/index.js +0 -16
- package/dist/cjs/hooks/sigmaDragSelect.js +0 -169
- package/dist/cjs/hooks/sigmaHilighter.js +0 -83
- package/dist/cjs/hooks/sigmaMouseActions.js +0 -145
- package/dist/cjs/hooks/useGraphology.js +0 -41
- package/dist/cjs/hooks/useSigma.js +0 -112
- package/dist/cjs/programs/arrow-head/frag.glsl.js +0 -8
- package/dist/cjs/programs/arrow-head/index.js +0 -142
- package/dist/cjs/programs/arrow-head/vert.glsl.js +0 -8
- package/dist/cjs/programs/edge-curve/drawLabel.js +0 -136
- package/dist/cjs/programs/edge-curve/frag.glsl.js +0 -8
- package/dist/cjs/programs/edge-curve/index.js +0 -157
- package/dist/cjs/programs/edge-curve/vert.glsl.js +0 -8
- package/dist/cjs/programs/edge-line/drawLabel.js +0 -70
- package/dist/cjs/programs/edge-line/frag.glsl.js +0 -8
- package/dist/cjs/programs/edge-line/index.js +0 -166
- package/dist/cjs/programs/edge-line/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-badge/factory.js +0 -250
- package/dist/cjs/programs/node-badge/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-badge/index.js +0 -33
- package/dist/cjs/programs/node-badge/texture.js +0 -455
- package/dist/cjs/programs/node-badge/vert.glsl.js +0 -19
- package/dist/cjs/programs/node-circle/base/drawHover.js +0 -71
- package/dist/cjs/programs/node-circle/base/drawLabel.js +0 -113
- package/dist/cjs/programs/node-circle/base/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-circle/base/index.js +0 -136
- package/dist/cjs/programs/node-circle/base/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-circle/index.js +0 -15
- package/dist/cjs/programs/node-image/factory.js +0 -224
- package/dist/cjs/programs/node-image/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-image/index.js +0 -14
- package/dist/cjs/programs/node-image/texture.js +0 -472
- package/dist/cjs/programs/node-image/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-rect/base/drawHover.js +0 -68
- package/dist/cjs/programs/node-rect/base/drawLabel.js +0 -107
- package/dist/cjs/programs/node-rect/base/frag.glsl.js +0 -8
- package/dist/cjs/programs/node-rect/base/index.js +0 -135
- package/dist/cjs/programs/node-rect/base/vert.glsl.js +0 -8
- package/dist/cjs/programs/node-rect/index.js +0 -15
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -34
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -13
- package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
- package/dist/esm/_virtual/elk-worker.js +0 -8
- package/dist/esm/components/ContextMenu.js +0 -133
- package/dist/esm/components/Provider.js +0 -103
- package/dist/esm/components/Tools.js +0 -205
- package/dist/esm/components/Viewer.js +0 -59
- package/dist/esm/components/context.js +0 -33
- package/dist/esm/constants/index.js +0 -16
- package/dist/esm/hooks/sigmaDragSelect.js +0 -169
- package/dist/esm/hooks/sigmaHilighter.js +0 -83
- package/dist/esm/hooks/sigmaMouseActions.js +0 -145
- package/dist/esm/hooks/useGraphology.js +0 -41
- package/dist/esm/hooks/useSigma.js +0 -112
- package/dist/esm/programs/arrow-head/frag.glsl.js +0 -8
- package/dist/esm/programs/arrow-head/index.js +0 -141
- package/dist/esm/programs/arrow-head/vert.glsl.js +0 -8
- package/dist/esm/programs/edge-curve/drawLabel.js +0 -136
- package/dist/esm/programs/edge-curve/frag.glsl.js +0 -8
- package/dist/esm/programs/edge-curve/index.js +0 -156
- package/dist/esm/programs/edge-curve/vert.glsl.js +0 -8
- package/dist/esm/programs/edge-line/drawLabel.js +0 -70
- package/dist/esm/programs/edge-line/frag.glsl.js +0 -8
- package/dist/esm/programs/edge-line/index.js +0 -166
- package/dist/esm/programs/edge-line/vert.glsl.js +0 -8
- package/dist/esm/programs/node-badge/factory.js +0 -250
- package/dist/esm/programs/node-badge/frag.glsl.js +0 -8
- package/dist/esm/programs/node-badge/index.js +0 -32
- package/dist/esm/programs/node-badge/texture.js +0 -445
- package/dist/esm/programs/node-badge/vert.glsl.js +0 -19
- package/dist/esm/programs/node-circle/base/drawHover.js +0 -71
- package/dist/esm/programs/node-circle/base/drawLabel.js +0 -113
- package/dist/esm/programs/node-circle/base/frag.glsl.js +0 -8
- package/dist/esm/programs/node-circle/base/index.js +0 -136
- package/dist/esm/programs/node-circle/base/vert.glsl.js +0 -8
- package/dist/esm/programs/node-circle/index.js +0 -15
- package/dist/esm/programs/node-image/factory.js +0 -224
- package/dist/esm/programs/node-image/frag.glsl.js +0 -8
- package/dist/esm/programs/node-image/index.js +0 -13
- package/dist/esm/programs/node-image/texture.js +0 -462
- package/dist/esm/programs/node-image/vert.glsl.js +0 -8
- package/dist/esm/programs/node-rect/base/drawHover.js +0 -68
- package/dist/esm/programs/node-rect/base/drawLabel.js +0 -107
- package/dist/esm/programs/node-rect/base/frag.glsl.js +0 -8
- package/dist/esm/programs/node-rect/base/index.js +0 -135
- package/dist/esm/programs/node-rect/base/vert.glsl.js +0 -8
- package/dist/esm/programs/node-rect/index.js +0 -15
- package/dist/types/components/ContextMenu.d.ts +0 -1
- package/dist/types/components/Provider.d.ts +0 -3
- package/dist/types/components/Tools.d.ts +0 -1
- package/dist/types/components/Viewer.d.ts +0 -2
- package/dist/types/components/context.d.ts +0 -17
- package/dist/types/constants/index.d.ts +0 -12
- package/dist/types/graph/layout.worker.d.ts +0 -1
- package/dist/types/hooks/sigmaDragSelect.d.ts +0 -8
- package/dist/types/hooks/sigmaHilighter.d.ts +0 -3
- package/dist/types/hooks/sigmaMouseActions.d.ts +0 -3
- package/dist/types/hooks/useGraphology.d.ts +0 -6
- package/dist/types/hooks/useSigma.d.ts +0 -8
- package/dist/types/i18n/index.d.ts +0 -0
- package/dist/types/programs/arrow-head/frag.glsl.d.ts +0 -2
- package/dist/types/programs/arrow-head/index.d.ts +0 -9
- package/dist/types/programs/arrow-head/vert.glsl.d.ts +0 -2
- package/dist/types/programs/edge-curve/drawLabel.d.ts +0 -6
- package/dist/types/programs/edge-curve/frag.glsl.d.ts +0 -2
- package/dist/types/programs/edge-curve/index.d.ts +0 -43
- package/dist/types/programs/edge-curve/vert.glsl.d.ts +0 -2
- package/dist/types/programs/edge-line/drawLabel.d.ts +0 -5
- package/dist/types/programs/edge-line/frag.glsl.d.ts +0 -2
- package/dist/types/programs/edge-line/index.d.ts +0 -11
- package/dist/types/programs/edge-line/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-badge/factory.d.ts +0 -27
- package/dist/types/programs/node-badge/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-badge/index.d.ts +0 -5
- package/dist/types/programs/node-badge/texture.d.ts +0 -102
- package/dist/types/programs/node-badge/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-circle/base/drawHover.d.ts +0 -8
- package/dist/types/programs/node-circle/base/drawLabel.d.ts +0 -8
- package/dist/types/programs/node-circle/base/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-circle/base/index.d.ts +0 -37
- package/dist/types/programs/node-circle/base/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-circle/index.d.ts +0 -11
- package/dist/types/programs/node-image/factory.d.ts +0 -25
- package/dist/types/programs/node-image/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-image/index.d.ts +0 -5
- package/dist/types/programs/node-image/texture.d.ts +0 -102
- package/dist/types/programs/node-image/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-rect/base/drawHover.d.ts +0 -8
- package/dist/types/programs/node-rect/base/drawLabel.d.ts +0 -8
- package/dist/types/programs/node-rect/base/frag.glsl.d.ts +0 -2
- package/dist/types/programs/node-rect/base/index.d.ts +0 -34
- package/dist/types/programs/node-rect/base/vert.glsl.d.ts +0 -2
- package/dist/types/programs/node-rect/index.d.ts +0 -11
- package/src/components/ContextMenu.tsx +0 -138
- package/src/components/Provider.tsx +0 -116
- package/src/components/Tools.tsx +0 -68
- package/src/components/Viewer.tsx +0 -75
- package/src/components/context.ts +0 -43
- package/src/constants/index.ts +0 -22
- package/src/graph/layout.worker.ts +0 -42
- package/src/hooks/sigmaDragSelect.ts +0 -219
- package/src/hooks/sigmaHilighter.ts +0 -107
- package/src/hooks/sigmaMouseActions.ts +0 -153
- package/src/hooks/useGraphology.ts +0 -31
- package/src/hooks/useSigma.ts +0 -118
- package/src/i18n/index.ts +0 -0
- package/src/programs/arrow-head/frag.glsl.ts +0 -18
- package/src/programs/arrow-head/index.ts +0 -156
- package/src/programs/arrow-head/vert.glsl.ts +0 -75
- package/src/programs/edge-curve/drawLabel.ts +0 -166
- package/src/programs/edge-curve/frag.glsl.ts +0 -86
- package/src/programs/edge-curve/index.ts +0 -156
- package/src/programs/edge-curve/vert.glsl.ts +0 -110
- package/src/programs/edge-line/drawLabel.ts +0 -113
- package/src/programs/edge-line/frag.glsl.ts +0 -34
- package/src/programs/edge-line/index.ts +0 -163
- package/src/programs/edge-line/vert.glsl.ts +0 -104
- package/src/programs/node-badge/factory.ts +0 -325
- package/src/programs/node-badge/frag.glsl.ts +0 -79
- package/src/programs/node-badge/index.ts +0 -35
- package/src/programs/node-badge/texture.ts +0 -425
- package/src/programs/node-badge/vert.glsl.ts +0 -99
- package/src/programs/node-circle/base/drawHover.ts +0 -80
- package/src/programs/node-circle/base/drawLabel.ts +0 -145
- package/src/programs/node-circle/base/frag.glsl.ts +0 -72
- package/src/programs/node-circle/base/index.ts +0 -100
- package/src/programs/node-circle/base/vert.glsl.ts +0 -83
- package/src/programs/node-circle/index.ts +0 -19
- package/src/programs/node-image/factory.ts +0 -299
- package/src/programs/node-image/frag.glsl.ts +0 -97
- package/src/programs/node-image/index.ts +0 -7
- package/src/programs/node-image/texture.ts +0 -435
- package/src/programs/node-image/vert.glsl.ts +0 -60
- package/src/programs/node-rect/base/drawHover.ts +0 -77
- package/src/programs/node-rect/base/drawLabel.ts +0 -149
- package/src/programs/node-rect/base/frag.glsl.ts +0 -67
- package/src/programs/node-rect/base/index.ts +0 -107
- package/src/programs/node-rect/base/vert.glsl.ts +0 -87
- package/src/programs/node-rect/index.ts +0 -19
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import _toConsumableArray from '@babel/runtime/helpers/toConsumableArray';
|
|
4
|
+
import _defineProperty from '@babel/runtime/helpers/defineProperty';
|
|
5
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
6
|
+
import { isArray, isObject } from '@react-fabric/utilities';
|
|
7
|
+
import { DEFAULT_STYLES } from 'sigma/types';
|
|
8
|
+
|
|
9
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
10
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
11
|
+
var PIE_PALETTE = ["#2ad4ac", "#ea5353", "#39a1e6", "#f8a850", "#B64E84", "#92c652", "#ac7dc4", "#2c91bd", "#f8d653", "#D16082", "#52c8d7", "#475065"];
|
|
12
|
+
function nodeReducer(_, node, attrs) {
|
|
13
|
+
var _attrs$segments;
|
|
14
|
+
if (isArray(attrs.segments) && (_attrs$segments = attrs.segments) !== null && _attrs$segments !== void 0 && _attrs$segments.length) {
|
|
15
|
+
// @ts-expect-error ignore
|
|
16
|
+
node.pieSize = 0.25;
|
|
17
|
+
attrs.segments.forEach(function (seg, i) {
|
|
18
|
+
if (typeof seg === "string") {
|
|
19
|
+
// @ts-expect-error ignore
|
|
20
|
+
node["slice_".concat(i)] = 1 / attrs.segments.length;
|
|
21
|
+
// @ts-expect-error ignore
|
|
22
|
+
node["color_".concat(i)] = seg;
|
|
23
|
+
}
|
|
24
|
+
if (typeof seg === "number") {
|
|
25
|
+
// @ts-expect-error ignore
|
|
26
|
+
node["slice_".concat(i)] = seg;
|
|
27
|
+
// @ts-expect-error ignore
|
|
28
|
+
node["color_".concat(i)] = PIE_PALETTE[i];
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
if (isObject(attrs.segments)) {
|
|
33
|
+
// @ts-expect-error ignore
|
|
34
|
+
node.pieSize = 0.25;
|
|
35
|
+
Object.entries(attrs.segments).forEach(function (_ref, i) {
|
|
36
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
37
|
+
color = _ref2[0],
|
|
38
|
+
size = _ref2[1];
|
|
39
|
+
// @ts-expect-error ignore
|
|
40
|
+
node["slice_".concat(i)] = size;
|
|
41
|
+
// @ts-expect-error ignore
|
|
42
|
+
node["color_".concat(i)] = color;
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (attrs.group) {
|
|
46
|
+
// @ts-expect-error ignore
|
|
47
|
+
node.shape = "folder";
|
|
48
|
+
}
|
|
49
|
+
return node;
|
|
50
|
+
}
|
|
51
|
+
function defaultNodeStyles() {
|
|
52
|
+
var isDark = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
|
|
53
|
+
return [DEFAULT_STYLES.nodes, _objectSpread(_objectSpread({
|
|
54
|
+
size: {
|
|
55
|
+
attribute: "size",
|
|
56
|
+
defaultValue: 8
|
|
57
|
+
},
|
|
58
|
+
shape: {
|
|
59
|
+
attribute: "shape",
|
|
60
|
+
defaultValue: "circle"
|
|
61
|
+
},
|
|
62
|
+
color: {
|
|
63
|
+
attribute: "color",
|
|
64
|
+
defaultValue: isDark ? "#1e293b" : "#e2e8f0"
|
|
65
|
+
},
|
|
66
|
+
border: {
|
|
67
|
+
attribute: "border",
|
|
68
|
+
defaultValue: 0
|
|
69
|
+
},
|
|
70
|
+
borderColor: {
|
|
71
|
+
attribute: "borderColor",
|
|
72
|
+
defaultValue: "#64748b"
|
|
73
|
+
},
|
|
74
|
+
image: {
|
|
75
|
+
attribute: "image",
|
|
76
|
+
defaultValue: "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
|
|
77
|
+
},
|
|
78
|
+
pieSize: 0
|
|
79
|
+
}, Object.assign.apply(Object, [{}].concat(_toConsumableArray(Array.from({
|
|
80
|
+
length: 12
|
|
81
|
+
}).fill(0).map(function (_, i) {
|
|
82
|
+
return _defineProperty(_defineProperty({}, "slice_".concat(i), i === 0 ? 1 : 0), "color_".concat(i), "#888");
|
|
83
|
+
}))))), {}, {
|
|
84
|
+
labelPosition: "below",
|
|
85
|
+
labelColor: isDark ? "#fff" : "#333",
|
|
86
|
+
fillColor: isDark ? "#111" : "#fff",
|
|
87
|
+
backdropColor: isDark ? "#333" : "#fff",
|
|
88
|
+
backdropShadowColor: isDark ? "rgba(0, 0, 0, 0.5)" : "rgba(0, 0, 0, 0.3)"
|
|
89
|
+
})];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export { defaultNodeStyles, nodeReducer };
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { GLSL_ROTATE_2D } from 'sigma/rendering';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* React Fabric
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @license MIT
|
|
9
|
+
* @copyright 2024 Adarsh Pastakia
|
|
10
|
+
*
|
|
11
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
12
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
13
|
+
* in the Software without restriction, including without limitation the rights
|
|
14
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
15
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
16
|
+
* furnished to do so, subject to the following conditions:
|
|
17
|
+
*
|
|
18
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
19
|
+
* copies or substantial portions of the Software.
|
|
20
|
+
*
|
|
21
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
22
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
23
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
24
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
25
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
26
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
27
|
+
* SOFTWARE.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Options for the {@link sdfFolder} shape.
|
|
33
|
+
*
|
|
34
|
+
* @property cornerRadius - Corner rounding as a fraction of the node size.
|
|
35
|
+
* `0` gives sharp corners; larger values round the body and the tab. May
|
|
36
|
+
* also be a per-node attribute via `{ attribute, default }`.
|
|
37
|
+
* @property rotation - Rotation of the folder, in radians, applied before the
|
|
38
|
+
* distance field is evaluated. May also be a per-node attribute via
|
|
39
|
+
* `{ attribute, default }`.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolves a {@link ValueSource} to a plain number, falling back to
|
|
44
|
+
* `defaultValue` when the value is attribute-sourced or missing.
|
|
45
|
+
*/
|
|
46
|
+
function resolveNumber(value, defaultValue) {
|
|
47
|
+
return typeof value === "number" ? value : defaultValue;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Creates a folder SDF shape.
|
|
52
|
+
*
|
|
53
|
+
* The outline is the union of two rounded rectangles: a wide **body** and a
|
|
54
|
+
* smaller **tab** flap that rises above the body's top-left corner — the shape
|
|
55
|
+
* of a classic manila folder. Each panel is an Inigo Quilez rounded-box
|
|
56
|
+
* distance field (https://iquilezles.org/articles/distfunctions2d/) and the
|
|
57
|
+
* union is the closer of the two distances.
|
|
58
|
+
*
|
|
59
|
+
* @param options - Configuration for the folder
|
|
60
|
+
* @returns Folder SDF shape definition
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* // Sharp folder with a top-left tab
|
|
65
|
+
* const folder = sdfFolder();
|
|
66
|
+
*
|
|
67
|
+
* // Rounded folder
|
|
68
|
+
* const rounded = sdfFolder({ cornerRadius: 0.12 });
|
|
69
|
+
*
|
|
70
|
+
* // Per-node folder, driven by attributes
|
|
71
|
+
* const perNode = sdfFolder({
|
|
72
|
+
* cornerRadius: { attribute: "folderCorner" },
|
|
73
|
+
* rotation: { attribute: "folderRotation" },
|
|
74
|
+
* });
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
function sdfFolder(options) {
|
|
78
|
+
var _ref = {},
|
|
79
|
+
cornerRadius = _ref.cornerRadius,
|
|
80
|
+
rotation = _ref.rotation;
|
|
81
|
+
var cornerRadiusValue = resolveNumber(cornerRadius, 0);
|
|
82
|
+
var rotationValue = resolveNumber(rotation, 0);
|
|
83
|
+
|
|
84
|
+
// SDF for a folder: the union of a wide body panel and a top-left tab flap,
|
|
85
|
+
// each an Inigo Quilez rounded box. The GLSL_ROTATE_2D helper is prepended so
|
|
86
|
+
// `rotation` can be applied; the framework deduplicates it across shapes.
|
|
87
|
+
var glsl = "".concat(GLSL_ROTATE_2D, "\nfloat sdf_folder(vec2 uv, float size, float cornerRadius, float rotation) {\n // Apply rotation if needed\n vec2 p = uv;\n if (rotation != 0.0) {\n p = rotate2D(rotation) * p;\n }\n\n // A folder is the union of a wide body panel and a smaller tab flap that\n // rises above the body's top-left. Each panel is a rounded box; the union is\n // the closer of the two distances.\n float s = size;\n float cr = cornerRadius * s;\n\n // Body: the main panel, wide and sitting just below the origin.\n vec2 bodyD = abs(p - vec2(0.0, -0.05 * s)) - vec2(0.72 * s, 0.50 * s) + cr;\n float body = length(max(bodyD, 0.0)) + min(max(bodyD.x, bodyD.y), 0.0) - cr;\n\n // Tab: the top-left flap, its top edge poking above the body.\n vec2 tabD = abs(p - vec2(-0.43 * s, 0.44 * s)) - vec2(0.29 * s, 0.20 * s) + cr;\n float tab = length(max(tabD, 0.0)) + min(max(tabD.x, tabD.y), 0.0) - cr;\n\n // Union of the two panels.\n return min(body, tab);\n}\n");
|
|
88
|
+
return {
|
|
89
|
+
name: "folder",
|
|
90
|
+
glsl: glsl,
|
|
91
|
+
uniforms: [{
|
|
92
|
+
name: "u_cornerRadius",
|
|
93
|
+
type: "float",
|
|
94
|
+
value: cornerRadiusValue
|
|
95
|
+
}, {
|
|
96
|
+
name: "u_rotation",
|
|
97
|
+
type: "float",
|
|
98
|
+
value: rotationValue
|
|
99
|
+
}],
|
|
100
|
+
// The outline reaches out to the tab's top-left corner (circumradius
|
|
101
|
+
// ~0.96 of the node size); SQRT1_2 keeps the bounding quad comfortably
|
|
102
|
+
// larger, matching the square and diamond shapes.
|
|
103
|
+
inradiusFactor: Math.SQRT1_2
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export { sdfFolder };
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
4
|
+
import { useIsDark, Layout } from '@react-fabric/core';
|
|
5
|
+
import { layerBorder } from '@sigma/node-border';
|
|
6
|
+
import { layerImage } from '@sigma/node-image';
|
|
7
|
+
import { layerPiechart } from '@sigma/node-piechart';
|
|
8
|
+
import { fitViewportToNodes } from '@sigma/utils';
|
|
9
|
+
import { useRef, useState, useEffect, useLayoutEffect } from 'react';
|
|
10
|
+
import { Sigma } from 'sigma';
|
|
11
|
+
import { sdfCircle, sdfSquare, sdfTriangle, sdfDiamond, layerPlain, layerDashed, extremityArrow, pathLine, pathCurved, pathStepCurved, pathCurvedS } from 'sigma/rendering';
|
|
12
|
+
import { Provider } from '../context/context.js';
|
|
13
|
+
import { edgeReducer, defaultEdgeStyles } from '../utils/edge.js';
|
|
14
|
+
import { nodeReducer, defaultNodeStyles } from '../utils/node.js';
|
|
15
|
+
import { sdfFolder } from '../utils/sdfFolder.js';
|
|
16
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
17
|
+
|
|
18
|
+
function GraphViewer(_ref) {
|
|
19
|
+
var data = _ref.data,
|
|
20
|
+
children = _ref.children;
|
|
21
|
+
var containerRef = useRef(null);
|
|
22
|
+
var isDark = useIsDark();
|
|
23
|
+
var _useState = useState(),
|
|
24
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
25
|
+
sigma = _useState2[0],
|
|
26
|
+
setSigma = _useState2[1];
|
|
27
|
+
useEffect(function () {
|
|
28
|
+
if (containerRef.current) {
|
|
29
|
+
var _sigma = new Sigma(data, containerRef.current, {
|
|
30
|
+
settings: {
|
|
31
|
+
autoRescale: false,
|
|
32
|
+
autoRescaleContent: "nodes",
|
|
33
|
+
stagePadding: 40,
|
|
34
|
+
enableNodeDrag: true,
|
|
35
|
+
enableEdgeEvents: true,
|
|
36
|
+
renderEdgeLabels: true,
|
|
37
|
+
cameraPanBoundaries: true
|
|
38
|
+
},
|
|
39
|
+
edgeReducer: edgeReducer,
|
|
40
|
+
nodeReducer: nodeReducer,
|
|
41
|
+
styles: {
|
|
42
|
+
edges: defaultEdgeStyles(isDark),
|
|
43
|
+
nodes: defaultNodeStyles(isDark)
|
|
44
|
+
},
|
|
45
|
+
primitives: {
|
|
46
|
+
edges: {
|
|
47
|
+
paths: [pathLine(), pathCurved(), pathStepCurved(), pathCurvedS()],
|
|
48
|
+
extremities: [extremityArrow()],
|
|
49
|
+
label: {
|
|
50
|
+
fontSizeMode: "fixed"
|
|
51
|
+
},
|
|
52
|
+
layers: [layerPlain({
|
|
53
|
+
color: {
|
|
54
|
+
attribute: "color"
|
|
55
|
+
}
|
|
56
|
+
}), layerDashed({
|
|
57
|
+
dashColor: {
|
|
58
|
+
attribute: "dashColor"
|
|
59
|
+
},
|
|
60
|
+
dashSize: {
|
|
61
|
+
attribute: "dashSize"
|
|
62
|
+
},
|
|
63
|
+
gapSize: {
|
|
64
|
+
attribute: "gapSize"
|
|
65
|
+
}
|
|
66
|
+
})]
|
|
67
|
+
},
|
|
68
|
+
nodes: {
|
|
69
|
+
shapes: [sdfCircle(), sdfSquare(), sdfTriangle(), sdfDiamond(), sdfFolder()],
|
|
70
|
+
layers: [layerPiechart({
|
|
71
|
+
slices: Array.from({
|
|
72
|
+
length: 12
|
|
73
|
+
}).fill(0).map(function (_, i) {
|
|
74
|
+
return {
|
|
75
|
+
color: {
|
|
76
|
+
attribute: "color_".concat(i)
|
|
77
|
+
},
|
|
78
|
+
value: {
|
|
79
|
+
attribute: "slice_".concat(i)
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
})
|
|
83
|
+
}), layerBorder({
|
|
84
|
+
borders: [{
|
|
85
|
+
mode: "relative",
|
|
86
|
+
size: 0,
|
|
87
|
+
color: {
|
|
88
|
+
attribute: "color"
|
|
89
|
+
}
|
|
90
|
+
}, {
|
|
91
|
+
size: {
|
|
92
|
+
attribute: "border"
|
|
93
|
+
},
|
|
94
|
+
color: {
|
|
95
|
+
attribute: "borderColor"
|
|
96
|
+
}
|
|
97
|
+
}, {
|
|
98
|
+
mode: "pixels",
|
|
99
|
+
size: 1,
|
|
100
|
+
color: {
|
|
101
|
+
attribute: "fillColor"
|
|
102
|
+
}
|
|
103
|
+
}, {
|
|
104
|
+
size: {
|
|
105
|
+
attribute: "pieSize",
|
|
106
|
+
"default": 0
|
|
107
|
+
},
|
|
108
|
+
color: "transparent",
|
|
109
|
+
fill: false
|
|
110
|
+
}, {
|
|
111
|
+
mode: "pixels",
|
|
112
|
+
size: 4,
|
|
113
|
+
color: {
|
|
114
|
+
attribute: "fillColor"
|
|
115
|
+
}
|
|
116
|
+
}, {
|
|
117
|
+
color: {
|
|
118
|
+
attribute: "color"
|
|
119
|
+
},
|
|
120
|
+
fill: true
|
|
121
|
+
}]
|
|
122
|
+
}), layerImage({
|
|
123
|
+
padding: 0.5
|
|
124
|
+
})]
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
setSigma(_sigma);
|
|
129
|
+
var fitToGraph = function fitToGraph() {
|
|
130
|
+
requestAnimationFrame(function () {
|
|
131
|
+
void fitViewportToNodes(_sigma, data.nodes(), {
|
|
132
|
+
animate: true
|
|
133
|
+
}).then(function () {
|
|
134
|
+
_sigma.getCamera().setState({
|
|
135
|
+
ratio: _sigma.getCamera().ratio * 1.15 // Multiplier adds a proportional buffer from the canvas edge
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
};
|
|
140
|
+
data.on("layoutDone", fitToGraph);
|
|
141
|
+
return function () {
|
|
142
|
+
if (_sigma) {
|
|
143
|
+
_sigma.kill();
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
// eslint-disable-next-line @eslint-react/exhaustive-deps
|
|
148
|
+
}, []);
|
|
149
|
+
useLayoutEffect(function () {
|
|
150
|
+
if (sigma) {
|
|
151
|
+
// @ts-expect-error silent update graph styles without re-render
|
|
152
|
+
sigma.stylesDeclaration = {
|
|
153
|
+
edges: defaultEdgeStyles(isDark),
|
|
154
|
+
nodes: defaultNodeStyles(isDark)
|
|
155
|
+
};
|
|
156
|
+
sigma.refresh();
|
|
157
|
+
}
|
|
158
|
+
// eslint-disable-next-line @eslint-react/exhaustive-deps
|
|
159
|
+
}, [isDark]);
|
|
160
|
+
return /*#__PURE__*/jsx(Provider, {
|
|
161
|
+
value: {
|
|
162
|
+
data: data,
|
|
163
|
+
sigma: sigma
|
|
164
|
+
},
|
|
165
|
+
children: /*#__PURE__*/jsxs(Layout, {
|
|
166
|
+
children: [/*#__PURE__*/jsx("div", {
|
|
167
|
+
className: "area-content overflow-hidden",
|
|
168
|
+
ref: containerRef
|
|
169
|
+
}), children]
|
|
170
|
+
})
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export { GraphViewer };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
import type Sigma from "sigma";
|
|
26
|
+
import type { Graph } from "../graph";
|
|
27
|
+
import type { EdgeAttributes, NodeAttributes } from "../types";
|
|
28
|
+
interface ContextType<N extends KeyValue = KeyValue, E extends KeyValue = KeyValue> {
|
|
29
|
+
data: Graph<N, E>;
|
|
30
|
+
sigma: Sigma<NodeAttributes<N>, EdgeAttributes<E>>;
|
|
31
|
+
}
|
|
32
|
+
export declare const Context: import("react").Context<ContextType<KeyValue<any>, KeyValue<any>>>;
|
|
33
|
+
export declare const useGraph: <N extends KeyValue = KeyValue, E extends KeyValue = KeyValue>() => ContextType<N, E>;
|
|
34
|
+
export declare const Provider: <N extends KeyValue = KeyValue, E extends KeyValue = KeyValue>(props: AnyObject) => import("react").JSX.Element;
|
|
35
|
+
export {};
|
|
@@ -1,35 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
1
25
|
import Graphology from "graphology";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
interface ExtendedEvents extends GraphEvents {
|
|
26
|
+
import type { GraphEvents } from "graphology-types";
|
|
27
|
+
import type { EdgeAttributes, InternalEdge, InternalNode, NodeAttributes, RawGraph } from "../types";
|
|
28
|
+
interface ExtendedEvents<N extends KeyValue = KeyValue, E extends KeyValue = KeyValue> extends GraphEvents<InternalNode<N>, InternalEdge<E>> {
|
|
6
29
|
nodesLoaded: (nodes: string[]) => void;
|
|
7
30
|
nodesDropped: (nodes: string[]) => void;
|
|
8
31
|
nodesSelected: (nodes: string[]) => void;
|
|
9
32
|
layoutRunning: (isRunning: boolean) => void;
|
|
10
33
|
layoutDone: () => void;
|
|
11
34
|
}
|
|
12
|
-
export declare class Graph<N = KeyValue, E = KeyValue> extends Graphology<
|
|
13
|
-
constructor(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
groupNodes(key: string, nodes: string[], attributesOrNodeReducer?: NodeAttributes<N> | ((attributes: Array<NodeAttributes<N>>) => NodeAttributes<N>), edgeReducer?: (edges: RawGraph<N, E>["edges"]) => RawGraph<N, E>["edges"]): this | undefined;
|
|
19
|
-
ungroupNode(node: string): this | undefined;
|
|
20
|
-
toggleExpanded(node: string, force?: boolean): this;
|
|
21
|
-
import(data: RawGraph<N, E> | Graph<N, E>, merge?: boolean): this;
|
|
22
|
-
circularLayout(): this;
|
|
23
|
-
private _timer;
|
|
24
|
-
private _worker?;
|
|
25
|
-
forceLayout(settings?: ForceAtlas2Settings): this;
|
|
26
|
-
private elk;
|
|
27
|
-
elkLayout(type: string): Promise<void>;
|
|
28
|
-
dropNodes(nodes: string[]): void;
|
|
35
|
+
export declare class Graph<N extends KeyValue = KeyValue, E extends KeyValue = KeyValue> extends Graphology<NodeAttributes<N>, EdgeAttributes<E>> {
|
|
36
|
+
constructor();
|
|
37
|
+
importGraph(data: RawGraph<N, E>, applyLayout?: boolean): this;
|
|
38
|
+
on<Event extends keyof ExtendedEvents<N, E>>(type: Event, listener: ExtendedEvents<N, E>[Event]): this;
|
|
39
|
+
off<Event extends keyof ExtendedEvents<N, E>>(type: Event, listener: ExtendedEvents<N, E>[Event]): this;
|
|
40
|
+
emit<Event extends keyof ExtendedEvents<N, E>>(type: Event, ...args: Parameters<ExtendedEvents<N, E>[Event]>): boolean;
|
|
29
41
|
/**
|
|
30
|
-
*
|
|
42
|
+
* @deprecated
|
|
43
|
+
* use `importGraph` instead
|
|
31
44
|
*/
|
|
32
|
-
|
|
33
|
-
|
|
45
|
+
import(): this;
|
|
46
|
+
/**
|
|
47
|
+
* @deprecated
|
|
48
|
+
* use `exportGraph` instead
|
|
49
|
+
*/
|
|
50
|
+
export(): {
|
|
51
|
+
nodes: never[];
|
|
52
|
+
edges: never[];
|
|
53
|
+
attributes: {};
|
|
54
|
+
options: {};
|
|
55
|
+
};
|
|
56
|
+
private enrichNodeAttributes;
|
|
34
57
|
}
|
|
35
58
|
export {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* React Fabric
|
|
3
|
+
* @version 1.0.0
|
|
4
|
+
* @license MIT
|
|
5
|
+
* @copyright 2024 Adarsh Pastakia
|
|
6
|
+
*
|
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
* furnished to do so, subject to the following conditions:
|
|
13
|
+
*
|
|
14
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
15
|
+
* copies or substantial portions of the Software.
|
|
16
|
+
*
|
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
23
|
+
* SOFTWARE.
|
|
24
|
+
*/
|
|
25
|
+
export declare const GRAPH_PACKAGE = "@react-fabric/graph";
|
|
26
|
+
export declare const GRAPH_VERSION = "1.0.0";
|
|
2
27
|
export { Graph } from "./graph";
|
|
3
|
-
export type { EdgeAttributes,
|
|
28
|
+
export type { EdgeAttributes, InternalEdge, InternalNode, NodeAttributes, PublicEdge, PublicNode, RawGraph } from "./types";
|
|
29
|
+
export { GraphViewer } from "./viewer/Graph";
|