'use client' interface LoadingSpinnerProps { /** Size variant */ size?: 'sm' | 'md' | 'lg' /** Optional label text */ label?: string /** Full page centered */ fullPage?: boolean /** Additional className */ className?: string } const sizeClasses = { sm: 'w-5 h-5 border-2', md: 'w-8 h-8 border-3', lg: 'w-12 h-12 border-4', } export function LoadingSpinner({ size = 'md', label, fullPage = false, className = '', }: LoadingSpinnerProps) { const spinner = (
{label &&

{label}

}
) if (fullPage) { return (
{spinner}
) } return spinner } /** Skeleton placeholder for content loading */ export function Skeleton({ className = '', lines = 1, }: { className?: string lines?: number }) { return (
{Array.from({ length: lines }).map((_, i) => (
1 ? '75%' : '100%' }} /> ))}
) } /** Card-shaped skeleton for dashboard grids */ export function CardSkeleton({ count = 3 }: { count?: number }) { return (
{Array.from({ length: count }).map((_, i) => (
))}
) } /** Table row skeleton */ export function TableSkeleton({ rows = 5, cols = 4 }: { rows?: number; cols?: number }) { return (
{Array.from({ length: rows }).map((_, r) => (
{Array.from({ length: cols }).map((_, c) => (
))}
))}
) }