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: falsekeeps edges under nodes during node dragging