diff --git a/lib/screens/main_shell.dart b/lib/screens/main_shell.dart index 7f76339..7561e2b 100644 --- a/lib/screens/main_shell.dart +++ b/lib/screens/main_shell.dart @@ -191,9 +191,9 @@ class _MainShellState extends State { begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ - colorScheme.surfaceContainerLowest, - colorScheme.surface, - const Color(0xFFF3EAD3), // Warm traditional restaurant sand/cream + ThemeManager.instance.backgroundColor, + ThemeManager.instance.backgroundColor, + ThemeManager.instance.backgroundGradientColor, ], ), ), diff --git a/lib/services/odoo_service.dart b/lib/services/odoo_service.dart index 73c2dbe..1c1c269 100644 --- a/lib/services/odoo_service.dart +++ b/lib/services/odoo_service.dart @@ -116,11 +116,15 @@ class OdooService { 'brand_logo': (res['brand_logo'] as String?) ?? '', 'primary_color': (res['primary_color'] as String?) ?? '#C62828', 'secondary_color': (res['secondary_color'] as String?) ?? '#FF8F00', + 'background_color': (res['background_color'] as String?) ?? '#FAF6EE', + 'background_gradient_color': (res['background_gradient_color'] as String?) ?? '#F3EAD3', }; // Save and apply new branding and theme colors dynamically await ThemeManager.instance.updateConfig( primaryHex: configMap['primary_color']!, secondaryHex: configMap['secondary_color']!, + backgroundHex: configMap['background_color']!, + backgroundGradientHex: configMap['background_gradient_color']!, brandLogoB64: configMap['brand_logo']!, ); return configMap; diff --git a/lib/services/theme_manager.dart b/lib/services/theme_manager.dart index 3b9b1a7..e248a9e 100644 --- a/lib/services/theme_manager.dart +++ b/lib/services/theme_manager.dart @@ -11,15 +11,20 @@ class ThemeManager extends ChangeNotifier { Color _primaryColor = AppTheme.primary; Color _secondaryColor = AppTheme.secondary; + Color _backgroundColor = AppTheme.surface; + Color _backgroundGradientColor = const Color(0xFFF3EAD3); String _brandLogo = ''; Color get primaryColor => _primaryColor; Color get secondaryColor => _secondaryColor; + Color get backgroundColor => _backgroundColor; + Color get backgroundGradientColor => _backgroundGradientColor; String get brandLogo => _brandLogo; ThemeData get themeData => AppTheme.getTheme( primaryColor: _primaryColor, secondaryColor: _secondaryColor, + backgroundColor: _backgroundColor, ); /// Initialize cached settings on app launch @@ -27,6 +32,8 @@ class ThemeManager extends ChangeNotifier { final prefs = await SharedPreferences.getInstance(); final primHex = prefs.getString('theme_primary_color'); final secHex = prefs.getString('theme_secondary_color'); + final bgHex = prefs.getString('theme_background_color'); + final bgGradHex = prefs.getString('theme_background_gradient_color'); _brandLogo = prefs.getString('theme_brand_logo') ?? ''; if (primHex != null) { @@ -35,21 +42,33 @@ class ThemeManager extends ChangeNotifier { if (secHex != null) { _secondaryColor = _parseHexColor(secHex) ?? AppTheme.secondary; } + if (bgHex != null) { + _backgroundColor = _parseHexColor(bgHex) ?? AppTheme.surface; + } + if (bgGradHex != null) { + _backgroundGradientColor = _parseHexColor(bgGradHex) ?? const Color(0xFFF3EAD3); + } } /// Update theme options and persist them to SharedPreferences Future updateConfig({ required String primaryHex, required String secondaryHex, + required String backgroundHex, + required String backgroundGradientHex, required String brandLogoB64, }) async { final prefs = await SharedPreferences.getInstance(); await prefs.setString('theme_primary_color', primaryHex); await prefs.setString('theme_secondary_color', secondaryHex); + await prefs.setString('theme_background_color', backgroundHex); + await prefs.setString('theme_background_gradient_color', backgroundGradientHex); await prefs.setString('theme_brand_logo', brandLogoB64); _primaryColor = _parseHexColor(primaryHex) ?? AppTheme.primary; _secondaryColor = _parseHexColor(secondaryHex) ?? AppTheme.secondary; + _backgroundColor = _parseHexColor(backgroundHex) ?? AppTheme.surface; + _backgroundGradientColor = _parseHexColor(backgroundGradientHex) ?? const Color(0xFFF3EAD3); _brandLogo = brandLogoB64; notifyListeners(); } diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 2efccb8..09ebcf5 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -25,10 +25,11 @@ class AppTheme { static ThemeData get lightTheme => getTheme(); - static ThemeData getTheme({Color? primaryColor, Color? secondaryColor}) { + static ThemeData getTheme({Color? primaryColor, Color? secondaryColor, Color? backgroundColor}) { final baseTheme = ThemeData.light(); final pColor = primaryColor ?? primary; final sColor = secondaryColor ?? secondary; + final bg = backgroundColor ?? surface; // Dynamically compute readable contrast text colors final onPrimaryColor = pColor.computeLuminance() > 0.5 ? Color(0xFF2E251B) : Colors.white; @@ -36,14 +37,14 @@ class AppTheme { return ThemeData( useMaterial3: true, - scaffoldBackgroundColor: surface, + scaffoldBackgroundColor: bg, colorScheme: ColorScheme.light( primary: pColor, primaryContainer: pColor, secondary: sColor, secondaryContainer: sColor.withValues(alpha: 0.15), onSecondaryContainer: onSecondaryColor, - surface: surface, + surface: bg, onSurface: onSurface, onSurfaceVariant: onSurfaceVariant, onPrimary: onPrimaryColor,