pub mod catppuccin;
pub use catppuccin::*;
use ratatui::style::{Color, Modifier, Style};
pub const NORD0: Color = Color::Rgb(46, 52, 64);
pub const NORD1: Color = Color::Rgb(59, 66, 82);
pub const NORD2: Color = Color::Rgb(67, 76, 94);
pub const NORD3: Color = Color::Rgb(76, 86, 106);
pub const NORD4: Color = Color::Rgb(216, 222, 233);
pub const NORD5: Color = Color::Rgb(229, 233, 240);
pub const NORD6: Color = Color::Rgb(236, 239, 244);
pub const NORD7: Color = Color::Rgb(143, 188, 187);
pub const NORD8: Color = Color::Rgb(136, 192, 208);
pub const NORD9: Color = Color::Rgb(129, 161, 193);
pub const NORD10: Color = Color::Rgb(94, 129, 172);
pub const NORD11: Color = Color::Rgb(191, 97, 106);
pub const NORD12: Color = Color::Rgb(208, 135, 112);
pub const NORD13: Color = Color::Rgb(235, 203, 139);
pub const NORD14: Color = Color::Rgb(163, 190, 140);
pub const NORD15: Color = Color::Rgb(180, 142, 173);
pub const DRACULA_BG: Color = Color::Rgb(40, 42, 54);
pub const DRACULA_CURRENT: Color = Color::Rgb(68, 71, 90);
pub const DRACULA_FG: Color = Color::Rgb(248, 248, 242);
pub const DRACULA_COMMENT: Color = Color::Rgb(98, 114, 164);
pub const DRACULA_CYAN: Color = Color::Rgb(139, 233, 253);
pub const DRACULA_GREEN: Color = Color::Rgb(80, 250, 123);
pub const DRACULA_ORANGE: Color = Color::Rgb(255, 184, 108);
pub const DRACULA_PINK: Color = Color::Rgb(255, 121, 198);
pub const DRACULA_PURPLE: Color = Color::Rgb(189, 147, 249);
pub const DRACULA_RED: Color = Color::Rgb(255, 85, 85);
pub const DRACULA_YELLOW: Color = Color::Rgb(241, 250, 140);
pub const SOLARIZED_BASE03: Color = Color::Rgb(0, 43, 54);
pub const SOLARIZED_BASE02: Color = Color::Rgb(7, 54, 66);
pub const SOLARIZED_BASE01: Color = Color::Rgb(88, 110, 117);
pub const SOLARIZED_BASE0: Color = Color::Rgb(131, 148, 150);
pub const SOLARIZED_BASE1: Color = Color::Rgb(147, 161, 161);
pub const SOLARIZED_BLUE: Color = Color::Rgb(38, 139, 210);
pub const SOLARIZED_CYAN: Color = Color::Rgb(42, 161, 152);
pub const SOLARIZED_GREEN: Color = Color::Rgb(133, 153, 0);
pub const SOLARIZED_YELLOW: Color = Color::Rgb(181, 137, 0);
pub const SOLARIZED_ORANGE: Color = Color::Rgb(203, 75, 22);
pub const SOLARIZED_RED: Color = Color::Rgb(220, 50, 47);
pub const SOLARIZED_MAGENTA: Color = Color::Rgb(211, 54, 130);
pub const GRUVBOX_BG: Color = Color::Rgb(40, 40, 40);
pub const GRUVBOX_BG1: Color = Color::Rgb(60, 56, 54);
pub const GRUVBOX_FG: Color = Color::Rgb(235, 219, 178);
pub const GRUVBOX_GRAY: Color = Color::Rgb(146, 131, 116);
pub const GRUVBOX_RED: Color = Color::Rgb(251, 73, 52);
pub const GRUVBOX_GREEN: Color = Color::Rgb(184, 187, 38);
pub const GRUVBOX_YELLOW: Color = Color::Rgb(250, 189, 47);
pub const GRUVBOX_BLUE: Color = Color::Rgb(131, 165, 152);
pub const GRUVBOX_PURPLE: Color = Color::Rgb(211, 134, 155);
pub const GRUVBOX_AQUA: Color = Color::Rgb(142, 192, 124);
pub const GRUVBOX_ORANGE: Color = Color::Rgb(254, 128, 25);
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct Theme {
pub background: Color,
pub foreground: Color,
pub border: Color,
pub focused: Color,
pub selected: Color,
pub disabled: Color,
pub placeholder: Color,
pub primary: Color,
pub success: Color,
pub warning: Color,
pub error: Color,
pub info: Color,
pub progress_filled: Color,
pub progress_empty: Color,
}
impl Default for Theme {
fn default() -> Self {
Self {
background: Color::Reset,
foreground: Color::Reset,
border: Color::Reset,
focused: Color::Yellow,
selected: Color::Reset,
disabled: Color::DarkGray,
placeholder: Color::DarkGray,
primary: Color::Cyan,
success: Color::Green,
warning: Color::Yellow,
error: Color::Red,
info: Color::Cyan,
progress_filled: Color::Cyan,
progress_empty: Color::Black,
}
}
}
impl Theme {
pub fn nord() -> Self {
Self {
background: NORD0,
foreground: NORD6,
border: NORD3,
focused: NORD8,
selected: NORD9,
disabled: NORD3,
placeholder: NORD3,
primary: NORD10,
success: NORD14,
warning: NORD13,
error: NORD11,
info: NORD8,
progress_filled: NORD8,
progress_empty: NORD1,
}
}
pub fn dracula() -> Self {
Self {
background: DRACULA_BG,
foreground: DRACULA_FG,
border: DRACULA_COMMENT,
focused: DRACULA_PURPLE,
selected: DRACULA_PINK,
disabled: DRACULA_COMMENT,
placeholder: DRACULA_COMMENT,
primary: DRACULA_CYAN,
success: DRACULA_GREEN,
warning: DRACULA_YELLOW,
error: DRACULA_RED,
info: DRACULA_CYAN,
progress_filled: DRACULA_PURPLE,
progress_empty: DRACULA_CURRENT,
}
}
pub fn solarized_dark() -> Self {
Self {
background: SOLARIZED_BASE03,
foreground: SOLARIZED_BASE0,
border: SOLARIZED_BASE01,
focused: SOLARIZED_BLUE,
selected: SOLARIZED_CYAN,
disabled: SOLARIZED_BASE01,
placeholder: SOLARIZED_BASE01,
primary: SOLARIZED_BLUE,
success: SOLARIZED_GREEN,
warning: SOLARIZED_YELLOW,
error: SOLARIZED_RED,
info: SOLARIZED_CYAN,
progress_filled: SOLARIZED_BLUE,
progress_empty: SOLARIZED_BASE02,
}
}
pub fn gruvbox_dark() -> Self {
Self {
background: GRUVBOX_BG,
foreground: GRUVBOX_FG,
border: GRUVBOX_GRAY,
focused: GRUVBOX_YELLOW,
selected: GRUVBOX_BLUE,
disabled: GRUVBOX_GRAY,
placeholder: GRUVBOX_GRAY,
primary: GRUVBOX_AQUA,
success: GRUVBOX_GREEN,
warning: GRUVBOX_ORANGE,
error: GRUVBOX_RED,
info: GRUVBOX_BLUE,
progress_filled: GRUVBOX_YELLOW,
progress_empty: GRUVBOX_BG1,
}
}
pub fn catppuccin_mocha() -> Self {
Self {
background: CATPPUCCIN_BASE,
foreground: CATPPUCCIN_TEXT,
border: CATPPUCCIN_SURFACE2,
focused: CATPPUCCIN_LAVENDER,
selected: CATPPUCCIN_MAUVE,
disabled: CATPPUCCIN_SURFACE2,
placeholder: CATPPUCCIN_OVERLAY0,
primary: CATPPUCCIN_BLUE,
success: CATPPUCCIN_GREEN,
warning: CATPPUCCIN_YELLOW,
error: CATPPUCCIN_RED,
info: CATPPUCCIN_SAPPHIRE,
progress_filled: CATPPUCCIN_LAVENDER,
progress_empty: CATPPUCCIN_SURFACE0,
}
}
pub fn focused_style(&self) -> Style {
Style::default().fg(self.focused)
}
pub fn focused_bold_style(&self) -> Style {
Style::default()
.fg(self.focused)
.add_modifier(Modifier::BOLD)
}
pub fn focused_border_style(&self) -> Style {
Style::default().fg(self.focused).bg(self.background)
}
pub fn selected_style(&self, focused: bool) -> Style {
if focused {
Style::default()
.fg(self.focused)
.add_modifier(Modifier::BOLD)
} else {
Style::default().add_modifier(Modifier::BOLD)
}
}
pub fn selected_highlight_style(&self, focused: bool) -> Style {
if focused {
Style::default()
.bg(self.selected)
.fg(self.foreground)
.add_modifier(Modifier::BOLD)
} else {
Style::default().bg(self.disabled).fg(self.foreground)
}
}
pub fn selection_style(&self) -> Style {
Style::default().bg(self.selected).fg(self.foreground)
}
pub fn disabled_style(&self) -> Style {
Style::default().fg(self.disabled)
}
pub fn placeholder_style(&self) -> Style {
Style::default().fg(self.placeholder)
}
pub fn normal_style(&self) -> Style {
Style::default().fg(self.foreground).bg(self.background)
}
pub fn primary_style(&self) -> Style {
Style::default().fg(self.primary)
}
pub fn border_style(&self) -> Style {
Style::default().fg(self.border)
}
pub fn success_style(&self) -> Style {
Style::default().fg(self.success)
}
pub fn warning_style(&self) -> Style {
Style::default().fg(self.warning)
}
pub fn error_style(&self) -> Style {
Style::default().fg(self.error)
}
pub fn info_style(&self) -> Style {
Style::default().fg(self.info)
}
pub fn progress_filled_style(&self) -> Style {
Style::default()
.fg(self.progress_filled)
.bg(self.progress_empty)
}
}
#[cfg(test)]
mod tests;