Components

Toggle

A two-state button that can be either on or off.

Installation

Cortexcn
pnpm dlx shadcn@latest add @cortexcn/toggle

Usage

import { Toggle, toggleVariants } from "@/components/toggle";

Examples

Basic

import { Toggle } from "@/components/toggle"import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react"export function ToggleBasic() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Toggle aria-label="Toggle bold" defaultPressed>          <BoldIcon />        </Toggle>        <Toggle aria-label="Toggle italic">          <ItalicIcon />        </Toggle>        <Toggle aria-label="Toggle underline">          <UnderlineIcon />        </Toggle>      </div>    </div>  )}

Outline

import { Toggle } from "@/components/toggle"import { BoldIcon, ItalicIcon } from "lucide-react"export function ToggleOutline() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Toggle variant="outline" aria-label="Toggle italic">          <ItalicIcon data-icon="inline-start" />          Italic        </Toggle>        <Toggle variant="outline" aria-label="Toggle bold">          <BoldIcon data-icon="inline-start" />          Bold        </Toggle>      </div>    </div>  )}

Sizes

import { Toggle } from "@/components/toggle"export function ToggleSizes() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Toggle variant="outline" aria-label="Toggle small" size="sm">          Small        </Toggle>        <Toggle variant="outline" aria-label="Toggle default" size="default">          Default        </Toggle>        <Toggle variant="outline" aria-label="Toggle large" size="lg">          Large        </Toggle>      </div>    </div>  )}

With button text

import { Button } from "@/components/button"import { Toggle } from "@/components/toggle"export function ToggleWithButtonText() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-col gap-4">        <div className="flex items-center gap-2">          <Button size="sm" variant="outline">            Button          </Button>          <Toggle variant="outline" aria-label="Toggle sm" size="sm">            Toggle          </Toggle>        </div>        <div className="flex items-center gap-2">          <Button size="default" variant="outline">            Button          </Button>          <Toggle variant="outline" aria-label="Toggle default" size="default">            Toggle          </Toggle>        </div>        <div className="flex items-center gap-2">          <Button size="lg" variant="outline">            Button          </Button>          <Toggle variant="outline" aria-label="Toggle lg" size="lg">            Toggle          </Toggle>        </div>      </div>    </div>  )}

With button icon

import { Button } from "@/components/button"import { Toggle } from "@/components/toggle"import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react"export function ToggleWithButtonIcon() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-col gap-4">        <div className="flex items-center gap-2">          <Button variant="outline" size="icon-sm">            <BoldIcon />          </Button>          <Toggle variant="outline" aria-label="Toggle sm icon" size="sm">            <BoldIcon />          </Toggle>        </div>        <div className="flex items-center gap-2">          <Button variant="outline" size="icon">            <ItalicIcon />          </Button>          <Toggle            variant="outline"            aria-label="Toggle default icon"            size="default"          >            <ItalicIcon />          </Toggle>        </div>        <div className="flex items-center gap-2">          <Button variant="outline" size="icon-lg">            <UnderlineIcon />          </Button>          <Toggle variant="outline" aria-label="Toggle lg icon" size="lg">            <UnderlineIcon />          </Toggle>        </div>      </div>    </div>  )}

With button icon and text

import { Button } from "@/components/button"import { Toggle } from "@/components/toggle"import { BoldIcon, ItalicIcon, UnderlineIcon } from "lucide-react"export function ToggleWithButtonIconText() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-col gap-4">        <div className="flex items-center gap-2">          <Button size="sm" variant="outline">            <BoldIcon data-icon="inline-start" />            Button          </Button>          <Toggle variant="outline" aria-label="Toggle sm icon text" size="sm">            <BoldIcon data-icon="inline-start" />            Toggle          </Toggle>        </div>        <div className="flex items-center gap-2">          <Button size="default" variant="outline">            <ItalicIcon data-icon="inline-start" />            Button          </Button>          <Toggle            variant="outline"            aria-label="Toggle default icon text"            size="default"          >            <ItalicIcon data-icon="inline-start" />            Toggle          </Toggle>        </div>        <div className="flex items-center gap-2">          <Button size="lg" variant="outline">            <UnderlineIcon data-icon="inline-start" />            Button          </Button>          <Toggle variant="outline" aria-label="Toggle lg icon text" size="lg">            <UnderlineIcon data-icon="inline-start" />            Toggle          </Toggle>        </div>      </div>    </div>  )}

Disabled

import { Toggle } from "@/components/toggle"export function ToggleDisabled() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Toggle aria-label="Toggle disabled" disabled>          Disabled        </Toggle>        <Toggle variant="outline" aria-label="Toggle disabled outline" disabled>          Disabled        </Toggle>      </div>    </div>  )}

With icon

import { Toggle } from "@/components/toggle"import { BookmarkIcon } from "lucide-react"export function ToggleWithIcon() {  return (    <div className="flex flex-col gap-6">      <div className="flex flex-wrap items-center gap-2">        <Toggle aria-label="Toggle bookmark" defaultPressed>          <BookmarkIcon className="group-data-[state=on]/toggle:fill-accent-foreground" />        </Toggle>        <Toggle variant="outline" aria-label="Toggle bookmark outline">          <BookmarkIcon className="group-data-[state=on]/toggle:fill-accent-foreground" data-icon="inline-start" />          Bookmark        </Toggle>      </div>    </div>  )}

Adapted from the shadcn/ui Toggle (MIT).