Skip to main content

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}