@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,149 @@
1
+ import { type Settings } from "sigma/settings";
2
+ import {
3
+ EdgeAttributes,
4
+ InternalNodeAttributes,
5
+ NodeAttributes,
6
+ } from "../../../types";
7
+
8
+ /* istanbul ignore file */
9
+
10
+ export function drawNodeLabel(
11
+ context: CanvasRenderingContext2D,
12
+ data: InternalNodeAttributes & {
13
+ opacity: number;
14
+ x: number;
15
+ y: number;
16
+ size: number;
17
+ },
18
+ settings: Settings<NodeAttributes<any>, EdgeAttributes<any>>,
19
+ ): void {
20
+ const nodeSize = data.size;
21
+ const size = settings.labelSize;
22
+ const font = settings.labelFont;
23
+ const weight = settings.labelWeight;
24
+ // use node color or default node color
25
+ const bg = settings.defaultNodeColor || "#fff";
26
+ // use label color or default label color
27
+ const color = data.labelColor || settings.labelColor.color || "#000";
28
+
29
+ if (data.highlight) {
30
+ // Then we draw the label background
31
+ context.strokeStyle = data.highlightColor ?? "#44BD87";
32
+ context.lineWidth = 1;
33
+ context.shadowOffsetX = 0;
34
+ context.shadowOffsetY = 0;
35
+ context.shadowBlur = 48;
36
+ context.shadowColor = data.color ?? "#44BD87";
37
+
38
+ const PADDING = 2;
39
+
40
+ // if (typeof data.label === "string") {
41
+ // const textWidth = context.measureText(data.label).width;
42
+ // const boxWidth = Math.round(textWidth + 5);
43
+ // const boxHeight = Math.round(size + 2 * PADDING);
44
+ // const radius = Math.max(nodeSize, size / 2) + PADDING;
45
+
46
+ // context.beginPath();
47
+ // context.moveTo(data.x + radius, data.y + boxHeight / 2);
48
+ // context.lineTo(data.x + radius + boxWidth, data.y + boxHeight / 2);
49
+ // context.lineTo(data.x + radius + boxWidth, data.y - boxHeight / 2);
50
+ // context.lineTo(data.x + radius, data.y - boxHeight / 2);
51
+ // context.lineTo(data.x + radius, data.y - radius);
52
+ // context.lineTo(data.x - radius, data.y - radius);
53
+ // context.lineTo(data.x - radius, data.y + radius);
54
+ // context.lineTo(data.x + radius, data.y + radius);
55
+ // context.lineTo(data.x + radius, data.y + boxHeight / 2);
56
+ // context.closePath();
57
+ // context.stroke();
58
+ // } else {
59
+ const radius = nodeSize + PADDING;
60
+ context.strokeRect(
61
+ data.x - radius,
62
+ data.y - radius,
63
+ radius * 2,
64
+ radius * 2,
65
+ );
66
+ // }
67
+ }
68
+
69
+ context.shadowColor = "transparent";
70
+ context.shadowBlur = 0;
71
+
72
+ if (data.selected) {
73
+ // Then we draw the label background
74
+ context.strokeStyle = "#f00";
75
+ context.lineWidth = 2;
76
+ context.shadowOffsetX = 0;
77
+ context.shadowOffsetY = 0;
78
+ context.shadowBlur = 0;
79
+
80
+ const PADDING = data.selected ? 4 : 2;
81
+
82
+ // if (typeof data.label === "string") {
83
+ // const textWidth = context.measureText(data.label).width;
84
+ // const boxWidth = Math.round(textWidth + 5);
85
+ // const boxHeight = Math.round(size + 2 * PADDING);
86
+ // const radius = Math.max(nodeSize, size / 2) + PADDING;
87
+
88
+ // context.beginPath();
89
+ // context.moveTo(data.x + radius, data.y + boxHeight / 2);
90
+ // context.lineTo(data.x + radius + boxWidth, data.y + boxHeight / 2);
91
+ // context.lineTo(data.x + radius + boxWidth, data.y - boxHeight / 2);
92
+ // context.lineTo(data.x + radius, data.y - boxHeight / 2);
93
+ // context.lineTo(data.x + radius, data.y - radius);
94
+ // context.lineTo(data.x - radius, data.y - radius);
95
+ // context.lineTo(data.x - radius, data.y + radius);
96
+ // context.lineTo(data.x + radius, data.y + radius);
97
+ // context.lineTo(data.x + radius, data.y + boxHeight / 2);
98
+ // context.closePath();
99
+ // context.stroke();
100
+ // } else {
101
+ const radius = nodeSize + PADDING;
102
+ context.strokeRect(
103
+ data.x - radius,
104
+ data.y - radius,
105
+ radius * 2,
106
+ radius * 2,
107
+ );
108
+ // }
109
+ }
110
+
111
+ if (data.isGroup) {
112
+ const container =
113
+ context.canvas.parentElement?.parentElement?.querySelector(
114
+ ".sigma-groupHandles",
115
+ ) as HTMLDivElement;
116
+ let handle = container.querySelector(
117
+ `[data-id="${data.id}"]`,
118
+ ) as HTMLDivElement;
119
+ if (!handle) {
120
+ handle = document.createElement("div");
121
+ handle.className = "sigma-groupHandle";
122
+ handle.dataset.id = data.id;
123
+ container.appendChild(handle);
124
+ }
125
+ handle.innerText = data.expanded ? "−" : "+";
126
+ handle.style.transform = `translate(-50%, -50%)`;
127
+ handle.style.left = `${data.x}px`;
128
+ handle.style.top = `${data.y + nodeSize}px`;
129
+ }
130
+
131
+ if (!data.label || data.opacity < 1) return;
132
+ const textWidth = context.measureText(data.label).width;
133
+
134
+ context.fillStyle = bg;
135
+ context.fillRect(
136
+ data.x - textWidth / 2,
137
+ data.y + nodeSize * 1.25,
138
+ textWidth,
139
+ size + 2,
140
+ );
141
+
142
+ context.fillStyle = color;
143
+ context.font = `${weight} ${size}px ${font}`;
144
+ context.fillText(
145
+ data.label,
146
+ data.x - textWidth / 2,
147
+ data.y + size + nodeSize * 1.25,
148
+ );
149
+ }
@@ -0,0 +1,67 @@
1
+ /* istanbul ignore file */
2
+
3
+ // language=GLSL
4
+ const SHADER_SOURCE = /* glsl */ `
5
+ precision highp float;
6
+
7
+ varying vec4 v_color;
8
+ varying vec4 v_stroke;
9
+ varying vec2 v_diffVector;
10
+ varying float v_border;
11
+ varying float v_segmentAngle;
12
+ varying vec4 v_colors_0;
13
+ varying vec4 v_colors_1;
14
+ varying vec4 v_colors_2;
15
+ varying vec4 v_colors_3;
16
+ varying vec4 v_colors_4;
17
+ varying vec4 v_colors_5;
18
+ varying vec4 v_colors_6;
19
+
20
+ uniform float u_sizeRatio;
21
+ uniform float u_correctionRatio;
22
+
23
+ void main(void) {
24
+ float border = u_correctionRatio * 2.0;
25
+ float dist = length(v_diffVector) + border;
26
+
27
+ float angle = atan(v_diffVector.y / v_diffVector.x);
28
+ if (v_diffVector.x < 0.0 && v_diffVector.y < 0.0) angle += ${Math.PI};
29
+ else if (v_diffVector.x < 0.0) angle += ${Math.PI};
30
+ else if (v_diffVector.y < 0.0) angle += ${2 * Math.PI};
31
+
32
+ #ifdef PICKING_MODE
33
+ gl_FragColor = v_color;
34
+ #else
35
+ vec4 color = v_color;
36
+ vec4 piecolor = vec4(0.0);
37
+ float pieSize = 4.0 * u_correctionRatio / u_sizeRatio * 4.0;
38
+
39
+ if(v_segmentAngle > 0.0) {
40
+ float segment = angle / v_segmentAngle;
41
+ if(segment >= 0.0) { piecolor = v_colors_0; }
42
+ if(segment >= 1.0) { piecolor = v_colors_1; }
43
+ if(segment >= 2.0) { piecolor = v_colors_2; }
44
+ if(segment >= 3.0) { piecolor = v_colors_3; }
45
+ if(segment >= 4.0) { piecolor = v_colors_4; }
46
+ if(segment >= 5.0) { piecolor = v_colors_5; }
47
+ if(segment >= 6.0) { piecolor = v_colors_6; }
48
+ }
49
+ if(v_segmentAngle > 0.0) {
50
+ float pieCheck = v_border - (pieSize / 2.0);
51
+ if (v_diffVector.x > pieCheck || v_diffVector.y > pieCheck ||
52
+ v_diffVector.x < -pieCheck || v_diffVector.y < -pieCheck) {
53
+ color = piecolor;
54
+ }
55
+ }
56
+ if(v_border > 0.0) {
57
+ if (v_diffVector.x > v_border || v_diffVector.y > v_border ||
58
+ v_diffVector.x < -v_border || v_diffVector.y < -v_border) {
59
+ color = v_stroke;
60
+ }
61
+ }
62
+ gl_FragColor = color;
63
+ #endif
64
+ }
65
+ `;
66
+
67
+ export default SHADER_SOURCE;
@@ -0,0 +1,109 @@
1
+ /* eslint-disable @typescript-eslint/naming-convention */
2
+
3
+ import { NodeProgram, type ProgramInfo } from "sigma/rendering";
4
+ import { type NodeDisplayData, type RenderParams } from "sigma/types";
5
+ import { floatColor } from "sigma/utils";
6
+
7
+ import { type NodeAttributes } from "../../../types";
8
+ import FRAGMENT_SHADER_SOURCE from "./frag.glsl";
9
+ import VERTEX_SHADER_SOURCE from "./vert.glsl";
10
+
11
+ /* istanbul ignore file */
12
+
13
+ const { UNSIGNED_BYTE, FLOAT } = WebGLRenderingContext;
14
+
15
+ const UNIFORMS = [
16
+ "u_sizeRatio",
17
+ "u_correctionRatio",
18
+ "u_cameraAngle",
19
+ "u_matrix",
20
+ ] as const;
21
+
22
+ const PI = Math.PI;
23
+
24
+ export class NodeRectBase extends NodeProgram<
25
+ (typeof UNIFORMS)[number],
26
+ NodeAttributes
27
+ > {
28
+ getDefinition() {
29
+ return {
30
+ VERTICES: 6,
31
+ VERTEX_SHADER_SOURCE,
32
+ FRAGMENT_SHADER_SOURCE,
33
+ METHOD: WebGLRenderingContext.TRIANGLES,
34
+ UNIFORMS,
35
+ ATTRIBUTES: [
36
+ { name: "a_position", size: 2, type: FLOAT },
37
+ { name: "a_size", size: 1, type: FLOAT },
38
+ { name: "a_border", size: 1, type: FLOAT },
39
+ { name: "a_opacity", size: 1, type: FLOAT },
40
+ { name: "a_base", size: 4, type: UNSIGNED_BYTE, normalized: true },
41
+ { name: "a_color", size: 4, type: UNSIGNED_BYTE, normalized: true },
42
+ { name: "a_stroke", size: 4, type: UNSIGNED_BYTE, normalized: true },
43
+ { name: "a_segments", size: 1, type: FLOAT },
44
+ ...Array(7)
45
+ .fill(0)
46
+ .map((_, idx) => ({
47
+ name: "a_colors_" + idx,
48
+ size: 4,
49
+ type: UNSIGNED_BYTE,
50
+ normalized: true,
51
+ })),
52
+ { name: "a_id", size: 4, type: UNSIGNED_BYTE, normalized: true },
53
+ ],
54
+ CONSTANT_ATTRIBUTES: [{ name: "a_angle", size: 1, type: FLOAT }],
55
+ CONSTANT_DATA: [
56
+ [PI / 4],
57
+ [(3 * PI) / 4],
58
+ [-PI / 4],
59
+ [(3 * PI) / 4],
60
+ [-PI / 4],
61
+ [(-3 * PI) / 4],
62
+ ],
63
+ };
64
+ }
65
+
66
+ processVisibleItem(
67
+ nodeIndex: number,
68
+ startIndex: number,
69
+ data: NodeDisplayData & NodeAttributes & { opacity: number },
70
+ ) {
71
+ const array = this.array;
72
+ const base = floatColor(this.renderer.getSetting("defaultNodeColor"));
73
+ const color = floatColor(
74
+ data.color ?? this.renderer.getSetting("defaultNodeColor"),
75
+ );
76
+ const stroke = floatColor(
77
+ data.borderColor ?? this.renderer.getSetting("defaultEdgeColor"),
78
+ );
79
+
80
+ array[startIndex++] = data.x;
81
+ array[startIndex++] = data.y;
82
+ array[startIndex++] = data.size;
83
+ array[startIndex++] = Math.min(data.border ?? 0, 4);
84
+ array[startIndex++] = data.opacity ?? 1;
85
+ array[startIndex++] = base;
86
+ array[startIndex++] = color;
87
+ array[startIndex++] = stroke;
88
+ array[startIndex++] = Math.min(7, data.pie?.length ?? 0);
89
+ Array(7)
90
+ .fill(0)
91
+ .forEach((_, idx) => {
92
+ array[startIndex++] = floatColor(data.pie?.[idx] ?? "#0000");
93
+ });
94
+ array[startIndex++] = nodeIndex;
95
+ }
96
+
97
+ setUniforms(
98
+ params: RenderParams,
99
+ { gl, uniformLocations }: ProgramInfo,
100
+ ): void {
101
+ const { u_sizeRatio, u_correctionRatio, u_cameraAngle, u_matrix } =
102
+ uniformLocations;
103
+
104
+ gl.uniform1f(u_sizeRatio, params.sizeRatio);
105
+ gl.uniform1f(u_cameraAngle, params.cameraAngle);
106
+ gl.uniform1f(u_correctionRatio, params.correctionRatio);
107
+ gl.uniformMatrix3fv(u_matrix, false, params.matrix);
108
+ }
109
+ }
@@ -0,0 +1,87 @@
1
+ /* istanbul ignore file */
2
+
3
+ // language=GLSL
4
+ const SHADER_SOURCE = /* glsl */ `
5
+ attribute vec4 a_id;
6
+ attribute vec4 a_base;
7
+ attribute vec4 a_color;
8
+ attribute vec4 a_stroke;
9
+ attribute vec2 a_position;
10
+ attribute float a_size;
11
+ attribute float a_border;
12
+ attribute float a_angle;
13
+ attribute float a_opacity;
14
+ attribute float a_segments;
15
+ attribute vec4 a_colors_0;
16
+ attribute vec4 a_colors_1;
17
+ attribute vec4 a_colors_2;
18
+ attribute vec4 a_colors_3;
19
+ attribute vec4 a_colors_4;
20
+ attribute vec4 a_colors_5;
21
+ attribute vec4 a_colors_6;
22
+
23
+ uniform mat3 u_matrix;
24
+ uniform float u_sizeRatio;
25
+ uniform float u_cameraAngle;
26
+ uniform float u_correctionRatio;
27
+
28
+ varying vec4 v_color;
29
+ varying vec4 v_stroke;
30
+ varying float v_border;
31
+ varying vec2 v_diffVector;
32
+ varying float v_segmentAngle;
33
+ varying vec4 v_colors_0;
34
+ varying vec4 v_colors_1;
35
+ varying vec4 v_colors_2;
36
+ varying vec4 v_colors_3;
37
+ varying vec4 v_colors_4;
38
+ varying vec4 v_colors_5;
39
+ varying vec4 v_colors_6;
40
+
41
+ const float bias = 255.0 / 254.0;
42
+ const float sqrt_8 = sqrt(8.0);
43
+
44
+ void main() {
45
+ float angle = a_angle + u_cameraAngle;
46
+
47
+ float size = a_size * u_correctionRatio / u_sizeRatio * sqrt_8;
48
+ vec2 diffVector = size * vec2(cos(angle), sin(angle));
49
+ vec2 position = a_position + diffVector;
50
+
51
+ float borderLessSize = (a_size - a_border) * u_correctionRatio / u_sizeRatio * sqrt_8;
52
+
53
+ gl_Position = vec4(
54
+ (u_matrix * vec3(position, 1)).xy,
55
+ 0,
56
+ 1
57
+ );
58
+
59
+ v_diffVector = diffVector;
60
+ v_border = a_border * u_correctionRatio / u_sizeRatio * sqrt_8;
61
+ v_border = borderLessSize / ${Math.PI / 2.2};
62
+
63
+ #ifdef PICKING_MODE
64
+ v_color = a_id;
65
+ #else
66
+ v_color = mix(a_base, a_color, a_opacity * bias);
67
+ v_stroke = mix(a_base, a_stroke, a_opacity * bias);
68
+
69
+ // pie colors
70
+ v_segmentAngle = 0.0;
71
+ if(a_segments > 0.0) {
72
+ v_segmentAngle = ${Math.PI * 2} / a_segments;
73
+ v_colors_0 = mix(a_base, a_colors_0, a_opacity * bias);
74
+ v_colors_1 = mix(a_base, a_colors_1, a_opacity * bias);
75
+ v_colors_2 = mix(a_base, a_colors_2, a_opacity * bias);
76
+ v_colors_3 = mix(a_base, a_colors_3, a_opacity * bias);
77
+ v_colors_4 = mix(a_base, a_colors_4, a_opacity * bias);
78
+ v_colors_5 = mix(a_base, a_colors_5, a_opacity * bias);
79
+ v_colors_6 = mix(a_base, a_colors_6, a_opacity * bias);
80
+ }
81
+ #endif
82
+
83
+ v_color.a *= bias;
84
+ }
85
+ `;
86
+
87
+ export default SHADER_SOURCE;
@@ -0,0 +1,19 @@
1
+ import { createNodeCompoundProgram } from "sigma/rendering";
2
+ import { NodeAttributes } from "../../types";
3
+ import { NodeBadgeProgram } from "../node-badge";
4
+ import { NodeImageProgram } from "../node-image";
5
+ import { NodeRectBase } from "./base";
6
+ import { drawNodeHover } from "./base/drawHover";
7
+ import { drawNodeLabel } from "./base/drawLabel";
8
+
9
+ /* istanbul ignore file */
10
+
11
+ export const NodeRectProgram = createNodeCompoundProgram<NodeAttributes<any>>(
12
+ [
13
+ NodeRectBase,
14
+ NodeImageProgram(false),
15
+ ...NodeBadgeProgram(false),
16
+ ] as AnyObject,
17
+ drawNodeLabel as AnyObject,
18
+ drawNodeHover as AnyObject,
19
+ );
@@ -0,0 +1,210 @@
1
+ import { GraphOptions } from "graphology-types";
2
+ import { RefObject } from "react";
3
+ import { Graph } from "../graph";
4
+
5
+ interface NodeBadge {
6
+ position:
7
+ | "top-left"
8
+ | "top-right"
9
+ | "bottom-left"
10
+ | "bottom-right"
11
+ | "top"
12
+ | "left"
13
+ | "right";
14
+ type?: "star" | "exclaim" | "thumbUp" | "thumbDown";
15
+ path?: string;
16
+ /**
17
+ * icon color
18
+ */
19
+ iconColor?: string;
20
+ /**
21
+ * fill color
22
+ */
23
+ color?: string;
24
+ }
25
+ export interface NodeAttributes<N = KeyValue> {
26
+ /**
27
+ * node label
28
+ */
29
+ label?: string;
30
+ /**
31
+ * node shape
32
+ */
33
+ type?: "circle" | "rect";
34
+ /**
35
+ * node size
36
+ */
37
+ size?: number;
38
+ /**
39
+ * node weight to apply proportional size
40
+ */
41
+ weight?: number;
42
+ /**
43
+ * label color
44
+ */
45
+ labelColor?: string;
46
+ /**
47
+ * border color
48
+ */
49
+ borderColor?: string;
50
+ /**
51
+ * icon color
52
+ */
53
+ iconColor?: string;
54
+ /**
55
+ * fill color
56
+ */
57
+ color?: string;
58
+ /**
59
+ * border width
60
+ */
61
+ border?: number;
62
+ /**
63
+ * hover color
64
+ */
65
+ hoverColor?: string;
66
+ /**
67
+ * highlighted color
68
+ */
69
+ highlightColor?: string;
70
+ /**
71
+ * define node type
72
+ */
73
+ nodeType?: string;
74
+ /**
75
+ * pie colors
76
+ */
77
+ pie?: string[];
78
+ /**
79
+ * svg path
80
+ */
81
+ path?: string;
82
+ /**
83
+ * avatar/image url
84
+ */
85
+ image?: string;
86
+ /**
87
+ * selected state
88
+ */
89
+ selected?: boolean;
90
+ /**
91
+ * highlighted state
92
+ */
93
+ highlight?: boolean;
94
+
95
+ badge?: NodeBadge[];
96
+
97
+ x?: number;
98
+ y?: number;
99
+ hidden?: boolean;
100
+
101
+ data?: N;
102
+ }
103
+
104
+ export interface EdgeAttributes<E = KeyValue> {
105
+ /**
106
+ * edge shape
107
+ */
108
+ type?: "line" | "curved";
109
+ /**
110
+ * edge label
111
+ */
112
+ label?: string;
113
+ /**
114
+ * edge size
115
+ */
116
+ size?: number;
117
+ /**
118
+ * edge weight to apply proportional size
119
+ */
120
+ weight?: number;
121
+ /**
122
+ * edge color
123
+ */
124
+ color?: string;
125
+ /**
126
+ * hover color
127
+ */
128
+ hoverColor?: string;
129
+ /**
130
+ * highlighted color
131
+ */
132
+ highlightColor?: string;
133
+ /**
134
+ * define edge type
135
+ */
136
+ edgeType?: "curved" | "line";
137
+ /**
138
+ * edge arrow head
139
+ */
140
+ arrow?: "source" | "target" | "both";
141
+ /**
142
+ * edge count
143
+ */
144
+ count?: number;
145
+
146
+ /**
147
+ * selected state
148
+ */
149
+ selected?: boolean;
150
+ /**
151
+ * highlighted state
152
+ */
153
+ highlight?: boolean;
154
+
155
+ data?: E;
156
+ }
157
+
158
+ export interface InternalNodeAttributes<N = KeyValue>
159
+ extends NodeAttributes<N> {
160
+ groupId?: string;
161
+ isGroup?: boolean;
162
+ expanded?: boolean;
163
+ nodeList?: string[];
164
+ opacity?: number;
165
+ id?: string;
166
+ fixed?: boolean;
167
+ originalEdges?: Array<{
168
+ key: string;
169
+ source: string;
170
+ target: string;
171
+ attributes?: KeyValue;
172
+ }>;
173
+ }
174
+ export interface InternalEdgeAttributes<E = KeyValue>
175
+ extends EdgeAttributes<E> {
176
+ opacity?: number;
177
+ curvature?: number;
178
+ id?: string;
179
+ }
180
+
181
+ export interface RawGraph<N = KeyValue, E = KeyValue> {
182
+ nodes: { key: string; attributes?: NodeAttributes<N> }[];
183
+ edges: {
184
+ key: string;
185
+ source: string;
186
+ target: string;
187
+ attributes?: EdgeAttributes<E>;
188
+ }[];
189
+ attributes?: KeyValue;
190
+ options?: GraphOptions;
191
+ }
192
+
193
+ export interface GraphRef<N = KeyValue, E = KeyValue> {
194
+ graph: Graph<N, E>;
195
+ }
196
+
197
+ export interface GraphProps<N = KeyValue, E = KeyValue> {
198
+ ref?: RefObject<GraphRef<N, E> | null>;
199
+ data: RawGraph<N, E> | Graph<N, E>;
200
+ nodeReducer?: (node: NodeAttributes<N>) => NodeAttributes<N>;
201
+ edgeReducer?: (edge: EdgeAttributes<E>) => EdgeAttributes<E>;
202
+
203
+ onSelectChange?: (selected: string[]) => void;
204
+
205
+ onNodeDoubleClick?: (node: string, attributes: NodeAttributes<N>) => void;
206
+ onContextMenu?: (
207
+ type: "canvas" | "node" | "edge",
208
+ nodesOrEdge?: string | string[],
209
+ ) => void;
210
+ }