rat-theme4 4.5.3

dark theme and color-schemes
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
#![allow(unused_imports)]
use crate::RatWidgetColor;
use crate::palette::{Colors, Palette};
use crate::theme::SalsaTheme;
use crate::{StyleName, WidgetStyle};
#[cfg(feature = "rat-widget")]
use rat_widget;
#[cfg(feature = "color-input")]
use rat_widget_extra::color_input::ColorInputStyle;
use ratatui_core::layout::Alignment;
use ratatui_core::style::{Color, Style};
use ratatui_core::symbols::border;
use ratatui_widgets::block::Block;
use ratatui_widgets::borders::Borders;
use std::time::Duration;

/// A dark theme.
pub fn create_dark(p: Palette) -> SalsaTheme {
    let mut th = SalsaTheme::new(p);

    th.define_style(Style::LABEL_FG, th.p.fg_style_alias(Color::LABEL_FG));
    th.define_style(Style::INPUT, th.p.style_alias(Color::INPUT_BG));
    th.define_style(Style::FOCUS, th.p.style_alias(Color::FOCUS_BG));
    th.define_style(Style::SELECT, th.p.style_alias(Color::SELECT_BG));
    th.define_style(Style::DISABLED, th.p.style_alias(Color::DISABLED_BG));
    th.define_style(Style::INVALID, th.p.style_alias(Color::INVALID_BG));
    th.define_style(Style::HOVER, th.p.style_alias(Color::HOVER_BG));
    th.define_style(
        Style::TITLE,
        th.p.fg_bg_style_alias(Color::TITLE_FG, Color::TITLE_BG),
    );
    th.define_style(
        Style::HEADER,
        th.p.fg_bg_style_alias(Color::HEADER_FG, Color::HEADER_BG),
    );
    th.define_style(
        Style::FOOTER,
        th.p.fg_bg_style_alias(Color::FOOTER_FG, Color::FOOTER_BG),
    );
    th.define_style(Style::SHADOWS, th.p.style_alias(Color::SHADOW_BG));
    th.define_style(
        Style::WEEK_HEADER_FG,
        th.p.fg_style_alias(Color::WEEK_HEADER_FG),
    );
    th.define_style(
        Style::MONTH_HEADER_FG,
        th.p.fg_style_alias(Color::MONTH_HEADER_FG),
    );
    th.define_style(Style::SHADOWS, th.p.style_alias(Color::SHADOW_BG));
    th.define_style(Style::INPUT_FOCUS, th.p.style_alias(Color::INPUT_FOCUS_BG));
    th.define_style(Style::INPUT_SELECT, th.p.style_alias(Color::SELECT_BG));
    th.define_style(Style::KEY_BINDING, th.p.style_alias(Color::KEY_BINDING_BG));

    th.define_style(Style::BUTTON_BASE, th.p.style_alias(Color::BUTTON_BASE_BG));
    th.define_style(Style::MENU_BASE, th.p.style_alias(Color::MENU_BASE_BG));
    th.define_style(Style::STATUS_BASE, th.p.style_alias(Color::STATUS_BASE_BG));

    th.define_style(
        Style::CONTAINER_BASE,
        th.p.style_alias(Color::CONTAINER_BASE_BG),
    );
    th.define_style(
        Style::CONTAINER_BORDER_FG,
        th.p.fg_bg_style_alias(Color::CONTAINER_BORDER_FG, Color::CONTAINER_BASE_BG),
    );
    th.define_style(
        Style::CONTAINER_ARROW_FG,
        th.p.fg_bg_style_alias(Color::CONTAINER_ARROW_FG, Color::CONTAINER_BASE_BG),
    );

    th.define_style(
        Style::DOCUMENT_BASE,
        th.p.style_alias(Color::DOCUMENT_BASE_BG),
    );
    th.define_style(
        Style::DOCUMENT_BORDER_FG,
        th.p.fg_bg_style_alias(Color::DOCUMENT_BORDER_FG, Color::DOCUMENT_BASE_BG),
    );
    th.define_style(
        Style::DOCUMENT_ARROW_FG,
        th.p.fg_bg_style_alias(Color::DOCUMENT_ARROW_FG, Color::DOCUMENT_BASE_BG),
    );

    th.define_style(Style::POPUP_BASE, th.p.style_alias(Color::POPUP_BASE_BG));
    th.define_style(
        Style::POPUP_BORDER_FG,
        th.p.fg_bg_style_alias(Color::POPUP_BORDER_FG, Color::POPUP_BASE_BG),
    );
    th.define_style(
        Style::POPUP_ARROW_FG,
        th.p.fg_bg_style_alias(Color::POPUP_ARROW_FG, Color::POPUP_BASE_BG),
    );

    th.define_style(Style::DIALOG_BASE, th.p.style_alias(Color::DIALOG_BASE_BG));
    th.define_style(
        Style::DIALOG_BORDER_FG,
        th.p.fg_bg_style_alias(Color::DIALOG_BORDER_FG, Color::DIALOG_BASE_BG),
    );
    th.define_style(
        Style::DIALOG_ARROW_FG,
        th.p.fg_bg_style_alias(Color::DIALOG_ARROW_FG, Color::DIALOG_BASE_BG),
    );

    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::BUTTON, button);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::CALENDAR, month);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::CHECKBOX, checkbox);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::CHOICE, choice);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::CLIPPER, clipper);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::COMBOBOX, combobox);
    #[cfg(feature = "color-input")]
    th.define_fn(WidgetStyle::COLOR_INPUT, color_input);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::DIALOG_FRAME, dialog_frame);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::FILE_DIALOG, file_dialog);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::FORM, form);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::LINE_NR, line_nr);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::LIST, list);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::MENU, menu);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::MONTH, month);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::MSG_DIALOG, msg_dialog);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::PARAGRAPH, paragraph);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::RADIO, radio);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::SCROLL, scroll);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::SCROLL_DIALOG, dialog_scroll);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::SCROLL_POPUP, popup_scroll);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::SHADOW, shadow);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::SLIDER, slider);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::SPLIT, split);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::STATUSLINE, statusline);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::TABBED, tabbed);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::TABLE, table);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::TEXT, text);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::TEXTAREA, textarea);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::TEXTVIEW, textview);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::TOOLBAR, toolbar);
    #[cfg(feature = "rat-widget")]
    th.define_fn(WidgetStyle::VIEW, view);

    th
}

#[cfg(feature = "rat-widget")]
fn button(th: &SalsaTheme) -> rat_widget::button::ButtonStyle {
    rat_widget::button::ButtonStyle {
        style: th.style(Style::BUTTON_BASE),
        focus: Some(th.style(Style::FOCUS)),
        armed: Some(th.style(Style::SELECT)),
        hover: Some(th.style(Style::HOVER)),
        armed_delay: Some(Duration::from_millis(50)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn checkbox(th: &SalsaTheme) -> rat_widget::checkbox::CheckboxStyle {
    rat_widget::checkbox::CheckboxStyle {
        style: th.style(Style::INPUT),
        focus: Some(th.style(Style::INPUT_FOCUS)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn combobox(th: &SalsaTheme) -> rat_widget::combobox::ComboboxStyle {
    rat_widget::combobox::ComboboxStyle {
        choice: th.style(WidgetStyle::CHOICE),
        text: th.style(WidgetStyle::TEXT),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn choice(th: &SalsaTheme) -> rat_widget::choice::ChoiceStyle {
    rat_widget::choice::ChoiceStyle {
        style: th.style(Style::INPUT),
        select: Some(th.style(Style::INPUT_SELECT)),
        focus: Some(th.style(Style::INPUT_FOCUS)),
        popup_style: Some(th.style(Style::POPUP_BASE)),
        popup_border: Some(th.style(Style::POPUP_BORDER_FG)),
        popup_scroll: Some(th.style(WidgetStyle::SCROLL_POPUP)),
        popup_block: Some(
            Block::bordered()
                .borders(Borders::LEFT)
                .border_style(th.style::<Style>(Style::POPUP_BORDER_FG)),
        ),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn clipper(th: &SalsaTheme) -> rat_widget::clipper::ClipperStyle {
    rat_widget::clipper::ClipperStyle {
        style: th.style(Style::CONTAINER_BASE),
        label_style: Some(th.style(Style::LABEL_FG)),
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn dialog_frame(th: &SalsaTheme) -> rat_widget::dialog_frame::DialogFrameStyle {
    rat_widget::dialog_frame::DialogFrameStyle {
        style: th.style(Style::DIALOG_BASE),
        border_style: Some(th.style::<Style>(Style::DIALOG_BORDER_FG)),
        button_style: Some(th.style(WidgetStyle::BUTTON)),
        ..rat_widget::dialog_frame::DialogFrameStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn file_dialog(th: &SalsaTheme) -> rat_widget::file_dialog::FileDialogStyle {
    rat_widget::file_dialog::FileDialogStyle {
        style: th.style(Style::DIALOG_BASE),
        list: Some(th.style(WidgetStyle::LIST)),
        roots: Some(rat_widget::list::ListStyle {
            style: th.style(Style::DIALOG_BASE),
            ..th.style(WidgetStyle::LIST)
        }),
        text: Some(th.style(WidgetStyle::TEXT)),
        button: Some(th.style(WidgetStyle::BUTTON)),
        block: Some(Block::bordered()),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn form(th: &SalsaTheme) -> rat_widget::form::FormStyle {
    rat_widget::form::FormStyle {
        style: th.style(Style::CONTAINER_BASE),
        label_style: Some(th.style(Style::LABEL_FG)),
        navigation: Some(th.style(Style::CONTAINER_ARROW_FG)),
        navigation_hover: Some(th.style(Style::HOVER)),
        block: Some(
            Block::bordered()
                .borders(Borders::TOP | Borders::BOTTOM)
                .border_set(border::EMPTY)
                .border_style(th.style::<Style>(Style::CONTAINER_BORDER_FG)),
        ),
        border_style: Some(th.style::<Style>(Style::CONTAINER_BORDER_FG)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn line_nr(th: &SalsaTheme) -> rat_widget::line_number::LineNumberStyle {
    rat_widget::line_number::LineNumberStyle {
        style: th.style(Style::CONTAINER_BORDER_FG),
        cursor: Some(th.style(Style::INPUT_SELECT)),
        ..rat_widget::line_number::LineNumberStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn list(th: &SalsaTheme) -> rat_widget::list::ListStyle {
    rat_widget::list::ListStyle {
        style: th.style(Style::CONTAINER_BASE),
        select: Some(th.style(Style::SELECT)),
        focus: Some(th.style(Style::FOCUS)),
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn menu(th: &SalsaTheme) -> rat_widget::menu::MenuStyle {
    rat_widget::menu::MenuStyle {
        style: th.style(Style::MENU_BASE),
        title: Some(th.style(Style::TITLE)),
        focus: Some(th.style(Style::FOCUS)),
        right: Some(th.style(Style::KEY_BINDING)),
        disabled: Some(th.style(Style::DISABLED)),
        highlight: Some(Style::default().underlined()),
        popup_block: Some(Block::bordered()),
        popup: Default::default(),
        popup_border: Some(th.style(Style::MENU_BASE)),
        popup_style: Some(th.style(Style::MENU_BASE)),
        popup_focus: Some(th.style(Style::FOCUS)),
        popup_right: Some(th.style(Style::KEY_BINDING)),
        popup_disabled: Some(th.style(Style::DISABLED)),
        popup_highlight: Some(Style::default().underlined()),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn month(th: &SalsaTheme) -> rat_widget::calendar::CalendarStyle {
    rat_widget::calendar::CalendarStyle {
        style: th.style(Style::CONTAINER_BASE),
        title: Some(th.style(Style::MONTH_HEADER_FG)),
        weeknum: Some(th.style(Style::WEEK_HEADER_FG)),
        weekday: Some(th.style(Style::WEEK_HEADER_FG)),
        day: None,
        select: Some(th.style(Style::SELECT)),
        focus: Some(th.style(Style::FOCUS)),
        ..rat_widget::calendar::CalendarStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn msg_dialog(th: &SalsaTheme) -> rat_widget::msgdialog::MsgDialogStyle {
    rat_widget::msgdialog::MsgDialogStyle {
        style: th.style(Style::DIALOG_BASE),
        button: Some(th.style(WidgetStyle::BUTTON)),
        markdown_header_1: Some(th.style_style(Style::TITLE)),
        markdown_header_n: Some(th.style_style(Style::HEADER)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn paragraph(th: &SalsaTheme) -> rat_widget::paragraph::ParagraphStyle {
    rat_widget::paragraph::ParagraphStyle {
        style: th.style(Style::CONTAINER_BASE),
        focus: Some(th.style(Style::FOCUS)),
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn radio(th: &SalsaTheme) -> rat_widget::radio::RadioStyle {
    rat_widget::radio::RadioStyle {
        layout: Some(rat_widget::radio::RadioLayout::Stacked),
        style: th.style(Style::INPUT),
        focus: Some(th.style(Style::INPUT_FOCUS)),
        ..Default::default()
    }
}

/// Scroll style
#[cfg(feature = "rat-widget")]
fn scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
    rat_widget::scrolled::ScrollStyle {
        thumb_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        track_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        min_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        begin_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
        end_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
        horizontal: Some(rat_widget::scrolled::ScrollSymbols {
            track: "",
            thumb: "â–„",
            begin: "â–—",
            end: "â––",
            min: " ",
        }),
        vertical: Some(rat_widget::scrolled::ScrollSymbols {
            track: "",
            thumb: "â–ˆ",
            begin: "â–„",
            end: "â–€",
            min: " ",
        }),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn popup_scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
    rat_widget::scrolled::ScrollStyle {
        thumb_style: Some(th.style(Style::POPUP_BORDER_FG)),
        track_style: Some(th.style(Style::POPUP_BORDER_FG)),
        min_style: Some(th.style(Style::POPUP_BORDER_FG)),
        begin_style: Some(th.style(Style::POPUP_ARROW_FG)),
        end_style: Some(th.style(Style::POPUP_ARROW_FG)),
        horizontal: Some(rat_widget::scrolled::ScrollSymbols {
            track: "",
            thumb: "â–„",
            begin: "â–—",
            end: "â––",
            min: " ",
        }),
        vertical: Some(rat_widget::scrolled::ScrollSymbols {
            track: "",
            thumb: "â–ˆ",
            begin: "â–„",
            end: "â–€",
            min: " ",
        }),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn dialog_scroll(th: &SalsaTheme) -> rat_widget::scrolled::ScrollStyle {
    rat_widget::scrolled::ScrollStyle {
        thumb_style: Some(th.style(Style::DIALOG_BORDER_FG)),
        track_style: Some(th.style(Style::DIALOG_BORDER_FG)),
        min_style: Some(th.style(Style::DIALOG_BORDER_FG)),
        begin_style: Some(th.style(Style::POPUP_ARROW_FG)),
        end_style: Some(th.style(Style::POPUP_ARROW_FG)),
        horizontal: Some(rat_widget::scrolled::ScrollSymbols {
            track: "",
            thumb: "â–„",
            begin: "â–—",
            end: "â––",
            min: " ",
        }),
        vertical: Some(rat_widget::scrolled::ScrollSymbols {
            track: "",
            thumb: "â–ˆ",
            begin: "â–„",
            end: "â–€",
            min: " ",
        }),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn shadow(th: &SalsaTheme) -> rat_widget::shadow::ShadowStyle {
    rat_widget::shadow::ShadowStyle {
        style: th.style(Style::SHADOWS),
        dir: rat_widget::shadow::ShadowDirection::BottomRight,
        ..rat_widget::shadow::ShadowStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn slider(th: &SalsaTheme) -> rat_widget::slider::SliderStyle {
    rat_widget::slider::SliderStyle {
        style: th.style(Style::INPUT),
        bounds: Some(th.style(Style::INPUT)),
        knob: Some(th.style(Style::INPUT_SELECT)),
        focus: Some(th.style(Style::INPUT_FOCUS)),
        text_align: Some(Alignment::Center),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn split(th: &SalsaTheme) -> rat_widget::splitter::SplitStyle {
    rat_widget::splitter::SplitStyle {
        style: th.style(Style::CONTAINER_BORDER_FG),
        arrow_style: Some(th.style(Style::CONTAINER_ARROW_FG)),
        drag_style: Some(th.style(Style::HOVER)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn statusline(th: &SalsaTheme) -> rat_widget::statusline::StatusLineStyle {
    rat_widget::statusline::StatusLineStyle {
        styles: vec![
            th.style(Style::STATUS_BASE),
            th.p.style(Colors::Blue, 3),
            th.p.style(Colors::Blue, 2),
            th.p.style(Colors::Blue, 1),
        ],
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn tabbed(th: &SalsaTheme) -> rat_widget::tabbed::TabbedStyle {
    rat_widget::tabbed::TabbedStyle {
        style: th.style(Style::CONTAINER_BASE),
        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        tab: Some(th.style(Style::INPUT)),
        hover: Some(th.style(Style::HOVER)),
        select: Some(th.style(Style::SELECT)),
        focus: Some(th.style(Style::FOCUS)),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn table(th: &SalsaTheme) -> rat_widget::table::TableStyle {
    rat_widget::table::TableStyle {
        style: th.style(Style::CONTAINER_BASE),
        select_row: Some(th.style(Style::SELECT)),
        show_row_focus: true,
        focus_style: Some(th.style(Style::FOCUS)),
        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        header: Some(th.style(Style::HEADER)),
        footer: Some(th.style(Style::FOOTER)),
        show_empty: true,
        ..Default::default()
    }
}

#[cfg(feature = "color-input")]
fn color_input(th: &SalsaTheme) -> ColorInputStyle {
    ColorInputStyle {
        text: rat_widget::text::TextStyle {
            style: th.style(Style::INPUT),
            focus: Some(th.style(Style::INPUT_FOCUS)),
            select: Some(th.style(Style::INPUT_SELECT)),
            invalid: Some(th.style(Style::INVALID)),
            ..rat_widget::text::TextStyle::default()
        },
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn text(th: &SalsaTheme) -> rat_widget::text::TextStyle {
    rat_widget::text::TextStyle {
        style: th.style(Style::INPUT),
        focus: Some(th.style(Style::INPUT_FOCUS)),
        select: Some(th.style(Style::INPUT_SELECT)),
        invalid: Some(th.style(Style::INVALID)),
        ..rat_widget::text::TextStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn textarea(th: &SalsaTheme) -> rat_widget::text::TextStyle {
    rat_widget::text::TextStyle {
        style: th.style(Style::INPUT),
        focus: Some(th.style(Style::INPUT)),
        select: Some(th.style(Style::INPUT_SELECT)),
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        ..rat_widget::text::TextStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn textview(th: &SalsaTheme) -> rat_widget::text::TextStyle {
    rat_widget::text::TextStyle {
        style: th.style(Style::CONTAINER_BASE),
        focus: Some(th.style(Style::CONTAINER_BASE)),
        select: Some(th.style(Style::INPUT_SELECT)),
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        border_style: Some(th.style(Style::CONTAINER_BORDER_FG)),
        ..rat_widget::text::TextStyle::default()
    }
}

#[cfg(feature = "rat-widget")]
fn toolbar(th: &SalsaTheme) -> rat_widget::toolbar::ToolbarStyle {
    rat_widget::toolbar::ToolbarStyle {
        style: th.style_style(Style::MENU_BASE),
        key_style: Some(th.style_style(Style::KEY_BINDING)),
        button: Some(rat_widget::button::ButtonStyle {
            style: th.style_style(Style::BUTTON_BASE),
            armed: Some(th.style_style(Style::SELECT)),
            hover: Some(th.style_style(Style::HOVER)),
            ..Default::default()
        }),
        checkbox: Some(rat_widget::checkbox::CheckboxStyle {
            style: th.style_style(Style::BUTTON_BASE),
            behave_check: Some(rat_widget::checkbox::CheckboxCheck::SingleClick),
            ..Default::default()
        }),
        choice: Some(rat_widget::choice::ChoiceStyle {
            style: th.style_style(Style::BUTTON_BASE),
            button: Some(th.style_style(Style::BUTTON_BASE)),
            select: Some(th.style_style(Style::SELECT)),
            focus: Some(th.style_style(Style::BUTTON_BASE)),
            popup: rat_widget::popup::PopupStyle {
                placement: Some(rat_widget::popup::Placement::BelowOrAbove),
                ..Default::default()
            },
            popup_style: Some(th.style_style(Style::POPUP_BASE)),
            popup_border: Some(th.style_style(Style::POPUP_BORDER_FG)),
            behave_focus: Some(rat_widget::choice::ChoiceFocus::OpenOnFocusGained),
            behave_select: Some(rat_widget::choice::ChoiceSelect::MouseClick),
            behave_close: Some(rat_widget::choice::ChoiceClose::SingleClick),
            ..Default::default()
        }),
        collapsed: Some(rat_widget::choice::ChoiceStyle {
            style: th.style_style(Style::BUTTON_BASE),
            button: Some(th.style_style(Style::BUTTON_BASE)),
            select: Some(th.style_style(Style::SELECT)),
            focus: Some(th.style_style(Style::BUTTON_BASE)),
            popup: rat_widget::popup::PopupStyle {
                placement: Some(rat_widget::popup::Placement::BelowOrAbove),
                ..Default::default()
            },
            popup_style: Some(th.style_style(Style::POPUP_BASE)),
            popup_border: Some(th.style_style(Style::POPUP_BORDER_FG)),
            behave_focus: Some(rat_widget::choice::ChoiceFocus::OpenOnFocusGained),
            behave_select: Some(rat_widget::choice::ChoiceSelect::MouseClick),
            behave_close: Some(rat_widget::choice::ChoiceClose::SingleClick),
            ..Default::default()
        }),
        ..Default::default()
    }
}

#[cfg(feature = "rat-widget")]
fn view(th: &SalsaTheme) -> rat_widget::view::ViewStyle {
    rat_widget::view::ViewStyle {
        scroll: Some(th.style(WidgetStyle::SCROLL)),
        ..Default::default()
    }
}