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