tui_kit/lib.rs
1//! `tui-kit` — reusable TUI theme, widget frames, and layout helpers.
2//!
3//! Built on top of [ratatui](https://github.com/ratatui-org/ratatui).
4//! Designed to be shared across multiple terminal-UI projects that follow
5//! the same visual design language.
6//!
7//! ## Modules
8//!
9//! | Module | Contents |
10//! |------------|----------|
11//! | [`theme`] | [`Theme`] struct — the full color/style palette |
12//! | [`block`] | [`block::panel_block`], [`block::popup_block`], [`block::widget_title`], [`block::focusable_block`] |
13//! | [`footer`] | [`render_footer`], [`render_footer_with_app`], [`keybind_spans`] — keybind bar |
14//! | [`tabs`] | [`tabs::tab_line`] — horizontal tab-bar line for block titles |
15//! | [`popup`] | [`popup::centered_popup`] — centered overlay area + Clear |
16//! | [`leader`] | [`render_leader_bar`] — vim-style leader key popup |
17//! | [`mouse`] | [`mouse_hit`] — hit-test a click against a widget [`Rect`] |
18//! | [`toast`] | [`render_toasts`] — stacked notification toasts |
19//! | [`list`] | [`list::render_list`] — scrollable focusable list |
20//! | [`tree`] | [`tree::render_tree`] — foldable hierarchical tree |
21//! | [`form`] | [`render_form`] — multi-field input form |
22//! | [`kv`] | [`kv::render_kv_table`] — two-column key/value table |
23//!
24//! ## Keybind bar convention
25//!
26//! Every project should show a footer keybind bar using [`render_footer`].
27//! The visual format is identical across all projects:
28//!
29//! ```text
30//! Navigate: j/k | Open: Enter | Leader: space | Quit: q
31//! ```
32//!
33//! Keys are styled with [`Theme::shortcut_key`] (yellow), actions and
34//! separators with [`Theme::hint`] (dark gray).
35//!
36//! Build pairs contextually based on the active UI layer (popup vs main screen):
37//!
38//! ```rust
39//! let mut pairs: Vec<(&str, &str)> = Vec::new();
40//! if some_popup_open {
41//! pairs.push(("Esc", "close"));
42//! pairs.push(("Enter", "confirm"));
43//! } else {
44//! pairs.push(("j/k", "navigate"));
45//! pairs.push(("space", "leader"));
46//! pairs.push(("q", "quit"));
47//! }
48//! render_footer(f, footer_area, &pairs, &theme);
49//! ```
50
51pub mod block;
52pub mod footer;
53pub mod form;
54pub mod kv;
55pub mod leader;
56pub mod list;
57pub mod log;
58pub mod mouse;
59pub mod picker;
60pub mod popup;
61pub mod tabs;
62pub mod theme;
63pub mod toast;
64pub mod tree;
65pub mod wizard;
66
67pub use block::render_scrollbar;
68pub use footer::{keybind_spans, render_footer, render_footer_with_app};
69pub use mouse::{list_item_at, mouse_hit, paragraph_line_at};
70pub use form::{
71 FieldInput, FormEvent, FormField, FormState, FormStyle,
72 error_lines, input_row, label_prefix, render_form, render_form_with, select_row, wrap_chars,
73};
74pub use kv::KvRow;
75pub use leader::{LeaderNode, LeaderResult, LeaderState, render_leader_bar};
76pub use list::{ListItem, ListState};
77pub use log::{LogEntry, LogLevel};
78pub use picker::{PickerItem, PickerState, render_picker};
79pub use theme::Theme;
80pub use toast::{Toast, ToastLevel, render_toasts};
81pub use tree::{TreeRow, TreeState, render_tree};
82pub use wizard::{ArrayEditSession, ArrayState, WizardEvent, WizardStep, WizardStepKind, WizardState, render_wizard};