/*
 * Zarboutan Matériaux — Maquette IMMERSIVE isolée v2 (dépôt → terrasse)
 * Intensité : desktop 8/10, mobile 3/10, prefers-reduced-motion : désactivé.
 * CSS natif uniquement. Aucune librairie externe.
 */

* {
	box-sizing: border-box;
}

html, body {
	margin: 0;
	background: #0b0d0a;
	color: #fff;
	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}

.zbi-demo-banner {
	position: relative;
	z-index: 100;
	background: #1a2e1a;
	color: #b7e6bd;
	text-align: center;
	padding: 10px 16px;
	font-size: 14px;
	border-bottom: 1px solid #2f5a37;
}

/* ---------- Scène = piste de scroll + viewport épinglé (sticky) ---------- */

/* Cause du "espace noir inutilisé" (audit UX) : .zbi-scene est un bloc
   <!-- wp:html --> comme un autre, donc contraint par .entry-content
   .is-layout-constrained à la largeur de lecture standard (~820px sur cette
   page) au lieu d'utiliser la largeur de la fenêtre. Cette règle sort la
   scène de cette contrainte (technique standard "full-bleed") sans toucher
   au HTML ni au JS : le calcul de profondeur 3D ne dépend que des transforms
   appliqués par zarboutan-immersive.js, jamais de la largeur du conteneur. */
.zbi-scene {
	position: relative;
	/* Scelle tout le hero (3D-stage, calques, vidéo) dans son propre contexte
	   d'empilement. Nécessaire depuis l'ajout de la vidéo de fond : un <video>
	   imbriqué dans des ancêtres transform-style:preserve-3d/perspective peut
	   être promu par le moteur de rendu sur un plan de composition matériel
	   qui ignore l'ordre de peinture normal et déborde au-dessus d'éléments
	   pourtant hors de ce sous-arbre (ex. le widget Zako, position:fixed,
	   z-index:99999, rendu en fin de <body> via wp_footer). isolation:isolate
	   ne change ni la mise en page ni le rendu visuel du hero : elle borne
	   uniquement ce qui peut s'en échapper visuellement. */
	isolation: isolate;
	height: 220vh; /* piste de scroll plafonnée à 220vh (ajustement demandé avant intégration) */
	/* !important justifié : .entry-content.is-layout-constrained (WordPress
	   core) impose margin-left/right:auto sur ses enfants directs avec une
	   spécificité qui bat un simple sélecteur de classe — sans !important,
	   le margin-left recalculait à 0 et le margin-right à une valeur
	   incohérente (vérifié : scène décalée à droite, vide à gauche). */
	width: 100vw !important;
	max-width: 100vw !important;
	margin-left: calc(50% - 50vw) !important;
	margin-right: calc(50% - 50vw) !important;
}

/* Section terrasse : piste plafonnée à 160vh (total immersif desktop
   220vh + 160vh = 380vh maximum). Règle placée avant les media queries
   mobile/reduced-motion ci-dessous afin qu'elles continuent à s'appliquer
   normalement (180vh mobile, 100vh reduced-motion, inchangés). */
.zbi-scene--terrasse {
	height: 160vh;
}

/* Surtitre de la section terrasse uniquement — scopé à .zbi-scene--terrasse
   (pas .zbi-content seul) pour ne jamais pouvoir affecter le hero dépôt, qui
   ne porte pas cette classe et n'a pas d'élément .zbi-eyebrow. */
.zbi-scene--terrasse .zbi-eyebrow {
	display: block;
	font-size: 13px;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: #fff;
	opacity: 0.85;
	margin: 0 0 10px;
	text-shadow: 0 2px 10px rgba(0, 0, 0, 0.75);
}

.zbi-scene__sticky {
	position: sticky;
	top: 0;
	height: 100vh;
	overflow: hidden;
	background: #0b0d0a;
	/* Perspective volontairement courte : c'est ce qui rend la 3D évidente
	   dès le chargement (fort effet de profondeur, non un simple fond zoomé). */
	perspective: 420px;
	perspective-origin: 50% 55%;
}

/* ---------- Scène 3D : un plan par profondeur, positionné en Z ---------- */

.zbi-3d-stage {
	position: absolute;
	inset: 0;
	transform-style: preserve-3d;
	will-change: transform;
}

/* Groupe "arrière-décor" (fond + milieu) : reçoit seul l'avancée de caméra
   (dolly) au scroll. Le premier plan en est détaché (voir .zbi-layer--fg)
   pour pouvoir sortir du champ pendant que le décor continue de grossir. */
.zbi-bg-stage {
	position: absolute;
	inset: 0;
	transform-style: preserve-3d;
	will-change: transform;
}

.zbi-layer {
	position: absolute;
	will-change: transform;
	/* Transition courte réservée au micro-déplacement souris : lisse le geste
	   sans jamais retarder le zoom au scroll (piloté ailleurs, sans transition). */
	transition: transform 0.2s ease-out;
}

/* Plan lointain : intérieur du dépôt / la terrasse au loin.
   Surdimensionné pour compenser le rétrécissement perspective à Z=-900/-1100px
   (perspective 420px) et garantir une couverture plein cadre au repos. */
.zbi-layer--far {
	inset: -170%;
	width: 440%;
	height: 440%;
	background-position: center center;
	background-size: cover;
	background-repeat: no-repeat;
}

.zbi-layer--far::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(0, 0, 0, 0.2) 0%, rgba(0, 0, 0, 0.6) 100%);
}

/* Vidéo de fond du hero (remplace l'ancienne background-image de .zbi-layer--far).
   Remplit exactement son parent, quelle que soit la taille de celui-ci (survolumé
   en desktop pour la 3D, remis à 100% en mobile/reduced-motion ci-dessous) — le
   ::after ci-dessus continue de peindre l'overlay sombre par-dessus sans changement. */
.zb-hero-video {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	/* Purement décorative (fond de scène) : ne doit jamais intercepter de
	   clic, comme .zbi-layer--fg et .zl-hero-badge déjà présents. */
	pointer-events: none;
}

/* Premier plan : la pile de bois, juste devant la caméra — nettement agrandie.
   Un masque dégradé fond les bords (haut/bas) dans le décor au lieu d'une
   découpe nette : supprime l'effet "cadre posé devant une photo" et dissout
   la rupture visible entre le plancher du premier plan et le sol du dépôt. */
.zbi-layer--fg {
	left: 50%;
	bottom: -8%;
	width: 130%;
	max-width: 1700px;
	transform: translateX(-50%);
	pointer-events: none;
	/* Surcharge volontaire de la transition héritée de .zbi-layer : la sortie
	   de champ (translateY + opacity) est pilotée en JS à chaque frame de
	   scroll, déjà adoucie par l'easing "smoothstep" appliqué à la progression
	   — une transition CSS ajoutée par-dessus créerait un décalage/rebond. */
	transition: none;

	mask-image: linear-gradient(
		to bottom,
		transparent 0%,
		black 14%,
		black 76%,
		transparent 100%
	);
	-webkit-mask-image: linear-gradient(
		to bottom,
		transparent 0%,
		black 14%,
		black 76%,
		transparent 100%
	);
}

/* Ombre de contact au sol : ancre visuellement la pile de bois sur le
   plancher du dépôt plutôt que de la laisser "flotter" devant la photo. */
.zbi-fg-groundshadow {
	position: absolute;
	left: 50%;
	bottom: 4%;
	width: 68%;
	height: 16%;
	transform: translateX(-50%);
	background: radial-gradient(
		ellipse at center,
		rgba(0, 0, 0, 0.55) 0%,
		rgba(0, 0, 0, 0.25) 50%,
		transparent 78%
	);
	filter: blur(14px);
	mix-blend-mode: multiply;
}

/* Fondu colorimétrique : aligne la teinte/lumière du premier plan sur celle
   du dépôt en arrière-plan pour une intégration plus naturelle. */
.zbi-layer--fg::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(180deg, rgba(10, 12, 8, 0.04) 0%, rgba(10, 12, 8, 0.32) 100%);
	mix-blend-mode: multiply;
	pointer-events: none;
}

.zbi-layer--fg img {
	position: relative;
	width: 100%;
	display: block;
	filter: brightness(0.92) contrast(1.03) saturate(0.9) drop-shadow(0 18px 22px rgba(0, 0, 0, 0.4));
}

/* Le contenu texte/CTA ne subit JAMAIS de transform ni de perspective :
   toujours net, plat, parfaitement lisible au-dessus de la scène 3D. */
.zbi-content {
	position: absolute;
	inset: 0;
	z-index: 5;
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	text-align: center;
	padding: 24px;
	pointer-events: none;
}

.zbi-content > * {
	pointer-events: auto;
}

.zbi-content h1,
.zbi-content h2 {
	font-size: 48px;
	line-height: 1.2;
	margin: 0 0 16px;
	max-width: 780px;
	text-shadow: 0 4px 28px rgba(0, 0, 0, 0.75), 0 2px 8px rgba(0, 0, 0, 0.9);
}

.zbi-content p {
	font-size: 18px;
	max-width: 600px;
	opacity: 0.95;
	margin: 0 0 26px;
	text-shadow: 0 2px 14px rgba(0, 0, 0, 0.8);
}

/* --- Signature de marque du hero (27/07/2026) — même texte, même famille
 * de style que la version footer (footer-brand-signature.css) : Manrope
 * 600, letter-spacing 0.2px, line-height 1.5, centré, italique léger.
 * Deux adaptations volontaires par rapport au footer, documentées :
 *
 * 1) Couleur #F5F1E8 (variante fond sombre déjà prévue dans le brief
 *    d'origine, jamais utilisée jusqu'ici faute de fond sombre existant)
 *    + text-shadow identique à .zbi-content p ci-dessus, plutôt que
 *    #173404 (illisible ici : fond photo, pas la page claire du footer).
 *    Le carrousel de fond fait varier la luminosité derrière le texte
 *    slide par slide — exactement le même problème déjà résolu par TOUS
 *    les autres textes de ce bloc (h1, p, trust-line) via un text-shadow
 *    sombre plutôt qu'une couleur seule : même technique reprise ici
 *    pour la même raison, pas une nouvelle idée.
 * 2) Bascule mobile à 768px (pas 600px comme le footer) : ce fichier a
 *    son propre point de rupture (768px, voir plus bas), déjà utilisé
 *    par h1/p/ctas/trust-line juste au-dessus — s'aligner dessus évite
 *    un état transitoire incohérent (voisins déjà en taille mobile,
 *    signature encore en taille desktop) entre 600 et 768px.
 *
 * Marges réduites par rapport au footer (grande respiration adaptée à
 * un espace spacieux) : ici le hero a une mise en page déjà dense et
 * verticalement contrainte (justify-content:center sur .zbi-content) —
 * un espacement aussi large que le footer aurait poussé les CTA hors
 * de l'équilibre déjà validé de la section. Espacement resserré mais
 * cohérent avec le rythme vertical existant (h1 margin-bottom 16px, p
 * margin-bottom 26px). */
.zbi-content .zbi-signature {
	max-width: 600px;
	margin: 0 0 24px;
	font-family: Manrope, sans-serif;
	font-weight: 600;
	font-style: italic;
	font-size: 20px;
	line-height: 1.5;
	letter-spacing: 0.2px;
	color: #f5f1e8;
	text-shadow: 0 2px 14px rgba(0, 0, 0, 0.8);
}

.zbi-content .zbi-ctas a {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	min-height: 48px;
	padding: 0 28px;
	margin: 0 8px;
	border-radius: 8px;
	border: 1px solid transparent;
	text-decoration: none;
	font-weight: 700;
	/* transform exclu ici volontairement : seuls hover/active le déclenchent,
	   la transition ne doit jamais rejouer au chargement (voir .zbi-ctas,
	   animée séparément par la révélation de l'étape précédente). */
	transition: background-color 180ms ease, border-color 180ms ease,
		box-shadow 180ms ease, color 180ms ease, transform 180ms ease;
}

/* CTA principal : fond clair dominant, texte vert marque à contraste élevé
   (--zb-accent-deep est déjà la nuance validée AA 4.5:1 sur fond clair,
   voir color-palette.css). Priorité visuelle nette sur le secondaire. */
.zbi-content .zbi-ctas a.primary {
	background: var(--zb-surface-card, #fff);
	color: var(--zb-accent-deep, #237a3d);
	border-color: var(--zb-border-subtle, #e6e0d3);
	box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);
}

.zbi-content .zbi-ctas a.secondary {
	background: rgba(255, 255, 255, 0.1);
	color: #fff;
	border-color: rgba(255, 255, 255, 0.6);
	backdrop-filter: blur(3px);
}

/* Hover réservé aux dispositifs à pointeur précis : pas de survol simulé
   au doigt sur tactile (mission : @media (hover:hover)). */
@media (hover: hover) {
	.zbi-content .zbi-ctas a.primary:hover {
		transform: translateY(-2px);
		box-shadow: 0 8px 20px rgba(0, 0, 0, 0.24);
	}

	.zbi-content .zbi-ctas a.secondary:hover {
		background: rgba(255, 255, 255, 0.2);
	}
}

.zbi-content .zbi-ctas a:focus-visible {
	outline: 3px solid #fff;
	outline-offset: 3px;
}

.zbi-content .zbi-ctas a.primary:active {
	transform: translateY(0);
	box-shadow: 0 3px 10px rgba(0, 0, 0, 0.16);
}

.zbi-content .zbi-ctas a.secondary:active {
	background: rgba(255, 255, 255, 0.16);
}

/* Ligne de confiance sous les CTA : discrète, statique, pas d'icône externe.
   Spécificité (2 classes) > .zbi-content p (1 classe + type), donc aucun
   !important nécessaire pour prendre le pas sur les règles de paragraphe. */
.zbi-content .zbi-trust-line {
	font-size: 13px;
	letter-spacing: 0.02em;
	color: rgba(255, 255, 255, 0.85);
	margin: 18px 0 0;
	text-shadow: 0 2px 10px rgba(0, 0, 0, 0.75);
}

/* ---------- Apparition du contenu hero (une seule fois, au chargement) ---------- */
/* .zbi-content n'a jamais de transform/perspective (voir plus haut) : ce
   translateY reste un déplacement 2D plat, sans interaction avec la scène 3D
   ni avec la vidéo. animation-fill-mode:both fige l'état "from" pendant le
   délai (pas de flash) puis conserve l'état "to" après la fin (pas de retour
   à opacity:0). Propriétés compositor-only (opacity/transform) : pas de CLS. */
@keyframes zbi-content-reveal {
	from {
		opacity: 0;
		transform: translateY(12px);
	}
	to {
		opacity: 1;
		transform: translateY(0);
	}
}

.zbi-content h1,
.zbi-content > p:not(.zbi-trust-line),
.zbi-content .zbi-signature,
.zbi-content .zbi-ctas,
.zbi-content .zbi-trust-line {
	animation: zbi-content-reveal 650ms cubic-bezier(0.22, 1, 0.36, 1) both;
}

.zbi-content h1 {
	animation-delay: 100ms;
}

.zbi-content > p:not(.zbi-trust-line) {
	animation-delay: 250ms;
}

/* Insérée dans la séquence entre le sous-titre (250ms) et les CTA (400ms),
   sans renuméroter les délais déjà en place sur les autres éléments. */
.zbi-content .zbi-signature {
	animation-delay: 325ms;
}

.zbi-content .zbi-ctas {
	animation-delay: 400ms;
}

.zbi-content .zbi-trust-line {
	animation-delay: 550ms;
}

.zbi-scroll-hint {
	position: absolute;
	bottom: 28px;
	left: 50%;
	transform: translateX(-50%);
	font-size: 13px;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	opacity: 0.75;
	z-index: 5;
}

/* ---------- Transition immersive entre scènes ---------- */

.zbi-scene-transition-fade {
	position: absolute;
	inset: 0;
	z-index: 4;
	background: #0b0d0a;
	opacity: 0;
	pointer-events: none;
}

/* ---------- MOBILE : intensité réduite (≈3/10), pas de perspective 3D ---------- */
/* Un seul plan (le fond) reçoit un zoom doux au scroll, piloté en JS avec un
   facteur volontairement faible. Pas de parallax souris (pas de souris),
   pas de plan milieu/premier plan (poids + lisibilité sur petit écran). */
@media (max-width: 768px), (hover: none), (pointer: coarse) {
	.zbi-scene {
		height: 180vh;
	}

	.zbi-scene__sticky {
		perspective: none;
	}

	.zbi-3d-stage,
	.zbi-bg-stage {
		transform: none !important;
	}

	.zbi-layer--fg {
		display: none;
	}

	.zbi-layer--far {
		inset: 0;
		width: 100%;
		height: 100%;
		transition: transform 0.3s ease-out;
	}

	.zbi-content h1,
	.zbi-content h2 {
		font-size: 30px;
	}

	.zbi-content p {
		font-size: 16px;
	}

	.zbi-content .zbi-signature {
		font-size: 16px;
		margin: 0 0 18px;
	}

	.zbi-content .zbi-ctas a {
		min-height: 46px;
		padding: 0 22px;
	}

	.zbi-content .zbi-trust-line {
		font-size: 12px;
		margin-top: 14px;
	}

	.zbi-scroll-hint {
		display: none;
	}
}

/* ---------- Accessibilité : prefers-reduced-motion → effet désactivé ---------- */
@media (prefers-reduced-motion: reduce) {
	.zbi-scene {
		height: 100vh;
	}

	.zbi-scene__sticky {
		perspective: none;
	}

	.zbi-3d-stage,
	.zbi-bg-stage {
		transform: none !important;
	}

	.zbi-layer {
		transition: none !important;
		transform: none !important;
	}

	.zbi-layer--far {
		inset: 0;
		width: 100%;
		height: 100%;
	}

	/* Une vidéo en boucle reste une animation même transforms/parallax coupés :
	   on la masque et on retrouve l'image statique d'origine, en CSS uniquement. */
	.zb-hero-video {
		display: none;
	}

	.zbi-layer--far {
		background-image: url('/wp-content/uploads/zarboutan-3d-demo/images/fond-depot.webp');
	}

	.zbi-layer--fg {
		display: none;
	}

	.zbi-scene-transition-fade {
		display: none;
	}

	/* Désactivation complète de l'apparition du contenu hero : tout est
	   immédiatement visible, sans délai ni mouvement. */
	.zbi-content h1,
	.zbi-content > p:not(.zbi-trust-line),
	.zbi-content .zbi-signature,
	.zbi-content .zbi-ctas,
	.zbi-content .zbi-trust-line {
		animation: none;
		opacity: 1;
		transform: none;
	}

	/* CTA : plus de translation animée au survol/appui, mais couleur/contraste
	   et focus restent immédiats (non supprimés). */
	.zbi-content .zbi-ctas a {
		transition: background-color 180ms ease, border-color 180ms ease,
			box-shadow 180ms ease, color 180ms ease;
	}

	.zbi-content .zbi-ctas a.primary:hover,
	.zbi-content .zbi-ctas a.primary:active {
		transform: none;
	}
}

/* ---------- Section terrasse : fondu d'entrée additif ---------- */
/* Nouvelle classe uniquement : n'affecte aucune scène existante qui ne la
   porte pas (le hero dépôt n'a pas cette classe et reste inchangé). */

.zbi-scene--fade-in .zbi-scene__sticky {
	opacity: 0;
	transition: opacity 1.1s ease-out;
}

.zbi-scene--fade-in.is-visible .zbi-scene__sticky {
	opacity: 1;
}

@media (prefers-reduced-motion: reduce) {
	.zbi-scene--fade-in .zbi-scene__sticky {
		opacity: 1 !important;
		transition: none !important;
	}
}

/* ---------- Médaillon ZM décoratif dans le hero dépôt ---------- */
/* Purement additif : ne modifie ni .zbi-content ni .zbi-3d-stage.
   Positionné en coin haut-droit, z-index toujours sous .zbi-content (5)
   pour garantir qu'il ne passe jamais devant le H1/texte/CTA. */
.zl-hero-badge {
	position: absolute;
	top: 7%;
	right: 5%;
	z-index: 3;
	pointer-events: none;
	filter: drop-shadow(0 14px 22px rgba(0, 0, 0, 0.5));
	/* Masqué — chevauchement avec le header fixe, cf. CHANGELOG 26/07 */
	display: none;
}

.zl-hero-badge .zl-logo-stage.zl-logo-stage--hero-badge {
	width: 120px;
	perspective: 500px;
}

/* Corrige un halo circulaire résiduel : .zl-face porte un box-shadow inset
   (relief) pensé pour une image de fond opaque. Avec le PNG transparent du
   médaillon hero, ce box-shadow reste visible sur tout le disque et forme
   un halo gris derrière le Z/M. On le retire uniquement ici (le médaillon
   hero) — la maquette isolée, qui garde l'image opaque d'origine, n'a pas
   ce problème et n'est pas concernée par cette règle.
   Bénéfice induit : le drop-shadow de .zl-hero-badge suit alors la forme
   réelle du Z/M au lieu du cercle complet, sans rien ajouter de plus. */
.zl-hero-badge .zl-face {
	box-shadow: none;
}

@media (max-width: 768px), (hover: none), (pointer: coarse) {
	.zl-hero-badge .zl-logo-stage.zl-logo-stage--hero-badge {
		width: 64px;
	}

	/* Statique sur mobile : la scène 3D est construite par le script
	   partagé (utile pour la maquette isolée), mais ici on fige
	   l'orientation en CSS pour ce médaillon décoratif uniquement. */
	.zl-hero-badge .zl-logo-coin {
		transform: none !important;
	}
}

@media (prefers-reduced-motion: reduce) {
	.zl-hero-badge .zl-logo-coin {
		transform: none !important;
	}
}
