Transformable Viewport
To enable the built-in transformable viewport, call the enableUserTransformableViewport method on CanvasBuilder.
const element = document.getElementById('canvas');
const canvas = new CanvasBuilder(element)
.enableUserTransformableViewport()
.build();
This method accepts optional configuration:
const element = document.getElementById('canvas');
const canvas = new CanvasBuilder(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
| Name | Type | Description | Required | Default |
|---|---|---|---|---|
scale | ScaleConfig | Scale-related behavior configuration | no | {} |
shift | ShiftConfig | Shift-related behavior configuration | no | {} |
transformPreprocessor | TransformConfig | Transformation preprocessors configuration | no | {} |
events | EventsConfig | Handlers for available events | no | {} |
ScaleConfig
| Name | Type | Description | Required | Default |
|---|---|---|---|---|
mouseWheelSensitivity | number | How much to scale on wheel scroll | no | 1 |
mouseWheelEventVerifier | function | Function to verify if wheel event should apply scaling | no | () => true |
wheelFinishTimeout | number | Timeout in milliseconds after which scaling with wheel regarded as finished (and onTransformFinished event gets triggered) | no | 500 |
ShiftConfig
| Name | Type | Description | Required | Default |
|---|---|---|---|---|
cursor | string | null | Cursor to set on mouse grab | no | "grab" |
mouseDownEventVerifier | function | Function to verify if mouse event should trigger grab | no | () => true |
mouseUpEventVerifier | function | Function to verify if mouse event should trigger release | no | () => true |
TransformConfig
A single transformer or an array of transformers.
Transformers can be one of the following:
- Scale Limit: Prevents scaling when the maximum or minimum limit is reached.
{
type: "scale-limit",
minContentScale: 0.5,
maxContentScale: 5,
}
All options are complementary.
- 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.
- 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
| Name | Description |
|---|---|
onTransformStarted | Triggered when the user initiates a transform (e.g., mouse down or touch start). The transform may or may not occur next. |
onTransformFinished | Triggered when the user finishes a transform (e.g., mouse up, touch end, or touch cancel). |
onBeforeTransformChange | Triggered when the user performs a transform (e.g., mouse move or touch move), but the transform itself has not yet been applied. |
onTransformChange | Triggered after the transform has been applied following user interaction. |
onResizeTransformStarted | Triggered when transformation is about to change due to canvas element resize. |
onResizeTransformFinished | Triggered 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.