- Windowing côté rendu : seules les pages dans une fenêtre de ±3 autour
de la page visible sont montées en tant que ReaderPage ; les autres
sont remplacées par des placeholders dimensionnés via aspect-ratio CSS
pour maintenir la hauteur de scroll sans saut
- IntersectionObserver utilise le minimum des indices intersectants pour
éviter que les entrées simultanées au chargement ne décalent la fenêtre
- Prop initialPage passé depuis ChapterReader pour ancrer la fenêtre sur
la page courante dès le montage
- loading="eager" sur les ReaderPage montés (le windowing est le mécanisme
de lazy-loading, pas l'attribut HTML natif)
- Prop loading bindé sur les 3 balises <img> de ReaderPage