feat: exponential zoom

This commit is contained in:
Maze Winther
2026-02-02 18:11:12 +01:00
parent 22ea6b8925
commit c3f0d640ef
2 changed files with 47 additions and 17 deletions
+33
View File
@@ -51,3 +51,36 @@ export function getZoomPercent({
}): number {
return (zoomLevel - minZoom) / (TIMELINE_CONSTANTS.ZOOM_MAX - minZoom);
}
/**
* Convert linear slider position (0-1) to exponential zoom level.
* At low slider values, zoom changes are small. At high values, changes are large.
*/
export function sliderToZoom({
sliderPosition,
minZoom,
maxZoom = TIMELINE_CONSTANTS.ZOOM_MAX,
}: {
sliderPosition: number;
minZoom: number;
maxZoom?: number;
}): number {
const clampedPosition = Math.max(0, Math.min(1, sliderPosition));
return minZoom * (maxZoom / minZoom) ** clampedPosition;
}
/**
* Convert exponential zoom level to linear slider position (0-1).
*/
export function zoomToSlider({
zoomLevel,
minZoom,
maxZoom = TIMELINE_CONSTANTS.ZOOM_MAX,
}: {
zoomLevel: number;
minZoom: number;
maxZoom?: number;
}): number {
const clampedZoom = Math.max(minZoom, Math.min(maxZoom, zoomLevel));
return Math.log(clampedZoom / minZoom) / Math.log(maxZoom / minZoom);
}