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