From 36b4001f4526b60f1c9b67a4a34596e5ad2bcca1 Mon Sep 17 00:00:00 2001 From: Ogulcan Celik Date: Thu, 18 Jun 2026 02:52:35 +0300 Subject: feat: sync theme with host appearance refs #675 --- src/config/theme.rs | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'src/config') diff --git a/src/config/theme.rs b/src/config/theme.rs index 87722b6e..fc601d3f 100644 --- a/src/config/theme.rs +++ b/src/config/theme.rs @@ -11,17 +11,23 @@ use tracing::warn; /// accent = "#f5c2e7" /// red = "#ff6188" /// ``` -#[derive(Debug, Default, Deserialize)] +#[derive(Debug, Clone, Default, Deserialize)] #[serde(default)] pub struct ThemeConfig { /// Built-in theme name. Default: "catppuccin". pub name: Option, + /// Follow host terminal light/dark appearance and switch between theme names. + pub auto_switch: bool, + /// Theme name used when `auto_switch` selects a dark appearance. + pub dark_name: Option, + /// Theme name used when `auto_switch` selects a light appearance. + pub light_name: Option, /// Custom overrides — applied on top of the selected base theme. pub custom: Option, } /// Per-token color overrides. All fields optional — only set what you want to change. -#[derive(Debug, Default, Deserialize)] +#[derive(Debug, Clone, Default, Deserialize)] #[serde(default)] pub struct CustomThemeColors { pub accent: Option, @@ -134,6 +140,22 @@ name = "dracula" } } + #[test] + fn theme_auto_switch_fields_parse() { + let toml = r#" +[theme] +name = "catppuccin" +auto_switch = true +dark_name = "tokyo-night" +light_name = "catppuccin-latte" +"#; + let config: Config = toml::from_str(toml).unwrap(); + assert_eq!(config.theme.name.as_deref(), Some("catppuccin")); + assert!(config.theme.auto_switch); + assert_eq!(config.theme.dark_name.as_deref(), Some("tokyo-night")); + assert_eq!(config.theme.light_name.as_deref(), Some("catppuccin-latte")); + } + #[test] fn theme_custom_overrides_parse() { let toml = r##" @@ -158,6 +180,9 @@ red = "rgb(255, 85, 85)" fn theme_defaults_when_missing() { let config: Config = toml::from_str("").unwrap(); assert!(config.theme.name.is_none()); + assert!(!config.theme.auto_switch); + assert!(config.theme.dark_name.is_none()); + assert!(config.theme.light_name.is_none()); assert!(config.theme.custom.is_none()); } } -- cgit v1.2.3