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