Skip to main content

vtcode_tui/core_tui/widgets/
panel.rs

1//! Panel widget for rendering bordered containers.
2//!
3//! Re-exports `Panel` and `PanelStyleProvider` from `vtcode_design::panel`.
4//! Provides a convenience constructor that uses terminal-aware border types.
5
6use ratatui::style::{Modifier, Style};
7
8pub use vtcode_design::panel::{Panel, PanelStyleProvider, PanelStyles};
9
10use crate::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()
40            .remove_modifier(Modifier::DIM)
41            .add_modifier(Modifier::BOLD)
42    }
43
44    fn divider_style(&self) -> Style {
45        self.border_style().add_modifier(Modifier::DIM)
46    }
47}
48
49/// Create a new `Panel` with terminal-aware border type as default.
50///
51/// This preserves the previous behavior where `Panel::new` automatically
52/// selected the border type based on terminal capabilities.
53pub fn new_panel<'a>(styles: &'a SessionStyles) -> Panel<'a, SessionStyles> {
54    Panel::new(styles).border_type(terminal_capabilities::get_border_type())
55}