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: () => {
        const baseShape = new BezierEdgeShape({
          hasTargetArrow: true,
        });

        return baseShape;
      },
    },
  })
  .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.svg.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{}

InteractiveParams

NameTypeDescriptionRequiredDefault
distancenumberDistance of the interactive area from the edgeNo10

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, // higher z-index
    },
    edges: {
      priority: 0, // lower z-index
      shape: (edgeId) => {
        const baseShape = new BezierEdgeShape({
          hasTargetArrow: true,
        });

        const interactiveShape = new InteractiveEdgeShape(baseShape, {
          distance: 10,
        });

        // ... event handlers ...

        return interactiveShape;
      },
    },
  })
  .enableUserDraggableNodes({
    moveEdgesOnTop: false, // keeps edges under nodes during node dragging
  })
  .enableUserTransformableViewport()
  .enableBackground()
  .build();