diff --git a/client/components/LoadingScreen.tsx b/client/components/LoadingScreen.tsx new file mode 100644 index 00000000..d838b4ae --- /dev/null +++ b/client/components/LoadingScreen.tsx @@ -0,0 +1,152 @@ +import { useEffect, useState } from "react"; +import { cn } from "@/lib/utils"; + +interface LoadingScreenProps { + message?: string; + variant?: 'full' | 'overlay' | 'inline'; + size?: 'sm' | 'md' | 'lg'; + showProgress?: boolean; + duration?: number; +} + +export default function LoadingScreen({ + message = "Loading...", + variant = 'full', + size = 'md', + showProgress = false, + duration = 3000 +}: LoadingScreenProps) { + const [progress, setProgress] = useState(0); + const [currentMessage, setCurrentMessage] = useState(message); + + useEffect(() => { + if (showProgress) { + const interval = setInterval(() => { + setProgress(prev => { + const newProgress = prev + (100 / (duration / 100)); + return newProgress > 100 ? 100 : newProgress; + }); + }, 100); + + return () => clearInterval(interval); + } + }, [showProgress, duration]); + + useEffect(() => { + const messages = [ + "Initializing AeThex systems...", + "Loading quantum processors...", + "Calibrating neural networks...", + "Synchronizing data streams...", + "Preparing your experience..." + ]; + + if (variant === 'full') { + let index = 0; + const interval = setInterval(() => { + setCurrentMessage(messages[index % messages.length]); + index++; + }, 800); + + return () => clearInterval(interval); + } + }, [variant]); + + const sizeClasses = { + sm: 'h-4 w-4', + md: 'h-8 w-8', + lg: 'h-12 w-12' + }; + + if (variant === 'inline') { + return ( +