import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../game/models/season.dart'; import '../../game/models/stage.dart'; import '../../l10n/gen/app_localizations.dart'; import '../../state/providers.dart'; import '../widgets/season_background.dart'; import 'game_screen.dart'; import 'season_map_screen.dart'; class HomeScreen extends ConsumerWidget { const HomeScreen({super.key}); static const _logoColors = [ Color(0xFFFF7EB3), Color(0xFFFFD166), Color(0xFF6FCDF5), Color(0xFF7EDB9C), ]; @override Widget build(BuildContext context, WidgetRef ref) { final l10n = AppLocalizations.of(context)!; final streak = ref.watch(streakProvider); final best = ref.watch(endlessBestProvider); return Scaffold( backgroundColor: Colors.transparent, body: Stack( fit: StackFit.expand, children: [ const SeasonBackground(theme: SeasonTheme.fallback), SafeArea( child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ _logoMark(), const SizedBox(height: 18), Text( l10n.appTitle, style: Theme.of(context) .textTheme .displaySmall ?.copyWith(fontWeight: FontWeight.w900), ), if (streak.current > 0) ...[ const SizedBox(height: 10), Chip( avatar: const Icon( Icons.local_fire_department, color: Colors.deepOrange, size: 20, ), label: Text( '${streak.current}', style: Theme.of(context).textTheme.titleMedium, ), ), ], const SizedBox(height: 44), FilledButton( style: FilledButton.styleFrom( padding: const EdgeInsets.symmetric( horizontal: 56, vertical: 18), textStyle: Theme.of(context).textTheme.titleLarge, ), onPressed: () { if (!(ModalRoute.of(context)?.isCurrent ?? true)) return; Navigator.of(context).push( MaterialPageRoute( builder: (_) => const SeasonMapScreen()), ); }, child: Text(l10n.adventure), ), const SizedBox(height: 14), OutlinedButton( style: OutlinedButton.styleFrom( padding: const EdgeInsets.symmetric( horizontal: 40, vertical: 14), textStyle: Theme.of(context).textTheme.titleMedium, ), onPressed: () { if (!(ModalRoute.of(context)?.isCurrent ?? true)) return; ref.read(seasonFlowProvider.notifier).clear(); ref.read(gameSessionProvider.notifier).startStage( StageConfig.endless( seed: DateTime.now().millisecondsSinceEpoch, ), ); Navigator.of(context).push( MaterialPageRoute( builder: (_) => const GameScreen()), ); }, child: Text(l10n.classic), ), if (best > 0) ...[ const SizedBox(height: 10), Text( l10n.bestScore(best), style: TextStyle( color: Colors.white.withValues(alpha: 0.55), ), ), ], ], ), ), ), ], ), ); } Widget _logoMark() { return SizedBox( width: 96, height: 96, child: GridView.count( crossAxisCount: 2, mainAxisSpacing: 5, crossAxisSpacing: 5, physics: const NeverScrollableScrollPhysics(), children: [ for (final color in _logoColors) DecoratedBox( decoration: BoxDecoration( borderRadius: BorderRadius.circular(11), gradient: LinearGradient( begin: Alignment.topLeft, end: Alignment.bottomRight, colors: [ Color.lerp(color, Colors.white, 0.28)!, color, Color.lerp(color, Colors.black, 0.22)!, ], ), boxShadow: [ BoxShadow( color: color.withValues(alpha: 0.45), blurRadius: 14, ), ], ), ), ], ), ); } }