List
An opt-in zebra wash tones alternating rows (even rows on-card @ 4%, odd rows plain)
on the list container: theme-following, default off, resting surface only (beneath
hairlines / selection / hover). Experimental: under evaluation, not canon.
Grouped card: sections carry structure, no inset hairlines
Zebra (experimental): opt-in alternating row tone
Full-bleed (plain): no card, edge-to-edge rules
Selectable · single · ↑/↓ to move, one cyan indicator
Selectable · multi · leading checkboxes
Sticky section header: scroll the region
Loading (skeleton) & empty affordance
Selected session r2 · 2 files checked · comfortable density. The container is live: change --color-divider and every hairline moves.
Parameters
Section titled “Parameters”This page documents the container that arranges rows; the individual row (leading mark, primary/secondary text, trailing slot, the selected-row look) is List item. The real divergences between the shipped platforms, tracked in the Review queue:
- No list wrapper anywhere: every platform hand-assembles the container. Compose configures a
raw
LazyColumnper identity, Voice wraps aLazyVStackin a card inline. AList/NockerlListwithvariant+selection+density(as the web API shows) is the open extraction item, so the container is consumed, not re-derived. - Sticky headers: the web demo and the SwiftUI-native
Listsupport sticky section headers, and Compose hasstickyHeader, but no shipped screen uses it yet; section headers currently scroll with their rows. Canonizing the sticky behavior is open. - Grouped-card vs full-bleed: Voice always uses the inset grouped card; Compose’s dense tree
(
TaskTreeList) is full-bleed with no card. Both are valid (Decision 4), so the container must expose the choice (variant: 'card' | 'plain') rather than bake one in. - List-level selection: the one selection expression is a cyan edge bounding the run,
cyan ink and a check, never a left stripe and never a wash. An earlier draft used a soft cyan
wash; design law 6 (state by outline, not fill) superseded that, and the web
container now carries the outline, drawing ONE edge around a contiguous run rather than a stack
of them. The web container owns selection (
listbox+ arrow keys / multi checkboxes); Compose (today a per-rowmodifierbackground) still fills and lags here; Voice toggles expansion and has no persistent selection.