schemaui 0.5.0

A Rust library for generating TUI and Web UIs from JSON Schemas for configuration management.
Documentation
use ratatui::{
    Frame,
    layout::{Constraint, Direction, Layout, Rect},
    style::{Color, Style},
    text::{Line, Span},
    widgets::{Block, Borders, Paragraph, Wrap},
};

use super::super::frame::UiContext;

pub fn render_footer(frame: &mut Frame<'_>, area: Rect, ctx: &UiContext<'_>) {
    let rows = Layout::default()
        .direction(Direction::Vertical)
        .constraints([Constraint::Length(2), Constraint::Length(2)])
        .split(area);

    let actions = ctx.help.unwrap_or(" ");
    let actions_widget = Paragraph::new(format!("Actions: {actions}"))
        .wrap(Wrap { trim: true })
        .style(Style::default().fg(Color::Yellow));
    frame.render_widget(actions_widget, rows[0]);

    let mut status = ctx.status_message.to_string();
    if ctx.dirty {
        status.push_str(" • unsaved changes");
    }
    if ctx.error_count > 0 {
        status.push_str(&format!(" • errors: {}", ctx.error_count));
    }
    if let Some(label) = &ctx.focus_label {
        status.push_str(" • focus: ");
        status.push_str(label);
    }
    if let Some(extra) = ctx.global_errors.first() {
        status.push_str("");
        status.push_str(extra);
    }
    if status.trim().is_empty() {
        status = "Ready".to_string();
    }

    let badge = if ctx.error_count > 0 {
        Span::styled(
            format!("[! {}]", ctx.error_count),
            Style::default().fg(Color::Red).bg(Color::Black),
        )
    } else {
        Span::styled("[ok]", Style::default().fg(Color::Green))
    };

    let status_line = Line::from(vec![
        Span::raw("Status: "),
        Span::raw(status),
        Span::raw(" "),
        badge,
    ]);
    let status_widget = Paragraph::new(status_line)
        .wrap(Wrap { trim: true })
        .block(Block::default().borders(Borders::NONE));
    frame.render_widget(status_widget, rows[1]);
}