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		ItemSelector    lipgloss.Style
 79		ItemActive      lipgloss.Style
 80		ItemInactive    lipgloss.Style
 81		ItemBranch      lipgloss.Style
 82		ItemTagInactive lipgloss.Style
 83		ItemTagActive   lipgloss.Style
 84		Paginator       lipgloss.Style
 85	}
 86
 87	Tree struct {
 88		ItemSelector     lipgloss.Style
 89		ItemActive       lipgloss.Style
 90		ItemInactive     lipgloss.Style
 91		FileDirInactive  lipgloss.Style
 92		FileDirActive    lipgloss.Style
 93		FileModeInactive lipgloss.Style
 94		FileModeActive   lipgloss.Style
 95		FileSizeInactive lipgloss.Style
 96		FileSizeActive   lipgloss.Style
 97		FileContent      lipgloss.Style
 98		Paginator        lipgloss.Style
 99		NoItems          lipgloss.Style
100	}
101
102	Spinner lipgloss.Style
103
104	CodeNoContent lipgloss.Style
105
106	StatusBar       lipgloss.Style
107	StatusBarKey    lipgloss.Style
108	StatusBarValue  lipgloss.Style
109	StatusBarInfo   lipgloss.Style
110	StatusBarBranch lipgloss.Style
111	StatusBarHelp   lipgloss.Style
112
113	Tabs         lipgloss.Style
114	TabInactive  lipgloss.Style
115	TabActive    lipgloss.Style
116	TabSeparator lipgloss.Style
117}
118
119// DefaultStyles returns default styles for the UI.
120func DefaultStyles() *Styles {
121	highlightColor := lipgloss.Color("210")
122	highlightColorDim := lipgloss.Color("174")
123	selectorColor := lipgloss.Color("167")
124	hashColor := lipgloss.Color("184")
125
126	s := new(Styles)
127
128	s.ActiveBorderColor = lipgloss.Color("62")
129	s.InactiveBorderColor = lipgloss.Color("241")
130
131	s.App = lipgloss.NewStyle().
132		Margin(1, 2)
133
134	s.Header = lipgloss.NewStyle().
135		Align(lipgloss.Left).
136		Height(1).
137		PaddingLeft(1).
138		MarginBottom(1).
139		Bold(true)
140
141	s.Menu = lipgloss.NewStyle().
142		BorderStyle(lipgloss.RoundedBorder()).
143		BorderForeground(s.InactiveBorderColor).
144		Padding(1, 2).
145		MarginRight(1).
146		Width(24)
147
148	s.MenuCursor = lipgloss.NewStyle().
149		Foreground(lipgloss.Color("213")).
150		SetString(">")
151
152	s.MenuItem = lipgloss.NewStyle().
153		PaddingLeft(1).
154		Border(lipgloss.Border{
155			Left: " ",
156		}, false, false, false, true).
157		Height(3)
158
159	s.MenuLastUpdate = lipgloss.NewStyle().
160		Foreground(lipgloss.Color("241")).
161		Align(lipgloss.Right)
162
163	s.SelectorBox = lipgloss.NewStyle()
164
165	s.ReadmeBox = lipgloss.NewStyle()
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.ItemInactive = lipgloss.NewStyle()
292
293	s.Ref.ItemSelector = lipgloss.NewStyle().
294		Foreground(selectorColor).
295		SetString("> ")
296
297	s.Ref.ItemActive = s.Ref.ItemActive.Copy().
298		Foreground(highlightColorDim)
299
300	s.Ref.ItemBranch = lipgloss.NewStyle()
301
302	s.Ref.ItemTagInactive = lipgloss.NewStyle().
303		Foreground(lipgloss.Color("185"))
304
305	s.Ref.ItemTagActive = lipgloss.NewStyle().
306		Bold(true).
307		Foreground(highlightColor)
308
309	s.Ref.ItemActive = lipgloss.NewStyle().
310		Bold(true).
311		Foreground(highlightColor)
312
313	s.Ref.Paginator = s.Log.Paginator.Copy()
314
315	s.Tree.ItemSelector = s.Tree.ItemInactive.Copy().
316		Width(1).
317		Foreground(selectorColor)
318
319	s.Tree.ItemInactive = lipgloss.NewStyle().
320		MarginLeft(1)
321
322	s.Tree.ItemActive = s.Tree.ItemInactive.Copy().
323		Bold(true).
324		Foreground(highlightColor)
325
326	s.Tree.FileDirInactive = lipgloss.NewStyle().
327		Foreground(lipgloss.Color("39"))
328
329	s.Tree.FileDirActive = lipgloss.NewStyle().
330		Foreground(highlightColor)
331
332	s.Tree.FileModeInactive = s.Tree.ItemInactive.Copy().
333		Width(10).
334		Foreground(lipgloss.Color("243"))
335
336	s.Tree.FileModeActive = s.Tree.FileModeInactive.Copy().
337		Foreground(highlightColorDim)
338
339	s.Tree.FileSizeInactive = s.Tree.ItemInactive.Copy().
340		Foreground(lipgloss.Color("243"))
341
342	s.Tree.FileSizeActive = s.Tree.ItemInactive.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		Foreground(lipgloss.Color("63")).
397		Underline(true)
398
399	s.TabSeparator = lipgloss.NewStyle().
400		SetString("│").
401		Padding(0, 1).
402		Foreground(lipgloss.Color("238"))
403
404	return s
405}