Forms
Radio
Radio is a native radio button for a single option inside a mutually exclusive group.
Value (Unselected/Selected) × State — 8 variants
betaReact AvailableFigma AvailableDocs Partial
- React last updated
- 2026-07-13
- Documentation last updated
- 2026-06-01
- Accessibility target
- WCAG 2.2 AA (target)
- Version
- 0.2.0-beta
Known open questions
- Radio indicator remains circular in all shape personalities by design.
Live preview
Native radio inputs stay circular in every shape personality.
Standalone radios sharing a name
How should Radio buttons be grouped?
RadioGroup with disabled option
Group error
Validation at group level
Purpose
Single selection from a set of mutually exclusive options, all visible at once.
Anatomy
Radio = native input[type=radio] + inline label text.
Variants and states
unselected · selected · disabled · error
When to use
2–6 mutually exclusive options where seeing all choices simultaneously helps the decision.
When not to use
More than ~6 options (use Select). Multiple selections allowed (use Checkbox).
Accessibility
All Radios in one group must share the same name attribute and be wrapped in a fieldset/legend or role="radiogroup".
Keyboard behavior
Arrow keys move selection within a named group using native radio behavior.
Common mistakes
Forgetting the shared group label/legend.
Properties
Value × State as variants. Label (text).
Tokens used
semantic/surface/defaultsemantic/border/defaultsemantic/action/primarysemantic/focus-ring
Component API
| Prop | Type | Default | Description |
|---|---|---|---|
| label | string | — | Visible option label. |
| name | string | — | Shared group name — required for grouping. |
| value | string | — | Option value. |
| checked | boolean | — | Controlled selected state. |
| disabled | boolean | false | Native disabled state. |
React example
Copy React example
import { Radio } from "@/components/ui/Radio";
export function Example() {
return <Radio name="plan" value="pro" label="Pro" defaultChecked />;
}