- mouse-mixin class with on-mouse-down/up/move/scroll handler slots - handle-mouse-event dispatches to the right handler by event type - hit-test finds deepest component at (x,y) coordinates - selection struct + get-selection + copy-to-clipboard - SGR mouse parsing already existed in input system (mouse-event struct, parse-sgr-mouse function, CSI dispatch in %read-escape-sequence) - 3 tests, 100% passing
cl-tty — Reusable Common Lisp Terminal UI Framework
cl-tty
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-tty 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-tty application runs remotely — same code, same components, accessible from anywhere.
Architecture
``` Application code (any CL project) └── cl-tty (layout, components, theme, events, dialogs) └── Yoga (Flexbox layout — C library via FFI) └── croatoan (ncurses terminal rendering) ```
cl-tty 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