stynx-code-tui 3.12.1

Terminal user interface with ratatui for interactive sessions
Documentation
use ratatui::{
    buffer::Buffer,
    layout::Rect,
    style::{Modifier, Style},
    text::{Line, Span},
    widgets::{Clear, Paragraph, Widget},
};

use crate::theme;

pub struct QuitConfirmDialog;

impl Widget for QuitConfirmDialog {
    fn render(self, area: Rect, buf: &mut Buffer) {
        let w: u16 = 36;
        let h: u16 = 4;
        let x = area.x + area.width.saturating_sub(w) / 2;
        let y = area.y + area.height.saturating_sub(h) / 2;
        let dialog = Rect { x, y, width: w.min(area.width), height: h };

        Clear.render(dialog, buf);

        for dy in 0..dialog.height {
            for dx in 0..dialog.width {
                buf[(dialog.x + dx, dialog.y + dy)]
                    .set_style(Style::default().bg(theme::BACKGROUND_PANEL()));
            }
            buf[(dialog.x, dialog.y + dy)]
                .set_char('')
                .set_style(Style::default().fg(theme::ERROR()).bg(theme::BACKGROUND_PANEL()));
        }

        let inner = Rect {
            x: dialog.x + 2,
            y: dialog.y + 1,
            width: dialog.width.saturating_sub(3),
            height: dialog.height.saturating_sub(2),
        };

        let lines = vec![
            Line::from(Span::styled(
                "Quit stynx?",
                Style::default().fg(theme::TEXT()).add_modifier(Modifier::BOLD),
            )),
            Line::from(vec![
                Span::styled("y", Style::default().fg(theme::SUCCESS()).add_modifier(Modifier::BOLD)),
                Span::styled(" confirm  ", Style::default().fg(theme::MUTED())),
                Span::styled("any key", Style::default().fg(theme::ERROR()).add_modifier(Modifier::BOLD)),
                Span::styled(" cancel", Style::default().fg(theme::MUTED())),
            ]),
        ];

        Paragraph::new(lines).render(inner, buf);
    }
}