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.

  • Avery Chen
    avery@northwind.io
  • Jordan Lee
    jordan@northwind.io
  • Riley Gupta
    riley@northwind.io

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".

  • Nova Sales Assistant
    +1 (415) 555-0198
  • Pulse Support Agent
    +1 (212) 555-0147
  • Orbit Retention Bot
    +44 20 7946 0958

Trailing text

Rows with only text on the right pick up a neutral-50 hover fill.

  • Nova Sales Assistant
    +1 (415) 555-0198
    1m 05s
  • Pulse Support Agent
    +1 (212) 555-0147
    4m 18s
  • Orbit Retention Bot
    +44 20 7946 0958
    0m 55s

Checkbox

Set checkbox to put a checkbox on the right edge. Clicking anywhere on the row toggles it.

  • Emily
    American English, warm and conversational
  • Arjun
    Indian English, calm and clear
  • Sofía
    Latin American Spanish, bright and upbeat

Trailing controls

The trailing slot takes an input, select, multi-select or button without forcing a single-line row to double height.

  • Agent name
  • Voice
  • Languages
  • Phone numbers

Stacked trailing controls

Set trailingLayout="stacked" when one setting owns several fields. The row grows to fit them.

  • Webhook endpoints
    Call events go to the primary URL, then the fallback.

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.

    • Orbit Retention Bot
      Live
    • Helios Billing Support
      Live
    • Vega Feedback Collector
      Live

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.

Phone numberProviderAgent
  • +1 (415) 555-0198
    TwilioNova Sales Assistant
  • +1 (212) 555-0147
    PlivoPulse Support Agent
  • +44 20 7946 0958
    TwilioOrbit Retention Bot

Nested columns

Nested rows work inside ListColumns; keep child columns aligned to the header.

TeamRole
    • Avery Chen
      avery@northwind.io
      Admin
    • Jordan Lee
      jordan@northwind.io
      Member

Sortable columns

ListHeaderColumn with sortable cycles none, ascending and descending on each click. Sort the rows yourself; cycleListSortDirection returns the next direction.

  • Nova Sales Assistant
    Inbound sales
    1,450
  • Pulse Support Agent
    Customer support
    3,210
  • Atlas Onboarding Guide
    Customer onboarding
    640

Page size

Set pageSize to reveal rows you already have in batches, with a Load more button under the list.

  • Nova Sales Assistant
    CALL-4506
    1m 05s
  • Zephyr Lead Qualifier
    CALL-4507
    2m 42s
  • Pulse Support Agent
    CALL-4508
    4m 18s

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.

  • Nova Sales Assistant
    12 turns
    T-1024
  • Zephyr Lead Qualifier
    8 turns
    T-1023
  • Pulse Support Agent
    21 turns
    T-1022

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.