import { Stack } from '@/ui/primitives/Stack'; import { LoadingWrapperProps } from '@/ui/state-types'; import { Text } from '@/ui/Text'; import { Box } from 'lucide-react'; /** * LoadingWrapper Component * * Provides consistent loading states with multiple variants: * - spinner: Traditional loading spinner (default) * - skeleton: Skeleton screens for better UX * - full-screen: Centered in viewport * - inline: Compact inline loading * - card: Loading card placeholders * * All variants are fully accessible with ARIA labels and keyboard support. */ export function LoadingWrapper({ variant = 'spinner', message = 'Loading...', className = '', size = 'md', skeletonCount = 3, cardConfig, ariaLabel = 'Loading content', }: LoadingWrapperProps) { // Size mappings for different variants const sizeClasses = { sm: { spinner: 'w-4 h-4 border-2', inline: 'xs' as const, card: 'h-24', }, md: { spinner: 'w-10 h-10 border-2', inline: 'sm' as const, card: 'h-32', }, lg: { spinner: 'w-16 h-16 border-4', inline: 'base' as const, card: 'h-40', }, }; const spinnerSize = sizeClasses[size].spinner; const inlineSize = sizeClasses[size].inline; const cardHeight = cardConfig?.height || sizeClasses[size].card; // Render different variants switch (variant) { case 'spinner': return ( {message} ); case 'skeleton': return ( {Array.from({ length: skeletonCount }).map((_, index) => ( ))} ); case 'full-screen': return ( {message} This may take a moment... ); case 'inline': return ( {message} ); case 'card': const cardCount = cardConfig?.count || 3; const cardClassName = cardConfig?.className || ''; return ( {Array.from({ length: cardCount }).map((_, index) => ( ))} ); default: return null; } } /** * Convenience component for full-screen loading */ export function FullScreenLoading({ message = 'Loading...', className = '' }: Pick) { return ( ); } /** * Convenience component for inline loading */ export function InlineLoading({ message = 'Loading...', size = 'sm', className = '' }: Pick) { return ( ); } /** * Convenience component for skeleton loading */ export function SkeletonLoading({ skeletonCount = 3, className = '' }: Pick) { return ( ); } /** * Convenience component for card loading */ export function CardLoading({ cardConfig, className = '' }: Pick) { return ( ); }