// Author: fruit.com.cn import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'app_colors.dart'; import 'app_dimens.dart'; /// Light paper and warm-cocoa themes for the Indonesia evening palette. abstract final class AppTheme { static const _lightBackground = Color(0xFFFFF6F1); static const _darkBackground = AppColors.ink; /// 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: AppColors.cream, 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), minimumSize: const WidgetStatePropertyAll( Size(0, AppDimens.buttonHeight), ), ), ), outlinedButtonTheme: OutlinedButtonThemeData( style: ButtonStyle( foregroundColor: WidgetStatePropertyAll( dark ? AppColors.blueSoft : AppColors.bluePressed, ), minimumSize: const WidgetStatePropertyAll( Size(0, AppDimens.buttonHeight), ), side: WidgetStatePropertyAll( BorderSide( color: dark ? AppColors.outlineDark : AppColors.outlineLight, ), ), ), ), appBarTheme: const AppBarTheme( systemOverlayStyle: SystemUiOverlayStyle.light, titleTextStyle: TextStyle( color: AppColors.cream, fontSize: AppDimens.pageTitle, fontWeight: FontWeight.w800, ), ), 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; } }