- Unify filename key normalization: VirtualAssetGridHost and useVirtualGrid
now import and call getFilenameKey() from AssetCardRenderer instead of
duplicating the String().trim().toLowerCase() inline expression.
- Make virtualizer overscan adaptive: compute ceil(scrollHeight / rowHeight)
clamped to [3, 20] so tall viewports buffer more rows without wasting
memory on small ones; falls back to 6 when no scroll element is present.
- Preserve Shift+Click anchor on reconcileSelection: add preserveAnchor
option to setSelection (default false, no behaviour change for existing
callers) and pass it as true from reconcileSelection so pruning invisible
assets out of the selection no longer resets the range anchor.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>