import { forwardRef, type ButtonHTMLAttributes } from 'react'; import { motion } from 'framer-motion'; import { cn } from '@/lib/utils'; export interface ButtonProps extends Omit, 'onDrag' | 'onDragStart' | 'onDragEnd' | 'onAnimationStart'> { variant?: 'primary' | 'secondary' | 'outline' | 'ghost'; size?: 'sm' | 'md' | 'lg'; isLoading?: boolean; } const Button = forwardRef( ( { className, variant = 'primary', size = 'md', isLoading = false, disabled, children, ...props }, ref ) => { const baseStyles = 'inline-flex items-center justify-center font-semibold rounded-xl transition-all duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:opacity-40 disabled:cursor-not-allowed'; const variants = { primary: 'bg-gradient-accent text-white hover:brightness-110 focus-visible:ring-[#fe7400] shadow-sm hover:shadow-md active:brightness-95', secondary: 'bg-[#333d49] text-white hover:bg-[#252d36] focus-visible:ring-[#333d49] shadow-sm hover:shadow-md', outline: 'border-2 border-gray-200 text-[#333d49] hover:border-[#333d49] hover:bg-gray-50 focus-visible:ring-[#333d49]', ghost: 'text-[#333d49] hover:bg-gray-100/80 focus-visible:ring-[#333d49]', }; const sizes = { sm: 'px-4 py-2 text-sm', md: 'px-6 py-2.5 text-sm', lg: 'px-8 py-3.5 text-base', }; return ( {isLoading ? ( <> Processing... ) : ( children )} ); } ); Button.displayName = 'Button'; export { Button };