diff --git a/ui/src/lib/components/AudioPlayer.svelte b/ui/src/lib/components/AudioPlayer.svelte index a1e92e4..3316bbf 100644 --- a/ui/src/lib/components/AudioPlayer.svelte +++ b/ui/src/lib/components/AudioPlayer.svelte @@ -981,7 +981,7 @@ let floatMoved = $state(false); function onFloatPointerDown(e: PointerEvent) { - e.preventDefault(); + e.stopPropagation(); floatDragging = true; floatMoved = false; floatDragStart = { mx: e.clientX, my: e.clientY, ox: audioStore.floatPos.x, oy: audioStore.floatPos.y }; @@ -1000,12 +1000,14 @@ }; audioStore.floatPos = clampFloatPos(raw.x, raw.y); } - function onFloatPointerUp() { + function onFloatPointerUp(e: PointerEvent) { + if (!floatDragging) return; if (floatDragging && !floatMoved) { // Tap: toggle play/pause audioStore.toggleRequest++; } floatDragging = false; + try { (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId); } catch { /* ignore */ } } // Clamp saved position to viewport on mount and on resize @@ -1525,7 +1527,7 @@ onpointerdown={onFloatPointerDown} onpointermove={onFloatPointerMove} onpointerup={onFloatPointerUp} - onpointercancel={onFloatPointerUp} + onpointercancel={(e) => { floatDragging = false; try { (e.currentTarget as HTMLElement).releasePointerCapture(e.pointerId); } catch { /* ignore */ } }} > {#if audioStore.isPlaying}