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