import { Box } from '@/ui/Box';
import { LoadingWrapperProps } from '@/ui/state-types';
import { Text } from '@/ui/Text';
export function LoadingWrapper({
variant = 'spinner',
message = 'Loading...',
size = 'md',
skeletonCount = 3,
cardConfig,
ariaLabel = 'Loading content',
}: LoadingWrapperProps) {
const sizeMap = {
sm: { spinner: '1rem', inline: 'xs' as const, card: '6rem' },
md: { spinner: '2.5rem', inline: 'sm' as const, card: '8rem' },
lg: { spinner: '4rem', inline: 'base' as const, card: '10rem' },
};
const spinnerSize = sizeMap[size].spinner;
const inlineSize = sizeMap[size].inline;
const cardHeight = cardConfig?.height || sizeMap[size].card;
const Spinner = ({ size: s }: { size: string }) => (
);
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;
return (
{Array.from({ length: cardCount }).map((_, index) => (
))}
);
default:
return null;
}
}
export function FullScreenLoading({ message = 'Loading...' }: Pick) {
return ;
}
export function InlineLoading({ message = 'Loading...', size = 'sm' }: Pick) {
return ;
}
export function SkeletonLoading({ skeletonCount = 3 }: Pick) {
return ;
}
export function CardLoading({ cardConfig }: Pick) {
return ;
}