1package styles
  2
  3import (
  4	"github.com/charmbracelet/lipgloss"
  5)
  6
  7// XXX: For now, this is in its own package so that it can be shared between
  8// different packages without incurring an illegal import cycle.
  9
 10// Styles defines styles for the UI.
 11type Styles struct {
 12	ActiveBorderColor   lipgloss.Color
 13	InactiveBorderColor lipgloss.Color
 14
 15	App    lipgloss.Style
 16	Header lipgloss.Style
 17
 18	Menu           lipgloss.Style
 19	MenuCursor     lipgloss.Style
 20	MenuItem       lipgloss.Style
 21	MenuLastUpdate lipgloss.Style
 22
 23	// Selection page styles
 24	SelectorBox lipgloss.Style
 25	ReadmeBox   lipgloss.Style
 26
 27	Repo struct {
 28		Base       lipgloss.Style
 29		Title      lipgloss.Style
 30		Command    lipgloss.Style
 31		Body       lipgloss.Style
 32		Header     lipgloss.Style
 33		HeaderName lipgloss.Style
 34		HeaderDesc lipgloss.Style
 35	}
 36
 37	Footer      lipgloss.Style
 38	Branch      lipgloss.Style
 39	HelpKey     lipgloss.Style
 40	HelpValue   lipgloss.Style
 41	HelpDivider lipgloss.Style
 42
 43	Error      lipgloss.Style
 44	ErrorTitle lipgloss.Style
 45	ErrorBody  lipgloss.Style
 46
 47	AboutNoReadme lipgloss.Style
 48
 49	LogItem struct {
 50		Normal struct {
 51			Base    lipgloss.Style
 52			Hash    lipgloss.Style
 53			Title   lipgloss.Style
 54			Desc    lipgloss.Style
 55			Keyword lipgloss.Style
 56		}
 57		Active struct {
 58			Base    lipgloss.Style
 59			Hash    lipgloss.Style
 60			Title   lipgloss.Style
 61			Desc    lipgloss.Style
 62			Keyword lipgloss.Style
 63		}
 64	}
 65
 66	Log struct {
 67		Commit         lipgloss.Style
 68		CommitHash     lipgloss.Style
 69		CommitAuthor   lipgloss.Style
 70		CommitDate     lipgloss.Style
 71		CommitBody     lipgloss.Style
 72		CommitStatsAdd lipgloss.Style
 73		CommitStatsDel lipgloss.Style
 74		Paginator      lipgloss.Style
 75	}
 76
 77	Ref struct {
 78		ItemSelector    lipgloss.Style
 79		ItemActive      lipgloss.Style
 80		ItemInactive    lipgloss.Style
 81		ItemBranch      lipgloss.Style
 82		ItemTagInactive lipgloss.Style
 83		ItemTagActive   lipgloss.Style
 84		Paginator       lipgloss.Style
 85	}
 86
 87	Tree struct {
 88		Normal struct {
 89			FileName lipgloss.Style
 90			FileDir  lipgloss.Style
 91			FileMode lipgloss.Style
 92			FileSize lipgloss.Style
 93		}
 94		Active struct {
 95			FileName lipgloss.Style
 96			FileDir  lipgloss.Style
 97			FileMode lipgloss.Style
 98			FileSize lipgloss.Style
 99		}
100		Selector    lipgloss.Style
101		FileContent lipgloss.Style
102		Paginator   lipgloss.Style
103		NoItems     lipgloss.Style
104	}
105
106	Spinner lipgloss.Style
107
108	CodeNoContent lipgloss.Style
109
110	StatusBar       lipgloss.Style
111	StatusBarKey    lipgloss.Style
112	StatusBarValue  lipgloss.Style
113	StatusBarInfo   lipgloss.Style
114	StatusBarBranch lipgloss.Style
115	StatusBarHelp   lipgloss.Style
116
117	Tabs         lipgloss.Style
118	TabInactive  lipgloss.Style
119	TabActive    lipgloss.Style
120	TabSeparator lipgloss.Style
121}
122
123// DefaultStyles returns default styles for the UI.
124func DefaultStyles() *Styles {
125	highlightColor := lipgloss.Color("210")
126	highlightColorDim := lipgloss.Color("174")
127	selectorColor := lipgloss.Color("167")
128	hashColor := lipgloss.Color("184")
129
130	s := new(Styles)
131
132	s.ActiveBorderColor = lipgloss.Color("62")
133	s.InactiveBorderColor = lipgloss.Color("241")
134
135	s.App = lipgloss.NewStyle().
136		Margin(1, 2)
137
138	s.Header = lipgloss.NewStyle().
139		Align(lipgloss.Left).
140		Height(1).
141		PaddingLeft(1).
142		MarginBottom(1).
143		Bold(true)
144
145	s.Menu = lipgloss.NewStyle().
146		BorderStyle(lipgloss.RoundedBorder()).
147		BorderForeground(s.InactiveBorderColor).
148		Padding(1, 2).
149		MarginRight(1).
150		Width(24)
151
152	s.MenuCursor = lipgloss.NewStyle().
153		Foreground(lipgloss.Color("213")).
154		SetString(">")
155
156	s.MenuItem = lipgloss.NewStyle().
157		PaddingLeft(1).
158		Border(lipgloss.Border{
159			Left: " ",
160		}, false, false, false, true).
161		Height(3)
162
163	s.MenuLastUpdate = lipgloss.NewStyle().
164		Foreground(lipgloss.Color("241")).
165		Align(lipgloss.Right)
166
167	s.SelectorBox = lipgloss.NewStyle()
168
169	s.ReadmeBox = lipgloss.NewStyle()
170
171	s.Repo.Base = lipgloss.NewStyle()
172
173	s.Repo.Title = lipgloss.NewStyle().
174		Padding(0, 2)
175
176	s.Repo.Command = lipgloss.NewStyle().
177		Foreground(lipgloss.Color("168"))
178
179	s.Repo.Body = lipgloss.NewStyle().
180		Margin(1, 0)
181
182	s.Repo.Header = lipgloss.NewStyle().
183		Height(2).
184		Border(lipgloss.NormalBorder(), false, false, true, false).
185		BorderForeground(lipgloss.Color("238"))
186
187	s.Repo.HeaderName = lipgloss.NewStyle().
188		Bold(true)
189
190	s.Repo.HeaderDesc = lipgloss.NewStyle().
191		Faint(true)
192
193	s.Footer = lipgloss.NewStyle().
194		MarginTop(1).
195		Padding(0, 1).
196		Height(1)
197
198	s.Branch = lipgloss.NewStyle().
199		Foreground(lipgloss.Color("203")).
200		Background(lipgloss.Color("236")).
201		Padding(0, 1)
202
203	s.HelpKey = lipgloss.NewStyle().
204		Foreground(lipgloss.Color("241"))
205
206	s.HelpValue = lipgloss.NewStyle().
207		Foreground(lipgloss.Color("239"))
208
209	s.HelpDivider = lipgloss.NewStyle().
210		Foreground(lipgloss.Color("237")).
211		SetString(" • ")
212
213	s.Error = lipgloss.NewStyle().
214		MarginTop(2)
215
216	s.ErrorTitle = lipgloss.NewStyle().
217		Foreground(lipgloss.Color("230")).
218		Background(lipgloss.Color("204")).
219		Bold(true).
220		Padding(0, 1)
221
222	s.ErrorBody = lipgloss.NewStyle().
223		Foreground(lipgloss.Color("252")).
224		MarginLeft(2)
225
226	s.AboutNoReadme = lipgloss.NewStyle().
227		MarginTop(1).
228		MarginLeft(2).
229		Foreground(lipgloss.Color("242"))
230
231	s.LogItem.Normal.Base = lipgloss.NewStyle().
232		Border(lipgloss.Border{
233			Left: " ",
234		}, false, false, false, true).
235		PaddingLeft(1)
236
237	s.LogItem.Active.Base = s.LogItem.Normal.Base.Copy().
238		Border(lipgloss.Border{
239			Left: "┃",
240		}, false, false, false, true).
241		BorderForeground(selectorColor)
242
243	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.Copy().
244		Foreground(hashColor)
245
246	s.LogItem.Active.Hash = lipgloss.NewStyle().
247		Bold(true).
248		Foreground(highlightColor)
249
250	s.LogItem.Normal.Title = lipgloss.NewStyle().
251		Foreground(lipgloss.Color("105"))
252
253	s.LogItem.Active.Title = lipgloss.NewStyle().
254		Foreground(highlightColor).
255		Bold(true)
256
257	s.LogItem.Normal.Desc = lipgloss.NewStyle().
258		Foreground(lipgloss.Color("246"))
259
260	s.LogItem.Active.Desc = lipgloss.NewStyle().
261		Foreground(lipgloss.Color("95"))
262
263	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.Copy().
264		Foreground(highlightColorDim)
265
266	s.LogItem.Normal.Hash = lipgloss.NewStyle().
267		Foreground(hashColor)
268
269	s.LogItem.Active.Hash = lipgloss.NewStyle().
270		Foreground(highlightColor)
271
272	s.Log.Commit = lipgloss.NewStyle().
273		Margin(0, 2)
274
275	s.Log.CommitHash = lipgloss.NewStyle().
276		Foreground(hashColor).
277		Bold(true)
278
279	s.Log.CommitBody = lipgloss.NewStyle().
280		MarginTop(1).
281		MarginLeft(2)
282
283	s.Log.CommitStatsAdd = lipgloss.NewStyle().
284		Foreground(lipgloss.Color("42")).
285		Bold(true)
286
287	s.Log.CommitStatsDel = lipgloss.NewStyle().
288		Foreground(lipgloss.Color("203")).
289		Bold(true)
290
291	s.Log.Paginator = lipgloss.NewStyle().
292		Margin(0).
293		Align(lipgloss.Center)
294
295	s.Ref.ItemInactive = lipgloss.NewStyle()
296
297	s.Ref.ItemSelector = lipgloss.NewStyle().
298		Foreground(selectorColor).
299		SetString("> ")
300
301	s.Ref.ItemActive = s.Ref.ItemActive.Copy().
302		Foreground(highlightColorDim)
303
304	s.Ref.ItemBranch = lipgloss.NewStyle()
305
306	s.Ref.ItemTagInactive = lipgloss.NewStyle().
307		Foreground(lipgloss.Color("185"))
308
309	s.Ref.ItemTagActive = lipgloss.NewStyle().
310		Bold(true).
311		Foreground(highlightColor)
312
313	s.Ref.ItemActive = lipgloss.NewStyle().
314		Bold(true).
315		Foreground(highlightColor)
316
317	s.Ref.Paginator = s.Log.Paginator.Copy()
318
319	s.Tree.Selector = s.Tree.Normal.FileName.Copy().
320		Width(1).
321		Foreground(selectorColor)
322
323	s.Tree.Normal.FileName = lipgloss.NewStyle().
324		MarginLeft(1)
325
326	s.Tree.Active.FileName = s.Tree.Normal.FileName.Copy().
327		Bold(true).
328		Foreground(highlightColor)
329
330	s.Tree.Normal.FileDir = lipgloss.NewStyle().
331		Foreground(lipgloss.Color("39"))
332
333	s.Tree.Active.FileDir = lipgloss.NewStyle().
334		Foreground(highlightColor)
335
336	s.Tree.Normal.FileMode = s.Tree.Active.FileName.Copy().
337		Width(10).
338		Foreground(lipgloss.Color("243"))
339
340	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.Copy().
341		Foreground(highlightColorDim)
342
343	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.Copy().
344		Foreground(lipgloss.Color("243"))
345
346	s.Tree.Active.FileSize = s.Tree.Normal.FileName.Copy().
347		Foreground(highlightColorDim)
348
349	s.Tree.FileContent = lipgloss.NewStyle()
350
351	s.Tree.Paginator = s.Log.Paginator.Copy()
352
353	s.Tree.NoItems = s.AboutNoReadme.Copy()
354
355	s.Spinner = lipgloss.NewStyle().
356		MarginTop(1).
357		MarginLeft(2).
358		Foreground(lipgloss.Color("205"))
359
360	s.CodeNoContent = lipgloss.NewStyle().
361		SetString("No Content.").
362		MarginTop(1).
363		MarginLeft(2).
364		Foreground(lipgloss.Color("242"))
365
366	s.StatusBar = lipgloss.NewStyle().
367		Height(1)
368
369	s.StatusBarKey = lipgloss.NewStyle().
370		Bold(true).
371		Padding(0, 1).
372		Background(lipgloss.Color("206")).
373		Foreground(lipgloss.Color("228"))
374
375	s.StatusBarValue = lipgloss.NewStyle().
376		Padding(0, 1).
377		Background(lipgloss.Color("235")).
378		Foreground(lipgloss.Color("243"))
379
380	s.StatusBarInfo = lipgloss.NewStyle().
381		Padding(0, 1).
382		Background(lipgloss.Color("212")).
383		Foreground(lipgloss.Color("230"))
384
385	s.StatusBarBranch = lipgloss.NewStyle().
386		Padding(0, 1).
387		Background(lipgloss.Color("62")).
388		Foreground(lipgloss.Color("230"))
389
390	s.StatusBarHelp = lipgloss.NewStyle().
391		Padding(0, 1).
392		Background(lipgloss.Color("237")).
393		Foreground(lipgloss.Color("243"))
394
395	s.Tabs = lipgloss.NewStyle()
396
397	s.TabInactive = lipgloss.NewStyle()
398
399	s.TabActive = lipgloss.NewStyle().
400		Foreground(lipgloss.Color("63")).
401		Underline(true)
402
403	s.TabSeparator = lipgloss.NewStyle().
404		SetString("│").
405		Padding(0, 1).
406		Foreground(lipgloss.Color("238"))
407
408	return s
409}