A simple TUI in Python, inspired by pi-tui
Project description
saber-tui
A simple TUI in Python, inspired by pi-tui.
saber-tui provides low-level building blocks for terminal UIs: a render tree,
raw terminal integration, focus and overlays, editable text controls, list
selection, animated loaders, and ANSI/Unicode-aware layout helpers.
Features
TUIandContainerrender trees with differential rendering, resize handling, overlays, focus management, and optional hardware cursor placement.ProcessTerminalfor raw terminal lifecycle, bracketed paste, resize callbacks, title/progress control, and native scrollback-friendly rendering.- Key parsing and customizable keybindings, including kitty keyboard protocol, modifyOtherKeys sequences, printable key decoding, and key repeat/release detection.
- Text layout components:
Text,TruncatedText,Box, andSpacer. - Interactive controls: single-line
Input, multilineEditor,SelectList,SettingsList,Loader, andCancellableLoader. - Editor behavior for command-style input: history, undo, kill/yank, word movement, paste markers, submit/change callbacks, and configurable padding.
- Autocomplete primitives and providers:
AutocompleteItem,SlashCommand,AutocompleteSuggestions,CompletionResult, andCombinedAutocompleteProviderwith command and path suggestions. - ANSI-aware wrapping, slicing, truncation, background application, grapheme handling, fuzzy matching, and terminal-output normalization utilities.
Usage
from saber_tui import ProcessTerminal, TUI, matches_key
from saber_tui.components import Editor, Text
terminal = ProcessTerminal()
tui = TUI(terminal)
tui.add_child(Text("Welcome"))
editor = Editor(tui)
editor.on_submit = lambda value: tui.add_child(Text(f"You said: {value}"))
tui.add_child(editor)
tui.set_focus(editor)
def exit_on_ctrl_c(data: str):
if matches_key(data, "ctrl+c"):
tui.stop()
raise SystemExit(0)
return None
tui.add_input_listener(exit_on_ctrl_c)
tui.start()
For settings-style UIs, use SettingsList with value cycling, fuzzy search, and
optional submenus:
from saber_tui.components import SettingItem, SettingsList, SettingsListOptions
settings = SettingsList(
[
SettingItem("theme", "Theme", "dark", values=["dark", "light", "system"]),
SettingItem("streaming", "Streaming", "on", values=["on", "off"]),
],
max_visible=8,
on_change=lambda setting_id, value: print(f"{setting_id} = {value}"),
options=SettingsListOptions(enable_search=True),
)
Run the examples:
uv run python examples/chat.py
uv run python examples/showcase.py
Development
uv run pytest
uv run ruff check
uv run ruff format --check
uvx ty check
Current Scope
Available in this slice:
- Core
TUI,Container, overlays, focus, and differential rendering. ProcessTerminal- ANSI and Unicode width utilities.
StdinBufferwith bracketed paste handling.- Key parsing and keybindings.
Text,TruncatedText,Box,Spacer,Input,Editor,SelectList,SettingsList,Loader, andCancellableLoader.- Slash-command and file/path autocomplete support.
Outside this slice:
- Markdown rendering.
- Terminal image protocols.
- Full Windows-specific VT input support.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file saber_tui-0.2.0.tar.gz.
File metadata
- Download URL: saber_tui-0.2.0.tar.gz
- Upload date:
- Size: 138.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbeb91eb368112702345924218d08f3169ae8e9004f955df1bf8112028c31c15
|
|
| MD5 |
3a5a733eb55f823d65f821bc2690a94e
|
|
| BLAKE2b-256 |
2d515334f3cd961eea49de535ea7aa8779b7d6bcc176a38281dd1e4ad10124a4
|
File details
Details for the file saber_tui-0.2.0-py3-none-any.whl.
File metadata
- Download URL: saber_tui-0.2.0-py3-none-any.whl
- Upload date:
- Size: 54.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b4a5e2a20ea7a773c266bda5c78257b10cb8350d58562f01bc66c4159cb916e
|
|
| MD5 |
e45f0f1e7c51618181e5c2437c352da2
|
|
| BLAKE2b-256 |
46511f37f21eec76cb8166a562e05c2c580a03c86afe9599275154184c0fd9c7
|