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}