Spaces:
Runtime error
Runtime error
| import React from 'react'; | |
| interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { | |
| variant?: 'primary' | 'secondary' | 'danger' | 'ghost'; | |
| size?: 'sm' | 'md' | 'lg'; | |
| isLoading?: boolean; | |
| icon?: React.ReactNode; | |
| children: React.ReactNode; | |
| } | |
| export const Button: React.FC<ButtonProps> = ({ | |
| variant = 'primary', | |
| size = 'md', | |
| isLoading = false, | |
| icon, | |
| children, | |
| className = '', | |
| disabled, | |
| ...props | |
| }) => { | |
| const variantClasses = { | |
| primary: 'btn-primary', | |
| secondary: 'btn-secondary', | |
| danger: 'btn-danger', | |
| ghost: 'px-4 py-2 text-slate-600 hover:text-slate-900 hover:bg-slate-100 rounded-xl transition-colors duration-200', | |
| }; | |
| const sizeClasses = { | |
| sm: 'text-sm px-4 py-2', | |
| md: 'text-sm px-6 py-3', | |
| lg: 'text-base px-8 py-4', | |
| }; | |
| return ( | |
| <button | |
| className={`${variantClasses[variant]} ${sizeClasses[size]} inline-flex items-center gap-2 font-semibold transition-all duration-200 ${disabled || isLoading ? 'opacity-50 cursor-not-allowed pointer-events-none' : ''} ${className}`} | |
| disabled={disabled || isLoading} | |
| {...props} | |
| > | |
| {isLoading ? ( | |
| <svg className="w-4 h-4 animate-spin" viewBox="0 0 24 24" fill="none"> | |
| <circle className="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" /> | |
| <path className="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z" /> | |
| </svg> | |
| ) : icon} | |
| {children} | |
| </button> | |
| ); | |
| }; | |