/**
 * L'Aire Bête — Scène extérieure (Phase 4.1)
 *
 * Page d'arrivée : chemin du zoo de Martinique, arbres tropicaux,
 * pavillon Pixar au bout du chemin. Clic sur le pavillon → animation
 * de zoom → bascule sur l'overlay des portes vitrées (entrance).
 *
 * Stages (classes posées sur <html> par le FOUC guard de functions.php) :
 *   - aucune classe       : 1er visit → extérieur visible, entrance cachée
 *   - .lb-exterior-passed : pavillon cliqué → extérieur caché, entrance visible
 *   - .lb-entered         : portes franchies → tout caché, mall direct (existant)
 */

/* === Overlay extérieur ================================================ */

.lb-exterior {
	position: fixed;
	inset: 0;
	z-index: 1100;           /* au-dessus de .lb-entrance (z-index: 1000) :
	                            pendant l'animation de zoom, exterior.js
	                            pré-affiche l'entrance (display: flex) pour
	                            qu'elle soit déjà rendue derrière. Sans cet
	                            écart de z-index, l'entrance passerait au-
	                            dessus et casserait l'effet de fade-out. */
	overflow: hidden;
	background: var(--lb-blanc-casse);
	display: flex;
	flex-direction: column;
	cursor: default;
	transform-origin: 50% 38%;  /* point de zoom : centre du pavillon */
	transition:
		transform 1500ms cubic-bezier(0.4, 0, 0.2, 1),
		opacity   1500ms ease-out;
}

/* Stage classes : visibilité orchestrée. ----------------------------------
 * IMPORTANT : entrance.css impose `.lb-entrance { display: flex }` à
 * spécificité 0,1,0. Pour cacher l'entrance par défaut au 1er visit, on
 * cible <html> sans classe de stage. Les autres rules redonnent display:flex
 * au moment voulu. */
html:not(.lb-exterior-passed):not(.lb-entered) .lb-entrance {
	display: none;
}
html.lb-exterior-passed .lb-exterior {
	display: none;
}
html.lb-entered .lb-exterior {
	display: none;
}
/* L'entrance, une fois l'extérieur passé, reprend son `display: flex`
   d'origine sans qu'on ait à le redéclarer (la règle `display: none`
   ci-dessus ne s'applique plus). La classe `.lb-entered` qui re-cache
   l'entrance est gérée dans entrance.css avec !important. */

/* Animation de zoom au clic du pavillon. */
.lb-exterior.is-zooming {
	transform: scale(3);
	opacity: 0;
	pointer-events: none;
}

/* === Pluie sur la scène extérieure (sky-engine v0.8.0+) =============== */

/* `.lb-rain` est un sibling de tous les éléments de scène à l'intérieur
   de `.lb-exterior` ; on lui donne un z-index élevé pour que les gouttes
   tombent en avant-plan devant les arbres, le pavillon et la fontaine. */
.lb-exterior .lb-rain {
	z-index: 15;
}

/* === Ciel extérieur — palette dynamique synchronisée ================== */

/* sky-engine.js (v0.8.0+) cible `.lb-sky` partout (intérieur + extérieur)
   et applique la palette horaire `sky-*` ainsi que la météo (`--rain`,
   `--lightning`). Le bloc `!important` qui figeait le ciel en sunset a
   été retiré : les deux scènes restent maintenant synchronisées en
   permanence. Les règles cosmétiques (position, taille) restent. */
.lb-exterior .lb-sky {
	position: absolute;
	inset: 0 0 auto 0;
	height: 60vh;
	z-index: 1;
}

/* === Sol tropical + chemin =========================================== */

.lb-exterior-ground {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	height: 60vh;
	z-index: 2;
	background: linear-gradient(180deg,
		#6A8B4A 0%,
		#7AAB5A 35%,
		#88B568 100%);
}

.lb-exterior-path-svg {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	width: 100%;
	height: 60vh;
	pointer-events: none;
	display: block;
}

/* === Pavillon au bout du chemin (cliquable) ========================== */

.lb-exterior-building {
	position: absolute;
	/* Phase 4.1 (rev3) : pavillon SVG portrait 3:4 (viewBox 600×800)
	   dimensionné via `height` pour occuper ~40 % de la hauteur viewport.
	   La largeur est dérivée du ratio SVG (~75 % de la hauteur). */
	top: 4%;
	left: 50%;
	transform: translateX(-50%);
	height: clamp(260px, 40vh, 600px);
	width: auto;
	padding: 0;
	background: transparent;
	border: none;
	cursor: pointer;
	z-index: 5;
	transition: transform var(--lb-transition-base);
}

.lb-exterior-building-img {
	/* SVG inline : on contraint la hauteur (le parent fixe `height: 40vh`)
	   et on laisse la largeur suivre l'aspect ratio du viewBox. */
	height: 100%;
	width: auto;
	display: block;
	/* `overflow: visible` permet aux lianes et feuilles tropicales
	   positionnées hors viewBox (x < 0 ou y > 800) de s'afficher : elles
	   débordent volontairement les contours du pavillon pour donner le
	   sentiment que la végétation envahit la façade. */
	overflow: visible;
	filter: drop-shadow(0 8px 16px rgba(26, 122, 110, 0.25));
}

.lb-exterior-building:hover {
	transform: translateX(-50%) translateY(-4px) scale(1.03);
}

.lb-exterior-building:focus-visible {
	outline: none;
}
.lb-exterior-building:focus-visible .lb-exterior-building-img {
	filter: drop-shadow(0 8px 24px rgba(26, 122, 110, 0.55));
}

/* CTA "Approcher" (rev10) — étiquette discrète semi-transparente posée
   DANS LE BAS de la porte centrale du pavillon. Le `<span>` est ENFANT
   du `<button class="lb-exterior-building">` (ET PAS de la fontaine) ;
   `pointer-events: none` fait que la souris "passe à travers" l'étiquette
   vers le bouton parent. Donc :
   - hover sur la façade, la porte SVG, ou l'étiquette → tous déclenchent
     le hover du bouton parent (lift + scale 1.03) ;
   - clic identique → `onBuildingClick` (event bubbling).
   Style : pilule bois ébène semi-transparente, look enseigne sculptée. */
.lb-exterior-building-cta {
	position: absolute;
	left: 50%;
	bottom: 10%;           /* posé dans le bas des portes : doors y 555-770
	                          dans viewBox 800 → 10 % du bas ≈ y 720 (zone
	                          basse des vantaux, juste au-dessus du seuil). */
	transform: translateX(-50%);
	padding: 4px 14px;
	background: rgba(74, 42, 10, 0.82);     /* bois ébène semi-transparent */
	color: rgba(255, 245, 220, 0.96);       /* cream chaud */
	border: 1px solid rgba(255, 245, 220, 0.30);
	border-radius: var(--lb-radius-full);
	font-family: var(--lb-font-corps);
	font-size: clamp(10px, 1vw, 13px);
	font-weight: 600;
	letter-spacing: 0.06em;
	white-space: nowrap;
	text-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
	box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25);
	pointer-events: none;  /* hover et clic passent au bouton parent */
	animation: lb-exterior-cta-pulse 2s ease-in-out infinite;
}

/* Pulsation 1.0 → 1.08 → 1.0 toutes les 2 s pour signaler la zone
   cliquable. Le `translateX(-50%)` du centrage horizontal est répété
   dans chaque keyframe pour ne pas être écrasé par la transformation. */
@keyframes lb-exterior-cta-pulse {
	0%, 100% { transform: translateX(-50%) scale(1); }
	50%      { transform: translateX(-50%) scale(1.08); }
}

/* Quand le visiteur survole le pavillon (ou la zone du CTA puisque
   `pointer-events: none` redirige le hover au parent), la pulsation
   s'arrête : il a compris où cliquer. Le lift+scale du pavillon
   prend la relève comme feedback visuel. */
.lb-exterior-building:hover .lb-exterior-building-cta {
	animation: none;
}

/* === Fontaine extérieure (Phase 4.1 rev5) ============================ */

/* Position (rev7) : exactement sous la porte centrale du pavillon
   (`left: 50%` = même axe horizontal que la porte centrée du building).
   Remontée à `bottom: 28%` : la BASE de la fontaine se trouve à mi-chemin
   entre le bas de l'écran et la porte (door bottom à ~42 % du haut =
   58 % du bas → mi-chemin = 29 % du bas). Le sommet de la fontaine
   (30 vh au-dessus de la base) touche alors le seuil de la porte.
   `transform: translateX(-50%)` recentre le bouton sur l'axe vertical. */
.lb-fountain-outdoor {
	position: absolute;
	left: 50%;
	bottom: 28%;
	height: 30vh;
	width: auto;
	padding: 0;
	background: transparent;
	border: none;
	cursor: pointer;
	z-index: 7;
	transform: translateX(-50%);
	transition: transform var(--lb-transition-base);
}

.lb-fountain-outdoor > svg {
	height: 100%;
	width: auto;
	display: block;
	overflow: visible;
	filter: drop-shadow(0 4px 8px rgba(26, 122, 110, 0.20));
}

/* Pas de lift/scale au hover de la fontaine — le visiteur sait qu'elle
   est cliquable via le `cursor: pointer` (déjà dans la règle de base).
   On évite ainsi qu'elle ressemble à un bouton ; le seul vrai bouton
   d'action de la scène est l'étiquette "Approcher" sur la porte. */

.lb-fountain-outdoor:focus-visible {
	outline: none;
}
.lb-fountain-outdoor:focus-visible > svg {
	filter: drop-shadow(0 4px 14px rgba(26, 122, 110, 0.45));
}

/* Cascades : pulse subtil sur opacity + scaleY pour suggérer le flux.
   Pas une vraie animation de translation — visuellement adapté à la
   petite taille (15 vh) où la finesse de la goutte serait imperceptible. */
.lb-fnt-stream {
	transform-origin: center top;
	animation: lb-fnt-stream-flow 1.4s ease-in-out infinite;
}
.lb-fnt-stream--top   { animation-delay: 0s;   }
.lb-fnt-stream--mid-l { animation-delay: 0.2s; }
.lb-fnt-stream--mid-r { animation-delay: 0.5s; }
.lb-fnt-stream--bot-l { animation-delay: 0.3s; }
.lb-fnt-stream--bot-r { animation-delay: 0.7s; }

@keyframes lb-fnt-stream-flow {
	0%, 100% { opacity: 0.55; transform: scaleY(0.92); }
	50%      { opacity: 0.95; transform: scaleY(1.05); }
}

/* Éclaboussures sur chaque réception d'eau (top bowl, mid bowl, basin). */
.lb-fnt-splash {
	transform-origin: center;
	animation: lb-fnt-splash-pulse 1.6s ease-in-out infinite;
}
.lb-fnt-splash--1 { animation-delay: 0.1s; }
.lb-fnt-splash--2 { animation-delay: 0.4s; }
.lb-fnt-splash--3 { animation-delay: 0.7s; }

@keyframes lb-fnt-splash-pulse {
	0%, 100% { opacity: 0.30; transform: scale(0.85); }
	50%      { opacity: 0.85; transform: scale(1.15); }
}

/* === Arbres et fougères ============================================== */

.lb-exterior-tree,
.lb-exterior-fern {
	position: absolute;
	pointer-events: none;
}

.lb-exterior-tree > svg,
.lb-exterior-fern > svg {
	width: 100%;
	height: auto;
	display: block;
	filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.18));
}

/* 1er plan (palmiers, plus gros, partiellement hors écran). */
.lb-exterior-tree--palm-l {
	left: -3%;
	bottom: -2%;
	width: clamp(140px, 22vw, 240px);
	z-index: 8;
}
.lb-exterior-tree--palm-r {
	right: -3%;
	bottom: -2%;
	width: clamp(140px, 22vw, 240px);
	z-index: 8;
	transform: scaleX(-1);
}

/* Mid-plan (arbres feuillus, dans la zone du chemin). */
.lb-exterior-tree--leafy-l {
	left: 8%;
	bottom: 18%;
	width: clamp(100px, 16vw, 170px);
	z-index: 6;
}
.lb-exterior-tree--leafy-r {
	right: 8%;
	bottom: 18%;
	width: clamp(100px, 16vw, 170px);
	z-index: 6;
}

/* Arrière-plan (petits arbres / buissons à l'horizon). */
.lb-exterior-tree--bg-l {
	left: 22%;
	bottom: 36%;
	width: clamp(60px, 8vw, 100px);
	z-index: 4;
}
.lb-exterior-tree--bg-r {
	right: 22%;
	bottom: 36%;
	width: clamp(60px, 8vw, 100px);
	z-index: 4;
}

/* Fougères au sol, devant le chemin. */
.lb-exterior-fern--l {
	left: 18%;
	bottom: 6%;
	width: clamp(50px, 7vw, 90px);
	z-index: 7;
}
.lb-exterior-fern--r {
	right: 18%;
	bottom: 6%;
	width: clamp(50px, 7vw, 90px);
	z-index: 7;
}

/* === Rayons de soleil (god rays) ===================================== */

.lb-exterior-rays {
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 3;
	overflow: hidden;
}

.lb-exterior-ray {
	position: absolute;
	top: -10%;
	width: 12vw;
	height: 90vh;
	background: linear-gradient(180deg,
		rgba(255, 240, 180, 0.20) 0%,
		rgba(255, 240, 180, 0.08) 55%,
		transparent 100%);
	transform-origin: top center;
	filter: blur(8px);
	animation: lb-exterior-ray-drift 14s ease-in-out infinite;
}
.lb-exterior-ray--1 { left: 12%; transform: rotate(-12deg); animation-delay: 0s;  }
.lb-exterior-ray--2 { left: 42%; transform: rotate(-3deg);  animation-delay: 4s;  }
.lb-exterior-ray--3 { left: 70%; transform: rotate(8deg);   animation-delay: 8s;  }

@keyframes lb-exterior-ray-drift {
	0%, 100% { opacity: 0.55; }
	50%      { opacity: 0.95; }
}

/* === Papillons ======================================================== */

.lb-exterior-butterflies {
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 9;
}

.lb-exterior-butterfly {
	position: absolute;
	width: 18px;
	height: 14px;
	pointer-events: none;
	animation: lb-butterfly-flight 22s ease-in-out infinite;
}
.lb-exterior-butterfly > svg {
	width: 100%;
	height: 100%;
	/* Wing flap : scale axial (battement). 2 frames steps pour clignotement. */
	animation: lb-butterfly-flap 0.45s steps(2, end) infinite;
}

.lb-exterior-butterfly--1 { top: 60%; left: 14%;  animation-duration: 22s; animation-delay: 0s;  }
.lb-exterior-butterfly--2 { top: 48%; left: 22%;  animation-duration: 28s; animation-delay: 4s;  }
.lb-exterior-butterfly--3 { top: 56%; right: 14%; animation-duration: 24s; animation-delay: 9s;  }
.lb-exterior-butterfly--4 { top: 70%; right: 26%; animation-duration: 30s; animation-delay: 13s; }

@keyframes lb-butterfly-flight {
	0%   { transform: translate(0, 0); }
	25%  { transform: translate(60px, -50px); }
	50%  { transform: translate(120px, 20px); }
	75%  { transform: translate(40px, -80px); }
	100% { transform: translate(0, 0); }
}

@keyframes lb-butterfly-flap {
	0%   { transform: scaleX(1); }
	100% { transform: scaleX(0.5); }
}

/* === Oiseaux exotiques (passages occasionnels) ======================= */

.lb-exterior-fauna-birds {
	position: absolute;
	inset: 0;
	pointer-events: none;
	z-index: 10;
}

.lb-exterior-fauna-bird {
	position: absolute;
	left: -10%;
	width: 28px;
	height: 14px;
	opacity: 0;
	animation: lb-fauna-bird-fly 60s linear infinite;
}
.lb-exterior-fauna-bird > svg {
	width: 100%;
	height: 100%;
}

.lb-exterior-fauna-bird--1 { top: 22%; animation-delay: 0s;  }
.lb-exterior-fauna-bird--2 { top: 30%; animation-delay: 35s; }

@keyframes lb-fauna-bird-fly {
	0%   { transform: translateX(0)        translateY(0);   opacity: 0; }
	5%   { opacity: 0.95; }
	50%  { transform: translateX(60vw)     translateY(-12px); }
	95%  { opacity: 0.95; }
	100% { transform: translateX(120vw)    translateY(20px);  opacity: 0; }
}

/* === Responsive — mobile ============================================= */

@media (max-width: 768px) {
	.lb-exterior-building {
		top: 6%;
		height: clamp(220px, 38vh, 400px);
		/* width: auto hérité de la base. */
	}

	/* Fontaine sur mobile : reste centrée sous la porte (left: 50%)
	   et remontée. Hauteur 24 vh (vs 30 vh desktop) → bottom plus
	   élevé pour que le sommet atteigne la porte. */
	.lb-fountain-outdoor {
		left: 50%;
		bottom: 33%;
		height: 24vh;
	}

	.lb-exterior-building-cta {
		/* Mobile : étiquette plus petite, toujours posée dans le bas
		   des portes (cf. desktop : 10 % du bas du bouton ≈ y 720). */
		font-size: 9px;
		padding: 3px 10px;
		bottom: 10%;
	}

	/* Sur mobile, on garde 1 arbre fond + 1 fougère par côté ; les
	   éléments mid-plan rapetissent pour ne pas masquer le pavillon. */
	.lb-exterior-tree--leafy-l { left: 2%;  bottom: 14%; }
	.lb-exterior-tree--leafy-r { right: 2%; bottom: 14%; }
	.lb-exterior-tree--bg-l { left: 18%; bottom: 32%; }
	.lb-exterior-tree--bg-r { right: 18%; bottom: 32%; }
}

/* === Reduced motion ================================================== */

@media (prefers-reduced-motion: reduce) {
	.lb-exterior {
		transition: opacity 200ms ease-out;
	}
	.lb-exterior-butterfly,
	.lb-exterior-butterfly > svg,
	.lb-exterior-fauna-bird,
	.lb-exterior-ray,
	.lb-exterior-building-cta,
	.lb-fnt-stream,
	.lb-fnt-splash {
		animation: none !important;
	}
}
