use ratatui::layout::Rect; use ratatui::style::{Color, Style}; use ratatui::widgets::{Block, Borders, Clear}; use ratatui::Frame; pub struct ModalFrame<'a> { title: &'a str, width: u16, height: u16, border_color: Color, } impl<'a> ModalFrame<'a> { pub fn new(title: &'a str) -> Self { Self { title, width: 40, height: 5, border_color: Color::White, } } pub fn width(mut self, w: u16) -> Self { self.width = w; self } pub fn height(mut self, h: u16) -> Self { self.height = h; self } pub fn border_color(mut self, c: Color) -> Self { self.border_color = c; self } pub fn render_centered(&self, frame: &mut Frame, term: Rect) -> Rect { let width = self.width.min(term.width.saturating_sub(4)); let height = self.height.min(term.height.saturating_sub(4)); let x = term.x + (term.width.saturating_sub(width)) / 2; let y = term.y + (term.height.saturating_sub(height)) / 2; let area = Rect::new(x, y, width, height); frame.render_widget(Clear, area); let block = Block::default() .borders(Borders::ALL) .title(self.title) .border_style(Style::new().fg(self.border_color)); let inner = block.inner(area); frame.render_widget(block, area); inner } }