chore: tool border, navigation help

Kujtim Hoxha created

Change summary

internal/tui/components/chat/chat.go                 |  3 -
internal/tui/components/chat/messages/messages.go    |  6 +++
internal/tui/components/chat/messages/tool.go        |  7 +++
internal/tui/components/completions/completions.go   |  2 -
internal/tui/components/core/list/keys.go            | 22 ++++++-------
internal/tui/components/core/list/list.go            |  8 +---
internal/tui/components/dialogs/commands/commands.go |  2 -
internal/tui/components/dialogs/models/models.go     |  2 -
internal/tui/components/dialogs/sessions/sessions.go |  2 -
9 files changed, 24 insertions(+), 30 deletions(-)

Detailed changes

internal/tui/components/chat/chat.go 🔗

@@ -509,6 +509,5 @@ func (m *messageListCmp) IsFocused() bool {
 }
 
 func (m *messageListCmp) Bindings() []key.Binding {
-	bindings := m.defaultListKeyMap.KeyBindings()
-	return bindings
+	return m.defaultListKeyMap.KeyBindings()
 }

internal/tui/components/chat/messages/messages.go 🔗

@@ -43,6 +43,10 @@ type messageCmp struct {
 	anim     util.Model      // Animation component for loading states
 }
 
+var focusedMessageBorder = lipgloss.Border{
+	Left: "▌",
+}
+
 // NewMessageCmp creates a new message component with the given message and options
 func NewMessageCmp(msg message.Message) MessageCmp {
 	m := &messageCmp{
@@ -112,7 +116,7 @@ func (msg *messageCmp) style() lipgloss.Style {
 	t := styles.CurrentTheme()
 	borderStyle := lipgloss.NormalBorder()
 	if msg.focused {
-		borderStyle = lipgloss.ThickBorder()
+		borderStyle = focusedMessageBorder
 	}
 
 	style := t.S().Text

internal/tui/components/chat/messages/tool.go 🔗

@@ -224,7 +224,12 @@ func (m *toolCallCmp) style() lipgloss.Style {
 	if m.isNested {
 		return t.S().Muted
 	}
-	return t.S().Muted.PaddingLeft(4)
+	style := t.S().Muted.PaddingLeft(4)
+
+	if m.focused {
+		style = style.PaddingLeft(3).BorderStyle(focusedMessageBorder).BorderLeft(true).BorderForeground(t.GreenDark)
+	}
+	return style
 }
 
 // textWidth calculates the available width for text content,

internal/tui/components/completions/completions.go 🔗

@@ -57,8 +57,6 @@ func New() Completions {
 	keyMap := list.DefaultKeyMap()
 	keyMap.Up.SetEnabled(false)
 	keyMap.Down.SetEnabled(false)
-	keyMap.NDown.SetEnabled(false)
-	keyMap.NUp.SetEnabled(false)
 	keyMap.HalfPageDown.SetEnabled(false)
 	keyMap.HalfPageUp.SetEnabled(false)
 	keyMap.Home.SetEnabled(false)

internal/tui/components/core/list/keys.go 🔗

@@ -7,8 +7,6 @@ import (
 type KeyMap struct {
 	Down,
 	Up,
-	NDown,
-	NUp,
 	DownOneItem,
 	UpOneItem,
 	HalfPageDown,
@@ -20,34 +18,36 @@ type KeyMap struct {
 func DefaultKeyMap() KeyMap {
 	return KeyMap{
 		Down: key.NewBinding(
-			key.WithKeys("down", "ctrl+j", "ctrl+n"),
+			key.WithKeys("down", "ctrl+j", "ctrl+n", "j"),
+			key.WithHelp("↓", "down"),
 		),
 		Up: key.NewBinding(
-			key.WithKeys("up", "ctrl+k", "ctrl+p"),
-		),
-		NDown: key.NewBinding(
-			key.WithKeys("j"),
-		),
-		NUp: key.NewBinding(
-			key.WithKeys("k"),
+			key.WithKeys("up", "ctrl+k", "ctrl+p", "k"),
+			key.WithHelp("↑", "up"),
 		),
 		UpOneItem: key.NewBinding(
 			key.WithKeys("shift+up", "K"),
+			key.WithHelp("shift+↑", "up one item"),
 		),
 		DownOneItem: key.NewBinding(
 			key.WithKeys("shift+down", "J"),
+			key.WithHelp("shift+↓", "down one item"),
 		),
 		HalfPageDown: key.NewBinding(
 			key.WithKeys("d"),
+			key.WithHelp("d", "half page down"),
 		),
 		HalfPageUp: key.NewBinding(
 			key.WithKeys("u"),
+			key.WithHelp("u", "half page up"),
 		),
 		Home: key.NewBinding(
 			key.WithKeys("g", "home"),
+			key.WithHelp("g", "home"),
 		),
 		End: key.NewBinding(
 			key.WithKeys("G", "end"),
+			key.WithHelp("G", "end"),
 		),
 	}
 }
@@ -57,8 +57,6 @@ func (k KeyMap) KeyBindings() []key.Binding {
 	return []key.Binding{
 		k.Down,
 		k.Up,
-		k.NDown,
-		k.NUp,
 		k.DownOneItem,
 		k.UpOneItem,
 		k.HalfPageDown,

internal/tui/components/core/list/list.go 🔗

@@ -254,10 +254,6 @@ func New(opts ...listOptions) ListModel {
 		ti.Focus()
 		ti.SetStyles(t.S().TextInput)
 		m.input = ti
-
-		// disable j,k movements
-		m.keyMap.NDown.SetEnabled(false)
-		m.keyMap.NUp.SetEnabled(false)
 	}
 	return m
 }
@@ -319,9 +315,9 @@ func (m *model) View() tea.View {
 // Supports scrolling, item selection, and navigation to top/bottom.
 func (m *model) handleKeyPress(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) {
 	switch {
-	case key.Matches(msg, m.keyMap.Down) || key.Matches(msg, m.keyMap.NDown):
+	case key.Matches(msg, m.keyMap.Down):
 		m.scrollDown(1)
-	case key.Matches(msg, m.keyMap.Up) || key.Matches(msg, m.keyMap.NUp):
+	case key.Matches(msg, m.keyMap.Up):
 		m.scrollUp(1)
 	case key.Matches(msg, m.keyMap.DownOneItem):
 		return m, m.selectNextItem()

internal/tui/components/dialogs/commands/commands.go 🔗

@@ -68,8 +68,6 @@ func NewCommandDialog(sessionID string) CommandsDialog {
 
 	listKeyMap.Down.SetEnabled(false)
 	listKeyMap.Up.SetEnabled(false)
-	listKeyMap.NDown.SetEnabled(false)
-	listKeyMap.NUp.SetEnabled(false)
 	listKeyMap.HalfPageDown.SetEnabled(false)
 	listKeyMap.HalfPageUp.SetEnabled(false)
 	listKeyMap.Home.SetEnabled(false)

internal/tui/components/dialogs/models/models.go 🔗

@@ -53,8 +53,6 @@ func NewModelDialogCmp() ModelDialog {
 
 	listKeyMap.Down.SetEnabled(false)
 	listKeyMap.Up.SetEnabled(false)
-	listKeyMap.NDown.SetEnabled(false)
-	listKeyMap.NUp.SetEnabled(false)
 	listKeyMap.HalfPageDown.SetEnabled(false)
 	listKeyMap.HalfPageUp.SetEnabled(false)
 	listKeyMap.Home.SetEnabled(false)

internal/tui/components/dialogs/sessions/sessions.go 🔗

@@ -42,8 +42,6 @@ func NewSessionDialogCmp(sessions []session.Session, selectedID string) SessionD
 
 	listKeyMap.Down.SetEnabled(false)
 	listKeyMap.Up.SetEnabled(false)
-	listKeyMap.NDown.SetEnabled(false)
-	listKeyMap.NUp.SetEnabled(false)
 	listKeyMap.HalfPageDown.SetEnabled(false)
 	listKeyMap.HalfPageUp.SetEnabled(false)
 	listKeyMap.Home.SetEnabled(false)