ratatui-form
A Rust TUI form builder crate built on Ratatui. Create terminal forms with a fluent builder API, pre-built field types, and composite blocks for common patterns like addresses and contact info.
Note: This crate was originally developed under the name
tform, but was renamed toratatui-formto avoid confusion with the unrelated tform crate. If you were using the old name, please update your dependencies toratatui-form.
Features
- Fluent Builder API - Chain methods to build forms quickly
- Pre-built Fields - TextInput, Select (dropdown), Checkbox
- Composite Blocks - AddressBlock, ContactBlock, DateRangeBlock
- Validation - Required, Email, MinLength, MaxLength, Pattern (regex)
- Keyboard Navigation - Tab, Shift+Tab, Arrow keys
- Theming - Customizable styles with dark/light presets
- JSON Export - Serialize form data to JSON files
Installation
Add to your Cargo.toml:
[]
= "0.1.1"
Quick Start
use io;
use ;
use ;
use execute;
use ;
use ;
Field Types
TextInput
Single-line text input with cursor support.
builder
.text
.placeholder
.required
.initial_value
.validator
.done
.build
Select
Dropdown selection with keyboard navigation.
builder
.select
.option
.option
.option
.required
.initial_value
.done
.build
Checkbox
Toggle checkbox for boolean values.
builder
.checkbox
.required // Must be checked
.checked
.done
.build
Composite Blocks
Blocks are pre-configured groups of related fields.
AddressBlock
US address with street, city, state (dropdown), and ZIP code validation.
use AddressBlock;
builder
.block
.build
Creates fields: shipping_street1, shipping_street2, shipping_city, shipping_state, shipping_zip
ContactBlock
Contact information with email validation.
use ContactBlock;
builder
.block
.build
Creates fields: contact_name, contact_email, contact_phone
DateRangeBlock
Start and end date fields with YYYY-MM-DD format validation.
use DateRangeBlock;
builder
.block
.build
Creates fields: trip_start, trip_end
Validation
Built-in Validators
use ;
// Required - field cannot be empty
.validator
// Email - valid email format
.validator
// MinLength - minimum character count
.validator
// MaxLength - maximum character count
.validator
// Pattern - custom regex
.validator
// Pre-built patterns
.validator // US ZIP code
.validator // US phone number
.validator // YYYY-MM-DD
Custom Validators
Implement the Validator trait:
use Validator;
;
Keyboard Navigation
| Key | Action |
|---|---|
Tab |
Next field |
Shift+Tab |
Previous field |
Up / Down |
Navigate fields (or dropdown options when open) |
Enter |
Submit form (on button) / Select option (in dropdown) |
Space |
Toggle checkbox / Open dropdown |
Esc |
Cancel form / Close dropdown |
Left / Right |
Move cursor in text fields |
Backspace |
Delete character before cursor |
Delete |
Delete character at cursor |
Ctrl+A |
Move cursor to start |
Ctrl+E |
Move cursor to end |
Ctrl+U |
Clear field |
Theming
Using Presets
use FormStyle;
// Dark theme (default)
builder
.style
.build
// Light theme
builder
.style
.build
Custom Styles
use FormStyle;
use ;
let custom_style = new
.title
.label
.label_focused
.input
.input_focused
.error
.button
.button_focused;
builder
.style
.build
JSON Output
Forms serialize to flat JSON with field IDs as keys:
// After form.write_json("output.json")
Access form data programmatically:
let data = form.to_json;
println!;
Example
Run the included example:
License
MIT