From ea58887bfa85dfb864b2fa5c2515a703c61a8e31 Mon Sep 17 00:00:00 2001 From: patriceckhart Date: Sun, 31 May 2026 13:51:13 +0200 Subject: [PATCH] Fix login dialog cursor alignment --- packages/agent/modes/login_dialog.go | 6 +++++- packages/agent/modes/login_dialog_test.go | 25 +++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 packages/agent/modes/login_dialog_test.go diff --git a/packages/agent/modes/login_dialog.go b/packages/agent/modes/login_dialog.go index 3dd7f01..e583882 100644 --- a/packages/agent/modes/login_dialog.go +++ b/packages/agent/modes/login_dialog.go @@ -490,7 +490,11 @@ func (d *loginDialog) CursorPos(width int) (row, col int) { wrapW = 20 } urlLines := len(tui.WrapANSILine(d.url, wrapW)) - baseOffset := 1 /*frameHeader*/ + 1 /*hint*/ + urlLines + 1 /*blank*/ + 1 /*prompt*/ + // interactive.redraw wraps dialog output with padDialogFrame, which + // injects a blank row after the frame header. Count that row here so + // the real terminal cursor lands on the editor input instead of the + // prompt above it. + baseOffset := 1 /*frameHeader*/ + 1 /*padDialogFrame blank*/ + 1 /*hint*/ + urlLines + 1 /*blank*/ + 1 /*prompt*/ return baseOffset + eRow, eCol } diff --git a/packages/agent/modes/login_dialog_test.go b/packages/agent/modes/login_dialog_test.go new file mode 100644 index 0000000..bb8e410 --- /dev/null +++ b/packages/agent/modes/login_dialog_test.go @@ -0,0 +1,25 @@ +package modes + +import ( + "strings" + "testing" + + "github.com/patriceckhart/zot/packages/tui" +) + +func TestLoginDialogCursorPosMatchesPaddedInputRow(t *testing.T) { + d := newLoginDialog() + d.Open(t.TempDir()) + d.method = "oauth" + d.provider = "anthropic" + d.ShowWaiting("https://example.com/oauth/authorize?code_challenge=abc&state=xyz") + + lines := padDialogFrame(d.Render(tui.Theme{}, 80)) + row, _ := d.CursorPos(80) + if row < 0 || row >= len(lines) { + t.Fatalf("CursorPos row = %d outside rendered lines %d", row, len(lines)) + } + if got := stripANSIBytes(lines[row]); !strings.Contains(got, "▌") { + t.Fatalf("CursorPos row %d = %q; want editor input row", row, got) + } +}