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	ServerName           lipgloss.Style
 17	TopLevelNormalTab    lipgloss.Style
 18	TopLevelActiveTab    lipgloss.Style
 19	TopLevelActiveTabDot lipgloss.Style
 20
 21	MenuItem       lipgloss.Style
 22	MenuLastUpdate lipgloss.Style
 23
 24	RepoSelector struct {
 25		Normal struct {
 26			Base    lipgloss.Style
 27			Title   lipgloss.Style
 28			Desc    lipgloss.Style
 29			Command lipgloss.Style
 30			Updated lipgloss.Style
 31		}
 32		Active struct {
 33			Base    lipgloss.Style
 34			Title   lipgloss.Style
 35			Desc    lipgloss.Style
 36			Command lipgloss.Style
 37			Updated lipgloss.Style
 38		}
 39	}
 40
 41	Repo struct {
 42		Base       lipgloss.Style
 43		Title      lipgloss.Style
 44		Command    lipgloss.Style
 45		Body       lipgloss.Style
 46		Header     lipgloss.Style
 47		HeaderName lipgloss.Style
 48		HeaderDesc lipgloss.Style
 49	}
 50
 51	Footer      lipgloss.Style
 52	Branch      lipgloss.Style
 53	HelpKey     lipgloss.Style
 54	HelpValue   lipgloss.Style
 55	HelpDivider lipgloss.Style
 56	URLStyle    lipgloss.Style
 57
 58	Error      lipgloss.Style
 59	ErrorTitle lipgloss.Style
 60	ErrorBody  lipgloss.Style
 61
 62	LogItem struct {
 63		Normal struct {
 64			Base    lipgloss.Style
 65			Hash    lipgloss.Style
 66			Title   lipgloss.Style
 67			Desc    lipgloss.Style
 68			Keyword lipgloss.Style
 69		}
 70		Active struct {
 71			Base    lipgloss.Style
 72			Hash    lipgloss.Style
 73			Title   lipgloss.Style
 74			Desc    lipgloss.Style
 75			Keyword lipgloss.Style
 76		}
 77	}
 78
 79	Log struct {
 80		Commit         lipgloss.Style
 81		CommitHash     lipgloss.Style
 82		CommitAuthor   lipgloss.Style
 83		CommitDate     lipgloss.Style
 84		CommitBody     lipgloss.Style
 85		CommitStatsAdd lipgloss.Style
 86		CommitStatsDel lipgloss.Style
 87		Paginator      lipgloss.Style
 88	}
 89
 90	Ref struct {
 91		Normal struct {
 92			Base     lipgloss.Style
 93			Item     lipgloss.Style
 94			ItemTag  lipgloss.Style
 95			ItemDesc lipgloss.Style
 96			ItemHash lipgloss.Style
 97		}
 98		Active struct {
 99			Base     lipgloss.Style
100			Item     lipgloss.Style
101			ItemTag  lipgloss.Style
102			ItemDesc lipgloss.Style
103			ItemHash lipgloss.Style
104		}
105		ItemSelector lipgloss.Style
106		Paginator    lipgloss.Style
107		Selector     lipgloss.Style
108	}
109
110	Tree struct {
111		Normal struct {
112			FileName lipgloss.Style
113			FileDir  lipgloss.Style
114			FileMode lipgloss.Style
115			FileSize lipgloss.Style
116		}
117		Active struct {
118			FileName lipgloss.Style
119			FileDir  lipgloss.Style
120			FileMode lipgloss.Style
121			FileSize lipgloss.Style
122		}
123		Selector    lipgloss.Style
124		FileContent lipgloss.Style
125		Paginator   lipgloss.Style
126		Blame       struct {
127			Hash    lipgloss.Style
128			Message lipgloss.Style
129			Who     lipgloss.Style
130		}
131	}
132
133	Stash struct {
134		Normal struct {
135			Message lipgloss.Style
136		}
137		Active struct {
138			Message lipgloss.Style
139		}
140		Title    lipgloss.Style
141		Selector lipgloss.Style
142	}
143
144	Spinner          lipgloss.Style
145	SpinnerContainer lipgloss.Style
146
147	NoContent lipgloss.Style
148
149	StatusBar       lipgloss.Style
150	StatusBarKey    lipgloss.Style
151	StatusBarValue  lipgloss.Style
152	StatusBarInfo   lipgloss.Style
153	StatusBarBranch lipgloss.Style
154	StatusBarHelp   lipgloss.Style
155
156	Tabs         lipgloss.Style
157	TabInactive  lipgloss.Style
158	TabActive    lipgloss.Style
159	TabSeparator lipgloss.Style
160
161	Code struct {
162		LineDigit lipgloss.Style
163		LineBar   lipgloss.Style
164	}
165}
166
167// DefaultStyles returns default styles for the UI.
168func DefaultStyles() *Styles {
169	highlightColor := lipgloss.Color("210")
170	highlightColorDim := lipgloss.Color("174")
171	selectorColor := lipgloss.Color("167")
172	hashColor := lipgloss.Color("185")
173
174	s := new(Styles)
175
176	s.ActiveBorderColor = lipgloss.Color("62")
177	s.InactiveBorderColor = lipgloss.Color("241")
178
179	s.App = lipgloss.NewStyle().
180		Margin(1, 2)
181
182	s.ServerName = lipgloss.NewStyle().
183		Height(1).
184		MarginLeft(1).
185		MarginBottom(1).
186		Padding(0, 1).
187		Background(lipgloss.Color("57")).
188		Foreground(lipgloss.Color("229")).
189		Bold(true)
190
191	s.TopLevelNormalTab = lipgloss.NewStyle().
192		MarginRight(2)
193
194	s.TopLevelActiveTab = s.TopLevelNormalTab.Copy().
195		Foreground(lipgloss.Color("36"))
196
197	s.TopLevelActiveTabDot = lipgloss.NewStyle().
198		Foreground(lipgloss.Color("36"))
199
200	s.RepoSelector.Normal.Base = lipgloss.NewStyle().
201		PaddingLeft(1).
202		Border(lipgloss.Border{Left: " "}, false, false, false, true).
203		Height(3)
204
205	s.RepoSelector.Normal.Title = lipgloss.NewStyle().Bold(true)
206
207	s.RepoSelector.Normal.Desc = lipgloss.NewStyle().
208		Foreground(lipgloss.Color("243"))
209
210	s.RepoSelector.Normal.Command = lipgloss.NewStyle().
211		Foreground(lipgloss.Color("132"))
212
213	s.RepoSelector.Normal.Updated = lipgloss.NewStyle().
214		Foreground(lipgloss.Color("243"))
215
216	s.RepoSelector.Active.Base = s.RepoSelector.Normal.Base.Copy().
217		BorderStyle(lipgloss.Border{Left: "┃"}).
218		BorderForeground(lipgloss.Color("176"))
219
220	s.RepoSelector.Active.Title = s.RepoSelector.Normal.Title.Copy().
221		Foreground(lipgloss.Color("212"))
222
223	s.RepoSelector.Active.Desc = s.RepoSelector.Normal.Desc.Copy().
224		Foreground(lipgloss.Color("246"))
225
226	s.RepoSelector.Active.Updated = s.RepoSelector.Normal.Updated.Copy().
227		Foreground(lipgloss.Color("212"))
228
229	s.RepoSelector.Active.Command = s.RepoSelector.Normal.Command.Copy().
230		Foreground(lipgloss.Color("204"))
231
232	s.MenuItem = lipgloss.NewStyle().
233		PaddingLeft(1).
234		Border(lipgloss.Border{
235			Left: " ",
236		}, false, false, false, true).
237		Height(3)
238
239	s.MenuLastUpdate = lipgloss.NewStyle().
240		Foreground(lipgloss.Color("241")).
241		Align(lipgloss.Right)
242
243	s.Repo.Base = lipgloss.NewStyle()
244
245	s.Repo.Title = lipgloss.NewStyle().
246		Padding(0, 2)
247
248	s.Repo.Command = lipgloss.NewStyle().
249		Foreground(lipgloss.Color("168"))
250
251	s.Repo.Body = lipgloss.NewStyle().
252		Margin(1, 0)
253
254	s.Repo.Header = lipgloss.NewStyle().
255		MaxHeight(2).
256		Border(lipgloss.NormalBorder(), false, false, true, false).
257		BorderForeground(lipgloss.Color("236"))
258
259	s.Repo.HeaderName = lipgloss.NewStyle().
260		Foreground(lipgloss.Color("212")).
261		Bold(true)
262
263	s.Repo.HeaderDesc = lipgloss.NewStyle().
264		Foreground(lipgloss.Color("243"))
265
266	s.Footer = lipgloss.NewStyle().
267		MarginTop(1).
268		Padding(0, 1).
269		Height(1)
270
271	s.Branch = lipgloss.NewStyle().
272		Foreground(lipgloss.Color("203")).
273		Background(lipgloss.Color("236")).
274		Padding(0, 1)
275
276	s.HelpKey = lipgloss.NewStyle().
277		Foreground(lipgloss.Color("241"))
278
279	s.HelpValue = lipgloss.NewStyle().
280		Foreground(lipgloss.Color("239"))
281
282	s.HelpDivider = lipgloss.NewStyle().
283		Foreground(lipgloss.Color("237")).
284		SetString(" • ")
285
286	s.URLStyle = lipgloss.NewStyle().
287		MarginLeft(1).
288		Foreground(lipgloss.Color("168"))
289
290	s.Error = lipgloss.NewStyle().
291		MarginTop(2)
292
293	s.ErrorTitle = lipgloss.NewStyle().
294		Foreground(lipgloss.Color("230")).
295		Background(lipgloss.Color("204")).
296		Bold(true).
297		Padding(0, 1)
298
299	s.ErrorBody = lipgloss.NewStyle().
300		Foreground(lipgloss.Color("252")).
301		MarginLeft(2)
302
303	s.LogItem.Normal.Base = lipgloss.NewStyle().
304		Border(lipgloss.Border{
305			Left: " ",
306		}, false, false, false, true).
307		PaddingLeft(1)
308
309	s.LogItem.Active.Base = s.LogItem.Normal.Base.Copy().
310		Border(lipgloss.Border{
311			Left: "┃",
312		}, false, false, false, true).
313		BorderForeground(selectorColor)
314
315	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.Copy().
316		Foreground(hashColor)
317
318	s.LogItem.Active.Hash = lipgloss.NewStyle().
319		Bold(true).
320		Foreground(highlightColor)
321
322	s.LogItem.Normal.Title = lipgloss.NewStyle().
323		Foreground(lipgloss.Color("105"))
324
325	s.LogItem.Active.Title = lipgloss.NewStyle().
326		Foreground(highlightColor).
327		Bold(true)
328
329	s.LogItem.Normal.Desc = lipgloss.NewStyle().
330		Foreground(lipgloss.Color("246"))
331
332	s.LogItem.Active.Desc = lipgloss.NewStyle().
333		Foreground(lipgloss.Color("95"))
334
335	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.Copy().
336		Foreground(highlightColorDim)
337
338	s.LogItem.Normal.Hash = lipgloss.NewStyle().
339		Foreground(hashColor)
340
341	s.LogItem.Active.Hash = lipgloss.NewStyle().
342		Foreground(highlightColor)
343
344	s.Log.Commit = lipgloss.NewStyle().
345		Margin(0, 2)
346
347	s.Log.CommitHash = lipgloss.NewStyle().
348		Foreground(hashColor).
349		Bold(true)
350
351	s.Log.CommitBody = lipgloss.NewStyle().
352		MarginTop(1).
353		MarginLeft(2)
354
355	s.Log.CommitStatsAdd = lipgloss.NewStyle().
356		Foreground(lipgloss.Color("42")).
357		Bold(true)
358
359	s.Log.CommitStatsDel = lipgloss.NewStyle().
360		Foreground(lipgloss.Color("203")).
361		Bold(true)
362
363	s.Log.Paginator = lipgloss.NewStyle().
364		Margin(0).
365		Align(lipgloss.Center)
366
367	s.Ref.Normal.Item = lipgloss.NewStyle()
368
369	s.Ref.ItemSelector = lipgloss.NewStyle().
370		Foreground(selectorColor).
371		SetString("> ")
372
373	s.Ref.Active.Item = lipgloss.NewStyle().
374		Foreground(highlightColorDim)
375
376	s.Ref.Normal.Base = lipgloss.NewStyle()
377
378	s.Ref.Active.Base = lipgloss.NewStyle()
379
380	s.Ref.Normal.ItemTag = lipgloss.NewStyle().
381		Foreground(lipgloss.Color("39"))
382
383	s.Ref.Active.ItemTag = lipgloss.NewStyle().
384		Bold(true).
385		Foreground(highlightColor)
386
387	s.Ref.Active.Item = lipgloss.NewStyle().
388		Bold(true).
389		Foreground(highlightColor)
390
391	s.Ref.Normal.ItemDesc = lipgloss.NewStyle().
392		Faint(true)
393
394	s.Ref.Active.ItemDesc = lipgloss.NewStyle().
395		Foreground(highlightColor).
396		Faint(true)
397
398	s.Ref.Normal.ItemHash = lipgloss.NewStyle().
399		Foreground(hashColor).
400		Bold(true)
401
402	s.Ref.Active.ItemHash = lipgloss.NewStyle().
403		Foreground(highlightColor).
404		Bold(true)
405
406	s.Ref.Paginator = s.Log.Paginator.Copy()
407
408	s.Ref.Selector = lipgloss.NewStyle()
409
410	s.Tree.Selector = s.Tree.Normal.FileName.Copy().
411		Width(1).
412		Foreground(selectorColor)
413
414	s.Tree.Normal.FileName = lipgloss.NewStyle().
415		MarginLeft(1)
416
417	s.Tree.Active.FileName = s.Tree.Normal.FileName.Copy().
418		Bold(true).
419		Foreground(highlightColor)
420
421	s.Tree.Normal.FileDir = lipgloss.NewStyle().
422		Foreground(lipgloss.Color("39"))
423
424	s.Tree.Active.FileDir = lipgloss.NewStyle().
425		Foreground(highlightColor)
426
427	s.Tree.Normal.FileMode = s.Tree.Active.FileName.Copy().
428		Width(10).
429		Foreground(lipgloss.Color("243"))
430
431	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.Copy().
432		Foreground(highlightColorDim)
433
434	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.Copy().
435		Foreground(lipgloss.Color("243"))
436
437	s.Tree.Active.FileSize = s.Tree.Normal.FileName.Copy().
438		Foreground(highlightColorDim)
439
440	s.Tree.FileContent = lipgloss.NewStyle()
441
442	s.Tree.Paginator = s.Log.Paginator.Copy()
443
444	s.Tree.Blame.Hash = lipgloss.NewStyle().
445		Foreground(hashColor).
446		Bold(true)
447
448	s.Tree.Blame.Message = lipgloss.NewStyle()
449
450	s.Tree.Blame.Who = lipgloss.NewStyle().
451		Faint(true)
452
453	s.Spinner = lipgloss.NewStyle().
454		MarginTop(1).
455		MarginLeft(2).
456		Foreground(lipgloss.Color("205"))
457
458	s.SpinnerContainer = lipgloss.NewStyle()
459
460	s.NoContent = lipgloss.NewStyle().
461		MarginTop(1).
462		MarginLeft(2).
463		Foreground(lipgloss.Color("242"))
464
465	s.StatusBar = lipgloss.NewStyle().
466		Height(1)
467
468	s.StatusBarKey = lipgloss.NewStyle().
469		Bold(true).
470		Padding(0, 1).
471		Background(lipgloss.Color("206")).
472		Foreground(lipgloss.Color("228"))
473
474	s.StatusBarValue = lipgloss.NewStyle().
475		Padding(0, 1).
476		Background(lipgloss.Color("235")).
477		Foreground(lipgloss.Color("243"))
478
479	s.StatusBarInfo = lipgloss.NewStyle().
480		Padding(0, 1).
481		Background(lipgloss.Color("212")).
482		Foreground(lipgloss.Color("230"))
483
484	s.StatusBarBranch = lipgloss.NewStyle().
485		Padding(0, 1).
486		Background(lipgloss.Color("62")).
487		Foreground(lipgloss.Color("230"))
488
489	s.StatusBarHelp = lipgloss.NewStyle().
490		Padding(0, 1).
491		Background(lipgloss.Color("237")).
492		Foreground(lipgloss.Color("243"))
493
494	s.Tabs = lipgloss.NewStyle().
495		Height(1)
496
497	s.TabInactive = lipgloss.NewStyle()
498
499	s.TabActive = lipgloss.NewStyle().
500		Underline(true).
501		Foreground(lipgloss.Color("36"))
502
503	s.TabSeparator = lipgloss.NewStyle().
504		SetString("│").
505		Padding(0, 1).
506		Foreground(lipgloss.Color("238"))
507
508	s.Code.LineDigit = lipgloss.NewStyle().Foreground(lipgloss.Color("239"))
509
510	s.Code.LineBar = lipgloss.NewStyle().Foreground(lipgloss.Color("236"))
511
512	s.Stash.Normal.Message = lipgloss.NewStyle().MarginLeft(1)
513
514	s.Stash.Active.Message = s.Stash.Normal.Message.Copy().Foreground(selectorColor)
515
516	s.Stash.Title = lipgloss.NewStyle().
517		Foreground(hashColor).
518		Bold(true)
519
520	s.Stash.Selector = lipgloss.NewStyle().
521		Width(1).
522		Foreground(selectorColor)
523
524	return s
525}