111 lines
3.8 KiB
Dart
111 lines
3.8 KiB
Dart
// Author: fruit.com.cn
|
|
|
|
import 'package:flutter/material.dart';
|
|
|
|
import 'app_colors.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),
|
|
),
|
|
),
|
|
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<WidgetState> states) {
|
|
if (states.contains(WidgetState.pressed) ||
|
|
states.contains(WidgetState.hovered) ||
|
|
states.contains(WidgetState.focused)) {
|
|
return AppColors.bluePressed;
|
|
}
|
|
return AppColors.blue;
|
|
}
|
|
}
|