@yurialvesbordin/graphium 0.0.0-stage → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +112 -2
- package/dist/Graphium.d.ts +156 -0
- package/dist/Graphium.d.ts.map +1 -0
- package/dist/Graphium.js +413 -0
- package/dist/Graphium.js.map +1 -0
- package/dist/core/FocusController.d.ts +16 -0
- package/dist/core/FocusController.d.ts.map +1 -0
- package/dist/core/FocusController.js +53 -0
- package/dist/core/FocusController.js.map +1 -0
- package/dist/core/GraphEditor.d.ts +61 -0
- package/dist/core/GraphEditor.d.ts.map +1 -0
- package/dist/core/GraphEditor.js +165 -0
- package/dist/core/GraphEditor.js.map +1 -0
- package/dist/core/GraphModel.d.ts +166 -0
- package/dist/core/GraphModel.d.ts.map +1 -0
- package/dist/core/GraphModel.js +730 -0
- package/dist/core/GraphModel.js.map +1 -0
- package/dist/core/SelectionController.d.ts +26 -0
- package/dist/core/SelectionController.d.ts.map +1 -0
- package/dist/core/SelectionController.js +78 -0
- package/dist/core/SelectionController.js.map +1 -0
- package/dist/core/colors.d.ts +27 -0
- package/dist/core/colors.d.ts.map +1 -0
- package/dist/core/colors.js +141 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/events.d.ts +21 -0
- package/dist/core/events.d.ts.map +1 -0
- package/dist/core/events.js +64 -0
- package/dist/core/events.js.map +1 -0
- package/dist/core/handles.d.ts +60 -0
- package/dist/core/handles.d.ts.map +1 -0
- package/dist/core/handles.js +116 -0
- package/dist/core/handles.js.map +1 -0
- package/dist/core/theme.d.ts +9 -0
- package/dist/core/theme.d.ts.map +1 -0
- package/dist/core/theme.js +167 -0
- package/dist/core/theme.js.map +1 -0
- package/dist/core/themes.d.ts +9 -0
- package/dist/core/themes.d.ts.map +1 -0
- package/dist/core/themes.js +103 -0
- package/dist/core/themes.js.map +1 -0
- package/dist/core/types.d.ts +287 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +7 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/interaction/InteractionBinder.d.ts +43 -0
- package/dist/interaction/InteractionBinder.d.ts.map +1 -0
- package/dist/interaction/InteractionBinder.js +121 -0
- package/dist/interaction/InteractionBinder.js.map +1 -0
- package/dist/interaction/PointerController.d.ts +83 -0
- package/dist/interaction/PointerController.d.ts.map +1 -0
- package/dist/interaction/PointerController.js +294 -0
- package/dist/interaction/PointerController.js.map +1 -0
- package/dist/physics/PhysicsEngine.d.ts +82 -0
- package/dist/physics/PhysicsEngine.d.ts.map +1 -0
- package/dist/physics/PhysicsEngine.js +469 -0
- package/dist/physics/PhysicsEngine.js.map +1 -0
- package/dist/physics/SpatialHash.d.ts +36 -0
- package/dist/physics/SpatialHash.d.ts.map +1 -0
- package/dist/physics/SpatialHash.js +126 -0
- package/dist/physics/SpatialHash.js.map +1 -0
- package/dist/physics/presets.d.ts +14 -0
- package/dist/physics/presets.d.ts.map +1 -0
- package/dist/physics/presets.js +108 -0
- package/dist/physics/presets.js.map +1 -0
- package/dist/render/Camera.d.ts +55 -0
- package/dist/render/Camera.d.ts.map +1 -0
- package/dist/render/Camera.js +94 -0
- package/dist/render/Camera.js.map +1 -0
- package/dist/render/LabelLayer.d.ts +32 -0
- package/dist/render/LabelLayer.d.ts.map +1 -0
- package/dist/render/LabelLayer.js +142 -0
- package/dist/render/LabelLayer.js.map +1 -0
- package/dist/render/RenderLoop.d.ts +67 -0
- package/dist/render/RenderLoop.d.ts.map +1 -0
- package/dist/render/RenderLoop.js +126 -0
- package/dist/render/RenderLoop.js.map +1 -0
- package/dist/render/Renderer.d.ts +73 -0
- package/dist/render/Renderer.d.ts.map +1 -0
- package/dist/render/Renderer.js +512 -0
- package/dist/render/Renderer.js.map +1 -0
- package/dist/render/TextureAtlas.d.ts +51 -0
- package/dist/render/TextureAtlas.d.ts.map +1 -0
- package/dist/render/TextureAtlas.js +160 -0
- package/dist/render/TextureAtlas.js.map +1 -0
- package/dist/render/ViewportController.d.ts +34 -0
- package/dist/render/ViewportController.d.ts.map +1 -0
- package/dist/render/ViewportController.js +57 -0
- package/dist/render/ViewportController.js.map +1 -0
- package/dist/render/geometry.d.ts +19 -0
- package/dist/render/geometry.d.ts.map +1 -0
- package/dist/render/geometry.js +71 -0
- package/dist/render/geometry.js.map +1 -0
- package/dist/render/shaders.d.ts +13 -0
- package/dist/render/shaders.d.ts.map +1 -0
- package/dist/render/shaders.js +183 -0
- package/dist/render/shaders.js.map +1 -0
- package/package.json +73 -4
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Graphium contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,113 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Graphium
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@yurialvesbordin/graphium)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](http://www.typescriptlang.org/)
|
|
6
|
+
[](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API)
|
|
7
|
+
|
|
8
|
+
High-performance WebGL2 graph visualization with silk-smooth force physics, curved edges, node images, and a fluent API.
|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
## Installation
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install @yurialvesbordin/graphium
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
import { Graphium } from '@yurialvesbordin/graphium';
|
|
22
|
+
|
|
23
|
+
const graph = Graphium.create({
|
|
24
|
+
container: document.getElementById('graph-container'),
|
|
25
|
+
autoStart: true,
|
|
26
|
+
autoFit: true,
|
|
27
|
+
physics: { preset: 'silk' },
|
|
28
|
+
theme: { name: 'midnight' },
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
graph
|
|
32
|
+
.addNode('alice', { label: 'Alice' })
|
|
33
|
+
.addNode('bob', { label: 'Bob' })
|
|
34
|
+
.addNode('carol', { label: 'Carol' });
|
|
35
|
+
|
|
36
|
+
graph.link('alice', 'bob').link('bob', 'carol').link('carol', 'alice');
|
|
37
|
+
|
|
38
|
+
graph.fit(80);
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Showcase
|
|
42
|
+
|
|
43
|
+
### Force-directed physics
|
|
44
|
+
|
|
45
|
+
A 120 node clustered graph reorganizing itself after a disturbance. The solver
|
|
46
|
+
combines repulsion, link springs, gravity, damping, and collision handling while
|
|
47
|
+
spatial hashing keeps neighbor lookups near O(n). The graph sleeps automatically
|
|
48
|
+
when it settles, dropping CPU usage to near zero.
|
|
49
|
+
|
|
50
|
+

|
|
51
|
+
|
|
52
|
+
### Curved edges
|
|
53
|
+
|
|
54
|
+
Edge curvature adjusted at runtime from straight to strongly curved in both
|
|
55
|
+
directions. Curves are computed on the GPU, so styling thousands of edges costs
|
|
56
|
+
no extra CPU. Positive values curve one way, negative values the other.
|
|
57
|
+
|
|
58
|
+

|
|
59
|
+
|
|
60
|
+
### Built-in themes
|
|
61
|
+
|
|
62
|
+
The four bundled themes (midnight, light, slate, sunset) switching at runtime.
|
|
63
|
+
Each theme controls background, node palette, edge styling, labels, and the
|
|
64
|
+
hover and selection rings. Custom themes merge over the current one, so you can
|
|
65
|
+
override only what you need.
|
|
66
|
+
|
|
67
|
+

|
|
68
|
+
|
|
69
|
+
### Node images
|
|
70
|
+
|
|
71
|
+
Toggling node images on and off. Any node can take an image (URL or canvas
|
|
72
|
+
data URL) rendered inside the circle with cover fit. Images upload to the GPU
|
|
73
|
+
through a texture atlas, keeping draw calls minimal.
|
|
74
|
+
|
|
75
|
+

|
|
76
|
+
|
|
77
|
+
### Arrow heads
|
|
78
|
+
|
|
79
|
+
Turning directed arrow heads on. Arrows follow the edge path, respect
|
|
80
|
+
curvature, and scale with zoom.
|
|
81
|
+
|
|
82
|
+

|
|
83
|
+
|
|
84
|
+
### Tree layout
|
|
85
|
+
|
|
86
|
+
A binary tree dataset settling under the same force solver. When hierarchical
|
|
87
|
+
data needs cleaner separation, edge separation tuning untangles crossings, and
|
|
88
|
+
any dataset type can be swapped at runtime.
|
|
89
|
+
|
|
90
|
+

|
|
91
|
+
|
|
92
|
+
### Click to focus and inspect
|
|
93
|
+
|
|
94
|
+
Clicking a node focuses the camera on it and opens the inspector with live
|
|
95
|
+
degree, position, and velocity. Dragging works with momentum, the wheel zooms,
|
|
96
|
+
and every interaction emits events you can subscribe to.
|
|
97
|
+
|
|
98
|
+

|
|
99
|
+
|
|
100
|
+
## Documentation
|
|
101
|
+
|
|
102
|
+
Complete guides live in the docs directory:
|
|
103
|
+
|
|
104
|
+
- Getting Started - installation, first graph, handles, cleanup
|
|
105
|
+
- Physics Configuration - presets and fine-tuning the simulation
|
|
106
|
+
- Theming Guide - built-in and custom themes
|
|
107
|
+
- Events & Interaction - events, interaction, accessibility
|
|
108
|
+
- Node Images - custom images as node backgrounds
|
|
109
|
+
- Performance Tuning - optimization of rendering and physics
|
|
110
|
+
|
|
111
|
+
## License
|
|
112
|
+
|
|
113
|
+
MIT
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Implements the main Graphium facade. The class wires the data model,
|
|
3
|
+
* physics engine, camera, renderer, label layer and pointer controller into
|
|
4
|
+
* one object, exposes a fluent chainable API with sensible defaults, and
|
|
5
|
+
* runs an on demand render loop that pauses completely while the simulation
|
|
6
|
+
* sleeps.
|
|
7
|
+
*/
|
|
8
|
+
import { Emitter } from './core/events.js';
|
|
9
|
+
import { GraphEditor } from './core/GraphEditor.js';
|
|
10
|
+
import { GraphModel } from './core/GraphModel.js';
|
|
11
|
+
import { LinkHandle, NodeHandle } from './core/handles.js';
|
|
12
|
+
import type { GraphData, GraphiumOptions, InteractionOptions, LinkId, LinkOptions, LinkSnapshot, NodeId, NodeOptions, NodeSnapshot, PhysicsOptions, PhysicsPresetName, StatsSnapshot, ThemeOptions, ThemeResolved } from './core/types.js';
|
|
13
|
+
import { PhysicsEngine } from './physics/PhysicsEngine.js';
|
|
14
|
+
import { Camera } from './render/Camera.js';
|
|
15
|
+
import { LabelLayer } from './render/LabelLayer.js';
|
|
16
|
+
import { Renderer } from './render/Renderer.js';
|
|
17
|
+
import { TextureAtlas } from './render/TextureAtlas.js';
|
|
18
|
+
export declare class Graphium {
|
|
19
|
+
readonly model: GraphModel;
|
|
20
|
+
readonly physics: PhysicsEngine;
|
|
21
|
+
readonly camera: Camera;
|
|
22
|
+
readonly renderer: Renderer;
|
|
23
|
+
readonly atlas: TextureAtlas;
|
|
24
|
+
readonly labels: LabelLayer;
|
|
25
|
+
readonly editor: GraphEditor;
|
|
26
|
+
readonly events: Emitter;
|
|
27
|
+
theme: ThemeResolved;
|
|
28
|
+
running: boolean;
|
|
29
|
+
destroyed: boolean;
|
|
30
|
+
private options;
|
|
31
|
+
private readonly loop;
|
|
32
|
+
private readonly selection;
|
|
33
|
+
private readonly focusController;
|
|
34
|
+
private readonly viewport;
|
|
35
|
+
private readonly binder;
|
|
36
|
+
constructor(options?: GraphiumOptions);
|
|
37
|
+
/** Creates a Graphium instance with the supplied configuration. */
|
|
38
|
+
static create(options?: GraphiumOptions): Graphium;
|
|
39
|
+
/** Subscribes to an event and returns an unsubscribe function. */
|
|
40
|
+
on<T = unknown>(type: string, listener: (payload: T) => void): () => void;
|
|
41
|
+
/** Subscribes to an event exactly once. */
|
|
42
|
+
once<T = unknown>(type: string, listener: (payload: T) => void): () => void;
|
|
43
|
+
/** Removes one listener, or every listener of a type. */
|
|
44
|
+
off<T = unknown>(type: string, listener?: (payload: T) => void): this;
|
|
45
|
+
/** Dispatches an event payload to the registered listeners. */
|
|
46
|
+
emit<T = unknown>(type: string, payload: T): this;
|
|
47
|
+
/** Adds one node and returns the graph for chaining. */
|
|
48
|
+
addNode(id: NodeId, options?: NodeOptions): this;
|
|
49
|
+
/** Adds many nodes in one call and returns the graph for chaining. */
|
|
50
|
+
addNodes(nodes: Array<NodeOptions & {
|
|
51
|
+
id: NodeId;
|
|
52
|
+
}>): this;
|
|
53
|
+
/** Links two nodes, reusing an existing link with the same auto id. */
|
|
54
|
+
link(source: NodeId, target: NodeId, options?: LinkOptions): this;
|
|
55
|
+
/** Returns a fluent handle when called with a single link id. */
|
|
56
|
+
link(id: LinkId): LinkHandle | null;
|
|
57
|
+
/** Adds many links in one call and returns the graph for chaining. */
|
|
58
|
+
addLinks(links: Array<LinkOptions & {
|
|
59
|
+
source: NodeId;
|
|
60
|
+
target: NodeId;
|
|
61
|
+
}>): this;
|
|
62
|
+
/** Returns a fluent handle for one node, or null when it is missing. */
|
|
63
|
+
node(id: NodeId): NodeHandle | null;
|
|
64
|
+
/** Returns a fluent handle for one link, or null when it is missing. */
|
|
65
|
+
linkById(id: LinkId): LinkHandle | null;
|
|
66
|
+
/** Replaces the entire graph with the supplied data payload. */
|
|
67
|
+
setData(data: GraphData): this;
|
|
68
|
+
/** Removes one node together with its links. */
|
|
69
|
+
removeNode(id: NodeId): boolean;
|
|
70
|
+
/** Removes one link by id. */
|
|
71
|
+
removeLink(id: LinkId): boolean;
|
|
72
|
+
/** Removes every node and link while keeping the current theme. */
|
|
73
|
+
clear(): this;
|
|
74
|
+
/** Returns a snapshot of one node or null when it does not exist. */
|
|
75
|
+
getNode(id: NodeId): NodeSnapshot | null;
|
|
76
|
+
/** Returns a snapshot of one link or null when it does not exist. */
|
|
77
|
+
getLink(id: LinkId): LinkSnapshot | null;
|
|
78
|
+
/** Returns the ids of every node currently in the graph. */
|
|
79
|
+
nodeIds(): NodeId[];
|
|
80
|
+
/** Returns the ids of every link currently in the graph. */
|
|
81
|
+
linkIds(): LinkId[];
|
|
82
|
+
/** Sets the node image and starts the asynchronous load. */
|
|
83
|
+
setNodeImage(id: NodeId | number, url: string | null, mode?: 'cover' | 'contain'): this;
|
|
84
|
+
/** Selects one node, optionally keeping the current selection. */
|
|
85
|
+
selectNode(id: NodeId | number, selected?: boolean, additive?: boolean): this;
|
|
86
|
+
/** Selects one link, optionally keeping the current selection. */
|
|
87
|
+
selectLink(id: LinkId | number, selected?: boolean, additive?: boolean): this;
|
|
88
|
+
/** Clears the selection of every node and link. */
|
|
89
|
+
clearSelection(): this;
|
|
90
|
+
/** Returns the ids of every selected node. */
|
|
91
|
+
selectedNodes(): NodeId[];
|
|
92
|
+
/** Returns the ids of every selected link. */
|
|
93
|
+
selectedLinks(): LinkId[];
|
|
94
|
+
/** Dims every node and link that is not adjacent to the focus node. */
|
|
95
|
+
focus(id: NodeId | number): this;
|
|
96
|
+
/** Removes all dimming applied by focus. */
|
|
97
|
+
unfocus(): this;
|
|
98
|
+
/** Merges theme values, optionally starting from a built in theme name. */
|
|
99
|
+
setTheme(theme: ThemeOptions & {
|
|
100
|
+
name?: string;
|
|
101
|
+
}): this;
|
|
102
|
+
/** Updates physics options live and wakes the simulation. */
|
|
103
|
+
setPhysics(options: PhysicsOptions): this;
|
|
104
|
+
/** Applies a named physics preset with optional overrides. */
|
|
105
|
+
usePreset(name: PhysicsPresetName, overrides?: PhysicsOptions): this;
|
|
106
|
+
/** Updates interaction options on the live pointer controller. */
|
|
107
|
+
setInteraction(options: InteractionOptions): this;
|
|
108
|
+
/** Restarts the simulation and returns the graph for chaining. */
|
|
109
|
+
reboot(): this;
|
|
110
|
+
/** Scales the view so the whole graph fits with padding. */
|
|
111
|
+
fit(padding?: number): this;
|
|
112
|
+
/** Centers the view on a world point. */
|
|
113
|
+
centerOn(x: number, y: number): this;
|
|
114
|
+
/** Multiplies the current zoom level. */
|
|
115
|
+
zoomBy(factor: number): this;
|
|
116
|
+
/** Sets an absolute zoom level. */
|
|
117
|
+
zoomTo(zoom: number): this;
|
|
118
|
+
/** Resizes the renderer to the canvas client size. */
|
|
119
|
+
resize(): this;
|
|
120
|
+
/** Advances physics and renders once, returning the kinetic energy. */
|
|
121
|
+
step(dt?: number): number;
|
|
122
|
+
/** Renders a frame immediately without stepping the simulation. */
|
|
123
|
+
render(): this;
|
|
124
|
+
/** Requests a render on the next scheduled frame. */
|
|
125
|
+
requestRender(): this;
|
|
126
|
+
/** Marks the view dirty and guarantees a scheduled frame. */
|
|
127
|
+
private invalidate;
|
|
128
|
+
/** Starts the run loop and returns the graph for chaining. */
|
|
129
|
+
start(): this;
|
|
130
|
+
/** Stops the run loop and returns the graph for chaining. */
|
|
131
|
+
stop(): this;
|
|
132
|
+
/** Resolves when every requested node image finished loading. */
|
|
133
|
+
loadImages(): Promise<void>;
|
|
134
|
+
/** Finds the link index closest to a world position within a radius. */
|
|
135
|
+
pickLinkAt(worldX: number, worldY: number, hitRadius?: number): number;
|
|
136
|
+
/** Returns the world position under a screen position. */
|
|
137
|
+
screenToWorld(screenX: number, screenY: number): {
|
|
138
|
+
x: number;
|
|
139
|
+
y: number;
|
|
140
|
+
};
|
|
141
|
+
/** Returns a performance statistics snapshot for dashboards. */
|
|
142
|
+
stats(): StatsSnapshot;
|
|
143
|
+
/** Captures the current canvas contents as a PNG data URL. */
|
|
144
|
+
screenshot(): string;
|
|
145
|
+
/** Exports the current graph as a plain JSON friendly object. */
|
|
146
|
+
toJSON(): GraphData;
|
|
147
|
+
/** Releases every resource owned by the instance. */
|
|
148
|
+
destroy(): void;
|
|
149
|
+
/** Returns the number of nodes in the graph. */
|
|
150
|
+
get nodeCount(): number;
|
|
151
|
+
/** Returns the number of links in the graph. */
|
|
152
|
+
get linkCount(): number;
|
|
153
|
+
/** Reports whether the physics simulation is currently asleep. */
|
|
154
|
+
get sleeping(): boolean;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=Graphium.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Graphium.d.ts","sourceRoot":"","sources":["../src/Graphium.ts"],"names":[],"mappings":"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"}
|