List
One row family for phone screens: thumbnail rows, settings rows and navigation cards.
variant="cards"
variant="grouped"
- Plan and billing
- App icon
- Your DetailsUsername, photo and what Athic knows about you
- Remind me dailyOne notification a day; tapping it opens Today.
Used for the Bible and the Mass readings. Bible search covers the Douay-Rheims only.
Default
Just added (highlight, pinned)
Selected (open item)
Busy (deleting)
- Why do Catholics confess to a priest?2 hours ago
Long title wraps
Skeleton
Disabled
- Explain todayΓÇÖs Gospel3 days ago
Trailing: chevron
Trailing: Switch, loading
- Remind me dailyTurning on…
Trailing: value
- Time8:00 AM
- LanguageEnglish
Leading icon tile (nav card)
Empty
No discussions yet
Ask a question and it will appear here.
Card rows from --rebar-list-* properties, custom moreIcon
- Why do Catholics confess to a priest?2 hours ago
Compact rows on a dark scope (--rebar-list-item-background, -selected-background)
- Why do Catholics confess to a priest?2 hours ago
- Is it a sin to miss Mass when I am sick, or when I am up all night caring for a newborn?Yesterday
In context
Ask
- Is Mary really sinless? Where is that in Scripture?NewJust now
- Why do Catholics confess to a priest?2 hours ago
Your Profile
Account
Bible translation
- ●
- ○
Used for the Bible and the Mass readings.
Library
Your collection
Loading
List props
| Prop | Type | Required | Default |
|---|---|---|---|
variant | ListVariant | undefined | No | cards |
empty | ReactNode | No | — |
loading | boolean | undefined | No | — |
ListItem props
| Prop | Type | Required | Default |
|---|---|---|---|
title | ReactNode | Yes | — |
titleStyle | "serif" | "sans" | undefined | No | — |
description | ReactNode | No | — |
meta | ReactNode | No | — |
media | ReactNode | No | — |
leading | ReactNode | { icon: ReactNode; tone?: 1 | 2 | 3 | 4 | undefined; } | No | — |
leadingControl | ReactNode | No | — |
editing | boolean | undefined | No | — |
onEdit | (() => void) | undefined | No | — |
renderEditor | (() => ReactNode) | undefined | No | — |
trailing | ReactNode | No | — |
onMore | (() => void) | undefined | No | — |
moreLabel | string | undefined | No | More actions |
moreIcon | ReactNode | No | — |
href | string | undefined | No | — |
target | string | undefined | No | — |
renderLink | RenderLink | undefined | No | — |
onClick | ((event: MouseEvent<HTMLElement, MouseEvent>) => void) | undefined | No | — |
selected | boolean | undefined | No | — |
highlight | boolean | "new" | undefined | No | — |
highlightPinned | boolean | undefined | No | — |
onHighlightEnd | (() => void) | undefined | No | — |
loading | boolean | undefined | No | — |
skeleton | boolean | undefined | No | — |
disabled | boolean | undefined | No | — |
ListSection props
| Prop | Type | Required | Default |
|---|---|---|---|
title | ReactNode | No | — |
footer | ReactNode | No | — |
gap | string | number | undefined | No | — |
Accessibility
A real <ul> of <li> rows. The media and text area of a row is the one link or button (href or onClick); trailing controls sit beside it, never inside, so a Switch or a menu button is never nested in an interactive element and never triggers the row. selected sets aria-current; loading sets aria-busy and a labelled spinner; skeleton rows are aria-hidden; a disabled row has no focusable control. A ListSection is a labelled region named by its eyebrow.
data-rebar-* attributes
data-rebar-component="list" | "list-item" | "list-section", data-rebar-variant on the list and its rows, data-rebar-title-style, data-rebar-selected, data-rebar-highlight, data-rebar-state="loading" | "skeleton" | "disabled"; parts main, media, leading, body, title, description, meta, chip, chevron, trailing.
Leading control, inline edit and section spacing
leadingControl puts an independent control (a round check button) before the main area, beside the row link or button and never inside it, so pressing it does not trigger the row. For inline renaming set editing with a renderEditor that returns an Input: the title is replaced by the editor and the main area becomes a plain element, so the row semantics stay valid (onEdit fires on F2 or a double-click of the title; the app owns the value and commits on Enter or blur). Consecutive ListSections are spaced by --rebar-list-section-gap (24px), or a section's gap prop.
<ListItem title={task.title} leadingControl={<CheckButton aria-label="Done" />} editing={editingId === task.id} onEdit={() => setEditingId(task.id)} renderEditor={() => <Input aria-label="Rename" defaultValue={task.title} onBlur={commit} />} />