use ratatui::{ layout::{Alignment, Rect}, style::{Color, Modifier, Style}, text::Line, widgets::{Block, Borders, Clear, Paragraph}, Frame, }; /// Рендерит центрированную модалку с заданным содержимым /// /// # Параметры /// - `f`: Frame для рендеринга /// - `area`: Область экрана /// - `title`: Заголовок модалки /// - `content`: Содержимое модалки (строки текста) /// - `width`: Ширина модалки /// - `height`: Высота модалки /// - `border_color`: Цвет рамки pub fn render_modal( f: &mut Frame, area: Rect, title: &str, content: Vec, width: u16, height: u16, border_color: Color, ) { // Центрируем модалку let x = area.x + (area.width.saturating_sub(width)) / 2; let y = area.y + (area.height.saturating_sub(height)) / 2; let modal_area = Rect::new(x, y, width.min(area.width), height.min(area.height)); // Очищаем область под модалкой f.render_widget(Clear, modal_area); // Рендерим модалку let modal = Paragraph::new(content) .block( Block::default() .borders(Borders::ALL) .border_style(Style::default().fg(border_color)) .title(format!(" {} ", title)) .title_style( Style::default() .fg(border_color) .add_modifier(Modifier::BOLD), ), ) .alignment(Alignment::Center); f.render_widget(modal, modal_area); } /// Рендерит модалку подтверждения удаления pub fn render_delete_confirm_modal(f: &mut Frame, area: Rect) { use ratatui::text::Span; let content = vec![ Line::from(""), Line::from(Span::styled( "Удалить сообщение?", Style::default() .fg(Color::White) .add_modifier(Modifier::BOLD), )), Line::from(""), Line::from(vec![ Span::styled( " [y/Enter] ", Style::default() .fg(Color::Green) .add_modifier(Modifier::BOLD), ), Span::raw("Да"), Span::raw(" "), Span::styled(" [n/Esc] ", Style::default().fg(Color::Red).add_modifier(Modifier::BOLD)), Span::raw("Нет"), ]), ]; render_modal(f, area, "Подтверждение", content, 40, 7, Color::Red); }