1package filepicker
 2
 3import (
 4	"github.com/charmbracelet/bubbles/v2/key"
 5)
 6
 7// KeyMap defines keyboard bindings for dialog management.
 8type KeyMap struct {
 9	Select,
10	Down,
11	Up,
12	Forward,
13	Backward,
14	Close key.Binding
15}
16
17func DefaultKeyMap() KeyMap {
18	return KeyMap{
19		Select: key.NewBinding(
20			key.WithKeys("enter"),
21			key.WithHelp("enter", "accept"),
22		),
23		Down: key.NewBinding(
24			key.WithKeys("down", "j"),
25			key.WithHelp("down/j", "move down"),
26		),
27		Up: key.NewBinding(
28			key.WithKeys("up", "k"),
29			key.WithHelp("up/k", "move up"),
30		),
31		Forward: key.NewBinding(
32			key.WithKeys("right", "l"),
33			key.WithHelp("right/l", "move forward"),
34		),
35		Backward: key.NewBinding(
36			key.WithKeys("left", "h"),
37			key.WithHelp("left/h", "move backward"),
38		),
39
40		Close: key.NewBinding(
41			key.WithKeys("esc", "alt+esc"),
42			key.WithHelp("esc", "close/exit"),
43		),
44	}
45}
46
47// KeyBindings implements layout.KeyMapProvider
48func (k KeyMap) KeyBindings() []key.Binding {
49	return []key.Binding{
50		k.Select,
51		k.Down,
52		k.Up,
53		k.Forward,
54		k.Backward,
55		k.Close,
56	}
57}
58
59// FullHelp implements help.KeyMap.
60func (k KeyMap) FullHelp() [][]key.Binding {
61	m := [][]key.Binding{}
62	slice := k.KeyBindings()
63	for i := 0; i < len(slice); i += 4 {
64		end := min(i+4, len(slice))
65		m = append(m, slice[i:end])
66	}
67	return m
68}
69
70// ShortHelp implements help.KeyMap.
71func (k KeyMap) ShortHelp() []key.Binding {
72	return []key.Binding{
73		key.NewBinding(
74			key.WithKeys("right", "l", "left", "h", "up", "k", "down", "j"),
75			key.WithHelp("↑↓←→", "navigate"),
76		),
77		k.Select,
78		k.Close,
79	}
80}