// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'app_colors.dart'; /// App-wide light and dark themes built from the approved Klein Blue palette. abstract final class AppTheme { static const _lightBackground = Color(0xFFF8F7FC); static const _darkBackground = Color(0xFF101019); /// Light theme for system light mode. static ThemeData light() => _build( brightness: Brightness.light, surface: _lightBackground, accent: AppColors.blue, ); /// Dark theme for system dark mode. static ThemeData dark() => _build( brightness: Brightness.dark, surface: _darkBackground, accent: AppColors.blueSoft, ); static ThemeData _build({ required Brightness brightness, required Color surface, required Color accent, }) { final dark = brightness == Brightness.dark; final scheme = dark ? const ColorScheme.dark( primary: AppColors.blue, onPrimary: AppColors.onPrimary, secondary: AppColors.blueSoft, onSecondary: AppColors.ink, primaryContainer: AppColors.bluePressed, onPrimaryContainer: AppColors.onPrimary, secondaryContainer: AppColors.bluePressed, onSecondaryContainer: AppColors.onPrimary, surface: _darkBackground, onSurface: Colors.white, outline: AppColors.outlineDark, outlineVariant: AppColors.outlineVariantDark, surfaceTint: AppColors.blueSoft, inversePrimary: AppColors.blueSoft, ) : ColorScheme.light( primary: AppColors.blue, onPrimary: AppColors.onPrimary, secondary: AppColors.blue, onSecondary: AppColors.onPrimary, primaryContainer: AppColors.blueSoft.withValues(alpha: 0.22), onPrimaryContainer: AppColors.ink, secondaryContainer: AppColors.blueSoft.withValues(alpha: 0.22), onSecondaryContainer: AppColors.ink, surface: _lightBackground, onSurface: AppColors.ink, outline: AppColors.outlineLight, outlineVariant: AppColors.outlineVariantLight, surfaceTint: AppColors.blue, inversePrimary: AppColors.blueSoft, ); return ThemeData( useMaterial3: true, brightness: brightness, colorScheme: scheme, scaffoldBackgroundColor: surface, progressIndicatorTheme: ProgressIndicatorThemeData(color: accent), sliderTheme: SliderThemeData( activeTrackColor: accent, thumbColor: AppColors.onPrimary, ), tabBarTheme: TabBarThemeData(labelColor: accent, indicatorColor: accent), textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom(foregroundColor: accent), ), filledButtonTheme: FilledButtonThemeData( style: ButtonStyle( backgroundColor: WidgetStateProperty.resolveWith(_buttonColor), foregroundColor: const WidgetStatePropertyAll(AppColors.onPrimary), ), ), switchTheme: SwitchThemeData( thumbColor: WidgetStateProperty.resolveWith( (states) => states.contains(WidgetState.selected) ? AppColors.onPrimary : null, ), trackColor: WidgetStateProperty.resolveWith( (states) => states.contains(WidgetState.selected) ? accent : null, ), ), snackBarTheme: SnackBarThemeData( backgroundColor: AppColors.bluePressed, contentTextStyle: const TextStyle(color: AppColors.onPrimary), ), ); } static Color _buttonColor(Set states) { if (states.contains(WidgetState.pressed) || states.contains(WidgetState.hovered) || states.contains(WidgetState.focused)) { return AppColors.bluePressed; } return AppColors.blue; } }