Get Started
Components
- Accordion
- Alert
- Alert Dialog
- Aspect Ratio
- Attachment
- Avatar
- Badge
- Breadcrumb
- Bubble
- Button
- Button Group
- Card
- Checkbox
- Collapsible
- Combobox
- Context Menu
- Date Picker (Lite)
- Dialog
- Direction
- Drawer
- Dropdown Menu
- Empty
- Field
- Hover Card
- Input
- Input Group
- Input OTP (Lite)
- Item
- Kbd
- Label
- Marker
- Menubar
- Message
- Native Select
- Navigation Menu
- Pagination
- Popover
- Progress
- Radio Group
- Scroll Area
- Select
- Separator
- Sheet
- Sidebar
- Skeleton
- Slider
- Spinner
- Switch
- Table
- Tabs
- Textarea
- Toast
- Toggle
- Toggle Group
- Tooltip
import { Bold, Italic, Underline } from "@/components/icons"
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupDemo() {
return (
<ToggleGroup variant="outline" multiple>
<ToggleGroupItem value="bold" aria-label="Toggle bold">
<Bold />
</ToggleGroupItem>
<ToggleGroupItem value="italic" aria-label="Toggle italic">
<Italic />
</ToggleGroupItem>
<ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough">
<Underline />
</ToggleGroupItem>
</ToggleGroup>
)
}Installation
pnpm dlx shadcnui-hono-jsx@latest add toggle-groupnpx shadcnui-hono-jsx@latest add toggle-groupyarn dlx shadcnui-hono-jsx@latest add toggle-groupbunx shadcnui-hono-jsx@latest add toggle-groupUsage
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"<ToggleGroup type="single">
<ToggleGroupItem value="a">A</ToggleGroupItem>
<ToggleGroupItem value="b">B</ToggleGroupItem>
<ToggleGroupItem value="c">C</ToggleGroupItem>
</ToggleGroup>Composition
Use the following composition to build a ToggleGroup:
ToggleGroup
├── ToggleGroupItem
└── ToggleGroupItemOutline
Use variant="outline" for an outline style.
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupOutline() {
return (
<ToggleGroup variant="outline" defaultValue={["all"]}>
<ToggleGroupItem value="all" aria-label="Toggle all">
All
</ToggleGroupItem>
<ToggleGroupItem value="missed" aria-label="Toggle missed">
Missed
</ToggleGroupItem>
</ToggleGroup>
)
}Size
Use the size prop to change the size of the toggle group.
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupSizes() {
return (
<div class="flex flex-col gap-4">
<ToggleGroup size="sm" defaultValue={["top"]} variant="outline">
<ToggleGroupItem value="top" aria-label="Toggle top">
Top
</ToggleGroupItem>
<ToggleGroupItem value="bottom" aria-label="Toggle bottom">
Bottom
</ToggleGroupItem>
<ToggleGroupItem value="left" aria-label="Toggle left">
Left
</ToggleGroupItem>
<ToggleGroupItem value="right" aria-label="Toggle right">
Right
</ToggleGroupItem>
</ToggleGroup>
<ToggleGroup defaultValue={["top"]} variant="outline">
<ToggleGroupItem value="top" aria-label="Toggle top">
Top
</ToggleGroupItem>
<ToggleGroupItem value="bottom" aria-label="Toggle bottom">
Bottom
</ToggleGroupItem>
<ToggleGroupItem value="left" aria-label="Toggle left">
Left
</ToggleGroupItem>
<ToggleGroupItem value="right" aria-label="Toggle right">
Right
</ToggleGroupItem>
</ToggleGroup>
</div>
)
}Spacing
Use spacing to add spacing between toggle group items.
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupSpacing() {
return (
<ToggleGroup size="sm" defaultValue={["top"]} variant="outline" spacing={2}>
<ToggleGroupItem value="top" aria-label="Toggle top">
Top
</ToggleGroupItem>
<ToggleGroupItem value="bottom" aria-label="Toggle bottom">
Bottom
</ToggleGroupItem>
<ToggleGroupItem value="left" aria-label="Toggle left">
Left
</ToggleGroupItem>
<ToggleGroupItem value="right" aria-label="Toggle right">
Right
</ToggleGroupItem>
</ToggleGroup>
)
}Vertical
Use orientation="vertical" for vertical toggle groups.
import { BoldIcon, ItalicIcon, UnderlineIcon } from "@/components/icons"
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupVertical() {
return (
<ToggleGroup
multiple
orientation="vertical"
spacing={1}
defaultValue={["bold", "italic"]}
>
<ToggleGroupItem value="bold" aria-label="Toggle bold">
<BoldIcon />
</ToggleGroupItem>
<ToggleGroupItem value="italic" aria-label="Toggle italic">
<ItalicIcon />
</ToggleGroupItem>
<ToggleGroupItem value="underline" aria-label="Toggle underline">
<UnderlineIcon />
</ToggleGroupItem>
</ToggleGroup>
)
}Disabled
import { Bold, Italic, Underline } from "@/components/icons"
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupDisabled() {
return (
<ToggleGroup disabled>
<ToggleGroupItem value="bold" aria-label="Toggle bold">
<Bold />
</ToggleGroupItem>
<ToggleGroupItem value="italic" aria-label="Toggle italic">
<Italic />
</ToggleGroupItem>
<ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough">
<Underline />
</ToggleGroupItem>
</ToggleGroup>
)
}Custom
A custom toggle group example.
Use font-lightnormalmediumbold to set the font weight.
import { Field, FieldDescription, FieldLabel } from "@/components/ui/field"
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
export function ToggleGroupFontWeightSelector() {
return (
<Field>
<FieldLabel>Font Weight</FieldLabel>
<ToggleGroup
defaultValue={["normal"]}
variant="outline"
spacing={2}
size="lg"
>
<ToggleGroupItem
value="light"
aria-label="Light"
class="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span class="text-2xl leading-none font-light">Aa</span>
<span class="text-xs text-muted-foreground">Light</span>
</ToggleGroupItem>
<ToggleGroupItem
value="normal"
aria-label="Normal"
class="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span class="text-2xl leading-none font-normal">Aa</span>
<span class="text-xs text-muted-foreground">Normal</span>
</ToggleGroupItem>
<ToggleGroupItem
value="medium"
aria-label="Medium"
class="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span class="text-2xl leading-none font-medium">Aa</span>
<span class="text-xs text-muted-foreground">Medium</span>
</ToggleGroupItem>
<ToggleGroupItem
value="bold"
aria-label="Bold"
class="flex size-16 flex-col items-center justify-center rounded-xl"
>
<span class="text-2xl leading-none font-bold">Aa</span>
<span class="text-xs text-muted-foreground">Bold</span>
</ToggleGroupItem>
</ToggleGroup>
<FieldDescription>
Use{" "}
{/* The pressed item's weight, following the native radios with :has(). */}
<code class="rounded-md bg-muted px-1 py-0.5 font-mono">
font-
<span class="hidden group-has-[[value=light]:checked]/field:inline">
light
</span>
<span class="hidden group-has-[[value=normal]:checked]/field:inline">
normal
</span>
<span class="hidden group-has-[[value=medium]:checked]/field:inline">
medium
</span>
<span class="hidden group-has-[[value=bold]:checked]/field:inline">
bold
</span>
</code>{" "}
to set the font weight.
</FieldDescription>
</Field>
)
}RTL
To enable RTL support in shadcn/ui, see the RTL configuration guide.
// This example sets dir and uses useTranslation because this site is not RTL.
// In an RTL app you won't need them; see the RTL guide.
import {
type Translations,
useTranslation,
} from "@/components/language-selector"
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"
const translations: Translations = {
en: {
dir: "ltr",
values: {
list: "List",
grid: "Grid",
cards: "Cards",
},
},
ar: {
dir: "rtl",
values: {
list: "قائمة",
grid: "شبكة",
cards: "بطاقات",
},
},
he: {
dir: "rtl",
values: {
list: "רשימה",
grid: "רשת",
cards: "כרטיסים",
},
},
}
export function ToggleGroupRtl() {
const { dir, t } = useTranslation(translations, "ar")
return (
<ToggleGroup variant="outline" defaultValue={["list"]} dir={dir}>
<ToggleGroupItem value="list" aria-label={t.list}>
{t.list}
</ToggleGroupItem>
<ToggleGroupItem value="grid" aria-label={t.grid}>
{t.grid}
</ToggleGroupItem>
<ToggleGroupItem value="cards" aria-label={t.cards}>
{t.cards}
</ToggleGroupItem>
</ToggleGroup>
)
}Notes
- Items are native radios sharing a
name(checkboxes withmultiple): the pressed item of a single-selection group cannot be released by pressing it again, and arrow keys select as they move.defaultValuesets the pressed items;value/onValueChangeare not supported. - A
labelaround a visually hidden native checkbox (the pressed state is its checked state): no JavaScript, andname/valueare submitted with forms.aria-*goes to the input, so icon-only toggles needaria-labelas upstream. - Space toggles, Enter does not (a checkbox, not a button);
pressed/defaultPressedset the initial state;onPressedChangeandrenderare not supported. - Accepts
classinstead ofclassName. - Upstream documentation: shadcn/ui Toggle Group. See also Differences from shadcn/ui.
API Reference
See the Base UI Toggle Group documentation.