opencode.go 9.4 KB

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