|
26 | 26 | <PackageIcon>icon.png</PackageIcon> |
27 | 27 | <PackageTags>blazor;virtualization;virtual-scroll;tanstack;variable-height;list;performance</PackageTags> |
28 | 28 | <!-- First three parts track the bundled @tanstack/virtual-core release; the fourth is this wrapper's own revision. --> |
29 | | - <Version>3.17.7.2</Version> |
30 | | - <PackageReleaseNotes>Render-path allocation work. Row keys, placements and the stale-row filtering are now resolved once per change of the window, item set or options instead of on every render, which removed several string allocations per rendered row per render batch. The item-set snapshot crosses interop as two parallel arrays (keys, sizes) rather than an array of objects, cutting both the allocation count and the JSON payload for large sets; ItemDescriptor is gone as a result. Single-lane lists no longer format their cross-axis constants per row. |
| 29 | + <Version>3.19.8</Version> |
| 30 | + <PackageReleaseNotes>Teardown fixes, IsRtl that works, and @tanstack/virtual-core 3.17.7 -> 3.19.8. |
| 31 | + |
| 32 | +Teardown. DisposeAsync no longer throws a JSException ("JS object instance with ID n does not exist") when the component's JS object is already gone from the page: when a BlazorWebView's page reloads, the reloaded page's attach request disposes the previous page's renderer, so the dispose call reaches a page where the object never existed. Disposing while interop is still in flight is safe as well. A render stops calling into JS once disposal has started, instead of going on to fail on the render path. A module or instance whose import or create was still in flight is released when it arrives, instead of being left behind with its scroll and resize observers attached, and a failure or timeout of those calls after disposal neither escapes nor pins the component. On Blazor Server, an interop call that times out during disposal no longer skips the rest of the cleanup. Items or Options changed while the JS instance was still being created now reach it. Interop failures that teardown deliberately swallows are logged through ILogger<AdaptiveVirtualize<TItem>> instead of disappearing: at Debug for the known ways the JS side goes away, so they stay out of error trackers, and at Warning for anything else. |
| 33 | + |
| 34 | +virtual-core 3.19.8 brings upstream's own teardown fixes (no change notifications after dispose), many iOS WebKit scroll-correction fixes, and cancelScroll, surfaced as CancelScroll(). Behaviour changes: with Lanes above 1, Overscan counts whole rows, and OverscanLeading / OverscanTrailing now count the same way; ScrollToIndex(last, End) no longer overshoots by PaddingEnd, while ScrollToEnd still reaches the very bottom. A scroll write the browser clamped - an end-anchored list whose last item grows before the container does - is re-issued once the container has grown, so a chat-style list stays pinned to the bottom. In Blazor WebAssembly, change notifications raised inside virtual-core's ResizeObserver callbacks now go out one task later, which stops the browser reporting "ResizeObserver loop completed with undelivered notifications" as a window error. |
| 35 | + |
| 36 | +Scrolling. A ScrollToIndex, ScrollToOffset, ScrollToEnd or ScrollBy issued by code while a touch fling is still moving the list now lands on its target on Android, where Chrome used to carry the fling on past the write: the momentum is stopped first by hiding the scroll axis's overflow for two frames, as virtual-core does itself on iOS 27. This is a stopgap until virtual-core does the same on Android (https://github.com/TanStack/virtual/pull/1347), and goes away with that release. IsRtl now works for horizontal lists: items are placed from the right edge, and scroll writes are negated to match how virtual-core reads the offset, so ScrollToIndex no longer clamps to the start. The scroll container itself has to be direction: rtl. |
| 37 | + |
| 38 | +Render-path allocation work. Row keys, placements and the stale-row filtering are now resolved once per change of the window, item set or options instead of on every render, which removed several string allocations per rendered row per render batch. The item-set snapshot crosses interop as two parallel arrays (keys, sizes) rather than an array of objects, cutting both the allocation count and the JSON payload for large sets; ItemDescriptor is gone as a result. Single-lane lists no longer format their cross-axis constants per row. |
31 | 39 |
|
32 | 40 | Adds OverscanLeading / OverscanTrailing: overscan biased toward the side the user is scrolling towards, as react-window, react-virtualized and Angular CDK all do by default. The leading side follows the scroll direction and flips on reversal; the trailing side is a floor held at all times rather than one that lapses when scrolling stops, because virtual-core memoizes getVirtualIndexes on [rangeExtractor, overscan, count, startIndex, endIndex] - isScrolling is not among them, so a value that lapsed would simply never be recomputed. Compiled into the same rangeExtractor as AlwaysRenderedIndexes, so the two now compose instead of one replacing the other. |
33 | 41 |
|
|
0 commit comments