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	HelpKey     lipgloss.Style
 35	HelpValue   lipgloss.Style
 36	HelpDivider lipgloss.Style
 37
 38	Error      lipgloss.Style
 39	ErrorTitle lipgloss.Style
 40	ErrorBody  lipgloss.Style
 41}
 42
 43// DefaultStyles returns default styles for the TUI.
 44func DefaultStyles() *Styles {
 45	s := new(Styles)
 46
 47	s.ActiveBorderColor = lipgloss.Color("62")
 48	s.InactiveBorderColor = lipgloss.Color("236")
 49
 50	s.App = lipgloss.NewStyle().
 51		Margin(1, 2)
 52
 53	s.Header = lipgloss.NewStyle().
 54		Foreground(lipgloss.Color("62")).
 55		Align(lipgloss.Right).
 56		Bold(true)
 57
 58	s.Menu = lipgloss.NewStyle().
 59		BorderStyle(lipgloss.RoundedBorder()).
 60		BorderForeground(s.InactiveBorderColor).
 61		Padding(1, 2).
 62		MarginRight(1).
 63		Width(24)
 64
 65	s.MenuCursor = lipgloss.NewStyle().
 66		Foreground(lipgloss.Color("213")).
 67		SetString(">")
 68
 69	s.MenuItem = lipgloss.NewStyle().
 70		PaddingLeft(2)
 71
 72	s.SelectedMenuItem = lipgloss.NewStyle().
 73		Foreground(lipgloss.Color("207")).
 74		PaddingLeft(1)
 75
 76	s.RepoTitleBorder = lipgloss.Border{
 77		Top:         "─",
 78		Bottom:      "─",
 79		Left:        "│",
 80		Right:       "│",
 81		TopLeft:     "╭",
 82		TopRight:    "┬",
 83		BottomLeft:  "├",
 84		BottomRight: "┴",
 85	}
 86
 87	s.RepoNoteBorder = lipgloss.Border{
 88		Top:         "─",
 89		Bottom:      "─",
 90		Left:        "│",
 91		Right:       "│",
 92		TopLeft:     "┬",
 93		TopRight:    "╮",
 94		BottomLeft:  "┴",
 95		BottomRight: "┤",
 96	}
 97
 98	s.RepoBodyBorder = lipgloss.Border{
 99		Top:         "",
100		Bottom:      "─",
101		Left:        "│",
102		Right:       "│",
103		TopLeft:     "",
104		TopRight:    "",
105		BottomLeft:  "╰",
106		BottomRight: "╯",
107	}
108
109	s.RepoTitle = lipgloss.NewStyle().
110		Padding(0, 2)
111
112	s.RepoTitleBox = lipgloss.NewStyle().
113		BorderStyle(s.RepoTitleBorder).
114		BorderForeground(s.InactiveBorderColor)
115
116	s.RepoNote = lipgloss.NewStyle().
117		Padding(0, 2).
118		Foreground(lipgloss.Color("168"))
119
120	s.RepoNoteBox = lipgloss.NewStyle().
121		BorderStyle(s.RepoNoteBorder).
122		BorderForeground(s.InactiveBorderColor).
123		BorderTop(true).
124		BorderRight(true).
125		BorderBottom(true).
126		BorderLeft(false)
127
128	s.RepoBody = lipgloss.NewStyle().
129		BorderStyle(s.RepoBodyBorder).
130		BorderForeground(s.InactiveBorderColor).
131		PaddingRight(1)
132
133	s.Footer = lipgloss.NewStyle().
134		MarginTop(1)
135
136	s.HelpKey = lipgloss.NewStyle().
137		Foreground(lipgloss.Color("241"))
138
139	s.HelpValue = lipgloss.NewStyle().
140		Foreground(lipgloss.Color("239"))
141
142	s.HelpDivider = lipgloss.NewStyle().
143		Foreground(lipgloss.Color("237")).
144		SetString(" • ")
145
146	s.Error = lipgloss.NewStyle().
147		Padding(1)
148
149	s.ErrorTitle = lipgloss.NewStyle().
150		Foreground(lipgloss.Color("230")).
151		Background(lipgloss.Color("204")).
152		Bold(true).
153		Padding(0, 1)
154
155	s.ErrorBody = lipgloss.NewStyle().
156		Foreground(lipgloss.Color("252")).
157		MarginLeft(2).
158		Width(52) // for now
159
160	return s
161}