mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-04-14 16:40:58 -04:00
40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { MIN_ZOOM } from "../constants";
|
|
import { 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,
|
|
},
|
|
};
|
|
};
|