mirror of
https://github.com/excalidraw/excalidraw.git
synced 2025-04-14 16:40:58 -04:00
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { AppState, NormalizedZoomValue } from "../types";
|
|
|
|
export const getNormalizedZoom = (zoom: number): NormalizedZoomValue => {
|
|
const normalizedZoom = parseFloat(zoom.toFixed(2));
|
|
const clampedZoom = Math.max(0.1, Math.min(normalizedZoom, 30));
|
|
return clampedZoom 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,
|
|
},
|
|
};
|
|
};
|