1package style
  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 TUI.
 11type Styles struct {
 12	ActiveBorderColor   lipgloss.Color
 13	InactiveBorderColor lipgloss.Color
 14
 15	App    lipgloss.Style
 16	Header lipgloss.Style
 17
 18	Menu             lipgloss.Style
 19	MenuCursor       lipgloss.Style
 20	MenuItem         lipgloss.Style
 21	SelectedMenuItem lipgloss.Style
 22
 23	RepoTitleBorder lipgloss.Border
 24	RepoNoteBorder  lipgloss.Border
 25	RepoBodyBorder  lipgloss.Border
 26
 27	RepoTitle    lipgloss.Style
 28	RepoTitleBox lipgloss.Style
 29	RepoNote     lipgloss.Style
 30	RepoNoteBox  lipgloss.Style
 31	RepoBody     lipgloss.Style
 32
 33	Footer      lipgloss.Style
 34	Branch      lipgloss.Style
 35	HelpKey     lipgloss.Style
 36	HelpValue   lipgloss.Style
 37	HelpDivider lipgloss.Style
 38
 39	Error      lipgloss.Style
 40	ErrorTitle lipgloss.Style
 41	ErrorBody  lipgloss.Style
 42
 43	LogItemSelector   lipgloss.Style
 44	LogItemActive     lipgloss.Style
 45	LogItemInactive   lipgloss.Style
 46	LogItemHash       lipgloss.Style
 47	LogCommit         lipgloss.Style
 48	LogCommitHash     lipgloss.Style
 49	LogCommitAuthor   lipgloss.Style
 50	LogCommitDate     lipgloss.Style
 51	LogCommitBody     lipgloss.Style
 52	LogCommitStatsAdd lipgloss.Style
 53	LogCommitStatsDel lipgloss.Style
 54
 55	RefItemSelector lipgloss.Style
 56	RefItemActive   lipgloss.Style
 57	RefItemInactive lipgloss.Style
 58	RefItemBranch   lipgloss.Style
 59	RefItemTag      lipgloss.Style
 60
 61	TreeItemSelector lipgloss.Style
 62	TreeItemActive   lipgloss.Style
 63	TreeItemInactive lipgloss.Style
 64	TreeFileDir      lipgloss.Style
 65	TreeFileMode     lipgloss.Style
 66	TreeFileSize     lipgloss.Style
 67	TreeFileContent  lipgloss.Style
 68
 69	Spinner lipgloss.Style
 70}
 71
 72// DefaultStyles returns default styles for the TUI.
 73func DefaultStyles() *Styles {
 74	s := new(Styles)
 75
 76	s.ActiveBorderColor = lipgloss.Color("62")
 77	s.InactiveBorderColor = lipgloss.Color("236")
 78
 79	s.App = lipgloss.NewStyle().
 80		Margin(1, 2)
 81
 82	s.Header = lipgloss.NewStyle().
 83		Foreground(lipgloss.Color("62")).
 84		Align(lipgloss.Right).
 85		Bold(true)
 86
 87	s.Menu = lipgloss.NewStyle().
 88		BorderStyle(lipgloss.RoundedBorder()).
 89		BorderForeground(s.InactiveBorderColor).
 90		Padding(1, 2).
 91		MarginRight(1).
 92		Width(24)
 93
 94	s.MenuCursor = lipgloss.NewStyle().
 95		Foreground(lipgloss.Color("213")).
 96		SetString(">")
 97
 98	s.MenuItem = lipgloss.NewStyle().
 99		PaddingLeft(2)
100
101	s.SelectedMenuItem = lipgloss.NewStyle().
102		Foreground(lipgloss.Color("207")).
103		PaddingLeft(1)
104
105	s.RepoTitleBorder = lipgloss.Border{
106		Top:         "─",
107		Bottom:      "─",
108		Left:        "│",
109		Right:       "│",
110		TopLeft:     "╭",
111		TopRight:    "┬",
112		BottomLeft:  "├",
113		BottomRight: "┴",
114	}
115
116	s.RepoNoteBorder = lipgloss.Border{
117		Top:         "─",
118		Bottom:      "─",
119		Left:        "│",
120		Right:       "│",
121		TopLeft:     "┬",
122		TopRight:    "╮",
123		BottomLeft:  "┴",
124		BottomRight: "┤",
125	}
126
127	s.RepoBodyBorder = lipgloss.Border{
128		Top:         "",
129		Bottom:      "─",
130		Left:        "│",
131		Right:       "│",
132		TopLeft:     "",
133		TopRight:    "",
134		BottomLeft:  "╰",
135		BottomRight: "╯",
136	}
137
138	s.RepoTitle = lipgloss.NewStyle().
139		Padding(0, 2)
140
141	s.RepoTitleBox = lipgloss.NewStyle().
142		BorderStyle(s.RepoTitleBorder).
143		BorderForeground(s.InactiveBorderColor)
144
145	s.RepoNote = lipgloss.NewStyle().
146		Padding(0, 2).
147		Foreground(lipgloss.Color("168"))
148
149	s.RepoNoteBox = lipgloss.NewStyle().
150		BorderStyle(s.RepoNoteBorder).
151		BorderForeground(s.InactiveBorderColor).
152		BorderTop(true).
153		BorderRight(true).
154		BorderBottom(true).
155		BorderLeft(false)
156
157	s.RepoBody = lipgloss.NewStyle().
158		BorderStyle(s.RepoBodyBorder).
159		BorderForeground(s.InactiveBorderColor).
160		PaddingRight(1)
161
162	s.Footer = lipgloss.NewStyle().
163		MarginTop(1)
164
165	s.Branch = lipgloss.NewStyle().
166		Foreground(lipgloss.Color("203")).
167		Background(lipgloss.Color("236")).
168		Padding(0, 1)
169
170	s.HelpKey = lipgloss.NewStyle().
171		Foreground(lipgloss.Color("241"))
172
173	s.HelpValue = lipgloss.NewStyle().
174		Foreground(lipgloss.Color("239"))
175
176	s.HelpDivider = lipgloss.NewStyle().
177		Foreground(lipgloss.Color("237")).
178		SetString(" • ")
179
180	s.Error = lipgloss.NewStyle().
181		Padding(1)
182
183	s.ErrorTitle = lipgloss.NewStyle().
184		Foreground(lipgloss.Color("230")).
185		Background(lipgloss.Color("204")).
186		Bold(true).
187		Padding(0, 1)
188
189	s.ErrorBody = lipgloss.NewStyle().
190		Foreground(lipgloss.Color("252")).
191		MarginLeft(2).
192		Width(52) // for now
193
194	s.LogItemInactive = lipgloss.NewStyle().
195		MarginLeft(1)
196
197	s.LogItemSelector = s.LogItemInactive.Copy().
198		Width(1).
199		Foreground(lipgloss.Color("#B083EA"))
200
201	s.LogItemActive = s.LogItemInactive.Copy().
202		Bold(true)
203
204	s.LogItemHash = s.LogItemInactive.Copy().
205		Width(7).
206		Foreground(lipgloss.Color("#A3A322"))
207
208	s.LogCommit = lipgloss.NewStyle().
209		Margin(0, 2)
210
211	s.LogCommitHash = s.LogItemHash.Copy().
212		UnsetMarginLeft().
213		UnsetWidth().
214		Bold(true)
215
216	s.LogCommitBody = lipgloss.NewStyle().
217		MarginTop(1).
218		MarginLeft(2)
219
220	s.LogCommitStatsAdd = lipgloss.NewStyle().
221		Foreground(lipgloss.Color("#00D787")).
222		Bold(true)
223
224	s.LogCommitStatsDel = lipgloss.NewStyle().
225		Foreground(lipgloss.Color("#FD5B5B")).
226		Bold(true)
227
228	s.RefItemSelector = s.LogItemSelector.Copy()
229
230	s.RefItemActive = s.LogItemActive.Copy()
231
232	s.RefItemInactive = s.LogItemInactive.Copy()
233
234	s.RefItemBranch = lipgloss.NewStyle()
235
236	s.RefItemTag = lipgloss.NewStyle().
237		Foreground(lipgloss.Color("#A3A322"))
238
239	s.TreeItemSelector = s.LogItemSelector.Copy()
240
241	s.TreeItemActive = s.LogItemActive.Copy()
242
243	s.TreeItemInactive = s.LogItemInactive.Copy()
244
245	s.TreeFileDir = lipgloss.NewStyle().
246		Foreground(lipgloss.Color("#00AAFF"))
247
248	s.TreeFileMode = s.LogItemInactive.Copy().
249		Width(10).
250		Foreground(lipgloss.Color("#777777"))
251
252	s.TreeFileSize = s.LogItemInactive.Copy().
253		Foreground(lipgloss.Color("252"))
254
255	s.TreeFileContent = lipgloss.NewStyle()
256
257	s.Spinner = lipgloss.NewStyle().
258		MarginLeft(1).
259		Foreground(lipgloss.Color("205"))
260
261	return s
262}