Skip to main content
The Toggle Group component allows you to group multiple toggle buttons together with shared styling and behavior. It supports both single and multiple selection modes, horizontal and vertical orientations, and inherits all the variants from the Toggle component.

Installation

npx shadcn@latest add @eo-n/toggle-group

Usage

Import the toggle group components:
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
<ToggleGroup variant="outline">
  <ToggleGroupItem value="left" aria-label="Left align">
    <AlignLeft />
  </ToggleGroupItem>
  <ToggleGroupItem value="center" aria-label="Center align">
    <AlignCenter />
  </ToggleGroupItem>
  <ToggleGroupItem value="right" aria-label="Right align">
    <AlignRight />
  </ToggleGroupItem>
</ToggleGroup>

API Reference

ToggleGroup

The container component that wraps toggle items and manages their state. Props Extends React.ComponentProps<typeof ToggleGroupRoot> from Base UI.
PropTypeDefaultDescription
variant"default" | "outline""default"The visual style variant for all items
size"default" | "sm" | "lg""default"The size of all items
orientation"horizontal" | "vertical""horizontal"The layout direction
multiplebooleanfalseAllow multiple items to be pressed
defaultValuestring | string[]-Default selected value(s)
valuestring | string[]-Controlled selected value(s)
onValueChange(value: string | string[]) => void-Callback when selection changes
disabledbooleanfalseDisable all items

ToggleGroupItem

An individual toggle button within the group. Props Extends all Toggle props.
PropTypeDescription
valuestringRequired unique identifier for the item
disabledbooleanDisable this specific item

Examples

Default (Single Selection)

By default, only one item can be selected at a time:
import { AlignCenter, AlignLeft, AlignRight } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupDemo() {
  return (
    <ToggleGroup variant="outline">
      <ToggleGroupItem value="left" aria-label="Left align">
        <AlignLeft />
      </ToggleGroupItem>
      <ToggleGroupItem value="center" aria-label="Center align">
        <AlignCenter />
      </ToggleGroupItem>
      <ToggleGroupItem value="right" aria-label="Right align">
        <AlignRight />
      </ToggleGroupItem>
    </ToggleGroup>
  );
}

Multiple Selection

Allow multiple items to be selected simultaneously:
import { Bold, Italic, Underline } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupMultiple() {
  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="underline" aria-label="Toggle underline">
        <Underline />
      </ToggleGroupItem>
    </ToggleGroup>
  );
}

Vertical Orientation

Stack toggle items vertically:
import { AlignCenter, AlignLeft, AlignRight } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupVertical() {
  return (
    <ToggleGroup variant="outline" orientation="vertical">
      <ToggleGroupItem value="left" aria-label="Left align">
        <AlignLeft />
      </ToggleGroupItem>
      <ToggleGroupItem value="center" aria-label="Center align">
        <AlignCenter />
      </ToggleGroupItem>
      <ToggleGroupItem value="right" aria-label="Right align">
        <AlignRight />
      </ToggleGroupItem>
    </ToggleGroup>
  );
}

Sizes

Control the size of all items in the group:
import { Bold, Italic, Underline } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupSmall() {
  return (
    <ToggleGroup variant="outline" size="sm">
      <ToggleGroupItem value="bold">
        <Bold />
      </ToggleGroupItem>
      <ToggleGroupItem value="italic">
        <Italic />
      </ToggleGroupItem>
      <ToggleGroupItem value="underline">
        <Underline />
      </ToggleGroupItem>
    </ToggleGroup>
  );
}

Disabled

Disable the entire group or individual items:
import { Bold, Italic, Underline } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupDisabled() {
  return (
    <ToggleGroup variant="outline" disabled>
      <ToggleGroupItem value="bold">
        <Bold />
      </ToggleGroupItem>
      <ToggleGroupItem value="italic">
        <Italic />
      </ToggleGroupItem>
      <ToggleGroupItem value="underline">
        <Underline />
      </ToggleGroupItem>
    </ToggleGroup>
  );
}

Controlled

Control the selection state with React state:
import { useState } from "react";
import { AlignCenter, AlignLeft, AlignRight } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupControlled() {
  const [value, setValue] = useState("left");

  return (
    <div className="flex flex-col gap-2">
      <ToggleGroup variant="outline" value={value} onValueChange={setValue}>
        <ToggleGroupItem value="left" aria-label="Left align">
          <AlignLeft />
        </ToggleGroupItem>
        <ToggleGroupItem value="center" aria-label="Center align">
          <AlignCenter />
        </ToggleGroupItem>
        <ToggleGroupItem value="right" aria-label="Right align">
          <AlignRight />
        </ToggleGroupItem>
      </ToggleGroup>
      <p className="text-sm text-muted-foreground">
        Selected: {value}
      </p>
    </div>
  );
}

With Text Labels

Combine icons with text for better clarity:
import { Bold, Italic, Underline } from "lucide-react";
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";

export default function ToggleGroupWithText() {
  return (
    <ToggleGroup variant="outline">
      <ToggleGroupItem value="bold">
        <Bold />
        Bold
      </ToggleGroupItem>
      <ToggleGroupItem value="italic">
        <Italic />
        Italic
      </ToggleGroupItem>
      <ToggleGroupItem value="underline">
        <Underline />
        Underline
      </ToggleGroupItem>
    </ToggleGroup>
  );
}

Variants

Default

Transparent background with subtle hover states:
<ToggleGroup>
  <ToggleGroupItem value="1">Option 1</ToggleGroupItem>
  <ToggleGroupItem value="2">Option 2</ToggleGroupItem>
</ToggleGroup>

Outline

Bordered variant with connected items:
<ToggleGroup variant="outline">
  <ToggleGroupItem value="1">Option 1</ToggleGroupItem>
  <ToggleGroupItem value="2">Option 2</ToggleGroupItem>
</ToggleGroup>

Accessibility

  • Uses proper ARIA roles and attributes for toggle group pattern
  • Keyboard navigation with arrow keys between items
  • Space and Enter keys to toggle items
  • Clearly indicates pressed state to screen readers
  • Always include aria-label on icon-only toggle items

Base UI Reference

For more information about the underlying Base UI ToggleGroup component, see the Base UI documentation.

Build docs developers (and LLMs) love