/** * 🔘 Button Component * Componente de botão reutilizável com múltiplas variações */ import React from 'react'; interface ButtonProps extends React.ButtonHTMLAttributes { variant?: 'primary' | 'secondary' | 'ghost' | 'danger'; size?: 'sm' | 'md' | 'lg'; isLoading?: boolean; fullWidth?: boolean; children: React.ReactNode; } const Button = React.forwardRef( ( { variant = 'primary', size = 'md', isLoading = false, fullWidth = false, disabled, className = '', children, ...props }, ref, ) => { // Estilos base const baseStyles = 'font-semibold rounded-lg transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2'; // Estilos por tamanho const sizeStyles = { sm: 'px-3 py-1.5 text-sm', md: 'px-4 py-2 text-base', lg: 'px-6 py-3 text-lg', }; // Estilos por variante const variantStyles = { primary: 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500 disabled:bg-blue-400', secondary: 'bg-gray-200 text-gray-900 hover:bg-gray-300 focus:ring-gray-400 disabled:bg-gray-100', ghost: 'bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-gray-400 disabled:text-gray-400', danger: 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500 disabled:bg-red-400', }; // Largura total const widthStyle = fullWidth ? 'w-full' : ''; // Estado desabilitado const isDisabled = disabled || isLoading; return ( ); }, ); Button.displayName = 'Button'; export default Button;