Single-choice option list on Radix RadioGroup — all options visible.
Anatomy
◉ 0.5% ← Item (16px ring, brand dot when Recommended ← description (fg-muted, optional) ○ 1.0% ← unchecked ring (outline)
Each row is a ≥40px-tall label — the whole row is the hit area.
Props
| Prop | Type | Default | Notes | |
|---|---|---|---|---|
options | RadioOption<T>[] | — | { value, label, description?, disabled? }. | |
value | T | undefined` | — | Controlled. |
onValueChange | (value: T) => void | — | ||
disabled | boolean | — | Disables the whole group. | |
aria-label | string | — | Name the group when no visible label precedes it. | |
className | string | — | cn-merged onto the root. |
Motion
150ms on ring border-color; the dot appears without animation (selection
is instant feedback, not a transition).
A11y
Radix wiring: role="radiogroup", roving tabindex — Tab enters the
group once, ↑/↓/←/→ move selection. Rows are real <label>s so
clicking text selects. Always name the group (aria-label or a
preceding heading); descriptions are part of the label's text content.