264 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
		
		
			
		
	
	
			264 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| 
								 | 
							
								import 'package:flutter/material.dart';
							 | 
						||
| 
								 | 
							
								import '../core/app_export.dart';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								String _appTheme = "lightCode";
							 | 
						||
| 
								 | 
							
								LightCodeColors get appTheme => ThemeHelper().themeColor();
							 | 
						||
| 
								 | 
							
								ThemeData get theme => ThemeHelper().themeData();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Helper class for managing themes and colors.
							 | 
						||
| 
								 | 
							
								// ignore_for_file: must_be_immutable
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ignore_for_file: must_be_immutable
							 | 
						||
| 
								 | 
							
								class ThemeHelper {
							 | 
						||
| 
								 | 
							
								  // A map of custom color themes supported by the app
							 | 
						||
| 
								 | 
							
								  final Map<String, LightCodeColors> _supportedCustomColor = {
							 | 
						||
| 
								 | 
							
								    'lightCode': LightCodeColors()
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// A map of color schemes supported by the app
							 | 
						||
| 
								 | 
							
								  final Map<String, ColorScheme> _supportedColorScheme = {
							 | 
						||
| 
								 | 
							
								    'lightCode': ColorSchemes.lightCodeColorScheme
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /// Changes the app theme to [newTheme].
							 | 
						||
| 
								 | 
							
								  void changeTheme(String newTheme) {
							 | 
						||
| 
								 | 
							
								    _appTheme = newTheme;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /// Returns the lightCode colors for the current theme.
							 | 
						||
| 
								 | 
							
								  LightCodeColors _getThemeColors() {
							 | 
						||
| 
								 | 
							
								    return _supportedCustomColor[_appTheme] ?? LightCodeColors();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /// Returns the current theme data.
							 | 
						||
| 
								 | 
							
								  ThemeData _getThemeData() {
							 | 
						||
| 
								 | 
							
								    var colorScheme =
							 | 
						||
| 
								 | 
							
								        _supportedColorScheme[_appTheme] ?? ColorSchemes.lightCodeColorScheme;
							 | 
						||
| 
								 | 
							
								    return ThemeData(
							 | 
						||
| 
								 | 
							
								      visualDensity: VisualDensity.standard,
							 | 
						||
| 
								 | 
							
								      colorScheme: colorScheme,
							 | 
						||
| 
								 | 
							
								      textTheme: TextThemes.textTheme(colorScheme),
							 | 
						||
| 
								 | 
							
								      scaffoldBackgroundColor: appTheme.gray100,
							 | 
						||
| 
								 | 
							
								      elevatedButtonTheme: ElevatedButtonThemeData(
							 | 
						||
| 
								 | 
							
								        style: ElevatedButton.styleFrom(
							 | 
						||
| 
								 | 
							
								          backgroundColor: colorScheme.primary,
							 | 
						||
| 
								 | 
							
								          shape: RoundedRectangleBorder(
							 | 
						||
| 
								 | 
							
								            borderRadius: BorderRadius.circular(8),
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          shadowColor: appTheme.black900.withOpacity(0.4),
							 | 
						||
| 
								 | 
							
								          elevation: 2,
							 | 
						||
| 
								 | 
							
								          visualDensity: const VisualDensity(
							 | 
						||
| 
								 | 
							
								            vertical: -4,
							 | 
						||
| 
								 | 
							
								            horizontal: -4,
							 | 
						||
| 
								 | 
							
								          ),
							 | 
						||
| 
								 | 
							
								          padding: EdgeInsets.zero,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								      ),
							 | 
						||
| 
								 | 
							
								      dividerTheme: DividerThemeData(
							 | 
						||
| 
								 | 
							
								        thickness: 1,
							 | 
						||
| 
								 | 
							
								        space: 1,
							 | 
						||
| 
								 | 
							
								        color: colorScheme.onPrimaryContainer.withOpacity(0.2),
							 | 
						||
| 
								 | 
							
								      ),
							 | 
						||
| 
								 | 
							
								    );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /// Returns the lightCode colors for the current theme.
							 | 
						||
| 
								 | 
							
								  LightCodeColors themeColor() => _getThemeColors();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /// Returns the current theme data.
							 | 
						||
| 
								 | 
							
								  ThemeData themeData() => _getThemeData();
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Class containing the supported text theme styles.
							 | 
						||
| 
								 | 
							
								class TextThemes {
							 | 
						||
| 
								 | 
							
								  static TextTheme textTheme(ColorScheme colorScheme) => TextTheme(
							 | 
						||
| 
								 | 
							
								        bodyMedium: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: colorScheme.onPrimaryContainer.withOpacity(1),
							 | 
						||
| 
								 | 
							
								          fontSize: 13.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Roboto',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w400,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        bodySmall: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: appTheme.gray500,
							 | 
						||
| 
								 | 
							
								          fontSize: 8.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w300,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        headlineLarge: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: appTheme.black900,
							 | 
						||
| 
								 | 
							
								          fontSize: 30.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w600,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        headlineSmall: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: appTheme.black900,
							 | 
						||
| 
								 | 
							
								          fontSize: 25.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w400,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        labelLarge: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: colorScheme.onPrimaryContainer.withOpacity(1),
							 | 
						||
| 
								 | 
							
								          fontSize: 12.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w500,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        labelMedium: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: colorScheme.onPrimaryContainer.withOpacity(1),
							 | 
						||
| 
								 | 
							
								          fontSize: 10.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w500,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        labelSmall: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: colorScheme.onPrimaryContainer.withOpacity(1),
							 | 
						||
| 
								 | 
							
								          fontSize: 8.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Open Sans',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w600,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        titleLarge: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: appTheme.black900,
							 | 
						||
| 
								 | 
							
								          fontSize: 20.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w400,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        titleMedium: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: appTheme.black900,
							 | 
						||
| 
								 | 
							
								          fontSize: 18.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Poppins',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w600,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								        titleSmall: TextStyle(
							 | 
						||
| 
								 | 
							
								          color: appTheme.black900,
							 | 
						||
| 
								 | 
							
								          fontSize: 14.fSize,
							 | 
						||
| 
								 | 
							
								          fontFamily: 'Montserrat',
							 | 
						||
| 
								 | 
							
								          fontWeight: FontWeight.w700,
							 | 
						||
| 
								 | 
							
								        ),
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Class containing the supported color schemes.
							 | 
						||
| 
								 | 
							
								class ColorSchemes {
							 | 
						||
| 
								 | 
							
								  static const lightCodeColorScheme = ColorScheme.light(
							 | 
						||
| 
								 | 
							
								    primary: Color(0XFF8DB1F7),
							 | 
						||
| 
								 | 
							
								    primaryContainer: Color(0XFF2E353E),
							 | 
						||
| 
								 | 
							
								    errorContainer: Color(0XFF777777),
							 | 
						||
| 
								 | 
							
								    onPrimary: Color(0XFF1C2026),
							 | 
						||
| 
								 | 
							
								    onPrimaryContainer: Color(0X75FFFFFF),
							 | 
						||
| 
								 | 
							
								  );
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// Class containing custom colors for a lightCode theme.
							 | 
						||
| 
								 | 
							
								class LightCodeColors {
							 | 
						||
| 
								 | 
							
								  // Black
							 | 
						||
| 
								 | 
							
								  Color get black900 => const Color(0XFF000000);
							 | 
						||
| 
								 | 
							
								// Blue
							 | 
						||
| 
								 | 
							
								  Color get blueA200 => const Color(0XFF5285E8);
							 | 
						||
| 
								 | 
							
								// BlueGray
							 | 
						||
| 
								 | 
							
								  Color get blueGray400 => const Color(0XFF888888);
							 | 
						||
| 
								 | 
							
								  Color get blueGray50 => const Color(0XFFF1F1F1);
							 | 
						||
| 
								 | 
							
								  Color get blueGray700 => const Color(0XFF535D67);
							 | 
						||
| 
								 | 
							
								  Color get blueGray800 => const Color(0XFF454B55);
							 | 
						||
| 
								 | 
							
								// Cyan
							 | 
						||
| 
								 | 
							
								  Color get cyan600 => const Color(0XFF1DA1BE);
							 | 
						||
| 
								 | 
							
								  Color get cyan900 => const Color(0XFF105955);
							 | 
						||
| 
								 | 
							
								// Gray
							 | 
						||
| 
								 | 
							
								  Color get gray100 => const Color(0XFFF0F5F4);
							 | 
						||
| 
								 | 
							
								  Color get gray500 => const Color(0XFFAAAAAA);
							 | 
						||
| 
								 | 
							
								  Color get gray700 => const Color(0XFF636363);
							 | 
						||
| 
								 | 
							
								  Color get gray900 => const Color(0XFF1E232C);
							 | 
						||
| 
								 | 
							
								// Green
							 | 
						||
| 
								 | 
							
								  Color get green50 => const Color(0XFFD9F9DA);
							 | 
						||
| 
								 | 
							
								  Color get green800 => const Color(0XFF159021);
							 | 
						||
| 
								 | 
							
								  Color get green80001 => const Color(0XFF0CAC13);
							 | 
						||
| 
								 | 
							
								  Color get gray50 => const Color(0XFFF7F8F9);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Blue
							 | 
						||
| 
								 | 
							
								  Color get blue400 => const Color(0XFF34AADF);
							 | 
						||
| 
								 | 
							
								  Color get blueA100 => const Color(0XFF8DB1F7);
							 | 
						||
| 
								 | 
							
								  Color get blueA400 => const Color(0XFF337FFF);
							 | 
						||
| 
								 | 
							
								// BlueGray
							 | 
						||
| 
								 | 
							
								  Color get blueGray200 => const Color(0XFFB8BCCA);
							 | 
						||
| 
								 | 
							
								  Color get blueGray40001 => const Color(0XFF888888);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// DeepOrange
							 | 
						||
| 
								 | 
							
								  Color get deepOrangeA400 => const Color(0XFFFF4500);
							 | 
						||
| 
								 | 
							
								// Indigo
							 | 
						||
| 
								 | 
							
								  Color get indigo50 => const Color(0XFFE8ECF4);
							 | 
						||
| 
								 | 
							
								// LightGreen
							 | 
						||
| 
								 | 
							
								  Color get lightGreenA200 => const Color(0XFFC7FC6C);
							 | 
						||
| 
								 | 
							
								  Color get lightGreenA20001 => const Color(0XFFC0FE53);
							 | 
						||
| 
								 | 
							
								// Red
							 | 
						||
| 
								 | 
							
								  Color get red100 => const Color(0XFFF8C6CC);
							 | 
						||
| 
								 | 
							
								  Color get red600 => const Color(0XFFE73E3E);
							 | 
						||
| 
								 | 
							
								  Color get red700 => const Color(0XFFDA2037);
							 | 
						||
| 
								 | 
							
								// Teal
							 | 
						||
| 
								 | 
							
								  Color get teal100 => const Color(0XFFA5E0DD);
							 | 
						||
| 
								 | 
							
								// Yellow
							 | 
						||
| 
								 | 
							
								  Color get yellow900 => const Color(0XFFEE7429);
							 | 
						||
| 
								 | 
							
								  Color get gray600 => const Color(0XFF6A707C);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// DeepPurple
							 | 
						||
| 
								 | 
							
								  Color get deepPurpleA400 => const Color(0XFF5030E5);
							 | 
						||
| 
								 | 
							
								// Gray
							 | 
						||
| 
								 | 
							
								  Color get gray10001 => const Color(0XFFF0F5F4);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color get gray90001 => const Color(0XFF1B1919);
							 | 
						||
| 
								 | 
							
								// Red
							 | 
						||
| 
								 | 
							
								  Color get red500 => const Color(0XFFF14336);
							 | 
						||
| 
								 | 
							
								// White
							 | 
						||
| 
								 | 
							
								  Color get whiteA700 => const Color(0XFFFFFFFF);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// GrayB
							 | 
						||
| 
								 | 
							
								  Color get gray100B2 => const Color(0XB2F7F7F7);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color get gray300 => const Color(0XFFE4E4E6);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Amber
							 | 
						||
| 
								 | 
							
								  Color get amberA700 => const Color(0XFFFFAE00);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// LightBlue
							 | 
						||
| 
								 | 
							
								  Color get lightBlue900 => const Color(0XFF006699);
							 | 
						||
| 
								 | 
							
								  Color get lightBlueA200 => const Color(0XFF33CCFF);
							 | 
						||
| 
								 | 
							
								  Color get lightBlueA20001 => const Color(0XFF36C5F0);
							 | 
						||
| 
								 | 
							
								// BlueGray
							 | 
						||
| 
								 | 
							
								  Color get blueGray100 => const Color(0XFFD9D9D9);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// LightGreen
							 | 
						||
| 
								 | 
							
								  Color get lightGreen100 => const Color(0XFFDDF8BB);
							 | 
						||
| 
								 | 
							
								  Color get lightGreenA20000 => const Color(0X00BBFB4C);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Lime
							 | 
						||
| 
								 | 
							
								  Color get limeA200 => const Color(0XFFF8FF4A);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Yellow
							 | 
						||
| 
								 | 
							
								  Color get yellow400 => const Color(0XFFE8FF61);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Amber
							 | 
						||
| 
								 | 
							
								  Color get amber300 => const Color(0XFFFFDB61);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color get blueA20001 => const Color(0XFF4C7FE4);
							 | 
						||
| 
								 | 
							
								  Color get blueA20002 => const Color(0XFF5285E8);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// DeepOrange
							 | 
						||
| 
								 | 
							
								  Color get deepOrange300 => const Color(0XFFFF9969);
							 | 
						||
| 
								 | 
							
								  Color get deepOrangeA200 => const Color(0XFFFF6C2C);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color get gray200 => const Color(0XFFEFEFEF);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color get gray800 => const Color(0XFF383838);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Green
							 | 
						||
| 
								 | 
							
								  Color get green600 => const Color(0XFF239F57);
							 | 
						||
| 
								 | 
							
								  Color get green900 => const Color(0XFF096A2F);
							 | 
						||
| 
								 | 
							
								  Color get greenA700 => const Color(0XFF13A445);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Orange
							 | 
						||
| 
								 | 
							
								  Color get orange900 => const Color(0XFFD15C0B);
							 | 
						||
| 
								 | 
							
								// Pink
							 | 
						||
| 
								 | 
							
								  Color get pink400 => const Color(0XFFD44164);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Color get red900 => const Color(0XFFAF000D);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Yellow
							 | 
						||
| 
								 | 
							
								  Color get yellow600 => const Color(0XFFFFDA2B);
							 | 
						||
| 
								 | 
							
								}
							 |