A set of two-state buttons that can be toggled on (pressed) or off (not pressed).
import { ToggleGroup, ToggleGroupItem, } from "@repo/tailwindcss/ui/toggle-group"; const ToggleGroupDemo = () => { return ( <ToggleGroup multiple> <ToggleGroupItem value="bold" aria-label="Toggle bold"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="italic" aria-label="Toggle italic"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14" /> </svg> </ToggleGroupItem> </ToggleGroup> ); }; export default ToggleGroupDemo;
npx shadcn-solid@latest add toggle-group
npm install @kobalte/core
import { cn } from "@/libs/cn"; import type { PolymorphicProps } from "@kobalte/core/polymorphic"; import type { ToggleGroupItemProps, ToggleGroupRootProps, } from "@kobalte/core/toggle-group"; import { ToggleGroup as ToggleGroupPrimitive } from "@kobalte/core/toggle-group"; import type { VariantProps } from "class-variance-authority"; import type { Accessor, ParentProps, ValidComponent } from "solid-js"; import { createContext, createMemo, splitProps, useContext } from "solid-js"; import { toggleVariants } from "./toggle"; const ToggleGroupContext = createContext<Accessor<VariantProps<typeof toggleVariants>>>(); const useToggleGroup = () => { const context = useContext(ToggleGroupContext); if (!context) { throw new Error( "`useToggleGroup`: must be used within a `ToggleGroup` component", ); } return context; }; type toggleGroupProps<T extends ValidComponent = "div"> = ParentProps< ToggleGroupRootProps<T> & VariantProps<typeof toggleVariants> & { class?: string; } >; export const ToggleGroup = <T extends ValidComponent = "div">( props: PolymorphicProps<T, toggleGroupProps<T>>, ) => { const [local, rest] = splitProps(props as toggleGroupProps, [ "class", "children", "size", "variant", ]); const value = createMemo<VariantProps<typeof toggleVariants>>(() => ({ size: local.size, variant: local.variant, })); return ( <ToggleGroupPrimitive class={cn("flex items-center justify-center gap-1", local.class)} {...rest} > <ToggleGroupContext.Provider value={value}> {local.children} </ToggleGroupContext.Provider> </ToggleGroupPrimitive> ); }; type toggleGroupItemProps<T extends ValidComponent = "button"> = ToggleGroupItemProps<T> & { class?: string; }; export const ToggleGroupItem = <T extends ValidComponent = "button">( props: PolymorphicProps<T, toggleGroupItemProps<T>>, ) => { const [local, rest] = splitProps(props as toggleGroupItemProps, ["class"]); const context = useToggleGroup(); return ( <ToggleGroupPrimitive.Item class={cn( toggleVariants({ variant: context().variant, size: context().size, }), local.class, )} {...rest} /> ); };
import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group";
<ToggleGroup> <ToggleGroupItem value="a">A</ToggleGroupItem> <ToggleGroupItem value="b">B</ToggleGroupItem> <ToggleGroupItem value="c">C</ToggleGroupItem> </ToggleGroup>
import { ToggleGroup, ToggleGroupItem, } from "@repo/tailwindcss/ui/toggle-group"; const ToggleGroupOutline = () => { return ( <ToggleGroup multiple variant="outline"> <ToggleGroupItem value="bold" aria-label="Toggle bold"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="italic" aria-label="Toggle italic"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14" /> </svg> </ToggleGroupItem> </ToggleGroup> ); }; export default ToggleGroupOutline;
import { ToggleGroup, ToggleGroupItem, } from "@repo/tailwindcss/ui/toggle-group"; const ToggleGroupOutline = () => { return ( <ToggleGroup> <ToggleGroupItem value="bold" aria-label="Toggle bold"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="italic" aria-label="Toggle italic"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14" /> </svg> </ToggleGroupItem> </ToggleGroup> ); }; export default ToggleGroupOutline;
import { ToggleGroup, ToggleGroupItem, } from "@repo/tailwindcss/ui/toggle-group"; const ToggleGroupOutline = () => { return ( <ToggleGroup size="sm"> <ToggleGroupItem value="bold" aria-label="Toggle bold"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="italic" aria-label="Toggle italic"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14" /> </svg> </ToggleGroupItem> </ToggleGroup> ); }; export default ToggleGroupOutline;
import { ToggleGroup, ToggleGroupItem, } from "@repo/tailwindcss/ui/toggle-group"; const ToggleGroupOutline = () => { return ( <ToggleGroup size="lg"> <ToggleGroupItem value="bold" aria-label="Toggle bold"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="italic" aria-label="Toggle italic"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14" /> </svg> </ToggleGroupItem> </ToggleGroup> ); }; export default ToggleGroupOutline;
import { ToggleGroup, ToggleGroupItem, } from "@repo/tailwindcss/ui/toggle-group"; const ToggleGroupOutline = () => { return ( <ToggleGroup disabled> <ToggleGroupItem value="bold" aria-label="Toggle bold"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5h6a3.5 3.5 0 0 1 0 7H7zm6 7h1a3.5 3.5 0 0 1 0 7H7v-7" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="italic" aria-label="Toggle italic"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5h6M7 19h6m1-14l-4 14" /> </svg> </ToggleGroupItem> <ToggleGroupItem value="strikethrough" aria-label="Toggle strikethrough"> <svg xmlns="http://www.w3.org/2000/svg" class="h-4 w-4" viewBox="0 0 24 24" > <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 5v5a5 5 0 0 0 10 0V5M5 19h14" /> </svg> </ToggleGroupItem> </ToggleGroup> ); }; export default ToggleGroupOutline;