v2.3.0 — Scroll-proof drags, RTL, reduced motion
Tier-1 correctness release: drags now survive scrolling, and two accessibility gaps are closed.
Added
- RTL keyboard navigation.
Direction::RtlonDndProvider(orZoneRegistry::set_directionfor hook users) mirrors the keyboard experience: spatial zone ordering runs right-to-left within a row, and the descend/ascend arrows swap so "into" is always the arrow pointing along reading order - the WAI-ARIA tree convention. LTR unchanged and default. prefers-reduced-motionsupport.SortableList's live preview andFlipItem's glide mark their moving elements withdata-dnd-motionand ship a media-query override, so drags snap instead of gliding when the user asks the OS for less motion. Near-zero duration rather than zero, sotransitionendstill fires. Mark your own animated elements with the same attribute to opt them in.
Fixed
- Stale hit-test rects while auto-scrolling. Zone rects were cached at drag start, but
AutoScrollmoves the zones mid-drag - so hover and drops targeted where zones sat at pickup. A new payload-type-erasedRectRefreshchannel (one per provider tree; thunks self-gate on having a drag in flight) fixes it:AutoScrollpings after every scroll it performs and on any other scroll of its container, and the newuse_rect_refresh()hook lets custom layout mutators ping too. - Sortables and grids track scrolling too.
AutoScrollanchors the channel when it's the outermost participant, so the provider-lessSortableList/SortableGridjoin it. The grid re-measures plainly; the list re-anchors - its rows carry live-preview transforms (often mid-transition, unreadable exactly), but the wrapper never transforms, so one wrapper measurement per ping shifts every cached base slot by the exact scroll distance.
Tests
134 passing: 78 unit, 40 runtime, 2 doctests, 14 Playwright browser regressions - including two new scroll regressions (drop zones and sortable slots that auto-scrolled into place), each verified red without its fix.