monokai.go

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