textual 1.0.0-dev

A reactive TUI framework inspired by the Python Textual library
Documentation
use rich_rs::Console;
use textual::debug::DebugLayout;
use textual::prelude::*;
use textual::render::FrameBuffer;
use textual::runtime::{build_widget_tree_from_root, render_tree_to_frame_with_debug};

fn render_tree_debug(
    root: &mut dyn Widget,
    width: usize,
    height: usize,
    debug: &DebugLayout,
) -> FrameBuffer {
    let console = Console::new();
    let mut tree = build_widget_tree_from_root(root).expect("tree should build");
    render_tree_to_frame_with_debug(&mut tree, root, &console, width, height, Some(debug))
}

#[test]
fn debug_layout_draws_borders_and_sizes() {
    let mut container = Container::new()
        .with_child(Label::new("alpha"))
        .with_child(Label::new("beta"));

    let debug = DebugLayout::enabled();
    let buf = render_tree_debug(&mut container, 12, 7, &debug);
    let plain = buf.as_plain_lines().join("\n");
    assert!(plain.contains("alpha"), "expected alpha in tree render");
    assert!(plain.contains("beta"), "expected beta in tree render");
}