tokyonight.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. package theme
  2. import (
  3. "github.com/charmbracelet/lipgloss/v2"
  4. "github.com/charmbracelet/lipgloss/v2/compat"
  5. )
  6. // TokyoNightTheme implements the Theme interface with Tokyo Night colors.
  7. // It provides both dark and light variants.
  8. type TokyoNightTheme struct {
  9. BaseTheme
  10. }
  11. // NewTokyoNightTheme creates a new instance of the Tokyo Night theme.
  12. func NewTokyoNightTheme() *TokyoNightTheme {
  13. // Tokyo Night color palette with Radix-inspired scale progression
  14. // Dark mode colors - Tokyo Night Moon variant
  15. darkStep1 := "#1a1b26" // App background (bg)
  16. darkStep2 := "#1e2030" // Subtle background (bg_dark)
  17. darkStep3 := "#222436" // UI element background (bg_highlight)
  18. darkStep4 := "#292e42" // Hovered UI element background
  19. darkStep5 := "#3b4261" // Active/Selected UI element background (bg_visual)
  20. darkStep6 := "#545c7e" // Subtle borders and separators (dark3)
  21. darkStep7 := "#737aa2" // UI element border and focus rings (dark5)
  22. darkStep8 := "#9099b2" // Hovered UI element border
  23. darkStep9 := "#82aaff" // Solid backgrounds (blue)
  24. darkStep10 := "#89b4fa" // Hovered solid backgrounds
  25. darkStep11 := "#828bb8" // Low-contrast text (using fg_dark for better contrast)
  26. darkStep12 := "#c8d3f5" // High-contrast text (fg)
  27. // Dark mode accent colors
  28. darkRed := "#ff757f"
  29. darkOrange := "#ff966c"
  30. darkYellow := "#ffc777"
  31. darkGreen := "#c3e88d"
  32. darkCyan := "#86e1fc"
  33. darkBlue := darkStep9 // Using step 9 for primary
  34. darkPurple := "#c099ff"
  35. // Light mode colors - Tokyo Night Day variant
  36. lightStep1 := "#e1e2e7" // App background
  37. lightStep2 := "#d5d6db" // Subtle background
  38. lightStep3 := "#c8c9ce" // UI element background
  39. lightStep4 := "#b9bac1" // Hovered UI element background
  40. lightStep5 := "#a8aecb" // Active/Selected UI element background
  41. lightStep6 := "#9699a8" // Subtle borders and separators
  42. lightStep7 := "#737a8c" // UI element border and focus rings
  43. lightStep8 := "#5a607d" // Hovered UI element border
  44. lightStep9 := "#2e7de9" // Solid backgrounds (blue)
  45. lightStep10 := "#1a6ce7" // Hovered solid backgrounds
  46. lightStep11 := "#8990a3" // Low-contrast text (more muted)
  47. lightStep12 := "#3760bf" // High-contrast text
  48. // Light mode accent colors
  49. lightRed := "#f52a65"
  50. lightOrange := "#b15c00"
  51. lightYellow := "#8c6c3e"
  52. lightGreen := "#587539"
  53. lightCyan := "#007197"
  54. lightBlue := lightStep9 // Using step 9 for primary
  55. lightPurple := "#9854f1"
  56. // Unused variables to avoid compiler errors (these could be used for hover states)
  57. _ = darkStep4
  58. _ = darkStep5
  59. _ = darkStep10
  60. _ = lightStep4
  61. _ = lightStep5
  62. _ = lightStep10
  63. theme := &TokyoNightTheme{}
  64. // Base colors
  65. theme.PrimaryColor = compat.AdaptiveColor{
  66. Dark: lipgloss.Color(darkBlue),
  67. Light: lipgloss.Color(lightBlue),
  68. }
  69. theme.SecondaryColor = compat.AdaptiveColor{
  70. Dark: lipgloss.Color(darkPurple),
  71. Light: lipgloss.Color(lightPurple),
  72. }
  73. theme.AccentColor = compat.AdaptiveColor{
  74. Dark: lipgloss.Color(darkOrange),
  75. Light: lipgloss.Color(lightOrange),
  76. }
  77. // Status colors
  78. theme.ErrorColor = compat.AdaptiveColor{
  79. Dark: lipgloss.Color(darkRed),
  80. Light: lipgloss.Color(lightRed),
  81. }
  82. theme.WarningColor = compat.AdaptiveColor{
  83. Dark: lipgloss.Color(darkOrange),
  84. Light: lipgloss.Color(lightOrange),
  85. }
  86. theme.SuccessColor = compat.AdaptiveColor{
  87. Dark: lipgloss.Color(darkGreen),
  88. Light: lipgloss.Color(lightGreen),
  89. }
  90. theme.InfoColor = compat.AdaptiveColor{
  91. Dark: lipgloss.Color(darkBlue),
  92. Light: lipgloss.Color(lightBlue),
  93. }
  94. // Text colors
  95. theme.TextColor = compat.AdaptiveColor{
  96. Dark: lipgloss.Color(darkStep12),
  97. Light: lipgloss.Color(lightStep12),
  98. }
  99. theme.TextMutedColor = compat.AdaptiveColor{
  100. Dark: lipgloss.Color(darkStep11),
  101. Light: lipgloss.Color(lightStep11),
  102. }
  103. // Background colors
  104. theme.BackgroundColor = compat.AdaptiveColor{
  105. Dark: lipgloss.Color(darkStep1),
  106. Light: lipgloss.Color(lightStep1),
  107. }
  108. theme.BackgroundSubtleColor = compat.AdaptiveColor{
  109. Dark: lipgloss.Color(darkStep2),
  110. Light: lipgloss.Color(lightStep2),
  111. }
  112. theme.BackgroundElementColor = compat.AdaptiveColor{
  113. Dark: lipgloss.Color(darkStep3),
  114. Light: lipgloss.Color(lightStep3),
  115. }
  116. // Border colors
  117. theme.BorderColor = compat.AdaptiveColor{
  118. Dark: lipgloss.Color(darkStep7),
  119. Light: lipgloss.Color(lightStep7),
  120. }
  121. theme.BorderActiveColor = compat.AdaptiveColor{
  122. Dark: lipgloss.Color(darkStep8),
  123. Light: lipgloss.Color(lightStep8),
  124. }
  125. theme.BorderSubtleColor = compat.AdaptiveColor{
  126. Dark: lipgloss.Color(darkStep6),
  127. Light: lipgloss.Color(lightStep6),
  128. }
  129. // Diff view colors
  130. theme.DiffAddedColor = compat.AdaptiveColor{
  131. Dark: lipgloss.Color("#4fd6be"), // teal from palette
  132. Light: lipgloss.Color("#1e725c"),
  133. }
  134. theme.DiffRemovedColor = compat.AdaptiveColor{
  135. Dark: lipgloss.Color("#c53b53"), // red1 from palette
  136. Light: lipgloss.Color("#c53b53"),
  137. }
  138. theme.DiffContextColor = compat.AdaptiveColor{
  139. Dark: lipgloss.Color("#828bb8"), // fg_dark from palette
  140. Light: lipgloss.Color("#7086b5"),
  141. }
  142. theme.DiffHunkHeaderColor = compat.AdaptiveColor{
  143. Dark: lipgloss.Color("#828bb8"), // fg_dark from palette
  144. Light: lipgloss.Color("#7086b5"),
  145. }
  146. theme.DiffHighlightAddedColor = compat.AdaptiveColor{
  147. Dark: lipgloss.Color("#b8db87"), // git.add from palette
  148. Light: lipgloss.Color("#4db380"),
  149. }
  150. theme.DiffHighlightRemovedColor = compat.AdaptiveColor{
  151. Dark: lipgloss.Color("#e26a75"), // git.delete from palette
  152. Light: lipgloss.Color("#f52a65"),
  153. }
  154. theme.DiffAddedBgColor = compat.AdaptiveColor{
  155. Dark: lipgloss.Color("#20303b"),
  156. Light: lipgloss.Color("#d5e5d5"),
  157. }
  158. theme.DiffRemovedBgColor = compat.AdaptiveColor{
  159. Dark: lipgloss.Color("#37222c"),
  160. Light: lipgloss.Color("#f7d8db"),
  161. }
  162. theme.DiffContextBgColor = compat.AdaptiveColor{
  163. Dark: lipgloss.Color(darkStep2),
  164. Light: lipgloss.Color(lightStep2),
  165. }
  166. theme.DiffLineNumberColor = compat.AdaptiveColor{
  167. Dark: lipgloss.Color(darkStep3), // dark3 from palette
  168. Light: lipgloss.Color(lightStep3),
  169. }
  170. theme.DiffAddedLineNumberBgColor = compat.AdaptiveColor{
  171. Dark: lipgloss.Color("#1b2b34"),
  172. Light: lipgloss.Color("#c5d5c5"),
  173. }
  174. theme.DiffRemovedLineNumberBgColor = compat.AdaptiveColor{
  175. Dark: lipgloss.Color("#2d1f26"),
  176. Light: lipgloss.Color("#e7c8cb"),
  177. }
  178. // Markdown colors
  179. theme.MarkdownTextColor = compat.AdaptiveColor{
  180. Dark: lipgloss.Color(darkStep12),
  181. Light: lipgloss.Color(lightStep12),
  182. }
  183. theme.MarkdownHeadingColor = compat.AdaptiveColor{
  184. Dark: lipgloss.Color(darkPurple),
  185. Light: lipgloss.Color(lightPurple),
  186. }
  187. theme.MarkdownLinkColor = compat.AdaptiveColor{
  188. Dark: lipgloss.Color(darkBlue),
  189. Light: lipgloss.Color(lightBlue),
  190. }
  191. theme.MarkdownLinkTextColor = compat.AdaptiveColor{
  192. Dark: lipgloss.Color(darkCyan),
  193. Light: lipgloss.Color(lightCyan),
  194. }
  195. theme.MarkdownCodeColor = compat.AdaptiveColor{
  196. Dark: lipgloss.Color(darkGreen),
  197. Light: lipgloss.Color(lightGreen),
  198. }
  199. theme.MarkdownBlockQuoteColor = compat.AdaptiveColor{
  200. Dark: lipgloss.Color(darkYellow),
  201. Light: lipgloss.Color(lightYellow),
  202. }
  203. theme.MarkdownEmphColor = compat.AdaptiveColor{
  204. Dark: lipgloss.Color(darkYellow),
  205. Light: lipgloss.Color(lightYellow),
  206. }
  207. theme.MarkdownStrongColor = compat.AdaptiveColor{
  208. Dark: lipgloss.Color(darkOrange),
  209. Light: lipgloss.Color(lightOrange),
  210. }
  211. theme.MarkdownHorizontalRuleColor = compat.AdaptiveColor{
  212. Dark: lipgloss.Color(darkStep11),
  213. Light: lipgloss.Color(lightStep11),
  214. }
  215. theme.MarkdownListItemColor = compat.AdaptiveColor{
  216. Dark: lipgloss.Color(darkBlue),
  217. Light: lipgloss.Color(lightBlue),
  218. }
  219. theme.MarkdownListEnumerationColor = compat.AdaptiveColor{
  220. Dark: lipgloss.Color(darkCyan),
  221. Light: lipgloss.Color(lightCyan),
  222. }
  223. theme.MarkdownImageColor = compat.AdaptiveColor{
  224. Dark: lipgloss.Color(darkBlue),
  225. Light: lipgloss.Color(lightBlue),
  226. }
  227. theme.MarkdownImageTextColor = compat.AdaptiveColor{
  228. Dark: lipgloss.Color(darkCyan),
  229. Light: lipgloss.Color(lightCyan),
  230. }
  231. theme.MarkdownCodeBlockColor = compat.AdaptiveColor{
  232. Dark: lipgloss.Color(darkStep12),
  233. Light: lipgloss.Color(lightStep12),
  234. }
  235. // Syntax highlighting colors
  236. theme.SyntaxCommentColor = compat.AdaptiveColor{
  237. Dark: lipgloss.Color(darkStep11),
  238. Light: lipgloss.Color(lightStep11),
  239. }
  240. theme.SyntaxKeywordColor = compat.AdaptiveColor{
  241. Dark: lipgloss.Color(darkPurple),
  242. Light: lipgloss.Color(lightPurple),
  243. }
  244. theme.SyntaxFunctionColor = compat.AdaptiveColor{
  245. Dark: lipgloss.Color(darkBlue),
  246. Light: lipgloss.Color(lightBlue),
  247. }
  248. theme.SyntaxVariableColor = compat.AdaptiveColor{
  249. Dark: lipgloss.Color(darkRed),
  250. Light: lipgloss.Color(lightRed),
  251. }
  252. theme.SyntaxStringColor = compat.AdaptiveColor{
  253. Dark: lipgloss.Color(darkGreen),
  254. Light: lipgloss.Color(lightGreen),
  255. }
  256. theme.SyntaxNumberColor = compat.AdaptiveColor{
  257. Dark: lipgloss.Color(darkOrange),
  258. Light: lipgloss.Color(lightOrange),
  259. }
  260. theme.SyntaxTypeColor = compat.AdaptiveColor{
  261. Dark: lipgloss.Color(darkYellow),
  262. Light: lipgloss.Color(lightYellow),
  263. }
  264. theme.SyntaxOperatorColor = compat.AdaptiveColor{
  265. Dark: lipgloss.Color(darkCyan),
  266. Light: lipgloss.Color(lightCyan),
  267. }
  268. theme.SyntaxPunctuationColor = compat.AdaptiveColor{
  269. Dark: lipgloss.Color(darkStep12),
  270. Light: lipgloss.Color(lightStep12),
  271. }
  272. return theme
  273. }
  274. func init() {
  275. // Register the Tokyo Night theme with the theme manager
  276. RegisterTheme("tokyonight", NewTokyoNightTheme())
  277. }