feat(theme): allow dynamic colors to override preset theme and disable preset selector when active (#684)

* feat(theme): allow dynamic colors to override non-default theme presets

* feat(settings): disable theme preset selector when dynamic colors is enabled

* feat(theme): align Catppuccin preset with official Latte and Mocha style guide
This commit is contained in:
M57 authored and GitHub committed 2026-07-22 22:49:36 +03:00
1 parent 06ba3e8399
commit 34ba93901b
4 files changed
+96 -95

No files matched your search

@@ -64,8 +64,8 @@ private fun resolveStatusColors(preset: ThemePreset, darkTheme: Boolean) = when
}
```
Dynamic (Material You) color on API 31+ overrides the DEFAULT scheme when
`useDynamicColors = true` and `themePreset == ThemePreset.DEFAULT`.
Dynamic (Material You) color on API 31+ overrides the preset scheme when
`useDynamicColors = true`.
## DEFAULT uses design tokens — that's intentional
@@ -96,7 +96,7 @@ fun HermesControlTheme(
val context = LocalContext.current
val dynamicAvailable =
useDynamicColors && themePreset == ThemePreset.DEFAULT && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
useDynamicColors && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S
val colorScheme =
if (dynamicAvailable) {
if (darkTheme) {
@@ -8,111 +8,111 @@ import com.m57.hermescontrol.theme.HermesStatusColors
/** Catppuccin color scheme (dark). */
val CatppuccinDarkColorScheme =
darkColorScheme(
primary = Color(0xFFCBA6F7),
onPrimary = Color(0xFF11111B),
primaryContainer = Color(0xFF585B70),
onPrimaryContainer = Color(0xFFF5E0DC),
inversePrimary = Color(0xFF8839EF),
secondary = Color(0xFF89B4FA),
onSecondary = Color(0xFF11111B),
secondaryContainer = Color(0xFF313244),
onSecondaryContainer = Color(0xFFBAC2DE),
tertiary = Color(0xFFF5C2E7),
onTertiary = Color(0xFF11111B),
tertiaryContainer = Color(0xFF45475A),
onTertiaryContainer = Color(0xFFF5E0DC),
background = Color(0xFF1E1E2E),
onBackground = Color(0xFFCDD6F4),
surface = Color(0xFF252538),
onSurface = Color(0xFFCDD6F4),
surfaceVariant = Color(0xFF313244),
onSurfaceVariant = Color(0xFFA6ADC8),
surfaceTint = Color(0xFFCBA6F7),
surfaceContainerLowest = Color(0xFF11111B),
surfaceContainerLow = Color(0xFF181825),
surfaceContainer = Color(0xFF1E1E2E),
surfaceContainerHigh = Color(0xFF252538),
surfaceContainerHighest = Color(0xFF313244),
inverseSurface = Color(0xFFCDD6F4),
inverseOnSurface = Color(0xFF1E1E2E),
error = Color(0xFFF38BA8),
onError = Color(0xFF11111B),
errorContainer = Color(0xFF45475A),
onErrorContainer = Color(0xFFF38BA8),
outline = Color(0xFF585B70),
outlineVariant = Color(0xFF45475A),
scrim = Color(0xFF11111B),
primary = Color(0xFFCBA6F7), // Mauve
onPrimary = Color(0xFF11111B), // Crust
primaryContainer = Color(0xFF45475A), // Surface 1
onPrimaryContainer = Color(0xFFCDD6F4), // Text
inversePrimary = Color(0xFF8839EF), // Latte Mauve
secondary = Color(0xFF89B4FA), // Blue
onSecondary = Color(0xFF11111B), // Crust
secondaryContainer = Color(0xFF313244), // Surface 0
onSecondaryContainer = Color(0xFFBAC2DE), // Subtext 1
tertiary = Color(0xFFF5C2E7), // Pink
onTertiary = Color(0xFF11111B), // Crust
tertiaryContainer = Color(0xFF45475A), // Surface 1
onTertiaryContainer = Color(0xFFCDD6F4), // Text
background = Color(0xFF1E1E2E), // Base
onBackground = Color(0xFFCDD6F4), // Text
surface = Color(0xFF1E1E2E), // Base
onSurface = Color(0xFFCDD6F4), // Text
surfaceVariant = Color(0xFF313244), // Surface 0
onSurfaceVariant = Color(0xFFA6ADC8), // Subtext 0
surfaceTint = Color(0xFFCBA6F7), // Mauve
surfaceContainerLowest = Color(0xFF11111B), // Crust
surfaceContainerLow = Color(0xFF181825), // Mantle
surfaceContainer = Color(0xFF1E1E2E), // Base
surfaceContainerHigh = Color(0xFF313244), // Surface 0
surfaceContainerHighest = Color(0xFF45475A), // Surface 1
inverseSurface = Color(0xFFCDD6F4), // Text
inverseOnSurface = Color(0xFF1E1E2E), // Base
error = Color(0xFFF38BA8), // Red
onError = Color(0xFF11111B), // Crust
errorContainer = Color(0xFF313244), // Surface 0
onErrorContainer = Color(0xFFF38BA8), // Red
outline = Color(0xFF6C7086), // Overlay 0
outlineVariant = Color(0xFF45475A), // Surface 1
scrim = Color(0xFF11111B), // Crust
)
/** Catppuccin color scheme (light). */
val CatppuccinLightColorScheme =
lightColorScheme(
primary = Color(0xFF8839EF),
onPrimary = Color(0xFFEFF1F5),
primaryContainer = Color(0xFFCCD0DA),
onPrimaryContainer = Color(0xFF4C4F69),
inversePrimary = Color(0xFFCBA6F7),
secondary = Color(0xFF1E66F5),
onSecondary = Color(0xFFEFF1F5),
secondaryContainer = Color(0xFFE6E9EF),
onSecondaryContainer = Color(0xFF4C4F69),
tertiary = Color(0xFFEA76CB),
onTertiary = Color(0xFFEFF1F5),
tertiaryContainer = Color(0xFFBCC0CC),
onTertiaryContainer = Color(0xFF4C4F69),
background = Color(0xFFEFF1F5),
onBackground = Color(0xFF4C4F69),
surface = Color(0xFFE6E9EF),
onSurface = Color(0xFF4C4F69),
surfaceVariant = Color(0xFFCCD0DA),
onSurfaceVariant = Color(0xFF6C6F85),
surfaceTint = Color(0xFF8839EF),
surfaceContainerLowest = Color(0xFFFFFFFF),
surfaceContainerLow = Color(0xFFE6E9EF),
surfaceContainer = Color(0xFFEFF1F5),
surfaceContainerHigh = Color(0xFFE6E9EF),
surfaceContainerHighest = Color(0xFFCCD0DA),
inverseSurface = Color(0xFF4C4F69),
inverseOnSurface = Color(0xFFEFF1F5),
error = Color(0xFFD20F39),
onError = Color(0xFFEFF1F5),
errorContainer = Color(0xFFF2D5CF),
onErrorContainer = Color(0xFFD20F39),
outline = Color(0xFF9CA0B0),
outlineVariant = Color(0xFFBCC0CC),
scrim = Color(0xFFDCE0E8),
primary = Color(0xFF8839EF), // Mauve
onPrimary = Color(0xFFEFF1F5), // Base
primaryContainer = Color(0xFFCCD0DA), // Surface 0
onPrimaryContainer = Color(0xFF4C4F69), // Text
inversePrimary = Color(0xFFCBA6F7), // Mocha Mauve
secondary = Color(0xFF1E66F5), // Blue
onSecondary = Color(0xFFEFF1F5), // Base
secondaryContainer = Color(0xFFE6E9EF), // Mantle
onSecondaryContainer = Color(0xFF4C4F69), // Text
tertiary = Color(0xFFEA76CB), // Pink
onTertiary = Color(0xFFEFF1F5), // Base
tertiaryContainer = Color(0xFFBCC0CC), // Surface 1
onTertiaryContainer = Color(0xFF4C4F69), // Text
background = Color(0xFFEFF1F5), // Base
onBackground = Color(0xFF4C4F69), // Text
surface = Color(0xFFEFF1F5), // Base
onSurface = Color(0xFF4C4F69), // Text
surfaceVariant = Color(0xFFCCD0DA), // Surface 0
onSurfaceVariant = Color(0xFF6C6F85), // Subtext 0
surfaceTint = Color(0xFF8839EF), // Mauve
surfaceContainerLowest = Color(0xFFDCE0E8), // Crust
surfaceContainerLow = Color(0xFFE6E9EF), // Mantle
surfaceContainer = Color(0xFFEFF1F5), // Base
surfaceContainerHigh = Color(0xFFCCD0DA), // Surface 0
surfaceContainerHighest = Color(0xFFBCC0CC), // Surface 1
inverseSurface = Color(0xFF4C4F69), // Text
inverseOnSurface = Color(0xFFEFF1F5), // Base
error = Color(0xFFD20F39), // Red
onError = Color(0xFFEFF1F5), // Base
errorContainer = Color(0xFFCCD0DA), // Surface 0
onErrorContainer = Color(0xFFD20F39), // Red
outline = Color(0xFF9CA0B0), // Overlay 0
outlineVariant = Color(0xFFBCC0CC), // Surface 1
scrim = Color(0xFFDCE0E8), // Crust
)
/** Catppuccin status colors (dark). */
val CatppuccinDarkStatusColors =
HermesStatusColors(
success = Color(0xFFA6E3A1),
successContainer = Color(0xFF313244),
onSuccess = Color(0xFF11111B),
warning = Color(0xFFF9E2AF),
warningContainer = Color(0xFF313244),
onWarning = Color(0xFF11111B),
error = Color(0xFFF38BA8),
errorContainer = Color(0xFF313244),
onError = Color(0xFF11111B),
info = Color(0xFF89B4FA),
infoContainer = Color(0xFF313244),
onInfo = Color(0xFF11111B),
success = Color(0xFFA6E3A1), // Green
successContainer = Color(0xFF313244), // Surface 0
onSuccess = Color(0xFF11111B), // Crust
warning = Color(0xFFF9E2AF), // Yellow
warningContainer = Color(0xFF313244), // Surface 0
onWarning = Color(0xFF11111B), // Crust
error = Color(0xFFF38BA8), // Red
errorContainer = Color(0xFF313244), // Surface 0
onError = Color(0xFF11111B), // Crust
info = Color(0xFF89B4FA), // Blue
infoContainer = Color(0xFF313244), // Surface 0
onInfo = Color(0xFF11111B), // Crust
)
/** Catppuccin status colors (light). */
val CatppuccinLightStatusColors =
HermesStatusColors(
success = Color(0xFF40A02B),
successContainer = Color(0xFFE6E9EF),
onSuccess = Color(0xFFE6E9EF),
warning = Color(0xFFDF8E1D),
warningContainer = Color(0xFFE6E9EF),
onWarning = Color(0xFFE6E9EF),
error = Color(0xFFD20F39),
errorContainer = Color(0xFFE6E9EF),
onError = Color(0xFFE6E9EF),
info = Color(0xFF1E66F5),
infoContainer = Color(0xFFE6E9EF),
onInfo = Color(0xFFE6E9EF),
success = Color(0xFF40A02B), // Green
successContainer = Color(0xFFCCD0DA), // Surface 0
onSuccess = Color(0xFFEFF1F5), // Base
warning = Color(0xFFDF8E1D), // Yellow
warningContainer = Color(0xFFCCD0DA), // Surface 0
onWarning = Color(0xFFEFF1F5), // Base
error = Color(0xFFD20F39), // Red
errorContainer = Color(0xFFCCD0DA), // Surface 0
onError = Color(0xFFEFF1F5), // Base
info = Color(0xFF1E66F5), // Blue
infoContainer = Color(0xFFCCD0DA), // Surface 0
onInfo = Color(0xFFEFF1F5), // Base
)