dracula.go

  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}