expandOverGroup read the dragged element type straight from dnd-kit, so
once the virtualiser unmounted a dragged group the guard stopped matching
and dragging over a collapsed group expanded it. canDrop then saw an
expanded target and rejected an otherwise valid drop after that group.
Both handlers now resolve the active data through the same helper, which
falls back to the drag start snapshot.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TEnUVARPnSqXijiz8KiLiE
dnd-kit measures the drag overlay's first child and uses that rect for
collision detection. A preview smaller than the row it represents shifts
the collision centre and, with closestCenter, the resulting drop position.
The preview now fills the overlay wrapper, which dnd-kit sizes from the
dragged element, keeping drop targeting identical to before the overlay.
Also drops the redundant drag cancel wrapper.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TEnUVARPnSqXijiz8KiLiE
The rundown list is virtualised, so dragging an entry far enough for its
row to leave the render window unmounts the draggable. dnd-kit then loses
both the rect used for collision detection and the data attached to the
active element: the dragged element stopped being rendered and the drop
had no effect.
- render a drag overlay (portaled to the body) with a lightweight preview
of the dragged entry, which keeps the drag visible and gives dnd-kit a
stable rect for collision detection
- keep a copy of the active element data from drag start, and use it on
drag end when dnd-kit falls back to empty data
- sortable entries stay in place as a dimmed placeholder while dragging,
since the overlay now represents the moving element
- clear the drag state on drag cancel
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TEnUVARPnSqXijiz8KiLiE
Search every text field with optional filters, keep result selection stable, and expose clearer match context and counts. Cover query parsing, matching, mixed-entry indexing, and the reveal flow.
* fix: issue where a count-to-end would lead to incorrect expected times
* fix: include add time in overtime when countToEnd
* fix: ui and server use same calculation for expected end