- Replace virtua with @tanstack/react-virtual for chat history on all surfaces: bottom anchoring (anchorTo: end), key-stable prepend preservation, and native iOS touch/momentum deferral live in the core - Patch virtual-core to clamp the render range to real scroll bounds during transient adjustments - Rows render in normal flow inside a translated wrapper so sticky user headers keep working; measurement snapshots cached per session - Pre-write container height in scrollToFn so the browser cannot clamp anchor corrections to the stale height; hold the prepend anchor for up to 180 frames on mobile while fresh rows settle (cancelled by user input; desktop relies on core anchoring alone) - Adaptive row-size estimate from per-session measured averages; disable reveal fade-in for virtualized history rows - Mobile loads older history only through an explicit localized top button: no scroll-position trigger and no post-mount background prepend, so every insert happens from a resting state; a quiet-window hold defers any stray prepend commit while a touch gesture is active - Desktop/VS Code keep the seamless scroll-up trigger and progressive background prepend
37 lines
1.6 KiB
Diff
37 lines
1.6 KiB
Diff
diff --git a/dist/cjs/index.cjs b/dist/cjs/index.cjs
|
|
index 52ae6ca12f8d1c650ee7f1bd55573ee7d4f8b65f..bcee09df7377c37ffb220606b741c9ff434b3470 100644
|
|
--- a/dist/cjs/index.cjs
|
|
+++ b/dist/cjs/index.cjs
|
|
@@ -723,10 +723,12 @@ class Virtualizer {
|
|
this.range = null;
|
|
return null;
|
|
}
|
|
+ const maxScrollOffset = Math.max(this.getTotalSize() - outerSize, 0);
|
|
+ const effectiveScrollOffset = Math.min(Math.max(scrollOffset, 0), maxScrollOffset);
|
|
this.range = calculateRangeImpl(
|
|
measurements,
|
|
outerSize,
|
|
- scrollOffset,
|
|
+ effectiveScrollOffset,
|
|
lanes,
|
|
// Pass the typed array so binary search + forward-walk can read
|
|
// start/end directly from Float64Array, skipping the Proxy traps.
|
|
diff --git a/dist/esm/index.js b/dist/esm/index.js
|
|
index 3032c0ca457582be3f47923cba1f7d92c848745c..90b574881a073aabac99c075f7eab0a8f363fff6 100644
|
|
--- a/dist/esm/index.js
|
|
+++ b/dist/esm/index.js
|
|
@@ -721,10 +721,12 @@ class Virtualizer {
|
|
this.range = null;
|
|
return null;
|
|
}
|
|
+ const maxScrollOffset = Math.max(this.getTotalSize() - outerSize, 0);
|
|
+ const effectiveScrollOffset = Math.min(Math.max(scrollOffset, 0), maxScrollOffset);
|
|
this.range = calculateRangeImpl(
|
|
measurements,
|
|
outerSize,
|
|
- scrollOffset,
|
|
+ effectiveScrollOffset,
|
|
lanes,
|
|
// Pass the typed array so binary search + forward-walk can read
|
|
// start/end directly from Float64Array, skipping the Proxy traps.
|