106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
package tui
|
|
|
|
import (
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
func (m Model) BuildHelpView() string {
|
|
bold := lipgloss.NewStyle().Foreground(lipgloss.Color("#FFFFFF")).Bold(true)
|
|
base := lipgloss.NewStyle().Foreground(lipgloss.Color("#AAAAAA"))
|
|
header := lipgloss.NewStyle().Foreground(lipgloss.Color("#4682B4")).Bold(true)
|
|
rowStyle := lipgloss.NewStyle().Padding(0, 1)
|
|
|
|
sections := []struct {
|
|
title string
|
|
keys []struct{ key, desc string }
|
|
}{
|
|
{
|
|
title: "navigation",
|
|
keys: []struct{ key, desc string }{
|
|
{"s", "shop"},
|
|
{"c", "cart"},
|
|
{"a", "account"},
|
|
{"m", "menu"},
|
|
},
|
|
},
|
|
{
|
|
title: "browsing",
|
|
keys: []struct{ key, desc string }{
|
|
{"j/k", "move cursor down/up"},
|
|
{"+/-", "adjust quantity"},
|
|
{"pgup/pgdn", "scroll content"},
|
|
},
|
|
},
|
|
{
|
|
title: "cart & checkout",
|
|
keys: []struct{ key, desc string }{
|
|
{"p/enter", "proceed to checkout"},
|
|
{"d/x", "delete address or card"},
|
|
{"esc", "go back one step"},
|
|
},
|
|
},
|
|
{
|
|
title: "account",
|
|
keys: []struct{ key, desc string }{
|
|
{"enter", "select / drill in"},
|
|
{"esc", "go back"},
|
|
},
|
|
},
|
|
{
|
|
title: "forms",
|
|
keys: []struct{ key, desc string }{
|
|
{"tab", "next field"},
|
|
{"enter", "submit form"},
|
|
{"esc", "cancel"},
|
|
},
|
|
},
|
|
{
|
|
title: "general",
|
|
keys: []struct{ key, desc string }{
|
|
{"?", "toggle help page"},
|
|
{"q", "quit"},
|
|
{"ctrl+c", "force quit"},
|
|
},
|
|
},
|
|
}
|
|
|
|
content := ""
|
|
for i, section := range sections {
|
|
if i > 0 {
|
|
content += "\n"
|
|
}
|
|
content += rowStyle.Render(header.Render(section.title)) + "\n"
|
|
for _, k := range section.keys {
|
|
content += rowStyle.Render(bold.Render(k.key)+" "+base.Render(k.desc)) + "\n"
|
|
}
|
|
}
|
|
|
|
logoStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("#FFFFFF")).Bold(true)
|
|
logo := logoStyle.Render("keybindings")
|
|
|
|
modal := lipgloss.NewStyle().
|
|
Border(lipgloss.NormalBorder()).
|
|
BorderForeground(lipgloss.Color("#666666")).
|
|
Padding(1, 2).
|
|
Render(content)
|
|
|
|
hint := base.Render("press esc or ? to close")
|
|
|
|
assembled := lipgloss.JoinVertical(
|
|
lipgloss.Center,
|
|
logo,
|
|
"",
|
|
modal,
|
|
"",
|
|
hint,
|
|
)
|
|
|
|
return lipgloss.Place(
|
|
m.viewportWidth,
|
|
m.viewportHeight,
|
|
lipgloss.Center,
|
|
lipgloss.Center,
|
|
assembled,
|
|
)
|
|
}
|