Skip to main content

netget/tui/
theme.rs

1//! Adapter from the shared crossterm `ColorPalette` (with termbg
2//! auto-detection) to ratatui `Style`s. ratatui 0.29 converts
3//! `crossterm::style::Color` losslessly via `From`.
4
5use ratatui::style::{Color, Modifier, Style};
6
7use crate::cli::theme::ColorPalette;
8
9#[derive(Clone)]
10pub struct Styles {
11    pub error: Style,
12    pub warning: Style,
13    pub info: Style,
14    pub debug: Style,
15    pub trace: Style,
16    pub reasoning: Style,
17    pub user: Style,
18    pub server: Style,
19    pub client: Style,
20    pub connection: Style,
21    pub separator: Style,
22    pub dimmed: Style,
23    pub normal: Style,
24    pub success: Style,
25    pub failure: Style,
26    pub ask: Style,
27    /// Accent for focused borders, buttons, selection gutters.
28    pub accent: Style,
29    pub selected: Style,
30    pub button: Style,
31    pub title: Style,
32}
33
34impl Styles {
35    pub fn from_palette(palette: &ColorPalette) -> Self {
36        let c = |color: crossterm::style::Color| -> Color { Color::from(color) };
37        let accent = c(palette.info);
38        Self {
39            error: Style::default().fg(c(palette.error)),
40            warning: Style::default().fg(c(palette.warning)),
41            info: Style::default().fg(c(palette.info)),
42            debug: Style::default().fg(c(palette.debug)),
43            trace: Style::default().fg(c(palette.trace)),
44            reasoning: Style::default().fg(c(palette.reasoning)),
45            user: Style::default()
46                .fg(c(palette.user))
47                .add_modifier(Modifier::BOLD),
48            server: Style::default().fg(c(palette.server)),
49            client: Style::default().fg(c(palette.client)),
50            connection: Style::default().fg(c(palette.connection)),
51            separator: Style::default().fg(c(palette.separator)),
52            dimmed: Style::default().fg(c(palette.dimmed)),
53            normal: Style::default().fg(c(palette.normal)),
54            success: Style::default().fg(c(palette.success)),
55            failure: Style::default().fg(c(palette.failure)),
56            ask: Style::default().fg(c(palette.ask)),
57            accent: Style::default().fg(accent).add_modifier(Modifier::BOLD),
58            selected: Style::default().add_modifier(Modifier::REVERSED),
59            button: Style::default().fg(accent).add_modifier(Modifier::BOLD),
60            title: Style::default().add_modifier(Modifier::BOLD),
61        }
62    }
63
64    pub fn for_log_level(&self, level: crate::ui::app::LogLevel) -> Style {
65        use crate::ui::app::LogLevel;
66        match level {
67            LogLevel::Error => self.error,
68            LogLevel::Warn => self.warning,
69            LogLevel::Info => self.info,
70            LogLevel::Debug => self.debug,
71            LogLevel::Trace => self.trace,
72        }
73    }
74}