/*
Theme Name: Beton Expert
Theme URI: https://betonexpert.fr
Description: Thème enfant d'Astra pour Beton Expert — béton décoratif et sols extérieurs. Toutes les personnalisations du site vivent ici afin de survivre aux mises à jour d'Astra.
Author: Beton Expert
Template: astra
Version: 3.18.0
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: beton-expert
*/

/* ==================================================================
 * SOMMAIRE
 * 1.  Jetons de design (palette, typographie, espacements)
 * 2.  Base
 * 3.  Conteneur
 * 4.  En-tête et navigation
 * 5.  Méga-menu
 * 6.  Menu mobile
 * 7.  Boutons
 * 8.  Contenu Elementor
 * 8b. Sections « hero »
 * 8c. Page contact
 * 8d. Sections accueil
 * 8e. Barre de contact flottante
 * 8f. Correctifs et composants
 * 8g. Pages de finition (les douze articles « béton … »)
 * 8h. Sections de contenu des pages de finition
 * 8i. Calculateurs (Calculated Fields Form)
 * 8j. Comparateurs (« béton X ou béton Y ? ») et leur index
 * 8k. Aide au choix de finition (page d'accueil)
 * 8l. Vidéos de chantier (Shorts YouTube, façade au clic)
 * 8m. Page « Nos produits »
 * 9.  Galeries et projets
 * 10. Pied de page
 * 11. Accessibilité et préférences système
 * ================================================================== */

/* ------------------------------------------------------------------
 * 1. JETONS DE DESIGN
 * Palette : voir design/color-palette.md (contrastes WCAG mesurés).
 * ---------------------------------------------------------------- */
:root {
	/* Couleurs de marque */
	--be-charcoal: #1f271b;
	--be-yale: #0b4f6c;
	--be-baltic: #145c9e;
	--be-oak: #cbb9a8;
	--be-almond: #dcc7be;

	/* Nuances utilisées */
	--be-baltic-600: #114f88; /* survol */
	--be-baltic-700: #0e4272; /* lien sur fond clair, état actif */
	--be-yale-700: #08394e;
	--be-yale-800: #062c3c;
	--be-oak-100: #f7f4f1; /* texte sur fond sombre */
	--be-oak-200: #eee9e3; /* bordures */
	--be-almond-200: #f4edea; /* fond de section discret */

	/* Rôles */
	--be-bg: #ffffff;
	--be-bg-warm: var(--be-almond);
	--be-surface: var(--be-oak);
	--be-text: var(--be-charcoal);
	--be-text-invert: var(--be-oak-100);
	--be-link: var(--be-baltic-700);
	--be-action: var(--be-baltic);
	--be-action-hover: var(--be-baltic-600);
	--be-dark: var(--be-yale);
	--be-border: var(--be-oak-200);

	/* Texte secondaire — 5,7:1 sur blanc, conforme AA */
	--be-text-muted: #5a6356;

	/* Échelle typographique (base 16px, ratio ~1,25) */
	--be-fs-xs: 0.8125rem;
	--be-fs-sm: 0.9375rem;
	--be-fs-base: 1.0625rem;
	--be-fs-lg: 1.25rem;
	--be-fs-xl: 1.5rem;
	--be-fs-2xl: 1.9rem;
	--be-fs-3xl: 2.4rem;
	--be-fs-4xl: 3rem;

	/* Espacements */
	--be-space-2xs: 0.25rem;
	--be-space-xs: 0.5rem;
	--be-space-sm: 0.75rem;
	--be-space-md: 1.25rem;
	--be-space-lg: 2rem;
	--be-space-xl: 3rem;
	--be-space-2xl: 4.5rem;

	/* Familles typographiques — reprises de conta.cubical.ro (référence
	 * du dossier design/). Les deux sont sous licence SIL Open Font. */
	--be-font-display: "Hanken Grotesk", "Segoe UI", system-ui, -apple-system, sans-serif;
	--be-font-body: "Plus Jakarta Sans", "Segoe UI", system-ui, -apple-system, sans-serif;

	/* Divers */
	--be-radius: 6px;
	--be-radius-lg: 12px;
	/* Barres flottantes — en-tête et barre de contact. Un rayon
	 * entier en faisait des gélules ; celui-ci arrondit sans
	 * transformer la forme. */
	--be-radius-xl: 20px;
	/* Pastilles internes de ces barres : liens de menu, boutons. */
	--be-radius-pill: 10px;
	--be-container: 1200px;
	--be-shadow-sm: 0 1px 2px rgba(31, 39, 27, 0.06), 0 2px 8px rgba(31, 39, 27, 0.05);
	--be-shadow-md: 0 4px 12px rgba(31, 39, 27, 0.08), 0 12px 32px rgba(31, 39, 27, 0.09);
	--be-shadow-lg: 0 12px 28px rgba(31, 39, 27, 0.12), 0 28px 64px rgba(31, 39, 27, 0.12);
	--be-transition: 180ms cubic-bezier(0.4, 0, 0.2, 1);

	/* Hauteur totale de l'en-tête flottant :
	 *   marge de l'en-tête (2 × 0,75rem = 24) + capsule (56) = 80.
	 * La capsule a une hauteur imposée, donc cette valeur est exacte
	 * et non plus estimée. L'en-tête étant sorti du flux par une marge
	 * négative, c'est ce que le contenu doit dégager en haut : toute
	 * erreur ici se voit comme une bande blanche en haut de page. */
	--be-header-h: 80px;

	/* Hauteur que le contenu doit dégager sous l'en-tête. Séparée de la
	 * hauteur réelle « --be-header-h » : en mobile l'en-tête repasse
	 * dans le flux et ne prend plus rien au contenu, alors que sa
	 * hauteur reste utile pour caler le panneau de menu. */
	--be-header-clear: var(--be-header-h);
}

@media (max-width: 921px) {
	:root {
		/* Capsule ramenée à 50 px sur les petits écrans. */
		/* Hauteur réelle du bandeau pleine largeur, filet compris. */
		--be-header-h: 70px;
		/* En mobile l'en-tête n'est plus collant : il occupe sa place
		 * dans le flux, le contenu n'a donc rien à dégager. */
		--be-header-clear: 0px;
	}
}

/* ------------------------------------------------------------------
 * 2. BASE
 * ---------------------------------------------------------------- */
body,
button,
input,
select,
textarea,
.elementor-widget-text-editor,
.elementor-widget-button .elementor-button {
	font-family: var(--be-font-body);
}

body {
	color: var(--be-text);
	background-color: var(--be-bg);
	font-size: var(--be-fs-base);
	line-height: 1.65;
	-webkit-font-smoothing: antialiased;
	-moz-osx-font-smoothing: grayscale;
}

h1,
h2,
h3,
h4,
h5,
h6,
.entry-title,
.elementor-heading-title,
.main-header-menu .menu-link,
.be-footer__heading {
	font-family: var(--be-font-display);
}

h1,
h2,
h3,
h4,
h5,
h6,
.entry-title {
	color: var(--be-text);
	line-height: 1.18;
	letter-spacing: -0.015em;
	font-weight: 700;
	text-wrap: balance;
}

p {
	text-wrap: pretty;
}

a {
	color: var(--be-link);
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
	transition: color var(--be-transition);
}

a:hover,
a:focus {
	color: var(--be-action-hover);
}

::selection {
	background: var(--be-baltic);
	color: #fff;
}

hr,
.be-rule {
	border: 0;
	border-top: 1px solid var(--be-border);
	margin-block: var(--be-space-xl);
}

/* ------------------------------------------------------------------
 * 3. CONTENEUR
 * ---------------------------------------------------------------- */
.be-container {
	width: 100%;
	max-width: var(--be-container);
	margin-inline: auto;
	padding-inline: var(--be-space-md);
}

/* ------------------------------------------------------------------
 * 4. EN-TÊTE ET NAVIGATION
 * Motif conta.cubical.ro : la barre n'est pas un bandeau collé au
 * bord haut mais une capsule blanche posée sur la page, détachée des
 * quatre côtés. Les liens sont de simples textes ; la page courante
 * se signale par une pastille pleine et discrète, et un seul bouton
 * plein, complètement arrondi, porte la conversion à droite.
 * ---------------------------------------------------------------- */

/* L'en-tête lui-même ne porte plus rien de visible : il ne sert qu'à
 * réserver la place et à tenir la capsule en position collante. */
.site-header {
	background-color: transparent;
	border-bottom: 0;
}

/* L'en-tête ne réserve aucune place dans le flux : sa marge basse
 * négative annule sa hauteur, si bien que la première section remonte
 * derrière lui et que son fond court sous la capsule. Sans cela, la
 * bande qui entoure la capsule restait blanche et coupait net sur le
 * dégradé du hero, sur toute la largeur de l'écran.
 * La contrepartie est que le contenu doit dégager la hauteur de
 * l'en-tête lui-même — voir « --be-header-h » plus bas. */
.be-sticky-header .site-header {
	position: sticky;
	top: 0;
	z-index: 500;
	padding-block: var(--be-space-sm);
	/* Deux pixels de plus que la hauteur réelle : la première section
	 * mord légèrement sous l'en-tête au lieu de risquer de s'arrêter
	 * un cheveu trop bas, ce qui laissait paraître une bande blanche
	 * en haut de l'écran. L'en-tête étant transparent, ce
	 * chevauchement ne se voit pas. */
	margin-bottom: calc(-1 * var(--be-header-h) - 2px);
}

/* La barre d'admin ne doit pas recouvrir l'en-tête collant. */
.admin-bar.be-sticky-header .site-header {
	top: 32px;
}

@media (max-width: 782px) {
	.admin-bar.be-sticky-header .site-header {
		top: 46px;
	}
}

/* --- La capsule ---
 * Présente aussi bien dans l'en-tête de bureau que dans celui du
 * mobile : Astra pose « .ast-primary-header-bar » sur les deux.
 * Surtout pas de « overflow: hidden » ici — les sous-menus sortent
 * de la capsule et seraient rognés.
 */
.ast-primary-header-bar {
	max-width: min(1400px, 100% - 1.5rem);
	margin-inline: auto;
	/* Capsule serrée : sa hauteur est celle du bouton d'action, pas
	 * un coussin autour. */
	padding-block: 0.4rem;
	padding-inline: 0.75rem 0.5rem;
	/* Hauteur imposée, pas seulement minimale.
	 * Astra impose sa propre hauteur de barre à la rangée interne
	 * (74 px) : la capsule montait donc à 87 px et l'en-tête entier à
	 * 109, alors que la remontée de la première section était calculée
	 * sur 82. Les 25 px d'écart, c'était la bande blanche en haut de
	 * l'écran. La hauteur est désormais fixée ici et la rangée interne
	 * remise à plat juste en dessous, pour que « --be-header-h » soit
	 * exact par construction. */
	height: 56px;
	border: 1px solid var(--be-oak-200);
	border-bottom: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-xl);
	background-color: #fff;
	box-shadow: var(--be-shadow-sm);
}

/* Pas d'effet au survol sur la capsule elle-même : elle n'est pas
 * cliquable, et une ombre qui enfle au passage de la souris attire
 * l'œil sur le contenant au lieu des liens qu'il contient. */

/* Sur écran de bureau, le conteneur interne d'Astra est borné à la
 * largeur de contenu du site ; dans une capsule plus large, logo et
 * menu se retrouveraient enfoncés vers le centre. C'est la marge
 * interne de la capsule qui fait désormais la gouttière. */
.ast-primary-header-bar > .site-primary-header-wrap {
	max-width: 100%;
	padding-inline: 0;
}

/* Astra règle la hauteur de sa barre sur la rangée interne. On la
 * neutralise : c'est la capsule qui décide, sinon la hauteur réelle
 * de l'en-tête cesse de correspondre à « --be-header-h ». */
.ast-primary-header-bar .site-primary-header-wrap,
.ast-primary-header-bar .ast-builder-grid-row {
	min-height: 0;
	height: 100%;
	padding-block: 0;
}

.ast-primary-header-bar .ast-builder-grid-row,
.ast-primary-header-bar .site-header-section {
	align-items: center;
}

.main-header-bar {
	border-bottom: 0;
}

/* --- Logo ---
 * Le fichier fait 250 × 63 px, marges blanches comprises : la marque
 * n'occupe pas toute la hauteur déclarée. Calé sur celle du bouton
 * d'action, il tient la capsule sans la faire enfler, et un peu d'air
 * à gauche l'éloigne du bord arrondi dont la courbe mordait sur le
 * début du mot.
 */
.site-logo-img img,
.custom-logo-link img {
	display: block;
	max-height: 34px;
	width: auto;
	transition: max-height var(--be-transition);
}

.ast-primary-header-bar .site-branding {
	padding-left: 0.35rem;
}

@media (max-width: 921px) {
	.ast-primary-header-bar {
		height: 50px;
	}

	.site-logo-img img,
	.custom-logo-link img {
		max-height: 30px;
	}
}

/* L'en-tête étant hors flux, c'est au contenu de dégager sa hauteur.
 * Le hero le fait dans sa propre marge interne (section 8b) pour que
 * son fond continue de courir derrière la capsule. Les pages qui
 * n'ouvrent pas sur un hero — les douze articles de finition — n'ont
 * pas cette marge : on la leur ajoute ici. */
body:not(:has(.be-hero)) .site-content {
	padding-top: var(--be-header-clear);
}

/* --- Liens de premier niveau --- */
.main-header-menu > .menu-item > .menu-link {
	position: relative;
	color: var(--be-text);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	letter-spacing: 0.01em;
	padding-inline: var(--be-space-md);
	transition: color var(--be-transition);
}

/* Pastille de page courante.
 * Remplace le soulignement animé d'avant : sur une capsule arrondie,
 * un trait de 2 px collé sous le libellé se lisait comme un reste de
 * l'ancien bandeau. La pastille pleine reprend le repère de la
 * référence et se marie au bouton, lui aussi arrondi.
 */
@media (min-width: 922px) {
	.main-header-menu > .menu-item > .menu-link {
		padding: 0.5rem 0.9rem;
		border-radius: var(--be-radius-pill);
		line-height: 1.3;
		transition: background-color var(--be-transition), color var(--be-transition);
	}

	.main-header-menu > .menu-item > .menu-link:hover,
	.main-header-menu > .menu-item > .menu-link:focus {
		background-color: var(--be-oak-100);
		color: var(--be-baltic-700);
	}

	.main-header-menu > .menu-item.current-menu-item > .menu-link,
	.main-header-menu > .menu-item.current-menu-ancestor > .menu-link,
	.main-header-menu > .menu-item.current-menu-parent > .menu-link {
		background-color: var(--be-almond-200);
		color: var(--be-charcoal);
	}

}

/* Sous la capsule en version mobile, le menu est une liste empilée :
 * la couleur suffit à marquer la page courante. */
@media (max-width: 921px) {
	.main-header-menu > .menu-item > .menu-link:hover,
	.main-header-menu > .menu-item > .menu-link:focus,
	.main-header-menu > .menu-item.current-menu-item > .menu-link,
	.main-header-menu > .menu-item.current-menu-ancestor > .menu-link,
	.main-header-menu > .menu-item.current-menu-parent > .menu-link {
		color: var(--be-baltic);
	}
}

/* --- Sous-menus classiques --- */
.main-header-menu .sub-menu {
	background-color: #fff;
	border: 1px solid var(--be-border);
	border-radius: var(--be-radius-lg);
	box-shadow: var(--be-shadow-md);
	padding: var(--be-space-xs);
	overflow: hidden;
}

/* Le panneau se détache de la capsule au lieu de sortir de son bord
 * arrondi, où le raccord se voyait. */
@media (min-width: 922px) {
	.main-header-menu > .menu-item > .sub-menu {
		margin-top: 0.85rem;
	}
}

.main-header-menu .sub-menu .menu-link {
	color: var(--be-text);
	font-size: var(--be-fs-sm);
	font-weight: 500;
	border-radius: var(--be-radius);
	padding: 0.55rem 0.85rem;
	border-bottom: 0;
	transition: background-color var(--be-transition), color var(--be-transition);
}

.main-header-menu .sub-menu .menu-link:hover,
.main-header-menu .sub-menu .menu-link:focus,
.main-header-menu .sub-menu .current-menu-item > .menu-link {
	background-color: var(--be-almond-200);
	color: var(--be-baltic-700);
}

/* ------------------------------------------------------------------
 * 5. MÉGA-MENU
 * La classe « be-mega » est posée automatiquement par inc/menu.php
 * dès qu'un élément possède au moins 6 enfants.
 * ---------------------------------------------------------------- */
@media (min-width: 922px) {
	/* Le panneau s'aligne sur la largeur du menu, jamais hors écran. */
	.main-header-menu {
		position: relative;
	}

	.main-header-menu > .be-mega {
		position: static;
	}

	/* Le panneau s'aligne sur le bord droit du menu — donc en retrait
	 * du bord de la capsule, et jamais hors écran. Sa largeur est
	 * celle qu'il lui faut, pas celle qui reste. */
	.main-header-menu > .be-mega > .sub-menu {
		left: auto;
		right: 0;
		width: min(540px, calc(100vw - 3rem));
		display: grid;
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: 2px var(--be-space-xs);
		padding: var(--be-space-sm);
	}

	.main-header-menu > .be-mega--cols-3 > .sub-menu {
		grid-template-columns: repeat(3, minmax(0, 1fr));
		width: min(780px, calc(100vw - 3rem));
	}

	.main-header-menu > .be-mega > .sub-menu > .menu-item {
		width: auto;
	}

	.main-header-menu > .be-mega > .sub-menu .menu-link {
		display: flex;
		align-items: center;
		padding: 0.5rem 0.6rem;
		line-height: 1.3;
		border-radius: var(--be-radius);
	}

	/* Pastille de couleur : repère visuel discret par finition. */
	.main-header-menu > .be-mega > .sub-menu .menu-link::before {
		content: "";
		display: inline-block;
		width: 6px;
		height: 6px;
		margin-right: 0.6rem;
		border-radius: 50%;
		background-color: var(--be-oak);
		vertical-align: middle;
		transition: background-color var(--be-transition), transform var(--be-transition);
	}

	.main-header-menu > .be-mega > .sub-menu .menu-link:hover::before,
	.main-header-menu > .be-mega > .sub-menu .menu-link:focus::before {
		background-color: var(--be-baltic);
		transform: scale(1.4);
	}
}

/* ------------------------------------------------------------------
 * 6. MENU MOBILE
 * ---------------------------------------------------------------- */
@media (max-width: 921px) {
	/* --- L'en-tête n'est pas collant en mobile ---
	 *
	 * Sur un écran de téléphone, la capsule mangeait 80 des 812 px
	 * utiles en permanence. Elle redevient un en-tête ordinaire : elle
	 * défile avec la page. La marge négative qui remontait le contenu
	 * sous l'en-tête hors flux n'a plus lieu d'être, et
	 * « --be-header-clear » passe à zéro pour que les heros ne gardent
	 * pas un dégagement devenu inutile. */
	.be-sticky-header .site-header,
	.admin-bar.be-sticky-header .site-header {
		position: static;
		margin-bottom: 0;
		/* Plus de marge autour de la capsule : le bandeau touche les
		 * trois bords de l'écran. */
		padding-block: 0;
	}

	/* --- Un bandeau, pas une capsule ---
	 *
	 * La capsule arrondie et rentrée de 10 px laissait un liseré blanc
	 * en haut et sur les côtés : sur un écran de téléphone, cette
	 * bordure vide prenait de la place sans rien dire. En mobile, la
	 * barre va d'un bord à l'autre, à angles droits, et ne garde que
	 * son filet du bas pour se détacher du contenu.
	 */
	.ast-primary-header-bar {
		max-width: 100%;
		margin-inline: 0;
		border-inline: 0;
		border-top: 0;
		border-bottom: 1px solid var(--be-oak-200);
		border-radius: 0;
		/* Valeur fixe, identique ouvert et fermé : Astra remet la marge
		 * interne du bas à zéro quand le menu est déplié, la rangée
		 * gagnait 6 px et le logo descendait de 3 — il sautait à chaque
		 * ouverture. */
		padding-block: 0;
	}

	/* Même gabarit dans les deux états, pour la même raison : le bouton
	 * passait de 42 à 44 px à l'ouverture et poussait la rangée. */
	.ast-header-break-point .ast-mobile-header-wrap .ast-button-wrap .menu-toggle.main-header-menu-toggle,
	.ast-header-break-point .ast-mobile-header-wrap .ast-button-wrap .menu-toggle.main-header-menu-toggle.toggled {
		width: 44px;
		height: 44px;
		padding: 0;
	}

	/* --- Le panneau déplié se superpose au contenu ---
	 *
	 * Astra laisse le panneau dans le flux de l'en-tête : à l'ouverture
	 * l'en-tête passait de 91 à 360 px et poussait toute la page vers le
	 * bas — le titre descendait de 173 à 442 px, et le contenu remontait
	 * d'un coup à la fermeture.
	 *
	 * Le panneau est donc sorti du flux. Son point d'ancrage est
	 * « .ast-mobile-header-wrap », qui enveloppe la capsule : une fois le
	 * panneau en absolu, ce bloc ne fait plus que la hauteur de la
	 * capsule, et « top: 100% » tombe exactement sous elle sans valeur
	 * codée en dur — « --be-header-h » vaut 74 px alors que le bas réel
	 * de la capsule est à 80, et l'écart se serait vu comme une fente.
	 */
	.ast-mobile-header-wrap {
		position: relative;
	}

	.ast-mobile-header-content {
		position: absolute;
		top: 100%;
		left: 0;
		width: 100%;
		/* Sous la capsule, qui porte z-index 4 : son ombre continue de
		 * se poser sur le panneau et non l'inverse. */
		z-index: 3;
		/* Déplié, « Nos produits » ouvert, la liste dépasse la hauteur
		 * d'écran : elle défile en propre, sans entraîner la page. */
		max-height: calc(100dvh - var(--be-header-h));
		overflow-y: auto;
		overscroll-behavior: contain;
		box-shadow: var(--be-shadow-md);
	}

	.main-header-menu .menu-link {
		font-size: var(--be-fs-base);
		padding-block: 0.7rem;
		border-bottom: 1px solid var(--be-border);
	}

	/* Astra pose « height: 100% » sur le lien de premier niveau, ce qui
	 * convient à la barre de bureau où le <li> fait la hauteur de
	 * l'en-tête. En mobile le <li> est une colonne flex qui contient
	 * aussi le sous-menu déplié : le lien s'étirait alors sur toute la
	 * hauteur du bloc — près de 260 px — et ouvrait un vide entre
	 * « Nos produits » et la première finition. */
	.main-header-menu > .menu-item > .menu-link,
	#astra-footer-menu > .menu-item > .menu-link {
		height: auto;
	}

	.main-header-menu .sub-menu {
		border: 0;
		border-radius: 0;
		box-shadow: none;
		padding: 0;
		background-color: var(--be-almond-200);
		/* « overflow: hidden » sert aux coins arrondis du panneau de
		 * bureau. Déplié en mobile, il rognait le sous-menu : les six
		 * dernières finitions (balayé, poreux, quartzé, matricé,
		 * coloré, bouchardé) étaient dans le DOM mais invisibles et
		 * inatteignables. */
		overflow: visible;
		height: auto;
	}

	.main-header-menu .sub-menu .menu-link {
		padding-left: var(--be-space-md);
		border-radius: 0;
	}

	.site-logo-img img,
	.custom-logo-link img {
		max-height: 44px;
	}
}

/* ------------------------------------------------------------------
 * 7. BOUTONS
 * Baltic Blue est réservé aux actions — voir color-palette.md.
 * ---------------------------------------------------------------- */
.be-btn,
.elementor-button,
.wp-block-button__link,
.ast-button,
button,
input[type="submit"] {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.5rem;
	font-weight: 600;
	font-size: var(--be-fs-sm);
	line-height: 1.2;
	letter-spacing: 0.01em;
	padding: 0.85rem 1.6rem;
	border-radius: var(--be-radius);
	border: 1px solid transparent;
	text-decoration: none;
	cursor: pointer;
	transition: background-color var(--be-transition), border-color var(--be-transition),
		color var(--be-transition), transform var(--be-transition), box-shadow var(--be-transition);
}

.be-btn--primary,
.elementor-button,
.wp-block-button__link,
.ast-button,
input[type="submit"] {
	background-color: var(--be-action);
	border-color: var(--be-action);
	color: #fff;
}

.be-btn--primary:hover,
.be-btn--primary:focus,
.elementor-button:hover,
.elementor-button:focus,
.wp-block-button__link:hover,
.wp-block-button__link:focus,
.ast-button:hover,
.ast-button:focus,
input[type="submit"]:hover,
input[type="submit"]:focus {
	background-color: var(--be-action-hover);
	border-color: var(--be-action-hover);
	color: #fff;
	transform: translateY(-1px);
	box-shadow: var(--be-shadow-sm);
}

.be-btn--primary:active,
.elementor-button:active {
	transform: translateY(0);
	background-color: var(--be-baltic-700);
	border-color: var(--be-baltic-700);
}

/* Bouton secondaire, sur fond clair.
 *
 * « --ghost » existait deja, mais pour les fonds sombres : son filet est
 * un blanc transparent, invisible sur une page claire. D'ou cette
 * seconde variante, qui est celle des heros.
 *
 * Elle partage tout le reste avec le bouton plein — rembourrage, rayon,
 * graisse, hauteur de ligne — puisqu'elle sort de la meme regle de base.
 * Les deux appels d'un hero ont donc exactement la meme boite, et leur
 * alignement n'est plus quelque chose qu'on regle : c'est quelque chose
 * qui ne peut pas etre faux.
 */
.be-btn--outline {
	background-color: transparent;
	border-color: var(--be-border);
	color: var(--be-baltic-700);
}

.be-btn--outline:hover,
.be-btn--outline:focus-visible {
	background-color: var(--be-almond-200);
	border-color: var(--be-action);
	color: var(--be-baltic-700);
	transform: translateY(-1px);
	box-shadow: var(--be-shadow-sm);
}

/* Bouton secondaire, sur fond sombre. */
.be-btn--ghost {
	background-color: transparent;
	border-color: rgba(247, 244, 241, 0.45);
	color: var(--be-oak-100);
}

.be-btn--ghost:hover,
.be-btn--ghost:focus {
	background-color: rgba(247, 244, 241, 0.1);
	border-color: var(--be-oak-100);
	color: #fff;
}

/* ------------------------------------------------------------------
 * 8. CONTENU ELEMENTOR
 * Restylage uniquement : la structure des pages n'est pas touchée.
 * ---------------------------------------------------------------- */
.elementor-widget-heading .elementor-heading-title {
	color: var(--be-text);
	letter-spacing: -0.015em;
	line-height: 1.18;
}

/* Filet d'accent sous les titres de section de premier niveau. */
.elementor-widget-heading .elementor-heading-title.elementor-size-xl,
.elementor-widget-heading h2.elementor-heading-title {
	position: relative;
}

.elementor-widget-heading h2.elementor-heading-title::after {
	content: "";
	display: block;
	width: 52px;
	height: 3px;
	margin-top: var(--be-space-sm);
	border-radius: 3px;
	background: linear-gradient(90deg, var(--be-baltic) 0%, var(--be-oak) 100%);
}

/* Titres centrés : le filet suit l'alignement. */
.elementor-widget-heading.be-center h2.elementor-heading-title::after,
[class*="elementor-align-center"] .elementor-widget-heading h2.elementor-heading-title::after,
.elementor-widget-heading[data-align="center"] h2.elementor-heading-title::after {
	margin-inline: auto;
}

.elementor-widget-text-editor {
	color: var(--be-text-muted);
	font-size: var(--be-fs-base);
	line-height: 1.7;
}

.elementor-widget-text-editor strong,
.elementor-widget-text-editor b {
	color: var(--be-text);
}

/* Images de contenu : coins adoucis et ombre légère. */
.elementor-widget-image img {
	border-radius: var(--be-radius-lg);
	box-shadow: var(--be-shadow-sm);
	transition: transform var(--be-transition), box-shadow var(--be-transition);
}

.elementor-widget-image a:hover img,
.elementor-widget-image a:focus img {
	transform: translateY(-2px);
	box-shadow: var(--be-shadow-md);
}

/* Icônes de la palette plutôt que les couleurs par défaut d'Elementor. */
.elementor-widget-icon .elementor-icon,
.elementor-widget-icon-box .elementor-icon {
	color: var(--be-baltic);
}

/* Accordéon / toggle (FAQ). */
.elementor-toggle .elementor-tab-title {
	border-bottom: 1px solid var(--be-border);
	padding: var(--be-space-md) 0;
	font-weight: 600;
	color: var(--be-text);
	transition: color var(--be-transition);
}

.elementor-toggle .elementor-tab-title:hover,
.elementor-toggle .elementor-tab-title.elementor-active {
	color: var(--be-baltic);
}

.elementor-toggle .elementor-tab-content {
	border-bottom: 1px solid var(--be-border);
	color: var(--be-text-muted);
	padding: 0 0 var(--be-space-md);
}

/* ------------------------------------------------------------------
 * 8b. SECTIONS « HERO »
 * Structure : scripts/build-heroes.php.
 * Modèle durasol.es (design/hero-patterns.md) décliné en trois
 * variantes — home, projets, contact. Fond clair, texte à gauche,
 * photo à droite dans un panneau ; la fiche chiffrée chevauche la
 * photo, ce qui relie les deux colonnes au lieu de les juxtaposer.
 * Jamais d'image en fond de section : la photo est un objet, pas une
 * texture, et le texte reste sur un aplat. Hauteur dictée par le
 * contenu.
 * ---------------------------------------------------------------- */
.elementor-section.be-hero {
	position: relative;
	isolation: isolate;
	background-color: var(--be-bg);
	border-bottom: 1px solid var(--be-oak-200);
	/* L'en-tête flotte au-dessus sans occuper de place dans le flux
	 * (section 4) : c'est ce qui laisse le fond du hero courir sous la
	 * capsule. En contrepartie le hero dégage lui-même la hauteur de
	 * l'en-tête, sans quoi le titre passerait dessous. */
	padding-top: calc(clamp(2.5rem, 5.5vw, 4.75rem) + var(--be-header-clear));
	padding-bottom: clamp(2.5rem, 5.5vw, 4.75rem);
	overflow: hidden;
}

/* Voile chaud, posé derrière le contenu. Il donne un aplomb au bloc
 * sans toucher à la lisibilité : le texte reste sur la partie blanche,
 * le dégradé s'éteint côté photo. */
.elementor-section.be-hero::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		radial-gradient(62% 86% at 86% 4%, var(--be-almond-200) 0%, rgba(244, 237, 234, 0) 68%),
		linear-gradient(180deg, var(--be-oak-100) 0%, var(--be-bg) 58%);
}

.be-hero > .elementor-container {
	position: relative;
	z-index: 1;
	align-items: center;
	max-width: var(--be-container);
	margin-inline: auto;
	padding-inline: 20px;
}

/* --- Sur-titre ---
 * Sur chaque page sauf l'accueil : il fait le travail d'un fil
 * d'Ariane, là où l'accueil n'a rien à situer.
 */
.be-hero .be-hero__eyebrow {
	margin-bottom: var(--be-space-sm);
}

.be-hero .be-eyebrow {
	display: inline-flex;
	align-items: center;
	gap: 0.65rem;
	margin: 0;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	line-height: 1;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-baltic-700);
}

.be-hero .be-eyebrow::before {
	content: "";
	flex: 0 0 auto;
	width: 28px;
	height: 2px;
	border-radius: 2px;
	background-color: var(--be-baltic);
}

/* --- Titre --- */
.be-hero .be-hero__title .elementor-heading-title {
	margin: 0;
	color: var(--be-charcoal);
	font-size: clamp(2.05rem, 3.8vw, 3.05rem);
	line-height: 1.06;
	letter-spacing: -0.032em;
	font-weight: 800;
	max-width: 17ch;
	text-wrap: balance;
}

.be-hero .elementor-heading-title::after {
	content: none;
}

/* Mots accentués du titre : couleur Yale et trait Pale Oak passé
 * derrière le texte. Le bleu Baltic reste réservé aux boutons. */
.be-hero .be-hero__accent {
	font-style: normal;
	color: var(--be-yale);
	background-image: linear-gradient(var(--be-oak), var(--be-oak));
	background-repeat: no-repeat;
	background-size: 100% 0.16em;
	background-position: 0 92%;
	box-decoration-break: clone;
	-webkit-box-decoration-break: clone;
}

/* --- Accroche --- */
.be-hero .be-hero__lead {
	margin-top: var(--be-space-md);
	color: var(--be-text-muted);
	font-size: var(--be-fs-lg);
	line-height: 1.55;
	max-width: 54ch;
}

.be-hero .be-hero__lead p {
	margin: 0;
}

/* --- Pastilles de réassurance ---
 * Trois au maximum, toujours concrètes. Coche pleine plutôt que
 * puce : reprend la lecture « garantie » des sites de référence.
 */
.be-hero .be-hero__badges {
	margin-top: var(--be-space-lg);
	/* L'écart avec les boutons est porté ici plutôt que sur les boutons
	 * eux-mêmes : quand la colonne se resserre et que les deux appels
	 * passent l'un sous l'autre, c'est leur marge haute qui se
	 * retrouve entre les deux lignes. */
	margin-bottom: var(--be-space-md);
}

.be-hero .be-badges {
	display: flex;
	flex-wrap: wrap;
	gap: var(--be-space-sm);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-hero .be-badges li {
	display: inline-flex;
	align-items: center;
	gap: 0.55rem;
	margin: 0;
	padding: 0.5rem 0.95rem 0.5rem 0.7rem;
	border: 1px solid var(--be-oak-200);
	border-radius: 999px;
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-sm);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	line-height: 1.2;
	color: var(--be-charcoal);
	font-variant-numeric: tabular-nums;
}

.be-hero .be-badges li::before {
	content: "";
	flex: 0 0 auto;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background-color: var(--be-baltic);
	/* Coche dessinée en masque : pas de police d'icônes à charger. */
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6 12-12-1.4-1.4z'/%3E%3C/svg%3E") center / 13px 13px no-repeat,
		linear-gradient(#000, #000);
	-webkit-mask-composite: xor;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6 12-12-1.4-1.4z'/%3E%3C/svg%3E") center / 13px 13px no-repeat,
		linear-gradient(#000, #000);
	mask-composite: exclude;
}

/* --- Appels à l'action ---
 * Un seul bouton plein ; le second est un lien fléché, comme sur
 * durasol.es (« Ver acabados → »). Deux boutons pleins se
 * concurrenceraient.
 */
.be-hero .elementor-widget-wrap > .elementor-widget-button {
	display: inline-flex;
	width: auto;
	max-width: max-content;
	flex: 0 0 auto;
	margin-top: var(--be-space-sm);
	margin-right: var(--be-space-lg);
	vertical-align: middle;
	align-self: center;
	/*
	 * LA cause du desalignement, et elle n'etait pas dans nos regles.
	 *
	 * Elementor espace ses widgets avec
	 * « .elementor-widget:not(:last-child) { margin-block-end: 20px } ».
	 * Des deux boutons cote a cote, seul le dernier y echappe : le
	 * premier portait donc 20 px de marge basse. Or « align-self »
	 * centre la boite **marges comprises** — le bouton plein se
	 * retrouvait une dizaine de pixels plus haut que le bouton a filet,
	 * quelles que soient leurs hauteurs.
	 *
	 * Trois corrections ont echoue avant d'avoir cherche ici : elles
	 * accordaient les rembourrages, les bordures et les hauteurs, c'est
	 * a dire tout sauf ce qui decalait reellement les boutons.
	 */
	margin-bottom: 0;
}

/* Le rembourrage et la taille sont poses par la regle commune
 * ci-dessous ; il ne reste ici que ce qui est propre au bouton plein. */
.be-hero .be-hero__cta .elementor-button {
	font-weight: 600;
	border-radius: var(--be-radius);
}

.be-hero .be-hero__cta .elementor-button .elementor-button-text::after {
	content: " \2192";
}

/* Second appel : lien fléché, sans cadre ni fond. */
/*
 * Tous les appels a l'action d'un hero ont la meme boite.
 *
 * Ils venaient de trois regles differentes : le bouton Elementor avait
 * son rembourrage, le bouton plein du hero de finition le sien, et le
 * bouton a filet n'heritait que du gabarit de base — 0,85 rem et une
 * police plus petite. Deux boutons cote a cote, deux hauteurs.
 *
 * Une seule regle les dimensionne desormais, quel que soit le systeme
 * qui les produit. Tant qu'ils sont dimensionnes ici, ils ne peuvent
 * pas differer ; ajouter une variante, c'est l'ajouter a cette liste.
 */
.be-hero :is(
	.be-hero__cta .elementor-button,
	.be-btn--primary,
	.be-btn--outline
) {
	box-sizing: border-box;
	padding: 0.95rem 1.7rem;
	font-size: var(--be-fs-base);
	line-height: 1.2;
	border-width: 1px;
	border-style: solid;
	/*
	 * Une hauteur plancher, egale a la hauteur naturelle du bouton.
	 *
	 * Elle ne change rien au dessin — c'est la valeur que le
	 * rembourrage produit deja — mais elle retire la derniere variable :
	 * quelle que soit la chaine de conteneurs flexibles d'Elementor, les
	 * deux boites font la meme hauteur, donc se centrent au meme
	 * endroit. C'est ce qui manquait aux corrections precedentes, qui
	 * accordaient les rembourrages sans jamais garantir le resultat.
	 */
	min-height: 3.3rem;
	align-items: center;
	justify-content: center;
}

/*
 * Et la chaine de conteneurs centre son contenu a chaque etage.
 *
 * Elementor emballe un bouton dans trois boites — le widget, son
 * conteneur, puis « button-wrapper » — et pose « align-items » sur le
 * widget a partir d'une variable. Sans consigne a chaque etage, la
 * hauteur du bouton plein etirait l'une de ces boites et le bouton a
 * filet se retrouvait cale plus bas. Trois lignes, et il n'y a plus
 * d'etage ou quelque chose puisse deriver.
 */
/*
 * Le widget garde « inline-flex » : c'est ce qui met les deux appels
 * cote a cote. Une version de cette regle le passait en « flex »,
 * c'est-a-dire en bloc — les deux boutons s'empilaient alors sur les
 * heros a deux colonnes, en plein ecran. Ici on ne touche qu'a
 * l'alignement de son contenu.
 */
.be-hero .elementor-widget-wrap > .elementor-widget-button {
	align-items: center;
}

.be-hero .elementor-widget-wrap > .elementor-widget-button > .elementor-widget-container,
.be-hero .elementor-widget-wrap > .elementor-widget-button .elementor-button-wrapper {
	display: flex;
	align-items: center;
}

/*
 * Les deux boites intermediaires remplissent leur parent.
 *
 * Passees en « flex », elles sont devenues des elements flexibles, donc
 * dimensionnees sur leur contenu. Sur mobile, ou le widget occupe toute
 * la largeur, le bouton demandait alors « 100 % » d'une boite large
 * comme son propre texte : deux boutons etroits, calles a gauche, sous
 * un hero centre. Elles doivent suivre la largeur du widget, pas celle
 * du texte.
 */
.be-hero .elementor-widget-wrap > .elementor-widget-button > .elementor-widget-container,
.be-hero .elementor-widget-wrap > .elementor-widget-button .elementor-button-wrapper {
	flex: 1 1 auto;
	min-width: 0;
}

.be-hero .be-hero__cta--ghost .elementor-button {
	background-color: transparent;
	border-color: var(--be-border);
	color: var(--be-baltic-700);
	box-shadow: none;
}

.be-hero .be-hero__cta--ghost .elementor-button:hover,
.be-hero .be-hero__cta--ghost .elementor-button:focus {
	background-color: var(--be-almond-200);
	border-color: var(--be-action);
	color: var(--be-baltic-700);
	transform: translateY(-1px);
	box-shadow: var(--be-shadow-sm);
}

/* ---------------- Panneau visuel (droite) ---------------- */
.be-hero__side {
	align-self: center;
}

.be-hero__side .elementor-widget-wrap {
	position: relative;
	align-content: center;
}

/* Cadre décalé derrière la photo : même gabarit, poussé de 16 px vers
 * le haut et la droite. Deux plans au lieu d'un seul, et un rappel de
 * Pale Oak du côté où le voile chaud est le plus dense. Purement
 * ornemental, retiré dès que la mise en page passe en colonne. */
.be-hero__side .elementor-widget-wrap::before {
	content: "";
	position: absolute;
	inset: 0;
	transform: translate(16px, -16px);
	border: 2px solid var(--be-oak);
	border-radius: var(--be-radius-lg);
	pointer-events: none;
	z-index: 0;
}

.be-hero .be-hero__media {
	position: relative;
	z-index: 1;
	margin: 0;
}

.be-hero .be-hero__media .elementor-widget-container {
	position: relative;
	border-radius: var(--be-radius-lg);
	overflow: hidden;
	box-shadow: var(--be-shadow-lg);
}

.be-hero .be-hero__media img {
	display: block;
	width: 100%;
	height: clamp(280px, 34vw, 430px);
	object-fit: cover;
	border-radius: 0;
	box-shadow: none;
}

/* --- Fiche chiffrée ---
 * Chevauche l'angle bas-gauche de la photo : elle fait la jonction
 * entre la colonne texte et la colonne image. Le chiffre porte
 * toujours sa précision — un nombre nu se lirait comme un devis.
 */
.be-hero .be-hero__stat {
	position: absolute;
	left: -18px;
	bottom: -18px;
	z-index: 2;
	margin: 0;
	max-width: 22rem;
}

.be-hero .be-stat {
	display: flex;
	align-items: center;
	gap: var(--be-space-sm);
	margin: 0;
	padding: var(--be-space-sm) var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-md);
}

.be-hero .be-stat__figure {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-3xl);
	font-weight: 800;
	line-height: 1;
	letter-spacing: -0.04em;
	color: var(--be-yale);
	font-variant-numeric: tabular-nums;
}

.be-hero .be-stat__body {
	display: flex;
	flex-direction: column;
	gap: 0.15rem;
	min-width: 0;
}

.be-hero .be-stat__label {
	font-size: var(--be-fs-sm);
	font-weight: 700;
	line-height: 1.2;
	color: var(--be-charcoal);
}

.be-hero .be-stat__note {
	font-size: var(--be-fs-xs);
	line-height: 1.35;
	color: var(--be-text-muted);
}

/* ---------------- Variante contact (motif E) ----------------
 * Sans photo, la colonne occupe toute la largeur ; alignée à gauche
 * le texte y flotterait. Centrage sur une mesure courte, le reste
 * de la page — formulaire et fiche de coordonnées — prenant le
 * relais juste dessous.
 */
.be-hero--contact .be-hero__main .elementor-widget-wrap {
	align-items: center;
	/* Les deux boutons partagent une ligne dans le flux de widgets
	 * d'Elementor : c'est « justify-content » qui les centre, pas
	 * « align-items ». Les autres widgets font 100 % de large et ne
	 * bougent pas. */
	justify-content: center;
	text-align: center;
}

.be-hero--contact .be-hero__title .elementor-heading-title,
.be-hero--contact .be-hero__lead {
	max-width: 30ch;
	margin-inline: auto;
}

.be-hero--contact .be-hero__lead {
	max-width: 62ch;
}

.be-hero--contact .be-badges {
	justify-content: center;
}

.be-hero--contact .elementor-widget-wrap > .elementor-widget-button {
	margin-right: var(--be-space-md);
	margin-left: var(--be-space-md);
}

/* --- Hero responsive --- */
@media (max-width: 1024px) {
	.be-hero .be-hero__title .elementor-heading-title {
		max-width: none;
	}

	/* Le cadre décalé n'a plus de place une fois les colonnes
	 * rapprochées. */
	.be-hero__side .elementor-widget-wrap::before {
		content: none;
	}

	/* De même pour la fiche : sur une colonne étroite elle déborderait
	 * sur le texte au lieu de relier les deux colonnes. Elle repasse
	 * dans le flux, sous la photo. */
	.be-hero .be-hero__stat {
		position: static;
		max-width: none;
		margin-top: var(--be-space-md);
	}
}

@media (max-width: 767px) {
	.be-hero .be-hero__lead {
		font-size: var(--be-fs-base);
	}

	.be-hero__side {
		margin-top: var(--be-space-xl);
	}
}

@media (max-width: 600px) {
	.be-hero .elementor-widget-wrap > .elementor-widget-button {
		display: flex;
		width: 100%;
		max-width: none;
		margin-right: 0;
		margin-left: 0;
	}

	/*
	 * Les deux appels s'empilent, tous les deux en pleine largeur.
	 *
	 * Le second etait « width: auto » du temps ou il s'agissait d'un
	 * lien souligne : le laisser ainsi maintenant qu'il est un bouton
	 * donnerait une pile bancale, un bloc large surmontant un bloc
	 * etroit. Leur marge haute suffit a les espacer.
	 */
	.be-hero .be-hero__cta .elementor-button,
	.be-hero .be-hero__cta--ghost .elementor-button {
		width: 100%;
	}
}
/* ------------------------------------------------------------------
 * 8c. PAGE CONTACT
 * Balisage : scripts/build-contact.php.
 * Modèle conta.cubical.ro/contact/ : le formulaire est l'objet
 * principal. Il est posé dans une carte blanche surélevée, les
 * coordonnées tiennent dans un panneau sombre à droite qui reste
 * visible au défilement — le contraste clair / sombre distingue les
 * deux façons de nous joindre sans ajouter de cloisons.
 * ---------------------------------------------------------------- */
.be-contact > .elementor-container {
	align-items: start;
}

.be-contact .be-sec__head {
	margin-bottom: var(--be-space-lg);
}

/* --- Formulaire ---
 * Fluent Forms rend une suite plate de .ff-el-group dans un
 * <fieldset>. On en fait une grille à deux colonnes : les champs
 * courts s'apparient dans l'ordre du balisage, seuls le message et le
 * bouton occupent toute la largeur. Neuf champs empilés faisaient une
 * colonne interminable ; en deux colonnes le formulaire tient dans un
 * écran.
 */
.be-contact__form {
	margin-top: 0;
}

.be-contact__form .fluentform {
	position: relative;
	background-color: #fff;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	box-shadow: var(--be-shadow-md);
	padding: clamp(1.25rem, 3vw, 2.5rem);
}

/* Filet de couleur en tête de carte : rattache le formulaire à la
 * marque sans peindre tout le bloc. */
.be-contact__form .fluentform::before {
	content: "";
	position: absolute;
	inset-inline: -1px;
	top: -1px;
	height: 4px;
	background-image: linear-gradient(90deg, var(--be-baltic), var(--be-yale));
	border-radius: var(--be-radius-lg) var(--be-radius-lg) 0 0;
}

.be-contact__form .fluentform form > fieldset {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	column-gap: var(--be-space-md);
	row-gap: var(--be-space-md);
}

.be-contact__form .ff_screen_reader_title {
	grid-column: 1 / -1;
}

.be-contact__form .ff-el-group {
	margin-bottom: 0;
	min-width: 0;
}

/* Message et bouton : pleine largeur. */
.be-contact__form .ff-el-group:has(textarea),
.be-contact__form .ff_submit_btn_wrapper {
	grid-column: 1 / -1;
}

.be-contact__form .ff_submit_btn_wrapper {
	padding-top: var(--be-space-sm);
	border-top: 1px solid var(--be-oak-200);
}

@media (max-width: 575px) {
	.be-contact__form .fluentform form > fieldset {
		grid-template-columns: minmax(0, 1fr);
	}
}

.be-contact__form .ff-el-input--label label {
	display: inline-block;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	line-height: 1.3;
	color: var(--be-charcoal);
	margin-bottom: 0.4rem;
}

/* L'astérisque des champs obligatoires : lisible sans crier. */
.be-contact__form .ff-el-is-required label::after {
	color: #a3301f;
	font-weight: 700;
	margin-left: 0.15em;
}

.be-contact__form .ff-el-form-control {
	width: 100%;
	min-height: 48px;
	font-family: var(--be-font-body);
	font-size: var(--be-fs-base);
	color: var(--be-charcoal);
	background-color: #fdfcfb;
	border: 1px solid var(--be-oak);
	border-radius: var(--be-radius);
	padding: 0.7rem 0.9rem;
	line-height: 1.45;
	transition: border-color var(--be-transition), box-shadow var(--be-transition),
		background-color var(--be-transition);
}

.be-contact__form .ff-el-form-control::placeholder {
	color: #8a9186;
}

.be-contact__form .ff-el-form-control:hover {
	border-color: var(--be-text-muted);
}

.be-contact__form .ff-el-form-control:focus {
	background-color: #fff;
	border-color: var(--be-baltic);
	box-shadow: 0 0 0 3px rgba(20, 92, 158, 0.16);
	outline: none;
}

/* Listes déroulantes : chevron dessiné plutôt que la flèche du
 * système, qui ne suit pas la palette. */
.be-contact__form select.ff-el-form-control {
	appearance: none;
	-webkit-appearance: none;
	padding-right: 2.5rem;
	background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%235a6356' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
	background-repeat: no-repeat;
	background-position: right 0.85rem center;
	background-size: 18px 18px;
	cursor: pointer;
}

/* Tant que « - Sélectionner - » est choisi, le champ se lit comme un
 * espace réservé et non comme une réponse. */
.be-contact__form select.ff-el-form-control:has(option[value=""]:checked) {
	color: #8a9186;
}

.be-contact__form textarea.ff-el-form-control {
	min-height: 150px;
	resize: vertical;
}

.be-contact__form .ff-btn-submit {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 0.6rem;
	background-color: var(--be-action);
	border: 1px solid var(--be-action);
	color: #fff;
	font-family: var(--be-font-body);
	font-size: var(--be-fs-base);
	font-weight: 600;
	letter-spacing: 0.01em;
	border-radius: var(--be-radius);
	padding: 0.95rem 2.2rem;
	min-height: 52px;
	cursor: pointer;
	box-shadow: 0 6px 16px rgba(20, 92, 158, 0.22);
	transition: background-color var(--be-transition), box-shadow var(--be-transition),
		transform var(--be-transition);
}

.be-contact__form .ff-btn-submit:hover,
.be-contact__form .ff-btn-submit:focus-visible {
	background-color: var(--be-action-hover);
	border-color: var(--be-action-hover);
	box-shadow: 0 10px 22px rgba(20, 92, 158, 0.28);
	transform: translateY(-1px);
}

.be-contact__form .ff-btn-submit:active {
	transform: translateY(0);
	box-shadow: 0 4px 12px rgba(20, 92, 158, 0.22);
}

@media (max-width: 575px) {
	.be-contact__form .ff-btn-submit {
		width: 100%;
	}
}

.be-contact__form .error.text-danger {
	font-size: var(--be-fs-xs);
	color: #a3301f;
	margin-top: 0.3rem;
}

.be-contact__form .ff-el-group:has(.error.text-danger) .ff-el-form-control {
	border-color: #a3301f;
}

/* --- Fiche coordonnées ---
 * Grille à deux colonnes : l'icône occupe la gouttière, le libellé et
 * la valeur restent alignés entre eux.
 */
.be-ccard {
	background-color: var(--be-almond-200);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	padding: clamp(1.1rem, 2.4vw, 1.6rem);
}

.be-ccard--plain {
	background-color: transparent;
	border: 0;
	padding: 0;
}

/* Variante sombre : la colonne des coordonnées, en vis-à-vis de la
 * carte blanche du formulaire. */
.be-ccard--dark {
	background-color: var(--be-yale);
	border-color: var(--be-yale);
	color: var(--be-oak-100);
	box-shadow: var(--be-shadow-md);
	padding: clamp(1.3rem, 2.6vw, 1.9rem);
}

.be-ccard__title {
	margin: 0 0 var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	color: var(--be-charcoal);
}

.be-ccard--dark .be-ccard__title {
	color: #fff;
}

/* --- Appel direct et WhatsApp ---
 * La barre de contact flottante (8e) ne s'affiche pas sur la page
 * Contact : ces deux boutons sont donc le seul accès au téléphone et à
 * WhatsApp de la page. Ils passent avant la fiche d'adresse.
 */
.be-ccard__acts {
	display: grid;
	gap: 0.6rem;
	margin-bottom: var(--be-space-lg);
}

.be-ccard__tel,
.be-ccard__wa {
	display: grid;
	grid-template-columns: 24px 1fr;
	column-gap: 0.75rem;
	row-gap: 0.1rem;
	align-items: center;
	padding: 0.85rem 1rem;
	border-radius: var(--be-radius);
	text-decoration: none;
	transition: background-color var(--be-transition), border-color var(--be-transition),
		transform var(--be-transition);
}

.be-ccard__tel {
	background-color: rgba(255, 255, 255, 0.08);
	border: 1px solid rgba(255, 255, 255, 0.18);
}

.be-ccard__tel:hover,
.be-ccard__tel:focus-visible {
	background-color: rgba(255, 255, 255, 0.14);
	border-color: rgba(255, 255, 255, 0.3);
	transform: translateY(-1px);
}

.be-ccard__tel .be-ico,
.be-ccard__wa .be-ico {
	grid-row: span 2;
	margin-top: 0;
}

.be-ccard__tel .be-ico {
	color: var(--be-oak);
}

.be-ccard__tel-lbl {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: rgba(247, 244, 241, 0.68);
}

.be-ccard__tel-num {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 700;
	line-height: 1.15;
	color: #fff;
	font-variant-numeric: tabular-nums;
}

/* WhatsApp : même panneau que le téléphone, la marque dans le seul
 * pictogramme.
 *
 * Ce pavé était un aplat de vert WhatsApp pleine largeur. Trois défauts,
 * dans cet ordre :
 *
 *   1. C'était la seule couleur saturée de la page. La charte tient sur
 *      deux bleus froids et deux neutres chauds (design/color-palette.md) ;
 *      un vert à 100 % de saturation posé au milieu n'en fait pas partie
 *      et tirait l'œil avant tout le reste, titre compris.
 *   2. Il écrasait le téléphone. Les deux tuiles disent la même chose —
 *      « joignez-nous directement » — mais l'une était un bouton plein et
 *      l'autre un panneau discret. Le numéro est pourtant le canal
 *      principal, pas le second.
 *   3. Il annonçait une action plus engageante qu'elle ne l'est : un
 *      aplat de cette taille se lit comme l'appel à l'action de la page,
 *      alors que le formulaire est juste à côté.
 *
 * WhatsApp se reconnaît à sa bulle, pas à son rectangle vert — c'est déjà
 * le parti pris de la barre de contact flottante (8e), où la marque tient
 * dans une pastille. Le vert reste donc, réduit au pictogramme : 4,8:1
 * contre le fond Yale, très au-delà des 3:1 exigés d'un élément graphique.
 */
.be-ccard__wa {
	background-color: rgba(255, 255, 255, 0.08);
	border: 1px solid rgba(255, 255, 255, 0.18);
}

.be-ccard__wa:hover,
.be-ccard__wa:focus-visible {
	background-color: rgba(255, 255, 255, 0.14);
	border-color: rgba(255, 255, 255, 0.3);
	transform: translateY(-1px);
}

/* Le vert de marque, et lui seul.
 *
 * Le sélecteur porte « .be-ccard--dark » parce que la règle qui met tous
 * les pictogrammes de la carte sombre en Pale Oak a cette portée-là : à
 * spécificité égale, elle est écrite plus bas et l'emportait. */
.be-ccard--dark .be-ccard__wa .be-ico {
	color: #25d366;
}

.be-ccard__wa-txt {
	font-size: var(--be-fs-sm);
	font-weight: 600;
	line-height: 1.35;
	color: rgba(247, 244, 241, 0.92);
}

/* --- Régions desservies, en pastilles ---
 * Huit noms de région alignés en phrase font un pavé qu'on ne lit pas ;
 * en pastilles on les compte d'un coup d'œil.
 */
/* Portée à « .be-ccard » volontairement : « .be-zones » est aussi la
 * racine de la section « zones d'intervention » de la page d'accueil
 * (section 8m, balisage inc/zones.php), qui n'a rien à voir avec ces
 * pastilles. Les deux se sont déjà marché dessus une fois — une mise en
 * grille écrite pour la section d'accueil étirait ici les huit pastilles
 * en barres pleine largeur.
 *
 * C'est la même collision que celle qui avait imposé de renommer
 * « .be-steps » en « .be-flow » (section 8h). La vraie correction est de
 * renommer l'un des deux composants ; en attendant, cette portée empêche
 * l'accident de se reproduire dans ce sens-là. */
.be-ccard .be-zones {
	display: flex;
	flex-wrap: wrap;
	gap: 0.35rem;
	margin-top: 0.15rem;
}

.be-zones__chip {
	font-family: var(--be-font-body);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	line-height: 1.2;
	padding: 0.28rem 0.6rem;
	border-radius: var(--be-radius-pill);
	background-color: rgba(20, 92, 158, 0.08);
	border: 1px solid rgba(20, 92, 158, 0.2);
	color: var(--be-baltic-700);
	white-space: nowrap;
}

.be-ccard--dark .be-zones__chip {
	background-color: rgba(255, 255, 255, 0.1);
	border-color: rgba(255, 255, 255, 0.2);
	color: var(--be-oak-100);
}
.be-ccard__list {
	list-style: none;
	margin: 0;
	padding: 0;
	display: grid;
	gap: var(--be-space-md);
}

.be-ccard__list li {
	display: grid;
	grid-template-columns: 24px 1fr;
	column-gap: 0.75rem;
	row-gap: 0.1rem;
	align-items: start;
	margin: 0;
	padding-bottom: var(--be-space-md);
	border-bottom: 1px solid var(--be-oak-200);
}

.be-ccard--plain .be-ccard__list li {
	border-bottom-color: var(--be-border);
}

.be-ccard--dark .be-ccard__list li {
	border-bottom-color: rgba(247, 244, 241, 0.16);
}

.be-ccard__list li:last-child {
	padding-bottom: 0;
	border-bottom: 0;
}

.be-ico {
	grid-row: span 2;
	width: 20px;
	height: 20px;
	margin-top: 0.2rem;
	color: var(--be-baltic);
}

.be-ccard--dark .be-ico {
	color: var(--be-oak);
}

.be-ccard__lbl {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-ccard--dark .be-ccard__lbl {
	color: rgba(247, 244, 241, 0.68);
}

.be-ccard__val {
	font-size: var(--be-fs-lg);
	font-weight: 600;
	line-height: 1.35;
	color: var(--be-charcoal);
	text-decoration: none;
	font-variant-numeric: tabular-nums;
}

.be-ccard--dark .be-ccard__val {
	color: var(--be-oak-100);
}

.be-ccard__val--sm {
	font-size: var(--be-fs-sm);
	font-weight: 500;
	color: var(--be-text-muted);
}

.be-ccard--dark .be-ccard__val--sm {
	color: rgba(247, 244, 241, 0.78);
}

a.be-ccard__val:hover,
a.be-ccard__val:focus {
	color: var(--be-baltic-700);
}

.be-ccard--dark a.be-ccard__val:hover,
.be-ccard--dark a.be-ccard__val:focus {
	color: #fff;
}

.be-ccard__social {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	margin-top: var(--be-space-lg);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	color: var(--be-baltic-700);
	text-decoration: none;
	border-bottom: 1px solid currentColor;
	padding-bottom: 2px;
}

.be-ccard__social .be-ico--inline {
	width: 18px;
	height: 18px;
	flex: 0 0 auto;
	margin: 0;
}

.be-ccard--dark .be-ccard__social {
	color: var(--be-oak);
	border-bottom-color: rgba(203, 185, 168, 0.55);
}

.be-ccard--dark .be-ccard__social:hover,
.be-ccard--dark .be-ccard__social:focus {
	color: #fff;
	border-bottom-color: #fff;
}

/* Le panneau suit le défilement tant que le formulaire est plus haut
 * que lui ; sous 992 px il repasse simplement sous le formulaire. */
@media (min-width: 992px) {
	.be-contact__side > .elementor-widget-wrap {
		position: sticky;
		top: calc(var(--be-header-h) + var(--be-space-md));
	}
}


/* --- Étapes, variante sur fond clair --- */
.be-steps--light .be-step {
	border-top-color: var(--be-oak);
}

.be-steps--light .be-step__num {
	background-color: var(--be-baltic);
	color: #fff;
}

.be-steps--light .be-step__title {
	color: var(--be-charcoal);
}

.be-steps--light .be-step__text {
	color: var(--be-text-muted);
}

/* --- Nous trouver : adresse + plan --- */
.be-contact--trouver {
	align-items: center;
}

.be-contact__map iframe,
.be-contact__map .elementor-custom-embed {
	width: 100%;
	min-height: 320px;
	border-radius: var(--be-radius-lg);
	border: 1px solid var(--be-border);
	overflow: hidden;
}

@media (max-width: 767px) {
	.be-contact__side,
	.be-contact__mapcol {
		margin-top: var(--be-space-xl);
	}
}

/* ------------------------------------------------------------------
 * 8c bis. REPRISES DE MISE EN FORME
 * Ces blocs réécrivent des composants définis plus haut ; placés
 * ici, ils l'emportent sans recourir à !important.
 * ---------------------------------------------------------------- */

/* --- Galerie projets : mosaïque ---
 * Balisage produit par be_pj_mosaique() dans scripts/build-projets.php,
 * à la place du widget « galerie » d'Elementor : celui-ci sortait le
 * balisage natif de WordPress, des colonnes flottantes à 25 % dans
 * lesquelles les vignettes restaient à leur taille d'origine. Sur du
 * béton, une vignette de 70 px ne montre rien — c'est la matière qu'on
 * vient juger.
 *
 * Toutes les photos sont au format 4/3 : une grille régulière donnait
 * un damier monotone sur 36 ou 73 images. Le motif de be_pj_mosaique()
 * alterne une grande cellule (2×2), une large (2×1) et six normales,
 * soit douze cellules par groupe de huit photos — exactement trois
 * rangées de quatre colonnes.
 */
.be-mosaic {
	display: grid;
	grid-template-columns: repeat(2, 1fr);
	grid-auto-rows: 150px;
	/* « dense » revient en arrière remplir les trous laissés par les
	 * grandes cellules en fin de série. */
	grid-auto-flow: row dense;
	gap: var(--be-space-xs);
	margin: 0;
	padding: 0;
	list-style: none;
}

@media (min-width: 640px) {
	.be-mosaic {
		grid-template-columns: repeat(3, 1fr);
		grid-auto-rows: 170px;
	}
}

@media (min-width: 1000px) {
	.be-mosaic {
		grid-template-columns: repeat(4, 1fr);
		grid-auto-rows: 190px;
		gap: var(--be-space-sm);
	}
}

.be-mosaic__item {
	margin: 0;
	padding: 0;
	min-width: 0;
}

.be-mosaic__item--xl {
	grid-column: span 2;
	grid-row: span 2;
}

.be-mosaic__item--wide {
	grid-column: span 2;
}

.be-mosaic__link {
	position: relative;
	display: block;
	width: 100%;
	height: 100%;
	overflow: hidden;
	border-radius: var(--be-radius);
	background-color: var(--be-oak-200);
}

.be-mosaic__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
	border: 0;
	border-radius: 0;
	box-shadow: none;
	transition: transform 420ms cubic-bezier(0.4, 0, 0.2, 1);
}

/* Loupe au survol : indique que la photo s'ouvre, sans recouvrir
 * l'image d'un voile qui en masquerait la matière. */
.be-mosaic__zoom {
	position: absolute;
	inset-block-end: 8px;
	inset-inline-end: 8px;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background-color: rgba(255, 255, 255, 0.92);
	box-shadow: var(--be-shadow-sm);
	opacity: 0;
	transform: scale(0.8);
	transition: opacity var(--be-transition), transform var(--be-transition);
}

.be-mosaic__zoom::before,
.be-mosaic__zoom::after {
	content: "";
	position: absolute;
	background-color: var(--be-charcoal);
}

.be-mosaic__zoom::before {
	inset-block-start: 14px;
	inset-inline-start: 9px;
	width: 12px;
	height: 2px;
}

.be-mosaic__zoom::after {
	inset-block-start: 9px;
	inset-inline-start: 14px;
	width: 2px;
	height: 12px;
}

.be-mosaic__link:hover .be-mosaic__img,
.be-mosaic__link:focus-visible .be-mosaic__img {
	transform: scale(1.06);
}

.be-mosaic__link:hover .be-mosaic__zoom,
.be-mosaic__link:focus-visible .be-mosaic__zoom {
	opacity: 1;
	transform: scale(1);
}

.be-mosaic__link:focus-visible {
	outline: 3px solid var(--be-baltic);
	outline-offset: 2px;
}

@media (prefers-reduced-motion: reduce) {
	.be-mosaic__img,
	.be-mosaic__zoom {
		transition: none;
	}

	.be-mosaic__link:hover .be-mosaic__img,
	.be-mosaic__link:focus-visible .be-mosaic__img {
		transform: none;
	}
}

/* --- FAQ : rail à gauche, questions à droite ---
 * Onze questions dans un accordéon pleine largeur faisaient
 * disparaître le titre de section dès la première ouverture, et la
 * relance « demandez un devis » se retrouvait à plus d'un écran du
 * haut de la section. Le rail garde les deux sous les yeux.
 */
.be-qa {
	display: grid;
	gap: clamp(1.75rem, 4vw, 3.5rem);
}

@media (min-width: 900px) {
	.be-qa {
		grid-template-columns: minmax(0, 0.78fr) minmax(0, 1.22fr);
		align-items: start;
	}

	.be-qa__rail {
		position: sticky;
		/* Sous l'en-tête collant, sinon le rail passe dessous. */
		top: calc(var(--be-header-h) + var(--be-space-md));
	}
}

.be-qa__rail .be-sec__head {
	margin-bottom: var(--be-space-lg);
}

.be-qa__cta {
	padding: var(--be-space-md) var(--be-space-md) var(--be-space-md) var(--be-space-lg);
	border-left: 3px solid var(--be-baltic);
	background-color: var(--be-bg);
	border-radius: 0 var(--be-radius) var(--be-radius) 0;
}

.be-qa__cta-text {
	margin: 0 0 0.3rem;
	font-weight: 700;
	color: var(--be-charcoal);
}

.be-qa__cta-link {
	font-weight: 600;
	color: var(--be-link);
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

.be-qa__cta-link::after {
	content: " \2192";
	text-decoration: none;
}

.be-faq {
	max-width: none;
	border-top: 1px solid var(--be-border);
}

.be-faq__q {
	align-items: center;
	gap: var(--be-space-md);
	padding: var(--be-space-md) 0;
	font-size: var(--be-fs-lg);
	font-weight: 700;
	letter-spacing: -0.015em;
}

/* Numéro : donne une prise pour se repérer dans une liste longue,
 * et une amorce visuelle constante à gauche des questions. */
.be-faq__num {
	flex: 0 0 auto;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	color: var(--be-oak);
	font-variant-numeric: tabular-nums;
	transition: color var(--be-transition);
}

.be-faq__txt {
	flex: 1 1 auto;
	min-width: 0;
}

.be-faq__item[open] .be-faq__num {
	color: var(--be-baltic);
}

.be-faq__item[open] .be-faq__q {
	color: var(--be-baltic-700);
}

/* La réponse s'aligne sur le texte de la question, pas sur le numéro.
 * Seulement à partir de 900 px : sur un écran étroit, l'alinéa coûte
 * plus de largeur qu'il n'apporte de lisibilité. */
@media (min-width: 900px) {
	.be-qa .be-faq__a {
		padding-left: 2.75rem;
	}
}

.be-faq__q::after {
	width: 32px;
	height: 32px;
	display: inline-flex;
	align-items: center;
	justify-content: center;
	border-radius: 50%;
	border: 1px solid var(--be-oak);
	font-size: 1.1rem;
	color: var(--be-baltic);
	transition: background-color var(--be-transition), color var(--be-transition);
}

.be-faq__item[open] .be-faq__q::after {
	background-color: var(--be-baltic);
	border-color: var(--be-baltic);
	color: #fff;
}

.be-faq__a {
	padding: 0 0 var(--be-space-lg);
	max-width: 72ch;
	font-size: var(--be-fs-base);
}

@media (min-width: 900px) {
	.be-faq__a {
		padding-left: 0;
	}
}

/* ------------------------------------------------------------------
 * 8d. SECTIONS DE LA PAGE D'ACCUEIL
 * Balisage produit par scripts/build-home.php.
 * Rythme voulu : clair, chaud, clair, sombre, chaud, clair, chaud, clair
 * — les sections se distinguent par le fond, sans multiplier les cartes.
 * L'aide au choix (8k) occupe le troisième temps, en clair : posée entre
 * le catalogue chaud et les étapes sombres, elle sépare deux fonds
 * appuyés qui se toucheraient sinon. Les comparateurs reprennent le fond
 * chaud juste après les étapes, pour rouvrir la page après son seul
 * aplat sombre.
 * ---------------------------------------------------------------- */
.elementor-section.be-sec {
	padding-block: clamp(3rem, 7vw, 5.5rem);
}

.be-sec--warm {
	background-color: var(--be-almond-200);
}

.be-sec--dark {
	background-color: var(--be-yale);
	color: var(--be-oak-100);
}

.be-sec .be-block {
	color: inherit;
}

/* --- En-tête de section --- */
.be-sec__head {
	max-width: 62ch;
	margin-bottom: clamp(1.75rem, 4vw, 2.75rem);
}

.be-sec__kicker {
	display: flex;
	align-items: center;
	gap: 0.7rem;
	margin: 0 0 var(--be-space-sm);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--be-yale);
}

.be-sec__kicker::before {
	content: "";
	width: 28px;
	height: 2px;
	background-color: var(--be-baltic);
	flex: 0 0 auto;
}

.be-sec--dark .be-sec__kicker {
	color: var(--be-oak);
}

.be-sec--dark .be-sec__kicker::before {
	background-color: var(--be-oak);
}

.be-sec__title {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: clamp(1.7rem, 3.2vw, 2.4rem);
	line-height: 1.12;
	letter-spacing: -0.025em;
	color: inherit;
}

/* Ce titre n'a ni trait avant, ni trait après.
 *
 * « .be-sec__head » porte déjà son propre repère : le sur-titre et son
 * tiret. Or les sections bâties avec ce composant sont aussi posées dans
 * le fil de lecture des pages de finition, où tout « h2 » reçoit un tiret
 * bleu en « ::before ». Résultat : deux tirets empilés au-dessus du même
 * titre, celui du sur-titre puis celui de l'article. */
.be-sec__title::after,
.be-sec__title::before {
	content: none;
}

.be-sec__lead {
	margin: var(--be-space-md) 0 0;
	font-size: var(--be-fs-lg);
	line-height: 1.55;
	color: var(--be-text-muted);
}

.be-sec--dark .be-sec__lead {
	color: rgba(247, 244, 241, 0.8);
}

.be-sec__more {
	margin: var(--be-space-lg) 0 0;
	font-size: var(--be-fs-sm);
}

.be-sec__more a {
	font-weight: 600;
	text-decoration: none;
	border-bottom: 1px solid currentColor;
	padding-bottom: 1px;
}

/* --- Grilles de cartes --- */
.be-cards {
	display: grid;
	gap: var(--be-space-lg);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-cards--3 {
	grid-template-columns: repeat(auto-fit, minmax(270px, 1fr));
}

/* Atouts : un filet, pas un encadré plein. Une carte par bloc
 * aplatirait la hiérarchie de la page. */
.be-card {
	margin: 0;
	padding-top: var(--be-space-md);
	border-top: 2px solid var(--be-oak);
}

.be-card__title {
	margin: 0 0 0.4rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.25;
	letter-spacing: -0.015em;
	color: inherit;
}

.be-card__title::after {
	content: none;
}

.be-card__text {
	margin: 0;
	font-size: var(--be-fs-sm);
	line-height: 1.6;
	color: var(--be-text-muted);
}

/* --- Cartes finitions : celles-ci sont bien des objets --- */
.be-cards--media .be-card--media {
	display: flex;
	flex-direction: column;
	padding-top: 0;
	border-top: 0;
	background-color: #fff;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	overflow: hidden;
	transition: transform var(--be-transition), box-shadow var(--be-transition);
}

.be-cards--media .be-card--media:hover,
.be-cards--media .be-card--media:focus-within {
	transform: translateY(-3px);
	box-shadow: var(--be-shadow-md);
}

.be-card__media {
	display: block;
	aspect-ratio: 4 / 3;
	overflow: hidden;
	background-color: var(--be-oak-200);
}

.be-card__media img {
	width: 100%;
	height: 100%;
	max-width: 100%;
	object-fit: cover;
	display: block;
	border-radius: 0;
	box-shadow: none;
	transition: transform 320ms cubic-bezier(0.4, 0, 0.2, 1);
}

.be-card--media:hover .be-card__media img {
	transform: scale(1.04);
}

.be-card__body {
	display: flex;
	flex-direction: column;
	gap: 0.45rem;
	padding: var(--be-space-md);
	flex: 1 1 auto;
}

.be-card__body .be-card__title a {
	color: var(--be-charcoal);
	text-decoration: none;
}

.be-card__body .be-card__title a:hover,
.be-card__body .be-card__title a:focus {
	color: var(--be-baltic-700);
}

/* Prix plancher : la donnée la plus regardée de la carte. */
.be-card__price {
	margin: 0;
	align-self: flex-start;
	padding: 0.2rem 0.6rem;
	border-radius: 999px;
	background-color: var(--be-almond-200);
	border: 1px solid var(--be-oak);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	color: var(--be-charcoal);
	font-variant-numeric: tabular-nums;
}

.be-card__link {
	margin-top: auto;
	padding-top: var(--be-space-xs);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	color: var(--be-baltic-700);
	text-decoration: none;
}

.be-card__link::after {
	content: " \2192";
}

.be-card__link:hover,
.be-card__link:focus {
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

/* --- Étapes de chantier ---
 * Numérotées parce que c'est une vraie séquence : l'ordre porte une
 * information, contrairement aux atouts ci-dessus.
 */
.be-steps {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
	gap: var(--be-space-lg);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-step {
	position: relative;
	margin: 0;
	padding-top: var(--be-space-md);
	border-top: 1px solid rgba(247, 244, 241, 0.3);
}

.be-step__num {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 2rem;
	height: 2rem;
	margin-bottom: var(--be-space-sm);
	border-radius: 50%;
	background-color: var(--be-oak-100);
	color: var(--be-yale);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 800;
	font-variant-numeric: tabular-nums;
}

.be-step__title {
	margin: 0 0 0.35rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.25;
	color: #fff;
}

.be-step__title::after {
	content: none;
}

.be-step__text {
	margin: 0;
	font-size: var(--be-fs-sm);
	line-height: 1.6;
	color: rgba(247, 244, 241, 0.8);
}

/* --- Réalisations --- */
.be-projects {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	gap: var(--be-space-lg);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-project {
	margin: 0;
}

.be-project a {
	position: relative;
	display: block;
	border-radius: var(--be-radius-lg);
	overflow: hidden;
	text-decoration: none;
	box-shadow: var(--be-shadow-sm);
	transition: transform var(--be-transition), box-shadow var(--be-transition);
}

.be-project a:hover,
.be-project a:focus-visible {
	transform: translateY(-3px);
	box-shadow: var(--be-shadow-md);
}

.be-project img {
	display: block;
	width: 100%;
	max-width: 100%;
	aspect-ratio: 16 / 10;
	object-fit: cover;
	border-radius: 0;
	box-shadow: none;
}

.be-project__label {
	position: absolute;
	left: 0;
	right: 0;
	bottom: 0;
	padding: var(--be-space-lg) var(--be-space-md) var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	color: #fff;
	background: linear-gradient(to top, rgba(31, 39, 27, 0.88), rgba(31, 39, 27, 0));
}

/* --- Logos partenaires ---
 * Les cinq fichiers sont des carrés de 400 px dont la marque n'occupe
 * qu'une fraction : bornés par la seule hauteur, ils se réduisaient à
 * une dizaine de pixels utiles. Deux sont de surcroît des JPEG sur
 * fond blanc, qui se découpaient en rectangles clairs sur le fond
 * chaud de la section, à côté de trois PNG transparents.
 * La tuile blanche règle les deux : gabarit commun, et le fond blanc
 * des JPEG se fond dans celui de la tuile.
 */
.be-part {
	display: grid;
	gap: clamp(1.75rem, 4vw, 2.5rem);
}

/* Un élément de grille ne descend pas sous son contenu minimal sans
 * qu'on l'y autorise : les groupes de logos débordaient la colonne. */
.be-part > * {
	min-width: 0;
}

.be-part__group + .be-part__group {
	padding-top: clamp(1.5rem, 4vw, 2.25rem);
	border-top: 1px solid var(--be-oak);
}

.be-part__lbl {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-part__lbl::after {
	content: none;
}

.be-part__text {
	margin: 0.4rem 0 0;
	font-size: var(--be-fs-sm);
	color: var(--be-text-muted);
}

.be-logos {
	display: grid;
	/* « min(170px, 100%) » et non « 170px » : un minimum fixe rend la
	 * largeur minimale de la grille égale à trois tuiles, soit 544 px.
	 * Dans les 355 px d'une colonne de téléphone, la piste débordait et
	 * entraînait la page entière — l'accueil défilait de 179 px sur le
	 * côté. Avec « min() », la tuile descend sous 170 px quand il le
	 * faut, et les tuiles se replient normalement. */
	grid-template-columns: repeat(auto-fill, minmax(min(170px, 100%), 1fr));
	gap: var(--be-space-md);
	margin: var(--be-space-md) 0 0;
	padding: 0;
	list-style: none;
	/* Trois tuiles suffisent à tenir la rangée ; au-delà, elles
	 * s'étireraient sur toute la largeur pour rien. Borné aussi par
	 * « 100% » : sans cela, la piste de « .be-part » se dimensionnait
	 * sur les 620 px et sortait du conteneur en mobile. */
	max-width: min(620px, 100%);
}

.be-logo {
	display: flex;
	align-items: center;
	justify-content: center;
	margin: 0;
	/* Marge interne serrée : les fichiers sont des carrés de 400 px
	 * qui portent déjà leur propre blanc tournant. Un rembourrage
	 * généreux s'ajoutait au leur et réduisait la marque d'autant. */
	padding: var(--be-space-sm);
	aspect-ratio: 4 / 3;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: #fff;
	transition: border-color var(--be-transition), box-shadow var(--be-transition);
}

.be-logo:hover {
	border-color: var(--be-oak);
	box-shadow: var(--be-shadow-sm);
}

.be-logos img {
	display: block;
	width: auto;
	height: auto;
	max-width: 100%;
	max-height: 100%;
	object-fit: contain;
	border-radius: 0;
	box-shadow: none;
	/* Les logos partenaires ne doivent pas concurrencer la palette ;
	 * la couleur revient au survol. */
	filter: grayscale(1);
	opacity: 0.72;
	transition: filter var(--be-transition), opacity var(--be-transition);
}

.be-logo:hover img {
	filter: grayscale(0);
	opacity: 1;
}

/* --- FAQ : <details> natif, accessible au clavier sans JavaScript --- */
.be-faq {
	max-width: 76ch;
	border-top: 1px solid var(--be-border);
}

.be-faq__item {
	border-bottom: 1px solid var(--be-border);
}

.be-faq__q {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: var(--be-space-md);
	padding: var(--be-space-md) 0;
	cursor: pointer;
	list-style: none;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.35;
	color: var(--be-charcoal);
	transition: color var(--be-transition);
}

.be-faq__q::-webkit-details-marker {
	display: none;
}

.be-faq__q::after {
	content: "+";
	flex: 0 0 auto;
	font-size: 1.4em;
	line-height: 1;
	color: var(--be-baltic);
}

.be-faq__item[open] .be-faq__q::after {
	content: "\2212";
}

.be-faq__q:hover,
.be-faq__q:focus-visible {
	color: var(--be-baltic-700);
}

.be-faq__a {
	padding: 0 0 var(--be-space-md);
	max-width: 68ch;
}

.be-faq__a p {
	margin: 0;
	color: var(--be-text-muted);
	line-height: 1.7;
}

@media (max-width: 600px) {
	.be-sec__lead {
		font-size: var(--be-fs-base);
	}

	.be-faq__q {
		font-size: var(--be-fs-base);
	}
}

/* ------------------------------------------------------------------
 * 8e. BARRE DE CONTACT FLOTTANTE
 * Balisage : inc/dock.php.
 * Capsule blanche, comme l'en-tête : le site ne porte plus qu'une
 * seule forme flottante, en haut et en bas. La version sombre
 * précédente empilait trois boutons de trois couleurs sans
 * hiérarchie — le regard ne savait pas lequel était l'action.
 * Ici : le téléphone en lien texte, WhatsApp réduit à sa pastille de
 * marque, un seul bouton plein, et la croix rentrée dans la capsule.
 * ---------------------------------------------------------------- */
.be-dock {
	position: fixed;
	left: 50%;
	bottom: 22px;
	z-index: 9990;
	transform: translate(-50%, 140%);
	opacity: 0;
	pointer-events: none;
	transition: transform 0.55s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.4s ease;
}

.be-dock.is-on {
	transform: translate(-50%, 0);
	opacity: 1;
	pointer-events: auto;
}

/* Fond Yale Blue : la palette réserve cette teinte aux bandes —
 * pied de page, bandeaux d'appel à l'action — et c'en est une.
 * Conséquence à assumer : Baltic Blue ne tient pas sur Yale (1,30:1,
 * le piège n° 2 de design/color-palette.md), donc le bouton principal
 * s'inverse ici en clair sur foncé. C'est le seul endroit du site où
 * il n'est pas bleu. */
.be-dock__box {
	display: flex;
	align-items: center;
	gap: var(--be-space-md);
	padding: 0.5rem 0.6rem 0.5rem var(--be-space-lg);
	border: 1px solid var(--be-yale-700);
	border-radius: var(--be-radius-xl);
	background-color: var(--be-dark);
	box-shadow: var(--be-shadow-lg);
}

/* --- Accroche --- */
.be-dock__intro {
	display: flex;
	align-items: center;
	gap: var(--be-space-sm);
}

/* Pastille d'icône : une bulle de message, parce que l'accroche est
 * une question. Fond Yale foncé plutôt qu'un aplat bleu vif — la
 * version d'avant posait là une tuile Baltic de 44 px qui pesait plus
 * lourd que le bouton d'action lui-même. */
.be-dock__ico {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 38px;
	height: 38px;
	flex: 0 0 auto;
	border-radius: var(--be-radius-pill);
	background-color: var(--be-yale-700);
	color: var(--be-almond);
}

.be-dock__ico svg {
	width: 19px;
	height: 19px;
}

.be-dock__txt {
	margin: 0;
	white-space: nowrap;
}

.be-dock__txt b {
	display: block;
	color: var(--be-text-invert);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	line-height: 1.25;
}

.be-dock__txt small {
	display: flex;
	align-items: center;
	gap: 0.4rem;
	/* 5,5:1 sur Yale Blue : conforme AA. */
	color: var(--be-almond);
	font-size: var(--be-fs-xs);
	line-height: 1.3;
}

/* Point de présence : signale que la ligne est bien active. */
.be-dock__txt small i {
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background-color: #4ade80;
	animation: be-dock-dot 2s infinite;
}

@keyframes be-dock-dot {
	0% {
		box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.55);
	}
	70% {
		box-shadow: 0 0 0 7px rgba(74, 222, 128, 0);
	}
	100% {
		box-shadow: 0 0 0 0 rgba(74, 222, 128, 0);
	}
}

.be-dock__acts {
	display: flex;
	align-items: center;
	gap: var(--be-space-xs);
}

/* Filet de séparation entre l'accroche et les actions : sans lui, le
 * texte et les boutons formaient une seule file et le regard ne
 * savait pas où commençait ce sur quoi on peut cliquer. */
@media (min-width: 981px) {
	.be-dock__acts {
		position: relative;
		padding-left: var(--be-space-lg);
	}

	.be-dock__acts::before {
		content: "";
		position: absolute;
		left: 0;
		top: 50%;
		width: 1px;
		height: 30px;
		transform: translateY(-50%);
		background-color: var(--be-yale-700);
	}
}

/* La croix se détache du groupe d'actions. */
.be-dock__close {
	margin-left: var(--be-space-xs);
}

/* --- Téléphone : lien texte, pas un bouton ---
 * Le numéro se lit et se compose ; l'encadrer en faisait un troisième
 * bouton en concurrence avec l'action principale.
 */
.be-dock__tel {
	display: inline-flex;
	align-items: center;
	gap: 0.45rem;
	padding: 0.5rem 0.65rem;
	border-radius: var(--be-radius-pill);
	color: var(--be-text-invert);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	text-decoration: none;
	white-space: nowrap;
	transition: background-color var(--be-transition), color var(--be-transition);
}

.be-dock__tel svg {
	width: 17px;
	height: 17px;
	flex: 0 0 auto;
	color: var(--be-almond);
}

.be-dock__tel:hover,
.be-dock__tel:focus-visible {
	background-color: var(--be-yale-700);
	color: #fff;
}

/* --- WhatsApp : pastille de marque ---
 * Réduit à son icône : la marque est reconnue à sa forme, le libellé
 * n'apportait qu'un troisième pavé de texte. Le vert vif de la marque
 * ressort à 5,6:1 sur le Yale Blue de la barre — c'est ce rapport-là
 * qui compte pour qu'un bouton se voie.
 */
.be-dock__wa {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 40px;
	height: 40px;
	flex: 0 0 auto;
	border-radius: var(--be-radius-pill);
	background-color: #25d366;
	color: #0a2e18;
	transition: background-color var(--be-transition);
}

.be-dock__wa svg {
	width: 21px;
	height: 21px;
}

.be-dock__wa:hover,
.be-dock__wa:focus-visible {
	background-color: #3ee87d;
	color: #0a2e18;
}

/* --- Action principale ---
 * Inversée : clair sur foncé. Baltic Blue sur Yale Blue tomberait à
 * 1,30:1 et disparaîtrait. Ici, 12:1 contre le fond de la barre.
 */
.be-dock__go {
	display: inline-flex;
	align-items: center;
	gap: 0.45rem;
	height: 40px;
	padding: 0 1.2rem;
	border-radius: var(--be-radius-pill);
	background-color: var(--be-oak-100);
	color: var(--be-yale-700);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	line-height: 1;
	text-decoration: none;
	white-space: nowrap;
	transition: background-color var(--be-transition);
}

.be-dock__go::after {
	content: "\2192";
	font-size: 1.05em;
	transition: transform var(--be-transition);
}

.be-dock__go:hover,
.be-dock__go:focus-visible {
	background-color: #fff;
	color: var(--be-yale-800);
}

.be-dock__go:hover::after,
.be-dock__go:focus-visible::after {
	transform: translateX(3px);
}

/* --- Fermeture ---
 * Rentrée dans la capsule : accrochée au coin extérieur, elle se
 * lisait comme une pastille détachée plutôt que comme un bouton de
 * la barre.
 */
.be-dock__close {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 30px;
	height: 30px;
	flex: 0 0 auto;
	margin-left: 0.15rem;
	padding: 0;
	border: 0;
	border-radius: var(--be-radius-pill);
	background-color: transparent;
	color: var(--be-oak);
	cursor: pointer;
	transition: background-color var(--be-transition), color var(--be-transition);
}

.be-dock__close svg {
	width: 15px;
	height: 15px;
}

.be-dock__close:hover,
.be-dock__close:focus-visible {
	background-color: var(--be-yale-700);
	color: #fff;
}

/* Sous 980 px, l'accroche — icône comprise — cède la place aux actions. */
@media (max-width: 980px) {
	.be-dock__intro {
		display: none;
	}

	.be-dock__box {
		gap: 0;
		padding-inline: 0.5rem;
	}
}

/* --- La barre en mobile : une tablette claire, comme l'en-tête ---
 *
 * La version sombre remettait le défaut qu'elle voulait corriger : sur
 * le Yale de la barre, le téléphone en yale-700 se lisait comme un trou
 * plutôt que comme un bouton, le vert WhatsApp partait seul dans sa
 * couleur, et l'action principale devait s'inverser en crème parce que
 * Baltic sur Yale tombe à 1,30:1. Quatre pavés, quatre traitements,
 * aucune hiérarchie.
 *
 * Fond clair, donc : la barre devient la jumelle de la capsule d'en-tête
 * — le site garde une seule forme flottante, en haut et en bas — et
 * Baltic Blue redevient ce que la palette lui demande d'être, la seule
 * couleur de bouton. Blanc sur Baltic : 6,88:1.
 */
@media (max-width: 640px) {
	.be-dock {
		left: 0;
		right: 0;
		bottom: 0;
		transform: translateY(120%);
	}

	.be-dock.is-on {
		transform: translateY(0);
	}

	.be-dock__box {
		gap: 0.35rem;
		/* Barre basse : elle accompagne la page, elle ne la couvre pas.
		 * 36 px de boutons et 4 px de marge font un bandeau de 45 px,
		 * soit un dix-huitième de l'écran. */
		padding: 0.25rem 0.4rem calc(0.25rem + env(safe-area-inset-bottom, 0px));
		border: 0;
		border-top: 1px solid var(--be-oak-200);
		/* Angles droits : la barre est posée sur le bord de l'écran,
		 * pas flottante. Des coins arrondis laissaient paraître deux
		 * encoches de contenu sous la barre. */
		border-radius: 0;
		background-color: var(--be-bg);
		box-shadow: 0 -10px 30px rgba(31, 39, 27, 0.12);
	}

	.be-dock__acts {
		width: 100%;
		gap: 0.5rem;
	}

	/* Les deux contacts directs partagent un seul gabarit : même
	 * carré, même rayon, même poids. Ce qui les distingue est leur
	 * icône, pas leur traitement. */
	.be-dock__tel,
	.be-dock__wa {
		width: 36px;
		height: 36px;
		flex: 0 0 auto;
		justify-content: center;
		padding: 0;
		border: 1px solid var(--be-oak-200);
		border-radius: var(--be-radius);
		background-color: var(--be-almond-200);
		color: var(--be-yale);
	}

	.be-dock__tel span {
		display: none;
	}

	.be-dock__tel svg,
	.be-dock__wa svg {
		width: 17px;
		height: 17px;
		color: inherit;
	}

	/* WhatsApp garde son vert : c'est à cette couleur qu'on reconnaît
	 * le service. Il reste dans le gabarit commun, il ne le casse pas. */
	.be-dock__wa {
		border-color: #1fa855;
		background-color: #25d366;
		color: #07321a;
	}

	/* L'action principale prend la place restante : c'est elle que le
	 * pouce vise. Pleine, en Baltic, comme tous les boutons du site. */
	.be-dock__go {
		flex: 1 1 auto;
		justify-content: center;
		height: 36px;
		padding-inline: 0.6rem;
		font-size: var(--be-fs-xs);
		border-radius: var(--be-radius);
		background-color: var(--be-action);
		color: #fff;
	}

	.be-dock__go:hover,
	.be-dock__go:focus-visible {
		background-color: var(--be-action-hover);
		color: #fff;
	}

	/* La croix ne concourt pas avec les actions : pas de fond, une
	 * teinte sourde, mais une cible de 44 px comme les autres. */
	.be-dock__close {
		width: 30px;
		height: 36px;
		margin-left: 0;
		color: var(--be-text-muted);
	}

	.be-dock__close svg {
		width: 15px;
		height: 15px;
	}

	.be-dock__close:hover,
	.be-dock__close:focus-visible {
		background-color: var(--be-almond-200);
		color: var(--be-text);
	}
}

@media (prefers-reduced-motion: reduce) {
	.be-dock,
	.be-dock__txt small i,
	.be-dock__go::after {
		animation: none !important;
		transition: none !important;
	}
}


/* ------------------------------------------------------------------
 * 8f. CORRECTIFS ET COMPOSANTS COMPLÉMENTAIRES
 * Placé après les blocs précédents : l'emporte sans !important.
 * ---------------------------------------------------------------- */

/* --- Finitions : une planche de matières, d'un seul tenant ---
 *
 * Les six produits ne sont pas six articles, c'est UNE gamme. On en fait
 * donc un seul objet : une planche blanche, bordée et arrondie, dans
 * laquelle les finitions s'empilent comme des assises séparées par un
 * filet. Chaque assise donne le nom en grand à gauche et la matière en
 * bandeau large à droite, à pleine lumière.
 *
 * Deux principes, appris des versions écartées :
 *
 *   - Le texte n'est jamais posé sur la photo. Le fond est du béton — gris
 *     moyen, peu contrasté, la même matière partout ; l'assombrir assez
 *     pour tenir du texte blanc éteignait les six photos, qui finissaient
 *     par se ressembler toutes. Dans une section dont le seul travail est
 *     de montrer qu'elles diffèrent.
 *   - Le bandeau est large et court. C'est ce format qui recadre de
 *     lui-même sur la surface : les photos d'origine montrent souvent un
 *     escalier, un muret ou une bordure, et une vignette carrée les
 *     emportait avec. Une bande 3:1 ne garde que le sol.
 *
 * L'assise se lit comme une ligne de catalogue : le nom, la description,
 * puis un pied qui aligne le prix à droite et le lien à gauche. Les six
 * prix forment ainsi une colonne, qu'on parcourt d'un regard — c'est la
 * donnée la plus regardée de la section.
 *
 * La variante « catalogue » (page Nos produits) empile simplement douze
 * assises au lieu de six.
 */
.be-sec--produits .be-cards--media,
.be-sec--catalogue .be-cards--media {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 0;
	overflow: hidden;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-xl);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-sm);
	margin-inline: 0;
}

/* --- Une assise --- */
.be-sec--produits .be-card--media,
.be-sec--catalogue .be-card--media {
	position: relative;
	display: grid;
	/* Le bandeau prend un peu plus de la moitié : en dessous on ne juge
	 * plus un grain de béton, au-dessus le nom perd la place qui en fait
	 * le point d'entrée de l'assise. */
	grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
	align-items: stretch;
	min-height: 12rem;
	/* La planche porte le cadre ; les assises n'en ont pas. */
	border: 0;
	border-radius: 0;
	background-color: transparent;
	box-shadow: none;
	transition: background-color var(--be-transition);
}

.be-sec--produits .be-card--media + .be-card--media,
.be-sec--catalogue .be-card--media + .be-card--media {
	border-top: 1px solid var(--be-oak-200);
}

/* Repère de survol : un filet Yale sur la tranche gauche de l'assise.
 * Il marque celle qu'on vise sans rien déplacer — une assise qui saute
 * hors de la planche, c'est la planche qui se défait. */
.be-sec--produits .be-card--media::before,
.be-sec--catalogue .be-card--media::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0;
	bottom: 0;
	z-index: 3;
	width: 3px;
	background-color: var(--be-yale);
	opacity: 0;
	transition: opacity var(--be-transition);
}

.be-sec--produits .be-card--media:hover,
.be-sec--produits .be-card--media:focus-within,
.be-sec--catalogue .be-card--media:hover,
.be-sec--catalogue .be-card--media:focus-within {
	transform: none;
	box-shadow: none;
	background-color: var(--be-almond-200);
}

.be-sec--produits .be-card--media:hover::before,
.be-sec--produits .be-card--media:focus-within::before,
.be-sec--catalogue .be-card--media:hover::before,
.be-sec--catalogue .be-card--media:focus-within::before {
	opacity: 1;
}

/* --- Le nom, à gauche --- */
.be-sec--produits .be-card__body,
.be-sec--catalogue .be-card__body {
	grid-column: 1;
	grid-row: 1;
	justify-content: flex-start;
	gap: var(--be-space-xs);
	padding: var(--be-space-lg);
}

/* Grand : dans une planche, c'est le nom de la matière qu'on cherche.
 * Le descriptif n'est qu'une ligne de contexte. */
.be-sec--produits .be-card__title,
.be-sec--catalogue .be-card__title {
	font-size: clamp(1.45rem, 2.4vw, 2rem);
	line-height: 1.1;
	letter-spacing: -0.03em;
}

.be-sec--produits .be-card__text,
.be-sec--catalogue .be-card__text {
	max-width: 46ch;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text-muted);
}

/* Le lien tombe en pied d'assise, en vis-à-vis du prix. Pas de filet
 * au-dessus : le filet, ici, c'est celui qui sépare les assises, et deux
 * traits horizontaux à quelques pixels l'un de l'autre se lisent comme
 * une erreur. */
.be-sec--produits .be-card__link,
.be-sec--catalogue .be-card__link {
	margin-top: auto;
	padding-top: var(--be-space-sm);
	border-top: 0;
}

/* --- Le prix, en pied d'assise et à droite ---
 * Dans la colonne de texte et non sur la photo : les six prix forment
 * alors une colonne alignée, qui se parcourt d'un regard. Posé dans la
 * grille plutôt qu'en pourcentages, il suit la colonne quoi qu'il advienne
 * des proportions.
 */
.be-sec--produits .be-card__price,
.be-sec--catalogue .be-card__price {
	position: relative;
	z-index: 2;
	grid-column: 1;
	grid-row: 1;
	align-self: end;
	justify-self: end;
	margin: var(--be-space-lg);
	padding: 0.25rem 0.7rem;
	border-color: var(--be-oak);
	background-color: var(--be-almond-200);
	box-shadow: none;
}

/* --- Le bandeau de matière, à droite ---
 *
 * La hauteur de l'assise doit venir du texte, jamais de la photo : le
 * chargement différé (a3 Lazy Load) remplace l'image par un GIF d'un pixel
 * le temps du défilement, et une assise mesurée sur son image
 * s'effondrerait à l'affichage initial. L'image est donc sortie du flux à
 * l'intérieur du bandeau, qui s'étire sur la hauteur décidée par le texte.
 *
 * La rangée est déclarée : le prix occupe explicitement la rangée 1, et
 * sans cette ligne le placement automatique repousserait le bandeau dans
 * une seconde rangée créée pour lui.
 */
.be-sec--produits .be-card__media,
.be-sec--catalogue .be-card__media {
	position: relative;
	grid-column: 2;
	grid-row: 1;
	aspect-ratio: auto;
	align-self: stretch;
	overflow: hidden;
	border-left: 1px solid var(--be-oak-200);
}

.be-sec--produits .be-card__media img,
.be-sec--catalogue .be-card__media img {
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

/* --- Sous 46 rem : la planche se replie ---
 * Le bandeau passerait sous 150 px de large, où l'on ne juge plus rien, et
 * il ne resterait au nom qu'une vingtaine de signes par ligne. L'assise
 * repasse donc en deux étages, la matière en tête.
 */
@media (max-width: 46rem) {
	.be-sec--produits .be-card--media,
	.be-sec--catalogue .be-card--media {
		grid-template-columns: minmax(0, 1fr);
		min-height: 0;
	}

	.be-sec--produits .be-card__media,
	.be-sec--catalogue .be-card__media {
		grid-column: 1;
		grid-row: 1;
		aspect-ratio: 16 / 9;
		border-left: 0;
		border-bottom: 1px solid var(--be-oak-200);
	}

	.be-sec--produits .be-card__body,
	.be-sec--catalogue .be-card__body {
		grid-row: 2;
		padding: var(--be-space-md);
	}

	/* Le prix rejoint le pied du texte, qui est passé sous la matière. */
	.be-sec--produits .be-card__price,
	.be-sec--catalogue .be-card__price {
		grid-column: 1;
		grid-row: 2;
		margin: var(--be-space-md);
	}
}

/* --- La finition en détail : texte + fiche prix --- */
.be-feature {
	display: grid;
	grid-template-columns: minmax(0, 1.6fr) minmax(260px, 0.9fr);
	gap: clamp(1.5rem, 4vw, 3rem);
	align-items: start;
}

.be-feature__text p {
	margin: 0;
	font-size: var(--be-fs-lg);
	line-height: 1.6;
	color: var(--be-text-muted);
	max-width: 58ch;
}

.be-feature__uses {
	display: flex;
	flex-wrap: wrap;
	gap: var(--be-space-sm);
	margin: var(--be-space-lg) 0 0;
	padding: 0;
	list-style: none;
}

.be-feature__uses li {
	margin: 0;
	padding: 0.35rem 0.8rem;
	border: 1px solid var(--be-oak);
	border-radius: 999px;
	background-color: #fff;
	font-size: var(--be-fs-xs);
	font-weight: 600;
	color: var(--be-charcoal);
}

.be-feature__card {
	background-color: #fff;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	padding: clamp(1.1rem, 2.4vw, 1.6rem);
	box-shadow: var(--be-shadow-sm);
}

.be-feature__lbl {
	margin: 0 0 0.2rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	color: var(--be-text-muted);
}

.be-feature__price {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: clamp(1.5rem, 2.6vw, 2rem);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--be-charcoal);
	font-variant-numeric: tabular-nums;
}

.be-feature__note {
	margin: var(--be-space-sm) 0 var(--be-space-md);
	font-size: var(--be-fs-xs);
	line-height: 1.55;
	color: var(--be-text-muted);
}

.be-feature__cta {
	display: block;
	text-align: center;
	padding: 0.8rem 1.2rem;
	border-radius: var(--be-radius);
	background-color: var(--be-action);
	color: #fff;
	font-size: var(--be-fs-sm);
	font-weight: 600;
	text-decoration: none;
	transition: background-color var(--be-transition);
}

.be-feature__cta:hover,
.be-feature__cta:focus {
	background-color: var(--be-action-hover);
	color: #fff;
}

.be-feature__link {
	display: block;
	margin-top: var(--be-space-sm);
	text-align: center;
	font-size: var(--be-fs-sm);
	font-weight: 600;
	color: var(--be-baltic-700);
	text-decoration: none;
}

.be-feature__link:hover,
.be-feature__link:focus {
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

@media (max-width: 860px) {
	.be-feature {
		grid-template-columns: 1fr;
	}
}

/* --- Liste des autres finitions --- */
.be-finlist {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
	gap: var(--be-space-sm);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-finlist li {
	margin: 0;
}

.be-finlist a {
	display: grid;
	gap: 0.15rem;
	height: 100%;
	padding: var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: #fff;
	text-decoration: none;
	transition: border-color var(--be-transition), transform var(--be-transition);
}

.be-finlist a:hover,
.be-finlist a:focus-visible {
	border-color: var(--be-baltic);
	transform: translateY(-2px);
}

.be-finlist__name {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	color: var(--be-charcoal);
}

.be-finlist__note {
	font-size: var(--be-fs-sm);
	color: var(--be-text-muted);
}

/* ------------------------------------------------------------------
 * 8g. PAGES DE FINITION
 * Structure : inc/finitions.php.
 *
 * Les douze articles « béton … » sont les seuls contenus de type
 * « post » du site. Ils étaient rendus par le gabarit d'article
 * d'Astra — barre latérale à droite, titre en en-tête, texte au fil
 * de l'eau — alors que ce sont des pages commerciales au même titre
 * que celles bâties sous Elementor.
 *
 * Cette section leur donne le même traitement : hero « motif B »
 * (design/hero-patterns.md), sommaire ancré, fil de lecture tenu sur
 * une mesure courte, tableaux et figures qui débordent volontairement
 * de cette mesure, et blocs de conversion en fin de page.
 *
 * Le balisage est natif : aucune classe Elementor n'est simulée. Les
 * règles communes aux deux familles de heros (sur-titre, pastilles,
 * fiche chiffrée) vivent en section 8b sous « .be-hero » et
 * s'appliquent donc ici aussi ; on ne redéfinit que ce qui dépend du
 * balisage.
 *
 * --- La portée « .be-prose » ---
 *
 * Les règles de cette section et de la suivante sont écrites pour
 * « :is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ». Le premier terme est
 * le corps d'un article de finition ; le second est une porte de
 * sortie, à poser sur n'importe quel conteneur qui reçoit les mêmes
 * composants ailleurs.
 *
 * Elle existe parce que les modèles réutilisables (bandeau d'appel,
 * réassurance, méthode de chantier, FAQ commune) sont faits pour servir
 * aussi les pages Elementor — c'est tout l'intérêt de les rendre par
 * shortcode. Sans cet alias, ils y arrivaient sans mise en forme.
 *
 * « :is() » prend la spécificité de son argument le plus fort : la
 * cascade reste donc exactement celle d'avant sur les pages de finition.
 * ---------------------------------------------------------------- */

/* ---------------- Hero, motif B ---------------- */

.be-hero--finition {
	position: relative;
	isolation: isolate;
	background-color: var(--be-bg);
	border-bottom: 1px solid var(--be-oak-200);
	/* L'en-tête flotte hors du flux (section 4) : le fond du hero
	 * court sous la capsule, mais le hero dégage lui-même sa hauteur,
	 * sans quoi le titre passerait dessous. */
	padding-top: calc(clamp(2.5rem, 5.5vw, 4.75rem) + var(--be-header-clear));
	padding-bottom: clamp(2.5rem, 5.5vw, 4.75rem);
	overflow: hidden;
}

/* Même voile chaud que les heros Elementor : le dégradé s'éteint du
 * côté de la photo, le texte reste sur la partie claire. */
.be-hero--finition::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background:
		radial-gradient(62% 86% at 86% 4%, var(--be-almond-200) 0%, rgba(244, 237, 234, 0) 68%),
		linear-gradient(180deg, var(--be-oak-100) 0%, var(--be-bg) 58%);
}

.be-hero--finition .be-hero__inner {
	display: grid;
	grid-template-columns: minmax(0, 55fr) minmax(0, 45fr);
	align-items: center;
	gap: clamp(2rem, 5vw, 4rem);
	max-width: var(--be-container);
	margin-inline: auto;
	padding-inline: 20px;
}

/* Sans photo mise en avant, la colonne de texte prend toute la
 * largeur plutôt que de laisser une moitié vide. */
.be-hero--finition .be-hero__inner:not(:has(.be-hero__side)) {
	grid-template-columns: minmax(0, 1fr);
}

.be-hero--finition .be-eyebrow {
	margin-bottom: var(--be-space-sm);
}

.be-hero--finition .be-hero__h1 {
	margin: 0;
	color: var(--be-charcoal);
	font-size: clamp(2.05rem, 3.8vw, 3.05rem);
	line-height: 1.06;
	letter-spacing: -0.032em;
	font-weight: 800;
	max-width: 18ch;
	text-wrap: balance;
}

.be-hero--finition .be-hero__lead {
	margin: var(--be-space-md) 0 0;
	color: var(--be-text-muted);
	font-size: var(--be-fs-lg);
	line-height: 1.55;
	max-width: 54ch;
}

.be-hero--finition .be-badges {
	margin-top: var(--be-space-lg);
}

/* --- Appels à l'action ---
 * Un bouton plein, puis un lien fléché. Le second navigue
 * latéralement — vers la finition voisine — plutôt que vers le
 * formulaire : le hero est un embranchement, pas un cul-de-sac.
 */
.be-hero--finition .be-hero__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--be-space-md) var(--be-space-lg);
	margin-top: var(--be-space-lg);
}

/* Le dimensionnement des appels est commun a tous les heros, voir
 * « .be-hero :is(...) » en section 8b. */


.be-hero--finition .be-btn--primary::after {
	content: "\2192";
}

/* Le second appel du hero de finition : meme bouton a filet que
 * cote Elementor. La classe ne sert plus qu'a poser la fleche. */
.be-hero__link::after {
	content: " \2192";
}

/* --- Panneau visuel ---
 * Cadre décalé derrière la photo, comme sur les heros Elementor :
 * deux plans au lieu d'un aplat. Purement ornemental, retiré dès que
 * la mise en page passe en colonne.
 */
.be-hero--finition .be-hero__side {
	position: relative;
	align-self: center;
}

.be-hero--finition .be-hero__frame {
	position: relative;
	border-radius: var(--be-radius-lg);
	overflow: hidden;
	box-shadow: var(--be-shadow-lg);
}

.be-hero--finition .be-hero__side::before {
	content: "";
	position: absolute;
	inset: 0;
	transform: translate(16px, -16px);
	border: 2px solid var(--be-oak);
	border-radius: var(--be-radius-lg);
	pointer-events: none;
	z-index: 0;
}

.be-hero--finition .be-hero__img {
	display: block;
	width: 100%;
	height: clamp(280px, 34vw, 430px);
	object-fit: cover;
	border-radius: 0;
	box-shadow: none;
}

/* La fiche chevauche l'angle bas-gauche de la photo : elle fait la
 * jonction entre les deux colonnes au lieu de les juxtaposer. */
.be-hero--finition .be-hero__stat {
	position: absolute;
	left: -18px;
	bottom: -18px;
	z-index: 2;
	margin: 0;
	max-width: 23rem;
	display: flex;
	align-items: center;
	gap: var(--be-space-sm);
	padding: var(--be-space-sm) var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-md);
}

.be-hero--finition .be-stat__figure {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-2xl);
	font-weight: 800;
	line-height: 1;
	letter-spacing: -0.04em;
	color: var(--be-yale);
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

.be-hero--finition .be-stat__body {
	display: flex;
	flex-direction: column;
	gap: 0.15rem;
	min-width: 0;
}

.be-hero--finition .be-stat__label {
	font-size: var(--be-fs-sm);
	font-weight: 700;
	line-height: 1.2;
	color: var(--be-charcoal);
}

.be-hero--finition .be-stat__note {
	font-size: var(--be-fs-xs);
	line-height: 1.35;
	color: var(--be-text-muted);
}

@media (max-width: 1024px) {
	.be-hero--finition .be-hero__inner {
		grid-template-columns: minmax(0, 1fr);
	}

	.be-hero--finition .be-hero__h1 {
		max-width: none;
	}

	/* Plus de place pour le cadre décalé ni pour une fiche en
	 * surimpression : la fiche repasse dans le flux, sous la photo. */
	.be-hero--finition .be-hero__side::before {
		content: none;
	}

	.be-hero--finition .be-hero__stat {
		position: static;
		max-width: none;
		margin-top: var(--be-space-md);
	}
}

@media (max-width: 767px) {
	.be-hero--finition .be-hero__lead {
		font-size: var(--be-fs-base);
	}

	/* Les appels s'empilent et occupent toute la largeur : cote a cote,
	 * deux boutons de cette taille se coupent en deux lignes chacun. */
	.be-hero--finition .be-hero__actions {
		flex-direction: column;
		align-items: stretch;
		gap: var(--be-space-sm);
	}

	.be-hero--finition :is(.be-btn--primary, .be-btn--outline) {
		width: 100%;
	}
}

/* ---------------- Fil de lecture ----------------
 * Le corps de l'article tient sur une mesure courte — au-delà de
 * ~72 caractères l'œil perd la ligne suivante. Mais un tableau
 * comparatif ou une photo de chantier étouffent à cette largeur.
 *
 * D'où une grille à trois couloirs : le texte occupe le couloir
 * central, les figures et les tableaux débordent d'un cran, les
 * bandeaux pleine largeur vont d'un bord à l'autre. Un seul
 * conteneur, trois largeurs, aucune marge négative à corriger.
 */

:is(.be-finition, .be-prix-page, .be-prix-pilier) #primary {
	padding-block: clamp(2.5rem, 5vw, 4rem);
}

/* Les suffixes « -start » et « -end » ne sont pas décoratifs : c'est la
 * convention que la grille CSS reconnaît pour que « grid-column: texte »
 * désigne d'un mot l'intervalle entre les deux lignes. Avec n'importe
 * quel autre suffixe, la règle ne s'applique pas et les blocs se
 * répartissent en colonnes les uns après les autres. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) {
	display: grid;
	grid-template-columns:
		/* Gouttières à minimum nul. Avec « minmax(var(--be-space-md), 1fr) »
		 * elles gardaient 17 px chacune alors que « min(42rem, 100%) »
		 * donnait déjà toute la largeur au couloir de texte : la grille
		 * dépassait son conteneur de 34 px, la piste « pleine » n'était
		 * plus centrée dans la fenêtre, et « calc(50% - 50vw) » posait
		 * les bandes 17 px trop à droite — liseré à gauche, bord droit
		 * rogné. La marge latérale vient du conteneur d'Astra. */
		[pleine-start] minmax(0, 1fr)
		[large-start] minmax(0, 7rem)
		[texte-start] min(42rem, 100%)
		[texte-end] minmax(0, 7rem)
		[large-end] minmax(0, 1fr)
		[pleine-end];
}

/* La largeur du couloir de texte est donnée en rem, pas en « ch ».
 * L'unité « ch » vaut la chasse du zéro, et celle de Plus Jakarta Sans
 * est large : « 72ch » y produisait 840 px, soit environ 110 signes par
 * ligne — bien au-delà de la fourchette lisible. 42rem tient la ligne
 * autour de 80 signes, en haut de la fourchette confortable : ces pages
 * sont techniques, leurs phrases portent des termes longs et des
 * chiffres, et une colonne trop étroite y multiplie les césures. */

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > * {
	grid-column: texte;
	min-width: 0;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > figure,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .wp-block-image,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .wp-block-table,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > table,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-also,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-cta,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-key,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-compare,
/* Ces composants sont des grilles : dans le couloir de texte, leurs
 * colonnes tombent sous la largeur minimale et se replient les unes
 * sous les autres, ce qui annule tout l'intérêt du face-à-face. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-pros,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-uses,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-price,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-specs,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-gallery {
	grid-column: large;
}

/* Bandes réellement pleine largeur : la piste « pleine » s'arrête au
 * conteneur d'Astra, soit 1 200 px. Pour que la bande aille d'un bord
 * de fenêtre à l'autre, elle prend la largeur de la fenêtre et rattrape
 * l'écart par ses marges. « 100vw » compte la barre de défilement, d'où
 * le rognage posé plus bas sur le conteneur. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-band,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-trust {
	grid-column: pleine;
	width: 100vw;
	max-width: 100vw;
	margin-inline: calc(50% - 50vw);
}

/* « clip » et non « hidden » : « hidden » créerait un conteneur de
 * défilement et casserait les en-têtes de tableau collants. */
:is(.be-finition, .be-prix-page, .be-prix-pilier) .site-content {
	overflow-x: clip;
}

/* --- Texte courant --- */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) p {
	margin-block: 0 var(--be-space-md);
	font-size: var(--be-fs-base);
	line-height: 1.72;
}

/* Chapô : le premier paragraphe donne le ton et porte la définition.
 * Un cran au-dessus du texte courant, sans devenir un sous-titre. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > .be-toc + p {
	font-size: var(--be-fs-lg);
	line-height: 1.6;
	color: var(--be-text-muted);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) a {
	color: var(--be-link);
	text-decoration: underline;
	text-decoration-thickness: 1px;
	text-underline-offset: 0.18em;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) a:hover,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) a:focus {
	color: var(--be-action-hover);
	text-decoration-thickness: 2px;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) strong {
	font-weight: 700;
	color: var(--be-charcoal);
}

/* --- Titres ---
 * Le H2 porte un court trait Baltic au-dessus plutôt qu'un filet
 * pleine largeur : il ouvre la section sans la cloisonner.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) h2 {
	margin: var(--be-space-2xl) 0 var(--be-space-md);
	font-size: clamp(1.6rem, 2.6vw, 2.1rem);
	line-height: 1.15;
	letter-spacing: -0.025em;
	/* Le sommaire amène ici par une ancre ; sans ce dégagement le
	 * titre se cale sous l'en-tête flottant. */
	scroll-margin-top: calc(var(--be-header-clear) + var(--be-space-md));
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) h2::before {
	content: "";
	display: block;
	width: 32px;
	height: 3px;
	border-radius: 3px;
	margin-bottom: var(--be-space-sm);
	background-color: var(--be-baltic);
}

/* Sauf quand le titre appartient à un composant qui a déjà son repère.
 *
 * « .be-sec__head » ouvre ses sections par un sur-titre précédé d'un
 * tiret ; son « h2 » recevait en plus celui du fil de lecture, et les
 * deux traits se retrouvaient empilés l'un sous l'autre au-dessus du
 * même titre. Le composant le déclare bien de son côté, mais avec une
 * spécificité inférieure à celle de la règle ci-dessus — d'où cette
 * reprise, qui n'existe que pour reprendre la main. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-sec__title::before {
	content: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) > h2:first-child {
	margin-top: 0;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) h3 {
	margin: var(--be-space-xl) 0 var(--be-space-sm);
	font-size: var(--be-fs-xl);
	line-height: 1.25;
	color: var(--be-yale);
	scroll-margin-top: calc(var(--be-header-clear) + var(--be-space-md));
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) h4 {
	margin: var(--be-space-lg) 0 var(--be-space-xs);
	font-size: var(--be-fs-lg);
}

/* --- Listes ---
 * Puce dessinée plutôt que le disque par défaut : le texte des
 * articles est fait de listes longues, et un marqueur discret aligné
 * sur la ligne de base se lit mieux qu'un gros point.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ul,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ol {
	margin: 0 0 var(--be-space-md);
	padding-left: 0;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) li {
	position: relative;
	margin-bottom: var(--be-space-sm);
	padding-left: 1.6rem;
	line-height: 1.7;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ul > li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.72em;
	width: 7px;
	height: 7px;
	border-radius: 50%;
	background-color: var(--be-oak);
	box-shadow: 0 0 0 3px var(--be-almond-200);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ol {
	counter-reset: be-li;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ol > li {
	counter-increment: be-li;
	padding-left: 2.1rem;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) ol > li::before {
	content: counter(be-li);
	position: absolute;
	left: 0;
	top: 0.15em;
	display: grid;
	place-items: center;
	width: 1.5rem;
	height: 1.5rem;
	border-radius: 50%;
	background-color: var(--be-yale);
	color: var(--be-oak-100);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	line-height: 1;
}

/* Les listes du sommaire, des pastilles et des grilles ont leur
 * propre marqueur : on neutralise celui du fil de lecture. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(.be-toc, .be-finlist, .be-badges) li {
	padding-left: 0;
}

/* Les listes qui sont des composants, et non du texte courant, ne
 * prennent ni puce ni retrait : elles apportent leur propre mise en
 * forme. « .be-vid » s'est ajoutée ici après coup — ses vignettes
 * vidéo affichaient une pastille grise flottant à gauche de chaque
 * carte, à un endroit où le composant n'attendait rien. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(.be-toc, .be-finlist, .be-vid) li::before {
	content: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-vid > li {
	margin-bottom: 0;
	padding-left: 0;
}

/* --- Tableaux ---
 * Les plans par finition en prévoient plusieurs par page (prix,
 * fiche technique, comparatifs). Ils débordent de la mesure du
 * texte, et défilent horizontalement plutôt que de se comprimer
 * quand l'écran ne suffit plus.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(table, .wp-block-table) {
	margin-block: var(--be-space-lg);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .wp-block-table {
	overflow-x: auto;
	-webkit-overflow-scrolling: touch;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) table {
	width: 100%;
	border-collapse: separate;
	border-spacing: 0;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	overflow: hidden;
	font-size: var(--be-fs-sm);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-sm);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) thead th {
	background-color: var(--be-yale);
	color: var(--be-oak-100);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	text-align: left;
	padding: var(--be-space-sm) var(--be-space-md);
	border: 0;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) tbody td,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) tbody th {
	padding: var(--be-space-sm) var(--be-space-md);
	border: 0;
	border-top: 1px solid var(--be-oak-200);
	vertical-align: top;
	line-height: 1.55;
	font-variant-numeric: tabular-nums;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) tbody th {
	text-align: left;
	font-weight: 700;
	color: var(--be-charcoal);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) tbody tr:nth-child(even) {
	background-color: var(--be-oak-100);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) table :where(figcaption, caption) {
	caption-side: bottom;
	padding-top: var(--be-space-xs);
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
	text-align: left;
}

/* --- Images ---
 * Traitées comme des objets posés sur la page, jamais comme une
 * texture de fond : coins arrondis, ombre franche, légende sous
 * l'image en petit corps.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(figure, .wp-block-image) {
	margin-block: var(--be-space-lg);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(figure, .wp-block-image) img {
	display: block;
	width: 100%;
	height: auto;
	border-radius: var(--be-radius-lg);
	box-shadow: var(--be-shadow-md);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) figcaption {
	margin-top: var(--be-space-sm);
	font-size: var(--be-fs-xs);
	line-height: 1.5;
	color: var(--be-text-muted);
	text-align: center;
}

/* ---------------- Sommaire ancré ----------------
 * Construit au rendu à partir des H2 (inc/finitions.php). Posé en
 * tête d'article : ces pages font plusieurs milliers de mots et le
 * visiteur arrive le plus souvent pour une section précise — le prix,
 * la pose, une question de la FAQ.
 */
.be-toc {
	margin: 0 0 var(--be-space-xl);
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-left: 3px solid var(--be-baltic);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-oak-100);
}

.be-toc__title {
	margin: 0 0 var(--be-space-sm);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-toc__list {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
	gap: 0.35rem var(--be-space-lg);
	margin: 0;
	padding: 0;
	counter-reset: be-toc;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-toc__list li {
	counter-increment: be-toc;
	margin: 0;
	padding-left: 0;
	line-height: 1.45;
}

.be-toc__list a {
	display: block;
	padding: 0.3rem 0;
	font-size: var(--be-fs-sm);
	font-weight: 600;
	color: var(--be-charcoal);
	text-decoration: none;
}

.be-toc__list a::before {
	content: counter(be-toc) ".";
	margin-right: 0.5rem;
	color: var(--be-baltic);
	font-variant-numeric: tabular-nums;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-toc__list a:hover,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-toc__list a:focus {
	color: var(--be-baltic-700);
	text-decoration: underline;
	text-underline-offset: 0.18em;
}

/* ---------------- Encadrés ----------------
 * Trois usages, une seule forme : la fiche technique, la note de
 * mise en garde et le repère de prix. Ils se distinguent par la
 * couleur du liseré gauche, pas par la boîte, pour que la page ne
 * devienne pas une suite de cadres concurrents.
 *
 * Usage dans l'éditeur : un groupe de blocs auquel on ajoute la
 * classe « be-note », « be-note--tech » ou « be-note--prix ».
 */
.be-note {
	margin-block: var(--be-space-lg);
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-left: 3px solid var(--be-oak);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-almond-200);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-note > :last-child {
	margin-bottom: 0;
}

.be-note__title {
	margin: 0 0 var(--be-space-xs);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-note--tech {
	border-left-color: var(--be-yale);
	background-color: var(--be-oak-100);
}

.be-note--prix {
	border-left-color: var(--be-baltic);
	background-color: #fff;
	box-shadow: var(--be-shadow-sm);
}

/* ---------------- FAQ ----------------
 * <details> natif : ouvert au clavier sans JavaScript, et lisible
 * même si la feuille de style ne charge pas. Même parti pris qu'en
 * page d'accueil (section 8d).
 */
.be-faq {
	margin-block: var(--be-space-lg);
	border-top: 1px solid var(--be-oak-200);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-faq__item {
	margin: 0;
	padding: 0;
	border-bottom: 1px solid var(--be-oak-200);
}

.be-faq__item > summary {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: var(--be-space-md);
	padding: var(--be-space-md) 0;
	cursor: pointer;
	list-style: none;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.35;
	color: var(--be-charcoal);
	transition: color var(--be-transition);
}

.be-faq__item > summary::-webkit-details-marker {
	display: none;
}

.be-faq__item > summary:hover {
	color: var(--be-baltic-700);
}

/* Chevron dessiné en CSS : pas de police d'icônes à charger. */
.be-faq__item > summary::after {
	content: "";
	flex: 0 0 auto;
	width: 12px;
	height: 12px;
	margin-top: 0.4em;
	border-right: 2px solid var(--be-baltic);
	border-bottom: 2px solid var(--be-baltic);
	transform: rotate(45deg);
	transition: transform var(--be-transition);
}

.be-faq__item[open] > summary::after {
	transform: rotate(-135deg);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-faq__item > :not(summary) {
	margin-bottom: var(--be-space-md);
	color: var(--be-text-muted);
	max-width: 68ch;
}
/* ---------------- Bande de réassurance ----------------
 * Bloc réutilisable (modèle Greenshift) : un seul endroit à modifier
 * pour les douze pages, et le même shortcode fonctionne dans
 * Gutenberg comme dans Elementor.
 *
 * L'appel à l'action, lui, a été sorti d'ici : il ne ferme plus la
 * page mais s'insère au milieu du contenu, et sa mise en forme vit
 * en section 8h.
 */
/* Même traitement que « .be-band » : un panneau arrondi, rentré dans la
 * gouttière, et non un bandeau collé aux bords de la fenêtre. */
.be-trust {
	margin-block: var(--be-space-xl);
	margin-inline: clamp(0.75rem, 3vw, 2.25rem);
	padding: var(--be-space-lg) var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-xl);
	background-color: var(--be-oak-100);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-trust__list {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	gap: var(--be-space-md) var(--be-space-lg);
	max-width: var(--be-container);
	margin-inline: auto;
	padding: 0;
	list-style: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-trust__list li {
	margin: 0;
	padding-left: 0;
	text-align: center;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-trust__list li::before {
	content: none;
}

.be-trust__figure {
	display: block;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -0.02em;
	color: var(--be-yale);
}

/* Petit tiret Pale Oak au-dessus de chaque repère. C'est le même signe
 * que les sur-titres et les intitulés de colonnes du pied de page : il
 * donne à ces quatre blocs une attache commune, là où ils flottaient
 * côte à côte sans rien qui les relie. */
.be-trust__figure::before {
	content: "";
	display: block;
	width: 22px;
	height: 2px;
	border-radius: 2px;
	margin: 0 auto var(--be-space-sm);
	background-color: var(--be-oak);
}

.be-trust__label {
	display: block;
	margin-top: 0.2rem;
	font-size: var(--be-fs-sm);
	line-height: 1.45;
	color: var(--be-text-muted);
}

/* --- Autres finitions ---
 * Rendue par [be_autres_finitions] : la liste exclut la page
 * courante et suit l'ordre du menu. La grille elle-même réutilise
 * « .be-finlist » de la page d'accueil (section 8f).
 */
.be-also {
	margin-block: var(--be-space-2xl) var(--be-space-lg);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-also__title {
	margin-top: 0;
}

/* ---------------- Navigation entre articles ----------------
 * Astra affiche « article précédent / suivant » sous le contenu.
 * Sur douze finitions, l'ordre chronologique n'a aucun sens pour le
 * lecteur — la grille ci-dessus fait ce travail bien mieux.
 */
:is(.be-finition, .be-prix-page, .be-prix-pilier) .post-navigation,
:is(.be-finition, .be-prix-page, .be-prix-pilier) .ast-single-post-navigation,
:is(.be-finition, .be-prix-page, .be-prix-pilier) .ast-author-box,
:is(.be-finition, .be-prix-page, .be-prix-pilier) .entry-meta {
	display: none;
}

@media (max-width: 767px) {
	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-toc__list {
		grid-template-columns: 1fr;
	}

	.be-cta__actions .be-btn {
		width: 100%;
	}
}
/* ------------------------------------------------------------------
 * 8h. SECTIONS DE CONTENU DES PAGES DE FINITION
 * Structure : inc/finitions-sections.php + scripts/build-contenus.php.
 *
 * Le corps de ces pages était un mur de paragraphes : douze articles
 * de mille à deux mille mots, sans autre relief qu'un titre de niveau
 * deux tous les trois écrans. La mise en forme du fil de lecture
 * (section 8g) ne suffit pas — un texte long reste un texte long.
 *
 * Cette section fournit les composants dans lesquels le contenu est
 * remonté : l'essentiel en tête, les usages en cartes, les avantages
 * et les limites face à face, la pose en étapes numérotées, la fiche
 * technique en grille, le nuancier en pastilles, les prix en tableau
 * de tranches, la FAQ en accordéon.
 *
 * Tous s'écrivent en blocs HTML dans l'éditeur et n'ont besoin
 * d'aucun réglage : une classe suffit. La feuille de style reste la
 * seule source de vérité de l'apparence.
 * ---------------------------------------------------------------- */

/* ---------------- Bandes pleine largeur ----------------
 * Une section sur deux se détache sur un fond chaud. C'est ce qui
 * donne son rythme à une page longue : le lecteur qui fait défiler
 * voit la structure avant de lire le texte.
 */
/* Panneau posé sur la page, et non bandeau collé aux bords.
 *
 * Ces sections couraient d'un bord de la fenêtre à l'autre, à angles
 * vifs, avec un filet en haut et un en bas. Elles donnaient bien le
 * rythme voulu, mais elles ne ressemblaient à rien d'autre sur le site :
 * l'en-tête est une capsule, la barre de contact est une capsule, les
 * cartes sont arrondies. Seules ces bandes restaient rectangulaires et
 * pleine largeur, ce qui les faisait lire comme un fond plutôt que
 * comme un contenu.
 *
 * Elles rentrent donc dans la gouttière et prennent « --be-radius-xl »,
 * le rayon déjà réservé aux formes flottantes du site. Le rythme est
 * conservé — une section sur deux reste sur fond chaud — mais la page
 * n'a plus qu'un seul vocabulaire de formes. */
.be-band {
	grid-column: pleine;
	margin-block: var(--be-space-2xl);
	margin-inline: clamp(0.75rem, 3vw, 2.25rem);
	padding-block: clamp(2.25rem, 5vw, 3.5rem);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-xl);
	background-color: var(--be-oak-100);
}

.be-band--warm {
	background-color: var(--be-almond-200);
}

.be-band--dark {
	background-color: var(--be-yale);
	border-color: var(--be-yale-700);
	color: var(--be-oak-100);
}

.be-band__inner {
	max-width: var(--be-container);
	margin-inline: auto;
	padding-inline: var(--be-space-md);
}

/* Dans une bande, le titre reprend la mesure du fil de lecture plutôt
 * que la largeur de la bande : un titre sur 1 200 px flotterait. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band :is(h2, h3) {
	margin-top: 0;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band--dark :is(h2, h3) {
	color: #fff;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band--dark :is(p, li) {
	color: rgba(247, 244, 241, 0.86);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band--dark h2::before {
	background-color: var(--be-almond);
}

/* Chapeau de section : un court paragraphe sous le titre, qui annonce
 * ce que la section contient. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band__lead {
	max-width: 46rem;
	margin-bottom: var(--be-space-lg);
	font-size: var(--be-fs-lg);
	line-height: 1.55;
	color: var(--be-text-muted);
}

/* Dans une bande, seules les grilles ont besoin des 1 200 px. Le texte,
 * lui, garde la mesure du fil de lecture : sinon les lignes y font le
 * double de longueur qu'ailleurs sur la page, et la lecture décroche au
 * passage d'une section à l'autre. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band__inner > p,
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band__inner > .be-tip {
	max-width: 46rem;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band__inner .be-flow {
	max-width: 52rem;
}

/* ---------------- L'essentiel ----------------
 * Carte posée juste sous le chapô : trois ou quatre lignes qui
 * répondent aux questions que tout le monde pose, pour le visiteur
 * qui ne lira pas la page entière. Reprise de la logique du bloc
 * « L'essentiel à retenir » qu'emploient les meilleures pages du
 * secteur — sauf que le nôtre est chiffré.
 */
.be-key {
	grid-column: large;
	margin-block: var(--be-space-xl);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-md);
	overflow: hidden;
}

.be-key__head {
	display: flex;
	align-items: center;
	gap: 0.65rem;
	padding: var(--be-space-sm) var(--be-space-lg);
	background-color: var(--be-yale);
	color: var(--be-oak-100);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
}

/* Deux colonnes fixes, et non « auto-fit » : avec quatre entrées, le
 * remplissage automatique en plaçait trois sur la première rangée et
 * laissait la seconde aux deux tiers vide. Une grille 2 × 2 se lit
 * comme un tableau de bord. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-key__list {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0;
	margin: 0;
	padding: 0;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-key__list li {
	margin: 0;
	padding: var(--be-space-md) var(--be-space-lg);
	border-top: 1px solid var(--be-oak-200);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-key__list li::before {
	content: none;
}

/* La première rangée n'a pas de filet horizontal : l'en-tête en tient
 * lieu. Le filet vertical, lui, ne se pose que sur la colonne de
 * droite, sinon il redouble le bord de la carte. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-key__list li:nth-child(-n + 2) {
	border-top: 0;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-key__list li:nth-child(2n) {
	border-left: 1px solid var(--be-oak-200);
}

.be-key__q {
	display: block;
	margin-bottom: 0.15rem;
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-key__a {
	display: block;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.3;
	color: var(--be-charcoal);
}

.be-key__a small {
	display: block;
	margin-top: 0.2rem;
	font-family: var(--be-font-body);
	font-size: var(--be-fs-sm);
	font-weight: 400;
	line-height: 1.45;
	color: var(--be-text-muted);
}

/* ---------------- Usages ----------------
 * Grille de cartes plutôt qu'une liste à puces. Les usages sont ce que
 * le visiteur cherche en premier — « est-ce que ça convient à ma
 * terrasse ? » — et une liste de douze entrées ne se lit pas.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-uses {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
	gap: var(--be-space-md);
	margin: 0;
	padding: 0;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-uses > li {
	display: flex;
	flex-direction: column;
	gap: 0.25rem;
	margin: 0;
	padding: var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	transition: border-color var(--be-transition), transform var(--be-transition),
		box-shadow var(--be-transition);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-uses > li::before {
	content: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-uses > li:hover {
	border-color: var(--be-oak);
	transform: translateY(-2px);
	box-shadow: var(--be-shadow-sm);
}

.be-uses__name {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 700;
	color: var(--be-charcoal);
}

.be-uses__note {
	font-size: var(--be-fs-sm);
	line-height: 1.5;
	color: var(--be-text-muted);
}

/* Épaisseur recommandée : la donnée qui rend la carte utile plutôt
 * que décorative. Alignée en bas pour que les cartes se répondent
 * quelle que soit la longueur du texte. */
.be-uses__spec {
	margin-top: auto;
	padding-top: var(--be-space-sm);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	color: var(--be-yale);
	font-variant-numeric: tabular-nums;
}

/* ---------------- Avantages et limites ----------------
 * Deux colonnes face à face. Afficher les limites est un parti pris :
 * une page qui n'énumère que des avantages se lit comme une brochure.
 */
.be-pros {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
	gap: var(--be-space-lg);
	margin-block: var(--be-space-lg);
}

.be-pros__col {
	padding: var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
}

.be-pros__col--plus {
	border-top: 3px solid var(--be-baltic);
}

.be-pros__col--moins {
	border-top: 3px solid var(--be-oak);
	background-color: var(--be-oak-100);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros__title {
	display: flex;
	align-items: center;
	gap: 0.5rem;
	margin: 0 0 var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	color: var(--be-charcoal);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros__title::before {
	content: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros li {
	position: relative;
	margin-bottom: var(--be-space-sm);
	padding-left: 1.7rem;
	font-size: var(--be-fs-sm);
	line-height: 1.6;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros li:last-child {
	margin-bottom: 0;
}

/* Coche et tiret dessinés en masque : aucune police d'icônes. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros__col--plus li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.28em;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background-color: var(--be-baltic);
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6 12-12-1.4-1.4z'/%3E%3C/svg%3E") center / 13px 13px no-repeat,
		linear-gradient(#000, #000);
	-webkit-mask-composite: xor;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6 12-12-1.4-1.4z'/%3E%3C/svg%3E") center / 13px 13px no-repeat,
		linear-gradient(#000, #000);
	mask-composite: exclude;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-pros__col--moins li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.72em;
	width: 12px;
	height: 2px;
	border-radius: 2px;
	background-color: var(--be-oak);
	box-shadow: none;
}

/* ---------------- Étapes de pose ----------------
 * Frise numérotée : un chantier est une suite d'opérations dont
 * l'ordre compte, et la liste ordonnée par défaut ne le montre pas.
 *
 * Nommée « be-flow » et non « be-steps » : la page d'accueil possède
 * déjà un composant « .be-steps », qui est une rangée horizontale de
 * cartes (section 8d). Les deux se seraient marché dessus — la frise
 * y héritait de ses colonnes et se déroulait de gauche à droite.
 */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-flow {
	counter-reset: be-flow-n;
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 0;
	margin: var(--be-space-lg) 0 0;
	padding: 0;
	list-style: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-flow > li {
	counter-increment: be-flow-n;
	position: relative;
	margin: 0;
	padding: 0 0 var(--be-space-lg) 3.5rem;
}

/* Le trait qui relie les pastilles. Interrompu sur la dernière étape,
 * sans quoi il pendrait dans le vide sous le dernier point. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-flow > li::after {
	content: "";
	position: absolute;
	left: 1.09rem;
	top: 2.4rem;
	bottom: 0;
	width: 2px;
	background-color: var(--be-oak-200);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-flow > li:last-child {
	padding-bottom: 0;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-flow > li:last-child::after {
	content: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-flow > li::before {
	content: counter(be-flow-n);
	position: absolute;
	left: 0;
	top: 0;
	display: grid;
	place-items: center;
	width: 2.25rem;
	height: 2.25rem;
	border-radius: 50%;
	background-color: var(--be-yale);
	color: var(--be-oak-100);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 800;
	line-height: 1;
	box-shadow: 0 0 0 4px var(--be-oak-100);
}

.be-flow__name {
	display: block;
	margin-bottom: 0.2rem;
	padding-top: 0.3rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.3;
	color: var(--be-charcoal);
}

.be-flow__text {
	display: block;
	font-size: var(--be-fs-sm);
	line-height: 1.65;
	color: var(--be-text-muted);
}

/* Délai ou condition attachée à l'étape : l'information qui manque
 * partout ailleurs et qui fait la différence sur un chantier. */
.be-flow__when {
	display: inline-block;
	margin-top: var(--be-space-xs);
	padding: 0.2rem 0.6rem;
	border-radius: 999px;
	background-color: var(--be-almond-200);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	color: var(--be-yale-700);
	font-variant-numeric: tabular-nums;
}

/* Sur fond chaud, la pastille de délai doit rester détachée. */
.be-band--warm .be-flow__when {
	background-color: #fff;
}

.be-band--warm :is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-flow > li::before,
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band--warm .be-steps > li::before {
	box-shadow: 0 0 0 4px var(--be-almond-200);
}

/* ---------------- Fiche technique ----------------
 * Grille de paires libellé / valeur. C'est le bloc qui nous place au
 * niveau des sources techniques du secteur : aucun concurrent
 * commercial ne publie ces chiffres.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-specs {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
	gap: 1px;
	margin: var(--be-space-lg) 0 0;
	padding: 0;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-oak-200);
	overflow: hidden;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-specs > div {
	margin: 0;
	padding: var(--be-space-md);
	background-color: var(--be-bg);
}

.be-specs__k {
	display: block;
	margin-bottom: 0.2rem;
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-specs__v {
	display: block;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.25;
	color: var(--be-charcoal);
	font-variant-numeric: tabular-nums;
}

.be-specs__v small {
	display: block;
	margin-top: 0.15rem;
	font-family: var(--be-font-body);
	font-size: var(--be-fs-xs);
	font-weight: 400;
	line-height: 1.45;
	color: var(--be-text-muted);
}

/* ---------------- Planches d'images ----------------
 * Nuanciers de granulats, planches de motifs, photos de chantier.
 *
 * Ce sont les images de la médiathèque du site, pas des pastilles de
 * couleur dessinées en CSS : une teinte à plat ne rend ni le grain, ni
 * le calibre, ni ce que donne la surface une fois mouillée, et elle
 * laisserait croire à un échantillon fidèle.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-gallery {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
	gap: var(--be-space-md);
	margin: var(--be-space-lg) 0 var(--be-space-md);
	padding: 0;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-gallery > li {
	margin: 0;
	padding: 0;
	text-align: center;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-gallery > li::before {
	content: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-gallery img {
	display: block;
	width: 100%;
	aspect-ratio: 4 / 3;
	object-fit: cover;
	border-radius: var(--be-radius);
	border: 1px solid var(--be-oak-200);
	box-shadow: var(--be-shadow-sm);
	transition: transform var(--be-transition), box-shadow var(--be-transition);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-gallery > li:hover img {
	transform: translateY(-2px);
	box-shadow: var(--be-shadow-md);
}

/* --- Agrandissement ---
 * Les vignettes et les nuanciers ouvrent la visionneuse (Simple
 * Lightbox, actif sur les articles). Encore faut-il que ça se voie :
 * une image qui s'agrandit sans le dire n'est jamais cliquée. D'où la
 * pastille loupe, visible au survol comme au focus clavier.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-gallery__link,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-zoom > a {
	position: relative;
	display: block;
	border-radius: var(--be-radius);
	text-decoration: none;
	cursor: zoom-in;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-zoom > a {
	border-radius: var(--be-radius-lg);
	overflow: hidden;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(.be-gallery__link, .be-zoom > a)::after {
	content: "";
	position: absolute;
	right: 0.5rem;
	bottom: 0.5rem;
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background-color: rgba(11, 79, 108, 0.92);
	/* Loupe dessinée en masque : aucune police d'icônes à charger. */
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' d='M10.5 4a6.5 6.5 0 106.5 6.5A6.5 6.5 0 0010.5 4zm4.6 11.1L20 20M8 10.5h5M10.5 8v5'/%3E%3C/svg%3E") center / 18px 18px no-repeat,
		linear-gradient(#000, #000);
	-webkit-mask-composite: source-in;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='none' stroke='%23000' stroke-width='2' stroke-linecap='round' d='M10.5 4a6.5 6.5 0 106.5 6.5A6.5 6.5 0 0010.5 4zm4.6 11.1L20 20M8 10.5h5M10.5 8v5'/%3E%3C/svg%3E") center / 18px 18px no-repeat,
		linear-gradient(#000, #000);
	mask-composite: intersect;
	opacity: 0;
	transform: translateY(4px);
	transition: opacity var(--be-transition), transform var(--be-transition);
	pointer-events: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(.be-gallery__link, .be-zoom > a):hover::after,
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(.be-gallery__link, .be-zoom > a):focus-visible::after {
	opacity: 1;
	transform: translateY(0);
}

/* Sur un écran tactile il n'y a pas de survol : la pastille reste
 * affichée, sans quoi rien n'indiquerait que l'image s'ouvre. */
@media (hover: none) {
	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) :is(.be-gallery__link, .be-zoom > a)::after {
		opacity: 1;
		transform: none;
	}
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-zoom > a::after {
	right: 0.75rem;
	bottom: 0.75rem;
	width: 36px;
	height: 36px;
}

.be-gallery__name {
	display: block;
	margin-top: var(--be-space-xs);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	line-height: 1.35;
	color: var(--be-charcoal);
}

.be-gallery__note {
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
	font-style: italic;
}


/* ---------------- Tranches de prix ----------------
 * Le prix au mètre carré baisse avec la surface, et aucun concurrent
 * ne l'explique. Ce tableau en fait l'argument principal plutôt qu'une
 * note de bas de page.
 */
.be-price {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(190px, 1fr));
	gap: var(--be-space-md);
	margin: var(--be-space-lg) 0 var(--be-space-md);
	padding: 0;
	list-style: none;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-price > li {
	display: flex;
	flex-direction: column;
	margin: 0;
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-sm);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-price > li::before {
	content: none;
}

.be-price__range {
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-price__value {
	margin-top: 0.3rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-2xl);
	font-weight: 800;
	line-height: 1.05;
	letter-spacing: -0.03em;
	color: var(--be-yale);
	font-variant-numeric: tabular-nums;
}

.be-price__unit {
	font-size: var(--be-fs-base);
	font-weight: 700;
	letter-spacing: 0;
	color: var(--be-text-muted);
}

.be-price__note {
	margin-top: var(--be-space-xs);
	font-size: var(--be-fs-xs);
	line-height: 1.5;
	color: var(--be-text-muted);
}

/* La dernière tranche n'a pas de chiffre : au-delà, c'est un métré.
 * Elle se distingue pour que l'absence se lise comme une réponse et
 * non comme un oubli. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-price > li.is-devis {
	background-color: var(--be-yale);
	border-color: var(--be-yale);
}

.is-devis .be-price__range {
	color: rgba(247, 244, 241, 0.75);
}

.is-devis .be-price__value {
	color: #fff;
	font-size: var(--be-fs-xl);
}

.is-devis .be-price__note {
	color: rgba(247, 244, 241, 0.8);
}

/* ---------------- Appel à l'action ----------------
 * Remplace le bandeau centré qui fermait la page. Deux défauts : il
 * arrivait après le dernier mot, quand le visiteur décidé était déjà
 * parti, et un bloc centré sur fond uni ne se distinguait pas du pied
 * de page qui le suivait.
 *
 * Ici : une carte en deux colonnes, posée au milieu du contenu (voir
 * inc/finitions-sections.php, qui l'insère après la section des prix).
 * Le texte à gauche, les repères concrets à droite — ce sont eux qui
 * répondent à la vraie question, « qu'est-ce qui se passe si je
 * clique ».
 */
.be-cta {
	grid-column: large;
	margin-block: var(--be-space-2xl);
	padding: 0;
	border: 0;
	border-radius: var(--be-radius-lg);
	background: linear-gradient(135deg, var(--be-yale) 0%, var(--be-yale-800) 100%);
	color: var(--be-oak-100);
	text-align: left;
	box-shadow: var(--be-shadow-lg);
	overflow: hidden;
}

.be-cta__inner {
	display: grid;
	grid-template-columns: minmax(0, 1.25fr) minmax(0, 1fr);
	gap: 0;
	max-width: none;
	margin: 0;
}

.be-cta__body {
	padding: clamp(1.6rem, 3.5vw, 2.5rem);
}

/* Le titre de la carte est un paragraphe, pas un « h2 ».
 *
 * Deux raisons. D'abord le sens : un appel à l'action n'est pas une
 * section du document, et il n'a rien à faire dans le plan de la page
 * ni dans le sommaire. Ensuite la cohabitation : le calculateur de prix
 * (inc/prix.php) repère les fins de section en cherchant les « </h2> »
 * pour s'insérer après l'une d'elles — le titre de cette carte en était
 * un, et le calculateur venait se loger à l'intérieur. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta p.be-cta__title,
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta :is(h2, h3) {
	margin: 0 0 var(--be-space-sm);
	color: #fff;
	font-family: var(--be-font-display);
	font-size: clamp(1.4rem, 2.6vw, 1.85rem);
	font-weight: 800;
	line-height: 1.15;
	letter-spacing: -0.02em;
	max-width: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta :is(h2, h3)::before {
	content: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta p {
	margin: 0 0 var(--be-space-lg);
	max-width: 42ch;
	color: rgba(247, 244, 241, 0.82);
	font-size: var(--be-fs-base);
	line-height: 1.6;
}

.be-cta__actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--be-space-md);
}

/* Bouton clair sur fond sombre : le bleu Baltic tomberait à 1,30:1
 * contre le Yale et disparaîtrait (voir color-palette.md). */
.be-cta .be-btn--primary {
	background-color: #fff;
	border-color: #fff;
	color: var(--be-yale);
	padding: 0.9rem 1.6rem;
	font-size: var(--be-fs-base);
}

.be-cta .be-btn--primary:hover,
.be-cta .be-btn--primary:focus {
	background-color: var(--be-oak-100);
	border-color: var(--be-oak-100);
	color: var(--be-yale-700);
}

.be-cta__tel {
	display: inline-flex;
	align-items: center;
	gap: 0.45rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	color: #fff;
	text-decoration: none;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__tel {
	color: #fff;
	text-decoration: none;
}

.be-cta__tel:hover,
.be-cta__tel:focus {
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

.be-cta__tel svg {
	width: 18px;
	height: 18px;
	flex: 0 0 auto;
	opacity: 0.8;
}

/* Colonne de droite : ce qui se passe après le clic. */
.be-cta__aside {
	padding: clamp(1.6rem, 3.5vw, 2.5rem);
	background-color: rgba(255, 255, 255, 0.07);
	border-left: 1px solid rgba(247, 244, 241, 0.16);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__points {
	margin: 0;
	padding: 0;
	list-style: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__points li {
	position: relative;
	margin: 0 0 var(--be-space-md);
	padding-left: 1.7rem;
	font-size: var(--be-fs-sm);
	line-height: 1.5;
	color: rgba(247, 244, 241, 0.88);
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__points li:last-child {
	margin-bottom: 0;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__points li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.2em;
	width: 18px;
	height: 18px;
	border-radius: 50%;
	background-color: var(--be-almond);
	box-shadow: none;
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6 12-12-1.4-1.4z'/%3E%3C/svg%3E") center / 13px 13px no-repeat,
		linear-gradient(#000, #000);
	-webkit-mask-composite: xor;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M9.6 16.2 5.4 12l-1.4 1.4 5.6 5.6 12-12-1.4-1.4z'/%3E%3C/svg%3E") center / 13px 13px no-repeat,
		linear-gradient(#000, #000);
	mask-composite: exclude;
}

/* Sélecteur porté au niveau de « :is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) strong »,
 * qui met le gras en Charcoal : sur ce fond sombre, il disparaissait. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__points strong {
	display: block;
	color: #fff;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	line-height: 1.3;
}

/* Les liens du fil de lecture sont soulignés ; dans cette carte, ce
 * sont un bouton et un numéro de téléphone, pas des liens de texte. */
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta a {
	text-decoration: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta a:hover,
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta a:focus {
	text-decoration: none;
}

:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__tel:hover,
:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-cta__tel:focus {
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

@media (max-width: 720px) {
	.be-cta__inner {
		grid-template-columns: 1fr;
	}

	.be-cta__aside {
		border-left: 0;
		border-top: 1px solid rgba(247, 244, 241, 0.16);
	}

	.be-cta__actions .be-btn {
		width: 100%;
	}
}

/* ---------------- Repère inline ----------------
 * Petit encart à poser au fil du texte : une précaution de chantier,
 * un ordre de grandeur, une confusion fréquente à lever.
 */
.be-tip {
	position: relative;
	margin-block: var(--be-space-lg);
	padding: var(--be-space-md) var(--be-space-lg) var(--be-space-md) 3.25rem;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-almond-200);
}

.be-tip::before {
	content: "";
	position: absolute;
	left: var(--be-space-md);
	top: var(--be-space-md);
	width: 22px;
	height: 22px;
	border-radius: 50%;
	background-color: var(--be-yale);
	-webkit-mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M11 7h2v2h-2zm0 4h2v6h-2zm1-9a10 10 0 100 20 10 10 0 000-20z'/%3E%3C/svg%3E") center / 22px 22px no-repeat;
	mask: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23000' d='M11 7h2v2h-2zm0 4h2v6h-2zm1-9a10 10 0 100 20 10 10 0 000-20z'/%3E%3C/svg%3E") center / 22px 22px no-repeat;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-tip > :last-child {
	margin-bottom: 0;
}

.be-tip__title {
	display: block;
	margin-bottom: 0.15rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 700;
	color: var(--be-charcoal);
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-tip p {
	font-size: var(--be-fs-sm);
	line-height: 1.6;
	color: var(--be-text-muted);
}

/* ---------------- Comparatif ----------------
 * Tableau à en-tête collant : les comparatifs des plans par finition
 * font six à onze lignes, et l'en-tête disparaît au défilement.
 */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-compare {
	grid-column: large;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-compare thead th {
	position: sticky;
	top: var(--be-header-clear);
	z-index: 1;
}

/* Colonne mise en avant : la finition dont on est en train de parler. */
:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-compare :is(td, th).is-nous {
	background-color: var(--be-almond-200);
	font-weight: 700;
}

:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-compare thead th.is-nous {
	background-color: var(--be-baltic);
}

@media (max-width: 767px) {
	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-key__list,
	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-specs,
	.be-pros,
	.be-price {
		grid-template-columns: 1fr;
	}

	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) .be-steps > li {
		padding-left: 3rem;
	}
}


/* ------------------------------------------------------------------
 * 8i. CALCULATEURS
 * Masters : scripts/calculators/ · insertion : inc/prix.php.
 * Architecture : docs/calculators.md.
 *
 * Les formulaires sont produits par Calculated Fields Form. Leur
 * balisage est construit en JavaScript et n'est donc pas modifiable :
 *
 *   form.cff-form.cp_cff_18
 *     #fbuilder > #fbuilder_N > #fieldlist_N.top_aligned > div.pbreak.pb0
 *       div.fields.<nos classes>.<fieldnameN>.cff-<type>-field
 *         label + div.dfield > (input|select) + span.uh
 *
 * Quatre conséquences, qui expliquent tout ce qui suit :
 *
 *   1. La liste de champs est plate : aucun conteneur n'entoure les
 *      résultats, donc pas de « panneau » possible. Chaque résultat
 *      porte lui-même sa mise en forme, et une grille à six colonnes
 *      recompose la page à partir des seules classes que nous posons
 *      sur les champs (calc-input, calc-result--tile, calc-result--line…).
 *   2. Un résultat est un <input readonly>. On lui retire donc tout
 *      l'habillage du champ de saisie pour qu'il se lise comme un
 *      chiffre et non comme quelque chose à remplir.
 *   3. Les feuilles du plugin ciblent « #fbuilder … », donc avec un
 *      identifiant. Nos règles doivent le reprendre, sinon elles
 *      perdent la cascade malgré deux classes. D'où le préfixe
 *      « .be-calc .cp_cff_18 #fbuilder » répété partout : il n'est pas
 *      décoratif, c'est la condition pour que la règle s'applique.
 *   4. Le calcul se déclenche au clic (evalequations = 0, voir
 *      scripts/calculators/lib.php). Tant que la saisie n'a pas été
 *      validée, la classe « be-calc--done » est absente du formulaire
 *      et toute la partie résultats reste masquée : le bloc s'ouvre
 *      en formulaire court, et le budget est une réponse, pas un
 *      compteur qui défile pendant la frappe.
 *
 * Le gabarit visuel du plugin (« Template 18 ») est repris plutôt que
 * combattu : il déclare ses couleurs en variables CSS, qu'il suffit de
 * redéfinir sur le formulaire pour qu'il adopte la palette maison.
 * Seules les valeurs qu'il écrit en dur — la police, les bordures des
 * champs — demandent une surcharge.
 * ---------------------------------------------------------------- */

.be-calc {
	margin-block: var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-sm);
	overflow: hidden;
}

/* --- L'en-tête ---
 * Un formulaire qui s'ouvre sur « Votre projet » ne dit pas ce qu'il fait.
 * Cette bande l'annonce avant la première question : de quoi il s'agit,
 * sur quelle finition, et ce qu'on obtient en échange de deux réponses.
 * Structure : inc/prix.php, beton_expert_calculateur_entete().
 */
.be-calc__head {
	padding: clamp(1.1rem, 2.6vw, 1.6rem) clamp(1.25rem, 3vw, 2rem);
	background-color: var(--be-yale);
	color: var(--be-oak-100);
}

.be-calc__eyebrow {
	margin: 0;
	color: var(--be-oak);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
}

:is(.be-finition, .be-prix-page, .be-prix-pilier) .entry-content .be-calc__title,
.be-calc__title {
	margin: var(--be-space-2xs) 0 0;
	color: #fff;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	letter-spacing: -0.02em;
	line-height: 1.2;
}

:is(.be-finition, .be-prix-page, .be-prix-pilier) .entry-content .be-calc__lead,
.be-calc__lead {
	margin: var(--be-space-xs) 0 0;
	color: rgba(247, 244, 241, 0.82);
	font-size: var(--be-fs-sm);
	line-height: 1.6;
	max-width: 62ch;
}

/* Le calculateur et le tableau des tranches débordent de la mesure de
 * lecture, comme les tableaux et les figures : ce sont des objets à
 * balayer du regard, pas des paragraphes. */
:is(.be-finition, .be-prix-page, .be-prix-pilier) .entry-content > .be-calc,
:is(.be-finition, .be-prix-page, .be-prix-pilier) .entry-content > .be-price {
	grid-column: large;
}

/* Mention légale des blocs de prix rendus par le thème. */
.be-prix__mention {
	margin-top: var(--be-space-sm);
	color: var(--be-text-muted);
	font-size: var(--be-fs-xs);
	line-height: 1.6;
}

/* --- Le cadre --- */

.be-calc form.cff-form {
	/* Marque et action */
	--cff-18-color-brand-500: var(--be-baltic);
	--cff-18-color-brand-600: var(--be-baltic-600);
	--cff-18-color-brand-700: var(--be-baltic-700);
	--cff-18-shadow-focus: 0 0 0 4px rgba(20, 92, 158, 0.18);

	/* Surfaces et texte */
	--cff-18-color-surface-base: var(--be-bg);
	--cff-18-color-surface-sunken: var(--be-almond-200);
	--cff-18-color-text-primary: var(--be-charcoal);
	--cff-18-color-text-secondary: var(--be-text-muted);
	--cff-18-color-text-tertiary: var(--be-text-muted);
	--cff-18-color-border-default: var(--be-oak-200);
	--cff-18-color-border-strong: var(--be-oak);
	--cff-18-color-border-focus: var(--be-baltic);

	/* Formes */
	--cff-18-radius-sm: var(--be-radius);
	--cff-18-radius-md: var(--be-radius);
	--cff-18-radius-lg: var(--be-radius-lg);
	--cff-18-font-family: var(--be-font-body);

	/* Rouge des erreurs : celui de la page contact (section 8c). */
	--be-calc-error: #a3301f;

	position: relative;
	margin: 0;
	padding: clamp(1.25rem, 3vw, 2rem);
	border: 0;
	background-color: var(--be-bg);
}

/* Le gabarit impose sa pile de polices système en dur, sans passer par
 * sa propre variable : sans cette reprise, le calculateur serait le
 * seul bloc de la page à ne pas être en Plus Jakarta Sans. */
.be-calc .cp_cff_18 #fbuilder * {
	font-family: inherit;
}

/* Éléments de service : ils occupent une cellule de la grille sans
 * rien afficher. Le « clearer » du plugin est déclaré en display:block
 * derrière un identifiant, d'où la reprise complète du sélecteur. */
.be-calc .cp_cff_18 #fbuilder .cpefb_error,
.be-calc .cp_cff_18 #fbuilder .clearer,
.be-calc .cp_cff_18 #fbuilder .cpcaptchalayer,
.be-calc .cp_cff_18 #fbuilder [id^="formheader_"]:empty {
	display: none;
}

/* --- La grille ---
 * Six colonnes : un champ de saisie en occupe trois (deux par ligne),
 * une tuile de résultat deux (trois par ligne), une ligne de détail
 * trois, un titre de section les six. Une seule grille sert ainsi
 * trois rythmes sans conteneur intermédiaire.
 */
.be-calc .cp_cff_18 #fbuilder .pbreak.pb0 {
	display: grid;
	grid-template-columns: repeat(6, minmax(0, 1fr));
	gap: var(--be-space-md);
	align-items: start;
}

.be-calc .cp_cff_18 #fbuilder .fields {
	grid-column: span 6;
	margin: 0;
	padding: 0;
	min-width: 0;
}

.be-calc .cp_cff_18 #fbuilder .fields.calc-input {
	grid-column: span 3;
}

.be-calc .cp_cff_18 #fbuilder .fields.calc-result--tile {
	grid-column: span 3;
}

.be-calc .cp_cff_18 #fbuilder .fields.calc-result--key {
	grid-column: span 6;
}

.be-calc .cp_cff_18 #fbuilder .fields.calc-result--line {
	grid-column: span 2;
}

.be-calc .cp_cff_18 #fbuilder .dfield {
	padding-top: 0;
}

/* --- Titres de section --- */

.be-calc .cp_cff_18 #fbuilder .section_break {
	display: none;
}

.be-calc .cp_cff_18 #fbuilder .calc-section > label {
	display: block;
	margin: 0;
	color: var(--be-yale);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.1em;
	line-height: 1.3;
	text-transform: uppercase;
}

/* Le titre des résultats ouvre la seconde moitié du bloc : il porte
 * donc le filet, là où celui de la saisie n'en a pas besoin. */
.be-calc .cp_cff_18 #fbuilder .calc-section--result {
	margin-top: var(--be-space-sm);
	padding-top: var(--be-space-lg);
	border-top: 1px solid var(--be-oak-200);
}

/* La mention finale n'est pas un titre de section mais une réserve :
 * elle en prend l'apparence, en bas et en petit. */
.be-calc .cp_cff_18 #fbuilder .calc-section--note > label {
	color: var(--be-text-muted);
	font-family: var(--be-font-body);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	letter-spacing: 0;
	text-transform: none;
}

/* --- Champs de saisie --- */

.be-calc .cp_cff_18 #fbuilder .fields > label {
	display: block;
	margin-bottom: var(--be-space-2xs);
	color: var(--be-charcoal);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	line-height: 1.4;
}

/* Les champs sont tous indispensables et le formulaire ne s'envoie
 * jamais : l'astérisque n'apprend rien et alourdit le libellé. */
.be-calc .cp_cff_18 #fbuilder .fields > label .r {
	display: none;
}

.be-calc .cp_cff_18 #fbuilder .calc-input input,
.be-calc .cp_cff_18 #fbuilder .calc-input select {
	width: 100%;
	max-width: 100%;
	min-height: 52px;
	padding: 0.7rem 0.9rem;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius);
	background-color: var(--be-bg);
	color: var(--be-charcoal);
	font-size: var(--be-fs-base);
	font-weight: 600;
	font-variant-numeric: tabular-nums;
	line-height: 1.3;
	transition: border-color var(--be-transition), box-shadow var(--be-transition);
}

/* La flèche de la liste déroulante est une image de fond posée à
 * droite par le gabarit : on lui laisse sa place. */
.be-calc .cp_cff_18 #fbuilder .calc-input select {
	padding-right: 2.25rem;
}

.be-calc .cp_cff_18 #fbuilder .calc-input input:hover,
.be-calc .cp_cff_18 #fbuilder .calc-input select:hover {
	border-color: var(--be-oak);
}

.be-calc .cp_cff_18 #fbuilder .calc-input input:focus,
.be-calc .cp_cff_18 #fbuilder .calc-input select:focus {
	outline: none;
	border-color: var(--be-baltic);
	box-shadow: 0 0 0 4px rgba(20, 92, 158, 0.18);
}

/* Aide sous le champ : elle porte la précision qui évite un appel —
 * elle reste donc lisible, et non en gris clair et en italique comme
 * le gabarit la pose. */
.be-calc .cp_cff_18 #fbuilder span.uh {
	display: block;
	margin-top: var(--be-space-2xs);
	color: var(--be-text-muted);
	font-size: var(--be-fs-xs);
	font-style: normal;
	line-height: 1.5;
}

.be-calc .cp_cff_18 #fbuilder span.uh:empty {
	display: none;
}

/* --- Saisie refusée ---
 * La validation tourne au clic (lib.php, BE_CALC_VALIDATION) : c'est
 * le seul moment où le visiteur attend un verdict.
 */
.be-calc .cp_cff_18 #fbuilder .be-invalid input {
	border-color: var(--be-calc-error);
	background-color: #fdf5f3;
}

.be-calc .cp_cff_18 #fbuilder .be-calc__error {
	display: block;
	margin-top: var(--be-space-2xs);
	color: var(--be-calc-error);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	line-height: 1.5;
}

/* --- Le bouton --- */

.be-calc .cp_cff_18 #fbuilder .fields.calc-action {
	grid-column: span 3;
	align-self: start;
	margin-top: 1.6rem;
}

.be-calc .cp_cff_18 #fbuilder .calc-action input,
.be-calc .cp_cff_18 #fbuilder .calc-devis input {
	display: inline-flex;
	width: auto;
	min-height: 52px;
	padding: 0.85rem 1.75rem;
	border: 1px solid var(--be-action);
	border-radius: var(--be-radius);
	background-color: var(--be-action);
	color: #fff;
	font-family: var(--be-font-body);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	letter-spacing: 0.01em;
	cursor: pointer;
	transition: background-color var(--be-transition), border-color var(--be-transition),
		transform var(--be-transition), box-shadow var(--be-transition);
}

.be-calc .cp_cff_18 #fbuilder .calc-action input:hover,
.be-calc .cp_cff_18 #fbuilder .calc-action input:focus,
.be-calc .cp_cff_18 #fbuilder .calc-devis input:hover,
.be-calc .cp_cff_18 #fbuilder .calc-devis input:focus {
	background-color: var(--be-action-hover);
	border-color: var(--be-action-hover);
	transform: translateY(-1px);
	box-shadow: var(--be-shadow-sm);
}

.be-calc .cp_cff_18 #fbuilder .calc-action input:active,
.be-calc .cp_cff_18 #fbuilder .calc-devis input:active {
	transform: translateY(0);
	box-shadow: none;
}

/* --- Résultats ---
 * Masqués tant que le calcul n'a pas été demandé : le bloc s'ouvre en
 * formulaire court, et ce qui apparaît après le clic est une réponse.
 */
.be-calc form.cff-form:not(.be-calc--done) #fbuilder .fields.calc-section--result,
.be-calc form.cff-form:not(.be-calc--done) #fbuilder .fields.calc-section--note,
.be-calc form.cff-form:not(.be-calc--done) #fbuilder .fields.calc-section--avertissement,
.be-calc form.cff-form:not(.be-calc--done) #fbuilder .fields.calc-result,
.be-calc form.cff-form:not(.be-calc--done) #fbuilder .fields.calc-devis {
	display: none;
}

.be-calc .cff-form.be-calc--done .calc-section--result,
.be-calc .cff-form.be-calc--done .calc-result,
.be-calc .cff-form.be-calc--done .calc-section--avertissement,
.be-calc .cff-form.be-calc--done .calc-devis {
	animation: be-calc-apparition 260ms cubic-bezier(0.4, 0, 0.2, 1) both;
}

@keyframes be-calc-apparition {
	from {
		opacity: 0;
		transform: translateY(6px);
	}
}

/* --- Le montant ---
 * Trois boîtes de même taille ne disent pas laquelle compte. Ici la carte
 * du montant moyen prend toute la largeur, et les deux bornes se partagent
 * la ligne du dessous : le lecteur voit un chiffre, puis sa fourchette.
 *
 * La tranche retenue est collée au-dessus de la carte, comme son bandeau
 * de titre — la marge négative annule la gouttière de la grille. Elle dit
 * d'où vient le montant, et reste la seule sortie qui parle encore au-delà
 * de la surface de métré.
 */
.be-calc .cp_cff_18 #fbuilder .fields.calc-result--chip {
	display: flex;
	align-items: baseline;
	gap: var(--be-space-2xs) var(--be-space-sm);
	padding: var(--be-space-xs) var(--be-space-md);
	border-radius: var(--be-radius);
	background-color: var(--be-almond-200);
}

.be-calc .cp_cff_18 #fbuilder .calc-result--chip > label,
.be-calc .cp_cff_18 #fbuilder .calc-result--key > label,
.be-calc .cp_cff_18 #fbuilder .calc-result--borne > label,
.be-calc .cp_cff_18 #fbuilder .calc-result--line > label {
	flex: 0 1 auto;
	width: auto;
	min-width: 0;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--chip > label {
	margin: 0;
	color: var(--be-text-muted);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	white-space: nowrap;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--chip .dfield {
	flex: 1 1 auto;
	width: auto;
	min-width: 0;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--chip input {
	width: 100%;
	padding: 0;
	border: 0;
	background: none;
	color: var(--be-yale);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	text-overflow: ellipsis;
}

/* La carte du montant : libellé à gauche, chiffre à droite, sur la ligne
 * de base — c'est la lecture d'un total. */
.be-calc .cp_cff_18 #fbuilder .calc-result--key {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--be-space-xs) var(--be-space-md);
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-yale);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-yale);
	box-shadow: var(--be-shadow-sm);
}

.be-calc .cp_cff_18 #fbuilder .calc-result--key > label {
	margin: 0;
	color: rgba(247, 244, 241, 0.8);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--key .dfield {
	flex: 1 1 auto;
	width: auto;
	min-width: 0;
	text-align: right;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--key input {
	width: 100%;
	padding: 0;
	border: 0;
	background: none;
	color: #fff;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-3xl);
	font-weight: 800;
	letter-spacing: -0.035em;
	line-height: 1;
	text-align: right;
	font-variant-numeric: tabular-nums;
}

/* Les deux bornes : même forme, moitié moins de poids. */
.be-calc .cp_cff_18 #fbuilder .calc-result--borne {
	display: block;
	padding: var(--be-space-sm) var(--be-space-md);
	border-radius: var(--be-radius);
	background-color: var(--be-almond-200);
}

.be-calc .cp_cff_18 #fbuilder .calc-result--borne > label {
	margin: 0;
	color: var(--be-text-muted);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.04em;
	text-transform: uppercase;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--borne > label {
	display: block;
	margin-bottom: 0.1rem;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--borne .dfield {
	width: 100%;
	text-align: left;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--borne input {
	width: 100%;
	padding: 0;
	border: 0;
	background: none;
	color: var(--be-yale);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 700;
	letter-spacing: -0.02em;
	text-align: left;
	font-variant-numeric: tabular-nums;
}

/* Au-delà de la surface que nous chiffrons, les montants sont vides : on
 * ne montre pas des cartes sans chiffre. Restent la phrase de métré, la
 * réserve et le bouton de devis — ce qui est exactement la réponse. */
.be-calc form.cff-form.be-calc--metre #fbuilder .fields.calc-result--tile,
.be-calc form.cff-form.be-calc--metre #fbuilder .fields.calc-result--line {
	display: none;
}

/* --- Le détail --- */

.be-calc .cp_cff_18 #fbuilder .calc-result--line {
	display: block;
	padding: var(--be-space-xs) 0 0;
	border-top: 1px solid var(--be-oak-200);
}

.be-calc .cp_cff_18 #fbuilder .calc-result--line > label {
	margin: 0;
	color: var(--be-text-muted);
	font-size: var(--be-fs-sm);
	font-weight: 500;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--line .dfield {
	width: 100%;
	text-align: left;
}

.be-calc .cp_cff_18 #fbuilder .calc-result--line input {
	width: 100%;
	padding: 0;
	border: 0;
	background: none;
	color: var(--be-charcoal);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	text-align: left;
	font-variant-numeric: tabular-nums;
}

/* --- L'avertissement ---
 * Ce n'est pas une mention légale en bas de page : c'est la phrase qui
 * empêche un visiteur de prendre ces chiffres pour un engagement. Elle est
 * traitée comme un encadré, juste avant le bouton de devis, dont elle est
 * la raison d'être.
 */
.be-calc .cp_cff_18 #fbuilder .fields.calc-section--avertissement {
	margin-top: var(--be-space-xs);
	padding: var(--be-space-md);
	border-left: 3px solid var(--be-oak);
	border-radius: 0 var(--be-radius) var(--be-radius) 0;
	background-color: var(--be-almond-200);
}

.be-calc .cp_cff_18 #fbuilder .calc-section--avertissement > label {
	margin-bottom: var(--be-space-2xs);
	color: var(--be-charcoal);
	font-family: var(--be-font-body);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	letter-spacing: 0;
	text-transform: none;
}

.be-calc .cp_cff_18 #fbuilder .calc-section--avertissement span.uh {
	margin-top: 0;
	color: var(--be-text);
	font-size: var(--be-fs-sm);
	line-height: 1.6;
}

/* --- Le départ vers le devis ---
 * N'apparaît qu'une fois le calcul fait : c'est à ce moment que le
 * visiteur sait ce qu'il demande, et le bouton emporte ses chiffres vers
 * le formulaire de contact (inc/devis.php).
 */
.be-calc .cp_cff_18 #fbuilder .fields.calc-devis {
	margin-top: var(--be-space-2xs);
}

.be-calc .cp_cff_18 #fbuilder .calc-devis input {
	font-size: var(--be-fs-base);
}

.be-calc .cp_cff_18 #fbuilder .calc-devis span.uh {
	margin-top: var(--be-space-xs);
}

/* Le calcul redevient l'action secondaire une fois qu'il a servi : c'est le
 * devis qui compte. Baltic Blue reste la seule couleur d'action
 * (design/color-palette.md), la différence se fait sur le remplissage. */
.be-calc .cp_cff_18 .cff-form.be-calc--done .calc-action input {
	background-color: transparent;
	color: var(--be-baltic-700);
}

.be-calc .cp_cff_18 .cff-form.be-calc--done .calc-action input:hover,
.be-calc .cp_cff_18 .cff-form.be-calc--done .calc-action input:focus {
	background-color: var(--be-action);
	color: #fff;
}

/* --- Écrans étroits ---
 * Deux colonnes : tout s'empile, y compris les estimations — un
 * montant à cinq chiffres ne tient pas dans une demi-colonne de
 * téléphone.
 */
@media (max-width: 767px) {

	.be-calc .cp_cff_18 #fbuilder .pbreak.pb0 {
		grid-template-columns: repeat(2, minmax(0, 1fr));
		gap: var(--be-space-sm);
	}

	.be-calc .cp_cff_18 #fbuilder .fields,
	.be-calc .cp_cff_18 #fbuilder .fields.calc-action,
	.be-calc .cp_cff_18 #fbuilder .fields.calc-input,
	.be-calc .cp_cff_18 #fbuilder .fields.calc-result--tile,
	.be-calc .cp_cff_18 #fbuilder .fields.calc-result--line,
	.be-calc .cp_cff_18 #fbuilder .fields.calc-result--chip {
		grid-column: span 2;
	}

	.be-calc .cp_cff_18 #fbuilder .fields.calc-action {
		margin-top: 0;
	}

	.be-calc .cp_cff_18 #fbuilder .calc-action input,
	.be-calc .cp_cff_18 #fbuilder .calc-devis input {
		width: 100%;
	}

	/* Les bornes basse et haute deviennent deux lignes de détail : la
	 * carte centrale reste le seul grand chiffre. */
	.be-calc .cp_cff_18 #fbuilder .calc-result--chip input {
		font-size: var(--be-fs-xs);
	}

	.be-calc .cp_cff_18 #fbuilder .calc-result--key {
		flex-direction: column;
		align-items: flex-start;
		gap: var(--be-space-2xs);
	}

	.be-calc .cp_cff_18 #fbuilder .calc-result--key .dfield {
		text-align: left;
	}

	.be-calc .cp_cff_18 #fbuilder .calc-result--key input {
		font-size: var(--be-fs-2xl);
		text-align: left;
	}


}


/* --- Rappel de l'estimation, sur la page de contact ---
 * Rendu par inc/devis.php quand le visiteur arrive du calculateur. Il n'a
 * pas à se demander si ses chiffres ont suivi : ils sont là, au-dessus du
 * formulaire, et déjà recopiés dans les champs.
 */
.be-devis-recap {
	margin-bottom: var(--be-space-lg);
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-left: 3px solid var(--be-yale);
	border-radius: 0 var(--be-radius-lg) var(--be-radius-lg) 0;
	background-color: var(--be-almond-200);
}

.be-devis-recap__title {
	margin: 0;
	color: var(--be-yale);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
}

.be-devis-recap__meta {
	display: flex;
	flex-wrap: wrap;
	gap: var(--be-space-2xs) var(--be-space-sm);
	margin: var(--be-space-xs) 0 0;
	padding: 0;
	list-style: none;
}

.be-devis-recap__meta li {
	margin: 0;
	padding: 0.15rem 0.6rem;
	border-radius: 999px;
	background-color: var(--be-bg);
	color: var(--be-text);
	font-size: var(--be-fs-xs);
	font-weight: 600;
}

.be-devis-recap__value {
	margin: var(--be-space-sm) 0 0;
	color: var(--be-yale);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-2xl);
	font-weight: 800;
	letter-spacing: -0.03em;
	line-height: 1.1;
	font-variant-numeric: tabular-nums;
}

.be-devis-recap__value span {
	font-size: var(--be-fs-sm);
	font-weight: 600;
	letter-spacing: 0;
	color: var(--be-text-muted);
}

.be-devis-recap__detail {
	margin: var(--be-space-2xs) 0 0;
	color: var(--be-text);
	font-size: var(--be-fs-sm);
	font-weight: 600;
}

.be-devis-recap__note {
	margin: var(--be-space-sm) 0 0;
	color: var(--be-text-muted);
	font-size: var(--be-fs-xs);
	line-height: 1.6;
}


/* ------------------------------------------------------------------
 * 8j. COMPARATEURS
 * Structure : inc/comparateurs.php, données inc/comparateurs-donnees.php.
 *
 * Douze pages « béton X ou béton Y ? », plus leur index. Elles ont leur
 * propre dessin parce qu'elles ont leur propre travail : une page de
 * finition présente, un comparateur tranche. La page est donc construite
 * dans l'ordre d'une décision — la réponse, la démonstration, le cas de
 * chantier — et non dans l'ordre d'une brochure.
 *
 * Deux conventions tiennent toute la section :
 *
 *   1. Les deux côtés sont toujours nommés, jamais seulement colorés.
 *      La teinte (Yale à gauche, Charcoal à droite) redit ce que le texte
 *      a déjà dit ; elle ne porte jamais seule l'information, sans quoi
 *      la page cesserait de fonctionner en noir et blanc ou pour un
 *      daltonien.
 *   2. Le bleu Baltic n'apparaît pas. Il reste le bleu des boutons
 *      (design/color-palette.md) ; une page qui l'emploie pour un tableau
 *      et un médaillon n'a plus de couleur disponible pour l'action.
 * ---------------------------------------------------------------- */

.be-comparateur,
.be-comparateurs-index {
	/* Les deux côtés de toute comparaison. Déclarés ici pour que le
	 * jour où la charte change, les médaillons, les bordures et les
	 * pastilles suivent ensemble. */
	--be-cote-a: var(--be-yale);
	--be-cote-b: var(--be-charcoal);
}

/* ==================================================================
 * Hero face à face
 * ================================================================== */

.be-hero--vs,
.be-hero--vsindex {
	position: relative;
	isolation: isolate;
	background-color: var(--be-bg);
	border-bottom: 1px solid var(--be-oak-200);
	/* Même règle que les autres heros : l'en-tête flotte hors du flux
	 * (section 4), le hero dégage donc lui-même sa hauteur. */
	padding-top: calc(clamp(2.5rem, 5.5vw, 4.75rem) + var(--be-header-clear));
	padding-bottom: clamp(2.5rem, 5vw, 4rem);
	overflow: hidden;
}

.be-hero--vs::before,
.be-hero--vsindex::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	/* Le voile est centré, là où il est décalé vers la photo sur les
	 * autres heros : ici il n'y a pas un sujet et un texte, il y a deux
	 * sujets à égalité. */
	background:
		radial-gradient(70% 90% at 50% 0%, var(--be-almond-200) 0%, rgba(244, 237, 234, 0) 70%),
		linear-gradient(180deg, var(--be-oak-100) 0%, var(--be-bg) 62%);
}

.be-hero--vs .be-hero__inner,
.be-hero--vsindex .be-hero__inner {
	max-width: var(--be-container);
	margin-inline: auto;
	padding-inline: var(--be-space-md);
}

/* Titre et chapô centrés : la symétrie du bloc annonce la symétrie de
 * la comparaison. C'est le seul hero du site qui soit centré avec les
 * heros de contact — partout ailleurs le texte est à gauche, parce qu'il
 * y a une photo à droite. */
.be-vs__head {
	max-width: 46rem;
	margin-inline: auto;
	text-align: center;
}

.be-vs__head .be-eyebrow {
	justify-content: center;
}

.be-hero--vs .be-hero__h1,
.be-hero--vsindex .be-hero__h1 {
	margin: var(--be-space-sm) 0 0;
	color: var(--be-charcoal);
	font-family: var(--be-font-display);
	font-size: clamp(1.95rem, 3.6vw, 2.9rem);
	font-weight: 800;
	line-height: 1.08;
	letter-spacing: -0.03em;
	text-wrap: balance;
}

.be-hero--vs .be-hero__lead,
.be-hero--vsindex .be-hero__lead {
	margin: var(--be-space-md) auto 0;
	max-width: 42rem;
	color: var(--be-text-muted);
	font-size: var(--be-fs-lg);
	line-height: 1.62;
}

.be-hero--vs .be-badges,
.be-hero--vsindex .be-badges {
	justify-content: center;
}

/* Fiche chiffrée de l'index : posée dans le flux et centrée.
 *
 * Partout ailleurs, « .be-hero .be-hero__stat » la sort du flux pour la
 * faire chevaucher l'angle bas-gauche de la photo du hero. Ici il n'y a
 * pas de photo : elle allait se caler sur l'angle de la section, débordait
 * à gauche et se faisait couper par l'« overflow: hidden ». Il faut donc
 * défaire le positionnement, et avec la même spécificité que la règle qui
 * le pose — d'où le sélecteur en deux classes. */
.be-hero--vsindex .be-hero__stat--inline {
	position: static;
	left: auto;
	right: auto;
	bottom: auto;
	margin: var(--be-space-lg) auto 0;
	max-width: 26rem;
}

/* --- Les deux visages --- */

.be-vs__faces {
	display: grid;
	grid-template-columns: 1fr auto 1fr;
	align-items: center;
	gap: var(--be-space-lg);
	max-width: 58rem;
	margin: clamp(2rem, 4vw, 3rem) auto 0;
}

.be-vs__face {
	margin: 0;
	min-width: 0;
}

.be-vs__frame {
	position: relative;
	aspect-ratio: 4 / 3;
	border-radius: var(--be-radius-lg);
	overflow: hidden;
	border: 1px solid var(--be-oak-200);
	background-color: var(--be-oak-100);
	box-shadow: var(--be-shadow-md);
}

/* Très léger pivot, en sens inverse d'un cadre à l'autre : les deux
 * photos se font face au lieu d'être posées côte à côte. L'angle est
 * volontairement sous le degré et demi — au-delà, on ne lit plus une
 * confrontation mais un défaut de montage. */
.be-vs__face--a .be-vs__frame {
	transform: rotate(-1.2deg);
}

.be-vs__face--b .be-vs__frame {
	transform: rotate(1.2deg);
}

.be-vs__img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.be-vs__legend {
	display: block;
	margin-top: var(--be-space-md);
	text-align: center;
}

.be-vs__name {
	display: block;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 800;
	line-height: 1.2;
	color: var(--be-charcoal);
}

.be-vs__face--a .be-vs__name {
	color: var(--be-cote-a);
}

.be-vs__resume {
	display: block;
	margin-top: var(--be-space-2xs);
	font-size: var(--be-fs-sm);
	line-height: 1.5;
	color: var(--be-text-muted);
}

/* Le médaillon « ou ». Almond sur Yale : 5,52:1, conforme AA. */
.be-vs__mark {
	display: grid;
	place-items: center;
	width: 66px;
	height: 66px;
	flex: 0 0 auto;
	border-radius: 50%;
	background-color: var(--be-yale);
	color: var(--be-almond);
	font-family: var(--be-font-display);
	font-size: 1.05rem;
	font-weight: 800;
	letter-spacing: 0.02em;
	box-shadow: 0 0 0 8px var(--be-bg);
}

@media (max-width: 760px) {
	.be-vs__faces {
		grid-template-columns: 1fr;
		gap: var(--be-space-md);
	}

	/* Le médaillon passe entre les deux lignes sans changer l'ordre du
	 * balisage : il est déjà au milieu du HTML. */
	.be-vs__mark {
		margin-inline: auto;
	}

	.be-vs__face--a .be-vs__frame,
	.be-vs__face--b .be-vs__frame {
		transform: none;
	}
}

/* ==================================================================
 * Corps de page
 * ================================================================== */

/* Même couloir de lecture que les pages de finition (section 8g) : le
 * texte tient sur une mesure courte, les composants larges débordent
 * dans les colonnes « large » et « pleine ». Reprendre la même grille
 * plutôt qu'en inventer une seconde garantit que les deux familles de
 * pages ont le même rythme. */
.be-comparateur .entry-content {
	display: grid;
	grid-template-columns:
		/* Gouttières à minimum nul — même raison que la grille des pages
		 * finition : sinon la piste « pleine » sort du conteneur et les
		 * bandes pleine largeur se décalent en mobile. */
		[pleine-start] minmax(0, 1fr)
		[large-start] minmax(0, 8rem)
		[texte-start] min(34rem, 100%)
		[texte-end] minmax(0, 8rem)
		[large-end] minmax(0, 1fr)
		[pleine-end];
	padding-block: clamp(2rem, 4vw, 3.25rem) 0;
}

.be-comparateur .entry-content > * {
	grid-column: texte;
	min-width: 0;
}

.be-comparateur .entry-content > .be-verdict,
.be-comparateur .entry-content > .be-duel,
/* Le repere s'aligne sur le tableau qu'il commente. Dans le couloir de
 * texte, son bord gauche tombait quelques dizaines de pixels plus loin
 * que celui du tableau, et le decalage se lisait comme un accident. */
.be-comparateur .entry-content > .be-tip,
.be-comparateur .entry-content > .be-guide,
.be-comparateur .entry-content > .be-vcards,
.be-comparateur .entry-content > .be-also,
.be-comparateur .entry-content > .be-cta,
.be-comparateur .entry-content > .be-key {
	grid-column: large;
}

.be-comparateur .entry-content > .be-band,
.be-comparateur .entry-content > .be-trust {
	grid-column: pleine;
}

.be-comparateur .site-content {
	overflow-x: clip;
}

.be-comparateur .entry-content p {
	margin-block: 0 var(--be-space-md);
	font-size: var(--be-fs-base);
	line-height: 1.72;
}

.be-comparateur .entry-content a {
	color: var(--be-link);
	text-underline-offset: 0.18em;
}

/* Le titre est dans le hero. Les filtres d'Astra le retirent deja
 * (inc/comparateurs.php) ; cette regle est la ceinture qui va avec les
 * bretelles, car ces filtres changent de nom d'une version majeure
 * d'Astra a l'autre et un titre en double se voit tout de suite. */
.be-comparateur .ast-single-entry-banner,
.be-comparateurs-index .ast-single-entry-banner,
.be-comparateur .entry-header,
.be-comparateurs-index .entry-header {
	display: none;
}

/* Astra pose une navigation « article précédent / suivant » sous le
 * contenu. Entre deux comparateurs, l'ordre de publication ne veut rien
 * dire : la grille des comparaisons voisines fait ce travail. */
.be-comparateur .post-navigation,
.be-comparateur .ast-single-post-navigation,
.be-comparateur .ast-author-box,
.be-comparateur .entry-meta {
	display: none;
}

/* ==================================================================
 * La réponse courte
 * ================================================================== */

.be-verdict {
	margin-block: 0 var(--be-space-2xl);
	padding: clamp(1.5rem, 3vw, 2.25rem);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-almond-200);
}

.be-verdict__title {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-yale);
}

/* La phrase la plus importante de la page. Elle est donc la plus
 * grosse — au-dessus du H1 en poids visuel une fois le hero passé. */
.be-verdict__lead {
	margin: var(--be-space-sm) 0 0;
	font-family: var(--be-font-display);
	font-size: clamp(1.2rem, 2.3vw, 1.6rem);
	font-weight: 600;
	line-height: 1.38;
	letter-spacing: -0.015em;
	color: var(--be-charcoal);
	text-wrap: pretty;
}

.be-verdict__cols {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(15rem, 1fr));
	gap: var(--be-space-md);
	margin-top: var(--be-space-lg);
}

.be-verdict__col {
	padding: var(--be-space-md);
	border-radius: var(--be-radius);
	background-color: var(--be-bg);
	border-top: 3px solid var(--be-oak);
}

.be-verdict__col--a {
	border-top-color: var(--be-cote-a);
}

.be-verdict__col--b {
	border-top-color: var(--be-cote-b);
}

.be-verdict__lbl {
	margin: 0 0 var(--be-space-sm);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	color: var(--be-text-muted);
}

.be-verdict__lbl strong {
	color: var(--be-charcoal);
	font-weight: 800;
}

.be-verdict__col ul {
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-verdict__col li {
	position: relative;
	padding-left: 1.45rem;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text);
}

.be-verdict__col li + li {
	margin-top: var(--be-space-sm);
}

/* Coche dessinée en CSS : pas d'icône à charger pour six traits. */
.be-verdict__col li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.42em;
	width: 0.55rem;
	height: 0.3rem;
	border-left: 2px solid var(--be-yale);
	border-bottom: 2px solid var(--be-yale);
	transform: rotate(-45deg);
}

.be-verdict__col--b li::before {
	border-color: var(--be-charcoal);
}

/* ==================================================================
 * Le face à face
 * ================================================================== */

.be-duel {
	margin-block: 0 var(--be-space-2xl);
}

.be-duel__title,
.be-guide__title,
.be-vcards__title {
	margin: 0 0 var(--be-space-lg);
	font-family: var(--be-font-display);
	font-size: clamp(1.4rem, 2.6vw, 1.85rem);
	font-weight: 800;
	line-height: 1.2;
	letter-spacing: -0.02em;
	color: var(--be-charcoal);
}

.be-duel__table {
	width: 100%;
	border-collapse: collapse;
	text-align: left;
}

.be-duel__table thead th {
	padding: 0 var(--be-space-md) var(--be-space-sm);
	border-bottom: 2px solid var(--be-charcoal);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--be-text-muted);
	vertical-align: bottom;
}

.be-duel__who {
	font-size: var(--be-fs-lg);
	letter-spacing: -0.01em;
	text-transform: none;
}

.be-duel__who--a {
	color: var(--be-cote-a);
}

.be-duel__who--b {
	color: var(--be-cote-b);
}

.be-duel__k {
	width: 11rem;
	padding: var(--be-space-md) var(--be-space-md) var(--be-space-md) 0;
	border-bottom: 1px solid var(--be-oak-200);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	color: var(--be-yale);
	vertical-align: top;
}

.be-duel__cell {
	padding: var(--be-space-md);
	border-bottom: 1px solid var(--be-oak-200);
	vertical-align: top;
}

/* L'avantage est signalé deux fois : par un aplat et par le mot
 * « Avantage ». L'aplat seul serait une information portée par la
 * couleur, ce que la page ne s'autorise nulle part. */
.be-duel__cell.is-avantage {
	background-color: var(--be-almond-200);
	box-shadow: inset 3px 0 0 var(--be-yale);
}

.be-duel__tag {
	display: none;
}

.be-duel__gauge {
	display: block;
	margin-bottom: var(--be-space-2xs);
	font-size: 0.72rem;
	letter-spacing: 0.22em;
	line-height: 1;
	color: var(--be-yale);
}

.be-duel__cell--prix .be-duel__gauge {
	font-size: 0.95rem;
	letter-spacing: 0.1em;
	font-weight: 700;
}

.be-duel__val {
	display: block;
	font-size: var(--be-fs-sm);
	line-height: 1.58;
	color: var(--be-text);
}

.be-duel__flag {
	display: inline-block;
	margin-top: var(--be-space-xs);
	padding: 2px 10px;
	border: 1px solid var(--be-oak);
	border-radius: 999px;
	background-color: var(--be-bg);
	font-family: var(--be-font-display);
	font-size: 0.68rem;
	font-weight: 700;
	letter-spacing: 0.12em;
	text-transform: uppercase;
	color: var(--be-yale-700);
}

.be-duel__legend {
	margin: var(--be-space-md) 0 0;
	padding-left: var(--be-space-md);
	border-left: 3px solid var(--be-oak);
	font-size: var(--be-fs-sm);
	line-height: 1.6;
	color: var(--be-text-muted);
}

.be-duel__legend strong {
	color: var(--be-charcoal);
}

/* --- Sous 760 px : une carte par critère ---
 * Le tableau passe en blocs. Les navigateurs cessent alors d'exposer
 * les relations ligne/colonne aux lecteurs d'écran ; c'est pourquoi le
 * nom de la finition est écrit dans chaque cellule (« be-duel__tag »)
 * et non seulement dans l'en-tête de colonne. L'information reste dans
 * le contenu quand elle quitte la structure.
 */
@media (max-width: 760px) {
	.be-duel__table,
	.be-duel__table tbody,
	.be-duel__table tr,
	.be-duel__table th,
	.be-duel__table td {
		display: block;
	}

	.be-duel__table thead {
		display: none;
	}

	.be-duel__table tr {
		margin-bottom: var(--be-space-md);
		border: 1px solid var(--be-oak-200);
		border-radius: var(--be-radius-lg);
		overflow: hidden;
	}

	.be-duel__k {
		width: auto;
		padding: var(--be-space-sm) var(--be-space-md);
		border-bottom: 0;
		background-color: var(--be-yale);
		color: var(--be-oak-100);
		font-size: var(--be-fs-sm);
		letter-spacing: 0.04em;
	}

	.be-duel__cell {
		border-bottom: 0;
	}

	.be-duel__cell + .be-duel__cell {
		border-top: 1px solid var(--be-oak-200);
	}

	.be-duel__tag {
		display: block;
		margin-bottom: var(--be-space-2xs);
		font-family: var(--be-font-display);
		font-size: var(--be-fs-xs);
		font-weight: 700;
		letter-spacing: 0.1em;
		text-transform: uppercase;
		color: var(--be-text-muted);
	}

	.be-duel__cell.is-avantage .be-duel__tag {
		color: var(--be-yale-700);
	}
}

/* ==================================================================
 * Ce que le tableau ne dit pas
 * ================================================================== */

/* « .be-tip » est défini en section 8h ; on ne reprend ici que
 * l'espacement propre au comparateur, où le repère ferme une section
 * au lieu d'être posé au fil du texte. */
.be-tip--vs {
	margin-block: 0 var(--be-space-2xl);
}

.be-tip--vs p {
	margin: var(--be-space-2xs) 0 0;
	font-size: var(--be-fs-sm);
	line-height: 1.65;
}

/* ==================================================================
 * Et pour votre projet ?
 * ================================================================== */

.be-guide {
	margin-block: 0 var(--be-space-2xl);
}

.be-guide__list {
	margin: 0;
	padding: 0;
	list-style: none;
	border-top: 2px solid var(--be-charcoal);
}

.be-guide__list li {
	display: grid;
	grid-template-columns: 1fr auto;
	align-items: center;
	gap: var(--be-space-2xs) var(--be-space-lg);
	padding-block: var(--be-space-md);
	border-bottom: 1px solid var(--be-oak-200);
}

.be-guide__cas {
	grid-column: 1;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.25;
	color: var(--be-charcoal);
}

.be-guide__raison {
	grid-column: 1;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text-muted);
}

/* La recommandation est un lien, pas un bouton : le bouton plein reste
 * réservé à l'appel à l'action de la page. Il en reste un seul, et on
 * sait lequel. */
.be-guide__reco {
	grid-column: 2;
	grid-row: span 2;
	justify-self: end;
	padding: 0.45rem 1rem;
	border: 1px solid var(--be-oak);
	border-radius: 999px;
	background-color: var(--be-bg);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	white-space: nowrap;
	text-decoration: none;
	color: var(--be-link);
	transition: background-color var(--be-transition), border-color var(--be-transition), color var(--be-transition);
}

.be-guide__reco:hover,
.be-guide__reco:focus-visible {
	background-color: var(--be-yale);
	border-color: var(--be-yale);
	color: var(--be-oak-100);
}

/* « Les deux » n'est pas un lien : rien à pointer quand la réponse est
 * que la question ne se pose pas. */
.be-guide__reco--egal {
	color: var(--be-text-muted);
	border-style: dashed;
}

@media (max-width: 560px) {
	.be-guide__list li {
		grid-template-columns: 1fr;
	}

	.be-guide__reco {
		grid-column: 1;
		grid-row: auto;
		justify-self: start;
		margin-top: var(--be-space-xs);
	}
}

/* ==================================================================
 * Les deux finitions en détail
 * ================================================================== */

.be-vcards {
	margin-block: var(--be-space-2xl) var(--be-space-lg);
}

.be-vcards__grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
	gap: var(--be-space-lg);
}

.be-vcard {
	display: flex;
	flex-direction: column;
	overflow: hidden;
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	box-shadow: var(--be-shadow-sm);
}

.be-vcard__media {
	aspect-ratio: 16 / 9;
	overflow: hidden;
	background-color: var(--be-oak-100);
}

.be-vcard__media img {
	display: block;
	width: 100%;
	height: 100%;
	object-fit: cover;
}

.be-vcard__body {
	display: flex;
	flex-direction: column;
	gap: var(--be-space-sm);
	padding: var(--be-space-md);
}

.be-vcard__title {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 800;
	line-height: 1.2;
}

.be-vcard__title a {
	color: var(--be-charcoal);
	text-decoration: none;
}

.be-vcard__title a:hover,
.be-vcard__title a:focus-visible {
	color: var(--be-yale);
	text-decoration: underline;
}

.be-vcard__plus,
.be-vcard__moins {
	margin: 0;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text);
}

.be-vcard__plus span,
.be-vcard__moins span {
	display: block;
	margin-bottom: 2px;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.1em;
	text-transform: uppercase;
}

.be-vcard__plus span {
	color: var(--be-yale);
}

/* La limite est affichée au même rang que l'atout, pas en petit et pas
 * en gris : une page qui n'énumère que des avantages se lit comme une
 * brochure, et le lecteur le sait. */
.be-vcard__moins span {
	color: var(--be-text-muted);
}

.be-vcard__stat {
	display: flex;
	align-items: baseline;
	gap: var(--be-space-xs);
	margin: 0;
	padding-top: var(--be-space-sm);
	border-top: 1px solid var(--be-oak-200);
	font-size: var(--be-fs-sm);
	color: var(--be-text-muted);
}

.be-vcard__stat strong {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	line-height: 1;
	color: var(--be-yale);
}

.be-vcard__link {
	margin-top: auto;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	color: var(--be-link);
	text-decoration: none;
}

.be-vcard__link::after {
	content: " \2192";
	display: inline-block;
	transition: transform var(--be-transition);
}

.be-vcard__link:hover::after,
.be-vcard__link:focus-visible::after {
	transform: translateX(3px);
}

/* ==================================================================
 * Grille des comparaisons
 * ================================================================== */

.be-vsgrid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(16.5rem, 1fr));
	gap: var(--be-space-md);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-vsgrid__item {
	display: flex;
}

.be-vsgrid__link {
	display: flex;
	flex-direction: column;
	gap: var(--be-space-sm);
	width: 100%;
	padding: var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	text-decoration: none;
	transition: border-color var(--be-transition), box-shadow var(--be-transition), transform var(--be-transition);
}

.be-vsgrid__link:hover,
.be-vsgrid__link:focus-visible {
	border-color: var(--be-yale);
	box-shadow: var(--be-shadow-md);
	transform: translateY(-2px);
}

.be-vsgrid__pair {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: var(--be-space-xs);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 800;
	line-height: 1.15;
	color: var(--be-charcoal);
}

.be-vsgrid__vs {
	padding: 3px 9px;
	border-radius: 999px;
	background-color: var(--be-yale);
	color: var(--be-almond);
	font-size: 0.66rem;
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
}

/* Le verdict est coupé à trois lignes : les phrases n'ont pas toutes
 * la même longueur, et une tuile deux fois plus haute que sa voisine
 * casse la grille sans rien apporter. La phrase entière reste lisible
 * sur la page de la comparaison. */
.be-vsgrid__verdict {
	display: -webkit-box;
	-webkit-line-clamp: 3;
	line-clamp: 3;
	-webkit-box-orient: vertical;
	overflow: hidden;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text-muted);
}

/* ==================================================================
 * Page d'index
 * ================================================================== */

/* « .ast-container » est aussi la classe du conteneur interne de
 * l'en-tête. Cibler « .be-comparateurs-index .ast-container » sans le
 * restreindre à « #content » ramenait donc le logo et le menu à 1 200 px
 * à l'intérieur d'une capsule large de 1 400 : l'en-tête de cette page
 * n'avait pas la même allure que celui du reste du site, avec une centaine
 * de pixels de vide de chaque côté. La règle de la section 4 qui libère
 * l'en-tête a la même spécificité, et celle-ci, écrite plus bas, l'emportait.
 *
 * Les pages Elementor y échappaient : Astra y pose « ast-page-builder-template »,
 * qui met déjà « .ast-container » à 100 %. D'où un défaut visible sur une
 * page et invisible sur l'accueil. */
.be-comparateurs-index .entry-content,
.be-comparateurs-index #content .ast-container {
	max-width: var(--be-container);
	margin-inline: auto;
}

.be-comparateurs-index .entry-content {
	padding-block: clamp(2rem, 4vw, 3.25rem) var(--be-space-lg);
	padding-inline: var(--be-space-md);
}

.be-vsindex__group + .be-vsindex__group {
	margin-top: var(--be-space-2xl);
}

.be-vsindex__title {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: clamp(1.35rem, 2.4vw, 1.75rem);
	font-weight: 800;
	line-height: 1.2;
	letter-spacing: -0.02em;
	color: var(--be-charcoal);
}

.be-vsindex__lead {
	margin: var(--be-space-2xs) 0 var(--be-space-md);
	font-size: var(--be-fs-sm);
	line-height: 1.6;
	color: var(--be-text-muted);
}

/* ==================================================================
 * Les comparaisons voisines
 * ================================================================== */

.be-also--vs {
	margin-block: var(--be-space-2xl) var(--be-space-lg);
}

.be-also--vs .be-also__title {
	margin: 0 0 var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: clamp(1.25rem, 2.2vw, 1.55rem);
	font-weight: 800;
	letter-spacing: -0.02em;
	color: var(--be-charcoal);
}

.be-also__more {
	margin: var(--be-space-md) 0 0;
	font-size: var(--be-fs-sm);
}

.be-also__more a {
	font-family: var(--be-font-display);
	font-weight: 700;
	color: var(--be-link);
}

/* Sur une page de finition, la grille des comparaisons se pose dans la
 * colonne large, comme les autres composants en grille (section 8g). */
.be-finition .entry-content > .be-also--vs {
	grid-column: large;
}

/* ==================================================================
 * Blocs synchronisés insérés dans ces pages
 * ==================================================================
 *
 * L'appel à l'action, la réassurance, la méthode de chantier et la FAQ
 * commune sont des blocs réutilisables
 * (wp-admin/edit.php?post_type=wp_block) posés par
 * scripts/build-comparateurs.php et partagés avec les pages de finition.
 *
 * Leur mise en forme vit en section 8h, où elle était écrite sous
 * « .be-finition .entry-content » : une portée destinée à l'emporter sur
 * la typographie du fil de lecture de ces pages-là, mais qui faisait
 * qu'un bloc réutilisable ne l'était en réalité nulle part ailleurs — la
 * bande de réassurance retombait en liste à puces, et le titre de
 * l'appel à l'action en texte courant.
 *
 * Ces sélecteurs ont donc été élargis sur place en
 * « :is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) », ce qui
 * laisse la spécificité inchangée — « :is() » prend celle de son
 * argument le plus fort, et les trois sont des classes. Rien n'est redit
 * ici : deux jeux de règles pour un même composant finissent toujours
 * par diverger.
 */

/* La bande de réassurance ne sort plus de la gouttière : depuis qu'elle
 * est devenue un panneau arrondi (section 8h), la tirer jusqu'aux bords
 * lui ferait perdre ses angles contre le bord de la fenêtre. Elle suit
 * donc simplement la largeur du contenu de la page. */
.be-comparateurs-index .entry-content > .be-trust {
	margin-inline: 0;
}

/* ------------------------------------------------------------------
 * Frise de chantier, version large
 * ------------------------------------------------------------------
 *
 * Le composant « .be-flow » est défini en section 8h : une frise
 * verticale, médaillon numéroté, trait de liaison, et le délai en
 * pastille sous le texte. Dans une bande pleine largeur il était
 * plafonné à 52 rem — ce qui le laissait tassé contre le bord gauche
 * d'un fond qui, lui, court sur 1 200 px. La moitié droite de la section
 * était vide, et les cinq pastilles de délai se retrouvaient en fin de
 * bloc, à cinq hauteurs différentes : le lecteur qui cherche « combien
 * de temps ça prend » devait les chasser une par une.
 *
 * Ici, à partir de 880 px, chaque étape devient deux colonnes : à gauche
 * ce qu'on fait et quand, à droite comment. Les délais forment alors une
 * colonne, qui se lit d'un seul regard — c'est l'information que cette
 * section existe pour donner.
 *
 * Écrit ici plutôt qu'à côté du composant : la section 8h est activement
 * modifiée par ailleurs, et une feuille chargée plus bas l'emporte de
 * toute façon. Si les deux blocs devaient un jour se rejoindre, c'est
 * celui-ci qui doit remonter.
 */
@media (min-width: 880px) {

	/* Le plafond de 52 rem posé en section 8h protégeait la longueur de
	 * ligne d'une frise à une seule colonne. En deux colonnes, c'est la
	 * colonne de droite qui la porte, et le plafond ne fait plus que
	 * laisser un tiers de la bande vide. Le sélecteur reprend la même
	 * forme que celui qu'il annule : à spécificité égale, c'est l'ordre
	 * dans la feuille qui tranche, et cette section vient après. */
	:is(.be-finition, .be-comparateur, .be-comparateurs-index, .be-prix-page, .be-prix-pilier) .entry-content .be-band__inner .be-flow {
		max-width: none;
	}

	.be-band .be-flow > li {
		display: grid;
		grid-template-columns: minmax(0, 16rem) minmax(0, 1fr);
		gap: var(--be-space-2xs) var(--be-space-xl);
		align-items: start;
		padding: var(--be-space-lg) 0 var(--be-space-lg) 3.5rem;
	}

	.be-band .be-flow > li:first-child {
		padding-top: 0;
	}

	.be-band .be-flow > li:last-child {
		padding-bottom: 0;
	}

	/* Le médaillon suit le décalage vertical ajouté par le padding. */
	.be-band .be-flow > li::before {
		top: var(--be-space-lg);
	}

	.be-band .be-flow > li:first-child::before {
		top: 0;
	}

	/* Le trait déborde dans la gouttière de l'étape suivante : sans cela
	 * il s'arrêtait au bord de chaque élément et reprenait après le
	 * médaillon suivant, en laissant un blanc de 2 rem. */
	.be-band .be-flow > li::after {
		top: calc(var(--be-space-lg) + 2.4rem);
		bottom: calc(-1 * var(--be-space-lg));
	}

	.be-band .be-flow > li:first-child::after {
		top: 2.4rem;
	}

	.be-band .be-flow__name {
		grid-column: 1;
		grid-row: 1;
		margin-bottom: 0;
		padding-top: 0.2rem;
	}

	.be-band .be-flow__when {
		grid-column: 1;
		grid-row: 2;
		justify-self: start;
		margin-top: var(--be-space-xs);
	}

	/* La description occupe les deux rangées : elle reste alignée sur le
	 * titre quelle que soit la longueur de la pastille de délai. */
	.be-band .be-flow__text {
		grid-column: 2;
		grid-row: 1 / span 2;
		font-size: var(--be-fs-base);
		line-height: 1.7;
	}
}

/* ------------------------------------------------------------------
 * 8k. AIDE AU CHOIX DE FINITION
 * Balisage produit par inc/choisir-finition.php, posé sur la page
 * d'accueil entre « Nos finitions » et « Déroulement ».
 *
 * Six cartes teintées sur fond blanc, et toujours aucune photo : la
 * grille « Nos finitions » juste au-dessus en est faite, deux murs
 * d'images à la suite se liraient comme un doublon. Ce qui donne le
 * relief ici, c'est la pastille de réponse et le pied de carte qui
 * porte la réserve — une structure, pas une illustration.
 *
 * La carte entière est cliquable : le lien de la pastille est étiré
 * par ::after. La pastille reste le seul élément focusable, donc le
 * parcours au clavier n'y gagne pas de halte supplémentaire.
 * ---------------------------------------------------------------- */
.be-choix {
	display: grid;
	gap: var(--be-space-md);
	grid-template-columns: repeat(3, 1fr);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-choix__item {
	position: relative;
	display: flex;
	flex-direction: column;
	padding: var(--be-space-md);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-almond-200);
	/* Bordure transparente au repos : la carte ne bouge pas d'un pixel
	 * quand le survol lui en donne une. */
	border: 1px solid transparent;
	transition: transform var(--be-transition), box-shadow var(--be-transition),
		border-color var(--be-transition), background-color var(--be-transition);
}

.be-choix__item:hover,
.be-choix__item:focus-within {
	transform: translateY(-2px);
	border-color: var(--be-oak-200);
	background-color: #fff;
	box-shadow: var(--be-shadow-md);
}

/* Le numéro en filigrane : il donne un point d'accroche à l'œil qui
 * balaie la grille, sans entrer en concurrence avec le titre. */
.be-choix__num {
	position: absolute;
	top: var(--be-space-sm);
	right: var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-2xl);
	font-weight: 800;
	line-height: 1;
	color: var(--be-charcoal);
	opacity: 0.09;
	pointer-events: none;
}

.be-choix__besoin {
	margin: 0 0 var(--be-space-xs);
	padding-right: 2.25rem; /* dégage le filigrane */
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 700;
	line-height: 1.25;
	color: var(--be-text);
}

.be-choix__motif {
	margin: 0 0 var(--be-space-md);
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text-muted);
}

/* La réponse est poussée en bas de carte. Sur six cartes de hauteurs
 * inégales, les pastilles s'alignent — et c'est cet alignement qui
 * fait lire la grille comme une liste de réponses. */
.be-choix__rep {
	margin: auto 0 0;
}

.be-choix__fin {
	display: inline-flex;
	align-items: center;
	gap: var(--be-space-xs);
	padding: 0.5rem 0.9rem;
	border-radius: var(--be-radius-pill);
	background-color: var(--be-action);
	color: #fff;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	text-decoration: none;
	transition: background-color var(--be-transition);
}

/* Zone cliquable étirée à toute la carte. */
.be-choix__fin::after {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: var(--be-radius-lg);
}

.be-choix__item:hover .be-choix__fin {
	background-color: var(--be-action-hover);
}

/* Le libellé reste blanc dans tous les états. Sans cela, la règle
 * générale a:hover repeint le texte en var(--be-action-hover) —
 * c'est-à-dire exactement la couleur du fond de la pastille au
 * survol, et le libellé disparaît. Un type et une pseudo-classe
 * l'emportant sur une classe seule, il faut nommer les états. */
.be-choix__fin:hover,
.be-choix__fin:focus,
.be-choix__fin:focus-visible,
.be-choix__item:hover .be-choix__fin,
.be-choix__item:focus-within .be-choix__fin {
	color: #fff;
}

.be-choix__fin:focus-visible {
	outline: 3px solid var(--be-action);
	outline-offset: 3px;
}

.be-choix__fleche {
	transition: transform var(--be-transition);
}

.be-choix__item:hover .be-choix__fleche {
	transform: translateX(3px);
}

/* Le pied de carte porte la réserve. Un filet, et non un second
 * aplat : une carte déjà teintée deviendrait deux boîtes imbriquées. */
.be-choix__limite {
	display: flex;
	flex-direction: column;
	gap: 2px;
	margin: var(--be-space-md) 0 0;
	padding-top: var(--be-space-sm);
	border-top: 1px solid var(--be-oak-200);
	font-size: var(--be-fs-xs);
	line-height: 1.5;
	color: var(--be-text-muted);
}

.be-choix__lbl {
	font-family: var(--be-font-display);
	font-weight: 700;
	font-size: 0.6875rem;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--be-text);
}

@media (max-width: 900px) {
	.be-choix {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 560px) {
	.be-choix {
		grid-template-columns: 1fr;
	}
}

@media (prefers-reduced-motion: reduce) {
	.be-choix__item,
	.be-choix__fleche {
		transition: none;
	}

	.be-choix__item:hover,
	.be-choix__item:focus-within,
	.be-choix__item:hover .be-choix__fleche {
		transform: none;
	}
}

/* ------------------------------------------------------------------
 * 8l. VIDÉOS DE CHANTIER
 * Balisage produit par inc/videos.php — page d'accueil et article de
 * finition concerné.
 *
 * Les vidéos sont des Shorts : 9/16, et rien ne sert de lutter contre.
 * Le cadre impose ce rapport, l'affiche le remplit.
 *
 * Tout est posé dans la vignette — étiquette, disque de lecture,
 * légende — et non autour. Quatre légendes de longueurs inégales
 * placées sous les images décalaient le bas des tuiles et cassaient
 * l'alignement de la rangée ; sur le dégradé, elles tiennent dans le
 * cadre et la rangée reste une rangée.
 *
 * Le dégradé n'est pas un effet : c'est lui qui garantit le contraste
 * du texte blanc, quelle que soit la photo du chantier dessous.
 * ---------------------------------------------------------------- */
.be-vid {
	display: grid;
	gap: var(--be-space-md);
	grid-template-columns: repeat(4, 1fr);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-vid__item {
	margin: 0;
}

.be-vid__play {
	display: block;
	text-decoration: none;
	color: inherit;
	border-radius: var(--be-radius-lg);
}

.be-vid__frame {
	position: relative;
	display: block;
	overflow: hidden;
	aspect-ratio: 9 / 16;
	border-radius: var(--be-radius-lg);
	background-color: var(--be-charcoal);
	box-shadow: var(--be-shadow-sm);
	transition: transform var(--be-transition), box-shadow var(--be-transition);
}

.be-vid__play:hover .be-vid__frame,
.be-vid__play:focus-visible .be-vid__frame {
	transform: translateY(-3px);
	box-shadow: var(--be-shadow-lg);
}

.be-vid__img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
	transition: transform 320ms cubic-bezier(0.4, 0, 0.2, 1);
}

.be-vid__play:hover .be-vid__img,
.be-vid__play:focus-visible .be-vid__img {
	transform: scale(1.05);
}

/* Le voile de lecture. Deux arrêts seulement, mais posés bas : le haut
 * de l'affiche reste net, et seule la zone de la légende s'assombrit. */
.be-vid__frame::after {
	content: "";
	position: absolute;
	inset: 40% 0 0;
	background: linear-gradient(to bottom, rgba(31, 39, 27, 0) 0%, rgba(31, 39, 27, 0.82) 100%);
	pointer-events: none;
}

/* L'étiquette « ouvrage fini » ou « geste de chantier ». Fond clair
 * translucide plutôt que plein : elle se pose sur la photo sans la
 * masquer, et reste lisible sur un béton clair comme sur un sombre. */
.be-vid__kind {
	position: absolute;
	top: var(--be-space-sm);
	left: var(--be-space-sm);
	z-index: 2;
	padding: 0.25rem 0.5rem;
	border-radius: var(--be-radius);
	background-color: rgba(255, 255, 255, 0.92);
	color: var(--be-charcoal);
	font-family: var(--be-font-display);
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	line-height: 1.2;
}

/* Le disque de lecture, remonté au tiers supérieur : au centre exact,
 * il tombait dans la légende sur les vignettes à titre long. */
.be-vid__icon {
	position: absolute;
	top: 38%;
	left: 50%;
	z-index: 2;
	transform: translate(-50%, -50%);
	display: grid;
	place-items: center;
	width: 3.25rem;
	height: 3.25rem;
	border-radius: 50%;
	background-color: rgba(255, 255, 255, 0.94);
	color: var(--be-charcoal);
	box-shadow: var(--be-shadow-sm);
	transition: transform var(--be-transition), background-color var(--be-transition);
}

.be-vid__icon svg {
	width: 1.75rem;
	height: 1.75rem;
	margin-left: 2px; /* Le triangle est optiquement décentré à gauche. */
}

.be-vid__play:hover .be-vid__icon,
.be-vid__play:focus-visible .be-vid__icon {
	transform: translate(-50%, -50%) scale(1.1);
	background-color: #fff;
}

.be-vid__play:focus-visible {
	outline: 3px solid var(--be-action);
	outline-offset: 3px;
}

.be-vid__cap {
	position: absolute;
	inset: auto 0 0;
	z-index: 2;
	padding: var(--be-space-sm) var(--be-space-sm) var(--be-space-md);
	color: #fff;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 600;
	line-height: 1.3;
	text-wrap: balance;
}

/* Le lecteur qui remplace la vignette au clic : même cadre, donc la
 * grille ne bouge pas d'un pixel au moment du remplacement. */
.be-vid__frame--live {
	display: block;
}

.be-vid__frame--live::after {
	content: none;
}

.be-vid__iframe {
	width: 100%;
	height: 100%;
	border: 0;
	display: block;
}

/* Dans un article, la section respire comme les autres blocs de
 * contenu et ne colle pas au paragraphe qui la précède. */
.be-vidsec {
	margin-block: var(--be-space-xl);
}

@media (max-width: 900px) {
	.be-vid {
		grid-template-columns: repeat(2, 1fr);
	}
}

@media (max-width: 420px) {
	.be-vid {
		grid-template-columns: 1fr;
		gap: var(--be-space-lg);
	}

	/* Une seule colonne : le 9/16 pleine largeur dépasserait la hauteur
	 * de l'écran. On rend la vignette plus large que haute. */
	.be-vid__frame {
		aspect-ratio: 3 / 4;
	}
}

@media (prefers-reduced-motion: reduce) {
	.be-vid__frame,
	.be-vid__img,
	.be-vid__icon {
		transition: none;
	}

	.be-vid__play:hover .be-vid__frame,
	.be-vid__play:focus-visible .be-vid__frame,
	.be-vid__play:hover .be-vid__img,
	.be-vid__play:focus-visible .be-vid__img {
		transform: none;
	}

	.be-vid__play:hover .be-vid__icon,
	.be-vid__play:focus-visible .be-vid__icon {
		transform: translate(-50%, -50%);
	}
}

/* ------------------------------------------------------------------
 * 8m. ZONES D'INTERVENTION
 * Balisage produit par inc/zones.php — page d'accueil.
 *
 * Trois bandeaux empilés : l'en-tête, les huit départements, la ligne
 * de contact. La version en deux colonnes essayée d'abord mettait un
 * rail de six éléments en face de deux rangées de pastilles — le rail
 * était deux fois plus haut, et le quart inférieur droit de la section
 * restait vide.
 *
 * Les huit pastilles tiennent sur une seule rangée en grand écran.
 * C'est ce qui fait l'image de la section : une bande continue se lit
 * comme une couverture, deux rangées de quatre comme une liste.
 * ---------------------------------------------------------------- */
.be-zones__list {
	display: grid;
	gap: var(--be-space-sm);
	grid-template-columns: repeat(8, 1fr);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-zone {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 2px;
	padding: var(--be-space-sm) var(--be-space-2xs);
	border-radius: var(--be-radius);
	border: 1px solid var(--be-oak-200);
	background-color: var(--be-almond-200);
	text-align: center;
}

.be-zone__num {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	line-height: 1;
	color: var(--be-dark);
}

/* Les noms vont de « Paris » à « Seine-Saint-Denis » : en huitième de
 * largeur, le plus long doit pouvoir se couper proprement plutôt que
 * de forcer la pastille à s'élargir. */
.be-zone__nom {
	font-size: var(--be-fs-xs);
	line-height: 1.3;
	color: var(--be-text-muted);
	hyphens: auto;
	overflow-wrap: break-word;
}

.be-zones__note {
	margin: var(--be-space-sm) 0 0;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: var(--be-text-muted);
}

/* La ligne de contact ferme la section : trois faits alignés à gauche,
 * l'appel à l'action à droite. Le filet la sépare de la bande sans
 * ajouter un troisième aplat. */
.be-zones__bar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--be-space-md) var(--be-space-lg);
	margin-top: var(--be-space-lg);
	padding-top: var(--be-space-md);
	border-top: 1px solid var(--be-border);
}

.be-zones__facts {
	display: flex;
	flex-wrap: wrap;
	gap: var(--be-space-md) var(--be-space-xl);
}

.be-zones__fact {
	display: flex;
	flex-direction: column;
	gap: 1px;
	margin: 0;
}

.be-zones__lbl {
	font-family: var(--be-font-display);
	font-size: 0.6875rem;
	font-weight: 700;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

.be-zones__val {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 600;
	color: var(--be-text);
}

/* Le téléphone occupe la place d'une valeur, mais il est cliquable :
 * même gabarit que .be-zones__val, plus la couleur de lien. */
.be-zones__tel {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 700;
	color: var(--be-link);
	text-decoration: none;
	border-bottom: 2px solid transparent;
	transition: border-color var(--be-transition);
}

.be-zones__tel:hover,
.be-zones__tel:focus-visible {
	border-bottom-color: currentColor;
}

.be-zones__cta {
	flex: none;
}

/* Quatre par rangée dès que huit ne tiennent plus sans écraser les
 * noms les plus longs. */
@media (max-width: 1100px) {
	.be-zones__list {
		grid-template-columns: repeat(4, 1fr);
	}
}

@media (max-width: 560px) {
	.be-zones__list {
		grid-template-columns: repeat(2, 1fr);
	}

	.be-zones__bar {
		align-items: flex-start;
	}

	.be-zones__cta {
		width: 100%;
	}
}

/* ------------------------------------------------------------------
 * 8n. PAGES PRIX ET PILIER
 * Balisage produit par inc/prix-pages.php.
 *
 * Une page prix est une page de chiffres : cinq à onze tableaux, un
 * calculateur, et presque pas de photo. Toute la mise en forme sert
 * donc une seule chose — qu'un chiffre se retrouve sans le chercher,
 * et qu'on sache toujours de quoi il est le prix.
 *
 * Les composants partagés (tranches, comparatif, FAQ, calculateur)
 * ne sont pas redéclarés ici : les familles `:is()` des sections 8g à
 * 8i ont reçu `.be-prix-page` et `.be-prix-pilier`, comme le demande
 * rules/page-builders.md. Cette section ne contient que ce qui
 * n'existait pas.
 * ---------------------------------------------------------------- */

/* --- Sections --------------------------------------------------- */

/* Une section de page prix porte surtout des tableaux et des grilles.
 * Laissee dans le couloir de texte — ce que la regle « > * » lui donne
 * par defaut — elle ecrase ses onze tableaux dans 42 rem. Elle prend
 * donc le couloir « large », comme les figures et les comparatifs.
 *
 * Et sa prose se recentre a la mesure de lecture : 42 rem centres dans
 * « large » retombent exactement sur le couloir « texte », puisque
 * « large » vaut texte plus 7 rem de chaque cote. Les titres et les
 * paragraphes s'alignent donc sur le reste de la page, pendant que les
 * tableaux occupent toute la largeur de la section. Aucun calcul de
 * marge negative, aucune valeur a tenir a jour a deux endroits. */
:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec {
	grid-column: large;
}

.be-prix-sec {
	margin: 0 0 var(--be-space-2xl);
	scroll-margin-top: var(--be-space-xl);
}

/* --- Alignement de la prose dans une section ---------------------
 *
 * La portée est volontairement longue. La famille de contenu pose
 * « :is(… .entry-content, .be-prose) h2 { margin: X 0 Y } », soit une
 * spécificité (0,2,1) qui remet la marge horizontale à zéro : un titre
 * se calait alors sur le bord du couloir « large » pendant que son
 * propre paragraphe restait centré. Il faut donc passer devant, d'où
 * le préfixe de page. C'est la seule règle de cette section qui en ait
 * besoin, et c'est pour cette raison-là. */
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-sec > :is(h2, h3, p, ul, ol, .be-faq) {
	max-width: 42rem;
	margin-inline: auto;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-sec > :is(.be-prix-eco__verdict, .be-prix-tva__2025) {
	max-width: none;
}

/* --- Graphe de dispersion des relevés -----------------------------
 *
 * Le bloc qui porte l'argument central de la page. Sept fourchettes
 * sur une échelle commune : ce qui se démontre ici n'est pas un prix,
 * c'est que les barres ne se recouvrent pas. */
.be-range {
	margin: var(--be-space-lg) 0;
	padding: var(--be-space-lg);
	border-radius: var(--be-radius-lg);
	background: var(--be-almond-200);
}

.be-range__list {
	margin: 0;
	padding: 0;
	list-style: none;
	display: grid;
	gap: var(--be-space-xs);
}

.be-range__row {
	display: grid;
	grid-template-columns: minmax(0, 14rem) 1fr 5.5rem;
	align-items: center;
	gap: var(--be-space-sm);
	margin: 0;
	font-size: var(--be-fs-xs);
}

.be-range__lab {
	color: var(--be-text-muted);
	line-height: 1.3;
}

.be-range__track {
	position: relative;
	height: 14px;
	border-radius: 999px;
	background: rgba(31, 39, 27, 0.07);
}

.be-range__bar {
	position: absolute;
	inset-block: 0;
	border-radius: 999px;
	background: var(--be-oak);
}

/* Une teinte par périmètre : c'est la clé de lecture du graphe. */
.be-range__row--produit .be-range__bar { background: #c8b8a6; }
.be-range__row--pose .be-range__bar { background: #9db4c0; }
.be-range__row--fourni_pose .be-range__bar { background: var(--be-baltic); }
.be-range__row--fourni_pose_terrasse .be-range__bar { background: var(--be-yale); }

.be-range__val {
	text-align: right;
	font-variant-numeric: tabular-nums;
	color: var(--be-text-muted);
}

/* Notre fourchette : séparée du relevé par un filet, et la seule en
 * contraste fort. Elle est dans le graphe pour être comparée, pas pour
 * conclure à notre avantage. */
.be-range__row--nous {
	margin-top: var(--be-space-sm);
	padding-top: var(--be-space-sm);
	border-top: 1px solid var(--be-border);
	font-weight: 700;
}

.be-range__row--nous .be-range__lab,
.be-range__row--nous .be-range__val {
	color: var(--be-text);
}

.be-range__row--nous .be-range__bar {
	background: var(--be-charcoal);
}

.be-range__axis {
	display: flex;
	justify-content: space-between;
	margin-top: var(--be-space-xs);
	padding-left: calc(14rem + var(--be-space-sm));
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
}

/* --- Barre empilée : où passe l'argent ---------------------------- */

.be-bar {
	margin: var(--be-space-lg) 0;
}

.be-bar__track {
	display: flex;
	height: 2.6rem;
	overflow: hidden;
	border-radius: var(--be-radius);
}

.be-bar__seg {
	display: grid;
	place-items: center;
	min-width: 0;
	color: var(--be-text-invert);
	font-size: var(--be-fs-xs);
	font-weight: 700;
}

/* Quatre teintes de la palette, du plus foncé au plus clair : l'ordre
 * des postes est celui du chantier, pas celui des montants. */
.be-bar__seg--1 { background: var(--be-yale); }
.be-bar__seg--2 { background: var(--be-baltic); }
.be-bar__seg--3 { background: #6f93a8; }
.be-bar__seg--4 { background: var(--be-oak); color: var(--be-text); }
.be-bar__seg--5 { background: var(--be-almond); color: var(--be-text); }

/* Sous 8 %, le pourcentage ne tient pas dans le segment. */
.be-bar__seg[style*="width:0"] .be-bar__pct,
.be-bar__seg[style*="width:1"] .be-bar__pct,
.be-bar__seg[style*="width:2"] .be-bar__pct,
.be-bar__seg[style*="width:3"] .be-bar__pct,
.be-bar__seg[style*="width:4"] .be-bar__pct,
.be-bar__seg[style*="width:5"] .be-bar__pct,
.be-bar__seg[style*="width:6"] .be-bar__pct,
.be-bar__seg[style*="width:7"] .be-bar__pct {
	display: none;
}

.be-bar__legend {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	gap: var(--be-space-2xs) var(--be-space-md);
	margin: var(--be-space-md) 0 0;
	padding: 0;
	list-style: none;
}

.be-bar__key {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: var(--be-space-xs);
	margin: 0;
	padding-left: 1.25rem;
	position: relative;
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
	border-bottom: 1px dotted var(--be-border);
}

.be-bar__key::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.35em;
	width: 0.7rem;
	height: 0.7rem;
	border-radius: 3px;
}

.be-bar__key--1::before { background: var(--be-yale); }
.be-bar__key--2::before { background: var(--be-baltic); }
.be-bar__key--3::before { background: #6f93a8; }
.be-bar__key--4::before { background: var(--be-oak); }
.be-bar__key--5::before { background: var(--be-almond); }

.be-bar__key strong {
	color: var(--be-text);
	font-variant-numeric: tabular-nums;
}

/* --- Rythme des sections ------------------------------------------
 *
 * Treize sections d'affilée se lisent comme un seul bloc. Les trois
 * sections « exclusives » — la dispersion, la décomposition, l'effet
 * de surface — sont posées sur un fond teinté pleine largeur : ce sont
 * elles qui portent l'argument, et elles doivent se voir comme telles. */
:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec--fort {
	grid-column: pleine;
	width: 100vw;
	max-width: 100vw;
	margin-inline: calc(50% - 50vw);
	padding-block: var(--be-space-xl);
	background: linear-gradient(180deg, var(--be-oak-100) 0%, var(--be-almond-200) 100%);
}

/* Le contenu de ces sections revient dans la grille du texte. */
:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec--fort > * {
	max-width: min(56rem, calc(100vw - 2 * var(--be-space-lg)));
	margin-inline: auto;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec--fort > :is(h2, h3, p) {
	max-width: min(42rem, calc(100vw - 2 * var(--be-space-lg)));
}


.be-prix-sec__chapo {
	font-size: var(--be-fs-lg);
	color: var(--be-text-muted);
}

/* --- L'effet de surface ----------------------------------------- */

/* Rien de propre : les trois tranches sont rendues avec « be-specs »,
 * le composant des fiches techniques. Le texte suit en paragraphes
 * ordinaires. Cette section n'a plus de CSS à elle, et c'est le but. */

/* --- Compléments de tableau -------------------------------------
 *
 * Les tableaux eux-mêmes sont des « be-compare » : bordures, en-tête
 * et rayures viennent de la feuille commune. Ne restent ici que deux
 * choses que le composant ne connaît pas.
 */

/* La justification sous l'intitulé, et non dans une colonne à part :
 * une colonne « pourquoi » serait la première sacrifiée sur mobile,
 * alors que c'est elle qui rend le chiffre défendable. */
.be-prix-table__note {
	display: block;
	margin-top: var(--be-space-2xs);
	font-size: var(--be-fs-xs);
	font-weight: 400;
	line-height: 1.45;
	color: var(--be-text-muted);
}

/* Des montants qui ne s'alignent pas ne se comparent pas. */
:is(.be-prix-page, .be-prix-pilier) .entry-content :is(.be-prix-table--usages, .be-prix-table--compo, .be-prix-table--comparatif, .be-prix-table--releves) td {
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
}

/* Sauf le périmètre, qui est une phrase. */
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-table__perim {
	white-space: normal;
	min-width: 18rem;
}

/* --- Les exemples de devis --------------------------------------
 *
 * Une carte par devis, dessinée comme « be-pros__col » : même fond,
 * même bordure, même rayon. Le total TTC est la seule chose qui
 * change d'échelle, parce que c'est la ligne qu'on cherche. */

.be-prix-devis-liste {
	display: grid;
	gap: var(--be-space-lg);
	grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	margin-block: var(--be-space-lg);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-devis {
	margin: 0;
	padding: var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-devis h3 {
	margin-block: 0 var(--be-space-2xs);
	max-width: none;
	font-size: var(--be-fs-lg);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-devis h3::before {
	content: none;
}

.be-prix-devis__usage {
	margin-block: 0 var(--be-space-md);
	color: var(--be-text-muted);
	font-size: var(--be-fs-sm);
}

.be-prix-devis table {
	margin-block: 0;
	font-size: var(--be-fs-sm);
}

.be-prix-devis td {
	text-align: right;
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
}

.be-prix-devis__ht :is(th, td) {
	border-top: 2px solid var(--be-oak-200);
	font-weight: 700;
}

.be-prix-devis__ttc :is(th, td) {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 800;
}

/* Le contrôle de cohérence est affiché, pas seulement passé : c'est la
 * ligne qui distingue cette page de celles qui annoncent une fourchette
 * en haut et la démentent en bas. */
.be-prix-devis__controle {
	margin-block: var(--be-space-md) 0;
	padding: var(--be-space-sm) var(--be-space-md);
	border-radius: var(--be-radius);
	background-color: var(--be-almond-200);
	font-size: var(--be-fs-sm);
	font-weight: 600;
}

.be-prix-devis__controle.is-hors {
	background-color: #fdf1e7;
	color: #8a4b12;
}

.be-prix-devis__controle.is-hors-table {
	font-weight: 400;
	color: var(--be-text-muted);
}

/* --- Drainant : ce qu'il supprime ------------------------------- */

.be-prix-eco {
	display: grid;
	gap: var(--be-space-lg);
	grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
	margin-block: var(--be-space-lg);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-eco__col {
	padding: var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-eco__col h3 {
	margin-block: 0 var(--be-space-md);
	max-width: none;
	font-size: var(--be-fs-base);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-eco__col h3::before {
	content: none;
}

.be-prix-eco__col table {
	margin-block: 0;
	font-size: var(--be-fs-sm);
}

.be-prix-eco__col td {
	text-align: right;
	white-space: nowrap;
	font-variant-numeric: tabular-nums;
}

/* Le verdict reprend la bande sombre du site : c'est la conclusion de
 * la section, elle doit se lire comme telle. */
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-eco__verdict {
	margin-block: var(--be-space-md) 0;
	padding: var(--be-space-md) var(--be-space-lg);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-dark);
	color: var(--be-text-invert);
	font-size: var(--be-fs-lg);
}

/* --- Les quatre périmètres -------------------------------------- */

.be-prix-cats {
	display: grid;
	gap: var(--be-space-md);
	grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
	margin-block: var(--be-space-lg);
}

.be-prix-cat {
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
}

.be-prix-cat p {
	margin-block: 0;
	font-size: var(--be-fs-sm);
	color: var(--be-text-muted);
}

.be-prix-cat__titre {
	margin-block: 0 var(--be-space-2xs) !important;
	font-family: var(--be-font-display);
	font-weight: 700;
	color: var(--be-text) !important;
}

/* Le nôtre, mis en avant : c'est le seul des quatre qui décrive un
 * devis comparable au nôtre, et le lecteur doit le repérer d'un œil. */
.be-prix-cat--fourni_pose {
	border-color: transparent;
	background-color: var(--be-dark);
}

.be-prix-cat--fourni_pose :is(p, .be-prix-cat__titre) {
	color: var(--be-text-invert) !important;
}

/* --- Kit ou pose ------------------------------------------------ */

.be-prix-diy {
	margin-block: var(--be-space-lg);
	padding: var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
}

.be-prix-diy__titre {
	margin-block: var(--be-space-md) var(--be-space-xs) !important;
	font-family: var(--be-font-display);
	font-weight: 700;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-diy__liste {
	display: grid;
	gap: var(--be-space-2xs);
	grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
	margin-block: 0 var(--be-space-md);
	padding: 0;
	list-style: none;
	max-width: none;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-diy__liste li {
	position: relative;
	margin: 0;
	padding-left: 1.4em;
	font-size: var(--be-fs-sm);
	color: var(--be-text-muted);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-diy__liste li::before {
	content: "";
	position: absolute;
	left: 0;
	top: 0.62em;
	width: 0.6rem;
	height: 2px;
	background-color: var(--be-oak);
}

/* --- La vitrine des pages prix -----------------------------------
 *
 * La porte d'entrée du pilier : trois finitions, trois photos, trois
 * prix. Elle ouvre la page, donc elle prend toute la largeur du
 * conteneur — pas le couloir de lecture, qui étranglait les cartes à
 * 290 px et faisait passer la section pour une note de bas de page.
 *
 * C'est la seule section du site à sortir du couloir « large » sans
 * être une bande de réassurance : elle porte des cartes, et une carte
 * à trois colonnes a besoin de ses 1 200 px.
 */
:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec--vitrine {
	grid-column: pleine;
	width: 100vw;
	max-width: 100vw;
	margin-inline: calc(50% - 50vw);
	margin-block: 0 var(--be-space-2xl);
	padding-block: var(--be-space-xl) var(--be-space-2xl);
	/*
	 * Un degrade vertical, du blanc de la page vers la teinte chaude.
	 *
	 * Le fond etait une couleur pleine : la bande commencait par un trait
	 * horizontal net en travers de la page, juste sous la section
	 * precedente. En partant du blanc, la bande n'a plus de bord haut —
	 * elle s'installe au lieu de s'interrompre — et la teinte se fonce en
	 * descendant, ce qui pousse l'oeil vers la liste.
	 */
	background: linear-gradient(
		180deg,
		var(--be-bg) 0%,
		var(--be-oak-100) 38%,
		var(--be-almond-200) 100%
	);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec--vitrine > * {
	max-width: min(var(--be-container), calc(100vw - 2 * var(--be-space-lg)));
	margin-inline: auto;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content > .be-prix-sec--vitrine > :is(h2, p) {
	max-width: min(46rem, calc(100vw - 2 * var(--be-space-lg)));
}

/* --- Adresse e-mail masquee (inc/email.php) ----------------------
 *
 * L'adresse tronquee et l'oeil sur une meme ligne. L'oeil est un vrai
 * bouton : il garde donc sa zone de clic, meme reduit a une icone.
 */
.be-mail {
	display: inline-flex;
	align-items: center;
	gap: var(--be-space-xs);
	flex-wrap: wrap;
}

.be-mail__txt {
	font-variant-numeric: tabular-nums;
	letter-spacing: 0.01em;
	overflow-wrap: anywhere;
}

/*
 * L'adresse revelee herite de la couleur de son support.
 *
 * Le lien prenait la couleur de lien du site — un bleu sombre — et le
 * composant vit sur la fiche sombre de la page contact : l'adresse
 * s'affichait en bleu nuit sur bleu nuit, donc illisible au moment
 * precis ou on venait de la reveler. « inherit » la rend correcte sur
 * les deux fiches, la claire comme la sombre, sans regle par variante.
 */
.be-mail a {
	color: inherit;
	text-decoration: underline;
	text-underline-offset: 0.18em;
	text-decoration-thickness: 1px;
}

.be-mail a:hover,
.be-mail a:focus-visible {
	color: inherit;
	text-decoration-thickness: 2px;
}

.be-mail__eye {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 1.9rem;
	height: 1.9rem;
	padding: 0;
	border: 1px solid currentColor;
	border-radius: 50%;
	background: transparent;
	color: inherit;
	opacity: 0.65;
	cursor: pointer;
	transition: opacity 0.18s ease, background-color 0.18s ease;
}

.be-mail__eye:hover,
.be-mail__eye:focus-visible {
	opacity: 1;
	background-color: rgba(127, 127, 127, 0.12);
}

/* Un seul des deux yeux est visible a la fois ; c'est l'etat du bouton
 * qui decide, pas une classe posee a la main. */
.be-mail__ico--off,
.be-mail.is-ouvert .be-mail__ico--on {
	display: none;
}

.be-mail.is-ouvert .be-mail__ico--off {
	display: block;
}

.be-mail__eye .be-ico {
	width: 1.05rem;
	height: 1.05rem;
}

/* --- La liste comparative de la vitrine --------------------------
 *
 * Trois finitions, un seul axe. Une grille de cartes aligne trois prix
 * sans permettre de les comparer : le lecteur doit faire la
 * soustraction lui-meme. Ici les barres partagent la meme echelle, donc
 * leur position et leur longueur se lisent l'une contre l'autre.
 *
 * ATTENTION a la specificite. La regle de lecture de la section,
 * « .be-prix-sec > :is(h2, h3, p, ul, ol, .be-faq) », vaut (0,3,1) et
 * comprend « ol » : elle ramenait cette liste a 42 rem et ecrasait
 * l'axe, qui est pourtant tout l'interet du bloc. Les regles ci-dessous
 * citent donc une classe de plus pour passer devant. C'est le genre de
 * detail qui se paye deux fois si on ne l'ecrit pas.
 */
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-sec--vitrine > .be-prixlist,
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prix-sec--vitrine > .be-prix__mention {
	max-width: min(var(--be-container), calc(100vw - 2 * var(--be-space-lg)));
	margin-inline: auto;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist {
	margin-block: var(--be-space-lg) var(--be-space-xs);
	padding: 0;
	list-style: none;
	display: grid;
	gap: var(--be-space-xs);
}

.be-prixlist__item {
	display: grid;
	grid-template-columns: 5rem minmax(0, 17rem) auto minmax(8rem, 1fr) auto;
	align-items: center;
	gap: var(--be-space-md);
	margin: 0;
	padding: var(--be-space-md);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	transition: border-color 0.18s ease, box-shadow 0.18s ease;
}

/*
 * Ni pastille numerotee, ni retrait de liste.
 *
 * Le contenu applique aux « ol » un compteur en pastille et un retrait
 * de 2,1 rem, avec une portee plus forte que celle d'une simple classe.
 * Ici les deux nuisent : le numero fait croire a une marche a suivre
 * alors que c'est un classement par prix, et le retrait decalait les
 * items par rapport a l'axe, qui n'est pas un « li » et ne le recevait
 * pas. D'ou une portee equivalente pour les annuler.
 */
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist > .be-prixlist__item::before,
.be-prixlist__item::marker {
	content: none;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist > .be-prixlist__item {
	padding: var(--be-space-md);
}

.be-prixlist__item:hover,
.be-prixlist__item:focus-within {
	border-color: var(--be-action);
	box-shadow: var(--be-shadow-sm);
}

.be-prixlist__media {
	display: block;
	overflow: hidden;
	border-radius: var(--be-radius);
	aspect-ratio: 1;
}

.be-prixlist__media img {
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist__name {
	margin-block: 0;
	max-width: none;
	font-size: var(--be-fs-lg);
	line-height: 1.2;
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist__name::before {
	content: none;
}

/* Le nom n'est plus un lien (voir inc/prix-pages.php) : il ne doit donc
 * plus en avoir l'apparence au survol de la ligne. */

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist__desc {
	margin-block: var(--be-space-2xs) 0;
	max-width: none;
	font-size: var(--be-fs-xs);
	line-height: 1.45;
	color: var(--be-text-muted);
}

/* Les chiffres : la borne basse est celle qu'on retient, la haute la
 * suit en second plan. */
:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist__prix {
	display: grid;
	margin-block: 0;
	max-width: none;
	white-space: nowrap;
	line-height: 1.2;
}

.be-prixlist__prix strong {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-lg);
	font-weight: 800;
	letter-spacing: -0.02em;
	color: var(--be-text);
	font-variant-numeric: tabular-nums;
}

.be-prixlist__prix span {
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
	font-variant-numeric: tabular-nums;
}

/* L'axe. La piste claire est l'etendue des trois finitions ; la barre,
 * celle de cette finition-la. Aucun texte dedans : voir le commentaire
 * du rendu, une barre etroite ne peut pas en porter. */
.be-prixlist__scale {
	position: relative;
	height: 0.75rem;
	border-radius: 999px;
	background-color: var(--be-almond-200);
}

.be-prixlist__bar {
	position: absolute;
	inset-block: 0;
	border-radius: 999px;
	background-color: var(--be-baltic);
}

/* La moins chere ouvre la liste : elle est teintee autrement, parce que
 * c'est l'information que l'axe existe pour donner. */
.be-prixlist__item:first-child .be-prixlist__bar {
	background-color: var(--be-dark);
}

:is(.be-prix-page, .be-prix-pilier) .entry-content .be-prixlist__go {
	margin-block: 0;
	max-width: none;
	white-space: nowrap;
	font-weight: 600;
}

@media (max-width: 1000px) {
	.be-prixlist__item {
		grid-template-columns: 4.5rem 1fr auto;
		gap: var(--be-space-sm) var(--be-space-md);
	}

	.be-prixlist__scale {
		grid-column: 1 / -1;
	}

	}

/* --- Le prix dans une carte de finition --------------------------
 *
 * Les cartes de la section « Le détail, finition par finition » sont
 * les cartes média du site (« be-card--media », section 8d) : photo,
 * titre, phrase, lien. Une seule chose leur manquait, le prix — d'où
 * cette unique règle plutôt qu'une famille de cartes parallèle.
 *
 * Le chiffre affiché est la tranche de référence, pas l'enveloppe
 * toutes surfaces : « 37 à 220 €/m² » se lit comme une imprécision
 * alors que c'est l'inverse qu'elle dit. La ligne dessous porte le
 * périmètre, pour qu'aucun chiffre ne circule sans lui.
 */
.be-card__prix {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: var(--be-space-2xs) var(--be-space-xs);
	margin-block: 0 var(--be-space-xs);
}

.be-card__prix strong {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	line-height: 1;
	letter-spacing: -0.02em;
	color: var(--be-link);
	font-variant-numeric: tabular-nums;
}

.be-card__prix span {
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
}

/* Les cartes de renvoi en pied de page prix : plus sobres, ce n'est
 * qu'un rappel de navigation. */
.be-prix-cartes {
	display: grid;
	gap: var(--be-space-sm);
	grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
	margin-block: var(--be-space-md) var(--be-space-lg);
}

.be-prix-carte {
	display: grid;
	gap: var(--be-space-2xs);
	padding: var(--be-space-md) var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-bg);
	text-decoration: none;
	color: inherit;
	transition: border-color 0.18s ease, box-shadow 0.18s ease;
}

.be-prix-carte:hover,
.be-prix-carte:focus-visible {
	border-color: var(--be-action);
	box-shadow: var(--be-shadow-sm);
}

.be-prix-carte__nom {
	font-family: var(--be-font-display);
	font-weight: 700;
}

.be-prix-carte__prix {
	color: var(--be-link);
	font-weight: 700;
	font-variant-numeric: tabular-nums;
}

.be-prix-lien {
	font-weight: 600;
}

/* --- Le renvoi depuis l'article de finition --------------------- */

.be-finition .entry-content .be-prix-renvoi {
	margin-block: var(--be-space-xl) 0;
	padding: var(--be-space-lg);
	border: 1px solid var(--be-oak-200);
	border-left: 4px solid var(--be-action);
	border-radius: var(--be-radius-lg);
	background-color: var(--be-almond-200);
}

.be-prix-renvoi p {
	margin-block: 0 var(--be-space-xs);
}

.be-prix-renvoi p:last-child {
	margin-block-end: 0;
}

.be-prix-renvoi__titre {
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.06em;
	text-transform: uppercase;
	color: var(--be-text-muted);
}

/* --- Sorties propres aux nouveaux calculateurs ------------------ */

/* Les annexes sont tenues hors du budget principal, y compris
 * visuellement : les mêler donnerait un total que la fourchette au
 * mètre carré de la page ne pourrait plus expliquer. */
.calc-result--annexes {
	border-top: 1px dashed var(--be-border);
	padding-top: var(--be-space-sm);
}

.calc-result--rang input {
	font-weight: 600;
}

/* --- Téléphone --------------------------------------------------- */

@media (max-width: 880px) {
	.be-prix-surface {
		grid-template-columns: 1fr;
	}
}

@media (max-width: 700px) {
	/* Le tableau devient une bande défilante, et la première colonne
	 * reste visible : sans elle, un chiffre n'est plus le prix de rien.
	 *
	 * Le sélecteur vise « [class*="be-prix-table"] » et non la seule
	 * classe « .be-prix-table » : les comparatifs sortent du générateur
	 * avec le modificateur seul — « be-compare be-prix-table--comparatif »,
	 * « be-compare be-prix-table--autres » — sans la classe de base. La
	 * règle ne les attrapait pas. Leurs colonnes en « white-space:
	 * nowrap » et le périmètre en « min-width: 18rem » portaient le
	 * tableau à 771 px dans un conteneur de 335 : « overflow-x: clip »
	 * posé sur « .site-content » tranchait les 416 px de trop, et les
	 * deux dernières colonnes n'étaient ni lisibles ni atteignables. */
	/* La règle générique « … table { overflow: hidden } », qui sert aux
	 * coins arrondis, pèse (0,2,1) et l'emportait sur une classe seule :
	 * la bande défilait au clavier et au script, jamais au doigt. On
	 * repasse devant en reprenant le même préfixe de contexte. */
	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) [class*="be-prix-table"],
	[class*="be-prix-table"] {
		display: block;
		overflow-x: auto;
		overflow-y: hidden;
		-webkit-overflow-scrolling: touch;
	}

	[class*="be-prix-table"] tbody th[scope="row"] {
		position: sticky;
		left: 0;
		z-index: 1;
		min-width: 12rem;
		background: var(--be-bg);
	}

	[class*="be-prix-table"] :is(th, td) {
		padding: var(--be-space-sm);
	}

	/* L'en-tête collant se cale sur la fenêtre. Dans une bande qui
	 * défile horizontalement, il n'a plus de repère : on le rend au
	 * flux, le tableau tient de toute façon dans la hauteur d'écran. */
	:is(.be-finition, .be-prix-page, .be-prix-pilier) .entry-content [class*="be-prix-table"] thead th {
		position: static;
	}

	/* Et le même sort pour les tableaux sans classe : le comparatif des
	 * finitions, cinq colonnes posées en HTML nu, réclamait 491 px et se
	 * faisait trancher par « overflow-x: clip » du conteneur. Un tableau
	 * qui ne tient pas défile ; il ne se coupe pas. */
	:is(.be-finition .entry-content, .be-prix-page .entry-content, .be-prix-pilier .entry-content, .be-prose) table {
		display: block;
		overflow-x: auto;
		overflow-y: hidden;
		-webkit-overflow-scrolling: touch;
	}
}

/* ------------------------------------------------------------------
 * 9. GALERIES ET PROJETS
 * Les pages « projets » reposent sur elementor image-gallery.
 * ---------------------------------------------------------------- */
.elementor-image-gallery .gallery-item img {
	border-radius: var(--be-radius-lg);
	border: 0 !important;
	box-shadow: var(--be-shadow-sm);
	transition: transform var(--be-transition), box-shadow var(--be-transition), filter var(--be-transition);
}

.elementor-image-gallery .gallery-item:hover img,
.elementor-image-gallery .gallery-item:focus-within img {
	transform: translateY(-3px) scale(1.01);
	box-shadow: var(--be-shadow-md);
	filter: saturate(1.05);
}

.elementor-image-gallery .gallery-item .gallery-caption {
	font-size: var(--be-fs-xs);
	color: var(--be-text-muted);
	padding-top: var(--be-space-xs);
}

/* --- Visionneuse (lightbox) Elementor ---
 * Active sur les pages « projets ». Simple Lightbox reste en charge des
 * articles — voir rules/lightbox.md.
 */
.elementor-lightbox .dialog-widget-content {
	background-color: rgba(31, 39, 27, 0.97);
}

.elementor-lightbox .elementor-slideshow__header,
.elementor-lightbox .elementor-slideshow__footer {
	background-color: transparent;
	color: var(--be-oak-100);
}

.elementor-lightbox .elementor-slideshow__counter {
	font-size: var(--be-fs-sm);
	letter-spacing: 0.04em;
	color: rgba(247, 244, 241, 0.75);
}

.elementor-lightbox .elementor-swiper-button,
.elementor-lightbox .eicon-close {
	color: var(--be-oak-100);
	transition: color var(--be-transition), transform var(--be-transition);
}

.elementor-lightbox .elementor-swiper-button:hover,
.elementor-lightbox .eicon-close:hover {
	color: #fff;
	transform: scale(1.12);
}

.elementor-lightbox .swiper-slide img,
.elementor-lightbox .elementor-lightbox-image {
	border-radius: var(--be-radius);
	box-shadow: var(--be-shadow-lg);
}

/* ------------------------------------------------------------------
 * 10. PIED DE PAGE
 * Balisage : inc/footer.php.
 *
 * Quatre étages, du plus engageant au plus administratif : l'appel à
 * l'action sur fond chaud, la signature, les colonnes de liens, la zone
 * d'intervention puis la ligne légale.
 *
 * ------------------------------------------------------------------
 * Deux décisions de couleur
 * ------------------------------------------------------------------
 *
 * 1. Le corps passe du Yale au Charcoal.
 *
 *    design/color-palette.md attribue le Yale aux « en-têtes, pieds de
 *    page et sections sombres ». Le site en compte désormais beaucoup :
 *    bandes de contenu, carte de contact, bande vidéo, bandeau de devis.
 *    Le pied de page y ressemblait à une section de plus au lieu de
 *    fermer la page. Le Charcoal est l'ancre de la palette, il se lit
 *    comme un sol, et il tient les contrastes sans effort : 14:1 avec
 *    l'oak-100, 9,5:1 avec l'Almond, 8,1:1 avec le Pale Oak.
 *
 * 2. Le bandeau d'appel passe du Baltic à l'Almond.
 *
 *    Il était posé sur la couleur des boutons. Le bouton devait donc
 *    s'inverser en blanc pour rester lisible, et l'action se confondait
 *    avec son fond. Sur fond chaud, le Baltic redevient la seule chose
 *    bleue de la bande — donc la seule chose qui se clique — et le
 *    bouton reprend sa forme normale, sans exception à écrire.
 *
 * L'ensemble donne au pied de page la descente chaud → sombre qui est
 * l'identité même de cette palette, là où la version précédente
 * empilait deux bleus l'un sur l'autre.
 * ---------------------------------------------------------------- */

.be-footer {
	/* Filets et textes secondaires, dérivés de la palette et déclarés
	 * une fois : le pied de page en compte une dizaine d'occurrences. */
	--be-footer-line: rgba(203, 185, 168, 0.16);
	--be-footer-muted: rgba(247, 244, 241, 0.64);
	--be-footer-link: rgba(247, 244, 241, 0.82);

	background-color: var(--be-charcoal);
	color: var(--be-oak-100);
	font-size: var(--be-fs-sm);
}

.be-footer a {
	color: var(--be-oak-100);
	text-decoration: none;
	transition: color var(--be-transition);
}

.be-footer a:hover,
.be-footer a:focus-visible {
	color: var(--be-almond);
}

/* ==================================================================
 * 1. Bandeau d'appel à l'action
 * ================================================================== */

.be-footer__cta {
	padding-block: clamp(2rem, 4.5vw, 3.25rem);
	background-color: var(--be-almond);
	color: var(--be-charcoal);
}

.be-footer__cta-inner {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	align-items: center;
	gap: var(--be-space-lg) var(--be-space-2xl);
}

.be-footer__cta-kicker {
	display: flex;
	align-items: center;
	gap: 0.65rem;
	margin: 0 0 var(--be-space-xs);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-yale);
}

/* Même tiret que les sur-titres du reste du site (« .be-eyebrow ») :
 * le pied de page n'invente pas son propre vocabulaire. */
.be-footer__cta-kicker::before {
	content: "";
	flex: 0 0 auto;
	width: 28px;
	height: 2px;
	border-radius: 2px;
	background-color: var(--be-yale);
}

.be-footer__cta-title {
	margin: 0;
	font-family: var(--be-font-display);
	font-size: clamp(1.55rem, 3.2vw, 2.35rem);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -0.03em;
	color: var(--be-charcoal);
}

/* Le mot accentué est en Yale, sans le trait Pale Oak employé sur fond
 * clair : contre l'Almond, le Pale Oak tombe à 1,17:1 et disparaîtrait
 * (design/color-palette.md, « les deux neutres ne vont jamais ensemble »). */
.be-footer__cta-title em {
	font-style: normal;
	color: var(--be-yale);
}

.be-footer__cta-note {
	margin: var(--be-space-sm) 0 0;
	max-width: 46ch;
	font-size: var(--be-fs-sm);
	line-height: 1.55;
	color: rgba(31, 39, 27, 0.72);
}

.be-footer__cta-actions {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--be-space-sm);
}

/* Le téléphone est un lien bordé, pas un second bouton plein : il reste
 * le choix de celui qui ne veut pas remplir de formulaire, sans venir
 * concurrencer l'action principale. */
.be-footer__cta-tel {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	padding: 0.85rem 1.3rem;
	border: 1px solid rgba(31, 39, 27, 0.28);
	border-radius: var(--be-radius);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 700;
	font-variant-numeric: tabular-nums;
	white-space: nowrap;
	transition: background-color var(--be-transition), border-color var(--be-transition);
}

.be-footer .be-footer__cta-tel {
	color: var(--be-charcoal);
}

.be-footer .be-footer__cta-tel:hover,
.be-footer .be-footer__cta-tel:focus-visible {
	background-color: rgba(31, 39, 27, 0.07);
	border-color: var(--be-charcoal);
	color: var(--be-charcoal);
}

/* ==================================================================
 * 2. Corps
 * ================================================================== */

.be-footer__body {
	position: relative;
	isolation: isolate;
	padding-block: clamp(2.5rem, 5vw, 4rem);
}

/* Halo chaud sous la couture : il relie la bande Almond au fond sombre
 * au lieu de les couper net. Même procédé que les heros, à l'envers. */
.be-footer__body::before {
	content: "";
	position: absolute;
	inset: 0;
	z-index: -1;
	background: radial-gradient(120% 62% at 50% 0%, rgba(203, 185, 168, 0.1) 0%, rgba(203, 185, 168, 0) 64%);
}

/* --- Signature : qui nous sommes, en une ligne et trois repères --- */

.be-footer__sign {
	display: grid;
	/* Les repères prennent la part la plus large : « Garantie décennale »
	 * ne tient pas sur une ligne en dessous d'environ 11 rem, et trois
	 * repères dont un seul se casse en deux sonnent faux. */
	grid-template-columns: minmax(0, 1fr) minmax(0, 1.25fr);
	align-items: start;
	gap: var(--be-space-xl) var(--be-space-2xl);
	padding-bottom: var(--be-space-xl);
	border-bottom: 1px solid var(--be-footer-line);
}

/* Plaque claire sous le logo.
 *
 * Le fichier est bleu sur fond transparent : sur le Charcoal, « BÉTON »
 * s'effaçait, et le passer en silhouette blanche écrasait le pictogramme.
 * On ne déforme pas la marque pour l'adapter au fond, on lui rend le fond
 * qu'elle attend.
 *
 * C'est aussi le seul aplat clair du pied de page : il tient lieu de point
 * d'entrée du regard, et le reste de la colonne s'aligne dessous. */
.be-footer__logo {
	display: inline-flex;
	align-items: center;
	margin-bottom: var(--be-space-md);
	padding: 0.6rem 0.95rem;
	border-radius: var(--be-radius-lg);
	background-color: var(--be-oak-100);
	box-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) inset;
}

.be-footer__logo img {
	display: block;
	max-height: 28px;
	width: auto;
}

.be-footer__brand {
	margin: 0 0 var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	letter-spacing: -0.02em;
	color: #fff;
}

.be-footer__tagline {
	margin: 0;
	max-width: 46ch;
	font-size: var(--be-fs-base);
	line-height: 1.65;
	color: var(--be-footer-muted);
}

/* Trois repères, chacun sur un filet vertical. Ce sont ceux de la bande
 * de réassurance : le pied de page ne fabrique pas d'argument pour
 * remplir une ligne, il redit ce qui est déjà vérifié ailleurs. */
.be-footer__facts {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(9.5rem, 1fr));
	gap: var(--be-space-md) var(--be-space-lg);
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-footer__facts li {
	padding-left: var(--be-space-sm);
	border-left: 2px solid var(--be-oak);
}

/* Taille de corps, pas de titre : « Garantie décennale » passait à la
 * ligne dans une colonne sur trois, et trois repères dont un seul se
 * casse en deux se lisent comme une erreur de gabarit. */
.be-footer__facts strong {
	display: block;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-base);
	font-weight: 800;
	line-height: 1.2;
	letter-spacing: -0.015em;
	color: var(--be-almond);
}

.be-footer__facts span {
	display: block;
	margin-top: 0.15rem;
	font-size: var(--be-fs-xs);
	line-height: 1.4;
	color: var(--be-footer-muted);
}

/* --- Colonnes de liens --- */

.be-footer__grid {
	display: grid;
	/* La colonne des finitions porte douze entrées sur deux sous-colonnes :
	 * elle a besoin de plus de place que les trois autres. */
	grid-template-columns: 1.6fr 1.15fr 1fr 1.15fr;
	gap: var(--be-space-xl) var(--be-space-lg);
	padding-block: var(--be-space-xl);
	border-bottom: 1px solid var(--be-footer-line);
}

.be-footer__heading {
	margin: 0 0 var(--be-space-md);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-oak);
}

.be-footer__heading::before {
	content: "";
	display: block;
	width: 24px;
	height: 2px;
	border-radius: 2px;
	margin-bottom: var(--be-space-sm);
	background-color: var(--be-oak);
}

/* Second intitulé d'une même colonne : il respire au-dessus, sinon il se
 * colle à la liste qui le précède et les deux blocs n'en font plus qu'un. */
.be-footer__heading--suite {
	margin-top: var(--be-space-lg);
}

.be-footer__list {
	display: grid;
	gap: 0.55rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-footer__list--two {
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 0.55rem var(--be-space-md);
}

.be-footer .be-footer__list a {
	display: inline-block;
	color: var(--be-footer-link);
	line-height: 1.35;
}

.be-footer .be-footer__list a:hover,
.be-footer .be-footer__list a:focus-visible {
	color: var(--be-almond);
	text-decoration: underline;
	text-underline-offset: 0.2em;
}

.be-footer .be-footer__more {
	font-family: var(--be-font-display);
	font-weight: 700;
	color: var(--be-almond);
}

.be-footer__more::after {
	content: " \2192";
	display: inline-block;
	transition: transform var(--be-transition);
}

.be-footer__more:hover::after,
.be-footer__more:focus-visible::after {
	transform: translateX(3px);
}

/* --- Colonne « Nous joindre » --- */

.be-footer__col--contact {
	display: flex;
	flex-direction: column;
	align-items: flex-start;
}

.be-footer .be-footer__phone {
	display: inline-flex;
	align-items: center;
	gap: 0.5rem;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xl);
	font-weight: 800;
	line-height: 1.1;
	letter-spacing: -0.02em;
	font-variant-numeric: tabular-nums;
	color: #fff;
}

.be-footer__phone svg {
	flex: 0 0 auto;
	color: var(--be-oak);
}

.be-footer .be-footer__phone:hover,
.be-footer .be-footer__phone:focus-visible {
	color: var(--be-almond);
}

.be-footer__address {
	margin: var(--be-space-sm) 0 0;
	font-style: normal;
	line-height: 1.55;
	color: var(--be-footer-muted);
}

.be-footer__address span {
	display: block;
}

/* Bouton fantôme : le Baltic est déjà pris par le bandeau d'appel, et
 * deux boutons pleins de la même couleur dans un même pied de page ne
 * hiérarchisent plus rien. Celui-ci s'inverse au survol. */
.be-footer .be-footer__devis {
	display: inline-flex;
	align-items: center;
	margin-top: var(--be-space-md);
	padding: 0.7rem 1.2rem;
	border: 1px solid var(--be-oak);
	border-radius: var(--be-radius);
	font-family: var(--be-font-display);
	font-size: var(--be-fs-sm);
	font-weight: 700;
	color: var(--be-almond);
	transition: background-color var(--be-transition), color var(--be-transition);
}

.be-footer__devis::after {
	content: " \2192";
	margin-left: 0.4rem;
}

.be-footer .be-footer__devis:hover,
.be-footer .be-footer__devis:focus-visible {
	background-color: var(--be-oak);
	color: var(--be-charcoal);
}

/* --- Zone d'intervention, sur toute la largeur --- */

.be-footer__zones {
	display: flex;
	flex-wrap: wrap;
	align-items: baseline;
	gap: var(--be-space-sm) var(--be-space-lg);
	padding-top: var(--be-space-xl);
}

.be-footer__zones-lbl {
	flex: 0 0 auto;
	margin: 0;
	font-family: var(--be-font-display);
	font-size: var(--be-fs-xs);
	font-weight: 700;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--be-oak);
}

.be-footer__zonelist {
	display: flex;
	flex-wrap: wrap;
	gap: 0.4rem;
	margin: 0;
	padding: 0;
	list-style: none;
}

.be-footer__zone {
	padding: 0.3rem 0.7rem;
	border: 1px solid rgba(203, 185, 168, 0.22);
	border-radius: var(--be-radius-pill);
	background-color: rgba(203, 185, 168, 0.1);
	font-size: var(--be-fs-xs);
	font-weight: 600;
	color: var(--be-oak);
	white-space: nowrap;
}

/* ==================================================================
 * 3. Ligne légale
 * ================================================================== */

.be-footer__bottom {
	padding-block: var(--be-space-md);
	border-top: 1px solid var(--be-footer-line);
}

.be-footer__bottom-inner {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	justify-content: space-between;
	gap: var(--be-space-sm) var(--be-space-lg);
}

.be-footer__legal {
	margin: 0;
	font-size: var(--be-fs-xs);
	color: var(--be-footer-muted);
}

.be-footer__legal span {
	margin-inline: 0.35rem;
	color: var(--be-oak);
}

.be-footer__bottom-links {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: var(--be-space-lg);
	font-size: var(--be-fs-xs);
}

.be-footer .be-footer__bottom-links a {
	color: var(--be-footer-muted);
}

.be-footer .be-footer__bottom-links a:hover,
.be-footer .be-footer__bottom-links a:focus-visible {
	color: var(--be-almond);
}

.be-footer__social {
	display: inline-flex;
	align-items: center;
	gap: 0.45rem;
}

/* ==================================================================
 * Écrans réduits
 * ================================================================== */

@media (max-width: 1080px) {
	.be-footer__grid {
		grid-template-columns: repeat(2, minmax(0, 1fr));
	}
}

@media (max-width: 860px) {
	.be-footer__cta-inner {
		grid-template-columns: minmax(0, 1fr);
	}

	.be-footer__sign {
		grid-template-columns: minmax(0, 1fr);
	}
}

@media (max-width: 560px) {
	.be-footer__grid {
		grid-template-columns: minmax(0, 1fr);
		gap: var(--be-space-lg);
	}

	/* Douze finitions sur une seule colonne feraient une colonne de
	 * douze lignes à faire défiler : on garde les deux sous-colonnes. */
	.be-footer__list--two {
		gap: 0.5rem var(--be-space-sm);
	}

	.be-footer__cta-actions {
		width: 100%;
	}

	.be-footer__cta-actions .be-btn,
	.be-footer__cta-tel {
		flex: 1 1 auto;
		justify-content: center;
	}

	.be-footer__bottom-inner {
		flex-direction: column;
		align-items: flex-start;
	}
}

@media (prefers-reduced-motion: reduce) {
	.be-footer a,
	.be-footer__devis,
	.be-footer__cta-tel,
	.be-footer__more::after {
		transition: none;
	}

	.be-footer__more:hover::after,
	.be-footer__more:focus-visible::after {
		transform: none;
	}
}

/* ------------------------------------------------------------------
 * 11. ACCESSIBILITÉ ET PRÉFÉRENCES SYSTÈME
 * ---------------------------------------------------------------- */

/* Anneau de focus visible partout — jamais supprimé. */
:where(a, button, input, select, textarea, .elementor-button, [tabindex]):focus-visible {
	outline: 3px solid var(--be-baltic);
	outline-offset: 2px;
	border-radius: var(--be-radius);
}

.be-footer :where(a, button):focus-visible {
	outline-color: var(--be-oak-100);
}

@media (prefers-reduced-motion: reduce) {
	*,
	*::before,
	*::after {
		animation-duration: 0.01ms !important;
		animation-iteration-count: 1 !important;
		transition-duration: 0.01ms !important;
		scroll-behavior: auto !important;
	}

	.elementor-widget-image a:hover img,
	.elementor-image-gallery .gallery-item:hover img {
		transform: none;
	}
}
