Files
gastown/internal/tui/feed/styles.go
Steve Yegge c7da650f94 feat: Add charmbracelet TUI for gt feed (gt-u7dxq)
- Add bubbletea and bubbles dependencies
- Create internal/tui/feed package with:
  - model.go: Main bubbletea model with agent tree and event stream
  - view.go: Rendering logic with lipgloss styling
  - keys.go: Vim-style key bindings (j/k, tab, /, q)
  - styles.go: Color palette and component styles
  - events.go: Event source from bd activity
- Update gt feed to use TUI by default (--plain for text mode)
- TUI features: agent tree by role, event stream, keyboard nav

Closes gt-be0as, gt-lexye, gt-1uhmj

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-28 16:24:28 -08:00

119 lines
2.6 KiB
Go

// Package feed provides a TUI for the Gas Town activity feed.
package feed
import "github.com/charmbracelet/lipgloss"
// Color palette
var (
colorPrimary = lipgloss.Color("12") // Blue
colorSuccess = lipgloss.Color("10") // Green
colorWarning = lipgloss.Color("11") // Yellow
colorError = lipgloss.Color("9") // Red
colorDim = lipgloss.Color("8") // Gray
colorHighlight = lipgloss.Color("14") // Cyan
colorAccent = lipgloss.Color("13") // Magenta
)
// Styles for the feed TUI
var (
// Header styles
HeaderStyle = lipgloss.NewStyle().
Bold(true).
Foreground(colorPrimary).
Padding(0, 1)
TitleStyle = lipgloss.NewStyle().
Bold(true).
Foreground(lipgloss.Color("15"))
FilterStyle = lipgloss.NewStyle().
Foreground(colorDim)
// Agent tree styles
TreePanelStyle = lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(colorDim).
Padding(0, 1)
RigStyle = lipgloss.NewStyle().
Bold(true).
Foreground(colorPrimary)
RoleStyle = lipgloss.NewStyle().
Foreground(colorAccent)
AgentNameStyle = lipgloss.NewStyle().
Foreground(lipgloss.Color("15"))
AgentActiveStyle = lipgloss.NewStyle().
Foreground(colorSuccess)
AgentIdleStyle = lipgloss.NewStyle().
Foreground(colorDim)
// Event stream styles
StreamPanelStyle = lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(colorDim).
Padding(0, 1)
TimestampStyle = lipgloss.NewStyle().
Foreground(colorDim)
EventCreateStyle = lipgloss.NewStyle().
Foreground(colorSuccess)
EventUpdateStyle = lipgloss.NewStyle().
Foreground(colorPrimary)
EventCompleteStyle = lipgloss.NewStyle().
Foreground(colorSuccess).
Bold(true)
EventFailStyle = lipgloss.NewStyle().
Foreground(colorError).
Bold(true)
EventDeleteStyle = lipgloss.NewStyle().
Foreground(colorWarning)
// Status bar styles
StatusBarStyle = lipgloss.NewStyle().
Background(lipgloss.Color("236")).
Foreground(colorDim).
Padding(0, 1)
HelpKeyStyle = lipgloss.NewStyle().
Foreground(colorHighlight).
Bold(true)
HelpDescStyle = lipgloss.NewStyle().
Foreground(colorDim)
// Focus indicator
FocusedBorderStyle = lipgloss.NewStyle().
Border(lipgloss.RoundedBorder()).
BorderForeground(colorPrimary).
Padding(0, 1)
// Role icons
RoleIcons = map[string]string{
"mayor": "🎩",
"witness": "👁",
"refinery": "🏭",
"crew": "👷",
"polecat": "😺",
"deacon": "🔔",
}
// Event symbols
EventSymbols = map[string]string{
"create": "+",
"update": "→",
"complete": "✓",
"fail": "✗",
"delete": "⊘",
"pin": "📌",
}
)