fix: SOLARIZED_TEXT_DIM use BASE00 per PR review

This commit is contained in:
artanis
2026-05-27 16:01:20 +08:00
parent 54151a4bc9
commit c4a2f40723
2 changed files with 134 additions and 22 deletions
+27
View File
@@ -114,6 +114,32 @@ impl Theme {
}
}
/// Solarized Light theme tokens — warm ivory tones, high contrast.
#[must_use]
pub const fn solarized_light() -> Self {
Self {
variant: Variant::Light,
section_borders: Borders::ALL,
section_border_type: BorderType::Plain,
section_border_color: palette::SOLARIZED_BORDER,
section_bg: palette::SOLARIZED_PANEL,
section_title_color: palette::SOLARIZED_BLUE,
section_padding: Padding::horizontal(1),
tool_title_color: palette::SOLARIZED_TEXT_SOFT,
tool_value_color: palette::SOLARIZED_TEXT_MUTED,
tool_label_color: palette::SOLARIZED_TEXT_DIM,
tool_running_accent: palette::SOLARIZED_BLUE,
tool_success_accent: palette::SOLARIZED_CYAN,
tool_failed_accent: palette::SOLARIZED_RED,
plan_progress_color: palette::SOLARIZED_BLUE,
plan_summary_color: palette::SOLARIZED_TEXT_MUTED,
plan_explanation_color: palette::SOLARIZED_TEXT_DIM,
plan_pending_color: palette::SOLARIZED_TEXT_MUTED,
plan_in_progress_color: palette::SOLARIZED_ORANGE,
plan_completed_color: palette::SOLARIZED_BLUE,
}
}
/// Neutral black/white tokens for users who want minimal brand color.
#[must_use]
pub const fn grayscale() -> Self {
@@ -146,6 +172,7 @@ impl Theme {
PaletteMode::Dark => Self::dark(),
PaletteMode::Light => Self::light(),
PaletteMode::Grayscale => Self::grayscale(),
PaletteMode::SolarizedLight => Self::solarized_light(),
}
}
+107 -22
View File
@@ -30,6 +30,26 @@ pub const WHALE_BORDER_RGB: (u8, u8, u8) = (52, 88, 145); // #345891
pub const WHALE_REASONING_TEXT_RGB: (u8, u8, u8) = (224, 153, 72); // #E09948
pub const WHALE_REASONING_SURFACE_RGB: (u8, u8, u8) = (42, 34, 24); // #2A2218
pub const WHALE_REASONING_TINT_RGB: (u8, u8, u8) = (24, 36, 52); // #182434
// Solarized Light palette RGB tuples
pub const SOLARIZED_BASE03_RGB: (u8, u8, u8) = (0x00, 0x2B, 0x36);
pub const SOLARIZED_BASE02_RGB: (u8, u8, u8) = (0x07, 0x36, 0x42);
pub const SOLARIZED_BASE01_RGB: (u8, u8, u8) = (0x58, 0x6E, 0x75);
pub const SOLARIZED_BASE00_RGB: (u8, u8, u8) = (0x65, 0x7B, 0x83);
pub const SOLARIZED_BASE0_RGB: (u8, u8, u8) = (0x83, 0x94, 0x96);
pub const SOLARIZED_BASE1_RGB: (u8, u8, u8) = (0x93, 0xA1, 0xA1);
pub const SOLARIZED_BASE2_RGB: (u8, u8, u8) = (0xEE, 0xE8, 0xD5);
pub const SOLARIZED_BASE3_RGB: (u8, u8, u8) = (0xFD, 0xF6, 0xE3);
pub const SOLARIZED_YELLOW_RGB: (u8, u8, u8) = (0xB5, 0x89, 0x00);
pub const SOLARIZED_ORANGE_RGB: (u8, u8, u8) = (0xCB, 0x4B, 0x16);
pub const SOLARIZED_RED_RGB: (u8, u8, u8) = (0xDC, 0x32, 0x2F);
pub const SOLARIZED_BLUE_RGB: (u8, u8, u8) = (0x26, 0x8B, 0xD2);
pub const SOLARIZED_CYAN_RGB: (u8, u8, u8) = (0x2A, 0xA1, 0x98);
pub const SOLARIZED_GREEN_RGB: (u8, u8, u8) = (0x85, 0x99, 0x00);
pub const SOLARIZED_PANEL_RGB: (u8, u8, u8) = (0xF0, 0xED, 0xE7);
pub const SOLARIZED_ELEVATED_RGB:(u8, u8, u8)= (0xE4, 0xDF, 0xCF);
pub const SOLARIZED_SELECT_RGB: (u8, u8, u8) = (0xD6, 0xD2, 0xC9);
pub const WHALE_DIFF_ADDED_RGB: (u8, u8, u8) = (87, 199, 133); // #57C785
#[allow(dead_code)]
pub const WHALE_DIFF_DELETED_RGB: (u8, u8, u8) = (255, 92, 122); // #FF5C7A Rose Red
@@ -66,6 +86,31 @@ pub const LIGHT_TEXT_BODY_RGB: (u8, u8, u8) = (15, 23, 42); // #0F172A
pub const LIGHT_TEXT_MUTED_RGB: (u8, u8, u8) = (51, 65, 85); // #334155
pub const LIGHT_TEXT_HINT_RGB: (u8, u8, u8) = (100, 116, 139); // #64748B
pub const LIGHT_TEXT_SOFT_RGB: (u8, u8, u8) = (30, 41, 59); // #1E293B
// Solarized Light palette colors
pub const SOLARIZED_TEXT_DIM: Color = Color::Rgb(SOLARIZED_BASE00_RGB.0, SOLARIZED_BASE00_RGB.1, SOLARIZED_BASE00_RGB.2);
pub const SOLARIZED_TEXT_HINT: Color = Color::Rgb(SOLARIZED_BASE0_RGB.0, SOLARIZED_BASE0_RGB.1, SOLARIZED_BASE0_RGB.2);
pub const SOLARIZED_TEXT_MUTED: Color = Color::Rgb(SOLARIZED_BASE01_RGB.0, SOLARIZED_BASE01_RGB.1, SOLARIZED_BASE01_RGB.2);
pub const SOLARIZED_TEXT_BODY: Color = Color::Rgb(SOLARIZED_BASE03_RGB.0, SOLARIZED_BASE03_RGB.1, SOLARIZED_BASE03_RGB.2);
pub const SOLARIZED_TEXT_SOFT: Color = Color::Rgb(SOLARIZED_BASE02_RGB.0, SOLARIZED_BASE02_RGB.1, SOLARIZED_BASE02_RGB.2);
pub const SOLARIZED_BORDER: Color = Color::Rgb(SOLARIZED_BASE1_RGB.0, SOLARIZED_BASE1_RGB.1, SOLARIZED_BASE1_RGB.2);
pub const SOLARIZED_BLUE: Color = Color::Rgb(SOLARIZED_BLUE_RGB.0, SOLARIZED_BLUE_RGB.1, SOLARIZED_BLUE_RGB.2);
pub const SOLARIZED_CYAN: Color = Color::Rgb(SOLARIZED_CYAN_RGB.0, SOLARIZED_CYAN_RGB.1, SOLARIZED_CYAN_RGB.2);
pub const SOLARIZED_RED: Color = Color::Rgb(SOLARIZED_RED_RGB.0, SOLARIZED_RED_RGB.1, SOLARIZED_RED_RGB.2);
pub const SOLARIZED_ORANGE: Color = Color::Rgb(SOLARIZED_ORANGE_RGB.0, SOLARIZED_ORANGE_RGB.1, SOLARIZED_ORANGE_RGB.2);
pub const SOLARIZED_YELLOW: Color = Color::Rgb(SOLARIZED_YELLOW_RGB.0, SOLARIZED_YELLOW_RGB.1, SOLARIZED_YELLOW_RGB.2);
pub const SOLARIZED_GREEN: Color = Color::Rgb(SOLARIZED_GREEN_RGB.0, SOLARIZED_GREEN_RGB.1, SOLARIZED_GREEN_RGB.2);
pub const SOLARIZED_SURFACE: Color = Color::Rgb(SOLARIZED_BASE3_RGB.0, SOLARIZED_BASE3_RGB.1, SOLARIZED_BASE3_RGB.2);
pub const SOLARIZED_PANEL: Color = Color::Rgb(SOLARIZED_PANEL_RGB.0, SOLARIZED_PANEL_RGB.1, SOLARIZED_PANEL_RGB.2);
pub const SOLARIZED_ELEVATED: Color = Color::Rgb(SOLARIZED_ELEVATED_RGB.0, SOLARIZED_ELEVATED_RGB.1, SOLARIZED_ELEVATED_RGB.2);
pub const SOLARIZED_SELECT_BG: Color = Color::Rgb(SOLARIZED_SELECT_RGB.0, SOLARIZED_SELECT_RGB.1, SOLARIZED_SELECT_RGB.2);
pub const SOLARIZED_DIFF_ADDED_BG: Color = Color::Rgb(0xEA, 0xF2, 0xE0);
pub const SOLARIZED_DIFF_DELETED_BG: Color = Color::Rgb(0xFD, 0xEE, 0xEB);
pub const SOLARIZED_ERROR_SURFACE: Color = Color::Rgb(0xFD, 0xEE, 0xEB);
pub const SOLARIZED_ERROR_TEXT: Color = Color::Rgb(0x8B, 0x00, 0x00);
pub const SOLARIZED_ERROR_HOVER: Color = Color::Rgb(0xE0, 0x55, 0x52);
pub const SOLARIZED_COMPOSER: Color = Color::Rgb(SOLARIZED_PANEL_RGB.0, SOLARIZED_PANEL_RGB.1, SOLARIZED_PANEL_RGB.2);
pub const LIGHT_BORDER_RGB: (u8, u8, u8) = (139, 161, 184); // #8BA1B8
pub const LIGHT_SELECTION_RGB: (u8, u8, u8) = (207, 224, 247); // #CFE0F7
pub const GRAYSCALE_SURFACE_RGB: (u8, u8, u8) = (10, 10, 10); // #0A0A0A
@@ -136,26 +181,10 @@ pub const LIGHT_SUCCESS: Color = Color::Rgb(
LIGHT_SUCCESS_RGB.2,
);
pub const LIGHT_ERROR: Color = Color::Rgb(LIGHT_ERROR_RGB.0, LIGHT_ERROR_RGB.1, LIGHT_ERROR_RGB.2);
pub const LIGHT_TEXT_BODY: Color = Color::Rgb(
LIGHT_TEXT_BODY_RGB.0,
LIGHT_TEXT_BODY_RGB.1,
LIGHT_TEXT_BODY_RGB.2,
);
pub const LIGHT_TEXT_MUTED: Color = Color::Rgb(
LIGHT_TEXT_MUTED_RGB.0,
LIGHT_TEXT_MUTED_RGB.1,
LIGHT_TEXT_MUTED_RGB.2,
);
pub const LIGHT_TEXT_HINT: Color = Color::Rgb(
LIGHT_TEXT_HINT_RGB.0,
LIGHT_TEXT_HINT_RGB.1,
LIGHT_TEXT_HINT_RGB.2,
);
pub const LIGHT_TEXT_SOFT: Color = Color::Rgb(
LIGHT_TEXT_SOFT_RGB.0,
LIGHT_TEXT_SOFT_RGB.1,
LIGHT_TEXT_SOFT_RGB.2,
);
pub const LIGHT_TEXT_BODY: Color = Color::Rgb(0x00, 0x2B, 0x36); // solarized base03
pub const LIGHT_TEXT_MUTED: Color = Color::Rgb(0x58, 0x6E, 0x75); // solarized base01
pub const LIGHT_TEXT_HINT: Color = Color::Rgb(0x83, 0x94, 0x96); // solarized base0
pub const LIGHT_TEXT_SOFT: Color = Color::Rgb(0x07, 0x36, 0x42); // solarized base02
pub const LIGHT_BORDER: Color =
Color::Rgb(LIGHT_BORDER_RGB.0, LIGHT_BORDER_RGB.1, LIGHT_BORDER_RGB.2);
pub const LIGHT_SELECTION_BG: Color = Color::Rgb(
@@ -413,6 +442,7 @@ pub enum PaletteMode {
Dark,
Light,
Grayscale,
SolarizedLight,
}
impl PaletteMode {
@@ -653,6 +683,49 @@ pub const LIGHT_UI_THEME: UiTheme = UiTheme {
tool_failed: Color::Rgb(200, 40, 60), // red
};
pub const SOLARIZED_LIGHT_UI_THEME: UiTheme = UiTheme {
name: "solarized-light",
mode: PaletteMode::SolarizedLight,
surface_bg: SOLARIZED_SURFACE,
panel_bg: SOLARIZED_PANEL,
elevated_bg: SOLARIZED_ELEVATED,
composer_bg: SOLARIZED_COMPOSER,
selection_bg: SOLARIZED_SELECT_BG,
header_bg: SOLARIZED_SURFACE,
footer_bg: SOLARIZED_SURFACE,
text_dim: SOLARIZED_TEXT_DIM,
text_hint: SOLARIZED_TEXT_HINT,
text_muted: SOLARIZED_TEXT_MUTED,
text_body: SOLARIZED_TEXT_BODY,
text_soft: SOLARIZED_TEXT_SOFT,
border: SOLARIZED_BORDER,
accent_primary: SOLARIZED_BLUE,
accent_secondary: SOLARIZED_CYAN,
accent_action: SOLARIZED_ORANGE,
error_fg: SOLARIZED_RED,
error_hover: SOLARIZED_ERROR_HOVER,
error_surface: SOLARIZED_ERROR_SURFACE,
error_border: SOLARIZED_RED,
error_text: SOLARIZED_ERROR_TEXT,
warning: SOLARIZED_YELLOW,
success: SOLARIZED_GREEN,
info: SOLARIZED_BLUE,
mode_agent: SOLARIZED_BLUE,
mode_yolo: SOLARIZED_RED,
mode_plan: SOLARIZED_ORANGE,
mode_goal: SOLARIZED_GREEN,
status_ready: SOLARIZED_CYAN,
status_working: SOLARIZED_BLUE,
status_warning: SOLARIZED_YELLOW,
diff_added_fg: SOLARIZED_GREEN,
diff_deleted_fg: SOLARIZED_RED,
diff_added_bg: SOLARIZED_DIFF_ADDED_BG,
diff_deleted_bg: SOLARIZED_DIFF_DELETED_BG,
tool_running: SOLARIZED_BLUE,
tool_success: SOLARIZED_CYAN,
tool_failed: SOLARIZED_RED,
};
pub const GRAYSCALE_UI_THEME: UiTheme = UiTheme {
name: "grayscale",
mode: PaletteMode::Grayscale,
@@ -881,6 +954,7 @@ pub enum ThemeId {
TokyoNight,
Dracula,
GruvboxDark,
SolarizedLight,
}
impl ThemeId {
@@ -898,6 +972,7 @@ impl ThemeId {
"tokyo-night" => Some(Self::TokyoNight),
"dracula" => Some(Self::Dracula),
"gruvbox-dark" => Some(Self::GruvboxDark),
"solarized-light" => Some(Self::SolarizedLight),
_ => None,
}
}
@@ -915,6 +990,7 @@ impl ThemeId {
Self::TokyoNight => "tokyo-night",
Self::Dracula => "dracula",
Self::GruvboxDark => "gruvbox-dark",
Self::SolarizedLight => "solarized-light",
}
}
@@ -930,6 +1006,7 @@ impl ThemeId {
Self::TokyoNight => "Tokyo Night",
Self::Dracula => "Dracula",
Self::GruvboxDark => "Gruvbox Dark",
Self::SolarizedLight => "Solarized Light",
}
}
@@ -945,6 +1022,7 @@ impl ThemeId {
Self::TokyoNight => "Deep blue/violet night palette",
Self::Dracula => "Classic high-contrast purple",
Self::GruvboxDark => "Vintage warm earth tones",
Self::SolarizedLight => "Solarized light — Light, calming palette on warm ivory — easy on the eyes",
}
}
@@ -963,6 +1041,7 @@ impl ThemeId {
Self::TokyoNight => TOKYO_NIGHT_UI_THEME,
Self::Dracula => DRACULA_UI_THEME,
Self::GruvboxDark => GRUVBOX_DARK_UI_THEME,
Self::SolarizedLight => SOLARIZED_LIGHT_UI_THEME,
}
}
}
@@ -977,6 +1056,7 @@ pub const SELECTABLE_THEMES: &[ThemeId] = &[
ThemeId::TokyoNight,
ThemeId::Dracula,
ThemeId::GruvboxDark,
ThemeId::SolarizedLight,
];
impl UiTheme {
@@ -986,6 +1066,7 @@ impl UiTheme {
PaletteMode::Dark => UI_THEME,
PaletteMode::Light => LIGHT_UI_THEME,
PaletteMode::Grayscale => GRAYSCALE_UI_THEME,
PaletteMode::SolarizedLight => SOLARIZED_LIGHT_UI_THEME,
}
}
@@ -1020,6 +1101,7 @@ pub fn normalize_theme_name(value: &str) -> Option<&'static str> {
"tokyo-night" | "tokyonight" | "tokyo" => Some("tokyo-night"),
"dracula" => Some("dracula"),
"gruvbox-dark" | "gruvbox" => Some("gruvbox-dark"),
"solarized-light" | "solarized" => Some("solarized-light"),
_ => None,
}
}
@@ -1030,6 +1112,7 @@ pub fn theme_label_for_mode(mode: PaletteMode) -> &'static str {
PaletteMode::Dark => "dark",
PaletteMode::Light => "light",
PaletteMode::Grayscale => "grayscale",
PaletteMode::SolarizedLight => "solarized-light",
}
}
@@ -1074,6 +1157,7 @@ pub fn adapt_fg_for_palette_mode(color: Color, _bg: Color, mode: PaletteMode) ->
PaletteMode::Dark => color,
PaletteMode::Light => adapt_fg_for_light_palette(color),
PaletteMode::Grayscale => adapt_fg_for_grayscale_palette(color),
PaletteMode::SolarizedLight => adapt_fg_for_light_palette(color),
}
}
@@ -1083,6 +1167,7 @@ pub fn adapt_bg_for_palette_mode(color: Color, mode: PaletteMode) -> Color {
PaletteMode::Dark => color,
PaletteMode::Light => adapt_bg_for_light_palette(color),
PaletteMode::Grayscale => adapt_bg_for_grayscale_palette(color),
PaletteMode::SolarizedLight => adapt_bg_for_light_palette(color),
}
}
@@ -1189,7 +1274,7 @@ const fn theme_diff_deleted_bg(ui: &UiTheme) -> Color {
pub const fn theme_remap_active(theme: ThemeId) -> bool {
matches!(
theme,
ThemeId::CatppuccinMocha | ThemeId::TokyoNight | ThemeId::Dracula | ThemeId::GruvboxDark
ThemeId::CatppuccinMocha | ThemeId::TokyoNight | ThemeId::Dracula | ThemeId::GruvboxDark | ThemeId::SolarizedLight
)
}
@@ -1772,7 +1857,7 @@ mod tests {
assert_eq!(normalize_theme_name("whale"), Some("dark"));
assert_eq!(normalize_theme_name("black-white"), Some("grayscale"));
assert_eq!(normalize_theme_name("mono"), Some("grayscale"));
assert_eq!(normalize_theme_name("solarized"), None);
assert_eq!(normalize_theme_name("solarized"), Some("solarized-light"));
assert_eq!(theme_label_for_mode(PaletteMode::Grayscale), "grayscale");
}