/** * LoadingState component * * Displays loading indicators with progress stages for the resolution process. */ export interface LoadingStateProps { stage?: 'resolving' | 'fetching-manifest' | 'loading-site' | 'general'; message?: string; progress?: { current: number; total: number; }; } const stageMessages: Record = { resolving: 'Resolving handle...', 'fetching-manifest': 'Fetching manifest...', 'loading-site': 'Loading site files...', general: 'Loading...', }; export function LoadingState({ stage = 'general', message, progress }: LoadingStateProps) { const displayMessage = message || stageMessages[stage]; return (
{/* Spinner */}
{/* Message */}

{displayMessage}

{/* Progress indicator (optional) */} {progress && (
{progress.current} / {progress.total} files
)}
); } /** * Compact inline loading indicator */ export interface InlineLoadingProps { message?: string; size?: 'sm' | 'md' | 'lg'; } export function InlineLoading({ message, size = 'sm' }: InlineLoadingProps) { const sizeClasses = { sm: 'w-4 h-4 border-2', md: 'w-6 h-6 border-2', lg: 'w-8 h-8 border-3', }; return (
{message && {message}}
); } /** * Skeleton screen for content placeholder */ export interface SkeletonProps { className?: string; lines?: number; } export function Skeleton({ className = '', lines = 3 }: SkeletonProps) { return (
{Array.from({ length: lines }).map((_, i) => (
))}
); }