@infinit-canvas/react 0.1.0

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.
@@ -0,0 +1,117 @@
1
+ /* react-infinite-canvas styles */
2
+
3
+ .ric-wrap {
4
+ position: relative;
5
+ overflow: hidden;
6
+ background: #f0f0f0;
7
+ border-radius: 12px;
8
+ border: 0.5px solid #e0e0e0;
9
+ cursor: grab;
10
+ user-select: none;
11
+ touch-action: none;
12
+ }
13
+
14
+ @media (prefers-color-scheme: dark) {
15
+ .ric-wrap {
16
+ background: #1e1e1e;
17
+ border-color: #333;
18
+ }
19
+ }
20
+
21
+ .ric-wrap.dragging {
22
+ cursor: grabbing;
23
+ }
24
+
25
+ .ric-canvas {
26
+ position: absolute;
27
+ top: 0;
28
+ left: 0;
29
+ width: 100%;
30
+ height: 100%;
31
+ }
32
+
33
+ .ric-info {
34
+ position: absolute;
35
+ bottom: 12px;
36
+ left: 12px;
37
+ font-size: 12px;
38
+ font-family: monospace;
39
+ color: #888;
40
+ pointer-events: none;
41
+ }
42
+
43
+ .ric-hint {
44
+ position: absolute;
45
+ top: 12px;
46
+ left: 50%;
47
+ transform: translateX(-50%);
48
+ font-size: 12px;
49
+ color: #999;
50
+ pointer-events: none;
51
+ background: #fafafa;
52
+ padding: 4px 12px;
53
+ border-radius: 20px;
54
+ border: 0.5px solid #e0e0e0;
55
+ white-space: nowrap;
56
+ }
57
+
58
+ @media (prefers-color-scheme: dark) {
59
+ .ric-hint {
60
+ background: #1a1a1a;
61
+ border-color: #333;
62
+ color: #666;
63
+ }
64
+ }
65
+
66
+ /* Loading overlay */
67
+ .ric-loader {
68
+ position: absolute;
69
+ inset: 0;
70
+ display: flex;
71
+ align-items: center;
72
+ justify-content: center;
73
+ background: inherit;
74
+ z-index: 50;
75
+ }
76
+
77
+ .ric-spinner {
78
+ width: 28px;
79
+ height: 28px;
80
+ border: 3px solid rgba(0, 0, 0, 0.1);
81
+ border-top-color: #888;
82
+ border-radius: 50%;
83
+ animation: ric-spin 0.7s linear infinite;
84
+ }
85
+
86
+ @media (prefers-color-scheme: dark) {
87
+ .ric-spinner {
88
+ border-color: rgba(255, 255, 255, 0.1);
89
+ border-top-color: #666;
90
+ }
91
+ }
92
+
93
+ @keyframes ric-spin {
94
+ to { transform: rotate(360deg); }
95
+ }
96
+
97
+ /* Controls */
98
+ .ric-controls-button:disabled {
99
+ opacity: 0.35;
100
+ cursor: default;
101
+ pointer-events: none;
102
+ }
103
+
104
+ .ric-controls-button:not(:disabled):hover {
105
+ background: #f0f0f0;
106
+ }
107
+
108
+ @media (prefers-color-scheme: dark) {
109
+ .ric-controls-button {
110
+ background: #2a2a2a !important;
111
+ border-color: rgba(255,255,255,0.12) !important;
112
+ color: #ccc !important;
113
+ }
114
+ .ric-controls-button:not(:disabled):hover {
115
+ background: #333 !important;
116
+ }
117
+ }
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@infinit-canvas/react",
3
+ "version": "0.1.0",
4
+ "description": "A performant infinite canvas React component powered by OffscreenCanvas and Web Workers",
5
+ "type": "module",
6
+ "main": "./dist/react-infinite-canvas.cjs",
7
+ "module": "./dist/react-infinite-canvas.js",
8
+ "types": "./src/types.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./src/types.d.ts",
12
+ "import": "./dist/react-infinite-canvas.js",
13
+ "require": "./dist/react-infinite-canvas.cjs"
14
+ },
15
+ "./styles.css": "./dist/styles.css"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "src/types.d.ts"
20
+ ],
21
+ "sideEffects": false,
22
+ "keywords": [
23
+ "react",
24
+ "infinite-canvas",
25
+ "canvas",
26
+ "offscreen-canvas",
27
+ "web-worker",
28
+ "pan",
29
+ "zoom"
30
+ ],
31
+ "license": "MIT",
32
+ "publishConfig": {
33
+ "access": "public"
34
+ },
35
+ "repository": {
36
+ "type": "git",
37
+ "url": "https://github.com/awaisshah228/infinit-canvas"
38
+ },
39
+ "peerDependencies": {
40
+ "react": ">=17.0.0",
41
+ "react-dom": ">=17.0.0"
42
+ },
43
+ "devDependencies": {
44
+ "@vitejs/plugin-react": "^4.3.4",
45
+ "react": "^19.0.0",
46
+ "react-dom": "^19.0.0",
47
+ "vite": "^6.0.0"
48
+ },
49
+ "scripts": {
50
+ "build": "vite build && cp src/styles.css dist/styles.css",
51
+ "dev": "vite build --watch"
52
+ },
53
+ "dependencies": {}
54
+ }
package/src/types.d.ts ADDED
@@ -0,0 +1,472 @@
1
+ // ─── Core Types ──────────────────────────────────────────────────
2
+
3
+ export type XYPosition = { x: number; y: number };
4
+ export type Dimensions = { width: number; height: number };
5
+ export type Rect = XYPosition & Dimensions;
6
+ export type Transform = [number, number, number]; // [tx, ty, scale]
7
+ export type SnapGrid = [number, number];
8
+ export type CoordinateExtent = [[number, number], [number, number]];
9
+
10
+ export type Position = 'top' | 'bottom' | 'left' | 'right';
11
+ export type HandleType = 'source' | 'target';
12
+ export type ConnectionMode = 'strict' | 'loose';
13
+ export type SelectionMode = 'full' | 'partial';
14
+ export type PanOnScrollMode = 'free' | 'horizontal' | 'vertical';
15
+ export type ColorMode = 'light' | 'dark' | 'system';
16
+ export type BackgroundVariant = 'lines' | 'dots' | 'cross';
17
+ export type PanelPosition =
18
+ | 'top-left' | 'top-right' | 'top-center'
19
+ | 'bottom-left' | 'bottom-right' | 'bottom-center';
20
+
21
+ // ─── Node Types ──────────────────────────────────────────────────
22
+
23
+ export interface NodeHandle {
24
+ id?: string;
25
+ type: HandleType;
26
+ position?: Position;
27
+ x?: number;
28
+ y?: number;
29
+ }
30
+
31
+ export interface Node<T = Record<string, unknown>> {
32
+ id: string;
33
+ position: XYPosition;
34
+ data: T;
35
+ type?: string;
36
+ width?: number;
37
+ height?: number;
38
+ selected?: boolean;
39
+ hidden?: boolean;
40
+ draggable?: boolean;
41
+ selectable?: boolean;
42
+ connectable?: boolean;
43
+ deletable?: boolean;
44
+ dragging?: boolean;
45
+ handles?: NodeHandle[];
46
+ parentId?: string;
47
+ extent?: 'parent' | CoordinateExtent;
48
+ expandParent?: boolean;
49
+ zIndex?: number;
50
+ ariaLabel?: string;
51
+ className?: string;
52
+ style?: React.CSSProperties;
53
+ }
54
+
55
+ // ─── Edge Types ──────────────────────────────────────────────────
56
+
57
+ export type EdgeType = 'default' | 'straight' | 'step' | 'smoothstep';
58
+
59
+ export interface Edge<T = Record<string, unknown>> {
60
+ id: string;
61
+ source: string;
62
+ target: string;
63
+ type?: EdgeType | string;
64
+ sourceHandle?: string | null;
65
+ targetHandle?: string | null;
66
+ data?: T;
67
+ label?: string;
68
+ animated?: boolean;
69
+ selected?: boolean;
70
+ hidden?: boolean;
71
+ deletable?: boolean;
72
+ selectable?: boolean;
73
+ zIndex?: number;
74
+ ariaLabel?: string;
75
+ style?: React.CSSProperties;
76
+ className?: string;
77
+ }
78
+
79
+ export interface Connection {
80
+ source: string;
81
+ target: string;
82
+ sourceHandle: string | null;
83
+ targetHandle: string | null;
84
+ }
85
+
86
+ export interface DefaultEdgeOptions extends Partial<Omit<Edge, 'id' | 'source' | 'target'>> {}
87
+
88
+ // ─── Change Types ────────────────────────────────────────────────
89
+
90
+ export interface NodePositionChange {
91
+ id: string;
92
+ type: 'position';
93
+ position?: XYPosition;
94
+ dragging?: boolean;
95
+ }
96
+
97
+ export interface NodeSelectionChange {
98
+ id: string;
99
+ type: 'select';
100
+ selected: boolean;
101
+ }
102
+
103
+ export interface NodeRemoveChange {
104
+ id: string;
105
+ type: 'remove';
106
+ }
107
+
108
+ export interface NodeAddChange<NodeType extends Node = Node> {
109
+ type: 'add';
110
+ item: NodeType;
111
+ index?: number;
112
+ }
113
+
114
+ export interface NodeReplaceChange<NodeType extends Node = Node> {
115
+ id: string;
116
+ type: 'replace';
117
+ item: NodeType;
118
+ }
119
+
120
+ export interface NodeDimensionChange {
121
+ id: string;
122
+ type: 'dimensions';
123
+ dimensions?: Dimensions;
124
+ setAttributes?: boolean | 'width' | 'height';
125
+ resizing?: boolean;
126
+ }
127
+
128
+ export type NodeChange<NodeType extends Node = Node> =
129
+ | NodePositionChange
130
+ | NodeSelectionChange
131
+ | NodeRemoveChange
132
+ | NodeAddChange<NodeType>
133
+ | NodeReplaceChange<NodeType>
134
+ | NodeDimensionChange;
135
+
136
+ export interface EdgeSelectionChange {
137
+ id: string;
138
+ type: 'select';
139
+ selected: boolean;
140
+ }
141
+
142
+ export interface EdgeRemoveChange {
143
+ id: string;
144
+ type: 'remove';
145
+ }
146
+
147
+ export interface EdgeAddChange<EdgeType extends Edge = Edge> {
148
+ type: 'add';
149
+ item: EdgeType;
150
+ index?: number;
151
+ }
152
+
153
+ export interface EdgeReplaceChange<EdgeType extends Edge = Edge> {
154
+ id: string;
155
+ type: 'replace';
156
+ item: EdgeType;
157
+ }
158
+
159
+ export type EdgeChange<EdgeType extends Edge = Edge> =
160
+ | EdgeSelectionChange
161
+ | EdgeRemoveChange
162
+ | EdgeAddChange<EdgeType>
163
+ | EdgeReplaceChange<EdgeType>;
164
+
165
+ // ─── Callback Types ──────────────────────────────────────────────
166
+
167
+ export type OnNodesChange<NodeType extends Node = Node> = (changes: NodeChange<NodeType>[]) => void;
168
+ export type OnEdgesChange<EdgeType extends Edge = Edge> = (changes: EdgeChange<EdgeType>[]) => void;
169
+ export type OnConnect = (connection: Connection) => void;
170
+ export type OnConnectStart = (event: React.MouseEvent | React.TouchEvent, params: { nodeId: string; handleId: string | null; handleType: HandleType }) => void;
171
+ export type OnConnectEnd = (event: MouseEvent | TouchEvent) => void;
172
+ export type IsValidConnection = (connection: Connection) => boolean;
173
+
174
+ export type NodeMouseHandler<NodeType extends Node = Node> = (event: React.MouseEvent, node: NodeType) => void;
175
+ export type EdgeMouseHandler<EdgeType extends Edge = Edge> = (event: React.MouseEvent, edge: EdgeType) => void;
176
+ export type OnNodeDrag<NodeType extends Node = Node> = (event: React.MouseEvent, node: NodeType, nodes: NodeType[]) => void;
177
+
178
+ export type OnSelectionChangeParams = { nodes: Node[]; edges: Edge[] };
179
+ export type OnSelectionChangeFunc = (params: OnSelectionChangeParams) => void;
180
+
181
+ export type OnMove = (event: MouseEvent | TouchEvent | null, viewport: Viewport) => void;
182
+ export type OnMoveStart = OnMove;
183
+ export type OnMoveEnd = OnMove;
184
+
185
+ export type OnDelete = (params: { nodes: Node[]; edges: Edge[] }) => void;
186
+ export type OnBeforeDelete = (params: { nodes: Node[]; edges: Edge[] }) => Promise<boolean>;
187
+ export type OnError = (id: string, message: string) => void;
188
+ export type OnInit = (instance: ReactFlowInstance) => void;
189
+
190
+ // ─── Viewport Types ──────────────────────────────────────────────
191
+
192
+ export interface Viewport {
193
+ x: number;
194
+ y: number;
195
+ zoom: number;
196
+ }
197
+
198
+ export interface FitViewOptions {
199
+ padding?: number;
200
+ minZoom?: number;
201
+ maxZoom?: number;
202
+ nodes?: { id: string }[];
203
+ duration?: number;
204
+ }
205
+
206
+ // ─── HUD Types ───────────────────────────────────────────────────
207
+
208
+ export interface HudData {
209
+ wx: number;
210
+ wy: number;
211
+ zoom: string;
212
+ renderMs: string;
213
+ fps: number;
214
+ visible: number;
215
+ nodeCount: number;
216
+ visibleNodes: number;
217
+ edgeCount: number;
218
+ }
219
+
220
+ // ─── Card Types (Legacy) ─────────────────────────────────────────
221
+
222
+ export interface Card {
223
+ x: number;
224
+ y: number;
225
+ w: number;
226
+ h: number;
227
+ title: string;
228
+ body: string;
229
+ }
230
+
231
+ // ─── Component Props ─────────────────────────────────────────────
232
+
233
+ export interface InfiniteCanvasProps {
234
+ // Data
235
+ cards?: Card[];
236
+ nodes?: Node[];
237
+ edges?: Edge[];
238
+
239
+ // Appearance
240
+ dark?: boolean;
241
+ gridSize?: number;
242
+ width?: string | number;
243
+ height?: string | number;
244
+ className?: string;
245
+ style?: React.CSSProperties;
246
+
247
+ // Zoom
248
+ zoomMin?: number;
249
+ zoomMax?: number;
250
+
251
+ // Camera
252
+ initialCamera?: Viewport;
253
+ fitView?: boolean;
254
+ fitViewOptions?: FitViewOptions;
255
+
256
+ // Node/Edge callbacks
257
+ onNodesChange?: OnNodesChange;
258
+ onEdgesChange?: OnEdgesChange;
259
+ onConnect?: OnConnect;
260
+ onConnectStart?: OnConnectStart;
261
+ onConnectEnd?: OnConnectEnd;
262
+ onNodeClick?: NodeMouseHandler;
263
+ onNodeDoubleClick?: NodeMouseHandler;
264
+ onNodeMouseEnter?: NodeMouseHandler;
265
+ onNodeMouseMove?: NodeMouseHandler;
266
+ onNodeMouseLeave?: NodeMouseHandler;
267
+ onNodeContextMenu?: NodeMouseHandler;
268
+ onNodeDragStart?: OnNodeDrag;
269
+ onNodeDrag?: OnNodeDrag;
270
+ onNodeDragStop?: OnNodeDrag;
271
+ onEdgeClick?: EdgeMouseHandler;
272
+ onEdgeDoubleClick?: EdgeMouseHandler;
273
+ onEdgeMouseEnter?: EdgeMouseHandler;
274
+ onEdgeMouseMove?: EdgeMouseHandler;
275
+ onEdgeMouseLeave?: EdgeMouseHandler;
276
+ onEdgeContextMenu?: EdgeMouseHandler;
277
+ onPaneClick?: (event: React.MouseEvent) => void;
278
+ onPaneContextMenu?: (event: React.MouseEvent) => void;
279
+ onPaneMouseEnter?: (event: React.MouseEvent) => void;
280
+ onPaneMouseMove?: (event: React.MouseEvent) => void;
281
+ onPaneMouseLeave?: (event: React.MouseEvent) => void;
282
+ onSelectionChange?: OnSelectionChangeFunc;
283
+ onInit?: OnInit;
284
+ onMoveStart?: OnMoveStart;
285
+ onMove?: OnMove;
286
+ onMoveEnd?: OnMoveEnd;
287
+ onDelete?: OnDelete;
288
+ onBeforeDelete?: OnBeforeDelete;
289
+ onError?: OnError;
290
+
291
+ // Behavior
292
+ nodesDraggable?: boolean;
293
+ nodesConnectable?: boolean;
294
+ elementsSelectable?: boolean;
295
+ multiSelectionKeyCode?: string;
296
+ selectionOnDrag?: boolean;
297
+ selectionMode?: SelectionMode;
298
+ connectOnClick?: boolean;
299
+ connectionMode?: ConnectionMode;
300
+ connectionRadius?: number;
301
+ isValidConnection?: IsValidConnection;
302
+ snapToGrid?: boolean;
303
+ snapGrid?: SnapGrid;
304
+ deleteKeyCode?: string | string[];
305
+ panActivationKeyCode?: string;
306
+ panOnScroll?: boolean;
307
+ panOnScrollMode?: PanOnScrollMode;
308
+ panOnScrollSpeed?: number;
309
+ zoomOnScroll?: boolean;
310
+ zoomOnPinch?: boolean;
311
+ zoomOnDoubleClick?: boolean;
312
+ preventScrolling?: boolean;
313
+ translateExtent?: CoordinateExtent;
314
+ nodeExtent?: CoordinateExtent;
315
+ defaultEdgeOptions?: DefaultEdgeOptions;
316
+ autoPanOnNodeDrag?: boolean;
317
+ autoPanOnConnect?: boolean;
318
+ autoPanSpeed?: number;
319
+ edgesReconnectable?: boolean;
320
+ elevateNodesOnSelect?: boolean;
321
+ elevateEdgesOnSelect?: boolean;
322
+
323
+ // Legacy
324
+ onHudUpdate?: (data: HudData) => void;
325
+ showHud?: boolean;
326
+ showHint?: boolean;
327
+ hintText?: string;
328
+
329
+ // Children
330
+ children?: React.ReactNode;
331
+ }
332
+
333
+ export interface ControlsProps {
334
+ showZoom?: boolean;
335
+ showFitView?: boolean;
336
+ showInteractive?: boolean;
337
+ position?: PanelPosition;
338
+ style?: React.CSSProperties;
339
+ className?: string;
340
+ }
341
+
342
+ export interface MiniMapProps {
343
+ width?: number;
344
+ height?: number;
345
+ nodeColor?: string | ((node: Node) => string);
346
+ nodeStrokeColor?: string;
347
+ maskColor?: string;
348
+ style?: React.CSSProperties;
349
+ className?: string;
350
+ }
351
+
352
+ export interface BackgroundProps {
353
+ variant?: BackgroundVariant;
354
+ gap?: number;
355
+ size?: number;
356
+ color?: string;
357
+ style?: React.CSSProperties;
358
+ className?: string;
359
+ }
360
+
361
+ export interface PanelProps {
362
+ position?: PanelPosition;
363
+ style?: React.CSSProperties;
364
+ className?: string;
365
+ children?: React.ReactNode;
366
+ }
367
+
368
+ // ─── Hook Return Types ───────────────────────────────────────────
369
+
370
+ export interface ReactFlowInstance {
371
+ getNodes: () => Node[];
372
+ getEdges: () => Edge[];
373
+ getNode: (id: string) => Node | undefined;
374
+ getEdge: (id: string) => Edge | undefined;
375
+ setNodes: (nodes: Node[] | ((nodes: Node[]) => Node[])) => void;
376
+ setEdges: (edges: Edge[] | ((edges: Edge[]) => Edge[])) => void;
377
+ addNodes: (nodes: Node | Node[]) => void;
378
+ addEdges: (edges: Edge | Edge[]) => void;
379
+ deleteElements: (params: { nodes?: Node[]; edges?: Edge[] }) => void;
380
+ getViewport: () => Viewport;
381
+ setViewport: (viewport: Partial<Viewport>) => void;
382
+ getZoom: () => number;
383
+ zoomIn: () => void;
384
+ zoomOut: () => void;
385
+ zoomTo: (zoom: number) => void;
386
+ fitView: (options?: FitViewOptions) => void;
387
+ setCenter: (x: number, y: number, options?: { zoom?: number }) => void;
388
+ screenToFlowPosition: (position: XYPosition) => XYPosition;
389
+ flowToScreenPosition: (position: XYPosition) => XYPosition;
390
+ }
391
+
392
+ export interface UseOnViewportChangeOptions {
393
+ onChange?: (viewport: Viewport) => void;
394
+ onStart?: (viewport: Viewport) => void;
395
+ onEnd?: (viewport: Viewport) => void;
396
+ }
397
+
398
+ export interface UseOnSelectionChangeOptions {
399
+ onChange: OnSelectionChangeFunc;
400
+ }
401
+
402
+ export interface UseHandleConnectionsOptions {
403
+ nodeId: string;
404
+ type: HandleType;
405
+ handleId?: string;
406
+ }
407
+
408
+ // ─── Function Declarations ───────────────────────────────────────
409
+
410
+ // Core
411
+ export declare function InfiniteCanvas(props: InfiniteCanvasProps): JSX.Element;
412
+ export declare function InfiniteCanvasProvider(props: { children: React.ReactNode }): JSX.Element;
413
+ export declare function useInfiniteCanvas(options?: Partial<InfiniteCanvasProps>): {
414
+ wrapRef: React.RefObject<HTMLDivElement>;
415
+ canvasRef: React.RefObject<HTMLCanvasElement>;
416
+ onPointerDown: (e: React.PointerEvent) => void;
417
+ onPointerMove: (e: React.PointerEvent) => void;
418
+ onPointerUp: (e: React.PointerEvent) => void;
419
+ resetView: () => void;
420
+ addCard: (card?: Card) => void;
421
+ addNode: (node: Partial<Node>) => void;
422
+ getCamera: () => Viewport;
423
+ setCamera: (camera: Partial<Viewport>) => void;
424
+ screenToFlowPosition: (position: XYPosition) => XYPosition;
425
+ store: any;
426
+ };
427
+
428
+ // Hooks
429
+ export declare function useNodesState<NodeType extends Node = Node>(
430
+ initialNodes: NodeType[]
431
+ ): [NodeType[], React.Dispatch<React.SetStateAction<NodeType[]>>, OnNodesChange<NodeType>];
432
+
433
+ export declare function useEdgesState<EdgeType extends Edge = Edge>(
434
+ initialEdges: EdgeType[]
435
+ ): [EdgeType[], React.Dispatch<React.SetStateAction<EdgeType[]>>, OnEdgesChange<EdgeType>];
436
+
437
+ export declare function useReactFlow(): ReactFlowInstance;
438
+ export declare function useNodes<NodeType extends Node = Node>(): NodeType[];
439
+ export declare function useEdges<EdgeType extends Edge = Edge>(): EdgeType[];
440
+ export declare function useViewport(): Viewport;
441
+ export declare function useConnection(): Connection | null;
442
+ export declare function useNodesData(nodeIds: string | string[]): { id: string; type?: string; data: any }[];
443
+ export declare function useNodeConnections(nodeId: string): Edge[];
444
+ export declare function useHandleConnections(options: UseHandleConnectionsOptions): Edge[];
445
+ export declare function useOnViewportChange(options: UseOnViewportChangeOptions): void;
446
+ export declare function useOnSelectionChange(options: UseOnSelectionChangeOptions): void;
447
+ export declare function useKeyPress(keyOrKeys: string | string[]): boolean;
448
+ export declare function useUpdateNodeInternals(): (nodeId: string | string[]) => void;
449
+ export declare function useNodesInitialized(options?: { includeHiddenNodes?: boolean }): boolean;
450
+ export declare function useInternalNode(nodeId: string): Node | undefined;
451
+
452
+ // Utilities
453
+ export declare function applyNodeChanges<NodeType extends Node = Node>(changes: NodeChange<NodeType>[], nodes: NodeType[]): NodeType[];
454
+ export declare function applyEdgeChanges<EdgeType extends Edge = Edge>(changes: EdgeChange<EdgeType>[], edges: EdgeType[]): EdgeType[];
455
+ export declare function addEdge<EdgeType extends Edge = Edge>(edgeParams: EdgeType | Connection, edges: EdgeType[]): EdgeType[];
456
+ export declare function isNode(element: any): element is Node;
457
+ export declare function isEdge(element: any): element is Edge;
458
+ export declare function getConnectedEdges(nodesOrId: Node[] | Node | string, edges: Edge[]): Edge[];
459
+ export declare function getIncomers(nodeOrId: Node | string, nodes: Node[], edges: Edge[]): Node[];
460
+ export declare function getOutgoers(nodeOrId: Node | string, nodes: Node[], edges: Edge[]): Node[];
461
+ export declare function getNodesBounds(nodes: Node[]): Rect;
462
+ export declare function getViewportForBounds(bounds: Rect, width: number, height: number, padding?: number): Viewport;
463
+ export declare function snapPosition(position: XYPosition, snapGrid: SnapGrid): XYPosition;
464
+ export declare function clampPosition(position: XYPosition, extent: CoordinateExtent): XYPosition;
465
+ export declare function getNodeDimensions(node: Node): Dimensions;
466
+ export declare function getNodesInside(nodes: Node[], rect: Rect, viewport: Viewport, partially?: boolean): Node[];
467
+
468
+ // Components
469
+ export declare function Controls(props: ControlsProps): JSX.Element;
470
+ export declare function MiniMap(props: MiniMapProps): JSX.Element;
471
+ export declare function Background(props: BackgroundProps): JSX.Element;
472
+ export declare function Panel(props: PanelProps): JSX.Element;