import 'package:flutter/material.dart'; /// Splash screen shown while checking authentication status class SplashScreen extends StatefulWidget { const SplashScreen({super.key}); @override State createState() => _SplashScreenState(); } class _SplashScreenState extends State with SingleTickerProviderStateMixin { late AnimationController _controller; late Animation _fadeAnimation; late Animation _scaleAnimation; @override void initState() { super.initState(); _controller = AnimationController( duration: const Duration(milliseconds: 800), vsync: this, ); _fadeAnimation = Tween(begin: 0.0, end: 1.0).animate( CurvedAnimation( parent: _controller, curve: Curves.easeIn, ), ); _scaleAnimation = Tween(begin: 0.8, end: 1.0).animate( CurvedAnimation( parent: _controller, curve: Curves.easeOutBack, ), ); _controller.forward(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { final theme = Theme.of(context); return Scaffold( backgroundColor: theme.colorScheme.primary, body: SafeArea( child: Center( child: FadeTransition( opacity: _fadeAnimation, child: ScaleTransition( scale: _scaleAnimation, child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // App Icon/Logo Container( width: 120, height: 120, decoration: BoxDecoration( color: Colors.white, borderRadius: BorderRadius.circular(24), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.2), blurRadius: 20, offset: const Offset(0, 10), ), ], ), child: Icon( Icons.point_of_sale_rounded, size: 64, color: theme.colorScheme.primary, ), ), const SizedBox(height: 32), // App Name Text( 'Retail POS', style: theme.textTheme.headlineMedium?.copyWith( color: Colors.white, fontWeight: FontWeight.bold, letterSpacing: 1.2, ), ), const SizedBox(height: 8), // Subtitle Text( 'Point of Sale System', style: theme.textTheme.bodyLarge?.copyWith( color: Colors.white.withOpacity(0.9), letterSpacing: 0.5, ), ), const SizedBox(height: 48), // Loading Indicator SizedBox( width: 40, height: 40, child: CircularProgressIndicator( strokeWidth: 3, valueColor: AlwaysStoppedAnimation( Colors.white.withOpacity(0.9), ), ), ), const SizedBox(height: 16), // Loading Text Text( 'Loading...', style: theme.textTheme.bodyMedium?.copyWith( color: Colors.white.withOpacity(0.8), ), ), ], ), ), ), ), ), ); } }