rae 0.1.6

Renderer-neutral widget, layout, sanitization, and GLSL shader primitives for Rust desktop tools.
Documentation
use rae::{TranscriptItem, TranscriptViewport};

fn main() {
    let items = vec![
        TranscriptItem::system("rae example session initialized"),
        TranscriptItem::user("Show how transcript rows wrap and clamp across renderer sizes."),
        TranscriptItem::assistant(
            "TranscriptViewport computes columns from glyph metrics, wraps long rows, preserves role labels on first lines, marks detail rows as muted, and clamps scroll to the available content.",
            "detail: renderer chooses fonts, colors, selection, and scroll gestures",
        ),
        TranscriptItem::assistant(
            "Because this crate stays renderer-neutral, the viewport output is just rows and flags.",
            "",
        ),
    ];

    for (label, viewport) in [
        (
            "wide",
            TranscriptViewport::new(720.0, 220.0).with_metrics(9.0, 22.0),
        ),
        (
            "narrow scrolled",
            TranscriptViewport::new(260.0, 110.0)
                .with_metrics(8.5, 20.0)
                .with_scroll(3),
        ),
    ] {
        let view = viewport.materialize(&items);
        println!(
            "\n{label}: total={} visible={} scroll={}/{}",
            view.total_rows, view.visible_rows, view.scroll, view.max_scroll
        );
        for row in view.rows {
            println!(
                "  {:<9} {}{}",
                row.role,
                if row.muted { "# " } else { "  " },
                row.text
            );
        }
    }
}