v1.1.0-beta.071 - perf: virtualize the library grid + list so scrolling stays smooth as it grows
🖼️ Windowed rendering for both library views
- The library rendered EVERY accumulated card in the DOM (infinite scroll appended without bound) and re-rendered the whole list on each page-append, so scrolling got laggier the deeper you went — a client-side cost the earlier query/index work couldn't touch. Switched both views to react-virtuoso so only the on-screen rows exist in the DOM:
- Grid view → VirtuosoGrid (useWindowScroll) with the existing responsive grid classes as listClassName; the card JSX is unchanged, just moved into itemContent.
- List view → TableVirtuoso (useWindowScroll) with a module-scoped components object (stable identity so rows don't remount) and a context carrying selection state for per-row click/highlight; header, cells, badges and actions unchanged.
🔁 endReached replaces the IntersectionObserver
- Infinite loading is now driven by Virtuoso's endReached (still paused in selection mode, matching the old sentinel that was hidden while selecting). Removed the observer/lastElementRef; the "Loading more…" footer now keys off loadingMore.
📦 Dependency
- Added react-virtuoso@^4.18.10 (dependencies + package-lock, installed with --legacy-peer-deps to match the existing next-auth/nodemailer peer setup so Docker's
npm ciresolves it).
✅ Verification
- tsc clean; eslint . 0 errors; vitest 298 passed; next build compiled + generated all 80 pages (incl. /library). Visual/interaction behavior (grid columns per breakpoint, sticky list header, row selection, scroll-to-top on filter change) not auto-verifiable — confirmed buildable; needs an eyeball in the running container.