- Dark / light mode a funcionar no lado do aluno

- Atualização dos ficheiros markdown.
This commit is contained in:
2026-05-14 22:07:03 +01:00
parent 55ec2521cf
commit 62b9a107bc
30 changed files with 2582 additions and 1839 deletions

View File

@@ -9,24 +9,24 @@ class AppTheme {
useMaterial3: true,
brightness: Brightness.light,
colorScheme: ColorScheme.fromSeed(
seedColor: AppColors.primaryBlue,
seedColor: AppColors.primaryTeal,
brightness: Brightness.light,
primary: AppColors.primaryBlue,
secondary: AppColors.primaryTeal,
surface: AppColors.surface,
background: AppColors.background,
primary: AppColors.primaryTeal,
secondary: AppColors.primaryOrange,
surface: LightColors.surface,
background: LightColors.background,
error: AppColors.error,
),
// App Bar Theme
appBarTheme: const AppBarTheme(
backgroundColor: AppColors.surface,
foregroundColor: AppColors.textPrimary,
backgroundColor: LightColors.surface,
foregroundColor: LightColors.textPrimary,
elevation: 0,
centerTitle: true,
systemOverlayStyle: SystemUiOverlayStyle.dark,
titleTextStyle: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 18,
fontWeight: FontWeight.w600,
),
@@ -34,7 +34,7 @@ class AppTheme {
// Card Theme
cardTheme: CardThemeData(
color: AppColors.cardBackground,
color: LightColors.cardBackground,
elevation: 2,
shadowColor: Colors.black.withOpacity(0.08),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
@@ -44,10 +44,10 @@ class AppTheme {
// Elevated Button Theme
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: AppColors.buttonPrimary,
backgroundColor: LightColors.buttonPrimary,
foregroundColor: Colors.white,
elevation: 2,
shadowColor: AppColors.primaryBlue.withOpacity(0.3),
shadowColor: AppColors.primaryTeal.withOpacity(0.3),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
@@ -59,8 +59,8 @@ class AppTheme {
// Outlined Button Theme
outlinedButtonTheme: OutlinedButtonThemeData(
style: OutlinedButton.styleFrom(
foregroundColor: AppColors.primaryBlue,
side: BorderSide(color: AppColors.primaryBlue.withOpacity(0.3)),
foregroundColor: AppColors.primaryTeal,
side: BorderSide(color: AppColors.primaryTeal.withOpacity(0.3)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
@@ -72,7 +72,7 @@ class AppTheme {
// Text Button Theme
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
foregroundColor: AppColors.primaryBlue,
foregroundColor: AppColors.primaryTeal,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
textStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w600),
@@ -82,18 +82,18 @@ class AppTheme {
// Input Field Theme
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: AppColors.surface,
fillColor: LightColors.surface,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: AppColors.primaryBlue.withOpacity(0.3)),
borderSide: BorderSide(color: AppColors.primaryTeal.withOpacity(0.3)),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: AppColors.primaryBlue.withOpacity(0.3)),
borderSide: BorderSide(color: AppColors.primaryTeal.withOpacity(0.3)),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.primaryBlue, width: 2),
borderSide: const BorderSide(color: AppColors.primaryTeal, width: 2),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
@@ -103,9 +103,9 @@ class AppTheme {
horizontal: 16,
vertical: 12,
),
hintStyle: const TextStyle(color: AppColors.textHint, fontSize: 14),
hintStyle: const TextStyle(color: LightColors.textHint, fontSize: 14),
labelStyle: const TextStyle(
color: AppColors.textSecondary,
color: LightColors.textSecondary,
fontSize: 14,
fontWeight: FontWeight.w500,
),
@@ -113,85 +113,85 @@ class AppTheme {
// Text Field Theme
textSelectionTheme: TextSelectionThemeData(
cursorColor: AppColors.primaryBlue,
selectionColor: AppColors.primaryBlue.withOpacity(0.3),
selectionHandleColor: AppColors.primaryBlue,
cursorColor: AppColors.primaryTeal,
selectionColor: AppColors.primaryTeal.withOpacity(0.3),
selectionHandleColor: AppColors.primaryTeal,
),
// Text Theme
textTheme: const TextTheme(
displayLarge: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 32,
fontWeight: FontWeight.bold,
),
displayMedium: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 28,
fontWeight: FontWeight.bold,
),
displaySmall: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 24,
fontWeight: FontWeight.bold,
),
headlineLarge: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 22,
fontWeight: FontWeight.w600,
),
headlineMedium: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 20,
fontWeight: FontWeight.w600,
),
headlineSmall: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 18,
fontWeight: FontWeight.w600,
),
titleLarge: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 16,
fontWeight: FontWeight.w600,
),
titleMedium: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 14,
fontWeight: FontWeight.w600,
),
titleSmall: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 12,
fontWeight: FontWeight.w600,
),
bodyLarge: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 16,
fontWeight: FontWeight.normal,
),
bodyMedium: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 14,
fontWeight: FontWeight.normal,
),
bodySmall: TextStyle(
color: AppColors.textSecondary,
color: LightColors.textSecondary,
fontSize: 12,
fontWeight: FontWeight.normal,
),
labelLarge: TextStyle(
color: AppColors.textPrimary,
color: LightColors.textPrimary,
fontSize: 14,
fontWeight: FontWeight.w500,
),
labelMedium: TextStyle(
color: AppColors.textSecondary,
color: LightColors.textSecondary,
fontSize: 12,
fontWeight: FontWeight.w500,
),
labelSmall: TextStyle(
color: AppColors.textHint,
color: LightColors.textHint,
fontSize: 10,
fontWeight: FontWeight.w500,
),
@@ -199,9 +199,9 @@ class AppTheme {
// Bottom Navigation Bar Theme
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
backgroundColor: AppColors.surface,
selectedItemColor: AppColors.primaryBlue,
unselectedItemColor: AppColors.iconInactive,
backgroundColor: LightColors.surface,
selectedItemColor: AppColors.primaryTeal,
unselectedItemColor: LightColors.iconInactive,
type: BottomNavigationBarType.fixed,
elevation: 8,
selectedLabelStyle: TextStyle(
@@ -216,7 +216,7 @@ class AppTheme {
// Floating Action Button Theme
floatingActionButtonTheme: FloatingActionButtonThemeData(
backgroundColor: AppColors.primaryBlue,
backgroundColor: AppColors.primaryTeal,
foregroundColor: Colors.white,
elevation: 4,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
@@ -224,28 +224,28 @@ class AppTheme {
// Divider Theme
dividerTheme: const DividerThemeData(
color: AppColors.buttonSecondary,
color: LightColors.divider,
thickness: 1,
space: 1,
),
// Icon Theme
iconTheme: const IconThemeData(color: AppColors.iconActive, size: 24),
iconTheme: const IconThemeData(color: LightColors.iconActive, size: 24),
// Progress Indicator Theme
progressIndicatorTheme: const ProgressIndicatorThemeData(
color: AppColors.primaryBlue,
linearTrackColor: AppColors.buttonSecondary,
circularTrackColor: AppColors.buttonSecondary,
color: AppColors.primaryTeal,
linearTrackColor: LightColors.buttonSecondary,
circularTrackColor: LightColors.buttonSecondary,
),
// Chip Theme
chipTheme: ChipThemeData(
backgroundColor: AppColors.buttonSecondary,
selectedColor: AppColors.primaryBlue.withOpacity(0.1),
disabledColor: AppColors.buttonSecondary.withOpacity(0.5),
labelStyle: const TextStyle(color: AppColors.textPrimary),
secondaryLabelStyle: const TextStyle(color: AppColors.textPrimary),
backgroundColor: LightColors.buttonSecondary,
selectedColor: AppColors.primaryTeal.withOpacity(0.1),
disabledColor: LightColors.buttonSecondary.withOpacity(0.5),
labelStyle: const TextStyle(color: LightColors.textPrimary),
secondaryLabelStyle: const TextStyle(color: LightColors.textPrimary),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
@@ -257,52 +257,90 @@ class AppTheme {
useMaterial3: true,
brightness: Brightness.dark,
colorScheme: ColorScheme.fromSeed(
seedColor: AppColors.primaryBlue,
seedColor: AppColors.primaryTeal,
brightness: Brightness.dark,
primary: AppColors.primaryBlue,
secondary: AppColors.primaryTeal,
surface: AppColors.darkSurface,
background: AppColors.darkBackground,
primary: AppColors.primaryTeal,
secondary: AppColors.primaryOrange,
surface: DarkColors.surface,
background: DarkColors.background,
error: AppColors.error,
),
// Dark mode specific overrides would go here
appBarTheme: const AppBarTheme(
backgroundColor: AppColors.darkSurface,
foregroundColor: AppColors.darkTextPrimary,
backgroundColor: DarkColors.surface,
foregroundColor: DarkColors.textPrimary,
elevation: 0,
centerTitle: true,
systemOverlayStyle: SystemUiOverlayStyle.light,
titleTextStyle: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 18,
fontWeight: FontWeight.w600,
),
),
cardTheme: CardThemeData(
color: AppColors.darkSurface,
color: DarkColors.cardBackground,
elevation: 2,
shadowColor: Colors.black.withOpacity(0.3),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
),
// Elevated Button Theme for Dark Mode
elevatedButtonTheme: ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: DarkColors.buttonPrimary,
foregroundColor: Colors.white,
elevation: 2,
shadowColor: AppColors.primaryTeal.withOpacity(0.3),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
textStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
),
),
// Outlined Button Theme for Dark Mode
outlinedButtonTheme: OutlinedButtonThemeData(
style: OutlinedButton.styleFrom(
foregroundColor: AppColors.primaryTeal,
side: BorderSide(color: AppColors.primaryTeal.withOpacity(0.3)),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
padding: const EdgeInsets.symmetric(horizontal: 24, vertical: 16),
textStyle: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
),
),
// Text Button Theme for Dark Mode
textButtonTheme: TextButtonThemeData(
style: TextButton.styleFrom(
foregroundColor: AppColors.primaryTeal,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 12),
textStyle: const TextStyle(fontSize: 14, fontWeight: FontWeight.w600),
),
),
// Input Field Theme for Dark Mode
inputDecorationTheme: InputDecorationTheme(
filled: true,
fillColor: AppColors.darkSurface,
fillColor: DarkColors.surface,
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: AppColors.primaryBlue.withOpacity(0.3)),
borderSide: BorderSide(color: AppColors.primaryTeal.withOpacity(0.3)),
),
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: BorderSide(color: AppColors.primaryBlue.withOpacity(0.3)),
borderSide: BorderSide(color: AppColors.primaryTeal.withOpacity(0.3)),
),
focusedBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
borderSide: const BorderSide(color: AppColors.primaryBlue, width: 2),
borderSide: const BorderSide(color: AppColors.primaryTeal, width: 2),
),
errorBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(12),
@@ -313,11 +351,11 @@ class AppTheme {
vertical: 12,
),
hintStyle: const TextStyle(
color: AppColors.darkTextSecondary,
color: DarkColors.textSecondary,
fontSize: 14,
),
labelStyle: const TextStyle(
color: AppColors.darkTextSecondary,
color: DarkColors.textSecondary,
fontSize: 14,
fontWeight: FontWeight.w500,
),
@@ -325,88 +363,141 @@ class AppTheme {
// Text Field Theme for Dark Mode
textSelectionTheme: TextSelectionThemeData(
cursorColor: AppColors.primaryBlue,
selectionColor: AppColors.primaryBlue.withOpacity(0.3),
selectionHandleColor: AppColors.primaryBlue,
cursorColor: AppColors.primaryTeal,
selectionColor: AppColors.primaryTeal.withOpacity(0.3),
selectionHandleColor: AppColors.primaryTeal,
),
textTheme: const TextTheme(
displayLarge: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 32,
fontWeight: FontWeight.bold,
),
displayMedium: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 28,
fontWeight: FontWeight.bold,
),
displaySmall: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 24,
fontWeight: FontWeight.bold,
),
headlineLarge: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 22,
fontWeight: FontWeight.w600,
),
headlineMedium: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 20,
fontWeight: FontWeight.w600,
),
headlineSmall: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 18,
fontWeight: FontWeight.w600,
),
titleLarge: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 16,
fontWeight: FontWeight.w600,
),
titleMedium: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 14,
fontWeight: FontWeight.w600,
),
titleSmall: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 12,
fontWeight: FontWeight.w600,
),
bodyLarge: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 16,
fontWeight: FontWeight.normal,
),
bodyMedium: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 14,
fontWeight: FontWeight.normal,
),
bodySmall: TextStyle(
color: AppColors.darkTextSecondary,
color: DarkColors.textSecondary,
fontSize: 12,
fontWeight: FontWeight.normal,
),
labelLarge: TextStyle(
color: AppColors.darkTextPrimary,
color: DarkColors.textPrimary,
fontSize: 14,
fontWeight: FontWeight.w500,
),
labelMedium: TextStyle(
color: AppColors.darkTextSecondary,
color: DarkColors.textSecondary,
fontSize: 12,
fontWeight: FontWeight.w500,
),
labelSmall: TextStyle(
color: AppColors.darkTextSecondary,
color: DarkColors.textSecondary,
fontSize: 10,
fontWeight: FontWeight.w500,
),
),
// Bottom Navigation Bar Theme for Dark Mode
bottomNavigationBarTheme: const BottomNavigationBarThemeData(
backgroundColor: DarkColors.surface,
selectedItemColor: AppColors.primaryTeal,
unselectedItemColor: DarkColors.iconInactive,
type: BottomNavigationBarType.fixed,
elevation: 8,
selectedLabelStyle: TextStyle(
fontSize: 12,
fontWeight: FontWeight.w600,
),
unselectedLabelStyle: TextStyle(
fontSize: 12,
fontWeight: FontWeight.normal,
),
),
// Floating Action Button Theme for Dark Mode
floatingActionButtonTheme: FloatingActionButtonThemeData(
backgroundColor: AppColors.primaryTeal,
foregroundColor: Colors.white,
elevation: 4,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(16)),
),
// Divider Theme for Dark Mode
dividerTheme: const DividerThemeData(
color: DarkColors.divider,
thickness: 1,
space: 1,
),
// Icon Theme for Dark Mode
iconTheme: const IconThemeData(color: DarkColors.iconActive, size: 24),
// Progress Indicator Theme for Dark Mode
progressIndicatorTheme: const ProgressIndicatorThemeData(
color: AppColors.primaryTeal,
linearTrackColor: DarkColors.buttonSecondary,
circularTrackColor: DarkColors.buttonSecondary,
),
// Chip Theme for Dark Mode
chipTheme: ChipThemeData(
backgroundColor: DarkColors.buttonSecondary,
selectedColor: AppColors.primaryTeal.withOpacity(0.1),
disabledColor: DarkColors.buttonSecondary.withOpacity(0.5),
labelStyle: const TextStyle(color: DarkColors.textPrimary),
secondaryLabelStyle: const TextStyle(color: DarkColors.textPrimary),
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 8),
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
),
);
}
}