# cl-tty — Terminal UI Framework for Common Lisp Pure CL terminal UI framework. No ncurses, no FFI, no external dependencies. ```lisp (ql:quickload :cl-tty) ``` ## Quick start ```lisp ;; Create a modern terminal backend (let ((backend (make-instance 'cl-tty.backend:modern-backend))) (cl-tty.backend:initialize-backend backend) ;; Backend is ready — write text, draw boxes, handle input (cl-tty.backend:shutdown-backend backend)) ``` ## Architecture Two backends, one protocol: - **modern-backend** — truecolor 24-bit, OSC 8 hyperlinks, DECICM sync, SGR mouse, kitty keyboard, bold/italic/underline, box-drawing chars - **simple-backend** — ASCII art, no color, universal compatibility Everything is pure escape sequences (no curses, no terminfo, no FFI). ## Components | Component | What it does | Version | |-------------|------------------------------------------------------|---------| | Box | Bordered container with background, title | v0.2.0 | | Text | Styled text with word-wrap, spans | v0.2.0 | | ScrollBox | Scrollable viewport with scrollbars | v0.6.0 | | TabBar | Horizontal tab navigation | v0.6.0 | | Select | Dropdown with fuzzy filter, category headers | v0.7.0 | | TextInput | Single-line text input with readline keybindings | v0.5.0 | | TextArea | Multi-line input with undo/redo, selection | v0.5.0 | | Markdown | Renders markdown with syntax highlighting + diffs | v0.8.0 | | Dialog | Modal overlays with stack management | v0.9.0 | | Toast | Transient notifications (info/success/warning/error) | v0.9.0 | | Mouse | Event handlers, hit-testing, text selection | v0.10.0 | | Slot | Plugin system — named slots for extensible UI | v0.11.0 | ## Backend features | Feature | modern | simple | |-------------------|--------|--------| | Truecolor (24-bit)| Yes | No | | Bold/italic | Yes | No | | OSC 8 hyperlinks | Yes | No | | DECICM sync | Yes | No | | SGR mouse | Yes | No | | Kitty keyboard | Yes | No | | Box drawing chars | Unicode| ASCII | | Pipe-safe | No | Yes | ## Development ```bash # Run all tests sbcl --script run-all-tests.lisp # Tangle org files emacs --batch --eval "(progn (require 'org) (find-file \"org/FILE.org\") (org-babel-tangle) (kill-buffer))" ``` Literate programming: `.org` files in `org/` are the source of truth. `.lisp` files are generated by tangling. ## License TBD