bump passepartout: v0.9.0 Warm TUI Redesign — blank slate
Complete rewrite of the TUI with warm amber/gold color palette and clean three-zone layout (chat top, input bottom, status very bottom). 1. Layout restructure: input at y=h-3, hint at y=h-2, status at y=h-1 2. Warm palette: 20-key amber/gold theme, 8 warm presets 3. Readline keybindings: Ctrl+A/E/U/W/K/Y/L/D/F/G in :global keymap 4. Chat messages: user boxes (┌─└─), agent headers, collapsible tools 5. Command palette: Ctrl+P top-centered overlay, warm colors 6. Sidebar: Ctrl+B toggle, right panel with focus/rules/context/MCP 7. Keybindings: :ctrl+x, :?, mouse wheel support 8. Search: existing /search with match highlighting 9. Help overlay: ? shows keybinding and command reference
This commit is contained in:
@@ -33,68 +33,102 @@ All state mutation flows through event handlers in the controller.
|
||||
(defvar *event-lock* (bt:make-lock "tui-event-lock"))
|
||||
|
||||
(defvar *tui-theme*
|
||||
;; Roles
|
||||
'(:user :green :agent :white :system :yellow
|
||||
;; Content
|
||||
:input :cyan :timestamp :yellow :help :cyan :error :red :warning :yellow
|
||||
;; Status
|
||||
:connected :green :disconnected :red :busy :magenta :idle :white
|
||||
;; Gate trace
|
||||
:gate-passed :green :gate-blocked :red :gate-approval :yellow
|
||||
:hitl :magenta
|
||||
;; Tools (future use)
|
||||
:tool-running :magenta :tool-success :green :tool-failure :red :tool-output :white
|
||||
;; Display
|
||||
:scroll-indicator :cyan :border :white :background :black
|
||||
;; Differentiator (v0.4.0)
|
||||
:rule-count :cyan :focus-map :yellow
|
||||
;; UI
|
||||
:dim :white :highlight :cyan :accent :green
|
||||
;; Degraded
|
||||
:degraded :bright-yellow)
|
||||
"Color theme plist. 28 semantic keys → hex color strings.
|
||||
See *tui-theme-presets* for named presets (dark, light, solarized, gruvbox).")
|
||||
'(:user-fg "#FFB347" :user-bg "#3A2A1A" :user-border "#CC8800"
|
||||
:agent-header "#D4956A" :agent-fg "#E8D5B7"
|
||||
:system "#C8A87C"
|
||||
:input-prompt "#FF8C42" :input-fg "#E8D5B7"
|
||||
:hint "#A08060"
|
||||
:status-bg "#2A1F1A" :status-fg "#D4A574"
|
||||
:dot-connected "#7CCC6C" :dot-disconnected "#E2584A"
|
||||
:error "#E2584A"
|
||||
:tool-running "#FF8C42" :tool-done "#7CCC6C" :tool-error "#E2584A"
|
||||
:separator "#4A3A2A" :accent "#FFB347" :dim "#8B7355")
|
||||
"Warm amber/gold color theme. 20 semantic keys → hex color strings.")
|
||||
|
||||
(defvar *tui-theme-presets*
|
||||
'(:dark (:user :green :agent :white :system :yellow
|
||||
:input :cyan :timestamp :yellow :help :cyan :error :red :warning :yellow
|
||||
:connected :green :disconnected :red :busy :magenta :idle :white
|
||||
:gate-passed :green :gate-blocked :red :gate-approval :yellow
|
||||
:tool-running :magenta :tool-success :green :tool-failure :red :tool-output :white
|
||||
:scroll-indicator :cyan :border :white :background :black
|
||||
:rule-count :cyan :focus-map :yellow
|
||||
:dim :white :highlight :cyan :accent :green
|
||||
:degraded :bright-yellow)
|
||||
:light (:user :blue :agent :black :system :red
|
||||
:input :black :timestamp :yellow :help :blue :error :red :warning :yellow
|
||||
:connected :green :disconnected :red :busy :magenta :idle :black
|
||||
:gate-passed :green :gate-blocked :red :gate-approval :yellow
|
||||
:tool-running :magenta :tool-success :green :tool-failure :red :tool-output :black
|
||||
:scroll-indicator :blue :border :black :background :white
|
||||
:rule-count :blue :focus-map :red
|
||||
:dim :white :highlight :blue :accent :green
|
||||
:degraded :bright-yellow)
|
||||
:gruvbox (:user "#458588" :agent "#ebdbb2" :system "#fabd2f"
|
||||
:input "#ebdbb2" :timestamp "#928374" :help "#83a598" :error "#fb4934" :warning "#fabd2f"
|
||||
:connected "#b8bb26" :disconnected "#fb4934" :busy "#d3869b" :idle "#a89984"
|
||||
:gate-passed "#b8bb26" :gate-blocked "#fb4934" :gate-approval "#fabd2f"
|
||||
:tool-running "#d3869b" :tool-success "#b8bb26" :tool-failure "#fb4934" :tool-output "#ebdbb2"
|
||||
:scroll-indicator "#83a598" :border "#a89984" :background "#282828"
|
||||
:rule-count "#83a598" :focus-map "#fabd2f"
|
||||
:dim "#928374" :highlight "#83a598" :accent "#b8bb26"
|
||||
:degraded "#fabd2f")
|
||||
:solarized (:user "#268bd2" :agent "#839496" :system "#b58900"
|
||||
:input "#839496" :timestamp "#93a1a1" :help "#2aa198" :error "#dc322f" :warning "#b58900"
|
||||
:connected "#859900" :disconnected "#dc322f" :busy "#d33682" :idle "#657b83"
|
||||
:gate-passed "#859900" :gate-blocked "#dc322f" :gate-approval "#b58900"
|
||||
:tool-running "#d33682" :tool-success "#859900" :tool-failure "#dc322f" :tool-output "#839496"
|
||||
:scroll-indicator "#2aa198" :border "#657b83" :background "#002b36"
|
||||
:rule-count "#2aa198" :focus-map "#b58900"
|
||||
:dim "#586e75" :highlight "#2aa198" :accent "#859900"
|
||||
:degraded "#b58900"))
|
||||
"Named theme presets. /theme <name> loads one into *tui-theme*.")
|
||||
'(:amber (:user-fg "#FFB347" :user-bg "#3A2A1A" :user-border "#CC8800"
|
||||
:agent-header "#D4956A" :agent-fg "#E8D5B7"
|
||||
:system "#C8A87C"
|
||||
:input-prompt "#FF8C42" :input-fg "#E8D5B7"
|
||||
:hint "#A08060"
|
||||
:status-bg "#2A1F1A" :status-fg "#D4A574"
|
||||
:dot-connected "#7CCC6C" :dot-disconnected "#E2584A"
|
||||
:error "#E2584A"
|
||||
:tool-running "#FF8C42" :tool-done "#7CCC6C" :tool-error "#E2584A"
|
||||
:separator "#4A3A2A" :accent "#FFB347" :dim "#8B7355")
|
||||
:gold (:user-fg "#FFD700" :user-bg "#3A3020" :user-border "#DAA520"
|
||||
:agent-header "#D4A574" :agent-fg "#F0E6D0"
|
||||
:system "#C8A87C"
|
||||
:input-prompt "#FFA500" :input-fg "#F0E6D0"
|
||||
:hint "#A08060"
|
||||
:status-bg "#2A1F1A" :status-fg "#DAA520"
|
||||
:dot-connected "#7CCC6C" :dot-disconnected "#E2584A"
|
||||
:error "#E2584A"
|
||||
:tool-running "#FFA500" :tool-done "#7CCC6C" :tool-error "#E2584A"
|
||||
:separator "#4A3A2A" :accent "#FFD700" :dim "#8B7355")
|
||||
:terracotta (:user-fg "#E87A5D" :user-bg "#2D1C15" :user-border "#C0684A"
|
||||
:agent-header "#D4956A" :agent-fg "#E0C8B0"
|
||||
:system "#A08060"
|
||||
:input-prompt "#E87A5D" :input-fg "#E0C8B0"
|
||||
:hint "#8B6F5E"
|
||||
:status-bg "#1F1410" :status-fg "#D4956A"
|
||||
:dot-connected "#6CB85C" :dot-disconnected "#D94A3A"
|
||||
:error "#D94A3A"
|
||||
:tool-running "#E87A5D" :tool-done "#6CB85C" :tool-error "#D94A3A"
|
||||
:separator "#3A2820" :accent "#E87A5D" :dim "#7A6050")
|
||||
:sepia (:user-fg "#C4A882" :user-bg "#2A2218" :user-border "#A08860"
|
||||
:agent-header "#B89870" :agent-fg "#D4C4A8"
|
||||
:system "#9A8A6A"
|
||||
:input-prompt "#C4A882" :input-fg "#D4C4A8"
|
||||
:hint "#8A7A5E"
|
||||
:status-bg "#1E1810" :status-fg "#B89870"
|
||||
:dot-connected "#7AAC5C" :dot-disconnected "#C84A3A"
|
||||
:error "#C84A3A"
|
||||
:tool-running "#C4A882" :tool-done "#7AAC5C" :tool-error "#C84A3A"
|
||||
:separator "#3A3020" :accent "#C4A882" :dim "#7A6A50")
|
||||
:nord-warm (:user-fg "#D4A574" :user-bg "#2A2220" :user-border "#B8885A"
|
||||
:agent-header "#C49870" :agent-fg "#E0D0C0"
|
||||
:system "#A89080"
|
||||
:input-prompt "#D08770" :input-fg "#E0D0C0"
|
||||
:hint "#908070"
|
||||
:status-bg "#1E1A18" :status-fg "#C8A080"
|
||||
:dot-connected "#7CB860" :dot-disconnected "#D06050"
|
||||
:error "#D06050"
|
||||
:tool-running "#D08770" :tool-done "#7CB860" :tool-error "#D06050"
|
||||
:separator "#3A3030" :accent "#D4A574" :dim "#807060")
|
||||
:monokai-warm (:user-fg "#E6B87D" :user-bg "#1E1A16" :user-border "#CC9966"
|
||||
:agent-header "#D4A06A" :agent-fg "#D8C8B0"
|
||||
:system "#A89070"
|
||||
:input-prompt "#E6B87D" :input-fg "#D8C8B0"
|
||||
:hint "#8A7A5E"
|
||||
:status-bg "#141210" :status-fg "#CC9966"
|
||||
:dot-connected "#7AB85C" :dot-disconnected "#D94A3A"
|
||||
:error "#D94A3A"
|
||||
:tool-running "#E6B87D" :tool-done "#7AB85C" :tool-error "#D94A3A"
|
||||
:separator "#2E2820" :accent "#E6B87D" :dim "#7A6A50")
|
||||
:gruvbox-warm (:user-fg "#D8A657" :user-bg "#1D1A16" :user-border "#B8884A"
|
||||
:agent-header "#C8A070" :agent-fg "#E0C8A8"
|
||||
:system "#A89070"
|
||||
:input-prompt "#D8A657" :input-fg "#E0C8A8"
|
||||
:hint "#8A7A5E"
|
||||
:status-bg "#141210" :status-fg "#C8A070"
|
||||
:dot-connected "#7AB85C" :dot-disconnected "#D94A3A"
|
||||
:error "#D94A3A"
|
||||
:tool-running "#D8A657" :tool-done "#7AB85C" :tool-error "#D94A3A"
|
||||
:separator "#2E2820" :accent "#D8A657" :dim "#7A6A50")
|
||||
:light-amber (:user-fg "#CC6600" :user-bg "#FFF5E6" :user-border "#CC8800"
|
||||
:agent-header "#8B6914" :agent-fg "#3A2A1A"
|
||||
:system "#6B5B3E"
|
||||
:input-prompt "#CC6600" :input-fg "#3A2A1A"
|
||||
:hint "#8B7355"
|
||||
:status-bg "#E8D5B7" :status-fg "#3A2A1A"
|
||||
:dot-connected "#2E8B57" :dot-disconnected "#CC3300"
|
||||
:error "#CC3300"
|
||||
:tool-running "#CC6600" :tool-done "#2E8B57" :tool-error "#CC3300"
|
||||
:separator "#C8B898" :accent "#CC6600" :dim "#8B7355"))
|
||||
"8 warm theme presets.")
|
||||
|
||||
(defvar *tui-theme-current-name* :dark
|
||||
(defvar *tui-theme-current-name* :amber
|
||||
"Name of the currently active theme preset.")
|
||||
|
||||
(defun theme-save ()
|
||||
@@ -135,7 +169,7 @@ See *tui-theme-presets* for named presets (dark, light, solarized, gruvbox).")
|
||||
(:green "#00FF00") (:red "#FF0000") (:cyan "#00FFFF")
|
||||
(:yellow "#FFFF00") (:magenta "#FF00FF") (:blue "#0000FF")
|
||||
(:white "#FFFFFF") (:black "#000000")
|
||||
(:bright-yellow "#FFD700")
|
||||
(:bright-black "#666666") (:bright-yellow "#FFD700")
|
||||
(t "#FFFFFF"))))))
|
||||
|
||||
(defun st (key) (getf *state* key))
|
||||
@@ -157,11 +191,13 @@ See *tui-theme-presets* for named presets (dark, light, solarized, gruvbox).")
|
||||
:sidebar-width 30 ; v0.8.0
|
||||
:expand-tool-calls nil ; v0.8.0
|
||||
:mcp-count 0 ; v0.8.0
|
||||
:kill-ring nil ; v0.9.0
|
||||
:dialog-stack nil ; v0.8.0
|
||||
:minibuffer-active nil ; v0.8.0
|
||||
:command-palette-active nil ; v0.8.0
|
||||
:command-palette-dialog nil ; v0.8.0
|
||||
:dirty (list nil nil nil))))
|
||||
:command-palette-active nil ; v0.8.0
|
||||
:command-palette-dialog nil ; v0.8.0
|
||||
:session-cost 0.0 ; v0.9.0
|
||||
:dirty (list nil nil nil))))
|
||||
#+END_SRC
|
||||
|
||||
** Sidebar panel definitions
|
||||
|
||||
Reference in New Issue
Block a user