35 releases (15 stable)
Uses new Rust 2024
| new 2.3.0 | Nov 12, 2025 |
|---|---|
| 2.0.0 | Oct 19, 2025 |
| 1.3.1 | Oct 7, 2025 |
| 1.0.5 | Jun 8, 2025 |
| 0.29.0 | Nov 1, 2024 |
#271 in Command-line interface
370 downloads per month
Used in 13 crates
(4 directly)
1MB
19K
SLoC
This crate is a part of rat-salsa.
For examples see rat-text GitHub or an extended example mdedit.rs in
rat-salsa GitHub.
Text widgets for ratatui
Features for all widgets:
-
Undo/redo
-
Sync another widget
-
Support double-width characters
-
Range based text styling
-
Wrapped text
-
Clipboard trait to link to some clipboard implementation.
There is no general solution for clipboards but this way you can integrate one of the many crates that try to do this.
-
Builtin scrolling. Uses rat-scrolled.
-
Lots of text manipulation functions.
- Line/TextRange/byte indexes supported.
- Grapheme iterator/cursor
- byte-pos to TextPosition and vice versa.
- Screen position to text position.
TextInput
Single line text input widget.
// actual text is held in the state:
state.textinput.set_value("sample");
// render
TextInput::new()
.style(Style::default().white().on_dark_gray())
.select_style(Style::default().black().on_yellow())
.render(txt_area, frame.buffer_mut(), &mut state.textinput);
// during event-handling
match text_input::handle_events(&mut state.textinput, true /*focused*/, event) {
TextOutcome::Continue => { /* no handling */ }
TextOutcome::Unchanged => { /* event recognized, but no changes */ }
TextOutcome::Changed => { /* render required */ }
TextOutcome::TextChanged => { /* actual edit */ }
}
TextArea
Textarea with tendencies to being an editor.
Uses ropey as backend and iset to manage the text-styles.
- Tab width/Tab expand to space.
- Indent/dedent selection.
- Newline starts at indent.
- Mouse selection can work word-wise.
- Decent speed even for large text (millons of lines and text-width ~100_000 tested).
- Word-wrap mode.
- Add Quotes/Braces/Brackets to selection.
// text is stored in the state
state.textarea.set_text("some text");
// render
TextArea::new()
.block(Block::bordered())
.vscroll(
Scroll::new()
.scroll_by(1)
.policy(ScrollbarPolicy::Always),
)
.hscroll(Scroll::new().policy(ScrollbarPolicy::Always))
.styles(istate.theme.textarea_style())
.text_style([
Style::new().red(),
Style::new().underlined(),
Style::new().green(),
Style::new().on_yellow(),
])
.render(layout[2], frame.buffer_mut(), &mut state.textarea);
// event-handling
match text_area::handle_events(&mut state.textarea, true /* focused */, event) {
TextOutcome::Continue => { /* no handling */ }
TextOutcome::Unchanged => { /* event recognized, but no changes */ }
TextOutcome::Changed => { /* render required */ }
TextOutcome::TextChanged => { /* actual edit */ }
}
There is an extended example mdedit.rs for TextArea in
rat-salsa
MaskedInput
Single line text input with a text-mask for allowed input.
- Numeric
- Decimal/Hexadecimal/Octal digits
- Character/Character+Digits
- Text separators
Nice to have for structured text input.
The widgets
- DateInput and
- NumberInput
use this as base.
DateInput
DateInput with chrono format patterns.
NumberInput
NumberInput with format_num_pattern backend. A bit similar to javas DecimalFormat.
LineNumbers
Line numbers widget that can be combined with TextArea.
Dependencies
~15–29MB
~406K SLoC