Interactive Edges
By default, edges in the graph are not interactive.
To enable interaction with edges, you need to use the InteractiveEdgeShape
decorator.
First, create a canvas with desired edge shape using factory function:
import { CanvasBuilder, BezierEdgeShape } from "@html-grapg/html-graph"; const element = document.getElementById("canvas"); const canvas = new CanvasBuilder(element) .setDefaults({ edges: { shape: () => { return new BezierEdgeShape({ hasTargetArrow: true, }); }, }, }) .build();
Then use the InteractiveEdgeShape
decorator to create invisible interaction area around the visible edge.
This example shows how to handle click event for an edge:
import { CanvasBuilder, BezierEdgeShape, InteractiveEdgeShape, } from "@html-graph/html-graph"; const element = document.getElementById("canvas"); const canvas = new CanvasBuilder(element) .setDefaults({ edges: { shape: (edgeId) => { const baseShape = new BezierEdgeShape({ hasTargetArrow: true, }); const interactiveShape = new InteractiveEdgeShape(baseShape, { distance: 20, }); interactiveShape.handle.addEventListener("click", (event) => { console.log(`clicked on edge with id: ${edgeId}`); }); return interactiveShape; }, }, }) .build();
Decorator Parameters
Name | Type | Description | Required | Default |
---|---|---|---|---|
baseShape | StructuredEdgeShape | The shape to make interactive | Yes | |
interactiveParameters | InteractiveParams | Configuration for interactive behavior | No | {} |
Interactive Parameters
Name | Type | Description | Required | Default |
---|---|---|---|---|
distance | number | Distance of the interactive area from the edge | No | 10 |
Try out this demo, which toggles edge line animated dash on edge click:
When used with connectable ports it is recommended to set edge priority below node priority to ensure ports remain accessible:
const canvas = new CanvasBuilder(element) .setDefaults({ nodes: { priority: 1, }, edges: { priority: 0, shape: (edgeId) => { const baseShape = new BezierEdgeShape({ hasTargetArrow: true, }); const interactiveShape = new InteractiveEdgeShape(baseShape, { distance: 10, }); // ... event handlers ... return interactiveShape; }, }, }) .enableUserDraggableNodes({ moveEdgesOnTop: false, }) .enableUserTransformableViewport() .enableBackground() .build();
Key configuration:
- Nodes:
priority: 1
(higher z-index) - Edges:
priority: 0
(lower z-index) - Draggable nodes:
moveEdgesOnTop: false
keeps edges under nodes during node dragging