From 446eecb4a1a01c4096cd6ee9d03aeb5a9fd69dee Mon Sep 17 00:00:00 2001 From: Shoubhit Dash Date: Wed, 6 May 2026 23:38:20 +0530 Subject: [PATCH] feat: add vesper theme (#71) --- CONFIGURATION.md | 3 ++- README.md | 2 +- src/app/state.rs | 24 ++++++++++++++++++++++++ src/main.rs | 2 +- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/CONFIGURATION.md b/CONFIGURATION.md index 6bf06b27..6a40f71e 100644 --- a/CONFIGURATION.md +++ b/CONFIGURATION.md @@ -140,7 +140,7 @@ focus_pane_right = "alt+l" ## theme -herdr ships with 9 built-in color themes. set one in config: +herdr ships with 10 built-in color themes. set one in config: ```toml [theme] @@ -160,6 +160,7 @@ name = "tokyo-night" | `solarized` | ethan schoonover's classic | | `kanagawa` | hokusai-inspired | | `rose-pine` | muted, elegant | +| `vesper` | high-contrast monochrome with peach and mint accents | theme names are flexible: `tokyo-night`, `tokyonight`, and `tokyo_night` all work. diff --git a/README.md b/README.md index f1e237bc..05dc5629 100644 --- a/README.md +++ b/README.md @@ -115,7 +115,7 @@ not a gui window, not a web dashboard, not electron. herdr runs inside whatever - **tabs** — first-class in the socket api and cli - **mouse-native** — click panes, drag borders, select text to copy; not keyboard-only - **notifications** — sounds and toasts for background events; tab-aware suppression -- **9 built-in themes** — catppuccin (default), tokyo night, dracula, nord, gruvbox, one dark, solarized, kanagawa, rosé pine +- **10 built-in themes** — catppuccin (default), tokyo night, dracula, nord, gruvbox, one dark, solarized, kanagawa, rosé pine, vesper - **session persistence** — pane processes survive client detach; sessions restore after full restart ## agents can use herdr too diff --git a/src/app/state.rs b/src/app/state.rs index 831d8b7d..97f87f3c 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -250,6 +250,28 @@ impl Palette { } } + /// Vesper — minimal high-contrast monochrome with peach and mint accents. + pub fn vesper() -> Self { + Self { + accent: Color::Rgb(255, 199, 153), + panel_bg: Color::Rgb(26, 26, 26), + surface0: Color::Rgb(35, 35, 35), + surface1: Color::Rgb(40, 40, 40), + surface_dim: Color::Rgb(16, 16, 16), + overlay0: Color::Rgb(92, 92, 92), + overlay1: Color::Rgb(126, 126, 126), + text: Color::Rgb(255, 255, 255), + subtext0: Color::Rgb(160, 160, 160), + mauve: Color::Rgb(255, 209, 168), + green: Color::Rgb(153, 255, 228), + yellow: Color::Rgb(255, 199, 153), + red: Color::Rgb(255, 128, 128), + blue: Color::Rgb(176, 176, 176), + teal: Color::Rgb(102, 221, 204), + peach: Color::Rgb(255, 199, 153), + } + } + /// Resolve a theme by name. Returns None for unknown names. pub fn from_name(name: &str) -> Option { match name.to_lowercase().replace([' ', '_'], "-").as_str() { @@ -262,6 +284,7 @@ impl Palette { "solarized" | "solarized-dark" => Some(Self::solarized()), "kanagawa" => Some(Self::kanagawa()), "rose-pine" | "rosepine" => Some(Self::rose_pine()), + "vesper" => Some(Self::vesper()), _ => None, } } @@ -414,6 +437,7 @@ pub const THEME_NAMES: &[&str] = &[ "solarized", "kanagawa", "rose-pine", + "vesper", ]; #[derive(Debug, Clone, Copy, PartialEq, Eq)] diff --git a/src/main.rs b/src/main.rs index d0a535da..df16b951 100644 --- a/src/main.rs +++ b/src/main.rs @@ -59,7 +59,7 @@ const DEFAULT_CONFIG: &str = r##"# herdr configuration [theme] # Built-in themes: catppuccin, tokyo-night, dracula, nord, gruvbox, -# one-dark, solarized, kanagawa, rose-pine +# one-dark, solarized, kanagawa, rose-pine, vesper # name = "catppuccin" # Override individual color tokens on top of the base theme.