Description
The sidebar resize handle uses setPointerCapture on a 4px-wide element. When dragging quickly, the cursor can escape the handle area, causing pointer events to stop being delivered to the element.
Expected behavior
Dragging the sidebar resize handle should work reliably regardless of cursor speed, and releasing the mouse button should always end the drag state.
Actual behavior
- Cursor stuck as
col-resize after releasing the mouse button outside the handle
- Sidebar width stops tracking the pointer mid-drag
- Requires a page reload to recover
Steps to reproduce
- Open a session with the sidebar visible (desktop layout)
- Grab the resize handle and drag quickly to the left or right
- Move the cursor fast enough to leave the 4px handle area
- Release the mouse button — cursor remains stuck as col-resize
Root cause
setPointerCapture on narrow elements is unreliable across browsers, especially on Linux/Wayland and touch devices. The pointermove and pointerup handlers are attached to the element via React props, so they stop firing when the browser loses pointer capture.
Fix
PR #497 replaces element-level pointer capture with document-level pointermove/pointerup/pointercancel listeners managed via useEffect.
Description
The sidebar resize handle uses
setPointerCaptureon a 4px-wide element. When dragging quickly, the cursor can escape the handle area, causing pointer events to stop being delivered to the element.Expected behavior
Dragging the sidebar resize handle should work reliably regardless of cursor speed, and releasing the mouse button should always end the drag state.
Actual behavior
col-resizeafter releasing the mouse button outside the handleSteps to reproduce
Root cause
setPointerCaptureon narrow elements is unreliable across browsers, especially on Linux/Wayland and touch devices. Thepointermoveandpointeruphandlers are attached to the element via React props, so they stop firing when the browser loses pointer capture.Fix
PR #497 replaces element-level pointer capture with document-level
pointermove/pointerup/pointercancellisteners managed viauseEffect.