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