import { cn } from '@/lib/utils'; import { Skeleton } from '@/components/ui/skeleton'; interface LoadingSkeletonProps { className?: string; } /** * Table skeleton — mimics a data table with header + rows. */ export function TableSkeleton({ rows = 6, columns = 5 }: { rows?: number; columns?: number }) { return (
{/* Header row */}
{Array.from({ length: columns }).map((_, i) => ( ))}
{/* Data rows */} {Array.from({ length: rows }).map((_, rowIdx) => (
{Array.from({ length: columns }).map((_, colIdx) => ( ))}
))}
); } /** * Card skeleton — mimics a content card. */ export function CardSkeleton({ className }: LoadingSkeletonProps) { return (
); } /** * Form skeleton — mimics a form with labeled inputs. */ export function FormSkeleton({ fields = 4 }: { fields?: number }) { return (
{Array.from({ length: fields }).map((_, i) => (
))}
); } /** * Grid skeleton — a responsive card grid. */ export function GridSkeleton({ cards = 6 }: { cards?: number }) { return (
{Array.from({ length: cards }).map((_, i) => ( ))}
); } /** * Page-level loading skeleton — header + content area. */ export function PageSkeleton() { return (
{/* Page header */}
{/* Content */}
); }