Expand description
§bubbletea-widgets
A Rust port of the Go library charmbracelet/bubbles, providing reusable TUI components for building terminal applications with bubbletea-rs.
§Overview
bubbletea-widgets offers a collection of common terminal UI components that can be easily integrated
into bubbletea-rs applications. Each component follows the Elm Architecture pattern with
init()
, update()
, and view()
methods, providing a consistent and predictable API
for building complex terminal user interfaces.
§Features
- Type-safe key bindings with comprehensive key combination support
- Focus management system for keyboard navigation between components
- Responsive design with automatic width/height handling
- Theming support through customizable styles
- Go compatibility for easy migration from charmbracelet/bubbles
- Performance optimized with efficient rendering and state management
§Components
- Input Components:
TextInput
,TextArea
,FilePicker
- Display Components:
List
,Table
,Progress
,Spinner
,Help
- Utility Components:
Cursor
,Viewport
,Paginator
,Timer
,Stopwatch
§Focus Management
All components implement the Component
trait which provides standardized focus management:
use bubbletea_widgets::prelude::*;
use bubbletea_rs::Cmd;
fn handle_focus<T: Component>(component: &mut T) {
let _cmd: Option<Cmd> = component.focus();
assert!(component.focused());
component.blur();
assert!(!component.focused());
}
// Example with a text area (implements Component trait)
let mut textarea = textarea_new();
handle_focus(&mut textarea);
§Key Bindings
Components use the type-safe key binding system from the key
module:
use bubbletea_widgets::key::{Binding, KeyMap};
use crossterm::event::{KeyCode, KeyModifiers};
// Create key bindings
let confirm = Binding::new(vec![KeyCode::Enter])
.with_help("enter", "Confirm selection");
let save = Binding::new(vec![(KeyCode::Char('s'), KeyModifiers::CONTROL)])
.with_help("ctrl+s", "Save file");
// Implement KeyMap for your component
struct MyKeyMap {
confirm: Binding,
save: Binding,
}
impl KeyMap for MyKeyMap {
fn short_help(&self) -> Vec<&Binding> {
vec![&self.confirm, &self.save]
}
fn full_help(&self) -> Vec<Vec<&Binding>> {
vec![
vec![&self.confirm],
vec![&self.save],
]
}
}
§Integration with bubbletea-rs
Components are designed to work seamlessly with bubbletea-rs models:
use bubbletea_widgets::prelude::*;
use bubbletea_rs::{Model, Cmd, Msg};
struct App {
input: TextInput,
}
impl Model for App {
fn init() -> (Self, Option<Cmd>) {
let mut input = textinput_new();
let focus_cmd = input.focus();
(Self { input }, Some(focus_cmd))
}
fn update(&mut self, msg: Msg) -> Option<Cmd> {
// Handle component updates
if let Some(cmd) = self.input.update(msg) {
return Some(cmd);
}
// Handle other messages
match msg {
// Your app-specific message handling
_ => None,
}
}
fn view(&self) -> String {
format!("Enter text: {}\n{}", self.input.view(), "Press Ctrl+C to quit")
}
}
§Quick Start
Add bubbletea-widgets to your Cargo.toml
:
[dependencies]
bubbletea-widgets = "0.1.0"
bubbletea-rs = "0.0.7"
crossterm = "0.27"
For convenience, you can import the prelude:
use bubbletea_widgets::prelude::*;
§Component Overview
Component | Description | Use Case |
---|---|---|
TextInput | Single-line text input | Forms, search boxes |
TextArea | Multi-line text editor | Code editing, long text |
List | Scrollable item list | Menus, file browsers |
Table | Tabular data display | Data tables, spreadsheets |
Progress | Progress bar with animation | Loading indicators |
Spinner | Animated loading spinner | Background operations |
Help | Key binding help display | User guidance |
FilePicker | File system navigator | File selection |
Timer | Countdown timer | Time-based operations |
Stopwatch | Elapsed time tracker | Performance monitoring |
Re-exports§
pub use cursor::Model as Cursor;
pub use filepicker::Model as FilePicker;
pub use help::Model as HelpModel;
pub use key::matches;
pub use key::matches_binding;
pub use key::new_binding;
pub use key::with_disabled;
pub use key::with_help;
pub use key::with_keys;
pub use key::Binding;
pub use key::Help as KeyHelp;
pub use key::KeyMap;
pub use key::KeyPress;
pub use list::Model as List;
pub use list::DefaultDelegate as ListDefaultDelegate;
pub use list::DefaultItem as ListDefaultItem;
pub use list::DefaultItemStyles as ListDefaultItemStyles;
pub use list::FilterState;
pub use list::FilterStateInfo;
pub use list::ListKeyMap;
pub use list::ListStyles;
pub use paginator::Model as Paginator;
pub use progress::Model as Progress;
pub use spinner::new as spinner_new;
pub use spinner::with_spinner;
pub use spinner::with_style;
pub use spinner::Model as Spinner;
pub use spinner::SpinnerOption;
pub use spinner::TickMsg as SpinnerTickMsg;
pub use spinner::DOT;
pub use spinner::ELLIPSIS;
pub use spinner::GLOBE;
pub use spinner::HAMBURGER;
pub use spinner::JUMP;
pub use spinner::LINE;
pub use spinner::METER;
pub use spinner::MINI_DOT;
pub use spinner::MONKEY;
pub use spinner::MOON;
pub use spinner::POINTS;
pub use spinner::PULSE;
pub use stopwatch::Model as Stopwatch;
pub use table::Model as Table;
pub use textarea::default_styles as textarea_default_styles;
pub use textarea::new as textarea_new;
pub use textarea::LineInfo;
pub use textarea::Model as TextArea;
pub use textarea::PasteErrMsg as TextAreaPasteErrMsg;
pub use textarea::PasteMsg as TextAreaPasteMsg;
pub use textinput::blink;
pub use textinput::default_key_map as textinput_default_key_map;
pub use textinput::new as textinput_new;
pub use textinput::paste;
pub use textinput::EchoMode;
pub use textinput::KeyMap as TextInputKeyMap;
pub use textinput::Model as TextInput;
pub use textinput::PasteErrMsg;
pub use textinput::PasteMsg;
pub use textinput::ValidateFunc;
pub use timer::new as timer_new;
pub use timer::new_with_interval as timer_new_with_interval;
pub use timer::Model as Timer;
pub use timer::StartStopMsg as TimerStartStopMsg;
pub use timer::TickMsg as TimerTickMsg;
pub use timer::TimeoutMsg as TimerTimeoutMsg;
pub use viewport::Model as Viewport;
Modules§
- cursor
- Cursor component for Bubble Tea-style text inputs.
- filepicker
- File picker component for browsing and selecting files in terminal applications.
- help
- A help component for bubbletea-rs, ported from the Go version.
- key
- Key binding component for managing keybindings, ported from the Go version.
- list
- List component with filtering, pagination, contextual help, and customizable rendering.
- paginator
- A paginator component for bubbletea-rs, ported from the Go version.
- prelude
- Prelude module for convenient imports.
- progress
- Progress component for Bubble Tea applications.
- spinner
- Spinner component for Bubble Tea applications.
- stopwatch
- High-precision stopwatch component for measuring elapsed time in Bubble Tea applications.
- table
- Interactive data table component with navigation, selection, and scrolling capabilities.
- textarea
- Textarea component for Bubble Tea applications.
- textinput
- Text input component for Bubble Tea applications.
- timer
- Timer component for Bubble Tea applications.
- viewport
- Scrollable viewport component for displaying large content in terminal applications.
Traits§
- Component
- Core trait for components that support focus management.