diff --git a/internal/style/components.go b/internal/style/components.go index 866b805..4508833 100644 --- a/internal/style/components.go +++ b/internal/style/components.go @@ -15,6 +15,25 @@ func NewViewport() viewport.Model { return vp } +func ViewportView(vp *viewport.Model) string { + v := vp.View() + if vp.AtBottom() { + return v + } + lines := strings.Split(v, "\n") + if len(lines) == 0 { + return v + } + arrow := lipgloss.NewStyle().Foreground(S.Subtle).Render("↓") + arrowW := lipgloss.Width(arrow) + inner := vp.Width() - 2*arrowW + if inner < 0 { + inner = 0 + } + lines[len(lines)-1] = arrow + strings.Repeat(" ", inner) + arrow + return strings.Join(lines, "\n") +} + func NewPaginator() paginator.Model { p := paginator.New() p.Type = paginator.Dots diff --git a/internal/style/highlight.go b/internal/style/highlight.go index a10e8c5..d746291 100644 --- a/internal/style/highlight.go +++ b/internal/style/highlight.go @@ -18,6 +18,7 @@ func Paint(c color.Color, s string) string { func HighlightHTTP(raw string) string { raw = strings.ReplaceAll(raw, "\r\n", "\n") raw = strings.ReplaceAll(raw, "\r", "\n") + raw = strings.ReplaceAll(raw, "\t", " ") idx := strings.Index(raw, "\n\n") if idx == -1 { return highlightHeaders(raw) diff --git a/internal/ui/diff/view.go b/internal/ui/diff/view.go index 6f613ed..745a672 100644 --- a/internal/ui/diff/view.go +++ b/internal/ui/diff/view.go @@ -58,8 +58,8 @@ func (m *Model) renderPanels(panelH int) string { rightBorder = s.PanelFocused } - left := style.RenderWithTitle(leftBorder, leftTitle, m.leftViewport.View(), leftW, panelH) - right := style.RenderWithTitle(rightBorder, rightTitle, m.rightViewport.View(), rightW, panelH) + left := style.RenderWithTitle(leftBorder, leftTitle, style.ViewportView(&m.leftViewport), leftW, panelH) + right := style.RenderWithTitle(rightBorder, rightTitle, style.ViewportView(&m.rightViewport), rightW, panelH) return lipgloss.JoinHorizontal(lipgloss.Top, left, right) } diff --git a/internal/ui/findings/view.go b/internal/ui/findings/view.go index c740a39..75585e7 100644 --- a/internal/ui/findings/view.go +++ b/internal/ui/findings/view.go @@ -45,7 +45,7 @@ func (m *Model) renderBodyPanel(h int) string { if len(m.findings) > 0 { title = m.findings[m.cursor].Title } - return style.RenderWithTitle(s.Panel, title, m.bodyViewport.View(), m.width, h) + return style.RenderWithTitle(s.Panel, title, style.ViewportView(&m.bodyViewport), m.width, h) } func (m *Model) renderList() string { diff --git a/internal/ui/history/view.go b/internal/ui/history/view.go index a29acf4..6fc8753 100644 --- a/internal/ui/history/view.go +++ b/internal/ui/history/view.go @@ -46,7 +46,7 @@ func (m *Model) renderBodyPanel(h int) string { if m.focusedPanel == panelResponse { title = icons.I.Response + "Response" } - return style.RenderWithTitle(s.Panel, title, m.bodyViewport.View(), m.width, h) + return style.RenderWithTitle(s.Panel, title, style.ViewportView(&m.bodyViewport), m.width, h) } func (m *Model) renderStatusBar() string { diff --git a/internal/ui/intercept/view.go b/internal/ui/intercept/view.go index f52aa82..7e9f4d3 100644 --- a/internal/ui/intercept/view.go +++ b/internal/ui/intercept/view.go @@ -87,7 +87,7 @@ func (m *Model) renderBodyPanel(h int) string { if m.editing { body = m.textarea.View() } else { - body = m.bodyViewport.View() + body = style.ViewportView(&m.bodyViewport) } border := s.Panel diff --git a/internal/ui/plugins/view.go b/internal/ui/plugins/view.go index a4a1435..785e122 100644 --- a/internal/ui/plugins/view.go +++ b/internal/ui/plugins/view.go @@ -73,7 +73,7 @@ func (m *Model) renderDetailPanel(h int) string { s.Faint.Render(filepath.Base(info.FilePath)), ) - parts := []string{header, m.detailViewport.View()} + parts := []string{header, style.ViewportView(&m.detailViewport)} if m.hasConfig() { var configLabel string diff --git a/internal/ui/replay/view.go b/internal/ui/replay/view.go index 44d1654..418856b 100644 --- a/internal/ui/replay/view.go +++ b/internal/ui/replay/view.go @@ -57,7 +57,7 @@ func (m *Model) renderRequestPanel(w, h int) string { body = m.textarea.View() border = s.PanelFocused } else { - body = m.requestViewport.View() + body = style.ViewportView(&m.requestViewport) if m.focusedPanel == panelRequest { border = s.PanelFocused } @@ -71,7 +71,7 @@ func (m *Model) renderResponsePanel(w, h int) string { if !m.editing && m.focusedPanel == panelResponse { border = s.PanelFocused } - return style.RenderWithTitle(border, icons.I.Response+"Response", m.responseViewport.View(), w, h) + return style.RenderWithTitle(border, icons.I.Response+"Response", style.ViewportView(&m.responseViewport), w, h) } func (m *Model) renderStatusBar() string {