gruvbox.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. package theme
  2. import (
  3. "github.com/charmbracelet/lipgloss"
  4. )
  5. // Gruvbox color palette constants
  6. const (
  7. // Dark theme colors
  8. gruvboxDarkBg0 = "#282828"
  9. gruvboxDarkBg0Soft = "#32302f"
  10. gruvboxDarkBg1 = "#3c3836"
  11. gruvboxDarkBg2 = "#504945"
  12. gruvboxDarkBg3 = "#665c54"
  13. gruvboxDarkBg4 = "#7c6f64"
  14. gruvboxDarkFg0 = "#fbf1c7"
  15. gruvboxDarkFg1 = "#ebdbb2"
  16. gruvboxDarkFg2 = "#d5c4a1"
  17. gruvboxDarkFg3 = "#bdae93"
  18. gruvboxDarkFg4 = "#a89984"
  19. gruvboxDarkGray = "#928374"
  20. gruvboxDarkRed = "#cc241d"
  21. gruvboxDarkRedBright = "#fb4934"
  22. gruvboxDarkGreen = "#98971a"
  23. gruvboxDarkGreenBright = "#b8bb26"
  24. gruvboxDarkYellow = "#d79921"
  25. gruvboxDarkYellowBright = "#fabd2f"
  26. gruvboxDarkBlue = "#458588"
  27. gruvboxDarkBlueBright = "#83a598"
  28. gruvboxDarkPurple = "#b16286"
  29. gruvboxDarkPurpleBright = "#d3869b"
  30. gruvboxDarkAqua = "#689d6a"
  31. gruvboxDarkAquaBright = "#8ec07c"
  32. gruvboxDarkOrange = "#d65d0e"
  33. gruvboxDarkOrangeBright = "#fe8019"
  34. // Light theme colors
  35. gruvboxLightBg0 = "#fbf1c7"
  36. gruvboxLightBg0Soft = "#f2e5bc"
  37. gruvboxLightBg1 = "#ebdbb2"
  38. gruvboxLightBg2 = "#d5c4a1"
  39. gruvboxLightBg3 = "#bdae93"
  40. gruvboxLightBg4 = "#a89984"
  41. gruvboxLightFg0 = "#282828"
  42. gruvboxLightFg1 = "#3c3836"
  43. gruvboxLightFg2 = "#504945"
  44. gruvboxLightFg3 = "#665c54"
  45. gruvboxLightFg4 = "#7c6f64"
  46. gruvboxLightGray = "#928374"
  47. gruvboxLightRed = "#9d0006"
  48. gruvboxLightRedBright = "#cc241d"
  49. gruvboxLightGreen = "#79740e"
  50. gruvboxLightGreenBright = "#98971a"
  51. gruvboxLightYellow = "#b57614"
  52. gruvboxLightYellowBright = "#d79921"
  53. gruvboxLightBlue = "#076678"
  54. gruvboxLightBlueBright = "#458588"
  55. gruvboxLightPurple = "#8f3f71"
  56. gruvboxLightPurpleBright = "#b16286"
  57. gruvboxLightAqua = "#427b58"
  58. gruvboxLightAquaBright = "#689d6a"
  59. gruvboxLightOrange = "#af3a03"
  60. gruvboxLightOrangeBright = "#d65d0e"
  61. )
  62. // GruvboxTheme implements the Theme interface with Gruvbox colors.
  63. // It provides both dark and light variants.
  64. type GruvboxTheme struct {
  65. BaseTheme
  66. }
  67. // NewGruvboxTheme creates a new instance of the Gruvbox theme.
  68. func NewGruvboxTheme() *GruvboxTheme {
  69. theme := &GruvboxTheme{}
  70. // Base colors
  71. theme.PrimaryColor = lipgloss.AdaptiveColor{
  72. Dark: gruvboxDarkBlueBright,
  73. Light: gruvboxLightBlueBright,
  74. }
  75. theme.SecondaryColor = lipgloss.AdaptiveColor{
  76. Dark: gruvboxDarkPurpleBright,
  77. Light: gruvboxLightPurpleBright,
  78. }
  79. theme.AccentColor = lipgloss.AdaptiveColor{
  80. Dark: gruvboxDarkOrangeBright,
  81. Light: gruvboxLightOrangeBright,
  82. }
  83. // Status colors
  84. theme.ErrorColor = lipgloss.AdaptiveColor{
  85. Dark: gruvboxDarkRedBright,
  86. Light: gruvboxLightRedBright,
  87. }
  88. theme.WarningColor = lipgloss.AdaptiveColor{
  89. Dark: gruvboxDarkYellowBright,
  90. Light: gruvboxLightYellowBright,
  91. }
  92. theme.SuccessColor = lipgloss.AdaptiveColor{
  93. Dark: gruvboxDarkGreenBright,
  94. Light: gruvboxLightGreenBright,
  95. }
  96. theme.InfoColor = lipgloss.AdaptiveColor{
  97. Dark: gruvboxDarkBlueBright,
  98. Light: gruvboxLightBlueBright,
  99. }
  100. // Text colors
  101. theme.TextColor = lipgloss.AdaptiveColor{
  102. Dark: gruvboxDarkFg1,
  103. Light: gruvboxLightFg1,
  104. }
  105. theme.TextMutedColor = lipgloss.AdaptiveColor{
  106. Dark: gruvboxDarkFg4,
  107. Light: gruvboxLightFg4,
  108. }
  109. theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
  110. Dark: gruvboxDarkYellowBright,
  111. Light: gruvboxLightYellowBright,
  112. }
  113. // Background colors
  114. theme.BackgroundColor = lipgloss.AdaptiveColor{
  115. Dark: gruvboxDarkBg0,
  116. Light: gruvboxLightBg0,
  117. }
  118. theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
  119. Dark: gruvboxDarkBg1,
  120. Light: gruvboxLightBg1,
  121. }
  122. theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
  123. Dark: gruvboxDarkBg0Soft,
  124. Light: gruvboxLightBg0Soft,
  125. }
  126. // Border colors
  127. theme.BorderNormalColor = lipgloss.AdaptiveColor{
  128. Dark: gruvboxDarkBg2,
  129. Light: gruvboxLightBg2,
  130. }
  131. theme.BorderFocusedColor = lipgloss.AdaptiveColor{
  132. Dark: gruvboxDarkBlueBright,
  133. Light: gruvboxLightBlueBright,
  134. }
  135. theme.BorderDimColor = lipgloss.AdaptiveColor{
  136. Dark: gruvboxDarkBg1,
  137. Light: gruvboxLightBg1,
  138. }
  139. // Diff view colors
  140. theme.DiffAddedColor = lipgloss.AdaptiveColor{
  141. Dark: gruvboxDarkGreenBright,
  142. Light: gruvboxLightGreenBright,
  143. }
  144. theme.DiffRemovedColor = lipgloss.AdaptiveColor{
  145. Dark: gruvboxDarkRedBright,
  146. Light: gruvboxLightRedBright,
  147. }
  148. theme.DiffContextColor = lipgloss.AdaptiveColor{
  149. Dark: gruvboxDarkFg4,
  150. Light: gruvboxLightFg4,
  151. }
  152. theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
  153. Dark: gruvboxDarkFg3,
  154. Light: gruvboxLightFg3,
  155. }
  156. theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
  157. Dark: gruvboxDarkGreenBright,
  158. Light: gruvboxLightGreenBright,
  159. }
  160. theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
  161. Dark: gruvboxDarkRedBright,
  162. Light: gruvboxLightRedBright,
  163. }
  164. theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
  165. Dark: "#3C4C3C", // Darker green background
  166. Light: "#E8F5E9", // Light green background
  167. }
  168. theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
  169. Dark: "#4C3C3C", // Darker red background
  170. Light: "#FFEBEE", // Light red background
  171. }
  172. theme.DiffContextBgColor = lipgloss.AdaptiveColor{
  173. Dark: gruvboxDarkBg0,
  174. Light: gruvboxLightBg0,
  175. }
  176. theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
  177. Dark: gruvboxDarkFg4,
  178. Light: gruvboxLightFg4,
  179. }
  180. theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
  181. Dark: "#32432F", // Slightly darker green
  182. Light: "#C8E6C9", // Light green
  183. }
  184. theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
  185. Dark: "#43322F", // Slightly darker red
  186. Light: "#FFCDD2", // Light red
  187. }
  188. // Markdown colors
  189. theme.MarkdownTextColor = lipgloss.AdaptiveColor{
  190. Dark: gruvboxDarkFg1,
  191. Light: gruvboxLightFg1,
  192. }
  193. theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
  194. Dark: gruvboxDarkYellowBright,
  195. Light: gruvboxLightYellowBright,
  196. }
  197. theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
  198. Dark: gruvboxDarkBlueBright,
  199. Light: gruvboxLightBlueBright,
  200. }
  201. theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
  202. Dark: gruvboxDarkAquaBright,
  203. Light: gruvboxLightAquaBright,
  204. }
  205. theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
  206. Dark: gruvboxDarkGreenBright,
  207. Light: gruvboxLightGreenBright,
  208. }
  209. theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
  210. Dark: gruvboxDarkAquaBright,
  211. Light: gruvboxLightAquaBright,
  212. }
  213. theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
  214. Dark: gruvboxDarkYellowBright,
  215. Light: gruvboxLightYellowBright,
  216. }
  217. theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
  218. Dark: gruvboxDarkOrangeBright,
  219. Light: gruvboxLightOrangeBright,
  220. }
  221. theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
  222. Dark: gruvboxDarkBg3,
  223. Light: gruvboxLightBg3,
  224. }
  225. theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
  226. Dark: gruvboxDarkBlueBright,
  227. Light: gruvboxLightBlueBright,
  228. }
  229. theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
  230. Dark: gruvboxDarkBlueBright,
  231. Light: gruvboxLightBlueBright,
  232. }
  233. theme.MarkdownImageColor = lipgloss.AdaptiveColor{
  234. Dark: gruvboxDarkPurpleBright,
  235. Light: gruvboxLightPurpleBright,
  236. }
  237. theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
  238. Dark: gruvboxDarkAquaBright,
  239. Light: gruvboxLightAquaBright,
  240. }
  241. theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
  242. Dark: gruvboxDarkFg1,
  243. Light: gruvboxLightFg1,
  244. }
  245. // Syntax highlighting colors
  246. theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
  247. Dark: gruvboxDarkGray,
  248. Light: gruvboxLightGray,
  249. }
  250. theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
  251. Dark: gruvboxDarkRedBright,
  252. Light: gruvboxLightRedBright,
  253. }
  254. theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
  255. Dark: gruvboxDarkGreenBright,
  256. Light: gruvboxLightGreenBright,
  257. }
  258. theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
  259. Dark: gruvboxDarkBlueBright,
  260. Light: gruvboxLightBlueBright,
  261. }
  262. theme.SyntaxStringColor = lipgloss.AdaptiveColor{
  263. Dark: gruvboxDarkYellowBright,
  264. Light: gruvboxLightYellowBright,
  265. }
  266. theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
  267. Dark: gruvboxDarkPurpleBright,
  268. Light: gruvboxLightPurpleBright,
  269. }
  270. theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
  271. Dark: gruvboxDarkYellow,
  272. Light: gruvboxLightYellow,
  273. }
  274. theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
  275. Dark: gruvboxDarkAquaBright,
  276. Light: gruvboxLightAquaBright,
  277. }
  278. theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
  279. Dark: gruvboxDarkFg1,
  280. Light: gruvboxLightFg1,
  281. }
  282. return theme
  283. }
  284. func init() {
  285. // Register the Gruvbox theme with the theme manager
  286. RegisterTheme("gruvbox", NewGruvboxTheme())
  287. }