298 lines
10 KiB
Dart
298 lines
10 KiB
Dart
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,
|
|
),
|
|
);
|
|
}
|
|
} |