import 'package:flutter/material.dart'; import 'package:google_fonts/google_fonts.dart'; import '../../core/theme/app_colors.dart'; /// XtremFlow Mobile Theme — Apple TV Grey Glossy Style (dark) /// + Apple Clean White (light) class MobileTheme { MobileTheme._(); // ============ SPACING ============ static const double spacing4 = 4.0; static const double spacing8 = 8.0; static const double spacing12 = 12.0; static const double spacing16 = 16.0; static const double spacing24 = 24.0; // ============ RADIUS ============ static const double radiusSm = 8.0; static const double radiusMd = 12.0; static const double radiusLg = 16.0; // ============ DARK THEME (Mobile Main) ============ static ThemeData get darkTheme { final baseTheme = ThemeData.dark(useMaterial3: true); return baseTheme.copyWith( colorScheme: AppColors.darkColorScheme, scaffoldBackgroundColor: AppColors.background, // Global text selection — white cursor on dark textSelectionTheme: const TextSelectionThemeData( cursorColor: Colors.white, selectionColor: Color(0x4DFFFFFF), selectionHandleColor: Colors.white, ), // Typography: San Francisco proxy via Inter — clean and modern textTheme: TextTheme( displayLarge: GoogleFonts.inter( fontSize: 32, fontWeight: FontWeight.w700, letterSpacing: -1.0, color: AppColors.textPrimary, ), displayMedium: GoogleFonts.inter( fontSize: 28, fontWeight: FontWeight.w700, letterSpacing: -0.5, color: AppColors.textPrimary, ), displaySmall: GoogleFonts.inter( fontSize: 24, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), headlineMedium: GoogleFonts.inter( fontSize: 20, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), titleLarge: GoogleFonts.inter( fontSize: 18, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), titleMedium: GoogleFonts.inter( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), bodyLarge: GoogleFonts.inter( fontSize: 14, fontWeight: FontWeight.w400, color: AppColors.textSecondary, ), bodyMedium: GoogleFonts.inter( fontSize: 12, fontWeight: FontWeight.w400, color: AppColors.textSecondary, ), labelLarge: GoogleFonts.inter( fontSize: 12, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), ), // AppBar: Transparent — background gradient shows through appBarTheme: AppBarTheme( backgroundColor: Colors.transparent, foregroundColor: AppColors.textPrimary, elevation: 0, centerTitle: true, scrolledUnderElevation: 0, titleTextStyle: GoogleFonts.inter( fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.textPrimary, ), ), // Bottom Navigation Bar: glossy dark surface, Apple Blue selected bottomNavigationBarTheme: BottomNavigationBarThemeData( backgroundColor: AppColors.surface, selectedItemColor: AppColors.appleBlue, unselectedItemColor: AppColors.textSecondary, selectedLabelStyle: GoogleFonts.inter( fontSize: 10, fontWeight: FontWeight.w600, ), unselectedLabelStyle: GoogleFonts.inter( fontSize: 10, fontWeight: FontWeight.w500, ), type: BottomNavigationBarType.fixed, elevation: 0, ), // Inputs: dark surface fill, white focus border inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: AppColors.surfaceVariant, contentPadding: const EdgeInsets.symmetric( horizontal: spacing16, vertical: spacing12, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide( color: AppColors.glassBorderColor, width: 1, ), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide( color: AppColors.glassBorderColor, width: 1, ), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide(color: Colors.white, width: 1.5), ), hintStyle: GoogleFonts.inter( color: AppColors.textTertiary, fontSize: 14, ), ), // Buttons: Apple Blue fill — modern CTA style filledButtonTheme: FilledButtonThemeData( style: FilledButton.styleFrom( backgroundColor: AppColors.appleBlue, foregroundColor: Colors.white, elevation: 0, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusMd), ), textStyle: GoogleFonts.inter( fontWeight: FontWeight.w600, fontSize: 14, ), ), ), // Cards: glossy dark surface with subtle glass border cardTheme: const CardThemeData( color: AppColors.surfaceVariant, elevation: 0, margin: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(radiusMd)), side: BorderSide(color: AppColors.glassBorderColor, width: 1), ), ), // Dialogs: glass/dark dialogTheme: DialogThemeData( backgroundColor: AppColors.surface, elevation: 24, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusLg), side: const BorderSide(color: AppColors.glassBorderColor, width: 1), ), titleTextStyle: GoogleFonts.inter( fontSize: 18, fontWeight: FontWeight.bold, color: AppColors.textPrimary, ), contentTextStyle: GoogleFonts.inter( fontSize: 14, color: AppColors.textSecondary, ), ), ); } // ============ LIGHT THEME (Apple Clean White) ============ static ThemeData get lightTheme { final baseTheme = ThemeData.light(useMaterial3: true); const bgColor = Color(0xFFEAEAF0); const surfaceColor = Color(0xFFF2F2F7); const primaryColor = Color(0xFF007AFF); const textPrimaryColor = Color(0xFF000000); const textSecondaryColor = Color(0x993C3C43); const textTertiaryColor = Color(0xFFC7C7CC); const borderColor = Color(0x1A000000); return baseTheme.copyWith( colorScheme: const ColorScheme.light( primary: primaryColor, secondary: Color(0xFF34C759), surface: surfaceColor, error: AppColors.error, onPrimary: Colors.white, onSecondary: Colors.white, onSurface: textPrimaryColor, onError: Colors.white, brightness: Brightness.light, ), scaffoldBackgroundColor: bgColor, textSelectionTheme: const TextSelectionThemeData( cursorColor: primaryColor, selectionColor: Color(0x4D007AFF), selectionHandleColor: primaryColor, ), textTheme: TextTheme( displayLarge: GoogleFonts.inter( fontSize: 32, fontWeight: FontWeight.w700, letterSpacing: -1.0, color: textPrimaryColor, ), displayMedium: GoogleFonts.inter( fontSize: 28, fontWeight: FontWeight.w700, letterSpacing: -0.5, color: textPrimaryColor, ), displaySmall: GoogleFonts.inter( fontSize: 24, fontWeight: FontWeight.w600, color: textPrimaryColor, ), headlineMedium: GoogleFonts.inter( fontSize: 20, fontWeight: FontWeight.w600, color: textPrimaryColor, ), titleLarge: GoogleFonts.inter( fontSize: 18, fontWeight: FontWeight.w600, color: textPrimaryColor, ), titleMedium: GoogleFonts.inter( fontSize: 16, fontWeight: FontWeight.w600, color: textPrimaryColor, ), bodyLarge: GoogleFonts.inter( fontSize: 14, fontWeight: FontWeight.w400, color: textSecondaryColor, ), bodyMedium: GoogleFonts.inter( fontSize: 12, fontWeight: FontWeight.w400, color: textSecondaryColor, ), labelLarge: GoogleFonts.inter( fontSize: 12, fontWeight: FontWeight.w600, color: textPrimaryColor, ), ), appBarTheme: AppBarTheme( backgroundColor: surfaceColor, foregroundColor: textPrimaryColor, elevation: 0, scrolledUnderElevation: 1, shadowColor: borderColor, centerTitle: true, titleTextStyle: GoogleFonts.inter( fontSize: 16, fontWeight: FontWeight.w600, color: textPrimaryColor, ), ), bottomNavigationBarTheme: BottomNavigationBarThemeData( backgroundColor: surfaceColor, selectedItemColor: primaryColor, unselectedItemColor: textSecondaryColor, selectedLabelStyle: GoogleFonts.inter( fontSize: 10, fontWeight: FontWeight.w600, ), unselectedLabelStyle: GoogleFonts.inter( fontSize: 10, fontWeight: FontWeight.w500, ), type: BottomNavigationBarType.fixed, elevation: 8, ), inputDecorationTheme: InputDecorationTheme( filled: true, fillColor: surfaceColor, contentPadding: const EdgeInsets.symmetric( horizontal: spacing16, vertical: spacing12, ), border: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide(color: borderColor, width: 1), ), enabledBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide(color: borderColor, width: 1), ), focusedBorder: OutlineInputBorder( borderRadius: BorderRadius.circular(radiusMd), borderSide: const BorderSide(color: primaryColor, width: 2), ), hintStyle: GoogleFonts.inter( color: textTertiaryColor, fontSize: 14, ), ), filledButtonTheme: FilledButtonThemeData( style: FilledButton.styleFrom( backgroundColor: primaryColor, foregroundColor: Colors.white, elevation: 0, padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12), shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusMd), ), textStyle: GoogleFonts.inter( fontWeight: FontWeight.w600, fontSize: 14, ), ), ), cardTheme: const CardThemeData( color: surfaceColor, elevation: 0, margin: EdgeInsets.zero, shape: RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(radiusMd)), side: BorderSide(color: borderColor, width: 1), ), shadowColor: borderColor, ), dialogTheme: DialogThemeData( backgroundColor: surfaceColor, elevation: 8, shadowColor: borderColor, shape: RoundedRectangleBorder( borderRadius: BorderRadius.circular(radiusLg), side: const BorderSide(color: borderColor, width: 1), ), titleTextStyle: GoogleFonts.inter( fontSize: 18, fontWeight: FontWeight.bold, color: textPrimaryColor, ), contentTextStyle: GoogleFonts.inter( fontSize: 14, color: textSecondaryColor, ), ), ); } /// Returns the appropriate MobileTheme based on the current [BuildContext] brightness. static ThemeData themeOf(BuildContext context) { final brightness = Theme.of(context).brightness; return brightness == Brightness.dark ? darkTheme : lightTheme; } }