gruvbox.go

  1package theme
  2
  3import (
  4	"github.com/charmbracelet/lipgloss/v2"
  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.Color(gruvboxDarkBlueBright)
 78	theme.SecondaryColor = lipgloss.Color(gruvboxDarkPurpleBright)
 79	theme.AccentColor = lipgloss.Color(gruvboxDarkOrangeBright)
 80
 81	// Status colors
 82	theme.ErrorColor = lipgloss.Color(gruvboxDarkRedBright)
 83	theme.WarningColor = lipgloss.Color(gruvboxDarkYellowBright)
 84	theme.SuccessColor = lipgloss.Color(gruvboxDarkGreenBright)
 85	theme.InfoColor = lipgloss.Color(gruvboxDarkBlueBright)
 86
 87	// Text colors
 88	theme.TextColor = lipgloss.Color(gruvboxDarkFg1)
 89	theme.TextMutedColor = lipgloss.Color(gruvboxDarkFg4)
 90	theme.TextEmphasizedColor = lipgloss.Color(gruvboxDarkYellowBright)
 91
 92	// Background colors
 93	theme.BackgroundColor = lipgloss.Color(gruvboxDarkBg0)
 94	theme.BackgroundSecondaryColor = lipgloss.Color(gruvboxDarkBg1)
 95	theme.BackgroundDarkerColor = lipgloss.Color(gruvboxDarkBg0Soft)
 96
 97	// Border colors
 98	theme.BorderNormalColor = lipgloss.Color(gruvboxDarkBg2)
 99	theme.BorderFocusedColor = lipgloss.Color(gruvboxDarkBlueBright)
100	theme.BorderDimColor = lipgloss.Color(gruvboxDarkBg1)
101
102	// Diff view colors
103	theme.DiffAddedColor = lipgloss.Color(gruvboxDarkGreenBright)
104	theme.DiffRemovedColor = lipgloss.Color(gruvboxDarkRedBright)
105	theme.DiffContextColor = lipgloss.Color(gruvboxDarkFg4)
106	theme.DiffHunkHeaderColor = lipgloss.Color(gruvboxDarkFg3)
107	theme.DiffHighlightAddedColor = lipgloss.Color(gruvboxDarkGreenBright)
108	theme.DiffHighlightRemovedColor = lipgloss.Color(gruvboxDarkRedBright)
109	theme.DiffAddedBgColor = lipgloss.Color("#3C4C3C")  // Darker green background
110	theme.DiffRemovedBgColor = lipgloss.Color("#4C3C3C")  // Darker red background
111	theme.DiffContextBgColor = lipgloss.Color(gruvboxDarkBg0)
112	theme.DiffLineNumberColor = lipgloss.Color(gruvboxDarkFg4)
113	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#32432F")   // Slightly darker green
114	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#43322F")   // Slightly darker red
115
116	// Markdown colors
117	theme.MarkdownTextColor = lipgloss.Color(gruvboxDarkFg1)
118	theme.MarkdownHeadingColor = lipgloss.Color(gruvboxDarkYellowBright)
119	theme.MarkdownLinkColor = lipgloss.Color(gruvboxDarkBlueBright)
120	theme.MarkdownLinkTextColor = lipgloss.Color(gruvboxDarkAquaBright)
121	theme.MarkdownCodeColor = lipgloss.Color(gruvboxDarkGreenBright)
122	theme.MarkdownBlockQuoteColor = lipgloss.Color(gruvboxDarkAquaBright)
123	theme.MarkdownEmphColor = lipgloss.Color(gruvboxDarkYellowBright)
124	theme.MarkdownStrongColor = lipgloss.Color(gruvboxDarkOrangeBright)
125	theme.MarkdownHorizontalRuleColor = lipgloss.Color(gruvboxDarkBg3)
126	theme.MarkdownListItemColor = lipgloss.Color(gruvboxDarkBlueBright)
127	theme.MarkdownListEnumerationColor = lipgloss.Color(gruvboxDarkBlueBright)
128	theme.MarkdownImageColor = lipgloss.Color(gruvboxDarkPurpleBright)
129	theme.MarkdownImageTextColor = lipgloss.Color(gruvboxDarkAquaBright)
130	theme.MarkdownCodeBlockColor = lipgloss.Color(gruvboxDarkFg1)
131
132	// Syntax highlighting colors
133	theme.SyntaxCommentColor = lipgloss.Color(gruvboxDarkGray)
134	theme.SyntaxKeywordColor = lipgloss.Color(gruvboxDarkRedBright)
135	theme.SyntaxFunctionColor = lipgloss.Color(gruvboxDarkGreenBright)
136	theme.SyntaxVariableColor = lipgloss.Color(gruvboxDarkBlueBright)
137	theme.SyntaxStringColor = lipgloss.Color(gruvboxDarkYellowBright)
138	theme.SyntaxNumberColor = lipgloss.Color(gruvboxDarkPurpleBright)
139	theme.SyntaxTypeColor = lipgloss.Color(gruvboxDarkYellow)
140	theme.SyntaxOperatorColor = lipgloss.Color(gruvboxDarkAquaBright)
141	theme.SyntaxPunctuationColor = lipgloss.Color(gruvboxDarkFg1)
142
143	return theme
144}
145
146// NewGruvboxLightTheme creates a new instance of the Gruvbox Light theme.
147func NewGruvboxLightTheme() *GruvboxTheme {
148	theme := &GruvboxTheme{}
149
150	// Base colors
151	theme.PrimaryColor = lipgloss.Color(gruvboxLightBlueBright)
152	theme.SecondaryColor = lipgloss.Color(gruvboxLightPurpleBright)
153	theme.AccentColor = lipgloss.Color(gruvboxLightOrangeBright)
154
155	// Status colors
156	theme.ErrorColor = lipgloss.Color(gruvboxLightRedBright)
157	theme.WarningColor = lipgloss.Color(gruvboxLightYellowBright)
158	theme.SuccessColor = lipgloss.Color(gruvboxLightGreenBright)
159	theme.InfoColor = lipgloss.Color(gruvboxLightBlueBright)
160
161	// Text colors
162	theme.TextColor = lipgloss.Color(gruvboxLightFg1)
163	theme.TextMutedColor = lipgloss.Color(gruvboxLightFg4)
164	theme.TextEmphasizedColor = lipgloss.Color(gruvboxLightYellowBright)
165
166	// Background colors
167	theme.BackgroundColor = lipgloss.Color(gruvboxLightBg0)
168	theme.BackgroundSecondaryColor = lipgloss.Color(gruvboxLightBg1)
169	theme.BackgroundDarkerColor = lipgloss.Color(gruvboxLightBg0Soft)
170
171	// Border colors
172	theme.BorderNormalColor = lipgloss.Color(gruvboxLightBg2)
173	theme.BorderFocusedColor = lipgloss.Color(gruvboxLightBlueBright)
174	theme.BorderDimColor = lipgloss.Color(gruvboxLightBg1)
175
176	// Diff view colors
177	theme.DiffAddedColor = lipgloss.Color(gruvboxLightGreenBright)
178	theme.DiffRemovedColor = lipgloss.Color(gruvboxLightRedBright)
179	theme.DiffContextColor = lipgloss.Color(gruvboxLightFg4)
180	theme.DiffHunkHeaderColor = lipgloss.Color(gruvboxLightFg3)
181	theme.DiffHighlightAddedColor = lipgloss.Color(gruvboxLightGreenBright)
182	theme.DiffHighlightRemovedColor = lipgloss.Color(gruvboxLightRedBright)
183	theme.DiffAddedBgColor = lipgloss.Color("#E8F5E9") // Light green background
184	theme.DiffRemovedBgColor = lipgloss.Color("#FFEBEE") // Light red background
185	theme.DiffContextBgColor = lipgloss.Color(gruvboxLightBg0)
186	theme.DiffLineNumberColor = lipgloss.Color(gruvboxLightFg4)
187	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#C8E6C9") // Light green
188	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#FFCDD2") // Light red
189
190	// Markdown colors
191	theme.MarkdownTextColor = lipgloss.Color(gruvboxLightFg1)
192	theme.MarkdownHeadingColor = lipgloss.Color(gruvboxLightYellowBright)
193	theme.MarkdownLinkColor = lipgloss.Color(gruvboxLightBlueBright)
194	theme.MarkdownLinkTextColor = lipgloss.Color(gruvboxLightAquaBright)
195	theme.MarkdownCodeColor = lipgloss.Color(gruvboxLightGreenBright)
196	theme.MarkdownBlockQuoteColor = lipgloss.Color(gruvboxLightAquaBright)
197	theme.MarkdownEmphColor = lipgloss.Color(gruvboxLightYellowBright)
198	theme.MarkdownStrongColor = lipgloss.Color(gruvboxLightOrangeBright)
199	theme.MarkdownHorizontalRuleColor = lipgloss.Color(gruvboxLightBg3)
200	theme.MarkdownListItemColor = lipgloss.Color(gruvboxLightBlueBright)
201	theme.MarkdownListEnumerationColor = lipgloss.Color(gruvboxLightBlueBright)
202	theme.MarkdownImageColor = lipgloss.Color(gruvboxLightPurpleBright)
203	theme.MarkdownImageTextColor = lipgloss.Color(gruvboxLightAquaBright)
204	theme.MarkdownCodeBlockColor = lipgloss.Color(gruvboxLightFg1)
205
206	// Syntax highlighting colors
207	theme.SyntaxCommentColor = lipgloss.Color(gruvboxLightGray)
208	theme.SyntaxKeywordColor = lipgloss.Color(gruvboxLightRedBright)
209	theme.SyntaxFunctionColor = lipgloss.Color(gruvboxLightGreenBright)
210	theme.SyntaxVariableColor = lipgloss.Color(gruvboxLightBlueBright)
211	theme.SyntaxStringColor = lipgloss.Color(gruvboxLightYellowBright)
212	theme.SyntaxNumberColor = lipgloss.Color(gruvboxLightPurpleBright)
213	theme.SyntaxTypeColor = lipgloss.Color(gruvboxLightYellow)
214	theme.SyntaxOperatorColor = lipgloss.Color(gruvboxLightAquaBright)
215	theme.SyntaxPunctuationColor = lipgloss.Color(gruvboxLightFg1)
216
217	return theme
218}
219
220func init() {
221	// Register the Gruvbox themes with the theme manager
222	RegisterTheme("gruvbox", NewGruvboxTheme())
223	RegisterTheme("gruvbox-light", NewGruvboxLightTheme())
224}