import 'package:flutter/material.dart'; import 'package:shadcn_ui/shadcn_ui.dart'; /// 健康管家 — 淡紫清新风 class AppTheme { AppTheme._(); // ── 主色调:柔和紫 ── static const Color primary = Color(0xFF7C6FF7); // 柔紫 static const Color primaryLight = Color(0xFFEDEAFF); // 浅薰衣草 static const Color primaryDark = Color(0xFF4A3FBE); // 深紫 static const Color primaryGlow = Color(0xFFD9D4FF); // 发光紫 // ── 中性色 ── static const Color bg = Color(0xFFFAF9FF); // 淡紫白 static const Color surface = Color(0xFFFFFFFF); static const Color text = Color(0xFF1E1B2E); // 紫黑 static const Color textSub = Color(0xFF6E6B82); // 灰紫 static const Color textHint = Color(0xFFB5B2C8); // 浅灰紫 static const Color border = Color(0xFFE8E6F0); static const Color divider = Color(0xFFF4F2FA); // ── 语义色 ── static const Color success = Color(0xFF52B788); // 翠绿 static const Color error = Color(0xFFE85D75); // 柔红 static const Color warning = Color(0xFFF5B041); // 暖琥珀 static const Color accent = Color(0xFFA78BFA); // 中紫 static const Color info = Color(0xFF7C6FF7); // 柔紫 // ── 圆角 ── static const double rXs = 6; static const double rSm = 10; static const double rMd = 14; static const double rLg = 20; static const double rXl = 28; static const double rPill = 999; // ── 间距 ── static const double sXs = 4; static const double sSm = 8; static const double sMd = 12; static const double sLg = 16; static const double sXl = 20; static const double sXxl = 28; // ── 阴影 ── static BoxShadow get shadowCard => BoxShadow(color: primary.withAlpha(14), blurRadius: 20, offset: const Offset(0, 4)); static BoxShadow get shadowLight => BoxShadow(color: primary.withAlpha(8), blurRadius: 12, offset: const Offset(0, 2)); static BoxShadow get shadowElevated => BoxShadow(color: primary.withAlpha(20), blurRadius: 30, offset: const Offset(0, 8)); // ── 智能体配色 ── static const Map agentColors = { 'default': Color(0xFFEDEAFF), // 淡紫 'consultation': Color(0xFFE0F0FF), // 淡天蓝 'health': Color(0xFFE8FFE8), // 淡翠绿 'diet': Color(0xFFFFF0E0), // 淡杏 'medication': Color(0xFFFFE8EC), // 淡粉 'report': Color(0xFFE8F0FF), // 淡水蓝 'exercise': Color(0xFFF0E8FF), // 淡紫 }; static Color agentLight(String? name) => agentColors[name] ?? primaryLight; // ── Material 主题 ── static ThemeData get lightTheme => ThemeData( useMaterial3: true, colorScheme: ColorScheme.fromSeed( seedColor: primary, primary: primary, surface: bg, brightness: Brightness.light, ), scaffoldBackgroundColor: bg, fontFamily: null, appBarTheme: const AppBarTheme( backgroundColor: surface, foregroundColor: text, elevation: 0, centerTitle: true, scrolledUnderElevation: 0, titleTextStyle: TextStyle(fontSize: 23, fontWeight: FontWeight.w600, color: text), ), cardTheme: CardThemeData( color: surface, elevation: 0, shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(rLg)), margin: EdgeInsets.zero, ), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: bg, contentPadding: const EdgeInsets.symmetric(horizontal: sLg, vertical: 16), border: OutlineInputBorder(borderRadius: BorderRadius.circular(rMd), borderSide: BorderSide.none), enabledBorder: OutlineInputBorder(borderRadius: BorderRadius.circular(rMd), borderSide: BorderSide.none), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(rMd), borderSide: const BorderSide(color: primary, width: 2), ), hintStyle: const TextStyle(color: textHint, fontSize: 20), ), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( backgroundColor: primary, foregroundColor: Colors.white, minimumSize: const Size(double.infinity, 56), shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(rPill)), textStyle: const TextStyle(fontSize: 21, fontWeight: FontWeight.w600), elevation: 0, ), ), dialogTheme: DialogThemeData(shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(rXl))), textTheme: const TextTheme( headlineLarge: TextStyle(fontSize: 32, fontWeight: FontWeight.w700, color: text, letterSpacing: -0.5), titleLarge: TextStyle(fontSize: 23, fontWeight: FontWeight.w600, color: text), titleMedium: TextStyle(fontSize: 21, fontWeight: FontWeight.w600, color: text), bodyLarge: TextStyle(fontSize: 21, color: text, height: 1.5), bodyMedium: TextStyle(fontSize: 20, color: textSub, height: 1.4), labelMedium: TextStyle(fontSize: 18, color: textSub), labelSmall: TextStyle(fontSize: 16, color: textHint), ), ); // ── Shadcn UI 主题 ── static ShadThemeData get shadTheme => ShadThemeData( brightness: Brightness.light, colorScheme: const ShadVioletColorScheme.light( background: bg, foreground: text, card: surface, cardForeground: text, popover: surface, popoverForeground: text, primary: primary, primaryForeground: Colors.white, secondary: Color(0xFFF4F2FA), secondaryForeground: text, muted: Color(0xFFF4F2FA), mutedForeground: textSub, accent: accent, accentForeground: Colors.white, destructive: error, destructiveForeground: Colors.white, border: border, input: border, ring: primary, selection: Color(0xFFD9D4FF), ), radius: BorderRadius.circular(rMd), ); }