flexoki.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package theme
  2. import (
  3. "github.com/charmbracelet/lipgloss"
  4. )
  5. // Flexoki color palette constants
  6. const (
  7. // Base colors
  8. flexokiPaper = "#FFFCF0" // Paper (lightest)
  9. flexokiBase50 = "#F2F0E5" // bg-2 (light)
  10. flexokiBase100 = "#E6E4D9" // ui (light)
  11. flexokiBase150 = "#DAD8CE" // ui-2 (light)
  12. flexokiBase200 = "#CECDC3" // ui-3 (light)
  13. flexokiBase300 = "#B7B5AC" // tx-3 (light)
  14. flexokiBase500 = "#878580" // tx-2 (light)
  15. flexokiBase600 = "#6F6E69" // tx (light)
  16. flexokiBase700 = "#575653" // tx-3 (dark)
  17. flexokiBase800 = "#403E3C" // ui-3 (dark)
  18. flexokiBase850 = "#343331" // ui-2 (dark)
  19. flexokiBase900 = "#282726" // ui (dark)
  20. flexokiBase950 = "#1C1B1A" // bg-2 (dark)
  21. flexokiBlack = "#100F0F" // bg (darkest)
  22. // Accent colors - Light theme (600)
  23. flexokiRed600 = "#AF3029"
  24. flexokiOrange600 = "#BC5215"
  25. flexokiYellow600 = "#AD8301"
  26. flexokiGreen600 = "#66800B"
  27. flexokiCyan600 = "#24837B"
  28. flexokiBlue600 = "#205EA6"
  29. flexokiPurple600 = "#5E409D"
  30. flexokiMagenta600 = "#A02F6F"
  31. // Accent colors - Dark theme (400)
  32. flexokiRed400 = "#D14D41"
  33. flexokiOrange400 = "#DA702C"
  34. flexokiYellow400 = "#D0A215"
  35. flexokiGreen400 = "#879A39"
  36. flexokiCyan400 = "#3AA99F"
  37. flexokiBlue400 = "#4385BE"
  38. flexokiPurple400 = "#8B7EC8"
  39. flexokiMagenta400 = "#CE5D97"
  40. )
  41. // FlexokiTheme implements the Theme interface with Flexoki colors.
  42. // It provides both dark and light variants.
  43. type FlexokiTheme struct {
  44. BaseTheme
  45. }
  46. // NewFlexokiTheme creates a new instance of the Flexoki theme.
  47. func NewFlexokiTheme() *FlexokiTheme {
  48. theme := &FlexokiTheme{}
  49. // Base colors
  50. theme.PrimaryColor = lipgloss.AdaptiveColor{
  51. Dark: flexokiBlue400,
  52. Light: flexokiBlue600,
  53. }
  54. theme.SecondaryColor = lipgloss.AdaptiveColor{
  55. Dark: flexokiPurple400,
  56. Light: flexokiPurple600,
  57. }
  58. theme.AccentColor = lipgloss.AdaptiveColor{
  59. Dark: flexokiOrange400,
  60. Light: flexokiOrange600,
  61. }
  62. // Status colors
  63. theme.ErrorColor = lipgloss.AdaptiveColor{
  64. Dark: flexokiRed400,
  65. Light: flexokiRed600,
  66. }
  67. theme.WarningColor = lipgloss.AdaptiveColor{
  68. Dark: flexokiYellow400,
  69. Light: flexokiYellow600,
  70. }
  71. theme.SuccessColor = lipgloss.AdaptiveColor{
  72. Dark: flexokiGreen400,
  73. Light: flexokiGreen600,
  74. }
  75. theme.InfoColor = lipgloss.AdaptiveColor{
  76. Dark: flexokiCyan400,
  77. Light: flexokiCyan600,
  78. }
  79. // Text colors
  80. theme.TextColor = lipgloss.AdaptiveColor{
  81. Dark: flexokiBase300,
  82. Light: flexokiBase600,
  83. }
  84. theme.TextMutedColor = lipgloss.AdaptiveColor{
  85. Dark: flexokiBase700,
  86. Light: flexokiBase500,
  87. }
  88. theme.TextEmphasizedColor = lipgloss.AdaptiveColor{
  89. Dark: flexokiYellow400,
  90. Light: flexokiYellow600,
  91. }
  92. // Background colors
  93. theme.BackgroundColor = lipgloss.AdaptiveColor{
  94. Dark: flexokiBlack,
  95. Light: flexokiPaper,
  96. }
  97. theme.BackgroundSecondaryColor = lipgloss.AdaptiveColor{
  98. Dark: flexokiBase950,
  99. Light: flexokiBase50,
  100. }
  101. theme.BackgroundDarkerColor = lipgloss.AdaptiveColor{
  102. Dark: flexokiBase900,
  103. Light: flexokiBase100,
  104. }
  105. // Border colors
  106. theme.BorderNormalColor = lipgloss.AdaptiveColor{
  107. Dark: flexokiBase900,
  108. Light: flexokiBase100,
  109. }
  110. theme.BorderFocusedColor = lipgloss.AdaptiveColor{
  111. Dark: flexokiBlue400,
  112. Light: flexokiBlue600,
  113. }
  114. theme.BorderDimColor = lipgloss.AdaptiveColor{
  115. Dark: flexokiBase850,
  116. Light: flexokiBase150,
  117. }
  118. // Diff view colors
  119. theme.DiffAddedColor = lipgloss.AdaptiveColor{
  120. Dark: flexokiGreen400,
  121. Light: flexokiGreen600,
  122. }
  123. theme.DiffRemovedColor = lipgloss.AdaptiveColor{
  124. Dark: flexokiRed400,
  125. Light: flexokiRed600,
  126. }
  127. theme.DiffContextColor = lipgloss.AdaptiveColor{
  128. Dark: flexokiBase700,
  129. Light: flexokiBase500,
  130. }
  131. theme.DiffHunkHeaderColor = lipgloss.AdaptiveColor{
  132. Dark: flexokiBase700,
  133. Light: flexokiBase500,
  134. }
  135. theme.DiffHighlightAddedColor = lipgloss.AdaptiveColor{
  136. Dark: flexokiGreen400,
  137. Light: flexokiGreen600,
  138. }
  139. theme.DiffHighlightRemovedColor = lipgloss.AdaptiveColor{
  140. Dark: flexokiRed400,
  141. Light: flexokiRed600,
  142. }
  143. theme.DiffAddedBgColor = lipgloss.AdaptiveColor{
  144. Dark: "#1D2419", // Darker green background
  145. Light: "#EFF2E2", // Light green background
  146. }
  147. theme.DiffRemovedBgColor = lipgloss.AdaptiveColor{
  148. Dark: "#241919", // Darker red background
  149. Light: "#F2E2E2", // Light red background
  150. }
  151. theme.DiffContextBgColor = lipgloss.AdaptiveColor{
  152. Dark: flexokiBlack,
  153. Light: flexokiPaper,
  154. }
  155. theme.DiffLineNumberColor = lipgloss.AdaptiveColor{
  156. Dark: flexokiBase700,
  157. Light: flexokiBase500,
  158. }
  159. theme.DiffAddedLineNumberBgColor = lipgloss.AdaptiveColor{
  160. Dark: "#1A2017", // Slightly darker green
  161. Light: "#E5EBD9", // Light green
  162. }
  163. theme.DiffRemovedLineNumberBgColor = lipgloss.AdaptiveColor{
  164. Dark: "#201717", // Slightly darker red
  165. Light: "#EBD9D9", // Light red
  166. }
  167. // Markdown colors
  168. theme.MarkdownTextColor = lipgloss.AdaptiveColor{
  169. Dark: flexokiBase300,
  170. Light: flexokiBase600,
  171. }
  172. theme.MarkdownHeadingColor = lipgloss.AdaptiveColor{
  173. Dark: flexokiYellow400,
  174. Light: flexokiYellow600,
  175. }
  176. theme.MarkdownLinkColor = lipgloss.AdaptiveColor{
  177. Dark: flexokiCyan400,
  178. Light: flexokiCyan600,
  179. }
  180. theme.MarkdownLinkTextColor = lipgloss.AdaptiveColor{
  181. Dark: flexokiMagenta400,
  182. Light: flexokiMagenta600,
  183. }
  184. theme.MarkdownCodeColor = lipgloss.AdaptiveColor{
  185. Dark: flexokiGreen400,
  186. Light: flexokiGreen600,
  187. }
  188. theme.MarkdownBlockQuoteColor = lipgloss.AdaptiveColor{
  189. Dark: flexokiCyan400,
  190. Light: flexokiCyan600,
  191. }
  192. theme.MarkdownEmphColor = lipgloss.AdaptiveColor{
  193. Dark: flexokiYellow400,
  194. Light: flexokiYellow600,
  195. }
  196. theme.MarkdownStrongColor = lipgloss.AdaptiveColor{
  197. Dark: flexokiOrange400,
  198. Light: flexokiOrange600,
  199. }
  200. theme.MarkdownHorizontalRuleColor = lipgloss.AdaptiveColor{
  201. Dark: flexokiBase800,
  202. Light: flexokiBase200,
  203. }
  204. theme.MarkdownListItemColor = lipgloss.AdaptiveColor{
  205. Dark: flexokiBlue400,
  206. Light: flexokiBlue600,
  207. }
  208. theme.MarkdownListEnumerationColor = lipgloss.AdaptiveColor{
  209. Dark: flexokiBlue400,
  210. Light: flexokiBlue600,
  211. }
  212. theme.MarkdownImageColor = lipgloss.AdaptiveColor{
  213. Dark: flexokiPurple400,
  214. Light: flexokiPurple600,
  215. }
  216. theme.MarkdownImageTextColor = lipgloss.AdaptiveColor{
  217. Dark: flexokiMagenta400,
  218. Light: flexokiMagenta600,
  219. }
  220. theme.MarkdownCodeBlockColor = lipgloss.AdaptiveColor{
  221. Dark: flexokiBase300,
  222. Light: flexokiBase600,
  223. }
  224. // Syntax highlighting colors (based on Flexoki's mappings)
  225. theme.SyntaxCommentColor = lipgloss.AdaptiveColor{
  226. Dark: flexokiBase700, // tx-3
  227. Light: flexokiBase300, // tx-3
  228. }
  229. theme.SyntaxKeywordColor = lipgloss.AdaptiveColor{
  230. Dark: flexokiGreen400, // gr
  231. Light: flexokiGreen600, // gr
  232. }
  233. theme.SyntaxFunctionColor = lipgloss.AdaptiveColor{
  234. Dark: flexokiOrange400, // or
  235. Light: flexokiOrange600, // or
  236. }
  237. theme.SyntaxVariableColor = lipgloss.AdaptiveColor{
  238. Dark: flexokiBlue400, // bl
  239. Light: flexokiBlue600, // bl
  240. }
  241. theme.SyntaxStringColor = lipgloss.AdaptiveColor{
  242. Dark: flexokiCyan400, // cy
  243. Light: flexokiCyan600, // cy
  244. }
  245. theme.SyntaxNumberColor = lipgloss.AdaptiveColor{
  246. Dark: flexokiPurple400, // pu
  247. Light: flexokiPurple600, // pu
  248. }
  249. theme.SyntaxTypeColor = lipgloss.AdaptiveColor{
  250. Dark: flexokiYellow400, // ye
  251. Light: flexokiYellow600, // ye
  252. }
  253. theme.SyntaxOperatorColor = lipgloss.AdaptiveColor{
  254. Dark: flexokiBase500, // tx-2
  255. Light: flexokiBase500, // tx-2
  256. }
  257. theme.SyntaxPunctuationColor = lipgloss.AdaptiveColor{
  258. Dark: flexokiBase500, // tx-2
  259. Light: flexokiBase500, // tx-2
  260. }
  261. return theme
  262. }
  263. func init() {
  264. // Register the Flexoki theme with the theme manager
  265. RegisterTheme("flexoki", NewFlexokiTheme())
  266. }