package tui import "strings" func renderHelp(width, height int) string { sections := []struct { title string binds [][2]string }{ {"Navigation", [][2]string{ {"j/k ↑/↓", "move cursor"}, {"g/G home/end", "top / bottom"}, {"pgup/pgdn", "page up / down"}, {"enter", "view detail"}, {"esc", "back / clear filter"}, }}, {"Views", [][2]string{ {"1", "stream view"}, {"2", "cards view"}, {"s", "cycle sort (cards)"}, {"tab", "cycle intent (cards)"}, }}, {"Actions", [][2]string{ {"a", "add entity (or ?query to search)"}, {"d", "delete (with confirm)"}, {"x", "toggle todo completion"}, {"!", "toggle pin"}, {"#", "filter by tag"}, {"m", "absorb (merge into target)"}, {"p", "promote to card"}, }}, {"Detail View", [][2]string{ {"p", "promote to card"}, {"D", "demote to fluid"}, {"c", "copy to clipboard"}, {"e", "edit in $EDITOR"}, {"!", "toggle pin"}, {"r", "run checklist"}, {"f", "fill template"}, }}, {"Run Mode", [][2]string{ {"j/k", "move between steps"}, {"space", "toggle step"}, {"r", "reset all steps"}, {"esc", "save + exit"}, }}, {"Fill Mode", [][2]string{ {"tab", "next slot"}, {"shift+tab", "prev slot"}, {"enter", "copy resolved"}, {"esc", "cancel"}, }}, {"Split View", [][2]string{ {"l", "focus detail pane"}, {"h", "focus list pane"}, {"esc", "close detail / back"}, }}, {"Global", [][2]string{ {"?", "toggle help"}, {"q / ctrl+c", "quit"}, }}, } var b strings.Builder b.WriteString(detailHeaderStyle.Render("keybindings")) b.WriteString("\n\n") for _, s := range sections { b.WriteString(titleStyle.Render(s.title)) b.WriteString("\n") for _, bind := range s.binds { key := helpKeyStyle.Render(bind[0]) desc := helpDescStyle.Render(bind[1]) b.WriteString(" " + key + " " + desc + "\n") } b.WriteString("\n") } b.WriteString(helpStyle.Render("press ? or esc to close")) lines := strings.Split(b.String(), "\n") if len(lines) > height { lines = lines[:height] } return strings.Join(lines, "\n") }