<ChoiceList>
A ChoiceList
component can be used to render a radio button group, or checkbox group. Use the type
prop to specify the type of field to display.
Checkbox
Code snippet
Radio
Code snippet
ChoiceList Props
Name | Type | Default | Description |
---|---|---|---|
choices required | ChoiceProps[] | Array of | |
className | string | Additional classes to be added to the root element. | |
disabled | boolean | Disables the entire field. | |
errorMessage | React.ReactNode | ||
errorMessageClassName | string | Additional classes to be added to the error message | |
errorPlacement | 'top' | 'bottom' | Location of the error message relative to the field input | |
hint | React.ReactNode | Additional hint text to display | |
requirementLabel | React.ReactNode | Text showing the requirement ("Required", "Optional", etc.). See Required and Optional Fields. | |
inversed | boolean | Applies the "inverse" UI theme | |
label required | React.ReactNode | Label for the field | |
labelClassName | string | Additional classes to be added to the | |
name required | string | The field's | |
onBlur | (...args: any[]) => any | Called anytime any choice is blurred | |
onComponentBlur | (...args: any[]) => any | Called when any choice is blurred and the focus does not land on one of the other choices inside this component (i.e., when the whole component loses focus) | |
onChange | (...args: any[]) => any | ||
size | literal | Sets the size of the checkbox or radio button | |
type required | 'checkbox' | 'radio' | Sets the type to render |
<Choice>
A Choice
component can be used to render a checkbox or radio button.
Any undocumented props that you pass to this component will be passed to the input
element, so you can use this to set additional attributes if necessary.
Code snippet
Choice Props
Name | Type | Default | Description |
---|---|---|---|
checked | boolean | Sets the input's | |
checkedChildren | React.ReactNode | Content to be shown when the choice is checked. See Checked children and the expose within pattern on the Guidance tab for detailed instructions. | |
uncheckedChildren | React.ReactNode | Content to be shown when the choice is not checked | |
className | string | Additional classes to be added to the root | |
inputClassName | string | Additional classes to be added to the | |
label | React.ReactNode | Label text or HTML. | |
labelClassName | string | Additional classes to be added to the | |
defaultChecked | boolean | Sets the initial | |
disabled | boolean | ||
inputRef | (...args: any[]) => any | Access a reference to the | |
hint | React.ReactNode | Additional hint text to display below the choice's label | |
id | string | A unique ID to be used for the input field, as well as the label's
| |
requirementLabel | React.ReactNode | Text showing the requirement ("Required", "Optional", etc.). See Required and Optional Fields. | |
inversed | boolean | Applies the "inverse" UI theme | |
size | literal | ||
name required | string | The | |
onBlur | (...args: any[]) => any | ||
onChange | (event: React.ChangeEvent<HTMLInputElement>) => any | ||
type required | 'checkbox' | 'radio' | Sets the type to render | |
value required | number | string | The |
Guidance
When to use
Checkboxes
- When a user can select any number of choices from a set list.
- When a user needs to choose “yes” or “no” on only one option (use a stand-alone checkbox). For example, to toggle a setting on or off.
- When users need to see all the available options at a glance.
- When users should be able to select zero of the options.
Radio buttons
- When users need to select only one option out of a set of mutually exclusive choices.
When to consider alternatives
- If there are too many options to display on a mobile screen. Consider a
dropdown
menu if you don’t have enough space to list out all available options, and if the user can only select one of the options. - Never use radio buttons for optional questions, since once a radio button is selected from a list, it or another choice will remain selected.
Usage
- Don't rely on the visual difference between radio buttons and checkboxes. Make it clear with words when users can select one or multiple options.
- Users should be able to tap on or click on either the text label or the checkbox to select or deselect an option.
- In general, list choices vertically; horizontal listings can make it difficult to tell which label pertains to which choice. An exception is where you have binary choices with short labels, like 'Yes / No'. The convention here is for horizontal alignment.
- Avoid using negative language in labels as they can be counterintuitive. For example, “I want to receive a promotional email” instead of “I don’t want to receive promotional email.”
- Use caution if you decide to set a default value. Setting a default value can discourage users from making conscious decisions, seem pushy, or alienate users who don’t fit into your assumptions. In addition, you'll never know if the user explicitly chose that option or just didn't notice the question. If you're unsure, leave nothing selected by default.
View the "Forms" guidelines for additional guidance and best practices.
Checked children and the expose within pattern
- The
<Choice>
component includes acheckedChildren
prop that can expose hidden text information or form elements. This expose within pattern is especially useful if you need to collect data from follow up questions or give just-in-time feedback. - Checked children can be exposed by checking the parent checkbox or radio button
- The
checkedChildren
prop should return one or more items wrapped in adiv
with the following className:.ds-c-choice__checkedChild
. This class sets the spacing and border color for the exposed elements. - Add the className
.ds-c-choice__checkedChild--inverse
to thediv
to show the inverse white border - You may need to add the className
.ds-u-margin--0
to your child element(s) to avoid extra top margin - If you opt for smaller radio buttons or checkboxes, add className
.ds-c-choice__checkedChild--small
to your checked child container
Accessibility
- Surround a related set of choices with a
<fieldset>
. The<legend>
provides context for the grouping. Do not usefieldset
andlegend
for a single checkbox. - Some screen readers read the
legend
text for eachfieldset
, so it should be brief and descriptive. - Each input should have a semantic
id
attribute, and its correspondinglabel
should have the same value in itsfor
attribute. - The custom checkboxes and radio buttons here are accessible to screen readers because the default fields are moved off-screen.
checkedChildren
will be announced to screen readers when they are exposed. They have been tested with the following devices:- Windows 10 + Internet Explorer 11 + JAWS screen reader
- Windows 10 + Chrome + JAWS
- Windows10 - Firefox + NVDA
- NVDA reads out the
<select>
label and every<option>
value
- NVDA reads out the
- MacOS Mojave + Safari + VoiceOver
Customization
The following Sass variables can be overridden to customize choice fields: