Ce que c’est
Un site de restaurant complet, en une seule page : accueil, présentation, carte filtrable de huit plats, méthode de cuisine, ambiance, avis clients en bandeau, deux adresses, bandeau social et pied de page. Un seul fichier HTML, une seule feuille de style.
Le design reprend celui d’un template commercial dont seules les photos ont été conservées. Tout le code a été réécrit : l’original tenait dans 175 Ko de CSS minifié, jQuery, trois bundles de l’éditeur, un moteur d’animation propriétaire et un panier e-commerce qui appelle une API inexistante dès qu’on sort de l’outil. Illisible, donc inutile pour apprendre.
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 — sept lignes
Tout en haut de assets/css/style.css :
--noir: #0c0407; /* texte, boutons pleins, pied de page */
--fond: #f0f0f0; /* boutons doux, onglets */
--fond-doux: #f7f7f7; /* cartes des avis et de la méthode */
--accent: #c0421f; /* survols, liens, focus */
--accent-fonce: #93300f; /* le même, un cran plus foncé */
--accent-clair: #f0906b; /* le même, éclairci pour un texte sur photo */
--etoile: #ffa600; /* les notes */
Une chose à comprendre avant de toucher au reste : il y a trois terracottas, pas un. L’accent plein passe le contraste AA sur blanc (5,20:1) et sur le gris de fond (4,56:1), mais il disparaîtrait sur une photo sombre — c’est à ça que sert la version éclaircie (8,60:1 sur le noir). Le foncé sert aux survols (7,86:1). Si tu changes l’accent, change les trois : le banc du template recalcule les sept rapports pour toi.
Le nom
Cherche « Sapora » dans index.html. Aucune classe CSS ne
contient la marque : un rechercher-remplacer ne peut rien casser. Le logo
est un simple mot dans la police du template, il suit tout seul.
La carte
Chaque plat porte ses services dans un attribut :
<li class="plat" data-cours="signature soir">. Ajouter un
onglet, c’est un <input type="radio">, un
<label> et une ligne dans la liste de sélecteurs de la
partie 7 de la feuille.
Les tailles
L’échelle typographique est déclarée une fois, puis redéclarée à chaque
point de rupture. Un titre n’a donc jamais sa propre media query : tu
changes --titre-1 et toute la page suit.
Les quatorze effets, et comment ils sont faits
Tous relevés dans les données du moteur d’animation de l’original — 161 événements et 38 listes d’actions, extraits du store JavaScript puis mesurés au navigateur, pas à l’œil. L’éditeur crée un événement par élément de collection : après déduplication il reste quatorze effets distincts, dont onze sont repris ici.
| Effet | Réglages d’origine | Comment |
|---|---|---|
| Apparition au scroll | 50 px, 400 ms, flou 5 px, retards 200 à 700 ms | IntersectionObserver, déclenchement à 15 % du bas de l’écran |
| Flèche des boutons | 500 ms, outQuint | une transition CSS, même durée et même courbe |
| Bandeau des avis | deux rangées, ±100 %, 30 s linéaire | deux @keyframes, la piste dupliquée par le script |
| Bandeau social | une rangée, −100 %, 30 s | même mécanique, ralentie à 45 s : la rangée est deux fois plus courte |
| Survol d’une vignette sociale | photo ×1,1, icône ×0,5 → 1, 500 ms | identique, en transitions CSS |
| Menu déroulant | opacité + 20 px, icône à −180°, 300 ms | identique, plus deux délais au survol (80 ms / 280 ms) |
| Liens du pied de page | −50 %, 300 ms à l’entrée | le libellé écrit deux fois dans une boîte qui coupe |
| Menu mobile | ouverture au clic | aria-expanded + grid-template-rows: 0fr → 1fr |
| Fiches plat | accordéon au clic | <details> natif — s’ouvre sans JavaScript |
| Filtre de la carte | onglets JavaScript | des radios et une règle :has(), zéro script |
| Rangées sans JavaScript | — | scroll-snap : on les balaie et on y tabule quand même |
Ce qu’il faut savoir
- Aucune requête externe. 41 requêtes au chargement, 45 après défilement complet, toutes locales. L’original chargeait jQuery et trois bundles depuis deux domaines.
-
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>: 25 titres sur 25 restent visibles, zéro bloc caché, les huit fiches plat s’ouvrent. L’original, lui, posaitstyle="opacity:0"sur chaque bloc animé. -
Zéro style et zéro script en ligne. Le rang d’apparition
passe par un attribut
data-reveal-ranget des sélecteurs d’attribut, précisément parce qu’unstyle=""serait bloqué par la politique de sécurité stricte du site. - Le déclencheur est à 15 % du bas de l’écran, pas au premier pixel comme dans l’original : un bloc entre visiblement au lieu d’avoir fini avant d’être vu. Le seuil est mesuré sur l’écran et non sur l’élément — sinon un bloc plus haut que l’écran resterait invisible pour toujours.
- L’onglet actif de la carte est marqué. Dans l’original les six onglets avaient la même apparence : on ne savait pas lequel on regardait. Ici il s’inverse en noir.
-
Accessibilité : lien d’évitement, états des menus
annoncés, résultat du filtre annoncé en
role="status", copies des rangées enaria-hiddenetinert, focus visible unique, animations coupées si le système le demande — délais compris. - Responsive vérifié à 390, 1440 et 2560 px, au chargement comme après défilement complet, sans débordement horizontal. La page fait 7 220 px de haut contre 7 305 px pour l’original, soit 1,2 % d’écart.
Ce qui n’est pas parfait
Autant le dire ici plutôt que te le laisser découvrir.
-
Le panier e-commerce a été retiré. Hors de son outil
d’origine il appelait une API inexistante. « Add to Cart » est devenu
« Book a table », une ancre vers les adresses et leurs numéros ;
« View details » est devenu un
<details>natif qui déplie la composition du plat. - L’onglet « Dessert » a été retiré, cinq au lieu de six. Les huit plats de l’original sont tous salés : l’onglet ne renvoyait rien, et un filtre qui ne renvoie rien est un cul-de-sac.
- Sur téléphone la page fait 5,6 % de haut de plus que la référence, pour trois choix assumés : le bandeau social reste affiché là où l’original le masque, les six avis restent sur deux rangées au lieu de trois, et les cinq plats de l’accueil passent dans le flux en une rangée qu’on balaie.
- Trois effets ne sont pas repris : l’entrée par agrandissement et l’entrée latérale longue ne servent que sur des pages absentes de cette reprise ; l’agrandissement de la photo au survol d’un plat suggérait un lien vers une fiche produit qui n’existe pas ici.
- Les photos viennent du template d’origine. Les huit plats de la carte sont, à en juger par leur uniformité et leurs noms de fichiers, générés par IA ; les trente autres sont des photos de stock. Le code est à toi ; pour les visuels, vérifie la licence ou remplace-les. Les polices, elles, sont libres de redistribution.
Prends-le, ouvre-le, casse-le.
Sapora 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