styles.go

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