Loading...
Loading...
Comprehensive guide for the ratkit Rust TUI component library built on ratatui 0.29, including feature flags, APIs, and implementation patterns. Use when building, debugging, or extending ratkit applications and examples.
npx skill4agent add alpha-innovation-labs/ratkit ratkitComprehensive Rust TUI component library built on ratatui 0.29, providing 21 feature-gated modules (primitives, widgets, services) for building rich terminal applications.
src/buttonpanemarkdown-previewfeatures = ["button", "dialog"]tree-viewwidget-eventrepo-watcherfile-watchergit-watcherjustjust buildjust testjust checkjust demo--features--features markdown-previewuse ratkit::primitives::button::Buttonuse ratkit::widgets::markdown_preview::MarkdownWidgetcheck_for_changes()just checkexamples/crates/ratkit/examples/examples/cargo run --example button_button_demo --features buttonon_eventon_drawexamples/markdown_preview_markdown_preview_demo.rsjustfilejust demojust demo-mdjust demo-md-smalljust demo-termCargo.tomlcargo build --features "button,pane,dialog"cargo build --all-featuresjust check# Cargo.toml - enable specific features
[dependencies]
ratkit = { version = "0.2.12", features = ["button", "dialog", "pane"] }use ratkit::prelude::*;
use ratatui::Frame;
struct MyApp;
impl CoordinatorApp for MyApp {
fn on_event(&mut self, event: CoordinatorEvent) -> LayoutResult<CoordinatorAction> {
match event {
CoordinatorEvent::Keyboard(keyboard) => {
if keyboard.is_escape() {
return Ok(CoordinatorAction::Quit);
}
}
_ => {}
}
Ok(CoordinatorAction::Continue)
}
fn on_draw(&mut self, frame: &mut Frame) {
// Render your UI here
}
}
fn main() -> std::io::Result<()> {
let app = MyApp;
run(app, RunnerConfig::default())
}src/primitives/src/widgets/src/services/src/core/src/primitives/buttonpanedialogtoaststatuslinescrollmenu-barwidget-eventresizable-gridtree-viewwidget-eventwidget-eventtermtuinew()with_*WidgetEventMenuBar::render_with_offset(frame, area, left_offset)area.width - left_offsetself.areaexamples/menu-bar_menu_bar_demo.rssrc/widgets/markdown-previewcode-diffai-chathotkey-footerfile-system-treetheme-picker| Widget | Dependencies |
|---|---|
| ai-chat | reqwest, serde, serde_json |
| markdown-preview | pulldown-cmark, syntect, syntect-tui, notify, arboard, dirs |
| code-diff | similar |
| file-system-tree | devicons |
file-system-treedevicons::icon_for_file(...).colorratatui::style::Color::Rgbsrc/services/file-watchergit-watcherrepo-watcherhotkey-servicenotifyuse ratkit::prelude::*;CoordinatorAppon_event()on_draw()run(app, RunnerConfig::default())on_event()on_draw()on_layout_changed()Arc<RwLock<>>src/coordinator.rssrc/runner_helper.rsuse ratkit::{run, run_with_diagnostics};CoordinatorAppRunnerConfig::default()run(app, config)run_with_diagnostics(app, config)run()run_with_diagnostics()RunnerConfigsrc/runner_helper.rsuse ratkit::Element;Elementid()on_render()on_keyboard()on_mouse()ElementMetadataid()on_render()on_keyboard()on_mouse()on_focus_gain()on_focus_loss()on_tick()truesrc/registry.rsfeatures = ["button"]use ratkit::Button;Button::new("Label")update_hover(x, y)is_clicked(x, y)render_with_title()new()normal_style()hover_style()update_hover()is_clicked()src/primitives/button/widget.rsfeatures = ["pane"]use ratkit::Pane;Pane::new("Title")with_icon()with_padding()border_style()new()with_icon()with_padding()with_uniform_padding()border_style()src/primitives/pane/mod.rsfeatures = ["dialog"]use ratkit::primitives::dialog::{Dialog, DialogWidget, DialogAction, DialogActionsLayout, DialogWrap, DialogShadow, DialogModalMode};Dialog::new(title, message)Dialog::confirm(...).actions_layout(...).message_alignment(...).content_padding(...).wrap_mode(...).shadow(...).overlay(...).buttons(...).default_selection(...).next_keys(...).previous_keys(...).confirm_keys(...).cancel_keys(...)dialog.handle_key_event(...)DialogActionDialogWidget::new(&mut dialog)actions_layout()actions_alignment()message_alignment()content_padding()wrap_mode()hide_footer()footer()footer_style()shadow()overlay()modal_mode()body_renderer()handle_key_event()handle_mouse_confirm()blocks_background_events()TabTab.buttons(vec![])src/primitives/dialog/.actions_layout(DialogActionsLayout::Vertical).actions_layout(DialogActionsLayout::Horizontal).buttons(vec![])DialogBodyRenderer.body_renderer(Box::new(...)).modal_mode(DialogModalMode::Blocking)blocks_background_events().next_keys(...).previous_keys(...)TabTabfeatures = ["toast"]use ratkit::{ToastManager, ToastLevel};ToastManager::new().success().error().info().warning()cleanup()render_toasts()ToastManager::new().add().success().error().cleanup()cleanup()src/primitives/toast/features = ["menu-bar"]widget-eventuse ratkit::primitives::menu_bar::{MenuBar, MenuItem};MenuBar::new(vec![MenuItem::new("File", 0), ...]).with_selected(index)update_hover(x, y)handle_click(x, y)handle_mouse(x, y)render()render_with_offset()new()with_selected()update_hover()handle_click()handle_mouse()selected()render_with_offset()src/primitives/menu_bar/menu_bar.rsexamples/menu-bar_menu_bar_demo.rsfeatures = ["tree-view"]use ratkit::{TreeNode, TreeView, TreeViewState, TreeNavigator};TreeNodeTreeView::new(nodes)TreeViewState::new()TreeNavigatorTreeNode::new()TreeView::new()TreeViewState::new()TreeNavigator::new()src/primitives/tree_view/features = ["markdown-preview"]use ratkit::widgets::markdown_preview::{MarkdownWidget, ScrollState, SourceState, ...};MarkdownWidget::new(content, scroll, source, ...)handle_key()new()handle_key()handle_mouse().show_toc().toggle_toc().with_frontmatter_collapsed()set_frontmatter_collapsed().show_scrollbar()0SyntaxHighlightersrc/widgets/markdown_preview/widgets/markdown_widget/just demo-mdjust demo-md-smalltarget/debug/examples/markdown_preview_markdown_preview_demo --startup-probeRATKIT_MD_DEMO_FILE=...MARKDOWN_DEMO_READY_MS=<ms>examples/markdown_preview_markdown_preview_demo.rsjustfiles/utilities/demo-md.justfeatures = ["file-system-tree"]use ratkit::widgets::file_system_tree::{FileSystemTree, FileSystemTreeState, FileSystemTreeConfig};FileSystemTree::new(root_path)with_config(...)FileSystemTreeStatehandle_navigation_key(...)handle_filter_key(...)new()with_config()handle_navigation_key()enter_filter_mode()expand_selected()collapse_selected()src/widgets/file_system_tree/widget.rssrc/widgets/file_system_tree/config.rssrc/widgets/file_system_tree/state.rsfeatures = ["file-watcher"]use ratkit::services::file_watcher::FileWatcher;FileWatcher::for_file()FileWatcher::for_directory()watch(path)check_for_changes()get_changed_paths()for_file()for_directory()watch()check_for_changes()get_changed_paths()get_changed_paths()src/services/file_watcher/features = ["hotkey-service"]use ratkit::services::hotkey_service::{Hotkey, HotkeyRegistry, HotkeyScope};HotkeyRegistry::new()Hotkey::new(key, description).scope(scope)set_active_scope()lookup(key, scope)HotkeyRegistry::new()register()lookup()set_active_scope()&'static strsrc/services/hotkey_service/| Component | Key APIs |
|---|---|
| CoordinatorApp | |
| run | |
| Element | |
| RunnerConfig | |
| Primitive | Key APIs |
|---|---|
| Button | |
| Pane | |
| Dialog | |
| Toast | |
| TreeView | |
| Scroll | |
| Service | Key APIs |
|---|---|
| FileWatcher | |
| GitWatcher | |
| RepoWatcher | |
| HotkeyRegistry | |
tree-viewwidget-eventrepo-watcherfile-watchergit-watchertruefalsecheck_for_changes()--features markdown-previewjust demojust demo-*MouseEventKind::Movedlast_move_processed.elapsed() < Duration::from_millis(24)CoordinatorAction::ContinueRedrawMarkdownEvent::TocHoverChanged { .. }RunnerConfig { tick_rate: Duration::from_millis(250), .. }ScrollStateSourceStateCacheStateCollapseStateExpandableStateGitStatsStateVimStateSelectionStateDoubleClickStateon_drawon_drawContinuelast_move_processed: InstantContinueexamples/just helpjust buildcargo build -p ratkit --all-featuresjust test