styles.go

  1// Package styles provides UI styling definitions.
  2package styles
  3
  4import (
  5	"image/color"
  6
  7	"github.com/charmbracelet/lipgloss/v2"
  8)
  9
 10// XXX: For now, this is in its own package so that it can be shared between
 11// different packages without incurring an illegal import cycle.
 12
 13// Styles defines styles for the UI.
 14type Styles struct {
 15	ActiveBorderColor   color.Color
 16	InactiveBorderColor color.Color
 17
 18	App                  lipgloss.Style
 19	ServerName           lipgloss.Style
 20	TopLevelNormalTab    lipgloss.Style
 21	TopLevelActiveTab    lipgloss.Style
 22	TopLevelActiveTabDot lipgloss.Style
 23
 24	MenuItem       lipgloss.Style
 25	MenuLastUpdate lipgloss.Style
 26
 27	RepoSelector struct {
 28		Normal struct {
 29			Base    lipgloss.Style
 30			Title   lipgloss.Style
 31			Desc    lipgloss.Style
 32			Command lipgloss.Style
 33			Updated lipgloss.Style
 34		}
 35		Active struct {
 36			Base    lipgloss.Style
 37			Title   lipgloss.Style
 38			Desc    lipgloss.Style
 39			Command lipgloss.Style
 40			Updated lipgloss.Style
 41		}
 42	}
 43
 44	Repo struct {
 45		Base       lipgloss.Style
 46		Title      lipgloss.Style
 47		Command    lipgloss.Style
 48		Body       lipgloss.Style
 49		Header     lipgloss.Style
 50		HeaderName lipgloss.Style
 51		HeaderDesc lipgloss.Style
 52	}
 53
 54	Footer      lipgloss.Style
 55	Branch      lipgloss.Style
 56	HelpKey     lipgloss.Style
 57	HelpValue   lipgloss.Style
 58	HelpDivider lipgloss.Style
 59	URLStyle    lipgloss.Style
 60
 61	Error      lipgloss.Style
 62	ErrorTitle lipgloss.Style
 63	ErrorBody  lipgloss.Style
 64
 65	LogItem struct {
 66		Normal struct {
 67			Base    lipgloss.Style
 68			Hash    lipgloss.Style
 69			Title   lipgloss.Style
 70			Desc    lipgloss.Style
 71			Keyword lipgloss.Style
 72		}
 73		Active struct {
 74			Base    lipgloss.Style
 75			Hash    lipgloss.Style
 76			Title   lipgloss.Style
 77			Desc    lipgloss.Style
 78			Keyword lipgloss.Style
 79		}
 80	}
 81
 82	Log struct {
 83		Commit         lipgloss.Style
 84		CommitHash     lipgloss.Style
 85		CommitAuthor   lipgloss.Style
 86		CommitDate     lipgloss.Style
 87		CommitBody     lipgloss.Style
 88		CommitStatsAdd lipgloss.Style
 89		CommitStatsDel lipgloss.Style
 90		Paginator      lipgloss.Style
 91	}
 92
 93	Ref struct {
 94		Normal struct {
 95			Base     lipgloss.Style
 96			Item     lipgloss.Style
 97			ItemTag  lipgloss.Style
 98			ItemDesc lipgloss.Style
 99			ItemHash lipgloss.Style
100		}
101		Active struct {
102			Base     lipgloss.Style
103			Item     lipgloss.Style
104			ItemTag  lipgloss.Style
105			ItemDesc lipgloss.Style
106			ItemHash lipgloss.Style
107		}
108		ItemSelector lipgloss.Style
109		Paginator    lipgloss.Style
110		Selector     lipgloss.Style
111	}
112
113	Tree struct {
114		Normal struct {
115			FileName lipgloss.Style
116			FileDir  lipgloss.Style
117			FileMode lipgloss.Style
118			FileSize lipgloss.Style
119		}
120		Active struct {
121			FileName lipgloss.Style
122			FileDir  lipgloss.Style
123			FileMode lipgloss.Style
124			FileSize lipgloss.Style
125		}
126		Selector    lipgloss.Style
127		FileContent lipgloss.Style
128		Paginator   lipgloss.Style
129		Blame       struct {
130			Hash    lipgloss.Style
131			Message lipgloss.Style
132			Who     lipgloss.Style
133		}
134	}
135
136	Stash struct {
137		Normal struct {
138			Message lipgloss.Style
139		}
140		Active struct {
141			Message lipgloss.Style
142		}
143		Title    lipgloss.Style
144		Selector lipgloss.Style
145	}
146
147	Spinner          lipgloss.Style
148	SpinnerContainer lipgloss.Style
149
150	NoContent lipgloss.Style
151
152	StatusBar       lipgloss.Style
153	StatusBarKey    lipgloss.Style
154	StatusBarValue  lipgloss.Style
155	StatusBarInfo   lipgloss.Style
156	StatusBarBranch lipgloss.Style
157	StatusBarHelp   lipgloss.Style
158
159	Tabs         lipgloss.Style
160	TabInactive  lipgloss.Style
161	TabActive    lipgloss.Style
162	TabSeparator lipgloss.Style
163
164	Code struct {
165		LineDigit lipgloss.Style
166		LineBar   lipgloss.Style
167	}
168}
169
170// DefaultStyles returns default styles for the UI.
171func DefaultStyles() *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
179	s.ActiveBorderColor = lipgloss.Color("62")
180	s.InactiveBorderColor = lipgloss.Color("241")
181
182	s.App = lipgloss.NewStyle().
183		Margin(1, 2)
184
185	s.ServerName = lipgloss.NewStyle().
186		Height(1).
187		MarginLeft(1).
188		MarginBottom(1).
189		Padding(0, 1).
190		Background(lipgloss.Color("57")).
191		Foreground(lipgloss.Color("229")).
192		Bold(true)
193
194	s.TopLevelNormalTab = lipgloss.NewStyle().
195		MarginRight(2)
196
197	s.TopLevelActiveTab = s.TopLevelNormalTab.
198		Foreground(lipgloss.Color("36"))
199
200	s.TopLevelActiveTabDot = lipgloss.NewStyle().
201		Foreground(lipgloss.Color("36"))
202
203	s.RepoSelector.Normal.Base = lipgloss.NewStyle().
204		PaddingLeft(1).
205		Border(lipgloss.Border{Left: " "}, false, false, false, true).
206		Height(3)
207
208	s.RepoSelector.Normal.Title = lipgloss.NewStyle().Bold(true)
209
210	s.RepoSelector.Normal.Desc = lipgloss.NewStyle().
211		Foreground(lipgloss.Color("243"))
212
213	s.RepoSelector.Normal.Command = lipgloss.NewStyle().
214		Foreground(lipgloss.Color("132"))
215
216	s.RepoSelector.Normal.Updated = lipgloss.NewStyle().
217		Foreground(lipgloss.Color("243"))
218
219	s.RepoSelector.Active.Base = s.RepoSelector.Normal.Base.
220		BorderStyle(lipgloss.Border{Left: "┃"}).
221		BorderForeground(lipgloss.Color("176"))
222
223	s.RepoSelector.Active.Title = s.RepoSelector.Normal.Title.
224		Foreground(lipgloss.Color("212"))
225
226	s.RepoSelector.Active.Desc = s.RepoSelector.Normal.Desc.
227		Foreground(lipgloss.Color("246"))
228
229	s.RepoSelector.Active.Updated = s.RepoSelector.Normal.Updated.
230		Foreground(lipgloss.Color("212"))
231
232	s.RepoSelector.Active.Command = s.RepoSelector.Normal.Command.
233		Foreground(lipgloss.Color("204"))
234
235	s.MenuItem = lipgloss.NewStyle().
236		PaddingLeft(1).
237		Border(lipgloss.Border{
238			Left: " ",
239		}, false, false, false, true).
240		Height(3)
241
242	s.MenuLastUpdate = lipgloss.NewStyle().
243		Foreground(lipgloss.Color("241")).
244		Align(lipgloss.Right)
245
246	s.Repo.Base = lipgloss.NewStyle()
247
248	s.Repo.Title = lipgloss.NewStyle().
249		Padding(0, 2)
250
251	s.Repo.Command = lipgloss.NewStyle().
252		Foreground(lipgloss.Color("168"))
253
254	s.Repo.Body = lipgloss.NewStyle().
255		Margin(1, 0)
256
257	s.Repo.Header = lipgloss.NewStyle().
258		MaxHeight(2).
259		Border(lipgloss.NormalBorder(), false, false, true, false).
260		BorderForeground(lipgloss.Color("236"))
261
262	s.Repo.HeaderName = lipgloss.NewStyle().
263		Foreground(lipgloss.Color("212")).
264		Bold(true)
265
266	s.Repo.HeaderDesc = lipgloss.NewStyle().
267		Foreground(lipgloss.Color("243"))
268
269	s.Footer = lipgloss.NewStyle().
270		MarginTop(1).
271		Padding(0, 1).
272		Height(1)
273
274	s.Branch = lipgloss.NewStyle().
275		Foreground(lipgloss.Color("203")).
276		Background(lipgloss.Color("236")).
277		Padding(0, 1)
278
279	s.HelpKey = lipgloss.NewStyle().
280		Foreground(lipgloss.Color("241"))
281
282	s.HelpValue = lipgloss.NewStyle().
283		Foreground(lipgloss.Color("239"))
284
285	s.HelpDivider = lipgloss.NewStyle().
286		Foreground(lipgloss.Color("237")).
287		SetString(" • ")
288
289	s.URLStyle = lipgloss.NewStyle().
290		MarginLeft(1).
291		Foreground(lipgloss.Color("168"))
292
293	s.Error = lipgloss.NewStyle().
294		MarginTop(2)
295
296	s.ErrorTitle = lipgloss.NewStyle().
297		Foreground(lipgloss.Color("230")).
298		Background(lipgloss.Color("204")).
299		Bold(true).
300		Padding(0, 1)
301
302	s.ErrorBody = lipgloss.NewStyle().
303		Foreground(lipgloss.Color("252")).
304		MarginLeft(2)
305
306	s.LogItem.Normal.Base = lipgloss.NewStyle().
307		Border(lipgloss.Border{
308			Left: " ",
309		}, false, false, false, true).
310		PaddingLeft(1)
311
312	s.LogItem.Active.Base = s.LogItem.Normal.Base.
313		Border(lipgloss.Border{
314			Left: "┃",
315		}, false, false, false, true).
316		BorderForeground(selectorColor)
317
318	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.
319		Foreground(hashColor)
320
321	s.LogItem.Active.Hash = lipgloss.NewStyle().
322		Bold(true).
323		Foreground(highlightColor)
324
325	s.LogItem.Normal.Title = lipgloss.NewStyle().
326		Foreground(lipgloss.Color("105"))
327
328	s.LogItem.Active.Title = lipgloss.NewStyle().
329		Foreground(highlightColor).
330		Bold(true)
331
332	s.LogItem.Normal.Desc = lipgloss.NewStyle().
333		Foreground(lipgloss.Color("246"))
334
335	s.LogItem.Active.Desc = lipgloss.NewStyle().
336		Foreground(lipgloss.Color("95"))
337
338	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.
339		Foreground(highlightColorDim)
340
341	s.LogItem.Normal.Hash = lipgloss.NewStyle().
342		Foreground(hashColor)
343
344	s.LogItem.Active.Hash = lipgloss.NewStyle().
345		Foreground(highlightColor)
346
347	s.Log.Commit = lipgloss.NewStyle().
348		Margin(0, 2)
349
350	s.Log.CommitHash = lipgloss.NewStyle().
351		Foreground(hashColor).
352		Bold(true)
353
354	s.Log.CommitBody = lipgloss.NewStyle().
355		MarginTop(1).
356		MarginLeft(2)
357
358	s.Log.CommitStatsAdd = lipgloss.NewStyle().
359		Foreground(lipgloss.Color("42")).
360		Bold(true)
361
362	s.Log.CommitStatsDel = lipgloss.NewStyle().
363		Foreground(lipgloss.Color("203")).
364		Bold(true)
365
366	s.Log.Paginator = lipgloss.NewStyle().
367		Margin(0).
368		Align(lipgloss.Center)
369
370	s.Ref.Normal.Item = lipgloss.NewStyle()
371
372	s.Ref.ItemSelector = lipgloss.NewStyle().
373		Foreground(selectorColor).
374		SetString("> ")
375
376	s.Ref.Active.Item = lipgloss.NewStyle().
377		Foreground(highlightColorDim)
378
379	s.Ref.Normal.Base = lipgloss.NewStyle()
380
381	s.Ref.Active.Base = lipgloss.NewStyle()
382
383	s.Ref.Normal.ItemTag = lipgloss.NewStyle().
384		Foreground(lipgloss.Color("39"))
385
386	s.Ref.Active.ItemTag = lipgloss.NewStyle().
387		Bold(true).
388		Foreground(highlightColor)
389
390	s.Ref.Active.Item = lipgloss.NewStyle().
391		Bold(true).
392		Foreground(highlightColor)
393
394	s.Ref.Normal.ItemDesc = lipgloss.NewStyle().
395		Faint(true)
396
397	s.Ref.Active.ItemDesc = lipgloss.NewStyle().
398		Foreground(highlightColor).
399		Faint(true)
400
401	s.Ref.Normal.ItemHash = lipgloss.NewStyle().
402		Foreground(hashColor).
403		Bold(true)
404
405	s.Ref.Active.ItemHash = lipgloss.NewStyle().
406		Foreground(highlightColor).
407		Bold(true)
408
409	s.Ref.Paginator = s.Log.Paginator
410
411	s.Ref.Selector = lipgloss.NewStyle()
412
413	s.Tree.Selector = s.Tree.Normal.FileName.
414		Width(1).
415		Foreground(selectorColor)
416
417	s.Tree.Normal.FileName = lipgloss.NewStyle().
418		MarginLeft(1)
419
420	s.Tree.Active.FileName = s.Tree.Normal.FileName.
421		Bold(true).
422		Foreground(highlightColor)
423
424	s.Tree.Normal.FileDir = lipgloss.NewStyle().
425		Foreground(lipgloss.Color("39"))
426
427	s.Tree.Active.FileDir = lipgloss.NewStyle().
428		Foreground(highlightColor)
429
430	s.Tree.Normal.FileMode = s.Tree.Active.FileName.
431		Width(10).
432		Foreground(lipgloss.Color("243"))
433
434	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.
435		Foreground(highlightColorDim)
436
437	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.
438		Foreground(lipgloss.Color("243"))
439
440	s.Tree.Active.FileSize = s.Tree.Normal.FileName.
441		Foreground(highlightColorDim)
442
443	s.Tree.FileContent = lipgloss.NewStyle()
444
445	s.Tree.Paginator = s.Log.Paginator
446
447	s.Tree.Blame.Hash = lipgloss.NewStyle().
448		Foreground(hashColor).
449		Bold(true)
450
451	s.Tree.Blame.Message = lipgloss.NewStyle()
452
453	s.Tree.Blame.Who = lipgloss.NewStyle().
454		Faint(true)
455
456	s.Spinner = lipgloss.NewStyle().
457		MarginTop(1).
458		MarginLeft(2).
459		Foreground(lipgloss.Color("205"))
460
461	s.SpinnerContainer = lipgloss.NewStyle()
462
463	s.NoContent = lipgloss.NewStyle().
464		MarginTop(1).
465		MarginLeft(2).
466		Foreground(lipgloss.Color("242"))
467
468	s.StatusBar = lipgloss.NewStyle().
469		Height(1)
470
471	s.StatusBarKey = lipgloss.NewStyle().
472		Bold(true).
473		Padding(0, 1).
474		Background(lipgloss.Color("206")).
475		Foreground(lipgloss.Color("228"))
476
477	s.StatusBarValue = lipgloss.NewStyle().
478		Padding(0, 1).
479		Background(lipgloss.Color("235")).
480		Foreground(lipgloss.Color("243"))
481
482	s.StatusBarInfo = lipgloss.NewStyle().
483		Padding(0, 1).
484		Background(lipgloss.Color("212")).
485		Foreground(lipgloss.Color("230"))
486
487	s.StatusBarBranch = lipgloss.NewStyle().
488		Padding(0, 1).
489		Background(lipgloss.Color("62")).
490		Foreground(lipgloss.Color("230"))
491
492	s.StatusBarHelp = lipgloss.NewStyle().
493		Padding(0, 1).
494		Background(lipgloss.Color("237")).
495		Foreground(lipgloss.Color("243"))
496
497	s.Tabs = lipgloss.NewStyle().
498		Height(1)
499
500	s.TabInactive = lipgloss.NewStyle()
501
502	s.TabActive = lipgloss.NewStyle().
503		Underline(true).
504		Foreground(lipgloss.Color("36"))
505
506	s.TabSeparator = lipgloss.NewStyle().
507		SetString("│").
508		Padding(0, 1).
509		Foreground(lipgloss.Color("238"))
510
511	s.Code.LineDigit = lipgloss.NewStyle().Foreground(lipgloss.Color("239"))
512
513	s.Code.LineBar = lipgloss.NewStyle().Foreground(lipgloss.Color("236"))
514
515	s.Stash.Normal.Message = lipgloss.NewStyle().MarginLeft(1)
516
517	s.Stash.Active.Message = s.Stash.Normal.Message.Foreground(selectorColor)
518
519	s.Stash.Title = lipgloss.NewStyle().
520		Foreground(hashColor).
521		Bold(true)
522
523	s.Stash.Selector = lipgloss.NewStyle().
524		Width(1).
525		Foreground(selectorColor)
526
527	return s
528}