initial commit

This commit is contained in:
basil 2025-06-08 14:07:05 -04:00
commit 078bd90570
Signed by: basil
SSH key fingerprint: SHA256:y04xIFL/yqNaG9ae9Vl95vELtHfApGAIoOGLeVLP/fE
9 changed files with 374 additions and 0 deletions

0
.gitignore vendored Normal file
View file

6
Justfile Normal file
View file

@ -0,0 +1,6 @@
paletteURL := "https://raw.githubusercontent.com/catppuccin/palette/refs/heads/main/palette.json"
download-palette:
wget -O palette.json {{ paletteURL }}
generate: download-palette
go generate

29
README.md Normal file
View file

@ -0,0 +1,29 @@
# lipgloss-catppuccin
auto-generated lipgloss colors for catppuccin palettes
## usage
1. `go get git.red-panda.pet/pandaware/lipgloss-catppuccin`
2. import and use like so:
```go
package main
import (
"github.com/charmbracelet/lipgloss"
"git.red-panda.pet/pandaware/lipgloss-catppuccin"
)
func main() {
coolStyle := lipgloss.NewStyle().
Foreground(catppuccin.Mocha.Sky).
Background(catppuccin.Mocha.Surface0)
}
```
## developing
1. install `just` and `go` >= 1.23
2. run `just generate`
## todo
-[ ] make some of the generated names (like those with numbers) a bit friendlier
-[ ] clean up `tools/generate.go`

145
colors.go Normal file
View file

@ -0,0 +1,145 @@
package catppuccin
import "github.com/charmbracelet/lipgloss"
type Palette struct {
Rosewater lipgloss.Color
Flamingo lipgloss.Color
Pink lipgloss.Color
Mauve lipgloss.Color
Red lipgloss.Color
Maroon lipgloss.Color
Peach lipgloss.Color
Yellow lipgloss.Color
Green lipgloss.Color
Teal lipgloss.Color
Sky lipgloss.Color
Sapphire lipgloss.Color
Blue lipgloss.Color
Lavender lipgloss.Color
Text lipgloss.Color
Subtext1 lipgloss.Color
Subtext0 lipgloss.Color
Overlay2 lipgloss.Color
Overlay1 lipgloss.Color
Overlay0 lipgloss.Color
Surface2 lipgloss.Color
Surface1 lipgloss.Color
Surface0 lipgloss.Color
Base lipgloss.Color
Mantle lipgloss.Color
Crust lipgloss.Color
}
var Frappe = Palette{
Base: lipgloss.Color("#303446"),
Blue: lipgloss.Color("#8caaee"),
Crust: lipgloss.Color("#232634"),
Flamingo: lipgloss.Color("#eebebe"),
Green: lipgloss.Color("#a6d189"),
Lavender: lipgloss.Color("#babbf1"),
Mantle: lipgloss.Color("#292c3c"),
Maroon: lipgloss.Color("#ea999c"),
Mauve: lipgloss.Color("#ca9ee6"),
Overlay0: lipgloss.Color("#737994"),
Overlay1: lipgloss.Color("#838ba7"),
Overlay2: lipgloss.Color("#949cbb"),
Peach: lipgloss.Color("#ef9f76"),
Pink: lipgloss.Color("#f4b8e4"),
Red: lipgloss.Color("#e78284"),
Rosewater: lipgloss.Color("#f2d5cf"),
Sapphire: lipgloss.Color("#85c1dc"),
Sky: lipgloss.Color("#99d1db"),
Subtext0: lipgloss.Color("#a5adce"),
Subtext1: lipgloss.Color("#b5bfe2"),
Surface0: lipgloss.Color("#414559"),
Surface1: lipgloss.Color("#51576d"),
Surface2: lipgloss.Color("#626880"),
Teal: lipgloss.Color("#81c8be"),
Text: lipgloss.Color("#c6d0f5"),
Yellow: lipgloss.Color("#e5c890"),
}
var Latte = Palette{
Base: lipgloss.Color("#eff1f5"),
Blue: lipgloss.Color("#1e66f5"),
Crust: lipgloss.Color("#dce0e8"),
Flamingo: lipgloss.Color("#dd7878"),
Green: lipgloss.Color("#40a02b"),
Lavender: lipgloss.Color("#7287fd"),
Mantle: lipgloss.Color("#e6e9ef"),
Maroon: lipgloss.Color("#e64553"),
Mauve: lipgloss.Color("#8839ef"),
Overlay0: lipgloss.Color("#9ca0b0"),
Overlay1: lipgloss.Color("#8c8fa1"),
Overlay2: lipgloss.Color("#7c7f93"),
Peach: lipgloss.Color("#fe640b"),
Pink: lipgloss.Color("#ea76cb"),
Red: lipgloss.Color("#d20f39"),
Rosewater: lipgloss.Color("#dc8a78"),
Sapphire: lipgloss.Color("#209fb5"),
Sky: lipgloss.Color("#04a5e5"),
Subtext0: lipgloss.Color("#6c6f85"),
Subtext1: lipgloss.Color("#5c5f77"),
Surface0: lipgloss.Color("#ccd0da"),
Surface1: lipgloss.Color("#bcc0cc"),
Surface2: lipgloss.Color("#acb0be"),
Teal: lipgloss.Color("#179299"),
Text: lipgloss.Color("#4c4f69"),
Yellow: lipgloss.Color("#df8e1d"),
}
var Macchiato = Palette{
Base: lipgloss.Color("#24273a"),
Blue: lipgloss.Color("#8aadf4"),
Crust: lipgloss.Color("#181926"),
Flamingo: lipgloss.Color("#f0c6c6"),
Green: lipgloss.Color("#a6da95"),
Lavender: lipgloss.Color("#b7bdf8"),
Mantle: lipgloss.Color("#1e2030"),
Maroon: lipgloss.Color("#ee99a0"),
Mauve: lipgloss.Color("#c6a0f6"),
Overlay0: lipgloss.Color("#6e738d"),
Overlay1: lipgloss.Color("#8087a2"),
Overlay2: lipgloss.Color("#939ab7"),
Peach: lipgloss.Color("#f5a97f"),
Pink: lipgloss.Color("#f5bde6"),
Red: lipgloss.Color("#ed8796"),
Rosewater: lipgloss.Color("#f4dbd6"),
Sapphire: lipgloss.Color("#7dc4e4"),
Sky: lipgloss.Color("#91d7e3"),
Subtext0: lipgloss.Color("#a5adcb"),
Subtext1: lipgloss.Color("#b8c0e0"),
Surface0: lipgloss.Color("#363a4f"),
Surface1: lipgloss.Color("#494d64"),
Surface2: lipgloss.Color("#5b6078"),
Teal: lipgloss.Color("#8bd5ca"),
Text: lipgloss.Color("#cad3f5"),
Yellow: lipgloss.Color("#eed49f"),
}
var Mocha = Palette{
Base: lipgloss.Color("#1e1e2e"),
Blue: lipgloss.Color("#89b4fa"),
Crust: lipgloss.Color("#11111b"),
Flamingo: lipgloss.Color("#f2cdcd"),
Green: lipgloss.Color("#a6e3a1"),
Lavender: lipgloss.Color("#b4befe"),
Mantle: lipgloss.Color("#181825"),
Maroon: lipgloss.Color("#eba0ac"),
Mauve: lipgloss.Color("#cba6f7"),
Overlay0: lipgloss.Color("#6c7086"),
Overlay1: lipgloss.Color("#7f849c"),
Overlay2: lipgloss.Color("#9399b2"),
Peach: lipgloss.Color("#fab387"),
Pink: lipgloss.Color("#f5c2e7"),
Red: lipgloss.Color("#f38ba8"),
Rosewater: lipgloss.Color("#f5e0dc"),
Sapphire: lipgloss.Color("#74c7ec"),
Sky: lipgloss.Color("#89dceb"),
Subtext0: lipgloss.Color("#a6adc8"),
Subtext1: lipgloss.Color("#bac2de"),
Surface0: lipgloss.Color("#313244"),
Surface1: lipgloss.Color("#45475a"),
Surface2: lipgloss.Color("#585b70"),
Teal: lipgloss.Color("#94e2d5"),
Text: lipgloss.Color("#cdd6f4"),
Yellow: lipgloss.Color("#f9e2af"),
}

3
gen.go Normal file
View file

@ -0,0 +1,3 @@
package catppuccin
//go:generate go run ./tool/generate.go

20
go.mod Normal file
View file

@ -0,0 +1,20 @@
module git.red-panda.pet/pandaware/lipgloss-catppuccin
go 1.23.2
require github.com/charmbracelet/lipgloss v1.1.0
require (
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/x/ansi v0.8.0 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.16 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
golang.org/x/sys v0.30.0 // indirect
)

30
go.sum Normal file
View file

@ -0,0 +1,30 @@
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
github.com/charmbracelet/x/ansi v0.8.0 h1:9GTq3xq9caJW8ZrBTe0LIe2fvfLR/bYXKTx2llXn7xE=
github.com/charmbracelet/x/ansi v0.8.0/go.mod h1:wdYl/ONOLHLIVmQaxbIYEC/cRKOQyjTkowiI4blgS9Q=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc=
github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk=
github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no=
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM=
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E=
golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=

129
tool/generate.go Normal file
View file

@ -0,0 +1,129 @@
package main
import (
"bytes"
_ "embed"
"encoding/json"
"flag"
"go/format"
"os"
"strings"
"text/template"
)
//go:embed template.gotmpl
var tmpl string
type hsl struct {
H float64 `json:"h"`
S float64 `json:"s"`
L float64 `json:"l"`
}
type rgb struct {
R float64 `json:"r"`
G float64 `json:"g"`
B float64 `json:"b"`
}
type paletteColor struct {
Name string `json:"name"`
Order uint `json:"order"`
Hex string `json:"hex"`
RGB rgb `json:"rgb"`
HSL hsl `json:"hsl"`
Accent bool `json:"accent"`
}
func (c paletteColor) VarName() string {
return strings.Join(strings.Split(c.Name, " "), "")
}
type palette struct {
Name string `json:"name"`
Emoji string `json:"emoji"`
Order int `json:"order"`
Dark bool `json:"dark"`
Colors map[string]paletteColor `json:"colors"`
VarName string
}
type paletteFile struct {
Version string `json:"version"`
Latte palette `json:"latte"`
Frappe palette `json:"frappe"`
Macchiato palette `json:"macchiato"`
Mocha palette `json:"mocha"`
}
func exists(file string) bool {
_, err := os.Stat(file)
if err != nil {
}
return !os.IsNotExist(err)
}
func main() {
flag.Parse()
if !exists("palette.json") {
os.Exit(1)
}
f, err := os.Open("palette.json")
if err != nil {
panic(err)
}
var paletteFile paletteFile
err = json.NewDecoder(f).Decode(&paletteFile)
if err != nil {
panic(err)
}
buf := new(bytes.Buffer)
funcs := template.FuncMap{
"palettes": func() map[string]palette {
return map[string]palette{
"Latte": paletteFile.Latte,
"Frappe": paletteFile.Frappe,
"Macchiato": paletteFile.Macchiato,
"Mocha": paletteFile.Mocha,
}
},
"colorVars": func() []string {
keys := make([]string, len(paletteFile.Latte.Colors))
for _, c := range paletteFile.Latte.Colors {
keys[c.Order] = c.VarName()
}
return keys
},
}
t, err := template.New("").Funcs(funcs).Parse(tmpl)
if err != nil {
panic(err)
}
err = t.Execute(buf, nil)
if err != nil {
panic(err)
}
bs, err := format.Source(buf.Bytes())
if err != nil {
panic(err)
}
f, err = os.Create("colors.go")
if err != nil {
panic(err)
}
f.Write(bs)
}

12
tool/template.gotmpl Normal file
View file

@ -0,0 +1,12 @@
package catppuccin
import "github.com/charmbracelet/lipgloss"
type Palette struct {
{{ range colorVars }}{{ "\t" }}{{ . }} lipgloss.Color{{ "\n" }}{{ end }}
}
{{ range $var, $p := palettes }}
var {{ $var }} = Palette{
{{ range $_, $c := $p.Colors }}{{ "\t" }}{{ .VarName }}: lipgloss.Color("{{ .Hex }}"),{{ "\n" }}{{ end }}
}{{ end }}