When the user resumes at a mid-chapter page, the reader previously
skipped the earlier pages entirely. This adds a scroll-up prefetch so
those earlier pages appear smoothly as the user scrolls toward the top.
- prependBatch() mirrors fetchBatch but decrements the offset cursor
and prepends the new pages. prependExhaustedRef fires when the
cursor hits 0 (start of chapter).
- Trigger: scrollY < 2500px fires prepend — well before the user
reaches the top, so the DOM + images spawn ahead of the scroll
position.
- Scroll preservation: aspect-[3/4] on <img> reserves vertical space
before the image bytes arrive, so scrollHeight is accurate
immediately after React commits. A single scrollBy(delta) keeps the
previously-visible page visually anchored — no per-image jitter.
- Forward-fetch trigger indices + loadedCountRef are shifted by
batch.length on each prepend so next-batch prefetch still fires at
the correct page.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>