Ce que c’est
Le site d’une agence qui construit des sites, des systèmes de collecte de dons et des CRM pour des associations : accueil illustré, chiffre clé, présentation, carrousel de dix-neuf avis, publics servis, bandeau de partenaires certifiés, études de cas, méthode en quatre étapes, formulaire de contact, appel à l’action, pied de page. Une seule page, un seul fichier HTML.
Le dessin, la structure, les textes et les images reprennent sprighouse.co. Tout le code a été réécrit. L’original est une application Next.js : React, Tailwind compilé, un bundle d’animation, un routeur client et une couche d’images optimisées côté serveur. Rien de tout ça n’est lisible, rien ne s’ouvre sans serveur, et rien ne survit à la politique de sécurité stricte de ce site.
Ce qui reste tient en trois fichiers : un HTML, une feuille de style, un script. C’est le point important : ce template n’est pas là pour être admiré, il est là pour être lu, cassé et remonté.
Ce que tu changes en premier
Les couleurs — six lignes
Tout en haut de assets/css/style.css :
--bg: #f7f0e6; /* fond de page, papier crème */
--surface: #f3ebdd; /* sections qui avancent d’un cran */
--text: #1d2b1f; /* encre : texte, bordures, panneaux sombres */
--muted: #5c6b5e; /* texte secondaire sur le crème */
--primary: #bfea4b; /* vert citron : boutons, surlignages, points */
--accent: #b8331b; /* astérisques des champs requis, erreurs */
Un piège à connaître avant d’y toucher : le vert citron est une
couleur de fond, pas une couleur de texte. Sur le crème il donne
1,2:1 — illisible. Le mot « mission » du titre d’accueil ne tient que grâce
à son contour d’encre de 1,5 px. Sur les panneaux sombres, ne compose jamais
un rgba() à la main : prends --on-ink,
--on-ink-soft ou --on-ink-faint, les trois seuls
niveaux qui passent le contraste.
Le nom
Cherche « SprigHouse » dans index.html. Aucune classe CSS ne
contient la marque : un rechercher-remplacer ne peut rien casser.
Les tailles
L’échelle typographique est déclarée une fois, en clamp()
fluides mesurés sur l’original. Un titre n’a donc jamais sa propre media
query : tu changes --fs-h2 et toute la page suit, à toutes les
largeurs. La partie 9 de la feuille ne contient que des changements de mise
en page.
Les quatorze effets, et comment ils sont faits
Tous relevés dans le code de l’original : les réglages du moteur d’animation sont dans les bundles, en clair — durées, courbes, décalages, seuils. Extraits par script, pas devinés à l’œil.
| Effet | Réglages d’origine | Comment |
|---|---|---|
| Entrée en cascade de l’accueil | décalage 0,1 s, y 24→0, 0,5 s | quatre animation-delay, CSS pur — rien ne peut rester bloqué à opacity: 0 |
| Cinq nuages qui flottent | 18 à 24 s, délais négatifs, quatre étapes | un @keyframes, une variable d’amplitude par nuage |
| Oiseau qui traverse le ciel | −42 % → 142 % en 30 s, fondu aux 7 % | trois @keyframes sur deux éléments imbriqués |
| Bandeau des partenaires | translateX 0 → −50 % en 55 s | la piste contient deux fois les huit logos ; pause au survol et au focus |
| Bulle d’aide sur un logo | opacité 200 ms | :hover et :focus-within. Le logo est un <button> : un appui au doigt ouvre la bulle, sans JavaScript |
| Apparition au scroll | 3 cartes, 0,42 s, décalage 50 ms | IntersectionObserver, déclenchement à 15 % du bas de l’écran |
| Zoom de l’aperçu | scale(1.04), 700 ms | à l’identique |
| Carrousel de 19 avis | défilement auto 7,2 s, fondu 0,35 s | piste scroll-snap : elle glisse, se balaye et s’atteint au clavier sans JavaScript |
| Soulignement de navigation | clip-path, 500 ms | une barre de 3 px qui se dévoile depuis la gauche, nette à toute largeur |
| Panneau déroulant | ouverture immédiate, fermeture à 200 ms | CSS seul, deux délais ; :has() teinte la barre en vert citron |
| Menu plein écran | clip-path 0,42 s, cascade des entrées | un <details> — il s’ouvre sans JavaScript |
| Boutons à ombre dure | survol +2 px, appui +3 px, 120 ms | à l’identique |
| Cartes qui se soulèvent | −2 px, ombre 6 → 8 px, 180 ms | à l’identique |
| Flèche « Read → » | translateX(4px), 200 ms | à l’identique |
Ce qu’il faut savoir
- Aucune requête externe. Dix requêtes au premier écran, 280 Ko, toutes locales. Les six vignettes du menu déroulant ne sont téléchargées qu’à son ouverture — 74 Ko de moins au chargement.
-
L’apparition au scroll ne peut pas masquer le contenu.
L’état caché n’existe que si le JavaScript a tourné. Vérifié en retirant
les balises
<script>: 19 titres sur 19 restent visibles, zéro bloc caché, et les dix-neuf avis se font défiler à la main. -
Zéro style et zéro script en ligne. Le décalage des trois
cartes d’études de cas est écrit en
:nth-child()dans la feuille, pas enstyle="--reveal-delay: 50ms": un attributstyleserait bloqué par la politique de sécurité du site. - Le déclencheur est à 15 % du bas de l’écran, mesuré sur l’écran et non sur l’élément — l’original déclenchait au premier pixel visible, si bien qu’une carte avait fini d’apparaître avant qu’on la voie.
- Deux couleurs ont été assombries pour passer le contraste AA : le texte secondaire (4,0 → 5,0:1) et l’astérisque des champs requis (4,4 → 5,0:1). L’écart est invisible à l’œil.
-
Accessibilité : lien d’évitement, états des menus portés
nativement par les
<summary>, position du carrousel annoncée, focus visible unique, décorations masquées aux lecteurs d’écran, animations coupées et délais remis à zéro si le système le demande.
Ce qui n’est pas parfait
Autant le dire ici plutôt que te le laisser découvrir.
- La page fait 0,2 % de haut de plus que la référence à 1440 px, 1,7 % à 767 px, 1,8 % à 479 px et 3,3 % à 991 px. À 991 px, deux titres se répartissent sur une ligne de plus que dans l’original ; à 479 px, la carte du chiffre clé est centrée sur trois lignes au lieu de deux. Rien ne se chevauche à aucune des six largeurs mesurées.
-
Le carrousel d’avis glisse au lieu de faire un fondu.
L’original enchaînait les avis en fondu, piloté par React : sans
JavaScript, un seul restait à l’écran. Ici la piste est un
scroll-snapnatif, les dix-neuf avis sont atteignables dans tous les cas. - Une illustration a été remplacée. Le miroir du site ne contenait le fermier du bloc de contact qu’en JPEG 256 px sans couche alpha — un carré noir sur le crème. Une autre illustration de la même série, elle disponible en WebP transparent, prend sa place.
- Le site d’origine compte une trentaine de pages ; celui-ci en a une. Tous les liens ont été ramenés à des ancres internes plutôt que de laisser des 404, y compris les deux panneaux déroulants du menu.
-
Le formulaire de contact n’a pas de serveur. Il valide
nativement puis affiche un message renvoyant vers l’adresse e-mail.
Branche
actionsur ton gestionnaire et supprime le bloc 5 demain.js. -
Les huit logos de partenaires sont des marques déposées,
et deux d’entre eux sont des badges de certification. Les trois aperçus
d’études de cas sont des captures de sites de clients réels.
Remplace-les. Les polices, elles, sont sous licence OFL et
redistribuables — vérifié dans leur table
name, pas supposé.
Prends-le, ouvre-le, casse-le.
SprigHouse est gratuit. La bibliothèque complète — les autres templates et les composants — est incluse dans l’abonnement, avec la formation.
Accès immédiat · Sans engagement · Annulation en 1 clic