fix(web): a selection driven below the fold scrolls itself into view

improvise-jq8l. `web/app.js` called `scrollIntoView` NOWHERE, so a selection
moved past the bottom of `#grid` stayed there, invisible, with no way back but
scrolling by hand.

What the ticket did not predict: this is NOT a projection bug and NOT a
`row_offset` bug, and the acceptance criteria's talk of reconciling the absolute
selection against the announced window describes work `render.rs` already does.
The row had been sent. `#grid` has `overflow: auto`, `ROW_PX`/`COL_PX`
UNDER-estimate (a real row measures 28.6px against the assumed 26) and inline
group rows are deliberately not charged for at all, so the page renders more rows
than its own box can show and the overflow is the DOM's. `block: "nearest"` is
the whole option: it scrolls only when the element is out of view, and it scrolls
the nearest container rather than the document.

The expensive half was the fixture. Neither shipped document can reach the state
— `web/demo.improv` is four rows, `harness/fixtures/grouped.improv` is eight, and
a probe measured BOTH at `scrollHeight === clientHeight` in a 484px box. The
assertion would have passed against a page that never scrolls, which is why the
spec asserts the overflow exists before it presses a key.
`harness/fixtures/tall.improv` is thirty rows in three groups; measured against
the unfixed page it gives 105px of overflow with the selected cell 96px below the
visible bottom and `scrollTop` still 0.

Tests: 25 chromium harness (was 24), Rust and node unchanged.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FC2jVn8Au7E9JPkw6bwXXH
This commit is contained in:
Edward Langley
2026-09-20 20:41:27 -07:00
parent 628f43121d
commit 852e3f8659
5 changed files with 210 additions and 0 deletions
+114
View File
@@ -0,0 +1,114 @@
v2025-04-09
# Harness tall fixture
Initial View: Tall
## View: Default
_Index: none
_Dim: none
_Measure: page
Region: row
format: ,.0
## View: Tall
_Index: none
_Dim: none
_Measure: column
Region: row
format: ,.0
## Category: _Measure
- Revenue, Cost
## Category: Region
- R01[Alpha]
- R02[Alpha]
- R03[Alpha]
- R04[Alpha]
- R05[Alpha]
- R06[Alpha]
- R07[Alpha]
- R08[Alpha]
- R09[Alpha]
- R10[Alpha]
- R11[Beta]
- R12[Beta]
- R13[Beta]
- R14[Beta]
- R15[Beta]
- R16[Beta]
- R17[Beta]
- R18[Beta]
- R19[Beta]
- R20[Beta]
- R21[Gamma]
- R22[Gamma]
- R23[Gamma]
- R24[Gamma]
- R25[Gamma]
- R26[Gamma]
- R27[Gamma]
- R28[Gamma]
- R29[Gamma]
- R30[Gamma]
## Data
Region=R01, _Measure=Cost = 50
Region=R01, _Measure=Revenue = 100
Region=R02, _Measure=Cost = 51
Region=R02, _Measure=Revenue = 101
Region=R03, _Measure=Cost = 52
Region=R03, _Measure=Revenue = 102
Region=R04, _Measure=Cost = 53
Region=R04, _Measure=Revenue = 103
Region=R05, _Measure=Cost = 54
Region=R05, _Measure=Revenue = 104
Region=R06, _Measure=Cost = 55
Region=R06, _Measure=Revenue = 105
Region=R07, _Measure=Cost = 56
Region=R07, _Measure=Revenue = 106
Region=R08, _Measure=Cost = 57
Region=R08, _Measure=Revenue = 107
Region=R09, _Measure=Cost = 58
Region=R09, _Measure=Revenue = 108
Region=R10, _Measure=Cost = 59
Region=R10, _Measure=Revenue = 109
Region=R11, _Measure=Cost = 60
Region=R11, _Measure=Revenue = 110
Region=R12, _Measure=Cost = 61
Region=R12, _Measure=Revenue = 111
Region=R13, _Measure=Cost = 62
Region=R13, _Measure=Revenue = 112
Region=R14, _Measure=Cost = 63
Region=R14, _Measure=Revenue = 113
Region=R15, _Measure=Cost = 64
Region=R15, _Measure=Revenue = 114
Region=R16, _Measure=Cost = 65
Region=R16, _Measure=Revenue = 115
Region=R17, _Measure=Cost = 66
Region=R17, _Measure=Revenue = 116
Region=R18, _Measure=Cost = 67
Region=R18, _Measure=Revenue = 117
Region=R19, _Measure=Cost = 68
Region=R19, _Measure=Revenue = 118
Region=R20, _Measure=Cost = 69
Region=R20, _Measure=Revenue = 119
Region=R21, _Measure=Cost = 70
Region=R21, _Measure=Revenue = 120
Region=R22, _Measure=Cost = 71
Region=R22, _Measure=Revenue = 121
Region=R23, _Measure=Cost = 72
Region=R23, _Measure=Revenue = 122
Region=R24, _Measure=Cost = 73
Region=R24, _Measure=Revenue = 123
Region=R25, _Measure=Cost = 74
Region=R25, _Measure=Revenue = 124
Region=R26, _Measure=Cost = 75
Region=R26, _Measure=Revenue = 125
Region=R27, _Measure=Cost = 76
Region=R27, _Measure=Revenue = 126
Region=R28, _Measure=Cost = 77
Region=R28, _Measure=Revenue = 127
Region=R29, _Measure=Cost = 78
Region=R29, _Measure=Revenue = 128
Region=R30, _Measure=Cost = 79
Region=R30, _Measure=Revenue = 129