104 lines
4.0 KiB
Dart
104 lines
4.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
/// تم بصری حکمشو (الهامگرفته از اپ مرجع: قرمز تیره و طلایی).
|
|
/// همهی رنگهای پرتکرار اینجا متمرکزند تا در کد بهصورت ثابتِ بینام تکرار نشوند.
|
|
class AppColors {
|
|
// پایه
|
|
static const bg = Color(0xFF3A0A12);
|
|
static const bgDark = Color(0xFF240108);
|
|
static const panel = Color(0xFF5A0E1A);
|
|
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 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.accent,
|
|
colorScheme: base.colorScheme.copyWith(
|
|
primary: AppColors.gold,
|
|
secondary: AppColors.accent,
|
|
surface: AppColors.panel,
|
|
),
|
|
textTheme: base.textTheme.apply(
|
|
fontFamily: fontFamily,
|
|
bodyColor: AppColors.text,
|
|
displayColor: AppColors.text,
|
|
),
|
|
appBarTheme: const AppBarTheme(
|
|
backgroundColor: AppColors.bgDark,
|
|
foregroundColor: AppColors.gold,
|
|
centerTitle: true,
|
|
),
|
|
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,
|
|
),
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|