styles.go

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