List
A grouped list of rows with dividers between items. The default card variant adds a border and rounded corners; use variant="rail" when the parent pane owns the surrounding chrome. Rail lists keep a bottom border so the final row still has a visible boundary.
ListItem is a static row. Use ListItemButton for click handlers and ListItemLink for typesafe navigation — both ship with hover, focus, and cursor styles built in.
Props
| Prop | Values | Default | Notes |
|---|---|---|---|
as | 'div' | 'ul' | 'div' | ul renders real list semantics; wrap each row in your own <li>. |
variant | 'card' | 'rail' | 'card' | card adds a border and rounded corners; rail keeps only a bottom border. |
Prefer as="ul". An explicit ARIA role replaces the implicit one, so the div form has to
put role="listitem" on each row — which costs that row its own button or link role. Rows read
the form from List and drop the role automatically under as="ul", so nothing to set per item:
<List as="ul" variant="rail">
{rows.map((row) => (
<li key={row.id}>
<ListItemButton selected={row.id === selectedId}>{row.title}</ListItemButton>
</li>
))}
</List>Basic
Your personal information.
Manage what you hear from us.
Tune the app to your preferences.
With Actions
Rows that own a control (switch, checkbox, trailing button) stay as static ListItems — never nest a button inside a clickable row.
Receive a summary every morning.
Get pinged on this device.
As Links
ListItemLink wraps ListItemButton with TanStack Router’s createLink. Pass to, params, search directly — fully typed against the consumer’s route tree. Always pass dynamic segments through params (e.g. to="/orgs/$orgSlug" params={{ orgSlug }}) rather than interpolating into the path string — interpolation skips type checking and silently breaks when a route changes.
As Buttons
Use ListItemButton when the entire row should fire an onClick instead of navigate.
Inactive
inactive sinks the row (muted in light, subtle in dark — muted is a lift on dark rows) and fades its content. Trailing ListItemActions stay full strength so enable/disable (or similar) still read. Use interactive on a static ListItem when the row is clickable but owns nested buttons — ListItemButton cannot wrap other buttons. size="sm" tightens vertical padding.
Holds order when country is not US
Disabled — Adds tag "Singles" when product SKUs match
Selected
Use selected for the current item in a list-to-detail flow. The default selection is neutral. selectionVariant="accent" gives interactive rows a faint accent hover and a stronger accent tint when selected.
With Trailing Button
Some rows have a primary action instead of a link or a switch.
Permanently remove this account and all its data.