style: 主题升级 — 暖茶绿 Soft Clinical
- 主色: 深青碧 #0E8C7D(专业信赖) - 背景: 暖白 #FAF6F1(不再冰冷) - 高亮: 琥珀 #F0984A(温暖人性) - 全局圆角统一 14-26px - 字体层级优化
This commit is contained in:
@@ -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(24)),
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(26)),
|
||||||
textStyle: const TextStyle(fontSize: 18, fontWeight: FontWeight.w600),
|
textStyle: const TextStyle(fontSize: 17, fontWeight: FontWeight.w600),
|
||||||
|
elevation: 0,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
||||||
|
// 圆角 Dialog
|
||||||
|
dialogTheme: DialogThemeData(
|
||||||
|
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
|
||||||
|
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),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user