Skip to content
SproutAceve · v3.31.0
Overview What is your role? Connect to Sprout MCP reference Adopting Sprout
Brand & logos Color Typography Spacing & layout Elevation Iconography Accessibility
Overview Alert Avatar Badge Breadcrumb Buttons Cards Checkbox Data grid Dialog Dropdown button Fab button Floating tabs Inputs Menu Navigation Numeric input Progress bar Progress ring Radio button Ribbon toolbar Switch Tabs Tag Tooltip
Interaction & motion Voice & content Product patterns
AI patterns AI transparency & disclosure AI disclosure label
Design principles Personas Trust and ethics Meet the makers
Build the systemplay Tower of tokensplay Site runnerplay
How it works Changelogv3.31 Roadmap Contribute
Components

Radio button.

Radio buttons let a user pick exactly one option from a visible, mutually exclusive set. Group them under the same name so selecting one automatically clears the others — the opposite of a checkbox, which allows any number of selections.

Exactly one option is selected at all times once a group has a default — never zero, and never more than one. If the user genuinely needs to select none, add an explicit "None" option rather than leaving every radio unchecked.

Anatomy

CircleRadio label8 px

Size

Three sizes from the Figma component — 12 / 14 / 16px. 14px (medium) is the Sprout default.

States

Default, hover and disabled, each either unselected or selected — the full state set from the Figma component.

StateUnselectedSelected
Default
Hover
Disabled

Radio group

Three or more mutually exclusive options, sharing one name so the browser and screen readers treat them as a single group — arrow keys move the selection, and selecting one clears the others automatically.

Delivery method

Do's & Don'ts

Preferred contact method?

Do
Use for exactly one choice from a short, visible list of options

Which modules do you use?

Don't
Don't use radio buttons when more than one answer is allowed — use checkboxes
Do
Always ship a group with a sensible default already selected
Don't
Don't leave every option unchecked — that reads as a bug, not a neutral choice. Add an explicit “None” option if that's genuinely needed

Spec

Circle size12x12px (small), 14x14px (medium, default), 16x16px (large)
Circle radiusFull — always a circle
Inner dot~50% of the circle diameter, same colour as the border when selected
Border1px, var(--ink-2) unselected, var(--accent) selected, var(--line-strong) disabled
Label gap8px between circle and label
Label colourvar(--ink-1), var(--sprout-states-disabled) when disabled
Focus2px var(--accent-deep) outline, 2px offset, on the painted circle (the real input is visually hidden)

Accessibility

Real <input>Each AceveRadio renders a real, visually-hidden type="radio" input — never a div styled to look like one. Keyboard, screen readers and forms all work for free.
GroupingEvery option in a group shares the same name, wrapped in a <fieldset> with a <legend> naming the question — screen readers announce both the group and the count ("2 of 4").
KeyboardArrow keys move selection within a native radio group; Tab moves to and from the group as one stop, not once per option.
Focus indicatorVisible on the painted circle via :focus-visible, since the real input is opacity:0 and would otherwise show no focus ring at all.
Never zero selectedA group should always have a default. An all-unchecked group reads as broken, not neutral — add an explicit option instead.
← PreviousProgress ringNext →Ribbon toolbar
Sprout · Aceve Design System · v3.31.0
Figma library GitLabReleases
On this page
Anatomy
Size
States
Radio group
Do's & Don'ts
Spec