internal/tui/keys/help.go

package keys

import (
	"strings"

	"github.com/charmbracelet/bubbles/help"
	"github.com/charmbracelet/bubbles/key"
	"github.com/charmbracelet/lipgloss"
)

// ShortHelp is what the help view shows in the single-row layout.
func (m Map) ShortHelp() []key.Binding {
	return []key.Binding{m.Up, m.Down, m.ToggleFilter, m.FocusDetail, m.Help, m.Quit}
}

// FullHelp is the expanded, multi-column layout.
func (m Map) FullHelp() [][]key.Binding {
	return [][]key.Binding{
		{m.Up, m.Down, m.PageUp, m.PageDown, m.Top, m.Bottom},
		{m.ToggleFilter, m.FocusList, m.FocusDetail, m.Export, m.Copy},
		{m.Help, m.Quit},
	}
}

// Render draws the help text using the supplied help.Model.
func (m Map) Render(h help.Model, full bool) string {
	if full {
		return h.FullHelpView(m.FullHelp())
	}
	return h.ShortHelpView(m.ShortHelp())
}

// Cheatsheet returns a plain-text dump suitable for --help or the man
// page, one binding per line.
func (m Map) Cheatsheet() string {
	title := lipgloss.NewStyle().Bold(true).Render("Keybindings")
	var b strings.Builder
	b.WriteString(title)
	b.WriteByte('\n')
	for _, kb := range m.All() {
		hk := kb.Help().Key
		hd := kb.Help().Desc
		b.WriteString("  ")
		b.WriteString(hk)
		if pad := 12 - len(hk); pad > 0 {
			b.WriteString(strings.Repeat(" ", pad))
		}
		b.WriteString(hd)
		b.WriteByte('\n')
	}
	return b.String()
}