List

Semantic typography prose list component supporting bulleted, numbered, alpha, and roman numeral markers.

// Plain markup
import { List, ListItem } from "@shavin/ui";

Bullet (default)

  • Focus trap and scroll lock come from Radix, not us.
  • Every primitive reads semantic tokens, never a raw hex.
  • Radius is tokenized by role — never a literal Tailwind radius class.
<List>
  <ListItem>Focus trap and scroll lock come from Radix, not us.</ListItem>
  <ListItem>Every primitive reads semantic tokens, never a raw hex.</ListItem>
  <ListItem>Radius is tokenized by role — never a literal Tailwind radius class.</ListItem>
</List>

Number

  1. Read design-system/AGENTS.md.
  2. Check whether Radix ships a primitive for the pattern.
  3. Add a playground page before frontend adopts it.
<List marker="number">
  <ListItem>Read design-system/AGENTS.md.</ListItem>
  <ListItem>Check whether Radix ships a primitive for the pattern.</ListItem>
  <ListItem>Add a playground page before frontend adopts it.</ListItem>
</List>

None (plain stack, no marker)

  • No bullet or number — just spaced rows.
  • Useful for a plain vertical stack of short lines.
<List marker="none">
  <ListItem>No bullet or number — just spaced rows.</ListItem>
  <ListItem>Useful for a plain vertical stack of short lines.</ListItem>
</List>

For comparison: CardList (bordered, clickable rows)

This is a CardList, not a Listsee /card
<CardList>
  <CardListItem className="cursor-pointer">
    <span className="flex-1">This is a CardList, not a List</span>
    <span className="text-sm text-fg-muted">see /card</span>
  </CardListItem>
</CardList>

Props

PropTypeDefault
as"ul" | "ol"
marker"bullet" | "marker" | "number" | "lower-roman" | "type" | "upper-roman" | "lower-alpha" | "upper-alpha" | "none""bullet"
Configure Theme
Theme
Accent Color
Custom
Gray Family
Appearance
Radius
Scaling
Panel Style
Heading Font
Body Font