82 lines · 2.3 KB · TypeScript
RawDownload
"use client"; import * as React from "react";import { type VariantProps } from "class-variance-authority";import { ToggleGroup as ToggleGroupPrimitive } from "radix-ui"; import { cn } from "../lib/utils";import { toggleVariants } from "./toggle"; const ToggleGroupContext = React.createContext<  VariantProps<typeof toggleVariants> & {    spacing?: number;  }>({  size: "default",  variant: "default",  spacing: 0,}); function ToggleGroup({  className,  variant,  size,  spacing = 0,  children,  ...props}: React.ComponentProps<typeof ToggleGroupPrimitive.Root> &  VariantProps<typeof toggleVariants> & {    spacing?: number;  }) {  return (    <ToggleGroupPrimitive.Root      data-slot="toggle-group"      data-variant={variant}      data-size={size}      data-spacing={spacing}      style={{ "--gap": spacing } as React.CSSProperties}      className={cn(        "group/toggle-group flex w-fit items-center gap-[--spacing(var(--gap))] rounded-md data-[spacing=default]:data-[variant=outline]:shadow-xs",        className,      )}      {...props}    >      <ToggleGroupContext.Provider value={{ variant, size, spacing }}>        {children}      </ToggleGroupContext.Provider>    </ToggleGroupPrimitive.Root>  );} function ToggleGroupItem({  className,  children,  variant,  size,  ...props}: React.ComponentProps<typeof ToggleGroupPrimitive.Item> & VariantProps<typeof toggleVariants>) {  const context = React.useContext(ToggleGroupContext);   return (    <ToggleGroupPrimitive.Item      data-slot="toggle-group-item"      data-variant={context.variant || variant}      data-size={context.size || size}      data-spacing={context.spacing}      className={cn(        toggleVariants({          variant: context.variant || variant,          size: context.size || size,        }),        "w-auto min-w-0 shrink-0 px-3 focus:z-10 focus-visible:z-10",        "data-[spacing=0]:rounded-none data-[spacing=0]:shadow-none data-[spacing=0]:first:rounded-l-md data-[spacing=0]:last:rounded-r-md data-[spacing=0]:data-[variant=outline]:border-l-0 data-[spacing=0]:data-[variant=outline]:first:border-l",        className,      )}      {...props}    >      {children}    </ToggleGroupPrimitive.Item>  );} export { ToggleGroup, ToggleGroupItem };