From 078bd9057040957f762e41f334f90315fa9dce20 Mon Sep 17 00:00:00 2001 From: red Date: Sun, 8 Jun 2025 14:07:05 -0400 Subject: [PATCH] initial commit --- .gitignore | 0 Justfile | 6 ++ README.md | 29 +++++++++ colors.go | 145 +++++++++++++++++++++++++++++++++++++++++++ gen.go | 3 + go.mod | 20 ++++++ go.sum | 30 +++++++++ tool/generate.go | 129 ++++++++++++++++++++++++++++++++++++++ tool/template.gotmpl | 12 ++++ 9 files changed, 374 insertions(+) create mode 100644 .gitignore create mode 100644 Justfile create mode 100644 README.md create mode 100644 colors.go create mode 100644 gen.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 tool/generate.go create mode 100644 tool/template.gotmpl diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/Justfile b/Justfile new file mode 100644 index 0000000..c52054b --- /dev/null +++ b/Justfile @@ -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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..90138fb --- /dev/null +++ b/README.md @@ -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` diff --git a/colors.go b/colors.go new file mode 100644 index 0000000..794568d --- /dev/null +++ b/colors.go @@ -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"), +} diff --git a/gen.go b/gen.go new file mode 100644 index 0000000..5d741bf --- /dev/null +++ b/gen.go @@ -0,0 +1,3 @@ +package catppuccin + +//go:generate go run ./tool/generate.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1f97b1b --- /dev/null +++ b/go.mod @@ -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 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..63e27fc --- /dev/null +++ b/go.sum @@ -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= diff --git a/tool/generate.go b/tool/generate.go new file mode 100644 index 0000000..6447306 --- /dev/null +++ b/tool/generate.go @@ -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) +} diff --git a/tool/template.gotmpl b/tool/template.gotmpl new file mode 100644 index 0000000..d749683 --- /dev/null +++ b/tool/template.gotmpl @@ -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 }} +