1use crate::palettes::{
2 BASE16, BASE16_RELAX, BLACKWHITE, IMPERIAL, MONEKAI, MONOCHROME, OCEAN, OXOCARBON, RADIUM,
3 RUST, SOLARIZED, TUNDRA, VSCODE_DARK,
4};
5use rat_widget::button::ButtonStyle;
6use rat_widget::calendar::CalendarStyle;
7use rat_widget::checkbox::CheckboxStyle;
8use rat_widget::choice::ChoiceStyle;
9use rat_widget::clipper::ClipperStyle;
10use rat_widget::file_dialog::FileDialogStyle;
11use rat_widget::line_number::LineNumberStyle;
12use rat_widget::list::ListStyle;
13use rat_widget::menu::MenuStyle;
14use rat_widget::msgdialog::MsgDialogStyle;
15use rat_widget::paragraph::ParagraphStyle;
16use rat_widget::radio::RadioStyle;
17use rat_widget::scrolled::ScrollStyle;
18use rat_widget::shadow::ShadowStyle;
19use rat_widget::slider::SliderStyle;
20use rat_widget::splitter::SplitStyle;
21use rat_widget::statusline::StatusLineStyle;
22use rat_widget::tabbed::TabbedStyle;
23use rat_widget::table::TableStyle;
24use rat_widget::text::TextStyle;
25use rat_widget::view::ViewStyle;
26use ratatui_core::style::Style;
27
28mod dark_theme;
29mod palette;
30pub mod palettes;
31mod shell_theme;
32
33pub use dark_theme::*;
34pub use palette::*;
35use rat_widget::form::FormStyle;
36pub use shell_theme::*;
37
38pub trait SalsaTheme {
40 fn name(&self) -> &str;
42
43 fn palette(&self) -> &Palette;
45
46 fn white(&self, n: usize) -> Style;
49
50 fn black(&self, n: usize) -> Style;
53
54 fn gray(&self, n: usize) -> Style;
57
58 fn red(&self, n: usize) -> Style;
61
62 fn orange(&self, n: usize) -> Style;
65
66 fn yellow(&self, n: usize) -> Style;
69
70 fn limegreen(&self, n: usize) -> Style;
73
74 fn green(&self, n: usize) -> Style;
77
78 fn bluegreen(&self, n: usize) -> Style;
81
82 fn cyan(&self, n: usize) -> Style;
85
86 fn blue(&self, n: usize) -> Style;
89
90 fn deepblue(&self, n: usize) -> Style;
93
94 fn purple(&self, n: usize) -> Style;
97
98 fn magenta(&self, n: usize) -> Style;
101
102 fn redpink(&self, n: usize) -> Style;
105
106 fn primary(&self, n: usize) -> Style;
109
110 fn secondary(&self, n: usize) -> Style;
113
114 fn focus(&self) -> Style;
116 fn select(&self) -> Style;
118
119 fn text_input(&self) -> Style;
121 fn text_focus(&self) -> Style;
123 fn text_select(&self) -> Style;
125
126 fn scroll_style(&self) -> ScrollStyle;
128
129 fn container_base(&self) -> Style;
131 fn container_border(&self) -> Style;
133 fn container_arrow(&self) -> Style;
135
136 fn popup_base(&self) -> Style;
138 fn popup_border(&self) -> Style;
140 fn popup_arrow(&self) -> Style;
142 fn popup_scroll_style(&self) -> ScrollStyle;
144
145 fn dialog_base(&self) -> Style;
147 fn dialog_border(&self) -> Style;
149 fn dialog_arrow(&self) -> Style;
151 fn dialog_scroll_style(&self) -> ScrollStyle;
153
154 fn status_base(&self) -> Style;
156
157 fn button_base(&self) -> Style;
159 fn button_armed(&self) -> Style;
161
162 fn label_style(&self) -> Style;
164
165 fn text_style(&self) -> TextStyle;
167
168 fn textarea_style(&self) -> TextStyle;
170
171 fn choice_style(&self) -> ChoiceStyle;
173
174 fn radio_style(&self) -> RadioStyle;
176
177 fn checkbox_style(&self) -> CheckboxStyle;
179
180 fn slider_style(&self) -> SliderStyle;
182
183 fn month_style(&self) -> CalendarStyle;
185
186 fn line_nr_style(&self) -> LineNumberStyle;
188
189 fn button_style(&self) -> ButtonStyle;
191
192 fn table_style(&self) -> TableStyle;
194
195 fn list_style(&self) -> ListStyle;
197
198 fn textview_style(&self) -> TextStyle;
200
201 fn paragraph_style(&self) -> ParagraphStyle;
203
204 fn shadow_style(&self) -> ShadowStyle;
206
207 fn menu_style(&self) -> MenuStyle;
209
210 fn split_style(&self) -> SplitStyle;
212
213 fn view_style(&self) -> ViewStyle;
215
216 fn tabbed_style(&self) -> TabbedStyle;
218
219 fn statusline_style(&self) -> Vec<Style>;
221
222 fn statusline_style_ext(&self) -> StatusLineStyle;
224
225 fn file_dialog_style(&self) -> FileDialogStyle;
227
228 fn msg_dialog_style(&self) -> MsgDialogStyle;
230
231 fn form_style(&self) -> FormStyle;
233
234 fn clipper_style(&self) -> ClipperStyle;
236}
237
238pub fn create_theme(theme: &str) -> Option<Box<dyn SalsaTheme>> {
240 let theme: Box<dyn SalsaTheme> = match theme {
241 "Imperial Dark" => Box::new(DarkTheme::new(theme, IMPERIAL)),
242 "Radium Dark" => Box::new(DarkTheme::new(theme, RADIUM)),
243 "Tundra Dark" => Box::new(DarkTheme::new(theme, TUNDRA)),
244 "Ocean Dark" => Box::new(DarkTheme::new(theme, OCEAN)),
245 "Monochrome Dark" => Box::new(DarkTheme::new(theme, MONOCHROME)),
246 "Black & White Dark" => Box::new(DarkTheme::new(theme, BLACKWHITE)),
247 "Base16 Dark" => Box::new(DarkTheme::new(theme, BASE16)),
248 "Base16 Relax Dark" => Box::new(DarkTheme::new(theme, BASE16_RELAX)),
249 "Monekai Dark" => Box::new(DarkTheme::new(theme, MONEKAI)),
250 "Solarized Dark" => Box::new(DarkTheme::new(theme, SOLARIZED)),
251 "OxoCarbon Dark" => Box::new(DarkTheme::new(theme, OXOCARBON)),
252 "Rust Dark" => Box::new(DarkTheme::new(theme, RUST)),
253 "VSCode Dark" => Box::new(DarkTheme::new(theme, VSCODE_DARK)),
254 "Imperial Shell" => Box::new(ShellTheme::new(theme, IMPERIAL)),
256 "Radium Shell" => Box::new(ShellTheme::new(theme, RADIUM)),
257 "Tundra Shell" => Box::new(ShellTheme::new(theme, TUNDRA)),
258 "Ocean Shell" => Box::new(ShellTheme::new(theme, OCEAN)),
259 "Monochrome Shell" => Box::new(ShellTheme::new(theme, MONOCHROME)),
260 "Black & White Shell" => Box::new(ShellTheme::new(theme, BLACKWHITE)),
261 "Base16 Shell" => Box::new(ShellTheme::new(theme, BASE16)),
262 "Base16 Relax Shell" => Box::new(ShellTheme::new(theme, BASE16_RELAX)),
263 "Monekai Shell" => Box::new(ShellTheme::new(theme, MONEKAI)),
264 "Solarized Shell" => Box::new(ShellTheme::new(theme, SOLARIZED)),
265 "OxoCarbon Shell" => Box::new(ShellTheme::new(theme, OXOCARBON)),
266 "Rust Shell" => Box::new(ShellTheme::new(theme, RUST)),
267 "VSCode Shell" => Box::new(ShellTheme::new(theme, VSCODE_DARK)),
268
269 _ => return None,
270 };
271
272 Some(theme)
273}
274
275pub fn create_palette(name: &str) -> Option<Palette> {
277 match name {
278 "Imperial" => Some(IMPERIAL),
279 "Radium" => Some(RADIUM),
280 "Tundra" => Some(TUNDRA),
281 "Ocean" => Some(OCEAN),
282 "Monochrome" => Some(MONOCHROME),
283 "Black & White" => Some(BLACKWHITE),
284 "Base16" => Some(BASE16),
285 "Base16 Relax" => Some(BASE16_RELAX),
286 "Monekai" => Some(MONEKAI),
287 "Solarized" => Some(SOLARIZED),
288 "OxoCarbon" => Some(OXOCARBON),
289 "Rust" => Some(RUST),
290 "VSCode" => Some(VSCODE_DARK),
291 _ => None,
292 }
293}
294
295const PALETTES: &[&str] = &[
296 "Imperial",
297 "Radium",
298 "Tundra",
299 "Ocean",
300 "Monochrome",
301 "Black & White",
302 "Base16",
303 "Base16 Relax",
304 "Monekai",
305 "Solarized",
306 "OxoCarbon",
307 "Rust",
308 "VSCode",
309];
310
311const THEMES: &[&str] = &[
312 "Imperial Dark",
313 "Radium Dark",
314 "Tundra Dark",
315 "Ocean Dark",
316 "Monochrome Dark",
317 "Black & White Dark",
318 "Base16 Dark",
319 "Base16 Relax Dark",
320 "Monekai Dark",
321 "Solarized Dark",
322 "OxoCarbon Dark",
323 "Rust Dark",
324 "VSCode Dark",
325 "Imperial Shell",
327 "Radium Shell",
328 "Tundra Shell",
329 "Ocean Shell",
330 "Monochrome Shell",
331 "Black & White Shell",
332 "Base16 Shell",
333 "Base16 Relax Shell",
334 "Monekai Shell",
335 "Solarized Shell",
336 "OxoCarbon Shell",
337 "Rust Shell",
338 "VSCode Shell",
339];
340
341pub fn salsa_themes() -> Vec<&'static str> {
342 Vec::from(THEMES)
343}
344
345pub fn salsa_palettes() -> Vec<&'static str> {
347 Vec::from(PALETTES)
348}