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		Foreground(lipgloss.Color("212")).
185		Bold(true)
186
187	s.Repo.HeaderDesc = lipgloss.NewStyle().
188		Foreground(lipgloss.Color("244"))
189
190	s.Footer = lipgloss.NewStyle().
191		MarginTop(1).
192		Padding(0, 1).
193		Height(1)
194
195	s.Branch = lipgloss.NewStyle().
196		Foreground(lipgloss.Color("203")).
197		Background(lipgloss.Color("236")).
198		Padding(0, 1)
199
200	s.HelpKey = lipgloss.NewStyle().
201		Foreground(lipgloss.Color("241"))
202
203	s.HelpValue = lipgloss.NewStyle().
204		Foreground(lipgloss.Color("239"))
205
206	s.HelpDivider = lipgloss.NewStyle().
207		Foreground(lipgloss.Color("237")).
208		SetString(" • ")
209
210	s.Error = lipgloss.NewStyle().
211		MarginTop(2)
212
213	s.ErrorTitle = lipgloss.NewStyle().
214		Foreground(lipgloss.Color("230")).
215		Background(lipgloss.Color("204")).
216		Bold(true).
217		Padding(0, 1)
218
219	s.ErrorBody = lipgloss.NewStyle().
220		Foreground(lipgloss.Color("252")).
221		MarginLeft(2)
222
223	s.AboutNoReadme = lipgloss.NewStyle().
224		MarginTop(1).
225		MarginLeft(2).
226		Foreground(lipgloss.Color("242"))
227
228	s.LogItem.Normal.Base = lipgloss.NewStyle().
229		Border(lipgloss.Border{
230			Left: " ",
231		}, false, false, false, true).
232		PaddingLeft(1)
233
234	s.LogItem.Active.Base = s.LogItem.Normal.Base.Copy().
235		Border(lipgloss.Border{
236			Left: "┃",
237		}, false, false, false, true).
238		BorderForeground(selectorColor)
239
240	s.LogItem.Active.Hash = s.LogItem.Normal.Hash.Copy().
241		Foreground(hashColor)
242
243	s.LogItem.Active.Hash = lipgloss.NewStyle().
244		Bold(true).
245		Foreground(highlightColor)
246
247	s.LogItem.Normal.Title = lipgloss.NewStyle().
248		Foreground(lipgloss.Color("105"))
249
250	s.LogItem.Active.Title = lipgloss.NewStyle().
251		Foreground(highlightColor).
252		Bold(true)
253
254	s.LogItem.Normal.Desc = lipgloss.NewStyle().
255		Foreground(lipgloss.Color("246"))
256
257	s.LogItem.Active.Desc = lipgloss.NewStyle().
258		Foreground(lipgloss.Color("95"))
259
260	s.LogItem.Active.Keyword = s.LogItem.Active.Desc.Copy().
261		Foreground(highlightColorDim)
262
263	s.LogItem.Normal.Hash = lipgloss.NewStyle().
264		Foreground(hashColor)
265
266	s.LogItem.Active.Hash = lipgloss.NewStyle().
267		Foreground(highlightColor)
268
269	s.Log.Commit = lipgloss.NewStyle().
270		Margin(0, 2)
271
272	s.Log.CommitHash = lipgloss.NewStyle().
273		Foreground(hashColor).
274		Bold(true)
275
276	s.Log.CommitBody = lipgloss.NewStyle().
277		MarginTop(1).
278		MarginLeft(2)
279
280	s.Log.CommitStatsAdd = lipgloss.NewStyle().
281		Foreground(lipgloss.Color("42")).
282		Bold(true)
283
284	s.Log.CommitStatsDel = lipgloss.NewStyle().
285		Foreground(lipgloss.Color("203")).
286		Bold(true)
287
288	s.Log.Paginator = lipgloss.NewStyle().
289		Margin(0).
290		Align(lipgloss.Center)
291
292	s.Ref.Normal.Item = lipgloss.NewStyle()
293
294	s.Ref.ItemSelector = lipgloss.NewStyle().
295		Foreground(selectorColor).
296		SetString("> ")
297
298	s.Ref.Active.Item = lipgloss.NewStyle().
299		Foreground(highlightColorDim)
300
301	s.Ref.ItemBranch = lipgloss.NewStyle()
302
303	s.Ref.Normal.ItemTag = lipgloss.NewStyle().
304		Foreground(lipgloss.Color("185"))
305
306	s.Ref.Active.ItemTag = lipgloss.NewStyle().
307		Bold(true).
308		Foreground(highlightColor)
309
310	s.Ref.Active.Item = lipgloss.NewStyle().
311		Bold(true).
312		Foreground(highlightColor)
313
314	s.Ref.Paginator = s.Log.Paginator.Copy()
315
316	s.Tree.Selector = s.Tree.Normal.FileName.Copy().
317		Width(1).
318		Foreground(selectorColor)
319
320	s.Tree.Normal.FileName = lipgloss.NewStyle().
321		MarginLeft(1)
322
323	s.Tree.Active.FileName = s.Tree.Normal.FileName.Copy().
324		Bold(true).
325		Foreground(highlightColor)
326
327	s.Tree.Normal.FileDir = lipgloss.NewStyle().
328		Foreground(lipgloss.Color("39"))
329
330	s.Tree.Active.FileDir = lipgloss.NewStyle().
331		Foreground(highlightColor)
332
333	s.Tree.Normal.FileMode = s.Tree.Active.FileName.Copy().
334		Width(10).
335		Foreground(lipgloss.Color("243"))
336
337	s.Tree.Active.FileMode = s.Tree.Normal.FileMode.Copy().
338		Foreground(highlightColorDim)
339
340	s.Tree.Normal.FileSize = s.Tree.Normal.FileName.Copy().
341		Foreground(lipgloss.Color("243"))
342
343	s.Tree.Active.FileSize = s.Tree.Normal.FileName.Copy().
344		Foreground(highlightColorDim)
345
346	s.Tree.FileContent = lipgloss.NewStyle()
347
348	s.Tree.Paginator = s.Log.Paginator.Copy()
349
350	s.Tree.NoItems = s.AboutNoReadme.Copy()
351
352	s.Spinner = lipgloss.NewStyle().
353		MarginTop(1).
354		MarginLeft(2).
355		Foreground(lipgloss.Color("205"))
356
357	s.CodeNoContent = lipgloss.NewStyle().
358		SetString("No Content.").
359		MarginTop(1).
360		MarginLeft(2).
361		Foreground(lipgloss.Color("242"))
362
363	s.StatusBar = lipgloss.NewStyle().
364		Height(1)
365
366	s.StatusBarKey = lipgloss.NewStyle().
367		Bold(true).
368		Padding(0, 1).
369		Background(lipgloss.Color("206")).
370		Foreground(lipgloss.Color("228"))
371
372	s.StatusBarValue = lipgloss.NewStyle().
373		Padding(0, 1).
374		Background(lipgloss.Color("235")).
375		Foreground(lipgloss.Color("243"))
376
377	s.StatusBarInfo = lipgloss.NewStyle().
378		Padding(0, 1).
379		Background(lipgloss.Color("212")).
380		Foreground(lipgloss.Color("230"))
381
382	s.StatusBarBranch = lipgloss.NewStyle().
383		Padding(0, 1).
384		Background(lipgloss.Color("62")).
385		Foreground(lipgloss.Color("230"))
386
387	s.StatusBarHelp = lipgloss.NewStyle().
388		Padding(0, 1).
389		Background(lipgloss.Color("237")).
390		Foreground(lipgloss.Color("243"))
391
392	s.Tabs = lipgloss.NewStyle()
393
394	s.TabInactive = lipgloss.NewStyle()
395
396	s.TabActive = lipgloss.NewStyle().
397		Bold(true).
398		Foreground(lipgloss.Color("63"))
399
400	s.TabSeparator = lipgloss.NewStyle().
401		SetString("│").
402		Padding(0, 1).
403		Foreground(lipgloss.Color("238"))
404
405	return s
406}