From 3617ed08cb4033642d4afa2aa12365e57322cd9e Mon Sep 17 00:00:00 2001 From: ciregenz Date: Wed, 15 Jul 2026 16:11:08 -0700 Subject: [PATCH] [eric] dashboard: shield webviews during card drag so a release over a browser page can't strand the edge-pan loop --- .../src/app/pages/Dashboard/hooks/interaction/useCardDrag.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/frontend/src/app/pages/Dashboard/hooks/interaction/useCardDrag.ts b/frontend/src/app/pages/Dashboard/hooks/interaction/useCardDrag.ts index ceabba2e..6bba46dd 100644 --- a/frontend/src/app/pages/Dashboard/hooks/interaction/useCardDrag.ts +++ b/frontend/src/app/pages/Dashboard/hooks/interaction/useCardDrag.ts @@ -81,6 +81,8 @@ export function useCardDrag({ const handleCardDragStart = useCallback((id: string, _type: CardType) => { activeDragCardRef.current = id; + // Reuse the marquee's webview shield: a pointerup released over a live is eaten by the guest process, so neither the card's onDragEnd nor the window backstop ever fires and the edge-pan loop pans forever (the "card drifts on its own" bug). + document.body.classList.add('dashboard-marquee-active'); if (selection.isSelected(id)) { isMultiDragRef.current = true; } else { @@ -108,6 +110,7 @@ export function useCardDrag({ const clearDrag = useCallback(() => { stopEdgePan(); activeDragCardRef.current = null; + document.body.classList.remove('dashboard-marquee-active'); isMultiDragRef.current = false; setMultiDragDelta(null); setLiveDragInfo(null);