Crates.io | bevy_ratatui |
lib.rs | bevy_ratatui |
version | 0.9.2 |
created_at | 2024-02-27 06:44:49.880545+00 |
updated_at | 2025-05-27 02:44:52.925526+00 |
description | A Bevy plugin for building terminal user interfaces with Ratatui |
homepage | |
repository | https://github.com/cxreiff/bevy_ratatui |
max_upload_size | |
id | 1154604 |
size | 246,665 |
Set up a Ratatui application, using bevy to manage the update loop, handle input events, draw to the buffer, etcetera.
cargo add bevy_ratatui ratatui crossterm
use bevy::prelude::*;
use bevy::app::ScheduleRunnerPlugin;
use bevy_ratatui::{RatatuiContext, RatatuiPlugins};
fn main() {
let frame_time = std::time::Duration::from_secs_f32(1. / 60.);
App::new()
.add_plugins((
MinimalPlugins.set(ScheduleRunnerPlugin::run_loop(frame_time)),
RatatuiPlugins::default(),
))
.add_systems(Update, draw_system)
.run();
}
fn draw_system(mut context: ResMut<RatatuiContext>) -> Result {
context.draw(|frame| {
let text = ratatui::text::Text::raw("hello world");
frame.render_widget(text, frame.area());
})?;
Ok(())
}
To read user input, you can listen for the crossterm input events forwarded by this crate:
use bevy::app::AppExit;
use bevy_ratatui::event::KeyEvent;
use crossterm::event::KeyCode;
fn input_system(mut events: EventReader<KeyEvent>, mut exit: EventWriter<AppExit>) {
for event in events.read() {
if let KeyCode::Char('q') = event.code {
exit.send_default();
}
}
}
...or use the enable_input_forwarding
option in RatatuiPlugins
which will
map crossterm input events to normal bevy input events.
See the demo example for the code and more information.
windowed
: Render your ratatui application in a window instead of the
terminal buffer. Reference the demo
example for how to set up a Bevy
project to handle either mode.serde
: Passthrough feature for serializing crossterm types.There are also a handful of features relating to running Bevy in no_std
mode.
bevy | bevy_ratatui |
---|---|
0.16 | 0.9 |
0.15 | 0.7 |
0.14 | 0.6 |
0.13 | 0.5 |
Copyright (c) Josh McKinney Copyright (c) Cooper Jax Reiff
This project is licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.