import 'package:flex_color_scheme/flex_color_scheme.dart'; import 'package:flutter/material.dart'; import 'package:hiddify/core/prefs/locale_prefs.dart'; enum AppThemeMode { system, light, dark, black; String present(TranslationsEn t) => switch (this) { system => t.settings.general.themeModes.system, light => t.settings.general.themeModes.light, dark => t.settings.general.themeModes.dark, black => t.settings.general.themeModes.black, }; ThemeMode get flutterThemeMode => switch (this) { system => ThemeMode.system, light => ThemeMode.light, dark => ThemeMode.dark, black => ThemeMode.dark, }; bool get trueBlack => this == black; } // mostly exact copy of flex color scheme 7.1's fabulous 12 theme class AppTheme { AppTheme( this.mode, this.fontFamily, ); final AppThemeMode mode; final String fontFamily; ThemeData light() { return FlexThemeData.light( scheme: FlexScheme.indigoM3, surfaceMode: FlexSurfaceMode.highScaffoldLowSurface, useMaterial3: true, swapLegacyOnMaterial3: true, useMaterial3ErrorColors: true, blendLevel: 1, subThemesData: const FlexSubThemesData( useTextTheme: true, useM2StyleDividerInM3: true, elevatedButtonSchemeColor: SchemeColor.onPrimaryContainer, elevatedButtonSecondarySchemeColor: SchemeColor.primaryContainer, outlinedButtonOutlineSchemeColor: SchemeColor.primary, toggleButtonsBorderSchemeColor: SchemeColor.primary, segmentedButtonSchemeColor: SchemeColor.primary, segmentedButtonBorderSchemeColor: SchemeColor.primary, unselectedToggleIsColored: true, sliderValueTinted: true, inputDecoratorSchemeColor: SchemeColor.primary, inputDecoratorBackgroundAlpha: 43, inputDecoratorUnfocusedHasBorder: false, inputDecoratorFocusedBorderWidth: 1.0, inputDecoratorPrefixIconSchemeColor: SchemeColor.primary, popupMenuRadius: 8.0, popupMenuElevation: 3.0, drawerIndicatorSchemeColor: SchemeColor.primary, bottomNavigationBarMutedUnselectedLabel: false, bottomNavigationBarMutedUnselectedIcon: false, menuRadius: 8.0, menuElevation: 3.0, menuBarRadius: 0.0, menuBarElevation: 2.0, menuBarShadowColor: Color(0x00000000), navigationBarSelectedLabelSchemeColor: SchemeColor.primary, navigationBarMutedUnselectedLabel: false, navigationBarSelectedIconSchemeColor: SchemeColor.onPrimary, navigationBarMutedUnselectedIcon: false, navigationBarIndicatorSchemeColor: SchemeColor.primary, navigationBarIndicatorOpacity: 1.00, navigationRailSelectedLabelSchemeColor: SchemeColor.primary, navigationRailMutedUnselectedLabel: false, navigationRailSelectedIconSchemeColor: SchemeColor.onPrimary, navigationRailMutedUnselectedIcon: false, navigationRailIndicatorSchemeColor: SchemeColor.primary, navigationRailIndicatorOpacity: 1.00, navigationRailBackgroundSchemeColor: SchemeColor.surface, ), keyColors: const FlexKeyColors( useSecondary: true, useTertiary: true, keepPrimary: true, ), tones: FlexTones.jolly(Brightness.light), visualDensity: FlexColorScheme.comfortablePlatformDensity, fontFamily: fontFamily, extensions: >{ ConnectionButtonTheme.light, }, ); } ThemeData dark() { return FlexThemeData.dark( scheme: FlexScheme.indigoM3, useMaterial3: true, swapLegacyOnMaterial3: true, useMaterial3ErrorColors: true, darkIsTrueBlack: mode.trueBlack, surfaceMode: FlexSurfaceMode.highScaffoldLowSurface, // blendLevel: 1, subThemesData: const FlexSubThemesData( blendTextTheme: true, useTextTheme: true, useM2StyleDividerInM3: true, elevatedButtonSchemeColor: SchemeColor.onPrimaryContainer, elevatedButtonSecondarySchemeColor: SchemeColor.primaryContainer, outlinedButtonOutlineSchemeColor: SchemeColor.primary, toggleButtonsBorderSchemeColor: SchemeColor.primary, segmentedButtonSchemeColor: SchemeColor.primary, segmentedButtonBorderSchemeColor: SchemeColor.primary, unselectedToggleIsColored: true, sliderValueTinted: true, inputDecoratorSchemeColor: SchemeColor.primary, inputDecoratorBackgroundAlpha: 43, inputDecoratorUnfocusedHasBorder: false, inputDecoratorFocusedBorderWidth: 1.0, inputDecoratorPrefixIconSchemeColor: SchemeColor.primary, popupMenuRadius: 8.0, popupMenuElevation: 3.0, drawerIndicatorSchemeColor: SchemeColor.primary, bottomNavigationBarMutedUnselectedLabel: false, bottomNavigationBarMutedUnselectedIcon: false, menuRadius: 8.0, menuElevation: 3.0, menuBarRadius: 0.0, menuBarElevation: 2.0, menuBarShadowColor: Color(0x00000000), navigationBarSelectedLabelSchemeColor: SchemeColor.primary, navigationBarMutedUnselectedLabel: false, navigationBarSelectedIconSchemeColor: SchemeColor.onPrimary, navigationBarMutedUnselectedIcon: false, navigationBarIndicatorSchemeColor: SchemeColor.primary, navigationBarIndicatorOpacity: 1.00, navigationRailSelectedLabelSchemeColor: SchemeColor.primary, navigationRailMutedUnselectedLabel: false, navigationRailSelectedIconSchemeColor: SchemeColor.onPrimary, navigationRailMutedUnselectedIcon: false, navigationRailIndicatorSchemeColor: SchemeColor.primary, navigationRailIndicatorOpacity: 1.00, navigationRailBackgroundSchemeColor: SchemeColor.surface, ), keyColors: const FlexKeyColors( useSecondary: true, useTertiary: true, ), // tones: FlexTones.jolly(Brightness.dark), visualDensity: FlexColorScheme.comfortablePlatformDensity, fontFamily: fontFamily, extensions: >{ ConnectionButtonTheme.light, }, ); } } class ConnectionButtonTheme extends ThemeExtension { const ConnectionButtonTheme({ this.idleColor, this.connectedColor, }); final Color? idleColor; final Color? connectedColor; static const ConnectionButtonTheme light = ConnectionButtonTheme( idleColor: Color(0xFF4a4d8b), connectedColor: Color(0xFF44a334), ); @override ThemeExtension copyWith({ Color? idleColor, Color? connectedColor, }) => ConnectionButtonTheme( idleColor: idleColor ?? this.idleColor, connectedColor: connectedColor ?? this.connectedColor, ); @override ThemeExtension lerp( covariant ThemeExtension? other, double t, ) { if (other is! ConnectionButtonTheme) { return this; } return ConnectionButtonTheme( idleColor: Color.lerp(idleColor, other.idleColor, t), connectedColor: Color.lerp(connectedColor, other.connectedColor, t), ); } }