Files
dumpsterChat/cmd/tui/theme.go
T

160 lines
3.5 KiB
Go

package main
import "github.com/charmbracelet/lipgloss"
// Gruvbox dark palette
var (
bg = lipgloss.Color("#282828")
bgS = lipgloss.Color("#3c3836")
bgT = lipgloss.Color("#504945")
fg = lipgloss.Color("#ebdbb2")
fgS = lipgloss.Color("#d5c4a1")
fgF = lipgloss.Color("#a89984")
red = lipgloss.Color("#fb4934")
grn = lipgloss.Color("#b8bb26")
org = lipgloss.Color("#fe8019")
aqua = lipgloss.Color("#8ec07c")
yel = lipgloss.Color("#fabd2f")
)
// Styles
var (
// Layout panes
ServerBarStyle = lipgloss.NewStyle().
Background(bgS).
Foreground(fg).
Padding(0, 1).
Border(lipgloss.NormalBorder(), false, true, false, false).
BorderForeground(bgT)
ChannelListStyle = lipgloss.NewStyle().
Background(bgS).
Foreground(fg).
Padding(0, 1)
ChatPaneStyle = lipgloss.NewStyle().
Background(bg).
Foreground(fg).
Padding(0, 1)
MemberListStyle = lipgloss.NewStyle().
Background(bgS).
Foreground(fg).
Padding(0, 1)
InputPaneStyle = lipgloss.NewStyle().
Background(bgS).
Foreground(fg).
Padding(0, 1)
// Focus indicators
FocusedBorder = lipgloss.NewStyle().
Border(lipgloss.NormalBorder(), false, false, true, false).
BorderForeground(aqua)
UnfocusedBorder = lipgloss.NewStyle().
Border(lipgloss.NormalBorder(), false, false, true, false).
BorderForeground(bgT)
// Server list
ServerActive = lipgloss.NewStyle().
Background(aqua).
Foreground(bg).
Bold(true).
Padding(0, 1).
Align(lipgloss.Center)
ServerInactive = lipgloss.NewStyle().
Background(bgS).
Foreground(fgF).
Padding(0, 1).
Align(lipgloss.Center)
ServerHover = lipgloss.NewStyle().
Background(bgT).
Foreground(fg).
Padding(0, 1).
Align(lipgloss.Center)
// Channel list
CategoryStyle = lipgloss.NewStyle().
Foreground(fgF).
Bold(true).
PaddingTop(1)
ChannelActive = lipgloss.NewStyle().
Foreground(fg).
Bold(true).
PaddingLeft(1)
ChannelInactive = lipgloss.NewStyle().
Foreground(fgF).
PaddingLeft(1)
ChannelHover = lipgloss.NewStyle().
Foreground(fg).
PaddingLeft(1)
VoiceChannelPrefix = lipgloss.NewStyle().Foreground(aqua)
TextChannelPrefix = lipgloss.NewStyle().Foreground(fgF)
// Chat
MessageStyle = lipgloss.NewStyle().
Foreground(fg)
TimestampStyle = lipgloss.NewStyle().
Foreground(fgF)
UsernameStyle = lipgloss.NewStyle().
Bold(true)
MentionStyle = lipgloss.NewStyle().
Foreground(aqua).
Bold(true)
EditedTag = lipgloss.NewStyle().
Foreground(fgF).
Italic(true)
// Status indicators
StatusOnline = lipgloss.NewStyle().Foreground(grn)
StatusIdle = lipgloss.NewStyle().Foreground(yel)
StatusOffline = lipgloss.NewStyle().Foreground(fgF)
// Voice
VoiceStatusStyle = lipgloss.NewStyle().
Background(lipgloss.Color("#1d2021")).
Foreground(aqua).
Padding(0, 1)
// Error/success
ErrorStyle = lipgloss.NewStyle().
Foreground(red).
Bold(true)
SuccessStyle = lipgloss.NewStyle().
Foreground(grn).
Bold(true)
// Help
HelpStyle = lipgloss.NewStyle().
Foreground(fgF).
Italic(true)
// Title
TitleStyle = lipgloss.NewStyle().
Foreground(aqua).
Bold(true).
Align(lipgloss.Center)
)
// UsernameColor returns a deterministic color for a username based on its content.
func UsernameColor(username string) lipgloss.Color {
colors := []lipgloss.Color{red, grn, org, aqua, yel, lipgloss.Color("#d3869b"), lipgloss.Color("#83a598")}
hash := 0
for _, c := range username {
hash += int(c)
}
return colors[hash%len(colors)]
}