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 URLStyle lipgloss.Style
57
58 Error lipgloss.Style
59 ErrorTitle lipgloss.Style
60 ErrorBody lipgloss.Style
61
62 LogItem struct {
63 Normal struct {
64 Base lipgloss.Style
65 Hash lipgloss.Style
66 Title lipgloss.Style
67 Desc lipgloss.Style
68 Keyword lipgloss.Style
69 }
70 Active struct {
71 Base lipgloss.Style
72 Hash lipgloss.Style
73 Title lipgloss.Style
74 Desc lipgloss.Style
75 Keyword lipgloss.Style
76 }
77 }
78
79 Log struct {
80 Commit lipgloss.Style
81 CommitHash lipgloss.Style
82 CommitAuthor lipgloss.Style
83 CommitDate lipgloss.Style
84 CommitBody lipgloss.Style
85 CommitStatsAdd lipgloss.Style
86 CommitStatsDel lipgloss.Style
87 Paginator lipgloss.Style
88 }
89
90 Ref struct {
91 Normal struct {
92 Base lipgloss.Style
93 Item lipgloss.Style
94 ItemTag lipgloss.Style
95 ItemDesc lipgloss.Style
96 ItemHash lipgloss.Style
97 }
98 Active struct {
99 Base lipgloss.Style
100 Item lipgloss.Style
101 ItemTag lipgloss.Style
102 ItemDesc lipgloss.Style
103 ItemHash lipgloss.Style
104 }
105 ItemSelector lipgloss.Style
106 Paginator lipgloss.Style
107 Selector lipgloss.Style
108 }
109
110 Tree struct {
111 Normal struct {
112 FileName lipgloss.Style
113 FileDir lipgloss.Style
114 FileMode lipgloss.Style
115 FileSize lipgloss.Style
116 }
117 Active struct {
118 FileName lipgloss.Style
119 FileDir lipgloss.Style
120 FileMode lipgloss.Style
121 FileSize lipgloss.Style
122 }
123 Selector lipgloss.Style
124 FileContent lipgloss.Style
125 Paginator lipgloss.Style
126 Blame struct {
127 Hash lipgloss.Style
128 Message lipgloss.Style
129 Who lipgloss.Style
130 }
131 }
132
133 Stash struct {
134 Normal struct {
135 Message lipgloss.Style
136 }
137 Active struct {
138 Message lipgloss.Style
139 }
140 Title lipgloss.Style
141 Selector lipgloss.Style
142 }
143
144 Spinner lipgloss.Style
145 SpinnerContainer lipgloss.Style
146
147 NoContent lipgloss.Style
148
149 StatusBar lipgloss.Style
150 StatusBarKey lipgloss.Style
151 StatusBarValue lipgloss.Style
152 StatusBarInfo lipgloss.Style
153 StatusBarBranch lipgloss.Style
154 StatusBarHelp lipgloss.Style
155
156 Tabs lipgloss.Style
157 TabInactive lipgloss.Style
158 TabActive lipgloss.Style
159 TabSeparator lipgloss.Style
160
161 Code struct {
162 LineDigit lipgloss.Style
163 LineBar lipgloss.Style
164 }
165}
166
167// DefaultStyles returns default styles for the UI.
168func DefaultStyles(r *lipgloss.Renderer) *Styles {
169 highlightColor := lipgloss.Color("210")
170 highlightColorDim := lipgloss.Color("174")
171 selectorColor := lipgloss.Color("167")
172 hashColor := lipgloss.Color("185")
173
174 s := new(Styles)
175
176 s.ActiveBorderColor = lipgloss.Color("62")
177 s.InactiveBorderColor = lipgloss.Color("241")
178
179 s.App = r.NewStyle().
180 Margin(1, 2)
181
182 s.ServerName = r.NewStyle().
183 Height(1).
184 MarginLeft(1).
185 MarginBottom(1).
186 Padding(0, 1).
187 Background(lipgloss.Color("57")).
188 Foreground(lipgloss.Color("229")).
189 Bold(true)
190
191 s.TopLevelNormalTab = r.NewStyle().
192 MarginRight(2)
193
194 s.TopLevelActiveTab = s.TopLevelNormalTab.
195 Foreground(lipgloss.Color("36"))
196
197 s.TopLevelActiveTabDot = r.NewStyle().
198 Foreground(lipgloss.Color("36"))
199
200 s.RepoSelector.Normal.Base = r.NewStyle().
201 PaddingLeft(1).
202 Border(lipgloss.Border{Left: " "}, false, false, false, true).
203 Height(3)
204
205 s.RepoSelector.Normal.Title = r.NewStyle().Bold(true)
206
207 s.RepoSelector.Normal.Desc = r.NewStyle().
208 Foreground(lipgloss.Color("243"))
209
210 s.RepoSelector.Normal.Command = r.NewStyle().
211 Foreground(lipgloss.Color("132"))
212
213 s.RepoSelector.Normal.Updated = r.NewStyle().
214 Foreground(lipgloss.Color("243"))
215
216 s.RepoSelector.Active.Base = s.RepoSelector.Normal.Base.
217 BorderStyle(lipgloss.Border{Left: "┃"}).
218 BorderForeground(lipgloss.Color("176"))
219
220 s.RepoSelector.Active.Title = s.RepoSelector.Normal.Title.
221 Foreground(lipgloss.Color("212"))
222
223 s.RepoSelector.Active.Desc = s.RepoSelector.Normal.Desc.
224 Foreground(lipgloss.Color("246"))
225
226 s.RepoSelector.Active.Updated = s.RepoSelector.Normal.Updated.
227 Foreground(lipgloss.Color("212"))
228
229 s.RepoSelector.Active.Command = s.RepoSelector.Normal.Command.
230 Foreground(lipgloss.Color("204"))
231
232 s.MenuItem = r.NewStyle().
233 PaddingLeft(1).
234 Border(lipgloss.Border{
235 Left: " ",
236 }, false, false, false, true).
237 Height(3)
238
239 s.MenuLastUpdate = r.NewStyle().
240 Foreground(lipgloss.Color("241")).
241 Align(lipgloss.Right)
242
243 s.Repo.Base = r.NewStyle()
244
245 s.Repo.Title = r.NewStyle().
246 Padding(0, 2)
247
248 s.Repo.Command = r.NewStyle().
249 Foreground(lipgloss.Color("168"))
250
251 s.Repo.Body = r.NewStyle().
252 Margin(1, 0)
253
254 s.Repo.Header = r.NewStyle().
255 MaxHeight(2).
256 Border(lipgloss.NormalBorder(), false, false, true, false).
257 BorderForeground(lipgloss.Color("236"))
258
259 s.Repo.HeaderName = r.NewStyle().
260 Foreground(lipgloss.Color("212")).
261 Bold(true)
262
263 s.Repo.HeaderDesc = r.NewStyle().
264 Foreground(lipgloss.Color("243"))
265
266 s.Footer = r.NewStyle().
267 MarginTop(1).
268 Padding(0, 1).
269 Height(1)
270
271 s.Branch = r.NewStyle().
272 Foreground(lipgloss.Color("203")).
273 Background(lipgloss.Color("236")).
274 Padding(0, 1)
275
276 s.HelpKey = r.NewStyle().
277 Foreground(lipgloss.Color("241"))
278
279 s.HelpValue = r.NewStyle().
280 Foreground(lipgloss.Color("239"))
281
282 s.HelpDivider = r.NewStyle().
283 Foreground(lipgloss.Color("237")).
284 SetString(" • ")
285
286 s.URLStyle = r.NewStyle().
287 MarginLeft(1).
288 Foreground(lipgloss.Color("168"))
289
290 s.Error = r.NewStyle().
291 MarginTop(2)
292
293 s.ErrorTitle = r.NewStyle().
294 Foreground(lipgloss.Color("230")).
295 Background(lipgloss.Color("204")).
296 Bold(true).
297 Padding(0, 1)
298
299 s.ErrorBody = r.NewStyle().
300 Foreground(lipgloss.Color("252")).
301 MarginLeft(2)
302
303 s.LogItem.Normal.Base = r.NewStyle().
304 Border(lipgloss.Border{
305 Left: " ",
306 }, false, false, false, true).
307 PaddingLeft(1)
308
309 s.LogItem.Active.Base = s.LogItem.Normal.Base.
310 Border(lipgloss.Border{
311 Left: "┃",
312 }, false, false, false, true).
313 BorderForeground(selectorColor)
314
315 s.LogItem.Active.Hash = s.LogItem.Normal.Hash.
316 Foreground(hashColor)
317
318 s.LogItem.Active.Hash = r.NewStyle().
319 Bold(true).
320 Foreground(highlightColor)
321
322 s.LogItem.Normal.Title = r.NewStyle().
323 Foreground(lipgloss.Color("105"))
324
325 s.LogItem.Active.Title = r.NewStyle().
326 Foreground(highlightColor).
327 Bold(true)
328
329 s.LogItem.Normal.Desc = r.NewStyle().
330 Foreground(lipgloss.Color("246"))
331
332 s.LogItem.Active.Desc = r.NewStyle().
333 Foreground(lipgloss.Color("95"))
334
335 s.LogItem.Active.Keyword = s.LogItem.Active.Desc.
336 Foreground(highlightColorDim)
337
338 s.LogItem.Normal.Hash = r.NewStyle().
339 Foreground(hashColor)
340
341 s.LogItem.Active.Hash = r.NewStyle().
342 Foreground(highlightColor)
343
344 s.Log.Commit = r.NewStyle().
345 Margin(0, 2)
346
347 s.Log.CommitHash = r.NewStyle().
348 Foreground(hashColor).
349 Bold(true)
350
351 s.Log.CommitBody = r.NewStyle().
352 MarginTop(1).
353 MarginLeft(2)
354
355 s.Log.CommitStatsAdd = r.NewStyle().
356 Foreground(lipgloss.Color("42")).
357 Bold(true)
358
359 s.Log.CommitStatsDel = r.NewStyle().
360 Foreground(lipgloss.Color("203")).
361 Bold(true)
362
363 s.Log.Paginator = r.NewStyle().
364 Margin(0).
365 Align(lipgloss.Center)
366
367 s.Ref.Normal.Item = r.NewStyle()
368
369 s.Ref.ItemSelector = r.NewStyle().
370 Foreground(selectorColor).
371 SetString("> ")
372
373 s.Ref.Active.Item = r.NewStyle().
374 Foreground(highlightColorDim)
375
376 s.Ref.Normal.Base = r.NewStyle()
377
378 s.Ref.Active.Base = r.NewStyle()
379
380 s.Ref.Normal.ItemTag = r.NewStyle().
381 Foreground(lipgloss.Color("39"))
382
383 s.Ref.Active.ItemTag = r.NewStyle().
384 Bold(true).
385 Foreground(highlightColor)
386
387 s.Ref.Active.Item = r.NewStyle().
388 Bold(true).
389 Foreground(highlightColor)
390
391 s.Ref.Normal.ItemDesc = r.NewStyle().
392 Faint(true)
393
394 s.Ref.Active.ItemDesc = r.NewStyle().
395 Foreground(highlightColor).
396 Faint(true)
397
398 s.Ref.Normal.ItemHash = r.NewStyle().
399 Foreground(hashColor).
400 Bold(true)
401
402 s.Ref.Active.ItemHash = r.NewStyle().
403 Foreground(highlightColor).
404 Bold(true)
405
406 s.Ref.Paginator = s.Log.Paginator
407
408 s.Ref.Selector = r.NewStyle()
409
410 s.Tree.Selector = s.Tree.Normal.FileName.
411 Width(1).
412 Foreground(selectorColor)
413
414 s.Tree.Normal.FileName = r.NewStyle().
415 MarginLeft(1)
416
417 s.Tree.Active.FileName = s.Tree.Normal.FileName.
418 Bold(true).
419 Foreground(highlightColor)
420
421 s.Tree.Normal.FileDir = r.NewStyle().
422 Foreground(lipgloss.Color("39"))
423
424 s.Tree.Active.FileDir = r.NewStyle().
425 Foreground(highlightColor)
426
427 s.Tree.Normal.FileMode = s.Tree.Active.FileName.
428 Width(10).
429 Foreground(lipgloss.Color("243"))
430
431 s.Tree.Active.FileMode = s.Tree.Normal.FileMode.
432 Foreground(highlightColorDim)
433
434 s.Tree.Normal.FileSize = s.Tree.Normal.FileName.
435 Foreground(lipgloss.Color("243"))
436
437 s.Tree.Active.FileSize = s.Tree.Normal.FileName.
438 Foreground(highlightColorDim)
439
440 s.Tree.FileContent = r.NewStyle()
441
442 s.Tree.Paginator = s.Log.Paginator
443
444 s.Tree.Blame.Hash = r.NewStyle().
445 Foreground(hashColor).
446 Bold(true)
447
448 s.Tree.Blame.Message = r.NewStyle()
449
450 s.Tree.Blame.Who = r.NewStyle().
451 Faint(true)
452
453 s.Spinner = r.NewStyle().
454 MarginTop(1).
455 MarginLeft(2).
456 Foreground(lipgloss.Color("205"))
457
458 s.SpinnerContainer = r.NewStyle()
459
460 s.NoContent = r.NewStyle().
461 MarginTop(1).
462 MarginLeft(2).
463 Foreground(lipgloss.Color("242"))
464
465 s.StatusBar = r.NewStyle().
466 Height(1)
467
468 s.StatusBarKey = r.NewStyle().
469 Bold(true).
470 Padding(0, 1).
471 Background(lipgloss.Color("206")).
472 Foreground(lipgloss.Color("228"))
473
474 s.StatusBarValue = r.NewStyle().
475 Padding(0, 1).
476 Background(lipgloss.Color("235")).
477 Foreground(lipgloss.Color("243"))
478
479 s.StatusBarInfo = r.NewStyle().
480 Padding(0, 1).
481 Background(lipgloss.Color("212")).
482 Foreground(lipgloss.Color("230"))
483
484 s.StatusBarBranch = r.NewStyle().
485 Padding(0, 1).
486 Background(lipgloss.Color("62")).
487 Foreground(lipgloss.Color("230"))
488
489 s.StatusBarHelp = r.NewStyle().
490 Padding(0, 1).
491 Background(lipgloss.Color("237")).
492 Foreground(lipgloss.Color("243"))
493
494 s.Tabs = r.NewStyle().
495 Height(1)
496
497 s.TabInactive = r.NewStyle()
498
499 s.TabActive = r.NewStyle().
500 Underline(true).
501 Foreground(lipgloss.Color("36"))
502
503 s.TabSeparator = r.NewStyle().
504 SetString("│").
505 Padding(0, 1).
506 Foreground(lipgloss.Color("238"))
507
508 s.Code.LineDigit = r.NewStyle().Foreground(lipgloss.Color("239"))
509
510 s.Code.LineBar = r.NewStyle().Foreground(lipgloss.Color("236"))
511
512 s.Stash.Normal.Message = r.NewStyle().MarginLeft(1)
513
514 s.Stash.Active.Message = s.Stash.Normal.Message.Foreground(selectorColor)
515
516 s.Stash.Title = r.NewStyle().
517 Foreground(hashColor).
518 Bold(true)
519
520 s.Stash.Selector = r.NewStyle().
521 Width(1).
522 Foreground(selectorColor)
523
524 return s
525}