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