Theme simplification (theme/theme.go): - Remove Purple and BorderHover fields from Theme struct — neither was referenced in the new tab renderers, reducing per-theme boilerplate from 14 to 12 color definitions Component extraction (components/): - Move Sparkline() and BarChart() from card.go to new chart.go, giving visualization components their own file as complexity grows - card.go retains MetricCard, ContentCard, LayoutRow, and CardInnerWidth which are layout-focused - New chart.go: Sparkline (unicode block chars) and BarChart (multi-row with anchored Y-axis, optional X-axis labels, dynamic height/width) - New progress.go: ProgressBar component with customizable width, color, and percentage display — used by rate-limit and budget views Status bar and tab bar updates: - statusbar.go: adapt to simplified theme struct - tabbar.go: adapt to simplified theme struct
111 lines
3.2 KiB
Go
111 lines
3.2 KiB
Go
// Package theme defines color themes for the cburn TUI dashboard.
|
|
package theme
|
|
|
|
import "github.com/charmbracelet/lipgloss"
|
|
|
|
// Theme defines the color roles used throughout the TUI.
|
|
type Theme struct {
|
|
Name string
|
|
Background lipgloss.Color
|
|
Surface lipgloss.Color
|
|
Border lipgloss.Color
|
|
TextDim lipgloss.Color
|
|
TextMuted lipgloss.Color
|
|
TextPrimary lipgloss.Color
|
|
Accent lipgloss.Color
|
|
Green lipgloss.Color
|
|
Orange lipgloss.Color
|
|
Red lipgloss.Color
|
|
Blue lipgloss.Color
|
|
Yellow lipgloss.Color
|
|
}
|
|
|
|
// Active is the currently selected theme.
|
|
var Active = FlexokiDark
|
|
|
|
// FlexokiDark is the default theme.
|
|
var FlexokiDark = Theme{
|
|
Name: "flexoki-dark",
|
|
Background: lipgloss.Color("#100F0F"),
|
|
Surface: lipgloss.Color("#1C1B1A"),
|
|
Border: lipgloss.Color("#282726"),
|
|
TextDim: lipgloss.Color("#575653"),
|
|
TextMuted: lipgloss.Color("#6F6E69"),
|
|
TextPrimary: lipgloss.Color("#FFFCF0"),
|
|
Accent: lipgloss.Color("#3AA99F"),
|
|
Green: lipgloss.Color("#879A39"),
|
|
Orange: lipgloss.Color("#DA702C"),
|
|
Red: lipgloss.Color("#D14D41"),
|
|
Blue: lipgloss.Color("#4385BE"),
|
|
Yellow: lipgloss.Color("#D0A215"),
|
|
}
|
|
|
|
// CatppuccinMocha is a warm pastel theme.
|
|
var CatppuccinMocha = Theme{
|
|
Name: "catppuccin-mocha",
|
|
Background: lipgloss.Color("#1E1E2E"),
|
|
Surface: lipgloss.Color("#313244"),
|
|
Border: lipgloss.Color("#45475A"),
|
|
TextDim: lipgloss.Color("#6C7086"),
|
|
TextMuted: lipgloss.Color("#A6ADC8"),
|
|
TextPrimary: lipgloss.Color("#CDD6F4"),
|
|
Accent: lipgloss.Color("#89B4FA"),
|
|
Green: lipgloss.Color("#A6E3A1"),
|
|
Orange: lipgloss.Color("#FAB387"),
|
|
Red: lipgloss.Color("#F38BA8"),
|
|
Blue: lipgloss.Color("#89B4FA"),
|
|
Yellow: lipgloss.Color("#F9E2AF"),
|
|
}
|
|
|
|
// TokyoNight is a cool blue/purple theme.
|
|
var TokyoNight = Theme{
|
|
Name: "tokyo-night",
|
|
Background: lipgloss.Color("#1A1B26"),
|
|
Surface: lipgloss.Color("#24283B"),
|
|
Border: lipgloss.Color("#414868"),
|
|
TextDim: lipgloss.Color("#565F89"),
|
|
TextMuted: lipgloss.Color("#A9B1D6"),
|
|
TextPrimary: lipgloss.Color("#C0CAF5"),
|
|
Accent: lipgloss.Color("#7AA2F7"),
|
|
Green: lipgloss.Color("#9ECE6A"),
|
|
Orange: lipgloss.Color("#FF9E64"),
|
|
Red: lipgloss.Color("#F7768E"),
|
|
Blue: lipgloss.Color("#7AA2F7"),
|
|
Yellow: lipgloss.Color("#E0AF68"),
|
|
}
|
|
|
|
// Terminal uses ANSI 16 colors only.
|
|
var Terminal = Theme{
|
|
Name: "terminal",
|
|
Background: lipgloss.Color("0"),
|
|
Surface: lipgloss.Color("0"),
|
|
Border: lipgloss.Color("8"),
|
|
TextDim: lipgloss.Color("8"),
|
|
TextMuted: lipgloss.Color("7"),
|
|
TextPrimary: lipgloss.Color("15"),
|
|
Accent: lipgloss.Color("6"),
|
|
Green: lipgloss.Color("2"),
|
|
Orange: lipgloss.Color("3"),
|
|
Red: lipgloss.Color("1"),
|
|
Blue: lipgloss.Color("4"),
|
|
Yellow: lipgloss.Color("3"),
|
|
}
|
|
|
|
// All available themes.
|
|
var All = []Theme{FlexokiDark, CatppuccinMocha, TokyoNight, Terminal}
|
|
|
|
// ByName returns a theme by its name, defaulting to FlexokiDark.
|
|
func ByName(name string) Theme {
|
|
for _, t := range All {
|
|
if t.Name == name {
|
|
return t
|
|
}
|
|
}
|
|
return FlexokiDark
|
|
}
|
|
|
|
// SetActive sets the active theme by name.
|
|
func SetActive(name string) {
|
|
Active = ByName(name)
|
|
}
|