Ratagrid
An independent, typed data grid for Ratatui: sorting, selection, search, column resizing and pagination.

Documentation and demo · API reference · Usage guide
The demo shows real terminal I/O rendered into media, using synthetic records.
Run it
Rust 1.99.0 is required.
git clone https://github.com/kahwee/ratagrid.git
cd ratagrid
cargo run --release --locked --example playground
Use with Ratatui
ratagrid = { git = "https://github.com/kahwee/ratagrid" }
ratatui = "0.30"
crossterm = "0.29"
A complete keyboard example (cargo run --locked --example quickstart):
use crossterm::event::{self, Event, KeyCode, KeyEventKind, KeyModifiers};
use ratagrid::{Column, Grid};
fn main() -> std::io::Result<()> {
let mut grid = Grid::new(
vec![Column::new("Value", 12, |n: &i64| n.to_string()).sortable(|a, b| a.cmp(b))],
vec![20, -3, 100],
);
let mut terminal = ratatui::init();
let result = (|| {
loop {
terminal.draw(|frame| frame.render_widget(grid.widget(), frame.area()))?;
let input = event::read()?;
if matches!(&input, Event::Key(k) if k.code == KeyCode::Char('q')
&& k.kind != KeyEventKind::Release
&& !k.modifiers.intersects(KeyModifiers::CONTROL | KeyModifiers::ALT | KeyModifiers::SUPER)
&& !grid.is_searching())
{
break;
}
grid.handle_event(&input);
}
Ok(())
})();
ratatui::restore();
result
}
Use arrows to select, Tab + Enter to sort, / to search, and q to quit. For mouse capture and synthetic financial amounts, see positions.rs. Your application owns the terminal, focus and data source.
Feature guide · Pagination · Contributing · MIT license