Neda/admin_panel/lib/theme/app_theme.dart

143 lines
5.4 KiB
Dart

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);
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,
),
);
}