fix(tui): clamp diff scroll offset to last full page

The diff overlay incremented diffScrollOffset on every down-key with no
upper bound; the render clamped only the displayed offset, so the stored
value grew unbounded and the up-key appeared dead for N presses. Clamp
the increment against a new diffMaxScroll() (len(lines) - body height),
shared with the render path via diffBodyHeight().
This commit is contained in:
2026-06-02 23:39:38 +04:00
parent 1017bfffef
commit 6956102cf7
2 changed files with 25 additions and 7 deletions
+22 -6
View File
@@ -94,20 +94,36 @@ func (m Model) renderApproval(base string) string {
return m.center(modal)
}
func (m Model) diffModal() string {
t := m.theme
w := m.modalWidth()
// diffBodyHeight is the number of diff lines visible in the diff modal body.
func (m Model) diffBodyHeight() int {
h := m.height * 70 / 100
if h < 8 {
h = 8
}
bodyH := h - 6
return h - 6
}
// diffMaxScroll is the largest scroll offset that still fills the body with
// diff lines, keeping the last page anchored to the bottom of the modal.
func (m Model) diffMaxScroll() int {
lines := strings.Split(strings.TrimRight(m.currentDiff(), "\n"), "\n")
max := len(lines) - m.diffBodyHeight()
if max < 0 {
max = 0
}
return max
}
func (m Model) diffModal() string {
t := m.theme
w := m.modalWidth()
bodyH := m.diffBodyHeight()
diff := m.currentDiff()
lines := strings.Split(strings.TrimRight(diff, "\n"), "\n")
off := m.diffScrollOffset
if off > len(lines)-1 {
off = len(lines) - 1
if off > m.diffMaxScroll() {
off = m.diffMaxScroll()
}
if off < 0 {
off = 0