diff --git a/internal/tui/components/chat/chat.go b/internal/tui/components/chat/chat.go index 95c9ad2d2831ab39da9ddd524fec2932ad9ddc73..21e7b74cdcf569c28a12a647069774a0c255715c 100644 --- a/internal/tui/components/chat/chat.go +++ b/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() } diff --git a/internal/tui/components/chat/messages/messages.go b/internal/tui/components/chat/messages/messages.go index 52ca288b9aa5a140f2abaa9ee64ae8775e78bfa6..7c8a6d323814cfeb1fdfcbe0182fb8cfbe96fc5e 100644 --- a/internal/tui/components/chat/messages/messages.go +++ b/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 diff --git a/internal/tui/components/chat/messages/tool.go b/internal/tui/components/chat/messages/tool.go index 458e5ed320c2ce6c33fc35afef8a076a6e594e56..5a70acfe297e8f9716e229cb013160a6662a5970 100644 --- a/internal/tui/components/chat/messages/tool.go +++ b/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, diff --git a/internal/tui/components/completions/completions.go b/internal/tui/components/completions/completions.go index 625c49caba3ca070d07902845e82478d8064274e..a039e9e86be9e6635ee2d1a1063d9e1c469dbabd 100644 --- a/internal/tui/components/completions/completions.go +++ b/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) diff --git a/internal/tui/components/core/list/keys.go b/internal/tui/components/core/list/keys.go index 0e33b62d1b615ea49866881b770d292486b688de..3da14602ed2334f21e2af2e01574ccbcad0df8d5 100644 --- a/internal/tui/components/core/list/keys.go +++ b/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, diff --git a/internal/tui/components/core/list/list.go b/internal/tui/components/core/list/list.go index 79ad6d62b0744650a5d2a0deb5f3b46582704407..3ad3f68dffd46960bcfb5f969991f25218494a2c 100644 --- a/internal/tui/components/core/list/list.go +++ b/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() diff --git a/internal/tui/components/dialogs/commands/commands.go b/internal/tui/components/dialogs/commands/commands.go index 3008f8368da33a97b22742ea2b6d1074f68d0c5b..cbbbc989942268ebd2ac7c44a35a327cec1509fd 100644 --- a/internal/tui/components/dialogs/commands/commands.go +++ b/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) diff --git a/internal/tui/components/dialogs/models/models.go b/internal/tui/components/dialogs/models/models.go index 02bb8514e59c94aaaf85c5739d8b8a7e92b0d1d2..906d87a9dfe65c1ec09bd5abaf4f9d6865545038 100644 --- a/internal/tui/components/dialogs/models/models.go +++ b/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) diff --git a/internal/tui/components/dialogs/sessions/sessions.go b/internal/tui/components/dialogs/sessions/sessions.go index 37c7d12d8c846a83f4a778ca87cc404a51a065f3..78a834911f04bbb0c1cbe100c150da4818c52da6 100644 --- a/internal/tui/components/dialogs/sessions/sessions.go +++ b/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)