use crate::theme::{ChromeMode, ResolvedTheme}; use ratatui::{ Frame, layout::Rect, widgets::{Block, Borders, Paragraph}, }; /// Draw a conventional outlined panel or a filled surface from the same call /// site. Screens can migrate without embedding theme branches in layouts. pub fn render_panel( frame: &mut Frame, area: Rect, title: &str, focused: bool, theme: &ResolvedTheme, ) -> Rect { match theme.chrome { ChromeMode::Bordered => { let block = Block::default() .title(title) .borders(Borders::ALL) .border_style(if focused { theme.borders.focused } else { theme.borders.normal }); let inner = block.inner(area); frame.render_widget(block, area); inner } ChromeMode::Surfaces => { frame.render_widget( Block::default().style(if focused { theme.surfaces.panel_focused } else { theme.surfaces.panel }), area, ); let header = Rect { x: area.x, y: area.y, width: area.width, height: area.height.min(1), }; frame.render_widget( Paragraph::new(format!(" {title}")).style(theme.surfaces.panel_alternate), header, ); // Surface panels use a single header row. A one-cell inset keeps // compact controls such as the console usable at height three. Rect { x: area.x.saturating_add(1), y: area.y.saturating_add(1), width: area.width.saturating_sub(2), height: area.height.saturating_sub(1), } } } }