runable
This commit is contained in:
298
lib/core/theme/app_theme.dart
Normal file
298
lib/core/theme/app_theme.dart
Normal file
@@ -0,0 +1,298 @@
|
||||
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,
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user