Files
lazysecrets/internal/ui/styles/styles.go
T
keb b677201e34
CI / Checks (pull_request) Successful in 37s
PR title / Conventional title (pull_request) Successful in 1s
feat: Spring Boot config files in repos
application*.properties/.yml and bootstrap* files tracked by git are
listed under Repos, with their secret-looking keys as secrets.

- Keys whose name ends like a secret (password, secret, token, key, …)
  or whose value looks like one (Jasypt ENC(...), a URL or connection
  string with a password) are listed; providers.repos.spring.keys and
  .values replace the patterns, also in a repo's .lazysecrets.yaml.
- A file's details count the keys left out; ${VAR} values are marked
  as references, and a tracked file is only marked red when a listed
  value is in plain text.
- Later YAML/properties documents name their keys after the profile:
  spring.datasource.password (prod).
- Maven's @placeholders@ parse; Argo CD's applications.yaml and Helm
  templates aren't Spring files.
- A green leaf icon, themeable with springColor.
2026-10-15 13:10:05 +02:00

108 lines
3.9 KiB
Go

// Package styles holds the lipgloss theme. It sticks to the 16 ANSI colours
// so it follows the user's terminal palette in both light and dark themes.
package styles
import (
"image/color"
"charm.land/lipgloss/v2"
"git.kebcloud.no/keb/lazysecrets/internal/provider"
)
type Styles struct {
BorderFocused lipgloss.Style
BorderBlurred lipgloss.Style
TitleFocused lipgloss.Style
TitleBlurred lipgloss.Style
Footer lipgloss.Style
Selected lipgloss.Style // cursor row in the focused pane
SelectedBlurred lipgloss.Style // cursor row in other panes
Muted lipgloss.Style
Error lipgloss.Style
Notice lipgloss.Style
Success lipgloss.Style // the ✓ before confirmations
Warning lipgloss.Style // "can't do that here" messages
Match lipgloss.Style // filter matches
Favourite lipgloss.Style
Prompt lipgloss.Style // questions in the footer
Label lipgloss.Style
Masked lipgloss.Style
Value lipgloss.Style
KindAzure lipgloss.Style
KindDatabricks lipgloss.Style
KindRepo lipgloss.Style
Spring lipgloss.Style // Spring Boot config files
// themed marks the selection colours as set by the theme, so
// OnBackground leaves them.
themed, themedBlurred bool
}
func Default() Styles {
green := lipgloss.Green
return Styles{
BorderFocused: lipgloss.NewStyle().Foreground(green),
BorderBlurred: lipgloss.NewStyle().Faint(true),
TitleFocused: lipgloss.NewStyle().Foreground(green).Bold(true),
TitleBlurred: lipgloss.NewStyle(),
Footer: lipgloss.NewStyle().Faint(true),
// A background rather than reverse, so the row keeps its colours;
// in every pane, so each shows what's selected in it. The focused
// pane's is bold too. Palette 8 until the terminal says what its
// background is (OnBackground).
Selected: lipgloss.NewStyle().Background(lipgloss.BrightBlack).Bold(true),
SelectedBlurred: lipgloss.NewStyle().Background(lipgloss.BrightBlack),
Muted: lipgloss.NewStyle().Faint(true),
Error: lipgloss.NewStyle().Foreground(lipgloss.Red),
Notice: lipgloss.NewStyle().Foreground(lipgloss.Green),
Success: lipgloss.NewStyle().Foreground(lipgloss.Green).Bold(true),
Warning: lipgloss.NewStyle().Foreground(lipgloss.Yellow),
Match: lipgloss.NewStyle().Foreground(lipgloss.Yellow).Bold(true),
Favourite: lipgloss.NewStyle().Foreground(lipgloss.Yellow),
Prompt: lipgloss.NewStyle().Foreground(lipgloss.Yellow).Bold(true),
Label: lipgloss.NewStyle().Foreground(lipgloss.Blue).Bold(true),
Masked: lipgloss.NewStyle().Faint(true),
Value: lipgloss.NewStyle().Foreground(lipgloss.Yellow),
KindAzure: lipgloss.NewStyle().Foreground(lipgloss.Blue),
KindDatabricks: lipgloss.NewStyle().Foreground(lipgloss.Red),
KindRepo: lipgloss.NewStyle().Foreground(lipgloss.Magenta),
Spring: lipgloss.NewStyle().Foreground(lipgloss.Green),
}
}
// Kind is the colour of a provider's sources, vaults and paths.
func (s Styles) Kind(k provider.Kind) lipgloss.Style {
switch k {
case provider.KindDatabricks:
return s.KindDatabricks
case provider.KindRepo:
return s.KindRepo
}
return s.KindAzure
}
// OnBackground shades the selection colours from the terminal's
// background, a little lighter on a dark one and darker on a light one:
// a quiet band that keeps the row's colours readable, where palette 8 is
// often too bright. Colours the theme sets are kept.
func (s Styles) OnBackground(bg color.Color, dark bool) Styles {
shade := func(p float64) color.Color {
if dark {
return lipgloss.Lighten(bg, p)
}
return lipgloss.Darken(bg, p)
}
if !s.themed {
s.Selected = s.Selected.Background(shade(0.09))
}
if !s.themedBlurred {
s.SelectedBlurred = s.SelectedBlurred.Background(shade(0.05))
}
return s
}