From 5829df794b8b7c5a15a59c70e549a7fae594b204 Mon Sep 17 00:00:00 2001 From: John Leider Date: Mon, 20 Apr 2026 23:36:02 -0500 Subject: [PATCH] fix(Carousel): intercept shift+wheel for discrete slide navigation Chrome's scroll-snap-type: mandatory absorbs each shift+wheel tick, making fast or direction-changing scrolls feel ignored. Intercept the event when Shift is held, preventDefault, and step next/prev with a 300ms throttle so one wheel tick moves exactly one slide. Closes #193 --- .../components/Carousel/CarouselViewport.vue | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/0/src/components/Carousel/CarouselViewport.vue b/packages/0/src/components/Carousel/CarouselViewport.vue index cbbc3caf7..0bd719f3d 100644 --- a/packages/0/src/components/Carousel/CarouselViewport.vue +++ b/packages/0/src/components/Carousel/CarouselViewport.vue @@ -118,6 +118,23 @@ } }) + let lastShiftWheel = 0 + + useEventListener(el, 'wheel', (e: WheelEvent) => { + if (!e.shiftKey) return + const delta = e.deltaY || e.deltaX + if (delta === 0) return + + e.preventDefault() + + const now = performance.now() + if (now - lastShiftWheel < 300) return + lastShiftWheel = now + + if (delta > 0) carousel.next() + else carousel.prev() + }, { passive: false }) + let dragStart = 0 let scrollStart = 0