@react-fabric/graph 1.0.0-beta.58

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 (208) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/css/styles.css +56 -0
  4. package/dist/cjs/_virtual/_commonjs-dynamic-modules.js +7 -0
  5. package/dist/cjs/_virtual/_commonjsHelpers.js +7 -0
  6. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +14 -0
  7. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +9 -0
  8. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +35 -0
  9. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +11 -0
  10. package/dist/cjs/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +20 -0
  11. package/dist/cjs/_virtual/elk-worker.js +8 -0
  12. package/dist/cjs/_virtual/elk.bundled.js +5 -0
  13. package/dist/cjs/node_modules/elkjs/lib/elk.bundled.js +6667 -0
  14. package/dist/cjs/packages/graph/src/components/Context.js +108 -0
  15. package/dist/cjs/packages/graph/src/components/ContextMenu.js +134 -0
  16. package/dist/cjs/packages/graph/src/components/Tools.js +127 -0
  17. package/dist/cjs/packages/graph/src/components/Viewer.js +57 -0
  18. package/dist/cjs/packages/graph/src/constants/index.js +16 -0
  19. package/dist/cjs/packages/graph/src/graph/index.js +425 -0
  20. package/dist/cjs/packages/graph/src/hooks/sigmaDragSelect.js +169 -0
  21. package/dist/cjs/packages/graph/src/hooks/sigmaHilighter.js +83 -0
  22. package/dist/cjs/packages/graph/src/hooks/sigmaMouseActions.js +145 -0
  23. package/dist/cjs/packages/graph/src/hooks/useGraphology.js +41 -0
  24. package/dist/cjs/packages/graph/src/hooks/useSigma.js +112 -0
  25. package/dist/cjs/packages/graph/src/index.js +33 -0
  26. package/dist/cjs/packages/graph/src/programs/arrow-head/frag.glsl.js +8 -0
  27. package/dist/cjs/packages/graph/src/programs/arrow-head/index.js +142 -0
  28. package/dist/cjs/packages/graph/src/programs/arrow-head/vert.glsl.js +8 -0
  29. package/dist/cjs/packages/graph/src/programs/edge-curve/drawLabel.js +136 -0
  30. package/dist/cjs/packages/graph/src/programs/edge-curve/frag.glsl.js +8 -0
  31. package/dist/cjs/packages/graph/src/programs/edge-curve/index.js +157 -0
  32. package/dist/cjs/packages/graph/src/programs/edge-curve/vert.glsl.js +8 -0
  33. package/dist/cjs/packages/graph/src/programs/edge-line/drawLabel.js +70 -0
  34. package/dist/cjs/packages/graph/src/programs/edge-line/frag.glsl.js +8 -0
  35. package/dist/cjs/packages/graph/src/programs/edge-line/index.js +166 -0
  36. package/dist/cjs/packages/graph/src/programs/edge-line/vert.glsl.js +8 -0
  37. package/dist/cjs/packages/graph/src/programs/node-badge/factory.js +249 -0
  38. package/dist/cjs/packages/graph/src/programs/node-badge/frag.glsl.js +8 -0
  39. package/dist/cjs/packages/graph/src/programs/node-badge/index.js +33 -0
  40. package/dist/cjs/packages/graph/src/programs/node-badge/texture.js +455 -0
  41. package/dist/cjs/packages/graph/src/programs/node-badge/vert.glsl.js +19 -0
  42. package/dist/cjs/packages/graph/src/programs/node-circle/base/drawHover.js +70 -0
  43. package/dist/cjs/packages/graph/src/programs/node-circle/base/drawLabel.js +112 -0
  44. package/dist/cjs/packages/graph/src/programs/node-circle/base/frag.glsl.js +8 -0
  45. package/dist/cjs/packages/graph/src/programs/node-circle/base/index.js +136 -0
  46. package/dist/cjs/packages/graph/src/programs/node-circle/base/vert.glsl.js +8 -0
  47. package/dist/cjs/packages/graph/src/programs/node-circle/index.js +15 -0
  48. package/dist/cjs/packages/graph/src/programs/node-image/factory.js +223 -0
  49. package/dist/cjs/packages/graph/src/programs/node-image/frag.glsl.js +8 -0
  50. package/dist/cjs/packages/graph/src/programs/node-image/index.js +14 -0
  51. package/dist/cjs/packages/graph/src/programs/node-image/texture.js +472 -0
  52. package/dist/cjs/packages/graph/src/programs/node-image/vert.glsl.js +8 -0
  53. package/dist/cjs/packages/graph/src/programs/node-rect/base/drawHover.js +67 -0
  54. package/dist/cjs/packages/graph/src/programs/node-rect/base/drawLabel.js +106 -0
  55. package/dist/cjs/packages/graph/src/programs/node-rect/base/frag.glsl.js +8 -0
  56. package/dist/cjs/packages/graph/src/programs/node-rect/base/index.js +135 -0
  57. package/dist/cjs/packages/graph/src/programs/node-rect/base/vert.glsl.js +8 -0
  58. package/dist/cjs/packages/graph/src/programs/node-rect/index.js +15 -0
  59. package/dist/esm/_virtual/_commonjs-dynamic-modules.js +7 -0
  60. package/dist/esm/_virtual/_commonjsHelpers.js +7 -0
  61. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__createBase64WorkerFactory.js +14 -0
  62. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__auto__isNodeJS.js +9 -0
  63. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__browser__createBase64WorkerFactory.js +34 -0
  64. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__WorkerClass.js +13 -0
  65. package/dist/esm/_virtual/_rollup-plugin-web-worker-loader__helper__node__createBase64WorkerFactory.js +20 -0
  66. package/dist/esm/_virtual/elk-worker.js +8 -0
  67. package/dist/esm/_virtual/elk.bundled.js +5 -0
  68. package/dist/esm/node_modules/elkjs/lib/elk.bundled.js +6667 -0
  69. package/dist/esm/packages/graph/src/components/Context.js +107 -0
  70. package/dist/esm/packages/graph/src/components/ContextMenu.js +134 -0
  71. package/dist/esm/packages/graph/src/components/Tools.js +127 -0
  72. package/dist/esm/packages/graph/src/components/Viewer.js +57 -0
  73. package/dist/esm/packages/graph/src/constants/index.js +16 -0
  74. package/dist/esm/packages/graph/src/graph/index.js +425 -0
  75. package/dist/esm/packages/graph/src/hooks/sigmaDragSelect.js +169 -0
  76. package/dist/esm/packages/graph/src/hooks/sigmaHilighter.js +83 -0
  77. package/dist/esm/packages/graph/src/hooks/sigmaMouseActions.js +145 -0
  78. package/dist/esm/packages/graph/src/hooks/useGraphology.js +41 -0
  79. package/dist/esm/packages/graph/src/hooks/useSigma.js +112 -0
  80. package/dist/esm/packages/graph/src/index.js +30 -0
  81. package/dist/esm/packages/graph/src/programs/arrow-head/frag.glsl.js +8 -0
  82. package/dist/esm/packages/graph/src/programs/arrow-head/index.js +141 -0
  83. package/dist/esm/packages/graph/src/programs/arrow-head/vert.glsl.js +8 -0
  84. package/dist/esm/packages/graph/src/programs/edge-curve/drawLabel.js +136 -0
  85. package/dist/esm/packages/graph/src/programs/edge-curve/frag.glsl.js +8 -0
  86. package/dist/esm/packages/graph/src/programs/edge-curve/index.js +156 -0
  87. package/dist/esm/packages/graph/src/programs/edge-curve/vert.glsl.js +8 -0
  88. package/dist/esm/packages/graph/src/programs/edge-line/drawLabel.js +70 -0
  89. package/dist/esm/packages/graph/src/programs/edge-line/frag.glsl.js +8 -0
  90. package/dist/esm/packages/graph/src/programs/edge-line/index.js +166 -0
  91. package/dist/esm/packages/graph/src/programs/edge-line/vert.glsl.js +8 -0
  92. package/dist/esm/packages/graph/src/programs/node-badge/factory.js +249 -0
  93. package/dist/esm/packages/graph/src/programs/node-badge/frag.glsl.js +8 -0
  94. package/dist/esm/packages/graph/src/programs/node-badge/index.js +32 -0
  95. package/dist/esm/packages/graph/src/programs/node-badge/texture.js +445 -0
  96. package/dist/esm/packages/graph/src/programs/node-badge/vert.glsl.js +19 -0
  97. package/dist/esm/packages/graph/src/programs/node-circle/base/drawHover.js +70 -0
  98. package/dist/esm/packages/graph/src/programs/node-circle/base/drawLabel.js +112 -0
  99. package/dist/esm/packages/graph/src/programs/node-circle/base/frag.glsl.js +8 -0
  100. package/dist/esm/packages/graph/src/programs/node-circle/base/index.js +136 -0
  101. package/dist/esm/packages/graph/src/programs/node-circle/base/vert.glsl.js +8 -0
  102. package/dist/esm/packages/graph/src/programs/node-circle/index.js +15 -0
  103. package/dist/esm/packages/graph/src/programs/node-image/factory.js +223 -0
  104. package/dist/esm/packages/graph/src/programs/node-image/frag.glsl.js +8 -0
  105. package/dist/esm/packages/graph/src/programs/node-image/index.js +13 -0
  106. package/dist/esm/packages/graph/src/programs/node-image/texture.js +462 -0
  107. package/dist/esm/packages/graph/src/programs/node-image/vert.glsl.js +8 -0
  108. package/dist/esm/packages/graph/src/programs/node-rect/base/drawHover.js +67 -0
  109. package/dist/esm/packages/graph/src/programs/node-rect/base/drawLabel.js +106 -0
  110. package/dist/esm/packages/graph/src/programs/node-rect/base/frag.glsl.js +8 -0
  111. package/dist/esm/packages/graph/src/programs/node-rect/base/index.js +135 -0
  112. package/dist/esm/packages/graph/src/programs/node-rect/base/vert.glsl.js +8 -0
  113. package/dist/esm/packages/graph/src/programs/node-rect/index.js +15 -0
  114. package/dist/types/components/Context.d.ts +18 -0
  115. package/dist/types/components/ContextMenu.d.ts +1 -0
  116. package/dist/types/components/Tools.d.ts +1 -0
  117. package/dist/types/components/Viewer.d.ts +2 -0
  118. package/dist/types/constants/index.d.ts +12 -0
  119. package/dist/types/graph/index.d.ts +30 -0
  120. package/dist/types/graph/layout.worker.d.ts +1 -0
  121. package/dist/types/hooks/sigmaDragSelect.d.ts +8 -0
  122. package/dist/types/hooks/sigmaHilighter.d.ts +3 -0
  123. package/dist/types/hooks/sigmaMouseActions.d.ts +3 -0
  124. package/dist/types/hooks/useGraphology.d.ts +6 -0
  125. package/dist/types/hooks/useSigma.d.ts +8 -0
  126. package/dist/types/index.d.ts +3 -0
  127. package/dist/types/programs/arrow-head/frag.glsl.d.ts +2 -0
  128. package/dist/types/programs/arrow-head/index.d.ts +9 -0
  129. package/dist/types/programs/arrow-head/vert.glsl.d.ts +2 -0
  130. package/dist/types/programs/edge-curve/drawLabel.d.ts +6 -0
  131. package/dist/types/programs/edge-curve/frag.glsl.d.ts +2 -0
  132. package/dist/types/programs/edge-curve/index.d.ts +43 -0
  133. package/dist/types/programs/edge-curve/vert.glsl.d.ts +2 -0
  134. package/dist/types/programs/edge-line/drawLabel.d.ts +5 -0
  135. package/dist/types/programs/edge-line/frag.glsl.d.ts +2 -0
  136. package/dist/types/programs/edge-line/index.d.ts +11 -0
  137. package/dist/types/programs/edge-line/vert.glsl.d.ts +2 -0
  138. package/dist/types/programs/node-badge/factory.d.ts +27 -0
  139. package/dist/types/programs/node-badge/frag.glsl.d.ts +2 -0
  140. package/dist/types/programs/node-badge/index.d.ts +5 -0
  141. package/dist/types/programs/node-badge/texture.d.ts +102 -0
  142. package/dist/types/programs/node-badge/vert.glsl.d.ts +2 -0
  143. package/dist/types/programs/node-circle/base/drawHover.d.ts +8 -0
  144. package/dist/types/programs/node-circle/base/drawLabel.d.ts +8 -0
  145. package/dist/types/programs/node-circle/base/frag.glsl.d.ts +2 -0
  146. package/dist/types/programs/node-circle/base/index.d.ts +37 -0
  147. package/dist/types/programs/node-circle/base/vert.glsl.d.ts +2 -0
  148. package/dist/types/programs/node-circle/index.d.ts +11 -0
  149. package/dist/types/programs/node-image/factory.d.ts +25 -0
  150. package/dist/types/programs/node-image/frag.glsl.d.ts +2 -0
  151. package/dist/types/programs/node-image/index.d.ts +5 -0
  152. package/dist/types/programs/node-image/texture.d.ts +102 -0
  153. package/dist/types/programs/node-image/vert.glsl.d.ts +2 -0
  154. package/dist/types/programs/node-rect/base/drawHover.d.ts +8 -0
  155. package/dist/types/programs/node-rect/base/drawLabel.d.ts +8 -0
  156. package/dist/types/programs/node-rect/base/frag.glsl.d.ts +2 -0
  157. package/dist/types/programs/node-rect/base/index.d.ts +34 -0
  158. package/dist/types/programs/node-rect/base/vert.glsl.d.ts +2 -0
  159. package/dist/types/programs/node-rect/index.d.ts +11 -0
  160. package/dist/types/types/index.d.ts +189 -0
  161. package/package.json +69 -0
  162. package/src/components/Context.tsx +135 -0
  163. package/src/components/ContextMenu.tsx +156 -0
  164. package/src/components/Tools.tsx +107 -0
  165. package/src/components/Viewer.tsx +75 -0
  166. package/src/constants/index.ts +22 -0
  167. package/src/graph/index.ts +428 -0
  168. package/src/graph/layout.worker.ts +42 -0
  169. package/src/hooks/sigmaDragSelect.ts +219 -0
  170. package/src/hooks/sigmaHilighter.ts +107 -0
  171. package/src/hooks/sigmaMouseActions.ts +153 -0
  172. package/src/hooks/useGraphology.ts +31 -0
  173. package/src/hooks/useSigma.ts +118 -0
  174. package/src/index.ts +34 -0
  175. package/src/programs/arrow-head/frag.glsl.ts +18 -0
  176. package/src/programs/arrow-head/index.ts +148 -0
  177. package/src/programs/arrow-head/vert.glsl.ts +75 -0
  178. package/src/programs/edge-curve/drawLabel.ts +166 -0
  179. package/src/programs/edge-curve/frag.glsl.ts +86 -0
  180. package/src/programs/edge-curve/index.ts +158 -0
  181. package/src/programs/edge-curve/vert.glsl.ts +110 -0
  182. package/src/programs/edge-line/drawLabel.ts +113 -0
  183. package/src/programs/edge-line/frag.glsl.ts +34 -0
  184. package/src/programs/edge-line/index.ts +165 -0
  185. package/src/programs/edge-line/vert.glsl.ts +104 -0
  186. package/src/programs/node-badge/factory.ts +327 -0
  187. package/src/programs/node-badge/frag.glsl.ts +79 -0
  188. package/src/programs/node-badge/index.ts +35 -0
  189. package/src/programs/node-badge/texture.ts +425 -0
  190. package/src/programs/node-badge/vert.glsl.ts +99 -0
  191. package/src/programs/node-circle/base/drawHover.ts +80 -0
  192. package/src/programs/node-circle/base/drawLabel.ts +145 -0
  193. package/src/programs/node-circle/base/frag.glsl.ts +72 -0
  194. package/src/programs/node-circle/base/index.ts +102 -0
  195. package/src/programs/node-circle/base/vert.glsl.ts +83 -0
  196. package/src/programs/node-circle/index.ts +19 -0
  197. package/src/programs/node-image/factory.ts +301 -0
  198. package/src/programs/node-image/frag.glsl.ts +97 -0
  199. package/src/programs/node-image/index.ts +7 -0
  200. package/src/programs/node-image/texture.ts +435 -0
  201. package/src/programs/node-image/vert.glsl.ts +60 -0
  202. package/src/programs/node-rect/base/drawHover.ts +77 -0
  203. package/src/programs/node-rect/base/drawLabel.ts +149 -0
  204. package/src/programs/node-rect/base/frag.glsl.ts +67 -0
  205. package/src/programs/node-rect/base/index.ts +109 -0
  206. package/src/programs/node-rect/base/vert.glsl.ts +87 -0
  207. package/src/programs/node-rect/index.ts +19 -0
  208. package/src/types/index.ts +210 -0
@@ -0,0 +1,145 @@
1
+ 'use client';
2
+
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+
5
+ var attachMouseActions = function attachMouseActions(renderer) {
6
+ var isDragging = false;
7
+ var isDragged = false;
8
+ var startPos = {
9
+ x: 0,
10
+ y: 0
11
+ };
12
+ var draggedNode;
13
+ var handleDrag = function handleDrag(renderer) {
14
+ return function (e) {
15
+ if (!isDragging || !draggedNode) return;
16
+ isDragged = true;
17
+ // Get new position of node
18
+ var pos = renderer.viewportToGraph(e);
19
+ var diff = {
20
+ x: pos.x - startPos.x,
21
+ y: pos.y - startPos.y
22
+ };
23
+ var graph = renderer.getGraph();
24
+ Object.entries(draggedNode).forEach(function (_ref) {
25
+ var _ref2 = _slicedToArray(_ref, 2),
26
+ node = _ref2[0],
27
+ xy = _ref2[1];
28
+ graph.setNodeAttribute(node, "x", xy.x + diff.x);
29
+ graph.setNodeAttribute(node, "y", xy.y + diff.y);
30
+ });
31
+
32
+ // Prevent sigma to move camera:
33
+ e.preventSigmaDefault();
34
+ e.original.preventDefault();
35
+ e.original.stopPropagation();
36
+ };
37
+ };
38
+ var stopDragging = function stopDragging(graph) {
39
+ // if (draggedNode) {
40
+ // Object.entries<KeyValue>(draggedNode).forEach(([node, xy]) => {
41
+ // const atts = graph.getNodeAttributes(node);
42
+ // if (atts.isGroup) {
43
+ // const diff = { x: atts.x - xy.x, y: atts.y - xy.y };
44
+ // atts.nodes?.forEach((id: string) => {
45
+ // try {
46
+ // const { x, y } = graph.getNodeAttributes(id);
47
+ // graph.setNodeAttribute(id, "x", x + diff.x);
48
+ // graph.setNodeAttribute(id, "y", y + diff.y);
49
+ // } catch {
50
+ // //
51
+ // }
52
+ // });
53
+ // }
54
+ // });
55
+ // }
56
+ isDragging = false;
57
+ draggedNode = undefined;
58
+ };
59
+ var enableDragging = function enableDragging(renderer) {
60
+ renderer.on("downNode", function (e) {
61
+ if ("button" in e.event.original && e.event.original.button === 0) {
62
+ var graph = renderer.getGraph();
63
+ isDragging = true;
64
+ draggedNode = {};
65
+ var _graph$getNodeAttribu = graph.getNodeAttributes(e.node),
66
+ _graph$getNodeAttribu2 = _graph$getNodeAttribu.x,
67
+ x = _graph$getNodeAttribu2 === void 0 ? 0 : _graph$getNodeAttribu2,
68
+ _graph$getNodeAttribu3 = _graph$getNodeAttribu.y,
69
+ y = _graph$getNodeAttribu3 === void 0 ? 0 : _graph$getNodeAttribu3;
70
+ draggedNode[e.node] = {
71
+ x: x,
72
+ y: y
73
+ };
74
+ startPos = {
75
+ x: x,
76
+ y: y
77
+ };
78
+ graph.forEachNode(function (node, atts) {
79
+ if (atts.selected) {
80
+ draggedNode[node] = {
81
+ x: atts.x,
82
+ y: atts.y
83
+ };
84
+ }
85
+ });
86
+ }
87
+ });
88
+
89
+ // On mouse move, if the drag mode is enabled, we change the position of the draggedNode
90
+ renderer.getMouseCaptor().on("mousemovebody", handleDrag(renderer));
91
+
92
+ // On mouse up, we reset the autoscale and the dragging mode
93
+ renderer.getMouseCaptor().on("mouseup", function (e) {
94
+ if (isDragging) {
95
+ stopDragging(renderer.getGraph());
96
+ e.original.preventDefault();
97
+ e.preventSigmaDefault();
98
+ }
99
+ });
100
+
101
+ // Disable the autoscale at the first down interaction
102
+ renderer.getMouseCaptor().on("mousedown", function () {
103
+ if (!renderer.getCustomBBox()) renderer.setCustomBBox(renderer.getBBox());
104
+ });
105
+ };
106
+ var resetSelection = function resetSelection(graph) {
107
+ graph.forEachNode(function (node, atts) {
108
+ return atts.selected && graph.setNodeAttribute(node, "selected", false);
109
+ });
110
+ graph.forEachEdge(function (node, atts) {
111
+ return atts.selected && graph.setEdgeAttribute(node, "selected", false);
112
+ });
113
+ };
114
+ var enableSelection = function enableSelection(renderer) {
115
+ renderer.on("downNode", function (e) {
116
+ if ("button" in e.event.original && e.event.original.button === 2) {
117
+ var isSelected = renderer.getGraph().getNodeAttribute(e.node, "selected");
118
+ !isSelected && resetSelection(renderer.getGraph());
119
+ !isSelected && renderer.getGraph().setNodeAttribute(e.node, "selected", true);
120
+ }
121
+ });
122
+ renderer.on("downEdge", function (e) {
123
+ if ("button" in e.event.original && e.event.original.button === 2) {
124
+ var isSelected = renderer.getGraph().getEdgeAttribute(e.edge, "selected");
125
+ !isSelected && resetSelection(renderer.getGraph());
126
+ !isSelected && renderer.getGraph().setEdgeAttribute(e.edge, "selected", true);
127
+ }
128
+ });
129
+ renderer.on("clickNode", function (e) {
130
+ if (!isDragged && "button" in e.event.original && e.event.original.button === 0) {
131
+ var isSelected = renderer.getGraph().getNodeAttribute(e.node, "selected");
132
+ !e.event.original.shiftKey && resetSelection(renderer.getGraph());
133
+ renderer.getGraph().setNodeAttribute(e.node, "selected", !isSelected);
134
+ }
135
+ isDragged = false;
136
+ });
137
+ renderer.on("downStage", function (e) {
138
+ resetSelection(renderer.getGraph());
139
+ });
140
+ };
141
+ enableSelection(renderer);
142
+ enableDragging(renderer);
143
+ };
144
+
145
+ export { attachMouseActions };
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import { useState, useEffect } from 'react';
5
+ import { Graph } from '../graph/index.js';
6
+
7
+ var useGraphology = function useGraphology(data) {
8
+ var _useState = useState(new Graph({
9
+ multi: true
10
+ })),
11
+ _useState2 = _slicedToArray(_useState, 2),
12
+ graph = _useState2[0],
13
+ setGraph = _useState2[1];
14
+ var _useState3 = useState([]),
15
+ _useState4 = _slicedToArray(_useState3, 2),
16
+ selected = _useState4[0],
17
+ setSelected = _useState4[1];
18
+ useEffect(function () {
19
+ if (data instanceof Graph) {
20
+ setGraph(data);
21
+ return;
22
+ }
23
+ graph.clear();
24
+ data && graph["import"](data, false);
25
+ }, [data]);
26
+ useEffect(function () {
27
+ var handler = function handler(nodes) {
28
+ setSelected(nodes);
29
+ };
30
+ graph.on("nodesSelected", handler);
31
+ return function () {
32
+ graph.off("nodesSelected", handler);
33
+ };
34
+ }, [graph]);
35
+ return {
36
+ graph: graph,
37
+ selected: selected
38
+ };
39
+ };
40
+
41
+ export { useGraphology };
@@ -0,0 +1,112 @@
1
+ 'use client';
2
+
3
+ import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
4
+ import { useIsDark } from '@react-fabric/core';
5
+ import { useState, useEffect } from 'react';
6
+ import Sigma from 'sigma';
7
+ import { EdgeCurveProgram } from '../programs/edge-curve/index.js';
8
+ import { EdgeLineProgram } from '../programs/edge-line/index.js';
9
+ import { NodeCircleProgram } from '../programs/node-circle/index.js';
10
+ import { NodeRectProgram } from '../programs/node-rect/index.js';
11
+ import { attachHighlighter } from './sigmaHilighter.js';
12
+ import { attachMouseActions } from './sigmaMouseActions.js';
13
+
14
+ var useSigma = function useSigma(graph, _nodeReducer, _edgeReducer) {
15
+ var _useState = useState(null),
16
+ _useState2 = _slicedToArray(_useState, 2),
17
+ containerRef = _useState2[0],
18
+ setContainerRef = _useState2[1];
19
+ var _useState3 = useState(null),
20
+ _useState4 = _slicedToArray(_useState3, 2),
21
+ componentsRef = _useState4[0],
22
+ setComponentsRef = _useState4[1];
23
+ var isDark = useIsDark();
24
+ var _useState5 = useState(),
25
+ _useState6 = _slicedToArray(_useState5, 2),
26
+ sigma = _useState6[0],
27
+ updateSigma = _useState6[1];
28
+ useEffect(function () {
29
+ if (containerRef) {
30
+ var renderer = new Sigma(graph, containerRef, {
31
+ allowInvalidContainer: true,
32
+ enableEdgeEvents: true,
33
+ renderEdgeLabels: true,
34
+ renderLabels: true,
35
+ labelSize: 14,
36
+ defaultEdgeType: "line",
37
+ defaultNodeType: "circle",
38
+ edgeProgramClasses: {
39
+ line: EdgeLineProgram,
40
+ curved: EdgeCurveProgram
41
+ },
42
+ // for some reason max ratio is min zoom and min ratio is max zoom
43
+ maxCameraRatio: 10,
44
+ minCameraRatio: 0.01,
45
+ nodeProgramClasses: {
46
+ rect: NodeRectProgram,
47
+ circle: NodeCircleProgram
48
+ },
49
+ nodeReducer: function nodeReducer(key, data) {
50
+ var _nodeData$size;
51
+ var nodeData = (_nodeReducer === null || _nodeReducer === void 0 ? void 0 : _nodeReducer(data)) || data;
52
+ // Ensure node size is at least 16 for visibility
53
+ if (!nodeData.size && nodeData.weight) {
54
+ nodeData.size = Math.max(16, nodeData.weight * 3);
55
+ }
56
+ if (((_nodeData$size = nodeData.size) !== null && _nodeData$size !== void 0 ? _nodeData$size : 0) < 16) {
57
+ nodeData.size = 16;
58
+ }
59
+
60
+ // ensure node label renderer is called in order to render selected border
61
+ nodeData.label = nodeData.label || "";
62
+ nodeData.id = key;
63
+ return nodeData;
64
+ },
65
+ edgeReducer: function edgeReducer(key, data) {
66
+ var _edgeData$size;
67
+ var edgeData = (_edgeReducer === null || _edgeReducer === void 0 ? void 0 : _edgeReducer(data)) || data;
68
+ // Ensure edge size is at least 0.5 for visibility
69
+ if (!edgeData.size && edgeData.weight) {
70
+ edgeData.size = Math.max(0.5, edgeData.weight * 6);
71
+ }
72
+ if (((_edgeData$size = edgeData.size) !== null && _edgeData$size !== void 0 ? _edgeData$size : 0) < 0.5) {
73
+ edgeData.size = 0.5;
74
+ }
75
+ edgeData.id = key;
76
+ return edgeData;
77
+ }
78
+ });
79
+ attachMouseActions(renderer);
80
+ attachHighlighter(renderer);
81
+
82
+ // containerRef?.insertBefore(
83
+ // componentsRef,
84
+ // renderer.getCanvases().mouse,
85
+ // );
86
+
87
+ // @ts-expect-error ignore
88
+ window.sigma = renderer;
89
+ updateSigma(renderer);
90
+ return function () {
91
+ renderer.kill();
92
+ };
93
+ }
94
+ }, [graph, containerRef, componentsRef]);
95
+ useEffect(function () {
96
+ sigma === null || sigma === void 0 || sigma.setSettings({
97
+ defaultNodeColor: isDark ? "#000" : "#fff",
98
+ defaultEdgeColor: isDark ? "#fff" : "#000",
99
+ labelColor: {
100
+ color: isDark ? "#fff" : "#000",
101
+ attribute: "labelColor"
102
+ }
103
+ });
104
+ }, [isDark, sigma]);
105
+ return {
106
+ instance: sigma,
107
+ containerRef: setContainerRef,
108
+ componentsRef: setComponentsRef
109
+ };
110
+ };
111
+
112
+ export { useSigma };
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+
3
+ export { SigmaGraph } from './components/Viewer.js';
4
+ export { Graph } from './graph/index.js';
5
+
6
+ /*
7
+ * React Fabric
8
+ * @version: 1.0.0
9
+ *
10
+ *
11
+ * The MIT License (MIT)
12
+ * Copyright (c) 2024 Adarsh Pastakia
13
+ *
14
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
15
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
16
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
17
+ * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
18
+ * subject to the following conditions:
19
+ *
20
+ * The above copyright notice and this permission notice shall be included in all copies or substantial
21
+ * portions of the Software.
22
+ *
23
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
24
+ * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
25
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
26
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
+ */
28
+
29
+ // @ts-expect-error ignore
30
+ window.__GRAPH_LAYOUT_DURATION_MULTIPLIER__ = 10;
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+
3
+ /* istanbul ignore file */
4
+
5
+ // language=GLSL
6
+ var SHADER_SOURCE = /*glsl*/"\nprecision mediump float;\n\nvarying vec4 v_color;\nvarying float v_opacity;\n\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\n\nvoid main(void) {\n gl_FragColor = v_color;\n gl_FragColor = mix(transparent, gl_FragColor, v_opacity);\n}\n";
7
+
8
+ export { SHADER_SOURCE as default };
@@ -0,0 +1,141 @@
1
+ 'use client';
2
+
3
+ import _classCallCheck from '@babel/runtime/helpers/classCallCheck';
4
+ import _createClass from '@babel/runtime/helpers/createClass';
5
+ import _possibleConstructorReturn from '@babel/runtime/helpers/possibleConstructorReturn';
6
+ import _getPrototypeOf from '@babel/runtime/helpers/getPrototypeOf';
7
+ import _inherits from '@babel/runtime/helpers/inherits';
8
+ import _defineProperty from '@babel/runtime/helpers/defineProperty';
9
+ import { EdgeProgram } from 'sigma/rendering';
10
+ import { floatColor } from 'sigma/utils';
11
+ import SHADER_SOURCE$1 from './frag.glsl.js';
12
+ import SHADER_SOURCE from './vert.glsl.js';
13
+
14
+ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstructorReturn(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], _getPrototypeOf(t).constructor) : o.apply(t, e)); }
15
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
16
+ 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; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).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; }
18
+ var _WebGLRenderingContex = WebGLRenderingContext,
19
+ UNSIGNED_BYTE = _WebGLRenderingContex.UNSIGNED_BYTE,
20
+ FLOAT = _WebGLRenderingContex.FLOAT;
21
+ var UNIFORMS = ["u_matrix", "u_sizeRatio", "u_correctionRatio", "u_minEdgeThickness", "u_lengthToThicknessRatio", "u_widenessToThicknessRatio"];
22
+ var DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS = {
23
+ extremity: "target",
24
+ lengthToThicknessRatio: 2.5,
25
+ widenessToThicknessRatio: 2
26
+ };
27
+ function createEdgeArrowHeadProgram(inputOptions) {
28
+ var options = _objectSpread(_objectSpread({}, DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS), inputOptions || {});
29
+ return /*#__PURE__*/function (_EdgeProgram) {
30
+ function EdgeArrowHeadProgram() {
31
+ _classCallCheck(this, EdgeArrowHeadProgram);
32
+ return _callSuper(this, EdgeArrowHeadProgram, arguments);
33
+ }
34
+ _inherits(EdgeArrowHeadProgram, _EdgeProgram);
35
+ return _createClass(EdgeArrowHeadProgram, [{
36
+ key: "getDefinition",
37
+ value: function getDefinition() {
38
+ return {
39
+ VERTICES: 3,
40
+ VERTEX_SHADER_SOURCE: SHADER_SOURCE,
41
+ FRAGMENT_SHADER_SOURCE: SHADER_SOURCE$1,
42
+ METHOD: WebGLRenderingContext.TRIANGLES,
43
+ UNIFORMS: UNIFORMS,
44
+ ATTRIBUTES: [{
45
+ name: "a_position",
46
+ size: 2,
47
+ type: FLOAT
48
+ }, {
49
+ name: "a_normal",
50
+ size: 2,
51
+ type: FLOAT
52
+ }, {
53
+ name: "a_radius",
54
+ size: 1,
55
+ type: FLOAT
56
+ }, {
57
+ name: "a_color",
58
+ size: 4,
59
+ type: UNSIGNED_BYTE,
60
+ normalized: true
61
+ }, {
62
+ name: "a_opacity",
63
+ size: 1,
64
+ type: FLOAT
65
+ }, {
66
+ name: "a_id",
67
+ size: 4,
68
+ type: UNSIGNED_BYTE,
69
+ normalized: true
70
+ }],
71
+ CONSTANT_ATTRIBUTES: [{
72
+ name: "a_barycentric",
73
+ size: 3,
74
+ type: FLOAT
75
+ }],
76
+ CONSTANT_DATA: [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
77
+ };
78
+ }
79
+ }, {
80
+ key: "processVisibleItem",
81
+ value: function processVisibleItem(edgeIndex, startIndex, sourceData, targetData, data) {
82
+ var _data$arrow, _data$opacity;
83
+ if (options.extremity === "source") {
84
+ var _ref = [targetData, sourceData];
85
+ sourceData = _ref[0];
86
+ targetData = _ref[1];
87
+ }
88
+ var thickness = Math.min(data.size || 1, 0.5) * 8;
89
+ var radius = targetData.size || 1;
90
+ var x1 = sourceData.x;
91
+ var y1 = sourceData.y;
92
+ var x2 = targetData.x;
93
+ var y2 = targetData.y;
94
+ var color = data.color;
95
+ if (data.selected) color = "#f00";
96
+ if (data.highlight) color = "#F54A4A";
97
+
98
+ // Computing normals
99
+ var dx = x2 - x1;
100
+ var dy = y2 - y1;
101
+ var len = dx * dx + dy * dy;
102
+ var n1 = 0;
103
+ var n2 = 0;
104
+ if (len) {
105
+ len = 1 / Math.sqrt(len);
106
+ n1 = -dy * len * thickness;
107
+ n2 = dx * len * thickness;
108
+ }
109
+ var array = this.array;
110
+ array[startIndex++] = x2;
111
+ array[startIndex++] = y2;
112
+ array[startIndex++] = -n1;
113
+ array[startIndex++] = -n2;
114
+ array[startIndex++] = radius;
115
+ array[startIndex++] = floatColor(color);
116
+ array[startIndex++] = ["both", options.extremity].includes((_data$arrow = data.arrow) !== null && _data$arrow !== void 0 ? _data$arrow : "") ? (_data$opacity = data.opacity) !== null && _data$opacity !== void 0 ? _data$opacity : 1 : 0;
117
+ array[startIndex++] = edgeIndex;
118
+ }
119
+ }, {
120
+ key: "setUniforms",
121
+ value: function setUniforms(params, _ref2) {
122
+ var gl = _ref2.gl,
123
+ uniformLocations = _ref2.uniformLocations;
124
+ var u_matrix = uniformLocations.u_matrix,
125
+ u_sizeRatio = uniformLocations.u_sizeRatio,
126
+ u_correctionRatio = uniformLocations.u_correctionRatio,
127
+ u_minEdgeThickness = uniformLocations.u_minEdgeThickness,
128
+ u_lengthToThicknessRatio = uniformLocations.u_lengthToThicknessRatio,
129
+ u_widenessToThicknessRatio = uniformLocations.u_widenessToThicknessRatio;
130
+ gl.uniformMatrix3fv(u_matrix, false, params.matrix);
131
+ gl.uniform1f(u_sizeRatio, params.sizeRatio);
132
+ gl.uniform1f(u_correctionRatio, params.correctionRatio);
133
+ gl.uniform1f(u_minEdgeThickness, params.minEdgeThickness);
134
+ gl.uniform1f(u_lengthToThicknessRatio, 2.5);
135
+ gl.uniform1f(u_widenessToThicknessRatio, 2);
136
+ }
137
+ }]);
138
+ }(EdgeProgram);
139
+ }
140
+
141
+ export { DEFAULT_EDGE_ARROW_HEAD_PROGRAM_OPTIONS, createEdgeArrowHeadProgram };
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+
3
+ /* istanbul ignore file */
4
+
5
+ // language=GLSL
6
+ var SHADER_SOURCE = /*glsl*/"\nattribute vec2 a_position;\nattribute vec2 a_normal;\nattribute float a_radius;\nattribute vec3 a_barycentric;\nattribute float a_opacity;\n\n#ifdef PICKING_MODE\nattribute vec4 a_id;\n#else\nattribute vec4 a_color;\n#endif\n\nuniform mat3 u_matrix;\nuniform float u_sizeRatio;\nuniform float u_correctionRatio;\nuniform float u_minEdgeThickness;\nuniform float u_lengthToThicknessRatio;\nuniform float u_widenessToThicknessRatio;\n\nvarying vec4 v_color;\nvarying float v_opacity;\n\nconst float bias = 255.0 / 254.0;\n\nvoid main() {\n float minThickness = u_minEdgeThickness;\n\n float normalLength = length(a_normal);\n vec2 unitNormal = a_normal / normalLength;\n\n // These first computations are taken from edge.vert.glsl and\n // edge.clamped.vert.glsl. Please read it to get better comments on what's\n // happening:\n float pixelsThickness = max(normalLength / u_sizeRatio, minThickness);\n float webGLThickness = pixelsThickness * u_correctionRatio;\n float webGLNodeRadius = a_radius * 2.0 * u_correctionRatio / u_sizeRatio;\n float webGLArrowHeadLength = webGLThickness * u_lengthToThicknessRatio * 2.0;\n float webGLArrowHeadThickness = webGLThickness * u_widenessToThicknessRatio;\n\n float da = a_barycentric.x;\n float db = a_barycentric.y;\n float dc = a_barycentric.z;\n\n vec2 delta = vec2(\n da * (webGLNodeRadius * unitNormal.y)\n + db * ((webGLNodeRadius + webGLArrowHeadLength) * unitNormal.y + webGLArrowHeadThickness * unitNormal.x)\n + dc * ((webGLNodeRadius + webGLArrowHeadLength) * unitNormal.y - webGLArrowHeadThickness * unitNormal.x),\n\n da * (-webGLNodeRadius * unitNormal.x)\n + db * (-(webGLNodeRadius + webGLArrowHeadLength) * unitNormal.x + webGLArrowHeadThickness * unitNormal.y)\n + dc * (-(webGLNodeRadius + webGLArrowHeadLength) * unitNormal.x - webGLArrowHeadThickness * unitNormal.y)\n );\n\n vec2 position = (u_matrix * vec3(a_position + delta, 1)).xy;\n\n gl_Position = vec4(position, 0, 1);\n\n #ifdef PICKING_MODE\n // For picking mode, we use the ID as the color:\n v_color = a_id;\n #else\n // For normal mode, we use the color:\n v_color = a_color;\n v_opacity = a_opacity;\n #endif\n\n v_color.a *= bias;\n}\n";
7
+
8
+ export { SHADER_SOURCE as default };
@@ -0,0 +1,136 @@
1
+ 'use client';
2
+
3
+ /* istanbul ignore file */
4
+
5
+ function getCurvePoint(t, p0, p1, p2) {
6
+ var x = Math.pow(1 - t, 2) * p0.x + 2 * (1 - t) * t * p1.x + Math.pow(t, 2) * p2.x;
7
+ var y = Math.pow(1 - t, 2) * p0.y + 2 * (1 - t) * t * p1.y + Math.pow(t, 2) * p2.y;
8
+ return {
9
+ x: x,
10
+ y: y
11
+ };
12
+ }
13
+ function getCurveLength(p0, p1, p2) {
14
+ var steps = 20;
15
+ var length = 0;
16
+ var lastPoint = p0;
17
+ for (var i = 0; i < steps; i++) {
18
+ var point = getCurvePoint((i + 1) / steps, p0, p1, p2);
19
+ length += Math.sqrt(Math.pow(lastPoint.x - point.x, 2) + Math.pow(lastPoint.y - point.y, 2));
20
+ lastPoint = point;
21
+ }
22
+ return length;
23
+ }
24
+ function createDrawCurvedEdgeLabel(_ref) {
25
+ var curvatureAttribute = _ref.curvatureAttribute,
26
+ defaultCurvature = _ref.defaultCurvature,
27
+ _ref$keepLabelUpright = _ref.keepLabelUpright,
28
+ keepLabelUpright = _ref$keepLabelUpright === void 0 ? true : _ref$keepLabelUpright;
29
+ return function (context, edgeData, sourceData, targetData, settings) {
30
+ var _edgeData$color;
31
+ var size = settings.edgeLabelSize;
32
+ var curvature = edgeData[curvatureAttribute] || defaultCurvature;
33
+ var font = settings.edgeLabelFont;
34
+ var weight = settings.edgeLabelWeight;
35
+ var color = (_edgeData$color = edgeData.color) !== null && _edgeData$color !== void 0 ? _edgeData$color : settings.defaultEdgeColor;
36
+ if (edgeData.selected) color = "#f00";
37
+ if (edgeData.highlight) color = "#F54A4A";
38
+ var label = edgeData.label;
39
+ if (!label || edgeData.opacity < 1) return;
40
+ context.font = "".concat(weight, " ").concat(size, "px ").concat(font);
41
+
42
+ // Computing positions without considering nodes sizes:
43
+ var ltr = !keepLabelUpright || sourceData.x < targetData.x;
44
+ var sourceX = ltr ? sourceData.x : targetData.x;
45
+ var sourceY = ltr ? sourceData.y : targetData.y;
46
+ var targetX = ltr ? targetData.x : sourceData.x;
47
+ var targetY = ltr ? targetData.y : sourceData.y;
48
+ var centerX = (sourceX + targetX) / 2;
49
+ var centerY = (sourceY + targetY) / 2;
50
+ var diffX = targetX - sourceX;
51
+ var diffY = targetY - sourceY;
52
+ var diff = Math.sqrt(Math.pow(diffX, 2) + Math.pow(diffY, 2));
53
+ // Anchor point:
54
+ var orientation = ltr ? 1 : -1;
55
+ var anchorX = centerX + diffY * curvature * orientation;
56
+ var anchorY = centerY - diffX * curvature * orientation;
57
+
58
+ // Adapt curve points to edge thickness:
59
+ var offset = edgeData.size * 0.7 + 5;
60
+ var sourceOffsetVector = {
61
+ x: anchorY - sourceY,
62
+ y: -(anchorX - sourceX)
63
+ };
64
+ var sourceOffsetVectorLength = Math.sqrt(Math.pow(sourceOffsetVector.x, 2) + Math.pow(sourceOffsetVector.y, 2));
65
+ var targetOffsetVector = {
66
+ x: targetY - anchorY,
67
+ y: -(targetX - anchorX)
68
+ };
69
+ var targetOffsetVectorLength = Math.sqrt(Math.pow(targetOffsetVector.x, 2) + Math.pow(targetOffsetVector.y, 2));
70
+ sourceX += offset * sourceOffsetVector.x / sourceOffsetVectorLength;
71
+ sourceY += offset * sourceOffsetVector.y / sourceOffsetVectorLength;
72
+ targetX += offset * targetOffsetVector.x / targetOffsetVectorLength;
73
+ targetY += offset * targetOffsetVector.y / targetOffsetVectorLength;
74
+ // For anchor, the vector is simpler, so it is inlined:
75
+ anchorX += offset * diffY / diff;
76
+ anchorY -= offset * diffX / diff;
77
+
78
+ // Compute curve length:
79
+ var anchorPoint = {
80
+ x: anchorX,
81
+ y: anchorY
82
+ };
83
+ var sourcePoint = {
84
+ x: sourceX,
85
+ y: sourceY
86
+ };
87
+ var targetPoint = {
88
+ x: targetX,
89
+ y: targetY
90
+ };
91
+ var curveLength = getCurveLength(sourcePoint, anchorPoint, targetPoint);
92
+ if (curveLength < sourceData.size + targetData.size) return;
93
+
94
+ // Handling ellipsis
95
+ var textLength = context.measureText(label).width;
96
+ var availableTextLength = curveLength - sourceData.size - targetData.size;
97
+ if (textLength > availableTextLength) {
98
+ var ellipsis = "…";
99
+ label = label + ellipsis;
100
+ textLength = context.measureText(label).width;
101
+ while (textLength > availableTextLength && label.length > 1) {
102
+ label = label.slice(0, -2) + ellipsis;
103
+ textLength = context.measureText(label).width;
104
+ }
105
+ if (label.length < 4) return;
106
+ }
107
+
108
+ // Measure each character:
109
+ var charactersLengthCache = {};
110
+ for (var i = 0, length = label.length; i < length; i++) {
111
+ var character = label[i];
112
+ if (!charactersLengthCache[character]) {
113
+ charactersLengthCache[character] = context.measureText(character).width * (1 + curvature * 0.35);
114
+ }
115
+ }
116
+
117
+ // Draw each character:
118
+ var t = 0.5 - textLength / curveLength / 2;
119
+ for (var _i = 0, _length = label.length; _i < _length; _i++) {
120
+ var _character = label[_i];
121
+ var point = getCurvePoint(t, sourcePoint, anchorPoint, targetPoint);
122
+ var tangentX = 2 * (1 - t) * (anchorX - sourceX) + 2 * t * (targetX - anchorX);
123
+ var tangentY = 2 * (1 - t) * (anchorY - sourceY) + 2 * t * (targetY - anchorY);
124
+ var angle = Math.atan2(tangentY, tangentX);
125
+ context.save();
126
+ context.translate(point.x, point.y);
127
+ context.rotate(angle);
128
+ context.fillStyle = color;
129
+ context.fillText(_character, 0, 0);
130
+ context.restore();
131
+ t += charactersLengthCache[_character] / curveLength;
132
+ }
133
+ };
134
+ }
135
+
136
+ export { createDrawCurvedEdgeLabel };
@@ -0,0 +1,8 @@
1
+ 'use client';
2
+
3
+ /* istanbul ignore file */
4
+
5
+ // language=GLSL
6
+ var SHADER = /* glsl */"\nprecision highp float;\n\nvarying vec4 v_color;\nvarying float v_opacity;\nvarying float v_thickness;\nvarying float v_feather;\nvarying vec2 v_cpA;\nvarying vec2 v_cpB;\nvarying vec2 v_cpC;\nvarying float v_sourceSize;\nvarying vec2 v_sourcePoint;\nvarying float v_targetSize;\nvarying vec2 v_targetPoint;\n\nuniform float u_lengthToThicknessRatio;\nuniform float u_widenessToThicknessRatio;\n\nfloat det(vec2 a, vec2 b) {\n return a.x * b.y - b.x * a.y;\n}\n\nvec2 getDistanceVector(vec2 b0, vec2 b1, vec2 b2) {\n float a = det(b0, b2), b = 2.0 * det(b1, b0), d = 2.0 * det(b2, b1);\n float f = b * d - a * a;\n vec2 d21 = b2 - b1, d10 = b1 - b0, d20 = b2 - b0;\n vec2 gf = 2.0 * (b * d21 + d * d10 + a * d20);\n gf = vec2(gf.y, -gf.x);\n vec2 pp = -f * gf / dot(gf, gf);\n vec2 d0p = b0 - pp;\n float ap = det(d0p, d20), bp = 2.0 * det(d10, d0p);\n float t = clamp((ap + bp) / (2.0 * a + b + d), 0.0, 1.0);\n return mix(mix(b0, b1, t), mix(b1, b2, t), t);\n}\n\nfloat distToQuadraticBezierCurve(vec2 p, vec2 b0, vec2 b1, vec2 b2) {\n return length(getDistanceVector(b0 - p, b1 - p, b2 - p));\n}\n\nconst float epsilon = 0.7;\nconst vec4 transparent = vec4(0.0, 0.0, 0.0, 0.0);\n\nvoid main(void) {\n float dist = distToQuadraticBezierCurve(gl_FragCoord.xy, v_cpA, v_cpB, v_cpC);\n float thickness = v_thickness;\n\n if(v_sourceSize > 0.0) {\n float distToSource = length(gl_FragCoord.xy - v_sourcePoint);\n float sourceArrowLength = v_sourceSize + (thickness) * u_lengthToThicknessRatio;\n if (distToSource < sourceArrowLength) {\n thickness = (distToSource - v_sourceSize) / (sourceArrowLength - v_sourceSize) * u_widenessToThicknessRatio * thickness;\n }\n }\n\n if(v_targetSize > 0.0) {\n float distToTarget = length(gl_FragCoord.xy - v_targetPoint);\n float targetArrowLength = v_targetSize + (thickness) * u_lengthToThicknessRatio;\n if (distToTarget < targetArrowLength) {\n thickness = (distToTarget - v_targetSize) / (targetArrowLength - v_targetSize) * u_widenessToThicknessRatio * thickness;\n }\n }\n\n float halfThickness = thickness / 2.0;\n if (dist < halfThickness) {\n #ifdef PICKING_MODE\n gl_FragColor = v_color;\n #else\n float t = smoothstep(\n halfThickness - v_feather,\n halfThickness,\n dist\n );\n\n gl_FragColor = mix(v_color, transparent, t);\n gl_FragColor = mix(transparent, gl_FragColor, v_opacity);\n #endif\n } else {\n gl_FragColor = transparent;\n }\n}\n";
7
+
8
+ export { SHADER as default };