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