Skip to content

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”.

NameValue
Props
status
disabled
Slots
default
description
View
Reading direction

Overview

When to use Radio

Radio 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.

About Radio

Radio includes the following elements.

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.

  • Keep the choices short and mutually exclusive. Concise, Clear & Trustworthy

  • Use text formatting like bold and italic sparingly in the label.
  • Include standalone links within the label to provide additional information regarding a specific option when necessary.
  • Avoid linking the entire label as it could cause issues with the selection.

Description (optional)

If additional information about the label is required, a description can be included.

Examples

Label and description

Radios must always have a label and can also feature a description.

Search completion
Corrects up to two typos. Removes redirects that are very similar to the main title.
No typo correction. No accent folding. Strict matching.

Developer notes

This demo uses the Field component—usage of this component is described in the next section. Always include label text via the default slot. You can also add description text via the #description slot.

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. Visit the Field page for more information.

If using a Radio group outside of a form, follow the instructions in the next demo.

Notifications Choose how often you'd like to receive notifications

Developer notes

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>.

Radio group

Radios must be used in multiples.

Developer notes

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:

  1. Wrap the group in an element with role="radiogroup"
  2. Connect the group with a label via the aria-labelledby attribute

Inline Radios

Radios can be horizontally stacked if needed in some specific cases. However, the recommendation is to vertically stack them to keep consistency across forms.

  • Use inline Radios, but reserve its use for specific cases to prevent disruptions in the reading flow.
  • Avoid using inline Radios if there are too many radios per line.
  • Avoid using inline Radios if there is significant variation in the length of the radio labels.
Inline Radio group demo

Developer notes

Use the inline prop to get an inline layout.

With no initial selection

With custom input

An additional input field can be included within the Radio to allow the user to input a custom response. 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
  • 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.
Expiration When do you want the block to expire?

Developer notes

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.

Technical implementation

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 nameDescriptionTypeDefault
modelValueValue of the currently selected radio.

Provided by v-model binding in the parent component.
string|number|boolean''
inputValueHTML "value" attribute to assign to the input.

Required for input groups.
string|number|booleanfalse
name(required)HTML "name" attribute to assign to the input.string
disabledWhether the disabled attribute should be added to the input.booleanfalse
inlineWhether the component should display inline.

By default, display: block is set and a margin exists between sibling components, for a stacked layout.
booleanfalse
statusValidation status of the Radio.ValidationStatusType'default'

Events

Event namePropertiesDescription
update:modelValuemodelValue string|number|boolean - The new model valueEmitted when modelValue changes.

Slots

NameDescriptionBindings
defaultLabel text.
descriptionShort description text.
custom-inputCustom 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 class cdx-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
Search completion
Corrects up to two typos. Removes redirects that are very similar to the main title.
No typo correction. No accent folding. Strict matching.

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:

  1. 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.
  2. If using the Radio group outside of a field, wrap the group in a <div> with role="group" and aria-labelledby set to the ID of the group label. Check an example of this above.
CSS-only Radio group demo

Inline Radios

Add the cdx-radio--inline class to the root element to get an inline layout.

CSS-only inline Radio demo

With custom input

To add a custom input, add a <div> element with the cdx-radio__custom-input class inside a Radio. Inside the custom input, add an input like TextInput, TextArea, Select, Combobox, ChipInput, Lookup, or a combination of more than one input.

CSS-only Radio custom input demo

Keyboard navigation

KeyFunction
TabThe focus is placed on the next interactive element in tab order.
Shift + TabThe focus is placed on the previous interactive element.
Up arrow / Down arrow / Left arrow / Right arrowWhen the focus is placed on a Radio within a group, the arrow keys move the focus between the different Radios and select them.