Skip to main content

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

  • TUI and Container render trees with differential rendering, resize handling, overlays, focus management, and optional hardware cursor placement.
  • ProcessTerminal for raw terminal lifecycle, bracketed paste, resize callbacks, title/progress control, native scrollback-friendly rendering, and automatic POSIX/native Windows backend selection.
  • 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, and Spacer.
  • Streaming-safe Markdown with headings, inline styles, fenced/highlighted code, nested and task lists, blockquotes, tables, links, HTML text, and ANSI-aware wrapping.
  • Interactive controls: single-line Input, multiline Editor, SelectList, SettingsList, Loader, and CancellableLoader.
  • 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, and CombinedAutocompleteProvider with 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()

Markdown can be updated as assistant output streams in. Incomplete closing code fences are stabilized so the block does not flicker when the last backtick arrives:

from saber_tui.components import Markdown, MarkdownTheme

markdown = Markdown("", padding_x=1, theme=MarkdownTheme())
tui.add_child(markdown)

# For each streamed chunk:
markdown.append_text(chunk)
tui.request_render()

Use MarkdownTheme to supply ANSI style functions, DefaultTextStyle for a message-wide foreground/background and decorations, and MarkdownOptions for source marker/escape preservation or explicit OSC 8 hyperlink behavior.

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

The chat demo renders its streamed assistant response through Markdown. The component gallery includes a dedicated Markdown page; press r there to replay the stream and watch inline styles, lists, code fences, blockquotes, and tables appear incrementally.

ProcessTerminal supports POSIX terminals and native Windows consoles with virtual terminal processing, including Windows Terminal and recent PowerShell or cmd sessions. WSL uses the POSIX backend.

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 on POSIX and native Windows VT-capable consoles.
  • ANSI and Unicode width utilities.
  • StdinBuffer with bracketed paste handling.
  • Key parsing and keybindings.
  • Text, TruncatedText, Box, Spacer, Markdown, Input, Editor, SelectList, SettingsList, Loader, and CancellableLoader.
  • Slash-command and file/path autocomplete support.

Outside this slice:

  • Terminal image protocols.
  • Legacy Windows consoles without virtual terminal processing.

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

saber_tui-0.5.0.tar.gz (155.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

saber_tui-0.5.0-py3-none-any.whl (65.2 kB view details)

Uploaded Python 3

File details

Details for the file saber_tui-0.5.0.tar.gz.

File metadata

  • Download URL: saber_tui-0.5.0.tar.gz
  • Upload date:
  • Size: 155.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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

Hashes for saber_tui-0.5.0.tar.gz
Algorithm Hash digest
SHA256 721fc6fde7067b32affaa019ecf5be9a4f28f5a2289837b2c767dea06bda25cb
MD5 60da1cd9b05686d477b05a4a7cb53ab5
BLAKE2b-256 7df362a88e1815cd9a917c689160b6e12596bb76cc173bf68785d0f0a74ceb06

See more details on using hashes here.

File details

Details for the file saber_tui-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: saber_tui-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 65.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","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

Hashes for saber_tui-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 22a17e3f2fb2802f8da7911acd2f77fd4702969b1fb7d56b7c80681e393a92f5
MD5 10ba342689ea1f2e59924c1bf42baf50
BLAKE2b-256 dc0a459dc360c6191f4cc1a1210b994380db52c97be3bd0e3be7b8d74ad8db5a

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page