Radio Group
<sl-radio-group> | SlRadioGroup
Radio groups are used to group multiple radios or radio buttons so they function as a single form control.
Examples
Basic Radio Group
<sl-radio-group label="Select an option" name="a" value="1"> <sl-radio value="1">Option 1</sl-radio> <sl-radio value="2">Option 2</sl-radio> <sl-radio value="3">Option 3</sl-radio> </sl-radio-group>
sl-radio-group label="Select an option" name="a" value="1" sl-radio value="1" Option 1 sl-radio value="2" Option 2 sl-radio value="3" Option 3
import SlRadio from '@teamshares/shoelace/dist/react/radio'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => ( <SlRadioGroup label="Select an option" name="a" value="1"> <SlRadio value="1">Option 1</SlRadio> <SlRadio value="2">Option 2</SlRadio> <SlRadio value="3">Option 3</SlRadio> </SlRadioGroup> );
Help Text
Add descriptive help text to a radio group with the help-text
attribute. For help texts that
contain HTML, use the help-text
slot instead.
<sl-radio-group label="Select an option" help-text="Choose the most appropriate option." name="a" value="1"> <sl-radio value="1">Option 1</sl-radio> <sl-radio value="2">Option 2</sl-radio> <sl-radio value="3">Option 3</sl-radio> </sl-radio-group>
sl-radio-group label="Select an option" help-text="Choose the most appropriate option." name="a" value="1" sl-radio value="1" Option 1 sl-radio value="2" Option 2 sl-radio value="3" Option 3
import SlRadio from '@teamshares/shoelace/dist/react/radio'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => ( <SlRadioGroup label="Select an option" help-text="Choose the most appropriate option." name="a" value="1"> <SlRadio value="1">Option 1</SlRadio> <SlRadio value="2">Option 2</SlRadio> <SlRadio value="3">Option 3</SlRadio> </SlRadioGroup> );
Radio Buttons
Radio buttons offer an alternate way to display radio controls. In this case, an internal button group is used to group the buttons into a single, cohesive control.
<sl-radio-group label="Select an option" help-text="Select an option that makes you proud." name="a" value="1"> <sl-radio-button value="1">Option 1</sl-radio-button> <sl-radio-button value="2">Option 2</sl-radio-button> <sl-radio-button value="3">Option 3</sl-radio-button> </sl-radio-group>
sl-radio-group label="Select an option" help-text="Select an option that makes you proud." name="a" value="1" sl-radio-button value="1" Option 1 sl-radio-button value="2" Option 2 sl-radio-button value="3" Option 3
import SlRadioButton from '@teamshares/shoelace/dist/react/radio-button'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => ( <SlRadioGroup label="Select an option" name="a" value="1"> <SlRadioButton value="1">Option 1</SlRadioButton> <SlRadioButton value="2">Option 2</SlRadioButton> <SlRadioButton value="3">Option 3</SlRadioButton> </SlRadioGroup> );
Disabling Options
Radios and radio buttons can be disabled by adding the disabled
attribute to the respective
options inside the radio group.
<sl-radio-group label="Select an option" name="a" value="1"> <sl-radio value="1">Option 1</sl-radio> <sl-radio value="2" disabled>Option 2</sl-radio> <sl-radio value="3">Option 3</sl-radio> </sl-radio-group>
sl-radio-group label="Select an option" name="a" value="1" sl-radio value="1" Option 1 sl-radio value="2" disabled="true" Option 2 sl-radio value="3" Option 3
import SlRadio from '@teamshares/shoelace/dist/react/radio'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => ( <SlRadioGroup label="Select an option" name="a" value="1"> <SlRadio value="1">Option 1</SlRadio> <SlRadio value="2" disabled> Option 2 </SlRadio> <SlRadio value="3">Option 3</SlRadio> </SlRadioGroup> );
Sizing Options
The size of Radios and
Radio Buttons will be determined by the Radio Group’s
size
attribute.
<sl-radio-group label="Select an option" size="medium" value="medium" class="radio-group-size"> <sl-radio value="small">Small</sl-radio> <sl-radio value="medium">Medium</sl-radio> <sl-radio value="large">Large</sl-radio> </sl-radio-group> <script> const radioGroup = document.querySelector('.radio-group-size'); radioGroup.addEventListener('sl-change', () => { radioGroup.size = radioGroup.value; }); </script>
sl-radio-group.radio-group-size[label="Select an option" size="medium" value="medium"] sl-radio[value="small"] | Small sl-radio[value="medium"] | Medium sl-radio[value="large"] | Large javascript const radioGroup = document.querySelector('.radio-group-size'); radioGroup.addEventListener('sl-change', () => { radioGroup.size = radioGroup.value; });
import { useState } from 'react'; import SlRadio from '@teamshares/shoelace/dist/react/radio'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => { const [size, setSize] = useState('medium'); return ( <> <SlRadioGroup label="Select an option" size={size} value={size} class="radio-group-size" onSlChange={event => setSize(event.target.value)} > <SlRadio value="small">Small</SlRadio> <SlRadio value="medium">Medium</SlRadio> <SlRadio value="large">Large</SlRadio> </SlRadioGroup> </> ); };
Radios and Radio Buttons also have
a size
attribute. This can be useful in certain compositions, but it will be ignored when
used inside of a Radio Group.
Validation
Setting the required
attribute to make selecting an option mandatory. If a value has not been
selected, it will prevent the form from submitting and display an error message.
<form class="validation"> <sl-radio-group label="Select an option" name="a" required> <sl-radio value="1">Option 1</sl-radio> <sl-radio value="2">Option 2</sl-radio> <sl-radio value="3">Option 3</sl-radio> </sl-radio-group> <br /> <sl-button type="submit" variant="primary">Submit</sl-button> </form> <script> const form = document.querySelector('.validation'); // Handle form submit form.addEventListener('submit', event => { event.preventDefault(); alert('All fields are valid!'); }); </script>
form.validation sl-radio-group label="Select an option" name="a" required="true" sl-radio value="1" Option 1 sl-radio value="2" Option 2 sl-radio value="3" Option 3 br sl-button type="submit" variant="primary" Submit javascript: const form = document.querySelector(.validation); // Handle form submit form.addEventListener(submit, event => { event.preventDefault(); alert(All fields are valid!); });
import SlButton from '@teamshares/shoelace/dist/react/button'; import SlIcon from '@teamshares/shoelace/dist/react/icon'; import SlRadio from '@teamshares/shoelace/dist/react/radio'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => { function handleSubmit(event) { event.preventDefault(); alert('All fields are valid!'); } return ( <form class="custom-validity" onSubmit={handleSubmit}> <SlRadioGroup label="Select an option" name="a" required onSlChange={handleChange}> <SlRadio value="1"> Option 1 </SlRadio> <SlRadiovalue="2"> Option 2 </SlRadio> <SlRadio value="3"> Option 3 </SlRadio> </SlRadioGroup> <br /> <SlButton type="submit" variant="primary"> Submit </SlButton> </form> ); };
Custom Validity
Use the setCustomValidity()
method to set a custom validation message. This will prevent the
form from submitting and make the browser display the error message you provide. To clear the error, call
this function with an empty string.
<form class="custom-validity"> <sl-radio-group label="Select an option" name="a" value="1"> <sl-radio value="1">Not me</sl-radio> <sl-radio value="2">Me neither</sl-radio> <sl-radio value="3">Choose me</sl-radio> </sl-radio-group> <br /> <sl-button type="submit" variant="primary">Submit</sl-button> </form> <script> const form = document.querySelector('.custom-validity'); const radioGroup = form.querySelector('sl-radio-group'); const errorMessage = 'You must choose the last option'; // Set initial validity as soon as the element is defined customElements.whenDefined('sl-radio').then(() => { radioGroup.setCustomValidity(errorMessage); }); // Update validity when a selection is made form.addEventListener('sl-change', () => { const isValid = radioGroup.value === '3'; radioGroup.setCustomValidity(isValid ? '' : errorMessage); }); // Handle form submit form.addEventListener('submit', event => { event.preventDefault(); alert('All fields are valid!'); }); </script>
form.custom-validity sl-radio-group label="Select an option" name="a" value="1" sl-radio value="1" Not me sl-radio value="2" Me neither sl-radio value="3" Choose me br sl-button type="submit" variant="primary" Submit javascript: const form = document.querySelector(.custom-validity); const radioGroup = form.querySelector(sl-radio-group); const errorMessage = You must choose the last option; // Set initial validity as soon as the element is defined customElements.whenDefined(sl-radio-group).then(() => { radioGroup.setCustomValidity(errorMessage); }); // Update validity when a selection is made form.addEventListener(sl-change, () => { const isValid = radioGroup.value === 3; radioGroup.setCustomValidity(isValid ? : errorMessage); }); // Handle form submit form.addEventListener(submit, event => { event.preventDefault(); alert(All fields are valid!); });
import { useEffect, useRef } from 'react'; import SlButton from '@teamshares/shoelace/dist/react/button'; import SlIcon from '@teamshares/shoelace/dist/react/icon'; import SlRadio from '@teamshares/shoelace/dist/react/radio'; import SlRadioGroup from '@teamshares/shoelace/dist/react/radio-group'; const App = () => { const radioGroup = useRef(null); const errorMessage = 'You must choose this option'; function handleChange() { radioGroup.current.setCustomValidity(radioGroup.current.value === '3' ? '' : errorMessage); } function handleSubmit(event) { event.preventDefault(); alert('All fields are valid!'); } useEffect(() => { radio.current.setCustomValidity(errorMessage); }, []); return ( <form class="custom-validity" onSubmit={handleSubmit}> <SlRadioGroup ref={radioGroup} label="Select an option" name="a" value="1" onSlChange={handleChange}> <SlRadio value="1">Not me</SlRadio> <SlRadio value="2">Me neither</SlRadio> <SlRadio value="3">Choose me</SlRadio> </SlRadioGroup> <br /> <SlButton type="submit" variant="primary"> Submit </SlButton> </form> ); };
Importing
If you’re using the autoloader or the traditional loader, you can ignore this section. Otherwise, feel free to use any of the following snippets to cherry pick this component.
To import this component from the CDN using a script tag:
<script type="module" src="https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.1.0/cdn/components/radio-group/radio-group.js"></script>
To import this component from the CDN using a JavaScript import:
import 'https://cdn.jsdelivr.net/npm/@shoelace-style/shoelace@2.1.0/cdn/components/radio-group/radio-group.js';
To import this component using a bundler:
import '@shoelace-style/shoelace/dist/components/radio-group/radio-group.js';
To import this component as a React component:
import SlRadioGroup from '@shoelace-style/shoelace/dist/react/radio-group';
Slots
Name | Description |
---|---|
(default) |
The default slot where <sl-radio> or
<sl-radio-button> elements are placed.
|
label
|
The radio group’s label. Required for proper accessibility. Alternatively, you can use the
label attribute.
|
help-text
|
Text that describes how to use the radio group. Alternatively, you can use the
help-text attribute.
|
Learn more about using slots.
Properties
Scroll right to see the entire table
Name | Description | Reflects | Type | Default |
---|---|---|---|---|
label
|
The radio group’s label. Required for proper accessibility. If you need to display HTML, use the
label slot instead.
|
string
|
''
|
|
helpText
help-text
|
The radio groups’s help text. If you need to display HTML, use the help-text slot
instead.
|
string
|
''
|
|
name
|
The name of the radio group, submitted as a name/value pair with form data. |
string
|
'option'
|
|
value
|
The current value of the radio group, submitted as a name/value pair with form data. |
|
string
|
''
|
size
|
The radio group’s size. This size will be applied to all child radios and radio buttons. |
|
'small' | 'medium' | 'large'
|
'medium'
|
form
|
By default, form controls are associated with the nearest containing
<form> element. This attribute allows you to place the form control outside of a
form and associate it with the form that has this id . The form must be in the same
document or shadow root for this to work.
|
|
string
|
''
|
required
|
Ensures a child radio is checked before allowing the containing form to submit. |
|
boolean
|
false
|
validity
|
Gets the validity state object | - | - | |
validationMessage
|
Gets the validation message | - | - | |
updateComplete
|
A read-only promise that resolves when the component has finished updating. |
Learn more about attributes and properties.
Events
Name | React Event | Description | Event Detail |
---|---|---|---|
sl-change
|
onSlChange
|
Emitted when the radio group’s selected value changes. | - |
sl-input
|
onSlInput
|
Emitted when the radio group receives user input. | - |
sl-invalid
|
onSlInvalid
|
Emitted when the form control has been checked for validity and its constraints aren’t satisfied. | - |
Learn more about events.
Methods
Name | Description | Arguments |
---|---|---|
checkValidity()
|
Checks for validity but does not show a validation message. Returns true when valid and
false when invalid.
|
- |
getForm()
|
Gets the associated form, if one exists. | - |
reportValidity()
|
Checks for validity and shows the browser’s validation message if the control is invalid. | - |
setCustomValidity()
|
Sets a custom validation message. Pass an empty string to restore validity. |
message:
|
Learn more about methods.
Parts
Name | Description |
---|---|
form-control
|
The form control that wraps the label, input, and help text. |
form-control-label
|
The label’s wrapper. |
form-control-input
|
The input’s wrapper. |
form-control-help-text
|
The help text’s wrapper. |
button-group
|
The button group that wraps radio buttons. |
button-group__base
|
The button group’s base part. |
Learn more about customizing CSS parts.
Dependencies
This component automatically imports the following dependencies.
-
<sl-button-group>