96 lines · 3.4 KB · TypeScript
RawDownload
"use client"; import type { Toggle as TogglePrimitive } from "@base-ui/react/toggle";import { ToggleGroup as ToggleGroupPrimitive } from "@base-ui/react/toggle-group";import type { VariantProps } from "class-variance-authority";import * as React from "react"; import { cn } from "~/lib/utils";import { Separator } from "~/components/ui/separator";import { Toggle as ToggleComponent, type toggleVariants } from "~/components/ui/toggle"; const ToggleGroupContext = React.createContext<VariantProps<typeof toggleVariants>>({  size: "default",  variant: "default",}); function ToggleGroup({  className,  variant = "default",  size = "default",  orientation = "horizontal",  children,  ...props}: ToggleGroupPrimitive.Props & VariantProps<typeof toggleVariants>) {  const value = React.useMemo(() => ({ size, variant }), [size, variant]);  return (    <ToggleGroupPrimitive      className={cn(        "flex w-fit *:focus-visible:z-10 dark:*:[[data-slot=separator]:has(+[data-slot=toggle]:hover)]:before:bg-input/64 dark:*:[[data-slot=separator]:has(+[data-slot=toggle][data-pressed])]:before:bg-input dark:*:[[data-slot=toggle]:hover+[data-slot=separator]]:before:bg-input/64 dark:*:[[data-slot=toggle][data-pressed]+[data-slot=separator]]:before:bg-input",        orientation === "horizontal"          ? "*:pointer-coarse:after:min-w-auto"          : "*:pointer-coarse:after:min-h-auto",        variant === "default"          ? "gap-0.5"          : orientation === "horizontal"            ? "*:not-first:not-data-[slot=separator]:before:-start-[0.5px] *:not-last:not-data-[slot=separator]:before:-end-[0.5px] *:not-first:rounded-s-none *:not-last:rounded-e-none *:not-first:border-s-0 *:not-last:border-e-0 *:not-first:before:rounded-s-none *:not-last:before:rounded-e-none"            : "*:not-first:not-data-[slot=separator]:before:-top-[0.5px] *:not-last:not-data-[slot=separator]:before:-bottom-[0.5px] flex-col *:not-first:rounded-t-none *:not-last:rounded-b-none *:not-first:border-t-0 *:not-last:border-b-0 *:not-first:before:rounded-t-none *:not-last:before:rounded-b-none *:data-[slot=toggle]:not-last:before:hidden dark:*:last:before:hidden dark:*:first:before:block",        className,      )}      data-size={size}      data-slot="toggle-group"      data-variant={variant}      orientation={orientation}      {...props}    >      <ToggleGroupContext value={value}>{children}</ToggleGroupContext>    </ToggleGroupPrimitive>  );} function Toggle({  className,  children,  variant,  size,  ...props}: TogglePrimitive.Props & VariantProps<typeof toggleVariants>) {  const context = React.use(ToggleGroupContext);   const resolvedVariant = variant ?? context.variant;  const resolvedSize = size ?? context.size;   return (    <ToggleComponent      className={className}      data-size={resolvedSize}      data-variant={resolvedVariant}      size={resolvedSize}      variant={resolvedVariant}      {...props}    >      {children}    </ToggleComponent>  );} function ToggleGroupSeparator({  className,  orientation = "vertical",  ...props}: {  className?: string;} & React.ComponentProps<typeof Separator>) {  return (    <Separator      className={cn(        "pointer-events-none relative bg-input before:absolute before:inset-0 dark:before:bg-input/32",        className,      )}      orientation={orientation}      {...props}    />  );} export { ToggleGroup, Toggle, Toggle as ToggleGroupItem, ToggleGroupSeparator };