Lists
Rows of comparable content that extend into tables.
Double line
Media, title and description in a 72px row: 40px of content and 16px of padding top and bottom. Set actions when the row holds controls, so it skips the hover fill.
Single line
A 52px row with a title only. Density is inferred from EntityContent; set density="compact" to be explicit and use EntityMedia size="sm".
Trailing text
Rows with only text on the right pick up a neutral-50 hover fill.
Checkbox
Set checkbox to put a checkbox on the right edge. Clicking anywhere on the row toggles it.
Trailing controls
The trailing slot takes an input, select, multi-select or button without forcing a single-line row to double height.
Stacked trailing controls
Set trailingLayout="stacked" when one setting owns several fields. The row grows to fit them.
Nested
Set nested on a ListItem and put a ListNested inside it. The row becomes a disclosure with a chevron; children indent 8px per level.
Columns
ListColumns wraps the list in a Frame with a 1px inset. ListHeader holds the column labels in the well, aligned to the row content.
Nested columns
Nested rows work inside ListColumns; keep child columns aligned to the header.
Sortable columns
ListHeaderColumn with sortable cycles none, ascending and descending on each click. Sort the rows yourself; cycleListSortDirection returns the next direction.
Page size
Set pageSize to reveal rows you already have in batches, with a Load more button under the list.
Load more
Pass loadMore to fetch the next page. The button shows a spinner while isLoadingMore is true. Set autoLoadCount to load that many pages on scroll before the button takes over.
Best practices
When to use
- Use for a vertical set of comparable rows read top to bottom: members, phone numbers, transcripts, settings.
- Use Table when people compare values across several named columns; use List when each row is one identity plus one or two values.
- Use ListColumns when rows need column labels. Labels sit in the well; don't add a section title there.
Behavior
- Single-line rows (density="compact") are 52px with EntityMedia size="sm". Double-line rows are 72px with default 40px media. Density is inferred from EntityContent; set it explicitly when the content is custom.
- Rows without controls get a neutral-50 hover. Set actions when a row holds a menu, select or input; trailing and checkbox rows opt out of the hover fill automatically.
- Menus opened from a row keep that row highlighted until they close. Use DropdownMenu for row menus so this works.
- Use checkbox for multi-select rows: the checkbox sits on the right edge and clicking anywhere on the row toggles it. Pass checkboxLabel naming the row, e.g. "Select Emily".
- Use trailingLayout="stacked" only when one setting owns several fields; the row grows to fit.
- Use nested ListItem with ListNested for hierarchy (campaign → agents). Keep flat rows for peers. Open the first group with defaultOpen when it is the likely target.
- Use pageSize to reveal rows you already have in batches. Use loadMore for server pages, and set isLoadingMore while the request is in flight. autoLoadCount loads that many pages on scroll before the button takes over.
- ListHeaderColumn sortable only renders the state; sort the rows yourself and advance with cycleListSortDirection (none → asc → desc).
Content
- Titles are the identity (agent name, phone number); descriptions are one line of context (email, purpose, duration).
- Keep trailing text short and tabular: durations, counts, roles.
Accessibility
- Name every icon-only row action with its target: "More actions for Avery Chen".
- Sortable headers are buttons with aria-sort; keep the visible label the same as the column name.