// src/components/ui/Button.tsx import React from 'react'; import { clsx } from 'clsx'; import LoadingSpinner from './LoadingSpinner'; interface ButtonProps extends React.ButtonHTMLAttributes { variant?: 'primary' | 'secondary' | 'outline' | 'danger'; size?: 'sm' | 'md' | 'lg'; isLoading?: boolean; children: React.ReactNode; } const Button: React.FC = ({ variant = 'primary', size = 'md', isLoading = false, className, children, disabled, ...props }) => { const baseClasses = 'inline-flex items-center justify-center font-medium rounded-xl transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2'; const variantClasses = { primary: 'bg-primary-500 text-white hover:bg-primary-600 focus:ring-primary-500 shadow-soft hover:shadow-medium', secondary: 'bg-gray-500 text-white hover:bg-gray-600 focus:ring-gray-500 shadow-soft hover:shadow-medium', outline: 'border border-gray-300 text-gray-700 hover:bg-gray-50 focus:ring-primary-500', danger: 'bg-red-500 text-white hover:bg-red-600 focus:ring-red-500 shadow-soft hover:shadow-medium', }; const sizeClasses = { sm: 'px-3 py-1.5 text-sm', md: 'px-4 py-2.5 text-sm', lg: 'px-6 py-3 text-base', }; const isDisabled = disabled || isLoading; return ( ); }; export default Button;