import { Loader2 } from 'lucide-react'; export type SpinnerSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; export type SpinnerVariant = 'default' | 'primary' | 'white'; interface LoadingSpinnerProps { size?: SpinnerSize; variant?: SpinnerVariant; className?: string; } const SIZE_CLASSES: Record = { xs: 'h-3 w-3', sm: 'h-4 w-4', md: 'h-6 w-6', lg: 'h-8 w-8', xl: 'h-12 w-12', }; const VARIANT_CLASSES: Record = { default: 'text-gray-500', primary: 'text-diesel-600', white: 'text-white', }; export function LoadingSpinner({ size = 'md', variant = 'primary', className = '', }: LoadingSpinnerProps) { return ( ); } // Full page loading state interface PageLoaderProps { message?: string; } export function PageLoader({ message = 'Cargando...' }: PageLoaderProps) { return (

{message}

); } // Inline loading state (for buttons, etc.) interface InlineLoaderProps { size?: SpinnerSize; variant?: SpinnerVariant; } export function InlineLoader({ size = 'sm', variant = 'primary' }: InlineLoaderProps) { return ( ); } // Overlay loading state interface LoadingOverlayProps { isLoading: boolean; message?: string; children: React.ReactNode; } export function LoadingOverlay({ isLoading, message, children }: LoadingOverlayProps) { return (
{children} {isLoading && (
{message &&

{message}

}
)}
); } // Skeleton loader for content placeholders interface SkeletonProps { className?: string; variant?: 'text' | 'circular' | 'rectangular'; width?: string | number; height?: string | number; } export function Skeleton({ className = '', variant = 'text', width, height, }: SkeletonProps) { const baseClasses = 'animate-pulse bg-gray-200'; const variantClasses = { text: 'rounded', circular: 'rounded-full', rectangular: 'rounded-lg', }; const style: React.CSSProperties = {}; if (width) style.width = typeof width === 'number' ? `${width}px` : width; if (height) style.height = typeof height === 'number' ? `${height}px` : height; return (
); } // Pre-configured skeleton rows export function SkeletonText({ lines = 3 }: { lines?: number }) { return (
{Array.from({ length: lines }).map((_, i) => ( ))}
); } export function SkeletonCard() { return (
); }