List

Vertical collections with leading and trailing slots.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
A plain vertical collection, hairline between rows
Overview
Members
Billing
Integrations
Configuration
Leading
Trailing
Description
ALAda LovelaceDesign LeadPAID
<List.Row leading={<Avatar />} description="…" trailing={<Badge />} />
Behavior — The Engineering Contract
PropTypeNotes
title / descriptionReactNodePrimary line and muted sub-line
leading / trailingReactNodeAvatar, icon, badge, chevron or action
onClick() => voidMakes the row a button; whole row is the target
selectedbooleanSets aria-pressed and the warm check
↑ / ↓ · EnterMove between rows; activate the focused one

Use a List for a vertical collection of like items. For columns of comparable data use a Table; for a set of filters use Pills.

Anatomy
ALAda LovelaceDesign LeadPAID
1LeadingOptional avatar or icon, fixed 34px.
2BodyTitle plus an optional muted description.
3TrailingBadge, chevron or an action, right-aligned.
Do's and Don'ts
✓ Do
Members
Billing

Keep rows to one idea. Consistent slots make the set scannable.

✕ Don't
Name, role, email, last seen, plan, and status all crammed in

Don't cram a spreadsheet into a row. Comparable columns want a Table.

✓ Do
ALAda LovelaceDesign Lead

Align leading media and text so every row reads on the same grid.

✕ Don't
Row oneNEW!

Don't overload the trailing slot. One signal per row, not three.

In context: Examples
A · Settings menu
General
Members
Billing

Navigable settings sections, each a row with a chevron.

B · People
GHGrace HopperSystems

Member and contact lists with avatar, name and role.

C · Transactions
Invoice 4821PAID

Records with a status badge in the trailing slot.

Measurements & Tokens
TokenValueRole
--list-pad12px 14pxRow padding
--list-gap12pxSlot-to-slot spacing
--list-border#1E1E1EOuter border
--list-divider#1A1A1AHairline between rows
--list-hover#131418Row hover fill
--list-lead34pxLeading avatar / icon size
Code
<div class="o-list">
  <button class="o-list__row" aria-pressed="true">
    <span class="o-list__lead"><span class="o-avatar">AL</span></span>
    <span class="o-list__body">
      <span class="o-list__title">Ada Lovelace</span>
      <span class="o-list__desc">Design Lead</span>
    </span>
    <span class="o-list__trail"><Badge>PAID</Badge></span>
  </button>
</div>