'use client' import { Card, CardContent, CardHeader } from '@/components/ui/card' import { Skeleton } from '@/components/ui/skeleton' import { Loader2 } from 'lucide-react' // Generic loading spinner export function LoadingSpinner({ size = 'default', className = '' }: { size?: 'sm' | 'default' | 'lg' className?: string }) { const sizeClasses = { sm: 'h-4 w-4', default: 'h-6 w-6', lg: 'h-8 w-8' } return ( ) } // Full page loading export function PageLoading({ message = 'Loading...' }: { message?: string }) { return (

{message}

) } // Dashboard stats loading export function StatsLoading() { return (
{Array.from({ length: 4 }).map((_, i) => ( ))}
) } // Table loading export function TableLoading({ rows = 5, columns = 4 }: { rows?: number; columns?: number }) { return (
{/* Table header */}
{Array.from({ length: columns }).map((_, i) => ( ))}
{/* Table rows */} {Array.from({ length: rows }).map((_, rowIndex) => (
{Array.from({ length: columns }).map((_, colIndex) => ( ))}
))}
) } // Calendar loading export function CalendarLoading() { return (
{/* Calendar header */}
{Array.from({ length: 7 }).map((_, i) => ( ))}
{/* Calendar body */} {Array.from({ length: 5 }).map((_, weekIndex) => (
{Array.from({ length: 7 }).map((_, dayIndex) => (
))}
))}
) } // Form loading export function FormLoading() { return ( {/* Form fields */} {Array.from({ length: 6 }).map((_, i) => (
))} {/* Form actions */}
) } // Chart loading export function ChartLoading({ height = 300 }: { height?: number }) { return (
{Array.from({ length: 8 }).map((_, i) => ( ))}
{Array.from({ length: 8 }).map((_, i) => ( ))}
) } // List loading export function ListLoading({ items = 5 }: { items?: number }) { return (
{Array.from({ length: items }).map((_, i) => (
))}
) } // Image grid loading export function ImageGridLoading({ count = 12 }: { count?: number }) { return (
{Array.from({ length: count }).map((_, i) => (
))}
) } // Button loading state export function ButtonLoading({ children, isLoading, ...props }: { children: React.ReactNode isLoading: boolean [key: string]: any }) { return ( ) } // Inline loading for small components export function InlineLoading({ text = 'Loading...' }: { text?: string }) { return (
{text}
) }