Extract settings and harden geofence automation
This commit is contained in:
110
lib/features/settings/models/app_theme_preset.dart
Normal file
110
lib/features/settings/models/app_theme_preset.dart
Normal file
@@ -0,0 +1,110 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum AppThemePreset {
|
||||
ember,
|
||||
graphite,
|
||||
moss;
|
||||
|
||||
static const AppThemePreset fallback = AppThemePreset.ember;
|
||||
|
||||
String get storageValue => switch (this) {
|
||||
AppThemePreset.ember => 'ember',
|
||||
AppThemePreset.graphite => 'graphite',
|
||||
AppThemePreset.moss => 'moss',
|
||||
};
|
||||
|
||||
String get title => switch (this) {
|
||||
AppThemePreset.ember => 'Ember',
|
||||
AppThemePreset.graphite => 'Graphite',
|
||||
AppThemePreset.moss => 'Moss',
|
||||
};
|
||||
|
||||
String get subtitle => switch (this) {
|
||||
AppThemePreset.ember => 'Тёплая тёмная тема по умолчанию',
|
||||
AppThemePreset.graphite => 'Холодная тёмная тема для пульта',
|
||||
AppThemePreset.moss => 'Тёмная зелёная тема для спокойного режима',
|
||||
};
|
||||
|
||||
Color get accentColor => switch (this) {
|
||||
AppThemePreset.ember => const Color(0xFFFF6B2C),
|
||||
AppThemePreset.graphite => const Color(0xFF5BC0BE),
|
||||
AppThemePreset.moss => const Color(0xFF8AA05A),
|
||||
};
|
||||
|
||||
ThemeData get themeData => switch (this) {
|
||||
AppThemePreset.ember => _buildDarkTheme(
|
||||
seedColor: const Color(0xFFFF6B2C),
|
||||
scaffoldBackgroundColor: const Color(0xFF0E0E0E),
|
||||
surfaceColor: const Color(0xFF1C1A18),
|
||||
appBarColor: const Color(0xFF191715),
|
||||
),
|
||||
AppThemePreset.graphite => _buildDarkTheme(
|
||||
seedColor: const Color(0xFF5BC0BE),
|
||||
scaffoldBackgroundColor: const Color(0xFF0C1217),
|
||||
surfaceColor: const Color(0xFF151D24),
|
||||
appBarColor: const Color(0xFF121920),
|
||||
),
|
||||
AppThemePreset.moss => _buildDarkTheme(
|
||||
seedColor: const Color(0xFF8AA05A),
|
||||
scaffoldBackgroundColor: const Color(0xFF10140F),
|
||||
surfaceColor: const Color(0xFF1A2118),
|
||||
appBarColor: const Color(0xFF161C15),
|
||||
),
|
||||
};
|
||||
|
||||
static AppThemePreset fromStorageValue(String? value) {
|
||||
for (final preset in AppThemePreset.values) {
|
||||
if (preset.storageValue == value) {
|
||||
return preset;
|
||||
}
|
||||
}
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
ThemeData _buildDarkTheme({
|
||||
required Color seedColor,
|
||||
required Color scaffoldBackgroundColor,
|
||||
required Color surfaceColor,
|
||||
required Color appBarColor,
|
||||
}) {
|
||||
final scheme = ColorScheme.fromSeed(
|
||||
seedColor: seedColor,
|
||||
brightness: Brightness.dark,
|
||||
);
|
||||
return ThemeData(
|
||||
useMaterial3: true,
|
||||
colorScheme: scheme,
|
||||
scaffoldBackgroundColor: scaffoldBackgroundColor,
|
||||
appBarTheme: AppBarTheme(
|
||||
backgroundColor: appBarColor,
|
||||
foregroundColor: Colors.white,
|
||||
elevation: 0,
|
||||
centerTitle: true,
|
||||
),
|
||||
cardTheme: CardThemeData(
|
||||
color: surfaceColor,
|
||||
elevation: 1.5,
|
||||
margin: EdgeInsets.zero,
|
||||
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(18)),
|
||||
),
|
||||
listTileTheme: const ListTileThemeData(iconColor: Colors.white70),
|
||||
inputDecorationTheme: InputDecorationTheme(
|
||||
filled: true,
|
||||
fillColor: surfaceColor,
|
||||
border: OutlineInputBorder(borderRadius: BorderRadius.circular(14)),
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
borderSide: BorderSide(color: Colors.white.withValues(alpha: 0.08)),
|
||||
),
|
||||
focusedBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(14),
|
||||
borderSide: BorderSide(color: scheme.primary, width: 1.4),
|
||||
),
|
||||
),
|
||||
sliderTheme: const SliderThemeData(
|
||||
trackHeight: 4,
|
||||
thumbShape: RoundSliderThumbShape(enabledThumbRadius: 8),
|
||||
),
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user