monokai.go

  1package theme
  2
  3import (
  4	"github.com/charmbracelet/lipgloss/v2"
  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	theme := &MonokaiProTheme{}
 31
 32	// Base colors
 33	theme.PrimaryColor = lipgloss.Color(darkCyan)
 34	theme.SecondaryColor = lipgloss.Color(darkPurple)
 35	theme.AccentColor = lipgloss.Color(darkOrange)
 36
 37	// Status colors
 38	theme.ErrorColor = lipgloss.Color(darkRed)
 39	theme.WarningColor = lipgloss.Color(darkOrange)
 40	theme.SuccessColor = lipgloss.Color(darkGreen)
 41	theme.InfoColor = lipgloss.Color(darkBlue)
 42
 43	// Text colors
 44	theme.TextColor = lipgloss.Color(darkForeground)
 45	theme.TextMutedColor = lipgloss.Color(darkComment)
 46	theme.TextEmphasizedColor = lipgloss.Color(darkYellow)
 47
 48	// Background colors
 49	theme.BackgroundColor = lipgloss.Color(darkBackground)
 50	theme.BackgroundSecondaryColor = lipgloss.Color(darkCurrentLine)
 51	theme.BackgroundDarkerColor = lipgloss.Color("#221f22") // Slightly darker than background
 52
 53	// Border colors
 54	theme.BorderNormalColor = lipgloss.Color(darkBorder)
 55	theme.BorderFocusedColor = lipgloss.Color(darkCyan)
 56	theme.BorderDimColor = lipgloss.Color(darkSelection)
 57
 58	// Diff view colors
 59	theme.DiffAddedColor = lipgloss.Color("#a9dc76")
 60	theme.DiffRemovedColor = lipgloss.Color("#ff6188")
 61	theme.DiffContextColor = lipgloss.Color("#a0a0a0")
 62	theme.DiffHunkHeaderColor = lipgloss.Color("#a0a0a0")
 63	theme.DiffHighlightAddedColor = lipgloss.Color("#c2e7a9")
 64	theme.DiffHighlightRemovedColor = lipgloss.Color("#ff8ca6")
 65	theme.DiffAddedBgColor = lipgloss.Color("#3a4a35")
 66	theme.DiffRemovedBgColor = lipgloss.Color("#4a3439")
 67	theme.DiffContextBgColor = lipgloss.Color(darkBackground)
 68	theme.DiffLineNumberColor = lipgloss.Color("#888888")
 69	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#2d3a28")
 70	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#3d2a2e")
 71
 72	// Markdown colors
 73	theme.MarkdownTextColor = lipgloss.Color(darkForeground)
 74	theme.MarkdownHeadingColor = lipgloss.Color(darkPurple)
 75	theme.MarkdownLinkColor = lipgloss.Color(darkCyan)
 76	theme.MarkdownLinkTextColor = lipgloss.Color(darkBlue)
 77	theme.MarkdownCodeColor = lipgloss.Color(darkGreen)
 78	theme.MarkdownBlockQuoteColor = lipgloss.Color(darkYellow)
 79	theme.MarkdownEmphColor = lipgloss.Color(darkYellow)
 80	theme.MarkdownStrongColor = lipgloss.Color(darkOrange)
 81	theme.MarkdownHorizontalRuleColor = lipgloss.Color(darkComment)
 82	theme.MarkdownListItemColor = lipgloss.Color(darkCyan)
 83	theme.MarkdownListEnumerationColor = lipgloss.Color(darkBlue)
 84	theme.MarkdownImageColor = lipgloss.Color(darkCyan)
 85	theme.MarkdownImageTextColor = lipgloss.Color(darkBlue)
 86	theme.MarkdownCodeBlockColor = lipgloss.Color(darkForeground)
 87
 88	// Syntax highlighting colors
 89	theme.SyntaxCommentColor = lipgloss.Color(darkComment)
 90	theme.SyntaxKeywordColor = lipgloss.Color(darkRed)
 91	theme.SyntaxFunctionColor = lipgloss.Color(darkGreen)
 92	theme.SyntaxVariableColor = lipgloss.Color(darkForeground)
 93	theme.SyntaxStringColor = lipgloss.Color(darkYellow)
 94	theme.SyntaxNumberColor = lipgloss.Color(darkPurple)
 95	theme.SyntaxTypeColor = lipgloss.Color(darkBlue)
 96	theme.SyntaxOperatorColor = lipgloss.Color(darkCyan)
 97	theme.SyntaxPunctuationColor = lipgloss.Color(darkForeground)
 98
 99	return theme
100}
101
102// NewMonokaiProLightTheme creates a new instance of the Monokai Pro Light theme.
103func NewMonokaiProLightTheme() *MonokaiProTheme {
104	// Light mode colors (adapted from dark)
105	lightBackground := "#fafafa"
106	lightCurrentLine := "#f0f0f0"
107	lightSelection := "#e5e5e6"
108	lightForeground := "#2d2a2e"
109	lightComment := "#939293"
110	lightRed := "#f92672"
111	lightOrange := "#fd971f"
112	lightYellow := "#e6db74"
113	lightGreen := "#9bca65"
114	lightCyan := "#66d9ef"
115	lightBlue := "#7e75db"
116	lightPurple := "#ae81ff"
117	lightBorder := "#d3d3d3"
118
119	theme := &MonokaiProTheme{}
120
121	// Base colors
122	theme.PrimaryColor = lipgloss.Color(lightCyan)
123	theme.SecondaryColor = lipgloss.Color(lightPurple)
124	theme.AccentColor = lipgloss.Color(lightOrange)
125
126	// Status colors
127	theme.ErrorColor = lipgloss.Color(lightRed)
128	theme.WarningColor = lipgloss.Color(lightOrange)
129	theme.SuccessColor = lipgloss.Color(lightGreen)
130	theme.InfoColor = lipgloss.Color(lightBlue)
131
132	// Text colors
133	theme.TextColor = lipgloss.Color(lightForeground)
134	theme.TextMutedColor = lipgloss.Color(lightComment)
135	theme.TextEmphasizedColor = lipgloss.Color(lightYellow)
136
137	// Background colors
138	theme.BackgroundColor = lipgloss.Color(lightBackground)
139	theme.BackgroundSecondaryColor = lipgloss.Color(lightCurrentLine)
140	theme.BackgroundDarkerColor = lipgloss.Color("#ffffff") // Slightly lighter than background
141
142	// Border colors
143	theme.BorderNormalColor = lipgloss.Color(lightBorder)
144	theme.BorderFocusedColor = lipgloss.Color(lightCyan)
145	theme.BorderDimColor = lipgloss.Color(lightSelection)
146
147	// Diff view colors
148	theme.DiffAddedColor = lipgloss.Color("#9bca65")
149	theme.DiffRemovedColor = lipgloss.Color("#f92672")
150	theme.DiffContextColor = lipgloss.Color("#757575")
151	theme.DiffHunkHeaderColor = lipgloss.Color("#757575")
152	theme.DiffHighlightAddedColor = lipgloss.Color("#c5e0b4")
153	theme.DiffHighlightRemovedColor = lipgloss.Color("#ffb3c8")
154	theme.DiffAddedBgColor = lipgloss.Color("#e8f5e9")
155	theme.DiffRemovedBgColor = lipgloss.Color("#ffebee")
156	theme.DiffContextBgColor = lipgloss.Color(lightBackground)
157	theme.DiffLineNumberColor = lipgloss.Color("#9e9e9e")
158	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#c8e6c9")
159	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#ffcdd2")
160
161	// Markdown colors
162	theme.MarkdownTextColor = lipgloss.Color(lightForeground)
163	theme.MarkdownHeadingColor = lipgloss.Color(lightPurple)
164	theme.MarkdownLinkColor = lipgloss.Color(lightCyan)
165	theme.MarkdownLinkTextColor = lipgloss.Color(lightBlue)
166	theme.MarkdownCodeColor = lipgloss.Color(lightGreen)
167	theme.MarkdownBlockQuoteColor = lipgloss.Color(lightYellow)
168	theme.MarkdownEmphColor = lipgloss.Color(lightYellow)
169	theme.MarkdownStrongColor = lipgloss.Color(lightOrange)
170	theme.MarkdownHorizontalRuleColor = lipgloss.Color(lightComment)
171	theme.MarkdownListItemColor = lipgloss.Color(lightCyan)
172	theme.MarkdownListEnumerationColor = lipgloss.Color(lightBlue)
173	theme.MarkdownImageColor = lipgloss.Color(lightCyan)
174	theme.MarkdownImageTextColor = lipgloss.Color(lightBlue)
175	theme.MarkdownCodeBlockColor = lipgloss.Color(lightForeground)
176
177	// Syntax highlighting colors
178	theme.SyntaxCommentColor = lipgloss.Color(lightComment)
179	theme.SyntaxKeywordColor = lipgloss.Color(lightRed)
180	theme.SyntaxFunctionColor = lipgloss.Color(lightGreen)
181	theme.SyntaxVariableColor = lipgloss.Color(lightForeground)
182	theme.SyntaxStringColor = lipgloss.Color(lightYellow)
183	theme.SyntaxNumberColor = lipgloss.Color(lightPurple)
184	theme.SyntaxTypeColor = lipgloss.Color(lightBlue)
185	theme.SyntaxOperatorColor = lipgloss.Color(lightCyan)
186	theme.SyntaxPunctuationColor = lipgloss.Color(lightForeground)
187
188	return theme
189}
190
191func init() {
192	// Register the Monokai Pro themes with the theme manager
193	RegisterTheme("monokai", NewMonokaiProTheme())
194	RegisterTheme("monokai-light", NewMonokaiProLightTheme())
195}