app_theme.dart 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import 'package:flutter/material.dart';
  2. /// App-wide light/dark theme. The MPOB ripeness palette
  3. /// (lib/constants/mpob_colors.dart) and the live-scan camera overlay
  4. /// colors are intentionally NOT sourced from here — those are fixed
  5. /// semantic/functional colors, not brand chrome.
  6. class AppTheme {
  7. AppTheme._();
  8. // Teal-green brand family.
  9. static const _primaryLight = Color(0xFF0F6E56);
  10. static const _primaryDark = Color(0xFF5DCAA5);
  11. static const _primaryContainerLight = Color(0xFF9FE1CB);
  12. static const _primaryContainerDark = Color(0xFF085041);
  13. // Amber accent family.
  14. static const _secondaryLight = Color(0xFFBA7517);
  15. static const _secondaryDark = Color(0xFFFAC775);
  16. static const _secondaryContainerLight = Color(0xFFFAEEDA);
  17. static const _secondaryContainerDark = Color(0xFF633806);
  18. // Surfaces.
  19. static const _surfaceLight = Color(0xFFFAEEDA);
  20. static const _surfaceDark = Color(0xFF101913);
  21. static const _surfaceContainerLight = Color(0xFFFFFFFF);
  22. static const _surfaceContainerDark = Color(0xFF1B241D);
  23. static const List<Color> chartAccents = [
  24. Color(0xFF378ADD), // blue
  25. Color(0xFF1D9E75), // teal
  26. Color(0xFFEF9F27), // amber
  27. Color(0xFF7F77DD), // purple
  28. Color(0xFF888780), // neutral
  29. ];
  30. static ThemeData get light {
  31. final colorScheme = ColorScheme.light(
  32. primary: _primaryLight,
  33. onPrimary: Colors.white,
  34. primaryContainer: _primaryContainerLight,
  35. onPrimaryContainer: const Color(0xFF04342C),
  36. secondary: _secondaryLight,
  37. onSecondary: Colors.white,
  38. secondaryContainer: _secondaryContainerLight,
  39. onSecondaryContainer: const Color(0xFF412402),
  40. surface: _surfaceLight,
  41. onSurface: const Color(0xFF04342C),
  42. surfaceContainerHighest: _surfaceContainerLight,
  43. error: const Color(0xFFE24B4A),
  44. onError: Colors.white,
  45. );
  46. return _themeFrom(colorScheme);
  47. }
  48. static ThemeData get dark {
  49. final colorScheme = ColorScheme.dark(
  50. primary: _primaryDark,
  51. onPrimary: const Color(0xFF04342C),
  52. primaryContainer: _primaryContainerDark,
  53. onPrimaryContainer: const Color(0xFFE1F5EE),
  54. secondary: _secondaryDark,
  55. onSecondary: const Color(0xFF412402),
  56. secondaryContainer: _secondaryContainerDark,
  57. onSecondaryContainer: const Color(0xFFFAEEDA),
  58. surface: _surfaceDark,
  59. onSurface: const Color(0xFFE1F5EE),
  60. surfaceContainerHighest: _surfaceContainerDark,
  61. error: const Color(0xFFF09595),
  62. onError: const Color(0xFF501313),
  63. );
  64. return _themeFrom(colorScheme);
  65. }
  66. static ThemeData _themeFrom(ColorScheme colorScheme) {
  67. return ThemeData(
  68. useMaterial3: true,
  69. colorScheme: colorScheme,
  70. scaffoldBackgroundColor: colorScheme.surface,
  71. appBarTheme: AppBarTheme(
  72. backgroundColor: colorScheme.primary,
  73. foregroundColor: colorScheme.onPrimary,
  74. elevation: 2,
  75. ),
  76. cardTheme: CardThemeData(
  77. color: colorScheme.surfaceContainerHighest,
  78. elevation: 3,
  79. shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(15)),
  80. ),
  81. );
  82. }
  83. }