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
This commit is contained in:
teernisse
2026-02-20 16:07:55 -05:00
parent e241ee3966
commit 2be7b5e193
6 changed files with 530 additions and 364 deletions

View File

@@ -1,3 +1,4 @@
// Package theme defines color themes for the cburn TUI dashboard.
package theme
import "github.com/charmbracelet/lipgloss"
@@ -8,7 +9,6 @@ type Theme struct {
Background lipgloss.Color
Surface lipgloss.Color
Border lipgloss.Color
BorderHover lipgloss.Color
TextDim lipgloss.Color
TextMuted lipgloss.Color
TextPrimary lipgloss.Color
@@ -17,7 +17,6 @@ type Theme struct {
Orange lipgloss.Color
Red lipgloss.Color
Blue lipgloss.Color
Purple lipgloss.Color
Yellow lipgloss.Color
}
@@ -30,7 +29,6 @@ var FlexokiDark = Theme{
Background: lipgloss.Color("#100F0F"),
Surface: lipgloss.Color("#1C1B1A"),
Border: lipgloss.Color("#282726"),
BorderHover: lipgloss.Color("#343331"),
TextDim: lipgloss.Color("#575653"),
TextMuted: lipgloss.Color("#6F6E69"),
TextPrimary: lipgloss.Color("#FFFCF0"),
@@ -39,7 +37,6 @@ var FlexokiDark = Theme{
Orange: lipgloss.Color("#DA702C"),
Red: lipgloss.Color("#D14D41"),
Blue: lipgloss.Color("#4385BE"),
Purple: lipgloss.Color("#8B7EC8"),
Yellow: lipgloss.Color("#D0A215"),
}
@@ -49,7 +46,6 @@ var CatppuccinMocha = Theme{
Background: lipgloss.Color("#1E1E2E"),
Surface: lipgloss.Color("#313244"),
Border: lipgloss.Color("#45475A"),
BorderHover: lipgloss.Color("#585B70"),
TextDim: lipgloss.Color("#6C7086"),
TextMuted: lipgloss.Color("#A6ADC8"),
TextPrimary: lipgloss.Color("#CDD6F4"),
@@ -58,7 +54,6 @@ var CatppuccinMocha = Theme{
Orange: lipgloss.Color("#FAB387"),
Red: lipgloss.Color("#F38BA8"),
Blue: lipgloss.Color("#89B4FA"),
Purple: lipgloss.Color("#CBA6F7"),
Yellow: lipgloss.Color("#F9E2AF"),
}
@@ -68,7 +63,6 @@ var TokyoNight = Theme{
Background: lipgloss.Color("#1A1B26"),
Surface: lipgloss.Color("#24283B"),
Border: lipgloss.Color("#414868"),
BorderHover: lipgloss.Color("#565F89"),
TextDim: lipgloss.Color("#565F89"),
TextMuted: lipgloss.Color("#A9B1D6"),
TextPrimary: lipgloss.Color("#C0CAF5"),
@@ -77,7 +71,6 @@ var TokyoNight = Theme{
Orange: lipgloss.Color("#FF9E64"),
Red: lipgloss.Color("#F7768E"),
Blue: lipgloss.Color("#7AA2F7"),
Purple: lipgloss.Color("#BB9AF7"),
Yellow: lipgloss.Color("#E0AF68"),
}
@@ -87,7 +80,6 @@ var Terminal = Theme{
Background: lipgloss.Color("0"),
Surface: lipgloss.Color("0"),
Border: lipgloss.Color("8"),
BorderHover: lipgloss.Color("7"),
TextDim: lipgloss.Color("8"),
TextMuted: lipgloss.Color("7"),
TextPrimary: lipgloss.Color("15"),
@@ -96,7 +88,6 @@ var Terminal = Theme{
Orange: lipgloss.Color("3"),
Red: lipgloss.Color("1"),
Blue: lipgloss.Color("4"),
Purple: lipgloss.Color("5"),
Yellow: lipgloss.Color("3"),
}