/** * Button Component * Reusable button with multiple variants and sizes */ import React, { ButtonHTMLAttributes, ReactNode } from 'react'; export interface ButtonProps extends ButtonHTMLAttributes { variant?: 'primary' | 'secondary' | 'ghost' | 'danger'; size?: 'sm' | 'md' | 'lg'; loading?: boolean; icon?: ReactNode; children: ReactNode; } export const Button: React.FC = ({ variant = 'primary', size = 'md', loading = false, icon, children, disabled, className = '', ...props }) => { const baseStyles = 'inline-flex items-center justify-center font-semibold rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2'; const variantStyles = { primary: 'bg-gradient-to-r from-purple-600 to-pink-600 text-white hover:from-purple-700 hover:to-pink-700 focus:ring-purple-500', secondary: 'bg-gray-800 text-gray-100 border border-gray-700 hover:bg-gray-700 focus:ring-gray-600', ghost: 'bg-transparent text-gray-300 hover:bg-gray-800 focus:ring-gray-700', danger: 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500', }; const sizeStyles = { sm: 'px-3 py-1.5 text-sm', md: 'px-4 py-2 text-base', lg: 'px-6 py-3 text-lg', }; const disabledStyles = 'opacity-50 cursor-not-allowed'; return ( ); };