tokyonight.go

  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}