Documentation
¶
Index ¶
- Constants
- Variables
- func TerminalBackgroundSequences(themeName string) (set string, reset string)
- func ThemeUsesASCII(themeName string) bool
- type AISummaryFetchedMsg
- type AIValidateDoneMsg
- type ArticleContentFetchedMsg
- type ArticleReadUpdatedMsg
- type ArticlesLoadedMsg
- type ClipboardCopiedMsg
- type ErrMsg
- type FeedDeletedMsg
- type FeedManager
- type FeedRefreshedMsg
- type FeedSavedMsg
- type FeedsLoadedMsg
- type FeedsReadUpdatedMsg
- type FolderDeletedMsg
- type FolderSavedMsg
- type KeyMap
- type Model
- type OPMLExportedMsg
- type OPMLImportedMsg
- type RemoteFeedAddedMsg
- type RestartedMsg
- type Settings
- type StatusClearMsg
- type Styles
- type SummarySavedMsg
- type Theme
- type UpdateCheckedMsg
- type UpdateDownloadedMsg
- type UpdateInstalledMsg
Constants ¶
const ThemeNameVT100 = "vt100"
ThemeNameVT100 is the DEC green phosphor theme (Unicode borders).
const ThemeNameVT52 = "vt52"
ThemeNameVT52 is the built-in theme that uses ASCII borders and glyphs.
Variables ¶
var BuiltinThemes = []Theme{ CatppuccinMocha, CatppuccinLatte, CatppuccinFrappe, CatppuccinMacchiato, Nord, Dracula, GruvboxDark, GruvboxLight, TokyoNight, TokyoNightDay, RosePine, RosePineMoon, RosePineDawn, OneDark, MagentaGeode, CoralSunset, LavenderFieldsForever, VT100, VT52, }
var CatppuccinFrappe = Theme{
Name: "catppuccin-frappe",
Bg: "#303446",
Fg: "#c6d0f5",
Border: "#626880",
BorderFocus: "#8caaee",
Selected: "#8caaee",
Unread: "#a6d189",
Dimmed: "#51576d",
StatusBar: "#292c3c",
StatusFg: "#c6d0f5",
Error: "#e78284",
Overlay: "#292c3c",
OverlayBorder: "#8caaee",
}
var CatppuccinLatte = Theme{
Name: "catppuccin-latte",
Bg: "#eff1f5",
Fg: "#4c4f69",
Border: "#9ca0b0",
BorderFocus: "#1e66f5",
Selected: "#1e66f5",
Unread: "#40a02b",
Dimmed: "#8c8fa1",
StatusBar: "#e6e9ef",
StatusFg: "#4c4f69",
Error: "#d20f39",
Overlay: "#e6e9ef",
OverlayBorder: "#1e66f5",
}
var CatppuccinMacchiato = Theme{
Name: "catppuccin-macchiato",
Bg: "#24273a",
Fg: "#cad3f5",
Border: "#5b6078",
BorderFocus: "#8aadf4",
Selected: "#8aadf4",
Unread: "#a6da95",
Dimmed: "#494d64",
StatusBar: "#1e2030",
StatusFg: "#cad3f5",
Error: "#ed8796",
Overlay: "#1e2030",
OverlayBorder: "#8aadf4",
}
var CatppuccinMocha = Theme{
Name: "catppuccin-mocha",
Bg: "#1e1e2e",
Fg: "#cdd6f4",
Border: "#6c7086",
BorderFocus: "#89b4fa",
Selected: "#89b4fa",
Unread: "#a6e3a1",
Dimmed: "#585b70",
StatusBar: "#313244",
StatusFg: "#cdd6f4",
Error: "#f38ba8",
Overlay: "#313244",
OverlayBorder: "#89b4fa",
}
var CoralSunset = Theme{
Name: "coral-sunset",
Bg: "#444154",
Fg: "#fec9c1",
Border: "#fc8b79",
BorderFocus: "#ff7062",
Selected: "#ff7062",
Unread: "#fec9c1",
Dimmed: "#7a637f",
StatusBar: "#7a637f",
StatusFg: "#fec9c1",
Error: "#ff7062",
Overlay: "#7a637f",
OverlayBorder: "#ff7062",
}
CoralSunset — muted purples with warm coral accents
var DefaultKeys = KeyMap{ Up: key.NewBinding(key.WithKeys("k", "up"), key.WithHelp("k/↑", "up")), Down: key.NewBinding(key.WithKeys("j", "down"), key.WithHelp("j/↓", "down")), Left: key.NewBinding(key.WithKeys("h", "left"), key.WithHelp("h/←", "move left")), Right: key.NewBinding(key.WithKeys("l", "right"), key.WithHelp("l/→", "move right")), NextPane: key.NewBinding(key.WithKeys("tab", "]"), key.WithHelp("tab/]", "next pane")), PrevPane: key.NewBinding(key.WithKeys("shift+tab", "["), key.WithHelp("shift+tab/[", "prev pane")), Enter: key.NewBinding(key.WithKeys("enter"), key.WithHelp("enter", "open")), Back: key.NewBinding(key.WithKeys("esc"), key.WithHelp("esc", "back")), Refresh: key.NewBinding(key.WithKeys("f"), key.WithHelp("f", "refresh feed")), RefreshAll: key.NewBinding(key.WithKeys("F", "I"), key.WithHelp("F/I", "refresh all")), MarkRead: key.NewBinding(key.WithKeys("r"), key.WithHelp("r", "mark read")), MarkAllRead: key.NewBinding(key.WithKeys("R"), key.WithHelp("R", "mark all read")), OpenBrowser: key.NewBinding(key.WithKeys("o"), key.WithHelp("o", "open in browser")), NextLink: key.NewBinding(key.WithKeys("ctrl+n", "alt+n"), key.WithHelp("ctrl+n", "next link")), PrevLink: key.NewBinding(key.WithKeys("ctrl+p", "alt+p"), key.WithHelp("ctrl+p", "prev link")), Search: key.NewBinding(key.WithKeys("/"), key.WithHelp("/", "search")), UnreadOnly: key.NewBinding(key.WithKeys("u"), key.WithHelp("u", "toggle unread only")), FeedManager: key.NewBinding(key.WithKeys("m"), key.WithHelp("m", "feed manager")), ThemePicker: key.NewBinding(key.WithKeys("T"), key.WithHelp("T", "theme picker")), Settings: key.NewBinding(key.WithKeys("S"), key.WithHelp("S", "settings")), UpdateInstall: key.NewBinding(key.WithKeys("U"), key.WithHelp("U", "install update")), UpdateIgnore: key.NewBinding(key.WithKeys("i"), key.WithHelp("i", "ignore update")), Help: key.NewBinding(key.WithKeys("?"), key.WithHelp("?", "help")), Quit: key.NewBinding(key.WithKeys("q"), key.WithHelp("q", "quit")), Summary: key.NewBinding(key.WithKeys("s"), key.WithHelp("s", "AI summary")), CopyText: key.NewBinding(key.WithKeys("c"), key.WithHelp("c", "copy")), SaveMD: key.NewBinding(key.WithKeys("M"), key.WithHelp("M", "save .md")), Add: key.NewBinding(key.WithKeys("a"), key.WithHelp("a", "add")), AddFolder: key.NewBinding(key.WithKeys("n"), key.WithHelp("n", "add folder")), Edit: key.NewBinding(key.WithKeys("e"), key.WithHelp("e", "edit")), Delete: key.NewBinding(key.WithKeys("d"), key.WithHelp("d", "delete")), Import: key.NewBinding(key.WithKeys("i"), key.WithHelp("i", "import OPML")), Export: key.NewBinding(key.WithKeys("x"), key.WithHelp("x", "export OPML")), Move: key.NewBinding(key.WithKeys("v"), key.WithHelp("v", "move to folder")), Confirm: key.NewBinding(key.WithKeys("enter"), key.WithHelp("enter", "confirm")), Cancel: key.NewBinding(key.WithKeys("esc"), key.WithHelp("esc", "cancel")), Space: key.NewBinding(key.WithKeys(" "), key.WithHelp("space", "toggle")), Yes: key.NewBinding(key.WithKeys("y"), key.WithHelp("y", "yes")), No: key.NewBinding(key.WithKeys("n"), key.WithHelp("n", "no")), Tab: key.NewBinding(key.WithKeys("tab"), key.WithHelp("tab", "next field")), Backspace: key.NewBinding(key.WithKeys("backspace")), }
var Dracula = Theme{
Name: "dracula",
Bg: "#282a36",
Fg: "#f8f8f2",
Border: "#6272a4",
BorderFocus: "#bd93f9",
Selected: "#bd93f9",
Unread: "#50fa7b",
Dimmed: "#6272a4",
StatusBar: "#21222c",
StatusFg: "#f8f8f2",
Error: "#ff5555",
Overlay: "#21222c",
OverlayBorder: "#bd93f9",
}
var GruvboxDark = Theme{
Name: "gruvbox-dark",
Bg: "#282828",
Fg: "#ebdbb2",
Border: "#504945",
BorderFocus: "#83a598",
Selected: "#83a598",
Unread: "#b8bb26",
Dimmed: "#504945",
StatusBar: "#1d2021",
StatusFg: "#ebdbb2",
Error: "#fb4934",
Overlay: "#32302f",
OverlayBorder: "#83a598",
}
var GruvboxLight = Theme{
Name: "gruvbox-light",
Bg: "#fbf1c7",
Fg: "#3c3836",
Border: "#bdae93",
BorderFocus: "#076678",
Selected: "#076678",
Unread: "#79740e",
Dimmed: "#bdae93",
StatusBar: "#f2e5bc",
StatusFg: "#3c3836",
Error: "#cc241d",
Overlay: "#f2e5bc",
OverlayBorder: "#076678",
}
var LavenderFieldsForever = Theme{
Name: "lavender-fields-forever",
Bg: "#382d72",
Fg: "#e5ccf4",
Border: "#b7c2c6",
BorderFocus: "#a080e1",
Selected: "#a080e1",
Unread: "#e5ccf4",
Dimmed: "#5c509c",
StatusBar: "#5c509c",
StatusFg: "#e5ccf4",
Error: "#ff7062",
Overlay: "#5c509c",
OverlayBorder: "#a080e1",
}
LavenderFieldsForever — deep indigo with soft lavender
var MagentaGeode = Theme{
Name: "magenta-geode",
Bg: "#47003c",
Fg: "#f3b0dc",
Border: "#aa4d84",
BorderFocus: "#c83fa9",
Selected: "#c83fa9",
Unread: "#f3b0dc",
Dimmed: "#77176e",
StatusBar: "#77176e",
StatusFg: "#f3b0dc",
Error: "#ff7062",
Overlay: "#77176e",
OverlayBorder: "#c83fa9",
}
MagentaGeode — sparkling purples and pinks
var Nord = Theme{
Name: "nord",
Bg: "#2e3440",
Fg: "#eceff4",
Border: "#4c566a",
BorderFocus: "#88c0d0",
Selected: "#88c0d0",
Unread: "#a3be8c",
Dimmed: "#4c566a",
StatusBar: "#3b4252",
StatusFg: "#d8dee9",
Error: "#bf616a",
Overlay: "#3b4252",
OverlayBorder: "#88c0d0",
}
var OneDark = Theme{
Name: "one-dark",
Bg: "#282c34",
Fg: "#abb2bf",
Border: "#3e4451",
BorderFocus: "#61afef",
Selected: "#61afef",
Unread: "#98c379",
Dimmed: "#3e4451",
StatusBar: "#21252b",
StatusFg: "#abb2bf",
Error: "#e06c75",
Overlay: "#21252b",
OverlayBorder: "#61afef",
}
var RosePine = Theme{
Name: "rose-pine",
Bg: "#191724",
Fg: "#e0def4",
Border: "#403d52",
BorderFocus: "#c4a7e7",
Selected: "#c4a7e7",
Unread: "#9ccfd8",
Dimmed: "#403d52",
StatusBar: "#1f1d2e",
StatusFg: "#e0def4",
Error: "#eb6f92",
Overlay: "#1f1d2e",
OverlayBorder: "#c4a7e7",
}
var RosePineDawn = Theme{
Name: "rose-pine-dawn",
Bg: "#faf4ed",
Fg: "#575279",
Border: "#d7d2be",
BorderFocus: "#907aa9",
Selected: "#907aa9",
Unread: "#286983",
Dimmed: "#d7d2be",
StatusBar: "#fffaf3",
StatusFg: "#575279",
Error: "#b4637a",
Overlay: "#fffaf3",
OverlayBorder: "#907aa9",
}
var RosePineMoon = Theme{
Name: "rose-pine-moon",
Bg: "#232136",
Fg: "#e0def4",
Border: "#44415a",
BorderFocus: "#c4a7e7",
Selected: "#c4a7e7",
Unread: "#9ccfd8",
Dimmed: "#44415a",
StatusBar: "#2a2837",
StatusFg: "#e0def4",
Error: "#eb6f92",
Overlay: "#2a2837",
OverlayBorder: "#c4a7e7",
}
var TokyoNight = Theme{
Name: "tokyo-night",
Bg: "#1a1b26",
Fg: "#c0caf5",
Border: "#414868",
BorderFocus: "#7aa2f7",
Selected: "#7aa2f7",
Unread: "#9ece6a",
Dimmed: "#414868",
StatusBar: "#16161e",
StatusFg: "#a9b1d6",
Error: "#f7768e",
Overlay: "#16161e",
OverlayBorder: "#7aa2f7",
}
var TokyoNightDay = Theme{
Name: "tokyo-night-day",
Bg: "#e1e2e7",
Fg: "#3760bf",
Border: "#a8aecb",
BorderFocus: "#2e7de9",
Selected: "#2e7de9",
Unread: "#587539",
Dimmed: "#a8aecb",
StatusBar: "#d0d5e3",
StatusFg: "#3760bf",
Error: "#f52a65",
Overlay: "#d0d5e3",
OverlayBorder: "#2e7de9",
}
var VT100 = Theme{
Name: "vt100",
Bg: "#000000",
Fg: "#33ff33",
Border: "#145214",
BorderFocus: "#00ff00",
Selected: "#00ff00",
Unread: "#66ff66",
Dimmed: "#3dcc3d",
StatusBar: "#001a00",
StatusFg: "#33ff33",
Error: "#ff6b6b",
Overlay: "#001200",
OverlayBorder: "#00ff00",
}
VT100 — DEC-style green phosphor on black CRT
var VT52 = Theme{
Name: "vt52",
Bg: "#000000",
Fg: "#ffcc66",
Border: "#6b4e14",
BorderFocus: "#ffb020",
Selected: "#ffb020",
Unread: "#ffe6a8",
Dimmed: "#a67c2e",
StatusBar: "#1a1206",
StatusFg: "#ffcc66",
Error: "#ff6666",
Overlay: "#140e04",
OverlayBorder: "#ffb020",
}
VT52 — P4-style amber phosphor on black; ASCII borders when this theme is active (see ThemeUsesASCII).
Functions ¶
func TerminalBackgroundSequences ¶
TerminalBackgroundSequences returns ANSI OSC sequences that set and later reset the terminal's default background color for xterm-compatible terminals.
func ThemeUsesASCII ¶
ThemeUsesASCII reports whether the theme uses ASCII box-drawing and punctuation.
Types ¶
type AISummaryFetchedMsg ¶
type AIValidateDoneMsg ¶
type AIValidateDoneMsg struct {
Err error
}
AIValidateDoneMsg is sent after settings triggers an async AI credential check.
type ArticleReadUpdatedMsg ¶
type ArticlesLoadedMsg ¶
type ClipboardCopiedMsg ¶
type ClipboardCopiedMsg struct {
Err error
}
type FeedDeletedMsg ¶
type FeedManager ¶
type FeedManager struct {
// contains filtered or unexported fields
}
func NewFeedManager ¶
func NewFeedManager(database *db.DB) FeedManager
func NewFeedManagerWithSource ¶
func NewFeedManagerWithSource(database *db.DB, sourceCfg config.SourceConfig) FeedManager
func NewRemoteFeedManager ¶
func (FeedManager) Update ¶
func (fm FeedManager) Update(msg tea.Msg, keys KeyMap) (FeedManager, tea.Cmd, bool)
type FeedRefreshedMsg ¶
type FeedSavedMsg ¶
type FeedsLoadedMsg ¶
type FeedsReadUpdatedMsg ¶
type FolderDeletedMsg ¶
type FolderSavedMsg ¶
type KeyMap ¶
type KeyMap struct {
Up key.Binding
Down key.Binding
Left key.Binding
Right key.Binding
NextPane key.Binding
PrevPane key.Binding
Enter key.Binding
Back key.Binding
Refresh key.Binding
RefreshAll key.Binding
MarkRead key.Binding
MarkAllRead key.Binding
OpenBrowser key.Binding
NextLink key.Binding
PrevLink key.Binding
Search key.Binding
UnreadOnly key.Binding
FeedManager key.Binding
ThemePicker key.Binding
Settings key.Binding
UpdateInstall key.Binding
UpdateIgnore key.Binding
Help key.Binding
Quit key.Binding
Summary key.Binding // fetch/show AI summary (articles or content pane)
CopyText key.Binding // copy summary to clipboard
SaveMD key.Binding // save summary as .md file
// Feed manager specific
Add key.Binding
AddFolder key.Binding
Edit key.Binding
Delete key.Binding
Import key.Binding
Export key.Binding
Move key.Binding
// Overlay / input
Confirm key.Binding
Cancel key.Binding
Space key.Binding
Yes key.Binding
No key.Binding
Tab key.Binding
Backspace key.Binding
}
type OPMLExportedMsg ¶
type OPMLImportedMsg ¶
type RemoteFeedAddedMsg ¶
type RestartedMsg ¶
type RestartedMsg struct {
Err error
}
type Settings ¶
type Settings struct {
// contains filtered or unexported fields
}
type StatusClearMsg ¶
type StatusClearMsg struct{}
type Styles ¶
type Styles struct {
Theme Theme
// PlainUI is true for the vt52 theme (ASCII borders and glyphs).
PlainUI bool
// Density is normalized ("comfortable" | "compact") and matches config.Display.Density.
Density string
// Pane containers
FeedsPane lipgloss.Style
ArticlesPane lipgloss.Style
ContentPane lipgloss.Style
PaneHeaderActive lipgloss.Style
PaneHeaderInactive lipgloss.Style
// Feed list items
FeedItem lipgloss.Style
FeedItemSelected lipgloss.Style
FeedItemSelectedFocused lipgloss.Style
FeedItemSelectedUnfocused lipgloss.Style
UnreadBadge lipgloss.Style
// Article list items
ArticleUnread lipgloss.Style
ArticleRead lipgloss.Style
ArticleSelected lipgloss.Style
ArticleTime lipgloss.Style
UnreadDot lipgloss.Style
// Content pane
ContentTitle lipgloss.Style
ContentMeta lipgloss.Style
ContentBody lipgloss.Style
ContentFocusLine lipgloss.Style
// Status bar
StatusBar lipgloss.Style
StatusError lipgloss.Style
StatusSpinner lipgloss.Style
StatusHint lipgloss.Style
StatusBarJoiner lipgloss.Style
StatusNotice lipgloss.Style
// Overlay chrome
Overlay lipgloss.Style
OverlayTitle lipgloss.Style
OverlayHint lipgloss.Style
// Inputs inside overlays/feed manager
InputFocused lipgloss.Style
InputUnfocused lipgloss.Style
InputLabel lipgloss.Style
// Help screen
HelpSection lipgloss.Style
HelpSectionBody lipgloss.Style
HelpKey lipgloss.Style
HelpDesc lipgloss.Style
// Spinner
Spinner lipgloss.Style
}
func BuildStyles ¶
func (Styles) InlineMidDot ¶
func (Styles) ListItemLineStride ¶
ListItemLineStride is the number of terminal lines one feed/article list row occupies.
func (Styles) StatusBarSepText ¶
func (Styles) ThemePickerCursor ¶
type SummarySavedMsg ¶
type Theme ¶
type Theme struct {
Name string
Bg lipgloss.Color
Fg lipgloss.Color
Border lipgloss.Color
BorderFocus lipgloss.Color
Selected lipgloss.Color
Unread lipgloss.Color
Dimmed lipgloss.Color
StatusBar lipgloss.Color
StatusFg lipgloss.Color
Error lipgloss.Color
Overlay lipgloss.Color
OverlayBorder lipgloss.Color
}
func ApplyDisplayOverrides ¶
ApplyDisplayOverrides returns the effective theme for cfg (merge vt52/vt100 tweaks).
func MergeRetroTweak ¶
func MergeRetroTweak(base Theme, tw config.RetroTerminalTweak) Theme
MergeRetroTweak applies optional #rrggbb overrides from config onto a base retro theme.
func MergedBuiltinThemeAtIndex ¶
MergedBuiltinThemeAtIndex returns the theme at idx with cfg-based retro overrides applied.
func MergedThemeFromConfig ¶
MergedThemeFromConfig resolves cfg.Theme to a builtin theme and applies retro overrides.
func ThemeByName ¶
type UpdateCheckedMsg ¶
type UpdateCheckedMsg struct {
Result update.CheckResult
Manual bool
Err error
}
type UpdateDownloadedMsg ¶
type UpdateDownloadedMsg struct {
Asset update.DownloadedAsset
Err error
}
type UpdateInstalledMsg ¶
type UpdateInstalledMsg struct {
Result update.InstallResult
Err error
}