tui-box-text 0.3.3

A Ratatui widget for displaying text using the box drawing characters
Documentation
use std::iter::zip;

use color_eyre::eyre::Ok;
use ratatui::crossterm::event::{self, Event, KeyCode};
use ratatui::layout::{Constraint, Layout, Rect};
use ratatui::text::Line;
use ratatui::{DefaultTerminal, Frame};
use tui_box_text::BoxChar;

fn main() -> color_eyre::Result<()> {
    color_eyre::install()?;
    let terminal = ratatui::init();
    let result = run(terminal);
    ratatui::restore();
    result
}

fn run(mut terminal: DefaultTerminal) -> color_eyre::Result<()> {
    loop {
        terminal.draw(draw)?;
        if matches!(event::read()?, Event::Key(key) if key.code == KeyCode::Esc) {
            break Ok(());
        }
    }
}

fn draw(frame: &mut Frame) {
    let layout = Layout::vertical([Constraint::Length(1), Constraint::Fill(1)]);
    let [header, body] = layout.areas(frame.area());
    frame.render_widget(
        Line::from("Tui-box-text. Press Esc to exit").centered(),
        header,
    );
    let mut areas = Vec::new();
    for y in (body.top() + 3..body.bottom()).step_by(3) {
        for x in (body.left() + 4..body.right()).step_by(4) {
            areas.push(Rect::new(x - 4, y - 3, 4, 3));
        }
    }
    for (c, area) in zip(' '..='~', areas) {
        let box_char = BoxChar::new(c);
        frame.render_widget(&box_char, area);
    }
}