HTMLGraph logo HTMLGraph

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

NameTypeDescriptionRequiredDefault
baseShapeStructuredEdgeShapeThe shape to make interactiveYes
interactiveParametersInteractiveParamsConfiguration for interactive behaviorNo{}

Interactive Parameters

NameTypeDescriptionRequiredDefault
distancenumberDistance of the interactive area from the edgeNo10

Try out this demo, which toggles edge line animated dash on edge click:

Interactive edges

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