@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,2 @@
1
+ declare const SHADER_SOURCE: string;
2
+ export default SHADER_SOURCE;
@@ -0,0 +1,11 @@
1
+ import { NodeAttributes } from "../../types";
2
+ export declare const NodeCircleProgram: {
3
+ new (_gl: WebGLRenderingContext, _pickingBuffer: WebGLFramebuffer | null, _renderer: import("sigma").default<NodeAttributes<any>, import("graphology-types").Attributes, import("graphology-types").Attributes>): {
4
+ drawLabel: import("sigma/rendering").NodeLabelDrawingFunction<NodeAttributes<any>, import("graphology-types").Attributes, import("graphology-types").Attributes> | undefined;
5
+ drawHover: import("sigma/rendering").NodeHoverDrawingFunction<NodeAttributes<any>, import("graphology-types").Attributes, import("graphology-types").Attributes> | undefined;
6
+ kill(): void;
7
+ reallocate(_capacity: number): void;
8
+ process(_nodeIndex: number, _offset: number, _data: import("sigma/types").NodeDisplayData): void;
9
+ render(_params: import("sigma/types").RenderParams): void;
10
+ };
11
+ };
@@ -0,0 +1,25 @@
1
+ import { type Attributes } from "graphology-types";
2
+ import { type NodeHoverDrawingFunction, type NodeLabelDrawingFunction, type NodeProgramType } from "sigma/rendering";
3
+ import { type EdgeAttributes, type NodeAttributes } from "../../types";
4
+ import { type TextureManagerOptions } from "./texture";
5
+ interface CreateNodeImageProgramOptions<N extends Attributes, E extends Attributes, G extends Attributes> extends TextureManagerOptions {
6
+ drawingMode: "background" | "color";
7
+ keepWithinCircle: boolean;
8
+ drawLabel: NodeLabelDrawingFunction<N, E, G> | undefined;
9
+ drawHover: NodeHoverDrawingFunction<N, E, G> | undefined;
10
+ padding: number;
11
+ colorAttribute: string;
12
+ }
13
+ /**
14
+ * To share the texture between the program instances of the graph and the
15
+ * hovered nodes (to prevent some flickering, mostly), this program must be
16
+ * "built" for each sigma instance:
17
+ */
18
+ export default function getNodeImageProgram(options?: Partial<CreateNodeImageProgramOptions<NodeAttributes & {
19
+ bg: string;
20
+ opacity: number;
21
+ }, EdgeAttributes, Attributes>>): NodeProgramType<NodeAttributes & {
22
+ bg: string;
23
+ opacity: number;
24
+ }, EdgeAttributes>;
25
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const SHADER_SOURCE: string;
2
+ export default SHADER_SOURCE;
@@ -0,0 +1,5 @@
1
+ export { default as createNodeImageProgram } from "./factory";
2
+ export declare const NodeImageProgram: (isCircle: boolean) => import("sigma/rendering").NodeProgramType<import("../..").NodeAttributes<KeyValue<any>> & {
3
+ bg: string;
4
+ opacity: number;
5
+ }, import("../..").EdgeAttributes<KeyValue<any>>>;
@@ -0,0 +1,102 @@
1
+ import { EventEmitter } from "events";
2
+ import { type Coordinates } from "sigma/types";
3
+ /**
4
+ * Useful types:
5
+ * *************
6
+ */
7
+ export interface ImageLoading {
8
+ status: "loading";
9
+ }
10
+ export interface ImageError {
11
+ status: "error";
12
+ }
13
+ export interface ImageReady {
14
+ status: "ready";
15
+ image: HTMLImageElement;
16
+ sourceX: number;
17
+ sourceY: number;
18
+ sourceSize: number;
19
+ destinationSize: number;
20
+ }
21
+ export type ImageType = ImageLoading | ImageError | ImageReady;
22
+ export type Atlas = Record<string, Coordinates & {
23
+ size: number;
24
+ }>;
25
+ export interface TextureManagerOptions {
26
+ size: {
27
+ mode: "auto";
28
+ } | {
29
+ mode: "max";
30
+ value: number;
31
+ } | {
32
+ mode: "force";
33
+ value: number;
34
+ };
35
+ objectFit: "contain" | "cover" | "fill";
36
+ correctCentering: boolean;
37
+ }
38
+ export declare const DEFAULT_TEXTURE_MANAGER_OPTIONS: TextureManagerOptions;
39
+ export declare const DEBOUNCE_TIMEOUT = 100;
40
+ export declare const MARGIN_IN_TEXTURE = 1;
41
+ /**
42
+ * Helpers:
43
+ * ********
44
+ */
45
+ /**
46
+ * This helper loads an image at a given URL, and returns an HTMLImageElement
47
+ * with it displayed once it's properly loaded, within a promise.
48
+ */
49
+ export declare function loadRasterImage(imageSource: string): Promise<HTMLImageElement>;
50
+ export declare const makeSvg: (path?: string) => string;
51
+ /**
52
+ * This helper loads an SVG image at a given URL, adjusts its size to a given
53
+ * size, and returns an HTMLImageElement with it displayed once it's properly
54
+ * loaded, within a promise.
55
+ */
56
+ export declare function loadSVGImage(imageSource: string, { size }?: {
57
+ size?: number;
58
+ }): Promise<HTMLImageElement>;
59
+ /**
60
+ * This helper loads an image using the proper function.
61
+ */
62
+ export declare function loadImage(imageSource: string, { size }?: {
63
+ size?: number;
64
+ }): Promise<HTMLImageElement>;
65
+ /**
66
+ * This helper computes exact coordinates to draw an image onto a texture.
67
+ */
68
+ export declare function refineImage(image: HTMLImageElement, corrector: PictogramCenteringCorrector, { objectFit, size, correctCentering }: TextureManagerOptions): Omit<ImageReady, "status" | "image">;
69
+ /**
70
+ * This helper takes a collection of image states and a context, draw all the
71
+ * images in the context, and returns an atlas to get where each image is drawn
72
+ * on the texture.
73
+ */
74
+ export declare function drawTexture(ctx: CanvasRenderingContext2D, images: Record<string, ImageType>): Atlas;
75
+ /**
76
+ * This class helps to "correct" the centering of an SVG pictogram by finding
77
+ * the "true" visually correct center through the barycenter of the pictogram's
78
+ * alpha layer in x and y dimension.
79
+ */
80
+ export declare class PictogramCenteringCorrector {
81
+ canvas: HTMLCanvasElement;
82
+ context: CanvasRenderingContext2D;
83
+ constructor();
84
+ getCorrectionOffset(image: HTMLImageElement, size: number): Coordinates;
85
+ }
86
+ export declare class TextureManager extends EventEmitter {
87
+ static NEW_TEXTURE_EVENT: string;
88
+ private readonly options;
89
+ private readonly canvas;
90
+ private readonly ctx;
91
+ private frameId?;
92
+ private readonly corrector;
93
+ private imageStates;
94
+ private texture;
95
+ private atlas;
96
+ constructor(options?: Partial<TextureManagerOptions>);
97
+ private scheduleGenerateTexture;
98
+ private generateTexture;
99
+ registerImage(source: string): Promise<void>;
100
+ getAtlas(): Atlas;
101
+ getTexture(): ImageData;
102
+ }
@@ -0,0 +1,2 @@
1
+ declare const VERTEX_SHADER_SOURCE = "\nattribute vec4 a_id;\nattribute vec4 a_fill;\nattribute vec4 a_color;\nattribute vec2 a_position;\nattribute float a_size;\nattribute float a_angle;\nattribute float a_colorMode;\nattribute float a_opacity;\nattribute vec4 a_texture;\n\nuniform mat3 u_matrix;\nuniform float u_sizeRatio;\nuniform float u_correctionRatio;\n\nvarying vec4 v_fill;\nvarying vec4 v_color;\nvarying vec2 v_diffVector;\nvarying float v_radius;\nvarying float v_opacity;\nvarying vec4 v_texture;\nvarying float v_colorMode;\n\nconst float bias = 255.0 / 254.0;\nconst float marginRatio = 1.05;\n\nvoid main() {\n float size = a_size * u_correctionRatio / u_sizeRatio * 4.0;\n vec2 diffVector = size * vec2(cos(a_angle), sin(a_angle));\n vec2 position = a_position + diffVector * marginRatio;\n gl_Position = vec4(\n (u_matrix * vec3(position, 1)).xy,\n 0,\n 1\n );\n\n v_diffVector = diffVector;\n v_radius = size / 2.0 / marginRatio;\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_fill = vec4(0.0, 0.0, 0.0, 0.0);\n v_color = vec4(a_color.rgb, a_opacity * bias);\n v_opacity = a_opacity;\n v_colorMode = a_colorMode;\n // Pass the texture coordinates:\n v_texture = a_texture;\n #endif\n\n v_color.a *= bias;\n}\n";
2
+ export default VERTEX_SHADER_SOURCE;
@@ -0,0 +1,8 @@
1
+ import { type Settings } from "sigma/settings";
2
+ import { EdgeAttributes, NodeAttributes } from "../../../types";
3
+ export declare function drawNodeHover(context: CanvasRenderingContext2D, data: NodeAttributes & {
4
+ opacity: number;
5
+ x: number;
6
+ y: number;
7
+ size: number;
8
+ }, settings: Settings<NodeAttributes, EdgeAttributes>): void;
@@ -0,0 +1,8 @@
1
+ import { type Settings } from "sigma/settings";
2
+ import { EdgeAttributes, InternalNodeAttributes, NodeAttributes } from "../../../types";
3
+ export declare function drawNodeLabel(context: CanvasRenderingContext2D, data: InternalNodeAttributes & {
4
+ opacity: number;
5
+ x: number;
6
+ y: number;
7
+ size: number;
8
+ }, settings: Settings<NodeAttributes<any>, EdgeAttributes<any>>): void;
@@ -0,0 +1,2 @@
1
+ declare const SHADER_SOURCE: string;
2
+ export default SHADER_SOURCE;
@@ -0,0 +1,34 @@
1
+ import { NodeProgram, type ProgramInfo } from "sigma/rendering";
2
+ import { type NodeDisplayData, type RenderParams } from "sigma/types";
3
+ import { type NodeAttributes } from "../../../types";
4
+ declare const UNIFORMS: readonly ["u_sizeRatio", "u_correctionRatio", "u_cameraAngle", "u_matrix"];
5
+ export declare class NodeRectBase extends NodeProgram<(typeof UNIFORMS)[number], NodeAttributes> {
6
+ getDefinition(): {
7
+ VERTICES: number;
8
+ VERTEX_SHADER_SOURCE: string;
9
+ FRAGMENT_SHADER_SOURCE: string;
10
+ METHOD: 4;
11
+ UNIFORMS: readonly ["u_sizeRatio", "u_correctionRatio", "u_cameraAngle", "u_matrix"];
12
+ ATTRIBUTES: ({
13
+ name: string;
14
+ size: number;
15
+ type: 5121;
16
+ normalized: boolean;
17
+ } | {
18
+ name: string;
19
+ size: number;
20
+ type: 5126;
21
+ })[];
22
+ CONSTANT_ATTRIBUTES: {
23
+ name: string;
24
+ size: number;
25
+ type: 5126;
26
+ }[];
27
+ CONSTANT_DATA: number[][];
28
+ };
29
+ processVisibleItem(nodeIndex: number, startIndex: number, data: NodeDisplayData & NodeAttributes & {
30
+ opacity: number;
31
+ }): void;
32
+ setUniforms(params: RenderParams, { gl, uniformLocations }: ProgramInfo): void;
33
+ }
34
+ export {};
@@ -0,0 +1,2 @@
1
+ declare const SHADER_SOURCE: string;
2
+ export default SHADER_SOURCE;
@@ -0,0 +1,11 @@
1
+ import { NodeAttributes } from "../../types";
2
+ export declare const NodeRectProgram: {
3
+ new (_gl: WebGLRenderingContext, _pickingBuffer: WebGLFramebuffer | null, _renderer: import("sigma").default<NodeAttributes<any>, import("graphology-types").Attributes, import("graphology-types").Attributes>): {
4
+ drawLabel: import("sigma/rendering").NodeLabelDrawingFunction<NodeAttributes<any>, import("graphology-types").Attributes, import("graphology-types").Attributes> | undefined;
5
+ drawHover: import("sigma/rendering").NodeHoverDrawingFunction<NodeAttributes<any>, import("graphology-types").Attributes, import("graphology-types").Attributes> | undefined;
6
+ kill(): void;
7
+ reallocate(_capacity: number): void;
8
+ process(_nodeIndex: number, _offset: number, _data: import("sigma/types").NodeDisplayData): void;
9
+ render(_params: import("sigma/types").RenderParams): void;
10
+ };
11
+ };
@@ -0,0 +1,189 @@
1
+ import { GraphOptions } from "graphology-types";
2
+ import { RefObject } from "react";
3
+ import { Graph } from "../graph";
4
+ interface NodeBadge {
5
+ position: "top-left" | "top-right" | "bottom-left" | "bottom-right" | "top" | "left" | "right";
6
+ type?: "star" | "exclaim" | "thumbUp" | "thumbDown";
7
+ path?: string;
8
+ /**
9
+ * icon color
10
+ */
11
+ iconColor?: string;
12
+ /**
13
+ * fill color
14
+ */
15
+ color?: string;
16
+ }
17
+ export interface NodeAttributes<N = KeyValue> {
18
+ /**
19
+ * node label
20
+ */
21
+ label?: string;
22
+ /**
23
+ * node shape
24
+ */
25
+ type?: "circle" | "rect";
26
+ /**
27
+ * node size
28
+ */
29
+ size?: number;
30
+ /**
31
+ * node weight to apply proportional size
32
+ */
33
+ weight?: number;
34
+ /**
35
+ * label color
36
+ */
37
+ labelColor?: string;
38
+ /**
39
+ * border color
40
+ */
41
+ borderColor?: string;
42
+ /**
43
+ * icon color
44
+ */
45
+ iconColor?: string;
46
+ /**
47
+ * fill color
48
+ */
49
+ color?: string;
50
+ /**
51
+ * border width
52
+ */
53
+ border?: number;
54
+ /**
55
+ * hover color
56
+ */
57
+ hoverColor?: string;
58
+ /**
59
+ * highlighted color
60
+ */
61
+ highlightColor?: string;
62
+ /**
63
+ * define node type
64
+ */
65
+ nodeType?: string;
66
+ /**
67
+ * pie colors
68
+ */
69
+ pie?: string[];
70
+ /**
71
+ * svg path
72
+ */
73
+ path?: string;
74
+ /**
75
+ * avatar/image url
76
+ */
77
+ image?: string;
78
+ /**
79
+ * selected state
80
+ */
81
+ selected?: boolean;
82
+ /**
83
+ * highlighted state
84
+ */
85
+ highlight?: boolean;
86
+ badge?: NodeBadge[];
87
+ x?: number;
88
+ y?: number;
89
+ hidden?: boolean;
90
+ data?: N;
91
+ }
92
+ export interface EdgeAttributes<E = KeyValue> {
93
+ /**
94
+ * edge shape
95
+ */
96
+ type?: "line" | "curved";
97
+ /**
98
+ * edge label
99
+ */
100
+ label?: string;
101
+ /**
102
+ * edge size
103
+ */
104
+ size?: number;
105
+ /**
106
+ * edge weight to apply proportional size
107
+ */
108
+ weight?: number;
109
+ /**
110
+ * edge color
111
+ */
112
+ color?: string;
113
+ /**
114
+ * hover color
115
+ */
116
+ hoverColor?: string;
117
+ /**
118
+ * highlighted color
119
+ */
120
+ highlightColor?: string;
121
+ /**
122
+ * define edge type
123
+ */
124
+ edgeType?: "curved" | "line";
125
+ /**
126
+ * edge arrow head
127
+ */
128
+ arrow?: "source" | "target" | "both";
129
+ /**
130
+ * edge count
131
+ */
132
+ count?: number;
133
+ /**
134
+ * selected state
135
+ */
136
+ selected?: boolean;
137
+ /**
138
+ * highlighted state
139
+ */
140
+ highlight?: boolean;
141
+ data?: E;
142
+ }
143
+ export interface InternalNodeAttributes<N = KeyValue> extends NodeAttributes<N> {
144
+ groupId?: string;
145
+ isGroup?: boolean;
146
+ expanded?: boolean;
147
+ nodeList?: string[];
148
+ opacity?: number;
149
+ id?: string;
150
+ fixed?: boolean;
151
+ originalEdges?: Array<{
152
+ key: string;
153
+ source: string;
154
+ target: string;
155
+ attributes?: KeyValue;
156
+ }>;
157
+ }
158
+ export interface InternalEdgeAttributes<E = KeyValue> extends EdgeAttributes<E> {
159
+ opacity?: number;
160
+ curvature?: number;
161
+ id?: string;
162
+ }
163
+ export interface RawGraph<N = KeyValue, E = KeyValue> {
164
+ nodes: {
165
+ key: string;
166
+ attributes?: NodeAttributes<N>;
167
+ }[];
168
+ edges: {
169
+ key: string;
170
+ source: string;
171
+ target: string;
172
+ attributes?: EdgeAttributes<E>;
173
+ }[];
174
+ attributes?: KeyValue;
175
+ options?: GraphOptions;
176
+ }
177
+ export interface GraphRef<N = KeyValue, E = KeyValue> {
178
+ graph: Graph<N, E>;
179
+ }
180
+ export interface GraphProps<N = KeyValue, E = KeyValue> {
181
+ ref?: RefObject<GraphRef<N, E> | null>;
182
+ data: RawGraph<N, E> | Graph<N, E>;
183
+ nodeReducer?: (node: NodeAttributes<N>) => NodeAttributes<N>;
184
+ edgeReducer?: (edge: EdgeAttributes<E>) => EdgeAttributes<E>;
185
+ onSelectChange?: (selected: string[]) => void;
186
+ onNodeDoubleClick?: (node: string, attributes: NodeAttributes<N>) => void;
187
+ onContextMenu?: (type: "canvas" | "node" | "edge", nodesOrEdge?: string | string[]) => void;
188
+ }
189
+ export {};
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@react-fabric/graph",
3
+ "version": "1.0.0-beta.58",
4
+ "description": "RUF: SigmaJS link analysis graph",
5
+ "author": "Adarsh Pastakia <adarshpastakia@outlook.com>",
6
+ "license": "MIT",
7
+ "repository": "https://github.com/adarshpastakia/react-ui-framework/tree/main/packages/graph",
8
+ "source": "src/index.ts",
9
+ "main": "dist/cjs/index.js",
10
+ "module": "dist/esm/index.js",
11
+ "types": "dist/types/index.d.ts",
12
+ "directories": {
13
+ "src": "src",
14
+ "styles": "css",
15
+ "test": "tests"
16
+ },
17
+ "files": [
18
+ "css",
19
+ "src",
20
+ "dist"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "registry": "https://registry.npmjs.org/"
25
+ },
26
+ "scripts": {
27
+ "makelink": "yarn link",
28
+ "removelink": "yarn unlink",
29
+ "prebuild": "rm -rf ./dist",
30
+ "build:dts": "tsc -p ./tsconfig.build.json",
31
+ "build:rollup": "rollup -c ../../rollup.config.mjs",
32
+ "build": "npm-run-all -p build:rollup build:dts",
33
+ "watch:dts": "tsc -w -p ./tsconfig.build.json",
34
+ "watch:rollup": "rollup -w -c ../../rollup.config.mjs",
35
+ "watch": "npm-run-all -p watch:rollup watch:dts"
36
+ },
37
+ "dependencies": {
38
+ "@floating-ui/react": "~0.27.16",
39
+ "@react-fabric/core": "^1.0.0-beta.58",
40
+ "@react-fabric/utilities": "^1.0.0-beta.58",
41
+ "@sigma/edge-curve": "~3.1.0",
42
+ "@sigma/utils": "~3.0.0",
43
+ "classnames": "~2.5.1",
44
+ "dom-to-image": "~2.6.0",
45
+ "graphology": "~0.26.0",
46
+ "graphology-canvas": "~0.4.2",
47
+ "graphology-layout": "~0.6.1",
48
+ "graphology-layout-forceatlas2": "~0.10.1",
49
+ "graphology-shortest-path": "~2.1.0",
50
+ "graphology-types": "~0.24.8",
51
+ "sigma": "~3.0.2"
52
+ },
53
+ "peerDependencies": {
54
+ "i18next": "~25.6.0",
55
+ "react": "~19.2.0",
56
+ "react-dom": "~19.2.0",
57
+ "react-i18next": "~16.2.1"
58
+ },
59
+ "devDependencies": {
60
+ "@types/dom-to-image": "~2.6.7",
61
+ "@types/highlight.js": "~10.1.0",
62
+ "elkjs": "~0.11.0"
63
+ },
64
+ "engines": {
65
+ "node": ">=18.12.0",
66
+ "npm": ">=8.19.0"
67
+ },
68
+ "gitHead": "7e66f8c498e37a40e410ecafff2ea6b31505dc1a"
69
+ }
@@ -0,0 +1,135 @@
1
+ import { CoreIcons, Icon } from "@react-fabric/core";
2
+ import { fitViewportToNodes } from "@sigma/utils";
3
+ import {
4
+ createContext,
5
+ PropsWithChildren,
6
+ useContext,
7
+ useEffect,
8
+ useImperativeHandle,
9
+ useState,
10
+ } from "react";
11
+ import { SigmaNodeEventPayload } from "sigma/types";
12
+ import { Graph } from "../graph";
13
+ import { useDragSelection } from "../hooks/sigmaDragSelect";
14
+ import { useGraphology } from "../hooks/useGraphology";
15
+ import { useSigma } from "../hooks/useSigma";
16
+ import { EdgeAttributes, GraphProps, NodeAttributes } from "../types";
17
+
18
+ interface Context<N = KeyValue, E = KeyValue> {
19
+ sigma: ReturnType<typeof useSigma>;
20
+ graph: Graph<NodeAttributes<N>, EdgeAttributes<E>>;
21
+ selected: string[];
22
+ layoutRunning: boolean;
23
+ dragSelector: ReturnType<typeof useDragSelection>;
24
+ resetViewport: () => void;
25
+ zoomIn: () => void;
26
+ zoomOut: () => void;
27
+ }
28
+
29
+ const GraphContext = createContext<Context>({} as Context);
30
+
31
+ export const useGraph = <N = KeyValue, E = KeyValue>() =>
32
+ useContext(GraphContext) as Context<N, E>;
33
+
34
+ export const GraphProvider = <N = KeyValue, E = KeyValue>({
35
+ ref,
36
+ data,
37
+ children,
38
+ nodeReducer,
39
+ edgeReducer,
40
+ onSelectChange,
41
+ onNodeDoubleClick,
42
+ onContextMenu,
43
+ }: PropsWithChildren<GraphProps<N, E>>) => {
44
+ const { graph, selected } = useGraphology<N, E>(data);
45
+ const sigma = useSigma<N, E>(graph, nodeReducer, edgeReducer);
46
+
47
+ const dragSelector = useDragSelection(sigma.instance);
48
+
49
+ const [layoutRunning, setLayoutRunning] = useState(false);
50
+
51
+ const resetViewport = () => {
52
+ if (graph.size === 0) return;
53
+ sigma.instance &&
54
+ fitViewportToNodes(sigma.instance, graph.nodes(), {
55
+ animate: true,
56
+ });
57
+ };
58
+
59
+ const zoomIn = () => {
60
+ if (graph.size === 0) return;
61
+ sigma.instance?.getCamera().animatedZoom();
62
+ };
63
+
64
+ const zoomOut = () => {
65
+ if (graph.size === 0) return;
66
+ sigma.instance?.getCamera().animatedUnzoom();
67
+ };
68
+
69
+ useEffect(() => {
70
+ const resetHandler = () => {
71
+ sigma.instance &&
72
+ fitViewportToNodes(sigma.instance, graph.nodes(), {
73
+ animate: true,
74
+ });
75
+ };
76
+ graph.on("layoutRunning", setLayoutRunning);
77
+ graph.on("layoutDone", resetHandler);
78
+ onSelectChange && graph.on("nodesSelected", onSelectChange);
79
+
80
+ return () => {
81
+ graph.off("layoutDone", resetHandler);
82
+ graph.off("layoutRunning", setLayoutRunning);
83
+ onSelectChange && graph.off("nodesSelected", onSelectChange);
84
+ };
85
+ }, [graph, sigma, onSelectChange]);
86
+
87
+ useEffect(() => {
88
+ const handleClick = (e: SigmaNodeEventPayload) => {
89
+ onNodeDoubleClick?.(e.node, graph.getNodeAttributes(e.node));
90
+ e.event.original.preventDefault();
91
+ e.event.preventSigmaDefault();
92
+ e.preventSigmaDefault();
93
+ return false;
94
+ };
95
+ sigma.instance?.on("doubleClickNode", handleClick);
96
+
97
+ return () => {
98
+ sigma.instance?.off("doubleClickNode", handleClick);
99
+ };
100
+ }, [sigma, graph, onNodeDoubleClick]);
101
+
102
+ useImperativeHandle(
103
+ ref,
104
+ () => ({
105
+ graph,
106
+ sigma,
107
+ }),
108
+ [graph, sigma],
109
+ );
110
+
111
+ return (
112
+ <GraphContext.Provider
113
+ value={
114
+ {
115
+ sigma,
116
+ graph,
117
+ selected,
118
+ dragSelector,
119
+ layoutRunning,
120
+ resetViewport,
121
+ zoomIn,
122
+ zoomOut,
123
+ } as AnyObject
124
+ }
125
+ >
126
+ {children}
127
+
128
+ {layoutRunning && (
129
+ <div className="absolute top-0 end-0 p-1">
130
+ <Icon icon={CoreIcons.spinner} animate="spin" />
131
+ </div>
132
+ )}
133
+ </GraphContext.Provider>
134
+ );
135
+ };