Skip to main content

What it is

A control for choosing exactly one option from a small, fully visible set of mutually exclusive choices. Selecting one Radio in a group always deselects whichever was previously selected — the group holds exactly one truth at a time, which is what separates it from Checkbox.

Live example

Exports

Vocabulary

Radio’s own property naming is internally consistent, unlike Checkbox’s. Both the bare Radio component and the Radio + Label composite use Selected=true/false in the Figma library — no split between a Checked atom and a Selected composite the way Checkbox has.

Choose Radio when

  • The set of options is small — roughly five or fewer — and showing every option helps the reader compare them directly, the same threshold Select draws the opposite fork at.
  • Exactly one option must be true.

Choose something else when

Anatomy

Variants, sizes, and states

Confirmed from the Figma library, not source. Selected=true/false × State=Default/ Hover/Disabled/Focused — 8 combinations, on both the bare control and the Radio + Label composite.

Edge and failure states

Tokens

Composition

Pairs with a control label immediately trailing it (LTR) — see FieldLabel’s control-label vocabulary. A group of Radios is exposed as a set with its own group name, distinct from any individual option’s label — see TITAN-RADIO-02.
A Radio group is a real, decided container, not an ad hoc wrapper. The form-input-radio-group-offset token (-0.5rem) applies specifically to a group’s container, trimming the group’s outer edge so an individual Radio’s own padding doesn’t push the group past a sibling field’s edge. A token existing for this implies the group wrapper is a modeled part of the system, not just a convenient <div>.
For a complete field rather than the bare control, compose through Form’s FormInput with type="radio" — it also auto-selects the first option when no value is given. Unlike Input, Select, and Checkbox, source publishes no named anti-pattern story calling out a hand-assembled RadioGroup specifically; the same composition guidance applies, but with that one difference in evidence — see Open issues.

Content

Accessibility

  • Renders native <input type="radio"> elements sharing one name, which is what makes them mutually exclusive at the platform level.
  • The group is announced as a set (a fieldset with a legend, or the equivalent grouping role) with its own accessible name, separate from any individual option’s label.
What this component does not handle: deciding whether a selection is required — that belongs to Form validation.

Constraints

Known issues

Radio: open issues

Divergences, open decisions, and undocumented gaps for Radio.

Why it works this way

Exclusivity is the entire point of Radio, and the group container being a real, tokened part of the system (not an assumed wrapper) is what lets that exclusivity extend to layout — a group renders as one visual unit with one edge, not a loose row of independently-positioned circles that happen to share a name attribute. A single-option group is disallowed because a choice with one answer isn’t a choice; if an option set can shrink to one at runtime, the composition needs to decide what replaces the Radio group at that point rather than rendering a Radio group that offers nothing to decide.

Status

  • FieldLabel — the control-label pairing every Radio uses
  • Checkbox — the independent-choice counterpart
  • Select — the collapsed alternative once the option count grows
  • Form validation — decides whether a selection is required
Last modified on September 7, 2026