diff --git a/lib/theme/mornye_theme.dart b/lib/theme/mornye_theme.dart index 2661e001..8782a7ae 100644 --- a/lib/theme/mornye_theme.dart +++ b/lib/theme/mornye_theme.dart @@ -66,7 +66,9 @@ class MornyeTheme extends ThemeExtension { MornyeAccent.purple => CupertinoColors.systemPurple, MornyeAccent.pink => CupertinoColors.systemPink, }; - return dark ? color.darkColor : color.color; + // Accents also label links and small controls on white surfaces. + if (!dark && accent == MornyeAccent.green) return const Color(0xff24863d); + return dark ? color.darkColor : color.highContrastColor; } static final tokens = AppTokens.standard.copyWith( @@ -169,7 +171,11 @@ class MornyeTheme extends ThemeExtension { brightness: brightness, ).copyWith( primary: accent, - onPrimary: Colors.white, + onPrimary: + selectedAccent == MornyeAccent.red || + accent.computeLuminance() < 0.179 + ? Colors.white + : Colors.black, primaryContainer: grouped, onPrimaryContainer: accent, secondary: accent, diff --git a/test/appearance_settings_test.dart b/test/appearance_settings_test.dart index dc8e45a7..4f6e7b3c 100644 --- a/test/appearance_settings_test.dart +++ b/test/appearance_settings_test.dart @@ -10,6 +10,35 @@ import 'package:spotiflac_android/theme/dynamic_color_wrapper.dart'; import 'package:spotiflac_android/theme/mornye_theme.dart'; void main() { + test('custom accents keep text readable in both appearances', () { + double contrast(Color first, Color second) { + final a = first.computeLuminance(); + final b = second.computeLuminance(); + return a > b ? (a + 0.05) / (b + 0.05) : (b + 0.05) / (a + 0.05); + } + + for (final brightness in Brightness.values) { + for (final accent in MornyeAccent.values.where( + (accent) => accent != MornyeAccent.red, + )) { + final scheme = MornyeTheme.build( + brightness, + accent: accent, + ).colorScheme; + expect( + contrast(scheme.primary, scheme.surface), + greaterThanOrEqualTo(4.5), + reason: '$accent on $brightness', + ); + expect( + contrast(scheme.onPrimary, scheme.primary), + greaterThanOrEqualTo(4.5), + reason: 'Button text for $accent on $brightness', + ); + } + } + }); + Future openSettings( WidgetTester tester, SharedPreferences prefs,