feat: the key picker's tabs go under its heading, with help text
CI / Checks (pull_request) Successful in 39s
PR title / Conventional title (pull_request) Successful in 2s

The share popup is titled for what's shared; above the search, "Pick
a secret to encrypt with" says the recipient needs read access to it,
with Go to's tabs under it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
kebandClaude Opus 5.5 committed 2026-10-13 12:24:10 +02:00
1 parent cd265a632e
commit 8cd0003f8c
2 files changed
+26 -17

No files matched your search

+22 -15
View File
@@ -750,12 +750,13 @@ func (m Model) searchViewBox() string {
lists = panes.BoxCounted(m.st, title(resultsTitle, true), "", counter(v.res, len(v.shown)), right, resW, listH, focused) lists = panes.BoxCounted(m.st, title(resultsTitle, true), "", counter(v.res, len(v.shown)), right, resW, listH, focused)
} }
ts := panes.TitleStyle(m.st, focused)
var body []string var body []string
if v.pick != nil { if v.pick != nil {
for _, l := range v.pickLines { for _, l := range v.pickLines {
body = append(body, " "+l) body = append(body, " "+l)
} }
body = append(body, "") body = append(body, "", " "+m.goToTabs(ts))
} }
body = append(body, " "+v.input.View(), "") body = append(body, " "+v.input.View(), "")
for _, l := range strings.Split(lists, "\n") { for _, l := range strings.Split(lists, "\n") {
@@ -785,21 +786,11 @@ func (m Model) searchViewBox() string {
} }
foot = footer(append(hints, hint(km.GoFilter, "filter"), hint(km.GoStar, "star"), hint(km.GoSelect, v.selectLabel()), hint(km.GoClose, "close"))...) foot = footer(append(hints, hint(km.GoFilter, "filter"), hint(km.GoStar, "star"), hint(km.GoSelect, v.selectLabel()), hint(km.GoClose, "close"))...)
} }
// Tabs in the title, the current one underlined, like the panes. // Tabs in the title, the current one underlined, like the panes; a
ts := panes.TitleStyle(m.st, focused) // picker has its own title, and the tabs over the input.
head := ts.Render(goToTitle + " ") head := ts.Render(goToTitle+" ") + m.goToTabs(ts)
if v.pick != nil { if v.pick != nil {
head = ts.Render(v.pickTitle + " ") head = ts.Render(v.pickTitle)
}
for i, name := range tabNames {
if i > 0 {
head += ts.Render(" - ")
}
if i == v.tab {
head += ts.Underline(true).Render(name)
} else {
head += m.st.Muted.Render(name)
}
} }
return panes.Box(m.st, head, foot, body, w, len(body)+2, focused) return panes.Box(m.st, head, foot, body, w, len(body)+2, focused)
} }
@@ -821,3 +812,19 @@ func pickable(o option) (ref.Ref, bool) {
} }
return r, true return r, true
} }
// goToTabs draws Go to's tabs, the current one underlined.
func (m Model) goToTabs(ts lipgloss.Style) string {
var out string
for i, name := range tabNames {
if i > 0 {
out += ts.Render(" - ")
}
if i == m.search.tab {
out += ts.Underline(true).Render(name)
} else {
out += m.st.Muted.Render(name)
}
}
return out
}
+4 -2
View File
@@ -15,6 +15,7 @@ import (
"git.kebcloud.no/keb/lazysecrets/internal/provider" "git.kebcloud.no/keb/lazysecrets/internal/provider"
"git.kebcloud.no/keb/lazysecrets/internal/ref" "git.kebcloud.no/keb/lazysecrets/internal/ref"
"git.kebcloud.no/keb/lazysecrets/internal/share" "git.kebcloud.no/keb/lazysecrets/internal/share"
"git.kebcloud.no/keb/lazysecrets/internal/ui/panes"
) )
// Sharing env files as an encrypted lazysecrets://share link (package // Sharing env files as an encrypted lazysecrets://share link (package
@@ -146,8 +147,9 @@ func (m *Model) pickShareKey(s sharing) tea.Cmd {
} }
m.search.pickTitle = shareTitle(s) m.search.pickTitle = shareTitle(s)
m.search.pickLines = append(m.sharedFiles(s), "", m.search.pickLines = append(m.sharedFiles(s), "",
"Pick the secret to encrypt them with: whoever can read it can open the link.", panes.TitleStyle(m.st, true).Render("Pick a secret to encrypt with"),
m.st.Muted.Render("Its value isn't shown or put in the link. share.key sets a default.")) m.st.Muted.Render("The recipient needs read access to it to decrypt the files. Its value isn't"),
m.st.Muted.Render("shown or put in the link. share.key sets one for a repo, or for all."))
m.fillSearch(false) m.fillSearch(false)
return tea.Batch(cmd, m.searchLoads()) return tea.Batch(cmd, m.searchLoads())
} }