'use client'; import React from 'react'; import { clsx } from 'clsx'; import { twMerge } from 'tailwind-merge'; export type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'success'; export type ButtonSize = 'sm' | 'md' | 'lg'; export interface ButtonProps extends React.ButtonHTMLAttributes { variant?: ButtonVariant; size?: ButtonSize; loading?: boolean; children: React.ReactNode; className?: string; } const variantStyles: Record = { primary: 'bg-indigo-500 text-white hover:bg-indigo-400 active:bg-indigo-600 focus-visible:ring-indigo-500/50', secondary: 'bg-gray-700 text-gray-200 hover:bg-gray-600 active:bg-gray-800 focus-visible:ring-gray-500/50', ghost: 'bg-transparent text-gray-300 hover:bg-gray-800 hover:text-gray-100 active:bg-gray-700 focus-visible:ring-gray-500/50', danger: 'bg-red-500/10 text-red-400 hover:bg-red-500/20 active:bg-red-500/30 focus-visible:ring-red-500/50', success: 'bg-emerald-500/10 text-emerald-400 hover:bg-emerald-500/20 active:bg-emerald-500/30 focus-visible:ring-emerald-500/50', }; const sizeStyles: Record = { sm: 'px-3 py-1.5 text-xs gap-1.5', md: 'px-4 py-2 text-sm gap-2', lg: 'px-6 py-3 text-base gap-2.5', }; const Spinner: React.FC<{ className?: string }> = ({ className }) => ( ); export const Button = React.forwardRef( ( { variant = 'primary', size = 'md', loading = false, disabled, children, className, ...props }, ref, ) => { const isDisabled = disabled || loading; return ( ); }, ); Button.displayName = 'Button';