@react-fabric/graph 1.0.0-beta.63 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/dist/cjs/context/context.js +16 -0
  2. package/dist/cjs/graph/index.js +58 -381
  3. package/dist/cjs/index.js +25 -21
  4. package/dist/cjs/utils/edge.js +76 -0
  5. package/dist/cjs/utils/node.js +93 -0
  6. package/dist/cjs/utils/sdfFolder.js +107 -0
  7. package/dist/cjs/viewer/Graph.js +174 -0
  8. package/dist/esm/context/context.js +15 -0
  9. package/dist/esm/graph/index.js +59 -382
  10. package/dist/esm/index.js +24 -20
  11. package/dist/esm/utils/edge.js +75 -0
  12. package/dist/esm/utils/node.js +92 -0
  13. package/dist/esm/utils/sdfFolder.js +107 -0
  14. package/dist/esm/viewer/Graph.js +174 -0
  15. package/dist/types/context/context.d.ts +35 -0
  16. package/dist/types/graph/index.d.ts +47 -24
  17. package/dist/types/index.d.ts +28 -2
  18. package/dist/types/types/index.d.ts +124 -175
  19. package/dist/types/utils/edge.d.ts +28 -0
  20. package/dist/types/utils/node.d.ts +28 -0
  21. package/dist/types/utils/sdfFolder.d.ts +75 -0
  22. package/dist/types/viewer/Graph.d.ts +31 -0
  23. package/package.json +19 -25
  24. package/src/context/context.tsx +43 -0
  25. package/src/graph/index.ts +76 -399
  26. package/src/index.ts +24 -26
  27. package/src/types/index.ts +139 -185
  28. package/src/utils/edge.ts +65 -0
  29. package/src/utils/node.ts +105 -0
  30. package/src/utils/sdfFolder.ts +141 -0
  31. package/src/viewer/Graph.tsx +159 -0
  32. package/css/styles.css +0 -56
  33. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
  34. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
  35. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -35
  36. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -11
  37. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
  38. package/dist/cjs/_virtual/elk-worker.js +0 -8
  39. package/dist/cjs/components/ContextMenu.js +0 -133
  40. package/dist/cjs/components/Provider.js +0 -103
  41. package/dist/cjs/components/Tools.js +0 -205
  42. package/dist/cjs/components/Viewer.js +0 -59
  43. package/dist/cjs/components/context.js +0 -34
  44. package/dist/cjs/constants/index.js +0 -16
  45. package/dist/cjs/hooks/sigmaDragSelect.js +0 -169
  46. package/dist/cjs/hooks/sigmaHilighter.js +0 -83
  47. package/dist/cjs/hooks/sigmaMouseActions.js +0 -145
  48. package/dist/cjs/hooks/useGraphology.js +0 -41
  49. package/dist/cjs/hooks/useSigma.js +0 -112
  50. package/dist/cjs/programs/arrow-head/frag.glsl.js +0 -8
  51. package/dist/cjs/programs/arrow-head/index.js +0 -142
  52. package/dist/cjs/programs/arrow-head/vert.glsl.js +0 -8
  53. package/dist/cjs/programs/edge-curve/drawLabel.js +0 -136
  54. package/dist/cjs/programs/edge-curve/frag.glsl.js +0 -8
  55. package/dist/cjs/programs/edge-curve/index.js +0 -157
  56. package/dist/cjs/programs/edge-curve/vert.glsl.js +0 -8
  57. package/dist/cjs/programs/edge-line/drawLabel.js +0 -70
  58. package/dist/cjs/programs/edge-line/frag.glsl.js +0 -8
  59. package/dist/cjs/programs/edge-line/index.js +0 -166
  60. package/dist/cjs/programs/edge-line/vert.glsl.js +0 -8
  61. package/dist/cjs/programs/node-badge/factory.js +0 -250
  62. package/dist/cjs/programs/node-badge/frag.glsl.js +0 -8
  63. package/dist/cjs/programs/node-badge/index.js +0 -33
  64. package/dist/cjs/programs/node-badge/texture.js +0 -455
  65. package/dist/cjs/programs/node-badge/vert.glsl.js +0 -19
  66. package/dist/cjs/programs/node-circle/base/drawHover.js +0 -71
  67. package/dist/cjs/programs/node-circle/base/drawLabel.js +0 -113
  68. package/dist/cjs/programs/node-circle/base/frag.glsl.js +0 -8
  69. package/dist/cjs/programs/node-circle/base/index.js +0 -136
  70. package/dist/cjs/programs/node-circle/base/vert.glsl.js +0 -8
  71. package/dist/cjs/programs/node-circle/index.js +0 -15
  72. package/dist/cjs/programs/node-image/factory.js +0 -224
  73. package/dist/cjs/programs/node-image/frag.glsl.js +0 -8
  74. package/dist/cjs/programs/node-image/index.js +0 -14
  75. package/dist/cjs/programs/node-image/texture.js +0 -472
  76. package/dist/cjs/programs/node-image/vert.glsl.js +0 -8
  77. package/dist/cjs/programs/node-rect/base/drawHover.js +0 -68
  78. package/dist/cjs/programs/node-rect/base/drawLabel.js +0 -107
  79. package/dist/cjs/programs/node-rect/base/frag.glsl.js +0 -8
  80. package/dist/cjs/programs/node-rect/base/index.js +0 -135
  81. package/dist/cjs/programs/node-rect/base/vert.glsl.js +0 -8
  82. package/dist/cjs/programs/node-rect/index.js +0 -15
  83. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +0 -14
  84. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +0 -9
  85. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +0 -34
  86. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +0 -13
  87. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +0 -20
  88. package/dist/esm/_virtual/elk-worker.js +0 -8
  89. package/dist/esm/components/ContextMenu.js +0 -133
  90. package/dist/esm/components/Provider.js +0 -103
  91. package/dist/esm/components/Tools.js +0 -205
  92. package/dist/esm/components/Viewer.js +0 -59
  93. package/dist/esm/components/context.js +0 -33
  94. package/dist/esm/constants/index.js +0 -16
  95. package/dist/esm/hooks/sigmaDragSelect.js +0 -169
  96. package/dist/esm/hooks/sigmaHilighter.js +0 -83
  97. package/dist/esm/hooks/sigmaMouseActions.js +0 -145
  98. package/dist/esm/hooks/useGraphology.js +0 -41
  99. package/dist/esm/hooks/useSigma.js +0 -112
  100. package/dist/esm/programs/arrow-head/frag.glsl.js +0 -8
  101. package/dist/esm/programs/arrow-head/index.js +0 -141
  102. package/dist/esm/programs/arrow-head/vert.glsl.js +0 -8
  103. package/dist/esm/programs/edge-curve/drawLabel.js +0 -136
  104. package/dist/esm/programs/edge-curve/frag.glsl.js +0 -8
  105. package/dist/esm/programs/edge-curve/index.js +0 -156
  106. package/dist/esm/programs/edge-curve/vert.glsl.js +0 -8
  107. package/dist/esm/programs/edge-line/drawLabel.js +0 -70
  108. package/dist/esm/programs/edge-line/frag.glsl.js +0 -8
  109. package/dist/esm/programs/edge-line/index.js +0 -166
  110. package/dist/esm/programs/edge-line/vert.glsl.js +0 -8
  111. package/dist/esm/programs/node-badge/factory.js +0 -250
  112. package/dist/esm/programs/node-badge/frag.glsl.js +0 -8
  113. package/dist/esm/programs/node-badge/index.js +0 -32
  114. package/dist/esm/programs/node-badge/texture.js +0 -445
  115. package/dist/esm/programs/node-badge/vert.glsl.js +0 -19
  116. package/dist/esm/programs/node-circle/base/drawHover.js +0 -71
  117. package/dist/esm/programs/node-circle/base/drawLabel.js +0 -113
  118. package/dist/esm/programs/node-circle/base/frag.glsl.js +0 -8
  119. package/dist/esm/programs/node-circle/base/index.js +0 -136
  120. package/dist/esm/programs/node-circle/base/vert.glsl.js +0 -8
  121. package/dist/esm/programs/node-circle/index.js +0 -15
  122. package/dist/esm/programs/node-image/factory.js +0 -224
  123. package/dist/esm/programs/node-image/frag.glsl.js +0 -8
  124. package/dist/esm/programs/node-image/index.js +0 -13
  125. package/dist/esm/programs/node-image/texture.js +0 -462
  126. package/dist/esm/programs/node-image/vert.glsl.js +0 -8
  127. package/dist/esm/programs/node-rect/base/drawHover.js +0 -68
  128. package/dist/esm/programs/node-rect/base/drawLabel.js +0 -107
  129. package/dist/esm/programs/node-rect/base/frag.glsl.js +0 -8
  130. package/dist/esm/programs/node-rect/base/index.js +0 -135
  131. package/dist/esm/programs/node-rect/base/vert.glsl.js +0 -8
  132. package/dist/esm/programs/node-rect/index.js +0 -15
  133. package/dist/types/components/ContextMenu.d.ts +0 -1
  134. package/dist/types/components/Provider.d.ts +0 -3
  135. package/dist/types/components/Tools.d.ts +0 -1
  136. package/dist/types/components/Viewer.d.ts +0 -2
  137. package/dist/types/components/context.d.ts +0 -17
  138. package/dist/types/constants/index.d.ts +0 -12
  139. package/dist/types/graph/layout.worker.d.ts +0 -1
  140. package/dist/types/hooks/sigmaDragSelect.d.ts +0 -8
  141. package/dist/types/hooks/sigmaHilighter.d.ts +0 -3
  142. package/dist/types/hooks/sigmaMouseActions.d.ts +0 -3
  143. package/dist/types/hooks/useGraphology.d.ts +0 -6
  144. package/dist/types/hooks/useSigma.d.ts +0 -8
  145. package/dist/types/i18n/index.d.ts +0 -0
  146. package/dist/types/programs/arrow-head/frag.glsl.d.ts +0 -2
  147. package/dist/types/programs/arrow-head/index.d.ts +0 -9
  148. package/dist/types/programs/arrow-head/vert.glsl.d.ts +0 -2
  149. package/dist/types/programs/edge-curve/drawLabel.d.ts +0 -6
  150. package/dist/types/programs/edge-curve/frag.glsl.d.ts +0 -2
  151. package/dist/types/programs/edge-curve/index.d.ts +0 -43
  152. package/dist/types/programs/edge-curve/vert.glsl.d.ts +0 -2
  153. package/dist/types/programs/edge-line/drawLabel.d.ts +0 -5
  154. package/dist/types/programs/edge-line/frag.glsl.d.ts +0 -2
  155. package/dist/types/programs/edge-line/index.d.ts +0 -11
  156. package/dist/types/programs/edge-line/vert.glsl.d.ts +0 -2
  157. package/dist/types/programs/node-badge/factory.d.ts +0 -27
  158. package/dist/types/programs/node-badge/frag.glsl.d.ts +0 -2
  159. package/dist/types/programs/node-badge/index.d.ts +0 -5
  160. package/dist/types/programs/node-badge/texture.d.ts +0 -102
  161. package/dist/types/programs/node-badge/vert.glsl.d.ts +0 -2
  162. package/dist/types/programs/node-circle/base/drawHover.d.ts +0 -8
  163. package/dist/types/programs/node-circle/base/drawLabel.d.ts +0 -8
  164. package/dist/types/programs/node-circle/base/frag.glsl.d.ts +0 -2
  165. package/dist/types/programs/node-circle/base/index.d.ts +0 -37
  166. package/dist/types/programs/node-circle/base/vert.glsl.d.ts +0 -2
  167. package/dist/types/programs/node-circle/index.d.ts +0 -11
  168. package/dist/types/programs/node-image/factory.d.ts +0 -25
  169. package/dist/types/programs/node-image/frag.glsl.d.ts +0 -2
  170. package/dist/types/programs/node-image/index.d.ts +0 -5
  171. package/dist/types/programs/node-image/texture.d.ts +0 -102
  172. package/dist/types/programs/node-image/vert.glsl.d.ts +0 -2
  173. package/dist/types/programs/node-rect/base/drawHover.d.ts +0 -8
  174. package/dist/types/programs/node-rect/base/drawLabel.d.ts +0 -8
  175. package/dist/types/programs/node-rect/base/frag.glsl.d.ts +0 -2
  176. package/dist/types/programs/node-rect/base/index.d.ts +0 -34
  177. package/dist/types/programs/node-rect/base/vert.glsl.d.ts +0 -2
  178. package/dist/types/programs/node-rect/index.d.ts +0 -11
  179. package/src/components/ContextMenu.tsx +0 -138
  180. package/src/components/Provider.tsx +0 -116
  181. package/src/components/Tools.tsx +0 -68
  182. package/src/components/Viewer.tsx +0 -75
  183. package/src/components/context.ts +0 -43
  184. package/src/constants/index.ts +0 -22
  185. package/src/graph/layout.worker.ts +0 -42
  186. package/src/hooks/sigmaDragSelect.ts +0 -219
  187. package/src/hooks/sigmaHilighter.ts +0 -107
  188. package/src/hooks/sigmaMouseActions.ts +0 -153
  189. package/src/hooks/useGraphology.ts +0 -31
  190. package/src/hooks/useSigma.ts +0 -118
  191. package/src/i18n/index.ts +0 -0
  192. package/src/programs/arrow-head/frag.glsl.ts +0 -18
  193. package/src/programs/arrow-head/index.ts +0 -156
  194. package/src/programs/arrow-head/vert.glsl.ts +0 -75
  195. package/src/programs/edge-curve/drawLabel.ts +0 -166
  196. package/src/programs/edge-curve/frag.glsl.ts +0 -86
  197. package/src/programs/edge-curve/index.ts +0 -156
  198. package/src/programs/edge-curve/vert.glsl.ts +0 -110
  199. package/src/programs/edge-line/drawLabel.ts +0 -113
  200. package/src/programs/edge-line/frag.glsl.ts +0 -34
  201. package/src/programs/edge-line/index.ts +0 -163
  202. package/src/programs/edge-line/vert.glsl.ts +0 -104
  203. package/src/programs/node-badge/factory.ts +0 -325
  204. package/src/programs/node-badge/frag.glsl.ts +0 -79
  205. package/src/programs/node-badge/index.ts +0 -35
  206. package/src/programs/node-badge/texture.ts +0 -425
  207. package/src/programs/node-badge/vert.glsl.ts +0 -99
  208. package/src/programs/node-circle/base/drawHover.ts +0 -80
  209. package/src/programs/node-circle/base/drawLabel.ts +0 -145
  210. package/src/programs/node-circle/base/frag.glsl.ts +0 -72
  211. package/src/programs/node-circle/base/index.ts +0 -100
  212. package/src/programs/node-circle/base/vert.glsl.ts +0 -83
  213. package/src/programs/node-circle/index.ts +0 -19
  214. package/src/programs/node-image/factory.ts +0 -299
  215. package/src/programs/node-image/frag.glsl.ts +0 -97
  216. package/src/programs/node-image/index.ts +0 -7
  217. package/src/programs/node-image/texture.ts +0 -435
  218. package/src/programs/node-image/vert.glsl.ts +0 -60
  219. package/src/programs/node-rect/base/drawHover.ts +0 -77
  220. package/src/programs/node-rect/base/drawLabel.ts +0 -149
  221. package/src/programs/node-rect/base/frag.glsl.ts +0 -67
  222. package/src/programs/node-rect/base/index.ts +0 -107
  223. package/src/programs/node-rect/base/vert.glsl.ts +0 -87
  224. 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 { type ForceAtlas2Settings } from "graphology-layout-forceatlas2";
3
- import { type GraphEvents, type GraphOptions } from "graphology-types";
4
- import { type EdgeAttributes, type InternalNodeAttributes, type NodeAttributes, type RawGraph } from "../types";
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<InternalNodeAttributes<N>, EdgeAttributes<E>, KeyValue> {
13
- constructor(options?: GraphOptions);
14
- on<Event extends keyof ExtendedEvents>(type: Event, listener: ExtendedEvents[Event]): this;
15
- off<Event extends keyof ExtendedEvents>(type: Event, listener: ExtendedEvents[Event]): this;
16
- emit<Event extends keyof ExtendedEvents>(type: Event, ...args: Parameters<ExtendedEvents[Event]>): boolean;
17
- mergeNodes(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;
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
- * parallel edge check to be called after adding edges
42
+ * @deprecated
43
+ * use `importGraph` instead
31
44
  */
32
- private getCurvature;
33
- private checkParallelEdges;
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 {};
@@ -1,3 +1,29 @@
1
- export { SigmaGraph } from "./components/Viewer";
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, GraphRef, NodeAttributes, RawGraph, } from "./types";
28
+ export type { EdgeAttributes, InternalEdge, InternalNode, NodeAttributes, PublicEdge, PublicNode, RawGraph } from "./types";
29
+ export { GraphViewer } from "./viewer/Graph";