CakeWallet/lib/themes
David Adegoke b77c22b0df
Update Theme Setup (#2300)
* refactor(theme-setup-update): Move didChangePlatformBrightness lifecycle method to Root widget instead of AppState. We already have an active WidgetsBindingObserver in Root widget.

* fix(theme): Add workaround for flutter iOS didChangePlatformBrightness issue causing unneeded rebuilds.
2025-05-29 16:46:43 +03:00
..
core Update Theme Setup (#2300) 2025-05-29 16:46:43 +03:00
theme_classes Fix some colors (#2293) 2025-05-27 00:35:11 +03:00
utils Fix some colors (#2293) 2025-05-27 00:35:11 +03:00
README.md New themes (#2239) 2025-05-25 23:11:45 +03:00

Material 3 Theming System

This directory contains the Material 3 (M3) theming implementation for Cake Wallet. The theming system is now fully based on Material 3 color tokens and patterns, with all custom theme extensions removed for simplicity, maintainability, and compliance with Material Design 3 guidelines.

Directory Structure

lib/themes/
├── core/                # Theme state management and base theme logic
├── theme_classes/       # Light and dark theme data definitions
├── extensions/          # (Optional) Theme extensions for specific widgets/pages
├── utils/               # Utilities for theme management
└── README.md            # This file

Key Features

  • Material 3 color system with semantic color tokens
  • Dynamic color support (when available)
  • MobX-based state management
  • Simplified theme management
  • Consistent design language across the app

Usage

Accessing Theme Colors

final colorScheme = Theme.of(context).colorScheme;
final primaryColor = colorScheme.primary;
final onSurfaceVariant = colorScheme.onSurfaceVariant;

Available Color Tokens

Material 3 provides a comprehensive set of semantic color tokens that adapt to light/dark themes:

  • primary / onPrimary
  • secondary / onSecondary
  • tertiary / onTertiary
  • error / onError
  • background / onBackground
  • surface / onSurface
  • surfaceVariant / onSurfaceVariant
  • outline, outlineVariant
  • ...and more (see Flutter's ColorScheme)

Theme Management

Theme mode state (light/dark/system) and switching is handled via MobX stores in core/. Use the provided store to get/set the current theme mode and listen for changes.

// Example: Getting the current theme mode
final themeStore = ... // Obtain from provider or context
final isDark = themeStore.isDark;

// Example: Switching theme mode
await themeStore.setThemeMode(ThemeMode.dark);

Best Practices

  1. Always use semantic color tokens from ColorScheme instead of hardcoded colors.
  2. Leverage Material 3 components wherever possible for consistency and accessibility.
  3. Use the MobX theme store for all theme-related state and switching.
  4. Test in both light and dark modes to ensure good contrast and appearance.
  5. Keep any theme extensions minimal and focused (if used at all).
  6. Do not reintroduce custom theme extensions unless absolutely necessary and not covered by Material 3.

Adding or Modifying Themes

  • To update theme colors, edit the files in theme_classes/ (e.g., light_theme.dart, dark_theme.dart).
  • To add a new theme variant, create a new file in theme_classes/ and update the MobX store in core/ to support it.
  • For widget-specific theming, prefer using Material 3's built-in tokens. Only use a theme extension if there is no Material 3 equivalent.

Contributing

  • Follow Material 3 color system and accessibility guidelines.
  • Ensure proper contrast ratios for accessibility.
  • Test all changes in both light and dark modes.
  • Update this documentation if you add new color tokens or theme variants.
  • Keep theme files organized and focused.