Skip to content

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 Widget trait 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::driver runs an app from a loop you own, one frame of bytes per turn; App::run is built on it. An app can run inside a ratatui program, and ratatui's widgets inside an app.
  • Charts. rich_ext::chart::Chart and Canvas, 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 update could 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. meters is a board of widgets of their own; planner puts 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:

  • WidgetEvent is no longer Copy, and is non_exhaustive: a match on it needs a _ arm.
  • A loop of your own that copies text selected with the mouse calls Driver::copied after 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.17 passed 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:

  1. rs-rich-ext-v0.0.15;
  2. rs-rich-micro-v0.0.4;
  3. rs-rich-record-v0.0.5;
  4. rs-rich-interact-v0.0.5;
  5. rs-rich-ratatui-v0.0.2;
  6. rs-rich-intuituive-v0.0.2;
  7. rs-rich-data-v0.0.2;
  8. 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.