import React from 'react' import { Loader2 } from 'lucide-react' // ─── Button ─────────────────────────────────────────────────────────────────── type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' type ButtonSize = 'sm' | 'md' | 'lg' interface ButtonProps extends React.ButtonHTMLAttributes { variant?: ButtonVariant size?: ButtonSize loading?: boolean icon?: React.ReactNode } const variantClasses: Record = { primary: 'bg-accent-violet hover:bg-accent-violet-light text-white shadow-glow hover:shadow-lg transition-all', secondary: 'bg-bg-elevated border border-bg-border text-text-primary hover:border-accent-violet hover:text-accent-violet-light transition-all', ghost: 'text-text-secondary hover:text-text-primary hover:bg-bg-elevated transition-all', danger: 'bg-danger/20 border border-danger/50 text-danger hover:bg-danger/30 transition-all', } const sizeClasses: Record = { sm: 'px-3 py-1.5 text-sm', md: 'px-4 py-2 text-sm', lg: 'px-6 py-3 text-base', } export function Button({ variant = 'primary', size = 'md', loading, icon, children, disabled, className = '', ...props }: ButtonProps) { return ( ) } // ─── Input ──────────────────────────────────────────────────────────────────── interface InputProps extends React.InputHTMLAttributes { label?: string error?: string hint?: string } export function Input({ label, error, hint, className = '', ...props }: InputProps) { return (
{label && ( )} {error &&

{error}

} {hint && !error &&

{hint}

}
) } // ─── Textarea ───────────────────────────────────────────────────────────────── interface TextareaProps extends React.TextareaHTMLAttributes { label?: string error?: string hint?: string } export function Textarea({ label, error, hint, className = '', ...props }: TextareaProps) { return (
{label && ( )}