patch small issue with trad and theme
This commit is contained in:
@@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../core/config/app_constants.dart';
|
||||
import '../../l10n/app_localizations.dart';
|
||||
import '../providers/repository_provider.dart';
|
||||
import '../providers/theme_provider.dart';
|
||||
import '../widgets/game_over/game_over_header.dart';
|
||||
import '../widgets/game_over/game_over_stats.dart';
|
||||
import '../widgets/game_over/game_over_actions.dart';
|
||||
@@ -44,12 +45,14 @@ class _GameOverPageState extends ConsumerState<GameOverPage> {
|
||||
final int streak = args?['streak'] ?? 0;
|
||||
final int score = args?['score'] ?? 0;
|
||||
|
||||
const darkRed = Color(0xFF9E1B1B);
|
||||
final palette = appPalettes[ref.watch(themeProvider)];
|
||||
final primaryDark = HSLColor.fromColor(palette.primary)
|
||||
.withLightness((HSLColor.fromColor(palette.primary).lightness - 0.12).clamp(0.0, 1.0))
|
||||
.toColor();
|
||||
const silverBg = Color(0xFFC8D1D8);
|
||||
const messageBoxBg = Color(0xFF1B2333);
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: const Color(0xFFD32F2F),
|
||||
backgroundColor: palette.primary,
|
||||
body: _isLoading
|
||||
? const Center(child: CircularProgressIndicator(color: Colors.white))
|
||||
: SingleChildScrollView(
|
||||
@@ -57,10 +60,15 @@ class _GameOverPageState extends ConsumerState<GameOverPage> {
|
||||
padding: const EdgeInsets.all(16.0),
|
||||
child: Column(
|
||||
children: [
|
||||
GameOverHeader(pokemonImage: pokemonImage, pokemonName: pokemonName),
|
||||
const HingeDivider(),
|
||||
GameOverHeader(
|
||||
pokemonImage: pokemonImage,
|
||||
pokemonName: pokemonName,
|
||||
primaryDark: primaryDark,
|
||||
surfaceColor: palette.surface,
|
||||
),
|
||||
HingeDivider(color: primaryDark),
|
||||
Container(
|
||||
decoration: BoxDecoration(color: darkRed, border: Border.all(color: darkRed, width: 4)),
|
||||
decoration: BoxDecoration(color: primaryDark, border: Border.all(color: primaryDark, width: 4)),
|
||||
child: Container(
|
||||
width: double.infinity,
|
||||
padding: const EdgeInsets.all(16),
|
||||
@@ -69,7 +77,7 @@ class _GameOverPageState extends ConsumerState<GameOverPage> {
|
||||
children: [
|
||||
Container(
|
||||
width: double.infinity,
|
||||
color: messageBoxBg,
|
||||
color: palette.surface,
|
||||
padding: const EdgeInsets.all(24),
|
||||
child: Text(
|
||||
AppLocalizations.of(context)!.gameOverMessage,
|
||||
@@ -85,6 +93,8 @@ class _GameOverPageState extends ConsumerState<GameOverPage> {
|
||||
),
|
||||
const SizedBox(height: 16),
|
||||
GameOverActions(
|
||||
primaryColor: palette.primary,
|
||||
primaryDark: primaryDark,
|
||||
onTryAgain: () => Navigator.pop(context, true),
|
||||
onBack: () => Navigator.pop(context, false),
|
||||
),
|
||||
|
||||
@@ -5,6 +5,7 @@ import '../../l10n/app_localizations.dart';
|
||||
import '../providers/gen_filter_provider.dart';
|
||||
import '../providers/game_provider.dart';
|
||||
import '../providers/navigation_provider.dart';
|
||||
import '../providers/theme_provider.dart';
|
||||
import '../widgets/scanline_overlay.dart';
|
||||
import '../widgets/guess/guess_silhouette.dart';
|
||||
import '../widgets/guess/gen_filter_section.dart';
|
||||
@@ -92,6 +93,7 @@ class _GuessPageState extends ConsumerState<GuessPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final state = ref.watch(gameProvider);
|
||||
final palette = appPalettes[ref.watch(themeProvider)];
|
||||
|
||||
if (state.status == GameStatus.loading) {
|
||||
return const Center(child: CircularProgressIndicator());
|
||||
@@ -112,12 +114,13 @@ class _GuessPageState extends ConsumerState<GuessPage> {
|
||||
SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
GuessSilhouette(pokemon: pokemon, isShiny: state.isShiny, isGuessed: isGuessed),
|
||||
GuessSilhouette(pokemon: pokemon, isShiny: state.isShiny, isGuessed: isGuessed, surfaceColor: palette.surface),
|
||||
GenFilterSection(
|
||||
isOpen: _genFilterOpen,
|
||||
onToggleOpen: () => setState(() => _genFilterOpen = !_genFilterOpen),
|
||||
selectedGens: ref.watch(genFilterProvider),
|
||||
onToggle: (i) => ref.read(genFilterProvider.notifier).toggle(i),
|
||||
surfaceColor: palette.surface,
|
||||
),
|
||||
const SizedBox(height: 12),
|
||||
LivesRow(lives: state.lives),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../l10n/app_localizations.dart';
|
||||
import '../providers/navigation_provider.dart';
|
||||
import '../providers/theme_provider.dart';
|
||||
import 'pokemon_list.dart';
|
||||
@@ -56,10 +57,10 @@ class MainPage extends ConsumerWidget {
|
||||
type: BottomNavigationBarType.fixed,
|
||||
selectedItemColor: palette.primary,
|
||||
unselectedItemColor: Colors.grey,
|
||||
items: const [
|
||||
BottomNavigationBarItem(icon: Icon(Icons.grid_view), label: 'LIST'),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.games), label: 'GUESS'),
|
||||
BottomNavigationBarItem(icon: Icon(Icons.settings), label: 'SYSTEM'),
|
||||
items: [
|
||||
BottomNavigationBarItem(icon: const Icon(Icons.grid_view), label: AppLocalizations.of(context)!.navList),
|
||||
BottomNavigationBarItem(icon: const Icon(Icons.games), label: AppLocalizations.of(context)!.navGuess),
|
||||
BottomNavigationBarItem(icon: const Icon(Icons.settings), label: AppLocalizations.of(context)!.navSystem),
|
||||
],
|
||||
),
|
||||
),
|
||||
|
||||
@@ -1,49 +1,80 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../domain/entities/pokemon.dart';
|
||||
import '../providers/locale_provider.dart';
|
||||
import '../providers/repository_provider.dart';
|
||||
import '../providers/theme_provider.dart';
|
||||
import '../widgets/detail/pokemon_detail_top.dart';
|
||||
import '../widgets/detail/pokemon_stats_panel.dart';
|
||||
|
||||
/// Fiche détaillée d'un Pokémon (reçu via les arguments de route).
|
||||
class PokemonDetailPage extends StatefulWidget {
|
||||
class PokemonDetailPage extends ConsumerStatefulWidget {
|
||||
const PokemonDetailPage({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<PokemonDetailPage> createState() => _PokemonDetailPageState();
|
||||
ConsumerState<PokemonDetailPage> createState() => _PokemonDetailPageState();
|
||||
}
|
||||
|
||||
class _PokemonDetailPageState extends State<PokemonDetailPage> {
|
||||
class _PokemonDetailPageState extends ConsumerState<PokemonDetailPage> {
|
||||
bool _isShiny = false;
|
||||
String? _englishGenus;
|
||||
|
||||
@override
|
||||
void didChangeDependencies() {
|
||||
super.didChangeDependencies();
|
||||
_fetchEnglishGenusIfNeeded();
|
||||
}
|
||||
|
||||
Future<void> _fetchEnglishGenusIfNeeded() async {
|
||||
final lang = ref.read(localeProvider).languageCode;
|
||||
if (lang != 'en') return;
|
||||
final pokemon = ModalRoute.of(context)!.settings.arguments as Pokemon;
|
||||
final genus = await ref.read(pokemonRepositoryProvider).getEnglishGenus(pokemon.id);
|
||||
if (mounted && genus != null) setState(() => _englishGenus = genus);
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final pokemon = ModalRoute.of(context)!.settings.arguments as Pokemon;
|
||||
final palette = appPalettes[ref.watch(themeProvider)];
|
||||
final primaryDark = HSLColor.fromColor(palette.primary)
|
||||
.withLightness(
|
||||
(HSLColor.fromColor(palette.primary).lightness - 0.12).clamp(0.0, 1.0))
|
||||
.toColor();
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: const Color(0xFF1B2333),
|
||||
backgroundColor: palette.surface,
|
||||
body: SafeArea(
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 20.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: const Color(0xFFD32F2F),
|
||||
color: palette.primary,
|
||||
borderRadius: BorderRadius.circular(30),
|
||||
border: Border.all(color: const Color(0xFFA12020), width: 4),
|
||||
border: Border.all(color: primaryDark, width: 4),
|
||||
),
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
children: [
|
||||
_backBar(context),
|
||||
_backBar(context, primaryDark),
|
||||
PokemonDetailTop(
|
||||
pokemon: pokemon,
|
||||
isShiny: _isShiny,
|
||||
onToggleShiny: () => setState(() => _isShiny = !_isShiny),
|
||||
primaryColor: palette.primary,
|
||||
primaryDark: primaryDark,
|
||||
surfaceColor: palette.surface,
|
||||
),
|
||||
const SizedBox(height: 20),
|
||||
_hinge(),
|
||||
_hinge(primaryDark),
|
||||
const SizedBox(height: 20),
|
||||
PokemonStatsPanel(pokemon: pokemon),
|
||||
PokemonStatsPanel(
|
||||
pokemon: pokemon,
|
||||
surfaceColor: palette.surface,
|
||||
descriptionOverride: _englishGenus,
|
||||
),
|
||||
const SizedBox(height: 30),
|
||||
_bottomDots(),
|
||||
_bottomDots(primaryDark),
|
||||
const SizedBox(height: 20),
|
||||
],
|
||||
),
|
||||
@@ -54,7 +85,7 @@ class _PokemonDetailPageState extends State<PokemonDetailPage> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _backBar(BuildContext context) {
|
||||
Widget _backBar(BuildContext context, Color primaryDark) {
|
||||
return Container(
|
||||
height: 50,
|
||||
padding: const EdgeInsets.symmetric(horizontal: 16),
|
||||
@@ -63,24 +94,24 @@ class _PokemonDetailPageState extends State<PokemonDetailPage> {
|
||||
onTap: () => Navigator.pop(context),
|
||||
child: Container(
|
||||
padding: const EdgeInsets.all(4),
|
||||
decoration: const BoxDecoration(color: Color(0xFFA12020), shape: BoxShape.circle),
|
||||
decoration: BoxDecoration(color: primaryDark, shape: BoxShape.circle),
|
||||
child: const Icon(Icons.arrow_back, color: Colors.white),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget _hinge() {
|
||||
Widget _hinge(Color primaryDark) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Container(height: 6, width: 40, color: const Color(0xFFA12020)),
|
||||
Container(height: 6, width: 40, color: const Color(0xFFA12020)),
|
||||
Container(height: 6, width: 40, color: primaryDark),
|
||||
Container(height: 6, width: 40, color: primaryDark),
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
Widget _bottomDots() {
|
||||
Widget _bottomDots(Color primaryDark) {
|
||||
return Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: List.generate(
|
||||
@@ -89,7 +120,7 @@ class _PokemonDetailPageState extends State<PokemonDetailPage> {
|
||||
width: 6,
|
||||
height: 6,
|
||||
margin: const EdgeInsets.symmetric(horizontal: 2),
|
||||
decoration: const BoxDecoration(color: Color(0xFFA12020), shape: BoxShape.circle),
|
||||
decoration: BoxDecoration(color: primaryDark, shape: BoxShape.circle),
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import '../../domain/entities/pokemon.dart';
|
||||
import '../../l10n/app_localizations.dart';
|
||||
import '../providers/pokedex_provider.dart';
|
||||
import '../providers/theme_provider.dart';
|
||||
import '../widgets/pokemon_tile.dart';
|
||||
import '../widgets/scanline_overlay.dart';
|
||||
import '../widgets/list/pokedex_list_header.dart';
|
||||
@@ -34,6 +35,7 @@ class _PokemonListPageState extends ConsumerState<PokemonListPage> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final l = AppLocalizations.of(context)!;
|
||||
final palette = appPalettes[ref.watch(themeProvider)];
|
||||
final pokedexAsync = ref.watch(pokedexProvider);
|
||||
final caughtCount = ref.watch(caughtCountProvider);
|
||||
|
||||
@@ -47,8 +49,8 @@ class _PokemonListPageState extends ConsumerState<PokemonListPage> {
|
||||
height: 40,
|
||||
child: Row(
|
||||
children: [
|
||||
_buildTab('ALL', l.tabAll, _filter == 'ALL'),
|
||||
_buildTab('CAUGHT', l.tabCaught, _filter == 'CAUGHT'),
|
||||
_buildTab('ALL', l.tabAll, _filter == 'ALL', palette.primary),
|
||||
_buildTab('CAUGHT', l.tabCaught, _filter == 'CAUGHT', palette.primary),
|
||||
],
|
||||
),
|
||||
),
|
||||
@@ -79,7 +81,7 @@ class _PokemonListPageState extends ConsumerState<PokemonListPage> {
|
||||
),
|
||||
Container(
|
||||
height: 24,
|
||||
color: const Color(0xFF1B2333),
|
||||
color: palette.surface,
|
||||
alignment: Alignment.center,
|
||||
child: Text(l.pokedexFooter,
|
||||
style: const TextStyle(color: Colors.white70, fontSize: 12, letterSpacing: 1)),
|
||||
@@ -105,7 +107,7 @@ class _PokemonListPageState extends ConsumerState<PokemonListPage> {
|
||||
);
|
||||
}
|
||||
|
||||
Widget _buildTab(String key, String label, bool isSelected) {
|
||||
Widget _buildTab(String key, String label, bool isSelected, Color primaryColor) {
|
||||
return Expanded(
|
||||
child: GestureDetector(
|
||||
onTap: () {
|
||||
@@ -118,7 +120,7 @@ class _PokemonListPageState extends ConsumerState<PokemonListPage> {
|
||||
decoration: BoxDecoration(
|
||||
color: isSelected ? const Color(0xFFB0BEC5) : Colors.transparent,
|
||||
border: isSelected
|
||||
? const Border(bottom: BorderSide(color: Color(0xFFD32F2F), width: 3))
|
||||
? Border(bottom: BorderSide(color: primaryColor, width: 3))
|
||||
: null,
|
||||
),
|
||||
alignment: Alignment.center,
|
||||
|
||||
Reference in New Issue
Block a user