diff --git a/src/lib/components/common/ResizableSidePanel.svelte b/src/lib/components/common/ResizableSidePanel.svelte index 76da0e7c40..68c00cb565 100644 --- a/src/lib/components/common/ResizableSidePanel.svelte +++ b/src/lib/components/common/ResizableSidePanel.svelte @@ -15,6 +15,8 @@ let panelElement: HTMLDivElement | null = null; let isResizing = false; + let activePointerId: number | null = null; + let activeResizer: HTMLElement | null = null; let startClientX = 0; let startWidth = 0; @@ -48,19 +50,31 @@ onClose(); }; - const resizeStartHandler = (e: MouseEvent) => { + const resizeStartHandler = (e: PointerEvent) => { if (!open) return; + e.preventDefault(); isResizing = true; + activePointerId = e.pointerId; + activeResizer = e.currentTarget as HTMLElement; + activeResizer.setPointerCapture?.(e.pointerId); startClientX = e.clientX; startWidth = width; document.body.style.userSelect = 'none'; }; - const resizeEndHandler = () => { + const resizeEndHandler = (e?: PointerEvent) => { if (!isResizing) return; + if (e && activePointerId !== null && e.pointerId !== activePointerId) return; isResizing = false; + if (activePointerId !== null) { + if (activeResizer?.hasPointerCapture?.(activePointerId)) { + activeResizer.releasePointerCapture(activePointerId); + } + } + activePointerId = null; + activeResizer = null; document.body.style.userSelect = ''; persistWidth(); }; @@ -109,14 +123,16 @@ { + on:pointermove={(e) => { if (!isResizing) return; + if (activePointerId !== null && e.pointerId !== activePointerId) return; resizeHandler(e.clientX); }} on:resize={() => { if (open) width = clamp(width); }} - on:mouseup={resizeEndHandler} + on:pointerup={resizeEndHandler} + on:pointercancel={resizeEndHandler} /> {#if open} @@ -125,7 +141,7 @@ {/if} @@ -147,7 +164,7 @@ {/if}