codetether_agent/tui/ui/chat_view/status_hints.rs
1//! Keybinding hint spans for the status bar.
2
3use ratatui::{
4 style::{Color, Style},
5 text::Span,
6};
7
8/// Build the CHAT banner and keybinding hint spans.
9///
10/// # Examples
11///
12/// ```rust
13/// use codetether_agent::tui::ui::chat_view::status_hints::header_spans;
14/// let spans = header_spans("abc");
15/// let text: String = spans.iter().map(|s| s.content.as_ref()).collect();
16/// assert!(text.contains("CHAT"));
17/// ```
18pub fn header_spans(session_label: &str) -> Vec<Span<'static>> {
19 let mut spans = keybinding_spans();
20 spans.push(Span::raw(" | "));
21 spans.extend(session_label_spans(session_label));
22 spans.push(Span::raw(" | "));
23 spans
24}
25
26/// Keybinding hint spans without the trailing session badge.
27///
28/// Used when the status bar stacks across multiple rows so that
29/// session/badge info can live on its own line.
30///
31/// # Examples
32///
33/// ```rust
34/// use codetether_agent::tui::ui::chat_view::status_hints::keybinding_spans;
35/// let spans = keybinding_spans();
36/// let text: String = spans.iter().map(|s| s.content.as_ref()).collect();
37/// assert!(text.contains("Help"));
38/// ```
39pub fn keybinding_spans() -> Vec<Span<'static>> {
40 vec![
41 Span::styled(" CHAT ", Style::default().fg(Color::Black).bg(Color::Cyan)),
42 Span::raw(" | "),
43 kb("?"),
44 Span::raw(": Help | "),
45 kb("Tab"),
46 Span::raw(": Complete | "),
47 kb("↑↓"),
48 Span::raw(": Scroll | "),
49 kb("Shift+↑↓"),
50 Span::raw(": Tools | "),
51 kb("Ctrl+↑↓"),
52 Span::raw(": History | "),
53 kb("Ctrl+T"),
54 Span::raw(": Symbols | "),
55 kb("Esc"),
56 Span::raw(": Back | "),
57 kb("Ctrl+C"),
58 Span::raw(": Quit"),
59 ]
60}
61
62/// Session label spans (`session: <label>`).
63///
64/// # Examples
65///
66/// ```rust
67/// use codetether_agent::tui::ui::chat_view::status_hints::session_label_spans;
68/// let spans = session_label_spans("abc");
69/// let text: String = spans.iter().map(|s| s.content.as_ref()).collect();
70/// assert!(text.contains("abc"));
71/// ```
72pub fn session_label_spans(session_label: &str) -> Vec<Span<'static>> {
73 vec![
74 Span::styled("session", Style::default().fg(Color::DarkGray)),
75 Span::raw(": "),
76 Span::styled(session_label.to_string(), Style::default().fg(Color::Cyan)),
77 ]
78}
79
80/// Style a keyboard shortcut key in yellow.
81fn kb(key: &str) -> Span<'static> {
82 Span::styled(key.to_string(), Style::default().fg(Color::Yellow))
83}