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}