flexoki.go

  1package theme
  2
  3import (
  4	"github.com/charmbracelet/lipgloss/v2"
  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// NewFlexokiDarkTheme creates a new instance of the Flexoki Dark theme.
 53func NewFlexokiDarkTheme() *FlexokiTheme {
 54	theme := &FlexokiTheme{}
 55
 56	// Base colors
 57	theme.PrimaryColor = lipgloss.Color(flexokiBlue400)
 58	theme.SecondaryColor = lipgloss.Color(flexokiPurple400)
 59	theme.AccentColor = lipgloss.Color(flexokiOrange400)
 60
 61	// Status colors
 62	theme.ErrorColor = lipgloss.Color(flexokiRed400)
 63	theme.WarningColor = lipgloss.Color(flexokiYellow400)
 64	theme.SuccessColor = lipgloss.Color(flexokiGreen400)
 65	theme.InfoColor = lipgloss.Color(flexokiCyan400)
 66
 67	// Text colors
 68	theme.TextColor = lipgloss.Color(flexokiBase300)
 69	theme.TextMutedColor = lipgloss.Color(flexokiBase700)
 70	theme.TextEmphasizedColor = lipgloss.Color(flexokiYellow400)
 71
 72	// Background colors
 73	theme.BackgroundColor = lipgloss.Color(flexokiBlack)
 74	theme.BackgroundSecondaryColor = lipgloss.Color(flexokiBase950)
 75	theme.BackgroundDarkerColor = lipgloss.Color(flexokiBase900)
 76
 77	// Border colors
 78	theme.BorderNormalColor = lipgloss.Color(flexokiBase900)
 79	theme.BorderFocusedColor = lipgloss.Color(flexokiBlue400)
 80	theme.BorderDimColor = lipgloss.Color(flexokiBase850)
 81
 82	// Diff view colors
 83	theme.DiffAddedColor = lipgloss.Color(flexokiGreen400)
 84	theme.DiffRemovedColor = lipgloss.Color(flexokiRed400)
 85	theme.DiffContextColor = lipgloss.Color(flexokiBase700)
 86	theme.DiffHunkHeaderColor = lipgloss.Color(flexokiBase700)
 87	theme.DiffHighlightAddedColor = lipgloss.Color(flexokiGreen400)
 88	theme.DiffHighlightRemovedColor = lipgloss.Color(flexokiRed400)
 89	theme.DiffAddedBgColor = lipgloss.Color("#1D2419") // Darker green background
 90	theme.DiffRemovedBgColor = lipgloss.Color("#241919") // Darker red background
 91	theme.DiffContextBgColor = lipgloss.Color(flexokiBlack)
 92	theme.DiffLineNumberColor = lipgloss.Color(flexokiBase700)
 93	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#1A2017") // Slightly darker green
 94	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#201717") // Slightly darker red
 95
 96	// Markdown colors
 97	theme.MarkdownTextColor = lipgloss.Color(flexokiBase300)
 98	theme.MarkdownHeadingColor = lipgloss.Color(flexokiYellow400)
 99	theme.MarkdownLinkColor = lipgloss.Color(flexokiCyan400)
100	theme.MarkdownLinkTextColor = lipgloss.Color(flexokiMagenta400)
101	theme.MarkdownCodeColor = lipgloss.Color(flexokiGreen400)
102	theme.MarkdownBlockQuoteColor = lipgloss.Color(flexokiCyan400)
103	theme.MarkdownEmphColor = lipgloss.Color(flexokiYellow400)
104	theme.MarkdownStrongColor = lipgloss.Color(flexokiOrange400)
105	theme.MarkdownHorizontalRuleColor = lipgloss.Color(flexokiBase800)
106	theme.MarkdownListItemColor = lipgloss.Color(flexokiBlue400)
107	theme.MarkdownListEnumerationColor = lipgloss.Color(flexokiBlue400)
108	theme.MarkdownImageColor = lipgloss.Color(flexokiPurple400)
109	theme.MarkdownImageTextColor = lipgloss.Color(flexokiMagenta400)
110	theme.MarkdownCodeBlockColor = lipgloss.Color(flexokiBase300)
111
112	// Syntax highlighting colors (based on Flexoki's mappings)
113	theme.SyntaxCommentColor = lipgloss.Color(flexokiBase700) // tx-3
114	theme.SyntaxKeywordColor = lipgloss.Color(flexokiGreen400) // gr
115	theme.SyntaxFunctionColor = lipgloss.Color(flexokiOrange400) // or
116	theme.SyntaxVariableColor = lipgloss.Color(flexokiBlue400) // bl
117	theme.SyntaxStringColor = lipgloss.Color(flexokiCyan400) // cy
118	theme.SyntaxNumberColor = lipgloss.Color(flexokiPurple400) // pu
119	theme.SyntaxTypeColor = lipgloss.Color(flexokiYellow400) // ye
120	theme.SyntaxOperatorColor = lipgloss.Color(flexokiBase500) // tx-2
121	theme.SyntaxPunctuationColor = lipgloss.Color(flexokiBase500) // tx-2
122
123	return theme
124}
125
126// NewFlexokiLightTheme creates a new instance of the Flexoki Light theme.
127func NewFlexokiLightTheme() *FlexokiTheme {
128	theme := &FlexokiTheme{}
129
130	// Base colors
131	theme.PrimaryColor = lipgloss.Color(flexokiBlue600)
132	theme.SecondaryColor = lipgloss.Color(flexokiPurple600)
133	theme.AccentColor = lipgloss.Color(flexokiOrange600)
134
135	// Status colors
136	theme.ErrorColor = lipgloss.Color(flexokiRed600)
137	theme.WarningColor = lipgloss.Color(flexokiYellow600)
138	theme.SuccessColor = lipgloss.Color(flexokiGreen600)
139	theme.InfoColor = lipgloss.Color(flexokiCyan600)
140
141	// Text colors
142	theme.TextColor = lipgloss.Color(flexokiBase600)
143	theme.TextMutedColor = lipgloss.Color(flexokiBase500)
144	theme.TextEmphasizedColor = lipgloss.Color(flexokiYellow600)
145
146	// Background colors
147	theme.BackgroundColor = lipgloss.Color(flexokiPaper)
148	theme.BackgroundSecondaryColor = lipgloss.Color(flexokiBase50)
149	theme.BackgroundDarkerColor = lipgloss.Color(flexokiBase100)
150
151	// Border colors
152	theme.BorderNormalColor = lipgloss.Color(flexokiBase100)
153	theme.BorderFocusedColor = lipgloss.Color(flexokiBlue600)
154	theme.BorderDimColor = lipgloss.Color(flexokiBase150)
155
156	// Diff view colors
157	theme.DiffAddedColor = lipgloss.Color(flexokiGreen600)
158	theme.DiffRemovedColor = lipgloss.Color(flexokiRed600)
159	theme.DiffContextColor = lipgloss.Color(flexokiBase500)
160	theme.DiffHunkHeaderColor = lipgloss.Color(flexokiBase500)
161	theme.DiffHighlightAddedColor = lipgloss.Color(flexokiGreen600)
162	theme.DiffHighlightRemovedColor = lipgloss.Color(flexokiRed600)
163	theme.DiffAddedBgColor = lipgloss.Color("#EFF2E2") // Light green background
164	theme.DiffRemovedBgColor = lipgloss.Color("#F2E2E2") // Light red background
165	theme.DiffContextBgColor = lipgloss.Color(flexokiPaper)
166	theme.DiffLineNumberColor = lipgloss.Color(flexokiBase500)
167	theme.DiffAddedLineNumberBgColor = lipgloss.Color("#E5EBD9") // Light green
168	theme.DiffRemovedLineNumberBgColor = lipgloss.Color("#EBD9D9") // Light red
169
170	// Markdown colors
171	theme.MarkdownTextColor = lipgloss.Color(flexokiBase600)
172	theme.MarkdownHeadingColor = lipgloss.Color(flexokiYellow600)
173	theme.MarkdownLinkColor = lipgloss.Color(flexokiCyan600)
174	theme.MarkdownLinkTextColor = lipgloss.Color(flexokiMagenta600)
175	theme.MarkdownCodeColor = lipgloss.Color(flexokiGreen600)
176	theme.MarkdownBlockQuoteColor = lipgloss.Color(flexokiCyan600)
177	theme.MarkdownEmphColor = lipgloss.Color(flexokiYellow600)
178	theme.MarkdownStrongColor = lipgloss.Color(flexokiOrange600)
179	theme.MarkdownHorizontalRuleColor = lipgloss.Color(flexokiBase200)
180	theme.MarkdownListItemColor = lipgloss.Color(flexokiBlue600)
181	theme.MarkdownListEnumerationColor = lipgloss.Color(flexokiBlue600)
182	theme.MarkdownImageColor = lipgloss.Color(flexokiPurple600)
183	theme.MarkdownImageTextColor = lipgloss.Color(flexokiMagenta600)
184	theme.MarkdownCodeBlockColor = lipgloss.Color(flexokiBase600)
185
186	// Syntax highlighting colors (based on Flexoki's mappings)
187	theme.SyntaxCommentColor = lipgloss.Color(flexokiBase300) // tx-3
188	theme.SyntaxKeywordColor = lipgloss.Color(flexokiGreen600) // gr
189	theme.SyntaxFunctionColor = lipgloss.Color(flexokiOrange600) // or
190	theme.SyntaxVariableColor = lipgloss.Color(flexokiBlue600) // bl
191	theme.SyntaxStringColor = lipgloss.Color(flexokiCyan600) // cy
192	theme.SyntaxNumberColor = lipgloss.Color(flexokiPurple600) // pu
193	theme.SyntaxTypeColor = lipgloss.Color(flexokiYellow600) // ye
194	theme.SyntaxOperatorColor = lipgloss.Color(flexokiBase500) // tx-2
195	theme.SyntaxPunctuationColor = lipgloss.Color(flexokiBase500) // tx-2
196
197	return theme
198}
199
200func init() {
201	// Register the Flexoki themes with the theme manager
202	RegisterTheme("flexoki-dark", NewFlexokiDarkTheme())
203	RegisterTheme("flexoki-light", NewFlexokiLightTheme())
204}