use ratatui::style::Color;
#[derive(Debug, Clone, Copy)]
pub struct Theme {
pub primary: Color,
pub secondary: Color,
pub danger: Color,
pub success: Color,
pub reference: Color,
pub dim: Color,
pub normal: Color,
pub inverted_fg: Color,
}
impl Theme {
pub fn dark() -> Self {
Self {
primary: Color::Cyan,
secondary: Color::Yellow,
danger: Color::Red,
success: Color::Green,
reference: Color::Blue,
dim: Color::DarkGray,
normal: Color::White,
inverted_fg: Color::Black,
}
}
pub fn light() -> Self {
Self {
primary: Color::Blue,
secondary: Color::Magenta,
danger: Color::Red,
success: Color::Green,
reference: Color::Cyan,
dim: Color::Gray,
normal: Color::Black,
inverted_fg: Color::White,
}
}
pub fn auto() -> Self {
if is_light_terminal() {
Self::light()
} else {
Self::dark()
}
}
pub fn is_light(&self) -> bool {
self.normal == Color::Black
}
}
fn is_light_terminal() -> bool {
if let Ok(colorfgbg) = std::env::var("COLORFGBG") {
let parts: Vec<&str> = colorfgbg.split(';').collect();
if let Some(bg) = parts.last() {
if let Ok(bg_num) = bg.parse::<u32>() {
return bg_num >= 7 && bg_num != 8; }
}
}
false }
impl Default for Theme {
fn default() -> Self {
Self::dark()
}
}