diff --git a/pkg/tui/sftp_browser_tab.go b/pkg/tui/sftp_browser_tab.go index 6d351e9..78fc0e9 100644 --- a/pkg/tui/sftp_browser_tab.go +++ b/pkg/tui/sftp_browser_tab.go @@ -541,14 +541,19 @@ func (t *SFTPBrowserTab) View() string { } // Responsive pane layout: stack vertically on narrow terminals + // Each pane renders at maxW+2 total (maxW content + 2 border chars) var leftView, rightView string if t.width < 50 { - // Stack vertically — each pane gets full width - leftView = t.renderPane(&t.left, paneLocal, t.width) - rightView = t.renderPane(&t.right, paneRemote, t.width) + // Stack vertically — each pane gets full width minus border + paneW := t.width - 2 + if paneW < 20 { + paneW = 20 + } + leftView = t.renderPane(&t.left, paneLocal, paneW) + rightView = t.renderPane(&t.right, paneRemote, paneW) } else { - // Side by side — each pane gets half width - halfW := t.width / 2 + // Side by side — reserve 2 chars border per pane + halfW := t.width/2 - 2 if halfW < 20 { halfW = 20 } @@ -601,8 +606,9 @@ func (t *SFTPBrowserTab) renderPane(p *sftpPane, pt paneType, maxW int) string { paneStyle = StylePaneActive } - // Inner content width: border(2) + padding(2) = 4 overhead - innerW := maxW - 4 + // Inner content width: Width(maxW) sets content area inside border + // Padding(0,1) takes 2 chars → inner text = maxW - 2 + innerW := maxW - 2 if innerW < 5 { innerW = 5 } @@ -689,7 +695,11 @@ func (t *SFTPBrowserTab) renderPane(p *sftpPane, pt paneType, maxW int) string { } if p.filterMode { - content.WriteString("\n" + SubtitleStyle.Render("Filter: "+p.filter+"_")) + filterLine := "Filter: " + p.filter + "_" + if lipgloss.Width(filterLine) > innerW { + filterLine = truncateStr(filterLine, innerW) + } + content.WriteString("\n" + SubtitleStyle.Render(filterLine)) } inner := titleBar + "\n" + content.String()