figma guide

Designing segmented controls and radio groups in Figma: patterns, states, and handoff

Design segmented controls and radio button groups in Figma with exclusive selection, responsive layouts, icon+label segments, and Dev Mode specs for settings and forms.

Published
Updated
Jun 15, 2026
Read time
7 min
Level
Beginner

Quick answer

Radio groups and segmented controls both enforce exactly-one selection—but segmented controls show every option at once as a connected pill bar, while radio groups stack individual circles with labels. Build a Radio primitive (selected=off | on, state=default | focus | error | disabled) and a SegmentedControl container with Segment children (position=first | middle | last, selected=off | on). Use radios for long option lists and forms; use segmented controls for 2–5 compact choices (view mode, billing cycle, chart range). Pair with forms, checkboxes and switches, and navigation tabs when the pattern blurs. Document keyboard arrows, default selection, and whether change applies instantly in Dev Mode. Start from the Figma guides hub.


Who this is for

  • Product designers shipping pricing pickers, chart ranges, layout toggles, and wizard steps.
  • Design system teams drawing the line between tabs, segmented controls, and radio lists.
  • Engineers implementing roving tabindex, role="radiogroup", and responsive overflow behavior.

Radio group vs segmented control vs tabs

PatternOptions visibleSelectionNavigation?Best for
Radio groupVertical/horizontal listOne of NNoForms, settings with descriptions
Segmented controlAll segments in one barOne of 2–5NoCompact filters, view mode
TabsTab labelsOne panelYes—swaps contentNavigation
DropdownHidden until openOne of manyNo>5 options—use dropdown
Chip filter (single)Scrollable rowOne activeSometimesMobile overflow

Verdict: if switching content panels, use tabs. If picking one value inside the same view (list vs grid), use a segmented control. If options need helper text per row, use radio group.


Radio button component anatomy

PartPurposeSpec tip
Outer circleUnselected ring16–20px diameter
Inner dotSelected fill8–10px centered
LabelOption nameClickable; supports wrap
DescriptionSecondary copyBelow label for plans
Group labelQuestionlegend / heading above set
Radio
├── Variant: selected=off | on
├── Variant: state=default | focus | error | disabled
├── Variant: size=sm | md
├── Layer: Row (auto layout horizontal)
│   ├── Circle (stroke ring)
│   │   └── Dot (visible when selected)
│   └── LabelBlock
│       ├── Label
│       └── Description (optional)
└── Layer: Group error (shared, below set)

Use auto layout vertical stacks with 12px gap between radio rows.


Radio states

StateCircleLabelNotes
UnselectedEmpty ringDefaultNeutral border
SelectedRing + filled dotDefaultDot uses brand color
FocusFocus ringUnchangedRing on entire row acceptable
ErrorError ringError optionalGroup-level message common
DisabledMuted ringMuted textEntire option inactive

Only one radio in a group should show selected=on unless documenting an invalid mock.


Segmented control anatomy

PartPurposeSpec tip
ContainerGroups segmentsPill background; 4–8px padding
SegmentOne optionEqual width or hug content
Selected fillActive segmentRaised or inverted surface
IconOptional16px with label or icon-only
DividerBetween segments1px line or gap—pick one system
SegmentedControl
├── Variant: size=sm | md
├── Variant: fullWidth=true | false
├── Layer: Container (auto layout horizontal, padding 4)
│   └── Segment × N
│       ├── Variant: selected=off | on
│       ├── Variant: position=first | middle | last | only
│       ├── Icon (optional)
│       └── Label
└── Layer: Helper / error (optional)

Position variants control corner radius: first segment rounded left, last rounded right, middle square—so the bar reads as one unit.


Segmented control states

StateContainerActive segmentInactive segment
DefaultNeutral trackWhite or elevated fillTransparent on track
HoverUnchangedSubtle backgroundHover tint
FocusUnchangedFocus ring on segmentFocus ring on segment
DisabledMuted trackCannot selectMuted text
Icon-onlySameTooltip requiredTooltip on hover

For icon + label segments, collapse to icon-only on narrow breakpoints—document breakpoint in Dev Mode.


Layout patterns

PatternControlLayout
Vertical radio listRadioStack; descriptions under labels
Horizontal radio rowRadio2–3 short options only
Full-width segmented barSegmentedfullWidth=true; equal segments
Hug-content pillSegmentedChart range: 1W / 1M / 1Y
Inside toolbarSegmentedNext to search
Pricing cardsRadioLarge card with border selection state

Pricing cards are often radio-backed even when they look like cards—add a selected border variant and document role="radio" on the card container.


Pairing with other patterns

NeedPatternLink
Form submitRadio group + validationForms
Settings instant applySegmented controlSwitches nearby
Multi-select filtersNot radio—use checkboxesCheckbox guide
Wizard stepsRadio for plan pickProgress steppers
Mobile overflowScrollable chips or dropdownDropdown menus
Chart / dashboardSegmented rangeTables toolbar

Accessibility checklist

RequirementRadio groupSegmented control
Container rolerole="radiogroup"role="radiogroup" or role="tablist" only if switching panels—prefer radiogroup
Item rolerole="radio"role="radio" per segment
Selection`aria-checked=“truefalse”`
Labelaria-labelledby on grouparia-label on container
KeyboardArrow keys move selectionArrow keys between segments
FocusRoving tabindexOne tab stop on group
Disabled optionaria-disabledGray segment skipped in arrows

Test contrast on inactive segment text on tinted tracks—common failure in dark mode. Use dark mode tokens and a11y plugins.


Prototyping limits

Figma does not enforce exclusive selection across separate instances. Approaches:

  1. Component set with selected property on one SegmentedControl—swap segments via variants.
  2. Separate frames per selected segment for static screenshots.
  3. Overlays for radio card selection (selected border frame on click).

Use interactive components for hover on segments; document that only one may be active in production.


Handoff to engineering

DeliverableRadioSegmented
namegroup namecontrol id
value per optionstringstring
defaultValuepre-selected optionpre-selected segment
onChangecallback with valuecallback with value
orientationvertical / horizontalhorizontal (usually)
fullWidthn/aboolean
disabledper option or whole groupper segment or whole bar
Errorgroup message stringsame
Responsivestack on mobile?icon-only breakpoint

Add to Dev Mode checklist. Publish primitives in your team library under Patterns / Forms.


Real-world examples

Billing cycle picker (segmented)

Three segments: Monthly / Annual / Lifetime. Annual selected by default; “Save 20%” badge on Annual segment only—not on the container. fullWidth=true on pricing page.

Shipping method (radio list)

Vertical radios with label + description + price right-aligned. Error on submit if none selected: “Choose a shipping method.”

Editor view toggle (segmented icon)

Design / Preview / Code icon-only segments with tooltips. 40px height; md size. Collapses to dropdown under 360px—note in spec.


Common mistakes

MistakeConsequenceFix
Segmented control with 8 optionsCrowded barUse dropdown or radio list
Tabs for view mode onlyWrong semanticsSegmented control
Multiple radios selected in mockImpossible stateOne selected=on per group
No default selectionUser submits emptyPre-select sensible default
Radio for on/off settingNeeds Save awkwardlyUse switch
Unequal segment widthsJumpy layoutfullWidth + equal flex
Icon-only without tooltipUnknown meaningTooltip or aria-label
Card selection without radio roleAccessibility gapDocument role="radio" on card

FAQ

Segmented control or tabs?

Tabs when each option reveals different content. Segmented when the same canvas changes mode (list/grid, $/%).

Radio or checkbox for filters?

Checkboxes when users pick multiple filters. Radio when filters are mutually exclusive (sort: Newest vs Price).

How many segments max?

2–5 in one bar. Beyond that, use vertical radios or a combobox.

Horizontal radios on mobile?

Stack vertically below 480px unless labels are one word each.


Bottom line

Radio groups excel when options need space and descriptions; segmented controls excel when the choice is small, visible, and immediate. Build both with exclusive selection, keyboard rules, and responsive collapse documented in Dev Mode. Continue with forms, checkboxes and switches, navigation tabs, and the tutorials hub.

Share on X

§ Keep reading

Related guides.