import { MIN_ZOOM } from "../constants"; import type { AppState, NormalizedZoomValue } from "../types"; export const getNormalizedZoom = (zoom: number): NormalizedZoomValue => { return Math.max(MIN_ZOOM, Math.min(zoom, 30)) as NormalizedZoomValue; }; 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, }, }; };