HTMLGraph

Transformable Viewport

To enable the built-in transformable viewport, call the enableUserTransformableViewport method on CanvasBuilder.

    
const element = document.getElementById('canvas');

const canvas = new CanvasBuilder()
  .setElement(element)
  .enableUserTransformableViewport()
  .build();

  
Transformable Viewport

This method accepts optional configuration:

    
const element = document.getElementById('canvas');

const canvas = new CanvasBuilder()
  .setElement(element)
  .enableUserTransformableViewport({
    scale: {
      mouseWheelSensitivity: 1.5,
      mouseWheelEventVerifier: (event) => event.ctrlKey,
      wheelFinishTimeout: 1000,
    },
    shift: {
      cursor: "crosshair",
      mouseDownEventVerifier: (event) => event.ctrlKey,
      mouseUpEventVerifier: (event) => true,
    },
    transformPreprocessor: [
      {
        type: "scale-limit",
        minContentScale: 0.5,
        maxContentScale: 5,
      },
      {
        type: "shift-limit",
        minX: -1000,
        maxX: 1000,
        minY: -1000,
        maxY: 1000,
      },
    ],
    events: {
      onTransformStarted: () => {
        console.log('STARTED');
      },
      onTransformFinished: () => {
        console.log('FINISHED');
      },
      onBeforeTransformChange: () => {
        console.log('BEFORE TRANSFORM');
      },
      onTransformChange: () => {
        console.log('AFTER TRANSFORM');
      },
    },
  })
  .build();

  

Configuration Parameters

NameTypeDescriptionRequiredDefault
scaleScaleConfigScale-related behavior configurationno{}
shiftShiftConfigShift-related behavior configurationno{}
transformPreprocessorTransformConfigTransformation preprocessors configurationno{}
eventsEventsConfigHandlers for available eventsno{}

ScaleConfig

NameTypeDescriptionRequiredDefault
mouseWheelSensitivitynumberHow much to scale on wheel scrollno1
mouseWheelEventVerifierfunctionFunction to verify if wheel event should apply scalingno() => true
wheelFinishTimeoutnumberTimeout in milliseconds after which scaling with wheel regarded as finished (and onTransformFinished event gets triggered)no500

ShiftConfig

NameTypeDescriptionRequiredDefault
cursorstring | nullCursor to set on mouse grabno“grab”
mouseDownEventVerifierfunctionFunction to verify if mouse event should trigger grabno() => true
mouseUpEventVerifierfunctionFunction to verify if mouse event should trigger releaseno() => true

TransformConfig

A single transformer or an array of transformers.

Transformers can be one of the following:

  1. Scale Limit: Prevents scaling when the maximum or minimum limit is reached.
    
{
  type: "scale-limit",
  minContentScale: 0.5,
  maxContentScale: 5,
}

  

All options are complementary.

  1. Shift Limit: Prevents shifting when vertical or horizontal limits are reached.
    
{
  type: "shift-limit",
  minX: -1000,
  maxX: 1000,
  minY: -1000,
  maxY: 1000,
}

  

All options are complementary.

  1. Custom Preprocessor: Allows you to define a custom transformation preprocessor.
    
transformPreprocessor: (params) => {
  if (params.nextTransform.scale > 1) {
    return params.prevTransform;
  }

  return {
    scale: params.nextTransform.scale,
    x: Math.max(params.nextTransform.x, -500),
    y: params.nextTransform.y,
  };
},

  

EventsConfig

NameDescription
onTransformStartedTriggered when the user initiates a transform (e.g., mouse down or touch start). The transform may or may not occur next.
onTransformFinishedTriggered when the user finishes a transform (e.g., mouse up, touch end, or touch cancel).
onBeforeTransformChangeTriggered when the user performs a transform (e.g., mouse move or touch move), but the transform itself has not yet been applied.
onTransformChangeTriggered after the transform has been applied following user interaction.
onResizeTransformStartedTriggered when transformation is about to change due to canvas element resize.
onResizeTransformFinishedTriggered after transformation was changed due to canvas element resize.

All events have no arguments, but the up-to-date transform state can be retrieved via the canvas.viewport property.