Un cadre .sn-vsnap-wrap en position: relative, fond #1e1b4b, texte blanc, police Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif. Dedans, la boîte .sn-vsnap-container fait 100% × 280px, overflow-y: auto, scroll-snap-type: y mandatory et scroll-behavior: smooth. Elle contient quatre .sn-vsnap-section de 280px en box-sizing: border-box avec scroll-snap-align: start : à la fin de chaque geste, le navigateur termine le défilement sur le haut de la section la plus proche — mandatory interdit toute position de repos entre deux. Chaque section est une colonne flex centrée (gap: 8px, padding: 20px) avec un h4 de 0.9rem en blanc et un p de 0.72rem en blanc à 60 %, sur quatre dégradés à 135° qui vont de #1e1b4b → #312e81 à #6d28d9 → #7c3aed, de l'indigo au violet. Après la boîte, un span.sdc-scroll-hint « Scrollez ↓ » en position: absolute s'accroche au cadre (mesuré : offsetParent = .sn-vsnap-wrap, 8 px au-dessus du bas de la boîte, centré) et pulse de 30 % à 70 % d'opacité toutes les 2 s. Le champ JS du code vendu tient en un commentaire : c'est le moteur de défilement qui fait tout.
La ligne box-sizing: border-box sur .sn-vsnap-section n'est pas décorative. Sans elle, les 20px de padding s'ajouteraient aux 280px et chaque section ferait 320 px dans une fenêtre de 280 px (mesuré en la retirant : scrollHeight 1280, course 1000 au lieu de 840, texte 20 px sous le centre visible). Quand une zone de snap dépasse le port, la spécification autorise toute position où elle le couvre encore : chaque section aurait une bande libre de 40 px dans laquelle le snap retiendrait sans basculer — un cran de molette de 100 px se poserait à 40, la flèche bas aussi, un cran de 600 px atterrirait à 640 et le bas de chaque diapositive serait coupé de 40 px. Avec la ligne, mesuré dans Chromium, pointeur sur la boîte : sections de 280, course 840, texte centré au pixel ; un cran de 100 px monte à 82 puis revient à 0 (le snap va au plus proche : il faut dépasser la moitié d'une section, 140 px, en un seul geste — 150 px se pose à 280), deux crans de 100 px rapprochés font 280, un cran de 600 px va à 560, section 3, en sautant la 2 (pas de scroll-snap-stop).
Le geste n'est pas lu pareil partout. Mesuré sur le code vendu, page vierge, boîte au repos : Chromium retient le cran de 100 px (retour à 0) là où Firefox 153 et WebKit 26 avancent d'une section (280) ; à 600 px, Chromium va à 560, Firefox à 280 (une section par geste, quelle que soit l'amplitude) et WebKit file en fin de course, 840. scroll-behavior: smooth ne concerne que les défilements programmés ou par ancre : un scrollTop = 280 atteint 280 en 274 ms dans Chromium, 199 ms dans WebKit et 579 ms dans Firefox, et s'y pose sans dépassement ; la molette, elle, est lissée par l'animation de snap du moteur. Deux choix d'écriture découlent de l'autonomie du code. Le fond #1e1b4b du cadre est la couleur de départ du premier dégradé : les dégradés sont posés sur les sections, le cadre garde la boîte sombre sur une page blanche et là où un client mail ne rend pas linear-gradient. La police est déclarée une seule fois, sur le cadre, et héritée par les titres, les paragraphes et l'indice : Inter n'est pas chargée par l'effet, le navigateur passe donc au maillon suivant de la pile (mesuré : system-ui dans Chromium) — chargez Inter dans votre page si vous la voulez, ou remplacez la pile par la vôtre.
CSS seul : scroll-snap-type et scroll-snap-align (syntaxe moderne), scroll-behavior, overflow-y, flexbox, linear-gradient, @keyframes. Zéro dépendance, zéro JavaScript. C'est du CSS classique, pas une animation pilotée par animation-timeline : le snap fonctionne dans Firefox (mesuré dans Firefox 153 — même géométrie, mêmes arrêts), là où les défilements en animation-timeline n'y fonctionnent dans aucune version.
Sans prise en charge du snap (avant Chrome 69, Firefox 68, Safari 11), la boîte reste une zone de 280 px qui défile librement : les sections s'enchaînent sans arrêt automatique. Sans scroll-behavior, seuls les défilements programmés perdent leur lissage — la molette et le doigt ne sont pas concernés. Là où overflow n'est pas honoré (certains clients mail), les quatre sections s'empilent à leur hauteur : tout reste lisible, sans diapositives ; et là où les dégradés ne sont pas rendus, le fond #1e1b4b du cadre garde le texte blanc lisible.