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