Schipper.Io.Tui is menus, prompts, and an editor. Cells, color, diffs, and key decoding stay in Schipper.Io.Ansi. Themes have a hand-tuned 16-color fallback.
Menus scroll. Tiny sessions do not throw. A trailing Escape on a short read is Escape, not Alt+the next character.
MenuAsync, ReadLineAsync, MessageAsync, ConfirmAsync. Empty menus return −1. All-disabled waits for Escape.
Seashell, Amber, Matrix. ForDepth picks Fallback16 on basic-16 clients so flush is not an algorithmic palette.
Long lines wrap on load so Ctrl-S round-trips. MCI color codes render and strip.
Call BeginAsync / EndAsync as a pair around the whole UI, including faults.
var view = new TerminalView(terminal); var reader = new InputReader(terminal); Theme theme = Theme.Default.ForDepth(view.Depth); await view.BeginAsync(ct); int choice = await TerminalUi.MenuAsync( view, reader, theme, title: "Workshop", items: [ new MenuItem("Enter", 'e'), new MenuItem("Quit", 'q') ], cancellationToken: ct); await view.EndAsync(ct);