List

Rows of media, a title, supporting text and independent actions, as a named list or one row on its own.

<tp-list>
List
Default density Compact density Restart from the initial state Show the copyable source
Maya Chen Owner Jonas Weber Manage Amara Okafor Resend

Usage

tp-list holds tp-list-item rows and tp-list-separator dividers. Both are layout only: there is no selection, activation or keyboard model of their own. Controls in the actions slot keep their own focus and behavior, so one row can hold several independent actions.

Content and actions

The default slot is the title and description adds supporting text; use the title and description slots when either needs markup. Empty regions collapse, so a title-only row needs nothing extra.

Content and actions
Default density Compact density Restart from the initial state Show the copyable source
Two-factor authentication On MacBook Pro Sign out Pro plan Downgrade Upgrade

Variants and sizes

variant is ghost, outline or subdued; size steps the density down through sm and xs for tight panels and menus.

Variants and sizes
Default density Compact density Restart from the initial state Show the copyable source
Release notes Release notes Release notes Release notes Release notes

Media

The media slot takes an Icon, Avatar or image. media-treatment tells the row what it holds, icon or image, so the media gets the matching extent. With a description, media aligns to the first line of text.

Media
Default density Compact density Restart from the initial state Show the copyable source
Q3 roadmap.md Brand assets Security alert Review

Lists and separators

tp-list carries the list role and its aria-label on the host, and its direct tp-list-item rows become list items. Name every list. Put tp-list-separator between rows for a divided list. A single tp-list-item also works on its own, outside a list, as in the examples above. A row that leaves the list, or a list that leaves the page, releases only the roles the list set; authored roles are preserved, and a standalone tp-list-item has no list item role. Ordinary tp-separator children are also supported; the list registers their presentation as list-separator, while their rendering contract remains on the Separator component.

Divided list
Default density Compact density Restart from the initial state Show the copyable source
Email Push Weekly digest

header and footer span the full row above and below the main content, for an eyebrow label or metadata.

Header and footer
Default density Compact density Restart from the initial state Show the copyable source
Marketing site Website refresh Open Updated · 6 contributors

Header media works too: a square Aspect ratio image in header turns each row into a card. Lay the list out as a grid through the list part’s partPresentation.

Card grid
Default density Compact density Restart from the initial state Show the copyable source
Open studio Quiet floor Roof terrace

A whole row can be a native link: give the list-item part a renderDelegate that renders an a around the supplied bind and content. Controls in actions render beside the link, so they stay separate tab stops; decorative icons there let clicks reach the link. Put independent controls in actions (or trailing), not in the title, description, media, header or footer of an interactive Root. Native Tab order reaches Root before its actions; activating an action does not activate Root.

Link rows
Default density Compact density Restart from the initial state Show the copyable source
Getting started guide Billing questions Contact sales System status

Custom content layout

Each part’s renderDelegate can also wrap its content, for example to add a trailing duration column to the list-item-content part. With media-treatment="image", an img in media gets a square thumbnail.

Recordings
Default density Compact density Restart from the initial state Show the copyable source
Designing for density · Day 1 Accessible data tables · Day 1 Motion with restraint · Day 2

In a menu

For a rich command, put a List item directly inside a Menu item. The Menu item keeps the command semantics, keyboard navigation and highlight, and the row drops its own padding. Do not add a second link or button inside that row.

People picker
Default density Compact density Restart from the initial state Show the copyable source
Assign to… Maya Patel Jordan Lee Ana Ruiz

People and invitations

People and invitations
Default density Compact density Restart from the initial state Show the copyable source
Ravi CastellanoLast seen Project teamInvite Mara Voss Theo Lindqvist Ines Okafor

API Reference

Every element also accepts motion-policy.

Attributes

AttributePropertyTypeDefaultDescriptionaria-labelariaLabelstring | nullnullThe name of the list, which assistive technology reads before its rows.

Slots

SlotDescriptiondefaultThe List items, with List separators between them where rows need a divider.

CSS parts

PartDescription::part(list)The stack holding the rows.::part(list-separator)The divider between rows.

<tp-list-item>

Attributes

AttributePropertyTypeDefaultDescriptionselectedselectedbooleanfalseMarks the row as the current one with aria-current; the List keeps no selection of its own.valuevaluestring''An identity for the application's own use; it changes nothing in the row.descriptiondescriptionstring''Supporting text under the title, when the description slot is empty.variantvariant'ghost' | 'outline' | 'subdued''ghost'Visual treatment only: outline draws a boundary and subdued fills the row.sizesize'xs' | 'sm' | 'default''default'The row density; sm and xs suit tight panels and menus.media-treatmentmediaTreatment'plain' | 'icon' | 'image''plain'What the media slot holds, so it gets the matching extent: icon for an Icon, image for a square thumbnail.

Slots

SlotDescriptiondefaultThe title.titleA title with markup; it replaces the default slot.descriptionSupporting text with markup; it replaces description.mediaAn Icon, an Avatar or an image before the text.leadingThe former name of media, used when media is empty.actionsControls at the end of the row, each with its own focus and behavior.trailingThe former name of actions, used when actions is empty.headerFull-width content above the row, such as an eyebrow label or an image.footerFull-width content below the row, such as metadata.

CSS parts

PartDescription::part(list-item)The row: the native host a link or button delegate replaces, and the host of the variant appearance.::part(list-item-actions)The wrapper of the actions slot, beside the row so its controls stay separate tab stops.::part(list-item-content)The column holding the title and the description.::part(list-item-description)The wrapper of the description, in muted text.::part(list-item-title)The wrapper of the title.

<tp-list-separator>

CSS parts

PartDescription::part(list-separator)The divider between rows.

Components, widgets and patterns that use this one.