93 lines
3.2 KiB
Go
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()
|
|
}
|