aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-15 00:16:45 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-15 00:16:45 +0300
commit21cb18f74b9d160771d41c9ad29a56907e236471 (patch)
tree9291640552b7872ec34edd741c1e3d30f280f236 /src
parentc2e58974f4fd57fed7a8fc992ee20fe42b56e619 (diff)
feat: add light theme variants
Diffstat (limited to 'src')
-rw-r--r--src/app/state.rs188
1 files changed, 188 insertions, 0 deletions
diff --git a/src/app/state.rs b/src/app/state.rs
index 155851d7..383f2bd5 100644
--- a/src/app/state.rs
+++ b/src/app/state.rs
@@ -74,6 +74,28 @@ impl Palette {
}
}
+ /// Catppuccin Latte — the light Catppuccin flavor.
+ pub fn catppuccin_latte() -> Self {
+ Self {
+ accent: Color::Rgb(30, 102, 245),
+ panel_bg: Color::Rgb(239, 241, 245),
+ surface0: Color::Rgb(204, 208, 218),
+ surface1: Color::Rgb(188, 192, 204),
+ surface_dim: Color::Rgb(230, 233, 239),
+ overlay0: Color::Rgb(156, 160, 176),
+ overlay1: Color::Rgb(140, 143, 161),
+ text: Color::Rgb(76, 79, 105),
+ subtext0: Color::Rgb(108, 111, 133),
+ mauve: Color::Rgb(136, 57, 239),
+ green: Color::Rgb(64, 160, 43),
+ yellow: Color::Rgb(223, 142, 29),
+ red: Color::Rgb(210, 15, 57),
+ blue: Color::Rgb(30, 102, 245),
+ teal: Color::Rgb(23, 146, 153),
+ peach: Color::Rgb(254, 100, 11),
+ }
+ }
+
/// Tokyo Night — blue-purple aesthetic.
pub fn tokyo_night() -> Self {
Self {
@@ -96,6 +118,28 @@ impl Palette {
}
}
+ /// Tokyo Night Day — the light Tokyo Night style.
+ pub fn tokyo_night_day() -> Self {
+ Self {
+ accent: Color::Rgb(46, 125, 233),
+ panel_bg: Color::Rgb(225, 226, 231),
+ surface0: Color::Rgb(196, 200, 218),
+ surface1: Color::Rgb(168, 174, 203),
+ surface_dim: Color::Rgb(210, 211, 218),
+ overlay0: Color::Rgb(137, 144, 179),
+ overlay1: Color::Rgb(104, 112, 154),
+ text: Color::Rgb(55, 96, 191),
+ subtext0: Color::Rgb(97, 114, 176),
+ mauve: Color::Rgb(120, 71, 189),
+ green: Color::Rgb(88, 117, 57),
+ yellow: Color::Rgb(140, 108, 62),
+ red: Color::Rgb(245, 42, 101),
+ blue: Color::Rgb(46, 125, 233),
+ teal: Color::Rgb(17, 140, 116),
+ peach: Color::Rgb(177, 92, 0),
+ }
+ }
+
/// Dracula — purple/pink/green.
pub fn dracula() -> Self {
Self {
@@ -162,6 +206,28 @@ impl Palette {
}
}
+ /// Gruvbox Light — the light retro palette.
+ pub fn gruvbox_light() -> Self {
+ Self {
+ accent: Color::Rgb(7, 102, 120),
+ panel_bg: Color::Rgb(251, 241, 199),
+ surface0: Color::Rgb(235, 219, 178),
+ surface1: Color::Rgb(213, 196, 161),
+ surface_dim: Color::Rgb(242, 229, 188),
+ overlay0: Color::Rgb(146, 131, 116),
+ overlay1: Color::Rgb(124, 111, 100),
+ text: Color::Rgb(60, 56, 54),
+ subtext0: Color::Rgb(80, 73, 69),
+ mauve: Color::Rgb(143, 63, 113),
+ green: Color::Rgb(121, 116, 14),
+ yellow: Color::Rgb(181, 118, 20),
+ red: Color::Rgb(157, 0, 6),
+ blue: Color::Rgb(7, 102, 120),
+ teal: Color::Rgb(66, 123, 88),
+ peach: Color::Rgb(175, 58, 3),
+ }
+ }
+
/// One Dark — Atom's classic dark theme.
pub fn one_dark() -> Self {
Self {
@@ -184,6 +250,28 @@ impl Palette {
}
}
+ /// One Light — Atom's classic light theme.
+ pub fn one_light() -> Self {
+ Self {
+ accent: Color::Rgb(64, 120, 242),
+ panel_bg: Color::Rgb(250, 250, 250),
+ surface0: Color::Rgb(240, 240, 241),
+ surface1: Color::Rgb(229, 229, 230),
+ surface_dim: Color::Rgb(245, 245, 246),
+ overlay0: Color::Rgb(160, 161, 167),
+ overlay1: Color::Rgb(104, 107, 119),
+ text: Color::Rgb(56, 58, 66),
+ subtext0: Color::Rgb(104, 107, 119),
+ mauve: Color::Rgb(166, 38, 164),
+ green: Color::Rgb(80, 161, 79),
+ yellow: Color::Rgb(193, 132, 1),
+ red: Color::Rgb(228, 86, 73),
+ blue: Color::Rgb(64, 120, 242),
+ teal: Color::Rgb(1, 132, 188),
+ peach: Color::Rgb(152, 104, 1),
+ }
+ }
+
/// Solarized Dark — Ethan Schoonover's classic.
pub fn solarized() -> Self {
Self {
@@ -206,6 +294,28 @@ impl Palette {
}
}
+ /// Solarized Light — Ethan Schoonover's light variant.
+ pub fn solarized_light() -> Self {
+ Self {
+ accent: Color::Rgb(38, 139, 210),
+ panel_bg: Color::Rgb(253, 246, 227),
+ surface0: Color::Rgb(238, 232, 213),
+ surface1: Color::Rgb(147, 161, 161),
+ surface_dim: Color::Rgb(238, 232, 213),
+ overlay0: Color::Rgb(147, 161, 161),
+ overlay1: Color::Rgb(88, 110, 117),
+ text: Color::Rgb(101, 123, 131),
+ subtext0: Color::Rgb(131, 148, 150),
+ mauve: Color::Rgb(211, 54, 130),
+ green: Color::Rgb(133, 153, 0),
+ yellow: Color::Rgb(181, 137, 0),
+ red: Color::Rgb(220, 50, 47),
+ blue: Color::Rgb(38, 139, 210),
+ teal: Color::Rgb(42, 161, 152),
+ peach: Color::Rgb(203, 75, 22),
+ }
+ }
+
/// Kanagawa — inspired by Katsushika Hokusai.
pub fn kanagawa() -> Self {
Self {
@@ -228,6 +338,28 @@ impl Palette {
}
}
+ /// Kanagawa Lotus — the light Kanagawa variant.
+ pub fn kanagawa_lotus() -> Self {
+ Self {
+ accent: Color::Rgb(77, 105, 155),
+ panel_bg: Color::Rgb(242, 236, 188),
+ surface0: Color::Rgb(220, 213, 172),
+ surface1: Color::Rgb(201, 203, 209),
+ surface_dim: Color::Rgb(213, 206, 163),
+ overlay0: Color::Rgb(160, 156, 172),
+ overlay1: Color::Rgb(138, 137, 128),
+ text: Color::Rgb(84, 84, 100),
+ subtext0: Color::Rgb(67, 67, 108),
+ mauve: Color::Rgb(98, 76, 131),
+ green: Color::Rgb(111, 137, 78),
+ yellow: Color::Rgb(119, 113, 63),
+ red: Color::Rgb(200, 64, 83),
+ blue: Color::Rgb(77, 105, 155),
+ teal: Color::Rgb(78, 140, 162),
+ peach: Color::Rgb(204, 109, 0),
+ }
+ }
+
/// Rosé Pine — muted, elegant.
pub fn rose_pine() -> Self {
Self {
@@ -250,6 +382,28 @@ impl Palette {
}
}
+ /// Rosé Pine Dawn — the light Rosé Pine variant.
+ pub fn rose_pine_dawn() -> Self {
+ Self {
+ accent: Color::Rgb(144, 122, 169),
+ panel_bg: Color::Rgb(250, 244, 237),
+ surface0: Color::Rgb(242, 233, 225),
+ surface1: Color::Rgb(255, 250, 243),
+ surface_dim: Color::Rgb(242, 233, 225),
+ overlay0: Color::Rgb(152, 147, 165),
+ overlay1: Color::Rgb(121, 117, 147),
+ text: Color::Rgb(70, 66, 97),
+ subtext0: Color::Rgb(121, 117, 147),
+ mauve: Color::Rgb(144, 122, 169),
+ green: Color::Rgb(40, 105, 131),
+ yellow: Color::Rgb(234, 157, 52),
+ red: Color::Rgb(180, 99, 122),
+ blue: Color::Rgb(40, 105, 131),
+ teal: Color::Rgb(86, 148, 159),
+ peach: Color::Rgb(215, 130, 126),
+ }
+ }
+
/// Vesper — minimal high-contrast monochrome with peach and mint accents.
pub fn vesper() -> Self {
Self {
@@ -276,14 +430,21 @@ impl Palette {
pub fn from_name(name: &str) -> Option<Self> {
match name.to_lowercase().replace([' ', '_'], "-").as_str() {
"catppuccin" | "catppuccin-mocha" => Some(Self::catppuccin()),
+ "catppuccin-latte" | "latte" | "light" => Some(Self::catppuccin_latte()),
"tokyo-night" | "tokyonight" => Some(Self::tokyo_night()),
+ "tokyo-night-day" | "tokyo-day" | "tokyonight-day" => Some(Self::tokyo_night_day()),
"dracula" => Some(Self::dracula()),
"nord" => Some(Self::nord()),
"gruvbox" | "gruvbox-dark" => Some(Self::gruvbox()),
+ "gruvbox-light" => Some(Self::gruvbox_light()),
"one-dark" | "onedark" => Some(Self::one_dark()),
+ "one-light" | "onelight" => Some(Self::one_light()),
"solarized" | "solarized-dark" => Some(Self::solarized()),
+ "solarized-light" => Some(Self::solarized_light()),
"kanagawa" => Some(Self::kanagawa()),
+ "kanagawa-lotus" | "lotus" => Some(Self::kanagawa_lotus()),
"rose-pine" | "rosepine" => Some(Self::rose_pine()),
+ "rose-pine-dawn" | "rosepine-dawn" | "dawn" => Some(Self::rose_pine_dawn()),
"vesper" => Some(Self::vesper()),
_ => None,
}
@@ -428,14 +589,21 @@ impl SettingsSection {
/// All built-in theme names in display order.
pub const THEME_NAMES: &[&str] = &[
"catppuccin",
+ "catppuccin-latte",
"tokyo-night",
+ "tokyo-night-day",
"dracula",
"nord",
"gruvbox",
+ "gruvbox-light",
"one-dark",
+ "one-light",
"solarized",
+ "solarized-light",
"kanagawa",
+ "kanagawa-lotus",
"rose-pine",
+ "rose-pine-dawn",
"vesper",
];
@@ -983,6 +1151,26 @@ mod tests {
use crossterm::event::KeyEvent;
#[test]
+ fn built_in_theme_names_resolve() {
+ for name in THEME_NAMES {
+ assert!(
+ Palette::from_name(name).is_some(),
+ "theme should resolve: {name}"
+ );
+ }
+ }
+
+ #[test]
+ fn light_theme_aliases_resolve() {
+ for name in ["light", "latte", "tokyo-day", "onelight", "lotus", "dawn"] {
+ assert!(
+ Palette::from_name(name).is_some(),
+ "theme should resolve: {name}"
+ );
+ }
+ }
+
+ #[test]
fn key_matches_requires_exact_modifiers() {
assert!(key_matches(
&KeyEvent::new(KeyCode::Char('b'), KeyModifiers::CONTROL),