use crate::imperial::IMPERIAL;
use crate::monekai::MONEKAI;
use crate::monochrome::MONOCHROME;
use crate::radium::RADIUM;
use crate::tundra::TUNDRA;
use crate::Scheme;
use rat_widget::button::ButtonStyle;
use rat_widget::input::TextInputStyle;
use rat_widget::list::ListStyle;
use rat_widget::masked_input::MaskedInputStyle;
use rat_widget::menuline::MenuStyle;
use rat_widget::msgdialog::MsgDialogStyle;
use rat_widget::scrolled::ScrolledStyle;
use rat_widget::table::FTableStyle;
use rat_widget::textarea::TextAreaStyle;
use ratatui::prelude::Style;
pub fn dark_themes() -> Vec<DarkTheme> {
vec![
DarkTheme::new("Imperial".to_string(), IMPERIAL),
DarkTheme::new("Radium".to_string(), RADIUM),
DarkTheme::new("Tundra".to_string(), TUNDRA),
DarkTheme::new("Monochrome".to_string(), MONOCHROME),
DarkTheme::new("Monekai".to_string(), MONEKAI),
]
}
#[derive(Debug, Clone)]
pub struct DarkTheme {
s: Scheme,
name: String,
}
impl DarkTheme {
pub fn new(name: String, s: Scheme) -> Self {
Self { s, name }
}
}
impl DarkTheme {
pub fn name(&self) -> &str {
&self.name
}
pub fn dark_theme(&self) -> bool {
true
}
pub fn scheme(&self) -> &Scheme {
&self.s
}
pub fn white(&self, n: usize) -> Style {
self.s.style(self.s.white[n])
}
pub fn black(&self, n: usize) -> Style {
self.s.style(self.s.black[n])
}
pub fn gray(&self, n: usize) -> Style {
self.s.style(self.s.gray[n])
}
pub fn red(&self, n: usize) -> Style {
self.s.style(self.s.red[n])
}
pub fn orange(&self, n: usize) -> Style {
self.s.style(self.s.orange[n])
}
pub fn yellow(&self, n: usize) -> Style {
self.s.style(self.s.yellow[n])
}
pub fn limegreen(&self, n: usize) -> Style {
self.s.style(self.s.limegreen[n])
}
pub fn green(&self, n: usize) -> Style {
self.s.style(self.s.green[n])
}
pub fn bluegreen(&self, n: usize) -> Style {
self.s.style(self.s.bluegreen[n])
}
pub fn cyan(&self, n: usize) -> Style {
self.s.style(self.s.cyan[n])
}
pub fn blue(&self, n: usize) -> Style {
self.s.style(self.s.blue[n])
}
pub fn deepblue(&self, n: usize) -> Style {
self.s.style(self.s.deepblue[n])
}
pub fn purple(&self, n: usize) -> Style {
self.s.style(self.s.purple[n])
}
pub fn magenta(&self, n: usize) -> Style {
self.s.style(self.s.magenta[n])
}
pub fn redpink(&self, n: usize) -> Style {
self.s.style(self.s.redpink[n])
}
pub fn primary(&self, n: usize) -> Style {
self.s.style(self.s.primary[n])
}
pub fn secondary(&self, n: usize) -> Style {
self.s.style(self.s.secondary[n])
}
pub fn focus(&self) -> Style {
let bg = self.s.primary[2];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn select(&self) -> Style {
let bg = self.s.secondary[1];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn text_input(&self) -> Style {
Style::default().fg(self.s.black[0]).bg(self.s.gray[3])
}
pub fn text_focus(&self) -> Style {
let bg = self.s.primary[0];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn text_select(&self) -> Style {
let bg = self.s.secondary[0];
Style::default().fg(self.s.text_color(bg)).bg(bg)
}
pub fn data(&self) -> Style {
Style::default().fg(self.s.white[0]).bg(self.s.black[1])
}
pub fn dialog_style(&self) -> Style {
Style::default().fg(self.s.white[2]).bg(self.s.gray[1])
}
pub fn status_style(&self) -> Style {
Style::default().fg(self.s.white[0]).bg(self.s.black[2])
}
pub fn textarea_style(&self) -> TextAreaStyle {
TextAreaStyle {
style: self.data(),
focus: Some(self.focus()),
select: Some(self.text_select()),
..TextAreaStyle::default()
}
}
pub fn input_style(&self) -> TextInputStyle {
TextInputStyle {
style: self.text_input(),
focus: Some(self.text_focus()),
select: Some(self.text_select()),
..TextInputStyle::default()
}
}
pub fn inputmask_style(&self) -> MaskedInputStyle {
MaskedInputStyle {
style: self.text_input(),
focus: Some(self.text_focus()),
select: Some(self.text_select()),
invalid: Some(Style::default().bg(self.s.red[3])),
..Default::default()
}
}
pub fn menu_style(&self) -> MenuStyle {
let menu = Style::default().fg(self.s.white[3]).bg(self.s.black[2]);
MenuStyle {
style: menu,
title: Some(Style::default().fg(self.s.black[0]).bg(self.s.yellow[2])),
select: Some(menu),
focus: Some(self.focus()),
..Default::default()
}
}
pub fn table_style(&self) -> FTableStyle {
FTableStyle {
style: self.data(),
select_row_style: Some(self.select()),
show_row_focus: true,
focus_style: Some(self.focus()),
..Default::default()
}
}
pub fn list_style(&self) -> ListStyle {
ListStyle {
style: self.data(),
select_style: self.select(),
focus_style: self.focus(),
..Default::default()
}
}
pub fn button_style(&self) -> ButtonStyle {
ButtonStyle {
style: Style::default().fg(self.s.white[0]).bg(self.s.primary[0]),
focus: Some(self.focus()),
armed: Some(Style::default().fg(self.s.black[0]).bg(self.s.secondary[0])),
..Default::default()
}
}
pub fn scrolled_style(&self) -> ScrolledStyle {
let style = Style::default().fg(self.s.gray[0]).bg(self.s.black[1]);
let arrow_style = Style::default().fg(self.s.secondary[0]).bg(self.s.black[1]);
ScrolledStyle {
thumb_style: Some(style),
track_style: Some(style),
begin_style: Some(arrow_style),
end_style: Some(arrow_style),
..Default::default()
}
}
pub fn statusline_style(&self) -> Vec<Style> {
let s = &self.s;
vec![
self.status_style(),
Style::default().fg(s.text_color(s.white[0])).bg(s.blue[3]),
Style::default().fg(s.text_color(s.white[0])).bg(s.blue[2]),
Style::default().fg(s.text_color(s.white[0])).bg(s.blue[1]),
]
}
pub fn msg_dialog_style(&self) -> MsgDialogStyle {
MsgDialogStyle {
style: self.status_style(),
button: self.button_style(),
..Default::default()
}
}
}