feat: add Neon Noir theme preset (#401)
Add a new NEON_NOIR theme preset with dark cyberpunk-pink aesthetic: - Deep Void (#0f0b1a) background with Slay Pink (#ff6bf4) primary - Full dark + light color schemes with proper contrast ratios - Custom status colors matching the neon aesthetic - UI dropdown entry and string resource Co-authored-by: M57 <hy4ri@users.noreply.github.com>
This commit is contained in:
1 parent
979877eed3
commit
9344c3bd6e
3 files changed
+104
-1
No files matched your search
@@ -15,7 +15,7 @@ import androidx.compose.ui.platform.LocalContext
|
|||||||
|
|
||||||
enum class ThemePreference { SYSTEM, LIGHT, DARK }
|
enum class ThemePreference { SYSTEM, LIGHT, DARK }
|
||||||
|
|
||||||
enum class ThemePreset { DEFAULT, MONOCHROME, GRUVBOX, CATPPUCCIN, AMOLED }
|
enum class ThemePreset { DEFAULT, MONOCHROME, GRUVBOX, CATPPUCCIN, AMOLED, NEON_NOIR }
|
||||||
|
|
||||||
enum class BottomNavDisplayMode { ICON_AND_TEXT, ICON_ONLY, TEXT_ONLY }
|
enum class BottomNavDisplayMode { ICON_AND_TEXT, ICON_ONLY, TEXT_ONLY }
|
||||||
|
|
||||||
@@ -226,6 +226,76 @@ private val AmoledDarkColorScheme =
|
|||||||
outline = Color(0xFF3A3A4A),
|
outline = Color(0xFF3A3A4A),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val NeonNoirDarkColorScheme =
|
||||||
|
darkColorScheme(
|
||||||
|
primary = Color(0xFFFF6BF4),
|
||||||
|
onPrimary = Color(0xFF1A001A),
|
||||||
|
primaryContainer = Color(0xFF3A003A),
|
||||||
|
onPrimaryContainer = Color(0xFFFFCCF2),
|
||||||
|
secondary = Color(0xFFA78BFA),
|
||||||
|
onSecondary = Color(0xFF0F0B1A),
|
||||||
|
secondaryContainer = Color(0xFF2B1F59),
|
||||||
|
onSecondaryContainer = Color(0xFFD9CCFF),
|
||||||
|
tertiary = Color(0xFF60F0FF),
|
||||||
|
onTertiary = Color(0xFF003B40),
|
||||||
|
tertiaryContainer = Color(0xFF004F59),
|
||||||
|
onTertiaryContainer = Color(0xFFBFFAFF),
|
||||||
|
background = Color(0xFF0F0B1A),
|
||||||
|
onBackground = Color(0xFFE8E0F0),
|
||||||
|
surface = Color(0xFF1A1530),
|
||||||
|
onSurface = Color(0xFFE8E0F0),
|
||||||
|
surfaceVariant = Color(0xFF2B2540),
|
||||||
|
onSurfaceVariant = Color(0xFF9A90B0),
|
||||||
|
surfaceTint = Color(0xFFFF6BF4),
|
||||||
|
surfaceContainer = Color(0xFF1A1530),
|
||||||
|
surfaceContainerHigh = Color(0xFF252040),
|
||||||
|
surfaceContainerHighest = Color(0xFF2F2A50),
|
||||||
|
inverseSurface = Color(0xFFE8E0F0),
|
||||||
|
inverseOnSurface = Color(0xFF0F0B1A),
|
||||||
|
error = Color(0xFFFF3D68),
|
||||||
|
onError = Color.White,
|
||||||
|
errorContainer = Color(0xFF3A0A14),
|
||||||
|
onErrorContainer = Color(0xFFFFB3C0),
|
||||||
|
outline = Color(0xFF3A3060),
|
||||||
|
outlineVariant = Color(0xFF2E2545),
|
||||||
|
scrim = Color(0xFF000000),
|
||||||
|
)
|
||||||
|
|
||||||
|
private val NeonNoirLightColorScheme =
|
||||||
|
lightColorScheme(
|
||||||
|
primary = Color(0xFFC440A8),
|
||||||
|
onPrimary = Color.White,
|
||||||
|
primaryContainer = Color(0xFFFFD9F2),
|
||||||
|
onPrimaryContainer = Color(0xFF3A003A),
|
||||||
|
secondary = Color(0xFF7C4DFF),
|
||||||
|
onSecondary = Color.White,
|
||||||
|
secondaryContainer = Color(0xFFEDE0FF),
|
||||||
|
onSecondaryContainer = Color(0xFF1E0066),
|
||||||
|
tertiary = Color(0xFF0098A6),
|
||||||
|
onTertiary = Color.White,
|
||||||
|
tertiaryContainer = Color(0xFFBFFAFF),
|
||||||
|
onTertiaryContainer = Color(0xFF003B40),
|
||||||
|
background = Color(0xFFF5F0FA),
|
||||||
|
onBackground = Color(0xFF0F0B1A),
|
||||||
|
surface = Color.White,
|
||||||
|
onSurface = Color(0xFF0F0B1A),
|
||||||
|
surfaceVariant = Color(0xFFEDE6F5),
|
||||||
|
onSurfaceVariant = Color(0xFF7A7090),
|
||||||
|
surfaceTint = Color(0xFFC440A8),
|
||||||
|
surfaceContainer = Color(0xFFFDF8FF),
|
||||||
|
surfaceContainerHigh = Color(0xFFF0EDF5),
|
||||||
|
surfaceContainerHighest = Color(0xFFE6E0ED),
|
||||||
|
inverseSurface = Color(0xFF0F0B1A),
|
||||||
|
inverseOnSurface = Color(0xFFE8E0F0),
|
||||||
|
error = Color(0xFFB3261E),
|
||||||
|
onError = Color.White,
|
||||||
|
errorContainer = Color(0xFFF9DEDC),
|
||||||
|
onErrorContainer = Color(0xFF410E0B),
|
||||||
|
outline = Color(0xFFBFB8CC),
|
||||||
|
outlineVariant = Color(0xFFD9D2E3),
|
||||||
|
scrim = Color(0xFF000000),
|
||||||
|
)
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HermesControlTheme(
|
fun HermesControlTheme(
|
||||||
themePreference: ThemePreference = LocalThemePreference.current,
|
themePreference: ThemePreference = LocalThemePreference.current,
|
||||||
@@ -259,6 +329,7 @@ fun HermesControlTheme(
|
|||||||
ThemePreset.GRUVBOX -> if (darkTheme) GruvboxDarkColorScheme else GruvboxLightColorScheme
|
ThemePreset.GRUVBOX -> if (darkTheme) GruvboxDarkColorScheme else GruvboxLightColorScheme
|
||||||
ThemePreset.CATPPUCCIN -> if (darkTheme) CatppuccinDarkColorScheme else CatppuccinLightColorScheme
|
ThemePreset.CATPPUCCIN -> if (darkTheme) CatppuccinDarkColorScheme else CatppuccinLightColorScheme
|
||||||
ThemePreset.AMOLED -> if (darkTheme) AmoledDarkColorScheme else HermesLightColorScheme
|
ThemePreset.AMOLED -> if (darkTheme) AmoledDarkColorScheme else HermesLightColorScheme
|
||||||
|
ThemePreset.NEON_NOIR -> if (darkTheme) NeonNoirDarkColorScheme else NeonNoirLightColorScheme
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -317,6 +388,32 @@ fun HermesControlTheme(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
themePreset == ThemePreset.NEON_NOIR && darkTheme -> {
|
||||||
|
HermesStatusColors(
|
||||||
|
success = Color(0xFF6FEA8B),
|
||||||
|
successContainer = Color(0xFF0A3A14),
|
||||||
|
warning = Color(0xFFFFB347),
|
||||||
|
warningContainer = Color(0xFF3A2000),
|
||||||
|
error = Color(0xFFFF3D68),
|
||||||
|
errorContainer = Color(0xFF3A0A14),
|
||||||
|
info = Color(0xFF60F0FF),
|
||||||
|
infoContainer = Color(0xFF003B40),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
themePreset == ThemePreset.NEON_NOIR && !darkTheme -> {
|
||||||
|
HermesStatusColors(
|
||||||
|
success = Color(0xFF1B873A),
|
||||||
|
successContainer = Color(0xFFD7F5E0),
|
||||||
|
warning = Color(0xFFB87800),
|
||||||
|
warningContainer = Color(0xFFFFEAB3),
|
||||||
|
error = Color(0xFFB3261E),
|
||||||
|
errorContainer = Color(0xFFF9DEDC),
|
||||||
|
info = Color(0xFF2E6FBD),
|
||||||
|
infoContainer = Color(0xFFD4E7FF),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
darkTheme -> {
|
darkTheme -> {
|
||||||
HermesStatusColors(
|
HermesStatusColors(
|
||||||
success = StatusGreen,
|
success = StatusGreen,
|
||||||
|
|||||||
@@ -862,6 +862,7 @@ private fun AppearanceSection(
|
|||||||
ThemePreset.GRUVBOX -> stringResource(R.string.theme_preset_gruvbox)
|
ThemePreset.GRUVBOX -> stringResource(R.string.theme_preset_gruvbox)
|
||||||
ThemePreset.CATPPUCCIN -> stringResource(R.string.theme_preset_catppuccin)
|
ThemePreset.CATPPUCCIN -> stringResource(R.string.theme_preset_catppuccin)
|
||||||
ThemePreset.AMOLED -> stringResource(R.string.theme_preset_amoled)
|
ThemePreset.AMOLED -> stringResource(R.string.theme_preset_amoled)
|
||||||
|
ThemePreset.NEON_NOIR -> stringResource(R.string.theme_preset_neon_noir)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -895,6 +896,10 @@ private fun AppearanceSection(
|
|||||||
stringResource(
|
stringResource(
|
||||||
R.string.theme_preset_amoled,
|
R.string.theme_preset_amoled,
|
||||||
)
|
)
|
||||||
|
ThemePreset.NEON_NOIR ->
|
||||||
|
stringResource(
|
||||||
|
R.string.theme_preset_neon_noir,
|
||||||
|
)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -172,6 +172,7 @@
|
|||||||
<string name="theme_preset_gruvbox">Gruvbox</string>
|
<string name="theme_preset_gruvbox">Gruvbox</string>
|
||||||
<string name="theme_preset_catppuccin">Catppuccin</string>
|
<string name="theme_preset_catppuccin">Catppuccin</string>
|
||||||
<string name="theme_preset_amoled">AMOLED Black (Dark only)</string>
|
<string name="theme_preset_amoled">AMOLED Black (Dark only)</string>
|
||||||
|
<string name="theme_preset_neon_noir">Neon Noir</string>
|
||||||
|
|
||||||
<!-- Connect Screen -->
|
<!-- Connect Screen -->
|
||||||
<string name="connect_selected_profile">Profile: %1$s</string>
|
<string name="connect_selected_profile">Profile: %1$s</string>
|
||||||
|
|||||||
Reference in new issue
Block a user