From 4922f3704d6b6a070b036b635cdc15e268426824 Mon Sep 17 00:00:00 2001 From: Hadi Date: Fri, 29 May 2026 11:13:57 +0200 Subject: [PATCH] fix: make empty text responsive Signed-off-by: Hadi --- internal/ui/diff/model.go | 4 ++-- internal/ui/findings/view.go | 2 +- internal/ui/history/update.go | 2 +- internal/ui/history/view.go | 4 ++-- internal/ui/intercept/view.go | 4 ++-- internal/ui/plugins/view.go | 6 +++--- internal/ui/replay/update.go | 4 ++-- internal/ui/replay/view.go | 2 +- internal/util/util.go | 8 ++++++++ 9 files changed, 22 insertions(+), 14 deletions(-) diff --git a/internal/ui/diff/model.go b/internal/ui/diff/model.go index b11ac23..03f76d1 100644 --- a/internal/ui/diff/model.go +++ b/internal/ui/diff/model.go @@ -300,7 +300,7 @@ func (m *Model) refreshViewports() { placeholder := lipgloss.Place( m.leftViewport.Width(), m.leftViewport.Height(), lipgloss.Center, lipgloss.Center, - ilovetui.S.Faint.Render(util.CenterLines("<(^_^)>", "send two entries here to compare")), + ilovetui.S.Faint.Render(util.EmptyState(m.leftViewport.Width(), "<(^_^)>", "send two entries here to compare")), ) m.leftViewport.SetContent(placeholder) m.rightViewport.SetContent("") @@ -312,7 +312,7 @@ func (m *Model) refreshViewports() { placeholder := lipgloss.Place( m.rightViewport.Width(), m.rightViewport.Height(), lipgloss.Center, lipgloss.Center, - ilovetui.S.Faint.Render(util.CenterLines("(・3・)", "waiting for second entry…")), + ilovetui.S.Faint.Render(util.EmptyState(m.rightViewport.Width(), "(・3・)", "waiting for second entry…")), ) m.rightViewport.SetContent(placeholder) return diff --git a/internal/ui/findings/view.go b/internal/ui/findings/view.go index 11c68e2..8767475 100644 --- a/internal/ui/findings/view.go +++ b/internal/ui/findings/view.go @@ -52,7 +52,7 @@ func (m *Model) renderList() string { return lipgloss.Place( m.listViewport.Width(), m.listViewport.Height(), lipgloss.Center, lipgloss.Center, - ilovetui.S.Faint.Render(util.CenterLines("(҂◡_◡) ᕤ", "no findings")), + ilovetui.S.Faint.Render(util.EmptyState(m.listViewport.Width(), "(҂◡_◡) ᕤ", "no findings")), ) } diff --git a/internal/ui/history/update.go b/internal/ui/history/update.go index 2696f1e..32ac5bd 100644 --- a/internal/ui/history/update.go +++ b/internal/ui/history/update.go @@ -355,7 +355,7 @@ func (m *Model) refreshBody() { } if raw == "" { w, h := m.bodyViewport.Width(), m.bodyViewport.Height() - m.bodyViewport.SetContent(lipgloss.Place(w, h, lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.CenterLines("(˘・_・˘)", "no response stored")))) + m.bodyViewport.SetContent(lipgloss.Place(w, h, lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.EmptyState(w, "(˘・_・˘)", "no response stored")))) return } m.bodyViewport.SetContent(style.HighlightHTTP(raw)) diff --git a/internal/ui/history/view.go b/internal/ui/history/view.go index 102a4f1..3b1e399 100644 --- a/internal/ui/history/view.go +++ b/internal/ui/history/view.go @@ -82,9 +82,9 @@ func (m *Model) renderList() string { ) } if len(m.entries) == 0 { - msg := util.CenterLines("(⌐■_■)", "no history yet") + msg := util.EmptyState(m.listViewport.Width(), "(⌐■_■)", "no history yet") if m.searchKind != searchKindOff { - msg = util.CenterLines("ʕノ•ᴥ•ʔノ ︵ ┻━┻", "no results") + msg = util.EmptyState(m.listViewport.Width(), "ʕノ•ᴥ•ʔノ ︵ ┻━┻", "no results") } return lipgloss.Place( m.listViewport.Width(), m.listViewport.Height(), diff --git a/internal/ui/intercept/view.go b/internal/ui/intercept/view.go index 081ee5f..2bf97c3 100644 --- a/internal/ui/intercept/view.go +++ b/internal/ui/intercept/view.go @@ -100,7 +100,7 @@ func (m *Model) renderStatusBar() string { func (m *Model) renderList() string { if len(m.queue) == 0 { - return lipgloss.Place(m.listViewport.Width(), m.listViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.CenterLines("(。◕‿‿◕。)", "waiting for a request"))) + return lipgloss.Place(m.listViewport.Width(), m.listViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.EmptyState(m.listViewport.Width(), "(。◕‿‿◕。)", "waiting for a request"))) } start, end := util.PageBounds(m.pager, len(m.queue)) @@ -149,7 +149,7 @@ func (m *Model) renderList() string { func (m *Model) renderResponseList() string { if len(m.responseQueue) == 0 { - return lipgloss.Place(m.responseViewport.Width(), m.responseViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.CenterLines("(҂◡_◡)", "no response yet"))) + return lipgloss.Place(m.responseViewport.Width(), m.responseViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.EmptyState(m.responseViewport.Width(), "(҂◡_◡)", "no response yet"))) } start, end := util.PageBounds(m.responsePager, len(m.responseQueue)) diff --git a/internal/ui/plugins/view.go b/internal/ui/plugins/view.go index 0d5de11..c9eaf0a 100644 --- a/internal/ui/plugins/view.go +++ b/internal/ui/plugins/view.go @@ -15,7 +15,7 @@ import ( func (m Model) View() tea.View { if m.width == 0 || m.manager == nil { - return tea.NewView(lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.CenterLines("(._.)~*.'", "no plugins loaded")))) + return tea.NewView(lipgloss.Place(m.width, m.height, lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.EmptyState(m.width, "(._.)~*.'", "no plugins loaded")))) } listH, detailH := ilovetui.SplitH(m.height, m.renderStatusBar(), 0.4) @@ -127,9 +127,9 @@ func (m *Model) renderStatusBar() string { func (m *Model) renderList() string { if len(m.filtered) == 0 { - msg := util.CenterLines("(ง •̀_•́)ง", "no plugins", "", "spilltea --add-default-plugins") + msg := util.EmptyState(m.listViewport.Width(), "(ง •̀_•́)ง", "no plugins", "", "spilltea --add-default-plugins") if m.filter != "" { - msg = util.CenterLines("= _ =", "no results") + msg = util.EmptyState(m.listViewport.Width(), "= _ =", "no results") } return lipgloss.Place( m.listViewport.Width(), m.listViewport.Height(), diff --git a/internal/ui/replay/update.go b/internal/ui/replay/update.go index 2467368..a738e46 100644 --- a/internal/ui/replay/update.go +++ b/internal/ui/replay/update.go @@ -358,11 +358,11 @@ func (m *Model) refreshBody() { m.requestViewport.SetXOffset(0) if e.Sending { - m.responseViewport.SetContent(lipgloss.Place(m.responseViewport.Width(), m.responseViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.CenterLines("(ノ◕ヮ◕)ノ*:・゚", "sending...")))) + m.responseViewport.SetContent(lipgloss.Place(m.responseViewport.Width(), m.responseViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.EmptyState(m.responseViewport.Width(), "(ノ◕ヮ◕)ノ*:・゚", "sending...")))) } else if e.ResponseRaw != "" { m.responseViewport.SetContent(style.HighlightHTTP(e.ResponseRaw)) } else { - m.responseViewport.SetContent(lipgloss.Place(m.responseViewport.Width(), m.responseViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.CenterLines("( •_•)>⌐■", "press send to fire")))) + m.responseViewport.SetContent(lipgloss.Place(m.responseViewport.Width(), m.responseViewport.Height(), lipgloss.Center, lipgloss.Center, ilovetui.S.Faint.Render(util.EmptyState(m.responseViewport.Width(), "( •_•)>⌐■", "press send to fire")))) } m.responseViewport.SetYOffset(0) m.responseViewport.SetXOffset(0) diff --git a/internal/ui/replay/view.go b/internal/ui/replay/view.go index e1294ac..2aeb154 100644 --- a/internal/ui/replay/view.go +++ b/internal/ui/replay/view.go @@ -81,7 +81,7 @@ func (m *Model) renderList() string { return lipgloss.Place( m.listViewport.Width(), m.listViewport.Height(), lipgloss.Center, lipgloss.Center, - ilovetui.S.Faint.Render(util.CenterLines("(╥﹏╥)", "send a request from History or Intercept")), + ilovetui.S.Faint.Render(util.EmptyState(m.listViewport.Width(), "(╥﹏╥)", "send a request from History or Intercept")), ) } diff --git a/internal/util/util.go b/internal/util/util.go index 703cdff..5f43989 100644 --- a/internal/util/util.go +++ b/internal/util/util.go @@ -14,6 +14,14 @@ func Truncate(s string, max int) string { return s[:max-1] + "…" } +// EmptyState renders centered placeholder lines, word-wrapping to fit maxW. +func EmptyState(maxW int, lines ...string) string { + return lipgloss.NewStyle(). + Width(maxW). + AlignHorizontal(lipgloss.Center). + Render(strings.Join(lines, "\n")) +} + // CenterLines centers each line horizontally relative to the longest one. func CenterLines(lines ...string) string { maxWidth := 0