Skip to content
ArcadiaDesign
Quarterly report
Fix the flaky upload test
Plan the onboarding flow
Colour tokens

TSX

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.

ListPresence

rootrequired
RefObject<HTMLElement | null>
The list element: the ref useFlip returns.
instant
booleanDefault false
Rows that leave now go at once (a bulk change, a filter).
children
ReactNode
The rows, each keyed, its key also its data-flip-key.