'use client' import React from 'react' export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' export type ButtonSize = 'sm' | 'md' | 'lg' export interface ButtonProps extends React.ButtonHTMLAttributes { variant?: ButtonVariant size?: ButtonSize isLoading?: boolean fullWidth?: boolean children: React.ReactNode } const variantStyles: Record = { primary: 'bg-primary-500 hover:bg-primary-600 active:bg-primary-700 text-white shadow-sm disabled:bg-primary-300', secondary: 'bg-secondary-500 hover:bg-secondary-600 active:bg-secondary-700 text-white shadow-sm disabled:bg-secondary-300', ghost: 'bg-transparent hover:bg-gray-100 active:bg-gray-200 text-gray-700 dark:hover:bg-gray-800 dark:active:bg-gray-700 dark:text-gray-200', danger: 'bg-error-500 hover:bg-error-600 active:bg-error-700 text-white shadow-sm disabled:bg-error-300', } const sizeStyles: Record = { sm: 'px-3 py-1.5 text-sm', md: 'px-4 py-2 text-base', lg: 'px-6 py-3 text-lg', } export const Button = React.forwardRef( ( { variant = 'primary', size = 'md', isLoading = false, fullWidth = false, className = '', disabled, children, ...props }, ref ) => { const baseStyles = 'inline-flex items-center justify-center font-semibold rounded-md transition-colors duration-150 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-60' const widthStyles = fullWidth ? 'w-full' : '' const combinedClassName = `${baseStyles} ${variantStyles[variant]} ${sizeStyles[size]} ${widthStyles} ${className}`.trim() return ( ) } ) Button.displayName = 'Button'