use ratatui::widgets::{Block, Borders};
use crate::settings::themes::Theme;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum PanelKind {
Rail,
Drawer,
Editor,
}
impl PanelKind {
pub fn label(&self) -> &'static str {
match self {
PanelKind::Rail => "RAIL",
PanelKind::Drawer => "DRAWER",
PanelKind::Editor => "EDITOR",
}
}
}
pub fn panel_block(title: &str, theme: &Theme, focused: bool) -> Block<'static> {
let block = Block::default()
.borders(Borders::ALL)
.border_style(theme.border_style(focused))
.style(theme.base_style());
if title.is_empty() {
block
} else {
block.title(format!("─ {title} "))
}
}
#[derive(Clone, Copy, PartialEq, Eq, Default)]
pub enum ModalBg {
#[default]
Panel,
Hard,
Base,
}
#[derive(Default)]
pub struct ModalSpec<'a> {
pub title: Option<&'a str>,
pub border: Option<ratatui::style::Style>,
pub bg: ModalBg,
}
pub fn modal_chrome(
f: &mut ratatui::Frame,
area: ratatui::layout::Rect,
theme: &Theme,
spec: ModalSpec,
) -> ratatui::layout::Rect {
f.render_widget(ratatui::widgets::Clear, area);
let style = match spec.bg {
ModalBg::Panel => theme.panel_style(),
ModalBg::Hard => ratatui::style::Style::default()
.fg(theme.fg.to_ratatui())
.bg(theme.bg_hard.to_ratatui()),
ModalBg::Base => theme.base_style(),
};
let mut block = Block::default()
.borders(Borders::ALL)
.border_style(spec.border.unwrap_or_else(|| theme.border_style(true)))
.style(style);
if let Some(title) = spec.title {
block = block.title(title.to_string());
}
let inner = block.inner(area);
f.render_widget(block, area);
inner
}