The radio button component allows users to select one option from a mutually exclusive set of choices. Unlike checkboxes, radio buttons enforce single selection within a group, making them ideal for decisions where only one answer is appropriate. The component provides clear visual feedback, supports various states including checked, unchecked, and disabled, and is designed with accessibility as a core principle.
When to Use
✅ Use radio buttons when:
Users need to select exactly one option from multiple choices
Options are mutually exclusive (selecting one deselects others)
All available options should be visible at once
Building forms with single-choice questions
Creating filter interfaces with exclusive criteria
Configuring settings where only one option can be active
Choose radio button sizes based on your layout density and visual hierarchy:
<><dap-ds-stackdirection="column"><div><dap-ds-typographyvariant="h4">Size variations</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Extra small radio buttons"value="xs-1"size="xs"><dap-ds-radio-buttonvalue="xs-1"label="Extra small option"description="Compact size for dense layouts"></dap-ds-radio-button><dap-ds-radio-buttonvalue="xs-2"label="Another XS option"description="Good for mobile interfaces"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Small radio buttons (default)"value="sm-1"size="sm"><dap-ds-radio-buttonvalue="sm-1"label="Small option"description="Standard size for most use cases"></dap-ds-radio-button><dap-ds-radio-buttonvalue="sm-2"label="Another small option"description="Balanced size and readability"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Medium radio buttons"value="md-1"size="md"><dap-ds-radio-buttonvalue="md-1"label="Medium option"description="Larger size for better accessibility"></dap-ds-radio-button><dap-ds-radio-buttonvalue="md-2"label="Another medium option"description="Good for touch interfaces"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Large radio buttons"value="lg-1"size="lg"><dap-ds-radio-buttonvalue="lg-1"label="Large option"description="Prominent size for important selections"></dap-ds-radio-button><dap-ds-radio-buttonvalue="lg-2"label="Another large option"description="Maximum visibility and touch target"></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></div></dap-ds-stack></>
States & Feedback
Radio buttons support various states to communicate different conditions to users:
<><dap-ds-stackdirection="column"><div><dap-ds-typographyvariant="h4">Interactive states</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Basic states"value="state-2"><dap-ds-radio-buttonlabel="Default unchecked"value="state-1"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Checked state"value="state-2"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Disabled unchecked"value="state-3"disabled></dap-ds-radio-button><dap-ds-radio-buttonlabel="Disabled checked"value="state-4"disabledchecked></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></div><div><dap-ds-typographyvariant="h4">Validation states</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Payment Method"requiredfeedback="Please select a payment method"feedbackType="negative"><dap-ds-radio-buttonlabel="Credit Card"value="credit-card"invalid></dap-ds-radio-button><dap-ds-radio-buttonlabel="PayPal"value="paypal"invalid></dap-ds-radio-button><dap-ds-radio-buttonlabel="Bank Transfer"value="bank-transfer"invalid></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Subscription Type"value="premium"feedback="Great choice! Premium includes all features"feedbackType="positive"><dap-ds-radio-buttonlabel="Basic"value="basic"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Premium"value="premium"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Enterprise"value="enterprise"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Data Retention"value="7-days"feedback="Warning: Shorter retention periods may affect reporting"feedbackType="warning"><dap-ds-radio-buttonlabel="7 days"value="7-days"></dap-ds-radio-button><dap-ds-radio-buttonlabel="30 days"value="30-days"></dap-ds-radio-button><dap-ds-radio-buttonlabel="90 days"value="90-days"></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></div></dap-ds-stack></>
Label Positioning & Descriptions
Flexible label and description placement for different layout needs:
<><dap-ds-stackdirection="column"><div><dap-ds-typographyvariant="h4">Label positioning</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Label on the right (default)"value="pos-1"><dap-ds-radio-buttonlabel="Option with right label"value="pos-1"description="Description appears below the label"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Another right option"value="pos-2"description="Standard layout pattern"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Label on the left"value="pos-3"><dap-ds-radio-buttonlabel="Option with left label"value="pos-3"description="Description still follows the label"labelPlacement="left"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Another left option"value="pos-4"description="Alternative layout for special cases"labelPlacement="left"></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></div><div><dap-ds-typographyvariant="h4">Description placement</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Description below"value="desc-1"><dap-ds-radio-buttonlabel="Option with description below"value="desc-1"description="This description appears below the label"descriptionPlacement="bottom"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Another option below"value="desc-2"description="Standard description placement"descriptionPlacement="bottom"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Description above"value="desc-3"><dap-ds-radio-buttonlabel="Option with description above"value="desc-3"description="This description appears above the label"descriptionPlacement="top"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Another option above"value="desc-4"description="Description first, then label"descriptionPlacement="top"></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></div></dap-ds-stack></>
Background & Border Variants
Special styling options for use on colored backgrounds or specific visual emphasis:
<><divstyle={{ backgroundColor:"#e9edf2", padding:"16px", borderRadius:"8px"}}><dap-ds-stackdirection="column"><dap-ds-typographyvariant="h4">Background variant</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Background style radio buttons"value="bg-1"><dap-ds-radio-buttonlabel="Background style option"description="Better visibility on colored backgrounds"value="bg-1"type="background"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Background with border"description="Enhanced definition with border"value="bg-2"type="background"border></dap-ds-radio-button><dap-ds-radio-buttonlabel="Regular radio button"description="Standard styling for comparison"value="bg-3"></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></dap-ds-stack></div><divstyle={{ backgroundColor:"white", padding:"16px", border:"1px solid #e0e0e0", borderRadius:"8px", marginTop:"16px"}}><dap-ds-stackdirection="column"><dap-ds-typographyvariant="h4">Border emphasis</dap-ds-typography><dap-ds-stackdirection="column"><dap-ds-radio-grouplabel="Bordered radio buttons"value="border-1"><dap-ds-radio-buttonlabel="Bordered option"description="Added border for visual emphasis"value="border-1"border></dap-ds-radio-button><dap-ds-radio-buttonlabel="Bordered and selected"description="Border with checked state"value="border-2"border></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack></dap-ds-stack></div></>
Real-World PatternsSurvey Question Form
<divstyle={{border:'var(--dds-border-width-base) solid var(--dds-border-neutral-subtle)', padding:'var(--dds-spacing-600)', borderRadius:'var(--dds-radius-base)'}}><dap-ds-stack><dap-ds-typographyvariant="h3">Customer Satisfaction Survey</dap-ds-typography><dap-ds-radio-grouplabel="How satisfied are you with our service?"description="Please rate your overall experience"requiredvalue="satisfied"><dap-ds-radio-buttonlabel="Very Satisfied"description="Exceeded my expectations"value="very-satisfied"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Satisfied"description="Met my expectations"value="satisfied"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Neutral"description="Neither satisfied nor dissatisfied"value="neutral"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Dissatisfied"description="Did not meet my expectations"value="dissatisfied"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Very Dissatisfied"description="Far below my expectations"value="very-dissatisfied"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="How likely are you to recommend us?"description="Scale from 1-5 where 5 is most likely"requiredvalue="4"><dap-ds-radio-buttonlabel="1 - Not at all likely"value="1"></dap-ds-radio-button><dap-ds-radio-buttonlabel="2 - Unlikely"value="2"></dap-ds-radio-button><dap-ds-radio-buttonlabel="3 - Neutral"value="3"></dap-ds-radio-button><dap-ds-radio-buttonlabel="4 - Likely"value="4"></dap-ds-radio-button><dap-ds-radio-buttonlabel="5 - Extremely likely"value="5"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-stackdirection="row"><dap-ds-button>Submit Survey</dap-ds-button><dap-ds-buttonvariant="outline">Save for Later</dap-ds-button></dap-ds-stack></dap-ds-stack></div>
Settings Configuration
<divstyle={{border:'var(--dds-border-width-base) solid var(--dds-border-neutral-subtle)', padding:'var(--dds-spacing-600)', borderRadius:'var(--dds-radius-base)'}}><dap-ds-stack><dap-ds-typographyvariant="h3">Application Settings</dap-ds-typography><dap-ds-radio-grouplabel="Theme Preference"description="Choose your preferred application theme"value="auto"><dap-ds-radio-buttonlabel="Light Theme"description="Always use light colors"value="light"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Dark Theme"description="Always use dark colors"value="dark"></dap-ds-radio-button><dap-ds-radio-buttonlabel="System Default"description="Follow your device's theme setting"value="auto"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Language Settings"description="Select your preferred language"value="en"><dap-ds-radio-buttonlabel="English"description="Display interface in English"value="en"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Magyar"description="Felület megjelenítése magyarul"value="hu"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Deutsch"description="Benutzeroberfläche auf Deutsch anzeigen"value="de"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Data Sync Frequency"description="How often should we sync your data?"value="hourly"feedback="More frequent syncing uses more battery"feedbackType="warning"><dap-ds-radio-buttonlabel="Real-time"description="Instant synchronization (high battery usage)"value="realtime"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Every Hour"description="Balanced performance and battery life"value="hourly"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Daily"description="Minimal battery impact"value="daily"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Manual Only"description="Sync only when requested"value="manual"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-stackdirection="row"><dap-ds-button>Save Settings</dap-ds-button><dap-ds-buttonvariant="outline">Reset to Defaults</dap-ds-button></dap-ds-stack></dap-ds-stack></div>
Shipping Options
<divstyle={{border:'var(--dds-border-width-base) solid var(--dds-border-neutral-subtle)', padding:'var(--dds-spacing-600)', borderRadius:'var(--dds-radius-base)'}}><dap-ds-stack><dap-ds-typographyvariant="h3">Delivery Options</dap-ds-typography><dap-ds-radio-grouplabel="Shipping Method"description="Choose your preferred delivery option"requiredvalue="standard"><dap-ds-radio-buttonlabel="Standard Delivery"description="3-5 business days • FREE"value="standard"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Express Delivery"description="1-2 business days • $9.99"value="express"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Overnight Delivery"description="Next business day by 10:30 AM • $24.99"value="overnight"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Weekend Delivery"description="Saturday delivery available • $14.99"value="weekend"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Delivery Instructions"description="Special delivery preferences"value="doorstep"><dap-ds-radio-buttonlabel="Leave at Doorstep"description="Safe for most neighborhoods"value="doorstep"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Require Signature"description="Someone must be present to sign"value="signature"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Deliver to Neighbor"description="Leave with trusted neighbor if not home"value="neighbor"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Hold at Post Office"description="Pick up at your convenience"value="pickup"></dap-ds-radio-button></dap-ds-radio-group><divstyle={{borderTop:'var(--dds-border-width-base) solid var(--dds-border-neutral-subtle)', paddingTop:'var(--dds-spacing-400)', marginTop:'var(--dds-spacing-400)'}}><dap-ds-stackdirection="row"justify="space-between"align="center"><div><dap-ds-typographyvariant="body"bold>Estimated Delivery:</dap-ds-typography><dap-ds-typographyvariant="body">Thursday, March 21</dap-ds-typography></div><dap-ds-button>Continue to Payment</dap-ds-button></dap-ds-stack></div></dap-ds-stack></div>
Accessibility & Keyboard Navigation
The radio button component is designed with accessibility as a core principle:
Keyboard Support
Arrow Keys: Navigate between radio buttons in a group
Space: Select the focused radio button
Enter: Alternative selection method (custom enhancement)
Tab: Navigate between radio button groups
Shift + Tab: Navigate backwards between groups
Screen Reader Support
Proper ARIA labels and descriptions
Group labeling for related radio buttons
State announcements (checked, unchecked)
Form association and validation messages
Radio button group context
Focus Management
Clear focus indicators
Logical tab order within and between groups
Programmatic focus control
Only checked radio button is focusable by default
<dap-ds-stackdirection="column"><dap-ds-typographyvariant="h4">Accessibility Examples</dap-ds-typography><dap-ds-radio-grouplabel="Accessible radio group"description="Try navigating with Tab and arrow keys, select with Space"value="accessible-1"><dap-ds-radio-buttonlabel="First accessible option"value="accessible-1"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Second accessible option"value="accessible-2"></dap-ds-radio-button><dap-ds-radio-buttonlabel="Third accessible option"value="accessible-3"></dap-ds-radio-button></dap-ds-radio-group><dap-ds-radio-grouplabel="Required field with validation"description="Screen readers announce validation messages"requiredfeedback="Please select an option to continue"feedbackType="negative"><dap-ds-radio-buttonlabel="Option requiring selection"value="validation-1"invalid></dap-ds-radio-button><dap-ds-radio-buttonlabel="Another required option"value="validation-2"invalid></dap-ds-radio-button></dap-ds-radio-group></dap-ds-stack>
Best PracticesForm Integration
Always use radio buttons within dap-ds-radio-group components
Provide clear, descriptive group labels
Use descriptions for additional context when needed
Implement proper validation feedback
Consider the number of options (use dropdowns for many options)
Visual Design
Maintain consistent sizing within forms
Use background variants on colored surfaces
Consider border emphasis for important selections
Provide sufficient color contrast
Test with different themes and accessibility settings
User Experience
Limit the number of radio button options (typically 2-7)
Order options logically (alphabetical, numerical, or by popularity)
Provide clear feedback for validation states
Make the most common choice the default selection when appropriate
Test with real users and assistive technologies
Group Organization
Group related options together
Use clear group labels that describe the choice
Consider progressive disclosure for complex option sets