import 'package:flutter/material.dart'; class AppTheme { // ── WhatsApp Dark Palette ──────────────────────────────────────────────── static const Color darkBackground = Color(0xff111b21); static const Color darkSurface = Color(0xff1f2c34); static const Color darkSurfaceLight = Color(0xff2a3942); static const Color darkOutgoingMsg = Color(0xff005c4b); static const Color darkIncomingMsg = Color(0xff1f2c34); static const Color darkTextPrimary = Color(0xffe9edef); static const Color darkTextSecondary= Color(0xff8696a0); // ── WhatsApp Light Palette ─────────────────────────────────────────────── static const Color lightBackground = Color(0xffffffff); static const Color lightSurface = Color(0xff075e54); // WhatsApp green header static const Color lightSurfaceLight = Color(0xfff0f2f5); static const Color lightOutgoingMsg = Color(0xffd9fdd3); static const Color lightIncomingMsg = Color(0xffffffff); static const Color lightTextPrimary = Color(0xff111b21); static const Color lightTextSecondary= Color(0xff667781); static const Color lightChatBg = Color(0xffe5ddd5); // WhatsApp chat wallpaper bg // ── Shared Colors ──────────────────────────────────────────────────────── static const Color primary = Color(0xff25d366); // WhatsApp green static const Color primaryDark = Color(0xff128c7e); static const Color teal = Color(0xff075e54); static const Color blueTick = Color(0xff53bdeb); // WhatsApp blue double tick static const Color greyTick = Color(0xff667781); // ── Dark Theme ─────────────────────────────────────────────────────────── static ThemeData get dark { return ThemeData( brightness: Brightness.dark, scaffoldBackgroundColor: darkBackground, primaryColor: teal, colorScheme: const ColorScheme.dark( primary: primary, secondary: primaryDark, surface: darkSurface, background: darkBackground, ), appBarTheme: const AppBarTheme( backgroundColor: darkSurface, foregroundColor: darkTextPrimary, elevation: 0, iconTheme: IconThemeData(color: darkTextSecondary), titleTextStyle: TextStyle( color: darkTextPrimary, fontSize: 20, fontWeight: FontWeight.bold, ), ), dividerColor: darkSurfaceLight, textSelectionTheme: const TextSelectionThemeData( cursorColor: primary, selectionColor: primaryDark, selectionHandleColor: primary, ), ); } // ── Light Theme ────────────────────────────────────────────────────────── static ThemeData get light { return ThemeData( brightness: Brightness.light, scaffoldBackgroundColor: lightBackground, primaryColor: teal, colorScheme: const ColorScheme.light( primary: teal, secondary: primary, surface: lightSurface, background: lightBackground, ), appBarTheme: const AppBarTheme( backgroundColor: teal, foregroundColor: Colors.white, elevation: 0, iconTheme: IconThemeData(color: Colors.white), titleTextStyle: TextStyle( color: Colors.white, fontSize: 20, fontWeight: FontWeight.bold, ), ), dividerColor: Color(0xffe0e0e0), textSelectionTheme: const TextSelectionThemeData( cursorColor: teal, selectionColor: primary, selectionHandleColor: teal, ), ); } // ── Context-aware helpers ───────────────────────────────────────────────── static bool isDark(BuildContext context) => Theme.of(context).brightness == Brightness.dark; static Color background(BuildContext context) => isDark(context) ? darkBackground : lightBackground; static Color surface(BuildContext context) => isDark(context) ? darkSurface : lightSurface; static Color surfaceLight(BuildContext context) => isDark(context) ? darkSurfaceLight : lightSurfaceLight; static Color outgoingMsg(BuildContext context) => isDark(context) ? darkOutgoingMsg : lightOutgoingMsg; static Color incomingMsg(BuildContext context) => isDark(context) ? darkIncomingMsg : lightIncomingMsg; static Color chatBackground(BuildContext context) => isDark(context) ? darkBackground : lightChatBg; static Color textPrimary(BuildContext context) => isDark(context) ? darkTextPrimary : lightTextPrimary; static Color textSecondary(BuildContext context) => isDark(context) ? darkTextSecondary : lightTextSecondary; static Color iconColor(BuildContext context) => isDark(context) ? darkTextSecondary : Colors.white; static Color subtitleIconColor(BuildContext context) => isDark(context) ? darkTextSecondary : lightTextSecondary; }