tokyonight.go

  1package theme
  2
  3import (
  4	"github.com/charmbracelet/lipgloss/v2"
  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	theme := &TokyoNightTheme{}
 32
 33	// Base colors
 34	theme.PrimaryColor = lipgloss.Color(darkBlue)
 35	theme.SecondaryColor = lipgloss.Color(darkPurple)
 36	theme.AccentColor = lipgloss.Color(darkOrange)
 37
 38	// Status colors
 39	theme.ErrorColor = lipgloss.Color(darkRed)
 40	theme.WarningColor = lipgloss.Color(darkOrange)
 41	theme.SuccessColor = lipgloss.Color(darkGreen)
 42	theme.InfoColor = lipgloss.Color(darkBlue)
 43
 44	// Text colors
 45	theme.TextColor = lipgloss.Color(darkForeground)
 46	theme.TextMutedColor = lipgloss.Color(darkComment)
 47	theme.TextEmphasizedColor = lipgloss.Color(darkYellow)
 48
 49	// Background colors
 50	theme.BackgroundColor = lipgloss.Color(darkBackground)
 51	theme.BackgroundSecondaryColor = lipgloss.Color(darkCurrentLine)
 52	theme.BackgroundDarkerColor = lipgloss.Color("#191B29") // Darker background from palette
 53
 54	// Border colors
 55	theme.BorderNormalColor = lipgloss.Color(darkBorder)
 56	theme.BorderFocusedColor = lipgloss.Color(darkBlue)
 57	theme.BorderDimColor = lipgloss.Color(darkSelection)
 58
 59	// Diff view colors
 60	theme.DiffAddedColor = lipgloss.Color("#4fd6be")            // teal from palette
 61	theme.DiffRemovedColor = lipgloss.Color("#c53b53")          // red1 from palette
 62	theme.DiffContextColor = lipgloss.Color("#828bb8")          // fg_dark from palette
 63	theme.DiffHunkHeaderColor = lipgloss.Color("#828bb8")       // fg_dark from palette
 64	theme.DiffHighlightAddedColor = lipgloss.Color("#b8db87")   // git.add from palette
 65	theme.DiffHighlightRemovedColor = lipgloss.Color("#e26a75") // git.delete from palette
 66	theme.DiffAddedBgColor = lipgloss.Color("#20303b")
 67	theme.DiffRemovedBgColor = lipgloss.Color("#37222c")
 68	theme.DiffContextBgColor = lipgloss.Color(darkBackground)
 69	theme.DiffLineNumberColor = lipgloss.Color("#545c7e") // dark3 from palette
 70	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#1b2b34")
 71	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#2d1f26")
 72
 73	// Markdown colors
 74	theme.MarkdownTextColor = lipgloss.Color(darkForeground)
 75	theme.MarkdownHeadingColor = lipgloss.Color(darkPurple)
 76	theme.MarkdownLinkColor = lipgloss.Color(darkBlue)
 77	theme.MarkdownLinkTextColor = lipgloss.Color(darkCyan)
 78	theme.MarkdownCodeColor = lipgloss.Color(darkGreen)
 79	theme.MarkdownBlockQuoteColor = lipgloss.Color(darkYellow)
 80	theme.MarkdownEmphColor = lipgloss.Color(darkYellow)
 81	theme.MarkdownStrongColor = lipgloss.Color(darkOrange)
 82	theme.MarkdownHorizontalRuleColor = lipgloss.Color(darkComment)
 83	theme.MarkdownListItemColor = lipgloss.Color(darkBlue)
 84	theme.MarkdownListEnumerationColor = lipgloss.Color(darkCyan)
 85	theme.MarkdownImageColor = lipgloss.Color(darkBlue)
 86	theme.MarkdownImageTextColor = lipgloss.Color(darkCyan)
 87	theme.MarkdownCodeBlockColor = lipgloss.Color(darkForeground)
 88
 89	// Syntax highlighting colors
 90	theme.SyntaxCommentColor = lipgloss.Color(darkComment)
 91	theme.SyntaxKeywordColor = lipgloss.Color(darkPurple)
 92	theme.SyntaxFunctionColor = lipgloss.Color(darkBlue)
 93	theme.SyntaxVariableColor = lipgloss.Color(darkRed)
 94	theme.SyntaxStringColor = lipgloss.Color(darkGreen)
 95	theme.SyntaxNumberColor = lipgloss.Color(darkOrange)
 96	theme.SyntaxTypeColor = lipgloss.Color(darkYellow)
 97	theme.SyntaxOperatorColor = lipgloss.Color(darkCyan)
 98	theme.SyntaxPunctuationColor = lipgloss.Color(darkForeground)
 99
100	return theme
101}
102
103// NewTokyoNightDayTheme creates a new instance of the Tokyo Night Day theme.
104func NewTokyoNightDayTheme() *TokyoNightTheme {
105	// Light mode colors (Tokyo Night Day)
106	lightBackground := "#e1e2e7"
107	lightCurrentLine := "#d5d6db"
108	lightSelection := "#c8c9ce"
109	lightForeground := "#3760bf"
110	lightComment := "#848cb5"
111	lightRed := "#f52a65"
112	lightOrange := "#b15c00"
113	lightYellow := "#8c6c3e"
114	lightGreen := "#587539"
115	lightCyan := "#007197"
116	lightBlue := "#2e7de9"
117	lightPurple := "#9854f1"
118	lightBorder := "#a8aecb"
119
120	theme := &TokyoNightTheme{}
121
122	// Base colors
123	theme.PrimaryColor = lipgloss.Color(lightBlue)
124	theme.SecondaryColor = lipgloss.Color(lightPurple)
125	theme.AccentColor = lipgloss.Color(lightOrange)
126
127	// Status colors
128	theme.ErrorColor = lipgloss.Color(lightRed)
129	theme.WarningColor = lipgloss.Color(lightOrange)
130	theme.SuccessColor = lipgloss.Color(lightGreen)
131	theme.InfoColor = lipgloss.Color(lightBlue)
132
133	// Text colors
134	theme.TextColor = lipgloss.Color(lightForeground)
135	theme.TextMutedColor = lipgloss.Color(lightComment)
136	theme.TextEmphasizedColor = lipgloss.Color(lightYellow)
137
138	// Background colors
139	theme.BackgroundColor = lipgloss.Color(lightBackground)
140	theme.BackgroundSecondaryColor = lipgloss.Color(lightCurrentLine)
141	theme.BackgroundDarkerColor = lipgloss.Color("#f0f0f5") // Slightly lighter than background
142
143	// Border colors
144	theme.BorderNormalColor = lipgloss.Color(lightBorder)
145	theme.BorderFocusedColor = lipgloss.Color(lightBlue)
146	theme.BorderDimColor = lipgloss.Color(lightSelection)
147
148	// Diff view colors
149	theme.DiffAddedColor = lipgloss.Color("#1e725c")
150	theme.DiffRemovedColor = lipgloss.Color("#c53b53")
151	theme.DiffContextColor = lipgloss.Color("#7086b5")
152	theme.DiffHunkHeaderColor = lipgloss.Color("#7086b5")
153	theme.DiffHighlightAddedColor = lipgloss.Color("#4db380")
154	theme.DiffHighlightRemovedColor = lipgloss.Color("#f52a65")
155	theme.DiffAddedBgColor = lipgloss.Color("#d5e5d5")
156	theme.DiffRemovedBgColor = lipgloss.Color("#f7d8db")
157	theme.DiffContextBgColor = lipgloss.Color(lightBackground)
158	theme.DiffLineNumberColor = lipgloss.Color("#848cb5")
159	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#c5d5c5")
160	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#e7c8cb")
161
162	// Markdown colors
163	theme.MarkdownTextColor = lipgloss.Color(lightForeground)
164	theme.MarkdownHeadingColor = lipgloss.Color(lightPurple)
165	theme.MarkdownLinkColor = lipgloss.Color(lightBlue)
166	theme.MarkdownLinkTextColor = lipgloss.Color(lightCyan)
167	theme.MarkdownCodeColor = lipgloss.Color(lightGreen)
168	theme.MarkdownBlockQuoteColor = lipgloss.Color(lightYellow)
169	theme.MarkdownEmphColor = lipgloss.Color(lightYellow)
170	theme.MarkdownStrongColor = lipgloss.Color(lightOrange)
171	theme.MarkdownHorizontalRuleColor = lipgloss.Color(lightComment)
172	theme.MarkdownListItemColor = lipgloss.Color(lightBlue)
173	theme.MarkdownListEnumerationColor = lipgloss.Color(lightCyan)
174	theme.MarkdownImageColor = lipgloss.Color(lightBlue)
175	theme.MarkdownImageTextColor = lipgloss.Color(lightCyan)
176	theme.MarkdownCodeBlockColor = lipgloss.Color(lightForeground)
177
178	// Syntax highlighting colors
179	theme.SyntaxCommentColor = lipgloss.Color(lightComment)
180	theme.SyntaxKeywordColor = lipgloss.Color(lightPurple)
181	theme.SyntaxFunctionColor = lipgloss.Color(lightBlue)
182	theme.SyntaxVariableColor = lipgloss.Color(lightRed)
183	theme.SyntaxStringColor = lipgloss.Color(lightGreen)
184	theme.SyntaxNumberColor = lipgloss.Color(lightOrange)
185	theme.SyntaxTypeColor = lipgloss.Color(lightYellow)
186	theme.SyntaxOperatorColor = lipgloss.Color(lightCyan)
187	theme.SyntaxPunctuationColor = lipgloss.Color(lightForeground)
188
189	return theme
190}
191
192func init() {
193	// Register the Tokyo Night themes with the theme manager
194	RegisterTheme("tokyonight", NewTokyoNightTheme())
195	RegisterTheme("tokyonight-day", NewTokyoNightDayTheme())
196}