styles.go

  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("185")
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		Foreground(lipgloss.Color("243"))
189
190	s.RepoSelector.Active.Base = s.RepoSelector.Normal.Base.Copy().
191		BorderStyle(lipgloss.Border{Left: "┃"}).
192		BorderForeground(lipgloss.Color("212"))
193
194	s.RepoSelector.Active.Title = s.RepoSelector.Normal.Title.Copy().
195		Foreground(lipgloss.Color("212")).
196		Bold(true)
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.Error = lipgloss.NewStyle().
262		MarginTop(2)
263
264	s.ErrorTitle = lipgloss.NewStyle().
265		Foreground(lipgloss.Color("230")).
266		Background(lipgloss.Color("204")).
267		Bold(true).
268		Padding(0, 1)
269
270	s.ErrorBody = lipgloss.NewStyle().
271		Foreground(lipgloss.Color("252")).
272		MarginLeft(2)
273
274	s.AboutNoReadme = lipgloss.NewStyle().
275		MarginTop(1).
276		MarginLeft(2).
277		Foreground(lipgloss.Color("242"))
278
279	s.LogItem.Normal.Base = lipgloss.NewStyle().
280		Border(lipgloss.Border{
281			Left: " ",
282		}, false, false, false, true).
283		PaddingLeft(1)
284
285	s.LogItem.Active.Base = s.LogItem.Normal.Base.Copy().
286		Border(lipgloss.Border{
287			Left: "┃",
288		}, false, false, false, true).
289		BorderForeground(selectorColor)
290
291	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.Copy().
292		Foreground(hashColor)
293
294	s.LogItem.Active.Hash = lipgloss.NewStyle().
295		Bold(true).
296		Foreground(highlightColor)
297
298	s.LogItem.Normal.Title = lipgloss.NewStyle().
299		Foreground(lipgloss.Color("105"))
300
301	s.LogItem.Active.Title = lipgloss.NewStyle().
302		Foreground(highlightColor).
303		Bold(true)
304
305	s.LogItem.Normal.Desc = lipgloss.NewStyle().
306		Foreground(lipgloss.Color("246"))
307
308	s.LogItem.Active.Desc = lipgloss.NewStyle().
309		Foreground(lipgloss.Color("95"))
310
311	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.Copy().
312		Foreground(highlightColorDim)
313
314	s.LogItem.Normal.Hash = lipgloss.NewStyle().
315		Foreground(hashColor)
316
317	s.LogItem.Active.Hash = lipgloss.NewStyle().
318		Foreground(highlightColor)
319
320	s.Log.Commit = lipgloss.NewStyle().
321		Margin(0, 2)
322
323	s.Log.CommitHash = lipgloss.NewStyle().
324		Foreground(hashColor).
325		Bold(true)
326
327	s.Log.CommitBody = lipgloss.NewStyle().
328		MarginTop(1).
329		MarginLeft(2)
330
331	s.Log.CommitStatsAdd = lipgloss.NewStyle().
332		Foreground(lipgloss.Color("42")).
333		Bold(true)
334
335	s.Log.CommitStatsDel = lipgloss.NewStyle().
336		Foreground(lipgloss.Color("203")).
337		Bold(true)
338
339	s.Log.Paginator = lipgloss.NewStyle().
340		Margin(0).
341		Align(lipgloss.Center)
342
343	s.Ref.Normal.Item = lipgloss.NewStyle()
344
345	s.Ref.ItemSelector = lipgloss.NewStyle().
346		Foreground(selectorColor).
347		SetString("> ")
348
349	s.Ref.Active.Item = lipgloss.NewStyle().
350		Foreground(highlightColorDim)
351
352	s.Ref.ItemBranch = lipgloss.NewStyle()
353
354	s.Ref.Normal.ItemTag = lipgloss.NewStyle().
355		Foreground(lipgloss.Color("39"))
356
357	s.Ref.Active.ItemTag = lipgloss.NewStyle().
358		Bold(true).
359		Foreground(highlightColor)
360
361	s.Ref.Active.Item = lipgloss.NewStyle().
362		Bold(true).
363		Foreground(highlightColor)
364
365	s.Ref.Paginator = s.Log.Paginator.Copy()
366
367	s.Tree.Selector = s.Tree.Normal.FileName.Copy().
368		Width(1).
369		Foreground(selectorColor)
370
371	s.Tree.Normal.FileName = lipgloss.NewStyle().
372		MarginLeft(1)
373
374	s.Tree.Active.FileName = s.Tree.Normal.FileName.Copy().
375		Bold(true).
376		Foreground(highlightColor)
377
378	s.Tree.Normal.FileDir = lipgloss.NewStyle().
379		Foreground(lipgloss.Color("39"))
380
381	s.Tree.Active.FileDir = lipgloss.NewStyle().
382		Foreground(highlightColor)
383
384	s.Tree.Normal.FileMode = s.Tree.Active.FileName.Copy().
385		Width(10).
386		Foreground(lipgloss.Color("243"))
387
388	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.Copy().
389		Foreground(highlightColorDim)
390
391	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.Copy().
392		Foreground(lipgloss.Color("243"))
393
394	s.Tree.Active.FileSize = s.Tree.Normal.FileName.Copy().
395		Foreground(highlightColorDim)
396
397	s.Tree.FileContent = lipgloss.NewStyle()
398
399	s.Tree.Paginator = s.Log.Paginator.Copy()
400
401	s.Tree.NoItems = s.AboutNoReadme.Copy()
402
403	s.Spinner = lipgloss.NewStyle().
404		MarginTop(1).
405		MarginLeft(2).
406		Foreground(lipgloss.Color("205"))
407
408	s.CodeNoContent = lipgloss.NewStyle().
409		SetString("No Content.").
410		MarginTop(1).
411		MarginLeft(2).
412		Foreground(lipgloss.Color("242"))
413
414	s.StatusBar = lipgloss.NewStyle().
415		Height(1)
416
417	s.StatusBarKey = lipgloss.NewStyle().
418		Bold(true).
419		Padding(0, 1).
420		Background(lipgloss.Color("206")).
421		Foreground(lipgloss.Color("228"))
422
423	s.StatusBarValue = lipgloss.NewStyle().
424		Padding(0, 1).
425		Background(lipgloss.Color("235")).
426		Foreground(lipgloss.Color("243"))
427
428	s.StatusBarInfo = lipgloss.NewStyle().
429		Padding(0, 1).
430		Background(lipgloss.Color("212")).
431		Foreground(lipgloss.Color("230"))
432
433	s.StatusBarBranch = lipgloss.NewStyle().
434		Padding(0, 1).
435		Background(lipgloss.Color("62")).
436		Foreground(lipgloss.Color("230"))
437
438	s.StatusBarHelp = lipgloss.NewStyle().
439		Padding(0, 1).
440		Background(lipgloss.Color("237")).
441		Foreground(lipgloss.Color("243"))
442
443	s.Tabs = lipgloss.NewStyle()
444
445	s.TabInactive = lipgloss.NewStyle()
446
447	s.TabActive = lipgloss.NewStyle().
448		Underline(true).
449		Foreground(lipgloss.Color("35"))
450
451	s.TabSeparator = lipgloss.NewStyle().
452		SetString("│").
453		Padding(0, 1).
454		Foreground(lipgloss.Color("238"))
455
456	return s
457}