Skip to content

Commit 3da3297

Browse files
authored
feat: floating help menu (#85)
1 parent e95cea2 commit 3da3297

File tree

8 files changed

+170
-72
lines changed

8 files changed

+170
-72
lines changed

go.mod

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ toolchain go1.24.11
66

77
require (
88
charm.land/bubbles/v2 v2.0.0-rc.1
9-
charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251116163936-f60735dff10c
9+
charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e
1010
charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251205162909-7869489d8971
1111
github.com/atotto/clipboard v0.1.4
12-
github.com/bluekeyes/go-gitdiff v0.8.0
13-
github.com/charmbracelet/log v0.4.0
14-
github.com/charmbracelet/x/ansi v0.11.2
12+
github.com/bluekeyes/go-gitdiff v0.8.1
13+
github.com/charmbracelet/log v0.4.2
14+
github.com/charmbracelet/x/ansi v0.11.6
1515
github.com/lrstanley/bubblezone/v2 v2.0.0-alpha.3
1616
github.com/muesli/reflow v0.3.0
1717
github.com/muesli/termenv v0.16.0
@@ -20,25 +20,26 @@ require (
2020

2121
require (
2222
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
23-
github.com/charmbracelet/colorprofile v0.3.3 // indirect
24-
github.com/charmbracelet/lipgloss v0.10.0 // indirect
25-
github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 // indirect
23+
github.com/charmbracelet/colorprofile v0.4.1 // indirect
24+
github.com/charmbracelet/lipgloss v1.1.0 // indirect
25+
github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560 // indirect
26+
github.com/charmbracelet/x/cellbuf v0.0.15 // indirect
2627
github.com/charmbracelet/x/term v0.2.2 // indirect
2728
github.com/charmbracelet/x/termios v0.1.1 // indirect
2829
github.com/charmbracelet/x/windows v0.2.2 // indirect
29-
github.com/clipperhouse/displaywidth v0.6.0 // indirect
30+
github.com/clipperhouse/displaywidth v0.9.0 // indirect
3031
github.com/clipperhouse/stringish v0.1.1 // indirect
31-
github.com/clipperhouse/uax29/v2 v2.3.0 // indirect
32-
github.com/go-logfmt/logfmt v0.6.0 // indirect
32+
github.com/clipperhouse/uax29/v2 v2.5.0 // indirect
33+
github.com/go-logfmt/logfmt v0.6.1 // indirect
3334
github.com/lucasb-eyer/go-colorful v1.3.0 // indirect
3435
github.com/mattn/go-isatty v0.0.20 // indirect
3536
github.com/mattn/go-runewidth v0.0.19 // indirect
3637
github.com/muesli/cancelreader v0.2.2 // indirect
3738
github.com/rivo/uniseg v0.4.7 // indirect
3839
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
39-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d // indirect
40-
golang.org/x/sync v0.18.0 // indirect
41-
golang.org/x/sys v0.38.0 // indirect
40+
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 // indirect
41+
golang.org/x/sync v0.19.0 // indirect
42+
golang.org/x/sys v0.40.0 // indirect
4243
)
4344

4445
replace charm.land/bubbles/v2 v2.0.0-rc.1 => github.com/dlvhdr/bubbles/v2 v2.0.0-rc-dlvhdr-2

go.sum

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251116163936-f60735dff10c h1:D6fRIiWez5fKROovANjYvbgsOMxeogmRV5ReD8uI4Z0=
2-
charm.land/bubbletea/v2 v2.0.0-rc.1.0.20251116163936-f60735dff10c/go.mod h1:xDDqZDHWaaz7G17eEFpQn648wq9OLtV7uFcjS3XGFlM=
1+
charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e h1:tXwTmgGpwZT7ParKF5xbEQBVjM2e1uKhKi/GpfU3mYQ=
2+
charm.land/bubbletea/v2 v2.0.0-rc.2.0.20251216153312-819e2e89c62e/go.mod h1:pDM18flq3Z4njKZPA3zCvyVSSIJbMcoqlE82BdGUtL8=
33
charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251205162909-7869489d8971 h1:xZFcNsJMiIDbFtWRyDmkKNk1sjojfaom4Zoe0cyH/8c=
44
charm.land/lipgloss/v2 v2.0.0-beta.3.0.20251205162909-7869489d8971/go.mod h1:i61Y3FmdbcBNSKa+pKB3DaE4uVQmBLMs/xlvRyHcXAE=
55
github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
@@ -8,18 +8,20 @@ github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiE
88
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
99
github.com/aymanbagabas/go-udiff v0.3.1 h1:LV+qyBQ2pqe0u42ZsUEtPiCaUoqgA9gYRDs3vj1nolY=
1010
github.com/aymanbagabas/go-udiff v0.3.1/go.mod h1:G0fsKmG+P6ylD0r6N/KgQD/nWzgfnl8ZBcNLgcbrw8E=
11-
github.com/bluekeyes/go-gitdiff v0.8.0 h1:Nn1wfw3/XeKoc3lWk+2bEXGUHIx36kj80FM1gVcBk+o=
12-
github.com/bluekeyes/go-gitdiff v0.8.0/go.mod h1:WWAk1Mc6EgWarCrPFO+xeYlujPu98VuLW3Tu+B/85AE=
13-
github.com/charmbracelet/colorprofile v0.3.3 h1:DjJzJtLP6/NZ8p7Cgjno0CKGr7wwRJGxWUwh2IyhfAI=
14-
github.com/charmbracelet/colorprofile v0.3.3/go.mod h1:nB1FugsAbzq284eJcjfah2nhdSLppN2NqvfotkfRYP4=
15-
github.com/charmbracelet/lipgloss v0.10.0 h1:KWeXFSexGcfahHX+54URiZGkBFazf70JNMtwg/AFW3s=
16-
github.com/charmbracelet/lipgloss v0.10.0/go.mod h1:Wig9DSfvANsxqkRsqj6x87irdy123SR4dOXlKa91ciE=
17-
github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8ZM=
18-
github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM=
19-
github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 h1:OqDqxQZliC7C8adA7KjelW3OjtAxREfeHkNcd66wpeI=
20-
github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318/go.mod h1:Y6kE2GzHfkyQQVCSL9r2hwokSrIlHGzZG+71+wDYSZI=
21-
github.com/charmbracelet/x/ansi v0.11.2 h1:XAG3FSjiVtFvgEgGrNBkCNNYrsucAt8c6bfxHyROLLs=
22-
github.com/charmbracelet/x/ansi v0.11.2/go.mod h1:9tY2bzX5SiJCU0iWyskjBeI2BRQfvPqI+J760Mjf+Rg=
11+
github.com/bluekeyes/go-gitdiff v0.8.1 h1:lL1GofKMywO17c0lgQmJYcKek5+s8X6tXVNOLxy4smI=
12+
github.com/bluekeyes/go-gitdiff v0.8.1/go.mod h1:WWAk1Mc6EgWarCrPFO+xeYlujPu98VuLW3Tu+B/85AE=
13+
github.com/charmbracelet/colorprofile v0.4.1 h1:a1lO03qTrSIRaK8c3JRxJDZOvhvIeSco3ej+ngLk1kk=
14+
github.com/charmbracelet/colorprofile v0.4.1/go.mod h1:U1d9Dljmdf9DLegaJ0nGZNJvoXAhayhmidOdcBwAvKk=
15+
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
16+
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
17+
github.com/charmbracelet/log v0.4.2 h1:hYt8Qj6a8yLnvR+h7MwsJv/XvmBJXiueUcI3cIxsyig=
18+
github.com/charmbracelet/log v0.4.2/go.mod h1:qifHGX/tc7eluv2R6pWIpyHDDrrb/AG71Pf2ysQu5nw=
19+
github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560 h1:j3PW2hypGoPKBy3ooKzW0TFxaxhyHK3NbkLLn4KeRFc=
20+
github.com/charmbracelet/ultraviolet v0.0.0-20251212194010-b927aa605560/go.mod h1:VWATWLRwYP06VYCEur7FsNR2B1xAo7Y+xl1PTbd1ePc=
21+
github.com/charmbracelet/x/ansi v0.11.6 h1:GhV21SiDz/45W9AnV2R61xZMRri5NlLnl6CVF7ihZW8=
22+
github.com/charmbracelet/x/ansi v0.11.6/go.mod h1:2JNYLgQUsyqaiLovhU2Rv/pb8r6ydXKS3NIttu3VGZQ=
23+
github.com/charmbracelet/x/cellbuf v0.0.15 h1:ur3pZy0o6z/R7EylET877CBxaiE1Sp1GMxoFPAIztPI=
24+
github.com/charmbracelet/x/cellbuf v0.0.15/go.mod h1:J1YVbR7MUuEGIFPCaaZ96KDl5NoS0DAWkskup+mOY+Q=
2325
github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f h1:pk6gmGpCE7F3FcjaOEKYriCvpmIN4+6OS/RD0vm4uIA=
2426
github.com/charmbracelet/x/exp/golden v0.0.0-20250806222409-83e3a29d542f/go.mod h1:IfZAMTHB6XkZSeXUqriemErjAWCCzT0LwjKFYCZyw0I=
2527
github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk=
@@ -28,18 +30,20 @@ github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8
2830
github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo=
2931
github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM=
3032
github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k=
31-
github.com/clipperhouse/displaywidth v0.6.0 h1:k32vueaksef9WIKCNcoqRNyKbyvkvkysNYnAWz2fN4s=
32-
github.com/clipperhouse/displaywidth v0.6.0/go.mod h1:R+kHuzaYWFkTm7xoMmK1lFydbci4X2CicfbGstSGg0o=
33+
github.com/clipperhouse/displaywidth v0.9.0 h1:Qb4KOhYwRiN3viMv1v/3cTBlz3AcAZX3+y9OLhMtAtA=
34+
github.com/clipperhouse/displaywidth v0.9.0/go.mod h1:aCAAqTlh4GIVkhQnJpbL0T/WfcrJXHcj8C0yjYcjOZA=
3335
github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfatpWHKCs=
3436
github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA=
35-
github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4=
36-
github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
37+
github.com/clipperhouse/uax29/v2 v2.5.0 h1:x7T0T4eTHDONxFJsL94uKNKPHrclyFI0lm7+w94cO8U=
38+
github.com/clipperhouse/uax29/v2 v2.5.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g=
3739
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
3840
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3941
github.com/dlvhdr/bubbles/v2 v2.0.0-rc-dlvhdr-2 h1:v+RlksFammxNyMhCHPXURvBv0DCee93sSn8zi/g+4kY=
4042
github.com/dlvhdr/bubbles/v2 v2.0.0-rc-dlvhdr-2/go.mod h1:7AcMcBkRUKAZ4Z0D5MwWbxKxVhVIqxLlNh+4rJJjGF4=
41-
github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
42-
github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
43+
github.com/go-logfmt/logfmt v0.6.1 h1:4hvbpePJKnIzH1B+8OR/JPbTx37NktoI9LE2QZBBkvE=
44+
github.com/go-logfmt/logfmt v0.6.1/go.mod h1:EV2pOAQoZaT1ZXZbqDl5hrymndi4SY9ED9/z6CO0XAk=
45+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
46+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
4347
github.com/lrstanley/bubblezone/v2 v2.0.0-alpha.3 h1:hFH0W7GQO1tCu9p0ljSxxr0PLWjrp/9NgHXEMWoCL70=
4448
github.com/lrstanley/bubblezone/v2 v2.0.0-alpha.3/go.mod h1:O2jUHrhH1gDH/VhsqNIv35PN8+7zyAQqZ16rQPpCJxU=
4549
github.com/lucasb-eyer/go-colorful v1.3.0 h1:2/yBRLdWBZKrf7gB40FoiKfAWYQ0lqNcbuQwVHXptag=
@@ -61,17 +65,17 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ
6165
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
6266
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
6367
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
64-
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
65-
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
68+
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
69+
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
6670
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
6771
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
68-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
69-
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
70-
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
71-
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
72+
golang.org/x/exp v0.0.0-20260112195511-716be5621a96 h1:Z/6YuSHTLOHfNFdb8zVZomZr7cqNgTJvA8+Qz75D8gU=
73+
golang.org/x/exp v0.0.0-20260112195511-716be5621a96/go.mod h1:nzimsREAkjBCIEFtHiYkrJyT+2uy9YZJB7H1k68CXZU=
74+
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
75+
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
7276
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
73-
golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
74-
golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
77+
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
78+
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
7579
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
7680
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7781
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

pkg/filenode/file_node.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ func ViewDiffStats(added, deleted int64, base lipgloss.Style) string {
211211
}
212212

213213
if added > 0 && deleted > 0 {
214-
addedView += " "
214+
addedView += base.Render(" ")
215215
}
216216

217217
if deleted > 0 {

pkg/ui/keys.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type KeyMap struct {
1818
OpenInEditor key.Binding
1919
ToggleDiffView key.Binding
2020
ToggleIconStyle key.Binding
21+
ToggleHelp key.Binding
2122
}
2223

2324
var keys = &KeyMap{
@@ -67,7 +68,7 @@ var keys = &KeyMap{
6768
),
6869
SwitchPanel: key.NewBinding(
6970
key.WithKeys("tab"),
70-
key.WithHelp("TAB", "switch panel"),
71+
key.WithHelp("tab", "switch panel"),
7172
),
7273
OpenInEditor: key.NewBinding(
7374
key.WithKeys("o"),
@@ -79,23 +80,30 @@ var keys = &KeyMap{
7980
),
8081
ToggleIconStyle: key.NewBinding(
8182
key.WithKeys("i"),
82-
key.WithHelp("i", "toggle ToggleIconStyle"),
83+
key.WithHelp("i", "toggle icon style"),
84+
),
85+
ToggleHelp: key.NewBinding(
86+
key.WithKeys("?"),
87+
key.WithHelp("?", "toggle help"),
8388
),
8489
}
8590

86-
func getKeys() []key.Binding {
87-
return []key.Binding{
91+
func KeyGroups() [][]key.Binding {
92+
return [][]key.Binding{{
8893
keys.SwitchPanel,
8994
keys.Up,
9095
keys.Down,
9196
keys.CtrlD,
9297
keys.CtrlU,
98+
}, {
9399
keys.ToggleFileTree,
94100
keys.Search,
95101
keys.Copy,
96102
keys.OpenInEditor,
97103
keys.ToggleDiffView,
98104
keys.ToggleIconStyle,
105+
}, {
106+
keys.ToggleHelp,
99107
keys.Quit,
100-
}
108+
}}
101109
}

pkg/ui/panes/diffviewer/diffviewer.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,11 @@ type diffContentMsg struct {
330330
cacheKey string
331331
text string
332332
}
333+
334+
func (m *Model) RootDiffStats() (int64, int64) {
335+
if item, ok := m.cache[cacheKey("/", m.sideBySide)]; ok {
336+
return item.additions, item.deletions
337+
}
338+
339+
return 0, 0
340+
}

pkg/ui/panes/filetree/filetree.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ func (m *Model) SetCursorByPath(path string) {
150150
}
151151
}
152152

153-
log.Debug("filetree - setting cursor", "name", path)
154153
m.rebuildTree()
155154
m.t.SetYOffset(yoffset)
156155
}
@@ -327,7 +326,6 @@ var indenter = func(children ltree.Children, index int) string {
327326

328327
// SetSize implements the Component interface.
329328
func (m *Model) SetSize(width, height int) {
330-
log.Debug("setting tree size", "width", width, "height", height)
331329
m.t.SetSize(width, height)
332330
m.rebuildTree()
333331
}

pkg/ui/panes/help/help.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package help
2+
3+
import (
4+
helpBubble "charm.land/bubbles/v2/help"
5+
"charm.land/bubbles/v2/key"
6+
tea "charm.land/bubbletea/v2"
7+
"charm.land/lipgloss/v2"
8+
)
9+
10+
type Model struct {
11+
help helpBubble.Model
12+
width int
13+
height int
14+
keys [][]key.Binding
15+
}
16+
17+
func New() Model {
18+
m := Model{}
19+
m.help = helpBubble.New()
20+
helpSt := lipgloss.NewStyle()
21+
m.help.ShortSeparator = " · "
22+
m.help.Styles.FullKey = helpSt
23+
m.help.Styles.FullDesc = helpSt
24+
m.help.Styles.FullSeparator = helpSt
25+
m.help.Styles.FullKey = helpSt.Foreground(lipgloss.Blue)
26+
m.help.Styles.FullDesc = helpSt
27+
m.help.Styles.FullSeparator = helpSt
28+
m.help.Styles.Ellipsis = helpSt
29+
return m
30+
}
31+
32+
func (m *Model) Update(msg tea.Msg) tea.Cmd {
33+
switch msg := msg.(type) {
34+
case tea.WindowSizeMsg:
35+
m.width = msg.Width / 2
36+
m.height = msg.Height / 2
37+
m.help.SetWidth(m.width)
38+
}
39+
40+
return nil
41+
}
42+
43+
func (m *Model) SetKeys(groups [][]key.Binding) {
44+
m.keys = groups
45+
}
46+
47+
func (m *Model) Width() int {
48+
return m.width
49+
}
50+
51+
func (m *Model) Height() int {
52+
return m.height
53+
}
54+
55+
func (m *Model) View() string {
56+
return m.help.FullHelpView(m.keys)
57+
}

0 commit comments

Comments
 (0)