import { cn } from '../utils/cn'; interface SkeletonProps { className?: string; variant?: 'default' | 'text' | 'circular' | 'rectangular'; width?: string | number; height?: string | number; animation?: 'pulse' | 'wave' | 'none'; } export function Skeleton({ className = '', variant = 'default', width, height, animation = 'pulse', }: SkeletonProps) { const baseClasses = 'bg-surface-strong'; const variantClasses = { default: 'rounded', text: 'h-4 rounded-md', circular: 'rounded-full', rectangular: 'rounded-none', }; const animationClasses = { pulse: 'animate-pulse', wave: 'animate-wave', none: '', }; const style = { width: width !== undefined ? (typeof width === 'number' ? `${width}px` : width) : undefined, height: height !== undefined ? (typeof height === 'number' ? `${height}px` : height) : undefined, }; return (
); } interface SkeletonTextProps { lines?: number; className?: string; lineClassName?: string; } export function SkeletonText({ lines = 3, className = '', lineClassName = '' }: SkeletonTextProps) { return (
{Array.from({ length: lines }).map((_, i) => ( 1 ? 'w-3/4' : 'w-full')} /> ))}
); } interface SkeletonAvatarProps { size?: number | 'sm' | 'md' | 'lg'; className?: string; } export function SkeletonAvatar({ size = 'md', className = '' }: SkeletonAvatarProps) { const sizeMap = { sm: 32, md: 40, lg: 56, }; const pixelSize = typeof size === 'number' ? size : sizeMap[size]; return ; } interface SkeletonCardProps { className?: string; showAvatar?: boolean; showTitle?: boolean; showText?: boolean; textLines?: number; } export function SkeletonCard({ className = '', showAvatar = false, showTitle = true, showText = true, textLines = 3, }: SkeletonCardProps) { return (
{showAvatar && (
)} {showTitle && } {showText && }
); } interface SkeletonTableProps { rows?: number; columns?: number; className?: string; showHeader?: boolean; } export function SkeletonTable({ rows = 5, columns = 4, className = '', showHeader = true, }: SkeletonTableProps) { return (
{showHeader && ( {Array.from({ length: columns }).map((_, i) => ( ))} )} {Array.from({ length: rows }).map((_, rowIndex) => ( {Array.from({ length: columns }).map((_, colIndex) => ( ))} ))}
); } interface SkeletonButtonProps { className?: string; width?: string | number; } export function SkeletonButton({ className = '', width }: SkeletonButtonProps) { return ( ); } interface PageLoaderProps { message?: string; className?: string; } export function PageLoader({ message = 'Loading...', className = '' }: PageLoaderProps) { return (

{message}

); } interface InlineLoaderProps { size?: 'sm' | 'md' | 'lg'; className?: string; } export function InlineLoader({ size = 'md', className = '' }: InlineLoaderProps) { const sizeMap = { sm: 'h-4 w-4 border-2', md: 'h-6 w-6 border-[3px]', lg: 'h-8 w-8 border-4', }; return (
); } export { SkeletonTable as SkeletonTableExport };