vcom/internal/theme/theme.go

233 lines
8.1 KiB
Go
Raw Normal View History

2026-04-22 22:10:50 +03:00
package theme
import (
"fmt"
"strings"
"github.com/charmbracelet/lipgloss"
)
type Palette struct {
Name string
Background lipgloss.Color
Panel lipgloss.Color
PanelInactive lipgloss.Color
PanelElevated lipgloss.Color
2026-04-23 21:18:15 +03:00
StatusBar lipgloss.Color
Footer lipgloss.Color
2026-04-22 22:10:50 +03:00
Border lipgloss.Color
BorderActive lipgloss.Color
Text lipgloss.Color
Muted lipgloss.Color
Accent lipgloss.Color
2026-04-23 21:18:15 +03:00
Info lipgloss.Color
Success lipgloss.Color
2026-04-22 22:10:50 +03:00
Selection lipgloss.Color
2026-04-23 21:18:15 +03:00
Hover lipgloss.Color
Marked lipgloss.Color
2026-04-22 22:10:50 +03:00
Warning lipgloss.Color
Danger lipgloss.Color
2026-04-23 21:18:15 +03:00
ActivePath lipgloss.Color
ConfirmButton lipgloss.Color
CancelButton lipgloss.Color
ProgressFill lipgloss.Color
ProgressEmpty lipgloss.Color
HelpNav lipgloss.Color
HelpPanels lipgloss.Color
HelpDialogs lipgloss.Color
HelpMouse lipgloss.Color
2026-04-22 22:10:50 +03:00
Folder lipgloss.Color
TextFile lipgloss.Color
ConfigFile lipgloss.Color
ExecFile lipgloss.Color
ImageFile lipgloss.Color
BinaryFile lipgloss.Color
FooterKey lipgloss.Color
}
var builtInThemes = []string{
"catppuccin-mocha",
"tokyo-night",
"gruvbox-dark",
"nord-frost",
}
func Names() []string {
values := make([]string, len(builtInThemes))
copy(values, builtInThemes)
return values
}
func Next(current string) string {
values := Names()
if len(values) == 0 {
return current
}
current = strings.ToLower(strings.TrimSpace(current))
for idx, value := range values {
if value == current {
return values[(idx+1)%len(values)]
}
}
return values[0]
}
func Resolve(name string) (Palette, error) {
switch strings.ToLower(name) {
case "catppuccin-mocha":
return Palette{
Name: "catppuccin-mocha",
Background: lipgloss.Color("#11111B"),
Panel: lipgloss.Color("#181825"),
PanelInactive: lipgloss.Color("#1E1E2E"),
PanelElevated: lipgloss.Color("#24273A"),
2026-04-23 21:18:15 +03:00
StatusBar: lipgloss.Color("#1E1E2E"),
Footer: lipgloss.Color("#11111B"),
2026-04-22 22:10:50 +03:00
Border: lipgloss.Color("#45475A"),
BorderActive: lipgloss.Color("#89B4FA"),
Text: lipgloss.Color("#CDD6F4"),
Muted: lipgloss.Color("#A6ADC8"),
Accent: lipgloss.Color("#F5C2E7"),
2026-04-23 21:18:15 +03:00
Info: lipgloss.Color("#89DCEB"),
Success: lipgloss.Color("#A6E3A1"),
2026-04-22 22:10:50 +03:00
Selection: lipgloss.Color("#313244"),
2026-04-23 21:18:15 +03:00
Hover: lipgloss.Color("#2A2B3C"),
Marked: lipgloss.Color("#F38BA8"),
2026-04-22 22:10:50 +03:00
Warning: lipgloss.Color("#F9E2AF"),
Danger: lipgloss.Color("#F38BA8"),
2026-04-23 21:18:15 +03:00
ActivePath: lipgloss.Color("#89DCEB"),
ConfirmButton: lipgloss.Color("#A6E3A1"),
CancelButton: lipgloss.Color("#F38BA8"),
ProgressFill: lipgloss.Color("#89B4FA"),
ProgressEmpty: lipgloss.Color("#45475A"),
HelpNav: lipgloss.Color("#89B4FA"),
HelpPanels: lipgloss.Color("#F9E2AF"),
HelpDialogs: lipgloss.Color("#CBA6F7"),
HelpMouse: lipgloss.Color("#F38BA8"),
2026-04-22 22:10:50 +03:00
Folder: lipgloss.Color("#89B4FA"),
TextFile: lipgloss.Color("#A6E3A1"),
ConfigFile: lipgloss.Color("#F9E2AF"),
ExecFile: lipgloss.Color("#FAB387"),
ImageFile: lipgloss.Color("#94E2D5"),
BinaryFile: lipgloss.Color("#CBA6F7"),
FooterKey: lipgloss.Color("#89DCEB"),
}, nil
case "tokyo-night":
return Palette{
Name: "tokyo-night",
Background: lipgloss.Color("#16161E"),
Panel: lipgloss.Color("#1A1B26"),
PanelInactive: lipgloss.Color("#24283B"),
PanelElevated: lipgloss.Color("#2A2F44"),
2026-04-23 21:18:15 +03:00
StatusBar: lipgloss.Color("#24283B"),
Footer: lipgloss.Color("#16161E"),
2026-04-22 22:10:50 +03:00
Border: lipgloss.Color("#3B4261"),
BorderActive: lipgloss.Color("#7AA2F7"),
Text: lipgloss.Color("#C0CAF5"),
Muted: lipgloss.Color("#9AA5CE"),
Accent: lipgloss.Color("#BB9AF7"),
2026-04-23 21:18:15 +03:00
Info: lipgloss.Color("#73DACA"),
Success: lipgloss.Color("#9ECE6A"),
2026-04-22 22:10:50 +03:00
Selection: lipgloss.Color("#292E42"),
2026-04-23 21:18:15 +03:00
Hover: lipgloss.Color("#252A3D"),
Marked: lipgloss.Color("#F7768E"),
2026-04-22 22:10:50 +03:00
Warning: lipgloss.Color("#E0AF68"),
Danger: lipgloss.Color("#F7768E"),
2026-04-23 21:18:15 +03:00
ActivePath: lipgloss.Color("#73DACA"),
ConfirmButton: lipgloss.Color("#9ECE6A"),
CancelButton: lipgloss.Color("#F7768E"),
ProgressFill: lipgloss.Color("#7AA2F7"),
ProgressEmpty: lipgloss.Color("#3B4261"),
HelpNav: lipgloss.Color("#7AA2F7"),
HelpPanels: lipgloss.Color("#E0AF68"),
HelpDialogs: lipgloss.Color("#BB9AF7"),
HelpMouse: lipgloss.Color("#F7768E"),
2026-04-22 22:10:50 +03:00
Folder: lipgloss.Color("#7AA2F7"),
TextFile: lipgloss.Color("#9ECE6A"),
ConfigFile: lipgloss.Color("#E0AF68"),
ExecFile: lipgloss.Color("#FF9E64"),
ImageFile: lipgloss.Color("#73DACA"),
BinaryFile: lipgloss.Color("#BB9AF7"),
FooterKey: lipgloss.Color("#73DACA"),
}, nil
case "gruvbox-dark":
return Palette{
Name: "gruvbox-dark",
Background: lipgloss.Color("#1D2021"),
Panel: lipgloss.Color("#282828"),
PanelInactive: lipgloss.Color("#32302F"),
PanelElevated: lipgloss.Color("#3C3836"),
2026-04-23 21:18:15 +03:00
StatusBar: lipgloss.Color("#32302F"),
Footer: lipgloss.Color("#1D2021"),
2026-04-22 22:10:50 +03:00
Border: lipgloss.Color("#504945"),
BorderActive: lipgloss.Color("#FABD2F"),
Text: lipgloss.Color("#EBDBB2"),
Muted: lipgloss.Color("#BDAE93"),
Accent: lipgloss.Color("#83A598"),
2026-04-23 21:18:15 +03:00
Info: lipgloss.Color("#8EC07C"),
Success: lipgloss.Color("#B8BB26"),
2026-04-22 22:10:50 +03:00
Selection: lipgloss.Color("#3C3836"),
2026-04-23 21:18:15 +03:00
Hover: lipgloss.Color("#45403D"),
Marked: lipgloss.Color("#FB4934"),
2026-04-22 22:10:50 +03:00
Warning: lipgloss.Color("#FE8019"),
Danger: lipgloss.Color("#FB4934"),
2026-04-23 21:18:15 +03:00
ActivePath: lipgloss.Color("#8EC07C"),
ConfirmButton: lipgloss.Color("#B8BB26"),
CancelButton: lipgloss.Color("#FB4934"),
ProgressFill: lipgloss.Color("#FABD2F"),
ProgressEmpty: lipgloss.Color("#504945"),
HelpNav: lipgloss.Color("#83A598"),
HelpPanels: lipgloss.Color("#FABD2F"),
HelpDialogs: lipgloss.Color("#D3869B"),
HelpMouse: lipgloss.Color("#FB4934"),
2026-04-22 22:10:50 +03:00
Folder: lipgloss.Color("#83A598"),
TextFile: lipgloss.Color("#B8BB26"),
ConfigFile: lipgloss.Color("#FABD2F"),
ExecFile: lipgloss.Color("#FE8019"),
ImageFile: lipgloss.Color("#8EC07C"),
BinaryFile: lipgloss.Color("#D3869B"),
FooterKey: lipgloss.Color("#8EC07C"),
}, nil
case "nord-frost":
return Palette{
Name: "nord-frost",
Background: lipgloss.Color("#2E3440"),
Panel: lipgloss.Color("#3B4252"),
PanelInactive: lipgloss.Color("#434C5E"),
PanelElevated: lipgloss.Color("#4C566A"),
2026-04-23 21:18:15 +03:00
StatusBar: lipgloss.Color("#434C5E"),
Footer: lipgloss.Color("#2E3440"),
2026-04-22 22:10:50 +03:00
Border: lipgloss.Color("#4C566A"),
BorderActive: lipgloss.Color("#88C0D0"),
Text: lipgloss.Color("#ECEFF4"),
Muted: lipgloss.Color("#D8DEE9"),
Accent: lipgloss.Color("#81A1C1"),
2026-04-23 21:18:15 +03:00
Info: lipgloss.Color("#8FBCBB"),
Success: lipgloss.Color("#A3BE8C"),
2026-04-22 22:10:50 +03:00
Selection: lipgloss.Color("#434C5E"),
2026-04-23 21:18:15 +03:00
Hover: lipgloss.Color("#505A70"),
Marked: lipgloss.Color("#BF616A"),
2026-04-22 22:10:50 +03:00
Warning: lipgloss.Color("#EBCB8B"),
Danger: lipgloss.Color("#BF616A"),
2026-04-23 21:18:15 +03:00
ActivePath: lipgloss.Color("#8FBCBB"),
ConfirmButton: lipgloss.Color("#A3BE8C"),
CancelButton: lipgloss.Color("#BF616A"),
ProgressFill: lipgloss.Color("#88C0D0"),
ProgressEmpty: lipgloss.Color("#4C566A"),
HelpNav: lipgloss.Color("#81A1C1"),
HelpPanels: lipgloss.Color("#EBCB8B"),
HelpDialogs: lipgloss.Color("#B48EAD"),
HelpMouse: lipgloss.Color("#BF616A"),
2026-04-22 22:10:50 +03:00
Folder: lipgloss.Color("#81A1C1"),
TextFile: lipgloss.Color("#A3BE8C"),
ConfigFile: lipgloss.Color("#EBCB8B"),
ExecFile: lipgloss.Color("#D08770"),
ImageFile: lipgloss.Color("#8FBCBB"),
BinaryFile: lipgloss.Color("#B48EAD"),
FooterKey: lipgloss.Color("#8FBCBB"),
}, nil
default:
return Palette{}, fmt.Errorf("unknown theme %q", name)
}
}