Files
wehub-resource-sync ead81af521
Deploy to GitHub Pages / deploy (push) Failing after 0s
CI / go (push) Has been cancelled
CI / build (darwin, macos-14) (push) Has been cancelled
CI / build (windows, windows-2025) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:13 +08:00

93 lines
3.2 KiB
Go

package ui
import (
"image/color"
"charm.land/lipgloss/v2"
"github.com/bjarneo/cliamp/theme"
)
// CLIAMP color palette using standard ANSI terminal colors (0-15).
// These adapt to the user's terminal theme for consistent appearance.
var (
ColorTitle color.Color = lipgloss.ANSIColor(10) // bright green
ColorText color.Color = lipgloss.ANSIColor(15) // bright white
ColorDim color.Color = lipgloss.ANSIColor(7) // white (light gray)
ColorAccent color.Color = lipgloss.ANSIColor(11) // bright yellow
ColorPlaying color.Color = lipgloss.ANSIColor(10) // bright green
ColorSeekBar color.Color = lipgloss.ANSIColor(11) // bright yellow
ColorVolume color.Color = lipgloss.ANSIColor(2) // green
ColorError color.Color = lipgloss.ANSIColor(9) // bright red
ColorKeyBG color.Color = lipgloss.ANSIColor(8) // bright black (dark gray)
ColorKeyFG color.Color = lipgloss.ANSIColor(15) // bright white
// Spectrum gradient: green -> yellow -> red
SpectrumLow color.Color = lipgloss.ANSIColor(10) // bright green
SpectrumMid color.Color = lipgloss.ANSIColor(11) // bright yellow
SpectrumHigh color.Color = lipgloss.ANSIColor(9) // bright red
)
// PaddingH is the horizontal padding inside the frame.
var PaddingH = 3
// paddingV is the vertical padding inside the frame.
var paddingV = 1
// PanelWidth is the usable inner width of the frame.
// Updated dynamically in WindowSizeMsg based on terminal width.
var PanelWidth = 80 - 2*PaddingH
// SetPadding updates the frame padding and derived styles.
func SetPadding(h, v int) {
PaddingH = h
paddingV = v
PanelWidth = 80 - 2*PaddingH
FrameStyle = FrameStyle.Padding(paddingV, PaddingH)
}
// FrameStyle is the outer frame style for the TUI.
var FrameStyle = lipgloss.NewStyle().
Padding(paddingV, PaddingH).
Width(80)
// ApplyThemeColors updates all color variables and rebuilds spectrum styles.
// If the theme is the default (empty hex values), ANSI fallback colors are restored.
func ApplyThemeColors(t theme.Theme) {
if t.IsDefault() {
ColorTitle = lipgloss.ANSIColor(10)
ColorText = lipgloss.ANSIColor(15)
ColorDim = lipgloss.ANSIColor(7)
ColorAccent = lipgloss.ANSIColor(11)
ColorPlaying = lipgloss.ANSIColor(10)
ColorSeekBar = lipgloss.ANSIColor(11)
ColorVolume = lipgloss.ANSIColor(2)
ColorError = lipgloss.ANSIColor(9)
ColorKeyBG = lipgloss.ANSIColor(8)
ColorKeyFG = lipgloss.ANSIColor(15)
SpectrumLow = lipgloss.ANSIColor(10)
SpectrumMid = lipgloss.ANSIColor(11)
SpectrumHigh = lipgloss.ANSIColor(9)
} else {
ColorTitle = lipgloss.Color(t.Accent)
ColorText = lipgloss.Color(t.BrightFG)
ColorDim = lipgloss.Color(t.FG)
ColorAccent = lipgloss.Color(t.Accent)
ColorPlaying = lipgloss.Color(t.Green)
ColorSeekBar = lipgloss.Color(t.Accent)
ColorVolume = lipgloss.Color(t.Green)
ColorError = lipgloss.Color(t.Red)
ColorKeyBG = lipgloss.Color(t.Accent)
ColorKeyFG = lipgloss.Color(t.BrightFG)
SpectrumLow = lipgloss.Color(t.Green)
SpectrumMid = lipgloss.Color(t.Yellow)
SpectrumHigh = lipgloss.Color(t.Red)
}
// Rebuild visualizer spectrum styles.
specLowStyle = lipgloss.NewStyle().Foreground(SpectrumLow)
specMidStyle = lipgloss.NewStyle().Foreground(SpectrumMid)
specHighStyle = lipgloss.NewStyle().Foreground(SpectrumHigh)
refreshSpecANSI()
}