@markup-canvas/core 1.1.5 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,6 +42,7 @@ export declare class MarkupCanvas implements Canvas {
42
42
  };
43
43
  zoomToPoint(x: number, y: number, targetScale: number): boolean;
44
44
  resetView(): boolean;
45
+ resetViewToCenter(): boolean;
45
46
  zoomToFitContent(): boolean;
46
47
  panLeft(distance?: number): boolean;
47
48
  panRight(distance?: number): boolean;
@@ -1,5 +1,5 @@
1
- import type { Canvas } from "@/types/index.js";
2
- export declare function handleMouseMove(event: MouseEvent, canvas: Canvas, isDragEnabled: boolean, isDragging: boolean, mouseDownTime: number, mouseDownX: number, mouseDownY: number, lastMouseX: number, lastMouseY: number, setters: {
1
+ import type { Canvas, MarkupCanvasConfig } from "@/types/index.js";
2
+ export declare function handleMouseMove(event: MouseEvent, canvas: Canvas, config: Required<MarkupCanvasConfig>, isDragEnabled: boolean, isDragging: boolean, isSpacePressed: boolean, mouseDownTime: number, mouseDownX: number, mouseDownY: number, lastMouseX: number, lastMouseY: number, setters: {
3
3
  setHasDragged: (value: boolean) => void;
4
4
  setIsDragging: (value: boolean) => void;
5
5
  setLastMouseX: (value: number) => void;
@@ -0,0 +1,5 @@
1
+ import type { Canvas } from "@/types/index.js";
2
+ export declare function getViewportCenter(canvas: Canvas): {
3
+ x: number;
4
+ y: number;
5
+ };
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 1.1.5
4
+ * @version 1.1.7
5
5
  */
6
6
  'use strict';
7
7
 
@@ -20,8 +20,8 @@ const EDITOR_PRESET = {
20
20
  enableZoom: true,
21
21
  enablePan: true,
22
22
  enableTouch: true,
23
- enableKeyboard: false,
24
- bindKeyboardEventsTo: "canvas",
23
+ enableKeyboard: true,
24
+ bindKeyboardEventsTo: "document",
25
25
  // Zoom behavior
26
26
  zoomSpeed: 1.5,
27
27
  minZoom: 0.05,
@@ -276,13 +276,6 @@ function withRulerSize(canvas, rulerSize, operation) {
276
276
  const finalRulerSize = hasRulers ? rulerSize : 0;
277
277
  return operation(finalRulerSize);
278
278
  }
279
- function withRulerOffsets(canvas, rulerSize, x, y, operation) {
280
- return withRulerSize(canvas, rulerSize, (rulerSize) => {
281
- const adjustedX = x - rulerSize;
282
- const adjustedY = y - rulerSize;
283
- return operation(adjustedX, adjustedY);
284
- });
285
- }
286
279
  function withRulerOffsetObject(canvas, rulerSize, coords, operation) {
287
280
  return withRulerSize(canvas, rulerSize, (rulerSize) => {
288
281
  const adjusted = {
@@ -776,42 +769,28 @@ function getAdaptiveZoomSpeed(canvas, baseSpeed) {
776
769
  }
777
770
 
778
771
  function setupKeyboardEvents(canvas, config) {
779
- // Track mouse position
780
- let lastMouseX = 0;
781
- let lastMouseY = 0;
782
- function handleMouseMove(event) {
783
- const rect = canvas.container.getBoundingClientRect();
784
- const rawMouseX = event.clientX - rect.left;
785
- const rawMouseY = event.clientY - rect.top;
786
- withRulerOffsets(canvas, config.rulerSize, rawMouseX, rawMouseY, (adjustedX, adjustedY) => {
787
- lastMouseX = adjustedX;
788
- lastMouseY = adjustedY;
789
- });
790
- }
791
772
  function handleKeyDown(event) {
792
773
  if (!(event instanceof KeyboardEvent))
793
774
  return;
794
775
  if (config.bindKeyboardEventsTo === "canvas" && document.activeElement !== canvas.container)
795
776
  return;
796
- const isFastPan = event.shiftKey;
797
- const panDistance = config.keyboardPanStep * (isFastPan ? config.keyboardFastMultiplier : 1);
798
777
  let handled = false;
799
778
  const newTransform = {};
800
779
  switch (event.key) {
801
780
  case "ArrowLeft":
802
- newTransform.translateX = canvas.transform.translateX + panDistance;
781
+ newTransform.translateX = canvas.transform.translateX + config.keyboardPanStep;
803
782
  handled = true;
804
783
  break;
805
784
  case "ArrowRight":
806
- newTransform.translateX = canvas.transform.translateX - panDistance;
785
+ newTransform.translateX = canvas.transform.translateX - config.keyboardPanStep;
807
786
  handled = true;
808
787
  break;
809
788
  case "ArrowUp":
810
- newTransform.translateY = canvas.transform.translateY + panDistance;
789
+ newTransform.translateY = canvas.transform.translateY + config.keyboardPanStep;
811
790
  handled = true;
812
791
  break;
813
792
  case "ArrowDown":
814
- newTransform.translateY = canvas.transform.translateY - panDistance;
793
+ newTransform.translateY = canvas.transform.translateY - config.keyboardPanStep;
815
794
  handled = true;
816
795
  break;
817
796
  case "=":
@@ -820,7 +799,7 @@ function setupKeyboardEvents(canvas, config) {
820
799
  const adaptiveZoomStep = config.enableAdaptiveSpeed
821
800
  ? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
822
801
  : config.keyboardZoomStep;
823
- newTransform.scale = clampZoom(canvas.transform.scale * (1 + adaptiveZoomStep), config);
802
+ canvas.zoomIn(adaptiveZoomStep);
824
803
  handled = true;
825
804
  }
826
805
  break;
@@ -829,16 +808,21 @@ function setupKeyboardEvents(canvas, config) {
829
808
  const adaptiveZoomStep = config.enableAdaptiveSpeed
830
809
  ? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
831
810
  : config.keyboardZoomStep;
832
- newTransform.scale = clampZoom(canvas.transform.scale * (1 - adaptiveZoomStep), config);
811
+ canvas.zoomOut(adaptiveZoomStep);
833
812
  handled = true;
834
813
  }
835
814
  break;
836
815
  case "0":
837
- if (event.metaKey || event.ctrlKey) {
838
- const targetScale = 1.0;
839
- const zoomFactor = targetScale / canvas.transform.scale;
840
- const zoomTransform = getZoomToMouseTransform(lastMouseX, lastMouseY, canvas.transform, zoomFactor, config);
841
- Object.assign(newTransform, zoomTransform);
816
+ if (event.ctrlKey) {
817
+ if (canvas.resetView) {
818
+ canvas.resetView();
819
+ }
820
+ handled = true;
821
+ }
822
+ else if (event.metaKey || event.ctrlKey) {
823
+ if (canvas.resetViewToCenter) {
824
+ canvas.resetViewToCenter();
825
+ }
842
826
  handled = true;
843
827
  }
844
828
  break;
@@ -866,10 +850,8 @@ function setupKeyboardEvents(canvas, config) {
866
850
  }
867
851
  const keyboardTarget = config.bindKeyboardEventsTo === "canvas" ? canvas.container : document;
868
852
  keyboardTarget.addEventListener("keydown", handleKeyDown);
869
- canvas.container.addEventListener("mousemove", handleMouseMove);
870
853
  return () => {
871
854
  keyboardTarget.removeEventListener("keydown", handleKeyDown);
872
- canvas.container.removeEventListener("mousemove", handleMouseMove);
873
855
  };
874
856
  }
875
857
 
@@ -942,13 +924,15 @@ function handleMouseLeave(canvas, config, isDragEnabled, isSpacePressed, isDragg
942
924
  }
943
925
  }
944
926
 
945
- function handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
927
+ function handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
946
928
  if (mouseDownTime > 0) {
947
929
  const deltaX = Math.abs(event.clientX - mouseDownX);
948
930
  const deltaY = Math.abs(event.clientY - mouseDownY);
949
931
  if (deltaX > CLICK_THRESHOLDS.MAX_MOVEMENT || deltaY > CLICK_THRESHOLDS.MAX_MOVEMENT) {
950
932
  setters.setHasDragged(true);
951
- if (!isDragging && isDragEnabled) {
933
+ // Check if drag is allowed based on configuration
934
+ const canDrag = config.requireSpaceForMouseDrag ? isSpacePressed : true;
935
+ if (!isDragging && isDragEnabled && canDrag) {
952
936
  setters.setIsDragging(true);
953
937
  }
954
938
  }
@@ -1089,7 +1073,7 @@ function setupMouseEvents(canvas, config, withControls = true) {
1089
1073
  handleMouseDown(event, canvas, config, isDragEnabled, isSpacePressed, setters);
1090
1074
  };
1091
1075
  const mouseMoveHandler = (event) => {
1092
- handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
1076
+ handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
1093
1077
  setHasDragged: setters.setHasDragged,
1094
1078
  setIsDragging: setters.setIsDragging,
1095
1079
  setLastMouseX: setters.setLastMouseX,
@@ -1488,6 +1472,20 @@ function setupWheelEvents(canvas, config) {
1488
1472
  };
1489
1473
  }
1490
1474
 
1475
+ function getViewportCenter(canvas) {
1476
+ try {
1477
+ const bounds = canvas.getBounds();
1478
+ return {
1479
+ x: bounds.width / 2,
1480
+ y: bounds.height / 2,
1481
+ };
1482
+ }
1483
+ catch (error) {
1484
+ console.warn("Failed to calculate viewport center:", error);
1485
+ return { x: 0, y: 0 };
1486
+ }
1487
+ }
1488
+
1491
1489
  // Rulers
1492
1490
  const RULER_Z_INDEX = {
1493
1491
  GRID: 100,
@@ -2086,12 +2084,23 @@ class MarkupCanvas {
2086
2084
  });
2087
2085
  }
2088
2086
  resetView() {
2087
+ const result = this.baseCanvas.resetView ? this.baseCanvas.resetView() : false;
2088
+ if (result) {
2089
+ this.emitTransformEvents();
2090
+ }
2091
+ return result;
2092
+ }
2093
+ resetViewToCenter() {
2089
2094
  return withTransition(this.transformLayer, this.config, () => {
2090
- const result = this.baseCanvas.resetView ? this.baseCanvas.resetView() : false;
2091
- if (result) {
2092
- this.emitTransformEvents();
2093
- }
2094
- return result;
2095
+ return withClampedZoom(this.config, (clamp) => {
2096
+ const newScale = clamp(1.0);
2097
+ const center = getViewportCenter(this);
2098
+ const result = this.zoomToPoint(center.x, center.y, newScale);
2099
+ if (result) {
2100
+ this.emitTransformEvents();
2101
+ }
2102
+ return result;
2103
+ });
2095
2104
  });
2096
2105
  }
2097
2106
  zoomToFitContent() {
@@ -2133,30 +2142,28 @@ class MarkupCanvas {
2133
2142
  return this.updateTransform(newTransform);
2134
2143
  }
2135
2144
  // Zoom methods
2136
- zoomIn(factor = 0.1) {
2145
+ zoomIn(factor = 0.5) {
2137
2146
  return withTransition(this.transformLayer, this.config, () => {
2138
2147
  return withClampedZoom(this.config, (clamp) => {
2139
2148
  const newScale = clamp(this.baseCanvas.transform.scale * (1 + factor));
2140
- const newTransform = {
2141
- scale: newScale,
2142
- };
2143
- return this.updateTransform(newTransform);
2149
+ // Get the center of the viewport
2150
+ const center = getViewportCenter(this);
2151
+ return this.zoomToPoint(center.x, center.y, newScale);
2144
2152
  });
2145
2153
  });
2146
2154
  }
2147
- zoomOut(factor = 0.1) {
2155
+ zoomOut(factor = 0.5) {
2148
2156
  return withTransition(this.transformLayer, this.config, () => {
2149
2157
  return withClampedZoom(this.config, (clamp) => {
2150
2158
  const newScale = clamp(this.baseCanvas.transform.scale * (1 - factor));
2151
- const newTransform = {
2152
- scale: newScale,
2153
- };
2154
- return this.updateTransform(newTransform);
2159
+ // Get the center of the viewport
2160
+ const center = getViewportCenter(this);
2161
+ return this.zoomToPoint(center.x, center.y, newScale);
2155
2162
  });
2156
2163
  });
2157
2164
  }
2158
2165
  resetZoom() {
2159
- return this.resetView();
2166
+ return this.resetViewToCenter();
2160
2167
  }
2161
2168
  // Mouse drag control methods
2162
2169
  enableMouseDrag() {
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Markup Canvas
3
3
  * High-performance markup canvas with zoom and pan capabilities
4
- * @version 1.1.5
4
+ * @version 1.1.7
5
5
  */
6
6
  const EDITOR_PRESET = {
7
7
  // Canvas dimensions
@@ -16,8 +16,8 @@ const EDITOR_PRESET = {
16
16
  enableZoom: true,
17
17
  enablePan: true,
18
18
  enableTouch: true,
19
- enableKeyboard: false,
20
- bindKeyboardEventsTo: "canvas",
19
+ enableKeyboard: true,
20
+ bindKeyboardEventsTo: "document",
21
21
  // Zoom behavior
22
22
  zoomSpeed: 1.5,
23
23
  minZoom: 0.05,
@@ -272,13 +272,6 @@ function withRulerSize(canvas, rulerSize, operation) {
272
272
  const finalRulerSize = hasRulers ? rulerSize : 0;
273
273
  return operation(finalRulerSize);
274
274
  }
275
- function withRulerOffsets(canvas, rulerSize, x, y, operation) {
276
- return withRulerSize(canvas, rulerSize, (rulerSize) => {
277
- const adjustedX = x - rulerSize;
278
- const adjustedY = y - rulerSize;
279
- return operation(adjustedX, adjustedY);
280
- });
281
- }
282
275
  function withRulerOffsetObject(canvas, rulerSize, coords, operation) {
283
276
  return withRulerSize(canvas, rulerSize, (rulerSize) => {
284
277
  const adjusted = {
@@ -772,42 +765,28 @@ function getAdaptiveZoomSpeed(canvas, baseSpeed) {
772
765
  }
773
766
 
774
767
  function setupKeyboardEvents(canvas, config) {
775
- // Track mouse position
776
- let lastMouseX = 0;
777
- let lastMouseY = 0;
778
- function handleMouseMove(event) {
779
- const rect = canvas.container.getBoundingClientRect();
780
- const rawMouseX = event.clientX - rect.left;
781
- const rawMouseY = event.clientY - rect.top;
782
- withRulerOffsets(canvas, config.rulerSize, rawMouseX, rawMouseY, (adjustedX, adjustedY) => {
783
- lastMouseX = adjustedX;
784
- lastMouseY = adjustedY;
785
- });
786
- }
787
768
  function handleKeyDown(event) {
788
769
  if (!(event instanceof KeyboardEvent))
789
770
  return;
790
771
  if (config.bindKeyboardEventsTo === "canvas" && document.activeElement !== canvas.container)
791
772
  return;
792
- const isFastPan = event.shiftKey;
793
- const panDistance = config.keyboardPanStep * (isFastPan ? config.keyboardFastMultiplier : 1);
794
773
  let handled = false;
795
774
  const newTransform = {};
796
775
  switch (event.key) {
797
776
  case "ArrowLeft":
798
- newTransform.translateX = canvas.transform.translateX + panDistance;
777
+ newTransform.translateX = canvas.transform.translateX + config.keyboardPanStep;
799
778
  handled = true;
800
779
  break;
801
780
  case "ArrowRight":
802
- newTransform.translateX = canvas.transform.translateX - panDistance;
781
+ newTransform.translateX = canvas.transform.translateX - config.keyboardPanStep;
803
782
  handled = true;
804
783
  break;
805
784
  case "ArrowUp":
806
- newTransform.translateY = canvas.transform.translateY + panDistance;
785
+ newTransform.translateY = canvas.transform.translateY + config.keyboardPanStep;
807
786
  handled = true;
808
787
  break;
809
788
  case "ArrowDown":
810
- newTransform.translateY = canvas.transform.translateY - panDistance;
789
+ newTransform.translateY = canvas.transform.translateY - config.keyboardPanStep;
811
790
  handled = true;
812
791
  break;
813
792
  case "=":
@@ -816,7 +795,7 @@ function setupKeyboardEvents(canvas, config) {
816
795
  const adaptiveZoomStep = config.enableAdaptiveSpeed
817
796
  ? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
818
797
  : config.keyboardZoomStep;
819
- newTransform.scale = clampZoom(canvas.transform.scale * (1 + adaptiveZoomStep), config);
798
+ canvas.zoomIn(adaptiveZoomStep);
820
799
  handled = true;
821
800
  }
822
801
  break;
@@ -825,16 +804,21 @@ function setupKeyboardEvents(canvas, config) {
825
804
  const adaptiveZoomStep = config.enableAdaptiveSpeed
826
805
  ? getAdaptiveZoomSpeed(canvas, config.keyboardZoomStep)
827
806
  : config.keyboardZoomStep;
828
- newTransform.scale = clampZoom(canvas.transform.scale * (1 - adaptiveZoomStep), config);
807
+ canvas.zoomOut(adaptiveZoomStep);
829
808
  handled = true;
830
809
  }
831
810
  break;
832
811
  case "0":
833
- if (event.metaKey || event.ctrlKey) {
834
- const targetScale = 1.0;
835
- const zoomFactor = targetScale / canvas.transform.scale;
836
- const zoomTransform = getZoomToMouseTransform(lastMouseX, lastMouseY, canvas.transform, zoomFactor, config);
837
- Object.assign(newTransform, zoomTransform);
812
+ if (event.ctrlKey) {
813
+ if (canvas.resetView) {
814
+ canvas.resetView();
815
+ }
816
+ handled = true;
817
+ }
818
+ else if (event.metaKey || event.ctrlKey) {
819
+ if (canvas.resetViewToCenter) {
820
+ canvas.resetViewToCenter();
821
+ }
838
822
  handled = true;
839
823
  }
840
824
  break;
@@ -862,10 +846,8 @@ function setupKeyboardEvents(canvas, config) {
862
846
  }
863
847
  const keyboardTarget = config.bindKeyboardEventsTo === "canvas" ? canvas.container : document;
864
848
  keyboardTarget.addEventListener("keydown", handleKeyDown);
865
- canvas.container.addEventListener("mousemove", handleMouseMove);
866
849
  return () => {
867
850
  keyboardTarget.removeEventListener("keydown", handleKeyDown);
868
- canvas.container.removeEventListener("mousemove", handleMouseMove);
869
851
  };
870
852
  }
871
853
 
@@ -938,13 +920,15 @@ function handleMouseLeave(canvas, config, isDragEnabled, isSpacePressed, isDragg
938
920
  }
939
921
  }
940
922
 
941
- function handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
923
+ function handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, setters) {
942
924
  if (mouseDownTime > 0) {
943
925
  const deltaX = Math.abs(event.clientX - mouseDownX);
944
926
  const deltaY = Math.abs(event.clientY - mouseDownY);
945
927
  if (deltaX > CLICK_THRESHOLDS.MAX_MOVEMENT || deltaY > CLICK_THRESHOLDS.MAX_MOVEMENT) {
946
928
  setters.setHasDragged(true);
947
- if (!isDragging && isDragEnabled) {
929
+ // Check if drag is allowed based on configuration
930
+ const canDrag = config.requireSpaceForMouseDrag ? isSpacePressed : true;
931
+ if (!isDragging && isDragEnabled && canDrag) {
948
932
  setters.setIsDragging(true);
949
933
  }
950
934
  }
@@ -1085,7 +1069,7 @@ function setupMouseEvents(canvas, config, withControls = true) {
1085
1069
  handleMouseDown(event, canvas, config, isDragEnabled, isSpacePressed, setters);
1086
1070
  };
1087
1071
  const mouseMoveHandler = (event) => {
1088
- handleMouseMove(event, canvas, isDragEnabled, isDragging, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
1072
+ handleMouseMove(event, canvas, config, isDragEnabled, isDragging, isSpacePressed, mouseDownTime, mouseDownX, mouseDownY, lastMouseX, lastMouseY, {
1089
1073
  setHasDragged: setters.setHasDragged,
1090
1074
  setIsDragging: setters.setIsDragging,
1091
1075
  setLastMouseX: setters.setLastMouseX,
@@ -1484,6 +1468,20 @@ function setupWheelEvents(canvas, config) {
1484
1468
  };
1485
1469
  }
1486
1470
 
1471
+ function getViewportCenter(canvas) {
1472
+ try {
1473
+ const bounds = canvas.getBounds();
1474
+ return {
1475
+ x: bounds.width / 2,
1476
+ y: bounds.height / 2,
1477
+ };
1478
+ }
1479
+ catch (error) {
1480
+ console.warn("Failed to calculate viewport center:", error);
1481
+ return { x: 0, y: 0 };
1482
+ }
1483
+ }
1484
+
1487
1485
  // Rulers
1488
1486
  const RULER_Z_INDEX = {
1489
1487
  GRID: 100,
@@ -2082,12 +2080,23 @@ class MarkupCanvas {
2082
2080
  });
2083
2081
  }
2084
2082
  resetView() {
2083
+ const result = this.baseCanvas.resetView ? this.baseCanvas.resetView() : false;
2084
+ if (result) {
2085
+ this.emitTransformEvents();
2086
+ }
2087
+ return result;
2088
+ }
2089
+ resetViewToCenter() {
2085
2090
  return withTransition(this.transformLayer, this.config, () => {
2086
- const result = this.baseCanvas.resetView ? this.baseCanvas.resetView() : false;
2087
- if (result) {
2088
- this.emitTransformEvents();
2089
- }
2090
- return result;
2091
+ return withClampedZoom(this.config, (clamp) => {
2092
+ const newScale = clamp(1.0);
2093
+ const center = getViewportCenter(this);
2094
+ const result = this.zoomToPoint(center.x, center.y, newScale);
2095
+ if (result) {
2096
+ this.emitTransformEvents();
2097
+ }
2098
+ return result;
2099
+ });
2091
2100
  });
2092
2101
  }
2093
2102
  zoomToFitContent() {
@@ -2129,30 +2138,28 @@ class MarkupCanvas {
2129
2138
  return this.updateTransform(newTransform);
2130
2139
  }
2131
2140
  // Zoom methods
2132
- zoomIn(factor = 0.1) {
2141
+ zoomIn(factor = 0.5) {
2133
2142
  return withTransition(this.transformLayer, this.config, () => {
2134
2143
  return withClampedZoom(this.config, (clamp) => {
2135
2144
  const newScale = clamp(this.baseCanvas.transform.scale * (1 + factor));
2136
- const newTransform = {
2137
- scale: newScale,
2138
- };
2139
- return this.updateTransform(newTransform);
2145
+ // Get the center of the viewport
2146
+ const center = getViewportCenter(this);
2147
+ return this.zoomToPoint(center.x, center.y, newScale);
2140
2148
  });
2141
2149
  });
2142
2150
  }
2143
- zoomOut(factor = 0.1) {
2151
+ zoomOut(factor = 0.5) {
2144
2152
  return withTransition(this.transformLayer, this.config, () => {
2145
2153
  return withClampedZoom(this.config, (clamp) => {
2146
2154
  const newScale = clamp(this.baseCanvas.transform.scale * (1 - factor));
2147
- const newTransform = {
2148
- scale: newScale,
2149
- };
2150
- return this.updateTransform(newTransform);
2155
+ // Get the center of the viewport
2156
+ const center = getViewportCenter(this);
2157
+ return this.zoomToPoint(center.x, center.y, newScale);
2151
2158
  });
2152
2159
  });
2153
2160
  }
2154
2161
  resetZoom() {
2155
- return this.resetView();
2162
+ return this.resetViewToCenter();
2156
2163
  }
2157
2164
  // Mouse drag control methods
2158
2165
  enableMouseDrag() {