Files
front-hokm/lib/core/theme/app_theme.dart
T
2026-07-03 21:56:34 +03:30

148 lines
6.3 KiB
Dart

import 'package:flutter/material.dart';
/// تم بصری حکم‌شو (الهام‌گرفته از اپ مرجع: قرمز تیره و طلایی).
/// همه‌ی رنگ‌های پرتکرار اینجا متمرکزند تا در کد به‌صورت ثابتِ بی‌نام تکرار نشوند.
class AppColors {
// پایه — تمِ شاهانهٔ ایران باستان: لاجوردِ تخت‌جمشید + طلا (با شنگرفِ کنتراست).
static const bg = Color(0xFF0E2347); // لاجوردِ شب
static const bgDark = Color(0xFF081428); // لاجوردِ تیره
static const panel = Color(0xFF17345C); // پنلِ نیمه‌شب آبی
static const gold = Color(0xFFE9B949);
static const goldDark = Color(0xFFB8860B);
static const goldFaint = Color(0x33E9B949); // جداکننده/خطِ طلاییِ کم‌رنگ
static const accent = Color(0xFFB81D2A); // شنگرفِ ایرانی (کنشِ مهم/خروج)
static const green = Color(0xFF2E7D32);
static const text = Color(0xFFF5E9D0);
// رمپِ لاجوردِ شاهانه (روشن → تیره) برای پس‌زمینه‌ها، پنل‌ها و میز.
static const lapis = Color(0xFF1E5FA8); // فیروزه‌ایِ روشن (تأکید/تب)
static const lapisHi = Color(0xFF1C4E8E); // سطحِ روشن (میز/اوال)
static const lapisMid = Color(0xFF1B4576); // پنلِ گرادیانِ بالا
static const lapisLo = Color(0xFF0C2848); // گرادیانِ پایین
static const lapisNight = Color(0xFF071A33); // لبهٔ میز/پس‌زمینهٔ Flame
static const lapisInk = Color(0xFF04101F); // مرکزِ تیرهٔ میز
// معنایی (دکمه‌ها/وضعیت/خال‌ها)
static const success = Color(0xFF3FA34D); // سبزِ روشنِ دکمه
static const successDark = Color(0xFF1B5E20); // سبزِ تیره (گرادیان/درخشش)
static const online = Color(0xFF4CD964); // نشانگرِ اتصالِ آنلاین
static const suitRed = Color(0xFFD32F2F); // دل/خشت
static const suitDark = Color(0xFF1A1A1A); // پیک/گشنیز (مرکّبِ کارت)
}
/// نمادِ یک‌نواییِ خال و رنگش از روی نامِ کاملِ خال (hearts/diamonds/clubs/spades).
/// منبعِ واحدِ این منطق تا در صفحه‌های مختلف تکرار نشود.
(String, Color) suitGlyph(String? suit) {
switch (suit) {
case 'hearts':
return ('♥', AppColors.suitRed);
case 'diamonds':
return ('♦', AppColors.suitRed);
case 'clubs':
return ('♣', Colors.white);
case 'spades':
return ('♠', Colors.white);
default:
return ('—', Colors.white54);
}
}
class AppTheme {
static ThemeData build() {
const fontFamily = 'Dana';
final base = ThemeData.dark(useMaterial3: true);
return base.copyWith(
scaffoldBackgroundColor: AppColors.bg,
primaryColor: AppColors.lapis,
canvasColor: AppColors.bg,
cardColor: AppColors.panel,
dividerColor: AppColors.goldFaint,
colorScheme: base.colorScheme.copyWith(
primary: AppColors.gold,
onPrimary: AppColors.lapisInk,
secondary: AppColors.lapis,
tertiary: AppColors.accent,
surface: AppColors.panel,
onSurface: AppColors.text,
),
textTheme: base.textTheme.apply(
fontFamily: fontFamily,
bodyColor: AppColors.text,
displayColor: AppColors.text,
),
appBarTheme: const AppBarTheme(
backgroundColor: AppColors.bgDark,
foregroundColor: AppColors.gold,
centerTitle: true,
),
// دیالوگ/منو/اسنک‌بار با همان قابِ لاجورد + طلا.
dialogTheme: DialogThemeData(
backgroundColor: AppColors.panel,
surfaceTintColor: Colors.transparent,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(18),
side: const BorderSide(color: AppColors.gold, width: 1.5),
),
titleTextStyle: const TextStyle(
fontFamily: fontFamily,
color: AppColors.gold,
fontSize: 19,
fontWeight: FontWeight.bold),
contentTextStyle:
const TextStyle(fontFamily: fontFamily, color: AppColors.text),
),
snackBarTheme: const SnackBarThemeData(
backgroundColor: AppColors.lapisMid,
contentTextStyle: TextStyle(fontFamily: fontFamily, color: AppColors.text),
behavior: SnackBarBehavior.floating,
),
tabBarTheme: const TabBarThemeData(
labelColor: AppColors.gold,
unselectedLabelColor: Colors.white60,
indicatorColor: AppColors.gold,
),
bottomSheetTheme: const BottomSheetThemeData(
backgroundColor: AppColors.panel,
surfaceTintColor: Colors.transparent,
),
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: AppColors.bgDark.withValues(alpha: 0.6),
hintStyle: const TextStyle(color: Colors.white38),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.goldDark),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.goldDark),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.gold, width: 2),
),
),
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.accent,
foregroundColor: AppColors.text,
minimumSize: const Size.fromHeight(54),
elevation: 8,
shadowColor: Colors.black,
textStyle: const TextStyle(
fontFamily: fontFamily, fontSize: 18, fontWeight: FontWeight.bold),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(14),
side: const BorderSide(color: AppColors.gold, width: 1.5),
),
).copyWith(
// افکتِ فشار: کمی فرورفتن هنگام لمس برای حسِ عمق.
elevation: WidgetStateProperty.resolveWith(
(states) => states.contains(WidgetState.pressed) ? 2.0 : 8.0,
),
),
),
);
}
}