Zaidan

Command Palette

Search for a command to run...

GitHub43

Toggle

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

Installation

CLI

Manual

Install the following dependencies:

Copy and paste the following code into your project.

import type { PolymorphicProps } from "@kobalte/core";
import { ToggleButton, type ToggleButtonRootProps } from "@kobalte/core/toggle-button";
import { cva, type VariantProps } from "class-variance-authority";
import { type ComponentProps, splitProps, type ValidComponent } from "solid-js";
import { cn } from "~/lib/utils";
const toggleVariants = cva(
"group/toggle z-toggle inline-flex items-center justify-center whitespace-nowrap outline-none hover:bg-muted focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0",
{
variants: {
variant: {
default: "z-toggle-variant-default",
outline: "z-toggle-variant-outline",
},
size: {
default: "z-toggle-size-default",
sm: "z-toggle-size-sm",
lg: "z-toggle-size-lg",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
},
);
type ToggleProps<T extends ValidComponent = "button"> = PolymorphicProps<
T,
ToggleButtonRootProps<T>
> &
VariantProps<typeof toggleVariants> &
Pick<ComponentProps<T>, "class">;
const Toggle = <T extends ValidComponent = "button">(props: ToggleProps<T>) => {
const [local, others] = splitProps(props as ToggleProps, ["variant", "size", "class"]);
return (
<ToggleButton
data-slot="toggle"
class={cn(toggleVariants({ variant: local.variant, size: local.size }), local.class)}
{...others}
/>
);
};
export { Toggle, type ToggleProps, toggleVariants };

Examples

Here are the source code of all the examples from the preview page:

Basic

import { Bold, Italic, Underline } from "lucide-solid";
import { Toggle } from "~/components/ui/toggle";
function ToggleBasic() {
return (
<Example title="Basic">
<div class="flex flex-wrap items-center gap-2">
<Toggle aria-label="Toggle bold" defaultPressed>
<Bold />
</Toggle>
<Toggle aria-label="Toggle italic">
<Italic />
</Toggle>
<Toggle aria-label="Toggle underline">
<Underline />
</Toggle>
</div>
</Example>
);
}

Outline

import { Bold, Italic } from "lucide-solid";
import { Toggle } from "~/components/ui/toggle";
function ToggleOutline() {
return (
<Example title="Outline">
<div class="flex flex-wrap items-center gap-2">
<Toggle variant="outline" aria-label="Toggle italic">
<Italic />
Italic
</Toggle>
<Toggle variant="outline" aria-label="Toggle bold">
<Bold />
Bold
</Toggle>
</div>
</Example>
);
}

Sizes

import { Toggle } from "~/components/ui/toggle";
function ToggleSizes() {
return (
<Example title="Sizes">
<div class="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>
</Example>
);
}

With Button Text

import { Button } from "~/components/ui/button";
import { Toggle } from "~/components/ui/toggle";
function ToggleWithButtonText() {
return (
<Example title="With Button Text">
<div class="flex flex-col gap-4">
<div class="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 class="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 class="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>
</Example>
);
}

With Button Icon

import { Bold, Italic, Underline } from "lucide-solid";
import { Button } from "~/components/ui/button";
import { Toggle } from "~/components/ui/toggle";
function ToggleWithButtonIcon() {
return (
<Example title="With Button Icon">
<div class="flex flex-col gap-4">
<div class="flex items-center gap-2">
<Button variant="outline" size="icon-sm">
<Bold />
</Button>
<Toggle variant="outline" aria-label="Toggle sm icon" size="sm">
<Bold />
</Toggle>
</div>
<div class="flex items-center gap-2">
<Button variant="outline" size="icon">
<Italic />
</Button>
<Toggle variant="outline" aria-label="Toggle default icon" size="default">
<Italic />
</Toggle>
</div>
<div class="flex items-center gap-2">
<Button variant="outline" size="icon-lg">
<Underline />
</Button>
<Toggle variant="outline" aria-label="Toggle lg icon" size="lg">
<Underline />
</Toggle>
</div>
</div>
</Example>
);
}

With Button Icon + Text

import { Bold, Italic, Underline } from "lucide-solid";
import { Button } from "~/components/ui/button";
import { Toggle } from "~/components/ui/toggle";
function ToggleWithButtonIconText() {
return (
<Example title="With Button Icon + Text">
<div class="flex flex-col gap-4">
<div class="flex items-center gap-2">
<Button size="sm" variant="outline">
<Bold data-icon="inline-start" />
Button
</Button>
<Toggle variant="outline" aria-label="Toggle sm icon text" size="sm">
<Bold />
Toggle
</Toggle>
</div>
<div class="flex items-center gap-2">
<Button size="default" variant="outline">
<Italic data-icon="inline-start" />
Button
</Button>
<Toggle variant="outline" aria-label="Toggle default icon text" size="default">
<Italic />
Toggle
</Toggle>
</div>
<div class="flex items-center gap-2">
<Button size="lg" variant="outline">
<Underline data-icon="inline-start" />
Button
</Button>
<Toggle variant="outline" aria-label="Toggle lg icon text" size="lg">
<Underline />
Toggle
</Toggle>
</div>
</div>
</Example>
);
}

Disabled

import { Toggle } from "~/components/ui/toggle";
function ToggleDisabled() {
return (
<Example title="Disabled">
<div class="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>
</Example>
);
}

With Icon

import { Bookmark } from "lucide-solid";
import { Toggle } from "~/components/ui/toggle";
function ToggleWithIcon() {
return (
<Example title="With Icon">
<div class="flex flex-wrap items-center gap-2">
<Toggle aria-label="Toggle bookmark" defaultPressed>
<Bookmark class="group-data-[pressed]/toggle:fill-accent-foreground" />
</Toggle>
<Toggle variant="outline" aria-label="Toggle bookmark outline">
<Bookmark class="group-data-[pressed]/toggle:fill-accent-foreground" />
Bookmark
</Toggle>
</div>
</Example>
);
}