import 'package:flutter/material.dart'; class AppTheme { // Couleurs du thème basées sur la maquette Figma static const Color primaryColor = Color(0xFF20335E); // Bleu foncé static const Color secondaryColor = Color(0xFF9DC7C8); // Bleu clair static const Color accentColor = Color(0xFF00E09D); // Vert static const Color errorColor = Color(0xFFE41B13); // Rouge static const Color warningColor = Color(0xFFF7A278); // Orange static const Color backgroundLightColor = Color(0xFFF4F5F6); // Gris très clair static const Color backgroundDarkColor = Color(0xFF111827); static const Color textLightColor = Color(0xFF000000); // Noir static const Color textDarkColor = Color(0xFFF9FAFB); // Couleurs de texte supplémentaires static const Color textSecondaryColor = Color(0xFF7F8C8D); static const Color textLightSecondaryColor = Color(0xFFBDC3C7); // Couleurs des boutons static const Color buttonSuccessColor = Color(0xFF2ECC71); static const Color buttonDangerColor = Color(0xFFE74C3C); // Couleurs des charts static const List chartColors = [ primaryColor, accentColor, errorColor, warningColor, secondaryColor, Color(0xFF9B59B6), Color(0xFF1ABC9C), ]; // Ombres static List cardShadow = [ BoxShadow( color: Colors.black.withOpacity(0.05), spreadRadius: 1, blurRadius: 10, offset: const Offset(0, 3), ), ]; static List buttonShadow = [ BoxShadow( color: Colors.black.withOpacity(0.1), spreadRadius: 1, blurRadius: 5, offset: const Offset(0, 2), ), ]; // Rayons des bordures static const double borderRadiusSmall = 4.0; static const double borderRadiusMedium = 8.0; static const double borderRadiusLarge = 12.0; static const double borderRadiusXL = 16.0; static const double borderRadiusRounded = 50.0; // Espacement static const double spacingXS = 4.0; static const double spacingS = 8.0; static const double spacingM = 16.0; static const double spacingL = 24.0; static const double spacingXL = 32.0; static const double spacingXXL = 48.0; // Thème clair static ThemeData get lightTheme { return ThemeData( useMaterial3: true, brightness: Brightness.light, fontFamily: 'Figtree', colorScheme: const ColorScheme.light( primary: primaryColor, secondary: secondaryColor, tertiary: accentColor, surface: Colors.white, onPrimary: Colors.white, onSecondary: Colors.white, onSurface: textLightColor, error: errorColor, ), scaffoldBackgroundColor: backgroundLightColor, textTheme: _getTextTheme(textLightColor), appBarTheme: const AppBarTheme( backgroundColor: primaryColor, foregroundColor: Colors.white, elevation: 0, ), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( backgroundColor: primaryColor, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric( horizontal: spacingL, vertical: spacingM), elevation: 2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(borderRadiusRounded), ), textStyle: const TextStyle( fontFamily: 'Figtree', fontSize: 18, fontWeight: FontWeight.w500, ), ), ), outlinedButtonTheme: OutlinedButtonThemeData( style: OutlinedButton.styleFrom( foregroundColor: primaryColor, side: const BorderSide(color: primaryColor), padding: const EdgeInsets.symmetric( horizontal: spacingL, vertical: spacingM), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), ), ), ), textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( foregroundColor: primaryColor, padding: const EdgeInsets.symmetric( horizontal: spacingM, vertical: spacingS), ), ), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: backgroundLightColor, border: OutlineInputBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), borderSide: BorderSide( color: textLightColor.withOpacity(0.1), width: 1, ), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), borderSide: BorderSide( color: textLightColor.withOpacity(0.1), width: 1, ), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), borderSide: const BorderSide(color: primaryColor, width: 2), ), contentPadding: const EdgeInsets.symmetric( horizontal: spacingM, vertical: spacingM), ), cardTheme: CardThemeData( elevation: 2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(borderRadiusXL), ), color: Colors.white, ), dividerTheme: const DividerThemeData( color: Color(0xFFECF0F1), thickness: 1, space: spacingM, ), ); } // Thème sombre static ThemeData get darkTheme { return ThemeData( useMaterial3: true, brightness: Brightness.dark, fontFamily: 'Figtree', colorScheme: const ColorScheme.dark( primary: primaryColor, secondary: secondaryColor, tertiary: accentColor, surface: Color(0xFF1F2937), onPrimary: Colors.white, onSecondary: Colors.white, onSurface: textDarkColor, error: errorColor, ), scaffoldBackgroundColor: backgroundDarkColor, textTheme: _getTextTheme(textDarkColor), appBarTheme: const AppBarTheme( backgroundColor: Color(0xFF1F2937), foregroundColor: Colors.white, elevation: 0, ), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( backgroundColor: primaryColor, foregroundColor: Colors.white, padding: const EdgeInsets.symmetric( horizontal: spacingL, vertical: spacingM), elevation: 2, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(borderRadiusRounded), ), textStyle: const TextStyle( fontFamily: 'Figtree', fontSize: 18, fontWeight: FontWeight.w500, ), ), ), outlinedButtonTheme: OutlinedButtonThemeData( style: OutlinedButton.styleFrom( foregroundColor: primaryColor, side: const BorderSide(color: primaryColor), padding: const EdgeInsets.symmetric( horizontal: spacingL, vertical: spacingM), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), ), ), ), textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( foregroundColor: primaryColor, padding: const EdgeInsets.symmetric( horizontal: spacingM, vertical: spacingS), ), ), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: const Color(0xFF374151), border: OutlineInputBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), borderSide: BorderSide( color: textDarkColor.withOpacity(0.1), width: 1, ), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), borderSide: BorderSide( color: textDarkColor.withOpacity(0.1), width: 1, ), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(borderRadiusMedium), borderSide: const BorderSide(color: primaryColor, width: 2), ), contentPadding: const EdgeInsets.symmetric( horizontal: spacingM, vertical: spacingM), ), cardTheme: CardThemeData( elevation: 4, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(borderRadiusXL), ), color: const Color(0xFF1F2937), ), dividerTheme: DividerThemeData( color: textDarkColor.withOpacity(0.1), thickness: 1, space: spacingM, ), ); } // Méthode helper pour générer le TextTheme static TextTheme _getTextTheme(Color textColor) { return TextTheme( displayLarge: TextStyle(fontFamily: 'Figtree', color: textColor), displayMedium: TextStyle(fontFamily: 'Figtree', color: textColor), displaySmall: TextStyle(fontFamily: 'Figtree', color: textColor), headlineLarge: TextStyle(fontFamily: 'Figtree', color: textColor), headlineMedium: TextStyle(fontFamily: 'Figtree', color: textColor), headlineSmall: TextStyle(fontFamily: 'Figtree', color: textColor), titleLarge: TextStyle(fontFamily: 'Figtree', color: textColor), titleMedium: TextStyle(fontFamily: 'Figtree', color: textColor), titleSmall: TextStyle(fontFamily: 'Figtree', color: textColor), bodyLarge: TextStyle(fontFamily: 'Figtree', color: textColor), bodyMedium: TextStyle(fontFamily: 'Figtree', color: textColor), bodySmall: TextStyle(fontFamily: 'Figtree', color: textColor.withOpacity(0.7)), labelLarge: TextStyle(fontFamily: 'Figtree', color: textColor), labelMedium: TextStyle(fontFamily: 'Figtree', color: textColor.withOpacity(0.7)), labelSmall: TextStyle(fontFamily: 'Figtree', color: textColor.withOpacity(0.7)), ); } }