From 8db3bead13441a5882d8689dfc6a9f09c82375d9 Mon Sep 17 00:00:00 2001 From: Maze Winther Date: Wed, 25 Mar 2026 16:47:22 +0100 Subject: feat: masks, properties refactor, shaders, storage migrations, and more --- apps/web/src/hooks/timeline/use-timeline-zoom.ts | 28 ++++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'apps/web/src/hooks/timeline/use-timeline-zoom.ts') diff --git a/apps/web/src/hooks/timeline/use-timeline-zoom.ts b/apps/web/src/hooks/timeline/use-timeline-zoom.ts index 095c64dc..64a0fb58 100644 --- a/apps/web/src/hooks/timeline/use-timeline-zoom.ts +++ b/apps/web/src/hooks/timeline/use-timeline-zoom.ts @@ -81,18 +81,22 @@ export function useTimelineZoom({ return; } - // pinch-zoom (ctrl/meta + wheel) - if (isZoomGesture) { - const zoomMultiplier = event.deltaY > 0 ? 1 / 1.1 : 1.1; - setZoomLevel((prev) => { - const nextZoom = Math.max( - minZoom, - Math.min(TIMELINE_CONSTANTS.ZOOM_MAX, prev * zoomMultiplier), - ); - return nextZoom; - }); - return; - } + // pinch-zoom (ctrl/meta + wheel) + if (isZoomGesture) { + const normalizedDelta = + event.deltaMode === 1 ? event.deltaY * 16 : event.deltaY; + const cappedDelta = + Math.sign(normalizedDelta) * Math.min(Math.abs(normalizedDelta), 30); + const zoomFactor = Math.exp(-cappedDelta / 300); + setZoomLevel((prev) => { + const nextZoom = Math.max( + minZoom, + Math.min(TIMELINE_CONSTANTS.ZOOM_MAX, prev * zoomFactor), + ); + return nextZoom; + }); + return; + } }, [minZoom, setZoomLevel], ); -- cgit v1.3.1