All components
Toggle
Every hand-drawn toggle variant, size and state.
Variants
Sizes
With icons
Pressed
Disabled
Installation
Add Toggle with the shadcn CLI.
npx shadcn@latest add https://sketchcn.chuwii.com/r/toggle.json
Examples
Editor toolbars and controlled filters.
Formatting toolbar
import { Toggle } from "@/components/ui/toggle";

const TEXT_MARKS = [
  { value: "bold", label: "Bold", Icon: Bold },
  { value: "italic", label: "Italic", Icon: Italic },
  { value: "underline", label: "Underline", Icon: TextUnderline },
];

export function TextToolbar() {
  const [marks, setMarks] = useState<string[]>(["bold"]);

  function toggleMark(value: string, pressed: boolean) {
    setMarks((current) => {
      if (pressed) {
        return [...current, value];
      }

      return current.filter((mark) => mark !== value);
    });
  }

  return (
    <div className="flex gap-1">
      {TEXT_MARKS.map(({ value, label, Icon }) => (
        <Toggle
          key={value}
          variant="outline"
          size="sm"
          aria-label={label}
          pressed={marks.includes(value)}
          onPressedChange={(pressed) => toggleMark(value, pressed)}
        >
          <Icon />
        </Toggle>
      ))}
    </div>
  );
}
Controlled filter
import { Toggle } from "@/components/ui/toggle";

export function DraftsFilter() {
  const [showDrafts, setShowDrafts] = useState(false);

  return (
    <Toggle pressed={showDrafts} onPressedChange={setShowDrafts}>
      Show drafts
    </Toggle>
  );
}