2023-09-28 02:57:04 +00:00
|
|
|
<details>
|
|
|
|
<summary>Table of Contents</summary>
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
- [Ratatui](#ratatui)
|
|
|
|
- [Installation](#installation)
|
|
|
|
- [Introduction](#introduction)
|
|
|
|
- [Other Documentation](#other-documentation)
|
|
|
|
- [Quickstart](#quickstart)
|
|
|
|
- [Status of this fork](#status-of-this-fork)
|
|
|
|
- [Rust version requirements](#rust-version-requirements)
|
|
|
|
- [Widgets](#widgets)
|
|
|
|
- [Built in](#built-in)
|
|
|
|
- [Third\-party libraries, bootstrapping templates and
|
|
|
|
widgets](#third-party-libraries-bootstrapping-templates-and-widgets)
|
|
|
|
- [Apps](#apps)
|
|
|
|
- [Alternatives](#alternatives)
|
|
|
|
- [Acknowledgments](#acknowledgments)
|
|
|
|
- [License](#license)
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
</details>
|
2023-09-21 08:47:23 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
<!-- cargo-rdme start -->
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2024-08-21 18:35:08 +00:00
|
|
|
![Demo](https://github.com/ratatui/ratatui/blob/87ae72dbc756067c97f6400d3e2a58eeb383776e/examples/demo2-destroy.gif?raw=true)
|
2023-09-21 08:47:23 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
<div align="center">
|
2023-09-21 08:47:23 +00:00
|
|
|
|
2024-06-17 14:53:32 +00:00
|
|
|
[![Crate Badge]][Crate] [![Docs Badge]][API Docs] [![CI Badge]][CI Workflow] [![Deps.rs
|
|
|
|
Badge]][Deps.rs]<br> [![Codecov Badge]][Codecov] [![License Badge]](./LICENSE) [![Sponsors
|
|
|
|
Badge]][GitHub Sponsors]<br> [![Discord Badge]][Discord Server] [![Matrix Badge]][Matrix]
|
|
|
|
[![Forum Badge]][Forum]<br>
|
2024-01-09 07:52:47 +00:00
|
|
|
|
2024-01-13 23:13:50 +00:00
|
|
|
[Ratatui Website] · [API Docs] · [Examples] · [Changelog] · [Breaking Changes]<br>
|
|
|
|
[Contributing] · [Report a bug] · [Request a Feature] · [Create a Pull Request]
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
</div>
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
# Ratatui
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2024-01-09 07:52:47 +00:00
|
|
|
[Ratatui][Ratatui Website] is a crate for cooking up terminal user interfaces in Rust. It is a
|
|
|
|
lightweight library that provides a set of widgets and utilities to build complex Rust TUIs.
|
|
|
|
Ratatui was forked from the [tui-rs] crate in 2023 in order to continue its development.
|
2023-06-01 13:22:18 +00:00
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
2024-05-28 20:23:39 +00:00
|
|
|
Add `ratatui` as a dependency to your cargo.toml:
|
2023-09-28 02:57:04 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
```shell
|
2024-05-28 20:23:39 +00:00
|
|
|
cargo add ratatui
|
2023-06-01 13:22:18 +00:00
|
|
|
```
|
2023-03-19 15:08:04 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
Ratatui uses [Crossterm] by default as it works on most platforms. See the [Installation]
|
2023-12-04 10:49:54 +00:00
|
|
|
section of the [Ratatui Website] for more details on how to use other backends ([Termion] /
|
2023-09-28 02:57:04 +00:00
|
|
|
[Termwiz]).
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
## Introduction
|
2023-02-13 15:10:08 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
Ratatui is based on the principle of immediate rendering with intermediate buffers. This means
|
|
|
|
that for each frame, your app must render all widgets that are supposed to be part of the UI.
|
|
|
|
This is in contrast to the retained mode style of rendering where widgets are updated and then
|
2024-01-09 07:52:47 +00:00
|
|
|
automatically redrawn on the next frame. See the [Rendering] section of the [Ratatui Website]
|
|
|
|
for more info.
|
2023-02-13 15:10:08 +00:00
|
|
|
|
2024-02-12 09:54:05 +00:00
|
|
|
You can also watch the [FOSDEM 2024 talk] about Ratatui which gives a brief introduction to
|
|
|
|
terminal user interfaces and showcases the features of Ratatui, along with a hello world demo.
|
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
## Other documentation
|
2023-06-08 09:00:18 +00:00
|
|
|
|
2023-12-04 10:49:54 +00:00
|
|
|
- [Ratatui Website] - explains the library's concepts and provides step-by-step tutorials
|
2024-06-17 14:53:32 +00:00
|
|
|
- [Ratatui Forum][Forum] - a place to ask questions and discuss the library
|
2024-01-09 07:52:47 +00:00
|
|
|
- [API Docs] - the full API documentation for the library on docs.rs.
|
2023-09-28 02:57:04 +00:00
|
|
|
- [Examples] - a collection of examples that demonstrate how to use the library.
|
|
|
|
- [Contributing] - Please read this if you are interested in contributing to the project.
|
2024-01-09 07:52:47 +00:00
|
|
|
- [Changelog] - generated by [git-cliff] utilizing [Conventional Commits].
|
2023-09-28 08:00:43 +00:00
|
|
|
- [Breaking Changes] - a list of breaking changes in the library.
|
2023-02-13 15:10:08 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
## Quickstart
|
|
|
|
|
|
|
|
The following example demonstrates the minimal amount of code necessary to setup a terminal and
|
|
|
|
render "Hello World!". The full code for this example which contains a little more detail is in
|
2024-01-18 09:56:06 +00:00
|
|
|
the [Examples] directory. For more guidance on different ways to structure your application see
|
|
|
|
the [Application Patterns] and [Hello World tutorial] sections in the [Ratatui Website] and the
|
|
|
|
various [Examples]. There are also several starter templates available in the [templates]
|
|
|
|
repository.
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
Every application built with `ratatui` needs to implement the following steps:
|
|
|
|
|
|
|
|
- Initialize the terminal
|
|
|
|
- A main loop to:
|
|
|
|
- Handle input events
|
|
|
|
- Draw the UI
|
|
|
|
- Restore the terminal state
|
|
|
|
|
|
|
|
The library contains a [`prelude`] module that re-exports the most commonly used traits and
|
|
|
|
types for convenience. Most examples in the documentation will use this instead of showing the
|
|
|
|
full path of each type.
|
|
|
|
|
|
|
|
### Initialize and restore the terminal
|
|
|
|
|
|
|
|
The [`Terminal`] type is the main entry point for any Ratatui application. It is a light
|
|
|
|
abstraction over a choice of [`Backend`] implementations that provides functionality to draw
|
|
|
|
each frame, clear the screen, hide the cursor, etc. It is parametrized over any type that
|
|
|
|
implements the [`Backend`] trait which has implementations for [Crossterm], [Termion] and
|
|
|
|
[Termwiz].
|
|
|
|
|
|
|
|
Most applications should enter the Alternate Screen when starting and leave it when exiting and
|
|
|
|
also enable raw mode to disable line buffering and enable reading key events. See the [`backend`
|
2023-12-04 10:49:54 +00:00
|
|
|
module] and the [Backends] section of the [Ratatui Website] for more info.
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
### Drawing the UI
|
|
|
|
|
|
|
|
The drawing logic is delegated to a closure that takes a [`Frame`] instance as argument. The
|
|
|
|
[`Frame`] provides the size of the area to draw to and allows the app to render any [`Widget`]
|
2024-05-28 20:23:39 +00:00
|
|
|
using the provided [`render_widget`] method. After this closure returns, a diff is performed and
|
|
|
|
only the changes are drawn to the terminal. See the [Widgets] section of the [Ratatui Website]
|
2024-01-09 07:52:47 +00:00
|
|
|
for more info.
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
### Handling events
|
|
|
|
|
|
|
|
Ratatui does not include any input handling. Instead event handling can be implemented by
|
|
|
|
calling backend library methods directly. See the [Handling Events] section of the [Ratatui
|
2023-12-04 10:49:54 +00:00
|
|
|
Website] for more info. For example, if you are using [Crossterm], you can use the
|
2023-09-28 02:57:04 +00:00
|
|
|
[`crossterm::event`] module to handle events.
|
|
|
|
|
|
|
|
### Example
|
2023-06-01 13:22:18 +00:00
|
|
|
|
|
|
|
```rust
|
2023-09-28 02:57:04 +00:00
|
|
|
use std::io::{self, stdout};
|
2024-01-09 07:52:47 +00:00
|
|
|
|
2024-05-28 20:23:39 +00:00
|
|
|
use ratatui::{
|
2024-08-04 12:09:28 +00:00
|
|
|
backend::CrosstermBackend,
|
2024-05-28 20:23:39 +00:00
|
|
|
crossterm::{
|
|
|
|
event::{self, Event, KeyCode},
|
|
|
|
terminal::{
|
|
|
|
disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen,
|
|
|
|
},
|
|
|
|
ExecutableCommand,
|
|
|
|
},
|
2024-08-04 12:09:28 +00:00
|
|
|
widgets::{Block, Paragraph},
|
|
|
|
Frame, Terminal,
|
2023-09-28 02:57:04 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
fn main() -> io::Result<()> {
|
|
|
|
enable_raw_mode()?;
|
|
|
|
stdout().execute(EnterAlternateScreen)?;
|
|
|
|
let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?;
|
|
|
|
|
|
|
|
let mut should_quit = false;
|
|
|
|
while !should_quit {
|
|
|
|
terminal.draw(ui)?;
|
|
|
|
should_quit = handle_events()?;
|
|
|
|
}
|
|
|
|
|
|
|
|
disable_raw_mode()?;
|
|
|
|
stdout().execute(LeaveAlternateScreen)?;
|
2023-06-01 13:22:18 +00:00
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
fn handle_events() -> io::Result<bool> {
|
|
|
|
if event::poll(std::time::Duration::from_millis(50))? {
|
|
|
|
if let Event::Key(key) = event::read()? {
|
|
|
|
if key.kind == event::KeyEventKind::Press && key.code == KeyCode::Char('q') {
|
|
|
|
return Ok(true);
|
|
|
|
}
|
2024-01-09 07:52:47 +00:00
|
|
|
}
|
2023-09-28 02:57:04 +00:00
|
|
|
}
|
|
|
|
Ok(false)
|
2023-06-01 13:22:18 +00:00
|
|
|
}
|
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
fn ui(frame: &mut Frame) {
|
|
|
|
frame.render_widget(
|
2024-05-28 20:23:39 +00:00
|
|
|
Paragraph::new("Hello World!").block(Block::bordered().title("Greeting")),
|
2023-09-28 02:57:04 +00:00
|
|
|
frame.size(),
|
|
|
|
);
|
2023-06-01 13:22:18 +00:00
|
|
|
}
|
2023-09-28 02:57:04 +00:00
|
|
|
```
|
2023-06-01 13:22:18 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
Running this example produces the following output:
|
|
|
|
|
2023-09-28 08:00:43 +00:00
|
|
|
![docsrs-hello]
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
## Layout
|
|
|
|
|
|
|
|
The library comes with a basic yet useful layout management object called [`Layout`] which
|
|
|
|
allows you to split the available space into multiple areas and then render widgets in each
|
|
|
|
area. This lets you describe a responsive terminal UI by nesting layouts. See the [Layout]
|
2023-12-04 10:49:54 +00:00
|
|
|
section of the [Ratatui Website] for more info.
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
```rust
|
2024-08-04 12:09:28 +00:00
|
|
|
use ratatui::{
|
|
|
|
layout::{Constraint, Layout},
|
|
|
|
widgets::Block,
|
|
|
|
Frame,
|
|
|
|
};
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
fn ui(frame: &mut Frame) {
|
2024-08-04 12:09:28 +00:00
|
|
|
let [title_area, main_area, status_area] = Layout::vertical([
|
|
|
|
Constraint::Length(1),
|
|
|
|
Constraint::Min(0),
|
|
|
|
Constraint::Length(1),
|
|
|
|
])
|
|
|
|
.areas(frame.size());
|
|
|
|
let [left_area, right_area] =
|
|
|
|
Layout::horizontal([Constraint::Percentage(50), Constraint::Percentage(50)])
|
|
|
|
.areas(main_area);
|
|
|
|
|
|
|
|
frame.render_widget(Block::bordered().title("Title Bar"), title_area);
|
|
|
|
frame.render_widget(Block::bordered().title("Status Bar"), status_area);
|
|
|
|
frame.render_widget(Block::bordered().title("Left"), left_area);
|
|
|
|
frame.render_widget(Block::bordered().title("Right"), right_area);
|
2023-09-28 02:57:04 +00:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Running this example produces the following output:
|
|
|
|
|
2023-09-28 08:00:43 +00:00
|
|
|
![docsrs-layout]
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
## Text and styling
|
|
|
|
|
|
|
|
The [`Text`], [`Line`] and [`Span`] types are the building blocks of the library and are used in
|
|
|
|
many places. [`Text`] is a list of [`Line`]s and a [`Line`] is a list of [`Span`]s. A [`Span`]
|
|
|
|
is a string with a specific style.
|
|
|
|
|
|
|
|
The [`style` module] provides types that represent the various styling options. The most
|
|
|
|
important one is [`Style`] which represents the foreground and background colors and the text
|
|
|
|
attributes of a [`Span`]. The [`style` module] also provides a [`Stylize`] trait that allows
|
|
|
|
short-hand syntax to apply a style to widgets and text. See the [Styling Text] section of the
|
2023-12-04 10:49:54 +00:00
|
|
|
[Ratatui Website] for more info.
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
```rust
|
2024-08-04 12:09:28 +00:00
|
|
|
use ratatui::{
|
|
|
|
layout::{Constraint, Layout},
|
|
|
|
style::{Color, Modifier, Style, Stylize},
|
|
|
|
text::{Line, Span},
|
|
|
|
widgets::{Block, Paragraph},
|
|
|
|
Frame,
|
|
|
|
};
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
fn ui(frame: &mut Frame) {
|
2024-08-04 12:09:28 +00:00
|
|
|
let areas = Layout::vertical([Constraint::Length(1); 4]).split(frame.size());
|
|
|
|
|
|
|
|
let line = Line::from(vec![
|
|
|
|
Span::raw("Hello "),
|
|
|
|
Span::styled(
|
|
|
|
"World",
|
|
|
|
Style::new()
|
|
|
|
.fg(Color::Green)
|
|
|
|
.bg(Color::White)
|
|
|
|
.add_modifier(Modifier::BOLD),
|
|
|
|
),
|
|
|
|
"!".red().on_light_yellow().italic(),
|
|
|
|
]);
|
|
|
|
frame.render_widget(line, areas[0]);
|
|
|
|
|
|
|
|
// using the short-hand syntax and implicit conversions
|
|
|
|
let paragraph = Paragraph::new("Hello World!".red().on_white().bold());
|
|
|
|
frame.render_widget(paragraph, areas[1]);
|
|
|
|
|
|
|
|
// style the whole widget instead of just the text
|
|
|
|
let paragraph = Paragraph::new("Hello World!").style(Style::new().red().on_white());
|
|
|
|
frame.render_widget(paragraph, areas[2]);
|
|
|
|
|
|
|
|
// use the simpler short-hand syntax
|
|
|
|
let paragraph = Paragraph::new("Hello World!").blue().on_yellow();
|
|
|
|
frame.render_widget(paragraph, areas[3]);
|
2023-06-01 13:22:18 +00:00
|
|
|
}
|
|
|
|
```
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
Running this example produces the following output:
|
|
|
|
|
2023-09-28 08:00:43 +00:00
|
|
|
![docsrs-styling]
|
2023-09-28 02:57:04 +00:00
|
|
|
|
2023-12-04 10:49:54 +00:00
|
|
|
[Ratatui Website]: https://ratatui.rs/
|
|
|
|
[Installation]: https://ratatui.rs/installation/
|
|
|
|
[Rendering]: https://ratatui.rs/concepts/rendering/
|
|
|
|
[Application Patterns]: https://ratatui.rs/concepts/application-patterns/
|
|
|
|
[Hello World tutorial]: https://ratatui.rs/tutorials/hello-world/
|
|
|
|
[Backends]: https://ratatui.rs/concepts/backends/
|
|
|
|
[Widgets]: https://ratatui.rs/how-to/widgets/
|
|
|
|
[Handling Events]: https://ratatui.rs/concepts/event-handling/
|
|
|
|
[Layout]: https://ratatui.rs/how-to/layout/
|
|
|
|
[Styling Text]: https://ratatui.rs/how-to/render/style-text/
|
2024-08-21 18:35:08 +00:00
|
|
|
[templates]: https://github.com/ratatui/templates/
|
|
|
|
[Examples]: https://github.com/ratatui/ratatui/tree/main/examples/README.md
|
|
|
|
[Report a bug]: https://github.com/ratatui/ratatui/issues/new?labels=bug&projects=&template=bug_report.md
|
|
|
|
[Request a Feature]: https://github.com/ratatui/ratatui/issues/new?labels=enhancement&projects=&template=feature_request.md
|
|
|
|
[Create a Pull Request]: https://github.com/ratatui/ratatui/compare
|
2023-12-04 10:49:54 +00:00
|
|
|
[git-cliff]: https://git-cliff.org
|
2023-09-28 02:57:04 +00:00
|
|
|
[Conventional Commits]: https://www.conventionalcommits.org
|
2024-01-09 07:52:47 +00:00
|
|
|
[API Docs]: https://docs.rs/ratatui
|
2024-08-21 18:35:08 +00:00
|
|
|
[Changelog]: https://github.com/ratatui/ratatui/blob/main/CHANGELOG.md
|
|
|
|
[Contributing]: https://github.com/ratatui/ratatui/blob/main/CONTRIBUTING.md
|
|
|
|
[Breaking Changes]: https://github.com/ratatui/ratatui/blob/main/BREAKING-CHANGES.md
|
2024-02-12 09:54:05 +00:00
|
|
|
[FOSDEM 2024 talk]: https://www.youtube.com/watch?v=NU0q6NOLJ20
|
2024-08-21 18:35:08 +00:00
|
|
|
[docsrs-hello]: https://github.com/ratatui/ratatui/blob/c3c3c289b1eb8d562afb1931adb4dc719cd48490/examples/docsrs-hello.png?raw=true
|
|
|
|
[docsrs-layout]: https://github.com/ratatui/ratatui/blob/c3c3c289b1eb8d562afb1931adb4dc719cd48490/examples/docsrs-layout.png?raw=true
|
|
|
|
[docsrs-styling]: https://github.com/ratatui/ratatui/blob/c3c3c289b1eb8d562afb1931adb4dc719cd48490/examples/docsrs-styling.png?raw=true
|
2023-09-28 02:57:04 +00:00
|
|
|
[`Frame`]: terminal::Frame
|
|
|
|
[`render_widget`]: terminal::Frame::render_widget
|
|
|
|
[`Widget`]: widgets::Widget
|
|
|
|
[`Layout`]: layout::Layout
|
|
|
|
[`Text`]: text::Text
|
|
|
|
[`Line`]: text::Line
|
|
|
|
[`Span`]: text::Span
|
|
|
|
[`Style`]: style::Style
|
|
|
|
[`style` module]: style
|
|
|
|
[`Stylize`]: style::Stylize
|
|
|
|
[`Backend`]: backend::Backend
|
|
|
|
[`backend` module]: backend
|
|
|
|
[`crossterm::event`]: https://docs.rs/crossterm/latest/crossterm/event/index.html
|
2024-01-09 07:52:47 +00:00
|
|
|
[Crate]: https://crates.io/crates/ratatui
|
2023-09-28 02:57:04 +00:00
|
|
|
[Crossterm]: https://crates.io/crates/crossterm
|
|
|
|
[Termion]: https://crates.io/crates/termion
|
|
|
|
[Termwiz]: https://crates.io/crates/termwiz
|
2023-12-04 10:49:54 +00:00
|
|
|
[tui-rs]: https://crates.io/crates/tui
|
2024-08-21 18:35:08 +00:00
|
|
|
[GitHub Sponsors]: https://github.com/sponsors/ratatui
|
2024-04-26 03:27:28 +00:00
|
|
|
[Crate Badge]: https://img.shields.io/crates/v/ratatui?logo=rust&style=flat-square&logoColor=E05D44&color=E05D44
|
|
|
|
[License Badge]: https://img.shields.io/crates/l/ratatui?style=flat-square&color=1370D3
|
2024-08-21 18:35:08 +00:00
|
|
|
[CI Badge]: https://img.shields.io/github/actions/workflow/status/ratatui/ratatui/ci.yml?style=flat-square&logo=github
|
|
|
|
[CI Workflow]: https://github.com/ratatui/ratatui/actions/workflows/ci.yml
|
|
|
|
[Codecov Badge]: https://img.shields.io/codecov/c/github/ratatui/ratatui?logo=codecov&style=flat-square&token=BAQ8SOKEST&color=C43AC3&logoColor=C43AC3
|
|
|
|
[Codecov]: https://app.codecov.io/gh/ratatui/ratatui
|
|
|
|
[Deps.rs Badge]: https://deps.rs/repo/github/ratatui/ratatui/status.svg?style=flat-square
|
|
|
|
[Deps.rs]: https://deps.rs/repo/github/ratatui/ratatui
|
2024-05-28 20:23:39 +00:00
|
|
|
[Discord Badge]: https://img.shields.io/discord/1070692720437383208?label=discord&logo=discord&style=flat-square&color=1370D3&logoColor=1370D3
|
2024-01-09 07:52:47 +00:00
|
|
|
[Discord Server]: https://discord.gg/pMCEU9hNEj
|
2024-04-26 03:27:28 +00:00
|
|
|
[Docs Badge]: https://img.shields.io/docsrs/ratatui?logo=rust&style=flat-square&logoColor=E05D44
|
2024-05-28 20:23:39 +00:00
|
|
|
[Matrix Badge]: https://img.shields.io/matrix/ratatui-general%3Amatrix.org?style=flat-square&logo=matrix&label=Matrix&color=C43AC3
|
2024-01-09 07:52:47 +00:00
|
|
|
[Matrix]: https://matrix.to/#/#ratatui:matrix.org
|
2024-06-17 14:53:32 +00:00
|
|
|
[Forum Badge]: https://img.shields.io/discourse/likes?server=https%3A%2F%2Fforum.ratatui.rs&style=flat-square&logo=discourse&label=forum&color=C43AC3
|
|
|
|
[Forum]: https://forum.ratatui.rs
|
2024-08-21 18:35:08 +00:00
|
|
|
[Sponsors Badge]: https://img.shields.io/github/sponsors/ratatui?logo=github&style=flat-square&color=1370D3
|
2023-09-28 02:57:04 +00:00
|
|
|
|
|
|
|
<!-- cargo-rdme end -->
|
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
## Status of this fork
|
2023-02-15 12:55:44 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
In response to the original maintainer [**Florian Dehau**](https://github.com/fdehau)'s issue
|
|
|
|
regarding the [future of `tui-rs`](https://github.com/fdehau/tui-rs/issues/654), several members of
|
|
|
|
the community forked the project and created this crate. We look forward to continuing the work
|
|
|
|
started by Florian 🚀
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
In order to organize ourselves, we currently use a [Discord server](https://discord.gg/pMCEU9hNEj),
|
2023-08-23 16:44:39 +00:00
|
|
|
feel free to join and come chat! There is also a [Matrix](https://matrix.org/) bridge available at
|
|
|
|
[#ratatui:matrix.org](https://matrix.to/#/#ratatui:matrix.org).
|
|
|
|
|
2024-06-17 14:53:32 +00:00
|
|
|
While we do utilize Discord for coordinating, it's not essential for contributing. We have recently
|
|
|
|
launched the [Ratatui Forum][Forum], and our primary open-source workflow is centered around GitHub.
|
|
|
|
For bugs and features, we rely on GitHub. Please [Report a bug], [Request a Feature] or [Create a
|
|
|
|
Pull Request].
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
Please make sure you read the updated [contributing](./CONTRIBUTING.md) guidelines, especially if
|
|
|
|
you are interested in working on a PR or issue opened in the previous repository.
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
## Widgets
|
2023-02-13 15:10:08 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
### Built in
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
The library comes with the following
|
|
|
|
[widgets](https://docs.rs/ratatui/latest/ratatui/widgets/index.html):
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
- [BarChart](https://docs.rs/ratatui/latest/ratatui/widgets/struct.BarChart.html)
|
|
|
|
- [Block](https://docs.rs/ratatui/latest/ratatui/widgets/block/struct.Block.html)
|
|
|
|
- [Calendar](https://docs.rs/ratatui/latest/ratatui/widgets/calendar/index.html)
|
|
|
|
- [Canvas](https://docs.rs/ratatui/latest/ratatui/widgets/canvas/struct.Canvas.html) which allows
|
2023-06-08 09:00:18 +00:00
|
|
|
rendering [points, lines, shapes and a world
|
|
|
|
map](https://docs.rs/ratatui/latest/ratatui/widgets/canvas/index.html)
|
2023-09-28 02:57:04 +00:00
|
|
|
- [Chart](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Chart.html)
|
|
|
|
- [Clear](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Clear.html)
|
|
|
|
- [Gauge](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Gauge.html)
|
|
|
|
- [List](https://docs.rs/ratatui/latest/ratatui/widgets/struct.List.html)
|
|
|
|
- [Paragraph](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Paragraph.html)
|
|
|
|
- [Scrollbar](https://docs.rs/ratatui/latest/ratatui/widgets/scrollbar/struct.Scrollbar.html)
|
|
|
|
- [Sparkline](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Sparkline.html)
|
|
|
|
- [Table](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Table.html)
|
|
|
|
- [Tabs](https://docs.rs/ratatui/latest/ratatui/widgets/struct.Tabs.html)
|
2023-02-15 12:55:44 +00:00
|
|
|
|
2024-01-18 09:56:06 +00:00
|
|
|
Each widget has an associated example which can be found in the [Examples] folder. Run each example
|
|
|
|
with cargo (e.g. to run the gauge example `cargo run --example gauge`), and quit by pressing `q`.
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
You can also run all examples by running `cargo make run-examples` (requires `cargo-make` that can
|
|
|
|
be installed with `cargo install cargo-make`).
|
2019-02-10 21:35:44 +00:00
|
|
|
|
2023-02-15 12:55:44 +00:00
|
|
|
### Third-party libraries, bootstrapping templates and widgets
|
|
|
|
|
2023-09-28 02:57:04 +00:00
|
|
|
- [ansi-to-tui](https://github.com/uttarayan21/ansi-to-tui) — Convert ansi colored text to
|
2023-08-29 01:40:43 +00:00
|
|
|
`ratatui::text::Text`
|
2023-09-28 02:57:04 +00:00
|
|
|
- [color-to-tui](https://github.com/uttarayan21/color-to-tui) — Parse hex colors to
|
2023-08-29 01:40:43 +00:00
|
|
|
`ratatui::style::Color`
|
2024-08-21 18:35:08 +00:00
|
|
|
- [templates](https://github.com/ratatui/templates) — Starter templates for
|
2024-01-14 12:05:54 +00:00
|
|
|
bootstrapping a Rust TUI application with Ratatui & crossterm
|
2023-09-28 02:57:04 +00:00
|
|
|
- [tui-builder](https://github.com/jkelleyrtp/tui-builder) — Batteries-included MVC framework for
|
2023-06-08 09:00:18 +00:00
|
|
|
Tui-rs + Crossterm apps
|
2023-09-28 02:57:04 +00:00
|
|
|
- [tui-clap](https://github.com/kegesch/tui-clap-rs) — Use clap-rs together with Tui-rs
|
|
|
|
- [tui-log](https://github.com/kegesch/tui-log-rs) — Example of how to use logging with Tui-rs
|
|
|
|
- [tui-logger](https://github.com/gin66/tui-logger) — Logger and Widget for Tui-rs
|
|
|
|
- [tui-realm](https://github.com/veeso/tui-realm) — Tui-rs framework to build stateful applications
|
2023-06-08 09:00:18 +00:00
|
|
|
with a React/Elm inspired approach
|
2023-09-28 02:57:04 +00:00
|
|
|
- [tui-realm-treeview](https://github.com/veeso/tui-realm-treeview) — Treeview component for
|
2023-06-08 09:00:18 +00:00
|
|
|
Tui-realm
|
2023-10-08 06:37:09 +00:00
|
|
|
- [tui-rs-tree-widgets](https://github.com/EdJoPaTo/tui-rs-tree-widget) — Widget for tree data
|
2023-06-08 09:00:18 +00:00
|
|
|
structures.
|
2023-09-28 02:57:04 +00:00
|
|
|
- [tui-windows](https://github.com/markatk/tui-windows-rs) — Tui-rs abstraction to handle multiple
|
2023-06-08 09:00:18 +00:00
|
|
|
windows and their rendering
|
2023-10-08 06:37:09 +00:00
|
|
|
- [tui-textarea](https://github.com/rhysd/tui-textarea) — Simple yet powerful multi-line text editor
|
2023-06-08 09:00:18 +00:00
|
|
|
widget supporting several key shortcuts, undo/redo, text search, etc.
|
2023-10-08 06:37:09 +00:00
|
|
|
- [tui-input](https://github.com/sayanarijit/tui-input) — TUI input library supporting multiple
|
2023-06-08 09:00:18 +00:00
|
|
|
backends and tui-rs.
|
2023-10-08 06:37:09 +00:00
|
|
|
- [tui-term](https://github.com/a-kenji/tui-term) — A pseudoterminal widget library
|
2023-06-19 08:15:52 +00:00
|
|
|
that enables the rendering of terminal applications as ratatui widgets.
|
2023-06-01 13:22:18 +00:00
|
|
|
|
|
|
|
## Apps
|
2023-03-19 00:30:47 +00:00
|
|
|
|
2024-08-21 18:35:08 +00:00
|
|
|
Check out [awesome-ratatui](https://github.com/ratatui/awesome-ratatui) for a curated list of
|
2023-12-14 19:45:36 +00:00
|
|
|
awesome apps/libraries built with `ratatui`!
|
2023-03-19 00:30:47 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
## Alternatives
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
You might want to checkout [Cursive](https://github.com/gyscos/Cursive) for an alternative solution
|
|
|
|
to build text user interfaces in Rust.
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2023-06-08 09:00:18 +00:00
|
|
|
## Acknowledgments
|
2023-04-27 12:10:26 +00:00
|
|
|
|
2023-06-08 09:00:18 +00:00
|
|
|
Special thanks to [**Pavel Fomchenkov**](https://github.com/nawok) for his work in designing **an
|
2024-08-21 18:35:08 +00:00
|
|
|
awesome logo** for the ratatui project and ratatui organization.
|
2023-04-27 12:10:26 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
## License
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2023-06-01 13:22:18 +00:00
|
|
|
[MIT](./LICENSE)
|