1package theme
2
3import (
4 "github.com/charmbracelet/lipgloss"
5)
6
7// TokyoNightTheme implements the Theme interface with Tokyo Night colors.
8// It provides both dark and light variants.
9type TokyoNightTheme struct {
10 BaseTheme
11}
12
13// NewTokyoNightTheme creates a new instance of the Tokyo Night theme.
14func NewTokyoNightTheme() *TokyoNightTheme {
15 // Tokyo Night color palette
16 // Dark mode colors
17 darkBackground := "#222436"
18 darkCurrentLine := "#1e2030"
19 darkSelection := "#2f334d"
20 darkForeground := "#c8d3f5"
21 darkComment := "#636da6"
22 darkRed := "#ff757f"
23 darkOrange := "#ff966c"
24 darkYellow := "#ffc777"
25 darkGreen := "#c3e88d"
26 darkCyan := "#86e1fc"
27 darkBlue := "#82aaff"
28 darkPurple := "#c099ff"
29 darkBorder := "#3b4261"
30
31 // Light mode colors (Tokyo Night Day)
32 lightBackground := "#e1e2e7"
33 lightCurrentLine := "#d5d6db"
34 lightSelection := "#c8c9ce"
35 lightForeground := "#3760bf"
36 lightComment := "#848cb5"
37 lightRed := "#f52a65"
38 lightOrange := "#b15c00"
39 lightYellow := "#8c6c3e"
40 lightGreen := "#587539"
41 lightCyan := "#007197"
42 lightBlue := "#2e7de9"
43 lightPurple := "#9854f1"
44 lightBorder := "#a8aecb"
45
46 theme := &TokyoNightTheme{}
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: "#191B29", // Darker background from palette
105 Light: "#f0f0f5", // 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: "#4fd6be", // teal from palette
125 Light: "#1e725c",
126 }
127 theme.DiffRemovedColor = lipgloss.AdaptiveColor{
128 Dark: "#c53b53", // red1 from palette
129 Light: "#c53b53",
130 }
131 theme.DiffContextColor = lipgloss.AdaptiveColor{
132 Dark: "#828bb8", // fg_dark from palette
133 Light: "#7086b5",
134 }
135 theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
136 Dark: "#828bb8", // fg_dark from palette
137 Light: "#7086b5",
138 }
139 theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
140 Dark: "#b8db87", // git.add from palette
141 Light: "#4db380",
142 }
143 theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
144 Dark: "#e26a75", // git.delete from palette
145 Light: "#f52a65",
146 }
147 theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
148 Dark: "#20303b",
149 Light: "#d5e5d5",
150 }
151 theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
152 Dark: "#37222c",
153 Light: "#f7d8db",
154 }
155 theme.DiffContextBgColor = lipgloss.AdaptiveColor{
156 Dark: darkBackground,
157 Light: lightBackground,
158 }
159 theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
160 Dark: "#545c7e", // dark3 from palette
161 Light: "#848cb5",
162 }
163 theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
164 Dark: "#1b2b34",
165 Light: "#c5d5c5",
166 }
167 theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
168 Dark: "#2d1f26",
169 Light: "#e7c8cb",
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 Tokyo Night theme with the theme manager
273 RegisterTheme("tokyonight", NewTokyoNightTheme())
274}