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