diff --git a/internal/theme/theme.go b/internal/theme/theme.go index 49cfb11..632eb83 100644 --- a/internal/theme/theme.go +++ b/internal/theme/theme.go @@ -13,14 +13,29 @@ type Palette struct { Panel lipgloss.Color PanelInactive lipgloss.Color PanelElevated lipgloss.Color + StatusBar lipgloss.Color + Footer lipgloss.Color Border lipgloss.Color BorderActive lipgloss.Color Text lipgloss.Color Muted lipgloss.Color Accent lipgloss.Color + Info lipgloss.Color + Success lipgloss.Color Selection lipgloss.Color + Hover lipgloss.Color + Marked lipgloss.Color Warning lipgloss.Color Danger lipgloss.Color + ActivePath lipgloss.Color + ConfirmButton lipgloss.Color + CancelButton lipgloss.Color + ProgressFill lipgloss.Color + ProgressEmpty lipgloss.Color + HelpNav lipgloss.Color + HelpPanels lipgloss.Color + HelpDialogs lipgloss.Color + HelpMouse lipgloss.Color Folder lipgloss.Color TextFile lipgloss.Color ConfigFile lipgloss.Color @@ -66,14 +81,29 @@ func Resolve(name string) (Palette, error) { Panel: lipgloss.Color("#181825"), PanelInactive: lipgloss.Color("#1E1E2E"), PanelElevated: lipgloss.Color("#24273A"), + StatusBar: lipgloss.Color("#1E1E2E"), + Footer: lipgloss.Color("#11111B"), Border: lipgloss.Color("#45475A"), BorderActive: lipgloss.Color("#89B4FA"), Text: lipgloss.Color("#CDD6F4"), Muted: lipgloss.Color("#A6ADC8"), Accent: lipgloss.Color("#F5C2E7"), + Info: lipgloss.Color("#89DCEB"), + Success: lipgloss.Color("#A6E3A1"), Selection: lipgloss.Color("#313244"), + Hover: lipgloss.Color("#2A2B3C"), + Marked: lipgloss.Color("#F38BA8"), Warning: lipgloss.Color("#F9E2AF"), Danger: lipgloss.Color("#F38BA8"), + ActivePath: lipgloss.Color("#89DCEB"), + ConfirmButton: lipgloss.Color("#A6E3A1"), + CancelButton: lipgloss.Color("#F38BA8"), + ProgressFill: lipgloss.Color("#89B4FA"), + ProgressEmpty: lipgloss.Color("#45475A"), + HelpNav: lipgloss.Color("#89B4FA"), + HelpPanels: lipgloss.Color("#F9E2AF"), + HelpDialogs: lipgloss.Color("#CBA6F7"), + HelpMouse: lipgloss.Color("#F38BA8"), Folder: lipgloss.Color("#89B4FA"), TextFile: lipgloss.Color("#A6E3A1"), ConfigFile: lipgloss.Color("#F9E2AF"), @@ -89,14 +119,29 @@ func Resolve(name string) (Palette, error) { Panel: lipgloss.Color("#1A1B26"), PanelInactive: lipgloss.Color("#24283B"), PanelElevated: lipgloss.Color("#2A2F44"), + StatusBar: lipgloss.Color("#24283B"), + Footer: lipgloss.Color("#16161E"), Border: lipgloss.Color("#3B4261"), BorderActive: lipgloss.Color("#7AA2F7"), Text: lipgloss.Color("#C0CAF5"), Muted: lipgloss.Color("#9AA5CE"), Accent: lipgloss.Color("#BB9AF7"), + Info: lipgloss.Color("#73DACA"), + Success: lipgloss.Color("#9ECE6A"), Selection: lipgloss.Color("#292E42"), + Hover: lipgloss.Color("#252A3D"), + Marked: lipgloss.Color("#F7768E"), Warning: lipgloss.Color("#E0AF68"), Danger: lipgloss.Color("#F7768E"), + ActivePath: lipgloss.Color("#73DACA"), + ConfirmButton: lipgloss.Color("#9ECE6A"), + CancelButton: lipgloss.Color("#F7768E"), + ProgressFill: lipgloss.Color("#7AA2F7"), + ProgressEmpty: lipgloss.Color("#3B4261"), + HelpNav: lipgloss.Color("#7AA2F7"), + HelpPanels: lipgloss.Color("#E0AF68"), + HelpDialogs: lipgloss.Color("#BB9AF7"), + HelpMouse: lipgloss.Color("#F7768E"), Folder: lipgloss.Color("#7AA2F7"), TextFile: lipgloss.Color("#9ECE6A"), ConfigFile: lipgloss.Color("#E0AF68"), @@ -112,14 +157,29 @@ func Resolve(name string) (Palette, error) { Panel: lipgloss.Color("#282828"), PanelInactive: lipgloss.Color("#32302F"), PanelElevated: lipgloss.Color("#3C3836"), + StatusBar: lipgloss.Color("#32302F"), + Footer: lipgloss.Color("#1D2021"), Border: lipgloss.Color("#504945"), BorderActive: lipgloss.Color("#FABD2F"), Text: lipgloss.Color("#EBDBB2"), Muted: lipgloss.Color("#BDAE93"), Accent: lipgloss.Color("#83A598"), + Info: lipgloss.Color("#8EC07C"), + Success: lipgloss.Color("#B8BB26"), Selection: lipgloss.Color("#3C3836"), + Hover: lipgloss.Color("#45403D"), + Marked: lipgloss.Color("#FB4934"), Warning: lipgloss.Color("#FE8019"), Danger: lipgloss.Color("#FB4934"), + ActivePath: lipgloss.Color("#8EC07C"), + ConfirmButton: lipgloss.Color("#B8BB26"), + CancelButton: lipgloss.Color("#FB4934"), + ProgressFill: lipgloss.Color("#FABD2F"), + ProgressEmpty: lipgloss.Color("#504945"), + HelpNav: lipgloss.Color("#83A598"), + HelpPanels: lipgloss.Color("#FABD2F"), + HelpDialogs: lipgloss.Color("#D3869B"), + HelpMouse: lipgloss.Color("#FB4934"), Folder: lipgloss.Color("#83A598"), TextFile: lipgloss.Color("#B8BB26"), ConfigFile: lipgloss.Color("#FABD2F"), @@ -135,14 +195,29 @@ func Resolve(name string) (Palette, error) { Panel: lipgloss.Color("#3B4252"), PanelInactive: lipgloss.Color("#434C5E"), PanelElevated: lipgloss.Color("#4C566A"), + StatusBar: lipgloss.Color("#434C5E"), + Footer: lipgloss.Color("#2E3440"), Border: lipgloss.Color("#4C566A"), BorderActive: lipgloss.Color("#88C0D0"), Text: lipgloss.Color("#ECEFF4"), Muted: lipgloss.Color("#D8DEE9"), Accent: lipgloss.Color("#81A1C1"), + Info: lipgloss.Color("#8FBCBB"), + Success: lipgloss.Color("#A3BE8C"), Selection: lipgloss.Color("#434C5E"), + Hover: lipgloss.Color("#505A70"), + Marked: lipgloss.Color("#BF616A"), Warning: lipgloss.Color("#EBCB8B"), Danger: lipgloss.Color("#BF616A"), + ActivePath: lipgloss.Color("#8FBCBB"), + ConfirmButton: lipgloss.Color("#A3BE8C"), + CancelButton: lipgloss.Color("#BF616A"), + ProgressFill: lipgloss.Color("#88C0D0"), + ProgressEmpty: lipgloss.Color("#4C566A"), + HelpNav: lipgloss.Color("#81A1C1"), + HelpPanels: lipgloss.Color("#EBCB8B"), + HelpDialogs: lipgloss.Color("#B48EAD"), + HelpMouse: lipgloss.Color("#BF616A"), Folder: lipgloss.Color("#81A1C1"), TextFile: lipgloss.Color("#A3BE8C"), ConfigFile: lipgloss.Color("#EBCB8B"), diff --git a/internal/ui/model.go b/internal/ui/model.go index ac8bd89..a0d2e2d 100644 --- a/internal/ui/model.go +++ b/internal/ui/model.go @@ -1390,7 +1390,7 @@ func renderStatus(m Model) string { return lipgloss.NewStyle(). Width(m.width). Padding(0, 1). - Background(m.palette.PanelInactive). + Background(m.palette.StatusBar). Foreground(m.palette.Text). Render(summary + " :: " + m.status) } @@ -1403,12 +1403,12 @@ func renderFooter(m Model) string { continue } keyView := lipgloss.NewStyle(). - Background(m.palette.Background). + Background(m.palette.Footer). Foreground(m.palette.FooterKey). Bold(true). Render(help.Key) descView := lipgloss.NewStyle(). - Background(m.palette.Background). + Background(m.palette.Footer). Foreground(m.palette.Text). Render(" " + help.Desc) parts = append(parts, keyView+descView) @@ -1416,7 +1416,7 @@ func renderFooter(m Model) string { line := strings.Join(parts, " ") if m.selectMode { modeLabel := lipgloss.NewStyle(). - Foreground(m.palette.Accent). + Foreground(m.palette.Info). Bold(true). Render("SELECT TEXT MODE") if line != "" { @@ -1429,7 +1429,7 @@ func renderFooter(m Model) string { m.width, lipgloss.Left, line, - lipgloss.WithWhitespaceBackground(m.palette.Background), + lipgloss.WithWhitespaceBackground(m.palette.Footer), ) } @@ -1557,7 +1557,7 @@ func renderConfirmActions(width int, palette theme.Palette) string { confirm := lipgloss.NewStyle(). Width(buttonWidth). Align(lipgloss.Center). - Background(palette.TextFile). + Background(palette.ConfirmButton). Foreground(palette.Background). Bold(true). Render("Enter / y") @@ -1565,7 +1565,7 @@ func renderConfirmActions(width int, palette theme.Palette) string { cancel := lipgloss.NewStyle(). Width(buttonWidth). Align(lipgloss.Center). - Background(palette.Danger). + Background(palette.CancelButton). Foreground(palette.Background). Bold(true). Render("Esc / n") @@ -1604,7 +1604,6 @@ func renderHelpModal(modal modalState, palette theme.Palette, width int) string noteStyle := lipgloss.NewStyle().Width(contentWidth).Background(palette.Panel).Foreground(palette.FooterKey).Bold(true) spacer := lipgloss.NewStyle().Width(contentWidth).Background(palette.Panel).Render(" ") - sectionColors := []lipgloss.Color{palette.Accent, palette.Warning, palette.FooterKey, palette.Danger} keyColStyle := lipgloss.NewStyle().Width(24).Background(palette.Panel).Foreground(palette.FooterKey).Bold(true) descColStyle := lipgloss.NewStyle().Background(palette.Panel).Foreground(palette.Text) @@ -1618,7 +1617,6 @@ func renderHelpModal(modal modalState, palette theme.Palette, width int) string BorderBackground(palette.Panel) lines := []string{titleStyle.Render(modal.title), spacer} - sectionIdx := 0 for _, raw := range strings.Split(modal.body, "\n") { trimmed := strings.TrimSpace(raw) if trimmed == "" { @@ -1642,8 +1640,7 @@ func renderHelpModal(modal modalState, palette theme.Palette, width int) string continue } - sectionColor := sectionColorForHeader(trimmed, sectionIdx, sectionColors, palette) - sectionIdx++ + sectionColor := sectionColorForHeader(trimmed, palette) header := lipgloss.NewStyle(). Width(contentWidth). Background(palette.Panel). @@ -1674,18 +1671,18 @@ func splitHelpItem(raw string) (string, string) { return value, "" } -func sectionColorForHeader(header string, idx int, fallback []lipgloss.Color, palette theme.Palette) lipgloss.Color { +func sectionColorForHeader(header string, palette theme.Palette) lipgloss.Color { switch header { case "Navigation": - return palette.Folder + return palette.HelpNav case "View and Panels": - return fallback[1] + return palette.HelpPanels case "Dialogs and Transfers": - return palette.BinaryFile + return palette.HelpDialogs case "Mouse": - return fallback[3] + return palette.HelpMouse default: - return fallback[idx%len(fallback)] + return palette.Accent } } @@ -1749,8 +1746,8 @@ func renderProgressBar(ratio float64, width int, palette theme.Palette) string { filled = 0 } - bar := lipgloss.NewStyle().Foreground(palette.Accent).Render(strings.Repeat("█", filled)) - rest := lipgloss.NewStyle().Foreground(palette.Border).Render(strings.Repeat("░", width-filled)) + bar := lipgloss.NewStyle().Foreground(palette.ProgressFill).Render(strings.Repeat("█", filled)) + rest := lipgloss.NewStyle().Foreground(palette.ProgressEmpty).Render(strings.Repeat("░", width-filled)) percent := fmt.Sprintf(" %3.0f%%", ratio*100) return bar + rest + percent } diff --git a/internal/ui/pane.go b/internal/ui/pane.go index 784d41a..59ff78d 100644 --- a/internal/ui/pane.go +++ b/internal/ui/pane.go @@ -222,7 +222,7 @@ func renderPaneHeader(pane BrowserPane, cfg config.Config, palette theme.Palette Foreground(palette.Text). Bold(active) if active { - pathStyle = pathStyle.Foreground(palette.TextFile) + pathStyle = pathStyle.Foreground(palette.ActivePath) } return lipgloss.NewStyle(). @@ -292,11 +292,11 @@ func renderEntryRow(entry vfs.Entry, cfg config.Config, width int, selected bool rowBackground := baseBackground switch { case marked: - rowBackground = palette.Danger + rowBackground = palette.Marked case selected: rowBackground = palette.Selection case hovered: - rowBackground = palette.PanelElevated + rowBackground = palette.Hover } parts := make([]string, 0, len(columns))