ScrollBox: - Container with vertical/horizontal scroll, viewport culling - Scroll offset (:scroll-y, :scroll-x) with clamp to valid bounds - Scrollbars rendered when content exceeds viewport - Sticky scroll (auto-scroll to bottom on content change) - Component protocol: component-children, component-layout-node TabBar: - Horizontal tab row with active/inactive styling - tab-bar-next/prev (wraps around), tab-bar-select, tab-bar-handle-key - Tab title rendering with overflow truncation (ellipsis) - Component protocol: component-layout-node 26 scrollbox+tabbar tests, 100% GREEN: 171 total (27 backend + 58 box + 60 input + 26 scrollbox) Review fixes applied: - Removed duplicate definitions (org per-function blocks are prose-only) - Fixed ASDF test path (../../tests/...) - Version bumped to 0.6.0 - Added clamp-scroll export - Added tab-bar-next/prev/select/handle-key tests - Added scroll clamp boundary tests
cl-tui — Reusable Common Lisp Terminal UI Framework
cl-tui
A reusable Common Lisp framework for building rich terminal user interfaces. Built on croatoan (ncurses) with Yoga for Flexbox layout. Provides a component tree model with dirty-tracking, incremental rendering, layered keybinding, theme engine, and full mouse support — the primitives needed to match the TUI quality of Claude Code and OpenCode from Common Lisp.
Why
Common Lisp has no reusable terminal UI framework at the level of Python's Rich/prompt_toolkit or Go's Bubble Tea. Every CL project that wants a terminal UI either builds ncurses from scratch or uses a text-only REPL. cl-tui fills that gap — a component library with Flexbox layout, semantic theming, layered keybinding, and full mouse support. Build a terminal UI once, reuse it everywhere.
Terminal UIs also work over SSH. A Qt or browser-based UI requires a local display. A cl-tui application runs remotely — same code, same components, accessible from anywhere.
Architecture
``` Application code (any CL project) └── cl-tui (layout, components, theme, events, dialogs) └── Yoga (Flexbox layout — C library via FFI) └── croatoan (ncurses terminal rendering) ```
cl-tui depends only on croatoan and Yoga. It is not tied to any application.
Dependencies
- Common Lisp (SBCL tested)
- croatoan — ncurses binding for terminal rendering
- Yoga — Flexbox layout engine (C library, loaded via CFFI)
- Quicklisp libraries as needed (ironclad for hashing, bordeaux-threads)
Status
v0.1.0 — Layout engine (in progress)
See docs/ROADMAP.org for the full release plan.
License
TBD