dracula.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. package theme
  2. import (
  3. "github.com/charmbracelet/lipgloss"
  4. )
  5. // DraculaTheme implements the Theme interface with Dracula colors.
  6. // It provides both dark and light variants, though Dracula is primarily a dark theme.
  7. type DraculaTheme struct {
  8. BaseTheme
  9. }
  10. // NewDraculaTheme creates a new instance of the Dracula theme.
  11. func NewDraculaTheme() *DraculaTheme {
  12. // Dracula color palette
  13. // Official colors from https://draculatheme.com/
  14. darkBackground := "#282a36"
  15. darkCurrentLine := "#44475a"
  16. darkSelection := "#44475a"
  17. darkForeground := "#f8f8f2"
  18. darkComment := "#6272a4"
  19. darkCyan := "#8be9fd"
  20. darkGreen := "#50fa7b"
  21. darkOrange := "#ffb86c"
  22. darkPink := "#ff79c6"
  23. darkPurple := "#bd93f9"
  24. darkRed := "#ff5555"
  25. darkYellow := "#f1fa8c"
  26. darkBorder := "#44475a"
  27. // Light mode approximation (Dracula is primarily a dark theme)
  28. lightBackground := "#f8f8f2"
  29. lightCurrentLine := "#e6e6e6"
  30. lightSelection := "#d8d8d8"
  31. lightForeground := "#282a36"
  32. lightComment := "#6272a4"
  33. lightCyan := "#0097a7"
  34. lightGreen := "#388e3c"
  35. lightOrange := "#f57c00"
  36. lightPink := "#d81b60"
  37. lightPurple := "#7e57c2"
  38. lightRed := "#e53935"
  39. lightYellow := "#fbc02d"
  40. lightBorder := "#d8d8d8"
  41. theme := &DraculaTheme{}
  42. // Base colors
  43. theme.PrimaryColor = lipgloss.AdaptiveColor{
  44. Dark: darkPurple,
  45. Light: lightPurple,
  46. }
  47. theme.SecondaryColor = lipgloss.AdaptiveColor{
  48. Dark: darkPink,
  49. Light: lightPink,
  50. }
  51. theme.AccentColor = lipgloss.AdaptiveColor{
  52. Dark: darkCyan,
  53. Light: lightCyan,
  54. }
  55. // Status colors
  56. theme.ErrorColor = lipgloss.AdaptiveColor{
  57. Dark: darkRed,
  58. Light: lightRed,
  59. }
  60. theme.WarningColor = lipgloss.AdaptiveColor{
  61. Dark: darkOrange,
  62. Light: lightOrange,
  63. }
  64. theme.SuccessColor = lipgloss.AdaptiveColor{
  65. Dark: darkGreen,
  66. Light: lightGreen,
  67. }
  68. theme.InfoColor = lipgloss.AdaptiveColor{
  69. Dark: darkCyan,
  70. Light: lightCyan,
  71. }
  72. // Text colors
  73. theme.TextColor = lipgloss.AdaptiveColor{
  74. Dark: darkForeground,
  75. Light: lightForeground,
  76. }
  77. theme.TextMutedColor = lipgloss.AdaptiveColor{
  78. Dark: darkComment,
  79. Light: lightComment,
  80. }
  81. theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
  82. Dark: darkYellow,
  83. Light: lightYellow,
  84. }
  85. // Background colors
  86. theme.BackgroundColor = lipgloss.AdaptiveColor{
  87. Dark: darkBackground,
  88. Light: lightBackground,
  89. }
  90. theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
  91. Dark: darkCurrentLine,
  92. Light: lightCurrentLine,
  93. }
  94. theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
  95. Dark: "#21222c", // Slightly darker than background
  96. Light: "#ffffff", // Slightly lighter than background
  97. }
  98. // Border colors
  99. theme.BorderNormalColor = lipgloss.AdaptiveColor{
  100. Dark: darkBorder,
  101. Light: lightBorder,
  102. }
  103. theme.BorderFocusedColor = lipgloss.AdaptiveColor{
  104. Dark: darkPurple,
  105. Light: lightPurple,
  106. }
  107. theme.BorderDimColor = lipgloss.AdaptiveColor{
  108. Dark: darkSelection,
  109. Light: lightSelection,
  110. }
  111. // Diff view colors
  112. theme.DiffAddedColor = lipgloss.AdaptiveColor{
  113. Dark: darkGreen,
  114. Light: lightGreen,
  115. }
  116. theme.DiffRemovedColor = lipgloss.AdaptiveColor{
  117. Dark: darkRed,
  118. Light: lightRed,
  119. }
  120. theme.DiffContextColor = lipgloss.AdaptiveColor{
  121. Dark: darkComment,
  122. Light: lightComment,
  123. }
  124. theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
  125. Dark: darkPurple,
  126. Light: lightPurple,
  127. }
  128. theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
  129. Dark: "#50fa7b",
  130. Light: "#a5d6a7",
  131. }
  132. theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
  133. Dark: "#ff5555",
  134. Light: "#ef9a9a",
  135. }
  136. theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
  137. Dark: "#2c3b2c",
  138. Light: "#e8f5e9",
  139. }
  140. theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
  141. Dark: "#3b2c2c",
  142. Light: "#ffebee",
  143. }
  144. theme.DiffContextBgColor = lipgloss.AdaptiveColor{
  145. Dark: darkBackground,
  146. Light: lightBackground,
  147. }
  148. theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
  149. Dark: darkComment,
  150. Light: lightComment,
  151. }
  152. theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
  153. Dark: "#253025",
  154. Light: "#c8e6c9",
  155. }
  156. theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
  157. Dark: "#302525",
  158. Light: "#ffcdd2",
  159. }
  160. // Markdown colors
  161. theme.MarkdownTextColor = lipgloss.AdaptiveColor{
  162. Dark: darkForeground,
  163. Light: lightForeground,
  164. }
  165. theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
  166. Dark: darkPink,
  167. Light: lightPink,
  168. }
  169. theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
  170. Dark: darkPurple,
  171. Light: lightPurple,
  172. }
  173. theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
  174. Dark: darkCyan,
  175. Light: lightCyan,
  176. }
  177. theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
  178. Dark: darkGreen,
  179. Light: lightGreen,
  180. }
  181. theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
  182. Dark: darkYellow,
  183. Light: lightYellow,
  184. }
  185. theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
  186. Dark: darkYellow,
  187. Light: lightYellow,
  188. }
  189. theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
  190. Dark: darkOrange,
  191. Light: lightOrange,
  192. }
  193. theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
  194. Dark: darkComment,
  195. Light: lightComment,
  196. }
  197. theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
  198. Dark: darkPurple,
  199. Light: lightPurple,
  200. }
  201. theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
  202. Dark: darkCyan,
  203. Light: lightCyan,
  204. }
  205. theme.MarkdownImageColor = lipgloss.AdaptiveColor{
  206. Dark: darkPurple,
  207. Light: lightPurple,
  208. }
  209. theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
  210. Dark: darkCyan,
  211. Light: lightCyan,
  212. }
  213. theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
  214. Dark: darkForeground,
  215. Light: lightForeground,
  216. }
  217. // Syntax highlighting colors
  218. theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
  219. Dark: darkComment,
  220. Light: lightComment,
  221. }
  222. theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
  223. Dark: darkPink,
  224. Light: lightPink,
  225. }
  226. theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
  227. Dark: darkGreen,
  228. Light: lightGreen,
  229. }
  230. theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
  231. Dark: darkOrange,
  232. Light: lightOrange,
  233. }
  234. theme.SyntaxStringColor = lipgloss.AdaptiveColor{
  235. Dark: darkYellow,
  236. Light: lightYellow,
  237. }
  238. theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
  239. Dark: darkPurple,
  240. Light: lightPurple,
  241. }
  242. theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
  243. Dark: darkCyan,
  244. Light: lightCyan,
  245. }
  246. theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
  247. Dark: darkPink,
  248. Light: lightPink,
  249. }
  250. theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
  251. Dark: darkForeground,
  252. Light: lightForeground,
  253. }
  254. return theme
  255. }
  256. func init() {
  257. // Register the Dracula theme with the theme manager
  258. RegisterTheme("dracula", NewDraculaTheme())
  259. }