Skip to content
Back to skills

Ratatui Knowledge Patch

ASecurity

Ratatui

  • 24 stars
  • 0 votes
  • 0 copies
  • 4 views
  • Added May 27, 2026
developmentrustgoawstestingapibackend

Works with

  • cursor
  • terminal
  • cli
  • api

Security analysis

A100/100

Pro scans all 6 files and shows the line behind each finding

Scanned September 5, 2026

npx -y skills add Nevaberry/nevaberry-plugins --skill ratatui-knowledge-patch --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ratatui Knowledge Patch?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ratatui Knowledge Patch
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/nevaberry-ratatui-knowledge-patch/badge)](https://www.skillsdirectory.com/skills/nevaberry-ratatui-knowledge-patch)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ratatui-knowledge-patch
description: Ratatui
version: "0.31.0"
license: MIT
metadata:
  author: Nevaberry
---


# Ratatui knowledge patch

## Reference index

| Reference | Topics |
|---|---|
| [migration-and-configuration.md](references/migration-and-configuration.md) | MSRV, crate split, Cargo features, `no_std`, breaking migrations, Serde, prelude |
| [layout-text-and-style.md](references/layout-text-and-style.md) | typed layout, flex, overlap, rectangles, text, styles, colors, borders |
| [widgets-and-selection.md](references/widgets-and-selection.md) | tables, lists, tabs, scrollbars, sparklines, titles, calendars, reference widgets |
| [charts-canvas-and-symbols.md](references/charts-canvas-and-symbols.md) | grouped bars, line gauges, canvas markers, clipping, layering, runtime symbols |
| [terminal-backends-and-events.md](references/terminal-backends-and-events.md) | lifecycle, viewports, drawing, cursors, backend traits, event scheduling |
| [architecture-state-and-testing.md](references/architecture-state-and-testing.md) | components, TEA, stateful rendering, templates, snapshots, safe buffers |

## Breaking changes and deprecations

### Toolchain and crates

- Ratatui 0.30.0 requires Rust 1.86.0 and Rust 2024. The current 0.31.0
  workspace requires Rust 1.88.0.
- Applications may keep using `ratatui`. Libraries can use `ratatui-core`,
  `ratatui-widgets`, and backend-specific crates for narrower dependencies.
- A `no_std` build disables defaults. Add `layout-cache` when a `std` build
  disables defaults but still needs cached layout, and add `portable-atomic`
  only on targets without native atomics.
- `palette` and `serde` require `std`.

### Imports and renamed APIs

```rust
// 0.30.0+
use ratatui::layout::HorizontalAlignment;
use ratatui::widgets::{BlockExt, TitlePosition};
```

- Layout `Alignment` is now `HorizontalAlignment`.
- `widgets::block` and `widgets::block::Title` were removed. Pass content
  convertible to `Line` into `Block::title`; use `title_top`/`title_bottom`.
- The prelude includes `Position` and `Size`, but not `Styled`, `Marker`,
  `CompletedFrame`, `TerminalOptions`, or `Viewport`.

### Style migration

```rust
const PANEL: Style = Style::new().blue().on_black();
let reset = Style::reset();
```

- Stylize methods are inherent on `Style`; `Style` itself no longer
  implements `Styled`.
- Replace `style.reset()` with the associated function `Style::reset()`.
- Styling an owned `String` consumes it and produces `Span<'static>`; clone it
  first if it is still needed.

### Backends

Custom backends must define `Backend::Error` and implement `clear_region`.
Generic terminal helpers should return `Result<T, B::Error>` rather than
assuming `std::io::Error`; `TestBackend` uses `Infallible`.

Generic backend conversions were replaced by explicit traits:

```rust
let color = Color::from_crossterm(value);
let backend_color = color.into_crossterm();
```

Equivalent `FromTermion`/`IntoTermion` and `FromTermwiz`/`IntoTermwiz` traits
are available. Prefer `ratatui::crossterm` imports so the version matches the
enabled backend feature.

### Widget and buffer APIs

- Implement `Widget for &Foo` instead of relying on a direct
  `WidgetRef for Foo` implementation to gain `Widget`.
- `StatefulWidget::State` and `StatefulWidgetRef::State` may be unsized.
- `Cell::symbol` is `Option<CompactString>`; direct access must handle `None`.
- `symbols::Marker` is non-exhaustive. Add a wildcard match arm.
- `Marker::Block` is now a full block; use `Marker::Bar` for the former
  upper-half-block canvas appearance.
- `Rect::area()` returns `u32`, and its `Positions` fields are private.
- `LineGauge::line_set` is deprecated; set `filled_symbol` and
  `unfilled_symbol` separately.

### Inference traps

Avoid unnecessary `.into()` when an API itself accepts `Into`:

```rust
let bar = Bar::default().label("name").text_value("42");
let tabs = Tabs::new(["A", "B"]).select(None);
```

Explicit conversions may be needed around `Line: From<Cow<str>>`, while
`Tabs::select(selected.into())` may need an explicitly typed option or
`selected as usize`.

## High-value layout APIs

### Typed areas

```rust
let layout = Layout::vertical([Constraint::Length(3), Constraint::Min(0)]);
let [header, body] = area.layout(&layout);
```

Use `Rect::try_layout` or `Layout::try_areas` for fallible arrays, and
`Rect::layout_vec` for a vector. Center areas with `Rect::centered`,
`centered_vertically`, or `centered_horizontally`; expand with `Rect::outer`.

### Fill, flex, and overlap

- `Constraint::Fill(weight)` proportionally divides excess space.
- Conflict priority is `Min > Max > Length > Percentage > Ratio > Fill`.
- `Flex::SpaceAround` now has CSS semantics; `Flex::SpaceEvenly` preserves the
  earlier equal-edge-gap behavior.
- `Layout::split_with_spacers` exposes generated spacer rectangles.
- Negative spacing creates overlaps. Later rendering wins shared cells:

```rust
let panes = Layout::horizontal(constraints).spacing(-1).split(area);
```

## High-value terminal APIs

### Lifecycle

For the default Crossterm terminal, prefer managed execution:

```rust
ratatui::run(|terminal| {
    terminal.draw(|frame| frame.render_widget("Hello", frame.area()))?;
    Ok(())
})
```

For manual control, call `init`, preserve the application result, call
`restore`, and then return the result. Use `try_init`,
`try_init_with_options`, and `try_restore` to propagate lifecycle errors.

### Viewports and fallible drawing

- `draw` tracks backend resizing for fullscreen and inline viewports, but a
  fixed viewport stays at its configured `Rect`.
- Explicit `Terminal::resize` changes fixed viewports.
- `Terminal::clear` uses the latest resized area.
- `Terminal::try_draw` accepts a fallible callback; errors prevent the update.
- `get_cursor_position`/`set_cursor_position` replace untyped cursor methods.
- `Terminal::size()` returns the real backend `Size`, not a viewport `Rect`.

## High-value widget APIs

### Tables

```rust
state.select_column(Some(column));
state.select_cell(Some((row, column)));
```

Use `column_highlight_style` and `cell_highlight_style`. Overlapping selection
styles apply as row, then column, then cell. `Table` can be collected from
rows, and `Table::flex` controls unused column width.

### Scrollbars, lists, and tabs

- Initialize a scrollbar with `ScrollbarState::new(total)` or it renders
  blank; then set `position` and optionally `viewport_content_length`.
- Set scrollbar orientation before custom symbols, because `orientation`
  resets the symbol set.
- List selection beyond the item count clamps to the last item.
- `Tabs::select(None)` renders no selected tab. The default selected style is
  reversed.

### Optional and stateful rendering

`Option<W>: Widget`, so `None` draws nothing:

```rust
frame.render_widget(show.then(|| Paragraph::new("Details")), area);
```

Stateful widgets mutate separate persistent state during full-frame redraws.
Keep child widget state inside the parent state and pass mutable model access
when rendering can adjust offsets. For lightweight in-place mutation,
implement `Widget` for `&mut MyWidget`.

## Charts and canvas

- `BarChart::grouped` builds multiple labeled bar groups, and `Bar` implements
  `Styled`.
- Canvas adds `Quadrant` (2×2), `Sextant` (2×3), and `Octant` (2×4) markers.
- Canvas coordinates round to the nearest grid cell; out-of-bounds line starts
  are clipped, and `Painter::bounds()` exposes the current bounds.
- Overlaid charts and text preserve Braille and block marks for composition.
- Canvas grids may exceed 65,535 pseudo-pixels.

## Text and color reminders

- `Text += other` appends lines but ignores the appended text's top-level
  style and alignment; line/span attributes remain.
- `Text`, `Line`, and `Span` implement `UnicodeWidthStr` with `width` and
  `width_cjk`; `Span` suppresses Unicode control characters.
- Styles patch in widget → text → line → span order.
- `Color::from_hsl` takes one `palette::Hsl` with saturation/lightness in
  `0.0..=1.0`; `Color::from_hsluv` is also available with `palette`.
- `ratatui::style::palette::tailwind` supplies compile-time color families.

## Testing reminders

- Snapshot a fixed-size `TestBackend` with `insta` and review changes with
  `cargo insta review`.
- Clip a custom widget's area with `area.intersection(buf.area)` before direct
  buffer writes.
- Expect snapshot changes from concise text/style `Debug`, nearest-cell canvas
  rounding, padded line-gauge labels, and inherited-alignment truncation.

Files in this skill

  • SKILL.md6.5 KB
  • references/backend-and-platform.md1 KB
  • references/layout.md1.2 KB
  • references/migration-guide.md1.6 KB
  • references/styling-and-borders.md1.1 KB
  • references/widgets.md1.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.