gruvbox.go

  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}