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}