Radio

One choice from a visible set.

v1.0.0·Updated Jul 8, 2026 · 10:45
Live Demo — Fully Interactive
One of many — click to choose
Configuration
Size
State
Label
Pro plan
<Radio checked={v} onChange={setV} value="pro" size="m" label="Pro plan" />
Behavior — The Engineering Contract
Prop / eventTypeNotes
value (group)stringThe one selected value
onChange(next) => voidFires when a new option is chosen
Arrow keysMove selection within the group
size / disabledl·m·s / boolean22/18/15px
role="radiogroup"a11yOne tab stop; arrows navigate inside

Exactly one selected, always. If zero can be valid, or more than one, use Checkbox instead.

Anatomy
Pro plan
1RingCircle; border turns warm when selected.
2DotWarm centre that springs in on selection.
3LabelClickable; the whole row selects the option.
Do's and Don'ts
✓ Do
MonthlyAnnual

Use for two-to-five mutually exclusive options, all visible at once.

✕ Don't
Enable feature

Don't use a lone radio. A single on/off is a Checkbox or a Toggle.

✓ Do
StandardShips in 3–5 days

Add a description when options differ in ways the label can't hold.

✕ Don't
Option AOption BOption COption DOption EOption F

Don't stack a dozen radios. Past ~6 options, reach for a Dropdown.

In context: Examples
A · Plan picker
StarterProScale

Pricing tiers, one selected, all comparable at a glance.

B · Settings choice
LightDarkSystem

Appearance and other one-of-N preferences.

C · Inline row
YesNo

Two short options can sit inline on one line.

Measurements & Tokens
TokenValueRole
--rd-size-l/m/s22 / 18 / 15pxRing dimension
--rd-dot50%Dot as a fraction of the ring
--rd-border#33333AUnselected ring
--rd-on#FF7A00Selected ring & dot
--rd-easecubic-bezier(.34,1.56,.64,1)Dot spring, 0.16s
--rd-focusrgba(255,122,0,.35)3px focus ring
Code
<div role="radiogroup" aria-label="Plan">
  <label class="o-radio-row">
    <button class="o-radio o-radio--m is-on" role="radio" aria-checked="true"></button>
    <span>Pro</span>
  </label>
</div>