package ui import "github.com/charmbracelet/bubbles/key" // KeyMap defines vim-style bindings for the TUI. type KeyMap struct { Up key.Binding Down key.Binding New key.Binding Search key.Binding Project key.Binding MoveTicket key.Binding // P — move selected ticket to another project Board key.Binding Status key.Binding Edit key.Binding EditInEditor key.Binding // ctrl+e — open $EDITOR while creating Delete key.Binding // x — confirm first DeleteForce key.Binding // X — immediate ConfirmYes key.Binding Toggle key.Binding // space — toggle multi-select / checklist item ChecklistPrev key.Binding // K / shift+up — previous checkbox ChecklistNext key.Binding // J / shift+down — next checkbox Timer key.Binding // t — start/stop timer TimeManual key.Binding // T — manual duration TimeEntries key.Binding // m — manage time entries Report key.Binding // r — time report Sync key.Binding // Y — pull YouTrack issues MCPToken key.Binding // g — create MCP token for project MCPTokenRevoke key.Binding // G — revoke MCP token Undo key.Binding Redo key.Binding Quit key.Binding Enter key.Binding Escape key.Binding Tab key.Binding // tab — next form field ShiftTab key.Binding // shift+tab — previous form field } // DefaultKeyMap returns the default key bindings. func DefaultKeyMap() KeyMap { return KeyMap{ Up: key.NewBinding( key.WithKeys("k", "up"), key.WithHelp("j/k", "navigate"), ), Down: key.NewBinding( key.WithKeys("j", "down"), key.WithHelp("j/k", "navigate"), ), New: key.NewBinding( key.WithKeys("n"), key.WithHelp("n", "new"), ), Search: key.NewBinding( key.WithKeys("/"), key.WithHelp("/", "search"), ), Project: key.NewBinding( key.WithKeys("p"), key.WithHelp("p", "project"), ), MoveTicket: key.NewBinding( key.WithKeys("P"), key.WithHelp("P", "move ticket"), ), Board: key.NewBinding( key.WithKeys("l", "tab"), key.WithHelp("l", "list"), ), Status: key.NewBinding( key.WithKeys("s", "enter"), key.WithHelp("s", "status"), ), Edit: key.NewBinding( key.WithKeys("e"), key.WithHelp("e", "edit"), ), EditInEditor: key.NewBinding( key.WithKeys("ctrl+e"), key.WithHelp("ctrl+e", "editor"), ), Delete: key.NewBinding( key.WithKeys("x"), key.WithHelp("x", "delete"), ), DeleteForce: key.NewBinding( key.WithKeys("X"), key.WithHelp("X", "force delete"), ), ConfirmYes: key.NewBinding( key.WithKeys("y", "Y"), key.WithHelp("y", "confirm"), ), Toggle: key.NewBinding( key.WithKeys(" "), key.WithHelp("space", "toggle"), ), ChecklistPrev: key.NewBinding( key.WithKeys("K", "shift+up"), key.WithHelp("J/K", "checklist"), ), ChecklistNext: key.NewBinding( key.WithKeys("J", "shift+down"), key.WithHelp("J/K", "checklist"), ), Timer: key.NewBinding( key.WithKeys("t"), key.WithHelp("t", "timer"), ), TimeManual: key.NewBinding( key.WithKeys("T"), key.WithHelp("T", "log time"), ), TimeEntries: key.NewBinding( key.WithKeys("m"), key.WithHelp("m", "time entries"), ), Report: key.NewBinding( key.WithKeys("r"), key.WithHelp("r", "report"), ), Sync: key.NewBinding( key.WithKeys("Y"), key.WithHelp("Y", "YouTrack pull/push"), ), MCPToken: key.NewBinding( key.WithKeys("g"), key.WithHelp("g", "MCP token"), ), MCPTokenRevoke: key.NewBinding( key.WithKeys("G"), key.WithHelp("G", "revoke MCP token"), ), Undo: key.NewBinding( key.WithKeys("u", "ctrl+z"), key.WithHelp("u", "undo"), ), Redo: key.NewBinding( key.WithKeys("ctrl+r", "U"), key.WithHelp("U", "redo"), ), Quit: key.NewBinding( key.WithKeys("q", "ctrl+c"), key.WithHelp("q", "quit"), ), Enter: key.NewBinding( key.WithKeys("enter"), key.WithHelp("enter", "confirm"), ), Escape: key.NewBinding( key.WithKeys("esc"), key.WithHelp("esc", "cancel"), ), Tab: key.NewBinding( key.WithKeys("tab"), key.WithHelp("tab", "next field"), ), ShiftTab: key.NewBinding( key.WithKeys("shift+tab"), key.WithHelp("shift+tab", "prev field"), ), } } // ShortHelp implements help.KeyMap. func (k KeyMap) ShortHelp() []key.Binding { return []key.Binding{k.Up, k.New, k.Search, k.Project, k.MoveTicket, k.Board, k.Status, k.Edit, k.Timer, k.TimeManual, k.TimeEntries, k.Report, k.Sync, k.MCPToken, k.MCPTokenRevoke, k.Delete, k.DeleteForce, k.Undo, k.Redo, k.Quit} } // FullHelp implements help.KeyMap. func (k KeyMap) FullHelp() [][]key.Binding { return [][]key.Binding{k.ShortHelp()} }