release: promote dev to main for v2.0.0 (#1426)

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Lx-204 <15377891490@163.com>
Co-authored-by: AlexDev_ <56083016+alexdev03@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Nikhil Nair <32665919+nikhilnair31@users.noreply.github.com>
Co-authored-by: marciodps <95321123+marciodps@users.noreply.github.com>
Co-authored-by: ThomasCrund <39323104+ThomasCrund@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-10-01 11:19:09 +03:00
1 parent ed915d0816
commit 728daa9acd
315 files changed
+65173 -7909

No files matched your search

@@ -59,6 +59,20 @@ val AmoledTheme =
onSurface = AmoledTextBright,
surfaceVariant = AmoledContainerHigh,
onSurfaceVariant = AmoledTextDim,
surfaceDim = AmoledFloor,
surfaceBright = AmoledContainerHighest,
primaryFixed = AmoledTextBright,
primaryFixedDim = AmoledTextBright,
onPrimaryFixed = AmoledFloor,
onPrimaryFixedVariant = AmoledFloor,
secondaryFixed = AmoledSecondary,
secondaryFixedDim = AmoledSecondary,
onSecondaryFixed = AmoledFloor,
onSecondaryFixedVariant = AmoledFloor,
tertiaryFixed = AmoledTertiary,
tertiaryFixedDim = AmoledTertiary,
onTertiaryFixed = AmoledFloor,
onTertiaryFixedVariant = AmoledFloor,
surfaceContainerLowest = AmoledFloor,
surfaceContainerLow = AmoledFloor,
surfaceContainer = AmoledContainer,
@@ -19,7 +19,6 @@ private val MochaRed = Color(0xFFF38BA8)
private val MochaText = Color(0xFFCDD6F4)
private val MochaSubtext1 = Color(0xFFBAC2DE)
private val MochaSubtext0 = Color(0xFFA6ADC8)
private val MochaOverlay0 = Color(0xFF6C7086)
private val MochaSurface1 = Color(0xFF45475A)
private val MochaSurface0 = Color(0xFF313244)
private val MochaBase = Color(0xFF1E1E2E)
@@ -31,24 +30,33 @@ private val MochaCrust = Color(0xFF11111B)
// ---------------------------------------------------------------------
private val LatteMauve = Color(0xFF8839EF)
// Derived role, not an upstream Catppuccin swatch: Latte Text/Pink is 3.02:1
// and Text/Green is 2.39:1. Deeper ink reaches 5.88:1 and 4.65:1 respectively.
private val LatteDeepInk = Color(0xFF202334)
// Derived role, not an upstream Catppuccin swatch: Latte Base/Blue is only 4.34:1.
// White/Blue reaches 4.94:1 for normal text.
private val LatteOnBlue = Color(0xFFFFFFFF)
private val LatteBlue = Color(0xFF1E66F5)
private val LattePink = Color(0xFFEA76CB)
private val LatteGreen = Color(0xFF40A02B)
private val LatteYellow = Color(0xFFDF8E1D)
private val LatteRed = Color(0xFFD20F39)
private val LatteText = Color(0xFF4C4F69)
// Official Latte Subtext0 keeps borders visible against Surface0 (3.20:1).
private val LatteSubtext0 = Color(0xFF6C6F85)
private val LatteOverlay0 = Color(0xFF9CA0B0)
private val LatteText = Color(0xFF4C4F69)
private val LatteSurface1 = Color(0xFFBCC0CC)
private val LatteSurface0 = Color(0xFFCCD0DA)
private val LatteBase = Color(0xFFEFF1F5)
private val LatteMantle = Color(0xFFE6E9EF)
private val LatteCrust = Color(0xFFDCE0E8)
// Bespoke tint used only for the light primary container — not part of
// the official Catppuccin swatch set, kept local to this file.
private val LattePrimaryContainer = Color(0xFFE6CAFA)
private val LatteOnPrimaryContainer = Color(0xFF380075)
// Regression theme-contract: fixed accents use Mocha in both modes. Fixed/Dim
// share official accents rather than inventing tonal steps; on-roles use Crust.
// Latte surface containers stop at Surface0 so normal text stays >= 4.5:1.
// Upstream: https://github.com/catppuccin/palette/blob/main/palette.json
/** Catppuccin theme — Mocha (dark) / Latte (light). */
val CatppuccinTheme =
@@ -73,6 +81,20 @@ val CatppuccinTheme =
onSurface = MochaText,
surfaceVariant = MochaSurface0,
onSurfaceVariant = MochaSubtext0,
surfaceDim = MochaBase,
surfaceBright = MochaSurface1,
primaryFixed = MochaMauve,
primaryFixedDim = MochaMauve,
onPrimaryFixed = MochaCrust,
onPrimaryFixedVariant = MochaCrust,
secondaryFixed = MochaBlue,
secondaryFixedDim = MochaBlue,
onSecondaryFixed = MochaCrust,
onSecondaryFixedVariant = MochaCrust,
tertiaryFixed = MochaPink,
tertiaryFixedDim = MochaPink,
onTertiaryFixed = MochaCrust,
onTertiaryFixedVariant = MochaCrust,
surfaceContainerLowest = MochaCrust,
surfaceContainerLow = MochaMantle,
surfaceContainer = MochaBase,
@@ -81,7 +103,7 @@ val CatppuccinTheme =
inverseSurface = MochaText,
inverseOnSurface = MochaBase,
inversePrimary = LatteMauve,
outline = MochaOverlay0,
outline = MochaSubtext0,
outlineVariant = MochaSurface1,
scrim = MochaCrust,
status =
@@ -105,48 +127,62 @@ val CatppuccinTheme =
PaletteColors(
primary = LatteMauve,
onPrimary = LatteBase,
primaryContainer = LattePrimaryContainer,
onPrimaryContainer = LatteOnPrimaryContainer,
primaryContainer = LatteBase,
onPrimaryContainer = LatteMauve,
secondary = LatteBlue,
onSecondary = LatteBase,
onSecondary = LatteOnBlue,
secondaryContainer = LatteMantle,
onSecondaryContainer = LatteText,
tertiary = LattePink,
onTertiary = LatteBase,
tertiaryContainer = LatteSurface1,
onTertiary = LatteDeepInk,
tertiaryContainer = LatteSurface0,
onTertiaryContainer = LatteText,
background = LatteBase,
onBackground = LatteText,
surface = LatteBase,
onSurface = LatteText,
surfaceVariant = LatteSurface0,
onSurfaceVariant = LatteSubtext0,
onSurfaceVariant = LatteText,
surfaceDim = LatteSurface0,
surfaceBright = LatteBase,
primaryFixed = MochaMauve,
primaryFixedDim = MochaMauve,
onPrimaryFixed = MochaCrust,
onPrimaryFixedVariant = MochaCrust,
secondaryFixed = MochaBlue,
secondaryFixedDim = MochaBlue,
onSecondaryFixed = MochaCrust,
onSecondaryFixedVariant = MochaCrust,
tertiaryFixed = MochaPink,
tertiaryFixedDim = MochaPink,
onTertiaryFixed = MochaCrust,
onTertiaryFixedVariant = MochaCrust,
surfaceContainerLowest = LatteCrust,
surfaceContainerLow = LatteMantle,
surfaceContainer = LatteBase,
surfaceContainerHigh = LatteSurface0,
surfaceContainerHighest = LatteSurface1,
surfaceContainerHighest = LatteSurface0,
inverseSurface = LatteText,
inverseOnSurface = LatteBase,
inversePrimary = MochaMauve,
outline = LatteOverlay0,
outline = LatteSubtext0,
outlineVariant = LatteSurface1,
scrim = LatteCrust,
status =
HermesStatusColors(
success = LatteGreen,
successContainer = LatteSurface0,
onSuccess = LatteBase,
onSuccess = LatteDeepInk,
warning = LatteYellow,
warningContainer = LatteSurface0,
onWarning = LatteBase,
onWarning = LatteDeepInk,
error = LatteRed,
errorContainer = LatteSurface0,
onError = LatteBase,
onErrorContainer = LatteRed,
onErrorContainer = LatteText,
info = LatteBlue,
infoContainer = LatteSurface0,
onInfo = LatteBase,
onInfo = LatteOnBlue,
),
),
)
@@ -73,6 +73,20 @@ val DefaultTheme =
onSurface = SlateDarkFg1,
surfaceVariant = SlateDarkBg1,
onSurfaceVariant = SlateDarkFg3,
surfaceDim = SlateDarkBg0,
surfaceBright = SlateDarkBg4,
primaryFixed = SlateBrightTeal,
primaryFixedDim = SlateBrightTeal,
onPrimaryFixed = SlateDarkBg0,
onPrimaryFixedVariant = SlateDarkBg0,
secondaryFixed = SlateBrightCyan,
secondaryFixedDim = SlateBrightCyan,
onSecondaryFixed = SlateDarkBg0,
onSecondaryFixedVariant = SlateDarkBg0,
tertiaryFixed = SlateBrightBlue,
tertiaryFixedDim = SlateBrightBlue,
onTertiaryFixed = SlateDarkBg0,
onTertiaryFixedVariant = SlateDarkBg0,
surfaceContainerLowest = SlateDarkBg0,
surfaceContainerLow = SlateDarkBg1,
surfaceContainer = SlateDarkBg2,
@@ -121,6 +135,20 @@ val DefaultTheme =
onSurface = SlateLightFg1,
surfaceVariant = SlateLightBg1,
onSurfaceVariant = SlateLightFg3,
surfaceDim = SlateLightBg4,
surfaceBright = SlateLightBg0,
primaryFixed = SlateBrightTeal,
primaryFixedDim = SlateBrightTeal,
onPrimaryFixed = SlateDarkBg0,
onPrimaryFixedVariant = SlateDarkBg0,
secondaryFixed = SlateBrightCyan,
secondaryFixedDim = SlateBrightCyan,
onSecondaryFixed = SlateDarkBg0,
onSecondaryFixedVariant = SlateDarkBg0,
tertiaryFixed = SlateBrightBlue,
tertiaryFixedDim = SlateBrightBlue,
onTertiaryFixed = SlateDarkBg0,
onTertiaryFixedVariant = SlateDarkBg0,
surfaceContainerLowest = SlateLightBg0,
surfaceContainerLow = SlateLightBg1,
surfaceContainer = SlateLightBg2,
@@ -129,7 +157,7 @@ val DefaultTheme =
inverseSurface = SlateLightFg1,
inverseOnSurface = SlateLightBg0,
inversePrimary = SlateBrightTeal,
outline = SlateGray,
outline = SlateLightFg3,
outlineVariant = SlateLightBg3,
scrim = SlateLightBg0,
status =
@@ -0,0 +1,185 @@
package com.m57.hermescontrol.theme.presets
import androidx.compose.ui.graphics.Color
import com.m57.hermescontrol.theme.HermesStatusColors
import com.m57.hermescontrol.theme.PaletteColors
import com.m57.hermescontrol.theme.buildTheme
// ---------------------------------------------------------------------
// Default slate surfaces retained; accents use the Garnet red family.
// Garnet Dark — named swatches
// ---------------------------------------------------------------------
private val GarnetDarkBg0 = Color(0xFF0F1416)
private val GarnetDarkBg1 = Color(0xFF171C1E)
private val GarnetDarkBg2 = Color(0xFF1B2022)
private val GarnetDarkBg3 = Color(0xFF252B2D)
private val GarnetDarkBg4 = Color(0xFF303638)
private val GarnetDarkFg1 = Color(0xFFDEE3E5)
private val GarnetDarkFg3 = Color(0xFFBEC8CA)
private val GarnetGray = Color(0xFF889294) // same neutral gray in both modes
// "Bright" accents — high-visibility variants against dark surfaces.
private val GarnetBrightCopper = Color(0xFFEABD96)
private val GarnetBrightRose = Color(0xFFE5BDB8)
private val GarnetBrightGreen = Color(0xFF81D692)
private val GarnetBrightYellow = Color(0xFFECC248)
private val GarnetBrightRed = Color(0xFFFFB4AB)
private val GarnetBrightInfo = Color(0xFF8ECEFF)
// ---------------------------------------------------------------------
// Garnet Light — named swatches
// ---------------------------------------------------------------------
private val GarnetLightBg0 = Color(0xFFF5FAFC)
private val GarnetLightBg1 = Color(0xFFEFF4F6)
private val GarnetLightBg2 = Color(0xFFE9EEF0)
private val GarnetLightBg3 = Color(0xFFE3E8EA)
private val GarnetLightBg4 = Color(0xFFDEE3E5)
private val GarnetLightFg1 = Color(0xFF171C1E)
private val GarnetLightFg3 = Color(0xFF3F484A)
// "Faded" accents — muted variants for light background contrast.
private val GarnetAccent = Color(0xFF990000)
private val GarnetFadedCopper = Color(0xFF805531)
private val GarnetFadedRose = Color(0xFF775651)
private val GarnetFadedGreen = Color(0xFF126D2B)
private val GarnetFadedYellow = Color(0xFF725C00)
private val GarnetFadedRed = Color(0xFFBA1A1A)
private val GarnetFadedInfo = Color(0xFF006393)
// #990000 is the seed and light primary. Its contrast on the dark canvas is only
// 2.08:1; #FFB4AB supplies readable dark-mode text/icons (10.93:1).
private val GarnetLightRedContainer = Color(0xFFFFDAD5)
private val GarnetDarkRoseContainer = Color(0xFF573935)
private val GarnetDarkCopperContainer = Color(0xFF634025)
private val GarnetLightCopperContainer = Color(0xFFFFDCC1)
/** Garnet — Default slate surfaces with a #990000 red accent and matching warm tones. */
val GarnetTheme =
buildTheme(
dark =
PaletteColors(
primary = GarnetBrightRed,
onPrimary = GarnetDarkBg0,
primaryContainer = GarnetAccent,
onPrimaryContainer = GarnetLightBg0,
secondary = GarnetBrightRose,
onSecondary = GarnetDarkBg0,
secondaryContainer = GarnetDarkRoseContainer,
onSecondaryContainer = GarnetBrightRose,
tertiary = GarnetBrightCopper,
onTertiary = GarnetDarkBg0,
tertiaryContainer = GarnetDarkCopperContainer,
onTertiaryContainer = GarnetBrightCopper,
background = GarnetDarkBg0,
onBackground = GarnetDarkFg1,
surface = GarnetDarkBg0,
onSurface = GarnetDarkFg1,
surfaceVariant = GarnetDarkBg1,
onSurfaceVariant = GarnetDarkFg3,
surfaceDim = GarnetDarkBg0,
surfaceBright = GarnetDarkBg4,
primaryFixed = GarnetBrightRed,
primaryFixedDim = GarnetBrightRed,
onPrimaryFixed = GarnetDarkBg0,
onPrimaryFixedVariant = GarnetDarkBg0,
secondaryFixed = GarnetBrightRose,
secondaryFixedDim = GarnetBrightRose,
onSecondaryFixed = GarnetDarkBg0,
onSecondaryFixedVariant = GarnetDarkBg0,
tertiaryFixed = GarnetBrightCopper,
tertiaryFixedDim = GarnetBrightCopper,
onTertiaryFixed = GarnetDarkBg0,
onTertiaryFixedVariant = GarnetDarkBg0,
surfaceContainerLowest = GarnetDarkBg0,
surfaceContainerLow = GarnetDarkBg1,
surfaceContainer = GarnetDarkBg2,
surfaceContainerHigh = GarnetDarkBg3,
surfaceContainerHighest = GarnetDarkBg4,
inverseSurface = GarnetDarkFg1,
inverseOnSurface = GarnetDarkBg0,
inversePrimary = GarnetAccent,
outline = GarnetGray,
outlineVariant = GarnetDarkBg3,
scrim = GarnetDarkBg0,
status =
HermesStatusColors(
success = GarnetBrightGreen,
successContainer = GarnetDarkBg3,
onSuccess = GarnetDarkBg0,
warning = GarnetBrightYellow,
warningContainer = GarnetDarkBg3,
onWarning = GarnetDarkBg0,
error = GarnetBrightRed,
errorContainer = GarnetDarkBg3,
onError = GarnetDarkBg0,
onErrorContainer = GarnetBrightRed,
info = GarnetBrightInfo,
infoContainer = GarnetDarkBg3,
onInfo = GarnetDarkBg0,
),
),
light =
PaletteColors(
primary = GarnetAccent,
onPrimary = GarnetLightBg0,
primaryContainer = GarnetLightRedContainer,
onPrimaryContainer = GarnetAccent,
secondary = GarnetFadedRose,
onSecondary = GarnetLightBg0,
secondaryContainer = GarnetLightRedContainer,
onSecondaryContainer = GarnetFadedRose,
tertiary = GarnetFadedCopper,
onTertiary = GarnetLightBg0,
tertiaryContainer = GarnetLightCopperContainer,
onTertiaryContainer = GarnetFadedCopper,
background = GarnetLightBg0,
onBackground = GarnetLightFg1,
surface = GarnetLightBg0,
onSurface = GarnetLightFg1,
surfaceVariant = GarnetLightBg1,
onSurfaceVariant = GarnetLightFg3,
surfaceDim = GarnetLightBg4,
surfaceBright = GarnetLightBg0,
primaryFixed = GarnetBrightRed,
primaryFixedDim = GarnetBrightRed,
onPrimaryFixed = GarnetDarkBg0,
onPrimaryFixedVariant = GarnetDarkBg0,
secondaryFixed = GarnetBrightRose,
secondaryFixedDim = GarnetBrightRose,
onSecondaryFixed = GarnetDarkBg0,
onSecondaryFixedVariant = GarnetDarkBg0,
tertiaryFixed = GarnetBrightCopper,
tertiaryFixedDim = GarnetBrightCopper,
onTertiaryFixed = GarnetDarkBg0,
onTertiaryFixedVariant = GarnetDarkBg0,
surfaceContainerLowest = GarnetLightBg0,
surfaceContainerLow = GarnetLightBg1,
surfaceContainer = GarnetLightBg2,
surfaceContainerHigh = GarnetLightBg3,
surfaceContainerHighest = GarnetLightBg4,
inverseSurface = GarnetLightFg1,
inverseOnSurface = GarnetLightBg0,
inversePrimary = GarnetBrightRed,
outline = GarnetLightFg3,
outlineVariant = GarnetLightBg3,
scrim = GarnetLightBg0,
status =
HermesStatusColors(
success = GarnetFadedGreen,
successContainer = GarnetLightBg3,
onSuccess = GarnetLightBg0,
warning = GarnetFadedYellow,
warningContainer = GarnetLightBg3,
onWarning = GarnetLightBg0,
error = GarnetFadedRed,
errorContainer = GarnetLightBg3,
onError = GarnetLightBg0,
onErrorContainer = GarnetFadedRed,
info = GarnetFadedInfo,
infoContainer = GarnetLightBg3,
onInfo = GarnetLightBg0,
),
),
)
@@ -9,18 +9,20 @@ import com.m57.hermescontrol.theme.buildTheme
// Gruvbox Dark (medium contrast) — named swatches
// ---------------------------------------------------------------------
// Official hard-contrast bg0; medium bg0/red only reaches 4.29:1.
private val GruvboxDarkInk = Color(0xFF1D2021)
private val GruvboxDarkBg0 = Color(0xFF282828)
private val GruvboxDarkBg1 = Color(0xFF3C3836)
private val GruvboxDarkBg2 = Color(0xFF504945)
private val GruvboxDarkBg3 = Color(0xFF665C54)
private val GruvboxDarkBg4 = Color(0xFF7C6F64)
private val GruvboxDarkFg1 = Color(0xFFEBDBB2)
private val GruvboxDarkFg2 = Color(0xFFD5C4A1)
private val GruvboxDarkFg3 = Color(0xFFBDAE93)
private val GruvboxGray = Color(0xFF928374) // same neutral gray in both modes
// "Bright" accents — the variants gruvbox uses against a dark background.
private val GruvboxBrightRed = Color(0xFFFB4934)
// Derived role, not an upstream swatch: bright red/bg0 is only 4.29:1.
// Lighter red reaches 4.92:1 for error text and field labels on bg0.
private val GruvboxErrorText = Color(0xFFFF5F4F)
private val GruvboxBrightGreen = Color(0xFFB8BB26)
private val GruvboxBrightYellow = Color(0xFFFABD2F)
private val GruvboxBrightBlue = Color(0xFF83A598)
@@ -35,7 +37,6 @@ private val GruvboxLightBg0 = Color(0xFFFBF1C7)
private val GruvboxLightBg1 = Color(0xFFEBDBB2)
private val GruvboxLightBg2 = Color(0xFFD5C4A1)
private val GruvboxLightBg3 = Color(0xFFBDAE93)
private val GruvboxLightBg4 = Color(0xFFA89984)
private val GruvboxLightFg1 = Color(0xFF3C3836)
private val GruvboxLightFg2 = Color(0xFF504945)
private val GruvboxLightFg3 = Color(0xFF665C54)
@@ -43,28 +44,38 @@ private val GruvboxLightFg3 = Color(0xFF665C54)
// "Faded" accents — the muted variants gruvbox uses against a light
// background, so contrast holds up without the neon dark-mode saturation.
private val GruvboxFadedRed = Color(0xFF9D0006)
// Derived roles, not upstream Gruvbox swatches: light bg0/faded green is 4.29:1;
// white/green reaches 4.86:1. Hard dark bg0/faded yellow is below 4.5:1;
// deeper neutral ink/yellow reaches 4.97:1.
private val GruvboxOnFadedGreen = Color(0xFFFFFFFF)
private val GruvboxOnFadedYellow = Color(0xFF121212)
private val GruvboxFadedGreen = Color(0xFF79740E)
private val GruvboxFadedYellow = Color(0xFFB57614)
private val GruvboxFadedBlue = Color(0xFF076678)
private val GruvboxFadedPurple = Color(0xFF8F3F71)
private val GruvboxFadedOrange = Color(0xFFAF3A03)
/** Gruvbox theme — bright accents on dark bg0–bg4, faded accents on light bg0–bg4. */
// Regression theme-contract: fixed roles reuse bright accents in both modes;
// Fixed/Dim share a swatch. Containers stop at bg3 for >= 4.5:1 body text.
// Upstream: https://github.com/morhetz/gruvbox/blob/master/colors/gruvbox.vim
/** Gruvbox theme — bright accents on dark bg0–bg3, faded accents on light bg0–bg3. */
val GruvboxTheme =
buildTheme(
dark =
PaletteColors(
primary = GruvboxBrightOrange,
onPrimary = GruvboxDarkBg0,
primaryContainer = GruvboxDarkBg4,
primaryContainer = GruvboxDarkBg2,
onPrimaryContainer = GruvboxDarkFg1,
secondary = GruvboxBrightBlue,
onSecondary = GruvboxDarkBg0,
secondaryContainer = GruvboxDarkBg3,
secondaryContainer = GruvboxDarkBg2,
onSecondaryContainer = GruvboxDarkFg2,
tertiary = GruvboxBrightPurple,
onTertiary = GruvboxDarkBg0,
tertiaryContainer = GruvboxDarkBg4,
tertiaryContainer = GruvboxDarkBg2,
onTertiaryContainer = GruvboxDarkFg1,
background = GruvboxDarkBg0,
onBackground = GruvboxDarkFg1,
@@ -72,15 +83,29 @@ val GruvboxTheme =
onSurface = GruvboxDarkFg1,
surfaceVariant = GruvboxDarkBg1,
onSurfaceVariant = GruvboxDarkFg3,
surfaceDim = GruvboxDarkBg0,
surfaceBright = GruvboxDarkBg3,
primaryFixed = GruvboxBrightOrange,
primaryFixedDim = GruvboxBrightOrange,
onPrimaryFixed = GruvboxDarkBg0,
onPrimaryFixedVariant = GruvboxDarkBg0,
secondaryFixed = GruvboxBrightBlue,
secondaryFixedDim = GruvboxBrightBlue,
onSecondaryFixed = GruvboxDarkBg0,
onSecondaryFixedVariant = GruvboxDarkBg0,
tertiaryFixed = GruvboxBrightPurple,
tertiaryFixedDim = GruvboxBrightPurple,
onTertiaryFixed = GruvboxDarkBg0,
onTertiaryFixedVariant = GruvboxDarkBg0,
surfaceContainerLowest = GruvboxDarkBg0,
surfaceContainerLow = GruvboxDarkBg1,
surfaceContainer = GruvboxDarkBg2,
surfaceContainerHigh = GruvboxDarkBg3,
surfaceContainerHighest = GruvboxDarkBg4,
surfaceContainerHighest = GruvboxDarkBg3,
inverseSurface = GruvboxDarkFg1,
inverseOnSurface = GruvboxDarkBg0,
inversePrimary = GruvboxFadedOrange,
outline = GruvboxGray,
outline = GruvboxDarkFg2,
outlineVariant = GruvboxDarkBg3,
scrim = GruvboxDarkBg0,
status =
@@ -91,9 +116,9 @@ val GruvboxTheme =
warning = GruvboxBrightYellow,
warningContainer = GruvboxDarkBg3,
onWarning = GruvboxDarkBg0,
error = GruvboxBrightRed,
error = GruvboxErrorText,
errorContainer = GruvboxDarkBg3,
onError = GruvboxDarkBg0,
onError = GruvboxDarkInk,
onErrorContainer = GruvboxDarkFg1,
info = GruvboxBrightBlue,
infoContainer = GruvboxDarkBg3,
@@ -104,15 +129,15 @@ val GruvboxTheme =
PaletteColors(
primary = GruvboxFadedOrange,
onPrimary = GruvboxLightBg0,
primaryContainer = GruvboxLightBg4,
primaryContainer = GruvboxLightBg2,
onPrimaryContainer = GruvboxLightFg1,
secondary = GruvboxFadedBlue,
onSecondary = GruvboxLightBg0,
secondaryContainer = GruvboxLightBg3,
secondaryContainer = GruvboxLightBg2,
onSecondaryContainer = GruvboxLightFg2,
tertiary = GruvboxFadedPurple,
onTertiary = GruvboxLightBg0,
tertiaryContainer = GruvboxLightBg4,
tertiaryContainer = GruvboxLightBg2,
onTertiaryContainer = GruvboxLightFg1,
background = GruvboxLightBg0,
onBackground = GruvboxLightFg1,
@@ -120,29 +145,43 @@ val GruvboxTheme =
onSurface = GruvboxLightFg1,
surfaceVariant = GruvboxLightBg1,
onSurfaceVariant = GruvboxLightFg3,
surfaceDim = GruvboxLightBg3,
surfaceBright = GruvboxLightBg0,
primaryFixed = GruvboxBrightOrange,
primaryFixedDim = GruvboxBrightOrange,
onPrimaryFixed = GruvboxDarkBg0,
onPrimaryFixedVariant = GruvboxDarkBg0,
secondaryFixed = GruvboxBrightBlue,
secondaryFixedDim = GruvboxBrightBlue,
onSecondaryFixed = GruvboxDarkBg0,
onSecondaryFixedVariant = GruvboxDarkBg0,
tertiaryFixed = GruvboxBrightPurple,
tertiaryFixedDim = GruvboxBrightPurple,
onTertiaryFixed = GruvboxDarkBg0,
onTertiaryFixedVariant = GruvboxDarkBg0,
surfaceContainerLowest = GruvboxLightBg0,
surfaceContainerLow = GruvboxLightBg1,
surfaceContainer = GruvboxLightBg2,
surfaceContainerHigh = GruvboxLightBg3,
surfaceContainerHighest = GruvboxLightBg4,
surfaceContainerHighest = GruvboxLightBg3,
inverseSurface = GruvboxLightFg1,
inverseOnSurface = GruvboxLightBg0,
inversePrimary = GruvboxBrightOrange,
outline = GruvboxGray,
outline = GruvboxLightFg2,
outlineVariant = GruvboxLightBg3,
scrim = GruvboxLightBg0,
status =
HermesStatusColors(
success = GruvboxFadedGreen,
successContainer = GruvboxLightBg3,
onSuccess = GruvboxLightBg0,
onSuccess = GruvboxOnFadedGreen,
warning = GruvboxFadedYellow,
warningContainer = GruvboxLightBg3,
onWarning = GruvboxLightBg0,
onWarning = GruvboxOnFadedYellow,
error = GruvboxFadedRed,
errorContainer = GruvboxLightBg3,
onError = GruvboxLightBg0,
onErrorContainer = GruvboxFadedRed,
onErrorContainer = GruvboxLightFg1,
info = GruvboxFadedBlue,
infoContainer = GruvboxLightBg3,
onInfo = GruvboxLightBg0,
@@ -32,7 +32,6 @@ private val MonoLightBg = Color(0xFFFAFAFA) // background, surface, containerLow
private val MonoLightContainer = Color(0xFFF0F0F0) // surfaceContainer
private val MonoLightContainerHigh = Color(0xFFE0E0E0) // surfaceContainerHigh, surfaceVariant, status containers
private val MonoLightContainerHighest = Color(0xFFD1D1D1) // surfaceContainerHighest, primaryContainer
private val MonoLightOutline = Color(0xFF808080)
private val MonoLightOutlineVariant = Color(0xFFCCCCCC)
private val MonoLightTextDim = Color(0xFF4D4D4D) // onSurfaceVariant
private val MonoLightTextBright = Color(0xFF121212) // onBackground/onSurface/inverseSurface/primary/error
@@ -71,6 +70,20 @@ val MonochromeTheme =
onSurface = MonoDarkTextBright,
surfaceVariant = MonoDarkContainerHigh,
onSurfaceVariant = MonoDarkTextDim,
surfaceDim = MonoDarkBg,
surfaceBright = MonoDarkContainerHighest,
primaryFixed = MonoDarkTextBright,
primaryFixedDim = MonoDarkTextBright,
onPrimaryFixed = MonoDarkBg,
onPrimaryFixedVariant = MonoDarkBg,
secondaryFixed = MonoDarkSecondary,
secondaryFixedDim = MonoDarkSecondary,
onSecondaryFixed = MonoDarkBg,
onSecondaryFixedVariant = MonoDarkBg,
tertiaryFixed = MonoDarkTertiary,
tertiaryFixedDim = MonoDarkTertiary,
onTertiaryFixed = MonoDarkBg,
onTertiaryFixedVariant = MonoDarkBg,
surfaceContainerLowest = MonoDarkFloor,
surfaceContainerLow = MonoDarkBg,
surfaceContainer = MonoDarkContainer,
@@ -112,13 +125,27 @@ val MonochromeTheme =
tertiary = MonoLightTertiary,
onTertiary = MonoLightBg,
tertiaryContainer = MonoLightContainerHigh,
onTertiaryContainer = MonoLightTertiary,
onTertiaryContainer = MonoLightSecondary,
background = MonoLightBg,
onBackground = MonoLightTextBright,
surface = MonoLightBg,
onSurface = MonoLightTextBright,
surfaceVariant = MonoLightContainerHigh,
onSurfaceVariant = MonoLightTextDim,
surfaceDim = MonoLightContainerHighest,
surfaceBright = MonoLightBg,
primaryFixed = MonoDarkTextBright,
primaryFixedDim = MonoDarkTextBright,
onPrimaryFixed = MonoDarkBg,
onPrimaryFixedVariant = MonoDarkBg,
secondaryFixed = MonoDarkSecondary,
secondaryFixedDim = MonoDarkSecondary,
onSecondaryFixed = MonoDarkBg,
onSecondaryFixedVariant = MonoDarkBg,
tertiaryFixed = MonoDarkTertiary,
tertiaryFixedDim = MonoDarkTertiary,
onTertiaryFixed = MonoDarkBg,
onTertiaryFixedVariant = MonoDarkBg,
surfaceContainerLowest = MonoLightCeiling,
surfaceContainerLow = MonoLightBg,
surfaceContainer = MonoLightContainer,
@@ -127,7 +154,7 @@ val MonochromeTheme =
inverseSurface = MonoLightTextBright,
inverseOnSurface = MonoLightBg,
inversePrimary = MonoDarkTextBright,
outline = MonoLightOutline,
outline = MonoLightTertiary,
outlineVariant = MonoLightOutlineVariant,
scrim = Color.Black,
status =
@@ -144,7 +171,7 @@ val MonochromeTheme =
onErrorContainer = MonoLightTextBright,
info = MonoLightInfo,
infoContainer = MonoLightContainerHigh,
onInfo = MonoLightBg,
onInfo = MonoLightTextBright,
),
),
)
@@ -11,9 +11,12 @@ import com.m57.hermescontrol.theme.buildTheme
// supply the surfaces; Frost (7–10) and Aurora (11–15) supply the
// accents. Unlike Gruvbox, Nord defines one accent set — not a
// separate bright/faded pair per mode — so the same accent swatches
// are reused in both palettes below.
// are reused for fixed roles; primary/error need documented accessible tones.
// ---------------------------------------------------------------------
// Derived role, not an upstream Nord swatch: nord0/red is 3.05:1 and
// nord0/purple is 4.41:1. Darker Polar Night ink meets 4.5:1 on both.
private val NordPolarInk = Color(0xFF0F1218)
private val Nord0 = Color(0xFF2E3440) // Polar Night — darkest
private val Nord1 = Color(0xFF3B4252)
private val Nord2 = Color(0xFF434C5E)
@@ -23,11 +26,23 @@ private val Nord5 = Color(0xFFE5E9F0)
private val Nord6 = Color(0xFFECEFF4) // Snow Storm — lightest
private val Nord8 = Color(0xFF88C0D0) // Frost — primary accent
private val Nord9 = Color(0xFF81A1C1) // Frost — secondary / info
private val Nord11 = Color(0xFFBF616A) // Aurora red — error
// Derived roles, not upstream Nord swatches. Nord10/Snow Storm is only 3.50:1;
// deeper Frost ink reaches 4.92:1 on nord6 for primary text/focus labels.
private val NordFrostInk = Color(0xFF486991)
// Official Aurora red/nord0 is 3.05:1; a brighter red reaches 4.67:1.
private val NordErrorBright = Color(0xFFDE858F)
// Official Aurora red/nord6 is 3.55:1; deeper red reaches 5.69:1.
private val NordErrorInk = Color(0xFFA53547)
private val Nord13 = Color(0xFFEBCB8B) // Aurora yellow — warning
private val Nord14 = Color(0xFFA3BE8C) // Aurora green — success
private val Nord15 = Color(0xFFB48EAD) // Aurora purple — tertiary
// Fixed/Dim reuse each official accent in both modes (no invented tonal ladder).
// Upstream: https://www.nordtheme.com/docs/colors-and-palettes/
/**
* Nord theme.
*
@@ -36,12 +51,11 @@ private val Nord15 = Color(0xFFB48EAD) // Aurora purple — tertiary
* tiers on each side share a value (surfaceContainerHigh ==
* surfaceContainerHighest) rather than inventing an off-palette hex.
*
* Frost/Aurora accents are pastel by design, so onPrimary/onSecondary/
* onTertiary/status "on" colors use Polar Night (dark text) in *both*
* modes — reusing Snow Storm for light-mode "on" text (the convention in
* Pastel Frost/Aurora fills use dark ink in both modes — reusing
* Snow Storm for light-mode "on" text (the convention in
* the Catppuccin/Gruvbox presets) would fail contrast against colors like
* Aurora yellow, which stays light even without a separate light-mode
* variant.
* variant. Light primary/error use Snow Storm ink on their darker fills.
*/
val NordTheme =
buildTheme(
@@ -56,7 +70,7 @@ val NordTheme =
secondaryContainer = Nord2,
onSecondaryContainer = Nord4,
tertiary = Nord15,
onTertiary = Nord0,
onTertiary = NordPolarInk,
tertiaryContainer = Nord3,
onTertiaryContainer = Nord6,
background = Nord0,
@@ -65,6 +79,20 @@ val NordTheme =
onSurface = Nord6,
surfaceVariant = Nord1,
onSurfaceVariant = Nord4,
surfaceDim = Nord0,
surfaceBright = Nord3,
primaryFixed = Nord8,
primaryFixedDim = Nord8,
onPrimaryFixed = Nord0,
onPrimaryFixedVariant = Nord0,
secondaryFixed = Nord9,
secondaryFixedDim = Nord9,
onSecondaryFixed = Nord0,
onSecondaryFixedVariant = Nord0,
tertiaryFixed = Nord15,
tertiaryFixedDim = Nord15,
onTertiaryFixed = NordPolarInk,
onTertiaryFixedVariant = NordPolarInk,
surfaceContainerLowest = Nord0,
surfaceContainerLow = Nord1,
surfaceContainer = Nord2,
@@ -72,8 +100,8 @@ val NordTheme =
surfaceContainerHighest = Nord3,
inverseSurface = Nord6,
inverseOnSurface = Nord0,
inversePrimary = Nord8,
outline = Nord3,
inversePrimary = NordFrostInk,
outline = Nord4,
outlineVariant = Nord2,
scrim = Nord0,
status =
@@ -84,9 +112,9 @@ val NordTheme =
warning = Nord13,
warningContainer = Nord2,
onWarning = Nord0,
error = Nord11,
error = NordErrorBright,
errorContainer = Nord2,
onError = Nord0,
onError = NordPolarInk,
onErrorContainer = Nord6,
info = Nord9,
infoContainer = Nord2,
@@ -95,8 +123,8 @@ val NordTheme =
),
light =
PaletteColors(
primary = Nord8,
onPrimary = Nord0,
primary = NordFrostInk,
onPrimary = Nord6,
primaryContainer = Nord4,
onPrimaryContainer = Nord0,
secondary = Nord9,
@@ -104,7 +132,7 @@ val NordTheme =
secondaryContainer = Nord5,
onSecondaryContainer = Nord1,
tertiary = Nord15,
onTertiary = Nord0,
onTertiary = NordPolarInk,
tertiaryContainer = Nord4,
onTertiaryContainer = Nord0,
background = Nord6,
@@ -113,6 +141,20 @@ val NordTheme =
onSurface = Nord0,
surfaceVariant = Nord5,
onSurfaceVariant = Nord2,
surfaceDim = Nord4,
surfaceBright = Nord6,
primaryFixed = Nord8,
primaryFixedDim = Nord8,
onPrimaryFixed = Nord0,
onPrimaryFixedVariant = Nord0,
secondaryFixed = Nord9,
secondaryFixedDim = Nord9,
onSecondaryFixed = Nord0,
onSecondaryFixedVariant = Nord0,
tertiaryFixed = Nord15,
tertiaryFixedDim = Nord15,
onTertiaryFixed = NordPolarInk,
onTertiaryFixedVariant = NordPolarInk,
surfaceContainerLowest = Nord6,
surfaceContainerLow = Nord5,
surfaceContainer = Nord5,
@@ -132,10 +174,10 @@ val NordTheme =
warning = Nord13,
warningContainer = Nord5,
onWarning = Nord0,
error = Nord11,
error = NordErrorInk,
errorContainer = Nord5,
onError = Nord0,
onErrorContainer = Nord11,
onError = Nord6,
onErrorContainer = Nord0,
info = Nord9,
infoContainer = Nord5,
onInfo = Nord0,