style: 主题升级 — 暖茶绿 Soft Clinical

- 主色: 深青碧 #0E8C7D(专业信赖)
- 背景: 暖白 #FAF6F1(不再冰冷)
- 高亮: 琥珀 #F0984A(温暖人性)
- 全局圆角统一 14-26px
- 字体层级优化
This commit is contained in:
MingNian
2026-06-03 20:28:39 +08:00
parent 7cd79bce68
commit f484c6b66a

View File

@@ -1,77 +1,115 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
/// 健康管家主题配置——薰衣草紫 + 温暖治愈风 /// 健康管家主题 —— 暖茶绿 · Soft Clinical
/// 深青碧色主调 + 暖白基底 + 琥珀点缀 避开传统医疗蓝/紫
class AppTheme { class AppTheme {
AppTheme._(); AppTheme._();
static const Color primaryColor = Color(0xFF635BFF); // ── 品牌色 ──
static const Color primaryLight = Color(0xFFEDEBFF); static const Color primary = Color(0xFF0E8C7D); // 深青碧 · 专业信赖
static const Color primaryDark = Color(0xFF4B44D6); static const Color primaryLight = Color(0xFFE3F4F0); // 浅青底
static const Color background = Color(0xFFF8F9FF); static const Color primaryDark = Color(0xFF0A6B5F); // 深青
static const Color cardWhite = Color(0xFFFFFFFF);
static const Color textPrimary = Color(0xFF1A1A1A); // ── 背景 ──
static const Color textSecondary = Color(0xFF666666); static const Color bg = Color(0xFFFAF6F1); // 暖白 · 不冰冷
static const Color textPlaceholder = Color(0xFF999999); static const Color surface = Color(0xFFFFFCF9); // 卡片白
static const Color successGreen = Color(0xFF43A047);
static const Color errorRed = Color(0xFFE53935); // ── 文字 ──
static const Color warningYellow = Color(0xFFF9A825); static const Color text = Color(0xFF2D2B32);
static const Color secondaryButton = Color(0xFFE5E5F7); static const Color textSub = Color(0xFF7B797F);
static const Color textHint = Color(0xFFB0ADB5);
// ── 功能色 ──
static const Color success = Color(0xFF43A047);
static const Color error = Color(0xFFE05D5D);
static const Color warning = Color(0xFFF0984A);
static const Color accent = Color(0xFFF0984A); // 琥珀 · 高亮/操作
// ── 边框 & 分割 ──
static const Color border = Color(0xFFE8E4DF);
static const Color divider = Color(0xFFF0ECE7);
static ThemeData get lightTheme => ThemeData( static ThemeData get lightTheme => ThemeData(
useMaterial3: true, useMaterial3: true,
colorScheme: ColorScheme.fromSeed( colorScheme: ColorScheme.fromSeed(
seedColor: primaryColor, seedColor: primary,
primary: primaryColor, primary: primary,
surface: background, surface: bg,
brightness: Brightness.light, brightness: Brightness.light,
), ),
scaffoldBackgroundColor: background, scaffoldBackgroundColor: bg,
// AppBar
appBarTheme: const AppBarTheme( appBarTheme: const AppBarTheme(
backgroundColor: cardWhite, backgroundColor: surface,
foregroundColor: textPrimary, foregroundColor: text,
elevation: 0, elevation: 0,
centerTitle: true, centerTitle: true,
titleTextStyle: TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: text),
), ),
// 卡片
cardTheme: CardThemeData( cardTheme: CardThemeData(
color: cardWhite, color: surface,
elevation: 0, elevation: 0,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)),
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8), margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 6),
), ),
// 输入框
inputDecorationTheme: InputDecorationTheme( inputDecorationTheme: InputDecorationTheme(
filled: true, filled: true,
fillColor: cardWhite, fillColor: surface,
contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
border: OutlineInputBorder( border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(14),
borderSide: const BorderSide(color: secondaryButton, width: 1.5), borderSide: const BorderSide(color: border),
), ),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(14),
borderSide: const BorderSide(color: secondaryButton, width: 1.5), borderSide: const BorderSide(color: border),
), ),
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(14),
borderSide: const BorderSide(color: primaryColor, width: 1.5), borderSide: const BorderSide(color: primary, width: 1.5),
), ),
hintStyle: const TextStyle(color: textPlaceholder, fontSize: 16), hintStyle: const TextStyle(color: textHint, fontSize: 15),
), ),
// 按钮
elevatedButtonTheme: ElevatedButtonThemeData( elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
backgroundColor: primaryColor, backgroundColor: primary,
foregroundColor: Colors.white, foregroundColor: Colors.white,
minimumSize: const Size(double.infinity, 48), minimumSize: const Size(double.infinity, 50),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26)),
textStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.w600),
elevation: 0,
),
),
// 圆角 Dialog
dialogTheme: DialogThemeData(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600), backgroundColor: surface,
), ),
// 总体圆角
chipTheme: ChipThemeData(
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(20)),
backgroundColor: primaryLight,
), ),
// 字体层级
textTheme: const TextTheme( textTheme: const TextTheme(
headlineLarge: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: textPrimary), headlineLarge: TextStyle(fontSize: 24, fontWeight: FontWeight.w700, color: text, letterSpacing: -0.5),
titleLarge: TextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: textPrimary), titleLarge: TextStyle(fontSize: 20, fontWeight: FontWeight.w600, color: text),
bodyLarge: TextStyle(fontSize: 18, fontWeight: FontWeight.w400, color: textPrimary), titleMedium: TextStyle(fontSize: 18, fontWeight: FontWeight.w600, color: text),
bodyMedium: TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: textSecondary), bodyLarge: TextStyle(fontSize: 16, fontWeight: FontWeight.w400, color: text, height: 1.5),
labelMedium: TextStyle(fontSize: 14, fontWeight: FontWeight.w400, color: textSecondary), bodyMedium: TextStyle(fontSize: 15, fontWeight: FontWeight.w400, color: textSub, height: 1.4),
labelSmall: TextStyle(fontSize: 12, fontWeight: FontWeight.w400, color: textSecondary), labelLarge: TextStyle(fontSize: 14, fontWeight: FontWeight.w500, color: textSub),
labelMedium: TextStyle(fontSize: 13, fontWeight: FontWeight.w400, color: textSub),
labelSmall: TextStyle(fontSize: 11, fontWeight: FontWeight.w400, color: textHint),
), ),
); );
} }