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	Header lipgloss.Style
 17
 18	Menu           lipgloss.Style
 19	MenuCursor     lipgloss.Style
 20	MenuItem       lipgloss.Style
 21	MenuLastUpdate lipgloss.Style
 22
 23	// Selection page styles
 24	SelectorBox lipgloss.Style
 25	ReadmeBox   lipgloss.Style
 26
 27	Repo struct {
 28		Base       lipgloss.Style
 29		Title      lipgloss.Style
 30		Command    lipgloss.Style
 31		Body       lipgloss.Style
 32		Header     lipgloss.Style
 33		HeaderName lipgloss.Style
 34		HeaderDesc lipgloss.Style
 35	}
 36
 37	Footer      lipgloss.Style
 38	Branch      lipgloss.Style
 39	HelpKey     lipgloss.Style
 40	HelpValue   lipgloss.Style
 41	HelpDivider lipgloss.Style
 42
 43	Error      lipgloss.Style
 44	ErrorTitle lipgloss.Style
 45	ErrorBody  lipgloss.Style
 46
 47	AboutNoReadme lipgloss.Style
 48
 49	LogItem struct {
 50		Normal struct {
 51			Base    lipgloss.Style
 52			Hash    lipgloss.Style
 53			Title   lipgloss.Style
 54			Desc    lipgloss.Style
 55			Keyword lipgloss.Style
 56		}
 57		Active struct {
 58			Base    lipgloss.Style
 59			Hash    lipgloss.Style
 60			Title   lipgloss.Style
 61			Desc    lipgloss.Style
 62			Keyword lipgloss.Style
 63		}
 64	}
 65
 66	Log struct {
 67		Commit         lipgloss.Style
 68		CommitHash     lipgloss.Style
 69		CommitAuthor   lipgloss.Style
 70		CommitDate     lipgloss.Style
 71		CommitBody     lipgloss.Style
 72		CommitStatsAdd lipgloss.Style
 73		CommitStatsDel lipgloss.Style
 74		Paginator      lipgloss.Style
 75	}
 76
 77	Ref struct {
 78		Normal struct {
 79			Item    lipgloss.Style
 80			ItemTag lipgloss.Style
 81		}
 82		Active struct {
 83			Item    lipgloss.Style
 84			ItemTag lipgloss.Style
 85		}
 86		ItemSelector lipgloss.Style
 87		ItemBranch   lipgloss.Style
 88		Paginator    lipgloss.Style
 89	}
 90
 91	Tree struct {
 92		Normal struct {
 93			FileName lipgloss.Style
 94			FileDir  lipgloss.Style
 95			FileMode lipgloss.Style
 96			FileSize lipgloss.Style
 97		}
 98		Active struct {
 99			FileName lipgloss.Style
100			FileDir  lipgloss.Style
101			FileMode lipgloss.Style
102			FileSize lipgloss.Style
103		}
104		Selector    lipgloss.Style
105		FileContent lipgloss.Style
106		Paginator   lipgloss.Style
107		NoItems     lipgloss.Style
108	}
109
110	Spinner lipgloss.Style
111
112	CodeNoContent lipgloss.Style
113
114	StatusBar       lipgloss.Style
115	StatusBarKey    lipgloss.Style
116	StatusBarValue  lipgloss.Style
117	StatusBarInfo   lipgloss.Style
118	StatusBarBranch lipgloss.Style
119	StatusBarHelp   lipgloss.Style
120
121	Tabs         lipgloss.Style
122	TabInactive  lipgloss.Style
123	TabActive    lipgloss.Style
124	TabSeparator lipgloss.Style
125}
126
127// DefaultStyles returns default styles for the UI.
128func DefaultStyles() *Styles {
129	highlightColor := lipgloss.Color("210")
130	highlightColorDim := lipgloss.Color("174")
131	selectorColor := lipgloss.Color("167")
132	hashColor := lipgloss.Color("184")
133
134	s := new(Styles)
135
136	s.ActiveBorderColor = lipgloss.Color("62")
137	s.InactiveBorderColor = lipgloss.Color("241")
138
139	s.App = lipgloss.NewStyle().
140		Margin(1, 2)
141
142	s.Header = lipgloss.NewStyle().
143		Align(lipgloss.Left).
144		Height(1).
145		PaddingLeft(1).
146		MarginBottom(1).
147		Bold(true)
148
149	s.Menu = lipgloss.NewStyle().
150		BorderStyle(lipgloss.RoundedBorder()).
151		BorderForeground(s.InactiveBorderColor).
152		Padding(1, 2).
153		MarginRight(1).
154		Width(24)
155
156	s.MenuCursor = lipgloss.NewStyle().
157		Foreground(lipgloss.Color("213")).
158		SetString(">")
159
160	s.MenuItem = lipgloss.NewStyle().
161		PaddingLeft(1).
162		Border(lipgloss.Border{
163			Left: " ",
164		}, false, false, false, true).
165		Height(3)
166
167	s.MenuLastUpdate = lipgloss.NewStyle().
168		Foreground(lipgloss.Color("241")).
169		Align(lipgloss.Right)
170
171	s.SelectorBox = lipgloss.NewStyle()
172
173	s.ReadmeBox = lipgloss.NewStyle()
174
175	s.Repo.Base = lipgloss.NewStyle()
176
177	s.Repo.Title = lipgloss.NewStyle().
178		Padding(0, 2)
179
180	s.Repo.Command = lipgloss.NewStyle().
181		Foreground(lipgloss.Color("168"))
182
183	s.Repo.Body = lipgloss.NewStyle().
184		Margin(1, 0)
185
186	s.Repo.Header = lipgloss.NewStyle().
187		Height(2).
188		Border(lipgloss.NormalBorder(), false, false, true, false).
189		BorderForeground(lipgloss.Color("238"))
190
191	s.Repo.HeaderName = lipgloss.NewStyle().
192		Bold(true)
193
194	s.Repo.HeaderDesc = lipgloss.NewStyle().
195		Faint(true)
196
197	s.Footer = lipgloss.NewStyle().
198		MarginTop(1).
199		Padding(0, 1).
200		Height(1)
201
202	s.Branch = lipgloss.NewStyle().
203		Foreground(lipgloss.Color("203")).
204		Background(lipgloss.Color("236")).
205		Padding(0, 1)
206
207	s.HelpKey = lipgloss.NewStyle().
208		Foreground(lipgloss.Color("241"))
209
210	s.HelpValue = lipgloss.NewStyle().
211		Foreground(lipgloss.Color("239"))
212
213	s.HelpDivider = lipgloss.NewStyle().
214		Foreground(lipgloss.Color("237")).
215		SetString(" • ")
216
217	s.Error = lipgloss.NewStyle().
218		MarginTop(2)
219
220	s.ErrorTitle = lipgloss.NewStyle().
221		Foreground(lipgloss.Color("230")).
222		Background(lipgloss.Color("204")).
223		Bold(true).
224		Padding(0, 1)
225
226	s.ErrorBody = lipgloss.NewStyle().
227		Foreground(lipgloss.Color("252")).
228		MarginLeft(2)
229
230	s.AboutNoReadme = lipgloss.NewStyle().
231		MarginTop(1).
232		MarginLeft(2).
233		Foreground(lipgloss.Color("242"))
234
235	s.LogItem.Normal.Base = lipgloss.NewStyle().
236		Border(lipgloss.Border{
237			Left: " ",
238		}, false, false, false, true).
239		PaddingLeft(1)
240
241	s.LogItem.Active.Base = s.LogItem.Normal.Base.Copy().
242		Border(lipgloss.Border{
243			Left: "┃",
244		}, false, false, false, true).
245		BorderForeground(selectorColor)
246
247	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.Copy().
248		Foreground(hashColor)
249
250	s.LogItem.Active.Hash = lipgloss.NewStyle().
251		Bold(true).
252		Foreground(highlightColor)
253
254	s.LogItem.Normal.Title = lipgloss.NewStyle().
255		Foreground(lipgloss.Color("105"))
256
257	s.LogItem.Active.Title = lipgloss.NewStyle().
258		Foreground(highlightColor).
259		Bold(true)
260
261	s.LogItem.Normal.Desc = lipgloss.NewStyle().
262		Foreground(lipgloss.Color("246"))
263
264	s.LogItem.Active.Desc = lipgloss.NewStyle().
265		Foreground(lipgloss.Color("95"))
266
267	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.Copy().
268		Foreground(highlightColorDim)
269
270	s.LogItem.Normal.Hash = lipgloss.NewStyle().
271		Foreground(hashColor)
272
273	s.LogItem.Active.Hash = lipgloss.NewStyle().
274		Foreground(highlightColor)
275
276	s.Log.Commit = lipgloss.NewStyle().
277		Margin(0, 2)
278
279	s.Log.CommitHash = lipgloss.NewStyle().
280		Foreground(hashColor).
281		Bold(true)
282
283	s.Log.CommitBody = lipgloss.NewStyle().
284		MarginTop(1).
285		MarginLeft(2)
286
287	s.Log.CommitStatsAdd = lipgloss.NewStyle().
288		Foreground(lipgloss.Color("42")).
289		Bold(true)
290
291	s.Log.CommitStatsDel = lipgloss.NewStyle().
292		Foreground(lipgloss.Color("203")).
293		Bold(true)
294
295	s.Log.Paginator = lipgloss.NewStyle().
296		Margin(0).
297		Align(lipgloss.Center)
298
299	s.Ref.Normal.Item = lipgloss.NewStyle()
300
301	s.Ref.ItemSelector = lipgloss.NewStyle().
302		Foreground(selectorColor).
303		SetString("> ")
304
305	s.Ref.Active.Item = lipgloss.NewStyle().
306		Foreground(highlightColorDim)
307
308	s.Ref.ItemBranch = lipgloss.NewStyle()
309
310	s.Ref.Normal.ItemTag = lipgloss.NewStyle().
311		Foreground(lipgloss.Color("185"))
312
313	s.Ref.Active.ItemTag = lipgloss.NewStyle().
314		Bold(true).
315		Foreground(highlightColor)
316
317	s.Ref.Active.Item = lipgloss.NewStyle().
318		Bold(true).
319		Foreground(highlightColor)
320
321	s.Ref.Paginator = s.Log.Paginator.Copy()
322
323	s.Tree.Selector = s.Tree.Normal.FileName.Copy().
324		Width(1).
325		Foreground(selectorColor)
326
327	s.Tree.Normal.FileName = lipgloss.NewStyle().
328		MarginLeft(1)
329
330	s.Tree.Active.FileName = s.Tree.Normal.FileName.Copy().
331		Bold(true).
332		Foreground(highlightColor)
333
334	s.Tree.Normal.FileDir = lipgloss.NewStyle().
335		Foreground(lipgloss.Color("39"))
336
337	s.Tree.Active.FileDir = lipgloss.NewStyle().
338		Foreground(highlightColor)
339
340	s.Tree.Normal.FileMode = s.Tree.Active.FileName.Copy().
341		Width(10).
342		Foreground(lipgloss.Color("243"))
343
344	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.Copy().
345		Foreground(highlightColorDim)
346
347	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.Copy().
348		Foreground(lipgloss.Color("243"))
349
350	s.Tree.Active.FileSize = s.Tree.Normal.FileName.Copy().
351		Foreground(highlightColorDim)
352
353	s.Tree.FileContent = lipgloss.NewStyle()
354
355	s.Tree.Paginator = s.Log.Paginator.Copy()
356
357	s.Tree.NoItems = s.AboutNoReadme.Copy()
358
359	s.Spinner = lipgloss.NewStyle().
360		MarginTop(1).
361		MarginLeft(2).
362		Foreground(lipgloss.Color("205"))
363
364	s.CodeNoContent = lipgloss.NewStyle().
365		SetString("No Content.").
366		MarginTop(1).
367		MarginLeft(2).
368		Foreground(lipgloss.Color("242"))
369
370	s.StatusBar = lipgloss.NewStyle().
371		Height(1)
372
373	s.StatusBarKey = lipgloss.NewStyle().
374		Bold(true).
375		Padding(0, 1).
376		Background(lipgloss.Color("206")).
377		Foreground(lipgloss.Color("228"))
378
379	s.StatusBarValue = lipgloss.NewStyle().
380		Padding(0, 1).
381		Background(lipgloss.Color("235")).
382		Foreground(lipgloss.Color("243"))
383
384	s.StatusBarInfo = lipgloss.NewStyle().
385		Padding(0, 1).
386		Background(lipgloss.Color("212")).
387		Foreground(lipgloss.Color("230"))
388
389	s.StatusBarBranch = lipgloss.NewStyle().
390		Padding(0, 1).
391		Background(lipgloss.Color("62")).
392		Foreground(lipgloss.Color("230"))
393
394	s.StatusBarHelp = lipgloss.NewStyle().
395		Padding(0, 1).
396		Background(lipgloss.Color("237")).
397		Foreground(lipgloss.Color("243"))
398
399	s.Tabs = lipgloss.NewStyle()
400
401	s.TabInactive = lipgloss.NewStyle()
402
403	s.TabActive = lipgloss.NewStyle().
404		Bold(true).
405		Foreground(lipgloss.Color("63"))
406
407	s.TabSeparator = lipgloss.NewStyle().
408		SetString("│").
409		Padding(0, 1).
410		Foreground(lipgloss.Color("238"))
411
412	return s
413}