import 'package:flutter/material.dart'; class AppTheme { // ─── Color Palette ───────────────────────────────────────────────────────── static const Color primary = Color(0xFF2563EB); static const Color primaryDark = Color(0xFF1D4ED8); static const Color sidebarBg = Color(0xFF0F172A); static const Color sidebarSelected = Color(0xFF1E3A8A); static const Color sidebarText = Color(0xFFCBD5E1); static const Color sidebarTextActive = Color(0xFFFFFFFF); static const Color background = Color(0xFFF1F5F9); static const Color surface = Color(0xFFFFFFFF); static const Color textPrimary = Color(0xFF0F172A); static const Color textSecondary = Color(0xFF64748B); static const Color success = Color(0xFF10B981); static const Color warning = Color(0xFFF59E0B); static const Color danger = Color(0xFFEF4444); static const Color border = Color(0xFFE2E8F0); // ─── Role Colors ─────────────────────────────────────────────────────────── static Color roleColor(String role) { switch (role) { case 'admin': return const Color(0xFF7C3AED); case 'group_manager': return const Color(0xFF0891B2); default: return const Color(0xFF64748B); } } // ─── Theme Data ──────────────────────────────────────────────────────────── static ThemeData get theme => ThemeData( useMaterial3: true, colorScheme: ColorScheme.fromSeed( seedColor: primary, brightness: Brightness.light, surface: surface, ), scaffoldBackgroundColor: background, fontFamily: 'Vazirmatn', appBarTheme: const AppBarTheme( backgroundColor: surface, foregroundColor: textPrimary, elevation: 0, scrolledUnderElevation: 1, shadowColor: border, ), cardTheme: CardThemeData( elevation: 0, color: surface, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(12), side: const BorderSide(color: border), ), ), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: const Color(0xFFF8FAFC), border: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: border), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: border), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: primary, width: 2), ), errorBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(10), borderSide: const BorderSide(color: danger), ), contentPadding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14), ), elevatedButtonTheme: ElevatedButtonThemeData( style: ElevatedButton.styleFrom( backgroundColor: primary, foregroundColor: Colors.white, elevation: 0, padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), textStyle: const TextStyle( fontSize: 14, fontWeight: FontWeight.w600, ), ), ), outlinedButtonTheme: OutlinedButtonThemeData( style: OutlinedButton.styleFrom( foregroundColor: primary, side: const BorderSide(color: primary), padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 14), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), ), textButtonTheme: TextButtonThemeData( style: TextButton.styleFrom( foregroundColor: primary, ), ), dialogTheme: DialogThemeData( shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(16), ), elevation: 8, ), snackBarTheme: SnackBarThemeData( behavior: SnackBarBehavior.floating, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(10), ), ), dataTableTheme: DataTableThemeData( headingRowColor: WidgetStateProperty.all(const Color(0xFFF8FAFC)), dataRowColor: WidgetStateProperty.resolveWith((states) { if (states.contains(WidgetState.hovered)) { return const Color(0xFFF1F5F9); } return surface; }), headingTextStyle: const TextStyle( color: textSecondary, fontWeight: FontWeight.w600, fontSize: 13, ), dataTextStyle: const TextStyle( color: textPrimary, fontSize: 14, ), dividerThickness: 1, columnSpacing: 24, ), ); }