fix: SFTP pane width — account for border in halfW calculation, fix innerW to maxW-2 (padding only), truncate filter line
Root cause: lipgloss Width(maxW) = content area inside border, border adds 2 chars extra. - halfW was t.width/2, should be t.width/2-2 (reserve border per pane) - innerW was maxW-4, should be maxW-2 (padding only, not border) - Each pane total = maxW + 2 (content + border)
This commit is contained in:
@@ -541,14 +541,19 @@ func (t *SFTPBrowserTab) View() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Responsive pane layout: stack vertically on narrow terminals
|
// Responsive pane layout: stack vertically on narrow terminals
|
||||||
|
// Each pane renders at maxW+2 total (maxW content + 2 border chars)
|
||||||
var leftView, rightView string
|
var leftView, rightView string
|
||||||
if t.width < 50 {
|
if t.width < 50 {
|
||||||
// Stack vertically — each pane gets full width
|
// Stack vertically — each pane gets full width minus border
|
||||||
leftView = t.renderPane(&t.left, paneLocal, t.width)
|
paneW := t.width - 2
|
||||||
rightView = t.renderPane(&t.right, paneRemote, t.width)
|
if paneW < 20 {
|
||||||
|
paneW = 20
|
||||||
|
}
|
||||||
|
leftView = t.renderPane(&t.left, paneLocal, paneW)
|
||||||
|
rightView = t.renderPane(&t.right, paneRemote, paneW)
|
||||||
} else {
|
} else {
|
||||||
// Side by side — each pane gets half width
|
// Side by side — reserve 2 chars border per pane
|
||||||
halfW := t.width / 2
|
halfW := t.width/2 - 2
|
||||||
if halfW < 20 {
|
if halfW < 20 {
|
||||||
halfW = 20
|
halfW = 20
|
||||||
}
|
}
|
||||||
@@ -601,8 +606,9 @@ func (t *SFTPBrowserTab) renderPane(p *sftpPane, pt paneType, maxW int) string {
|
|||||||
paneStyle = StylePaneActive
|
paneStyle = StylePaneActive
|
||||||
}
|
}
|
||||||
|
|
||||||
// Inner content width: border(2) + padding(2) = 4 overhead
|
// Inner content width: Width(maxW) sets content area inside border
|
||||||
innerW := maxW - 4
|
// Padding(0,1) takes 2 chars → inner text = maxW - 2
|
||||||
|
innerW := maxW - 2
|
||||||
if innerW < 5 {
|
if innerW < 5 {
|
||||||
innerW = 5
|
innerW = 5
|
||||||
}
|
}
|
||||||
@@ -689,7 +695,11 @@ func (t *SFTPBrowserTab) renderPane(p *sftpPane, pt paneType, maxW int) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if p.filterMode {
|
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()
|
inner := titleBar + "\n" + content.String()
|
||||||
|
|||||||
Reference in New Issue
Block a user