opencode.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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 with Radix-inspired scale progression
  13. // Dark mode colors - using a neutral gray scale as base
  14. darkStep1 := "#0a0a0a" // App background
  15. darkStep2 := "#141414" // Subtle background
  16. darkStep3 := "#1e1e1e" // UI element background
  17. darkStep4 := "#282828" // Hovered UI element background
  18. darkStep5 := "#323232" // Active/Selected UI element background
  19. darkStep6 := "#3c3c3c" // Subtle borders and separators
  20. darkStep7 := "#484848" // UI element border and focus rings
  21. darkStep8 := "#606060" // Hovered UI element border
  22. darkStep9 := "#fab283" // Solid backgrounds (primary orange/gold)
  23. darkStep10 := "#ffc09f" // Hovered solid backgrounds
  24. darkStep11 := "#808080" // Low-contrast text (more muted)
  25. darkStep12 := "#eeeeee" // High-contrast text
  26. // Dark mode accent colors
  27. darkPrimary := darkStep9 // Primary uses step 9 (solid background)
  28. darkSecondary := "#5c9cf5" // Secondary blue
  29. darkAccent := "#9d7cd8" // Accent purple
  30. darkRed := "#e06c75" // Error red
  31. darkOrange := "#f5a742" // Warning orange
  32. darkGreen := "#7fd88f" // Success green
  33. darkCyan := "#56b6c2" // Info cyan
  34. darkYellow := "#e5c07b" // Emphasized text
  35. // Light mode colors - using a neutral gray scale as base
  36. lightStep1 := "#ffffff" // App background
  37. lightStep2 := "#fafafa" // Subtle background
  38. lightStep3 := "#f5f5f5" // UI element background
  39. lightStep4 := "#ebebeb" // Hovered UI element background
  40. lightStep5 := "#e1e1e1" // Active/Selected UI element background
  41. lightStep6 := "#d4d4d4" // Subtle borders and separators
  42. lightStep7 := "#b8b8b8" // UI element border and focus rings
  43. lightStep8 := "#a0a0a0" // Hovered UI element border
  44. lightStep9 := "#3b7dd8" // Solid backgrounds (primary blue)
  45. lightStep10 := "#2968c3" // Hovered solid backgrounds
  46. lightStep11 := "#8a8a8a" // Low-contrast text (more muted)
  47. lightStep12 := "#1a1a1a" // High-contrast text
  48. // Light mode accent colors
  49. lightPrimary := lightStep9 // Primary uses step 9 (solid background)
  50. lightSecondary := "#7b5bb6" // Secondary purple
  51. lightAccent := "#d68c27" // Accent orange/gold
  52. lightRed := "#d1383d" // Error red
  53. lightOrange := "#d68c27" // Warning orange
  54. lightGreen := "#3d9a57" // Success green
  55. lightCyan := "#318795" // Info cyan
  56. lightYellow := "#b0851f" // Emphasized text
  57. // Unused variables to avoid compiler errors (these could be used for hover states)
  58. _ = darkStep4
  59. _ = darkStep5
  60. _ = darkStep10
  61. _ = lightStep4
  62. _ = lightStep5
  63. _ = lightStep10
  64. theme := &OpenCodeTheme{}
  65. // Base colors
  66. theme.PrimaryColor = lipgloss.AdaptiveColor{
  67. Dark: darkPrimary,
  68. Light: lightPrimary,
  69. }
  70. theme.SecondaryColor = lipgloss.AdaptiveColor{
  71. Dark: darkSecondary,
  72. Light: lightSecondary,
  73. }
  74. theme.AccentColor = lipgloss.AdaptiveColor{
  75. Dark: darkAccent,
  76. Light: lightAccent,
  77. }
  78. // Status colors
  79. theme.ErrorColor = lipgloss.AdaptiveColor{
  80. Dark: darkRed,
  81. Light: lightRed,
  82. }
  83. theme.WarningColor = lipgloss.AdaptiveColor{
  84. Dark: darkOrange,
  85. Light: lightOrange,
  86. }
  87. theme.SuccessColor = lipgloss.AdaptiveColor{
  88. Dark: darkGreen,
  89. Light: lightGreen,
  90. }
  91. theme.InfoColor = lipgloss.AdaptiveColor{
  92. Dark: darkCyan,
  93. Light: lightCyan,
  94. }
  95. // Text colors
  96. theme.TextColor = lipgloss.AdaptiveColor{
  97. Dark: darkStep12,
  98. Light: lightStep12,
  99. }
  100. theme.TextMutedColor = lipgloss.AdaptiveColor{
  101. Dark: darkStep11,
  102. Light: lightStep11,
  103. }
  104. // Background colors
  105. theme.BackgroundColor = lipgloss.AdaptiveColor{
  106. Dark: darkStep1,
  107. Light: lightStep1,
  108. }
  109. theme.BackgroundSubtleColor = lipgloss.AdaptiveColor{
  110. Dark: darkStep2,
  111. Light: lightStep2,
  112. }
  113. theme.BackgroundElementColor = lipgloss.AdaptiveColor{
  114. Dark: darkStep3,
  115. Light: lightStep3,
  116. }
  117. // Border colors
  118. theme.BorderColor = lipgloss.AdaptiveColor{
  119. Dark: darkStep7,
  120. Light: lightStep7,
  121. }
  122. theme.BorderActiveColor = lipgloss.AdaptiveColor{
  123. Dark: darkStep8,
  124. Light: lightStep8,
  125. }
  126. theme.BorderSubtleColor = lipgloss.AdaptiveColor{
  127. Dark: darkStep6,
  128. Light: lightStep6,
  129. }
  130. // Diff view colors
  131. theme.DiffAddedColor = lipgloss.AdaptiveColor{
  132. Dark: "#478247",
  133. Light: "#2E7D32",
  134. }
  135. theme.DiffRemovedColor = lipgloss.AdaptiveColor{
  136. Dark: "#7C4444",
  137. Light: "#C62828",
  138. }
  139. theme.DiffContextColor = lipgloss.AdaptiveColor{
  140. Dark: "#a0a0a0",
  141. Light: "#757575",
  142. }
  143. theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
  144. Dark: "#a0a0a0",
  145. Light: "#757575",
  146. }
  147. theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
  148. Dark: "#DAFADA",
  149. Light: "#A5D6A7",
  150. }
  151. theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
  152. Dark: "#FADADD",
  153. Light: "#EF9A9A",
  154. }
  155. theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
  156. Dark: "#303A30",
  157. Light: "#E8F5E9",
  158. }
  159. theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
  160. Dark: "#3A3030",
  161. Light: "#FFEBEE",
  162. }
  163. theme.DiffContextBgColor = lipgloss.AdaptiveColor{
  164. Dark: darkStep2,
  165. Light: lightStep2,
  166. }
  167. theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
  168. Dark: darkStep3,
  169. Light: lightStep3,
  170. }
  171. theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
  172. Dark: "#293229",
  173. Light: "#C8E6C9",
  174. }
  175. theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
  176. Dark: "#332929",
  177. Light: "#FFCDD2",
  178. }
  179. // Markdown colors
  180. theme.MarkdownTextColor = lipgloss.AdaptiveColor{
  181. Dark: darkStep12,
  182. Light: lightStep12,
  183. }
  184. theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
  185. Dark: darkSecondary,
  186. Light: lightSecondary,
  187. }
  188. theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
  189. Dark: darkPrimary,
  190. Light: lightPrimary,
  191. }
  192. theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
  193. Dark: darkCyan,
  194. Light: lightCyan,
  195. }
  196. theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
  197. Dark: darkGreen,
  198. Light: lightGreen,
  199. }
  200. theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
  201. Dark: darkYellow,
  202. Light: lightYellow,
  203. }
  204. theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
  205. Dark: darkYellow,
  206. Light: lightYellow,
  207. }
  208. theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
  209. Dark: darkAccent,
  210. Light: lightAccent,
  211. }
  212. theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
  213. Dark: darkStep11,
  214. Light: lightStep11,
  215. }
  216. theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
  217. Dark: darkPrimary,
  218. Light: lightPrimary,
  219. }
  220. theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
  221. Dark: darkCyan,
  222. Light: lightCyan,
  223. }
  224. theme.MarkdownImageColor = lipgloss.AdaptiveColor{
  225. Dark: darkPrimary,
  226. Light: lightPrimary,
  227. }
  228. theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
  229. Dark: darkCyan,
  230. Light: lightCyan,
  231. }
  232. theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
  233. Dark: darkStep12,
  234. Light: lightStep12,
  235. }
  236. // Syntax highlighting colors
  237. theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
  238. Dark: darkStep11,
  239. Light: lightStep11,
  240. }
  241. theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
  242. Dark: darkSecondary,
  243. Light: lightSecondary,
  244. }
  245. theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
  246. Dark: darkPrimary,
  247. Light: lightPrimary,
  248. }
  249. theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
  250. Dark: darkRed,
  251. Light: lightRed,
  252. }
  253. theme.SyntaxStringColor = lipgloss.AdaptiveColor{
  254. Dark: darkGreen,
  255. Light: lightGreen,
  256. }
  257. theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
  258. Dark: darkAccent,
  259. Light: lightAccent,
  260. }
  261. theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
  262. Dark: darkYellow,
  263. Light: lightYellow,
  264. }
  265. theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
  266. Dark: darkCyan,
  267. Light: lightCyan,
  268. }
  269. theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
  270. Dark: darkStep12,
  271. Light: lightStep12,
  272. }
  273. return theme
  274. }
  275. func init() {
  276. // Register the OpenCode theme with the theme manager
  277. RegisterTheme("opencode", NewOpenCodeTheme())
  278. }