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 ( +
+
+
+
+
+ {message} +
+ ); + } + + const containerClasses = variant === 'full' + ? "fixed inset-0 bg-background/95 backdrop-blur-sm z-50" + : "absolute inset-0 bg-background/80 backdrop-blur-sm z-40"; + + return ( +
+
+
+ {/* Logo Animation */} +
+
+
+ Ae +
+
+
+
+ + {/* Animated Loading Bars */} +
+
+ {[...Array(5)].map((_, i) => ( +
+ ))} +
+
+ + {/* Progress Bar */} + {showProgress && ( +
+
+
+
+
{Math.round(progress)}%
+
+ )} + + {/* Loading Message */} +
+

+ {currentMessage} +

+
+ Please wait while we prepare your experience +
+
+ + {/* Matrix-style Effect */} +
+ {[...Array(20)].map((_, i) => ( +
+ {Math.random().toString(2).substr(2, 1)} +
+ ))} +
+
+
+
+ ); +}