Pranav_rs
force add frontend files
bc832fa
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>
);
};