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