opencode.go

  1package theme
  2
  3import (
  4	"github.com/charmbracelet/lipgloss"
  5)
  6
  7// OpenCodeTheme implements the Theme interface with OpenCode brand colors.
  8// It provides both dark and light variants.
  9type OpenCodeTheme struct {
 10	BaseTheme
 11}
 12
 13// NewOpenCodeTheme creates a new instance of the OpenCode theme.
 14func NewOpenCodeTheme() *OpenCodeTheme {
 15	// OpenCode color palette
 16	// Dark mode colors
 17	darkBackground := "#212121"
 18	darkCurrentLine := "#252525"
 19	darkSelection := "#303030"
 20	darkForeground := "#e0e0e0"
 21	darkComment := "#6a6a6a"
 22	darkPrimary := "#fab283"   // Primary orange/gold
 23	darkSecondary := "#5c9cf5" // Secondary blue
 24	darkAccent := "#9d7cd8"    // Accent purple
 25	darkRed := "#e06c75"       // Error red
 26	darkOrange := "#f5a742"    // Warning orange
 27	darkGreen := "#7fd88f"     // Success green
 28	darkCyan := "#56b6c2"      // Info cyan
 29	darkYellow := "#e5c07b"    // Emphasized text
 30	darkBorder := "#4b4c5c"    // Border color
 31
 32	// Light mode colors
 33	lightBackground := "#f8f8f8"
 34	lightCurrentLine := "#f0f0f0"
 35	lightSelection := "#e5e5e6"
 36	lightForeground := "#2a2a2a"
 37	lightComment := "#8a8a8a"
 38	lightPrimary := "#3b7dd8"   // Primary blue
 39	lightSecondary := "#7b5bb6" // Secondary purple
 40	lightAccent := "#d68c27"    // Accent orange/gold
 41	lightRed := "#d1383d"       // Error red
 42	lightOrange := "#d68c27"    // Warning orange
 43	lightGreen := "#3d9a57"     // Success green
 44	lightCyan := "#318795"      // Info cyan
 45	lightYellow := "#b0851f"    // Emphasized text
 46	lightBorder := "#d3d3d3"    // Border color
 47
 48	theme := &OpenCodeTheme{}
 49
 50	// Base colors
 51	theme.PrimaryColor = lipgloss.AdaptiveColor{
 52		Dark:  darkPrimary,
 53		Light: lightPrimary,
 54	}
 55	theme.SecondaryColor = lipgloss.AdaptiveColor{
 56		Dark:  darkSecondary,
 57		Light: lightSecondary,
 58	}
 59	theme.AccentColor = lipgloss.AdaptiveColor{
 60		Dark:  darkAccent,
 61		Light: lightAccent,
 62	}
 63
 64	// Status colors
 65	theme.ErrorColor = lipgloss.AdaptiveColor{
 66		Dark:  darkRed,
 67		Light: lightRed,
 68	}
 69	theme.WarningColor = lipgloss.AdaptiveColor{
 70		Dark:  darkOrange,
 71		Light: lightOrange,
 72	}
 73	theme.SuccessColor = lipgloss.AdaptiveColor{
 74		Dark:  darkGreen,
 75		Light: lightGreen,
 76	}
 77	theme.InfoColor = lipgloss.AdaptiveColor{
 78		Dark:  darkCyan,
 79		Light: lightCyan,
 80	}
 81
 82	// Text colors
 83	theme.TextColor = lipgloss.AdaptiveColor{
 84		Dark:  darkForeground,
 85		Light: lightForeground,
 86	}
 87	theme.TextMutedColor = lipgloss.AdaptiveColor{
 88		Dark:  darkComment,
 89		Light: lightComment,
 90	}
 91	theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
 92		Dark:  darkYellow,
 93		Light: lightYellow,
 94	}
 95
 96	// Background colors
 97	theme.BackgroundColor = lipgloss.AdaptiveColor{
 98		Dark:  darkBackground,
 99		Light: lightBackground,
100	}
101	theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
102		Dark:  darkCurrentLine,
103		Light: lightCurrentLine,
104	}
105	theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
106		Dark:  "#121212", // Slightly darker than background
107		Light: "#ffffff", // Slightly lighter than background
108	}
109
110	// Border colors
111	theme.BorderNormalColor = lipgloss.AdaptiveColor{
112		Dark:  darkBorder,
113		Light: lightBorder,
114	}
115	theme.BorderFocusedColor = lipgloss.AdaptiveColor{
116		Dark:  darkPrimary,
117		Light: lightPrimary,
118	}
119	theme.BorderDimColor = lipgloss.AdaptiveColor{
120		Dark:  darkSelection,
121		Light: lightSelection,
122	}
123
124	// Diff view colors
125	theme.DiffAddedColor = lipgloss.AdaptiveColor{
126		Dark:  "#478247",
127		Light: "#2E7D32",
128	}
129	theme.DiffRemovedColor = lipgloss.AdaptiveColor{
130		Dark:  "#7C4444",
131		Light: "#C62828",
132	}
133	theme.DiffContextColor = lipgloss.AdaptiveColor{
134		Dark:  "#a0a0a0",
135		Light: "#757575",
136	}
137	theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
138		Dark:  "#a0a0a0",
139		Light: "#757575",
140	}
141	theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
142		Dark:  "#DAFADA",
143		Light: "#A5D6A7",
144	}
145	theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
146		Dark:  "#FADADD",
147		Light: "#EF9A9A",
148	}
149	theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
150		Dark:  "#303A30",
151		Light: "#E8F5E9",
152	}
153	theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
154		Dark:  "#3A3030",
155		Light: "#FFEBEE",
156	}
157	theme.DiffContextBgColor = lipgloss.AdaptiveColor{
158		Dark:  darkBackground,
159		Light: lightBackground,
160	}
161	theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
162		Dark:  "#888888",
163		Light: "#9E9E9E",
164	}
165	theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
166		Dark:  "#293229",
167		Light: "#C8E6C9",
168	}
169	theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
170		Dark:  "#332929",
171		Light: "#FFCDD2",
172	}
173
174	// Markdown colors
175	theme.MarkdownTextColor = lipgloss.AdaptiveColor{
176		Dark:  darkForeground,
177		Light: lightForeground,
178	}
179	theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
180		Dark:  darkSecondary,
181		Light: lightSecondary,
182	}
183	theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
184		Dark:  darkPrimary,
185		Light: lightPrimary,
186	}
187	theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
188		Dark:  darkCyan,
189		Light: lightCyan,
190	}
191	theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
192		Dark:  darkGreen,
193		Light: lightGreen,
194	}
195	theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
196		Dark:  darkYellow,
197		Light: lightYellow,
198	}
199	theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
200		Dark:  darkYellow,
201		Light: lightYellow,
202	}
203	theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
204		Dark:  darkAccent,
205		Light: lightAccent,
206	}
207	theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
208		Dark:  darkComment,
209		Light: lightComment,
210	}
211	theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
212		Dark:  darkPrimary,
213		Light: lightPrimary,
214	}
215	theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
216		Dark:  darkCyan,
217		Light: lightCyan,
218	}
219	theme.MarkdownImageColor = lipgloss.AdaptiveColor{
220		Dark:  darkPrimary,
221		Light: lightPrimary,
222	}
223	theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
224		Dark:  darkCyan,
225		Light: lightCyan,
226	}
227	theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
228		Dark:  darkForeground,
229		Light: lightForeground,
230	}
231
232	// Syntax highlighting colors
233	theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
234		Dark:  darkComment,
235		Light: lightComment,
236	}
237	theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
238		Dark:  darkSecondary,
239		Light: lightSecondary,
240	}
241	theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
242		Dark:  darkPrimary,
243		Light: lightPrimary,
244	}
245	theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
246		Dark:  darkRed,
247		Light: lightRed,
248	}
249	theme.SyntaxStringColor = lipgloss.AdaptiveColor{
250		Dark:  darkGreen,
251		Light: lightGreen,
252	}
253	theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
254		Dark:  darkAccent,
255		Light: lightAccent,
256	}
257	theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
258		Dark:  darkYellow,
259		Light: lightYellow,
260	}
261	theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
262		Dark:  darkCyan,
263		Light: lightCyan,
264	}
265	theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
266		Dark:  darkForeground,
267		Light: lightForeground,
268	}
269
270	return theme
271}
272
273func init() {
274	// Register the OpenCode theme with the theme manager
275	RegisterTheme("opencode", NewOpenCodeTheme())
276}
277