1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss"
5)
6
7// DraculaTheme implements the Theme interface with Dracula colors.
8// It provides both dark and light variants, though Dracula is primarily a dark theme.
9type DraculaTheme struct {
10 BaseTheme
11}
12
13// NewDraculaTheme creates a new instance of the Dracula theme.
14func NewDraculaTheme() *DraculaTheme {
15 // Dracula color palette
16 // Official colors from https://draculatheme.com/
17 darkBackground := "#282a36"
18 darkCurrentLine := "#44475a"
19 darkSelection := "#44475a"
20 darkForeground := "#f8f8f2"
21 darkComment := "#6272a4"
22 darkCyan := "#8be9fd"
23 darkGreen := "#50fa7b"
24 darkOrange := "#ffb86c"
25 darkPink := "#ff79c6"
26 darkPurple := "#bd93f9"
27 darkRed := "#ff5555"
28 darkYellow := "#f1fa8c"
29 darkBorder := "#44475a"
30
31 // Light mode approximation (Dracula is primarily a dark theme)
32 lightBackground := "#f8f8f2"
33 lightCurrentLine := "#e6e6e6"
34 lightSelection := "#d8d8d8"
35 lightForeground := "#282a36"
36 lightComment := "#6272a4"
37 lightCyan := "#0097a7"
38 lightGreen := "#388e3c"
39 lightOrange := "#f57c00"
40 lightPink := "#d81b60"
41 lightPurple := "#7e57c2"
42 lightRed := "#e53935"
43 lightYellow := "#fbc02d"
44 lightBorder := "#d8d8d8"
45
46 theme := &DraculaTheme{}
47
48 // Base colors
49 theme.PrimaryColor = lipgloss.AdaptiveColor{
50 Dark: darkPurple,
51 Light: lightPurple,
52 }
53 theme.SecondaryColor = lipgloss.AdaptiveColor{
54 Dark: darkPink,
55 Light: lightPink,
56 }
57 theme.AccentColor = lipgloss.AdaptiveColor{
58 Dark: darkCyan,
59 Light: lightCyan,
60 }
61
62 // Status colors
63 theme.ErrorColor = lipgloss.AdaptiveColor{
64 Dark: darkRed,
65 Light: lightRed,
66 }
67 theme.WarningColor = lipgloss.AdaptiveColor{
68 Dark: darkOrange,
69 Light: lightOrange,
70 }
71 theme.SuccessColor = lipgloss.AdaptiveColor{
72 Dark: darkGreen,
73 Light: lightGreen,
74 }
75 theme.InfoColor = lipgloss.AdaptiveColor{
76 Dark: darkCyan,
77 Light: lightCyan,
78 }
79
80 // Text colors
81 theme.TextColor = lipgloss.AdaptiveColor{
82 Dark: darkForeground,
83 Light: lightForeground,
84 }
85 theme.TextMutedColor = lipgloss.AdaptiveColor{
86 Dark: darkComment,
87 Light: lightComment,
88 }
89 theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
90 Dark: darkYellow,
91 Light: lightYellow,
92 }
93
94 // Background colors
95 theme.BackgroundColor = lipgloss.AdaptiveColor{
96 Dark: darkBackground,
97 Light: lightBackground,
98 }
99 theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
100 Dark: darkCurrentLine,
101 Light: lightCurrentLine,
102 }
103 theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
104 Dark: "#21222c", // Slightly darker than background
105 Light: "#ffffff", // Slightly lighter than background
106 }
107
108 // Border colors
109 theme.BorderNormalColor = lipgloss.AdaptiveColor{
110 Dark: darkBorder,
111 Light: lightBorder,
112 }
113 theme.BorderFocusedColor = lipgloss.AdaptiveColor{
114 Dark: darkPurple,
115 Light: lightPurple,
116 }
117 theme.BorderDimColor = lipgloss.AdaptiveColor{
118 Dark: darkSelection,
119 Light: lightSelection,
120 }
121
122 // Diff view colors
123 theme.DiffAddedColor = lipgloss.AdaptiveColor{
124 Dark: darkGreen,
125 Light: lightGreen,
126 }
127 theme.DiffRemovedColor = lipgloss.AdaptiveColor{
128 Dark: darkRed,
129 Light: lightRed,
130 }
131 theme.DiffContextColor = lipgloss.AdaptiveColor{
132 Dark: darkComment,
133 Light: lightComment,
134 }
135 theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
136 Dark: darkPurple,
137 Light: lightPurple,
138 }
139 theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
140 Dark: "#50fa7b",
141 Light: "#a5d6a7",
142 }
143 theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
144 Dark: "#ff5555",
145 Light: "#ef9a9a",
146 }
147 theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
148 Dark: "#2c3b2c",
149 Light: "#e8f5e9",
150 }
151 theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
152 Dark: "#3b2c2c",
153 Light: "#ffebee",
154 }
155 theme.DiffContextBgColor = lipgloss.AdaptiveColor{
156 Dark: darkBackground,
157 Light: lightBackground,
158 }
159 theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
160 Dark: darkComment,
161 Light: lightComment,
162 }
163 theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
164 Dark: "#253025",
165 Light: "#c8e6c9",
166 }
167 theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
168 Dark: "#302525",
169 Light: "#ffcdd2",
170 }
171
172 // Markdown colors
173 theme.MarkdownTextColor = lipgloss.AdaptiveColor{
174 Dark: darkForeground,
175 Light: lightForeground,
176 }
177 theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
178 Dark: darkPink,
179 Light: lightPink,
180 }
181 theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
182 Dark: darkPurple,
183 Light: lightPurple,
184 }
185 theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
186 Dark: darkCyan,
187 Light: lightCyan,
188 }
189 theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
190 Dark: darkGreen,
191 Light: lightGreen,
192 }
193 theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
194 Dark: darkYellow,
195 Light: lightYellow,
196 }
197 theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
198 Dark: darkYellow,
199 Light: lightYellow,
200 }
201 theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
202 Dark: darkOrange,
203 Light: lightOrange,
204 }
205 theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
206 Dark: darkComment,
207 Light: lightComment,
208 }
209 theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
210 Dark: darkPurple,
211 Light: lightPurple,
212 }
213 theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
214 Dark: darkCyan,
215 Light: lightCyan,
216 }
217 theme.MarkdownImageColor = lipgloss.AdaptiveColor{
218 Dark: darkPurple,
219 Light: lightPurple,
220 }
221 theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
222 Dark: darkCyan,
223 Light: lightCyan,
224 }
225 theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
226 Dark: darkForeground,
227 Light: lightForeground,
228 }
229
230 // Syntax highlighting colors
231 theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
232 Dark: darkComment,
233 Light: lightComment,
234 }
235 theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
236 Dark: darkPink,
237 Light: lightPink,
238 }
239 theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
240 Dark: darkGreen,
241 Light: lightGreen,
242 }
243 theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
244 Dark: darkOrange,
245 Light: lightOrange,
246 }
247 theme.SyntaxStringColor = lipgloss.AdaptiveColor{
248 Dark: darkYellow,
249 Light: lightYellow,
250 }
251 theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
252 Dark: darkPurple,
253 Light: lightPurple,
254 }
255 theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
256 Dark: darkCyan,
257 Light: lightCyan,
258 }
259 theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
260 Dark: darkPink,
261 Light: lightPink,
262 }
263 theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
264 Dark: darkForeground,
265 Light: lightForeground,
266 }
267
268 return theme
269}
270
271func init() {
272 // Register the Dracula theme with the theme manager
273 RegisterTheme("dracula", NewDraculaTheme())
274}