0.0.17 cohort: intuiTUIve widgets and loops of your own¶
Prepared; publication follows the merge of this release's last PR. See Publication.
0.0.17 is the second release of intuiTUIve, the TUI framework, and the charts it needed:
- Widgets. A public
Widgettrait for controls of your own, and every built-in node (text, columns, grids, panels,each,switch, logs,scroll) implemented with it. Retained drawing, viewports, focus, hover, resize, paste and key-preview events, and the drawing helpers the built-in nodes use. - Components. Scroll views, tables, tabs, popups, trees, split panes, a calendar, virtual lists, menus, a command palette and help built from the key bindings, toasts, text selection and copy, and animations.
- Loops of your own.
App::driverruns an app from a loop you own, one frame of bytes per turn;App::runis built on it. An app can run inside a ratatui program, and ratatui's widgets inside an app. - Charts.
rich_ext::chart::ChartandCanvas, laid out as ratatui's so a ported app looks the same. - Sharp edges fixed. A probe of the framework as a new user would use
it found eleven: a memo writing its own input crashed the process, a
write inside
updatecould panic, self-writing nodes and watches ran away, a Ctrl+C binding never fired, some key names could never fire, focus jumped to the top after a deleted row, signals shared between two apps did not redraw, a timer stalled after a clock jump, and toasts vanished on tiny screens. Each is fixed, with a test. - Examples that show it.
metersis a board of widgets of their own;plannerputs the menu bar, tree, split panes, calendar and virtual list together;files, the Yazi-style file manager, gains split panes, help and a command palette from its bindings, yanking and a right-click menu.
A default build of rs-rich is unchanged, still 0.0.9, and still renders
exactly like upstream rich 15.0.0.
Independent package versions¶
| Package | Version | Release role |
|---|---|---|
rs-rich-ext |
0.0.15 | chart::Chart and chart::Canvas |
rs-rich-micro |
0.0.4 | Manifest only: requires ext 0.0.15 |
rs-rich-record |
0.0.5 | Manifest only: requires ext 0.0.15 |
rs-rich-interact |
0.0.5 | event::from_crossterm is public; requires ext 0.0.15 |
rs-rich-ratatui |
0.0.2 | Manifest only: requires interact 0.0.5 |
rs-rich-intuituive |
0.0.2 | The widgets, components and Driver above |
rs-rich-data |
0.0.2 | Manifest only: requires ext 0.0.15 |
rs-rich-cli |
0.0.17 | Manifest only: requires the versions above |
rs-rich 0.0.9, rs-rich-macros 0.0.3, rs-rich-plugin-api 0.0.3,
rs-rich-art 0.0.12, rs-rich-diagram 0.0.2, rs-rich-mermaid 0.0.5,
rs-rich-lumis 0.0.3 and the Python package 0.0.5 do not change.
Migration¶
intuiTUIve 0.0.x takes breaking changes:
WidgetEventis no longerCopy, and isnon_exhaustive: amatchon it needs a_arm.- A loop of your own that copies text selected with the mouse calls
Driver::copiedafter the copy worked, to show the "Copied" toast.
Release test¶
- Each PR's CI (fmt, clippy, tests on Linux, macOS and Windows, the feature matrix, MSRV, golden parity, the tapes, the docs site) and the intuiTUIve-against-ratatui benchmark gate passed (#676, #679, #680 and the examples PR).
- Two reviews of the widget refactor (an independent one and Codex) found eight defects, each fixed with a regression test; see the CHANGELOG.
scripts/validate_release.py --tag rs-rich-cli-v0.0.17passed on the release head.
At 80x24 the benchmark gate measures a tick at about 14 µs against ratatui's 88, a selection move at 44 against 89, and a log append at 48 against 96, sending fewer bytes each time.
Known limits¶
- Only the crossterm backend: termion (#677) and termwiz (#678) are tracked.
- Hover and the pointer reach the top screen only; a widget under a modal gets no hover events.
Publication¶
RELEASES.toml lists every package's version in publication order. Tag what
is due on the merged commit on main:
python3 scripts/release_cohort.py status # what is published, tagged, or due
python3 scripts/release_cohort.py tag --dry-run # what it would tag
python3 scripts/release_cohort.py tag # tag and wait, one at a time
tag skips the packages already on crates.io and PyPI and pushes one
annotated tag at a time, waiting for each version to appear before the next:
rs-rich-ext-v0.0.15;rs-rich-micro-v0.0.4;rs-rich-record-v0.0.5;rs-rich-interact-v0.0.5;rs-rich-ratatui-v0.0.2;rs-rich-intuituive-v0.0.2;rs-rich-data-v0.0.2;rs-rich-cli-v0.0.17.
Every crate already exists on crates.io, so each publishes through Trusted
Publishing. rs-rich-data, rs-rich-ratatui and rs-rich-intuituive were
first uploaded with a token, so each needs its Trusted Publishing entry
(crate → Settings → Trusted Publishing; see
Registry authentication).
Without it, that tag's run fails at the token exchange before uploading
anything; add the entry and dispatch the same tag again.