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