package tui import ( "strings" "github.com/charmbracelet/lipgloss" ) type helpBinding struct { Key string Desc string } func (a *App) activeTabBindings() ([]helpBinding, bool) { switch a.activeTab { case TabScan: return []helpBinding{ {"s", "start scan"}, {"r", "retry errored rows"}, {"enter", "show row detail"}, {"esc", "cancel running scan / close modal"}, }, true case TabEvaluate: return []helpBinding{ {"r", "refresh pending"}, {"e", "evaluate pending batch"}, {"enter", "open report"}, {"esc", "cancel running eval / close modal"}, }, true case TabTracker: return []helpBinding{ {"r", "refresh list"}, {"a", "advance status (state machine)"}, {"n", "add note to selected app"}, {"f", "show pending follow-ups"}, }, true case TabReports: return []helpBinding{ {"enter", "open report file"}, {"/", "filter by company"}, {"r", "refresh list"}, }, true case TabSettings: return []helpBinding{ {"↑/↓", "move between fields"}, {"enter", "edit field"}, {"esc", "cancel edit"}, }, true case TabIntake: return []helpBinding{ {"tab", "next field"}, {"enter", "advance phase"}, }, true } return nil, false } func (a *App) renderHelp() string { var b strings.Builder b.WriteString(StyleTitle.Render("Help — keybindings")) b.WriteString("\n\n") b.WriteString(StyleSubtitle.Render("Global")) b.WriteString("\n") global := []helpBinding{ {"↑/↓", "switch tab (sidebar)"}, {"j/k", "move cursor in table"}, {"enter", "select / drill in"}, {"tab/shift+tab", "switch tab"}, {"?", "toggle help"}, {"q / ctrl+c", "quit"}, } for _, kb := range global { b.WriteString(" ") b.WriteString(StyleKey.Render(padRight(kb.Key, 14))) b.WriteString(StyleKeyDesc.Render(kb.Desc)) b.WriteString("\n") } if tab, ok := a.activeTabBindings(); ok { b.WriteString("\n") b.WriteString(StyleSubtitle.Render(a.activeTab)) b.WriteString("\n") for _, kb := range tab { b.WriteString(" ") b.WriteString(StyleKey.Render(padRight(kb.Key, 14))) b.WriteString(StyleKeyDesc.Render(kb.Desc)) b.WriteString("\n") } } b.WriteString("\n") b.WriteString(StyleKeyDesc.Render("press ? or esc to close")) return lipgloss.NewStyle().Width(52).Render(StyleModal.Render(b.String())) } func padRight(s string, n int) string { if len(s) >= n { return s } return s + strings.Repeat(" ", n-len(s)) }