Files
cburn/internal/tui/components/tabbar.go
teernisse 083e7d40ce refactor!: rename module to github.com/theirongolddev/cburn
Change module path from 'cburn' to 'github.com/theirongolddev/cburn'
to enable standard Go remote installation:

  go install github.com/theirongolddev/cburn@latest

This is a BREAKING CHANGE for any external code importing this module
(though as a CLI tool, this is unlikely to affect anyone).

All internal imports updated to use the new module path.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-23 10:09:26 -05:00

74 lines
1.9 KiB
Go

package components
import (
"strings"
"github.com/theirongolddev/cburn/internal/tui/theme"
"github.com/charmbracelet/lipgloss"
)
// Tab represents a single tab in the tab bar.
type Tab struct {
Name string
Key rune
KeyPos int // position of the shortcut letter in the name (-1 if not in name)
}
// Tabs defines all available tabs.
var Tabs = []Tab{
{Name: "Overview", Key: 'o', KeyPos: 0},
{Name: "Costs", Key: 'c', KeyPos: 0},
{Name: "Sessions", Key: 's', KeyPos: 0},
{Name: "Breakdown", Key: 'b', KeyPos: 0},
{Name: "Settings", Key: 'x', KeyPos: -1},
}
// RenderTabBar renders the tab bar with the given active index.
func RenderTabBar(activeIdx int, width int) string {
t := theme.Active
activeStyle := lipgloss.NewStyle().
Foreground(t.Accent).
Bold(true)
inactiveStyle := lipgloss.NewStyle().
Foreground(t.TextMuted)
keyStyle := lipgloss.NewStyle().
Foreground(t.Accent).
Bold(true)
dimKeyStyle := lipgloss.NewStyle().
Foreground(t.TextDim)
parts := make([]string, 0, len(Tabs))
for i, tab := range Tabs {
var rendered string
if i == activeIdx {
rendered = activeStyle.Render(tab.Name)
} else {
// Render with highlighted shortcut key
if tab.KeyPos >= 0 && tab.KeyPos < len(tab.Name) {
before := tab.Name[:tab.KeyPos]
key := string(tab.Name[tab.KeyPos])
after := tab.Name[tab.KeyPos+1:]
rendered = inactiveStyle.Render(before) +
dimKeyStyle.Render("[") + keyStyle.Render(key) + dimKeyStyle.Render("]") +
inactiveStyle.Render(after)
} else {
// Key not in name (e.g., "Settings" with 'x')
rendered = inactiveStyle.Render(tab.Name) +
dimKeyStyle.Render("[") + keyStyle.Render(string(tab.Key)) + dimKeyStyle.Render("]")
}
}
parts = append(parts, rendered)
}
bar := " " + strings.Join(parts, " ")
if lipgloss.Width(bar) <= width {
return bar
}
return lipgloss.NewStyle().MaxWidth(width).Render(bar)
}