import * as React from 'react'; import { Slot } from '@radix-ui/react-slot'; import { cva, type VariantProps } from 'class-variance-authority'; import { cn } from '../utils/cn'; import { Loader2 } from 'lucide-react'; const buttonVariants = cva( 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--accent)] focus-visible:ring-offset-2 focus-visible:ring-offset-[var(--background)] disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0', { variants: { variant: { default: 'bg-[var(--accent)] text-[var(--accent-foreground)] hover:bg-[var(--accent-hover)]', destructive: 'bg-[var(--error)] text-white hover:bg-[var(--error)]/90', outline: 'border border-[var(--border)] bg-transparent hover:bg-[var(--surface-100)] hover:border-[var(--border-hover)]', secondary: 'bg-[var(--surface-200)] text-[var(--text-primary)] hover:bg-[var(--surface-300)]', ghost: 'hover:bg-[var(--surface-100)] hover:text-[var(--text-primary)]', link: 'text-[var(--accent)] underline-offset-4 hover:underline', }, size: { default: 'h-9 px-4 py-2', sm: 'h-8 rounded-md px-3 text-xs', lg: 'h-10 rounded-md px-8', icon: 'h-9 w-9', }, }, defaultVariants: { variant: 'default', size: 'default', }, } ); export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { asChild?: boolean; loading?: boolean; } const Button = React.forwardRef( ({ className, variant, size, asChild = false, loading, children, disabled, ...props }, ref) => { const Comp = asChild ? Slot : 'button'; return ( {loading && } {children} ); } ); Button.displayName = 'Button'; export { Button, buttonVariants };