aboutsummaryrefslogtreecommitdiffstats
path: root/packages/excalidraw/scene/zoom.ts
diff options
context:
space:
mode:
authorkj_sh6042026-03-15 16:19:35 -0400
committerkj_sh6042026-03-15 16:19:35 -0400
commit6ec259a0e71174651bae95d4628138bf6fd68742 (patch)
tree5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/scene/zoom.ts
parent16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff)
refactor: packages/
Diffstat (limited to 'packages/excalidraw/scene/zoom.ts')
-rw-r--r--packages/excalidraw/scene/zoom.ts35
1 files changed, 35 insertions, 0 deletions
diff --git a/packages/excalidraw/scene/zoom.ts b/packages/excalidraw/scene/zoom.ts
new file mode 100644
index 0000000..5decf11
--- /dev/null
+++ b/packages/excalidraw/scene/zoom.ts
@@ -0,0 +1,35 @@
+import type { AppState, NormalizedZoomValue } from "../types";
+
+export const getStateForZoom = (
+ {
+ viewportX,
+ viewportY,
+ nextZoom,
+ }: {
+ viewportX: number;
+ viewportY: number;
+ nextZoom: NormalizedZoomValue;
+ },
+ appState: AppState,
+) => {
+ const appLayerX = viewportX - appState.offsetLeft;
+ const appLayerY = viewportY - appState.offsetTop;
+
+ const currentZoom = appState.zoom.value;
+
+ // get original scroll position without zoom
+ const baseScrollX = appState.scrollX + (appLayerX - appLayerX / currentZoom);
+ const baseScrollY = appState.scrollY + (appLayerY - appLayerY / currentZoom);
+
+ // get scroll offsets for target zoom level
+ const zoomOffsetScrollX = -(appLayerX - appLayerX / nextZoom);
+ const zoomOffsetScrollY = -(appLayerY - appLayerY / nextZoom);
+
+ return {
+ scrollX: baseScrollX + zoomOffsetScrollX,
+ scrollY: baseScrollY + zoomOffsetScrollY,
+ zoom: {
+ value: nextZoom,
+ },
+ };
+};