Skip to main content

vtcode_ui/tui/core_tui/widgets/
panel.rs

1//! Panel widget for rendering bordered containers.
2//!
3//! Re-exports `Panel` and `PanelStyleProvider` from `crate::design::panel`.
4//! Provides a convenience constructor that uses terminal-aware border types.
5
6use ratatui::style::{Modifier, Style};
7
8pub(crate) use crate::design::panel::{Panel, PanelStyleProvider, PanelStyles};
9
10use crate::tui::ui::tui::session::{styling::SessionStyles, terminal_capabilities};
11
12/// Implement `PanelStyleProvider` for `SessionStyles` so that `Panel` can
13/// render with the active theme's styles.
14impl PanelStyleProvider for SessionStyles {
15    fn default_style(&self) -> Style {
16        SessionStyles::default_style(self)
17    }
18
19    fn accent_style(&self) -> Style {
20        SessionStyles::accent_style(self)
21    }
22
23    fn border_style(&self) -> Style {
24        SessionStyles::border_style(self)
25    }
26}
27
28/// Implement `PanelStyles` for `SessionStyles`.
29impl PanelStyles for SessionStyles {
30    fn muted_style(&self) -> Style {
31        self.default_style().add_modifier(Modifier::DIM)
32    }
33
34    fn title_style(&self) -> Style {
35        self.accent_style().add_modifier(Modifier::BOLD)
36    }
37
38    fn border_active_style(&self) -> Style {
39        self.border_style().remove_modifier(Modifier::DIM).add_modifier(Modifier::BOLD)
40    }
41
42    fn divider_style(&self) -> Style {
43        self.border_style().add_modifier(Modifier::DIM)
44    }
45}
46
47/// Create a new `Panel` with terminal-aware border type as default.
48///
49/// This preserves the previous behavior where `Panel::new` automatically
50/// selected the border type based on terminal capabilities.
51pub(crate) fn new_panel<'a>(styles: &'a SessionStyles) -> Panel<'a, SessionStyles> {
52    Panel::new(styles).border_type(terminal_capabilities::get_border_type())
53}