From 7c117eb52e2e5a8f66d9a3a2237bc8389b282271 Mon Sep 17 00:00:00 2001 From: James Magahern Date: Thu, 12 Feb 2026 13:06:01 -0800 Subject: [PATCH] kptui: Unread indicator, highlight vs selected state --- core/kptui/src/main.rs | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/core/kptui/src/main.rs b/core/kptui/src/main.rs index f0b1d29..3b28037 100644 --- a/core/kptui/src/main.rs +++ b/core/kptui/src/main.rs @@ -179,21 +179,32 @@ fn ui(frame: &mut Frame, app: &AppState, requested_view: ViewMode) { fn render_conversations(frame: &mut Frame, app: &AppState, area: Rect, in_split: bool) { let title = if in_split { - "Conversations (↑/↓, Enter)" + "Conversations (↑/↓ move, ▸ cursor, ● unread)" } else { - "Conversations (↑/↓, Enter to open)" + "Conversations (↑/↓ move, Enter open, ● unread)" }; let items = app .conversations .iter() .map(|c| { + let is_active = app.active_conversation_id.as_deref() == Some(c.id.as_str()); let unread = if c.unread_count > 0 { format!(" ({})", c.unread_count) } else { String::new() }; let header = Line::from(vec![ + Span::styled( + if c.unread_count > 0 { "● " } else { " " }, + Style::default() + .fg(if c.unread_count > 0 { + Color::LightYellow + } else { + Color::DarkGray + }) + .add_modifier(Modifier::BOLD), + ), Span::styled( c.title.clone(), Style::default().add_modifier(Modifier::BOLD), @@ -202,9 +213,17 @@ fn render_conversations(frame: &mut Frame, app: &AppState, area: Rect, in_split: ]); let preview = Line::from(Span::styled( c.preview.clone(), - Style::default().fg(Color::DarkGray), + Style::default().fg(if is_active { + Color::Gray + } else { + Color::DarkGray + }), )); - ListItem::new(vec![header, preview]) + ListItem::new(vec![header, preview]).style(if is_active { + Style::default().bg(Color::DarkGray) + } else { + Style::default() + }) }) .collect::>();