catppuccin.go

  1package theme
  2
  3import (
  4	catppuccin "github.com/catppuccin/go"
  5	"github.com/charmbracelet/lipgloss"
  6)
  7
  8// CatppuccinTheme implements the Theme interface with Catppuccin colors.
  9// It provides both dark (Mocha) and light (Latte) variants.
 10type CatppuccinTheme struct {
 11	BaseTheme
 12}
 13
 14// NewCatppuccinTheme creates a new instance of the Catppuccin theme.
 15func NewCatppuccinTheme() *CatppuccinTheme {
 16	// Get the Catppuccin palettes
 17	mocha := catppuccin.Mocha
 18	latte := catppuccin.Latte
 19
 20	theme := &CatppuccinTheme{}
 21
 22	// Base colors
 23	theme.PrimaryColor = lipgloss.AdaptiveColor{
 24		Dark:  mocha.Blue().Hex,
 25		Light: latte.Blue().Hex,
 26	}
 27	theme.SecondaryColor = lipgloss.AdaptiveColor{
 28		Dark:  mocha.Mauve().Hex,
 29		Light: latte.Mauve().Hex,
 30	}
 31	theme.AccentColor = lipgloss.AdaptiveColor{
 32		Dark:  mocha.Peach().Hex,
 33		Light: latte.Peach().Hex,
 34	}
 35
 36	// Status colors
 37	theme.ErrorColor = lipgloss.AdaptiveColor{
 38		Dark:  mocha.Red().Hex,
 39		Light: latte.Red().Hex,
 40	}
 41	theme.WarningColor = lipgloss.AdaptiveColor{
 42		Dark:  mocha.Peach().Hex,
 43		Light: latte.Peach().Hex,
 44	}
 45	theme.SuccessColor = lipgloss.AdaptiveColor{
 46		Dark:  mocha.Green().Hex,
 47		Light: latte.Green().Hex,
 48	}
 49	theme.InfoColor = lipgloss.AdaptiveColor{
 50		Dark:  mocha.Blue().Hex,
 51		Light: latte.Blue().Hex,
 52	}
 53
 54	// Text colors
 55	theme.TextColor = lipgloss.AdaptiveColor{
 56		Dark:  mocha.Text().Hex,
 57		Light: latte.Text().Hex,
 58	}
 59	theme.TextMutedColor = lipgloss.AdaptiveColor{
 60		Dark:  mocha.Subtext0().Hex,
 61		Light: latte.Subtext0().Hex,
 62	}
 63	theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
 64		Dark:  mocha.Lavender().Hex,
 65		Light: latte.Lavender().Hex,
 66	}
 67
 68	// Background colors
 69	theme.BackgroundColor = lipgloss.AdaptiveColor{
 70		Dark:  "#212121", // From existing styles
 71		Light: "#EEEEEE", // Light equivalent
 72	}
 73	theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
 74		Dark:  "#2c2c2c", // From existing styles
 75		Light: "#E0E0E0", // Light equivalent
 76	}
 77	theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
 78		Dark:  "#181818", // From existing styles
 79		Light: "#F5F5F5", // Light equivalent
 80	}
 81
 82	// Border colors
 83	theme.BorderNormalColor = lipgloss.AdaptiveColor{
 84		Dark:  "#4b4c5c", // From existing styles
 85		Light: "#BDBDBD", // Light equivalent
 86	}
 87	theme.BorderFocusedColor = lipgloss.AdaptiveColor{
 88		Dark:  mocha.Blue().Hex,
 89		Light: latte.Blue().Hex,
 90	}
 91	theme.BorderDimColor = lipgloss.AdaptiveColor{
 92		Dark:  mocha.Surface0().Hex,
 93		Light: latte.Surface0().Hex,
 94	}
 95
 96	// Diff view colors
 97	theme.DiffAddedColor = lipgloss.AdaptiveColor{
 98		Dark:  "#478247", // From existing diff.go
 99		Light: "#2E7D32", // Light equivalent
100	}
101	theme.DiffRemovedColor = lipgloss.AdaptiveColor{
102		Dark:  "#7C4444", // From existing diff.go
103		Light: "#C62828", // Light equivalent
104	}
105	theme.DiffContextColor = lipgloss.AdaptiveColor{
106		Dark:  "#a0a0a0", // From existing diff.go
107		Light: "#757575", // Light equivalent
108	}
109	theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
110		Dark:  "#a0a0a0", // From existing diff.go
111		Light: "#757575", // Light equivalent
112	}
113	theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
114		Dark:  "#DAFADA", // From existing diff.go
115		Light: "#A5D6A7", // Light equivalent
116	}
117	theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
118		Dark:  "#FADADD", // From existing diff.go
119		Light: "#EF9A9A", // Light equivalent
120	}
121	theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
122		Dark:  "#303A30", // From existing diff.go
123		Light: "#E8F5E9", // Light equivalent
124	}
125	theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
126		Dark:  "#3A3030", // From existing diff.go
127		Light: "#FFEBEE", // Light equivalent
128	}
129	theme.DiffContextBgColor = lipgloss.AdaptiveColor{
130		Dark:  "#212121", // From existing diff.go
131		Light: "#F5F5F5", // Light equivalent
132	}
133	theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
134		Dark:  "#888888", // From existing diff.go
135		Light: "#9E9E9E", // Light equivalent
136	}
137	theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
138		Dark:  "#293229", // From existing diff.go
139		Light: "#C8E6C9", // Light equivalent
140	}
141	theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
142		Dark:  "#332929", // From existing diff.go
143		Light: "#FFCDD2", // Light equivalent
144	}
145
146	// Markdown colors
147	theme.MarkdownTextColor = lipgloss.AdaptiveColor{
148		Dark:  mocha.Text().Hex,
149		Light: latte.Text().Hex,
150	}
151	theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
152		Dark:  mocha.Mauve().Hex,
153		Light: latte.Mauve().Hex,
154	}
155	theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
156		Dark:  mocha.Sky().Hex,
157		Light: latte.Sky().Hex,
158	}
159	theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
160		Dark:  mocha.Pink().Hex,
161		Light: latte.Pink().Hex,
162	}
163	theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
164		Dark:  mocha.Green().Hex,
165		Light: latte.Green().Hex,
166	}
167	theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
168		Dark:  mocha.Yellow().Hex,
169		Light: latte.Yellow().Hex,
170	}
171	theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
172		Dark:  mocha.Yellow().Hex,
173		Light: latte.Yellow().Hex,
174	}
175	theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
176		Dark:  mocha.Peach().Hex,
177		Light: latte.Peach().Hex,
178	}
179	theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
180		Dark:  mocha.Overlay0().Hex,
181		Light: latte.Overlay0().Hex,
182	}
183	theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
184		Dark:  mocha.Blue().Hex,
185		Light: latte.Blue().Hex,
186	}
187	theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
188		Dark:  mocha.Sky().Hex,
189		Light: latte.Sky().Hex,
190	}
191	theme.MarkdownImageColor = lipgloss.AdaptiveColor{
192		Dark:  mocha.Sapphire().Hex,
193		Light: latte.Sapphire().Hex,
194	}
195	theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
196		Dark:  mocha.Pink().Hex,
197		Light: latte.Pink().Hex,
198	}
199	theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
200		Dark:  mocha.Text().Hex,
201		Light: latte.Text().Hex,
202	}
203
204	// Syntax highlighting colors
205	theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
206		Dark:  mocha.Overlay1().Hex,
207		Light: latte.Overlay1().Hex,
208	}
209	theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
210		Dark:  mocha.Pink().Hex,
211		Light: latte.Pink().Hex,
212	}
213	theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
214		Dark:  mocha.Green().Hex,
215		Light: latte.Green().Hex,
216	}
217	theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
218		Dark:  mocha.Sky().Hex,
219		Light: latte.Sky().Hex,
220	}
221	theme.SyntaxStringColor = lipgloss.AdaptiveColor{
222		Dark:  mocha.Yellow().Hex,
223		Light: latte.Yellow().Hex,
224	}
225	theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
226		Dark:  mocha.Teal().Hex,
227		Light: latte.Teal().Hex,
228	}
229	theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
230		Dark:  mocha.Sky().Hex,
231		Light: latte.Sky().Hex,
232	}
233	theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
234		Dark:  mocha.Pink().Hex,
235		Light: latte.Pink().Hex,
236	}
237	theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
238		Dark:  mocha.Text().Hex,
239		Light: latte.Text().Hex,
240	}
241
242	return theme
243}
244
245func init() {
246	// Register the Catppuccin theme with the theme manager
247	RegisterTheme("catppuccin", NewCatppuccinTheme())
248}