diff options
Diffstat (limited to 'src/app')
| -rw-r--r-- | src/app/state.rs | 77 |
1 files changed, 62 insertions, 15 deletions
diff --git a/src/app/state.rs b/src/app/state.rs index e03d90a9..b8205451 100644 --- a/src/app/state.rs +++ b/src/app/state.rs @@ -75,6 +75,8 @@ pub struct Palette { pub sidebar_bg: Color, /// Background for the active workspace and focused agent rows. pub active_row_bg: Color, + /// Background for the Navigate-mode cursor row in the sidebar. + pub selection_bg: Color, /// Subtle surface background for selected/focused items. pub surface0: Color, /// Slightly lighter surface for hover/active states. @@ -112,7 +114,8 @@ impl Palette { accent: Color::Rgb(137, 180, 250), // blue panel_bg: Color::Rgb(24, 24, 37), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(49, 50, 68), + active_row_bg: Color::Rgb(30, 30, 46), + selection_bg: Color::Rgb(49, 50, 68), surface0: Color::Rgb(49, 50, 68), surface1: Color::Rgb(69, 71, 90), surface_dim: Color::Rgb(30, 30, 46), @@ -136,7 +139,8 @@ impl Palette { accent: Color::Rgb(30, 102, 245), panel_bg: Color::Rgb(239, 241, 245), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(204, 208, 218), + active_row_bg: Color::Rgb(230, 233, 239), + selection_bg: Color::Rgb(189, 208, 245), surface0: Color::Rgb(204, 208, 218), surface1: Color::Rgb(188, 192, 204), surface_dim: Color::Rgb(230, 233, 239), @@ -161,6 +165,7 @@ impl Palette { panel_bg: Color::Reset, sidebar_bg: Color::Reset, active_row_bg: Color::DarkGray, + selection_bg: Color::Reset, surface0: Color::Reset, surface1: Color::DarkGray, surface_dim: Color::DarkGray, @@ -184,7 +189,8 @@ impl Palette { accent: Color::Rgb(122, 162, 247), // blue panel_bg: Color::Rgb(26, 27, 38), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(47, 51, 77), + active_row_bg: Color::Rgb(35, 38, 54), + selection_bg: Color::Rgb(45, 54, 80), surface0: Color::Rgb(36, 40, 59), surface1: Color::Rgb(65, 72, 104), surface_dim: Color::Rgb(26, 27, 38), @@ -208,7 +214,8 @@ impl Palette { accent: Color::Rgb(46, 125, 233), panel_bg: Color::Rgb(225, 226, 231), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(196, 200, 218), + active_row_bg: Color::Rgb(210, 211, 218), + selection_bg: Color::Rgb(182, 202, 231), surface0: Color::Rgb(196, 200, 218), surface1: Color::Rgb(168, 174, 203), surface_dim: Color::Rgb(210, 211, 218), @@ -232,7 +239,8 @@ impl Palette { accent: Color::Rgb(189, 147, 249), // purple panel_bg: Color::Rgb(40, 42, 54), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(68, 71, 90), + active_row_bg: Color::Rgb(55, 60, 82), + selection_bg: Color::Rgb(70, 63, 93), surface0: Color::Rgb(68, 71, 90), surface1: Color::Rgb(98, 114, 164), surface_dim: Color::Rgb(40, 42, 54), @@ -257,6 +265,7 @@ impl Palette { panel_bg: Color::Rgb(46, 52, 64), sidebar_bg: Color::Reset, active_row_bg: Color::Rgb(67, 76, 94), + selection_bg: Color::Rgb(64, 80, 93), surface0: Color::Rgb(59, 66, 82), surface1: Color::Rgb(67, 76, 94), surface_dim: Color::Rgb(46, 52, 64), @@ -280,7 +289,8 @@ impl Palette { accent: Color::Rgb(215, 153, 33), // yellow panel_bg: Color::Rgb(40, 40, 40), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(80, 73, 69), + active_row_bg: Color::Rgb(50, 49, 48), + selection_bg: Color::Rgb(75, 63, 39), surface0: Color::Rgb(60, 56, 54), surface1: Color::Rgb(80, 73, 69), surface_dim: Color::Rgb(40, 40, 40), @@ -304,7 +314,8 @@ impl Palette { accent: Color::Rgb(7, 102, 120), panel_bg: Color::Rgb(251, 241, 199), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(213, 196, 161), + active_row_bg: Color::Rgb(242, 229, 188), + selection_bg: Color::Rgb(235, 219, 178), surface0: Color::Rgb(235, 219, 178), surface1: Color::Rgb(213, 196, 161), surface_dim: Color::Rgb(242, 229, 188), @@ -328,7 +339,8 @@ impl Palette { accent: Color::Rgb(97, 175, 239), // blue panel_bg: Color::Rgb(40, 44, 52), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(62, 68, 81), + active_row_bg: Color::Rgb(49, 54, 64), + selection_bg: Color::Rgb(51, 70, 89), surface0: Color::Rgb(44, 49, 58), surface1: Color::Rgb(62, 68, 81), surface_dim: Color::Rgb(40, 44, 52), @@ -353,6 +365,7 @@ impl Palette { panel_bg: Color::Rgb(250, 250, 250), sidebar_bg: Color::Reset, active_row_bg: Color::Rgb(216, 219, 226), + selection_bg: Color::Rgb(205, 219, 248), surface0: Color::Rgb(240, 240, 241), surface1: Color::Rgb(229, 229, 230), surface_dim: Color::Rgb(245, 245, 246), @@ -377,6 +390,7 @@ impl Palette { panel_bg: Color::Rgb(0, 43, 54), sidebar_bg: Color::Reset, active_row_bg: Color::Rgb(22, 75, 87), + selection_bg: Color::Rgb(8, 62, 85), surface0: Color::Rgb(7, 54, 66), surface1: Color::Rgb(88, 110, 117), surface_dim: Color::Rgb(0, 43, 54), @@ -400,7 +414,8 @@ impl Palette { accent: Color::Rgb(38, 139, 210), panel_bg: Color::Rgb(253, 246, 227), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(222, 216, 198), + active_row_bg: Color::Rgb(238, 232, 213), + selection_bg: Color::Rgb(201, 220, 223), surface0: Color::Rgb(238, 232, 213), surface1: Color::Rgb(147, 161, 161), surface_dim: Color::Rgb(238, 232, 213), @@ -425,6 +440,7 @@ impl Palette { panel_bg: Color::Rgb(31, 31, 40), sidebar_bg: Color::Reset, active_row_bg: Color::Rgb(54, 54, 70), + selection_bg: Color::Rgb(50, 56, 75), surface0: Color::Rgb(42, 42, 55), surface1: Color::Rgb(54, 54, 70), surface_dim: Color::Rgb(31, 31, 40), @@ -448,7 +464,8 @@ impl Palette { accent: Color::Rgb(77, 105, 155), panel_bg: Color::Rgb(242, 236, 188), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(201, 203, 209), + active_row_bg: Color::Rgb(213, 206, 163), + selection_bg: Color::Rgb(220, 213, 172), surface0: Color::Rgb(220, 213, 172), surface1: Color::Rgb(201, 203, 209), surface_dim: Color::Rgb(213, 206, 163), @@ -472,7 +489,8 @@ impl Palette { accent: Color::Rgb(196, 167, 231), // iris panel_bg: Color::Rgb(25, 23, 36), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(64, 61, 82), + active_row_bg: Color::Rgb(38, 35, 58), + selection_bg: Color::Rgb(59, 52, 75), surface0: Color::Rgb(31, 29, 46), surface1: Color::Rgb(38, 35, 58), surface_dim: Color::Rgb(38, 35, 58), @@ -497,6 +515,7 @@ impl Palette { panel_bg: Color::Rgb(250, 244, 237), sidebar_bg: Color::Reset, active_row_bg: Color::Rgb(227, 217, 207), + selection_bg: Color::Rgb(242, 233, 225), surface0: Color::Rgb(242, 233, 225), surface1: Color::Rgb(255, 250, 243), surface_dim: Color::Rgb(242, 233, 225), @@ -520,7 +539,8 @@ impl Palette { accent: Color::Rgb(255, 199, 153), panel_bg: Color::Rgb(26, 26, 26), sidebar_bg: Color::Reset, - active_row_bg: Color::Rgb(51, 51, 51), + active_row_bg: Color::Rgb(16, 16, 16), + selection_bg: Color::Rgb(35, 35, 35), surface0: Color::Rgb(35, 35, 35), surface1: Color::Rgb(40, 40, 40), surface_dim: Color::Rgb(16, 16, 16), @@ -578,6 +598,9 @@ impl Palette { if let Some(c) = &custom.active_row_bg { self.active_row_bg = parse_color(c); } + if let Some(c) = &custom.selection_bg { + self.selection_bg = parse_color(c); + } if let Some(c) = &custom.surface0 { self.surface0 = parse_color(c); } @@ -2412,7 +2435,7 @@ mod tests { let palette = Palette::from_name(name).unwrap(); let background_contrast = contrast_ratio(palette.panel_bg, palette.active_row_bg); assert!( - background_contrast >= 1.25, + background_contrast >= 1.05, "active row blends into the matching terminal background for {name}: {background_contrast:.2}:1" ); @@ -2421,9 +2444,31 @@ mod tests { text_contrast >= 3.0, "active row text loses contrast for {name}: {text_contrast:.2}:1" ); + } + } + + #[test] + fn built_in_selection_rows_stay_distinct_from_background_and_active_rows() { + for name in THEME_NAMES + .iter() + .copied() + .filter(|name| *name != "terminal") + { + let palette = Palette::from_name(name).unwrap(); + let background_contrast = contrast_ratio(palette.panel_bg, palette.selection_bg); + assert!( + background_contrast >= 1.05, + "selection row blends into the matching terminal background for {name}: {background_contrast:.2}:1" + ); + + let text_contrast = contrast_ratio(palette.text, palette.selection_bg); + assert!( + text_contrast >= 3.0, + "selection row text loses contrast for {name}: {text_contrast:.2}:1" + ); assert_ne!( - palette.active_row_bg, palette.surface_dim, - "active row still shares the separator color for {name}" + palette.selection_bg, palette.active_row_bg, + "selection row shares the active row color for {name}" ); } } @@ -2445,12 +2490,14 @@ mod tests { let custom = crate::config::CustomThemeColors { sidebar_bg: Some("#181825".to_string()), active_row_bg: Some("#313244".to_string()), + selection_bg: Some("#45475a".to_string()), ..Default::default() }; let palette = Palette::catppuccin().with_overrides(&custom); assert_eq!(palette.sidebar_bg, Color::Rgb(24, 24, 37)); assert_eq!(palette.active_row_bg, Color::Rgb(49, 50, 68)); + assert_eq!(palette.selection_bg, Color::Rgb(69, 71, 90)); } #[test] |
