'use client'; import React from 'react'; import { LoadingWrapperProps } from './types'; /** * 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: 'text-xs', card: 'h-24', }, md: { spinner: 'w-10 h-10 border-2', inline: 'text-sm', card: 'h-32', }, lg: { spinner: 'w-16 h-16 border-4', inline: 'text-base', 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 ( ); }