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