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