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