diff options
| author | kj_sh604 | 2026-03-15 16:19:35 -0400 |
|---|---|---|
| committer | kj_sh604 | 2026-03-15 16:19:35 -0400 |
| commit | 6ec259a0e71174651bae95d4628138bf6fd68742 (patch) | |
| tree | 5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/excalidraw/scene/zoom.ts | |
| parent | 16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff) | |
refactor: packages/
Diffstat (limited to 'packages/excalidraw/scene/zoom.ts')
| -rw-r--r-- | packages/excalidraw/scene/zoom.ts | 35 |
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, + }, + }; +}; |
