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,
 27			Title,
 28			Desc,
 29			Command,
 30			Updated lipgloss.Style
 31		}
 32		Active struct {
 33			Base,
 34			Title,
 35			Desc,
 36			Command,
 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("184")
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("42"))
170
171	s.TopLevelActiveTabDot = lipgloss.NewStyle().
172		Foreground(lipgloss.Color("29"))
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().
180		Foreground(lipgloss.Color("212")).
181		Bold(true)
182
183	s.RepoSelector.Normal.Desc = lipgloss.NewStyle().
184		Foreground(lipgloss.Color("250"))
185
186	s.RepoSelector.Normal.Command = lipgloss.NewStyle().
187		Foreground(lipgloss.Color("246"))
188
189	s.RepoSelector.Normal.Updated = lipgloss.NewStyle()
190
191	s.RepoSelector.Active.Base = s.RepoSelector.Normal.Base.Copy().
192		BorderStyle(lipgloss.Border{Left: "┃"}).
193		BorderForeground(selectorColor)
194
195	s.RepoSelector.Active.Title = lipgloss.NewStyle().
196		Foreground(highlightColor).
197		Bold(true)
198
199	s.RepoSelector.Active.Desc = lipgloss.NewStyle().
200		Foreground(highlightColorDim)
201
202	s.RepoSelector.Active.Updated = s.RepoSelector.Normal.Updated.Copy().
203		Foreground(highlightColorDim)
204
205	s.RepoSelector.Active.Command = lipgloss.NewStyle().
206		Foreground(lipgloss.Color("138"))
207
208	s.MenuItem = lipgloss.NewStyle().
209		PaddingLeft(1).
210		Border(lipgloss.Border{
211			Left: " ",
212		}, false, false, false, true).
213		Height(3)
214
215	s.MenuLastUpdate = lipgloss.NewStyle().
216		Foreground(lipgloss.Color("241")).
217		Align(lipgloss.Right)
218
219	s.Repo.Base = lipgloss.NewStyle()
220
221	s.Repo.Title = lipgloss.NewStyle().
222		Padding(0, 2)
223
224	s.Repo.Command = lipgloss.NewStyle().
225		Foreground(lipgloss.Color("168"))
226
227	s.Repo.Body = lipgloss.NewStyle().
228		Margin(1, 0)
229
230	s.Repo.Header = lipgloss.NewStyle().
231		Height(2).
232		Border(lipgloss.NormalBorder(), false, false, true, false).
233		BorderForeground(lipgloss.Color("238"))
234
235	s.Repo.HeaderName = lipgloss.NewStyle().
236		Foreground(lipgloss.Color("212")).
237		Bold(true)
238
239	s.Repo.HeaderDesc = lipgloss.NewStyle().
240		Foreground(lipgloss.Color("244"))
241
242	s.Footer = lipgloss.NewStyle().
243		MarginTop(1).
244		Padding(0, 1).
245		Height(1)
246
247	s.Branch = lipgloss.NewStyle().
248		Foreground(lipgloss.Color("203")).
249		Background(lipgloss.Color("236")).
250		Padding(0, 1)
251
252	s.HelpKey = lipgloss.NewStyle().
253		Foreground(lipgloss.Color("241"))
254
255	s.HelpValue = lipgloss.NewStyle().
256		Foreground(lipgloss.Color("239"))
257
258	s.HelpDivider = lipgloss.NewStyle().
259		Foreground(lipgloss.Color("237")).
260		SetString(" • ")
261
262	s.Error = lipgloss.NewStyle().
263		MarginTop(2)
264
265	s.ErrorTitle = lipgloss.NewStyle().
266		Foreground(lipgloss.Color("230")).
267		Background(lipgloss.Color("204")).
268		Bold(true).
269		Padding(0, 1)
270
271	s.ErrorBody = lipgloss.NewStyle().
272		Foreground(lipgloss.Color("252")).
273		MarginLeft(2)
274
275	s.AboutNoReadme = lipgloss.NewStyle().
276		MarginTop(1).
277		MarginLeft(2).
278		Foreground(lipgloss.Color("242"))
279
280	s.LogItem.Normal.Base = lipgloss.NewStyle().
281		Border(lipgloss.Border{
282			Left: " ",
283		}, false, false, false, true).
284		PaddingLeft(1)
285
286	s.LogItem.Active.Base = s.LogItem.Normal.Base.Copy().
287		Border(lipgloss.Border{
288			Left: "┃",
289		}, false, false, false, true).
290		BorderForeground(selectorColor)
291
292	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.Copy().
293		Foreground(hashColor)
294
295	s.LogItem.Active.Hash = lipgloss.NewStyle().
296		Bold(true).
297		Foreground(highlightColor)
298
299	s.LogItem.Normal.Title = lipgloss.NewStyle().
300		Foreground(lipgloss.Color("105"))
301
302	s.LogItem.Active.Title = lipgloss.NewStyle().
303		Foreground(highlightColor).
304		Bold(true)
305
306	s.LogItem.Normal.Desc = lipgloss.NewStyle().
307		Foreground(lipgloss.Color("246"))
308
309	s.LogItem.Active.Desc = lipgloss.NewStyle().
310		Foreground(lipgloss.Color("95"))
311
312	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.Copy().
313		Foreground(highlightColorDim)
314
315	s.LogItem.Normal.Hash = lipgloss.NewStyle().
316		Foreground(hashColor)
317
318	s.LogItem.Active.Hash = lipgloss.NewStyle().
319		Foreground(highlightColor)
320
321	s.Log.Commit = lipgloss.NewStyle().
322		Margin(0, 2)
323
324	s.Log.CommitHash = lipgloss.NewStyle().
325		Foreground(hashColor).
326		Bold(true)
327
328	s.Log.CommitBody = lipgloss.NewStyle().
329		MarginTop(1).
330		MarginLeft(2)
331
332	s.Log.CommitStatsAdd = lipgloss.NewStyle().
333		Foreground(lipgloss.Color("42")).
334		Bold(true)
335
336	s.Log.CommitStatsDel = lipgloss.NewStyle().
337		Foreground(lipgloss.Color("203")).
338		Bold(true)
339
340	s.Log.Paginator = lipgloss.NewStyle().
341		Margin(0).
342		Align(lipgloss.Center)
343
344	s.Ref.Normal.Item = lipgloss.NewStyle()
345
346	s.Ref.ItemSelector = lipgloss.NewStyle().
347		Foreground(selectorColor).
348		SetString("> ")
349
350	s.Ref.Active.Item = lipgloss.NewStyle().
351		Foreground(highlightColorDim)
352
353	s.Ref.ItemBranch = lipgloss.NewStyle()
354
355	s.Ref.Normal.ItemTag = lipgloss.NewStyle().
356		Foreground(lipgloss.Color("185"))
357
358	s.Ref.Active.ItemTag = lipgloss.NewStyle().
359		Bold(true).
360		Foreground(highlightColor)
361
362	s.Ref.Active.Item = lipgloss.NewStyle().
363		Bold(true).
364		Foreground(highlightColor)
365
366	s.Ref.Paginator = s.Log.Paginator.Copy()
367
368	s.Tree.Selector = s.Tree.Normal.FileName.Copy().
369		Width(1).
370		Foreground(selectorColor)
371
372	s.Tree.Normal.FileName = lipgloss.NewStyle().
373		MarginLeft(1)
374
375	s.Tree.Active.FileName = s.Tree.Normal.FileName.Copy().
376		Bold(true).
377		Foreground(highlightColor)
378
379	s.Tree.Normal.FileDir = lipgloss.NewStyle().
380		Foreground(lipgloss.Color("39"))
381
382	s.Tree.Active.FileDir = lipgloss.NewStyle().
383		Foreground(highlightColor)
384
385	s.Tree.Normal.FileMode = s.Tree.Active.FileName.Copy().
386		Width(10).
387		Foreground(lipgloss.Color("243"))
388
389	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.Copy().
390		Foreground(highlightColorDim)
391
392	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.Copy().
393		Foreground(lipgloss.Color("243"))
394
395	s.Tree.Active.FileSize = s.Tree.Normal.FileName.Copy().
396		Foreground(highlightColorDim)
397
398	s.Tree.FileContent = lipgloss.NewStyle()
399
400	s.Tree.Paginator = s.Log.Paginator.Copy()
401
402	s.Tree.NoItems = s.AboutNoReadme.Copy()
403
404	s.Spinner = lipgloss.NewStyle().
405		MarginTop(1).
406		MarginLeft(2).
407		Foreground(lipgloss.Color("205"))
408
409	s.CodeNoContent = lipgloss.NewStyle().
410		SetString("No Content.").
411		MarginTop(1).
412		MarginLeft(2).
413		Foreground(lipgloss.Color("242"))
414
415	s.StatusBar = lipgloss.NewStyle().
416		Height(1)
417
418	s.StatusBarKey = lipgloss.NewStyle().
419		Bold(true).
420		Padding(0, 1).
421		Background(lipgloss.Color("206")).
422		Foreground(lipgloss.Color("228"))
423
424	s.StatusBarValue = lipgloss.NewStyle().
425		Padding(0, 1).
426		Background(lipgloss.Color("235")).
427		Foreground(lipgloss.Color("243"))
428
429	s.StatusBarInfo = lipgloss.NewStyle().
430		Padding(0, 1).
431		Background(lipgloss.Color("212")).
432		Foreground(lipgloss.Color("230"))
433
434	s.StatusBarBranch = lipgloss.NewStyle().
435		Padding(0, 1).
436		Background(lipgloss.Color("62")).
437		Foreground(lipgloss.Color("230"))
438
439	s.StatusBarHelp = lipgloss.NewStyle().
440		Padding(0, 1).
441		Background(lipgloss.Color("237")).
442		Foreground(lipgloss.Color("243"))
443
444	s.Tabs = lipgloss.NewStyle()
445
446	s.TabInactive = lipgloss.NewStyle()
447
448	s.TabActive = lipgloss.NewStyle().
449		Underline(true).
450		Foreground(lipgloss.Color("42"))
451
452	s.TabSeparator = lipgloss.NewStyle().
453		SetString("│").
454		Padding(0, 1).
455		Foreground(lipgloss.Color("238"))
456
457	return s
458}