Files
cburn/internal/tui/theme/theme.go
teernisse 2be7b5e193 refactor: simplify TUI theme struct and extract chart/progress components
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
2026-02-20 16:08:06 -05:00

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)
}