release: v0.51.511 — virtual transcript renders during programmatic scrolls (#4468)

Fixes a regression from #4434 (v0.51.500). Author (rodboev) gave explicit
go-ahead. Gated earlier: Codex SAFE + Opus SAFE + browser-smoke + suite.

Co-authored-by: rodboev <rodboev@users.noreply.github.com>

Closes #4468
This commit is contained in:
nesquena-hermes
2026-06-19 04:36:39 +00:00
parent 0498e0e345
commit f040d2a047
2 changed files with 7 additions and 1 deletions
+6
View File
@@ -3,6 +3,12 @@
## [Unreleased]
## [v0.51.511] — 2026-06-19 — Release RV (virtual transcript renders during programmatic scrolls)
### Fixed
- **Scrolling back down through a long virtualized transcript no longer leaves blank gaps (#4346 family; regression from #4434/v0.51.500).** The message virtual-window render was scheduled behind the scroll handler's `_programmaticScroll` guard, so when the measurement-compensation path adjusted `scrollTop` and briefly left that flag set, scroll events were dropped and the DOM froze (spacer + first row stuck while the computed window advanced). The virtual-window render now always fires on scroll; the guard still suppresses the pin/cue/prefetch bookkeeping that genuinely shouldn't react to programmatic scrolls. Thanks @rodboev.
## [v0.51.510] — 2026-06-19 — Release RU (Kanban task workspace + dependency controls)
### Added
+1 -1
View File
@@ -3657,6 +3657,7 @@ if(typeof window!=='undefined'){
if(!el) return;
let _scrollRaf=0;
el.addEventListener('scroll',()=>{
_scheduleMessageVirtualizedRender();
if(_programmaticScroll) return; // ignore scrolls we triggered ourselves
_markMessageVirtualScrollActive();
cancelAnimationFrame(_scrollRaf);
@@ -3693,7 +3694,6 @@ if(typeof window!=='undefined'){
const showBottomButton=!_scrollPinned && el.scrollHeight-top-el.clientHeight>80;
_syncScrollToBottomCue(showBottomButton,{newMessage:_newMessageCueVisible});
if(typeof _updateSessionStartJumpButton==='function') _updateSessionStartJumpButton();
_scheduleMessageVirtualizedRender();
// Prefetch older messages before the reader hits the hard top. Prepending
// then preserving scrollTop is seamless only if there is runway left for
// the user's continued upward wheel/touch movement.