1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss"
5)
6
7// OneDarkTheme implements the Theme interface with Atom's One Dark colors.
8// It provides both dark and light variants.
9type OneDarkTheme struct {
10 BaseTheme
11}
12
13// NewOneDarkTheme creates a new instance of the One Dark theme.
14func NewOneDarkTheme() *OneDarkTheme {
15 // One Dark color palette
16 // Dark mode colors from Atom One Dark
17 darkBackground := "#282c34"
18 darkCurrentLine := "#2c313c"
19 darkSelection := "#3e4451"
20 darkForeground := "#abb2bf"
21 darkComment := "#5c6370"
22 darkRed := "#e06c75"
23 darkOrange := "#d19a66"
24 darkYellow := "#e5c07b"
25 darkGreen := "#98c379"
26 darkCyan := "#56b6c2"
27 darkBlue := "#61afef"
28 darkPurple := "#c678dd"
29 darkBorder := "#3b4048"
30
31 // Light mode colors from Atom One Light
32 lightBackground := "#fafafa"
33 lightCurrentLine := "#f0f0f0"
34 lightSelection := "#e5e5e6"
35 lightForeground := "#383a42"
36 lightComment := "#a0a1a7"
37 lightRed := "#e45649"
38 lightOrange := "#da8548"
39 lightYellow := "#c18401"
40 lightGreen := "#50a14f"
41 lightCyan := "#0184bc"
42 lightBlue := "#4078f2"
43 lightPurple := "#a626a4"
44 lightBorder := "#d3d3d3"
45
46 theme := &OneDarkTheme{}
47
48 // Base colors
49 theme.PrimaryColor = lipgloss.AdaptiveColor{
50 Dark: darkBlue,
51 Light: lightBlue,
52 }
53 theme.SecondaryColor = lipgloss.AdaptiveColor{
54 Dark: darkPurple,
55 Light: lightPurple,
56 }
57 theme.AccentColor = lipgloss.AdaptiveColor{
58 Dark: darkOrange,
59 Light: lightOrange,
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: darkBlue,
77 Light: lightBlue,
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: "#21252b", // 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: darkBlue,
115 Light: lightBlue,
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: "#478247",
125 Light: "#2E7D32",
126 }
127 theme.DiffRemovedColor = lipgloss.AdaptiveColor{
128 Dark: "#7C4444",
129 Light: "#C62828",
130 }
131 theme.DiffContextColor = lipgloss.AdaptiveColor{
132 Dark: "#a0a0a0",
133 Light: "#757575",
134 }
135 theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
136 Dark: "#a0a0a0",
137 Light: "#757575",
138 }
139 theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
140 Dark: "#DAFADA",
141 Light: "#A5D6A7",
142 }
143 theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
144 Dark: "#FADADD",
145 Light: "#EF9A9A",
146 }
147 theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
148 Dark: "#303A30",
149 Light: "#E8F5E9",
150 }
151 theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
152 Dark: "#3A3030",
153 Light: "#FFEBEE",
154 }
155 theme.DiffContextBgColor = lipgloss.AdaptiveColor{
156 Dark: darkBackground,
157 Light: lightBackground,
158 }
159 theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
160 Dark: "#888888",
161 Light: "#9E9E9E",
162 }
163 theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
164 Dark: "#293229",
165 Light: "#C8E6C9",
166 }
167 theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
168 Dark: "#332929",
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: darkPurple,
179 Light: lightPurple,
180 }
181 theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
182 Dark: darkBlue,
183 Light: lightBlue,
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: darkBlue,
211 Light: lightBlue,
212 }
213 theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
214 Dark: darkCyan,
215 Light: lightCyan,
216 }
217 theme.MarkdownImageColor = lipgloss.AdaptiveColor{
218 Dark: darkBlue,
219 Light: lightBlue,
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: darkPurple,
237 Light: lightPurple,
238 }
239 theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
240 Dark: darkBlue,
241 Light: lightBlue,
242 }
243 theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
244 Dark: darkRed,
245 Light: lightRed,
246 }
247 theme.SyntaxStringColor = lipgloss.AdaptiveColor{
248 Dark: darkGreen,
249 Light: lightGreen,
250 }
251 theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
252 Dark: darkOrange,
253 Light: lightOrange,
254 }
255 theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
256 Dark: darkYellow,
257 Light: lightYellow,
258 }
259 theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
260 Dark: darkCyan,
261 Light: lightCyan,
262 }
263 theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
264 Dark: darkForeground,
265 Light: lightForeground,
266 }
267
268 return theme
269}
270
271func init() {
272 // Register the One Dark theme with the theme manager
273 RegisterTheme("onedark", NewOneDarkTheme())
274}