Files
Casha/lib/app/theme.dart
T
2026-03-20 10:32:36 +03:00

205 lines
6.9 KiB
Dart

import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../core/constants.dart';
class AppTheme {
static ThemeData get darkTheme {
final base = ThemeData.dark(useMaterial3: true);
final textTheme = GoogleFonts.poppinsTextTheme(base.textTheme).apply(
bodyColor: AppColors.textPrimary,
displayColor: AppColors.textPrimary,
);
return base.copyWith(
textTheme: textTheme,
scaffoldBackgroundColor: AppColors.background,
colorScheme: const ColorScheme.dark(
surface: AppColors.surface,
primary: AppColors.accent,
secondary: AppColors.accent,
onPrimary: Colors.white,
onSurface: AppColors.textPrimary,
),
cardTheme: CardThemeData(
color: AppColors.surface,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
margin: EdgeInsets.zero,
),
appBarTheme: AppBarTheme(
backgroundColor: AppColors.background,
elevation: 0,
centerTitle: false,
titleTextStyle: GoogleFonts.poppins(
color: AppColors.textPrimary,
fontSize: 20,
fontWeight: FontWeight.w600,
),
iconTheme: const IconThemeData(color: AppColors.textPrimary),
),
navigationBarTheme: NavigationBarThemeData(
backgroundColor: AppColors.surface,
indicatorColor: AppColors.accent.withOpacity(0.2),
labelTextStyle: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return GoogleFonts.poppins(
color: AppColors.accent,
fontSize: 12,
fontWeight: FontWeight.w600,
);
}
return GoogleFonts.poppins(
color: AppColors.textSecondary,
fontSize: 12,
);
}),
iconTheme: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return const IconThemeData(color: AppColors.accent);
}
return const IconThemeData(color: AppColors.textSecondary);
}),
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: AppColors.surface,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.divider),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.divider),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.accent, width: 1.5),
),
labelStyle: const TextStyle(color: AppColors.textSecondary),
hintStyle: const TextStyle(color: AppColors.textSecondary),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.accent,
foregroundColor: Colors.white,
minimumSize: const Size(double.infinity, 52),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14),
),
textStyle: GoogleFonts.poppins(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
),
dividerTheme: const DividerThemeData(
color: AppColors.divider,
thickness: 1,
),
);
}
static ThemeData get lightTheme {
final base = ThemeData.light(useMaterial3: true);
final textTheme = GoogleFonts.poppinsTextTheme(base.textTheme).apply(
bodyColor: const Color(0xFF1A1A24),
displayColor: const Color(0xFF1A1A24),
);
return base.copyWith(
textTheme: textTheme,
scaffoldBackgroundColor: const Color(0xFFF5F5F5),
colorScheme: const ColorScheme.light(
surface: Colors.white,
primary: AppColors.accent,
secondary: AppColors.accent,
onPrimary: Colors.white,
onSurface: Color(0xFF1A1A24),
),
cardTheme: CardThemeData(
color: Colors.white,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(16),
),
margin: EdgeInsets.zero,
),
appBarTheme: AppBarTheme(
backgroundColor: const Color(0xFFF5F5F5),
elevation: 0,
centerTitle: false,
titleTextStyle: GoogleFonts.poppins(
color: const Color(0xFF1A1A24),
fontSize: 20,
fontWeight: FontWeight.w600,
),
iconTheme: const IconThemeData(color: Color(0xFF1A1A24)),
),
navigationBarTheme: NavigationBarThemeData(
backgroundColor: Colors.white,
indicatorColor: AppColors.accent.withOpacity(0.2),
labelTextStyle: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return GoogleFonts.poppins(
color: AppColors.accent,
fontSize: 12,
fontWeight: FontWeight.w600,
);
}
return GoogleFonts.poppins(
color: const Color(0xFF666666),
fontSize: 12,
);
}),
iconTheme: WidgetStateProperty.resolveWith((states) {
if (states.contains(WidgetState.selected)) {
return const IconThemeData(color: AppColors.accent);
}
return const IconThemeData(color: Color(0xFF666666));
}),
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: Colors.white,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: Color(0xFFE0E0E0)),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: Color(0xFFE0E0E0)),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.accent, width: 1.5),
),
labelStyle: const TextStyle(color: Color(0xFF666666)),
hintStyle: const TextStyle(color: Color(0xFF999999)),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.accent,
foregroundColor: Colors.white,
minimumSize: const Size(double.infinity, 52),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14),
),
textStyle: GoogleFonts.poppins(
fontSize: 16,
fontWeight: FontWeight.w600,
),
),
),
dividerTheme: const DividerThemeData(
color: Color(0xFFE0E0E0),
thickness: 1,
),
);
}
}
// Keep for backward compatibility
ThemeData buildAppTheme() => AppTheme.darkTheme;