use crate::palettes::{
BASE16, BASE16_RELAX, BLACKWHITE, IMPERIAL, MONEKAI, MONOCHROME, OCEAN, OXOCARBON, RADIUM,
RUST, SOLARIZED, TUNDRA, VSCODE_DARK,
};
use rat_widget::button::ButtonStyle;
use rat_widget::calendar::CalendarStyle;
use rat_widget::checkbox::CheckboxStyle;
use rat_widget::choice::ChoiceStyle;
use rat_widget::clipper::ClipperStyle;
use rat_widget::file_dialog::FileDialogStyle;
use rat_widget::line_number::LineNumberStyle;
use rat_widget::list::ListStyle;
use rat_widget::menu::MenuStyle;
use rat_widget::msgdialog::MsgDialogStyle;
use rat_widget::paragraph::ParagraphStyle;
use rat_widget::radio::RadioStyle;
use rat_widget::scrolled::ScrollStyle;
use rat_widget::shadow::ShadowStyle;
use rat_widget::slider::SliderStyle;
use rat_widget::splitter::SplitStyle;
use rat_widget::statusline::StatusLineStyle;
use rat_widget::tabbed::TabbedStyle;
use rat_widget::table::TableStyle;
use rat_widget::text::TextStyle;
use rat_widget::view::ViewStyle;
use ratatui_core::style::Style;
mod dark_theme;
mod palette;
pub mod palettes;
mod shell_theme;
pub use dark_theme::*;
pub use palette::*;
use rat_widget::form::FormStyle;
pub use shell_theme::*;
pub trait SalsaTheme {
fn name(&self) -> &str;
fn palette(&self) -> &Palette;
fn white(&self, n: usize) -> Style;
fn black(&self, n: usize) -> Style;
fn gray(&self, n: usize) -> Style;
fn red(&self, n: usize) -> Style;
fn orange(&self, n: usize) -> Style;
fn yellow(&self, n: usize) -> Style;
fn limegreen(&self, n: usize) -> Style;
fn green(&self, n: usize) -> Style;
fn bluegreen(&self, n: usize) -> Style;
fn cyan(&self, n: usize) -> Style;
fn blue(&self, n: usize) -> Style;
fn deepblue(&self, n: usize) -> Style;
fn purple(&self, n: usize) -> Style;
fn magenta(&self, n: usize) -> Style;
fn redpink(&self, n: usize) -> Style;
fn primary(&self, n: usize) -> Style;
fn secondary(&self, n: usize) -> Style;
fn focus(&self) -> Style;
fn select(&self) -> Style;
fn text_input(&self) -> Style;
fn text_focus(&self) -> Style;
fn text_select(&self) -> Style;
fn scroll_style(&self) -> ScrollStyle;
fn container_base(&self) -> Style;
fn container_border(&self) -> Style;
fn container_arrow(&self) -> Style;
fn popup_base(&self) -> Style;
fn popup_border(&self) -> Style;
fn popup_arrow(&self) -> Style;
fn popup_scroll_style(&self) -> ScrollStyle;
fn dialog_base(&self) -> Style;
fn dialog_border(&self) -> Style;
fn dialog_arrow(&self) -> Style;
fn dialog_scroll_style(&self) -> ScrollStyle;
fn status_base(&self) -> Style;
fn button_base(&self) -> Style;
fn button_armed(&self) -> Style;
fn label_style(&self) -> Style;
fn text_style(&self) -> TextStyle;
fn textarea_style(&self) -> TextStyle;
fn choice_style(&self) -> ChoiceStyle;
fn radio_style(&self) -> RadioStyle;
fn checkbox_style(&self) -> CheckboxStyle;
fn slider_style(&self) -> SliderStyle;
fn month_style(&self) -> CalendarStyle;
fn line_nr_style(&self) -> LineNumberStyle;
fn button_style(&self) -> ButtonStyle;
fn table_style(&self) -> TableStyle;
fn list_style(&self) -> ListStyle;
fn textview_style(&self) -> TextStyle;
fn paragraph_style(&self) -> ParagraphStyle;
fn shadow_style(&self) -> ShadowStyle;
fn menu_style(&self) -> MenuStyle;
fn split_style(&self) -> SplitStyle;
fn view_style(&self) -> ViewStyle;
fn tabbed_style(&self) -> TabbedStyle;
fn statusline_style(&self) -> Vec<Style>;
fn statusline_style_ext(&self) -> StatusLineStyle;
fn file_dialog_style(&self) -> FileDialogStyle;
fn msg_dialog_style(&self) -> MsgDialogStyle;
fn form_style(&self) -> FormStyle;
fn clipper_style(&self) -> ClipperStyle;
}
pub fn create_theme(theme: &str) -> Option<Box<dyn SalsaTheme>> {
let theme: Box<dyn SalsaTheme> = match theme {
"Imperial Dark" => Box::new(DarkTheme::new(theme, IMPERIAL)),
"Radium Dark" => Box::new(DarkTheme::new(theme, RADIUM)),
"Tundra Dark" => Box::new(DarkTheme::new(theme, TUNDRA)),
"Ocean Dark" => Box::new(DarkTheme::new(theme, OCEAN)),
"Monochrome Dark" => Box::new(DarkTheme::new(theme, MONOCHROME)),
"Black & White Dark" => Box::new(DarkTheme::new(theme, BLACKWHITE)),
"Base16 Dark" => Box::new(DarkTheme::new(theme, BASE16)),
"Base16 Relax Dark" => Box::new(DarkTheme::new(theme, BASE16_RELAX)),
"Monekai Dark" => Box::new(DarkTheme::new(theme, MONEKAI)),
"Solarized Dark" => Box::new(DarkTheme::new(theme, SOLARIZED)),
"OxoCarbon Dark" => Box::new(DarkTheme::new(theme, OXOCARBON)),
"Rust Dark" => Box::new(DarkTheme::new(theme, RUST)),
"VSCode Dark" => Box::new(DarkTheme::new(theme, VSCODE_DARK)),
"Imperial Shell" => Box::new(ShellTheme::new(theme, IMPERIAL)),
"Radium Shell" => Box::new(ShellTheme::new(theme, RADIUM)),
"Tundra Shell" => Box::new(ShellTheme::new(theme, TUNDRA)),
"Ocean Shell" => Box::new(ShellTheme::new(theme, OCEAN)),
"Monochrome Shell" => Box::new(ShellTheme::new(theme, MONOCHROME)),
"Black & White Shell" => Box::new(ShellTheme::new(theme, BLACKWHITE)),
"Base16 Shell" => Box::new(ShellTheme::new(theme, BASE16)),
"Base16 Relax Shell" => Box::new(ShellTheme::new(theme, BASE16_RELAX)),
"Monekai Shell" => Box::new(ShellTheme::new(theme, MONEKAI)),
"Solarized Shell" => Box::new(ShellTheme::new(theme, SOLARIZED)),
"OxoCarbon Shell" => Box::new(ShellTheme::new(theme, OXOCARBON)),
"Rust Shell" => Box::new(ShellTheme::new(theme, RUST)),
"VSCode Shell" => Box::new(ShellTheme::new(theme, VSCODE_DARK)),
_ => return None,
};
Some(theme)
}
pub fn create_palette(name: &str) -> Option<Palette> {
match name {
"Imperial" => Some(IMPERIAL),
"Radium" => Some(RADIUM),
"Tundra" => Some(TUNDRA),
"Ocean" => Some(OCEAN),
"Monochrome" => Some(MONOCHROME),
"Black & White" => Some(BLACKWHITE),
"Base16" => Some(BASE16),
"Base16 Relax" => Some(BASE16_RELAX),
"Monekai" => Some(MONEKAI),
"Solarized" => Some(SOLARIZED),
"OxoCarbon" => Some(OXOCARBON),
"Rust" => Some(RUST),
"VSCode" => Some(VSCODE_DARK),
_ => None,
}
}
const PALETTES: &[&str] = &[
"Imperial",
"Radium",
"Tundra",
"Ocean",
"Monochrome",
"Black & White",
"Base16",
"Base16 Relax",
"Monekai",
"Solarized",
"OxoCarbon",
"Rust",
"VSCode",
];
const THEMES: &[&str] = &[
"Imperial Dark",
"Radium Dark",
"Tundra Dark",
"Ocean Dark",
"Monochrome Dark",
"Black & White Dark",
"Base16 Dark",
"Base16 Relax Dark",
"Monekai Dark",
"Solarized Dark",
"OxoCarbon Dark",
"Rust Dark",
"VSCode Dark",
"Imperial Shell",
"Radium Shell",
"Tundra Shell",
"Ocean Shell",
"Monochrome Shell",
"Black & White Shell",
"Base16 Shell",
"Base16 Relax Shell",
"Monekai Shell",
"Solarized Shell",
"OxoCarbon Shell",
"Rust Shell",
"VSCode Shell",
];
pub fn salsa_themes() -> Vec<&'static str> {
Vec::from(THEMES)
}
pub fn salsa_palettes() -> Vec<&'static str> {
Vec::from(PALETTES)
}