import 'package:flutter/material.dart'; /// Satu sumber kebenaran untuk semua warna, style, dan theme aplikasi. class AppTheme { AppTheme._(); // ── Brand Colors ───────────────────────────────────────────── static const Color primary = Color(0xFF3E5F6F); static const Color primaryLight = Color(0xFF5A7F91); static const Color primaryDark = Color(0xFF2B4555); static const Color accent = Color(0xFF2196F3); static const Color accentLight = Color(0xFFE3F2FD); // ── Backgrounds ────────────────────────────────────────────── static const Color bgPage = Color(0xFFF4F6FA); static const Color bgCard = Colors.white; static const Color bgAuth = Color(0xFFF6F6F6); // ── Text ───────────────────────────────────────────────────── static const Color textPrimary = Color(0xFF1A1A2E); static const Color textSecondary = Color(0xFF6B7280); static const Color textHint = Color(0xFF9CA3AF); // ── Status ─────────────────────────────────────────────────── static const Color statusNormal = Color(0xFF4CAF50); static const Color statusWarning = Colors.orange; static const Color statusDanger = Colors.red; // ── Gradients ──────────────────────────────────────────────── static const LinearGradient suhuGradient = LinearGradient( colors: [Color(0xFFB026FF), Color(0xFF7B2FBE)], begin: Alignment.topLeft, end: Alignment.bottomRight, ); static const LinearGradient humidGradient = LinearGradient( colors: [Color(0xFF56CCF2), Color(0xFF2F80ED)], begin: Alignment.topLeft, end: Alignment.bottomRight, ); // ── Card Decoration ────────────────────────────────────────── static BoxDecoration cardDecoration({double radius = 16}) => BoxDecoration( color: bgCard, borderRadius: BorderRadius.circular(radius), boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.06), blurRadius: 12, offset: const Offset(0, 4), ), ], ); // ── ThemeData ───────────────────────────────────────────────── static ThemeData get light { return ThemeData( useMaterial3: true, colorScheme: ColorScheme.fromSeed(seedColor: primary), scaffoldBackgroundColor: bgPage, appBarTheme: const AppBarTheme( backgroundColor: bgPage, elevation: 0, scrolledUnderElevation: 0, foregroundColor: textPrimary, ), bottomNavigationBarTheme: const BottomNavigationBarThemeData( backgroundColor: bgCard, selectedItemColor: primary, unselectedItemColor: textSecondary, type: BottomNavigationBarType.fixed, elevation: 8, ), switchTheme: SwitchThemeData( thumbColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) return Colors.white; return Colors.grey.shade400; }), trackColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.selected)) return accent; return Colors.grey.shade300; }), ), sliderTheme: SliderThemeData( trackHeight: 4, thumbShape: const RoundSliderThumbShape(enabledThumbRadius: 8), overlayShape: const RoundSliderOverlayShape(overlayRadius: 16), activeTrackColor: Colors.white, inactiveTrackColor: Colors.white.withOpacity(0.3), thumbColor: Colors.white, overlayColor: Colors.white.withOpacity(0.2), ), ); } }