diff --git a/web/src/anim.ts b/web/src/anim.ts index 82ac011..ccf34cc 100644 Binary files a/web/src/anim.ts and b/web/src/anim.ts differ diff --git a/web/src/components/ArrangePhase.tsx b/web/src/components/ArrangePhase.tsx index c4d5355..2538543 100644 --- a/web/src/components/ArrangePhase.tsx +++ b/web/src/components/ArrangePhase.tsx @@ -39,9 +39,11 @@ export function ArrangePhase({ view, you, send }: Props) { const locked = you.ready // The arrow buttons reorder `order` and the cards glide to their new slot. - // Drag-and-drop reorders instantly instead: a drag fires continuously, so - // animating every crossing looks frantic — we suppress it while dragging. - const arrangeAnim = useCardAnimations(order, (c) => c.id, !dragging) + // A drag reorders live too, and the neighbors the dragged card passes should + // glide into the gap it opens — so animation stays on. Only the dragged card + // itself is excluded (`dragId`): its inner wrapper already tracks the finger, + // so FLIP-sliding its box on top of that would fight the follow transform. + const arrangeAnim = useCardAnimations(order, (c) => c.id, true, dragId ?? undefined) // Resync only if the deck's actual contents changed — every broadcast // creates a fresh array, and blindly resetting would wipe an in-progress