From ab41dcc487d1517f7c8c5d0b02a02cdaadedb03d Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Tue, 11 Aug 2026 17:44:34 -0600 Subject: [PATCH] refac --- .../components/common/MobileSwipePanel.svelte | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/components/common/MobileSwipePanel.svelte b/src/lib/components/common/MobileSwipePanel.svelte index 77590959ef..f4ba515db0 100644 --- a/src/lib/components/common/MobileSwipePanel.svelte +++ b/src/lib/components/common/MobileSwipePanel.svelte @@ -62,11 +62,34 @@ return ( target instanceof Element && !!target.closest( - 'input, textarea, select, button, [role="menu"], [contenteditable="true"], [data-sidebar-no-gesture]' + 'input, textarea, select, [role="menu"], [contenteditable="true"], [data-sidebar-no-gesture]' ) ); }; + const canScrollHorizontally = (target: EventTarget | null, dx: number) => { + if (!(target instanceof Element) || dx === 0 || typeof window === 'undefined') { + return false; + } + + let element: Element | null = target; + while (element && element !== document.documentElement && element !== document.body) { + const node = element as HTMLElement; + const overflowX = window.getComputedStyle(node).overflowX; + const isScrollable = + /(auto|scroll|overlay)/.test(overflowX) && node.scrollWidth > node.clientWidth + 1; + + if (isScrollable) { + const maxScrollLeft = node.scrollWidth - node.clientWidth; + return dx > 0 ? node.scrollLeft > 0 : node.scrollLeft < maxScrollLeft - 1; + } + + element = element.parentElement; + } + + return false; + }; + const setScrollLock = (locked: boolean) => { if (scrollLocked === locked || typeof document === 'undefined') { return; @@ -190,6 +213,11 @@ return; } + if (absX > absY && canScrollHorizontally(e.target, dx)) { + cancelSwipe(); + return; + } + if (absY > absX || absX < absY * AXIS_RATIO) { cancelSwipe(); return;