on main help sign in
chore: tool border, navigation help
00d444eKujtim Hoxha
internal/tui/components/chat/chat.go+1−2
@@ -509,6 +509,5 @@ func (m *messageListCmp) IsFocused() bool {
509}
509}
510
510
511func (m *messageListCmp) Bindings() []key.Binding {
511func (m *messageListCmp) Bindings() []key.Binding {
512− bindings := m.defaultListKeyMap.KeyBindings()
512+ return m.defaultListKeyMap.KeyBindings()
513− return bindings
514}
513}
internal/tui/components/chat/messages/messages.go+5−1
@@ -43,6 +43,10 @@ type messageCmp struct {
43 anim util.Model // Animation component for loading states
43 anim util.Model // Animation component for loading states
44}
44}
45
45
46+var focusedMessageBorder = lipgloss.Border{
47+ Left: "▌",
48+}
49+
46// NewMessageCmp creates a new message component with the given message and options
50// NewMessageCmp creates a new message component with the given message and options
47func NewMessageCmp(msg message.Message) MessageCmp {
51func NewMessageCmp(msg message.Message) MessageCmp {
48 m := &messageCmp{
52 m := &messageCmp{
@@ -112,7 +116,7 @@ func (msg *messageCmp) style() lipgloss.Style {
112 t := styles.CurrentTheme()
116 t := styles.CurrentTheme()
113 borderStyle := lipgloss.NormalBorder()
117 borderStyle := lipgloss.NormalBorder()
114 if msg.focused {
118 if msg.focused {
115− borderStyle = lipgloss.ThickBorder()
119+ borderStyle = focusedMessageBorder
116 }
120 }
117
121
118 style := t.S().Text
122 style := t.S().Text
internal/tui/components/chat/messages/tool.go+6−1
@@ -224,7 +224,12 @@ func (m *toolCallCmp) style() lipgloss.Style {
224 if m.isNested {
224 if m.isNested {
225 return t.S().Muted
225 return t.S().Muted
226 }
226 }
227− return t.S().Muted.PaddingLeft(4)
227+ style := t.S().Muted.PaddingLeft(4)
228+
229+ if m.focused {
230+ style = style.PaddingLeft(3).BorderStyle(focusedMessageBorder).BorderLeft(true).BorderForeground(t.GreenDark)
231+ }
232+ return style
228}
233}
229
234
230// textWidth calculates the available width for text content,
235// textWidth calculates the available width for text content,
internal/tui/components/completions/completions.go−2
@@ -57,8 +57,6 @@ func New() Completions {
57 keyMap := list.DefaultKeyMap()
57 keyMap := list.DefaultKeyMap()
58 keyMap.Up.SetEnabled(false)
58 keyMap.Up.SetEnabled(false)
59 keyMap.Down.SetEnabled(false)
59 keyMap.Down.SetEnabled(false)
60− keyMap.NDown.SetEnabled(false)
61− keyMap.NUp.SetEnabled(false)
62 keyMap.HalfPageDown.SetEnabled(false)
60 keyMap.HalfPageDown.SetEnabled(false)
63 keyMap.HalfPageUp.SetEnabled(false)
61 keyMap.HalfPageUp.SetEnabled(false)
64 keyMap.Home.SetEnabled(false)
62 keyMap.Home.SetEnabled(false)
internal/tui/components/core/list/keys.go+10−12
@@ -7,8 +7,6 @@ import (
7type KeyMap struct {
7type KeyMap struct {
8 Down,
8 Down,
9 Up,
9 Up,
10− NDown,
11− NUp,
12 DownOneItem,
10 DownOneItem,
13 UpOneItem,
11 UpOneItem,
14 HalfPageDown,
12 HalfPageDown,
@@ -20,34 +18,36 @@ type KeyMap struct {
20func DefaultKeyMap() KeyMap {
18func DefaultKeyMap() KeyMap {
21 return KeyMap{
19 return KeyMap{
22 Down: key.NewBinding(
20 Down: key.NewBinding(
23− key.WithKeys("down", "ctrl+j", "ctrl+n"),
21+ key.WithKeys("down", "ctrl+j", "ctrl+n", "j"),
22+ key.WithHelp("↓", "down"),
24 ),
23 ),
25 Up: key.NewBinding(
24 Up: key.NewBinding(
26− key.WithKeys("up", "ctrl+k", "ctrl+p"),
25+ key.WithKeys("up", "ctrl+k", "ctrl+p", "k"),
27− ),
26+ key.WithHelp("↑", "up"),
28− NDown: key.NewBinding(
29− key.WithKeys("j"),
30− ),
31− NUp: key.NewBinding(
32− key.WithKeys("k"),
33 ),
27 ),
34 UpOneItem: key.NewBinding(
28 UpOneItem: key.NewBinding(
35 key.WithKeys("shift+up", "K"),
29 key.WithKeys("shift+up", "K"),
30+ key.WithHelp("shift+↑", "up one item"),
36 ),
31 ),
37 DownOneItem: key.NewBinding(
32 DownOneItem: key.NewBinding(
38 key.WithKeys("shift+down", "J"),
33 key.WithKeys("shift+down", "J"),
34+ key.WithHelp("shift+↓", "down one item"),
39 ),
35 ),
40 HalfPageDown: key.NewBinding(
36 HalfPageDown: key.NewBinding(
41 key.WithKeys("d"),
37 key.WithKeys("d"),
38+ key.WithHelp("d", "half page down"),
42 ),
39 ),
43 HalfPageUp: key.NewBinding(
40 HalfPageUp: key.NewBinding(
44 key.WithKeys("u"),
41 key.WithKeys("u"),
42+ key.WithHelp("u", "half page up"),
45 ),
43 ),
46 Home: key.NewBinding(
44 Home: key.NewBinding(
47 key.WithKeys("g", "home"),
45 key.WithKeys("g", "home"),
46+ key.WithHelp("g", "home"),
48 ),
47 ),
49 End: key.NewBinding(
48 End: key.NewBinding(
50 key.WithKeys("G", "end"),
49 key.WithKeys("G", "end"),
50+ key.WithHelp("G", "end"),
51 ),
51 ),
52 }
52 }
53}
53}
@@ -57,8 +57,6 @@ func (k KeyMap) KeyBindings() []key.Binding {
57 return []key.Binding{
57 return []key.Binding{
58 k.Down,
58 k.Down,
59 k.Up,
59 k.Up,
60− k.NDown,
61− k.NUp,
62 k.DownOneItem,
60 k.DownOneItem,
63 k.UpOneItem,
61 k.UpOneItem,
64 k.HalfPageDown,
62 k.HalfPageDown,
internal/tui/components/core/list/list.go+2−6
@@ -254,10 +254,6 @@ func New(opts ...listOptions) ListModel {
254 ti.Focus()
254 ti.Focus()
255 ti.SetStyles(t.S().TextInput)
255 ti.SetStyles(t.S().TextInput)
256 m.input = ti
256 m.input = ti
257−
258− // disable j,k movements
259− m.keyMap.NDown.SetEnabled(false)
260− m.keyMap.NUp.SetEnabled(false)
261 }
257 }
262 return m
258 return m
263}
259}
@@ -319,9 +315,9 @@ func (m *model) View() tea.View {
319// Supports scrolling, item selection, and navigation to top/bottom.
315// Supports scrolling, item selection, and navigation to top/bottom.
320func (m *model) handleKeyPress(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) {
316func (m *model) handleKeyPress(msg tea.KeyPressMsg) (tea.Model, tea.Cmd) {
321 switch {
317 switch {
322− case key.Matches(msg, m.keyMap.Down) || key.Matches(msg, m.keyMap.NDown):
318+ case key.Matches(msg, m.keyMap.Down):
323 m.scrollDown(1)
319 m.scrollDown(1)
324− case key.Matches(msg, m.keyMap.Up) || key.Matches(msg, m.keyMap.NUp):
320+ case key.Matches(msg, m.keyMap.Up):
325 m.scrollUp(1)
321 m.scrollUp(1)
326 case key.Matches(msg, m.keyMap.DownOneItem):
322 case key.Matches(msg, m.keyMap.DownOneItem):
327 return m, m.selectNextItem()
323 return m, m.selectNextItem()
internal/tui/components/dialogs/commands/commands.go−2
@@ -68,8 +68,6 @@ func NewCommandDialog(sessionID string) CommandsDialog {
68
68
69 listKeyMap.Down.SetEnabled(false)
69 listKeyMap.Down.SetEnabled(false)
70 listKeyMap.Up.SetEnabled(false)
70 listKeyMap.Up.SetEnabled(false)
71− listKeyMap.NDown.SetEnabled(false)
72− listKeyMap.NUp.SetEnabled(false)
73 listKeyMap.HalfPageDown.SetEnabled(false)
71 listKeyMap.HalfPageDown.SetEnabled(false)
74 listKeyMap.HalfPageUp.SetEnabled(false)
72 listKeyMap.HalfPageUp.SetEnabled(false)
75 listKeyMap.Home.SetEnabled(false)
73 listKeyMap.Home.SetEnabled(false)
internal/tui/components/dialogs/models/models.go−2
@@ -53,8 +53,6 @@ func NewModelDialogCmp() ModelDialog {
53
53
54 listKeyMap.Down.SetEnabled(false)
54 listKeyMap.Down.SetEnabled(false)
55 listKeyMap.Up.SetEnabled(false)
55 listKeyMap.Up.SetEnabled(false)
56− listKeyMap.NDown.SetEnabled(false)
57− listKeyMap.NUp.SetEnabled(false)
58 listKeyMap.HalfPageDown.SetEnabled(false)
56 listKeyMap.HalfPageDown.SetEnabled(false)
59 listKeyMap.HalfPageUp.SetEnabled(false)
57 listKeyMap.HalfPageUp.SetEnabled(false)
60 listKeyMap.Home.SetEnabled(false)
58 listKeyMap.Home.SetEnabled(false)
internal/tui/components/dialogs/sessions/sessions.go−2
@@ -42,8 +42,6 @@ func NewSessionDialogCmp(sessions []session.Session, selectedID string) SessionD
42
42
43 listKeyMap.Down.SetEnabled(false)
43 listKeyMap.Down.SetEnabled(false)
44 listKeyMap.Up.SetEnabled(false)
44 listKeyMap.Up.SetEnabled(false)
45− listKeyMap.NDown.SetEnabled(false)
46− listKeyMap.NUp.SetEnabled(false)
47 listKeyMap.HalfPageDown.SetEnabled(false)
45 listKeyMap.HalfPageDown.SetEnabled(false)
48 listKeyMap.HalfPageUp.SetEnabled(false)
46 listKeyMap.HalfPageUp.SetEnabled(false)
49 listKeyMap.Home.SetEnabled(false)
47 listKeyMap.Home.SetEnabled(false)