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:
@@ -58,43 +58,17 @@ Returns a list of strings, one per line."
|
||||
(push text lines)
|
||||
(nreverse lines)))
|
||||
|
||||
(defun view-status (fb w)
|
||||
(let* ((degraded (and (find-package :passepartout)
|
||||
(boundp (find-symbol "*DEGRADED-COMPONENTS*" :passepartout))
|
||||
(symbol-value (find-symbol "*DEGRADED-COMPONENTS*" :passepartout))))
|
||||
(bg (if degraded (theme-color :degraded) nil)))
|
||||
;; Line 1: Connection, mode, msgs, scroll, rules, streaming/busy
|
||||
(cl-tty.backend:draw-text fb 1 1
|
||||
(format nil " Passepartout ~a [~a] msgs:~a scroll:~a Rules:~a~a"
|
||||
(if (st :connected) "● Connected" "○ Disconnected")
|
||||
(string-upcase (string (st :mode)))
|
||||
(length (st :messages))
|
||||
(if (> (st :scroll-offset) 0) (format nil "~a↑" (st :scroll-offset)) "0")
|
||||
(or (st :rule-count) 0)
|
||||
(if (st :streaming-text) " [streaming]"
|
||||
(if (st :busy) " …thinking" "")))
|
||||
(theme-color (if (st :connected) :connected :disconnected)) bg)
|
||||
;; Line 2: Focus + Timestamp
|
||||
(let ((focus-info (or (st :foveal-id) "")))
|
||||
(when (and focus-info (> (length focus-info) 0))
|
||||
(cl-tty.backend:draw-text fb 1 2 (format nil " [Focus: ~a]" focus-info)
|
||||
(theme-color :timestamp) bg)))
|
||||
(cl-tty.backend:draw-text fb (max 1 (- w 12)) 2 (format nil " ~a" (now))
|
||||
(theme-color :timestamp) bg)
|
||||
;; Line 3: Directory, LSP, MCP, commands hint (v0.8.0)
|
||||
(let* ((cwd (or (uiop:getenv "PWD") (uiop:getcwd)))
|
||||
(dir (subseq cwd (max 0 (- (length cwd) (- w 45)))))
|
||||
(mcp-count (or (st :mcp-count) 0))
|
||||
(hint " Ctrl+P: commands /help: help"))
|
||||
(cl-tty.backend:draw-text fb 1 3 (format nil " ~a" dir) (theme-color :dim) bg)
|
||||
(cl-tty.backend:draw-text fb (+ 2 (length dir)) 3 "●" (theme-color :accent) bg)
|
||||
(cl-tty.backend:draw-text fb (+ 5 (length dir)) 3 (format nil " MCP:~d" mcp-count)
|
||||
(theme-color :dim) bg)
|
||||
(cl-tty.backend:draw-text fb (- w (length hint) 2) 3 hint (theme-color :timestamp) bg))
|
||||
;; Line 4: Degraded mode warning (v0.8.0)
|
||||
(when degraded
|
||||
(cl-tty.backend:draw-text fb 1 4 " ⚠ Degraded mode — components unavailable"
|
||||
(theme-color :warning) (theme-color :degraded)))))
|
||||
(defun view-status (fb w h)
|
||||
(let* ((bg (theme-color :status-bg))
|
||||
(fg (theme-color :status-fg))
|
||||
(left (format nil " ~a ~a Rules:~a"
|
||||
(if (st :connected) "●" "○")
|
||||
(or (st :foveal-id) "passepartout") (or (st :rule-count) 0)))
|
||||
(right (format nil "$~,2f ~a" (or (st :session-cost) 0.0) (now))))
|
||||
(dotimes (col w)
|
||||
(cl-tty.backend:draw-rect fb col (- h 1) 1 1 :bg bg))
|
||||
(cl-tty.backend:draw-text fb 1 (- h 1) left fg nil)
|
||||
(cl-tty.backend:draw-text fb (- w (length right) 2) (- h 1) right fg nil)))
|
||||
|
||||
|
||||
;; v0.7.2: search-highlight — wrap matching text in **bold** for markdown
|
||||
@@ -115,156 +89,185 @@ Returns a list of strings, one per line."
|
||||
(if (string= result "") content result))))
|
||||
|
||||
(defun view-chat (fb w h)
|
||||
(let* ((msgs (st :messages))
|
||||
(total (length msgs))
|
||||
(max-lines (- h 2))
|
||||
(is-search (st :search-mode))
|
||||
(y 1))
|
||||
;; v0.8.0: search mode header
|
||||
(let* ((msgs (st :messages)) (total (length msgs))
|
||||
(max-lines (- h 4)) (is-search (st :search-mode)) (y 0))
|
||||
(when is-search
|
||||
(let* ((matches (st :search-matches))
|
||||
(idx (st :search-match-idx))
|
||||
(let* ((matches (st :search-matches)) (idx (st :search-match-idx))
|
||||
(query (st :search-query))
|
||||
(header (format nil "Search: ~d matches for '~a' (~d/~d) — Esc to exit"
|
||||
(length matches) query (1+ idx) (length matches))))
|
||||
(cl-tty.backend:draw-text fb 1 y header (theme-color :highlight) nil)
|
||||
(incf y)
|
||||
(decf max-lines)))
|
||||
;; Pre-compute display lines for each message
|
||||
(let ((msg-lines (make-array total)))
|
||||
(hdr (format nil "Search: ~d matches for '~a' (~d/~d) — Esc to exit"
|
||||
(length matches) query (1+ idx) (length matches))))
|
||||
(cl-tty.backend:draw-text fb 1 y hdr (theme-color :accent) nil)
|
||||
(incf y) (decf max-lines)))
|
||||
(let ((msg-lines (make-array total)) (msg-heights (make-array total)))
|
||||
(dotimes (i total)
|
||||
(let* ((msg (aref msgs i))
|
||||
(role (getf msg :role))
|
||||
(content (getf msg :content))
|
||||
(time (or (getf msg :time) ""))
|
||||
(content-show (if is-search (search-highlight content (st :search-query)) content))
|
||||
(lines (case role
|
||||
(:user (cl-tty.box:word-wrap
|
||||
(format nil "│ [~a] ~a" time content-show) (- w 2)))
|
||||
(:agent (let* ((nodes (cl-tty.markdown:parse-blocks content-show))
|
||||
(md-lines (and nodes (cl-tty.markdown:render-md nodes))))
|
||||
(if md-lines
|
||||
(progn (setf (first md-lines)
|
||||
(format nil "[~a] ~a" time (first md-lines)))
|
||||
md-lines)
|
||||
(list (format nil "[~a] " time)))))
|
||||
(t (cl-tty.box:word-wrap
|
||||
(format nil " [~a] ~a" time content-show) (- w 2))))))
|
||||
;; v0.8.0: tool calls — collapsible
|
||||
(let* ((msg (aref msgs i)) (role (getf msg :role))
|
||||
(content (getf msg :content)) (time (or (getf msg :time) ""))
|
||||
(cs (if is-search (search-highlight content (st :search-query)) content))
|
||||
(pairs nil))
|
||||
(case role
|
||||
(:user
|
||||
(let* ((top (format nil "┌─ you ~a ─" time))
|
||||
(top-str (format nil "~a~a┐" top
|
||||
(make-string (max 0 (- w (length top) 1)) :initial-element #\─)))
|
||||
(body (cl-tty.box:word-wrap cs (- w 4)))
|
||||
(pad (- w 3))
|
||||
(bot (format nil "└~a┘" (make-string (max 0 pad) :initial-element #\─)))
|
||||
(bdr (theme-color :user-border)))
|
||||
(push (list top-str bdr) pairs)
|
||||
(dolist (l body)
|
||||
(push (list (format nil "│ ~a~a│" l
|
||||
(make-string (max 0 (- pad (length l))) :initial-element #\Space))
|
||||
(theme-color :user-fg) (theme-color :user-bg)) pairs))
|
||||
(push (list bot bdr) pairs)))
|
||||
(:agent
|
||||
(let* ((hdr (format nil "── passepartout ~a " time))
|
||||
(hdr-str (format nil "~a~a" hdr
|
||||
(make-string (max 0 (- w (length hdr))) :initial-element #\─)))
|
||||
(nodes (cl-tty.markdown:parse-blocks cs))
|
||||
(body (or (and nodes (cl-tty.markdown:render-md nodes)) (list ""))))
|
||||
(push (list hdr-str (theme-color :agent-header)) pairs)
|
||||
(dolist (l body) (push (list l (theme-color :agent-fg)) pairs))))
|
||||
(t (dolist (l (cl-tty.box:word-wrap cs (- w 2)))
|
||||
(push (list l (theme-color :system)) pairs))))
|
||||
(let ((gt (getf msg :gate-trace)))
|
||||
(when (and gt (eq role :agent))
|
||||
(if (member i (st :collapsed-gates))
|
||||
(push (list (format nil "╎ Gate trace: ~a gates" (length gt))
|
||||
(theme-color :dim)) pairs)
|
||||
(dolist (entry (passepartout::gate-trace-lines gt))
|
||||
(push (list (concatenate 'string "╎ " (car entry))
|
||||
(theme-color (getf (cdr entry) :fgcolor))) pairs)))))
|
||||
(let ((tc (getf msg :tool-calls)))
|
||||
(when tc
|
||||
(if (st :expand-tool-calls)
|
||||
(if (member i (st :collapsed-tools))
|
||||
(let* ((n (or (getf (first tc) :name) "tool"))
|
||||
(d (or (getf (first tc) :duration) 0.0))
|
||||
(extra (reduce #'+ tc :key
|
||||
(lambda (c) (length (cl-tty.box:word-wrap
|
||||
(or (getf c :output) "") (- w 6)))))))
|
||||
(push (list (format nil "┌─ ~a ──── ~,1fs ── [+~d more] ────────┐" n d extra)
|
||||
(theme-color :tool-done)) pairs))
|
||||
(dolist (call tc)
|
||||
(setf lines (append lines
|
||||
(list (format nil " ╎ Tool: ~a" (or (getf call :name) "unknown"))))))
|
||||
(setf lines (append lines
|
||||
(list (format nil " ╎ ~a tool call(s)" (length tc))))))))
|
||||
;; v0.8.0: gate trace — collapsible with left border
|
||||
(let ((gt (getf msg :gate-trace)))
|
||||
(when gt
|
||||
(if (member i (st :collapsed-gates))
|
||||
(setf lines (append lines
|
||||
(list (format nil "╎ Gate trace: ~a gates — Ctrl+G toggle"
|
||||
(length gt)))))
|
||||
(dolist (entry (passepartout::gate-trace-lines gt))
|
||||
(setf lines (append lines
|
||||
(list (concatenate 'string "╎ " (car entry)))))))))
|
||||
(setf (aref msg-lines i) lines)))
|
||||
;; Count visible messages from end
|
||||
(let* ((name (or (getf call :name) "tool"))
|
||||
(dur (or (getf call :duration) 0.0))
|
||||
(st (getf call :status))
|
||||
(out (getf call :output))
|
||||
(bc (theme-color
|
||||
(cond ((eq st :running) :tool-running)
|
||||
((eq st :error) :tool-error)
|
||||
(t :tool-done))))
|
||||
(pfx (cond ((eq st :error) "✗") ((eq st :running) "●") (t "✓")))
|
||||
(ol (when out (cl-tty.box:word-wrap out (- w 6))))
|
||||
(top (format nil "┌─ ~a ──── ~,1fs ─" name dur))
|
||||
(top-str (format nil "~a~a┐" top
|
||||
(make-string (max 0 (- w (length top) 1)) :initial-element #\─)))
|
||||
(bot (format nil "└~a┘" (make-string (max 0 (- w 2)) :initial-element #\─))))
|
||||
(push (list top-str bc) pairs)
|
||||
(dolist (l ol)
|
||||
(push (list (format nil "│ ~a ~a~a│" pfx l
|
||||
(make-string (max 0 (- w (length pfx) (length l) 4))
|
||||
:initial-element #\Space)) bc) pairs))
|
||||
(push (list bot bc) pairs))))))
|
||||
(when (> i 0)
|
||||
(let ((pt (or (getf (aref msgs (1- i)) :time) "")))
|
||||
(flet ((h (s) (if (> (length s) 0) (subseq s 0 (or (position #\: s) 0)) "")))
|
||||
(let ((ph (h pt)) (ch (h time)))
|
||||
(when (and (> (length ch) 0) (string/= ch ph))
|
||||
(let* ((pad (max 0 (floor (- w (length time) 2) 2)))
|
||||
(rpad (- w (length time) 2 pad)))
|
||||
(push (list (format nil "~a ~a ~a"
|
||||
(make-string pad :initial-element #\─)
|
||||
time
|
||||
(make-string rpad :initial-element #\─))
|
||||
(theme-color :separator)) pairs)))))))
|
||||
(setf (aref msg-lines i) (nreverse pairs))
|
||||
(setf (aref msg-heights i) (length pairs))))
|
||||
(let ((msg-count 0) (lines-remaining max-lines))
|
||||
(loop for i from (1- total) downto 0
|
||||
while (> lines-remaining 0)
|
||||
do (let ((nlines (length (aref msg-lines i))))
|
||||
(if (<= nlines lines-remaining)
|
||||
(progn (decf lines-remaining nlines) (incf msg-count))
|
||||
do (let ((h (aref msg-heights i)))
|
||||
(if (<= h lines-remaining)
|
||||
(progn (decf lines-remaining h) (incf msg-count))
|
||||
(setf lines-remaining 0))))
|
||||
;; Render from the correct starting message
|
||||
(let* ((scroll-skip (st :scroll-offset))
|
||||
(start (max 0 (- total msg-count scroll-skip))))
|
||||
(loop for i from start below total
|
||||
while (< y (1- h))
|
||||
do (let* ((msg (aref msgs i))
|
||||
(role (getf msg :role))
|
||||
(lines (aref msg-lines i))
|
||||
(color (theme-color
|
||||
(case role
|
||||
(:user :user) (:agent :agent) (:system :system) (t :agent))))
|
||||
(is-panel (getf msg :panel))
|
||||
(is-resolved (getf msg :panel-resolved)))
|
||||
;; HITL panel coloring
|
||||
(when is-panel
|
||||
(setf color (if is-resolved (theme-color :dim) (theme-color :hitl))))
|
||||
(dolist (line lines)
|
||||
(when (< y (1- h))
|
||||
(cl-tty.backend:draw-text fb 1 y line color nil)
|
||||
(incf y))))))))))
|
||||
(loop for i from start below total while (< y (- h 4))
|
||||
do (let ((pairs (aref msg-lines i)))
|
||||
(dolist (pair pairs)
|
||||
(when (>= y (- h 4)) (return))
|
||||
(destructuring-bind (text color &optional bg) pair
|
||||
(when bg (cl-tty.backend:draw-rect fb 0 y w 1 :bg bg))
|
||||
(cl-tty.backend:draw-text fb 0 y text color nil))
|
||||
(incf y)))))))))
|
||||
#+END_SRC
|
||||
|
||||
** Input Line
|
||||
#+BEGIN_SRC lisp :tangle ../lisp/channel-tui-view.lisp
|
||||
(defun view-input (fb w)
|
||||
(defun view-input (fb w h)
|
||||
(let* ((text (input-string))
|
||||
(pos (or (st :cursor-pos) 0))
|
||||
(display-start (max 0 (- pos (1- w))))
|
||||
(visible (subseq text display-start (min (length text) (+ display-start w)))))
|
||||
(cl-tty.backend:draw-text fb 0 0 (format nil "~a " visible) (theme-color :input) nil)))
|
||||
(cl-tty.backend:draw-text fb 0 (- h 3) (format nil "> ~a" visible) (theme-color :input-fg) nil)
|
||||
(cl-tty.backend:draw-text fb 0 (- h 2) (format nil " Ctrl+P palette | Up/Dn history | Tab complete")
|
||||
(theme-color :hint) nil)))
|
||||
#+end_src
|
||||
|
||||
** Sidebar
|
||||
#+BEGIN_SRC lisp :tangle ../lisp/channel-tui-view.lisp
|
||||
(defun view-sidebar (fb w h)
|
||||
(let ((x (- w (st :sidebar-width))))
|
||||
"Render the right-side sidebar panel with warm colors."
|
||||
(let* ((x (- w (or (st :sidebar-width) 30)))
|
||||
(y 0))
|
||||
;; Vertical separator
|
||||
(dotimes (row h)
|
||||
(cl-tty.backend:draw-rect fb (1- x) row 1 1 :bg :dim))
|
||||
;; Render panels
|
||||
(let ((y 1))
|
||||
;; Focus panel
|
||||
(when (st :foveal-id)
|
||||
(cl-tty.backend:draw-text fb (1+ x) y " Focus" (theme-color :highlight) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) y (format nil " ~a" (st :foveal-id)) (theme-color :agent) nil)
|
||||
(incf y 2))
|
||||
;; Rules panel
|
||||
(let ((rules (or (st :rule-count) 0)))
|
||||
(cl-tty.backend:draw-text fb (1+ x) y " Rules" (theme-color :highlight) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) y (format nil " ~d active" rules) (theme-color :agent) nil)
|
||||
(incf y 2))
|
||||
;; Context panel — token gauge
|
||||
(cl-tty.backend:draw-text fb (1+ x) y " Context" (theme-color :highlight) nil)
|
||||
(cl-tty.backend:draw-rect fb (1- x) row 1 1 :bg (theme-color :separator)))
|
||||
;; Focus panel
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) " FOCUS" (theme-color :accent) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) (format nil " ~a" (or (st :foveal-id) "none"))
|
||||
(theme-color :agent-fg) nil)
|
||||
(incf y 2)
|
||||
;; Rules panel
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) " RULES" (theme-color :accent) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) (format nil " ~d active" (or (st :rule-count) 0))
|
||||
(theme-color :agent-fg) nil)
|
||||
(incf y 2)
|
||||
;; Context panel — token gauge
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) " CONTEXT" (theme-color :accent) nil)
|
||||
(incf y)
|
||||
(let* ((msg-count (max 1 (length (st :messages))))
|
||||
(est (* msg-count 60))
|
||||
(limit 8192)
|
||||
(pct (min 100 (floor (* 100 est) limit)))
|
||||
(bar-len (floor pct 10))
|
||||
(bar (make-string bar-len :initial-element #\#)))
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y)
|
||||
(format nil " [~a~a]" bar
|
||||
(make-string (- 10 bar-len) :initial-element #\Space))
|
||||
(theme-color :dim) nil)
|
||||
(incf y)
|
||||
(let* ((msg-count (length (st :messages)))
|
||||
(est (* msg-count 60))
|
||||
(limit 8192)
|
||||
(pct (min 100 (floor (* 100 est) limit)))
|
||||
(bar-len (floor pct 10))
|
||||
(bar (make-string bar-len :initial-element #\#)))
|
||||
(cl-tty.backend:draw-text fb (1+ x) y (format nil " [~a~a]" bar (make-string (- 10 bar-len) :initial-element #\Space)) (theme-color :dim) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) y (format nil " ~d%" pct) (theme-color :timestamp) nil)
|
||||
(incf y 2))
|
||||
;; MCP count
|
||||
(let ((mcp (or (st :mcp-count) 0)))
|
||||
(cl-tty.backend:draw-text fb (1+ x) y " MCP" (theme-color :highlight) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) y (format nil " ~d server~:p" mcp) (theme-color :agent) nil)))))
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) (format nil " ~d%" pct)
|
||||
(theme-color :status-fg) nil)
|
||||
(incf y 2))
|
||||
;; MCP panel
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) " MCP" (theme-color :accent) nil)
|
||||
(incf y)
|
||||
(cl-tty.backend:draw-text fb (1+ x) (incf y) (format nil " ~d server~:p" (or (st :mcp-count) 0))
|
||||
(theme-color :agent-fg) nil)))
|
||||
#+END_SRC
|
||||
|
||||
** Redraw (dirty-flag dispatch)
|
||||
#+begin_src lisp
|
||||
(defun redraw (fb w h)
|
||||
(destructuring-bind (sd cd id) (st :dirty)
|
||||
(let* ((degraded (and (find-package :passepartout)
|
||||
(boundp (find-symbol "*DEGRADED-COMPONENTS*" :passepartout))
|
||||
(symbol-value (find-symbol "*DEGRADED-COMPONENTS*" :passepartout))))
|
||||
(chat-h (- h (if degraded 6 5))))
|
||||
(when sd (view-status fb w))
|
||||
(when cd (view-chat fb w chat-h))
|
||||
(when id (view-input fb w))
|
||||
(when (and (st :sidebar-visible) (>= w 120))
|
||||
(view-sidebar fb w h))
|
||||
(setf (st :dirty) (list nil nil nil)))))
|
||||
(when sd (view-status fb w h))
|
||||
(when cd (view-chat fb w h))
|
||||
(when id (view-input fb w h))
|
||||
(when (and (st :sidebar-visible) (>= w 120))
|
||||
(view-sidebar fb w h))
|
||||
(setf (st :dirty) (list nil nil nil))))
|
||||
#+END_SRC
|
||||
|
||||
* Implementation — v0.7.0 additions
|
||||
@@ -346,8 +349,8 @@ ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
||||
(url (getf attrs :url)))
|
||||
(declare (ignore code))
|
||||
(cl-tty.backend:draw-text fb x y text
|
||||
(cond (url (theme-color :highlight))
|
||||
(t (theme-color (or (getf attrs :role) :agent))))
|
||||
(cond (url (theme-color :accent))
|
||||
(t (theme-color (or (getf attrs :role) :agent-fg))))
|
||||
nil
|
||||
:bold bold)
|
||||
(incf x (length text))))
|
||||
@@ -429,10 +432,10 @@ ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
||||
(reason (getf entry :reason))
|
||||
(name (or gate "unknown"))
|
||||
(color (case result
|
||||
(:passed :gate-passed)
|
||||
(:blocked :gate-blocked)
|
||||
(:approval :gate-approval)
|
||||
(t :dim)))
|
||||
(:passed :tool-done)
|
||||
(:blocked :error)
|
||||
(:approval :accent)
|
||||
(t :dim)))
|
||||
(prefix (case result
|
||||
(:passed " \u2713 ")
|
||||
(:blocked " \u2717 ")
|
||||
@@ -534,7 +537,7 @@ ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
||||
(let ((lines (passepartout::gate-trace-lines
|
||||
'((:gate "path" :result :passed)))))
|
||||
(is (= 1 (length lines)))
|
||||
(is (eq :gate-passed (getf (cdar lines) :fgcolor)))))
|
||||
(is (eq :tool-done (getf (cdar lines) :fgcolor)))))
|
||||
|
||||
(test test-gate-trace-lines-blocked
|
||||
"Contract 9: gate-trace-lines for blocked gate."
|
||||
@@ -573,7 +576,7 @@ ASCII < 128 = 1. CJK, fullwidth, emoji = 2. Combining marks = 0. Tab = 8."
|
||||
(is (not (and (passepartout.channel-tui::st :sidebar-visible) (>= w 120))))))
|
||||
|
||||
(test test-status-bar-tokens
|
||||
"v0.8.0: status bar uses :degraded and :warning theme tokens."
|
||||
(is (getf passepartout.channel-tui::*tui-theme* :degraded))
|
||||
(is (getf passepartout.channel-tui::*tui-theme* :warning)))
|
||||
"v0.9.0: status bar uses :status-fg and :status-bg theme tokens."
|
||||
(is (getf passepartout.channel-tui::*tui-theme* :status-fg))
|
||||
(is (getf passepartout.channel-tui::*tui-theme* :status-bg)))
|
||||
#+END_SRC
|
||||
|
||||
Reference in New Issue
Block a user