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.
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user