tuimux 0.1.9

A fast Rust TUI for everything tmux, with full CRUD support.
Documentation
use ratatui::Frame;
use ratatui::layout::Rect;
use ratatui::style::{Color, Style};
use ratatui::text::{Line, Span};
use ratatui::widgets::{Block, Borders, Padding, Paragraph};

use crate::app::state::State;
use crate::ui::theme;

pub fn render(frame: &mut Frame, area: Rect, state: &State) {
    let nav_style = Style::default().fg(Color::Cyan);
    let crud_style = Style::default().fg(Color::Yellow);
    let other_style = Style::default().fg(Color::Magenta);

    let lines = vec![
        Line::from(vec![
            Span::styled("NAV ", nav_style),
            Span::raw("Up/Down rows  Left collapse  Right expand  Enter attach"),
        ]),
        Line::from(vec![
            Span::styled("CRUD ", crud_style),
            Span::raw("s session  w window  n rename  x close  a attach"),
        ]),
        Line::from(vec![
            Span::styled("OTHER ", other_style),
            Span::raw("/ filter  Space toggle  r refresh  E export  R restore  q quit"),
        ]),
        build_status_line(state),
    ];

    let widget = Paragraph::new(lines).block(
        Block::default()
            .borders(Borders::ALL)
            .border_style(theme::panel_border(false))
            .title("Help")
            .title_style(theme::panel_title(false))
            .padding(Padding::new(1, 1, 0, 0)),
    );
    frame.render_widget(widget, area);
}

fn build_status_line(state: &State) -> Line<'static> {
    if let Some(status) = &state.status {
        let label = if status.is_error { "ERROR" } else { "OK" };
        let style = if status.is_error { theme::error_status() } else { theme::ok_status() };

        return Line::from(vec![Span::styled(format!("STATUS {label}: "), style), Span::raw(status.message.clone())]);
    }

    Line::from(vec![Span::styled("STATUS OK: ", theme::ok_status()), Span::raw("ready")])
}