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