rat_theme4/themes/
dark.rs

1#![allow(unused_imports)]
2use crate::RatWidgetColor;
3use crate::palette::{Colors, Palette};
4use crate::theme::SalsaTheme;
5use crate::{StyleName, WidgetStyle};
6#[cfg(feature = "rat-widget")]
7use rat_widget;
8#[cfg(feature = "color-input")]
9use rat_widget_extra::color_input::ColorInputStyle;
10use ratatui_core::layout::Alignment;
11use ratatui_core::style::{Color, Style};
12use ratatui_core::symbols::border;
13use ratatui_widgets::block::Block;
14use ratatui_widgets::borders::Borders;
15use std::time::Duration;
16
17/// A dark theme.
18pub fn create_dark(p: Palette) -> SalsaTheme {
19    let mut th = SalsaTheme::new(p);
20
21    th.define_style(Style::LABEL_FG, th.p.fg_style_alias(Color::LABEL_FG));
22    th.define_style(Style::INPUT, th.p.style_alias(Color::INPUT_BG));
23    th.define_style(Style::FOCUS, th.p.style_alias(Color::FOCUS_BG));
24    th.define_style(Style::SELECT, th.p.style_alias(Color::SELECT_BG));
25    th.define_style(Style::DISABLED, th.p.style_alias(Color::DISABLED_BG));
26    th.define_style(Style::INVALID, th.p.style_alias(Color::INVALID_BG));
27    th.define_style(Style::HOVER, th.p.style_alias(Color::HOVER_BG));
28    th.define_style(
29        Style::TITLE,
30        th.p.fg_bg_style_alias(Color::TITLE_FG, Color::TITLE_BG),
31    );
32    th.define_style(
33        Style::HEADER,
34        th.p.fg_bg_style_alias(Color::HEADER_FG, Color::HEADER_BG),
35    );
36    th.define_style(
37        Style::FOOTER,
38        th.p.fg_bg_style_alias(Color::FOOTER_FG, Color::FOOTER_BG),
39    );
40    th.define_style(Style::SHADOWS, th.p.style_alias(Color::SHADOW_BG));
41    th.define_style(
42        Style::WEEK_HEADER_FG,
43        th.p.fg_style_alias(Color::WEEK_HEADER_FG),
44    );
45    th.define_style(
46        Style::MONTH_HEADER_FG,
47        th.p.fg_style_alias(Color::MONTH_HEADER_FG),
48    );
49    th.define_style(Style::SHADOWS, th.p.style_alias(Color::SHADOW_BG));
50    th.define_style(Style::INPUT_FOCUS, th.p.style_alias(Color::INPUT_FOCUS_BG));
51    th.define_style(Style::INPUT_SELECT, th.p.style_alias(Color::SELECT_BG));
52    th.define_style(Style::KEY_BINDING, th.p.style_alias(Color::KEY_BINDING_BG));
53
54    th.define_style(Style::BUTTON_BASE, th.p.style_alias(Color::BUTTON_BASE_BG));
55    th.define_style(Style::MENU_BASE, th.p.style_alias(Color::MENU_BASE_BG));
56    th.define_style(Style::STATUS_BASE, th.p.style_alias(Color::STATUS_BASE_BG));
57
58    th.define_style(
59        Style::CONTAINER_BASE,
60        th.p.style_alias(Color::CONTAINER_BASE_BG),
61    );
62    th.define_style(
63        Style::CONTAINER_BORDER_FG,
64        th.p.fg_bg_style_alias(Color::CONTAINER_BORDER_FG, Color::CONTAINER_BASE_BG),
65    );
66    th.define_style(
67        Style::CONTAINER_ARROW_FG,
68        th.p.fg_bg_style_alias(Color::CONTAINER_ARROW_FG, Color::CONTAINER_BASE_BG),
69    );
70
71    th.define_style(
72        Style::DOCUMENT_BASE,
73        th.p.style_alias(Color::DOCUMENT_BASE_BG),
74    );
75    th.define_style(
76        Style::DOCUMENT_BORDER_FG,
77        th.p.fg_bg_style_alias(Color::DOCUMENT_BORDER_FG, Color::DOCUMENT_BASE_BG),
78    );
79    th.define_style(
80        Style::DOCUMENT_ARROW_FG,
81        th.p.fg_bg_style_alias(Color::DOCUMENT_ARROW_FG, Color::DOCUMENT_BASE_BG),
82    );
83
84    th.define_style(Style::POPUP_BASE, th.p.style_alias(Color::POPUP_BASE_BG));
85    th.define_style(
86        Style::POPUP_BORDER_FG,
87        th.p.fg_bg_style_alias(Color::POPUP_BORDER_FG, Color::POPUP_BASE_BG),
88    );
89    th.define_style(
90        Style::POPUP_ARROW_FG,
91        th.p.fg_bg_style_alias(Color::POPUP_ARROW_FG, Color::POPUP_BASE_BG),
92    );
93
94    th.define_style(Style::DIALOG_BASE, th.p.style_alias(Color::DIALOG_BASE_BG));
95    th.define_style(
96        Style::DIALOG_BORDER_FG,
97        th.p.fg_bg_style_alias(Color::DIALOG_BORDER_FG, Color::DIALOG_BASE_BG),
98    );
99    th.define_style(
100        Style::DIALOG_ARROW_FG,
101        th.p.fg_bg_style_alias(Color::DIALOG_ARROW_FG, Color::DIALOG_BASE_BG),
102    );
103
104    #[cfg(feature = "rat-widget")]
105    th.define_fn(WidgetStyle::BUTTON, button);
106    #[cfg(feature = "rat-widget")]
107    th.define_fn(WidgetStyle::CALENDAR, month);
108    #[cfg(feature = "rat-widget")]
109    th.define_fn(WidgetStyle::CHECKBOX, checkbox);
110    #[cfg(feature = "rat-widget")]
111    th.define_fn(WidgetStyle::CHOICE, choice);
112    #[cfg(feature = "rat-widget")]
113    th.define_fn(WidgetStyle::CLIPPER, clipper);
114    #[cfg(feature = "rat-widget")]
115    th.define_fn(WidgetStyle::COMBOBOX, combobox);
116    #[cfg(feature = "color-input")]
117    th.define_fn(WidgetStyle::COLOR_INPUT, color_input);
118    #[cfg(feature = "rat-widget")]
119    th.define_fn(WidgetStyle::DIALOG_FRAME, dialog_frame);
120    #[cfg(feature = "rat-widget")]
121    th.define_fn(WidgetStyle::FILE_DIALOG, file_dialog);
122    #[cfg(feature = "rat-widget")]
123    th.define_fn(WidgetStyle::FORM, form);
124    #[cfg(feature = "rat-widget")]
125    th.define_fn(WidgetStyle::LINE_NR, line_nr);
126    #[cfg(feature = "rat-widget")]
127    th.define_fn(WidgetStyle::LIST, list);
128    #[cfg(feature = "rat-widget")]
129    th.define_fn(WidgetStyle::MENU, menu);
130    #[cfg(feature = "rat-widget")]
131    th.define_fn(WidgetStyle::MONTH, month);
132    #[cfg(feature = "rat-widget")]
133    th.define_fn(WidgetStyle::MSG_DIALOG, msg_dialog);
134    #[cfg(feature = "rat-widget")]
135    th.define_fn(WidgetStyle::PARAGRAPH, paragraph);
136    #[cfg(feature = "rat-widget")]
137    th.define_fn(WidgetStyle::RADIO, radio);
138    #[cfg(feature = "rat-widget")]
139    th.define_fn(WidgetStyle::SCROLL, scroll);
140    #[cfg(feature = "rat-widget")]
141    th.define_fn(WidgetStyle::SCROLL_DIALOG, dialog_scroll);
142    #[cfg(feature = "rat-widget")]
143    th.define_fn(WidgetStyle::SCROLL_POPUP, popup_scroll);
144    #[cfg(feature = "rat-widget")]
145    th.define_fn(WidgetStyle::SHADOW, shadow);
146    #[cfg(feature = "rat-widget")]
147    th.define_fn(WidgetStyle::SLIDER, slider);
148    #[cfg(feature = "rat-widget")]
149    th.define_fn(WidgetStyle::SPLIT, split);
150    #[cfg(feature = "rat-widget")]
151    th.define_fn(WidgetStyle::STATUSLINE, statusline);
152    #[cfg(feature = "rat-widget")]
153    th.define_fn(WidgetStyle::TABBED, tabbed);
154    #[cfg(feature = "rat-widget")]
155    th.define_fn(WidgetStyle::TABLE, table);
156    #[cfg(feature = "rat-widget")]
157    th.define_fn(WidgetStyle::TEXT, text);
158    #[cfg(feature = "rat-widget")]
159    th.define_fn(WidgetStyle::TEXTAREA, textarea);
160    #[cfg(feature = "rat-widget")]
161    th.define_fn(WidgetStyle::TEXTVIEW, textview);
162    #[cfg(feature = "rat-widget")]
163    th.define_fn(WidgetStyle::TOOLBAR, toolbar);
164    #[cfg(feature = "rat-widget")]
165    th.define_fn(WidgetStyle::VIEW, view);
166
167    th
168}
169
170#[cfg(feature = "rat-widget")]
171fn button(th: &SalsaTheme) -> rat_widget::button::ButtonStyle {
172    rat_widget::button::ButtonStyle {
173        style: th.style(Style::BUTTON_BASE),
174        focus: Some(th.style(Style::FOCUS)),
175        armed: Some(th.style(Style::SELECT)),
176        hover: Some(th.style(Style::HOVER)),
177        armed_delay: Some(Duration::from_millis(50)),
178        ..Default::default()
179    }
180}
181
182#[cfg(feature = "rat-widget")]
183fn checkbox(th: &SalsaTheme) -> rat_widget::checkbox::CheckboxStyle {
184    rat_widget::checkbox::CheckboxStyle {
185        style: th.style(Style::INPUT),
186        focus: Some(th.style(Style::INPUT_FOCUS)),
187        ..Default::default()
188    }
189}
190
191#[cfg(feature = "rat-widget")]
192fn combobox(th: &SalsaTheme) -> rat_widget::combobox::ComboboxStyle {
193    rat_widget::combobox::ComboboxStyle {
194        choice: th.style(WidgetStyle::CHOICE),
195        text: th.style(WidgetStyle::TEXT),
196        ..Default::default()
197    }
198}
199
200#[cfg(feature = "rat-widget")]
201fn choice(th: &SalsaTheme) -> rat_widget::choice::ChoiceStyle {
202    rat_widget::choice::ChoiceStyle {
203        style: th.style(Style::INPUT),
204        select: Some(th.style(Style::INPUT_SELECT)),
205        focus: Some(th.style(Style::INPUT_FOCUS)),
206        popup_style: Some(th.style(Style::POPUP_BASE)),
207        popup_border: Some(th.style(Style::POPUP_BORDER_FG)),
208        popup_scroll: Some(th.style(WidgetStyle::SCROLL_POPUP)),
209        popup_block: Some(
210            Block::bordered()
211                .borders(Borders::LEFT)
212                .border_style(th.style::<Style>(Style::POPUP_BORDER_FG)),
213        ),
214        ..Default::default()
215    }
216}
217
218#[cfg(feature = "rat-widget")]
219fn clipper(th: &SalsaTheme) -> rat_widget::clipper::ClipperStyle {
220    rat_widget::clipper::ClipperStyle {
221        style: th.style(Style::CONTAINER_BASE),
222        label_style: Some(th.style(Style::LABEL_FG)),
223        scroll: Some(th.style(WidgetStyle::SCROLL)),
224        ..Default::default()
225    }
226}
227
228#[cfg(feature = "rat-widget")]
229fn dialog_frame(th: &SalsaTheme) -> rat_widget::dialog_frame::DialogFrameStyle {
230    rat_widget::dialog_frame::DialogFrameStyle {
231        style: th.style(Style::DIALOG_BASE),
232        border_style: Some(th.style::<Style>(Style::DIALOG_BORDER_FG)),
233        button_style: Some(th.style(WidgetStyle::BUTTON)),
234        ..rat_widget::dialog_frame::DialogFrameStyle::default()
235    }
236}
237
238#[cfg(feature = "rat-widget")]
239fn file_dialog(th: &SalsaTheme) -> rat_widget::file_dialog::FileDialogStyle {
240    rat_widget::file_dialog::FileDialogStyle {
241        style: th.style(Style::DIALOG_BASE),
242        list: Some(th.style(WidgetStyle::LIST)),
243        roots: Some(rat_widget::list::ListStyle {
244            style: th.style(Style::DIALOG_BASE),
245            ..th.style(WidgetStyle::LIST)
246        }),
247        text: Some(th.style(WidgetStyle::TEXT)),
248        button: Some(th.style(WidgetStyle::BUTTON)),
249        block: Some(Block::bordered()),
250        ..Default::default()
251    }
252}
253
254#[cfg(feature = "rat-widget")]
255fn form(th: &SalsaTheme) -> rat_widget::form::FormStyle {
256    rat_widget::form::FormStyle {
257        style: th.style(Style::CONTAINER_BASE),
258        label_style: Some(th.style(Style::LABEL_FG)),
259        navigation: Some(th.style(Style::CONTAINER_ARROW_FG)),
260        navigation_hover: Some(th.style(Style::HOVER)),
261        block: Some(
262            Block::bordered()
263                .borders(Borders::TOP | Borders::BOTTOM)
264                .border_set(border::EMPTY)
265                .border_style(th.style::<Style>(Style::CONTAINER_BORDER_FG)),
266        ),
267        border_style: Some(th.style::<Style>(Style::CONTAINER_BORDER_FG)),
268        ..Default::default()
269    }
270}
271
272#[cfg(feature = "rat-widget")]
273fn line_nr(th: &SalsaTheme) -> rat_widget::line_number::LineNumberStyle {
274    rat_widget::line_number::LineNumberStyle {
275        style: th.style(Style::CONTAINER_BORDER_FG),
276        cursor: Some(th.style(Style::INPUT_SELECT)),
277        ..rat_widget::line_number::LineNumberStyle::default()
278    }
279}
280
281#[cfg(feature = "rat-widget")]
282fn list(th: &SalsaTheme) -> rat_widget::list::ListStyle {
283    rat_widget::list::ListStyle {
284        style: th.style(Style::CONTAINER_BASE),
285        select: Some(th.style(Style::SELECT)),
286        focus: Some(th.style(Style::FOCUS)),
287        scroll: Some(th.style(WidgetStyle::SCROLL)),
288        ..Default::default()
289    }
290}
291
292#[cfg(feature = "rat-widget")]
293fn menu(th: &SalsaTheme) -> rat_widget::menu::MenuStyle {
294    rat_widget::menu::MenuStyle {
295        style: th.style(Style::MENU_BASE),
296        title: Some(th.style(Style::TITLE)),
297        focus: Some(th.style(Style::FOCUS)),
298        right: Some(th.style(Style::KEY_BINDING)),
299        disabled: Some(th.style(Style::DISABLED)),
300        highlight: Some(Style::default().underlined()),
301        popup_block: Some(Block::bordered()),
302        popup: Default::default(),
303        popup_border: Some(th.style(Style::MENU_BASE)),
304        popup_style: Some(th.style(Style::MENU_BASE)),
305        popup_focus: Some(th.style(Style::FOCUS)),
306        popup_right: Some(th.style(Style::KEY_BINDING)),
307        popup_disabled: Some(th.style(Style::DISABLED)),
308        popup_highlight: Some(Style::default().underlined()),
309        ..Default::default()
310    }
311}
312
313#[cfg(feature = "rat-widget")]
314fn month(th: &SalsaTheme) -> rat_widget::calendar::CalendarStyle {
315    rat_widget::calendar::CalendarStyle {
316        style: th.style(Style::CONTAINER_BASE),
317        title: Some(th.style(Style::MONTH_HEADER_FG)),
318        weeknum: Some(th.style(Style::WEEK_HEADER_FG)),
319        weekday: Some(th.style(Style::WEEK_HEADER_FG)),
320        day: None,
321        select: Some(th.style(Style::SELECT)),
322        focus: Some(th.style(Style::FOCUS)),
323        ..rat_widget::calendar::CalendarStyle::default()
324    }
325}
326
327#[cfg(feature = "rat-widget")]
328fn msg_dialog(th: &SalsaTheme) -> rat_widget::msgdialog::MsgDialogStyle {
329    rat_widget::msgdialog::MsgDialogStyle {
330        style: th.style(Style::DIALOG_BASE),
331        button: Some(th.style(WidgetStyle::BUTTON)),
332        markdown_header_1: Some(th.style_style(Style::TITLE)),
333        markdown_header_n: Some(th.style_style(Style::HEADER)),
334        ..Default::default()
335    }
336}
337
338#[cfg(feature = "rat-widget")]
339fn paragraph(th: &SalsaTheme) -> rat_widget::paragraph::ParagraphStyle {
340    rat_widget::paragraph::ParagraphStyle {
341        style: th.style(Style::CONTAINER_BASE),
342        focus: Some(th.style(Style::FOCUS)),
343        scroll: Some(th.style(WidgetStyle::SCROLL)),
344        ..Default::default()
345    }
346}
347
348#[cfg(feature = "rat-widget")]
349fn radio(th: &SalsaTheme) -> rat_widget::radio::RadioStyle {
350    rat_widget::radio::RadioStyle {
351        layout: Some(rat_widget::radio::RadioLayout::Stacked),
352        style: th.style(Style::INPUT),
353        focus: Some(th.style(Style::INPUT_FOCUS)),
354        ..Default::default()
355    }
356}
357
358/// Scroll style
359#[cfg(feature = "rat-widget")]
360fn scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
361    rat_widget::scrolled::ScrollStyle {
362        thumb_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
363        track_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
364        min_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
365        begin_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
366        end_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
367        ..Default::default()
368    }
369}
370
371#[cfg(feature = "rat-widget")]
372fn popup_scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
373    rat_widget::scrolled::ScrollStyle {
374        thumb_style: Some(th.style(Style::POPUP_BORDER_FG)),
375        track_style: Some(th.style(Style::POPUP_BORDER_FG)),
376        min_style: Some(th.style(Style::POPUP_BORDER_FG)),
377        begin_style: Some(th.style(Style::POPUP_ARROW_FG)),
378        end_style: Some(th.style(Style::POPUP_ARROW_FG)),
379        horizontal: Some(rat_widget::scrolled::ScrollSymbols {
380            track: "",
381            thumb: "▄",
382            begin: "▗",
383            end: "▖",
384            min: " ",
385        }),
386        vertical: Some(rat_widget::scrolled::ScrollSymbols {
387            track: " ",
388            thumb: "█",
389            begin: "▄",
390            end: "▀",
391            min: " ",
392        }),
393        ..Default::default()
394    }
395}
396
397#[cfg(feature = "rat-widget")]
398fn dialog_scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
399    rat_widget::scrolled::ScrollStyle {
400        thumb_style: Some(th.style(Style::DIALOG_BORDER_FG)),
401        track_style: Some(th.style(Style::DIALOG_BORDER_FG)),
402        min_style: Some(th.style(Style::DIALOG_BORDER_FG)),
403        begin_style: Some(th.style(Style::POPUP_ARROW_FG)),
404        end_style: Some(th.style(Style::POPUP_ARROW_FG)),
405        horizontal: Some(rat_widget::scrolled::ScrollSymbols {
406            track: "",
407            thumb: "▄",
408            begin: "▗",
409            end: "▖",
410            min: " ",
411        }),
412        vertical: Some(rat_widget::scrolled::ScrollSymbols {
413            track: " ",
414            thumb: "█",
415            begin: "▄",
416            end: "▀",
417            min: " ",
418        }),
419        ..Default::default()
420    }
421}
422
423#[cfg(feature = "rat-widget")]
424fn shadow(th: &SalsaTheme) -> rat_widget::shadow::ShadowStyle {
425    rat_widget::shadow::ShadowStyle {
426        style: th.style(Style::SHADOWS),
427        dir: rat_widget::shadow::ShadowDirection::BottomRight,
428        ..rat_widget::shadow::ShadowStyle::default()
429    }
430}
431
432#[cfg(feature = "rat-widget")]
433fn slider(th: &SalsaTheme) -> rat_widget::slider::SliderStyle {
434    rat_widget::slider::SliderStyle {
435        style: th.style(Style::INPUT),
436        bounds: Some(th.style(Style::INPUT)),
437        knob: Some(th.style(Style::INPUT_SELECT)),
438        focus: Some(th.style(Style::INPUT_FOCUS)),
439        text_align: Some(Alignment::Center),
440        ..Default::default()
441    }
442}
443
444#[cfg(feature = "rat-widget")]
445fn split(th: &SalsaTheme) -> rat_widget::splitter::SplitStyle {
446    rat_widget::splitter::SplitStyle {
447        style: th.style(Style::CONTAINER_BORDER_FG),
448        arrow_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
449        drag_style: Some(th.style(Style::HOVER)),
450        ..Default::default()
451    }
452}
453
454#[cfg(feature = "rat-widget")]
455fn statusline(th: &SalsaTheme) -> rat_widget::statusline::StatusLineStyle {
456    rat_widget::statusline::StatusLineStyle {
457        styles: vec![
458            th.style(Style::STATUS_BASE),
459            th.p.style(Colors::Blue, 3),
460            th.p.style(Colors::Blue, 2),
461            th.p.style(Colors::Blue, 1),
462        ],
463        ..Default::default()
464    }
465}
466
467#[cfg(feature = "rat-widget")]
468fn tabbed(th: &SalsaTheme) -> rat_widget::tabbed::TabbedStyle {
469    rat_widget::tabbed::TabbedStyle {
470        style: th.style(Style::CONTAINER_BASE),
471        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
472        tab: Some(th.style(Style::INPUT)),
473        hover: Some(th.style(Style::HOVER)),
474        select: Some(th.style(Style::SELECT)),
475        focus: Some(th.style(Style::FOCUS)),
476        ..Default::default()
477    }
478}
479
480#[cfg(feature = "rat-widget")]
481fn table(th: &SalsaTheme) -> rat_widget::table::TableStyle {
482    rat_widget::table::TableStyle {
483        style: th.style(Style::CONTAINER_BASE),
484        select_row: Some(th.style(Style::SELECT)),
485        show_row_focus: true,
486        focus_style: Some(th.style(Style::FOCUS)),
487        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
488        scroll: Some(th.style(WidgetStyle::SCROLL)),
489        header: Some(th.style(Style::HEADER)),
490        footer: Some(th.style(Style::FOOTER)),
491        show_empty: true,
492        ..Default::default()
493    }
494}
495
496#[cfg(feature = "color-input")]
497fn color_input(th: &SalsaTheme) -> ColorInputStyle {
498    ColorInputStyle {
499        text: rat_widget::text::TextStyle {
500            style: th.style(Style::INPUT),
501            focus: Some(th.style(Style::INPUT_FOCUS)),
502            select: Some(th.style(Style::INPUT_SELECT)),
503            invalid: Some(th.style(Style::INVALID)),
504            ..rat_widget::text::TextStyle::default()
505        },
506        ..Default::default()
507    }
508}
509
510#[cfg(feature = "rat-widget")]
511fn text(th: &SalsaTheme) -> rat_widget::text::TextStyle {
512    rat_widget::text::TextStyle {
513        style: th.style(Style::INPUT),
514        focus: Some(th.style(Style::INPUT_FOCUS)),
515        select: Some(th.style(Style::INPUT_SELECT)),
516        invalid: Some(th.style(Style::INVALID)),
517        ..rat_widget::text::TextStyle::default()
518    }
519}
520
521#[cfg(feature = "rat-widget")]
522fn textarea(th: &SalsaTheme) -> rat_widget::text::TextStyle {
523    rat_widget::text::TextStyle {
524        style: th.style(Style::INPUT),
525        focus: Some(th.style(Style::INPUT)),
526        select: Some(th.style(Style::INPUT_SELECT)),
527        scroll: Some(th.style(WidgetStyle::SCROLL)),
528        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
529        ..rat_widget::text::TextStyle::default()
530    }
531}
532
533#[cfg(feature = "rat-widget")]
534fn textview(th: &SalsaTheme) -> rat_widget::text::TextStyle {
535    rat_widget::text::TextStyle {
536        style: th.style(Style::CONTAINER_BASE),
537        focus: Some(th.style(Style::CONTAINER_BASE)),
538        select: Some(th.style(Style::INPUT_SELECT)),
539        scroll: Some(th.style(WidgetStyle::SCROLL)),
540        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
541        ..rat_widget::text::TextStyle::default()
542    }
543}
544
545#[cfg(feature = "rat-widget")]
546fn toolbar(th: &SalsaTheme) -> rat_widget::toolbar::ToolbarStyle {
547    rat_widget::toolbar::ToolbarStyle {
548        style: th.style_style(Style::MENU_BASE),
549        key_style: Some(th.style_style(Style::KEY_BINDING)),
550        button: Some(rat_widget::button::ButtonStyle {
551            style: th.style_style(Style::BUTTON_BASE),
552            armed: Some(th.style_style(Style::SELECT)),
553            hover: Some(th.style_style(Style::HOVER)),
554            ..Default::default()
555        }),
556        checkbox: Some(rat_widget::checkbox::CheckboxStyle {
557            style: th.style_style(Style::BUTTON_BASE),
558            behave_check: Some(rat_widget::checkbox::CheckboxCheck::SingleClick),
559            ..Default::default()
560        }),
561        choice: Some(rat_widget::choice::ChoiceStyle {
562            style: th.style_style(Style::BUTTON_BASE),
563            button: Some(th.style_style(Style::BUTTON_BASE)),
564            select: Some(th.style_style(Style::SELECT)),
565            focus: Some(th.style_style(Style::BUTTON_BASE)),
566            popup: rat_widget::popup::PopupStyle {
567                placement: Some(rat_widget::popup::Placement::BelowOrAbove),
568                ..Default::default()
569            },
570            popup_style: Some(th.style_style(Style::POPUP_BASE)),
571            popup_border: Some(th.style_style(Style::POPUP_BORDER_FG)),
572            behave_focus: Some(rat_widget::choice::ChoiceFocus::OpenOnFocusGained),
573            behave_select: Some(rat_widget::choice::ChoiceSelect::MouseClick),
574            behave_close: Some(rat_widget::choice::ChoiceClose::SingleClick),
575            ..Default::default()
576        }),
577        collapsed: Some(rat_widget::choice::ChoiceStyle {
578            style: th.style_style(Style::BUTTON_BASE),
579            button: Some(th.style_style(Style::BUTTON_BASE)),
580            select: Some(th.style_style(Style::SELECT)),
581            focus: Some(th.style_style(Style::BUTTON_BASE)),
582            popup: rat_widget::popup::PopupStyle {
583                placement: Some(rat_widget::popup::Placement::BelowOrAbove),
584                ..Default::default()
585            },
586            popup_style: Some(th.style_style(Style::POPUP_BASE)),
587            popup_border: Some(th.style_style(Style::POPUP_BORDER_FG)),
588            behave_focus: Some(rat_widget::choice::ChoiceFocus::OpenOnFocusGained),
589            behave_select: Some(rat_widget::choice::ChoiceSelect::MouseClick),
590            behave_close: Some(rat_widget::choice::ChoiceClose::SingleClick),
591            ..Default::default()
592        }),
593        ..Default::default()
594    }
595}
596
597#[cfg(feature = "rat-widget")]
598fn view(th: &SalsaTheme) -> rat_widget::view::ViewStyle {
599    rat_widget::view::ViewStyle {
600        scroll: Some(th.style(WidgetStyle::SCROLL)),
601        ..Default::default()
602    }
603}