StackedList
Vertical lists with avatar, two-line items, and trailing metadata. Used for contacts, activity feeds, and data previews.
Rows can carry a per-item trailing slot for an inline control, and reorderable adds a leading drag grip per row (keyboard- and screen-reader-operable) that reports each drop through onReorder while the order stays controlled by your items array.
The rows are a list, as in Tailwind UI, and each row is one of its items: a screen reader announces the list with its number of rows and moves through it row by row. A clickable row's button sits inside its item. The header title names the list; a list without a title takes its name from label.
A virtualized list with a bounded height scrolls its rows in a list of its own. On the web, while those rows overflow, that list is a keyboard tab stop (after the header's action, and before the rows' own buttons when they have any), the keyboard can scroll it, and while it has keyboard focus the list's card, or a plain list's frame, draws the theme's focus ring. Only the rows near its viewport are mounted, and each says where it sits in the whole list, so a screen reader still counts every row. Give a windowed list a title or a label: focused, a list with no name is named in Chromium from the text of every row it has rendered, so the kit warns in development when it has neither.
- Rachel Chenrachel.chen@example.comadmin
- Ada Lovelaceada@example.comeditor
- Kevin Turnerkevin@example.comviewer
iOS
- Rachel Chenrachel.chen@example.comadmin
- Ada Lovelaceada@example.comeditor
- Kevin Turnerkevin@example.comviewer
Android
- Rachel Chenrachel.chen@example.comadmin
- Ada Lovelaceada@example.comeditor
- Kevin Turnerkevin@example.comviewer
Web
tsx
Default
Status tones
Clickable
Card
Custom header action
Reorderable
Inline trailing control
Props
Do & Don’t
Two-line with avatar
Don’t
Equal weight on both lines flattens the hierarchy; the email competes with the name.
Do
- Rachel Chenrachel.chen@example.com
Primary line bold; secondary line smaller and muted, truncated so long values never wrap.
Clickable
Don’t
A drilldown row with no hover state and no chevron gives no hint it is interactive.
Do
Wrap the row in a link with a hover background and a trailing chevron to signal drilldown.
Card surface group
Don’t
A header with no rule blends into the rows, and dropping the per-row action removes the affordance.
Do
Separate the titled header with a rule and give each row a trailing action menu.
Reorderable rows
Don’t
Don't reorder id-less rows: with the array index as the only key, every drop re-keys the rows under assistive tech and remounts their avatars, and the reported afterId/beforeId degrade to transient indices no backend can rank by.
Do
- Rachel Chenrachel.chen@example.com
- Ada Lovelaceada@example.com
Give every reorderable row a stable id and apply the reported move to your own array: identity is what keeps focus, press state, and the drag announcements attached to the right row.