import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import '../constants/app_constants.dart'; /// Application theme configuration using Material Design 3 class AppTheme { AppTheme._(); // Color scheme for light theme static const ColorScheme _lightColorScheme = ColorScheme( brightness: Brightness.light, primary: Color(0xFF1976D2), // Blue onPrimary: Color(0xFFFFFFFF), primaryContainer: Color(0xFFE3F2FD), onPrimaryContainer: Color(0xFF0D47A1), secondary: Color(0xFF757575), // Grey onSecondary: Color(0xFFFFFFFF), secondaryContainer: Color(0xFFE0E0E0), onSecondaryContainer: Color(0xFF424242), tertiary: Color(0xFF4CAF50), // Green onTertiary: Color(0xFFFFFFFF), tertiaryContainer: Color(0xFFE8F5E8), onTertiaryContainer: Color(0xFF2E7D32), error: Color(0xFFD32F2F), onError: Color(0xFFFFFFFF), errorContainer: Color(0xFFFFEBEE), onErrorContainer: Color(0xFFB71C1C), surface: Color(0xFFFFFFFF), onSurface: Color(0xFF212121), background: Color(0xFFF5F5F5), onBackground: Color(0xFF616161), onSurfaceVariant: Color(0xFF616161), outline: Color(0xFFBDBDBD), outlineVariant: Color(0xFFE0E0E0), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFF303030), onInverseSurface: Color(0xFFF5F5F5), inversePrimary: Color(0xFF90CAF9), surfaceTint: Color(0xFF1976D2), ); // Color scheme for dark theme static const ColorScheme _darkColorScheme = ColorScheme( brightness: Brightness.dark, primary: Color(0xFF90CAF9), // Light Blue onPrimary: Color(0xFF0D47A1), primaryContainer: Color(0xFF1565C0), onPrimaryContainer: Color(0xFFE3F2FD), secondary: Color(0xFFBDBDBD), // Light Grey onSecondary: Color(0xFF424242), secondaryContainer: Color(0xFF616161), onSecondaryContainer: Color(0xFFE0E0E0), tertiary: Color(0xFF81C784), // Light Green onTertiary: Color(0xFF2E7D32), tertiaryContainer: Color(0xFF388E3C), onTertiaryContainer: Color(0xFFE8F5E8), error: Color(0xFFEF5350), onError: Color(0xFFB71C1C), errorContainer: Color(0xFFD32F2F), onErrorContainer: Color(0xFFFFEBEE), surface: Color(0xFF121212), onSurface: Color(0xFFE0E0E0), background: Color(0xFF2C2C2C), onBackground: Color(0xFFBDBDBD), onSurfaceVariant: Color(0xFFBDBDBD), outline: Color(0xFF757575), outlineVariant: Color(0xFF424242), shadow: Color(0xFF000000), scrim: Color(0xFF000000), inverseSurface: Color(0xFFE0E0E0), onInverseSurface: Color(0xFF303030), inversePrimary: Color(0xFF1976D2), surfaceTint: Color(0xFF90CAF9), ); /// Light theme configuration static ThemeData get lightTheme { return ThemeData( useMaterial3: true, colorScheme: _lightColorScheme, scaffoldBackgroundColor: _lightColorScheme.surface, // App Bar Theme appBarTheme: AppBarTheme( elevation: 0, scrolledUnderElevation: 1, backgroundColor: _lightColorScheme.surface, foregroundColor: _lightColorScheme.onSurface, titleTextStyle: TextStyle( fontSize: 20, fontWeight: FontWeight.w600, color: _lightColorScheme.onSurface, ), systemOverlayStyle: SystemUiOverlayStyle.dark, ), // Elevated Button Theme elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( elevation: 0, minimumSize: const Size(double.infinity, AppConstants.buttonHeight), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), ), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, ), ), ), // Text Button Theme textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( minimumSize: const Size(double.infinity, AppConstants.buttonHeight), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), ), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, ), ), ), // Input Decoration Theme inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: _lightColorScheme.background, contentPadding: const EdgeInsets.all(AppConstants.defaultPadding), border: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _lightColorScheme.outline), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _lightColorScheme.outline), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _lightColorScheme.primary, width: 2), ), errorBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _lightColorScheme.error), ), focusedErrorBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _lightColorScheme.error, width: 2), ), labelStyle: TextStyle(color: _lightColorScheme.onSurfaceVariant), hintStyle: TextStyle(color: _lightColorScheme.onSurfaceVariant), ), // List Tile Theme listTileTheme: const ListTileThemeData( contentPadding: EdgeInsets.symmetric( horizontal: AppConstants.defaultPadding, vertical: AppConstants.smallPadding, ), ), // Divider Theme dividerTheme: DividerThemeData( color: _lightColorScheme.outline, thickness: 0.5, ), // Progress Indicator Theme progressIndicatorTheme: ProgressIndicatorThemeData( color: _lightColorScheme.primary, ), // Snack Bar Theme snackBarTheme: SnackBarThemeData( backgroundColor: _lightColorScheme.inverseSurface, contentTextStyle: TextStyle(color: _lightColorScheme.onInverseSurface), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), ), behavior: SnackBarBehavior.floating, ), ); } /// Dark theme configuration static ThemeData get darkTheme { return ThemeData( useMaterial3: true, colorScheme: _darkColorScheme, scaffoldBackgroundColor: _darkColorScheme.surface, // App Bar Theme appBarTheme: AppBarTheme( elevation: 0, scrolledUnderElevation: 1, backgroundColor: _darkColorScheme.surface, foregroundColor: _darkColorScheme.onSurface, titleTextStyle: TextStyle( fontSize: 20, fontWeight: FontWeight.w600, color: _darkColorScheme.onSurface, ), systemOverlayStyle: SystemUiOverlayStyle.light, ), // Elevated Button Theme elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( elevation: 0, minimumSize: const Size(double.infinity, AppConstants.buttonHeight), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), ), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, ), ), ), // Text Button Theme textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( minimumSize: const Size(double.infinity, AppConstants.buttonHeight), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), ), textStyle: const TextStyle( fontSize: 16, fontWeight: FontWeight.w600, ), ), ), // Input Decoration Theme inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: _darkColorScheme.background, contentPadding: const EdgeInsets.all(AppConstants.defaultPadding), border: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _darkColorScheme.outline), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _darkColorScheme.outline), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _darkColorScheme.primary, width: 2), ), errorBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _darkColorScheme.error), ), focusedErrorBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), borderSide: BorderSide(color: _darkColorScheme.error, width: 2), ), labelStyle: TextStyle(color: _darkColorScheme.onSurfaceVariant), hintStyle: TextStyle(color: _darkColorScheme.onSurfaceVariant), ), // List Tile Theme listTileTheme: const ListTileThemeData( contentPadding: EdgeInsets.symmetric( horizontal: AppConstants.defaultPadding, vertical: AppConstants.smallPadding, ), ), // Divider Theme dividerTheme: DividerThemeData( color: _darkColorScheme.outline, thickness: 0.5, ), // Progress Indicator Theme progressIndicatorTheme: ProgressIndicatorThemeData( color: _darkColorScheme.primary, ), // Snack Bar Theme snackBarTheme: SnackBarThemeData( backgroundColor: _darkColorScheme.inverseSurface, contentTextStyle: TextStyle(color: _darkColorScheme.onInverseSurface), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(AppConstants.borderRadius), ), behavior: SnackBarBehavior.floating, ), ); } }