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 */}
);
}