commit 078bd9057040957f762e41f334f90315fa9dce20 Author: red Date: Sun Jun 8 14:07:05 2025 -0400 initial commit 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 }} +