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