4a579bdbc6
CI / test (pull_request) Successful in 4s
Every colour was a 256-colour ANSI index hardcoded in styles.go, so changing the palette meant editing the styles themselves. This puts a semantic token set between the two: styles name roles, a theme supplies the colours. internal/theme holds the twelve tokens, the two built-ins (gruvbox-dark, the new default, and gruvbox-light) and the loader for user themes in ~/.config/terdut-tui/themes/. A user file may 'extends:' a built-in and override only what it cares about, and may shadow a built-in name to tweak it in place. Unknown keys, malformed colours and incomplete themes are refused with a message naming what went wrong. Colours are truecolor hex now: lipgloss downsamples for 256- and 16-colour terminals and honours NO_COLOR, so themes carry no fallbacks of their own. An ANSI index is still accepted for anyone who would rather follow their terminal's own palette. The 21 package-level style vars become a Styles struct on the Model, which is what rule 3 asked for all along; the four free functions in view.go take one as their first argument. The embedded bubbles components are restyled from the same tokens — otherwise a theme would leave a pink selected row and grey help text behind. Note that the table's Cell style deliberately keeps no foreground: bubbles renders cells before wrapping the row in Selected, so a colour there cuts the selection highlight short.
33 lines
1.2 KiB
Go
33 lines
1.2 KiB
Go
// Package theme resolves the named colour scheme the TUI renders with. A theme
|
|
// is a flat set of semantic tokens — roles like "muted" or "firing", never hues
|
|
// — so a new scheme is a table of colours rather than a change to the views.
|
|
package theme
|
|
|
|
import "github.com/charmbracelet/lipgloss"
|
|
|
|
// Theme is the palette the UI draws from. Every token is a foreground except
|
|
// OnPrimary, which is the text colour for the two places that invert: the
|
|
// active tab and the selected table row.
|
|
//
|
|
// Colours are truecolor hex; lipgloss downsamples them for 256- and 16-colour
|
|
// terminals and drops them entirely under NO_COLOR, so themes do not carry
|
|
// fallbacks of their own.
|
|
type Theme struct {
|
|
Name string
|
|
|
|
Primary lipgloss.Color // header, tab highlight, selection
|
|
OnPrimary lipgloss.Color // text drawn on a Primary background
|
|
Text lipgloss.Color // default emphasis foreground
|
|
Muted lipgloss.Color // secondary text, dividers, borders
|
|
Accent lipgloss.Color // status line, acknowledged, by-day chart
|
|
|
|
Firing lipgloss.Color
|
|
Resolved lipgloss.Color
|
|
Error lipgloss.Color
|
|
|
|
SevCritical lipgloss.Color
|
|
SevError lipgloss.Color
|
|
SevWarning lipgloss.Color
|
|
SevInfo lipgloss.Color
|
|
}
|