Charm-based CLI with JSON persistence, status/list filters, external editor editing, command-history undo/redo, and glamour markdown without AutoStyle OSC hangs. Co-authored-by: Cursor <cursoragent@cursor.com>
121 lines
3.2 KiB
Go
121 lines
3.2 KiB
Go
package ui
|
|
|
|
import "github.com/charmbracelet/lipgloss"
|
|
|
|
// Styles holds Lipgloss styles for the TUI.
|
|
type Styles struct {
|
|
Header lipgloss.Style
|
|
HeaderBrand lipgloss.Style
|
|
HeaderMeta lipgloss.Style
|
|
HelpKey lipgloss.Style
|
|
HelpDesc lipgloss.Style
|
|
HelpSep lipgloss.Style
|
|
Version lipgloss.Style
|
|
StatusTodo lipgloss.Style
|
|
StatusWIP lipgloss.Style
|
|
StatusDone lipgloss.Style
|
|
StatusMsg lipgloss.Style
|
|
ErrorMsg lipgloss.Style
|
|
Selected lipgloss.Style
|
|
Normal lipgloss.Style
|
|
InputPrompt lipgloss.Style
|
|
FilterHint lipgloss.Style
|
|
Card lipgloss.Style
|
|
CardSelected lipgloss.Style
|
|
Headline lipgloss.Style
|
|
StatusMenuBox lipgloss.Style
|
|
StatusMenuTitle lipgloss.Style
|
|
StatusMenuSelected lipgloss.Style
|
|
StatusMenuNormal lipgloss.Style
|
|
}
|
|
|
|
// DefaultStyles returns the neutral terminal theme.
|
|
func DefaultStyles() Styles {
|
|
accent := lipgloss.Color("39")
|
|
faint := lipgloss.Color("245")
|
|
green := lipgloss.Color("42")
|
|
yellow := lipgloss.Color("214")
|
|
muted := lipgloss.Color("240")
|
|
border := lipgloss.Color("238")
|
|
borderSel := lipgloss.Color("39")
|
|
|
|
return Styles{
|
|
Header: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Padding(0, 1),
|
|
HeaderBrand: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(accent),
|
|
HeaderMeta: lipgloss.NewStyle().
|
|
Foreground(faint),
|
|
HelpKey: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(accent),
|
|
HelpDesc: lipgloss.NewStyle().
|
|
Foreground(faint),
|
|
HelpSep: lipgloss.NewStyle().
|
|
Foreground(muted).
|
|
SetString(" "),
|
|
Version: lipgloss.NewStyle().
|
|
Faint(true).
|
|
Foreground(muted),
|
|
StatusTodo: lipgloss.NewStyle().
|
|
Foreground(faint).
|
|
Background(lipgloss.Color("236")),
|
|
StatusWIP: lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("0")).
|
|
Background(yellow).
|
|
Bold(true),
|
|
StatusDone: lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("0")).
|
|
Background(green),
|
|
StatusMsg: lipgloss.NewStyle().
|
|
Foreground(faint),
|
|
ErrorMsg: lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("196")),
|
|
Selected: lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("230")).
|
|
Background(accent).
|
|
Bold(true),
|
|
Normal: lipgloss.NewStyle(),
|
|
InputPrompt: lipgloss.NewStyle().
|
|
Foreground(accent).
|
|
Bold(true),
|
|
FilterHint: lipgloss.NewStyle().
|
|
Foreground(yellow),
|
|
// Left accent only — full box borders stacked a blank line between tickets.
|
|
Card: lipgloss.NewStyle().
|
|
BorderStyle(lipgloss.NormalBorder()).
|
|
BorderLeft(true).
|
|
BorderTop(false).
|
|
BorderRight(false).
|
|
BorderBottom(false).
|
|
BorderForeground(border).
|
|
PaddingLeft(1),
|
|
CardSelected: lipgloss.NewStyle().
|
|
BorderStyle(lipgloss.ThickBorder()).
|
|
BorderLeft(true).
|
|
BorderTop(false).
|
|
BorderRight(false).
|
|
BorderBottom(false).
|
|
BorderForeground(borderSel).
|
|
PaddingLeft(1),
|
|
Headline: lipgloss.NewStyle().
|
|
Bold(true),
|
|
StatusMenuBox: lipgloss.NewStyle().
|
|
Border(lipgloss.RoundedBorder()).
|
|
BorderForeground(accent).
|
|
Padding(1, 2),
|
|
StatusMenuTitle: lipgloss.NewStyle().
|
|
Bold(true).
|
|
Foreground(accent).
|
|
MarginBottom(1),
|
|
StatusMenuSelected: lipgloss.NewStyle().
|
|
Foreground(lipgloss.Color("230")).
|
|
Background(accent).
|
|
Bold(true),
|
|
StatusMenuNormal: lipgloss.NewStyle().
|
|
Foreground(faint),
|
|
}
|
|
}
|