From 5dd41d802223d3b25a83d79aed980dc3ea8d43fe Mon Sep 17 00:00:00 2001 From: yohlo Date: Mon, 9 Feb 2026 22:20:00 -0600 Subject: [PATCH] fix scroll bug --- src/features/core/components/pullable.tsx | 58 ++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/features/core/components/pullable.tsx b/src/features/core/components/pullable.tsx index 043f9cc..6fb4c00 100644 --- a/src/features/core/components/pullable.tsx +++ b/src/features/core/components/pullable.tsx @@ -85,6 +85,55 @@ const Pullable: React.FC = ({ children, scrollPosition, onScrollP return () => void ac.abort(); }, []); + // Fix wheel scrolling over child elements + useEffect(() => { + const scrollWrapper = document.getElementById('scroll-wrapper'); + if (!scrollWrapper) return; + + const viewport = scrollWrapper.querySelector('.mantine-ScrollArea-viewport') as HTMLElement; + if (!viewport) return; + + const handleWheel = (e: WheelEvent) => { + const target = e.target as HTMLElement; + + // Check if the target is inside a nested scrollable container + let element = target; + while (element && element !== viewport) { + const overflow = window.getComputedStyle(element).overflow; + const overflowY = window.getComputedStyle(element).overflowY; + const overflowX = window.getComputedStyle(element).overflowX; + + // If we found a scrollable ancestor (not the main viewport), don't interfere + if ( + (overflow === 'auto' || overflow === 'scroll' || + overflowY === 'auto' || overflowY === 'scroll' || + overflowX === 'auto' || overflowX === 'scroll') && + element !== viewport + ) { + // Check if this element can actually scroll in the wheel direction + const canScrollY = element.scrollHeight > element.clientHeight; + const canScrollX = element.scrollWidth > element.clientWidth; + + if ((e.deltaY !== 0 && canScrollY) || (e.deltaX !== 0 && canScrollX)) { + return; // Let the nested scroller handle it + } + } + + element = element.parentElement as HTMLElement; + } + + // No nested scroller found, scroll the main viewport + viewport.scrollTop += e.deltaY; + viewport.scrollLeft += e.deltaX; + }; + + scrollWrapper.addEventListener('wheel', handleWheel, { passive: true }); + + return () => { + scrollWrapper.removeEventListener('wheel', handleWheel); + }; + }, []); + useEffect(() => { const timeoutId = setTimeout(() => { if (scrollAreaRef.current) { @@ -129,8 +178,15 @@ const Pullable: React.FC = ({ children, scrollPosition, onScrollP onScrollPositionChange={onScrollPositionChange} type='never' mah='100%' h='100%' pt={(scrolling || scrollY > 40) || !isRefreshing ? 0 : 40 - scrollY} + styles={{ + viewport: { + '& > *': { + pointerEvents: 'auto' + } + } + }} > - + {children}