everforest.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package theme
  2. import (
  3. "github.com/charmbracelet/lipgloss/v2"
  4. "github.com/charmbracelet/lipgloss/v2/compat"
  5. )
  6. // EverforestTheme implements the Theme interface with Everforest colors.
  7. // It provides both dark and light variants with Medium (default) contrast.
  8. type EverforestTheme struct {
  9. BaseTheme
  10. }
  11. // NewEverforestTheme creates a new instance of the Everforest Medium theme.
  12. func NewEverforestTheme() *EverforestTheme {
  13. // Everforest color palette - Medium variant
  14. // Official colors from https://github.com/sainnhe/everforest/wiki
  15. // Dark mode colors - using Everforest:Dark Medium contrast palette
  16. darkStep1 := "#2d353b" // App background
  17. darkStep2 := "#333c43" // Subtle background
  18. darkStep3 := "#343f44" // UI element background
  19. darkStep4 := "#3d484d" // Hovered UI element background
  20. darkStep5 := "#475258" // Active/Selected UI element background
  21. darkStep6 := "#7a8478" // Subtle borders and separators
  22. darkStep7 := "#859289" // UI element border and focus rings
  23. darkStep8 := "#9da9a0" // Hovered UI element border
  24. darkStep9 := "#a7c080" // Solid backgrounds
  25. darkStep10 := "#83c092" // Hovered solid backgrounds
  26. darkStep11 := "#7a8478" // Low-contrast text
  27. darkStep12 := "#d3c6aa" // High-contrast text
  28. // Dark mode accent colors
  29. darkPrimary := darkStep9 // Primary uses step 9 (green)
  30. darkSecondary := "#7fbbb3" // Secondary (blue)
  31. darkAccent := "#d699b6" // Accent (purple)
  32. darkRed := "#e67e80" // Error (red)
  33. darkOrange := "#e69875" // Warning (orange)
  34. darkGreen := "#a7c080" // Success (green)
  35. darkCyan := "#83c092" // Info (aqua)
  36. darkYellow := "#dbbc7f" // Emphasized text
  37. // Light mode colors for the Everforest:Light Medium contrast palette
  38. lightStep1 := "#fdf6e3" // App background
  39. lightStep2 := "#efebd4" // Subtle background
  40. lightStep3 := "#f4f0d9" // UI element background
  41. lightStep4 := "#efebd4" // Hovered UI element background
  42. lightStep5 := "#e6e2cc" // Active/Selected UI element background
  43. lightStep6 := "#a6b0a0" // Subtle borders and separators
  44. lightStep7 := "#939f91" // UI element border and focus rings
  45. lightStep8 := "#829181" // Hovered UI element border
  46. lightStep9 := "#8da101" // Solid backgrounds
  47. lightStep10 := "#35a77c" // Hovered solid backgrounds
  48. lightStep11 := "#a6b0a0" // Low-contrast text
  49. lightStep12 := "#5c6a72" // High-contrast text
  50. // Light mode accent colors
  51. lightPrimary := lightStep9 // Primary uses step 9 (green)
  52. lightSecondary := "#3a94c5" // Secondary blue
  53. lightAccent := "#df69ba" // Accent purple
  54. lightRed := "#f85552" // Error red
  55. lightOrange := "#f57d26" // Warning orange
  56. lightGreen := "#8da101" // Success green
  57. lightCyan := "#35a77c" // Info aqua
  58. lightYellow := "#dfa000" // Emphasized text
  59. // Unused variables. These could be used for hover states
  60. _ = darkStep4
  61. _ = darkStep5
  62. _ = darkStep10
  63. _ = lightStep4
  64. _ = lightStep5
  65. _ = lightStep10
  66. theme := &EverforestTheme{}
  67. // Base colors
  68. theme.PrimaryColor = compat.AdaptiveColor{
  69. Dark: lipgloss.Color(darkPrimary),
  70. Light: lipgloss.Color(lightPrimary),
  71. }
  72. theme.SecondaryColor = compat.AdaptiveColor{
  73. Dark: lipgloss.Color(darkSecondary),
  74. Light: lipgloss.Color(lightSecondary),
  75. }
  76. theme.AccentColor = compat.AdaptiveColor{
  77. Dark: lipgloss.Color(darkAccent),
  78. Light: lipgloss.Color(lightAccent),
  79. }
  80. // Status colors
  81. theme.ErrorColor = compat.AdaptiveColor{
  82. Dark: lipgloss.Color(darkRed),
  83. Light: lipgloss.Color(lightRed),
  84. }
  85. theme.WarningColor = compat.AdaptiveColor{
  86. Dark: lipgloss.Color(darkOrange),
  87. Light: lipgloss.Color(lightOrange),
  88. }
  89. theme.SuccessColor = compat.AdaptiveColor{
  90. Dark: lipgloss.Color(darkGreen),
  91. Light: lipgloss.Color(lightGreen),
  92. }
  93. theme.InfoColor = compat.AdaptiveColor{
  94. Dark: lipgloss.Color(darkCyan),
  95. Light: lipgloss.Color(lightCyan),
  96. }
  97. // Text colors
  98. theme.TextColor = compat.AdaptiveColor{
  99. Dark: lipgloss.Color(darkStep12),
  100. Light: lipgloss.Color(lightStep12),
  101. }
  102. theme.TextMutedColor = compat.AdaptiveColor{
  103. Dark: lipgloss.Color(darkStep11),
  104. Light: lipgloss.Color(lightStep11),
  105. }
  106. // Background colors
  107. theme.BackgroundColor = compat.AdaptiveColor{
  108. Dark: lipgloss.Color(darkStep1),
  109. Light: lipgloss.Color(lightStep1),
  110. }
  111. theme.BackgroundSubtleColor = compat.AdaptiveColor{
  112. Dark: lipgloss.Color(darkStep2),
  113. Light: lipgloss.Color(lightStep2),
  114. }
  115. theme.BackgroundElementColor = compat.AdaptiveColor{
  116. Dark: lipgloss.Color(darkStep3),
  117. Light: lipgloss.Color(lightStep3),
  118. }
  119. // Border colors
  120. theme.BorderColor = compat.AdaptiveColor{
  121. Dark: lipgloss.Color(darkStep7),
  122. Light: lipgloss.Color(lightStep7),
  123. }
  124. theme.BorderActiveColor = compat.AdaptiveColor{
  125. Dark: lipgloss.Color(darkStep8),
  126. Light: lipgloss.Color(lightStep8),
  127. }
  128. theme.BorderSubtleColor = compat.AdaptiveColor{
  129. Dark: lipgloss.Color(darkStep6),
  130. Light: lipgloss.Color(lightStep6),
  131. }
  132. // Diff view colors
  133. theme.DiffAddedColor = compat.AdaptiveColor{
  134. Dark: lipgloss.Color("#A7C080"),
  135. Light: lipgloss.Color("#8DA101"),
  136. }
  137. theme.DiffRemovedColor = compat.AdaptiveColor{
  138. Dark: lipgloss.Color("#E67E80"),
  139. Light: lipgloss.Color("#F85552"),
  140. }
  141. theme.DiffContextColor = compat.AdaptiveColor{
  142. Dark: lipgloss.Color("#7A8478"),
  143. Light: lipgloss.Color("#A6B0A0"),
  144. }
  145. theme.DiffHunkHeaderColor = compat.AdaptiveColor{
  146. Dark: lipgloss.Color("#859289"),
  147. Light: lipgloss.Color("#939F91"),
  148. }
  149. theme.DiffHighlightAddedColor = compat.AdaptiveColor{
  150. Dark: lipgloss.Color("#A7C080"),
  151. Light: lipgloss.Color("#8DA101"),
  152. }
  153. theme.DiffHighlightRemovedColor = compat.AdaptiveColor{
  154. Dark: lipgloss.Color("#E67E80"),
  155. Light: lipgloss.Color("#F85552"),
  156. }
  157. theme.DiffAddedBgColor = compat.AdaptiveColor{
  158. Dark: lipgloss.Color("#425047"),
  159. Light: lipgloss.Color("#F0F1D2"),
  160. }
  161. theme.DiffRemovedBgColor = compat.AdaptiveColor{
  162. Dark: lipgloss.Color("#543A48"),
  163. Light: lipgloss.Color("#FBE3DA"),
  164. }
  165. theme.DiffContextBgColor = compat.AdaptiveColor{
  166. Dark: lipgloss.Color(darkStep2),
  167. Light: lipgloss.Color(lightStep2),
  168. }
  169. theme.DiffLineNumberColor = compat.AdaptiveColor{
  170. Dark: lipgloss.Color(darkStep3),
  171. Light: lipgloss.Color(lightStep3),
  172. }
  173. theme.DiffAddedLineNumberBgColor = compat.AdaptiveColor{
  174. Dark: lipgloss.Color("#3A4A3F"),
  175. Light: lipgloss.Color("#E8F2D1"),
  176. }
  177. theme.DiffRemovedLineNumberBgColor = compat.AdaptiveColor{
  178. Dark: lipgloss.Color("#4A3A40"),
  179. Light: lipgloss.Color("#FBDAD2"),
  180. }
  181. // Markdown colors
  182. theme.MarkdownTextColor = compat.AdaptiveColor{
  183. Dark: lipgloss.Color(darkStep12),
  184. Light: lipgloss.Color(lightStep12),
  185. }
  186. theme.MarkdownHeadingColor = compat.AdaptiveColor{
  187. Dark: lipgloss.Color(darkSecondary),
  188. Light: lipgloss.Color(lightSecondary),
  189. }
  190. theme.MarkdownLinkColor = compat.AdaptiveColor{
  191. Dark: lipgloss.Color(darkPrimary),
  192. Light: lipgloss.Color(lightPrimary),
  193. }
  194. theme.MarkdownLinkTextColor = compat.AdaptiveColor{
  195. Dark: lipgloss.Color(darkCyan),
  196. Light: lipgloss.Color(lightCyan),
  197. }
  198. theme.MarkdownCodeColor = compat.AdaptiveColor{
  199. Dark: lipgloss.Color(darkGreen),
  200. Light: lipgloss.Color(lightGreen),
  201. }
  202. theme.MarkdownBlockQuoteColor = compat.AdaptiveColor{
  203. Dark: lipgloss.Color(darkYellow),
  204. Light: lipgloss.Color(lightYellow),
  205. }
  206. theme.MarkdownEmphColor = compat.AdaptiveColor{
  207. Dark: lipgloss.Color(darkYellow),
  208. Light: lipgloss.Color(lightYellow),
  209. }
  210. theme.MarkdownStrongColor = compat.AdaptiveColor{
  211. Dark: lipgloss.Color(darkAccent),
  212. Light: lipgloss.Color(lightAccent),
  213. }
  214. theme.MarkdownHorizontalRuleColor = compat.AdaptiveColor{
  215. Dark: lipgloss.Color(darkStep11),
  216. Light: lipgloss.Color(lightStep11),
  217. }
  218. theme.MarkdownListItemColor = compat.AdaptiveColor{
  219. Dark: lipgloss.Color(darkPrimary),
  220. Light: lipgloss.Color(lightPrimary),
  221. }
  222. theme.MarkdownListEnumerationColor = compat.AdaptiveColor{
  223. Dark: lipgloss.Color(darkCyan),
  224. Light: lipgloss.Color(lightCyan),
  225. }
  226. theme.MarkdownImageColor = compat.AdaptiveColor{
  227. Dark: lipgloss.Color(darkPrimary),
  228. Light: lipgloss.Color(lightPrimary),
  229. }
  230. theme.MarkdownImageTextColor = compat.AdaptiveColor{
  231. Dark: lipgloss.Color(darkCyan),
  232. Light: lipgloss.Color(lightCyan),
  233. }
  234. theme.MarkdownCodeBlockColor = compat.AdaptiveColor{
  235. Dark: lipgloss.Color(darkStep12),
  236. Light: lipgloss.Color(lightStep12),
  237. }
  238. // Syntax highlighting colors
  239. theme.SyntaxCommentColor = compat.AdaptiveColor{
  240. Dark: lipgloss.Color(darkStep11),
  241. Light: lipgloss.Color(lightStep11),
  242. }
  243. theme.SyntaxKeywordColor = compat.AdaptiveColor{
  244. Dark: lipgloss.Color(darkPrimary),
  245. Light: lipgloss.Color(lightPrimary),
  246. }
  247. theme.SyntaxFunctionColor = compat.AdaptiveColor{
  248. Dark: lipgloss.Color(darkSecondary),
  249. Light: lipgloss.Color(lightSecondary),
  250. }
  251. theme.SyntaxVariableColor = compat.AdaptiveColor{
  252. Dark: lipgloss.Color(darkRed),
  253. Light: lipgloss.Color(lightRed),
  254. }
  255. theme.SyntaxStringColor = compat.AdaptiveColor{
  256. Dark: lipgloss.Color(darkGreen),
  257. Light: lipgloss.Color(lightGreen),
  258. }
  259. theme.SyntaxNumberColor = compat.AdaptiveColor{
  260. Dark: lipgloss.Color(darkAccent),
  261. Light: lipgloss.Color(lightAccent),
  262. }
  263. theme.SyntaxTypeColor = compat.AdaptiveColor{
  264. Dark: lipgloss.Color(darkYellow),
  265. Light: lipgloss.Color(lightYellow),
  266. }
  267. theme.SyntaxOperatorColor = compat.AdaptiveColor{
  268. Dark: lipgloss.Color(darkCyan),
  269. Light: lipgloss.Color(lightCyan),
  270. }
  271. theme.SyntaxPunctuationColor = compat.AdaptiveColor{
  272. Dark: lipgloss.Color(darkStep12),
  273. Light: lipgloss.Color(lightStep12),
  274. }
  275. return theme
  276. }
  277. func init() {
  278. // Register the Everforest theme with the theme manager
  279. RegisterTheme("everforest", NewEverforestTheme())
  280. }