flexoki.go

  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}