@html-graph/html-graph 0.0.50 → 0.0.52

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/README.md CHANGED
@@ -11,7 +11,7 @@
11
11
  </a>
12
12
 
13
13
  Instead of connecting nodes dirrectly this library uses concept of ports, which provide greater fexibility at managing edges.
14
- Port is an entity of the node to which edge can be attached to.
14
+ Port is an entity of a node to which edge can be attached to.
15
15
 
16
16
  This library fits for tasks where easy nodes customization and interactiveness are required.
17
17
 
@@ -33,7 +33,7 @@ npm i @html-graph/html-graph
33
33
  ```
34
34
 
35
35
  ```typescript
36
- import { MarkNodePortRequest, HtmlGraphBuilder } from "@html-graph/html-graph";
36
+ import { AddNodePorts, HtmlGraphBuilder } from "@html-graph/html-graph";
37
37
 
38
38
  const canvas = new HtmlGraphBuilder()
39
39
  .setOptions({
@@ -48,7 +48,7 @@ function createNode(
48
48
  name: string,
49
49
  frontPortId: string,
50
50
  backPortId: string,
51
- ): [HTMLElement, Record<string, MarkNodePortRequest>] {
51
+ ): [HTMLElement, AddNodePorts] {
52
52
  const node = document.createElement("div");
53
53
  node.classList.add("node");
54
54
 
@@ -64,7 +64,12 @@ function createNode(
64
64
  backPort.classList.add("port");
65
65
  node.appendChild(backPort);
66
66
 
67
- return [node, { [frontPortId]: frontPort, [backPortId]: backPort }];
67
+ const ports = new Map([
68
+ [frontPortId, frontPort],
69
+ [backPortId, backPort],
70
+ ]);
71
+
72
+ return [node, ports];
68
73
  }
69
74
 
70
75
  const [node1, ports1] = createNode("Node 1", "port-1-1", "port-1-2");
@@ -81,7 +86,7 @@ canvas
81
86
 
82
87
  Refer to [Examples](examples) for more.
83
88
 
84
- ## Run examples locally
89
+ ## Run examples
85
90
 
86
91
  Use node version >= 20
87
92
 
package/dist/main.d.ts CHANGED
@@ -1,17 +1,21 @@
1
1
  export declare interface AddEdgeRequest {
2
- id?: string;
2
+ id?: unknown;
3
3
  from: string;
4
4
  to: string;
5
5
  options?: EdgeOptions;
6
+ priority?: number;
6
7
  }
7
8
 
9
+ export declare type AddNodePorts = ReadonlyMap<unknown, MarkNodePortRequest>;
10
+
8
11
  export declare interface AddNodeRequest {
9
- id?: string;
12
+ id?: unknown;
10
13
  element: HTMLElement;
11
14
  x: number;
12
15
  y: number;
13
- ports?: Record<string, MarkNodePortRequest>;
16
+ ports?: AddNodePorts;
14
17
  centerFn?: CenterFn;
18
+ priority?: number;
15
19
  }
16
20
 
17
21
  export declare type BackgroundDrawingFn = (ctx: CanvasRenderingContext2D, transformer: PublicViewportTransformer) => void;
@@ -58,6 +62,8 @@ declare interface BezierEdgeOptions {
58
62
  readonly hasTargetArrow?: boolean;
59
63
  readonly cycleRadius?: number;
60
64
  readonly smallCycleRadius?: number;
65
+ readonly detourDistance?: number;
66
+ readonly detourDirection?: number;
61
67
  }
62
68
 
63
69
  export declare interface Canvas {
@@ -69,20 +75,24 @@ export declare interface Canvas {
69
75
  * adds node to graph
70
76
  */
71
77
  addNode(node: AddNodeRequest): Canvas;
78
+ /**
79
+ * updates node absolute coordinates
80
+ */
81
+ updateNode(nodeId: unknown, request: UpdateNodeRequest): Canvas;
72
82
  /**
73
83
  * removes node from graph
74
84
  * all the ports of node get unmarked
75
85
  * all the edges adjacent to node get removed
76
86
  */
77
- removeNode(nodeId: string): Canvas;
87
+ removeNode(nodeId: unknown): Canvas;
78
88
  /**
79
89
  * marks element as port of node
80
90
  */
81
91
  markPort(port: MarkPortRequest): Canvas;
82
92
  /**
83
- * updates edge attached to port
93
+ * updates port and attached edges
84
94
  */
85
- updatePortEdges(portId: string): Canvas;
95
+ updatePort(portId: string, request?: UpdatePortRequest): Canvas;
86
96
  /**
87
97
  * ummarks element as port of node
88
98
  * all the edges adjacent to port get removed
@@ -92,10 +102,14 @@ export declare interface Canvas {
92
102
  * adds edge to graph
93
103
  */
94
104
  addEdge(edge: AddEdgeRequest): Canvas;
105
+ /**
106
+ * updates edge
107
+ */
108
+ updateEdge(edgeId: unknown, request: UpdateEdgeRequest): Canvas;
95
109
  /**
96
110
  * removes edge from graph
97
111
  */
98
- removeEdge(edgeId: string): Canvas;
112
+ removeEdge(edgeId: unknown): Canvas;
99
113
  /**
100
114
  * applies transformation for viewport
101
115
  */
@@ -104,18 +118,10 @@ export declare interface Canvas {
104
118
  * moves viewport to nodes
105
119
  */
106
120
  moveToNodes(nodeIds: readonly string[]): Canvas;
107
- /**
108
- * updates node absolute coordinates
109
- */
110
- updateNodeCoordinates(nodeId: string, x: number, y: number): Canvas;
111
- /**
112
- * updates edge
113
- */
114
- updateEdge(edgeId: string, request: UpdateEdgeRequest): Canvas;
115
121
  /**
116
122
  * moves specified node on top
117
123
  */
118
- moveNodeOnTop(nodeId: string): Canvas;
124
+ moveNodeOnTop(nodeId: unknown): Canvas;
119
125
  /**
120
126
  * attaches canvas to given element
121
127
  */
@@ -133,7 +139,7 @@ export declare interface Canvas {
133
139
  /**
134
140
  * destroys canvas
135
141
  * canvas element gets rolled back to initial state
136
- * canvas requires reinitialization in order to be used again
142
+ * canvas can not be reused
137
143
  */
138
144
  destroy(): void;
139
145
  }
@@ -148,24 +154,24 @@ export declare class CanvasCore implements Canvas {
148
154
  private readonly edgeControllerFactory;
149
155
  constructor(apiOptions?: CoreOptions | undefined);
150
156
  addNode(node: AddNodeRequest): CanvasCore;
151
- moveNodeOnTop(nodeId: string): CanvasCore;
152
- removeNode(nodeId: string): CanvasCore;
157
+ updateNode(nodeId: unknown, request: UpdateNodeRequest): CanvasCore;
158
+ removeNode(nodeId: unknown): CanvasCore;
159
+ moveNodeOnTop(nodeId: unknown): CanvasCore;
153
160
  markPort(port: MarkPortRequest): CanvasCore;
154
- updatePortEdges(portId: string): CanvasCore;
161
+ updatePort(portId: string, request: UpdatePortRequest): CanvasCore;
155
162
  unmarkPort(portId: string): CanvasCore;
156
163
  addEdge(edge: AddEdgeRequest): CanvasCore;
157
- removeEdge(edgeId: string): CanvasCore;
164
+ updateEdge(edgeId: unknown, request: UpdateEdgeRequest): CanvasCore;
165
+ removeEdge(edgeId: unknown): CanvasCore;
158
166
  patchViewportState(request: PatchViewportRequest): CanvasCore;
159
167
  moveToNodes(nodeIds: readonly string[]): CanvasCore;
160
- updateNodeCoordinates(nodeId: string, x: number, y: number): CanvasCore;
161
- updateEdge(edgeId: string, request: UpdateEdgeRequest): CanvasCore;
162
168
  clear(): CanvasCore;
163
169
  attach(element: HTMLElement): CanvasCore;
164
170
  detach(): CanvasCore;
165
171
  destroy(): void;
166
172
  }
167
173
 
168
- declare type CenterFn = (width: number, height: number) => [number, number];
174
+ export declare type CenterFn = (width: number, height: number) => [number, number];
169
175
 
170
176
  export declare interface CoreOptions {
171
177
  /**
@@ -191,6 +197,10 @@ export declare interface CoreOptions {
191
197
  * center of port determines point to which edge attaches
192
198
  */
193
199
  readonly centerFn?: CenterFn;
200
+ /**
201
+ * specifies default direction of port
202
+ */
203
+ readonly direction?: number;
194
204
  };
195
205
  /**
196
206
  *edges related behavior
@@ -217,6 +227,22 @@ export declare const createBezierEdgeControllerFactory: (options: {
217
227
  hasTargetArrow: boolean;
218
228
  cycleRadius: number;
219
229
  smallCycleRadius: number;
230
+ detourDistance: number;
231
+ detourDirection: number;
232
+ }) => EdgeControllerFactory;
233
+
234
+ export declare const createHorizontalEdgeControllerFactory: (options: {
235
+ color: string;
236
+ width: number;
237
+ arrowLength: number;
238
+ arrowWidth: number;
239
+ arrowOffset: number;
240
+ hasSourceArrow: boolean;
241
+ hasTargetArrow: boolean;
242
+ cycleSquareSide: number;
243
+ roundness: number;
244
+ detourDistance: number;
245
+ detourDirection: number;
220
246
  }) => EdgeControllerFactory;
221
247
 
222
248
  export declare const createStraightEdgeControllerFactory: (options: {
@@ -229,6 +255,22 @@ export declare const createStraightEdgeControllerFactory: (options: {
229
255
  hasTargetArrow: boolean;
230
256
  cycleSquareSide: number;
231
257
  roundness: number;
258
+ detourDistance: number;
259
+ detourDirection: number;
260
+ }) => EdgeControllerFactory;
261
+
262
+ export declare const createVerticalEdgeControllerFactory: (options: {
263
+ color: string;
264
+ width: number;
265
+ arrowLength: number;
266
+ arrowWidth: number;
267
+ arrowOffset: number;
268
+ hasSourceArrow: boolean;
269
+ hasTargetArrow: boolean;
270
+ cycleSquareSide: number;
271
+ roundness: number;
272
+ detourDistance: number;
273
+ detourDirection: number;
232
274
  }) => EdgeControllerFactory;
233
275
 
234
276
  declare interface CustomEdgeOptions {
@@ -263,11 +305,29 @@ export declare class CycleSquareEdgeController implements EdgeController {
263
305
  private readonly line;
264
306
  private readonly arrow;
265
307
  private readonly roundness;
266
- private readonly points;
308
+ private readonly linePoints;
267
309
  constructor(color: string, width: number, arrowLength: number, arrowWidth: number, hasArrow: boolean, side: number, minPortOffset: number, roundness: number);
268
310
  update(x: number, y: number, _width: number, _height: number, from: PortPayload): void;
269
311
  }
270
312
 
313
+ export declare class DetourStraightEdgeController implements EdgeController {
314
+ private readonly color;
315
+ private readonly width;
316
+ private readonly arrowLength;
317
+ private readonly arrowWidth;
318
+ private readonly arrowOffset;
319
+ private readonly roundness;
320
+ readonly svg: SVGSVGElement;
321
+ private readonly group;
322
+ private readonly line;
323
+ private readonly sourceArrow;
324
+ private readonly targetArrow;
325
+ private readonly detourX;
326
+ private readonly detourY;
327
+ constructor(color: string, width: number, arrowLength: number, arrowWidth: number, arrowOffset: number, hasSourceArrow: boolean, hasTargetArrow: boolean, roundness: number, detourDistance: number, detourDirection: number);
328
+ update(x: number, y: number, width: number, height: number, from: PortPayload, to: PortPayload): void;
329
+ }
330
+
271
331
  export declare interface DragOptions {
272
332
  events?: {
273
333
  onNodeDrag?: (payload: NodeDragPayload) => void;
@@ -282,20 +342,43 @@ export declare interface EdgeController {
282
342
 
283
343
  declare type EdgeControllerFactory = (type: EdgeType) => EdgeController;
284
344
 
285
- declare type EdgeOptions = BezierEdgeOptions | StraightEdgeOptions | CustomEdgeOptions;
345
+ declare type EdgeOptions = BezierEdgeOptions | StraightEdgeOptions | CustomEdgeOptions | HorizontalEdgeOptions | VerticalEdgeOptions;
286
346
 
287
347
  export declare enum EdgeType {
288
348
  Regular = "regular",
289
- Cycle = "cycle"
349
+ PortCycle = "port-cycle",
350
+ NodeCycle = "node-cycle"
351
+ }
352
+
353
+ export declare class HorizontalEdgeController implements EdgeController {
354
+ private readonly color;
355
+ private readonly width;
356
+ private readonly arrowLength;
357
+ private readonly arrowWidth;
358
+ private readonly arrowOffset;
359
+ private readonly roundness;
360
+ readonly svg: SVGSVGElement;
361
+ private readonly group;
362
+ private readonly line;
363
+ private readonly sourceArrow;
364
+ private readonly targetArrow;
365
+ constructor(color: string, width: number, arrowLength: number, arrowWidth: number, arrowOffset: number, hasSourceArrow: boolean, hasTargetArrow: boolean, roundness: number);
366
+ update(x: number, y: number, width: number, height: number, from: PortPayload, to: PortPayload): void;
290
367
  }
291
368
 
292
- export declare class EdgeUtils {
293
- static getPortCenter(port: PortPayload): Point;
294
- static rotate(point: Point, vector: Point, center: Point): Point;
295
- static getDirectionVector(direction: number | null, flipX: number, flipY: number): Point;
296
- static getArrowPath(vect: Point, shiftX: number, shiftY: number, arrowLength: number, arrowWidth: number): string;
297
- static getArrowOffsetPath(vect: Point, shiftX: number, shiftY: number, arrowLength: number, arrowOffset: number): string;
298
- static createStraightPath(ps: Point[]): string;
369
+ declare interface HorizontalEdgeOptions {
370
+ readonly type: "horizontal";
371
+ readonly color?: string;
372
+ readonly width?: number;
373
+ readonly arrowLength?: number;
374
+ readonly arrowWidth?: number;
375
+ readonly arrowOffset?: number;
376
+ readonly hasSourceArrow?: boolean;
377
+ readonly hasTargetArrow?: boolean;
378
+ readonly cycleSquareSide?: number;
379
+ readonly roundness?: number;
380
+ readonly detourDistance?: number;
381
+ readonly detourDirection?: number;
299
382
  }
300
383
 
301
384
  export declare class HtmlGraphBuilder {
@@ -315,19 +398,19 @@ declare type LayersMode = "edges-on-top" | "nodes-on-top" | "edges-follow-node";
315
398
  export declare type MarkNodePortRequest = HTMLElement | {
316
399
  readonly element: HTMLElement;
317
400
  readonly centerFn?: CenterFn;
318
- readonly direction?: number | null;
401
+ readonly direction?: number;
319
402
  };
320
403
 
321
404
  export declare interface MarkPortRequest {
322
- readonly id?: string;
405
+ readonly id?: unknown;
323
406
  readonly element: HTMLElement;
324
- readonly nodeId: string;
407
+ readonly nodeId: unknown;
325
408
  readonly centerFn?: CenterFn;
326
- readonly direction?: number | null;
409
+ readonly direction?: number;
327
410
  }
328
411
 
329
412
  export declare interface NodeDragPayload {
330
- readonly nodeId: string;
413
+ readonly nodeId: unknown;
331
414
  readonly element: HTMLElement;
332
415
  readonly x: number;
333
416
  readonly y: number;
@@ -352,12 +435,10 @@ export declare interface PatchViewportRequest {
352
435
  y?: number;
353
436
  }
354
437
 
355
- declare type Point = [number, number];
356
-
357
438
  export declare interface PortPayload {
358
439
  readonly element: HTMLElement;
359
- readonly centerFn: CenterFn;
360
- readonly direction: number | null;
440
+ centerFn: CenterFn;
441
+ direction: number;
361
442
  }
362
443
 
363
444
  export declare class PublicViewportTransformer {
@@ -391,12 +472,12 @@ export declare class StraightEdgeController implements EdgeController {
391
472
  private readonly arrowLength;
392
473
  private readonly arrowWidth;
393
474
  private readonly arrowOffset;
475
+ private readonly roundness;
394
476
  readonly svg: SVGSVGElement;
395
477
  private readonly group;
396
478
  private readonly line;
397
479
  private readonly sourceArrow;
398
480
  private readonly targetArrow;
399
- private readonly roundness;
400
481
  constructor(color: string, width: number, arrowLength: number, arrowWidth: number, arrowOffset: number, hasSourceArrow: boolean, hasTargetArrow: boolean, roundness: number);
401
482
  update(x: number, y: number, width: number, height: number, from: PortPayload, to: PortPayload): void;
402
483
  }
@@ -412,6 +493,8 @@ declare interface StraightEdgeOptions {
412
493
  readonly hasTargetArrow?: boolean;
413
494
  readonly cycleSquareSide?: number;
414
495
  readonly roundness?: number;
496
+ readonly detourDistance?: number;
497
+ readonly detourDirection?: number;
415
498
  }
416
499
 
417
500
  export declare interface TransformOptions {
@@ -438,6 +521,19 @@ export declare interface TransformPayload {
438
521
 
439
522
  export declare interface UpdateEdgeRequest {
440
523
  readonly controller?: EdgeController;
524
+ readonly priority?: number;
525
+ }
526
+
527
+ declare interface UpdateNodeRequest {
528
+ readonly x?: number;
529
+ readonly y?: number;
530
+ readonly priority?: number;
531
+ readonly centerFn?: CenterFn;
532
+ }
533
+
534
+ declare interface UpdatePortRequest {
535
+ readonly direction?: number;
536
+ readonly centerFn?: CenterFn;
441
537
  }
442
538
 
443
539
  export declare class UserDraggableNodesCanvas implements Canvas {
@@ -457,16 +553,16 @@ export declare class UserDraggableNodesCanvas implements Canvas {
457
553
  private previousTouchCoords;
458
554
  constructor(canvas: Canvas, dragOptions?: DragOptions);
459
555
  addNode(node: AddNodeRequest): UserDraggableNodesCanvas;
460
- removeNode(nodeId: string): UserDraggableNodesCanvas;
556
+ updateNode(nodeId: unknown, request: UpdateNodeRequest): UserDraggableNodesCanvas;
557
+ removeNode(nodeId: unknown): UserDraggableNodesCanvas;
461
558
  markPort(port: MarkPortRequest): UserDraggableNodesCanvas;
462
- updatePortEdges(portId: string): UserDraggableNodesCanvas;
559
+ updatePort(portId: string, request?: UpdatePortRequest): UserDraggableNodesCanvas;
463
560
  unmarkPort(portId: string): UserDraggableNodesCanvas;
464
561
  addEdge(edge: AddEdgeRequest): UserDraggableNodesCanvas;
465
- removeEdge(edgeId: string): UserDraggableNodesCanvas;
562
+ updateEdge(edgeId: unknown, request: UpdateEdgeRequest): UserDraggableNodesCanvas;
563
+ removeEdge(edgeId: unknown): UserDraggableNodesCanvas;
466
564
  patchViewportState(request: PatchViewportRequest): UserDraggableNodesCanvas;
467
565
  moveToNodes(nodeIds: readonly string[]): UserDraggableNodesCanvas;
468
- updateNodeCoordinates(nodeId: string, x: number, y: number): UserDraggableNodesCanvas;
469
- updateEdge(edgeId: string, request: UpdateEdgeRequest): UserDraggableNodesCanvas;
470
566
  moveNodeOnTop(nodeId: string): UserDraggableNodesCanvas;
471
567
  clear(): UserDraggableNodesCanvas;
472
568
  attach(element: HTMLElement): UserDraggableNodesCanvas;
@@ -499,16 +595,16 @@ export declare class UserTransformableCanvas implements Canvas {
499
595
  private readonly onTouchEnd;
500
596
  constructor(canvas: Canvas, options?: TransformOptions | undefined);
501
597
  addNode(node: AddNodeRequest): UserTransformableCanvas;
502
- removeNode(nodeId: string): UserTransformableCanvas;
598
+ updateNode(nodeId: unknown, request: UpdateNodeRequest): UserTransformableCanvas;
599
+ removeNode(nodeId: unknown): UserTransformableCanvas;
503
600
  markPort(port: MarkPortRequest): UserTransformableCanvas;
504
- updatePortEdges(portId: string): UserTransformableCanvas;
601
+ updatePort(portId: string, request: UpdatePortRequest): UserTransformableCanvas;
505
602
  unmarkPort(portId: string): UserTransformableCanvas;
506
603
  addEdge(edge: AddEdgeRequest): UserTransformableCanvas;
507
- removeEdge(edgeId: string): UserTransformableCanvas;
604
+ updateEdge(edgeId: unknown, request: UpdateEdgeRequest): UserTransformableCanvas;
605
+ removeEdge(edgeId: unknown): UserTransformableCanvas;
508
606
  patchViewportState(request: PatchViewportRequest): UserTransformableCanvas;
509
607
  moveToNodes(nodeIds: readonly string[]): UserTransformableCanvas;
510
- updateNodeCoordinates(nodeId: string, x: number, y: number): UserTransformableCanvas;
511
- updateEdge(edgeId: string, request: UpdateEdgeRequest): UserTransformableCanvas;
512
608
  moveNodeOnTop(nodeId: string): UserTransformableCanvas;
513
609
  clear(): UserTransformableCanvas;
514
610
  attach(element: HTMLElement): UserTransformableCanvas;
@@ -520,6 +616,37 @@ export declare class UserTransformableCanvas implements Canvas {
520
616
  private scaleViewport;
521
617
  }
522
618
 
619
+ export declare class VerticalEdgeController implements EdgeController {
620
+ private readonly color;
621
+ private readonly width;
622
+ private readonly arrowLength;
623
+ private readonly arrowWidth;
624
+ private readonly arrowOffset;
625
+ private readonly roundness;
626
+ readonly svg: SVGSVGElement;
627
+ private readonly group;
628
+ private readonly line;
629
+ private readonly sourceArrow;
630
+ private readonly targetArrow;
631
+ constructor(color: string, width: number, arrowLength: number, arrowWidth: number, arrowOffset: number, hasSourceArrow: boolean, hasTargetArrow: boolean, roundness: number);
632
+ update(x: number, y: number, width: number, height: number, from: PortPayload, to: PortPayload): void;
633
+ }
634
+
635
+ declare interface VerticalEdgeOptions {
636
+ readonly type: "vertical";
637
+ readonly color?: string;
638
+ readonly width?: number;
639
+ readonly arrowLength?: number;
640
+ readonly arrowWidth?: number;
641
+ readonly arrowOffset?: number;
642
+ readonly hasSourceArrow?: boolean;
643
+ readonly hasTargetArrow?: boolean;
644
+ readonly cycleSquareSide?: number;
645
+ readonly roundness?: number;
646
+ readonly detourDistance?: number;
647
+ readonly detourDirection?: number;
648
+ }
649
+
523
650
  declare class ViewportTransformer {
524
651
  private state;
525
652
  getViewCoords(xa: number, ya: number): [number, number];