'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}
{message}
This may take a moment...