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