diff --git a/internal/app/context_table.go b/internal/app/context_table.go index da2943f..bd909a7 100644 --- a/internal/app/context_table.go +++ b/internal/app/context_table.go @@ -35,9 +35,7 @@ func newContextTable() table.Model { styles := table.DefaultStyles() styles.Header = dimStyle.Copy().Bold(true).Padding(0, 1) styles.Cell = table.DefaultStyles().Cell.Copy() - styles.Selected = selectedStyle.Copy(). - Bold(true). - Background(lipgloss.Color("236")) + styles.Selected = contextTableSelectedStyle() t := table.New( table.WithColumns(contextTableColumns(0)), @@ -51,6 +49,14 @@ func newContextTable() table.Model { return t } +func contextTableSelectedStyle() lipgloss.Style { + base := selectedStyle + return base. + Bold(true). + Foreground(lipgloss.Color("255")). + Background(lipgloss.Color("57")) +} + func (m *Model) syncContextTable() { m.contextTable.SetColumns(contextTableColumns(m.width)) m.contextTable.SetWidth(contextTableWidth(m.width)) diff --git a/internal/app/screen_context.go b/internal/app/screen_context.go index cd8d564..1c44239 100644 --- a/internal/app/screen_context.go +++ b/internal/app/screen_context.go @@ -255,8 +255,10 @@ func (m Model) viewContextPicker() string { b.WriteString(renderDetailLine("Shell env", m.displayShellEnvContext())) b.WriteString("\n\n") - b.WriteString(m.renderFilterValue(filterContexts)) - b.WriteString("\n\n") + if filter := m.renderFilterValue(filterContexts); filter != "" { + b.WriteString(filter) + b.WriteString("\n\n") + } if len(m.ctxList) == 0 { panel.WriteString(normalStyle.Render(" No contexts defined.")) diff --git a/internal/app/styles_test.go b/internal/app/styles_test.go index 6a38fd9..f220c83 100644 --- a/internal/app/styles_test.go +++ b/internal/app/styles_test.go @@ -190,3 +190,33 @@ func TestContextPickerPanelDoesNotOverflowHelpBar(t *testing.T) { t.Fatalf("expected help bar below panel border, got border line %d help line %d in %q", borderLine, helpLine, view) } } + +func TestContextPickerKeepsSelectionVisibleInCompactTerminal(t *testing.T) { + m := New(testConfig(), "", "dev") + m.width = 80 + m.height = 14 + + updated, _ := m.Update(contextsLoadedMsg{contexts: styleTestContexts()}) + m = updated.(Model) + view := stripANSI(m.View()) + + for _, want := range []string{"Select Context", "prod", "q: quit"} { + if !strings.Contains(view, want) { + t.Fatalf("expected compact context picker to keep %q visible, got %q", want, view) + } + } + if strings.Contains(view, "...") { + t.Fatalf("expected compact context picker to fit without middle truncation, got %q", view) + } +} + +func TestContextTableSelectedStyleUsesHighContrast(t *testing.T) { + base := selectedStyle + want := base. + Bold(true). + Foreground(lipgloss.Color("255")). + Background(lipgloss.Color("57")) + if !reflect.DeepEqual(contextTableSelectedStyle(), want) { + t.Fatal("expected context table selected style to use high-contrast foreground/background") + } +}