'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 (
)
}
// 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}
)
}