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