opencode.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package theme
  2. import (
  3. "github.com/charmbracelet/lipgloss"
  4. )
  5. // OpenCodeTheme implements the Theme interface with OpenCode brand colors.
  6. // It provides both dark and light variants.
  7. type OpenCodeTheme struct {
  8. BaseTheme
  9. }
  10. // NewOpenCodeTheme creates a new instance of the OpenCode theme.
  11. func NewOpenCodeTheme() *OpenCodeTheme {
  12. // OpenCode color palette
  13. // Dark mode colors
  14. darkBackground := "#212121"
  15. darkCurrentLine := "#252525"
  16. darkSelection := "#303030"
  17. darkForeground := "#e0e0e0"
  18. darkComment := "#6a6a6a"
  19. darkPrimary := "#fab283" // Primary orange/gold
  20. darkSecondary := "#5c9cf5" // Secondary blue
  21. darkAccent := "#9d7cd8" // Accent purple
  22. darkRed := "#e06c75" // Error red
  23. darkOrange := "#f5a742" // Warning orange
  24. darkGreen := "#7fd88f" // Success green
  25. darkCyan := "#56b6c2" // Info cyan
  26. darkYellow := "#e5c07b" // Emphasized text
  27. darkBorder := "#4b4c5c" // Border color
  28. // Light mode colors
  29. lightBackground := "#f8f8f8"
  30. lightCurrentLine := "#f0f0f0"
  31. lightSelection := "#e5e5e6"
  32. lightForeground := "#2a2a2a"
  33. lightComment := "#8a8a8a"
  34. lightPrimary := "#3b7dd8" // Primary blue
  35. lightSecondary := "#7b5bb6" // Secondary purple
  36. lightAccent := "#d68c27" // Accent orange/gold
  37. lightRed := "#d1383d" // Error red
  38. lightOrange := "#d68c27" // Warning orange
  39. lightGreen := "#3d9a57" // Success green
  40. lightCyan := "#318795" // Info cyan
  41. lightYellow := "#b0851f" // Emphasized text
  42. lightBorder := "#d3d3d3" // Border color
  43. theme := &OpenCodeTheme{}
  44. // Base colors
  45. theme.PrimaryColor = lipgloss.AdaptiveColor{
  46. Dark: darkPrimary,
  47. Light: lightPrimary,
  48. }
  49. theme.SecondaryColor = lipgloss.AdaptiveColor{
  50. Dark: darkSecondary,
  51. Light: lightSecondary,
  52. }
  53. theme.AccentColor = lipgloss.AdaptiveColor{
  54. Dark: darkAccent,
  55. Light: lightAccent,
  56. }
  57. // Status colors
  58. theme.ErrorColor = lipgloss.AdaptiveColor{
  59. Dark: darkRed,
  60. Light: lightRed,
  61. }
  62. theme.WarningColor = lipgloss.AdaptiveColor{
  63. Dark: darkOrange,
  64. Light: lightOrange,
  65. }
  66. theme.SuccessColor = lipgloss.AdaptiveColor{
  67. Dark: darkGreen,
  68. Light: lightGreen,
  69. }
  70. theme.InfoColor = lipgloss.AdaptiveColor{
  71. Dark: darkCyan,
  72. Light: lightCyan,
  73. }
  74. // Text colors
  75. theme.TextColor = lipgloss.AdaptiveColor{
  76. Dark: darkForeground,
  77. Light: lightForeground,
  78. }
  79. theme.TextMutedColor = lipgloss.AdaptiveColor{
  80. Dark: darkComment,
  81. Light: lightComment,
  82. }
  83. theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
  84. Dark: darkYellow,
  85. Light: lightYellow,
  86. }
  87. // Background colors
  88. theme.BackgroundColor = lipgloss.AdaptiveColor{
  89. Dark: darkBackground,
  90. Light: lightBackground,
  91. }
  92. theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
  93. Dark: darkCurrentLine,
  94. Light: lightCurrentLine,
  95. }
  96. theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
  97. Dark: "#121212", // Slightly darker than background
  98. Light: "#ffffff", // Slightly lighter than background
  99. }
  100. // Border colors
  101. theme.BorderNormalColor = lipgloss.AdaptiveColor{
  102. Dark: darkBorder,
  103. Light: lightBorder,
  104. }
  105. theme.BorderFocusedColor = lipgloss.AdaptiveColor{
  106. Dark: darkPrimary,
  107. Light: lightPrimary,
  108. }
  109. theme.BorderDimColor = lipgloss.AdaptiveColor{
  110. Dark: darkSelection,
  111. Light: lightSelection,
  112. }
  113. // Diff view colors
  114. theme.DiffAddedColor = lipgloss.AdaptiveColor{
  115. Dark: "#478247",
  116. Light: "#2E7D32",
  117. }
  118. theme.DiffRemovedColor = lipgloss.AdaptiveColor{
  119. Dark: "#7C4444",
  120. Light: "#C62828",
  121. }
  122. theme.DiffContextColor = lipgloss.AdaptiveColor{
  123. Dark: "#a0a0a0",
  124. Light: "#757575",
  125. }
  126. theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
  127. Dark: "#a0a0a0",
  128. Light: "#757575",
  129. }
  130. theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
  131. Dark: "#DAFADA",
  132. Light: "#A5D6A7",
  133. }
  134. theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
  135. Dark: "#FADADD",
  136. Light: "#EF9A9A",
  137. }
  138. theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
  139. Dark: "#303A30",
  140. Light: "#E8F5E9",
  141. }
  142. theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
  143. Dark: "#3A3030",
  144. Light: "#FFEBEE",
  145. }
  146. theme.DiffContextBgColor = lipgloss.AdaptiveColor{
  147. Dark: darkBackground,
  148. Light: lightBackground,
  149. }
  150. theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
  151. Dark: "#888888",
  152. Light: "#9E9E9E",
  153. }
  154. theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
  155. Dark: "#293229",
  156. Light: "#C8E6C9",
  157. }
  158. theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
  159. Dark: "#332929",
  160. Light: "#FFCDD2",
  161. }
  162. // Markdown colors
  163. theme.MarkdownTextColor = lipgloss.AdaptiveColor{
  164. Dark: darkForeground,
  165. Light: lightForeground,
  166. }
  167. theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
  168. Dark: darkSecondary,
  169. Light: lightSecondary,
  170. }
  171. theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
  172. Dark: darkPrimary,
  173. Light: lightPrimary,
  174. }
  175. theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
  176. Dark: darkCyan,
  177. Light: lightCyan,
  178. }
  179. theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
  180. Dark: darkGreen,
  181. Light: lightGreen,
  182. }
  183. theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
  184. Dark: darkYellow,
  185. Light: lightYellow,
  186. }
  187. theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
  188. Dark: darkYellow,
  189. Light: lightYellow,
  190. }
  191. theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
  192. Dark: darkAccent,
  193. Light: lightAccent,
  194. }
  195. theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
  196. Dark: darkComment,
  197. Light: lightComment,
  198. }
  199. theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
  200. Dark: darkPrimary,
  201. Light: lightPrimary,
  202. }
  203. theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
  204. Dark: darkCyan,
  205. Light: lightCyan,
  206. }
  207. theme.MarkdownImageColor = lipgloss.AdaptiveColor{
  208. Dark: darkPrimary,
  209. Light: lightPrimary,
  210. }
  211. theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
  212. Dark: darkCyan,
  213. Light: lightCyan,
  214. }
  215. theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
  216. Dark: darkForeground,
  217. Light: lightForeground,
  218. }
  219. // Syntax highlighting colors
  220. theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
  221. Dark: darkComment,
  222. Light: lightComment,
  223. }
  224. theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
  225. Dark: darkSecondary,
  226. Light: lightSecondary,
  227. }
  228. theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
  229. Dark: darkPrimary,
  230. Light: lightPrimary,
  231. }
  232. theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
  233. Dark: darkRed,
  234. Light: lightRed,
  235. }
  236. theme.SyntaxStringColor = lipgloss.AdaptiveColor{
  237. Dark: darkGreen,
  238. Light: lightGreen,
  239. }
  240. theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
  241. Dark: darkAccent,
  242. Light: lightAccent,
  243. }
  244. theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
  245. Dark: darkYellow,
  246. Light: lightYellow,
  247. }
  248. theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
  249. Dark: darkCyan,
  250. Light: lightCyan,
  251. }
  252. theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
  253. Dark: darkForeground,
  254. Light: lightForeground,
  255. }
  256. return theme
  257. }
  258. func init() {
  259. // Register the OpenCode theme with the theme manager
  260. RegisterTheme("opencode", NewOpenCodeTheme())
  261. }