import * as React from "react" import { Button as ButtonPrimitive } from "@base-ui/react/button" import { cva, type VariantProps } from "class-variance-authority" import { cn } from "@/lib/utils" const buttonVariants = cva( "group/button inline-flex shrink-0 items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium outline-none transition-[background-color,border-color,color,box-shadow,opacity] select-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0", { variants: { variant: { default: "bg-primary text-primary-foreground shadow-sm hover:bg-primary/90", outline: "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", secondary: "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", ghost: "hover:bg-accent hover:text-accent-foreground", destructive: "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", warning: "bg-yellow-500 text-white shadow-sm hover:bg-yellow-600", link: "h-auto rounded-none px-0 text-primary underline-offset-4 hover:underline focus-visible:ring-0 focus-visible:ring-offset-0", }, size: { default: "h-10 px-4 py-2", xs: "h-7 gap-1.5 rounded px-2 text-xs [&_svg]:size-3.5", sm: "h-8 gap-1.5 rounded-md px-3 text-xs", md: "h-10 px-4 py-2", lg: "h-11 rounded-md px-5 text-base", xl: "h-12 rounded-lg px-6 text-base", icon: "size-10 p-0", "icon-xs": "size-7 rounded p-0 [&_svg]:size-3.5", "icon-sm": "size-8 rounded-md p-0", "icon-lg": "size-11 rounded-md p-0 [&_svg]:size-5", }, }, defaultVariants: { variant: "default", size: "default", }, } ) export type ButtonProps = ButtonPrimitive.Props & VariantProps & { loading?: boolean loadingLabel?: string leftIcon?: React.ReactNode rightIcon?: React.ReactNode iconOnly?: boolean fullWidth?: boolean pressed?: boolean labelClassName?: string } function Button({ className, variant = "default", size = "default", disabled, loading = false, loadingLabel = "Loading", leftIcon, rightIcon, iconOnly = false, fullWidth = false, pressed = false, labelClassName, children, "aria-label": ariaLabel, ...props }: ButtonProps) { const isDisabled = disabled || loading const resolvedSize = iconOnly && (size === "default" || size === "md") ? "icon" : size return ( {loading ? ( ) } export { Button, buttonVariants }