/* Moteur motion central — le vocabulaire exact du kit de la maquette (page-kit.css), un seul observateur.
   Poser la classe via « Classes CSS » d'Elementor ; le JS ajoute .seen a l'entree dans l'ecran (15 %, marge basse -22 %).
   ac-rise : monte de 22 px en fondu (820 ms) · ac-line > ac-line-inner : texte qui sort d'un masque (900 ms)
   ac-wipe (+ -left / -right) : revelation par decoupe (1000 ms) · ac-zoom : image de 1.14 a 1 (1500 ms)
   ac-pulse-ring : halo infini · vlbh-reveal = alias de ac-rise · data-delay="120" = delai en ms. */
/* .elementor-element.* : Elementor pose sa propre transition (background, border, transform) sur chaque élément ; on repasse devant. */
.ac-rise, .vlbh-reveal, .elementor-element.ac-rise, .elementor-element.vlbh-reveal { opacity: 0; transform: translate3d(0, 22px, 0); transition: opacity 820ms var(--ease-soft), transform 820ms var(--ease-soft); transition-delay: var(--vlbh-delay, 0ms); }
.ac-rise.seen, .vlbh-reveal.seen, .vlbh-reveal.is-in { opacity: 1; transform: none; }
.ac-line { overflow: hidden; }
.ac-line-inner, .elementor-element.ac-line-inner { transform: translate3d(0, 105%, 0); transition: transform 900ms var(--ease-soft); transition-delay: var(--vlbh-delay, 0ms); }
.ac-line-inner.seen { transform: none; }
.ac-wipe, .elementor-element.ac-wipe { clip-path: inset(0 0 100% 0); transition: clip-path 1000ms var(--ease-soft); }
.ac-wipe-left { clip-path: inset(0 100% 0 0); }
.ac-wipe-right { clip-path: inset(0 0 0 100%); }
.ac-rise.seen .ac-wipe, .ac-line-inner.seen .ac-wipe, .ac-wipe.seen { clip-path: inset(0); }
.ac-zoom, .elementor-element.ac-zoom { transform: scale(1.14); transition: transform 1500ms var(--ease-soft); }
.ac-rise.seen .ac-zoom, .ac-line-inner.seen .ac-zoom, .ac-wipe.seen .ac-zoom, .ac-zoom.seen { transform: scale(1); }
@keyframes ac-pulse { 0% { transform: scale(.7); opacity: .85; } 100% { transform: scale(1.7); opacity: 0; } }
.ac-pulse-ring { animation: ac-pulse 2600ms var(--ease-soft) infinite; }
@keyframes ac-page-in { from { opacity: 0; } to { opacity: 1; } }
body { animation: ac-page-in 420ms var(--ease-soft) both; }
body.ac-leaving { opacity: 0; transition: opacity 260ms var(--ease-soft); }
/* Image qui s'approche au survol (cartes, vignettes). */
.vlbh-zoom img { transition: var(--transition-image); }
.vlbh-zoom:hover img { transform: scale(1.03); }
/* Vocabulaire « vh-* » des pages internes (Logement.dc.html) : animations CSS jouees une seule fois, a l'entree dans l'ecran ou 700 ms apres le chargement.
   vh-rise : monte de 26 px en fondu (900 ms) · vh-wipe-group > vh-wipe (+ img.vh-zoom) : volet qui s'ouvre par le bas (1100 ms) et image de 1.14 a 1 (1600 ms)
   vh-mask > vh-line : ligne qui sort de son masque (1100 ms) · animation-delay en style pour le decalage. */
@keyframes vh-rise-in { from { opacity: 0; transform: translate3d(0, 26px, 0); } to { opacity: 1; transform: none; } }
@keyframes vh-line-up { from { transform: translate3d(0, 110%, 0); } to { transform: none; } }
@keyframes vh-clip-open { from { clip-path: inset(0 0 14% 0); } to { clip-path: inset(0); } }
@keyframes vh-zoom-out { from { transform: scale(1.14); } to { transform: scale(1); } }
.vh-rise, .elementor-element.vh-rise { opacity: 0; }
.vh-rise.seen, .elementor-element.vh-rise.seen { animation: vh-rise-in 900ms var(--ease-soft) both; }
.vh-line { transform: translate3d(0, 110%, 0); }
.vh-mask.seen .vh-line { animation: vh-line-up 1100ms var(--ease-soft) both; }
.vh-wipe { clip-path: inset(0 0 14% 0); }
.vh-wipe-group.seen .vh-wipe { animation: vh-clip-open 1100ms var(--ease-soft) both; }
.vh-zoom { transform: scale(1.14); }
.vh-wipe-group.seen .vh-zoom { animation: vh-zoom-out 1600ms var(--ease-soft) both; }
/* Decalage du shell de la maquette : chaque bloc part 70 ms apres le precedent (Math.min(index, 5) x 70). */
.vh-rise.vh-d1.seen, .elementor-element.vh-rise.vh-d1.seen { animation-delay: 70ms; }
.vh-rise.vh-d2.seen, .elementor-element.vh-rise.vh-d2.seen { animation-delay: 140ms; }
.vh-rise.vh-d3.seen, .elementor-element.vh-rise.vh-d3.seen { animation-delay: 210ms; }
.vh-rise.vh-d4.seen, .elementor-element.vh-rise.vh-d4.seen { animation-delay: 280ms; }
.no-js .vh-rise, .no-js .vh-line, .no-js .vh-wipe, .no-js .vh-zoom { opacity: 1; transform: none; clip-path: none; animation: none; }
@media (prefers-reduced-motion: reduce) { .vh-rise, .vh-line, .vh-wipe, .vh-zoom { animation: none !important; opacity: 1 !important; transform: none !important; clip-path: none !important; } }
/* Sans JS : tout visible. Motion reduit : rien ne bouge. */
.no-js .ac-rise, .no-js .vlbh-reveal, .no-js .ac-line-inner, .no-js .ac-wipe, .no-js .ac-zoom { opacity: 1; transform: none; clip-path: none; transition: none; }
@media (prefers-reduced-motion: reduce) { .ac-rise, .vlbh-reveal, .ac-line-inner, .ac-wipe, .ac-zoom { transition: none !important; opacity: 1 !important; transform: none !important; clip-path: none !important; } .ac-pulse-ring { animation: none !important; } body { animation: none !important; } }

/* Éditeur Elementor : aucune apparition. Sans cette règle l'aperçu s'ouvre vide — les blocs restent à opacity 0
   et la cliente ne voit ni ne peut sélectionner ses sections. Vaut aussi pour l'aperçu de gabarit. */
body.elementor-editor-active .ac-rise, body.elementor-editor-active .vlbh-reveal,
body.elementor-editor-active .ac-line-inner, body.elementor-editor-active .ac-wipe,
body.elementor-editor-active .ac-zoom, body.elementor-editor-active .vh-rise,
body.elementor-editor-active .vh-line, body.elementor-editor-active .vh-wipe,
body.elementor-editor-active .vh-zoom {
  opacity: 1 !important; transform: none !important; clip-path: none !important;
  transition: none !important; animation: none !important;
}
