List item

List items are the primary row unit in Settld — they appear in expense lists, group member views, contact pickers, and activity feeds. Every list item has a press state. Three variants cover the full range of information density.

Variants



Simple is label only, with an optional trailing chevron for navigation. Use in settings lists, group pickers, and any list where secondary info isn't needed.

Detailed adds a leading icon and a description line below the label. Use for expense rows where category context and metadata (who added, when) are relevant.

Expense is the full variant — avatar, name, description, amount, and status badge. Use in the "balances" and "people" views where you need to show the financial relationship at a glance.

Density


DensityPaddingAvatarLabel sizeUse case
Default12px 16px36×36px15pxStandard list views, expense history
Comfortable16px40×40px16pxContact picker, member list — more breathing room

States





StateVisual changeTransition
DefaultTransparent background
HoverBackground shifts to --s-warm140ms ease-out
Pressedscale(0.97)140ms ease-out
Selected--teal-pale background, label shifts to --teal140ms ease-out
Disabled40% opacity, pointer-events off

On dark surfaces


On dark surfaces, text shifts to --dark-text and muted text to --dark-text-mute. Hover background is rgba(251,248,240,0.06). Selected uses a semi-transparent teal to avoid harsh contrast. Status badges are unchanged — they carry enough color to read on both surfaces.

Anatomy

A
Avatar
Aarav
Goa Airbnb · 12 May
Body (label + desc)
₹2,400 Settled
End (amount + badge)
PartElementNotes
Container<button> or <a>Use <button> for actions, <a> for navigation. Full-width, transparent background.
Leading slot.list-item-avatar or .list-item-iconAvatar: 36px circle with initial letter. Icon: 36px rounded rect for category symbols.
Body.list-item-bodyFlex-grows to fill space. Label truncates with ellipsis. Description is optional.
End.list-item-endRight-aligned column. Can hold amount, badge, or trailing chevron.

Usage

Do Use amount colors deliberately: .owed (coral) means "you owe them", .due (teal) means "they owe you". Keep the distinction consistent throughout the app.
Don't Don't show raw email addresses or phone numbers as description text. Use "owes you", "you owe", or a venue name — not technical identifiers.
Do Separate list items with the dashed divider. Use inset dividers when avatars are present. The dashed line preserves the khata visual language without adding visual weight.
Don't Don't use more than one badge per row. Don't put a badge and a trailing chevron on the same row — pick one.

Accessibility

Semantics Use <button> when tapping triggers an action (expand, select, open sheet). Use <a> when tapping navigates. Never use <div> — it has no keyboard or screen reader support.
Amount colors Coral and teal amounts convey meaning through color. Always include text that conveys the same meaning: "owes you ₹520" is complete; just "₹520" in red is not. Use aria-label on the amount span if the surrounding label doesn't make the direction clear.
Touch target Minimum 44×44px per WCAG. The default 12px vertical padding with a 36px avatar gives 60px height — well above the minimum. Don't reduce padding below 8px.

Code

HTML

<!-- Simple -->
<button class="list-item">
  <div class="list-item-body">
    <div class="list-item-label">Goa trip</div>
  </div>
  <span aria-hidden="true"></span>
</button>

<!-- Expense variant -->
<button class="list-item">
  <div class="list-item-avatar" style="background:var(--teal)">K</div>
  <div class="list-item-body">
    <div class="list-item-label">Kabir</div>
    <div class="list-item-desc">owes you</div>
  </div>
  <div class="list-item-end">
    <span class="list-item-amount due" aria-label="owes you ₹1,200">₹1,200</span>
    <span class="list-item-badge settled">Settled</span>
  </div>
</button>

CSS classes

ClassPurpose
.list-itemBase — flex row, press state, hover, border-radius
.list-item-avatar36px circle with initial letter
.list-item-icon36px rounded rect for category symbols
.list-item-bodyFlex-grow, min-width 0 for text truncation
.list-item-labelPrimary label — 15px/500, truncates
.list-item-descSecondary description — 13px/muted, truncates
.list-item-endRight-aligned column for amount and badge
.list-item-amountMono amount — 15px/600
.list-item-amount.owedCoral — you owe them
.list-item-amount.dueTeal — they owe you
.list-item-badgeBase pill badge
.list-item-badge.settledGreen pill
.list-item-badge.pendingAmber pill
.list-item-badge.overdueCoral pill
.list-item.selectedTeal-pale background, teal label

Design tokens used

TokenValueRole
--teal-pale#D6EAE2Selected background
--teal#0E7C66Selected label, "due" amount
--coral#E76F51"Owed" amount, overdue badge
--s-warm#F1E9D5Hover background
--ink-mute#8A8276Description text
--r-sm10pxItem border-radius
--d-fast140msHover / press transition