| 123456789101112131415161718192021222324252627282930313233343536373839404142 |
- import type { ButtonHTMLAttributes, ReactNode } from 'react';
- interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
- variant?: 'primary' | 'secondary' | 'danger' | 'ghost';
- size?: 'sm' | 'md' | 'lg';
- children: ReactNode;
- }
- export function Button({
- variant = 'primary',
- size = 'md',
- className = '',
- children,
- ...props
- }: ButtonProps) {
- const baseStyles =
- 'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-bambu-dark disabled:opacity-50 disabled:cursor-not-allowed';
- const variants = {
- primary: 'bg-bambu-green hover:bg-bambu-green-light text-white focus:ring-bambu-green',
- secondary:
- 'bg-bambu-dark-tertiary hover:bg-bambu-gray-dark text-white focus:ring-bambu-gray',
- danger: 'bg-red-600 hover:bg-red-700 text-white focus:ring-red-500',
- ghost:
- 'bg-transparent hover:bg-bambu-dark-tertiary text-bambu-gray-light hover:text-white',
- };
- const sizes = {
- sm: 'px-3 py-1.5 text-sm gap-1.5 min-h-[44px] md:min-h-0',
- md: 'px-4 py-2 text-sm gap-2 min-h-[44px] md:min-h-0',
- lg: 'px-6 py-3 text-base gap-2 min-h-[48px] md:min-h-0',
- };
- return (
- <button
- className={`${baseStyles} ${variants[variant]} ${sizes[size]} ${className}`}
- {...props}
- >
- {children}
- </button>
- );
- }
|