Radio
A Radio is a binary input that is usually combined in a group of two or more options. They signal a pattern where users can only select one of the available options. Radios are also known as “radio buttons”.
Guidelines
When to use radios
Radios must feature a descriptive label. They must be part of a radio group of at least two elements. A radio may also have sub-components or child radio groups.
Use the Radio component to make a single selection from a list of options where only one choice is allowed. When multiple selections are needed, use Checkbox instead.
Specifications
- Radio
Radio buttons make the selection visually distinct. - Label
The Radio must always contain a label, with the text size matching the base font size for consistency with the body text. Labels can include links and bold text and should be concise, clearly indicating the selected option. - Description (optional)
If additional information about the label is required, a description can be included. - Custom input (optional)
An additional input field can be included within the Radio to allow the user to input a custom response.
Component limitations
A group of radios should consist of at least 2 radios, with no maximum limit on the number of radios per group.
The Radio label will expand to fit longer text while the radio itself remains aligned with the first line of the label's text.
Refer to the Radio component in Codex Figma.
Types
Depending on the content type, the following types of Radios are available:
- With only label
By default, the Radio always includes a label that matches the base font size for consistency. - With description
In some cases, an optional description can be added below the label for additional information. - With custom input
In cases where additional user input is required, an optional custom input field can be added below the label or description.
The custom input within the Radio can include any of the following form components designed to gather user input, including:
- TextInput and TextArea
- Select
- Combobox
- ChipInput
- Lookup
- A combination of more than one input
Note: Groups of Checkboxes, Radios, and Toggle switches are not allowed within this custom input.
Interaction states
Radio buttons’ states were designed using accessible color variations. In addition to the 'disc' icon, these make it easier to differentiate between the radio button’s selected and unselected modes (e.g. disabled, hover, active):
- Default unselected
- Hover unselected
- Active unselected
- Focus unselected
- Disabled unselected
- Default selected
- Hover selected
- Active selected
- Focus selected
- Disabled selected
Accessibility note
The disabled state does not meet our minimum color contrast rules. WCAG 2.1 states that “…part[s] of an inactive user interface component […] have no contrast requirement”.[1]
Provide sufficient information in a disabled element's context, so the user can understand what is disabled and how to enable it (if applicable).
Best practices
Consider the following recommendations when using radios.
Label’s format
- Accompany the Radio with a label that matches the base font size.
- Include a description below the label to provide additional information.
- Use text formatting like bold and italic in the label.
- Include standalone links within the label to provide additional information regarding a specific option when necessary.
- Bold all Radio label.
- Link the entire Radio label as it could cause issues with the selection.
Inline radios
- Use inline radios, but reserve its use for specific cases to prevent disruptions in the reading flow.
- Use inline radios if there are too many radios per line.
- Use inline radios if there is significant variation in the length of the radios labels.
Custom input within the Radio
- Combine 2 different fields within the custom input if needed.
- Nest another group of radios, checkboxes, or toggle switches within the custom input.
- Display the custom input at the end of a Radio group whenever possible.
- Disable the custom input unless its corresponding Radio is selected.
- Design a layout where multiple Radios include custom inputs visible simultaneously.
- Enable the custom input when its corresponding Radio is not selected.
Content
A radio button ensure that a reader chooses only one option from a set of two or more. Keeping choices simple and mutually exclusive makes for concise, effective and trustworthy content.
- Keep the choices short and mutually exclusive. Concise, Clear & Trustworthy
- Make the options overly long or complicated. Concise, Clear & Trustworthy
Keyboard navigation
Key | Function |
---|---|
Tab | The focus is placed on the next interactive element in tab order. |
Shift + Tab | The focus is placed on the previous interactive element. |
Up arrow / Down arrow / Left arrow / Right arrow | When the focus is placed on a Radio within a group, the arrow keys move the focus between the different Radios and select them. |
References
Demos
Open up the browser console to see events emitted on input.
Configurable
Name | Value |
---|---|
Props | |
status | |
disabled | |
View | |
Reading direction |
Label and description
Always include label text via the default slot. You can also add description text via the #description
slot.
This demo uses the Field component—usage of this component is described in the next section.
Name | Value |
---|---|
View | |
Reading direction |
Form field
When used in a form, a group of Radios can be wrapped in the Field component to add features like a semantic label, description and help text, validation messages, and more. See the Field page for more information.
When building a Radio field, always set isFieldset
to true
to ensure proper accessibility support. This wraps the group in a <fieldset>
element and labels it with an associated <legend>
.
If using a Radio group outside of a form, follow the instructions in the next demo.
Radio group
For a group of radios, each Radio component's v-model
will be bound to the same ref, which is equal to the inputValue
prop of the selected Radio. Use the same name
prop for all of the Radio components in a group.
This demo shows what to do when using a Radio group outside of a form:
- Wrap the group in an element with
role="radiogroup"
- Connect the group with a label via the
aria-labelledby
attribute
Radio group value: radio-2
Inline radios
Use the inline
prop to get an inline layout.
With no initial selection
Radio group value:
With custom input
To add a custom input, use the custom-input
slot to pass in an input like TextInput, TextArea, Select, Combobox, ChipInput, Lookup, or a combination of more than one input.
In the example below, the custom input is always visible but remains disabled until its parent Radio component is selected. Inside the custom input <div>
, a Field wraps the TextInput to display its own validation message.
Vue usage
Typical use of this component will involve using v-for
to loop through an array of items and output a Radio component for each one. Each Radio will have the same v-model
binding and name
prop, but different inputValue
props and label content.
The v-model
value is the inputValue
of the Radio that is currently on.
Props
Prop name | Description | Type | Default |
---|---|---|---|
modelValue | Value of the currently selected radio. Provided by v-model binding in the parent component. | string|number|boolean | '' |
inputValue | HTML "value" attribute to assign to the input. Required for input groups. | string|number|boolean | false |
name (required) | HTML "name" attribute to assign to the input. | string | |
disabled | Whether the disabled attribute should be added to the input. | boolean | false |
inline | Whether the component should display inline. By default, display: block is set and a margin exists between sibling components, for a stacked layout. | boolean | false |
status | status attribute of the checkbox. | ValidationStatusType | 'default' |
Events
Event name | Properties | Description |
---|---|---|
update:modelValue | modelValue string|number|boolean - The new model value | Emitted when modelValue changes. |
Slots
Name | Description | Bindings |
---|---|---|
default | Label text. | |
description | Short description text. | |
custom-input | Custom input. |
CSS-only version
Markup structure
With description
To add a description below the label:
- Add a
<span>
after the<label>
element with an ID and classcdx-label__description
. Include the description text here. - Add an
aria-describedby
attribute to the<input>
element with the value of the ID of the description
Radio group
Native attributes of the <input>
element can be used. For example:
- Add the
checked
attribute to the<input>
element if it should be selected initially. - Add the
disabled
attribute to the<input>
element if it should be disabled.
Always include one of these two features for accessible grouping:
- If using the Radio group in a field, wrap the group in a
<fieldset>
element and add a<legend>
element with the group label. This method is demonstrated below and requires some style resets on<fieldset>
and<legend>
. You can use the CSS-only Field and Label components to reset browser styles of these elements. - If using the Radio group outside of a field, wrap the group in a
<div>
withrole="group"
andaria-labelledby
set to the ID of the group label. See an example of this above.
Inline radios
Add the cdx-radio--inline
class to the root element to get an inline layout.