/** * Lumina Design System - Reusable UI Components * Modern, premium design aesthetic with smooth animations and clean styling */ import React from 'react'; import { LucideIcon } from 'lucide-react'; // ============================================================================ // Button Components // ============================================================================ interface LuminaButtonProps extends React.ButtonHTMLAttributes { variant?: 'primary' | 'secondary' | 'ghost'; size?: 'sm' | 'md' | 'lg'; icon?: LucideIcon; iconPosition?: 'left' | 'right'; loading?: boolean; children: React.ReactNode; } export const LuminaButton: React.FC = ({ variant = 'primary', size = 'md', icon: Icon, iconPosition = 'right', loading = false, children, className = '', disabled, ...props }) => { const baseClasses = 'inline-flex items-center justify-center font-medium transition-all focus:outline-none focus:ring-2 focus:ring-offset-2'; const variantClasses = { primary: 'bg-indigo-600 text-white hover:bg-indigo-700 focus:ring-indigo-500 shadow-sm', secondary: 'bg-white text-gray-900 border border-gray-300 hover:bg-gray-50 focus:ring-indigo-500', ghost: 'text-indigo-600 hover:bg-indigo-50 focus:ring-indigo-500', }; const sizeClasses = { sm: 'px-3 py-1.5 text-sm rounded-lg', md: 'px-4 py-2.5 text-sm rounded-lg', lg: 'px-6 py-3 text-base rounded-lg', }; const disabledClasses = 'disabled:opacity-70 disabled:cursor-not-allowed'; return ( ); }; // ============================================================================ // Input Components // ============================================================================ interface LuminaInputProps extends React.InputHTMLAttributes { label?: string; error?: string; hint?: string; icon?: LucideIcon; } export const LuminaInput: React.FC = ({ label, error, hint, icon: Icon, className = '', ...props }) => { return (
{label && ( )}
{Icon && (
)}
{error &&

{error}

} {hint && !error &&

{hint}

}
); }; // ============================================================================ // Card Components // ============================================================================ interface LuminaCardProps { children: React.ReactNode; className?: string; padding?: 'none' | 'sm' | 'md' | 'lg'; hover?: boolean; } export const LuminaCard: React.FC = ({ children, className = '', padding = 'md', hover = false, }) => { const paddingClasses = { none: '', sm: 'p-4', md: 'p-6', lg: 'p-8', }; const hoverClasses = hover ? 'hover:shadow-lg hover:-translate-y-0.5 transition-all' : ''; return (
{children}
); }; // ============================================================================ // Badge Components // ============================================================================ interface LuminaBadgeProps { children: React.ReactNode; variant?: 'default' | 'success' | 'warning' | 'error' | 'info'; size?: 'sm' | 'md'; } export const LuminaBadge: React.FC = ({ children, variant = 'default', size = 'md', }) => { const variantClasses = { default: 'bg-gray-100 text-gray-800', success: 'bg-green-100 text-green-800', warning: 'bg-amber-100 text-amber-800', error: 'bg-red-100 text-red-800', info: 'bg-blue-100 text-blue-800', }; const sizeClasses = { sm: 'text-xs px-2 py-0.5', md: 'text-sm px-2.5 py-1', }; return ( {children} ); }; // ============================================================================ // Section Container // ============================================================================ interface LuminaSectionProps { children: React.ReactNode; title?: string; subtitle?: string; className?: string; } export const LuminaSection: React.FC = ({ children, title, subtitle, className = '', }) => { return (
{(title || subtitle) && (
{title &&

{title}

} {subtitle &&

{subtitle}

}
)} {children}
); }; // ============================================================================ // Icon Box Component // ============================================================================ interface LuminaIconBoxProps { icon: LucideIcon; color?: 'indigo' | 'green' | 'amber' | 'red' | 'blue'; size?: 'sm' | 'md' | 'lg'; } export const LuminaIconBox: React.FC = ({ icon: Icon, color = 'indigo', size = 'md', }) => { const colorClasses = { indigo: 'bg-indigo-100 text-indigo-600', green: 'bg-green-100 text-green-600', amber: 'bg-amber-100 text-amber-600', red: 'bg-red-100 text-red-600', blue: 'bg-blue-100 text-blue-600', }; const sizeClasses = { sm: 'w-10 h-10', md: 'w-12 h-12', lg: 'w-16 h-16', }; const iconSizeClasses = { sm: 'w-5 h-5', md: 'w-6 h-6', lg: 'w-8 h-8', }; return (
); }; // ============================================================================ // Feature Card Component // ============================================================================ interface LuminaFeatureCardProps { icon: LucideIcon; title: string; description: string; onClick?: () => void; } export const LuminaFeatureCard: React.FC = ({ icon, title, description, onClick, }) => { return (

{title}

{description}

); }; // ============================================================================ // Loading Spinner // ============================================================================ interface LuminaSpinnerProps { size?: 'sm' | 'md' | 'lg'; className?: string; } export const LuminaSpinner: React.FC = ({ size = 'md', className = '', }) => { const sizeClasses = { sm: 'w-4 h-4', md: 'w-8 h-8', lg: 'w-12 h-12', }; return (
); };