ratatui-knowledge-patch
Ratatui Knowledge Patch
Covers new APIs and breaking changes in Ratatui 0.30-0.31. Assumes familiarity with Ratatui basics through 0.29.x (tui-rs heritage, widget system, immediate-mode rendering).
| Topic | File | Key Content |
|---|---|---|
| Layout | references/layout.md |
Rect arithmetic, Flex::SpaceEvenly, centered variants |
| Widgets | references/widgets.md |
BarChart, List, canvas markers, LineGauge, ScrollbarState |
| Styling & Borders | references/styling-and-borders.md |
Border merging, dashed borders, Color conversions |
| Migration Guide | references/migration-guide.md |
Alignment rename, WidgetRef reversal, backend Error type, FromCrossterm |
| Backend & Platform | references/backend-and-platform.md |
Crossterm versions, no_std, ratatui-core modularization |
Entry Point: ratatui::run()
Added in 0.30. Handles init()/restore() automatically. Accepts a closure that receives &mut DefaultTerminal.
fn main() -> Result<(), Box<dyn std::error::Error>> {
ratatui::run(|terminal| {
loop {
terminal.draw(|frame| frame.render_widget("Hello World!", frame.area()))?;
if crossterm::event::read()?.is_key_press() {
break Ok(());
}
}
})
}
// Also works with methods: ratatui::run(App::new().run)?;
Rect Layout Methods
Added in 0.30. Rect::layout splits into a fixed-size array with compile-time size inference. Rect::centered centers a sub-rect using constraints.
let layout = Layout::vertical([Constraint::Fill(1); 2]);
let [top, main] = area.layout(&layout); // array size inferred
// Fallible: area.try_layout(&layout)?, layout.try_areas(area)?
// Vec: area.layout_vec(&layout)
let popup = area.centered(Constraint::Ratio(1, 2), Constraint::Ratio(1, 3));
let strip = area.centered_vertically(Constraint::Length(5));
let col = area.centered_horizontally(Constraint::Length(20));
Rect Arithmetic
use ratatui::layout::Offset;
let moved = rect + Offset { x: 5, y: 0 }; // move right
let moved = rect - Offset { x: 5, y: 0 }; // move left
let expanded = rect.outer(Margin {
horizontal: 2,
vertical: 1,
}); // inverse of inner()
let resized = rect.resize(new_width, new_height);
See references/layout.md for Flex changes and Direction::perpendicular().
Style Const Shorthand
Added in 0.30. Color methods like .blue(), .on_black() are now const on Style directly (no longer require Styled trait).
const MY_STYLE: Style = Style::new().blue().on_black();
block::Title Removed
Breaking in 0.30. Use Line directly for block titles. block::Position moved to widgets::TitlePosition. BlockExt moved to widgets::BlockExt.
// Old: Block::default().title(Title::from("Hi").position(Position::Bottom))
// New:
Block::default().title_bottom(Line::from("Hi").centered());
Flex::SpaceAround Semantics Changed
Breaking in 0.30. Old SpaceAround behavior is now Flex::SpaceEvenly. New SpaceAround matches CSS flexbox semantics (inter-item spacing is 2x edge spacing).
Key Widget Changes (0.30)
BarChart constructors
let chart = BarChart::grouped(groups); // default vertical grouped
let chart = BarChart::horizontal(groups);
let bar = Bar::with_label("Sales", 42);
let group = BarGroup::with_label("Q1", bars);
List highlight symbol styling
List::highlight_symbol now accepts Into<Line>, enabling styled highlight symbols (no longer const-compatible):
List::new(items).highlight_symbol(Line::from(">>").red().bold())
New canvas markers
Marker::Quadrant (2x2), Marker::Sextant (2x3), Marker::Octant (2x4, like Braille but filled). Marker is now #[non_exhaustive].
Other widget additions
ScrollbarState::get_position()retrieves current scroll positionTabs::width()calculates total width including dividersText += TextviaAddAssignLineGauge::filled_symbol/unfilled_symbolreplace deprecatedline_set
See references/widgets.md for full details and code examples.
Styling & Borders
Border merging
Added in 0.30. Overlapping borders auto-merge into clean intersections via MergeStrategy.
New dashed BorderTypes
LightDoubleDashed, HeavyDoubleDashed, LightTripleDashed, HeavyTripleDashed, LightQuadrupleDashed, HeavyQuadrupleDashed.
Color RGB conversions
let c = Color::from([255, 0, 0]); // from array
let c = Color::from((255, 0, 0)); // from tuple
Style::has_modifier() checks for a specific modifier.
See references/styling-and-borders.md for full details.
Migration Quick Reference (0.30 Breaking Changes)
| Change | Migration |
|---|---|
block::Title removed |
Use Line directly; title_top() / title_bottom() |
Alignment renamed |
Now HorizontalAlignment (alias exists). VerticalAlignment added |
Flex::SpaceAround changed |
Old behavior is now Flex::SpaceEvenly |
From impls for backend types removed |
Use FromCrossterm/IntoCrossterm (and Termion/Termwiz equivalents) |
Backend Error type required |
Custom backends: add type Error; implement clear_region |
WidgetRef reversed |
Implement Widget for &Foo; use FrameExt for render_widget_ref() |
See references/migration-guide.md for full migration details with code examples.
Version Notes
- 0.30.1:
AsRef<Self>impls added for built-in widgets. May cause type inference ambiguity in rare cases -- add explicit type annotations if needed. - 0.31: MSRV bumped to 1.88.0.
Reference Files
For detailed coverage of each topic area, consult:
references/layout.md-- Rect arithmetic (+/-Offset,outer,resize), Flex changes, Size::area()references/widgets.md-- BarChart constructors, List highlight, canvas markers, LineGauge symbols, ScrollbarState, Tabs, Text AddAssign, AsRef implsreferences/styling-and-borders.md-- Border merging (MergeStrategy), all dashed border types, Color RGB conversions, Style::has_modifierreferences/migration-guide.md-- Complete migration details for all 0.30 breaking changes with before/after codereferences/backend-and-platform.md-- Multiple crossterm version support, no_std, ratatui-core for library authors
More from nevaberry/nevaberry-plugins
dioxus-knowledge-patch
Dioxus changes since training cutoff (latest: 0.7.4) — Signals replacing use_state, RSX macro overhaul, server functions, asset!() system, dx CLI, Element-as-Result. Load before working with Dioxus.
46rust-knowledge-patch
Rust changes since training cutoff (latest: 1.94.0) \u2014 Rust 2024 Edition, async closures, trait upcasting, new std APIs, cargo resolver v3. Load before working with Rust.
20postgresql-knowledge-patch
PostgreSQL changes since training cutoff (latest: 18.1) — JSON_TABLE, SQL/JSON functions, MERGE RETURNING, virtual generated columns, UUIDv7, temporal PRIMARY KEY. Load before working with PostgreSQL.
16bun-knowledge-patch
Bun changes since training cutoff (latest: 1.3.10) \u2014 S3 client, built-in SQL/Redis, route-based HTTP server, CSS bundler, V8 compatibility. Load before working with Bun.
14nextjs-knowledge-patch
Next.js changes since training cutoff (latest: 16.1) — proxy.ts, \"use cache\", Cache Components, navigation hooks, typed routes, auto PageProps, React 19.2. Load before working with Next.js.
14postgis-knowledge-patch
PostGIS changes since training cutoff (latest: 3.6.1) — SFCGAL CG_* rename, ST_CoverageClean, ST_AsRasterAgg, topology bigint IDs, viewport simplification, 3D SFCGAL ops. Load before working with PostGIS.
13