Radio
Single-selection group with full keyboard navigation and roving tabindex.
At a glance
<Radio.Group>owns the selected value (controlled viavalue+onChange, or uncontrolled viadefaultValue).<Radio>declares a single option — it must be rendered inside a<Radio.Group>or you'll get a runtime error explaining why.- Keyboard nav follows the WAI-ARIA radiogroup pattern: arrow keys move between options (selection follows focus),
Home/Endjump to first / last, wrap-around at the edges. - Roving tabindex: tabbing into the group lands on the selected option; only one option participates in the tab order at a time.
Preview
<Radio.Group> value and defaultValue
Controlled vs. uncontrolled selection. The Group fires onChange(next)
whenever the user moves through the options.
<Radio.Group> disabled
Disables every option in the group. Individual options can also opt
out with their own disabled.
<Radio> label
Renders a clickable label next to the dot. Pressing the label is the
same target as pressing the dot. For richer label content (a price
tag, helper text), pass children instead — the children slot
replaces the auto-rendered label.
<Radio> disabled
Greys an individual option out and skips it during arrow-key navigation.
Naming the group
Always name the group via aria-label, aria-labelledby, or a visible
heading wrapped in aria-labelledby. An un-named radiogroup is hard
for assistive tech to announce as a unit.
Grouped with Field.Group
For label + description + error around a radio set, use <Field.Group>:
See Field for the full API.
Props
<Radio.Group>
| Prop | Type | Default | Description |
|---|---|---|---|
accessibilityDescribedBy | string | — | React Native equivalent of `aria-describedby`. Injected by Field.Control. |
accessibilityLabelledBy | string | — | React Native equivalent of `aria-labelledby`. Injected by Field.Control. |
aria-describedby | string | — | Points to description / error elements. Injected by Field.Control. |
aria-invalid | boolean | — | Marks the group as invalid. Injected by Field.Control when Field has an error. |
aria-labelledby | string | — | Points to the element that labels this group. Injected by Field.Control. |
aria-required | boolean | — | Marks the group as required. Injected by Field.Control when Field is required. |
className | string | — | — |
defaultValue | string | — | Uncontrolled initial value. |
disabled | boolean | false | When true, every Radio inside is non-interactive. Individual Radios can also opt in. |
id | string | — | HTML id forwarded to the radiogroup container. Injected by Field.Control. |
name | string | — | HTML `name` for form integration on web. Optional but recommended. |
nativeID | string | — | React Native equivalent of `id`. Injected by Field.Control. |
onChange | (next: string) => void | — | Fires with the new value when the selection changes. |
orientation | enum | vertical | Layout orientation. Drives the keyboard nav axis (Down/Up for vertical, Right/Left for horizontal — both pairs work in either orientation as a usability bonus). @defaultValue 'vertical' |
testID | string | — | — |
value | string | — | Controlled selected value. |
<Radio>
| Prop | Type | Default | Description |
|---|---|---|---|
value* | string | — | Unique value within the group. Required. |
children | ReactNode | — | Custom content rendered next to the radio dot. Overrides `label`. |
className | string | — | — |
disabled | boolean | false | Disable just this option. |
label | string | — | Visible label that doubles as the accessibility label. |
testID | string | — | — |