1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss"
5)
6
7// Gruvbox color palette constants
8const (
9 // Dark theme colors
10 gruvboxDarkBg0 = "#282828"
11 gruvboxDarkBg0Soft = "#32302f"
12 gruvboxDarkBg1 = "#3c3836"
13 gruvboxDarkBg2 = "#504945"
14 gruvboxDarkBg3 = "#665c54"
15 gruvboxDarkBg4 = "#7c6f64"
16 gruvboxDarkFg0 = "#fbf1c7"
17 gruvboxDarkFg1 = "#ebdbb2"
18 gruvboxDarkFg2 = "#d5c4a1"
19 gruvboxDarkFg3 = "#bdae93"
20 gruvboxDarkFg4 = "#a89984"
21 gruvboxDarkGray = "#928374"
22 gruvboxDarkRed = "#cc241d"
23 gruvboxDarkRedBright = "#fb4934"
24 gruvboxDarkGreen = "#98971a"
25 gruvboxDarkGreenBright = "#b8bb26"
26 gruvboxDarkYellow = "#d79921"
27 gruvboxDarkYellowBright = "#fabd2f"
28 gruvboxDarkBlue = "#458588"
29 gruvboxDarkBlueBright = "#83a598"
30 gruvboxDarkPurple = "#b16286"
31 gruvboxDarkPurpleBright = "#d3869b"
32 gruvboxDarkAqua = "#689d6a"
33 gruvboxDarkAquaBright = "#8ec07c"
34 gruvboxDarkOrange = "#d65d0e"
35 gruvboxDarkOrangeBright = "#fe8019"
36
37 // Light theme colors
38 gruvboxLightBg0 = "#fbf1c7"
39 gruvboxLightBg0Soft = "#f2e5bc"
40 gruvboxLightBg1 = "#ebdbb2"
41 gruvboxLightBg2 = "#d5c4a1"
42 gruvboxLightBg3 = "#bdae93"
43 gruvboxLightBg4 = "#a89984"
44 gruvboxLightFg0 = "#282828"
45 gruvboxLightFg1 = "#3c3836"
46 gruvboxLightFg2 = "#504945"
47 gruvboxLightFg3 = "#665c54"
48 gruvboxLightFg4 = "#7c6f64"
49 gruvboxLightGray = "#928374"
50 gruvboxLightRed = "#9d0006"
51 gruvboxLightRedBright = "#cc241d"
52 gruvboxLightGreen = "#79740e"
53 gruvboxLightGreenBright = "#98971a"
54 gruvboxLightYellow = "#b57614"
55 gruvboxLightYellowBright = "#d79921"
56 gruvboxLightBlue = "#076678"
57 gruvboxLightBlueBright = "#458588"
58 gruvboxLightPurple = "#8f3f71"
59 gruvboxLightPurpleBright = "#b16286"
60 gruvboxLightAqua = "#427b58"
61 gruvboxLightAquaBright = "#689d6a"
62 gruvboxLightOrange = "#af3a03"
63 gruvboxLightOrangeBright = "#d65d0e"
64)
65
66// GruvboxTheme implements the Theme interface with Gruvbox colors.
67// It provides both dark and light variants.
68type GruvboxTheme struct {
69 BaseTheme
70}
71
72// NewGruvboxTheme creates a new instance of the Gruvbox theme.
73func NewGruvboxTheme() *GruvboxTheme {
74 theme := &GruvboxTheme{}
75
76 // Base colors
77 theme.PrimaryColor = lipgloss.AdaptiveColor{
78 Dark: gruvboxDarkBlueBright,
79 Light: gruvboxLightBlueBright,
80 }
81 theme.SecondaryColor = lipgloss.AdaptiveColor{
82 Dark: gruvboxDarkPurpleBright,
83 Light: gruvboxLightPurpleBright,
84 }
85 theme.AccentColor = lipgloss.AdaptiveColor{
86 Dark: gruvboxDarkOrangeBright,
87 Light: gruvboxLightOrangeBright,
88 }
89
90 // Status colors
91 theme.ErrorColor = lipgloss.AdaptiveColor{
92 Dark: gruvboxDarkRedBright,
93 Light: gruvboxLightRedBright,
94 }
95 theme.WarningColor = lipgloss.AdaptiveColor{
96 Dark: gruvboxDarkYellowBright,
97 Light: gruvboxLightYellowBright,
98 }
99 theme.SuccessColor = lipgloss.AdaptiveColor{
100 Dark: gruvboxDarkGreenBright,
101 Light: gruvboxLightGreenBright,
102 }
103 theme.InfoColor = lipgloss.AdaptiveColor{
104 Dark: gruvboxDarkBlueBright,
105 Light: gruvboxLightBlueBright,
106 }
107
108 // Text colors
109 theme.TextColor = lipgloss.AdaptiveColor{
110 Dark: gruvboxDarkFg1,
111 Light: gruvboxLightFg1,
112 }
113 theme.TextMutedColor = lipgloss.AdaptiveColor{
114 Dark: gruvboxDarkFg4,
115 Light: gruvboxLightFg4,
116 }
117 theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
118 Dark: gruvboxDarkYellowBright,
119 Light: gruvboxLightYellowBright,
120 }
121
122 // Background colors
123 theme.BackgroundColor = lipgloss.AdaptiveColor{
124 Dark: gruvboxDarkBg0,
125 Light: gruvboxLightBg0,
126 }
127 theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
128 Dark: gruvboxDarkBg1,
129 Light: gruvboxLightBg1,
130 }
131 theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
132 Dark: gruvboxDarkBg0Soft,
133 Light: gruvboxLightBg0Soft,
134 }
135
136 // Border colors
137 theme.BorderNormalColor = lipgloss.AdaptiveColor{
138 Dark: gruvboxDarkBg2,
139 Light: gruvboxLightBg2,
140 }
141 theme.BorderFocusedColor = lipgloss.AdaptiveColor{
142 Dark: gruvboxDarkBlueBright,
143 Light: gruvboxLightBlueBright,
144 }
145 theme.BorderDimColor = lipgloss.AdaptiveColor{
146 Dark: gruvboxDarkBg1,
147 Light: gruvboxLightBg1,
148 }
149
150 // Diff view colors
151 theme.DiffAddedColor = lipgloss.AdaptiveColor{
152 Dark: gruvboxDarkGreenBright,
153 Light: gruvboxLightGreenBright,
154 }
155 theme.DiffRemovedColor = lipgloss.AdaptiveColor{
156 Dark: gruvboxDarkRedBright,
157 Light: gruvboxLightRedBright,
158 }
159 theme.DiffContextColor = lipgloss.AdaptiveColor{
160 Dark: gruvboxDarkFg4,
161 Light: gruvboxLightFg4,
162 }
163 theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
164 Dark: gruvboxDarkFg3,
165 Light: gruvboxLightFg3,
166 }
167 theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
168 Dark: gruvboxDarkGreenBright,
169 Light: gruvboxLightGreenBright,
170 }
171 theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
172 Dark: gruvboxDarkRedBright,
173 Light: gruvboxLightRedBright,
174 }
175 theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
176 Dark: "#3C4C3C", // Darker green background
177 Light: "#E8F5E9", // Light green background
178 }
179 theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
180 Dark: "#4C3C3C", // Darker red background
181 Light: "#FFEBEE", // Light red background
182 }
183 theme.DiffContextBgColor = lipgloss.AdaptiveColor{
184 Dark: gruvboxDarkBg0,
185 Light: gruvboxLightBg0,
186 }
187 theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
188 Dark: gruvboxDarkFg4,
189 Light: gruvboxLightFg4,
190 }
191 theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
192 Dark: "#32432F", // Slightly darker green
193 Light: "#C8E6C9", // Light green
194 }
195 theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
196 Dark: "#43322F", // Slightly darker red
197 Light: "#FFCDD2", // Light red
198 }
199
200 // Markdown colors
201 theme.MarkdownTextColor = lipgloss.AdaptiveColor{
202 Dark: gruvboxDarkFg1,
203 Light: gruvboxLightFg1,
204 }
205 theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
206 Dark: gruvboxDarkYellowBright,
207 Light: gruvboxLightYellowBright,
208 }
209 theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
210 Dark: gruvboxDarkBlueBright,
211 Light: gruvboxLightBlueBright,
212 }
213 theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
214 Dark: gruvboxDarkAquaBright,
215 Light: gruvboxLightAquaBright,
216 }
217 theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
218 Dark: gruvboxDarkGreenBright,
219 Light: gruvboxLightGreenBright,
220 }
221 theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
222 Dark: gruvboxDarkAquaBright,
223 Light: gruvboxLightAquaBright,
224 }
225 theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
226 Dark: gruvboxDarkYellowBright,
227 Light: gruvboxLightYellowBright,
228 }
229 theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
230 Dark: gruvboxDarkOrangeBright,
231 Light: gruvboxLightOrangeBright,
232 }
233 theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
234 Dark: gruvboxDarkBg3,
235 Light: gruvboxLightBg3,
236 }
237 theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
238 Dark: gruvboxDarkBlueBright,
239 Light: gruvboxLightBlueBright,
240 }
241 theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
242 Dark: gruvboxDarkBlueBright,
243 Light: gruvboxLightBlueBright,
244 }
245 theme.MarkdownImageColor = lipgloss.AdaptiveColor{
246 Dark: gruvboxDarkPurpleBright,
247 Light: gruvboxLightPurpleBright,
248 }
249 theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
250 Dark: gruvboxDarkAquaBright,
251 Light: gruvboxLightAquaBright,
252 }
253 theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
254 Dark: gruvboxDarkFg1,
255 Light: gruvboxLightFg1,
256 }
257
258 // Syntax highlighting colors
259 theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
260 Dark: gruvboxDarkGray,
261 Light: gruvboxLightGray,
262 }
263 theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
264 Dark: gruvboxDarkRedBright,
265 Light: gruvboxLightRedBright,
266 }
267 theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
268 Dark: gruvboxDarkGreenBright,
269 Light: gruvboxLightGreenBright,
270 }
271 theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
272 Dark: gruvboxDarkBlueBright,
273 Light: gruvboxLightBlueBright,
274 }
275 theme.SyntaxStringColor = lipgloss.AdaptiveColor{
276 Dark: gruvboxDarkYellowBright,
277 Light: gruvboxLightYellowBright,
278 }
279 theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
280 Dark: gruvboxDarkPurpleBright,
281 Light: gruvboxLightPurpleBright,
282 }
283 theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
284 Dark: gruvboxDarkYellow,
285 Light: gruvboxLightYellow,
286 }
287 theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
288 Dark: gruvboxDarkAquaBright,
289 Light: gruvboxLightAquaBright,
290 }
291 theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
292 Dark: gruvboxDarkFg1,
293 Light: gruvboxLightFg1,
294 }
295
296 return theme
297}
298
299func init() {
300 // Register the Gruvbox theme with the theme manager
301 RegisterTheme("gruvbox", NewGruvboxTheme())
302}