Skip to content

Commit c109085

Browse files
feat: add help menu and improve project maintenance with fmt target and zip ignore
1 parent fed0d2a commit c109085

4 files changed

Lines changed: 54 additions & 23 deletions

File tree

Makefile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
.PHONY: build test lint clean run
1+
.PHONY: build test lint clean run fmt
22

33
BINARY_NAME=kairo
44

5+
fmt:
6+
go fmt ./...
7+
58
build:
69
go build -trimpath -ldflags "-s -w" -o $(BINARY_NAME) ./cmd/kairo
710

@@ -21,3 +24,4 @@ run: build
2124

2225
install:
2326
go install ./cmd/kairo
27+

internal/app/model.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212
"time"
1313

14+
"github.com/charmbracelet/bubbles/key"
1415
tea "github.com/charmbracelet/bubbletea"
1516
"github.com/charmbracelet/lipgloss"
1617

@@ -684,27 +685,49 @@ func (m *Model) renderHeader() string {
684685
Render(header)
685686
}
686687

688+
// firstKey returns the first configured key for a binding, or "?" if unset.
689+
func firstKey(b key.Binding) string {
690+
keys := b.Keys()
691+
if len(keys) == 0 {
692+
return "?"
693+
}
694+
return keys[0]
695+
}
696+
687697
func (m *Model) renderFooter() string {
698+
fk := firstKey
688699
left := ""
689700
switch m.mode {
690701
case ModeConfirmDelete:
691702
left = m.s.BadgeBad.Render(" DELETE? ") + " " + m.s.Muted.Render("y/enter confirm • n/esc cancel")
692703
case ModeDetail:
693-
left = " " + m.s.Muted.Render("esc back • e edit • ctrl+p palette • ? help")
704+
left = " " + m.s.Muted.Render(
705+
fk(m.km.Back)+" back • "+
706+
fk(m.km.EditTask)+" edit • "+
707+
fk(m.km.Palette)+" palette • "+
708+
fk(m.km.Help)+" help",
709+
)
694710
case ModeEditor:
695711
left = " " + m.s.Muted.Render("ctrl+s save • esc cancel • tab next field")
696712
case ModePalette:
697713
left = " " + m.s.Muted.Render("enter select • esc close • ↑/↓ navigate")
698714
case ModeHelp:
699-
left = " " + m.s.Muted.Render("esc/q/? close")
715+
left = " " + m.s.Muted.Render("esc/q/"+fk(m.km.Help)+" close")
700716
case ModeThemeMenu:
701-
left = " " + m.s.Muted.Render("enter select • esc/q/t close • ↑/↓ navigate")
717+
left = " " + m.s.Muted.Render("enter select • esc/q/"+fk(m.km.CycleTheme)+" close • ↑/↓ navigate")
702718
case ModePluginMenu:
703-
left = " " + m.s.Muted.Render("x uninstall • esc/q/p close • ↑/↓ navigate")
719+
left = " " + m.s.Muted.Render("x uninstall • esc/q/"+fk(m.km.ManagePlugins)+" close • ↑/↓ navigate")
704720
case ModePluginUninstall:
705721
left = m.s.BadgeBad.Render(" UNINSTALL? ") + " " + m.s.Muted.Render("y/enter confirm • n/esc cancel")
706722
default:
707-
left = " " + m.s.Muted.Render("ctrl+p palette • n new • g reload plugins • d delete • ? help • 1-5 views")
723+
left = " " + m.s.Muted.Render(
724+
fk(m.km.Palette)+" palette • "+
725+
fk(m.km.NewTask)+" new • "+
726+
"g reload plugins • "+
727+
fk(m.km.DeleteTask)+" delete • "+
728+
fk(m.km.Help)+" help • "+
729+
fk(m.km.ViewInbox)+"-"+fk(m.km.ViewPriority)+" views",
730+
)
708731
}
709732

710733
right := ""

internal/internal.zip

48.1 KB
Binary file not shown.

internal/ui/help/model.go

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ package help
33
import (
44
"strings"
55

6-
tea "github.com/charmbracelet/bubbletea"
6+
"github.com/charmbracelet/bubbles/key"
7+
"github.com/charmbracelet/bubbletea"
78
"github.com/charmbracelet/lipgloss"
89

910
"github.com/programmersd21/kairo/internal/ui/keymap"
@@ -50,6 +51,11 @@ func (m Model) View() string {
5051

5152
header := m.styles.Title.Render(" Help & Keybindings ")
5253

54+
// Helper to extract keys from binding
55+
getK := func(b key.Binding) string {
56+
return strings.Join(b.Keys(), ", ")
57+
}
58+
5359
sections := []struct {
5460
title string
5561
keys []struct {
@@ -60,31 +66,29 @@ func (m Model) View() string {
6066
{
6167
"Navigation",
6268
[]struct{ key, desc string }{
63-
{"1-5, Tab", "Switch views (Inbox, Today, etc.)"},
64-
{"j/k, ↑/↓", "Move selection"},
65-
{"enter", "Open task details"},
66-
{"esc", "Back / Close"},
69+
{getK(m.km.ViewInbox) + ", " + getK(m.km.ViewToday) + ", " + getK(m.km.ViewUpcoming) + ", " + getK(m.km.ViewTag) + ", " + getK(m.km.ViewPriority), "Switch views"},
70+
{getK(m.km.OpenTask), "Open task details"},
71+
{getK(m.km.Back), "Back / Close"},
6772
},
6873
},
6974
{
7075
"Tasks",
7176
[]struct{ key, desc string }{
72-
{"n", "New task"},
73-
{"e", "Edit task"},
74-
{"d", "Delete task"},
75-
{"g", "Reload plugins"},
77+
{getK(m.km.NewTask), "New task"},
78+
{getK(m.km.EditTask), "Edit task"},
79+
{getK(m.km.DeleteTask), "Delete task"},
7680
},
7781
},
7882
{
7983
"App",
8084
[]struct{ key, desc string }{
81-
{"ctrl+p", "Command palette"},
82-
{"/", "Search tasks"},
83-
{"t", "Theme menu"},
84-
{"ctrl+g", "Open plugins folder"},
85-
{"p", "Manage plugins"},
86-
{"?", "Show help"},
87-
{"q", "Quit"},
85+
{getK(m.km.Palette), "Command palette"},
86+
{getK(m.km.TaskSearch), "Search tasks"},
87+
{getK(m.km.CycleTheme), "Theme menu"},
88+
{getK(m.km.OpenPluginDir), "Open plugins folder"},
89+
{getK(m.km.ManagePlugins), "Manage plugins"},
90+
{getK(m.km.Help), "Show help"},
91+
{getK(m.km.Quit), "Quit"},
8892
},
8993
},
9094
}
@@ -95,7 +99,7 @@ func (m Model) View() string {
9599
for _, s := range sections {
96100
content = append(content, lipgloss.NewStyle().Bold(true).Foreground(m.styles.Theme.Accent).Padding(0, 1).Render(s.title))
97101
for _, k := range s.keys {
98-
keyStr := lipgloss.NewStyle().Foreground(m.styles.Theme.Good).Width(10).Render(k.key)
102+
keyStr := lipgloss.NewStyle().Foreground(m.styles.Theme.Good).Width(15).Render(k.key)
99103
descStr := m.styles.Muted.Render(k.desc)
100104
content = append(content, lipgloss.NewStyle().Padding(0, 2).Render(keyStr+" "+descStr))
101105
}

0 commit comments

Comments
 (0)