mirror of
https://github.com/dz0ny/meshcore-sar.git
synced 2026-08-11 16:30:28 +00:00
feat: MeshCore SAR - Flutter BLE mesh radio companion app
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
287
lib/theme/app_theme.dart
Normal file
287
lib/theme/app_theme.dart
Normal file
@@ -0,0 +1,287 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum AppThemeMode {
|
||||
light,
|
||||
dark,
|
||||
sarRed,
|
||||
sarGreen,
|
||||
sarNavyBlue,
|
||||
system,
|
||||
}
|
||||
|
||||
class AppTheme {
|
||||
// Light theme (Blue)
|
||||
static ThemeData get lightTheme {
|
||||
return ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: Colors.blue,
|
||||
brightness: Brightness.light,
|
||||
),
|
||||
appBarTheme: const AppBarTheme(
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
),
|
||||
cardTheme: CardThemeData(
|
||||
elevation: 2,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
filled: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Dark theme (Blue)
|
||||
static ThemeData get darkTheme {
|
||||
return ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: ColorScheme.fromSeed(
|
||||
seedColor: Colors.blue,
|
||||
brightness: Brightness.dark,
|
||||
),
|
||||
appBarTheme: const AppBarTheme(
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
),
|
||||
cardTheme: CardThemeData(
|
||||
elevation: 2,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
),
|
||||
filled: true,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// SAR Red theme (Emergency/Alert tones)
|
||||
static ThemeData get sarRedTheme {
|
||||
return ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: const ColorScheme.dark(
|
||||
brightness: Brightness.dark,
|
||||
primary: Color(0xFFFF5252), // Bright red
|
||||
onPrimary: Color(0xFF000000),
|
||||
primaryContainer: Color(0xFF8B0000), // Dark red
|
||||
onPrimaryContainer: Color(0xFFFFCDD2),
|
||||
secondary: Color(0xFFFF8A80),
|
||||
onSecondary: Color(0xFF000000),
|
||||
secondaryContainer: Color(0xFFB71C1C),
|
||||
onSecondaryContainer: Color(0xFFFFCDD2),
|
||||
tertiary: Color(0xFFFF6E40),
|
||||
onTertiary: Color(0xFF000000),
|
||||
error: Color(0xFFCF6679),
|
||||
onError: Color(0xFF000000),
|
||||
surface: Color(0xFF1A0000), // Very dark red-tinted
|
||||
onSurface: Color(0xFFFFEBEE),
|
||||
surfaceContainerHighest: Color(0xFF2D0000),
|
||||
onSurfaceVariant: Color(0xFFFFCDD2),
|
||||
outline: Color(0xFFFF5252),
|
||||
),
|
||||
scaffoldBackgroundColor: const Color(0xFF1A0000),
|
||||
appBarTheme: const AppBarTheme(
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
backgroundColor: Color(0xFF2D0000),
|
||||
foregroundColor: Color(0xFFFFEBEE),
|
||||
),
|
||||
cardTheme: CardThemeData(
|
||||
elevation: 2,
|
||||
color: const Color(0xFF2D0000),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
side: const BorderSide(
|
||||
color: Color(0xFFFF5252),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
borderSide: const BorderSide(color: Color(0xFFFF5252)),
|
||||
),
|
||||
filled: true,
|
||||
fillColor: const Color(0xFF2D0000),
|
||||
),
|
||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: const Color(0xFFFF5252),
|
||||
foregroundColor: const Color(0xFF000000),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// SAR Green theme (All Clear/Safe tones)
|
||||
static ThemeData get sarGreenTheme {
|
||||
return ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: const ColorScheme.dark(
|
||||
brightness: Brightness.dark,
|
||||
primary: Color(0xFF69F0AE), // Bright green
|
||||
onPrimary: Color(0xFF000000),
|
||||
primaryContainer: Color(0xFF00695C), // Dark teal-green
|
||||
onPrimaryContainer: Color(0xFFB9F6CA),
|
||||
secondary: Color(0xFF64FFDA),
|
||||
onSecondary: Color(0xFF000000),
|
||||
secondaryContainer: Color(0xFF004D40),
|
||||
onSecondaryContainer: Color(0xFFB9F6CA),
|
||||
tertiary: Color(0xFF1DE9B6),
|
||||
onTertiary: Color(0xFF000000),
|
||||
error: Color(0xFFCF6679),
|
||||
onError: Color(0xFF000000),
|
||||
surface: Color(0xFF001A12), // Very dark green-tinted
|
||||
onSurface: Color(0xFFE8F5E9),
|
||||
surfaceContainerHighest: Color(0xFF002D1F),
|
||||
onSurfaceVariant: Color(0xFFB9F6CA),
|
||||
outline: Color(0xFF69F0AE),
|
||||
),
|
||||
scaffoldBackgroundColor: const Color(0xFF001A12),
|
||||
appBarTheme: const AppBarTheme(
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
backgroundColor: Color(0xFF002D1F),
|
||||
foregroundColor: Color(0xFFE8F5E9),
|
||||
),
|
||||
cardTheme: CardThemeData(
|
||||
elevation: 2,
|
||||
color: const Color(0xFF002D1F),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
side: const BorderSide(
|
||||
color: Color(0xFF69F0AE),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
borderSide: const BorderSide(color: Color(0xFF69F0AE)),
|
||||
),
|
||||
filled: true,
|
||||
fillColor: const Color(0xFF002D1F),
|
||||
),
|
||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: const Color(0xFF69F0AE),
|
||||
foregroundColor: const Color(0xFF000000),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// SAR Navy Blue theme (Professional/Operations tones)
|
||||
static ThemeData get sarNavyBlueTheme {
|
||||
return ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: const ColorScheme.dark(
|
||||
brightness: Brightness.dark,
|
||||
primary: Color(0xFF5C9FFF), // Bright navy blue
|
||||
onPrimary: Color(0xFF000000),
|
||||
primaryContainer: Color(0xFF003366), // Dark navy
|
||||
onPrimaryContainer: Color(0xFFBBDEFF),
|
||||
secondary: Color(0xFF80B3FF),
|
||||
onSecondary: Color(0xFF000000),
|
||||
secondaryContainer: Color(0xFF002244),
|
||||
onSecondaryContainer: Color(0xFFBBDEFF),
|
||||
tertiary: Color(0xFF4DB8FF),
|
||||
onTertiary: Color(0xFF000000),
|
||||
error: Color(0xFFCF6679),
|
||||
onError: Color(0xFF000000),
|
||||
surface: Color(0xFF00111C), // Very dark blue-tinted
|
||||
onSurface: Color(0xFFE3F2FD),
|
||||
surfaceContainerHighest: Color(0xFF001A2D),
|
||||
onSurfaceVariant: Color(0xFFBBDEFF),
|
||||
outline: Color(0xFF5C9FFF),
|
||||
),
|
||||
scaffoldBackgroundColor: const Color(0xFF00111C),
|
||||
appBarTheme: const AppBarTheme(
|
||||
centerTitle: true,
|
||||
elevation: 0,
|
||||
backgroundColor: Color(0xFF001A2D),
|
||||
foregroundColor: Color(0xFFE3F2FD),
|
||||
),
|
||||
cardTheme: CardThemeData(
|
||||
elevation: 2,
|
||||
color: const Color(0xFF001A2D),
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
side: const BorderSide(
|
||||
color: Color(0xFF5C9FFF),
|
||||
width: 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
border: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(12),
|
||||
borderSide: const BorderSide(color: Color(0xFF5C9FFF)),
|
||||
),
|
||||
filled: true,
|
||||
fillColor: const Color(0xFF001A2D),
|
||||
),
|
||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||
style: ElevatedButton.styleFrom(
|
||||
backgroundColor: const Color(0xFF5C9FFF),
|
||||
foregroundColor: const Color(0xFF000000),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
// Get theme by mode
|
||||
static ThemeData getTheme(AppThemeMode mode, Brightness systemBrightness) {
|
||||
switch (mode) {
|
||||
case AppThemeMode.light:
|
||||
return lightTheme;
|
||||
case AppThemeMode.dark:
|
||||
return darkTheme;
|
||||
case AppThemeMode.sarRed:
|
||||
return sarRedTheme;
|
||||
case AppThemeMode.sarGreen:
|
||||
return sarGreenTheme;
|
||||
case AppThemeMode.sarNavyBlue:
|
||||
return sarNavyBlueTheme;
|
||||
case AppThemeMode.system:
|
||||
return systemBrightness == Brightness.dark ? darkTheme : lightTheme;
|
||||
}
|
||||
}
|
||||
|
||||
// Get display name for theme mode
|
||||
static String getThemeDisplayName(AppThemeMode mode) {
|
||||
switch (mode) {
|
||||
case AppThemeMode.light:
|
||||
return 'Light';
|
||||
case AppThemeMode.dark:
|
||||
return 'Dark';
|
||||
case AppThemeMode.sarRed:
|
||||
return 'SAR Red (Alert)';
|
||||
case AppThemeMode.sarGreen:
|
||||
return 'SAR Green (Safe)';
|
||||
case AppThemeMode.sarNavyBlue:
|
||||
return 'SAR Navy Blue (Ops)';
|
||||
case AppThemeMode.system:
|
||||
return 'Auto (System)';
|
||||
}
|
||||
}
|
||||
|
||||
// Get theme mode from string
|
||||
static AppThemeMode themeFromString(String themeName) {
|
||||
return AppThemeMode.values.firstWhere(
|
||||
(mode) => mode.name == themeName,
|
||||
orElse: () => AppThemeMode.system,
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user