Toggle Group
A set of two-state buttons that can be toggled on or off.
Powered by
Installation
npx shadcn@latest add @redpanda/toggle-grouppnpm dlx shadcn@latest add @redpanda/toggle-groupyarn dlx shadcn@latest add @redpanda/toggle-groupbunx shadcn@latest add @redpanda/toggle-groupnubx shadcn@latest add @redpanda/toggle-groupaube dlx shadcn@latest add @redpanda/toggle-groupWhen to use
Toggle Group operates as a segmented control, allowing users to filter or adjust the display of content within the current view. Unlike tabs that navigate between distinct content areas, segmented controls modify how existing content is presented. Content is typically shared across different segments, with the control determining what’s visible or how it’s formatted.
Use Toggle Group when:
- Filtering or adjusting a single content view
- Toggling between different presentations of the same data
- Content is shared across segments (list vs. grid, day vs. week vs. month)
- Making formatting choices (bold, italic, underline)
- The view context remains the same, just filtered or adjusted
Don’t use Toggle Group when:
- Navigating between completely different content areas (use Tabs instead)
- Each option shows unique, non-overlapping content
- The interaction triggers a full content change rather than a filter/adjustment
Usage
<ToggleGroup> <ToggleGroupItem value="a">A</ToggleGroupItem> <ToggleGroupItem value="b">B</ToggleGroupItem> <ToggleGroupItem value="c">C</ToggleGroupItem></ToggleGroup>Choices may come from fragments or a shared component, as the attached-mode example demonstrates. Keep their rendered buttons as direct DOM siblings of the group; attachment follows the actual first and last button, not the shape of the React children. An attached group with one choice rounds every corner.
Interaction states
A segment is transparent at rest, so it takes the two archetypes from Interaction states according to whether it is the chosen one:
| rest | hover | held | |
|---|---|---|---|
| Unselected | transparent | accent wash |
accent-pressed |
| Selected | selected fill |
selected-hover |
selected-pressed |
The hover is scoped to unselected segments, so the chosen one steps its own fill instead of taking a wash on
top of it. Selection looks the same whether the group is single-select or multiple, and the transition is
colour only — nothing moves, and it is dropped under prefers-reduced-motion.
Examples
Multiple
Outline Variant
The outline variant provides a bordered container around the toggle group, ideal for segmented controls that filter or adjust content.
Attached Mode
Vertical Orientation
Shifting Layout
Each segment paints its own selection, so a group whose surrounding layout resizes between selections has nothing to re-measure and nothing to chase — the selected segment is simply where it was.
Combined with Tabs
This example demonstrates the key difference between tabs (navigation) and toggle groups (filtering). Tabs navigate between different content areas, while toggle groups filter or adjust content within each tab’s view.
Props
Registry Props
ToggleGroup
multiple?boolean
Allow multiple items to be pressed at once. Omit for single-select. `value`/`defaultValue` are always arrays.
booleanfalseattached?boolean
Join the segments into one control, squaring the inner corners. Set `false` for separately rounded segments with a gap.
booleantrueorientation?'horizontal' | 'vertical'
Lay the segments out in a row or a column.
'horizontal' | 'vertical'horizontalvariant?'default' | 'outline'
The variant of the toggle group
'default' | 'outline'defaultsize?'sm' | 'md' | 'lg'
The size of the toggle group
'sm' | 'md' | 'lg'mdToggleGroupItem
childrenReact.ReactNode
The children of the toggle group item
React.ReactNodevariant?'default' | 'outline'
The variant of the toggle group item
'default' | 'outline'defaultsize?'sm' | 'md' | 'lg'
The size of the toggle group item
'sm' | 'md' | 'lg'mdKeyboard interactions
| Key | Action |
|---|---|
Tab into the group |
Focus lands on the currently-pressed item, or the first item if none. |
ArrowLeft / ArrowRight |
Moves between items (horizontal). |
ArrowUp / ArrowDown |
Moves between items (vertical). |
Space / Enter |
Toggles the focused item. |
Home / End |
Jumps to first / last item. |
Accessibility
- The container carries
role="group"and each item is anaria-pressedtoggle button (Base UI native semantics). - Focus is roving — only one item is tabbable at a time, and arrow keys move focus between items.
- Provide an accessible group label — either
aria-labelonToggleGroupor a visible heading witharia-labelledby— otherwise the purpose of the group isn’t announced. - Omit
multiplefor single-selection filters (like/dislike, sort direction) and passmultiplefor independent switches (text formatting, feature flags).value/defaultValueare always arrays.