Toggle
Toggle example: a two-state button that fills when pressed. Offers default and outline variants in small, default and large sizes, and the variants are exported for reuse.
pnpm dlx shadcn add @01orbital/toggle"use client"
import { Toggle as TogglePrimitive } from "@base-ui/react/toggle"
import { cva, type VariantProps } from "class-variance-authority"
import { cn } from "cn"
const toggleVariants = cva(
"group/toggle inline-flex items-center justify-center gap-1 rounded-3xl text-sm font-medium whitespace-nowrap transition-colors outline-none hover:bg-muted hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/30 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 aria-pressed:bg-muted dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
{
variants: {
variant: {
default: "bg-transparent",
outline: "border border-input bg-transparent hover:bg-muted",
},
size: {
default:
"h-9 min-w-9 px-3 has-data-[icon=inline-end]:pr-2.5 has-data-[icon=inline-start]:pl-2.5",
sm: "h-8 min-w-8 px-3 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",
lg: "h-10 min-w-10 px-4 has-data-[icon=inline-end]:pr-3 has-data-[icon=inline-start]:pl-3",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
function Toggle({
className,
variant = "default",
size = "default",
...props
}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {
return (
<TogglePrimitive
data-slot="toggle"
className={cn(toggleVariants({ variant, size, className }))}
{...props}
/>
)
}
export { Toggle, toggleVariants }
import { BookmarkSimpleIcon } from "@phosphor-icons/react/dist/ssr"
import { Toggle } from "@/components/ui/toggle"
// The copy: change text here, not in the markup.
const COPY = {
ariaLabel: "Toggle bookmark",
label: "Bookmark",
} as const
/** Toggle, after shadcn's example. */
export default function ToggleDemo() {
return (
<Toggle aria-label={COPY.ariaLabel} size="sm" variant="outline">
<BookmarkSimpleIcon className="group-aria-pressed/toggle:fill-foreground" />
{COPY.label}
</Toggle>
)
}
Dependencies
npm: @base-ui/react, class-variance-authority, cn. The CLI installs them for you.
No other registry pieces.