Files
MookNote/lib/utils/theme/app_theme.dart
DelLevin-Home 0f221456cb 结构重构
2026-03-12 14:33:28 +08:00

342 lines
9.8 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// 极简主义主题配置
class AppTheme {
// 中性色板 - 黑白灰为主
static const Color _black = Color(0xFF1A1A1A);
static const Color _darkGray = Color(0xFF333333);
static const Color _gray = Color(0xFF666666);
static const Color _lightGray = Color(0xFF999999);
static const Color _lighterGray = Color(0xFFE5E5E5);
static const Color _offWhite = Color(0xFFF5F5F5);
static const Color _white = Color(0xFFFFFFFF);
// 强调色 - 仅用于关键操作
static const Color accent = Color(0xFF0066FF);
static const Color error = Color(0xFFDC2626);
// 观影状态颜色 - 极简处理
static const Color watched = Color(0xFF1A1A1A); // 已看 - 纯黑
static const Color wantToWatch = Color(0xFF999999); // 想看 - 浅灰
static const Color watching = Color(0xFF666666); // 在看 - 中灰
// 阅读状态颜色 - 极简处理
static const Color readColor = Color(0xFF1A1A1A); // 已读 - 纯黑
static const Color wantToReadColor = Color(0xFF999999); // 想读 - 浅灰
static const Color readingColor = Color(0xFF666666); // 在读 - 中灰
// 字体配置
static const String _fontFamily = 'Inter';
// 字重
static const FontWeight _regular = FontWeight.w400;
static const FontWeight _medium = FontWeight.w500;
static const FontWeight _semibold = FontWeight.w600;
// 亮色主题 - 极简主义
static ThemeData get lightTheme {
return ThemeData(
useMaterial3: true,
brightness: Brightness.light,
scaffoldBackgroundColor: _white,
// 颜色方案
colorScheme: const ColorScheme.light(
primary: _black,
onPrimary: _white,
secondary: _darkGray,
onSecondary: _white,
surface: _white,
onSurface: _black,
error: error,
onError: _white,
),
// AppBar - 极简无边框
appBarTheme: const AppBarTheme(
backgroundColor: _white,
foregroundColor: _black,
elevation: 0,
centerTitle: false,
titleSpacing: 24,
systemOverlayStyle: SystemUiOverlayStyle.dark,
titleTextStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 18,
fontWeight: _semibold,
color: _black,
letterSpacing: -0.3,
),
),
// 卡片 - 无阴影,细边框
cardTheme: CardThemeData(
color: _white,
elevation: 0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.zero,
side: BorderSide(color: _lighterGray, width: 0.5),
),
margin: EdgeInsets.zero,
),
// 列表瓦片
listTileTheme: const ListTileThemeData(
contentPadding: EdgeInsets.symmetric(horizontal: 24, vertical: 16),
minLeadingWidth: 0,
dense: true,
),
// 分割线 - 极细
dividerTheme: DividerThemeData(
color: _lighterGray,
thickness: 0.5,
space: 0,
),
// 输入框 - 无边框,底部线
inputDecorationTheme: InputDecorationTheme(
filled: false,
border: UnderlineInputBorder(
borderSide: BorderSide(color: _lighterGray, width: 0.5),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: _lighterGray, width: 0.5),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: _black, width: 1),
),
errorBorder: UnderlineInputBorder(
borderSide: BorderSide(color: error, width: 0.5),
),
contentPadding: EdgeInsets.symmetric(vertical: 12),
hintStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 15,
fontWeight: _regular,
color: _lightGray,
),
labelStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 13,
fontWeight: _medium,
color: _gray,
),
),
// 按钮 - 文字按钮为主
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: _black,
foregroundColor: _white,
elevation: 0,
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.zero),
textStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 14,
fontWeight: _medium,
letterSpacing: 0.3,
),
),
),
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
foregroundColor: _black,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
textStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 14,
fontWeight: _medium,
),
),
),
// 底部导航
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
backgroundColor: _white,
selectedItemColor: _black,
unselectedItemColor: _lightGray,
elevation: 0,
type: BottomNavigationBarType.fixed,
selectedLabelStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 11,
fontWeight: _medium,
),
unselectedLabelStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 11,
fontWeight: _regular,
),
),
// 文字主题
textTheme: const TextTheme(
// 大标题
headlineLarge: TextStyle(
fontFamily: _fontFamily,
fontSize: 32,
fontWeight: _semibold,
color: _black,
letterSpacing: -0.5,
height: 1.2,
),
headlineMedium: TextStyle(
fontFamily: _fontFamily,
fontSize: 24,
fontWeight: _semibold,
color: _black,
letterSpacing: -0.3,
height: 1.3,
),
headlineSmall: TextStyle(
fontFamily: _fontFamily,
fontSize: 20,
fontWeight: _semibold,
color: _black,
letterSpacing: -0.2,
height: 1.4,
),
// 正文
bodyLarge: TextStyle(
fontFamily: _fontFamily,
fontSize: 16,
fontWeight: _regular,
color: _darkGray,
height: 1.6,
),
bodyMedium: TextStyle(
fontFamily: _fontFamily,
fontSize: 15,
fontWeight: _regular,
color: _darkGray,
height: 1.5,
),
bodySmall: TextStyle(
fontFamily: _fontFamily,
fontSize: 13,
fontWeight: _regular,
color: _gray,
height: 1.5,
),
// 标签
labelLarge: TextStyle(
fontFamily: _fontFamily,
fontSize: 14,
fontWeight: _medium,
color: _black,
),
labelMedium: TextStyle(
fontFamily: _fontFamily,
fontSize: 12,
fontWeight: _medium,
color: _gray,
),
labelSmall: TextStyle(
fontFamily: _fontFamily,
fontSize: 11,
fontWeight: _medium,
color: _lightGray,
letterSpacing: 0.3,
),
),
);
}
// 暗色主题
static ThemeData get darkTheme {
return ThemeData(
useMaterial3: true,
brightness: Brightness.dark,
scaffoldBackgroundColor: _black,
colorScheme: const ColorScheme.dark(
primary: _white,
onPrimary: _black,
secondary: _offWhite,
onSecondary: _black,
surface: _black,
onSurface: _white,
error: Color(0xFFEF4444),
onError: _black,
),
appBarTheme: const AppBarTheme(
backgroundColor: _black,
foregroundColor: _white,
elevation: 0,
centerTitle: false,
titleSpacing: 24,
systemOverlayStyle: SystemUiOverlayStyle.light,
titleTextStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 18,
fontWeight: _semibold,
color: _white,
letterSpacing: -0.3,
),
),
cardTheme: CardThemeData(
color: _darkGray,
elevation: 0,
shape: const RoundedRectangleBorder(borderRadius: BorderRadius.zero),
margin: EdgeInsets.zero,
),
dividerTheme: DividerThemeData(
color: _darkGray,
thickness: 0.5,
space: 0,
),
inputDecorationTheme: InputDecorationTheme(
filled: false,
border: UnderlineInputBorder(
borderSide: BorderSide(color: _darkGray, width: 0.5),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(color: _darkGray, width: 0.5),
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(color: _white, width: 1),
),
contentPadding: EdgeInsets.symmetric(vertical: 12),
hintStyle: TextStyle(
fontFamily: _fontFamily,
fontSize: 15,
fontWeight: _regular,
color: _gray,
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: _white,
foregroundColor: _black,
elevation: 0,
padding: EdgeInsets.symmetric(horizontal: 24, vertical: 14),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.zero),
),
),
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
foregroundColor: _white,
padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
),
),
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
backgroundColor: _black,
selectedItemColor: _white,
unselectedItemColor: _gray,
elevation: 0,
),
);
}
}