← La bibliothèque

Marenza

Site vitrine pour hôtel de luxe et resort

Template complet Gratuit Ouvrir la démo Télécharger
Aperçu du template Marenza : un grand salon d’hôtel lambrissé de bois sombre au crépuscule, le titre « Experience timeless luxury » en serif crème à gauche, et à droite une carte vitrée qui présente la suite présidentielle avec sa photo, cinq étoiles et son prix.

Ce que c’est

Un site d’hôtel-resort de luxe, complet : accueil en photo avec la fiche d’une suite posée dessus, présentation, carrousel de cinq suites, quatre atouts dans un cadre ciselé, carrousel de moments barré par le nom en typographie géante, grille d’hébergements sur fond bordeaux, chiffres clés, accordéon d’expériences, avis, découverte en quinconce, journal, inscription et pied de page. Une seule page, un seul fichier HTML.

Ce qui fait ce site, c’est le décor au trait : derrière chaque section courent une ligne verticale et trois cercles d’un pixel, et deux sections sont enfermées dans un cadre ciselé à volutes. Tout est en SVG dessiné à la main, dans le HTML, sans une seule image.

Le design reprend celui d’un gabarit Webflow d’hôtellerie dont il ne reste plus une seule image : les 33 photographies ont été régénérées pour ce template, au rapport d’aspect exact relevé sur l’original. Tout le code a été réécrit : 135 Ko de CSS minifié, trois bundles Webflow de 1,9 Mo, GSAP avec ScrollTrigger et SplitText, le moteur d’animation propriétaire IX2, deux animations Lottie, un panier e-commerce qui appelle une API inexistante hors de l’outil, et des style="opacity:0" posés en ligne sur chaque bloc animé — qu’une politique de sécurité stricte bloque, ce qui donnerait une page blanche.

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 — dix lignes

Tout en haut de assets/css/style.css :

--cream:      #f8f2ed;  /* fond de page */
--sand:       #faeddd;  /* la section « détails », un cran plus chaud */
--wine:       #7b2e2e;  /* titres, sections pleines, pied de page */
--gold:       #e8b96b;  /* fond des boutons */
--gold-deep:  #d3a150;  /* le même doré, un cran plus foncé (survol) */
--gold-soft:  #f5dca8;  /* le même doré, éclairci pour le texte sur photo */
--ink:        #211c1a;  /* texte fort */
--body:       #5c534e;  /* texte courant */
--line:       #e3cfc4;  /* les filets et cercles du décor */

Une chose à comprendre avant de toucher au reste : il y a trois dorés, pas un. Le doré plein sert de fond de bouton, avec du texte noir dessus (11,5:1). Le même doré posé en texte sur le crème tomberait à 2,2:1, illisible : c’est la version éclaircie qui prend le relais dès qu’il doit se lire sur une photo ou sur le bordeaux (6,9:1). Si tu changes l’accent, change les trois.

Le nom

Cherche « Marenza » dans index.html : le logo, le titre, les deux bandes typographiques et le pied de page. Aucune classe CSS ne contient la marque — un rechercher-remplacer ne peut rien casser. Le logo est un <symbol> SVG de six lignes.

Les tailles

L’échelle typographique est déclarée une fois, puis redéclarée à chaque point de rupture (991, 767 et 599 px). Un titre n’a donc jamais sa propre media query : tu changes --h2 et toute la page suit — 68 px sur grand écran, puis 48, 42 et 32 px en descendant.

Les seize effets, et comment ils sont faits

Ils n’ont pas été regardés jouer, ils ont été lus : 151 événements dans le store IX2 de Webflow et 26 déclencheurs GSAP, extraits du site d’origine puis dédupliqués — l’outil crée un événement par instance de collection. Il reste seize effets distincts — quinze relevés, plus le glisser à la souris.

EffetRéglages d’origineComment
Apparition par le bas (59 blocs)opacité + y 100 px, 1000 ms, outQuart[data-reveal] + IntersectionObserver
Apparition en cascade (5 groupes)un événement par carteretards 90 / 180 / 270 / 360 ms
Dézoom de l’accueilscale 1,1 → 1 en 2000 ms, easeInOutune @keyframes de 2000 ms
Barre qui se coloreinteraction continue, 0 → 2 % du scrollune classe posée à 2 % de la page
Carrousel des suitesscale 0,7 → 1 et y 100 % → 0, 500 → 1000 msscroll-snap natif ; le JS ne marque que la fiche du milieu
Carrousel de la galeriescale 0,7 → 1 et opacité, 500 → 1200 msidem, voisines à scale(0.7)
Zoom au survol (5 cartes)scale 1 → 1,1, 300 msscale(1.06) sur la photo, la carte rogne
Accordéon des expérienceshauteur animée, 500 ms / 300 ms<details name> natif + grid-template-rows
Photo liée à l’accordéonéchange d’ongletquatre images empilées, opacité 420 ms
Flèche des boutonsrotation, 300 msrotate(45deg) au survol
Liens du menuy −30 px, 320 msdeux copies du libellé dans une boîte rognée
Menu « Pages »ouverture au survol<details> + deux délais, 60 et 320 ms
Burger mobileanimation Lottie, 300 mstrois barres CSS, même durée
Titres lettre par lettreSplitText, stagger 0,3 s depuis le centreremplacé — voir « ce qui n’est pas parfait »
Lignes et titres du journalSplitText, xPercent, stagger 0,02 sidem
Glisser à la sourisle slider d’origine se glissaitpointerdown/move/up ; le snap se tait, et au-delà de 60 px la fiche change

Ce qu’il faut savoir

Aucune requête externe, aucun build. Tu ouvres index.html dans un navigateur et ça marche. Polices auto-hébergées, photos locales, aucun CDN, aucun tracker.

Sans JavaScript, rien n’est caché. L’état caché des apparitions est écrit .js [data-reveal], et c’est enhance.js qui pose la classe. Vérifié en coupant le JavaScript : 46 titres sur 46 restent visibles, 59 blocs sur 59 aussi, et les accordéons s’ouvrent toujours.

Le déclencheur d’apparition est à 15 % du bas de l’écran, pas au premier pixel comme dans l’original. La marge est mesurée sur l’écran et non sur l’élément — sinon l’accueil et la section des hébergements, tous deux plus hauts que l’écran, resteraient cachés à jamais. Un filet révèle en plus tout ce qui reste quand on atteint le bas.

Le décor passe sous le contenu. Les filets et les cercles sont en position absolue, donc peints après un contenu qui, lui, ne l’est pas : sans un cran d’empilement sur le conteneur, les traits traversaient les photographies du journal et de la découverte.

Les carrousels défilent nativement. Molette, balayage au doigt et clavier fonctionnent sans une ligne de JavaScript ; le glisser à la souris, lui, est le seul geste que le script ajoute : 4 320 px de course pour 4 188 px nécessaires côté suites, 2 100 px pour 1 830 px côté galerie. La dernière fiche est atteignable dans les deux cas.

Sous politique de sécurité stricte (script-src 'self'; style-src 'self') : zéro violation, vérifié en servant le dossier avec l’en-tête réel. Zéro style en ligne, zéro script en ligne, zéro onclick.

Débordement horizontal nul à 390, 1440 et 2560 px, au chargement comme après défilement complet. Accessibilité : lien d’évitement, aria-expanded sur le menu, notes des étoiles en toutes lettres, focus visible unique, prefers-reduced-motion qui remet aussi les délais à zéro.

Ce qui n’est pas parfait

Les effets de texte lettre par lettre n’ont pas été repris. L’original découpe ses titres et fait entrer chaque lettre. Le refaire demanderait un <span> par lettre — donc un HTML illisible pour toi et un titre pénible à traduire. Les titres entrent d’un bloc, avec la même courbe et la même durée. C’est l’écart le plus visible entre les deux pages.

La page fait 14 988 px contre 15 422 px pour la référence (−2,8 %) : les paragraphes sont un peu plus courts. Rien ne se chevauche. L’accueil, lui, est superposable au pixel : hauteur, colonne de texte, titre, accroche, carte, vignette, filet et barre tombent tous à 0 px d’écart de l’original, et il occupe tout l’écran à l’arrivée — vérifié pour des fenêtres de 700, 900, 1080 et 1300 px de haut.

Le panier e-commerce a été retiré. Hors de l’outil d’origine il appelle une API qui n’existe pas, et un hôtel ne vend pas au panier. Sa place dans la barre est prise par le numéro de téléphone, qui appelle vraiment.

Le portrait de l’avis est un médaillon, pas une photo : une image générée ne doit pas porter le visage reconnaissable d’une personne réelle, et un portrait de synthèse pour signer un faux avis n’est pas honnête. Deux initiales dans un disque bordeaux font le même travail.

Le formulaire d’inscription ne poste nulle part. Il vérifie l’adresse et le dit franchement. À brancher sur ton propre service.

Deux sections de l’original portaient le même titre. La seconde a été renommée : deux <h2> identiques sur une page desservent le référencement comme la lecture.

Prends-le, ouvre-le, casse-le.

Marenza 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