Toggle Group
A set of two-state buttons that can be toggled on or off.
Installation
Install Toggle
if you haven't already.
Install the following dependencies:
pnpm add @radix-ui/react-toggle-group
Copy and paste the following code into your project.
"use client";
import { createContext, useContext } from "react";
import * as ToggleGroupPrimitive from "@radix-ui/react-toggle-group";
import type { VariantProps } from "tailwind-variants";
import { cn } from "~/utils/tailwind";
import { toggleVariants } from "~/components/ui/Toggle";
const ToggleGroupContext = createContext<VariantProps<typeof toggleVariants>>({
variant: "default",
size: "md",
});
function ToggleGroup({
className,
variant,
size,
children,
...props
}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &
VariantProps<typeof toggleVariants>) {
return (
<ToggleGroupPrimitive.Root
className={cn(
"relative flex items-center justify-center gap-x-1",
className,
)}
{...props}
>
<ToggleGroupContext.Provider value={{ variant, size }}>
{children}
</ToggleGroupContext.Provider>
</ToggleGroupPrimitive.Root>
);
}
function ToggleGroupItem({
className,
children,
variant,
size,
...props
}: React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &
VariantProps<typeof toggleVariants>) {
const context = useContext(ToggleGroupContext);
return (
<ToggleGroupPrimitive.Item
className={cn(
toggleVariants({
variant: context.variant ?? variant,
size: context.size ?? size,
}),
className,
)}
{...props}
>
{children}
</ToggleGroupPrimitive.Item>
);
}
export { ToggleGroup, ToggleGroupItem };
Update the import paths to match your project setup.
Usage
import { ToggleGroup, ToggleGroupItem } from "~/components/ui/ToggleGroup";
<ToggleGroup type="single">
<ToggleGroupItem value="a">A</ToggleGroupItem>
<ToggleGroupItem value="b">B</ToggleGroupItem>
<ToggleGroupItem value="c">C</ToggleGroupItem>
</ToggleGroup>