use ratatui::style::Color;
#[derive(Debug, Clone)]
pub struct Theme {
pub accent: Color,
pub highlight: Color,
pub border: Color,
pub selected_bg: Color,
pub title: Color,
pub key_badge_bg: Color,
pub key_badge_fg: Color,
pub hint_fg: Color,
pub separator_fg: Color,
pub popup_border: Color,
pub success_border: Color,
pub warning_border: Color,
pub danger_border: Color,
pub form_focused_bg: Color,
pub form_focused_fg: Color,
pub form_normal_bg: Color,
pub form_normal_fg: Color,
pub form_label: Color,
pub form_label_focused: Color,
pub text_primary: Color,
pub text_secondary: Color,
pub text_muted: Color,
pub text_error: Color,
pub text_success: Color,
pub text_warning: Color,
pub file_dir: Color,
pub file_regular: Color,
pub file_marked: Color,
}
impl Theme {
pub fn default_theme() -> Self {
Self {
accent: Color::Cyan,
highlight: Color::LightCyan,
border: Color::DarkGray,
selected_bg: Color::DarkGray,
title: Color::White,
key_badge_bg: Color::Cyan,
key_badge_fg: Color::Black,
hint_fg: Color::Gray,
separator_fg: Color::DarkGray,
popup_border: Color::Cyan,
success_border: Color::Green,
warning_border: Color::Yellow,
danger_border: Color::Red,
form_focused_bg: Color::Cyan,
form_focused_fg: Color::Black,
form_normal_bg: Color::DarkGray,
form_normal_fg: Color::White,
form_label: Color::Gray,
form_label_focused: Color::Cyan,
text_primary: Color::White,
text_secondary: Color::Gray,
text_muted: Color::DarkGray,
text_error: Color::Red,
text_success: Color::Green,
text_warning: Color::Yellow,
file_dir: Color::Cyan,
file_regular: Color::Gray,
file_marked: Color::Yellow,
}
}
pub fn dracula() -> Self {
Self {
accent: Color::Rgb(189, 147, 249), highlight: Color::Rgb(255, 121, 198), border: Color::Rgb(68, 71, 90), selected_bg: Color::Rgb(68, 71, 90),
title: Color::Rgb(80, 250, 123),
key_badge_bg: Color::Rgb(189, 147, 249), key_badge_fg: Color::Rgb(40, 42, 54), hint_fg: Color::Rgb(248, 248, 242), separator_fg: Color::Rgb(68, 71, 90),
popup_border: Color::Rgb(189, 147, 249), success_border: Color::Rgb(80, 250, 123), warning_border: Color::Rgb(241, 250, 140), danger_border: Color::Rgb(255, 85, 85), form_focused_bg: Color::Rgb(189, 147, 249),
form_focused_fg: Color::Rgb(40, 42, 54),
form_normal_bg: Color::Rgb(68, 71, 90),
form_normal_fg: Color::Rgb(248, 248, 242),
form_label: Color::Rgb(98, 114, 164), form_label_focused: Color::Rgb(189, 147, 249),
text_primary: Color::Rgb(248, 248, 242), text_secondary: Color::Rgb(98, 114, 164), text_muted: Color::Rgb(68, 71, 90),
text_error: Color::Rgb(255, 85, 85), text_success: Color::Rgb(80, 250, 123), text_warning: Color::Rgb(241, 250, 140),
file_dir: Color::Rgb(139, 233, 253), file_regular: Color::Rgb(98, 114, 164),
file_marked: Color::Rgb(241, 250, 140), }
}
pub fn nord() -> Self {
Self {
accent: Color::Rgb(136, 192, 208), highlight: Color::Rgb(129, 161, 193), border: Color::Rgb(59, 66, 82), selected_bg: Color::Rgb(67, 76, 94), title: Color::Rgb(143, 188, 187),
key_badge_bg: Color::Rgb(136, 192, 208), key_badge_fg: Color::Rgb(46, 52, 64), hint_fg: Color::Rgb(216, 222, 233), separator_fg: Color::Rgb(76, 86, 106),
popup_border: Color::Rgb(136, 192, 208), success_border: Color::Rgb(163, 190, 140), warning_border: Color::Rgb(235, 203, 139), danger_border: Color::Rgb(191, 97, 106), form_focused_bg: Color::Rgb(136, 192, 208),
form_focused_fg: Color::Rgb(46, 52, 64),
form_normal_bg: Color::Rgb(67, 76, 94),
form_normal_fg: Color::Rgb(216, 222, 233),
form_label: Color::Rgb(76, 86, 106),
form_label_focused: Color::Rgb(136, 192, 208),
text_primary: Color::Rgb(236, 239, 244), text_secondary: Color::Rgb(216, 222, 233), text_muted: Color::Rgb(76, 86, 106), text_error: Color::Rgb(191, 97, 106), text_success: Color::Rgb(163, 190, 140), text_warning: Color::Rgb(235, 203, 139),
file_dir: Color::Rgb(136, 192, 208), file_regular: Color::Rgb(216, 222, 233),
file_marked: Color::Rgb(235, 203, 139), }
}
pub fn gruvbox() -> Self {
Self {
accent: Color::Rgb(250, 189, 47), highlight: Color::Rgb(254, 128, 25), border: Color::Rgb(80, 73, 69), selected_bg: Color::Rgb(80, 73, 69),
title: Color::Rgb(184, 187, 38),
key_badge_bg: Color::Rgb(215, 153, 33), key_badge_fg: Color::Rgb(40, 40, 40), hint_fg: Color::Rgb(235, 219, 178), separator_fg: Color::Rgb(102, 92, 84),
popup_border: Color::Rgb(215, 153, 33), success_border: Color::Rgb(184, 187, 38), warning_border: Color::Rgb(250, 189, 47), danger_border: Color::Rgb(251, 73, 52), form_focused_bg: Color::Rgb(215, 153, 33),
form_focused_fg: Color::Rgb(40, 40, 40),
form_normal_bg: Color::Rgb(80, 73, 69),
form_normal_fg: Color::Rgb(235, 219, 178),
form_label: Color::Rgb(102, 92, 84),
form_label_focused: Color::Rgb(215, 153, 33),
text_primary: Color::Rgb(251, 241, 199), text_secondary: Color::Rgb(213, 196, 161), text_muted: Color::Rgb(102, 92, 84), text_error: Color::Rgb(251, 73, 52), text_success: Color::Rgb(184, 187, 38), text_warning: Color::Rgb(250, 189, 47),
file_dir: Color::Rgb(131, 165, 152), file_regular: Color::Rgb(213, 196, 161),
file_marked: Color::Rgb(250, 189, 47), }
}
pub fn from_name(name: &str) -> Self {
match name {
"dracula" => Self::dracula(),
"nord" => Self::nord(),
"gruvbox" => Self::gruvbox(),
_ => Self::default_theme(),
}
}
}
impl Default for Theme {
fn default() -> Self {
Self::default_theme()
}
}