A developer's TUI suite for Textual.
The themes, widgets, modals, icons, and design rules extracted from building ltui β and now powering its whole family (jtui, sctui, same repo) β everything a fast, clean, rice-friendly terminal app needs, minus the app.
| module | contents |
|---|---|
ricekit.themes |
five themes β mocha, OLED-black void, monochrome onyx, clear (transparent: your terminal's blur shows through), system (your terminal's own ANSI palette) β all sharing one $kit-* CSS variable contract, with the scrollbar/selection fixes baked in |
ricekit.palette |
swappable chrome palette (palette.text, .dim, .blue, β¦) that flips to terminal ANSI colors under the system theme |
ricekit.app |
KitApp β registers the themes, flips ansi_color for transparent themes, injects CSS variables, replaces the palette's theme command with a live-preview picker |
ricekit.widgets |
NavList (vim keys, quiet cursor), Splitter (drag-to-resize with persistence hook, double-click reset), KitScroll, pop_in (the one sanctioned animation) |
ricekit.modals |
PickerModal (generic chooser), ThemeModal (restyles the app live as you scroll), HelpModal (keybinding cheatsheet from plain data) |
ricekit.icons |
curated nerd-font icons as \uXXXX escapes + unicode state glyphs (β β β β β β) + mini bar gauges |
ricekit.fx |
text effects β the letter wave (Wave + wave_markup: Gheat β gHeat β β¦) and braille spinner frames, driven by one cheap shared ticker |
ricekit.storage |
AppDirs β XDG state/cache/config with merge-on-save state and chmod-600 secrets |
DESIGN.md |
the philosophy: cache-first speed, shape language, color roles, motion rules β and the appendix of Textual sharp edges that each cost a day to find |
uv tool install git+https://github.com/Gheat1/ricekit
ricekit-galleryThe gallery demos the palette, icons, glyphs, widgets, and modals β cycle
themes with t, live-preview every Textual theme with ctrl+p, drag the
divider, press ?.
uv add git+https://github.com/Gheat1/ricekit # or pip install git+β¦from textual.binding import Binding
from textual.widgets import Footer
from ricekit import KitApp, icons, palette
from ricekit.storage import AppDirs
from ricekit.widgets import NavList
DIRS = AppDirs("myapp")
class MyApp(KitApp):
BINDINGS = [Binding("t", "cycle_kit_theme", "theme")]
CSS = """
NavList { border: round $kit-border; }
NavList:focus { border: round $kit-border-focus; }
"""
def compose(self):
yield NavList(id="items")
yield Footer()
def on_mount(self):
self.init_kit(theme=DIRS.load_state().get("theme"))
def on_kit_theme_changed(self):
if not self.kit_theme_previewing:
DIRS.save_state({"theme": self.theme})That's a themed, transparent-capable, live-previewing app in ~25 lines.
Read DESIGN.md before building anything serious β especially
the sharp-edges table.
- the tracker TUI suite β ltui (Linear), jtui (Jira), sctui (Shortcut); where all of this came from, now backed by Pantheon
- NaviTui β an animated terminal player for Navidrome, cover art and all
- yours next?