Skip to content

Built · v1.0 · Figma set

List Row

List rows are the workhorse of text+: every conversation, contact and setting is a row. One flexible component, leading · content · trailing: replaces dozens of ad-hoc lists. The audit counted 61 uses, more than any other structural piece.

ALAlex RiveraMobile · 5 min ago
Messages3 new3
NotificationsSounds & vibration
CountryUnited States

Every row above is the same component. Only the slots change. Flip the theme (top right) and watch it move through Light, Carbon and Navy without a single hardcoded colour.

Use when

  • Listing items of the same kind. Contacts, conversations, settings.
  • Offering a tap target that leads somewhere or toggles something.

Don’t use when

  • Promoting an offer or CTA. Use an Action Card.
  • Laying out a form. Fields are Input, not rows.

One vertical frame = a state layer (horizontal auto-layout) plus a divider. The state layer holds three slots, each toggleable and swappable on its own.

OverlineLabel textSupporting line text
  • Leading: instance-swap slot: an icon (24px) or an avatar (40px). Toggle with Show Leading.
  • Content: Label is always visible (Inter Medium 16). Overline (11, uppercase) and Supporting (13) are optional booleans.
  • Trailing: instance-swap slot: chevron, switch, radio, button, badge, timestamp, value, checkmark, or none.
  • Divider: stroke/subtle, 0.5px, toggleable. Layout: paddingX 16, paddingY 12, gap 12.

Structural variants only. Leading and trailing content swaps via instance-swap properties, never new variants (D-010).

Chevron
Label textSupporting line text
Button
Label textSupporting line textButton
Switch
Label textSupporting line text
Radio
Label textSupporting line text
Checkmark
Label textSupporting line text
Badge
Label textSupporting line text3
Timestamp
Label textSupporting line text2:45 PM
Value
Label textSupporting line textValue
None
Label textSupporting line text
Icon (default)
Label textSupporting line text
Avatar
ABLabel textSupporting line text
No leading
Label textSupporting line text
Enabled
Label textSupporting line text
Disabled
Label textSupporting line text
Do
NotificationsSounds & vibration
One trailing element per row. The switch owns the action.
Don’t
NotificationsSounds & vibration3
Never stack badge + switch + chevron. The tap target becomes ambiguous.
  • Keep the Label to one line; let Supporting carry the detail. Both truncate, they never wrap to three lines.
  • Pick one trailing element per row. If you need two actions, the row is doing too much. Split it.

Leading icons and the chevron take brand/emphasis green; everything textual comes from the text roles. Never recolour a row locally. The badge uses feedback/error; a checkmark uses green. Don’t invent a new “selected” colour.

  • Rows are fluid: they fill their container width and the content slot flexes; leading and trailing stay fixed.
  • Auto-height: a row with an overline or a wrapped supporting line grows; align to Top when it does, otherwise Middle.
  • At the 360 × 667 floor the label and supporting text truncate with an ellipsis. They never push the trailing slot off-screen.
  • Label leads with the thing itself, Alex Rivera, Notifications: not a verb.
  • Supporting text is a detail, not a second sentence: Sounds & vibration, not “Here you can change sounds and vibration.”
  • Overline is a category in ≤ 2 words, uppercase, ACCOUNT, DEVICES.

The whole row is one touch target. A minimum of 48 dp tall even when the visible content is shorter. When the trailing slot is a switch or radio, the entire row toggles it, and the control carries the state (aria-checked), not colour alone. Disabled rows swap to text/disabled tokens rather than fading with opacity, so they survive high-contrast mode.

leading icon / chevron → brand/emphasislabel → text/primarysupporting / overline → text/secondarybadge → feedback/errordivider → stroke/subtle

Plus radius/lg on the list container and spacing 16 / 12 for padding and slot gap.