176 lines
5.8 KiB
Dart
176 lines
5.8 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
class AppTheme {
|
|
static ThemeData get darkTheme {
|
|
return ThemeData(
|
|
useMaterial3: true,
|
|
brightness: Brightness.dark,
|
|
scaffoldBackgroundColor: Colors.black,
|
|
canvasColor: Colors.black,
|
|
cardColor: const Color(0xFF121212),
|
|
primaryColor: Colors.blue,
|
|
colorScheme: ColorScheme.dark(
|
|
primary: Colors.blue,
|
|
secondary: Colors.blueAccent,
|
|
surface: const Color(0xFF121212),
|
|
background: Colors.black,
|
|
onSurface: Colors.white,
|
|
onBackground: Colors.white,
|
|
),
|
|
appBarTheme: const AppBarTheme(
|
|
backgroundColor: Colors.black,
|
|
elevation: 0,
|
|
titleTextStyle: TextStyle(
|
|
color: Colors.white,
|
|
fontSize: 20,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
iconTheme: IconThemeData(color: Colors.white),
|
|
),
|
|
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
|
|
backgroundColor: Color(0xFF121212),
|
|
selectedItemColor: Colors.blue,
|
|
unselectedItemColor: Colors.grey,
|
|
type: BottomNavigationBarType.fixed,
|
|
),
|
|
cardTheme: CardThemeData(
|
|
color: const Color(0xFF1E1E1E),
|
|
elevation: 2,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(8),
|
|
),
|
|
),
|
|
textTheme: const TextTheme(
|
|
headlineLarge: TextStyle(
|
|
color: Colors.white, fontSize: 32, fontWeight: FontWeight.bold),
|
|
headlineMedium: TextStyle(
|
|
color: Colors.white, fontSize: 28, fontWeight: FontWeight.bold),
|
|
headlineSmall: TextStyle(
|
|
color: Colors.white, fontSize: 24, fontWeight: FontWeight.bold),
|
|
titleLarge: TextStyle(
|
|
color: Colors.white, fontSize: 20, fontWeight: FontWeight.w600),
|
|
titleMedium: TextStyle(
|
|
color: Colors.white, fontSize: 18, fontWeight: FontWeight.w500),
|
|
titleSmall: TextStyle(
|
|
color: Colors.white, fontSize: 16, fontWeight: FontWeight.w500),
|
|
bodyLarge: TextStyle(color: Colors.white, fontSize: 16),
|
|
bodyMedium: TextStyle(color: Colors.white70, fontSize: 14),
|
|
bodySmall: TextStyle(color: Colors.white60, fontSize: 12),
|
|
labelLarge: TextStyle(
|
|
color: Colors.white, fontSize: 14, fontWeight: FontWeight.w500),
|
|
labelMedium: TextStyle(color: Colors.white70, fontSize: 12),
|
|
labelSmall: TextStyle(color: Colors.white60, fontSize: 10),
|
|
),
|
|
iconTheme: const IconThemeData(color: Colors.white),
|
|
dividerTheme: const DividerThemeData(
|
|
color: Color(0xFF2A2A2A),
|
|
thickness: 1,
|
|
),
|
|
switchTheme: SwitchThemeData(
|
|
thumbColor: MaterialStateProperty.resolveWith<Color?>(
|
|
(Set<MaterialState> states) {
|
|
if (states.contains(MaterialState.selected)) {
|
|
return Colors.blue;
|
|
}
|
|
return Colors.grey;
|
|
}),
|
|
trackColor: MaterialStateProperty.resolveWith<Color?>(
|
|
(Set<MaterialState> states) {
|
|
if (states.contains(MaterialState.selected)) {
|
|
return Colors.blue.withOpacity(0.5);
|
|
}
|
|
return Colors.grey.withOpacity(0.5);
|
|
}),
|
|
),
|
|
dialogTheme: DialogThemeData(
|
|
backgroundColor: const Color(0xFF1E1E1E),
|
|
elevation: 8,
|
|
shape: RoundedRectangleBorder(
|
|
borderRadius: BorderRadius.circular(12),
|
|
),
|
|
titleTextStyle: const TextStyle(
|
|
color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold),
|
|
contentTextStyle: const TextStyle(color: Colors.white70, fontSize: 16),
|
|
),
|
|
floatingActionButtonTheme: const FloatingActionButtonThemeData(
|
|
backgroundColor: Colors.blue,
|
|
foregroundColor: Colors.white,
|
|
),
|
|
);
|
|
}
|
|
|
|
static const Color primaryBlack = Colors.black;
|
|
static const Color secondaryBlack = Color(0xFF121212);
|
|
static const Color tertiaryBlack = Color(0xFF1E1E1E);
|
|
static const Color dividerColor = Color(0xFF2A2A2A);
|
|
static const Color textPrimary = Colors.white;
|
|
static const Color textSecondary = Color(0xFFB3B3B3);
|
|
static const Color textTertiary = Color(0xFF808080);
|
|
static const Color accentBlue = Colors.blue;
|
|
static const Color accentBlueLight = Color(0xFF64B5F6);
|
|
static const Color errorRed = Color(0xFFCF6679);
|
|
static const Color successGreen = Color(0xFF4CAF50);
|
|
static const Color warningOrange = Color(0xFFFF9800);
|
|
|
|
static const TextStyle titleLarge = TextStyle(
|
|
fontSize: 20,
|
|
fontWeight: FontWeight.bold,
|
|
color: textPrimary,
|
|
);
|
|
|
|
static const TextStyle titleMedium = TextStyle(
|
|
fontSize: 18,
|
|
fontWeight: FontWeight.w600,
|
|
color: textPrimary,
|
|
);
|
|
|
|
static const TextStyle bodyLarge = TextStyle(
|
|
fontSize: 16,
|
|
color: textPrimary,
|
|
);
|
|
|
|
static const TextStyle bodyMedium = TextStyle(
|
|
fontSize: 14,
|
|
color: textSecondary,
|
|
);
|
|
|
|
static const TextStyle caption = TextStyle(
|
|
fontSize: 12,
|
|
color: textTertiary,
|
|
);
|
|
|
|
static const TextStyle labelLarge = TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.w500,
|
|
color: textPrimary,
|
|
);
|
|
|
|
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;
|
|
|
|
static const double radiusS = 4.0;
|
|
static const double radiusM = 8.0;
|
|
static const double radiusL = 12.0;
|
|
static const double radiusXL = 16.0;
|
|
|
|
static List<BoxShadow> get cardShadow => [
|
|
BoxShadow(
|
|
color: Colors.black.withOpacity(0.3),
|
|
blurRadius: 8,
|
|
offset: const Offset(0, 2),
|
|
),
|
|
];
|
|
|
|
static List<BoxShadow> get buttonShadow => [
|
|
BoxShadow(
|
|
color: Colors.black.withOpacity(0.2),
|
|
blurRadius: 4,
|
|
offset: const Offset(0, 2),
|
|
),
|
|
];
|
|
}
|