/* =========================================================================
   La Pépite Végétale — feuille de style principale
   Palette et typographie reprises de la maquette validée.
   ========================================================================= */

/* -------------------------------------------------------------------------
   1. Jetons de design
   ------------------------------------------------------------------------- */
/*
 * Deux couches distinctes :
 *   — les PIGMENTS, couleurs fixes de la marque, jamais modifiées ;
 *   — les RÔLES, qui disent à quoi sert une couleur et basculent en mode sombre.
 *
 * Toute la feuille de style n'utilise que des rôles. C'est ce qui permet
 * d'ajouter une variante nuit sans repasser sur 2500 lignes.
 */
:root {
	/* ---- Pigments (maquette validée) ---- */
	--vert-profond: #2c4033;
	--vert-nuit: #2c3329;
	--vert-gris: #5b6157;
	--beige-gris: #8a8676;
	--vert-pale: #e4ecdf;
	--creme: #f5f1e8;
	--creme-clair: #faf8f2;
	--beige: #e7e1d2;
	--blanc: #ffffff;
	--jaune: #f2e500;
	--jaune-doux: #fbf7c4;
	--brique: var(--erreur);

	/* ---- Rôles : surfaces ---- */
	--fond: var(--creme-clair);
	--fond-alt: var(--creme);
	--surface: var(--blanc);
	--surface-douce: var(--beige);
	--surface-sombre: var(--vert-profond);
	--surface-sombre-2: var(--vert-nuit);

	/* ---- Rôles : texte ---- */
	--titre: var(--vert-profond);
	--texte: var(--vert-nuit);
	--texte-doux: var(--vert-gris);
	/* Le beige-gris de la maquette tombe a 3,3:1 sur le creme : sous le seuil
	   AA pour du petit texte. Version assombrie, meme famille, 4,7:1. */
	--texte-tenu: #6a6d5e;
	--sur-sombre: var(--creme-clair);
	--sur-sombre-doux: rgba(245, 241, 232, 0.8);
	/* 0,55 tombait a 4,2:1 sur le vert profond : sous le seuil AA. */
	--sur-sombre-tenu: rgba(245, 241, 232, 0.66);

	/* ---- Rôles : traits et accents ---- */
	--trait: rgba(44, 64, 51, 0.14);
	--trait-fort: rgba(44, 64, 51, 0.35);
	--trait-sombre: rgba(245, 241, 232, 0.18);
	--accent: var(--jaune);
	--accent-texte: var(--vert-nuit);
	--erreur: var(--brique);
	--erreur-fond: var(--erreur-fond);
	--succes-fond: var(--vert-pale);

	/* ---- Rôles : boutons ---- */
	--btn-fond: var(--vert-profond);
	--btn-texte: var(--creme-clair);
	--btn-fond-actif: var(--vert-nuit);
	--btn-clair-fond: var(--creme-clair);
	--btn-clair-texte: var(--vert-profond);

	/* ---- Voile posé sur les photos ---- */
	--voile: 38 45 36;

	/* ---- Grain papier ---- */
	--fond-flou: rgba(250, 248, 242, 0.94);
	--grain-opacite: 0.035;

	/* Typographie. Pour un site 100 % Work Sans : --font-display: var(--font-base). */
	--font-base: "Work Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
	--font-display: "EB Garamond", Georgia, "Times New Roman", serif;

	/* Rythme. */
	--largeur: 1240px;
	--gouttiere: clamp(1.25rem, 4vw, 2.5rem);
	--section-y: clamp(4rem, 9vw, 8rem);
	--radius: 4px;
	--radius-l: 12px;
	--radius-xl: 24px;

	/* Mouvement. */
	--transition: 0.4s cubic-bezier(0.22, 1, 0.36, 1);
	--transition-lente: 0.9s cubic-bezier(0.22, 1, 0.36, 1);
	--ressort: 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);

	/* Suit la hauteur du logo agrandi : a 84px le dessin touchait les bords. */
	--header-h: 96px;

	color-scheme: light;
}

/*
 * Variante nuit. Le vert profond ne peut plus servir à la fois de couleur de
 * titre et de fond sombre : chaque rôle prend sa propre valeur.
 */
/*
 * Variante nuit — DÉSACTIVÉE par défaut.
 * Elle ne s'applique que si la classe .lpv-nuit-auto est posée sur <html>,
 * c'est-à-dire si l'option « Suivre le mode sombre du visiteur » est cochée
 * dans le personnalisateur. Sans elle, le site reste clair quel que soit le
 * réglage système du visiteur.
 */
@media (prefers-color-scheme: dark) {
	:root.lpv-nuit-auto {
		/*
		 * En mode nuit, la logique s'inverse : les sections « vertes » doivent
		 * devenir plus CLAIRES que la page, sinon l'alternance des bandes
		 * disparaît et tout se confond.
		 */
		--fond: #11150d;
		--fond-alt: #191e15;
		--surface: #1e241a;
		--surface-douce: #2b3324;
		--surface-sombre: #263021;
		--surface-sombre-2: #0c100a;

		--titre: #eae7d8;
		--texte: #e4e1d3;
		--texte-doux: #b0b3a3;
		--texte-tenu: #8b8f7e;
		--sur-sombre: #eae7d8;
		--sur-sombre-doux: rgba(234, 231, 216, 0.78);
		--sur-sombre-tenu: rgba(234, 231, 216, 0.62);

		--trait: rgba(234, 231, 216, 0.16);
		--trait-fort: rgba(234, 231, 216, 0.38);
		--trait-sombre: rgba(234, 231, 216, 0.14);
		--erreur: #e8a48d;
		--erreur-fond: #3a231b;
		--succes-fond: #22301f;

		/* Un bouton vert foncé sur fond nuit ne se verrait plus : on inverse. */
		--btn-fond: #eae7d8;
		--btn-texte: #14180f;
		--btn-fond-actif: var(--accent);
		--btn-clair-fond: #eae7d8;
		--btn-clair-texte: #14180f;

		--voile: 10 13 8;
		--fond-flou: rgba(20, 24, 15, 0.92);
		--grain-opacite: 0.05;

		color-scheme: dark;
	}
}

/* -------------------------------------------------------------------------
   2. Base
   ------------------------------------------------------------------------- */
*,
*::before,
*::after {
	box-sizing: border-box;
}

html {
	scroll-behavior: smooth;
	-webkit-text-size-adjust: 100%;
	scroll-padding-top: calc(var(--header-h) + 1rem);
}

body {
	margin: 0;
	background: var(--fond);
	color: var(--texte);
	font-family: var(--font-base);
	font-size: clamp(1rem, 0.97rem + 0.15vw, 1.0625rem);
	/* 400 plutot que 300 : demande de la cliente, la lineale manquait de
	   presence. Work Sans 400 reste leger sans etre maigre. */
	font-weight: 400;
	line-height: 1.7;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
	overflow-x: hidden;
}

img,
svg,
video,
iframe {
	max-width: 100%;
	height: auto;
	display: block;
}

a {
	color: inherit;
	text-decoration: none;
}

button {
	font: inherit;
	cursor: pointer;
}

::selection {
	background: var(--accent);
	color: var(--accent-texte);
}

:focus-visible {
	outline: 2px solid var(--titre);
	outline-offset: 3px;
	border-radius: 2px;
}

/* -------------------------------------------------------------------------
   3. Typographie
   ------------------------------------------------------------------------- */
h1,
h2,
h3,
h4 {
	font-family: var(--font-display);
	/* EB Garamond n'existe qu'a partir de 400 et dessine plus fin que
	   Fraunces : 400 ici equivaut visuellement au 300 precedent. */
	font-weight: 400;
	line-height: 1.12;
	letter-spacing: -0.015em;
	color: var(--titre);
	margin: 0 0 0.6em;
	text-wrap: balance;
}

h1 {
	font-size: clamp(2.25rem, 1.4rem + 4.2vw, 4.5rem);
}

h2 {
	font-size: clamp(1.75rem, 1.15rem + 2.6vw, 3rem);
}

h3 {
	font-size: clamp(1.25rem, 1.05rem + 0.9vw, 1.75rem);
}

h4 {
	font-size: clamp(1.05rem, 1rem + 0.4vw, 1.25rem);
}

p {
	margin: 0 0 1.25em;
	color: var(--texte-doux);
}

p:last-child {
	margin-bottom: 0;
}

strong {
	font-weight: 500;
	color: var(--texte);
}

/* Sur-titre : petites capitales espacées, marque de fabrique du site. */
.lpv-surtitre {
	display: block;
	font-family: var(--font-base);
	font-size: 0.75rem;
	font-weight: 500;
	letter-spacing: 0.18em;
	text-transform: uppercase;
	color: var(--texte-tenu);
	margin-bottom: 1.25rem;
}

.lpv-lead {
	font-size: clamp(1.0625rem, 1rem + 0.4vw, 1.25rem);
	line-height: 1.6;
	color: var(--texte-doux);
	max-width: 62ch;
}

/* -------------------------------------------------------------------------
   4. Structure
   ------------------------------------------------------------------------- */
.lpv-container {
	width: 100%;
	max-width: var(--largeur);
	margin-inline: auto;
	padding-inline: var(--gouttiere);
}

.lpv-container--etroit {
	max-width: 820px;
}

.lpv-section {
	padding-block: var(--section-y);
}

.lpv-section--creme {
	background: var(--fond-alt);
}

.lpv-section--vert {
	background: var(--surface-sombre);
	color: var(--sur-sombre);
}

.lpv-section--vert h2,
.lpv-section--vert h3 {
	color: var(--sur-sombre);
}

.lpv-section--vert p {
	color: var(--sur-sombre-doux);
}

.lpv-section--vert .lpv-surtitre {
	color: var(--sur-sombre-tenu);
}

.lpv-section-head {
	max-width: 40ch;
	margin-bottom: clamp(2.5rem, 5vw, 4rem);
}

.lpv-section-head--centre {
	max-width: 46ch;
	margin-inline: auto;
	text-align: center;
}

.lpv-section-head--centre .lpv-lead {
	margin-inline: auto;
}

/* En-tête avec titre à gauche et lien à droite. */
.lpv-section-head--split {
	max-width: none;
	display: flex;
	flex-wrap: wrap;
	align-items: flex-end;
	justify-content: space-between;
	gap: 1.5rem 2rem;
}

.lpv-section-head--split > div {
	max-width: 40ch;
}

.lpv-section-head--split h2 {
	margin-bottom: 0;
}

/* Filet fin décoratif. */
.lpv-trait {
	width: 56px;
	height: 2px;
	background: var(--accent);
	border: 0;
	margin: 0 0 1.75rem;
}

.lpv-section-head--centre .lpv-trait {
	margin-inline: auto;
}

/* -------------------------------------------------------------------------
   5. Boutons
   ------------------------------------------------------------------------- */
.lpv-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.6em;
	padding: 0.95em 2em;
	border: 1px solid transparent;
	border-radius: 999px;
	font-family: var(--font-base);
	font-size: 0.875rem;
	font-weight: 500;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1;
	text-align: center;
	transition: background var(--transition), color var(--transition),
		border-color var(--transition), transform var(--transition);
}

.lpv-btn:hover {
	transform: translateY(-2px);
}

.lpv-btn--primaire {
	background: var(--btn-fond);
	color: var(--btn-texte);
}

.lpv-btn--primaire:hover {
	background: var(--btn-fond-actif);
	color: var(--btn-texte);
}

.lpv-btn--secondaire {
	background: transparent;
	color: var(--titre);
	border-color: var(--trait-fort);
}

.lpv-btn--secondaire:hover {
	background: var(--btn-fond);
	color: var(--btn-texte);
	border-color: var(--btn-fond);
}

.lpv-btn--clair {
	background: var(--btn-clair-fond);
	color: var(--btn-clair-texte);
}

.lpv-btn--clair:hover {
	background: var(--accent);
	color: var(--accent-texte);
}

.lpv-btn--fantome {
	background: transparent;
	color: var(--sur-sombre);
	border-color: var(--sur-sombre-tenu);
}

.lpv-btn--fantome:hover {
	background: var(--btn-clair-fond);
	color: var(--btn-clair-texte);
}

.lpv-btns {
	display: flex;
	flex-wrap: wrap;
	gap: 0.875rem;
}

/* Lien texte avec flèche. */
.lpv-lien {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	font-size: 0.875rem;
	font-weight: 500;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--titre);
	padding-bottom: 4px;
	border-bottom: 1px solid var(--trait);
	transition: border-color var(--transition), gap var(--transition);
	white-space: nowrap;
}

.lpv-lien:hover {
	border-color: var(--accent);
	gap: 0.9em;
}

.lpv-lien::after {
	content: "\2192";
	transition: transform var(--transition);
}

/* -------------------------------------------------------------------------
   6. En-tête et navigation
   ------------------------------------------------------------------------- */
.lpv-header {
	position: fixed;
	inset: 0 0 auto;
	z-index: 100;
	background: var(--fond);
	border-bottom: 1px solid var(--trait);
	transition: background var(--transition), border-color var(--transition),
		transform var(--transition);
}

/* Sur l'accueil, l'en-tête flotte au-dessus de la photo. */
.has-transparent-header .lpv-header:not(.is-scrolled) {
	background: transparent;
	border-bottom-color: transparent;
}

/* Sur photo claire, une ombre douce garde le logo et le menu lisibles. */
.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-header__inner {
	color: var(--sur-sombre);
	text-shadow: 0 1px 12px rgb(var(--voile) / 0.45);
}

.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-logo img {
	filter: brightness(0) invert(1) drop-shadow(0 1px 8px rgb(var(--voile) / 0.5));
}

.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-btn--primaire {
	background: var(--fond);
	color: var(--titre);
}

.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-burger span {
	background: var(--fond);
}

.lpv-header.is-scrolled {
	background: var(--fond-flou);
	backdrop-filter: blur(12px);
	-webkit-backdrop-filter: blur(12px);
}

.lpv-header__inner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 1.5rem;
	min-height: var(--header-h);
	color: var(--titre);
	transition: color var(--transition);
}

.lpv-logo {
	display: flex;
	align-items: center;
	flex-shrink: 0;
}

.lpv-logo img {
	width: auto;
	/* Agrandi a la demande de la cliente : le logo se perdait dans l'en-tete.
	   La hauteur de l'en-tete suit, sinon le dessin deborderait. */
	height: clamp(52px, 6.4vw, 72px);
	transition: filter var(--transition);
}

.lpv-logo__texte {
	font-family: var(--font-display);
	font-size: 1.25rem;
	letter-spacing: -0.01em;
}

.lpv-nav {
	display: flex;
	align-items: center;
	gap: clamp(1.25rem, 2.5vw, 2.5rem);
}

.lpv-nav ul {
	display: flex;
	align-items: center;
	gap: clamp(1.25rem, 2.5vw, 2.25rem);
	list-style: none;
	margin: 0;
	padding: 0;
}

.lpv-nav a {
	position: relative;
	font-size: 0.9375rem;
	font-weight: 400;
	letter-spacing: 0.01em;
	padding-block: 0.35rem;
}

.lpv-nav a::after {
	content: "";
	position: absolute;
	left: 0;
	bottom: 0;
	width: 0;
	height: 1.5px;
	background: var(--accent);
	transition: width var(--transition);
}

.lpv-nav a:hover::after,
.lpv-nav .current-menu-item > a::after,
.lpv-nav .current_page_item > a::after {
	width: 100%;
}

.lpv-header__cta {
	display: none;
}

@media (min-width: 1100px) {
	.lpv-header__cta {
		display: inline-flex;
		padding: 0.75em 1.5em;
		font-size: 0.75rem;
	}
}

/* Bouton hamburger. */
.lpv-burger {
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 5px;
	width: 44px;
	height: 44px;
	padding: 0;
	background: none;
	border: 0;
	margin-right: -10px;
}

.lpv-burger span {
	display: block;
	width: 24px;
	height: 1.5px;
	margin-inline: auto;
	background: var(--surface-sombre);
	transition: transform var(--transition), opacity var(--transition),
		background var(--transition);
}

.lpv-burger[aria-expanded="true"] span:nth-child(1) {
	transform: translateY(6.5px) rotate(45deg);
}

.lpv-burger[aria-expanded="true"] span:nth-child(2) {
	opacity: 0;
}

.lpv-burger[aria-expanded="true"] span:nth-child(3) {
	transform: translateY(-6.5px) rotate(-45deg);
}

@media (min-width: 900px) {
	.lpv-burger {
		display: none;
	}
}

/* Panneau de navigation mobile. */
@media (max-width: 899px) {
	.lpv-nav {
		position: fixed;
		inset: 0;
		flex-direction: column;
		align-items: flex-start;
		justify-content: center;
		gap: 0;
		padding: 6rem var(--gouttiere) 3rem;
		background: var(--fond);
		opacity: 0;
		visibility: hidden;
		transform: translateY(-12px);
		transition: opacity var(--transition), transform var(--transition),
			visibility var(--transition);
	}

	.lpv-nav.is-open {
		opacity: 1;
		visibility: visible;
		transform: none;
	}

	.lpv-nav ul {
		flex-direction: column;
		align-items: flex-start;
		gap: 0;
		width: 100%;
	}

	.lpv-nav li {
		width: 100%;
		border-bottom: 1px solid var(--trait);
	}

	.lpv-nav a {
		display: block;
		padding: 1.15rem 0;
		font-family: var(--font-display);
		font-size: 1.75rem;
		color: var(--titre);
	}

	.lpv-nav a::after {
		display: none;
	}

	/* Le CTA reste un bouton, il ne prend pas l'allure des liens du menu. */
	.lpv-nav .lpv-header__cta {
		display: inline-flex;
		width: auto;
		margin-top: 2.25rem;
		padding: 1em 2em;
		font-family: var(--font-base);
		font-size: 0.8125rem;
		color: var(--sur-sombre);
	}

	/*
	 * Le panneau couvre tout l'écran : le logo et le bouton de fermeture
	 * doivent repasser au-dessus, sinon on ne peut plus refermer le menu.
	 */
	.lpv-logo,
	.lpv-burger {
		position: relative;
		z-index: 2;
	}

	/*
	 * Menu ouvert : le panneau est clair, l'en-tête reprend donc ses couleurs
	 * sombres même sur l'accueil où il est normalement transparent et blanc.
	 */
	body.nav-open .lpv-header__inner,
	body.has-transparent-header.nav-open .lpv-header:not(.is-scrolled) .lpv-header__inner {
		color: var(--titre);
		text-shadow: none;
	}

	body.nav-open .lpv-logo img,
	body.has-transparent-header.nav-open .lpv-header:not(.is-scrolled) .lpv-logo img {
		filter: none;
	}

	body.nav-open .lpv-burger span,
	body.has-transparent-header.nav-open .lpv-header:not(.is-scrolled) .lpv-burger span {
		background: var(--surface-sombre);
	}

	/* Sinon le bouton reste en version « sur photo » : crème sur crème. */
	body.has-transparent-header.nav-open .lpv-header:not(.is-scrolled) .lpv-btn--primaire {
		background: var(--surface-sombre);
		color: var(--sur-sombre);
	}

	body.nav-open {
		overflow: hidden;
	}
}

/* Décalage du contenu sous l'en-tête fixe (sauf pages à bandeau plein écran). */
.lpv-main {
	padding-top: var(--header-h);
}

.has-transparent-header .lpv-main {
	padding-top: 0;
}

/* -------------------------------------------------------------------------
   7. Bandeau d'accueil
   ------------------------------------------------------------------------- */
.lpv-hero {
	position: relative;
	display: flex;
	align-items: flex-end;
	min-height: min(92vh, 900px);
	padding-block: calc(var(--header-h) + 3rem) clamp(3.5rem, 8vw, 7rem);
	background: var(--surface-sombre);
	overflow: hidden;
	isolation: isolate;
}

.lpv-hero__media {
	position: absolute;
	inset: 0;
	z-index: -2;
}

.lpv-hero__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	animation: lpv-zoom 18s ease-out forwards;
}

@keyframes lpv-zoom {
	from {
		transform: scale(1.08);
	}
	to {
		transform: scale(1);
	}
}

/*
 * Deux voiles superposés : l'un horizontal côté texte, l'autre vertical.
 * Le texte reste lisible même sur un feuillage clair, tout en laissant
 * la photo respirer à droite.
 */
.lpv-hero::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		linear-gradient(
			90deg,
			rgb(var(--voile) / 0.8) 0%,
			rgb(var(--voile) / 0.55) 38%,
			rgb(var(--voile) / 0.12) 72%,
			rgb(var(--voile) / 0) 100%
		),
		linear-gradient(
			180deg,
			rgb(var(--voile) / 0.5) 0%,
			rgb(var(--voile) / 0.12) 32%,
			rgb(var(--voile) / 0.62) 100%
		);
}

/*
 * Sous 1000 px, la mise en page éditoriale ne tient plus côte à côte : la
 * photo reprend tout le fond. Plutôt qu'un voile sombre, on garde l'esprit
 * du grand écran — la photo se fond vers le bas dans le crème de la page,
 * et le texte se pose sur ce fond clair. Demande de la cliente.
 */
@media (max-width: 999px) {
	.lpv-hero {
		background: var(--fond);
	}

	.lpv-hero::after {
		background: linear-gradient(
			180deg,
			/* Léger voile en haut : l'en-tête est blanc par-dessus la photo. */
			rgb(var(--voile) / 0.34) 0%,
			rgb(var(--voile) / 0.08) 14%,
			transparent 22%,
			rgb(from var(--fond) r g b / 0.9) 36%,
			var(--fond) 46%
		);
	}
}

.lpv-hero__contenu {
	max-width: 46rem;
	color: var(--sur-sombre);
}

.lpv-hero h1 {
	color: var(--sur-sombre);
	margin-bottom: 0.5em;
}

.lpv-hero .lpv-surtitre {
	color: var(--sur-sombre);
}

.lpv-hero .lpv-lead {
	color: var(--fond-flou);
	margin-bottom: 2.25rem;
	max-width: 52ch;
}

.lpv-hero .lpv-trait {
	background: var(--accent);
}

/* Indicateur de défilement. */
.lpv-hero__scroll {
	position: absolute;
	left: 50%;
	bottom: 1.75rem;
	translate: -50% 0;
	width: 1px;
	height: 48px;
	background: var(--sur-sombre-tenu);
	overflow: hidden;
}

.lpv-hero__scroll::after {
	content: "";
	position: absolute;
	inset: 0;
	background: var(--accent);
	animation: lpv-scroll 2.4s ease-in-out infinite;
}

@keyframes lpv-scroll {
	0% {
		transform: translateY(-100%);
	}
	60%,
	100% {
		transform: translateY(100%);
	}
}

/* Sur mobile, l'indicateur croiserait les boutons du bandeau. */
@media (max-width: 899px) {
	.lpv-hero__scroll {
		display: none;
	}
}

/* Bandeau simple des pages intérieures. */
.lpv-pagehead {
	position: relative;
	padding-block: clamp(3rem, 7vw, 6rem) clamp(2rem, 5vw, 4rem);
	background: var(--fond-alt);
	border-bottom: 1px solid var(--trait);
}

/* Le bandeau de page apporte déjà de l'air : la section qui suit en reprend moins. */
.lpv-pagehead + .lpv-section {
	padding-top: clamp(2.5rem, 5vw, 4rem);
}

.lpv-pagehead h1 {
	margin-bottom: 0.35em;
	max-width: 20ch;
}

.lpv-pagehead .lpv-lead {
	max-width: 58ch;
}

/* Bandeau image des pages intérieures. */
.lpv-pagehead--image {
	display: flex;
	align-items: flex-end;
	min-height: min(70vh, 620px);
	padding-block: calc(var(--header-h) + 4rem) clamp(2.5rem, 6vw, 5rem);
	background: var(--surface-sombre);
	border-bottom: 0;
	overflow: hidden;
	isolation: isolate;
	color: var(--sur-sombre);
}

.lpv-pagehead--image .lpv-hero__media {
	position: absolute;
	inset: 0;
	z-index: -2;
}

.lpv-pagehead--image .lpv-hero__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.lpv-pagehead--image::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		linear-gradient(
			90deg,
			rgb(var(--voile) / 0.72) 0%,
			rgb(var(--voile) / 0.45) 45%,
			rgb(var(--voile) / 0) 100%
		),
		linear-gradient(
			180deg,
			rgb(var(--voile) / 0.5) 0%,
			rgb(var(--voile) / 0.2) 40%,
			rgb(var(--voile) / 0.7) 100%
		);
}

.lpv-pagehead--image h1,
.lpv-pagehead--image .lpv-lead {
	color: var(--sur-sombre);
}

.lpv-pagehead--image .lpv-surtitre {
	color: var(--sur-sombre-doux);
}

/* -------------------------------------------------------------------------
   8. Grilles et cartes « univers »
   ------------------------------------------------------------------------- */
.lpv-grille {
	display: grid;
	gap: clamp(1.5rem, 3vw, 2.5rem);
}

.lpv-grille--3 {
	grid-template-columns: repeat(auto-fit, minmax(min(100%, 280px), 1fr));
}

.lpv-grille--4 {
	grid-template-columns: repeat(auto-fill, minmax(min(100%, 260px), 1fr));
}

/*
 * Grille des univers. Six colonnes servent de trame : chaque carte en occupe
 * deux, soit trois par rangée. Avec cinq univers, les deux dernières passent
 * à trois colonnes pour remplir la rangée du bas sans laisser de case vide.
 */
.lpv-grille--univers {
	grid-template-columns: 1fr;
}

@media (min-width: 620px) {
	.lpv-grille--univers {
		grid-template-columns: repeat(6, 1fr);
	}

	.lpv-grille--univers > * {
		grid-column: span 3;
	}

	/* Deux par rangée : la cinquième carte occupe seule toute la largeur. */
	.lpv-grille--univers > :nth-child(5):nth-last-child(1) {
		grid-column: span 6;
	}

	.lpv-grille--univers > :nth-child(5):nth-last-child(1) .lpv-univers__media {
		aspect-ratio: 16 / 9;
	}
}

@media (min-width: 940px) {
	.lpv-grille--univers > * {
		grid-column: span 2;
	}

	/*
	 * Cas de cinq univers : les deux dernières cartes s'élargissent pour
	 * remplir la rangée du bas. Leur visuel s'élargit d'autant, sinon le
	 * ratio portrait les rendrait bien plus hautes que celles du haut.
	 */
	.lpv-grille--univers > :nth-child(4):nth-last-child(2),
	.lpv-grille--univers > :nth-child(5):nth-last-child(1) {
		grid-column: span 3;
	}

	.lpv-grille--univers > :nth-child(4):nth-last-child(2) .lpv-univers__media,
	.lpv-grille--univers > :nth-child(5):nth-last-child(1) .lpv-univers__media {
		aspect-ratio: 6 / 5;
	}
}

.lpv-univers {
	position: relative;
	display: block;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-sombre);
	isolation: isolate;
}

.lpv-univers__media {
	position: relative;
	aspect-ratio: 4 / 5;
	overflow: hidden;
}

.lpv-univers__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform var(--transition-lente);
}

.lpv-univers:hover .lpv-univers__media img {
	transform: scale(1.06);
}

.lpv-univers__media::after {
	content: "";
	position: absolute;
	inset: 0;
	background: linear-gradient(
		180deg,
		rgb(var(--voile) / 0) 28%,
		rgb(var(--voile) / 0.38) 55%,
		rgb(var(--voile) / 0.9) 100%
	);
}

.lpv-univers__texte {
	position: absolute;
	inset: auto 0 0;
	z-index: 1;
	padding: clamp(1.5rem, 3vw, 2rem);
	color: var(--sur-sombre);
}

.lpv-univers__texte h3 {
	color: var(--sur-sombre);
	margin-bottom: 0.35em;
}

.lpv-univers__texte p {
	color: var(--fond-flou);
	font-size: 0.9375rem;
	line-height: 1.55;
	margin: 0;
}

.lpv-univers__fleche {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	margin-top: 1rem;
	font-size: 0.75rem;
	font-weight: 500;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--accent);
	opacity: 0;
	transform: translateY(6px);
	transition: opacity var(--transition), transform var(--transition);
}

.lpv-univers:hover .lpv-univers__fleche,
.lpv-univers:focus-visible .lpv-univers__fleche {
	opacity: 1;
	transform: none;
}

@media (hover: none) {
	.lpv-univers__fleche {
		opacity: 1;
		transform: none;
	}
}

/* Version « bandes » alternées de la page Collections. */
.lpv-bande {
	display: grid;
	gap: clamp(2rem, 5vw, 4.5rem);
	align-items: center;
	padding-block: clamp(3rem, 6vw, 5.5rem);
	border-bottom: 1px solid var(--trait);
}

.lpv-bande:last-child {
	border-bottom: 0;
}

@media (min-width: 860px) {
	.lpv-bande {
		grid-template-columns: 1fr 1fr;
	}

	.lpv-bande:nth-child(even) .lpv-bande__media {
		order: 2;
	}
}

.lpv-bande__media {
	position: relative;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
}

.lpv-bande__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform var(--transition-lente);
}

.lpv-bande:hover .lpv-bande__media img {
	transform: scale(1.04);
}

.lpv-bande__contenu h2 {
	margin-bottom: 0.4em;
}

.lpv-bande__liste {
	list-style: none;
	margin: 1.75rem 0;
	padding: 0;
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
}

.lpv-bande__liste li {
	padding: 0.4em 1em;
	border: 1px solid var(--trait);
	border-radius: 999px;
	font-size: 0.8125rem;
	color: var(--texte-doux);
	background: var(--surface);
}

/* -------------------------------------------------------------------------
   9. Cartes « pépite »
   ------------------------------------------------------------------------- */
.lpv-pepite {
	display: flex;
	flex-direction: column;
	height: 100%;
}

.lpv-pepite__media {
	position: relative;
	aspect-ratio: 4 / 5;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
	margin-bottom: 1.125rem;
}

.lpv-pepite__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	transition: transform var(--transition-lente);
}

.lpv-pepite:hover .lpv-pepite__media img {
	transform: scale(1.05);
}

.lpv-pepite__titre {
	font-size: clamp(1.125rem, 1.05rem + 0.35vw, 1.375rem);
	margin-bottom: 0.3em;
}

.lpv-pepite a:hover .lpv-pepite__titre,
.lpv-pepite__lien:hover .lpv-pepite__titre {
	color: var(--texte-doux);
}

.lpv-pepite__desc {
	font-size: 0.9375rem;
	line-height: 1.55;
	margin-bottom: 0.75rem;
}

.lpv-pepite__meta {
	margin-top: auto;
	padding-top: 0.75rem;
	font-size: 0.8125rem;
	letter-spacing: 0.04em;
	color: var(--texte-tenu);
	border-top: 1px solid var(--trait);
}

/* Pastilles de statut. */
.lpv-badge {
	position: absolute;
	top: 0.875rem;
	left: 0.875rem;
	z-index: 2;
	display: inline-block;
	padding: 0.45em 0.9em;
	border-radius: 999px;
	font-family: var(--font-base);
	font-size: 0.6875rem;
	font-weight: 500;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	line-height: 1;
	background: var(--fond);
	color: var(--titre);
	box-shadow: 0 2px 12px rgb(var(--voile) / 0.14);
}

.lpv-badge.is-nouveau {
	background: var(--accent);
	color: var(--accent-texte);
}

.lpv-badge.is-unique {
	background: var(--surface-sombre);
	color: var(--sur-sombre);
}

.lpv-badge.is-demande {
	background: var(--surface-douce);
	color: var(--titre);
}

.lpv-badge.is-reserve {
	background: rgb(var(--voile) / 0.78);
	color: var(--sur-sombre);
}

.lpv-badge.is-disponible {
	background: var(--succes-fond);
	color: var(--titre);
}

/* Pastille en ligne (fiche pépite). */
.lpv-badge--statique {
	position: static;
	box-shadow: none;
}

/* Bloc recherche + filtres du catalogue. */
.lpv-filtrage {
	margin-bottom: clamp(2rem, 4vw, 3rem);
	padding-bottom: 1.5rem;
	border-bottom: 1px solid var(--trait);
}

.lpv-recherche {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	margin-bottom: 1.25rem;
}

/* L'icône est positionnée sur le champ, pas sur le formulaire : sinon elle
   se décale quand le bouton passe à la ligne sur les petits écrans. */
.lpv-recherche__champ {
	position: relative;
	display: flex;
	flex: 1 1 auto;
	min-width: 0;
}

.lpv-recherche__icone {
	position: absolute;
	left: 1.1rem;
	top: 50%;
	translate: 0 -50%;
	width: 18px;
	height: 18px;
	fill: var(--texte-tenu);
	pointer-events: none;
}

.lpv-recherche input[type="search"] {
	width: 100%;
	min-width: 0;
	padding: 0.95rem 1rem 0.95rem 3rem;
	border: 1px solid var(--trait);
	border-radius: 999px;
	background: var(--surface);
	color: var(--texte);
	font-family: inherit;
	font-size: 1rem;
	font-weight: 400;
	transition: border-color var(--transition);
	-webkit-appearance: none;
	appearance: none;
}

.lpv-recherche input[type="search"]::placeholder {
	color: var(--texte-tenu);
}

.lpv-recherche input[type="search"]:focus {
	outline: none;
	border-color: var(--titre);
}

.lpv-recherche__envoi {
	flex: 0 0 auto;
	padding: 0.95em 1.75em;
	border: 0;
	border-radius: 999px;
	background: var(--surface-sombre);
	color: var(--sur-sombre);
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1;
	transition: background var(--transition);
}

.lpv-recherche__envoi:hover {
	background: var(--surface-sombre-2);
}

/* Rappel des filtres actifs et nombre de résultats. */
.lpv-resultats {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	justify-content: space-between;
	gap: 0.75rem 1.5rem;
	margin: 1.25rem 0 0;
	font-size: 0.9375rem;
	color: var(--texte-doux);
}

.lpv-resultats strong {
	font-weight: 500;
}

.lpv-resultats__effacer {
	font-size: 0.8125rem;
	letter-spacing: 0.04em;
	color: var(--texte-tenu);
	border-bottom: 1px solid var(--trait);
	padding-bottom: 2px;
	transition: color var(--transition), border-color var(--transition);
	white-space: nowrap;
}

.lpv-resultats__effacer:hover {
	color: var(--titre);
	border-color: var(--accent);
}

@media (max-width: 560px) {
	.lpv-recherche {
		flex-wrap: wrap;
	}

	.lpv-recherche__champ,
	.lpv-recherche__envoi {
		flex: 1 1 100%;
	}

	/* Pastilles plus compactes : deux tiennent par ligne. */
	.lpv-filtre {
		padding: 0.5em 1em;
		font-size: 0.75rem;
	}
}

/* Filtres du catalogue. */
.lpv-filtres {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
}

.lpv-filtre {
	padding: 0.6em 1.35em;
	border: 1px solid var(--trait);
	border-radius: 999px;
	font-size: 0.8125rem;
	font-weight: 400;
	letter-spacing: 0.03em;
	color: var(--texte-doux);
	background: transparent;
	transition: background var(--transition), color var(--transition),
		border-color var(--transition);
}

.lpv-filtre:hover {
	border-color: var(--titre);
	color: var(--titre);
}

.lpv-filtre.is-actif {
	background: var(--surface-sombre);
	border-color: var(--titre);
	color: var(--sur-sombre);
}

/*
 * Le filtre par statut est un <select> déguisé en pastille. Il suit les
 * pastilles d'univers dans le même flux. Pas de séparateur : avec cinq
 * univers, le groupe passe à la ligne et un filet se retrouverait orphelin
 * en début de rangée.
 */
.lpv-filtres__statut {
	display: flex;
	gap: 0.5rem;
}

select.lpv-filtre {
	appearance: none;
	background-color: transparent;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%235b6157' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 1rem center;
	background-size: 10px;
	padding-right: 2.4rem;
	font-family: inherit;
	cursor: pointer;
}

@media (max-width: 640px) {
	.lpv-filtres__statut {
		width: 100%;
	}

	select.lpv-filtre {
		width: 100%;
	}
}

/* Image de repli quand aucune photo n'est chargée. */
.lpv-placeholder {
	display: grid;
	place-items: center;
	width: 100%;
	height: 100%;
	min-height: 200px;
	background: var(--surface-douce);
}

.lpv-placeholder img {
	width: 45%;
	max-width: 180px;
	opacity: 0.22;
}

/*
 * Dans une carte « univers », le titre est en blanc par-dessus l'image.
 * Sans photo, le repli doit donc rester sombre pour que le texte se lise.
 */
.lpv-univers__media .lpv-placeholder {
	background: var(--surface-sombre);
}

.lpv-univers__media .lpv-placeholder img {
	filter: brightness(0) invert(1);
	opacity: 0.3;
}

/* -------------------------------------------------------------------------
   10. Philosophie (texte + image)
   ------------------------------------------------------------------------- */
.lpv-philo {
	display: grid;
	gap: clamp(2.5rem, 5vw, 5rem);
	align-items: center;
}

@media (min-width: 900px) {
	.lpv-philo {
		grid-template-columns: 1fr 0.85fr;
	}
}

.lpv-philo__intro {
	font-family: var(--font-display);
	font-size: clamp(1.375rem, 1.1rem + 1.3vw, 2rem);
	line-height: 1.35;
	color: var(--titre);
	margin-bottom: 1.5rem;
	text-wrap: balance;
}

.lpv-philo__signature {
	margin-top: 2rem;
	padding-top: 1.75rem;
	border-top: 1px solid var(--trait);
	font-family: var(--font-display);
	font-size: 1.125rem;
	font-style: italic;
	color: var(--titre);
}

.lpv-philo__media {
	position: relative;
	aspect-ratio: 3 / 4;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
}

.lpv-philo__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Petit signe végétal en filigrane. */
.lpv-philo__marque {
	position: absolute;
	right: -12px;
	bottom: -18px;
	width: 140px;
	opacity: 0.08;
	pointer-events: none;
}

/* -------------------------------------------------------------------------
   10 bis. Blocs éditoriaux (philosophie, savoir-faire, sur-mesure)
   ------------------------------------------------------------------------- */

/* Deux colonnes : l'accroche à gauche, le développement à droite. */
.lpv-manifeste {
	display: grid;
	gap: clamp(2rem, 5vw, 4.5rem);
	align-items: start;
}

@media (min-width: 900px) {
	.lpv-manifeste {
		grid-template-columns: 0.95fr 1.05fr;
	}
}

.lpv-manifeste__intro h2 {
	margin-bottom: 0.5em;
}

.lpv-manifeste__intro .lpv-lead {
	max-width: 34ch;
}

/* Listes éditoriales ---------------------------------------------------- */
.lpv-liste {
	list-style: none;
	margin: 0 0 1.75rem;
	padding: 0;
}

.lpv-liste__intro {
	margin-bottom: 0.75rem;
}

/* Liste « manifeste » : une ligne par idée, séparée d'un filet. */
.lpv-liste--marquee li {
	position: relative;
	padding: 0.85rem 0 0.85rem 1.75rem;
	border-bottom: 1px solid var(--trait);
	font-family: var(--font-display);
	font-size: clamp(1.0625rem, 1rem + 0.35vw, 1.25rem);
	line-height: 1.4;
}

.lpv-liste--marquee li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 1.45em;
	width: 12px;
	height: 1.5px;
	background: var(--accent);
}

.lpv-liste--marquee li:first-child {
	padding-top: 0;
}

.lpv-liste--marquee li:first-child::before {
	top: 0.6em;
}

.lpv-liste--marquee li:last-child {
	border-bottom: 0;
}

/* Sur fond vert, les filets doivent s'éclaircir. */
.lpv-section--vert .lpv-liste--marquee li {
	border-bottom-color: var(--trait-sombre);
	color: var(--sur-sombre);
}

/* Liste à puces discrète. */
.lpv-liste--puces li {
	position: relative;
	padding-left: 1.4rem;
	margin-bottom: 0.6rem;
	color: var(--texte-doux);
	font-size: 0.9375rem;
	line-height: 1.55;
}

.lpv-liste--puces li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.65em;
	width: 6px;
	height: 6px;
	border-radius: 50%;
	background: var(--accent);
}

.lpv-section--vert .lpv-liste--puces li {
	color: var(--sur-sombre-doux);
}

/* Liste en jetons, pour des critères courts. */
.lpv-liste--jetons {
	display: flex;
	flex-wrap: wrap;
	gap: 0.5rem;
}

.lpv-liste--jetons li {
	padding: 0.4em 1em;
	border: 1px solid var(--trait);
	border-radius: 999px;
	background: var(--surface);
	font-size: 0.8125rem;
	color: var(--texte-doux);
}

/* Phrase de chute d'une section. */
.lpv-chute {
	margin: 1.75rem 0 2rem;
	padding-left: 1.25rem;
	border-left: 2px solid var(--accent);
	font-family: var(--font-display);
	font-size: clamp(1.0625rem, 1rem + 0.35vw, 1.25rem);
	font-style: italic;
	line-height: 1.45;
	color: var(--titre);
}

.lpv-section--vert .lpv-chute {
	color: var(--sur-sombre);
}

/* Bloc « recherche sur mesure » : texte + visuel. */
.lpv-surmesure {
	display: grid;
	gap: clamp(2rem, 5vw, 4rem);
	align-items: center;
}

@media (min-width: 900px) {
	.lpv-surmesure {
		grid-template-columns: 1.05fr 0.95fr;
	}
}

.lpv-surmesure__media {
	aspect-ratio: 4 / 5;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
}

.lpv-surmesure__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* Bloc de mise en avant sur fond sombre : visuel + texte. */
.lpv-focus {
	display: grid;
	gap: clamp(2rem, 5vw, 4rem);
	align-items: center;
}

@media (min-width: 900px) {
	.lpv-focus {
		grid-template-columns: 1fr 1fr;
	}
}

.lpv-focus__media {
	aspect-ratio: 4 / 3;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-sombre-2);
}

.lpv-focus__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* -------------------------------------------------------------------------
   11. Bloc événement
   ------------------------------------------------------------------------- */
.lpv-event {
	position: relative;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-sombre);
	color: var(--sur-sombre);
	isolation: isolate;
}

.lpv-event__grille {
	display: grid;
	gap: 0;
	align-items: stretch;
}

@media (min-width: 820px) {
	.lpv-event__grille {
		grid-template-columns: 1.05fr 1fr;
	}
}

.lpv-event__contenu {
	padding: clamp(2rem, 5vw, 4rem);
}

.lpv-event__dates {
	display: inline-block;
	margin-bottom: 1.5rem;
	padding: 0.5em 1.1em;
	border-radius: 999px;
	background: var(--accent);
	color: var(--accent-texte);
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.06em;
}

.lpv-event h2 {
	color: var(--sur-sombre);
	margin-bottom: 0.5em;
}

.lpv-event p {
	color: var(--sur-sombre-doux);
	margin-bottom: 2rem;
	max-width: 46ch;
}

.lpv-event__media {
	position: relative;
	min-height: 260px;
	background: var(--surface-sombre-2);
}

.lpv-event__media img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* -------------------------------------------------------------------------
   12. Bandeau d'appel à l'action
   ------------------------------------------------------------------------- */
.lpv-cta {
	text-align: center;
}

.lpv-cta h2 {
	max-width: 20ch;
	margin-inline: auto;
}

.lpv-cta .lpv-lead {
	margin-inline: auto;
	margin-bottom: 2.5rem;
}

.lpv-cta .lpv-btns {
	justify-content: center;
}

/* -------------------------------------------------------------------------
   13. Fiche d'une pépite
   ------------------------------------------------------------------------- */
.lpv-fiche {
	display: grid;
	gap: clamp(2rem, 5vw, 4rem);
	align-items: start;
}

@media (min-width: 900px) {
	.lpv-fiche {
		grid-template-columns: 1.15fr 1fr;
	}

	.lpv-fiche__infos {
		position: sticky;
		top: calc(var(--header-h) + 2rem);
	}
}

.lpv-galerie {
	display: grid;
	gap: 0.875rem;
}

.lpv-galerie__principale {
	aspect-ratio: 4 / 5;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
}

.lpv-galerie__principale img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.lpv-galerie__vignettes {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(90px, 1fr));
	gap: 0.75rem;
}

.lpv-galerie__vignettes button {
	aspect-ratio: 1;
	overflow: hidden;
	border: 1px solid transparent;
	border-radius: var(--radius);
	padding: 0;
	background: var(--surface-douce);
	transition: border-color var(--transition), opacity var(--transition);
	opacity: 0.75;
}

.lpv-galerie__vignettes button:hover,
.lpv-galerie__vignettes button.is-actif {
	opacity: 1;
	border-color: var(--titre);
}

.lpv-galerie__vignettes img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.lpv-fiche__meta {
	list-style: none;
	margin: 2rem 0;
	padding: 0;
	border-top: 1px solid var(--trait);
}

.lpv-fiche__meta li {
	display: flex;
	flex-wrap: wrap;
	justify-content: space-between;
	gap: 1rem;
	padding: 0.9rem 0;
	border-bottom: 1px solid var(--trait);
	font-size: 0.9375rem;
}

.lpv-fiche__meta dt,
.lpv-fiche__meta .lpv-cle {
	color: var(--texte-tenu);
	letter-spacing: 0.04em;
}

.lpv-fiche__meta .lpv-valeur {
	color: var(--texte);
	font-weight: 400;
	text-align: right;
}

.lpv-fiche__retour {
	display: inline-flex;
	align-items: center;
	gap: 0.5em;
	margin-bottom: 1.5rem;
	font-size: 0.8125rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--texte-tenu);
	transition: color var(--transition);
}

.lpv-fiche__retour:hover {
	color: var(--titre);
}

.lpv-fiche__retour::before {
	content: "\2190";
}

/* Visionneuse plein écran. */
.lpv-lightbox {
	position: fixed;
	inset: 0;
	z-index: 200;
	display: grid;
	place-items: center;
	padding: clamp(1rem, 4vw, 3rem);
	background: rgb(var(--voile) / 0.94);
	opacity: 0;
	visibility: hidden;
	transition: opacity var(--transition), visibility var(--transition);
}

.lpv-lightbox.is-open {
	opacity: 1;
	visibility: visible;
}

.lpv-lightbox img {
	max-width: 100%;
	max-height: 88vh;
	object-fit: contain;
	border-radius: var(--radius);
}

.lpv-lightbox__fermer {
	position: absolute;
	top: clamp(1rem, 3vw, 2rem);
	right: clamp(1rem, 3vw, 2rem);
	width: 48px;
	height: 48px;
	border: 1px solid var(--sur-sombre-tenu);
	border-radius: 50%;
	background: transparent;
	color: var(--sur-sombre);
	font-size: 1.5rem;
	line-height: 1;
	transition: background var(--transition);
}

.lpv-lightbox__fermer:hover {
	background: var(--trait-sombre);
}

/* -------------------------------------------------------------------------
   14. Page Contact
   ------------------------------------------------------------------------- */
.lpv-contact {
	display: grid;
	gap: clamp(2.5rem, 5vw, 4.5rem);
	align-items: start;
}

@media (min-width: 980px) {
	.lpv-contact {
		grid-template-columns: 0.8fr 1.2fr;
	}
}

.lpv-coords {
	padding: clamp(1.75rem, 3vw, 2.5rem);
	background: var(--fond-alt);
	border-radius: var(--radius-l);
}

.lpv-coords__bloc {
	padding-block: 1.25rem;
	border-bottom: 1px solid var(--trait);
}

.lpv-coords__bloc:first-of-type {
	padding-top: 0;
}

.lpv-coords__bloc:last-of-type {
	border-bottom: 0;
	padding-bottom: 0;
}

.lpv-coords__label {
	display: block;
	font-size: 0.6875rem;
	font-weight: 500;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--texte-tenu);
	margin-bottom: 0.5rem;
}

.lpv-coords__valeur {
	font-size: 1.0625rem;
	color: var(--texte);
	line-height: 1.5;
}

.lpv-coords__valeur a:hover {
	color: var(--titre);
	text-decoration: underline;
	text-underline-offset: 4px;
	text-decoration-color: var(--accent);
	text-decoration-thickness: 2px;
}

/* Boutons de contact direct. */
.lpv-contact-direct {
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem;
	margin-top: 1.75rem;
}

.lpv-contact-direct .lpv-btn {
	flex: 1 1 auto;
	padding-inline: 1.25em;
}

/* Réseaux sociaux. */
.lpv-social {
	display: flex;
	gap: 0.625rem;
	margin-top: 1.75rem;
	list-style: none;
	padding: 0;
}

.lpv-social a {
	display: grid;
	place-items: center;
	width: 44px;
	height: 44px;
	border: 1px solid var(--trait);
	border-radius: 50%;
	transition: background var(--transition), border-color var(--transition),
		color var(--transition);
}

.lpv-social a:hover {
	background: var(--surface-sombre);
	border-color: var(--titre);
	color: var(--sur-sombre);
}

.lpv-social svg {
	width: 18px;
	height: 18px;
	fill: currentColor;
}

/* Carte. */
/*
 * Pas de min-height ici : combiné à aspect-ratio, il rend la hauteur définie
 * et la largeur se recalcule à partir du ratio — la carte déborde alors
 * de l'écran sur mobile. On change le ratio à la place.
 */
.lpv-carte {
	margin-top: clamp(3rem, 6vw, 5rem);
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
	aspect-ratio: 21 / 9;
}

@media (max-width: 760px) {
	.lpv-carte {
		aspect-ratio: 4 / 3;
	}
}

.lpv-carte iframe {
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
	filter: grayscale(0.25) contrast(1.05);
}

.lpv-carte__vide {
	display: grid;
	place-items: center;
	height: 100%;
	padding: 2rem;
	text-align: center;
	color: var(--texte-tenu);
}

/* -------------------------------------------------------------------------
   15. Formulaire
   ------------------------------------------------------------------------- */
.lpv-form {
	padding: clamp(1.75rem, 3.5vw, 3rem);
	background: var(--surface);
	border: 1px solid var(--trait);
	border-radius: var(--radius-l);
}

.lpv-form__grille {
	display: grid;
	gap: 1.25rem;
}

@media (min-width: 620px) {
	.lpv-form__grille--2 {
		grid-template-columns: 1fr 1fr;
	}
}

.lpv-champ {
	display: flex;
	flex-direction: column;
	gap: 0.5rem;
	margin-bottom: 1.25rem;
}

.lpv-champ label,
.lpv-legende {
	font-size: 0.8125rem;
	font-weight: 500;
	letter-spacing: 0.04em;
	color: var(--texte);
}

.lpv-champ label .lpv-requis {
	color: var(--texte-tenu);
	font-weight: 300;
}

.lpv-champ input[type="text"],
.lpv-champ input[type="email"],
.lpv-champ input[type="tel"],
.lpv-champ select,
.lpv-champ textarea {
	width: 100%;
	padding: 0.9rem 1rem;
	border: 1px solid var(--trait);
	border-radius: var(--radius);
	background: var(--fond);
	color: var(--texte);
	font-family: inherit;
	font-size: 1rem;
	font-weight: 400;
	transition: border-color var(--transition), background var(--transition);
}

.lpv-champ textarea {
	min-height: 160px;
	resize: vertical;
	line-height: 1.6;
}

.lpv-champ input:focus,
.lpv-champ select:focus,
.lpv-champ textarea:focus {
	outline: none;
	border-color: var(--titre);
	background: var(--surface);
}

.lpv-champ input::placeholder,
.lpv-champ textarea::placeholder {
	color: var(--texte-tenu);
	opacity: 0.8;
}

.lpv-champ select {
	appearance: none;
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 8'%3E%3Cpath fill='%235b6157' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 1rem center;
	background-size: 12px;
	padding-right: 2.5rem;
}

.lpv-champ.has-error input,
.lpv-champ.has-error select,
.lpv-champ.has-error textarea {
	border-color: var(--erreur);
}

.lpv-field-error {
	font-size: 0.8125rem;
	color: var(--erreur);
}

/* Choix particulier / professionnel. */
.lpv-radios {
	display: flex;
	flex-wrap: wrap;
	gap: 0.75rem;
	border: 0;
	margin: 0 0 1.25rem;
	padding: 0;
}

.lpv-radios legend {
	padding: 0;
	margin-bottom: 0.75rem;
}

.lpv-radio {
	position: relative;
	flex: 1 1 160px;
}

.lpv-radio input {
	position: absolute;
	opacity: 0;
	width: 0;
	height: 0;
}

.lpv-radio span {
	display: block;
	padding: 0.85rem 1.25rem;
	border: 1px solid var(--trait);
	border-radius: var(--radius);
	text-align: center;
	font-size: 0.9375rem;
	color: var(--texte-doux);
	cursor: pointer;
	transition: border-color var(--transition), background var(--transition),
		color var(--transition);
}

.lpv-radio input:checked + span {
	border-color: var(--titre);
	background: var(--surface-sombre);
	color: var(--sur-sombre);
}

.lpv-radio input:focus-visible + span {
	outline: 2px solid var(--titre);
	outline-offset: 3px;
}

/* Champ conditionnel. */
.lpv-conditionnel {
	display: none;
}

.lpv-conditionnel.is-visible {
	display: flex;
}

/* Zone de dépôt de fichiers. */
.lpv-upload {
	position: relative;
	display: grid;
	place-items: center;
	gap: 0.5rem;
	padding: 2rem 1.25rem;
	border: 1.5px dashed var(--trait);
	border-radius: var(--radius);
	background: var(--fond);
	text-align: center;
	transition: border-color var(--transition), background var(--transition);
	cursor: pointer;
}

.lpv-upload:hover,
.lpv-upload.is-hover {
	border-color: var(--titre);
	background: var(--succes-fond);
}

.lpv-upload input[type="file"] {
	position: absolute;
	inset: 0;
	opacity: 0;
	cursor: pointer;
}

.lpv-upload__titre {
	font-size: 0.9375rem;
	color: var(--texte);
}

.lpv-upload__aide {
	font-size: 0.8125rem;
	color: var(--texte-tenu);
}

.lpv-upload__liste {
	list-style: none;
	margin: 0.75rem 0 0;
	padding: 0;
	font-size: 0.8125rem;
	color: var(--texte-doux);
}

/* Consentement. */
.lpv-consent {
	display: flex;
	align-items: flex-start;
	gap: 0.75rem;
	margin-bottom: 1.75rem;
	font-size: 0.875rem;
	line-height: 1.55;
	color: var(--texte-doux);
}

.lpv-consent input {
	margin-top: 0.25rem;
	width: 18px;
	height: 18px;
	accent-color: var(--titre);
	flex-shrink: 0;
}

/* Champ piège anti-spam : invisible pour les humains. */
.lpv-piege {
	position: absolute !important;
	left: -9999px !important;
	width: 1px;
	height: 1px;
	overflow: hidden;
}

/* Messages de retour. */
.lpv-message {
	display: flex;
	gap: 0.875rem;
	padding: 1.15rem 1.35rem;
	border-radius: var(--radius);
	margin-bottom: 2rem;
	font-size: 0.9375rem;
	line-height: 1.55;
}

.lpv-message--ok {
	background: var(--succes-fond);
	color: var(--titre);
	border-left: 3px solid var(--titre);
}

.lpv-message--erreur {
	background: var(--erreur-fond);
	color: var(--erreur);
	border-left: 3px solid var(--erreur);
}

/* -------------------------------------------------------------------------
   16. Pied de page
   ------------------------------------------------------------------------- */
.lpv-footer {
	background: var(--surface-sombre);
	color: var(--sur-sombre-doux);
	padding-block: clamp(3rem, 6vw, 5rem) 2rem;
}

.lpv-footer a {
	transition: color var(--transition);
}

.lpv-footer a:hover {
	color: var(--accent);
}

.lpv-footer__grille {
	display: grid;
	gap: clamp(2rem, 4vw, 3.5rem);
	padding-bottom: clamp(2.5rem, 5vw, 4rem);
}

@media (min-width: 760px) {
	.lpv-footer__grille {
		grid-template-columns: 1.4fr 1fr 1fr;
	}
}

.lpv-footer__logo img {
	width: auto;
	height: 64px;
	margin-bottom: 1.5rem;
}

.lpv-footer__texte {
	color: var(--sur-sombre-doux);
	font-size: 0.9375rem;
	max-width: 34ch;
}

.lpv-footer h4 {
	color: var(--sur-sombre);
	font-family: var(--font-base);
	font-size: 0.6875rem;
	font-weight: 500;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	margin-bottom: 1.25rem;
}

.lpv-footer ul {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: 0.7rem;
	font-size: 0.9375rem;
}

/* Les icônes restent en ligne malgré la grille des listes du pied de page. */
.lpv-footer .lpv-social {
	display: flex;
	gap: 0.625rem;
}

.lpv-footer .lpv-social a {
	border-color: var(--trait-sombre);
	color: var(--sur-sombre);
}

.lpv-footer .lpv-social a:hover {
	background: var(--fond);
	border-color: var(--sur-sombre);
	color: var(--titre);
}

/*
 * Une regle qui vise directement l'element l'emporte sur une couleur heritee :
 * sans ceci, la regle globale p{} repeint le texte du pied de page en sombre
 * sur fond vert.
 */
.lpv-footer p,
.lpv-footer li,
.lpv-footer__bas p {
	color: inherit;
}

.lpv-footer__bas {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: 1rem;
	padding-top: 2rem;
	border-top: 1px solid var(--trait-sombre);
	font-size: 0.8125rem;
	color: var(--sur-sombre-tenu);
}

.lpv-footer__bas ul {
	display: flex;
	flex-wrap: wrap;
	gap: 1.5rem;
	font-size: 0.8125rem;
}

/* -------------------------------------------------------------------------
   17. Pagination, page simple, 404
   ------------------------------------------------------------------------- */
.lpv-pagination {
	display: flex;
	justify-content: center;
	gap: 0.5rem;
	margin-top: clamp(3rem, 5vw, 4rem);
}

.lpv-pagination .page-numbers {
	display: grid;
	place-items: center;
	min-width: 44px;
	height: 44px;
	padding-inline: 0.75rem;
	border: 1px solid var(--trait);
	border-radius: 999px;
	font-size: 0.875rem;
	transition: background var(--transition), color var(--transition),
		border-color var(--transition);
}

.lpv-pagination .page-numbers:hover,
.lpv-pagination .page-numbers.current {
	background: var(--surface-sombre);
	border-color: var(--titre);
	color: var(--sur-sombre);
}

.lpv-contenu > * + * {
	margin-top: 1.25em;
}

.lpv-contenu h2,
.lpv-contenu h3 {
	margin-top: 2em;
}

.lpv-contenu ul,
.lpv-contenu ol {
	padding-left: 1.35em;
	color: var(--texte-doux);
}

.lpv-contenu li + li {
	margin-top: 0.5em;
}

.lpv-contenu a {
	text-decoration: underline;
	text-underline-offset: 3px;
	text-decoration-color: var(--accent);
	text-decoration-thickness: 2px;
}

.lpv-contenu blockquote {
	margin: 2em 0;
	padding-left: 1.5em;
	border-left: 2px solid var(--accent);
	font-family: var(--font-display);
	font-size: 1.25rem;
	font-style: italic;
	color: var(--titre);
}

.lpv-contenu img {
	border-radius: var(--radius-l);
}

.lpv-vide {
	padding: clamp(3rem, 6vw, 5rem) 2rem;
	text-align: center;
	border: 1px dashed var(--trait);
	border-radius: var(--radius-l);
	color: var(--texte-doux);
}

/* -------------------------------------------------------------------------
   18. Apparition au défilement
   ------------------------------------------------------------------------- */
.lpv-reveal {
	opacity: 0;
	transform: translateY(24px);
	transition: opacity 0.8s cubic-bezier(0.22, 1, 0.36, 1),
		transform 0.8s cubic-bezier(0.22, 1, 0.36, 1);
}

.lpv-reveal.is-visible {
	opacity: 1;
	transform: none;
}

/* -------------------------------------------------------------------------
   19. Accessibilité et divers
   ------------------------------------------------------------------------- */
.screen-reader-text,
.lpv-sr {
	position: absolute !important;
	width: 1px;
	height: 1px;
	padding: 0;
	margin: -1px;
	overflow: hidden;
	clip: rect(0, 0, 0, 0);
	white-space: nowrap;
	border: 0;
}

.lpv-skip {
	position: absolute;
	top: -100px;
	left: 1rem;
	z-index: 300;
	padding: 0.85rem 1.5rem;
	background: var(--surface-sombre);
	color: var(--sur-sombre);
	border-radius: 0 0 var(--radius) var(--radius);
	font-size: 0.875rem;
	transition: top var(--transition);
}

.lpv-skip:focus {
	top: 0;
}

@media (prefers-reduced-motion: reduce) {
	html {
		scroll-behavior: auto;
	}

	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
	}

	.lpv-reveal {
		opacity: 1;
		transform: none;
	}
}

@media print {
	.lpv-header,
	.lpv-footer,
	.lpv-hero__scroll,
	.lpv-form,
	.lpv-progression,
	.lpv-curseur,
	.lpv-apercu,
	.lpv-defile,
	.lpv-filtrage {
		display: none;
	}

	body {
		background: #fff;
		color: #000;
	}

	/*
	 * Les blocs révélés au défilement et les titres découpés en lignes
	 * restent à leur position de départ quand la page est imprimée : il n'y a
	 * pas de défilement pour déclencher l'animation. Sans ce bloc, une fiche
	 * imprimée sort presque vide.
	 */
	.lpv-reveal,
	.lpv-ligne__interieur {
		opacity: 1 !important;
		transform: none !important;
		translate: none !important;
		animation: none !important;
		clip-path: none !important;
	}

	/* Les cartes empilées se déroulent les unes sous les autres. */
	.lpv-pile__carte {
		position: static !important;
		break-inside: avoid;
	}

	/* Ne pas couper une fiche en deux entre deux pages. */
	.lpv-pepite,
	.lpv-fiche__infos {
		break-inside: avoid;
	}
}

/* -------------------------------------------------------------------------
   20. Grain papier
   Un bruit fractal très léger posé sur toute la page. Presque invisible,
   mais il enlève l'aspect « aplat numérique » des grands fonds crème.
   ------------------------------------------------------------------------- */
body::after {
	content: "";
	position: fixed;
	inset: 0;
	z-index: 9999;
	pointer-events: none;
	opacity: var(--grain-opacite);
	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
	background-size: 160px 160px;
}

@media print {
	body::after {
		display: none;
	}
}

/* -------------------------------------------------------------------------
   21. Mouvement piloté par le défilement
   Tout est en CSS natif : l'animation suit la position de la molette, sans
   JavaScript ni écouteur d'événement. Le JavaScript ne sert plus que de
   repli pour les navigateurs qui ne connaissent pas animation-timeline.
   ------------------------------------------------------------------------- */

/* Barre de progression de lecture. */
.lpv-progression {
	position: fixed;
	inset: 0 0 auto;
	height: 2px;
	z-index: 101;
	background: var(--accent);
	transform: scaleX(0);
	transform-origin: 0 50%;
	pointer-events: none;
}

@keyframes lpv-progression {
	from {
		transform: scaleX(0);
	}
	to {
		transform: scaleX(1);
	}
}

@keyframes lpv-apparition {
	from {
		opacity: 0;
		transform: translateY(28px);
	}
	to {
		opacity: 1;
		transform: none;
	}
}

@keyframes lpv-parallaxe {
	from {
		transform: scale(1.12) translateY(-2.5%);
	}
	to {
		transform: scale(1.12) translateY(2.5%);
	}
}

@keyframes lpv-devoile {
	from {
		clip-path: inset(0 0 100% 0);
	}
	to {
		clip-path: inset(0 0 0 0);
	}
}

@supports (animation-timeline: view()) {
	@media (prefers-reduced-motion: no-preference) {
		.lpv-progression {
			animation: lpv-progression linear;
			animation-timeline: scroll(root block);
		}

		/*
		 * Les blocs se révèlent au fil du défilement. Le JavaScript ne pose
		 * plus la classe : l'opacité de départ est portée par l'animation
		 * elle-même, donc rien ne reste invisible si le script ne charge pas.
		 */
		.lpv-reveal {
			opacity: 1;
			transform: none;
			animation: lpv-apparition linear both;
			animation-timeline: view();
			animation-range: entry 4% cover 22%;
		}

		/* Parallaxe du bandeau : la photo bouge moins vite que la page. */
		.lpv-hero__media img,
		.lpv-pagehead--image .lpv-hero__media img {
			animation: lpv-parallaxe linear both;
			animation-timeline: view();
			animation-range: cover 0% cover 100%;
		}

		/* Les grandes photos se dévoilent de bas en haut. */
		.lpv-philo__media,
		.lpv-surmesure__media,
		.lpv-focus__media,
		.lpv-bande__media {
			animation: lpv-devoile linear both;
			animation-timeline: view();
			animation-range: entry 10% cover 30%;
		}
	}
}

/* -------------------------------------------------------------------------
   22. Transitions entre les pages (View Transitions API)
   La navigation d'une page à l'autre cesse d'être un rechargement brutal.
   La photo d'une pépite se prolonge jusque sur sa fiche.
   ------------------------------------------------------------------------- */
@view-transition {
	navigation: auto;
}

::view-transition-old(root) {
	animation: lpv-vt-sortie 0.28s cubic-bezier(0.4, 0, 1, 1) both;
}

::view-transition-new(root) {
	animation: lpv-vt-entree 0.42s cubic-bezier(0, 0, 0.2, 1) both;
}

@keyframes lpv-vt-sortie {
	to {
		opacity: 0;
	}
}

@keyframes lpv-vt-entree {
	from {
		opacity: 0;
		transform: translateY(12px);
	}
}

/* L'en-tête et le pied de page restent fixes pendant la transition. */
.lpv-header {
	view-transition-name: lpv-entete;
}

.lpv-footer {
	view-transition-name: lpv-pied;
}

@media (prefers-reduced-motion: reduce) {
	@view-transition {
		navigation: none;
	}
}

/* -------------------------------------------------------------------------
   23. Bandeau éditorial (desktop)
   Sur grand écran, la photo n'occupe plus tout le fond : elle forme un
   panneau à droite, et le titre déborde par-dessus. Un dégradé fond la
   phote dans la page pour que le texte reste lisible sur la zone de
   recouvrement. En dessous de 1000 px, on revient au bandeau immersif.
   ------------------------------------------------------------------------- */
@media (min-width: 1000px) {
	.lpv-hero {
		align-items: center;
		background: var(--fond);
		min-height: min(94vh, 940px);
		padding-block: calc(var(--header-h) + 2rem) 4rem;
	}

	/* Le panneau photo bleed à droite, arrondi côté texte. */
	.lpv-hero__media {
		inset: var(--header-h) 0 2.5rem 40%;
		border-radius: var(--radius-xl) 0 0 var(--radius-xl);
		overflow: hidden;
	}

	/*
	 * Le bandeau n'est plus une photo plein écran mais un fond clair :
	 * l'en-tête doit redevenir sombre sur clair, sinon logo et menu
	 * blancs deviennent illisibles.
	 */
	body.has-hero-edito.has-transparent-header .lpv-header:not(.is-scrolled) {
		background: var(--fond);
		border-bottom-color: transparent;
	}

	body.has-hero-edito.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-header__inner {
		color: var(--titre);
		text-shadow: none;
	}

	body.has-hero-edito.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-logo img {
		filter: none;
	}

	body.has-hero-edito.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-btn--primaire {
		background: var(--btn-fond);
		color: var(--btn-texte);
	}

	body.has-hero-edito.has-transparent-header .lpv-header:not(.is-scrolled) .lpv-burger span {
		background: var(--titre);
	}

	/* Fondu de la photo vers le fond de page, sous le débord du titre. */
	.lpv-hero__media::after {
		content: "";
		position: absolute;
		inset: 0;
		z-index: 1;
		background: linear-gradient(
			90deg,
			var(--fond) 0%,
			rgb(from var(--fond) r g b / 0.72) 22%,
			transparent 46%
		);
	}

	/* Plus de voile sombre : le texte est posé sur le fond clair. */
	.lpv-hero::after {
		display: none;
	}

	.lpv-hero__contenu {
		max-width: none;
		width: min(64%, 720px);
		color: var(--texte);
	}

	.lpv-hero h1 {
		color: var(--titre);
		/* Le titre dépasse volontairement de sa colonne, sur la photo. */
		width: 128%;
		max-width: none;
		text-wrap: pretty;
	}

	.lpv-hero .lpv-surtitre {
		color: var(--texte-tenu);
	}

	.lpv-hero .lpv-lead {
		color: var(--texte-doux);
		max-width: 46ch;
	}

	.lpv-hero__scroll {
		left: var(--gouttiere);
		translate: 0 0;
		background: var(--trait);
	}
}

/* Navigateurs sans rgb(from ...) : dégradé équivalent, sans transparence calculée. */
@supports not (color: rgb(from white r g b / 1)) {
	@media (min-width: 1000px) {
		.lpv-hero__media::after {
			background: linear-gradient(90deg, var(--fond) 0%, transparent 46%);
		}
	}
}

/*
 * En dessous de 1000 px, le bandeau se fond désormais vers le crème et le
 * texte y est posé en vert : les boutons reprennent donc leur habillage
 * normal — foncé sur clair. Les surcharges « clair sur sombre » qui
 * figuraient ici rendaient le bouton plein invisible sur le nouveau fond.
 */

/*
 * Couleurs du bandeau sous 1000 px. Ce bloc doit venir APRÈS les règles de
 * couleur par défaut du bandeau (texte clair sur photo), sinon celles-ci
 * l'emportent à spécificité égale et le titre reste blanc sur le crème.
 */
@media (max-width: 999px) {
	.lpv-hero__contenu,
	.lpv-hero h1,
	.lpv-hero .lpv-surtitre {
		color: var(--titre);
		text-shadow: none;
	}

	.lpv-hero .lpv-lead {
		color: var(--texte-doux);
	}

	.lpv-hero__scroll {
		background: rgb(var(--voile) / 0.28);
	}
}

/* Repli pour les navigateurs sans couleurs relatives : même fondu, sans le
   palier intermédiaire à 88 % d'opacité. */
@supports not (color: rgb(from white r g b / 1)) {
	@media (max-width: 999px) {
		.lpv-hero::after {
			background: linear-gradient(
				180deg,
				rgb(var(--voile) / 0.34) 0%,
				rgb(var(--voile) / 0.08) 14%,
				transparent 22%,
				var(--fond) 42%
			);
		}
	}
}

/* -------------------------------------------------------------------------
   24. Univers empilés (page Nos Collections)
   Chaque univers occupe un écran et se cale en haut pendant que le suivant
   remonte par-dessus : les cinq familles se feuillettent comme des cartes.
   ------------------------------------------------------------------------- */
.lpv-pile {
	display: grid;
	gap: clamp(1.5rem, 3vw, 2.5rem);
}

.lpv-pile__carte {
	position: relative;
	overflow: hidden;
	border-radius: var(--radius-xl);
	background: var(--surface-sombre);
	color: var(--sur-sombre);
	isolation: isolate;
}

.lpv-pile__media {
	position: absolute;
	inset: 0;
	z-index: -2;
}

.lpv-pile__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.lpv-pile__carte::after {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background: linear-gradient(
		105deg,
		rgb(var(--voile) / 0.88) 0%,
		rgb(var(--voile) / 0.62) 42%,
		rgb(var(--voile) / 0.18) 100%
	);
}

.lpv-pile__contenu {
	display: flex;
	flex-direction: column;
	justify-content: flex-end;
	min-height: clamp(26rem, 62vh, 34rem);
	padding: clamp(1.75rem, 4vw, 3.5rem);
	max-width: 46rem;
}

.lpv-pile__carte h2,
.lpv-pile__carte .lpv-surtitre {
	color: var(--sur-sombre);
}

.lpv-pile__carte h2 {
	margin-bottom: 0.4em;
}

.lpv-pile__carte .lpv-lead {
	color: var(--sur-sombre-doux);
	max-width: 42ch;
}

.lpv-pile__carte .lpv-bande__liste li {
	background: transparent;
	border-color: var(--trait-sombre);
	color: var(--sur-sombre-doux);
}

.lpv-pile__carte .lpv-lien {
	color: var(--sur-sombre);
	border-color: var(--trait-sombre);
}

.lpv-pile__numero {
	position: absolute;
	top: clamp(1.5rem, 3vw, 2.5rem);
	right: clamp(1.5rem, 3vw, 2.5rem);
	font-family: var(--font-display);
	font-size: clamp(2.5rem, 6vw, 5rem);
	line-height: 1;
	color: var(--sur-sombre);
	opacity: 0.22;
}

/* L'empilement ne se déclenche que sur grand écran et si le mouvement
   n'est pas réduit : sinon les cartes défilent simplement à la suite. */
@media (min-width: 900px) and (prefers-reduced-motion: no-preference) {
	.lpv-pile__carte {
		position: sticky;
		top: calc(var(--header-h) + 1.5rem + var(--pile-i, 0) * 14px);
	}
}

/* -------------------------------------------------------------------------
   25. Catalogue en bento
   Une carte sur six s'élargit : la grille cesse d'être une trame régulière
   et retrouve un rythme, sans casser l'alignement des lignes.
   ------------------------------------------------------------------------- */
@media (min-width: 900px) {
	.lpv-grille--bento {
		grid-template-columns: repeat(4, 1fr);
	}

	.lpv-grille--bento > :nth-child(6n + 1) {
		grid-column: span 2;
	}

	.lpv-grille--bento > :nth-child(6n + 1) .lpv-pepite__media {
		aspect-ratio: 16 / 11;
	}

	.lpv-grille--bento > :nth-child(6n + 1) .lpv-pepite__titre {
		font-size: clamp(1.375rem, 1.1rem + 0.9vw, 1.75rem);
	}
}

@media (min-width: 620px) and (max-width: 899px) {
	.lpv-grille--bento {
		grid-template-columns: repeat(2, 1fr);
	}
}

/* -------------------------------------------------------------------------
   26. Bandeau photo défilant
   Une bande continue de végétaux. Elle s'arrête au survol comme en mouvement
   réduit, et devient une bande à faire défiler au doigt dans ce dernier cas.

   Deux usages : avec une galerie choisie, ce sont de vraies photos de la
   pépinière — du contenu, décrit pour les lecteurs d'écran. À défaut, elle
   reprend les vignettes du catalogue et n'est plus qu'un ornement : le
   gabarit lui pose alors aria-hidden, les mêmes images figurant déjà
   au-dessus.
   ------------------------------------------------------------------------- */
/* Le bandeau porte déjà son propre fond et ses marges : quand il est encadré
   par une section titrée, c'est la section qui les prend en charge. */
.lpv-section--galerie {
	padding-block: clamp(3rem, 6vw, 5rem) 0;
	background: var(--fond-alt);
}

.lpv-section--galerie .lpv-defile {
	padding-block: clamp(1.5rem, 3vw, 2.5rem) clamp(3rem, 6vw, 5rem);
	background: none;
}

.lpv-galerie__titre {
	margin: 0;
	text-align: center;
}

.lpv-defile {
	overflow: hidden;
	padding-block: clamp(2.5rem, 5vw, 4rem);
	background: var(--fond-alt);
	/* Les extrémités s'estompent au lieu d'être coupées net. */
	-webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
	mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}

.lpv-defile__piste {
	display: flex;
	gap: clamp(0.75rem, 2vw, 1.25rem);
	width: max-content;
	/* Le gabarit pose --lpv-defile-duree en fonction du nombre de photos :
	   sans cela, une sélection plus fournie défilerait d'autant plus vite. */
	animation: lpv-defile var(--lpv-defile-duree, 70s) linear infinite;
}

.lpv-defile:hover .lpv-defile__piste,
.lpv-defile:focus-within .lpv-defile__piste {
	animation-play-state: paused;
}

.lpv-defile__vignette {
	flex: 0 0 auto;
	width: clamp(180px, 22vw, 300px);
	aspect-ratio: 4 / 5;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
}

.lpv-defile__vignette img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

@keyframes lpv-defile {
	to {
		transform: translateX(-50%);
	}
}

@media (prefers-reduced-motion: reduce) {
	.lpv-defile__piste {
		animation: none;
	}

	.lpv-defile {
		overflow-x: auto;
	}
}

/* -------------------------------------------------------------------------
   27. Curseur personnalisé
   Réservé aux pointeurs précis (souris) : sur tactile, rien n'est chargé.
   Le curseur système reste actif sur les champs de saisie et les liens
   texte, pour ne jamais gêner la lecture ni la sélection.
   ------------------------------------------------------------------------- */
.lpv-curseur {
	position: fixed;
	top: 0;
	left: 0;
	z-index: 10000;
	display: grid;
	place-items: center;
	width: 18px;
	height: 18px;
	border: 1px solid var(--titre);
	border-radius: 50%;
	pointer-events: none;
	opacity: 0;
	translate: -50% -50%;
	transition: width var(--ressort), height var(--ressort),
		background var(--transition), border-color var(--transition),
		opacity var(--transition);
	will-change: transform;
}

.lpv-curseur.is-actif {
	opacity: 1;
}

/* Au survol d'une photo cliquable : le cercle grandit et annonce l'action. */
.lpv-curseur.is-media {
	width: 84px;
	height: 84px;
	background: var(--accent);
	border-color: var(--accent);
}

.lpv-curseur.is-bouton {
	width: 44px;
	height: 44px;
	background: rgb(from var(--titre) r g b / 0.12);
}

.lpv-curseur__label {
	font-family: var(--font-base);
	font-size: 0.625rem;
	font-weight: 500;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--accent-texte);
	opacity: 0;
	transition: opacity var(--transition);
	white-space: nowrap;
}

.lpv-curseur.is-media .lpv-curseur__label {
	opacity: 1;
}

/* Le curseur natif disparaît seulement là où le nôtre prend le relais. */
@media (hover: hover) and (pointer: fine) {
	body.lpv-curseur-actif [data-curseur] {
		cursor: none;
	}
}

@media (prefers-reduced-motion: reduce) {
	.lpv-curseur {
		display: none;
	}
}

/* -------------------------------------------------------------------------
   28. Boutons magnétiques et soulignés qui se tracent
   ------------------------------------------------------------------------- */
.lpv-btn {
	will-change: transform;
}

.lpv-btn[data-magnetique] {
	transition: background var(--transition), color var(--transition),
		border-color var(--transition), translate var(--ressort);
}

/* Le survol ne décale plus le bouton : c'est l'aimantation qui s'en charge. */
.lpv-btn[data-magnetique]:hover {
	transform: none;
}

/* Filet jaune qui se trace sous le nom d'une pépite au survol. */
.lpv-pepite__titre {
	display: inline;
	background-image: linear-gradient(var(--accent), var(--accent));
	background-repeat: no-repeat;
	background-position: 0 100%;
	background-size: 0% 2px;
	transition: background-size var(--transition-lente);
	padding-bottom: 2px;
}

.lpv-pepite:hover .lpv-pepite__titre,
.lpv-pepite:focus-within .lpv-pepite__titre {
	background-size: 100% 2px;
}

@media (prefers-reduced-motion: reduce) {
	.lpv-pepite__titre {
		transition: none;
	}
}

/* -------------------------------------------------------------------------
   29. Confort tactile
   Sur mobile, toute cible cliquable doit faire au moins 44 px de haut et
   aucun texte ne doit descendre sous 12 px. Ce bloc rattrape les liens
   texte, les liens du pied de page et les petits libellés.
   ------------------------------------------------------------------------- */
@media (max-width: 899px) {
	/* Liens texte avec flèche : la zone tapable était de 29 px. */
	.lpv-lien,
	.lpv-fiche__retour {
		padding-block: 0.7rem;
		min-height: 44px;
		align-items: center;
	}

	/* Liens du menu et des coordonnées en pied de page. */
	.lpv-footer ul a,
	.lpv-coords__valeur a {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}

	.lpv-footer ul {
		gap: 0.25rem;
	}

	/* Bouton de recherche et logo : 44 px pleins. */
	.lpv-recherche__envoi {
		min-height: 44px;
	}

	.lpv-logo img {
		height: 44px;
	}

	/* Case à cocher du consentement : plus facile à viser au pouce. */
	.lpv-consent input {
		width: 22px;
		height: 22px;
	}

	/* Aucun texte sous 12 px : illisible sur un écran de téléphone. */
	.lpv-badge,
	.lpv-coords__label,
	.lpv-univers__fleche,
	.lpv-curseur__label,
	.lpv-footer h4 {
		font-size: 0.75rem;
	}

	.lpv-defile__vignette {
		width: clamp(150px, 42vw, 200px);
	}
}

/* Cibles du catalogue : 40 px arrondis à la norme tactile de 44 px. */
@media (max-width: 899px) {
	.lpv-filtre,
	select.lpv-filtre {
		min-height: 44px;
		display: inline-flex;
		align-items: center;
	}

	/* Lien d'univers au-dessus du nom d'une pépite. */
	.lpv-fiche__infos .lpv-surtitre a {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}
}

/* -------------------------------------------------------------------------
   30. Fenêtre d'aperçu au survol
   Inspirée des portfolios de studio : survoler un lien de texte fait
   apparaître une petite photo qui suit le curseur. Ici ce n'est pas
   décoratif — cela permet de voir un univers sans quitter la page.
   ------------------------------------------------------------------------- */
.lpv-apercu {
	position: fixed;
	top: 0;
	left: 0;
	z-index: 9998;
	width: 210px;
	aspect-ratio: 4 / 5;
	overflow: hidden;
	border-radius: var(--radius-l);
	background: var(--surface-douce);
	box-shadow: 0 18px 40px rgb(var(--voile) / 0.28);
	pointer-events: none;
	opacity: 0;
	scale: 0.86;
	transform-origin: 0 0;
	transition: opacity 0.35s cubic-bezier(0.22, 1, 0.36, 1),
		scale 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
	will-change: transform;
}

.lpv-apercu.is-visible {
	opacity: 1;
	scale: 1;
}

.lpv-apercu img {
	width: 100%;
	height: 100%;
	object-fit: cover;
}

@media (hover: none), (prefers-reduced-motion: reduce) {
	.lpv-apercu {
		display: none;
	}
}

/* -------------------------------------------------------------------------
   31. Révélation des titres ligne par ligne
   Chaque ligne monte derrière un masque, légèrement décalée. Le texte reste
   intact dans le HTML : seules des enveloppes sont ajoutées, donc rien ne
   change pour un lecteur d'écran ni pour le référencement.
   ------------------------------------------------------------------------- */
.lpv-lignes {
	--ligne-delai: 90ms;
}

.lpv-ligne {
	display: block;
	overflow: hidden;
}

.lpv-ligne__interieur {
	display: block;
	will-change: transform;
}

@media (prefers-reduced-motion: no-preference) {
	.lpv-lignes.is-prete .lpv-ligne__interieur {
		translate: 0 110%;
		animation: lpv-monte 0.9s cubic-bezier(0.22, 1, 0.36, 1) both;
		animation-delay: calc(var(--i, 0) * var(--ligne-delai));
	}

	/* Si le navigateur sait lier l'animation au défilement, la ligne se
	   révèle quand elle entre dans l'écran plutôt qu'au chargement. */
	@supports (animation-timeline: view()) {
		.lpv-lignes.is-prete .lpv-ligne__interieur {
			animation: lpv-monte linear both;
			animation-timeline: view();
			animation-range: entry 2% cover 18%;
			animation-delay: 0s;
		}
	}
}

@keyframes lpv-monte {
	from {
		translate: 0 110%;
	}
	to {
		translate: 0 0;
	}
}

/* -------------------------------------------------------------------------
   32. Transition de page en balayage
   Un voile crème traverse l'écran entre deux pages, au lieu d'un simple
   fondu. Toujours l'API native : aucune bibliothèque, aucun octet de plus.
   ------------------------------------------------------------------------- */
@media (prefers-reduced-motion: no-preference) {
	::view-transition-old(root) {
		animation: lpv-vt-sortie 0.32s cubic-bezier(0.4, 0, 1, 1) both;
	}

	::view-transition-new(root) {
		animation: lpv-vt-balayage 0.55s cubic-bezier(0.65, 0, 0.35, 1) both;
	}

	@keyframes lpv-vt-balayage {
		from {
			clip-path: inset(0 0 0 100%);
		}
		to {
			clip-path: inset(0 0 0 0);
		}
	}
}
