Spaces:
Running
Running
| import * as React from 'react'; | |
| export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> { | |
| variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger'; | |
| size?: 'sm' | 'md' | 'lg' | 'icon'; | |
| } | |
| export default function Button({ | |
| children, | |
| className = '', | |
| variant = 'primary', | |
| size = 'md', | |
| type = 'button', | |
| ...props | |
| }: ButtonProps) { | |
| // Styles for different variants | |
| const baseStyle = 'inline-flex items-center justify-center font-medium transition-all duration-200 rounded-full focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-neutral-900 disabled:opacity-50 disabled:pointer-events-none active:scale-[0.98] cursor-pointer'; | |
| const variants = { | |
| primary: 'bg-neutral-900 text-white hover:bg-neutral-800 border border-neutral-900 shadow-sm', | |
| secondary: 'bg-neutral-100 text-neutral-800 hover:bg-neutral-200 border border-transparent', | |
| outline: 'bg-white border border-neutral-200 text-neutral-700 hover:bg-neutral-50 hover:border-neutral-300', | |
| ghost: 'text-neutral-600 hover:bg-neutral-100 hover:text-neutral-900 border border-transparent', | |
| danger: 'bg-red-50 text-red-600 border border-red-200 hover:bg-red-100 active:bg-red-200', | |
| }; | |
| const sizes = { | |
| sm: 'px-3 py-1.5 text-xs font-semibold', | |
| md: 'px-4 py-2.5 text-sm', | |
| lg: 'px-6 py-3.5 text-base', | |
| icon: 'p-2', | |
| }; | |
| return ( | |
| <button | |
| type={type} | |
| className={`${baseStyle} ${variants[variant]} ${sizes[size]} ${className}`} | |
| {...props} | |
| > | |
| {children} | |
| </button> | |
| ); | |
| } | |