List presence
A list's rows come, go and change places without a jump: a row arrives on Enter, a leaving row fades and its slot folds shut, and the order holds still under the pointer.
import { ListPresence } from "@arcadia/ui"A list's rows come, go and change places without a jump. Each row carries its key as data-flip-key. useFlip glides a row that changed places over --duration-reorder on --ease-settle, and with enter a row that is new arrives on Enter, from above or below, as its slot unfolds over --duration-fold. ListPresence keeps a row whose key left drawn while it fades where it stands over --duration-exit, then folds its slot shut over --duration-fold-close, so the rows after it and whatever follows the list move up together.
Past eight rows at once, while the page is hidden and under reduced motion, rows snap: a sort or a filter moves too much to follow, and a reduced-motion leave keeps only its short fade. Pass instant for a bulk change.
Holding still
Under the pointer
useHeldOrder(order, hold) keeps the rows where they are while hold is set: the pointer is in the list, or a row's menu is open. Rows still arrive and leave while it holds.
It gives way 600ms after hold lets go, as one change, so the rows glide once to the live order. A list that re-sorts by activity waits for the pointer to leave before it moves a row out from under it.
A row that is leaving is inert at once, so a click or Tab never lands on what is going. Every move is a transform or opacity on a row already in its place; focus and the reading order follow the live list.