112 lines
2.9 KiB
Go
112 lines
2.9 KiB
Go
package theme
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/charmbracelet/lipgloss"
|
|
)
|
|
|
|
// Palette defines the semantic colors for a theme
|
|
type Palette struct {
|
|
Name string
|
|
|
|
// base colors
|
|
Fg string // primary foreground
|
|
FgMuted string // secondary/muted foreground
|
|
FgSubtle string // subtle/disabled foreground
|
|
Bg string // primary background
|
|
BgMuted string // secondary background (selections, highlights)
|
|
Border string // border color
|
|
|
|
// semantic colors
|
|
Red string
|
|
Green string
|
|
Yellow string
|
|
Blue string
|
|
Magenta string
|
|
Cyan string
|
|
Orange string
|
|
Gray string
|
|
}
|
|
|
|
// Color converts a palette color string to a lipgloss.TerminalColor.
|
|
// If the string is 1-2 characters, it's treated as an ANSI color code.
|
|
// Otherwise, it's treated as a hex color.
|
|
func (p *Palette) Color(c string) lipgloss.TerminalColor {
|
|
if c == "" {
|
|
return lipgloss.NoColor{}
|
|
}
|
|
|
|
if len(c) <= 2 {
|
|
n, err := strconv.Atoi(c)
|
|
if err == nil {
|
|
return lipgloss.ANSIColor(n)
|
|
}
|
|
}
|
|
|
|
return lipgloss.Color(c)
|
|
}
|
|
|
|
// ToTheme converts a Palette to a Theme with lipgloss styles
|
|
func (p *Palette) ToTheme() *Theme {
|
|
return &Theme{
|
|
Name: p.Name,
|
|
Styles: Styles{
|
|
Header: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(p.Color(p.Fg)),
|
|
|
|
Border: lipgloss.NewStyle().
|
|
Foreground(p.Color(p.Border)),
|
|
|
|
Selected: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(p.Color(p.Fg)),
|
|
|
|
Watched: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(p.Color(p.Orange)),
|
|
|
|
Normal: lipgloss.NewStyle().
|
|
Foreground(p.Color(p.FgMuted)),
|
|
|
|
Error: lipgloss.NewStyle().
|
|
Foreground(p.Color(p.Red)),
|
|
|
|
Success: lipgloss.NewStyle().
|
|
Foreground(p.Color(p.Green)),
|
|
|
|
Warning: lipgloss.NewStyle().
|
|
Foreground(p.Color(p.Yellow)),
|
|
|
|
Footer: lipgloss.NewStyle().
|
|
Foreground(p.Color(p.FgSubtle)),
|
|
|
|
Background: lipgloss.NewStyle(),
|
|
|
|
Proto: ProtoStyles{
|
|
TCP: lipgloss.NewStyle().Foreground(p.Color(p.Green)),
|
|
UDP: lipgloss.NewStyle().Foreground(p.Color(p.Magenta)),
|
|
Unix: lipgloss.NewStyle().Foreground(p.Color(p.Gray)),
|
|
TCP6: lipgloss.NewStyle().Foreground(p.Color(p.Cyan)),
|
|
UDP6: lipgloss.NewStyle().Foreground(p.Color(p.Blue)),
|
|
},
|
|
|
|
State: StateStyles{
|
|
Listen: lipgloss.NewStyle().Foreground(p.Color(p.Green)),
|
|
Established: lipgloss.NewStyle().Foreground(p.Color(p.Blue)),
|
|
TimeWait: lipgloss.NewStyle().Foreground(p.Color(p.Yellow)),
|
|
CloseWait: lipgloss.NewStyle().Foreground(p.Color(p.Orange)),
|
|
SynSent: lipgloss.NewStyle().Foreground(p.Color(p.Magenta)),
|
|
SynRecv: lipgloss.NewStyle().Foreground(p.Color(p.Magenta)),
|
|
FinWait1: lipgloss.NewStyle().Foreground(p.Color(p.Red)),
|
|
FinWait2: lipgloss.NewStyle().Foreground(p.Color(p.Red)),
|
|
Closing: lipgloss.NewStyle().Foreground(p.Color(p.Red)),
|
|
LastAck: lipgloss.NewStyle().Foreground(p.Color(p.Red)),
|
|
Closed: lipgloss.NewStyle().Foreground(p.Color(p.Gray)),
|
|
},
|
|
},
|
|
}
|
|
}
|
|
|